@jingyi0605/codingns4dsh 0.1.0
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 +1114 -0
- package/assets/provider-icons/claude-code.png +0 -0
- package/assets/provider-icons/codex.png +0 -0
- package/assets/provider-icons/command-code.svg +5 -0
- package/assets/provider-icons/deepseek-harness.svg +9 -0
- package/assets/provider-icons/gemini.png +0 -0
- package/assets/provider-icons/grok.png +0 -0
- package/assets/provider-icons/kimi.png +0 -0
- package/assets/provider-icons/opencode.png +0 -0
- package/assets/provider-icons/pi.svg +7 -0
- package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +97 -0
- package/data/build/dist/bootstrap/dsh-connection-adapter.js +169 -0
- package/data/build/dist/bootstrap/index.d.ts +38 -0
- package/data/build/dist/bootstrap/index.js +44 -0
- package/data/build/dist/client/account-bar.d.ts +9 -0
- package/data/build/dist/client/account-bar.js +398 -0
- package/data/build/dist/client/bundle.js +26167 -0
- package/data/build/dist/client/cli-catalog.d.ts +24 -0
- package/data/build/dist/client/cli-catalog.js +108 -0
- package/data/build/dist/client/cli-slots.d.ts +38 -0
- package/data/build/dist/client/cli-slots.js +297 -0
- package/data/build/dist/client/debug/ui.d.ts +12 -0
- package/data/build/dist/client/debug/ui.js +451 -0
- package/data/build/dist/client/dsh-h5-bootstrap.d.ts +64 -0
- package/data/build/dist/client/dsh-h5-bootstrap.js +293 -0
- package/data/build/dist/client/dsh-runtime-version.d.ts +3 -0
- package/data/build/dist/client/dsh-runtime-version.js +11 -0
- package/data/build/dist/client/external-tool-stream.d.ts +24 -0
- package/data/build/dist/client/external-tool-stream.js +114 -0
- package/data/build/dist/client/features/cli-adapters.d.ts +7 -0
- package/data/build/dist/client/features/cli-adapters.js +215 -0
- package/data/build/dist/client/features/debug.d.ts +4 -0
- package/data/build/dist/client/features/debug.js +24 -0
- package/data/build/dist/client/features/index.d.ts +33 -0
- package/data/build/dist/client/features/index.js +44 -0
- package/data/build/dist/client/features/lan-access-panel.d.ts +5 -0
- package/data/build/dist/client/features/lan-access-panel.js +146 -0
- package/data/build/dist/client/features/lan-access.d.ts +9 -0
- package/data/build/dist/client/features/lan-access.js +30 -0
- package/data/build/dist/client/features/login-protection-panel.d.ts +5 -0
- package/data/build/dist/client/features/login-protection-panel.js +91 -0
- package/data/build/dist/client/features/login-protection-session.d.ts +6 -0
- package/data/build/dist/client/features/login-protection-session.js +25 -0
- package/data/build/dist/client/features/login-protection.d.ts +4 -0
- package/data/build/dist/client/features/login-protection.js +23 -0
- package/data/build/dist/client/features/reverse-proxy-panel.d.ts +9 -0
- package/data/build/dist/client/features/reverse-proxy-panel.js +159 -0
- package/data/build/dist/client/features/reverse-proxy.d.ts +12 -0
- package/data/build/dist/client/features/reverse-proxy.js +112 -0
- package/data/build/dist/client/features/terminal-enhancement-panel.d.ts +5 -0
- package/data/build/dist/client/features/terminal-enhancement-panel.js +160 -0
- package/data/build/dist/client/features/terminal-enhancement.d.ts +4 -0
- package/data/build/dist/client/features/terminal-enhancement.js +24 -0
- package/data/build/dist/client/features/types.d.ts +58 -0
- package/data/build/dist/client/features/types.js +2 -0
- package/data/build/dist/client/features/workspace-session-enhancement-panel.d.ts +5 -0
- package/data/build/dist/client/features/workspace-session-enhancement-panel.js +66 -0
- package/data/build/dist/client/features/workspace-session-enhancement.d.ts +4 -0
- package/data/build/dist/client/features/workspace-session-enhancement.js +101 -0
- package/data/build/dist/client/h5-bootstrap-entry.d.ts +2 -0
- package/data/build/dist/client/h5-bootstrap-entry.js +17 -0
- package/data/build/dist/client/index.d.ts +31 -0
- package/data/build/dist/client/index.js +98 -0
- package/data/build/dist/client/lan-access.d.ts +28 -0
- package/data/build/dist/client/lan-access.js +68 -0
- package/data/build/dist/client/locale.d.ts +20 -0
- package/data/build/dist/client/locale.js +393 -0
- package/data/build/dist/client/provider-icon-assets.d.ts +2 -0
- package/data/build/dist/client/provider-icon-assets.js +23 -0
- package/data/build/dist/client/provider-icons.d.ts +19 -0
- package/data/build/dist/client/provider-icons.js +39 -0
- package/data/build/dist/client/remote-web-context.d.ts +57 -0
- package/data/build/dist/client/remote-web-context.js +939 -0
- package/data/build/dist/client/session-adapter-cache.d.ts +18 -0
- package/data/build/dist/client/session-adapter-cache.js +84 -0
- package/data/build/dist/client/settings-bridge.d.ts +32 -0
- package/data/build/dist/client/settings-bridge.js +126 -0
- package/data/build/dist/client/settings-section.d.ts +30 -0
- package/data/build/dist/client/settings-section.js +93 -0
- package/data/build/dist/client/subscription-slot.d.ts +18 -0
- package/data/build/dist/client/subscription-slot.js +223 -0
- package/data/build/dist/client/terminal/index.d.ts +4 -0
- package/data/build/dist/client/terminal/index.js +3 -0
- package/data/build/dist/client/terminal/model.d.ts +116 -0
- package/data/build/dist/client/terminal/model.js +435 -0
- package/data/build/dist/client/terminal/styles.d.ts +21 -0
- package/data/build/dist/client/terminal/styles.js +51 -0
- package/data/build/dist/client/terminal/ui.d.ts +19 -0
- package/data/build/dist/client/terminal/ui.js +257 -0
- package/data/build/dist/client/terminal/xterm-view.d.ts +13 -0
- package/data/build/dist/client/terminal/xterm-view.js +213 -0
- package/data/build/dist/client/theme.d.ts +56 -0
- package/data/build/dist/client/theme.js +186 -0
- package/data/build/dist/client/workspace-session-archive-dom.d.ts +29 -0
- package/data/build/dist/client/workspace-session-archive-dom.js +525 -0
- package/data/build/dist/client/workspace-session-fiber.d.ts +3 -0
- package/data/build/dist/client/workspace-session-fiber.js +33 -0
- package/data/build/dist/client/workspace-session-logo-dom.d.ts +26 -0
- package/data/build/dist/client/workspace-session-logo-dom.js +128 -0
- package/data/build/dist/features/index.d.ts +3 -0
- package/data/build/dist/features/index.js +2 -0
- package/data/build/dist/features/registry.d.ts +74 -0
- package/data/build/dist/features/registry.js +382 -0
- package/data/build/dist/features/resource-scope/index.d.ts +39 -0
- package/data/build/dist/features/resource-scope/index.js +161 -0
- package/data/build/dist/host/auth-session.d.ts +42 -0
- package/data/build/dist/host/auth-session.js +186 -0
- package/data/build/dist/host/cli-adapters/claude-driver.d.ts +14 -0
- package/data/build/dist/host/cli-adapters/claude-driver.js +103 -0
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts +45 -0
- package/data/build/dist/host/cli-adapters/codex-driver.js +534 -0
- package/data/build/dist/host/cli-adapters/command-code-driver.d.ts +38 -0
- package/data/build/dist/host/cli-adapters/command-code-driver.js +394 -0
- package/data/build/dist/host/cli-adapters/command-code-subscription.d.ts +19 -0
- package/data/build/dist/host/cli-adapters/command-code-subscription.js +126 -0
- package/data/build/dist/host/cli-adapters/driver.d.ts +41 -0
- package/data/build/dist/host/cli-adapters/driver.js +2 -0
- package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts +37 -0
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js +180 -0
- package/data/build/dist/host/cli-adapters/dsh-tool-history.d.ts +48 -0
- package/data/build/dist/host/cli-adapters/dsh-tool-history.js +373 -0
- package/data/build/dist/host/cli-adapters/feature.d.ts +7 -0
- package/data/build/dist/host/cli-adapters/feature.js +335 -0
- package/data/build/dist/host/cli-adapters/gemini-driver.d.ts +24 -0
- package/data/build/dist/host/cli-adapters/gemini-driver.js +427 -0
- package/data/build/dist/host/cli-adapters/grok-driver.d.ts +38 -0
- package/data/build/dist/host/cli-adapters/grok-driver.js +372 -0
- package/data/build/dist/host/cli-adapters/http-sse-client.d.ts +22 -0
- package/data/build/dist/host/cli-adapters/http-sse-client.js +99 -0
- package/data/build/dist/host/cli-adapters/interaction-events.d.ts +11 -0
- package/data/build/dist/host/cli-adapters/interaction-events.js +80 -0
- package/data/build/dist/host/cli-adapters/json-rpc-process.d.ts +65 -0
- package/data/build/dist/host/cli-adapters/json-rpc-process.js +256 -0
- package/data/build/dist/host/cli-adapters/kimi-driver.d.ts +21 -0
- package/data/build/dist/host/cli-adapters/kimi-driver.js +382 -0
- package/data/build/dist/host/cli-adapters/model-catalog.d.ts +22 -0
- package/data/build/dist/host/cli-adapters/model-catalog.js +89 -0
- package/data/build/dist/host/cli-adapters/opencode-driver.d.ts +55 -0
- package/data/build/dist/host/cli-adapters/opencode-driver.js +728 -0
- package/data/build/dist/host/cli-adapters/pi-driver.d.ts +43 -0
- package/data/build/dist/host/cli-adapters/pi-driver.js +312 -0
- package/data/build/dist/host/cli-adapters/process-utils.d.ts +16 -0
- package/data/build/dist/host/cli-adapters/process-utils.js +27 -0
- package/data/build/dist/host/cli-adapters/provider-subscription.d.ts +82 -0
- package/data/build/dist/host/cli-adapters/provider-subscription.js +610 -0
- package/data/build/dist/host/cli-adapters/registry.d.ts +95 -0
- package/data/build/dist/host/cli-adapters/registry.js +659 -0
- package/data/build/dist/host/cli-adapters/rpc-driver-utils.d.ts +24 -0
- package/data/build/dist/host/cli-adapters/rpc-driver-utils.js +119 -0
- package/data/build/dist/host/cli-adapters/session-probe.d.ts +20 -0
- package/data/build/dist/host/cli-adapters/session-probe.js +139 -0
- package/data/build/dist/host/cli-adapters/session-store.d.ts +68 -0
- package/data/build/dist/host/cli-adapters/session-store.js +180 -0
- package/data/build/dist/host/cli-adapters/standard-stream-driver.d.ts +45 -0
- package/data/build/dist/host/cli-adapters/standard-stream-driver.js +205 -0
- package/data/build/dist/host/cli-adapters/stream-normalizer.d.ts +25 -0
- package/data/build/dist/host/cli-adapters/stream-normalizer.js +83 -0
- package/data/build/dist/host/cli-adapters/tool-observation.d.ts +9 -0
- package/data/build/dist/host/cli-adapters/tool-observation.js +39 -0
- package/data/build/dist/host/control-api-client.d.ts +84 -0
- package/data/build/dist/host/control-api-client.js +130 -0
- package/data/build/dist/host/credential-store.d.ts +54 -0
- package/data/build/dist/host/credential-store.js +114 -0
- package/data/build/dist/host/debug.d.ts +79 -0
- package/data/build/dist/host/debug.js +295 -0
- package/data/build/dist/host/dsh-device-runtime.d.ts +39 -0
- package/data/build/dist/host/dsh-device-runtime.js +118 -0
- package/data/build/dist/host/dsh-gateway-feature.d.ts +5 -0
- package/data/build/dist/host/dsh-gateway-feature.js +55 -0
- package/data/build/dist/host/dsh-runtime-version.d.ts +12 -0
- package/data/build/dist/host/dsh-runtime-version.js +69 -0
- package/data/build/dist/host/features/auth.d.ts +11 -0
- package/data/build/dist/host/features/auth.js +273 -0
- package/data/build/dist/host/features/debug.d.ts +5 -0
- package/data/build/dist/host/features/debug.js +90 -0
- package/data/build/dist/host/features/host-status.d.ts +12 -0
- package/data/build/dist/host/features/host-status.js +54 -0
- package/data/build/dist/host/features/index.d.ts +19 -0
- package/data/build/dist/host/features/index.js +29 -0
- package/data/build/dist/host/features/lan-access-dsh.d.ts +8 -0
- package/data/build/dist/host/features/lan-access-dsh.js +45 -0
- package/data/build/dist/host/features/terminal-process.d.ts +5 -0
- package/data/build/dist/host/features/terminal-process.js +110 -0
- package/data/build/dist/host/features/terminal-status.d.ts +18 -0
- package/data/build/dist/host/features/terminal-status.js +56 -0
- package/data/build/dist/host/features/types.d.ts +41 -0
- package/data/build/dist/host/features/types.js +2 -0
- package/data/build/dist/host/index.d.ts +43 -0
- package/data/build/dist/host/index.js +135 -0
- package/data/build/dist/host/lan-access-dsh.d.ts +83 -0
- package/data/build/dist/host/lan-access-dsh.js +831 -0
- package/data/build/dist/host/native-session-bridge.d.ts +130 -0
- package/data/build/dist/host/native-session-bridge.js +317 -0
- package/data/build/dist/host/relay-tunnel-runtime.d.ts +97 -0
- package/data/build/dist/host/relay-tunnel-runtime.js +361 -0
- package/data/build/dist/host/remote-web-runtime.d.ts +78 -0
- package/data/build/dist/host/remote-web-runtime.js +559 -0
- package/data/build/dist/host/rpc-table.d.ts +32 -0
- package/data/build/dist/host/rpc-table.js +47 -0
- package/data/build/dist/host/rpc.d.ts +18 -0
- package/data/build/dist/host/rpc.js +248 -0
- package/data/build/dist/host/settings.d.ts +19 -0
- package/data/build/dist/host/settings.js +80 -0
- package/data/build/dist/host/terminal/attachment-registry.d.ts +17 -0
- package/data/build/dist/host/terminal/attachment-registry.js +49 -0
- package/data/build/dist/host/terminal/backends/conpty-backend.d.ts +39 -0
- package/data/build/dist/host/terminal/backends/conpty-backend.js +160 -0
- package/data/build/dist/host/terminal/backends/local-pty-backend.d.ts +36 -0
- package/data/build/dist/host/terminal/backends/local-pty-backend.js +178 -0
- package/data/build/dist/host/terminal/backends/tmux-backend.d.ts +40 -0
- package/data/build/dist/host/terminal/backends/tmux-backend.js +191 -0
- package/data/build/dist/host/terminal/broker/conpty-broker-client.d.ts +27 -0
- package/data/build/dist/host/terminal/broker/conpty-broker-client.js +154 -0
- package/data/build/dist/host/terminal/broker/conpty-broker-process.d.ts +10 -0
- package/data/build/dist/host/terminal/broker/conpty-broker-process.js +147 -0
- package/data/build/dist/host/terminal/broker/conpty-broker-protocol.d.ts +92 -0
- package/data/build/dist/host/terminal/broker/conpty-broker-protocol.js +134 -0
- package/data/build/dist/host/terminal/controller-factory.d.ts +37 -0
- package/data/build/dist/host/terminal/controller-factory.js +82 -0
- package/data/build/dist/host/terminal/index.d.ts +17 -0
- package/data/build/dist/host/terminal/index.js +17 -0
- package/data/build/dist/host/terminal/runtime-adapter.d.ts +77 -0
- package/data/build/dist/host/terminal/runtime-adapter.js +18 -0
- package/data/build/dist/host/terminal/runtime-manager.d.ts +41 -0
- package/data/build/dist/host/terminal/runtime-manager.js +179 -0
- package/data/build/dist/host/terminal/shell-detection.d.ts +23 -0
- package/data/build/dist/host/terminal/shell-detection.js +105 -0
- package/data/build/dist/host/terminal/startup.d.ts +33 -0
- package/data/build/dist/host/terminal/startup.js +100 -0
- package/data/build/dist/host/terminal/terminal-controller.d.ts +78 -0
- package/data/build/dist/host/terminal/terminal-controller.js +324 -0
- package/data/build/dist/host/terminal/terminal-process-service.d.ts +30 -0
- package/data/build/dist/host/terminal/terminal-process-service.js +194 -0
- package/data/build/dist/host/terminal/terminal-process-store.d.ts +45 -0
- package/data/build/dist/host/terminal/terminal-process-store.js +183 -0
- package/data/build/dist/host/terminal/terminal-service.d.ts +87 -0
- package/data/build/dist/host/terminal/terminal-service.js +528 -0
- package/data/build/dist/host/terminal/terminal-store.d.ts +49 -0
- package/data/build/dist/host/terminal/terminal-store.js +242 -0
- package/data/build/dist/index.d.ts +37 -0
- package/data/build/dist/index.js +26 -0
- package/data/build/dist/shared/contracts/auth.d.ts +122 -0
- package/data/build/dist/shared/contracts/auth.js +8 -0
- package/data/build/dist/shared/contracts/cli-adapter.d.ts +192 -0
- package/data/build/dist/shared/contracts/cli-adapter.js +2 -0
- package/data/build/dist/shared/contracts/command-code.d.ts +5 -0
- package/data/build/dist/shared/contracts/command-code.js +2 -0
- package/data/build/dist/shared/contracts/config.d.ts +113 -0
- package/data/build/dist/shared/contracts/config.js +86 -0
- package/data/build/dist/shared/contracts/debug-config.d.ts +28 -0
- package/data/build/dist/shared/contracts/debug-config.js +78 -0
- package/data/build/dist/shared/contracts/debug.d.ts +75 -0
- package/data/build/dist/shared/contracts/debug.js +121 -0
- package/data/build/dist/shared/contracts/dsh-device.d.ts +72 -0
- package/data/build/dist/shared/contracts/dsh-device.js +2 -0
- package/data/build/dist/shared/contracts/errors.d.ts +33 -0
- package/data/build/dist/shared/contracts/errors.js +41 -0
- package/data/build/dist/shared/contracts/feature.d.ts +71 -0
- package/data/build/dist/shared/contracts/feature.js +2 -0
- package/data/build/dist/shared/contracts/host-status.d.ts +14 -0
- package/data/build/dist/shared/contracts/host-status.js +2 -0
- package/data/build/dist/shared/contracts/lan-access-dsh.d.ts +30 -0
- package/data/build/dist/shared/contracts/lan-access-dsh.js +2 -0
- package/data/build/dist/shared/contracts/peer-host.d.ts +37 -0
- package/data/build/dist/shared/contracts/peer-host.js +9 -0
- package/data/build/dist/shared/contracts/signaling.d.ts +67 -0
- package/data/build/dist/shared/contracts/signaling.js +2 -0
- package/data/build/dist/shared/contracts/subscription.d.ts +69 -0
- package/data/build/dist/shared/contracts/subscription.js +2 -0
- package/data/build/dist/shared/contracts/terminal-process.d.ts +65 -0
- package/data/build/dist/shared/contracts/terminal-process.js +2 -0
- package/data/build/dist/shared/contracts/terminal.d.ts +127 -0
- package/data/build/dist/shared/contracts/terminal.js +2 -0
- package/data/build/dist/shared/contracts/transport.d.ts +45 -0
- package/data/build/dist/shared/contracts/transport.js +3 -0
- package/data/build/dist/shared/contracts/version.d.ts +19 -0
- package/data/build/dist/shared/contracts/version.js +74 -0
- package/data/build/dist/shared/index.d.ts +22 -0
- package/data/build/dist/shared/index.js +9 -0
- package/data/build/dist/transport/carrier.d.ts +38 -0
- package/data/build/dist/transport/carrier.js +268 -0
- package/data/build/dist/transport/debug.d.ts +22 -0
- package/data/build/dist/transport/debug.js +57 -0
- package/data/build/dist/transport/dsh-envelope.d.ts +41 -0
- package/data/build/dist/transport/dsh-envelope.js +107 -0
- package/data/build/dist/transport/dsh-gateway.d.ts +64 -0
- package/data/build/dist/transport/dsh-gateway.js +254 -0
- package/data/build/dist/transport/dsh-session.d.ts +55 -0
- package/data/build/dist/transport/dsh-session.js +256 -0
- package/data/build/dist/transport/dsh-transport.d.ts +57 -0
- package/data/build/dist/transport/dsh-transport.js +125 -0
- package/data/build/dist/transport/frame.d.ts +132 -0
- package/data/build/dist/transport/frame.js +168 -0
- package/data/build/dist/transport/index.d.ts +11 -0
- package/data/build/dist/transport/index.js +11 -0
- package/data/build/dist/transport/multiplexer.d.ts +63 -0
- package/data/build/dist/transport/multiplexer.js +323 -0
- package/data/build/dist/transport/webrtc-client.d.ts +65 -0
- package/data/build/dist/transport/webrtc-client.js +255 -0
- package/data/build/dist/transport/webrtc-host.d.ts +58 -0
- package/data/build/dist/transport/webrtc-host.js +252 -0
- package/data/build/dist/typert.host.d.ts +25 -0
- package/data/build/dist/typert.host.js +150 -0
- package/dsh.bundle.patch +12 -0
- package/package.json +135 -0
- package/profile/README.md +27 -0
- package/profile/cordis.patch.yml +2 -0
- package/profile/package.json +20 -0
- package/profile/scripts/check-dsh-install.mjs +71 -0
- package/profile/version.json +5 -0
- package/scripts/check-dsh-install.mjs +88 -0
- package/version.json +6 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { FeatureDescriptor } from './feature.js';
|
|
2
|
+
import type { CodingNsCliSessionRecord } from './cli-adapter.js';
|
|
3
|
+
/** 适配器最近一次使用的模型与思考强度。 */
|
|
4
|
+
export interface CodingNsCliAdapterPreference {
|
|
5
|
+
readonly modelId?: string | undefined;
|
|
6
|
+
readonly effortId?: string | undefined;
|
|
7
|
+
}
|
|
8
|
+
/** Codingns4DSH 在 DSH 设置文档中持久化的用户选项。 */
|
|
9
|
+
export interface CodingNsSettings {
|
|
10
|
+
/** Control API 地址不是秘密,可以由 Web 设置页保存到 Host 设置。 */
|
|
11
|
+
controlBaseUrl: string;
|
|
12
|
+
/** Control API 地址候选列表;列表本身不包含任何凭据。 */
|
|
13
|
+
controlBaseUrls: string[];
|
|
14
|
+
/** 局域网访问 DSH 的唯一监听映射及启动策略。 */
|
|
15
|
+
lanAccessDsh: LanAccessDshSettings;
|
|
16
|
+
/** 插件 Sidebar 终端的默认 profile 与受控外观设置。 */
|
|
17
|
+
terminalEnhancement: TerminalEnhancementSettings;
|
|
18
|
+
/** 原生工作区会话行的浏览器端增强选项。 */
|
|
19
|
+
workspaceSessionEnhancement: WorkspaceSessionEnhancementSettings;
|
|
20
|
+
/**
|
|
21
|
+
* 功能模块启用意图:模块名 -> 是否启用。
|
|
22
|
+
*
|
|
23
|
+
* 缺省时回落到模块自己声明的 enabledByDefault,因此设置结构不随模块数量变化。
|
|
24
|
+
*/
|
|
25
|
+
modules: Record<string, boolean>;
|
|
26
|
+
/** 外部 Agent 启用意图:适配器 id -> 是否启用;缺省时所有已注册 Agent 启用。 */
|
|
27
|
+
agentAdapters?: Record<string, boolean>;
|
|
28
|
+
/** Host 侧外部 Agent 会话索引;不含凭据和原始消息。 */
|
|
29
|
+
cliSessions?: CodingNsCliSessionRecord[];
|
|
30
|
+
/** 适配器级最近选择;新建会话时作为默认模型和思考强度。 */
|
|
31
|
+
agentAdapterPreferences?: Record<string, CodingNsCliAdapterPreference>;
|
|
32
|
+
}
|
|
33
|
+
/** 跨平台终端 profile;`system` 由 Host 根据平台和已安装 shell 解析。 */
|
|
34
|
+
export type TerminalProfileId = 'system' | 'zsh' | 'bash' | 'powershell' | 'cmd' | 'git-bash';
|
|
35
|
+
/** 终端持久记录的归属范围;工作区模式允许不同 DSH 会话共享终端。 */
|
|
36
|
+
export type TerminalBindingScope = 'workspace' | 'session';
|
|
37
|
+
export type TerminalAppearanceTheme = 'inherit' | 'custom';
|
|
38
|
+
export type TerminalCursorStyle = 'block' | 'bar' | 'underline';
|
|
39
|
+
/** 仅保存可映射到 xterm 公开选项的外观字段。 */
|
|
40
|
+
export interface TerminalAppearanceSettings {
|
|
41
|
+
theme: TerminalAppearanceTheme;
|
|
42
|
+
background: string | null;
|
|
43
|
+
foreground: string | null;
|
|
44
|
+
cursorColor: string | null;
|
|
45
|
+
fontFamily: string | null;
|
|
46
|
+
fontSize: number | null;
|
|
47
|
+
lineHeight: number | null;
|
|
48
|
+
cursorStyle: TerminalCursorStyle | null;
|
|
49
|
+
cursorBlink: boolean | null;
|
|
50
|
+
scrollback: number | null;
|
|
51
|
+
}
|
|
52
|
+
export interface TerminalEnhancementSettings {
|
|
53
|
+
/** 缺省按工作区归属;旧设置缺少此字段时由 schema 回填。 */
|
|
54
|
+
bindingScope?: TerminalBindingScope;
|
|
55
|
+
defaultProfile: TerminalProfileId;
|
|
56
|
+
appearance: TerminalAppearanceSettings;
|
|
57
|
+
}
|
|
58
|
+
/** 工作区会话增强的用户可见设置;每个子能力都可以独立开关。 */
|
|
59
|
+
export interface WorkspaceSessionEnhancementSettings {
|
|
60
|
+
showAdapterLogo: boolean;
|
|
61
|
+
/** 是否在每个有归档会话的工作区中显示归档入口。 */
|
|
62
|
+
showArchivedSessions: boolean;
|
|
63
|
+
/** 是否在对话底部显示订阅与上游用量检测。 */
|
|
64
|
+
showSubscriptionUsage: boolean;
|
|
65
|
+
}
|
|
66
|
+
/** 局域网访问 DSH 的持久化配置;dshPort 为 0 表示启动时自动探测。 */
|
|
67
|
+
export interface LanAccessDshSettings {
|
|
68
|
+
autoStart: boolean;
|
|
69
|
+
listenHost: string;
|
|
70
|
+
listenPort: number;
|
|
71
|
+
dshPort: number;
|
|
72
|
+
}
|
|
73
|
+
export interface LoginProtectionScopes {
|
|
74
|
+
/** 局域网网卡入口。 */
|
|
75
|
+
lan: boolean;
|
|
76
|
+
/** DSH-Codingns4DSH 中继入口。 */
|
|
77
|
+
relay: boolean;
|
|
78
|
+
}
|
|
79
|
+
/** 登录保护的公开设置;密码哈希仅保存在 Host 私有凭据文件中。 */
|
|
80
|
+
export interface LanAccessDshLoginSettings {
|
|
81
|
+
enabled: boolean;
|
|
82
|
+
username: string;
|
|
83
|
+
passwordConfigured: boolean;
|
|
84
|
+
timeoutSeconds: number;
|
|
85
|
+
scopes: LoginProtectionScopes;
|
|
86
|
+
}
|
|
87
|
+
export declare const CODINGNS_SETTINGS_NAMESPACE = "codingns";
|
|
88
|
+
export declare const CODINGNS_CONTROL_BASE_URL_FIELD = "controlBaseUrl";
|
|
89
|
+
export declare const CODINGNS_CONTROL_BASE_URLS_FIELD = "controlBaseUrls";
|
|
90
|
+
export declare const CODINGNS_MODULES_FIELD = "modules";
|
|
91
|
+
export declare const CODINGNS_LAN_ACCESS_DSH_FIELD = "lanAccessDsh";
|
|
92
|
+
export declare const CODINGNS_TERMINAL_ENHANCEMENT_FIELD = "terminalEnhancement";
|
|
93
|
+
export declare const CODINGNS_WORKSPACE_SESSION_ENHANCEMENT_FIELD = "workspaceSessionEnhancement";
|
|
94
|
+
export declare const DEFAULT_CODINGNS_CONTROL_BASE_URL = "https://channel.codingns.com:1443";
|
|
95
|
+
export declare const DEFAULT_CODINGNS_CONTROL_BASE_URLS: string[];
|
|
96
|
+
export declare const DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS: TerminalEnhancementSettings;
|
|
97
|
+
export declare const DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS: WorkspaceSessionEnhancementSettings;
|
|
98
|
+
export declare const DEFAULT_CODINGNS_SETTINGS: CodingNsSettings;
|
|
99
|
+
/** 重启生效模块在当前进程启动时捕获的有效状态。 */
|
|
100
|
+
export type RestartFeatureStates = Readonly<Record<string, boolean>>;
|
|
101
|
+
export declare function captureRestartFeatureStates(descriptors: readonly FeatureDescriptor[], settings: CodingNsSettings | undefined, dshVersion?: string): Record<string, boolean>;
|
|
102
|
+
/**
|
|
103
|
+
* 判定一个功能模块当前是否应当启用。
|
|
104
|
+
*
|
|
105
|
+
* 常驻模块(ui.alwaysEnabled)始终启用;其余模块读取设置里的用户意图,
|
|
106
|
+
* 用户没有表达过意图时使用模块自己声明的 enabledByDefault。
|
|
107
|
+
*/
|
|
108
|
+
export declare function isFeatureEnabled(descriptor: FeatureDescriptor, settings: CodingNsSettings | undefined): boolean;
|
|
109
|
+
/** 汇总当前应当启用的模块名,交给 FeatureRegistry.reconcile 对齐状态。 */
|
|
110
|
+
export declare function enabledFeatureNames(descriptors: readonly FeatureDescriptor[], settings: CodingNsSettings | undefined, restartStates?: RestartFeatureStates, dshVersion?: string): string[];
|
|
111
|
+
/** 判断模块是否可以在当前 DSH 版本运行。未提供运行时版本时保留旧调用方行为。 */
|
|
112
|
+
export declare function isFeatureDshVersionCompatible(descriptor: FeatureDescriptor, dshVersion?: string): boolean;
|
|
113
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { isDshVersionAtLeast } from './version.js';
|
|
2
|
+
export const CODINGNS_SETTINGS_NAMESPACE = 'codingns';
|
|
3
|
+
export const CODINGNS_CONTROL_BASE_URL_FIELD = 'controlBaseUrl';
|
|
4
|
+
export const CODINGNS_CONTROL_BASE_URLS_FIELD = 'controlBaseUrls';
|
|
5
|
+
export const CODINGNS_MODULES_FIELD = 'modules';
|
|
6
|
+
export const CODINGNS_LAN_ACCESS_DSH_FIELD = 'lanAccessDsh';
|
|
7
|
+
export const CODINGNS_TERMINAL_ENHANCEMENT_FIELD = 'terminalEnhancement';
|
|
8
|
+
export const CODINGNS_WORKSPACE_SESSION_ENHANCEMENT_FIELD = 'workspaceSessionEnhancement';
|
|
9
|
+
export const DEFAULT_CODINGNS_CONTROL_BASE_URL = 'https://channel.codingns.com:1443';
|
|
10
|
+
export const DEFAULT_CODINGNS_CONTROL_BASE_URLS = [DEFAULT_CODINGNS_CONTROL_BASE_URL];
|
|
11
|
+
export const DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS = {
|
|
12
|
+
bindingScope: 'workspace',
|
|
13
|
+
defaultProfile: 'system',
|
|
14
|
+
appearance: {
|
|
15
|
+
theme: 'inherit',
|
|
16
|
+
background: null,
|
|
17
|
+
foreground: null,
|
|
18
|
+
cursorColor: null,
|
|
19
|
+
fontFamily: null,
|
|
20
|
+
fontSize: null,
|
|
21
|
+
lineHeight: null,
|
|
22
|
+
cursorStyle: null,
|
|
23
|
+
cursorBlink: null,
|
|
24
|
+
scrollback: null,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
export const DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS = {
|
|
28
|
+
showAdapterLogo: true,
|
|
29
|
+
showArchivedSessions: true,
|
|
30
|
+
showSubscriptionUsage: true,
|
|
31
|
+
};
|
|
32
|
+
export const DEFAULT_CODINGNS_SETTINGS = {
|
|
33
|
+
controlBaseUrl: DEFAULT_CODINGNS_CONTROL_BASE_URL,
|
|
34
|
+
controlBaseUrls: [...DEFAULT_CODINGNS_CONTROL_BASE_URLS],
|
|
35
|
+
modules: {},
|
|
36
|
+
agentAdapters: {},
|
|
37
|
+
agentAdapterPreferences: {},
|
|
38
|
+
terminalEnhancement: DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS,
|
|
39
|
+
workspaceSessionEnhancement: DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS,
|
|
40
|
+
lanAccessDsh: {
|
|
41
|
+
autoStart: false,
|
|
42
|
+
listenHost: '0.0.0.0',
|
|
43
|
+
listenPort: 13080,
|
|
44
|
+
dshPort: 0,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
export function captureRestartFeatureStates(descriptors, settings, dshVersion) {
|
|
48
|
+
const states = {};
|
|
49
|
+
for (const descriptor of descriptors) {
|
|
50
|
+
if (descriptor.activation === 'restart') {
|
|
51
|
+
states[descriptor.name] = isFeatureDshVersionCompatible(descriptor, dshVersion)
|
|
52
|
+
&& isFeatureEnabled(descriptor, settings);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return states;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 判定一个功能模块当前是否应当启用。
|
|
59
|
+
*
|
|
60
|
+
* 常驻模块(ui.alwaysEnabled)始终启用;其余模块读取设置里的用户意图,
|
|
61
|
+
* 用户没有表达过意图时使用模块自己声明的 enabledByDefault。
|
|
62
|
+
*/
|
|
63
|
+
export function isFeatureEnabled(descriptor, settings) {
|
|
64
|
+
if (descriptor.ui?.alwaysEnabled === true)
|
|
65
|
+
return true;
|
|
66
|
+
return settings?.modules[descriptor.name] ?? descriptor.enabledByDefault;
|
|
67
|
+
}
|
|
68
|
+
/** 汇总当前应当启用的模块名,交给 FeatureRegistry.reconcile 对齐状态。 */
|
|
69
|
+
export function enabledFeatureNames(descriptors, settings, restartStates, dshVersion) {
|
|
70
|
+
const names = [];
|
|
71
|
+
for (const descriptor of descriptors) {
|
|
72
|
+
const enabled = descriptor.activation === 'restart' && restartStates !== undefined
|
|
73
|
+
? restartStates[descriptor.name] ?? descriptor.enabledByDefault
|
|
74
|
+
: isFeatureEnabled(descriptor, settings);
|
|
75
|
+
if (enabled && isFeatureDshVersionCompatible(descriptor, dshVersion))
|
|
76
|
+
names.push(descriptor.name);
|
|
77
|
+
}
|
|
78
|
+
return names;
|
|
79
|
+
}
|
|
80
|
+
/** 判断模块是否可以在当前 DSH 版本运行。未提供运行时版本时保留旧调用方行为。 */
|
|
81
|
+
export function isFeatureDshVersionCompatible(descriptor, dshVersion) {
|
|
82
|
+
if (descriptor.minimumDshVersion === undefined || dshVersion === undefined)
|
|
83
|
+
return true;
|
|
84
|
+
return isDshVersionAtLeast(dshVersion, descriptor.minimumDshVersion);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CodingNsTerminalShell, CodingNsTerminalRuntimeType } from './terminal.js';
|
|
2
|
+
/** Workspace 级 Spec003 配置文件。 */
|
|
3
|
+
export interface DebugConfig {
|
|
4
|
+
readonly version: 1;
|
|
5
|
+
readonly profiles: readonly DebugProfile[];
|
|
6
|
+
}
|
|
7
|
+
/** 一条按配置启动的终端命令。 */
|
|
8
|
+
export interface DebugProfile {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly name: string;
|
|
11
|
+
readonly cwdRelative: string;
|
|
12
|
+
readonly command: string;
|
|
13
|
+
readonly args: readonly string[];
|
|
14
|
+
readonly env: Readonly<Record<string, string>>;
|
|
15
|
+
readonly shell: DebugShell;
|
|
16
|
+
readonly runtimeType: DebugRuntimeType;
|
|
17
|
+
readonly port: number | null;
|
|
18
|
+
readonly proxy: DebugProxyConfig;
|
|
19
|
+
}
|
|
20
|
+
export type DebugRuntimeType = CodingNsTerminalRuntimeType;
|
|
21
|
+
export type DebugShell = CodingNsTerminalShell;
|
|
22
|
+
export interface DebugProxyConfig {
|
|
23
|
+
readonly enabled: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare const EMPTY_DEBUG_CONFIG: DebugConfig;
|
|
26
|
+
/** 解析并校验 Workspace 配置;不接受绝对路径、越界路径和秘密环境变量。 */
|
|
27
|
+
export declare function parseDebugConfig(value: unknown): DebugConfig;
|
|
28
|
+
//# sourceMappingURL=debug-config.d.ts.map
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export const EMPTY_DEBUG_CONFIG = { version: 1, profiles: [] };
|
|
2
|
+
/** 解析并校验 Workspace 配置;不接受绝对路径、越界路径和秘密环境变量。 */
|
|
3
|
+
export function parseDebugConfig(value) {
|
|
4
|
+
if (!isRecord(value) || value.version !== 1 || !Array.isArray(value.profiles)) {
|
|
5
|
+
throw new TypeError('Spec003 配置必须是 version=1 的对象');
|
|
6
|
+
}
|
|
7
|
+
const profiles = value.profiles.map(parseDebugProfile);
|
|
8
|
+
const ids = new Set();
|
|
9
|
+
for (const profile of profiles) {
|
|
10
|
+
if (ids.has(profile.id))
|
|
11
|
+
throw new TypeError(`Spec003 配置项 ID 重复: ${profile.id}`);
|
|
12
|
+
ids.add(profile.id);
|
|
13
|
+
}
|
|
14
|
+
return { version: 1, profiles };
|
|
15
|
+
}
|
|
16
|
+
function parseDebugProfile(value) {
|
|
17
|
+
if (!isRecord(value))
|
|
18
|
+
throw new TypeError('Spec003 配置项必须是对象');
|
|
19
|
+
const id = stringField(value.id, 'id');
|
|
20
|
+
const name = stringField(value.name, 'name');
|
|
21
|
+
const cwdRelative = stringField(value.cwdRelative, 'cwdRelative');
|
|
22
|
+
if (!isRelativePath(cwdRelative))
|
|
23
|
+
throw new TypeError('cwdRelative 必须是 Workspace 内相对路径');
|
|
24
|
+
const command = stringField(value.command, 'command');
|
|
25
|
+
const args = stringArray(value.args ?? [], 'args');
|
|
26
|
+
const env = recordOfStrings(value.env ?? {}, 'env');
|
|
27
|
+
if (Object.keys(env).some((key) => /(?:TOKEN|SECRET|PASSWORD|PRIVATE_KEY|API_KEY)/iu.test(key))) {
|
|
28
|
+
throw new TypeError('配置不能持久化秘密环境变量');
|
|
29
|
+
}
|
|
30
|
+
if (!isRecord(value.shell))
|
|
31
|
+
throw new TypeError('shell 必须是对象');
|
|
32
|
+
const profileId = stringField(value.shell.profileId, 'shell.profileId');
|
|
33
|
+
if (profileId !== 'zsh' && profileId !== 'bash' && profileId !== 'powershell' && profileId !== 'cmd' && profileId !== 'git-bash')
|
|
34
|
+
throw new TypeError('shell.profileId 无效');
|
|
35
|
+
const shell = {
|
|
36
|
+
profileId,
|
|
37
|
+
path: stringField(value.shell.path, 'shell.path'),
|
|
38
|
+
args: stringArray(value.shell.args ?? [], 'shell.args'),
|
|
39
|
+
name: stringField(value.shell.name, 'shell.name'),
|
|
40
|
+
};
|
|
41
|
+
const runtimeType = value.runtimeType;
|
|
42
|
+
if (runtimeType !== 'local-pty' && runtimeType !== 'tmux' && runtimeType !== 'conpty-powershell' && runtimeType !== 'conpty-cmd' && runtimeType !== 'conpty-git-bash') {
|
|
43
|
+
throw new TypeError('runtimeType 无效');
|
|
44
|
+
}
|
|
45
|
+
const port = value.port === undefined || value.port === null ? null : portValue(value.port);
|
|
46
|
+
const proxyValue = value.proxy === undefined ? {} : value.proxy;
|
|
47
|
+
if (!isRecord(proxyValue))
|
|
48
|
+
throw new TypeError('proxy 必须是对象');
|
|
49
|
+
const enabled = proxyValue.enabled === undefined ? false : proxyValue.enabled;
|
|
50
|
+
if (typeof enabled !== 'boolean')
|
|
51
|
+
throw new TypeError('proxy.enabled 必须是布尔值');
|
|
52
|
+
return { id, name, cwdRelative, command, args, env, shell, runtimeType, port, proxy: { enabled } };
|
|
53
|
+
}
|
|
54
|
+
function stringField(value, field) {
|
|
55
|
+
if (typeof value !== 'string' || value.trim() === '' || value.includes('\0') || value.length > 512)
|
|
56
|
+
throw new TypeError(`${field} 必须是非空字符串`);
|
|
57
|
+
return value.trim();
|
|
58
|
+
}
|
|
59
|
+
function stringArray(value, field) {
|
|
60
|
+
if (!Array.isArray(value) || value.some((item) => typeof item !== 'string' || item.includes('\0') || item.length > 4096))
|
|
61
|
+
throw new TypeError(`${field} 必须是字符串数组`);
|
|
62
|
+
return [...value];
|
|
63
|
+
}
|
|
64
|
+
function recordOfStrings(value, field) {
|
|
65
|
+
if (!isRecord(value) || Object.entries(value).some(([key, item]) => key.trim() === '' || typeof item !== 'string'))
|
|
66
|
+
throw new TypeError(`${field} 必须是字符串对象`);
|
|
67
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, item]));
|
|
68
|
+
}
|
|
69
|
+
function portValue(value) {
|
|
70
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1 || value > 65535)
|
|
71
|
+
throw new TypeError('port 必须是 1 到 65535 的整数');
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
function isRelativePath(value) {
|
|
75
|
+
return value === '.' || (value !== '' && !value.startsWith('/') && !/^[A-Za-z]:[\\/]/u.test(value) && value !== '..' && !value.startsWith('../') && !value.startsWith('..\\') && !value.includes('/../') && !value.includes('\\..'));
|
|
76
|
+
}
|
|
77
|
+
function isRecord(value) { return typeof value === 'object' && value !== null && !Array.isArray(value); }
|
|
78
|
+
//# sourceMappingURL=debug-config.js.map
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/** Spec003 调试运行模式。`pty` 复用现有终端启动器,`process` 由 Spec003 自己管理。 */
|
|
2
|
+
export type DebugRuntimeMode = 'process' | 'pty';
|
|
3
|
+
/** 调试运行实例的生命周期状态。 */
|
|
4
|
+
export type DebugRuntimeState = 'PREPARING' | 'STARTING' | 'RUNNING' | 'STOPPING' | 'EXITED' | 'FAILED' | 'LOST';
|
|
5
|
+
/** 端口发现结果的归属等级。 */
|
|
6
|
+
export type DebugProcessOwnership = 'managed' | 'agent_terminal' | 'discovered';
|
|
7
|
+
/** 端口在调试面板中的状态。 */
|
|
8
|
+
export type DebugPortState = 'UNCONFIGURED' | 'AVAILABLE' | 'LEASED' | 'LISTENING_OWNED' | 'OCCUPIED_EXTERNAL' | 'MISMATCH';
|
|
9
|
+
/** 框架分析的准入等级。 */
|
|
10
|
+
export type DebugCompatibilityLevel = 'supported' | 'conditional' | 'unsupported' | 'unknown';
|
|
11
|
+
/** 启动计划状态。 */
|
|
12
|
+
export type DebugPlanState = 'draft' | 'ready' | 'blocked' | 'expired' | 'consumed';
|
|
13
|
+
/** AI 兜底补丁状态。 */
|
|
14
|
+
export type DebugAiFallbackState = 'PENDING' | 'APPLIED' | 'REJECTED' | 'ROLLED_BACK' | 'KEPT' | 'CONFLICT';
|
|
15
|
+
/** 调试代理支持的协议。 */
|
|
16
|
+
export type DebugProxyProtocol = 'http' | 'sse' | 'websocket';
|
|
17
|
+
/** 阶段 0 冻结的调试 RPC 名称;具体实现由后续阶段登记。 */
|
|
18
|
+
export declare const DEBUG_RPC_ENDPOINTS: readonly ["debug/snapshot", "debug/profile/list", "debug/profile/create", "debug/profile/update", "debug/profile/delete", "debug/profile/clone", "debug/analysis/get", "debug/analysis/refresh", "debug/analysis/matrix", "debug/plan/create", "debug/plan/discard", "debug/runtime/start", "debug/runtime/get", "debug/runtime/list", "debug/runtime/stop", "debug/runtime/restart", "debug/process/inspect-port", "debug/process/terminate-candidate", "debug/log/read", "debug/log/follow", "debug/ai/preview", "debug/ai/apply", "debug/ai/reject", "debug/ai/rollback", "debug/ai/keep", "debug/proxy/get", "debug/proxy/enable", "debug/proxy/disable", "debug/settings/get", "debug/settings/set"];
|
|
19
|
+
export type DebugRpcEndpoint = typeof DEBUG_RPC_ENDPOINTS[number];
|
|
20
|
+
/** 调试领域稳定错误码。错误码先冻结,后续 Host 实现不得用自由文本替代。 */
|
|
21
|
+
export declare const DEBUG_ERROR_CODES: {
|
|
22
|
+
readonly INVALID_REQUEST: "DEBUG_INVALID_REQUEST";
|
|
23
|
+
readonly WORKSPACE_REQUIRED: "DEBUG_WORKSPACE_REQUIRED";
|
|
24
|
+
readonly WORKSPACE_SESSION_MISMATCH: "DEBUG_WORKSPACE_SESSION_MISMATCH";
|
|
25
|
+
readonly GENERATION_STALE: "DEBUG_GENERATION_STALE";
|
|
26
|
+
readonly REVISION_CONFLICT: "DEBUG_REVISION_CONFLICT";
|
|
27
|
+
readonly PROFILE_NOT_FOUND: "DEBUG_PROFILE_NOT_FOUND";
|
|
28
|
+
readonly PROCESS_INSTANCE_NOT_FOUND: "DEBUG_PROCESS_INSTANCE_NOT_FOUND";
|
|
29
|
+
readonly PROCESS_IDENTITY_MISMATCH: "DEBUG_PROCESS_IDENTITY_MISMATCH";
|
|
30
|
+
readonly PORT_LEASE_CONFLICT: "DEBUG_PORT_LEASE_CONFLICT";
|
|
31
|
+
readonly RUNTIME_NOT_FOUND: "DEBUG_RUNTIME_NOT_FOUND";
|
|
32
|
+
readonly PROXY_ROUTE_NOT_FOUND: "DEBUG_PROXY_ROUTE_NOT_FOUND";
|
|
33
|
+
readonly DSH_HOST_API_UNAVAILABLE: "DEBUG_DSH_HOST_API_UNAVAILABLE";
|
|
34
|
+
};
|
|
35
|
+
export type DebugErrorCode = typeof DEBUG_ERROR_CODES[keyof typeof DEBUG_ERROR_CODES];
|
|
36
|
+
/** 所有调试 RPC 都必须携带的作用域。generation 由当前连接/资源作用域产生。 */
|
|
37
|
+
export interface DebugRpcScope {
|
|
38
|
+
readonly sessionId: string;
|
|
39
|
+
readonly workspaceId: string;
|
|
40
|
+
readonly generation: number;
|
|
41
|
+
}
|
|
42
|
+
/** 需要乐观并发控制的调试写请求。两个版本字段最多提供一个。 */
|
|
43
|
+
export interface DebugMutationScope extends DebugRpcScope {
|
|
44
|
+
readonly recordId: string;
|
|
45
|
+
readonly expectedRevision?: number;
|
|
46
|
+
readonly expectedUpdatedAt?: string;
|
|
47
|
+
}
|
|
48
|
+
/** PTY 启动请求只携带意图,不携带绝对路径、PID 或端口目标。 */
|
|
49
|
+
export interface DebugPtyLaunchRequest extends DebugRpcScope {
|
|
50
|
+
readonly profileId: string;
|
|
51
|
+
readonly cols: number;
|
|
52
|
+
readonly rows: number;
|
|
53
|
+
}
|
|
54
|
+
/** 调试面板保存的运行实例摘要。完整进程身份只留在 Host。 */
|
|
55
|
+
export interface DebugProcessInstance {
|
|
56
|
+
readonly id: string;
|
|
57
|
+
readonly workspaceId: string;
|
|
58
|
+
readonly profileId: string;
|
|
59
|
+
readonly runtimeMode: DebugRuntimeMode;
|
|
60
|
+
readonly state: DebugRuntimeState;
|
|
61
|
+
readonly ownership: 'managed';
|
|
62
|
+
readonly terminalId: string | null;
|
|
63
|
+
readonly pid: number | null;
|
|
64
|
+
readonly processFingerprint: string | null;
|
|
65
|
+
readonly startedAt: string | null;
|
|
66
|
+
readonly stoppedAt: string | null;
|
|
67
|
+
readonly exitCode: number | null;
|
|
68
|
+
}
|
|
69
|
+
/** 规范化并校验调试 RPC 作用域。禁止把 Client 的任意对象直接传入业务层。 */
|
|
70
|
+
export declare function parseDebugRpcScope(value: unknown): DebugRpcScope;
|
|
71
|
+
/** 规范化并校验带记录 ID 的调试写请求。 */
|
|
72
|
+
export declare function parseDebugMutationScope(value: unknown): DebugMutationScope;
|
|
73
|
+
/** 校验 PTY 调用参数,避免把终端尺寸或路径类字段直接信任到 Host。 */
|
|
74
|
+
export declare function parseDebugPtyLaunchRequest(value: unknown): DebugPtyLaunchRequest;
|
|
75
|
+
//# sourceMappingURL=debug.d.ts.map
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/** 阶段 0 冻结的调试 RPC 名称;具体实现由后续阶段登记。 */
|
|
2
|
+
export const DEBUG_RPC_ENDPOINTS = [
|
|
3
|
+
'debug/snapshot',
|
|
4
|
+
'debug/profile/list',
|
|
5
|
+
'debug/profile/create',
|
|
6
|
+
'debug/profile/update',
|
|
7
|
+
'debug/profile/delete',
|
|
8
|
+
'debug/profile/clone',
|
|
9
|
+
'debug/analysis/get',
|
|
10
|
+
'debug/analysis/refresh',
|
|
11
|
+
'debug/analysis/matrix',
|
|
12
|
+
'debug/plan/create',
|
|
13
|
+
'debug/plan/discard',
|
|
14
|
+
'debug/runtime/start',
|
|
15
|
+
'debug/runtime/get',
|
|
16
|
+
'debug/runtime/list',
|
|
17
|
+
'debug/runtime/stop',
|
|
18
|
+
'debug/runtime/restart',
|
|
19
|
+
'debug/process/inspect-port',
|
|
20
|
+
'debug/process/terminate-candidate',
|
|
21
|
+
'debug/log/read',
|
|
22
|
+
'debug/log/follow',
|
|
23
|
+
'debug/ai/preview',
|
|
24
|
+
'debug/ai/apply',
|
|
25
|
+
'debug/ai/reject',
|
|
26
|
+
'debug/ai/rollback',
|
|
27
|
+
'debug/ai/keep',
|
|
28
|
+
'debug/proxy/get',
|
|
29
|
+
'debug/proxy/enable',
|
|
30
|
+
'debug/proxy/disable',
|
|
31
|
+
'debug/settings/get',
|
|
32
|
+
'debug/settings/set',
|
|
33
|
+
];
|
|
34
|
+
/** 调试领域稳定错误码。错误码先冻结,后续 Host 实现不得用自由文本替代。 */
|
|
35
|
+
export const DEBUG_ERROR_CODES = {
|
|
36
|
+
INVALID_REQUEST: 'DEBUG_INVALID_REQUEST',
|
|
37
|
+
WORKSPACE_REQUIRED: 'DEBUG_WORKSPACE_REQUIRED',
|
|
38
|
+
WORKSPACE_SESSION_MISMATCH: 'DEBUG_WORKSPACE_SESSION_MISMATCH',
|
|
39
|
+
GENERATION_STALE: 'DEBUG_GENERATION_STALE',
|
|
40
|
+
REVISION_CONFLICT: 'DEBUG_REVISION_CONFLICT',
|
|
41
|
+
PROFILE_NOT_FOUND: 'DEBUG_PROFILE_NOT_FOUND',
|
|
42
|
+
PROCESS_INSTANCE_NOT_FOUND: 'DEBUG_PROCESS_INSTANCE_NOT_FOUND',
|
|
43
|
+
PROCESS_IDENTITY_MISMATCH: 'DEBUG_PROCESS_IDENTITY_MISMATCH',
|
|
44
|
+
PORT_LEASE_CONFLICT: 'DEBUG_PORT_LEASE_CONFLICT',
|
|
45
|
+
RUNTIME_NOT_FOUND: 'DEBUG_RUNTIME_NOT_FOUND',
|
|
46
|
+
PROXY_ROUTE_NOT_FOUND: 'DEBUG_PROXY_ROUTE_NOT_FOUND',
|
|
47
|
+
DSH_HOST_API_UNAVAILABLE: 'DEBUG_DSH_HOST_API_UNAVAILABLE',
|
|
48
|
+
};
|
|
49
|
+
/** 规范化并校验调试 RPC 作用域。禁止把 Client 的任意对象直接传入业务层。 */
|
|
50
|
+
export function parseDebugRpcScope(value) {
|
|
51
|
+
if (!isRecord(value))
|
|
52
|
+
throw new TypeError('调试 RPC 作用域必须是对象');
|
|
53
|
+
const sessionId = nonEmptyString(value.sessionId, 'sessionId');
|
|
54
|
+
const workspaceId = nonEmptyString(value.workspaceId, 'workspaceId');
|
|
55
|
+
const generation = nonNegativeInteger(value.generation, 'generation');
|
|
56
|
+
return { sessionId, workspaceId, generation };
|
|
57
|
+
}
|
|
58
|
+
/** 规范化并校验带记录 ID 的调试写请求。 */
|
|
59
|
+
export function parseDebugMutationScope(value) {
|
|
60
|
+
if (!isRecord(value))
|
|
61
|
+
throw new TypeError('调试写请求必须是对象');
|
|
62
|
+
rejectUnknownFields(value, ['sessionId', 'workspaceId', 'generation', 'recordId', 'expectedRevision', 'expectedUpdatedAt'], '调试写请求');
|
|
63
|
+
const scope = parseDebugRpcScope(value);
|
|
64
|
+
const recordId = nonEmptyString(value.recordId, 'recordId');
|
|
65
|
+
const expectedRevision = value.expectedRevision;
|
|
66
|
+
const expectedUpdatedAt = value.expectedUpdatedAt;
|
|
67
|
+
if (expectedRevision !== undefined && expectedUpdatedAt !== undefined) {
|
|
68
|
+
throw new TypeError('expectedRevision 和 expectedUpdatedAt 只能提供一个');
|
|
69
|
+
}
|
|
70
|
+
if (expectedRevision !== undefined)
|
|
71
|
+
nonNegativeInteger(expectedRevision, 'expectedRevision');
|
|
72
|
+
if (expectedUpdatedAt !== undefined)
|
|
73
|
+
nonEmptyString(expectedUpdatedAt, 'expectedUpdatedAt');
|
|
74
|
+
return {
|
|
75
|
+
...scope,
|
|
76
|
+
recordId,
|
|
77
|
+
...(expectedRevision === undefined ? {} : { expectedRevision: nonNegativeInteger(expectedRevision, 'expectedRevision') }),
|
|
78
|
+
...(expectedUpdatedAt === undefined ? {} : { expectedUpdatedAt: nonEmptyString(expectedUpdatedAt, 'expectedUpdatedAt') }),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/** 校验 PTY 调用参数,避免把终端尺寸或路径类字段直接信任到 Host。 */
|
|
82
|
+
export function parseDebugPtyLaunchRequest(value) {
|
|
83
|
+
if (!isRecord(value))
|
|
84
|
+
throw new TypeError('PTY 启动请求必须是对象');
|
|
85
|
+
rejectUnknownFields(value, ['sessionId', 'workspaceId', 'generation', 'profileId', 'cols', 'rows'], 'PTY 启动请求');
|
|
86
|
+
const scope = parseDebugRpcScope(value);
|
|
87
|
+
const profileId = nonEmptyString(value.profileId, 'profileId');
|
|
88
|
+
const cols = positiveInteger(value.cols, 'cols');
|
|
89
|
+
const rows = positiveInteger(value.rows, 'rows');
|
|
90
|
+
if (cols > 500 || rows > 200)
|
|
91
|
+
throw new RangeError('PTY 尺寸超出允许范围');
|
|
92
|
+
return { ...scope, profileId, cols, rows };
|
|
93
|
+
}
|
|
94
|
+
function isRecord(value) {
|
|
95
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
96
|
+
}
|
|
97
|
+
function rejectUnknownFields(value, allowed, label) {
|
|
98
|
+
const allowedFields = new Set(allowed);
|
|
99
|
+
const unknown = Object.keys(value).find((key) => !allowedFields.has(key));
|
|
100
|
+
if (unknown !== undefined)
|
|
101
|
+
throw new TypeError(`${label}包含未知字段: ${unknown}`);
|
|
102
|
+
}
|
|
103
|
+
function nonEmptyString(value, field) {
|
|
104
|
+
if (typeof value !== 'string' || value.trim() === '' || value.length > 512) {
|
|
105
|
+
throw new TypeError(`${field} 必须是非空字符串`);
|
|
106
|
+
}
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
109
|
+
function nonNegativeInteger(value, field) {
|
|
110
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {
|
|
111
|
+
throw new TypeError(`${field} 必须是非负整数`);
|
|
112
|
+
}
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
function positiveInteger(value, field) {
|
|
116
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) {
|
|
117
|
+
throw new TypeError(`${field} 必须是正整数`);
|
|
118
|
+
}
|
|
119
|
+
return value;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { RelayIceServer, RelaySignalingTicketResponse } from './signaling.js';
|
|
2
|
+
/** DSH-Codingns4DSH 自己的设备记录,不与 Codingns4DSH Host binding 共用身份。 */
|
|
3
|
+
export interface DshDeviceSummary {
|
|
4
|
+
/** DSH 独立设备身份;不能与 Codingns4DSH host bindingId 混用。 */
|
|
5
|
+
dshDeviceId: string;
|
|
6
|
+
/** 旧 DTO 兼容字段,服务端迁移期间可存在。 */
|
|
7
|
+
deviceId?: string;
|
|
8
|
+
displayName: string;
|
|
9
|
+
protocolVersion: string;
|
|
10
|
+
capabilities: string[];
|
|
11
|
+
dtlsFingerprint: string;
|
|
12
|
+
tunnelDomain?: string;
|
|
13
|
+
status: 'active' | 'disabled' | 'revoked' | 'offline';
|
|
14
|
+
online: boolean;
|
|
15
|
+
lastHeartbeatAt: string | null;
|
|
16
|
+
createdAt: string;
|
|
17
|
+
updatedAt: string;
|
|
18
|
+
}
|
|
19
|
+
export interface DshDeviceRegistrationRequest {
|
|
20
|
+
displayName: string;
|
|
21
|
+
devicePublicKey: string;
|
|
22
|
+
dtlsFingerprint: string;
|
|
23
|
+
protocolVersion: string;
|
|
24
|
+
capabilities: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface DshDeviceRegistrationResponse {
|
|
27
|
+
device: DshDeviceSummary;
|
|
28
|
+
deviceCredential: string;
|
|
29
|
+
credentialVersion: number;
|
|
30
|
+
}
|
|
31
|
+
export interface DshDeviceListResponse {
|
|
32
|
+
devices: DshDeviceSummary[];
|
|
33
|
+
currentDeviceId?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface DshDeviceHeartbeatResponse {
|
|
36
|
+
device: DshDeviceSummary;
|
|
37
|
+
credentialVersion: number;
|
|
38
|
+
}
|
|
39
|
+
export interface DshRelayTicketRequest {
|
|
40
|
+
dshDeviceId: string;
|
|
41
|
+
deviceCredential: string;
|
|
42
|
+
hostDtlsFingerprint: string;
|
|
43
|
+
credentialVersion: number;
|
|
44
|
+
role?: 'host' | 'client';
|
|
45
|
+
}
|
|
46
|
+
/** DSH ticket 复用 Relay 的 ICE/信令字段,但不带 Codingns4DSH bindingId。 */
|
|
47
|
+
export interface DshRelayTicketResponse extends Omit<RelaySignalingTicketResponse, 'bindingId' | 'tunnelDomain' | 'hostDtlsFingerprint' | 'credentialVersion'> {
|
|
48
|
+
product: 'codingns4dsh';
|
|
49
|
+
dshDeviceId: string;
|
|
50
|
+
hostDtlsFingerprint: string;
|
|
51
|
+
tunnelDomain?: string;
|
|
52
|
+
credentialVersion: number;
|
|
53
|
+
hostScope?: {
|
|
54
|
+
hostId: string;
|
|
55
|
+
kind: 'local' | 'remote';
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** H5/Host 侧使用的票据别名,名称与 Relay API DTO 保持一致。 */
|
|
59
|
+
export type DshRelaySignalingTicket = DshRelayTicketResponse;
|
|
60
|
+
export type DshRelayTicketLike = DshRelayTicketResponse | RelaySignalingTicketResponse;
|
|
61
|
+
export type DshIceServer = RelayIceServer;
|
|
62
|
+
/** Host 本地保存的 DSH 设备凭据;deviceCredential 只存在 Host。 */
|
|
63
|
+
export interface DshDeviceCredentialRecord {
|
|
64
|
+
deviceId: string;
|
|
65
|
+
deviceCredential: string;
|
|
66
|
+
credentialVersion: number;
|
|
67
|
+
dtlsFingerprint: string;
|
|
68
|
+
tunnelDomain: string | null;
|
|
69
|
+
displayName: string;
|
|
70
|
+
savedAt: string;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=dsh-device.d.ts.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare const CODINGNS_DSH_ERROR_CODES: {
|
|
2
|
+
readonly PLUGIN_MANIFEST_INVALID: "PLUGIN_MANIFEST_INVALID";
|
|
3
|
+
readonly DSH_VERSION_UNSUPPORTED: "DSH_VERSION_UNSUPPORTED";
|
|
4
|
+
readonly HOST_ENTRY_UNAVAILABLE: "HOST_ENTRY_UNAVAILABLE";
|
|
5
|
+
readonly CLIENT_ENTRY_UNAVAILABLE: "CLIENT_ENTRY_UNAVAILABLE";
|
|
6
|
+
readonly TRANSPORT_NOT_READY: "TRANSPORT_NOT_READY";
|
|
7
|
+
readonly PEER_HOST_NOT_FOUND: "PEER_HOST_NOT_FOUND";
|
|
8
|
+
readonly PEER_HOST_VERSION_MISMATCH: "PEER_HOST_VERSION_MISMATCH";
|
|
9
|
+
readonly PEER_HOST_SESSION_REQUIRED: "PEER_HOST_SESSION_REQUIRED";
|
|
10
|
+
readonly DEBUG_INVALID_REQUEST: "DEBUG_INVALID_REQUEST";
|
|
11
|
+
readonly DEBUG_WORKSPACE_REQUIRED: "DEBUG_WORKSPACE_REQUIRED";
|
|
12
|
+
readonly DEBUG_WORKSPACE_SESSION_MISMATCH: "DEBUG_WORKSPACE_SESSION_MISMATCH";
|
|
13
|
+
readonly DEBUG_GENERATION_STALE: "DEBUG_GENERATION_STALE";
|
|
14
|
+
readonly DEBUG_REVISION_CONFLICT: "DEBUG_REVISION_CONFLICT";
|
|
15
|
+
readonly DEBUG_PROFILE_NOT_FOUND: "DEBUG_PROFILE_NOT_FOUND";
|
|
16
|
+
readonly DEBUG_PROCESS_INSTANCE_NOT_FOUND: "DEBUG_PROCESS_INSTANCE_NOT_FOUND";
|
|
17
|
+
readonly DEBUG_PROCESS_IDENTITY_MISMATCH: "DEBUG_PROCESS_IDENTITY_MISMATCH";
|
|
18
|
+
readonly DEBUG_PORT_LEASE_CONFLICT: "DEBUG_PORT_LEASE_CONFLICT";
|
|
19
|
+
readonly DEBUG_RUNTIME_NOT_FOUND: "DEBUG_RUNTIME_NOT_FOUND";
|
|
20
|
+
readonly DEBUG_PROXY_ROUTE_NOT_FOUND: "DEBUG_PROXY_ROUTE_NOT_FOUND";
|
|
21
|
+
readonly DEBUG_DSH_HOST_API_UNAVAILABLE: "DEBUG_DSH_HOST_API_UNAVAILABLE";
|
|
22
|
+
};
|
|
23
|
+
export declare const SUPPORTED_DSH_VERSION: "0.1.6-alpha.2";
|
|
24
|
+
export declare const SUPPORTED_DSH_COMPATIBILITY: ">=0.1.5-rc.3 <0.1.7-0";
|
|
25
|
+
export type CodingNsDshErrorCode = typeof CODINGNS_DSH_ERROR_CODES[keyof typeof CODINGNS_DSH_ERROR_CODES];
|
|
26
|
+
/** 统一错误形状;阶段 0 只定义,不主动产生这些业务错误。 */
|
|
27
|
+
export declare class CodingNsDshError extends Error {
|
|
28
|
+
readonly code: CodingNsDshErrorCode;
|
|
29
|
+
constructor(code: CodingNsDshErrorCode, message: string, options?: ErrorOptions);
|
|
30
|
+
}
|
|
31
|
+
/** 启动期严格检查 DSH 兼容范围,不对未知版本静默降级。 */
|
|
32
|
+
export declare function assertSupportedDshVersion(version: string): void;
|
|
33
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { DSH_COMPATIBILITY, DSH_VERSION, isDshVersionCompatible } from './version.js';
|
|
2
|
+
export const CODINGNS_DSH_ERROR_CODES = {
|
|
3
|
+
PLUGIN_MANIFEST_INVALID: 'PLUGIN_MANIFEST_INVALID',
|
|
4
|
+
DSH_VERSION_UNSUPPORTED: 'DSH_VERSION_UNSUPPORTED',
|
|
5
|
+
HOST_ENTRY_UNAVAILABLE: 'HOST_ENTRY_UNAVAILABLE',
|
|
6
|
+
CLIENT_ENTRY_UNAVAILABLE: 'CLIENT_ENTRY_UNAVAILABLE',
|
|
7
|
+
TRANSPORT_NOT_READY: 'TRANSPORT_NOT_READY',
|
|
8
|
+
PEER_HOST_NOT_FOUND: 'PEER_HOST_NOT_FOUND',
|
|
9
|
+
PEER_HOST_VERSION_MISMATCH: 'PEER_HOST_VERSION_MISMATCH',
|
|
10
|
+
PEER_HOST_SESSION_REQUIRED: 'PEER_HOST_SESSION_REQUIRED',
|
|
11
|
+
DEBUG_INVALID_REQUEST: 'DEBUG_INVALID_REQUEST',
|
|
12
|
+
DEBUG_WORKSPACE_REQUIRED: 'DEBUG_WORKSPACE_REQUIRED',
|
|
13
|
+
DEBUG_WORKSPACE_SESSION_MISMATCH: 'DEBUG_WORKSPACE_SESSION_MISMATCH',
|
|
14
|
+
DEBUG_GENERATION_STALE: 'DEBUG_GENERATION_STALE',
|
|
15
|
+
DEBUG_REVISION_CONFLICT: 'DEBUG_REVISION_CONFLICT',
|
|
16
|
+
DEBUG_PROFILE_NOT_FOUND: 'DEBUG_PROFILE_NOT_FOUND',
|
|
17
|
+
DEBUG_PROCESS_INSTANCE_NOT_FOUND: 'DEBUG_PROCESS_INSTANCE_NOT_FOUND',
|
|
18
|
+
DEBUG_PROCESS_IDENTITY_MISMATCH: 'DEBUG_PROCESS_IDENTITY_MISMATCH',
|
|
19
|
+
DEBUG_PORT_LEASE_CONFLICT: 'DEBUG_PORT_LEASE_CONFLICT',
|
|
20
|
+
DEBUG_RUNTIME_NOT_FOUND: 'DEBUG_RUNTIME_NOT_FOUND',
|
|
21
|
+
DEBUG_PROXY_ROUTE_NOT_FOUND: 'DEBUG_PROXY_ROUTE_NOT_FOUND',
|
|
22
|
+
DEBUG_DSH_HOST_API_UNAVAILABLE: 'DEBUG_DSH_HOST_API_UNAVAILABLE',
|
|
23
|
+
};
|
|
24
|
+
export const SUPPORTED_DSH_VERSION = DSH_VERSION;
|
|
25
|
+
export const SUPPORTED_DSH_COMPATIBILITY = DSH_COMPATIBILITY;
|
|
26
|
+
/** 统一错误形状;阶段 0 只定义,不主动产生这些业务错误。 */
|
|
27
|
+
export class CodingNsDshError extends Error {
|
|
28
|
+
code;
|
|
29
|
+
constructor(code, message, options) {
|
|
30
|
+
super(message, options);
|
|
31
|
+
this.name = 'CodingNsDshError';
|
|
32
|
+
this.code = code;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** 启动期严格检查 DSH 兼容范围,不对未知版本静默降级。 */
|
|
36
|
+
export function assertSupportedDshVersion(version) {
|
|
37
|
+
if (!isDshVersionCompatible(version)) {
|
|
38
|
+
throw new CodingNsDshError(CODINGNS_DSH_ERROR_CODES.DSH_VERSION_UNSUPPORTED, `不支持的 DSH 版本: ${version};当前插件兼容范围为 ${SUPPORTED_DSH_COMPATIBILITY}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=errors.js.map
|