@blue-soda/dsh-remote 0.4.28
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/LICENSE +29 -0
- package/README.md +81 -0
- package/bin/ds-harness-remote.js +11 -0
- package/cordis.patch.yml +32 -0
- package/dist/acp.d.ts +75 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +61 -0
- package/dist/acp.js.map +1 -0
- package/dist/api-proxy-switch.d.ts +33 -0
- package/dist/api-proxy-switch.d.ts.map +1 -0
- package/dist/api-proxy-switch.js +109 -0
- package/dist/api-proxy-switch.js.map +1 -0
- package/dist/bin/doctor.d.ts +3 -0
- package/dist/bin/doctor.d.ts.map +1 -0
- package/dist/bin/doctor.js +13 -0
- package/dist/bin/doctor.js.map +1 -0
- package/dist/cli.d.ts +32 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +289 -0
- package/dist/cli.js.map +1 -0
- package/dist/client-runtime.d.ts +239 -0
- package/dist/client-runtime.d.ts.map +1 -0
- package/dist/client-runtime.js +1391 -0
- package/dist/client-runtime.js.map +1 -0
- package/dist/client-secure-transport.d.ts +23 -0
- package/dist/client-secure-transport.d.ts.map +1 -0
- package/dist/client-secure-transport.js +143 -0
- package/dist/client-secure-transport.js.map +1 -0
- package/dist/client.d.ts +13 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.github.js +4231 -0
- package/dist/client.js +4231 -0
- package/dist/codex/app-server.d.ts +71 -0
- package/dist/codex/app-server.d.ts.map +1 -0
- package/dist/codex/app-server.js +268 -0
- package/dist/codex/app-server.js.map +1 -0
- package/dist/codex/codex-image-codec.d.ts +7 -0
- package/dist/codex/codex-image-codec.d.ts.map +1 -0
- package/dist/codex/codex-image-codec.js +288 -0
- package/dist/codex/codex-image-codec.js.map +1 -0
- package/dist/codex/domain.d.ts +93 -0
- package/dist/codex/domain.d.ts.map +1 -0
- package/dist/codex/domain.js +1282 -0
- package/dist/codex/domain.js.map +1 -0
- package/dist/codex/method-policy.d.ts +338 -0
- package/dist/codex/method-policy.d.ts.map +1 -0
- package/dist/codex/method-policy.js +141 -0
- package/dist/codex/method-policy.js.map +1 -0
- package/dist/codex/peer-bridge.d.ts +57 -0
- package/dist/codex/peer-bridge.d.ts.map +1 -0
- package/dist/codex/peer-bridge.js +299 -0
- package/dist/codex/peer-bridge.js.map +1 -0
- package/dist/codex/permissions.d.ts +4 -0
- package/dist/codex/permissions.d.ts.map +1 -0
- package/dist/codex/permissions.js +21 -0
- package/dist/codex/permissions.js.map +1 -0
- package/dist/codex/session-id.d.ts +10 -0
- package/dist/codex/session-id.d.ts.map +1 -0
- package/dist/codex/session-id.js +15 -0
- package/dist/codex/session-id.js.map +1 -0
- package/dist/codex/virtual-harness.d.ts +209 -0
- package/dist/codex/virtual-harness.d.ts.map +1 -0
- package/dist/codex/virtual-harness.js +2616 -0
- package/dist/codex/virtual-harness.js.map +1 -0
- package/dist/codex-workspace-bridge.d.ts +108 -0
- package/dist/codex-workspace-bridge.d.ts.map +1 -0
- package/dist/codex-workspace-bridge.js +502 -0
- package/dist/codex-workspace-bridge.js.map +1 -0
- package/dist/config.d.ts +99 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +127 -0
- package/dist/config.js.map +1 -0
- package/dist/connection-controller.d.ts +44 -0
- package/dist/connection-controller.d.ts.map +1 -0
- package/dist/connection-controller.js +185 -0
- package/dist/connection-controller.js.map +1 -0
- package/dist/control-route.d.ts +34 -0
- package/dist/control-route.d.ts.map +1 -0
- package/dist/control-route.js +136 -0
- package/dist/control-route.js.map +1 -0
- package/dist/control-runtime.d.ts +138 -0
- package/dist/control-runtime.d.ts.map +1 -0
- package/dist/control-runtime.js +543 -0
- package/dist/control-runtime.js.map +1 -0
- package/dist/control-stream.d.ts +67 -0
- package/dist/control-stream.d.ts.map +1 -0
- package/dist/control-stream.js +179 -0
- package/dist/control-stream.js.map +1 -0
- package/dist/defaults.d.ts +9 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +9 -0
- package/dist/defaults.js.map +1 -0
- package/dist/file-viewer-bridge.d.ts +30 -0
- package/dist/file-viewer-bridge.d.ts.map +1 -0
- package/dist/file-viewer-bridge.js +128 -0
- package/dist/file-viewer-bridge.js.map +1 -0
- package/dist/file-viewer-contract.d.ts +5 -0
- package/dist/file-viewer-contract.d.ts.map +1 -0
- package/dist/file-viewer-contract.js +4 -0
- package/dist/file-viewer-contract.js.map +1 -0
- package/dist/harness-api-bridge.d.ts +79 -0
- package/dist/harness-api-bridge.d.ts.map +1 -0
- package/dist/harness-api-bridge.js +852 -0
- package/dist/harness-api-bridge.js.map +1 -0
- package/dist/harness-api-history.d.ts +3 -0
- package/dist/harness-api-history.d.ts.map +1 -0
- package/dist/harness-api-history.js +59 -0
- package/dist/harness-api-history.js.map +1 -0
- package/dist/harness-remote-bridge.d.ts +52 -0
- package/dist/harness-remote-bridge.d.ts.map +1 -0
- package/dist/harness-remote-bridge.js +529 -0
- package/dist/harness-remote-bridge.js.map +1 -0
- package/dist/harness-version.d.ts +23 -0
- package/dist/harness-version.d.ts.map +1 -0
- package/dist/harness-version.js +95 -0
- package/dist/harness-version.js.map +1 -0
- package/dist/identity-store.d.ts +45 -0
- package/dist/identity-store.d.ts.map +1 -0
- package/dist/identity-store.js +183 -0
- package/dist/identity-store.js.map +1 -0
- package/dist/ids.d.ts +2 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/ids.js +17 -0
- package/dist/ids.js.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28870 -0
- package/dist/index.js.map +7 -0
- package/dist/logging.d.ts +18 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +30 -0
- package/dist/logging.js.map +1 -0
- package/dist/loopback-host.d.ts +20 -0
- package/dist/loopback-host.d.ts.map +1 -0
- package/dist/loopback-host.js +245 -0
- package/dist/loopback-host.js.map +1 -0
- package/dist/loopback-preview.d.ts +19 -0
- package/dist/loopback-preview.d.ts.map +1 -0
- package/dist/loopback-preview.js +232 -0
- package/dist/loopback-preview.js.map +1 -0
- package/dist/native-rtc-helper.d.ts +14 -0
- package/dist/native-rtc-helper.d.ts.map +1 -0
- package/dist/native-rtc-helper.js +575 -0
- package/dist/native-rtc-helper.js.map +1 -0
- package/dist/remote-api-proxy.d.ts +17 -0
- package/dist/remote-api-proxy.d.ts.map +1 -0
- package/dist/remote-api-proxy.js +400 -0
- package/dist/remote-api-proxy.js.map +1 -0
- package/dist/remote-directory-browser.d.ts +16 -0
- package/dist/remote-directory-browser.d.ts.map +1 -0
- package/dist/remote-directory-browser.js +48 -0
- package/dist/remote-directory-browser.js.map +1 -0
- package/dist/remote-file-content-provider.d.ts +48 -0
- package/dist/remote-file-content-provider.d.ts.map +1 -0
- package/dist/remote-file-content-provider.js +93 -0
- package/dist/remote-file-content-provider.js.map +1 -0
- package/dist/remote-typert-gateway.d.ts +20 -0
- package/dist/remote-typert-gateway.d.ts.map +1 -0
- package/dist/remote-typert-gateway.js +332 -0
- package/dist/remote-typert-gateway.js.map +1 -0
- package/dist/rpc-router.d.ts +31 -0
- package/dist/rpc-router.d.ts.map +1 -0
- package/dist/rpc-router.js +201 -0
- package/dist/rpc-router.js.map +1 -0
- package/dist/safe-error.d.ts +8 -0
- package/dist/safe-error.d.ts.map +1 -0
- package/dist/safe-error.js +20 -0
- package/dist/safe-error.js.map +1 -0
- package/dist/server-api.d.ts +109 -0
- package/dist/server-api.d.ts.map +1 -0
- package/dist/server-api.js +520 -0
- package/dist/server-api.js.map +1 -0
- package/dist/server-connection.d.ts +79 -0
- package/dist/server-connection.d.ts.map +1 -0
- package/dist/server-connection.js +1023 -0
- package/dist/server-connection.js.map +1 -0
- package/dist/server-credentials.d.ts +55 -0
- package/dist/server-credentials.d.ts.map +1 -0
- package/dist/server-credentials.js +105 -0
- package/dist/server-credentials.js.map +1 -0
- package/dist/service.d.ts +141 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +432 -0
- package/dist/service.js.map +1 -0
- package/dist/session-format-compat.d.ts +3 -0
- package/dist/session-format-compat.d.ts.map +1 -0
- package/dist/session-format-compat.js +183 -0
- package/dist/session-format-compat.js.map +1 -0
- package/dist/status-stream.d.ts +48 -0
- package/dist/status-stream.d.ts.map +1 -0
- package/dist/status-stream.js +133 -0
- package/dist/status-stream.js.map +1 -0
- package/dist/terminal-policy.d.ts +21 -0
- package/dist/terminal-policy.d.ts.map +1 -0
- package/dist/terminal-policy.js +68 -0
- package/dist/terminal-policy.js.map +1 -0
- package/dist/tui-command.d.ts +13 -0
- package/dist/tui-command.d.ts.map +1 -0
- package/dist/tui-command.js +390 -0
- package/dist/tui-command.js.map +1 -0
- package/dist/typert-gateway-contract.d.ts +59 -0
- package/dist/typert-gateway-contract.d.ts.map +1 -0
- package/dist/typert-gateway-contract.js +2 -0
- package/dist/typert-gateway-contract.js.map +1 -0
- package/dist/typert-gateway-switch.d.ts +85 -0
- package/dist/typert-gateway-switch.d.ts.map +1 -0
- package/dist/typert-gateway-switch.js +315 -0
- package/dist/typert-gateway-switch.js.map +1 -0
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +12 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +12 -0
- package/dist/version.js.map +1 -0
- package/dist/werift-rtc.d.ts +121 -0
- package/dist/werift-rtc.d.ts.map +1 -0
- package/dist/werift-rtc.js +490 -0
- package/dist/werift-rtc.js.map +1 -0
- package/dsh-plugin.json +41 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +165 -0
- package/public.d.ts +26 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 DSH Remote contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
This distribution is a fork of https://github.com/liguobao/ds-harness-remote and is
|
|
26
|
+
published as @blue-soda/dsh-remote. The original notice above is retained unchanged,
|
|
27
|
+
as the MIT License requires. The notice below covers the changes made in this fork.
|
|
28
|
+
|
|
29
|
+
Modifications Copyright (c) 2026 blue-soda <blue-soda@users.noreply.github.com>
|
package/README.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# DeepSeek Harness Remote
|
|
2
|
+
|
|
3
|
+
Continue DeepSeek Harness sessions and experimental Codex workspaces from another device over an end-to-end encrypted connection.
|
|
4
|
+
|
|
5
|
+
[GitHub](https://github.com/blue-soda/ds-harness-remote) · [Full guide](https://github.com/blue-soda/ds-harness-remote#readme) · [中文说明](https://github.com/blue-soda/ds-harness-remote/blob/main/README.zh.md) · [Remote Web](https://dsh.r2049.cn/app) · [Android](https://github.com/blue-soda/ds-harness-remote/releases/latest)
|
|
6
|
+
|
|
7
|
+
`ds-harness-remote` is the Remote Host and workspace plugin for DeepSeek Harness. Harness keeps running on your work computer with its existing workspaces, tools, and permission controls; Remote gives authorized devices another window into that environment.
|
|
8
|
+
|
|
9
|
+
> Install this package with `dsh plugin`, not `npm install`. The DSH command updates the selected profile and adds the required bundle configuration.
|
|
10
|
+
|
|
11
|
+
> **This is a fork** of [liguobao/ds-harness-remote](https://github.com/liguobao/ds-harness-remote) (MIT),
|
|
12
|
+
> published as [`@blue-soda/dsh-remote`](https://www.npmjs.com/package/@blue-soda/dsh-remote).
|
|
13
|
+
> The original project and its contributors are credited in [LICENSE](LICENSE) and `contributors`.
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
### DSH Desktop
|
|
18
|
+
|
|
19
|
+
[DSH Desktop](https://github.com/liguobao/dsh-desktop) includes Remote and enables it by default. No separate plugin installation is required.
|
|
20
|
+
|
|
21
|
+
### Existing DSH installation
|
|
22
|
+
|
|
23
|
+
Add the current package version to the `web` profile, then restart Harness:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
dsh plugin --profile web add -w @blue-soda/dsh-remote@0.4.28
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### dsh-TUI Host
|
|
30
|
+
|
|
31
|
+
Remote can also run as a Host in a terminal-only [dsh-TUI](https://github.com/ccch1mneyyy/dsh-TUI) profile:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
dsh plugin --profile dsh-tui add -w @blue-soda/dsh-remote@0.4.28
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
After starting dsh-TUI, manage Remote with `/remote`, `/remote login`, `/remote status`, and `/remote logout`.
|
|
38
|
+
|
|
39
|
+
## Highlights
|
|
40
|
+
|
|
41
|
+
- Continue active Harness sessions and review progress from another computer, the web, or Android.
|
|
42
|
+
- Send text and image prompts, answer questions, and handle permission requests.
|
|
43
|
+
- Open workspaces on another authorized computer without replacing the native Harness interface.
|
|
44
|
+
- Use the official workspace file tree and bounded read-only previews on supported Harness versions.
|
|
45
|
+
- Use an optional Host-local terminal and authorized loopback development-service previews.
|
|
46
|
+
- Open Host Codex projects in the existing Remote UI through the optional experimental Codex domain.
|
|
47
|
+
- Reach the Host without opening a public listening port or configuring router port forwarding.
|
|
48
|
+
|
|
49
|
+
## Compatibility
|
|
50
|
+
|
|
51
|
+
Plugin `0.4.28` targets DeepSeek Harness `dsh-v0.2.0-rc.2` and retains `dsh-v0.1.7-rc.1` compatibility; it also supports `dsh-v0.1.6-alpha.2` and earlier settings hosts. It supports:
|
|
52
|
+
|
|
53
|
+
- `dsh-v0.1.1-rc.2` through the official legacy `ApiProxy`;
|
|
54
|
+
- `dsh-v0.1.2-alpha.1` through `dsh-v0.1.2-rc.1` through the official Typert Remote Gateway;
|
|
55
|
+
- `dsh-v0.1.5-rc.1`, `dsh-v0.1.6-alpha.1`, and `dsh-v0.2.0-rc.2` Session V3 through the official Typert Remote Gateway.
|
|
56
|
+
|
|
57
|
+
The same package feature-detects the older settings registry and the `0.1.7-rc.1` and `0.2.0-rc.2` Volatile settings entry. Remote Web/Desktop and Android normalize released sessions that still report the retired `code` agent preset to `ptc`. The Host reads the running Harness version from the CLI entrypoint, or from the 0.2.0 Desktop shell's `@deepseek-ai/dsh-desktop-host` entrypoint when the Harness CLI package is only a sibling of that entrypoint inside `app.asar`.
|
|
58
|
+
|
|
59
|
+
## Self-hosted Server
|
|
60
|
+
|
|
61
|
+
This repository includes a minimal, single-account self-hosted Relay Server in [`apps/server`](https://github.com/blue-soda/ds-harness-remote/tree/main/apps/server). Configure `DSH_SERVER_ACCOUNT` and `DSH_SERVER_PASSWORD`, then point the Host and clients at the same server URL. It provides account login, device credentials, encrypted Control/Noise forwarding, Relay, and a device-status page. It does not provide the complete multi-account Server, Remote Web session UI, or WebRTC/TURN deployment.
|
|
62
|
+
|
|
63
|
+
## Security boundary
|
|
64
|
+
|
|
65
|
+
- Session traffic is encrypted on the Client and decrypted only by the selected Host using `Noise_IK_25519_ChaChaPoly_SHA256`.
|
|
66
|
+
- Account membership and the Host's locally pinned device identity must both authorize a connection.
|
|
67
|
+
- The Host creates outbound connections only; it does not listen on a public port.
|
|
68
|
+
- Remote does not expose general tool RPC, remote desktop, or file-mutation APIs.
|
|
69
|
+
- Interactive terminals are enabled by default and can be disabled in the Host-local Remote settings; they run as the Host user independently of Agent approvals.
|
|
70
|
+
|
|
71
|
+
## Documentation
|
|
72
|
+
|
|
73
|
+
- [Complete guide](https://github.com/blue-soda/ds-harness-remote#readme)
|
|
74
|
+
- [dsh-TUI Remote guide](https://github.com/blue-soda/ds-harness-remote/blob/main/docs/dsh-tui.md)
|
|
75
|
+
- [Codex Remote technical notes](https://github.com/blue-soda/ds-harness-remote/blob/main/docs/codex-remote.md)
|
|
76
|
+
- [End-to-end encryption](https://github.com/blue-soda/ds-harness-remote/blob/main/docs/end-to-end-encryption.md)
|
|
77
|
+
- [Network and transport](https://github.com/blue-soda/ds-harness-remote/blob/main/docs/network.md)
|
|
78
|
+
- [Protocol reference](https://github.com/blue-soda/ds-harness-remote/blob/main/docs/protocol.md)
|
|
79
|
+
- [Changelog](https://github.com/blue-soda/ds-harness-remote/blob/main/CHANGELOG.md)
|
|
80
|
+
|
|
81
|
+
This is an independent community project and is not an official DeepSeek product. Licensed under the [MIT License](./LICENSE).
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
- insert:
|
|
2
|
+
- id: ds-harness-remote
|
|
3
|
+
name: '@blue-soda/dsh-remote'
|
|
4
|
+
# dsh-TUI needs a scoped entry with explicit command/scene injects.
|
|
5
|
+
# Keep this ordinary Desktop entry inactive when that front door exists.
|
|
6
|
+
disabled: !!js >-
|
|
7
|
+
[...ctx.loader.entries()].some(entry =>
|
|
8
|
+
(entry.options.id === 'dsh-tui' || entry.options.name === '@deepseek-harness-tui/dsh-tui')
|
|
9
|
+
&& !entry.disabled
|
|
10
|
+
)
|
|
11
|
+
config:
|
|
12
|
+
enabled: true
|
|
13
|
+
role: host
|
|
14
|
+
serverUrl: https://sakakibara.ink:8443
|
|
15
|
+
codex:
|
|
16
|
+
enabled: true
|
|
17
|
+
binary: codex
|
|
18
|
+
- id: ds-harness-remote-tui
|
|
19
|
+
name: '@blue-soda/dsh-remote'
|
|
20
|
+
disabled: !!js >-
|
|
21
|
+
![...ctx.loader.entries()].some(entry =>
|
|
22
|
+
(entry.options.id === 'dsh-tui' || entry.options.name === '@deepseek-harness-tui/dsh-tui')
|
|
23
|
+
&& !entry.disabled
|
|
24
|
+
)
|
|
25
|
+
inject: [settings, typertGateway, commands, tuiCommandTrees, tuiScenes]
|
|
26
|
+
config:
|
|
27
|
+
enabled: true
|
|
28
|
+
role: host
|
|
29
|
+
serverUrl: https://sakakibara.ink:8443
|
|
30
|
+
codex:
|
|
31
|
+
enabled: true
|
|
32
|
+
binary: codex
|
package/dist/acp.d.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { AcpBackend, AcpInitializeParams, AcpInitializeResult, AcpPromptParams, AcpSessionParams, AcpPermissionResponseParams, AcpCancelParams, AcpSetModeParams, AcpSessionUpdate } from '@dsh-remote/protocol';
|
|
2
|
+
/** Backend-neutral ACP adapter. Implementations must keep state scoped to a connection. */
|
|
3
|
+
export interface AcpBackendAdapter {
|
|
4
|
+
readonly backend: AcpBackend;
|
|
5
|
+
initialize(params: AcpInitializeParams): Promise<AcpInitializeResult>;
|
|
6
|
+
sessionNew(params: AcpSessionParams): Promise<{
|
|
7
|
+
sessionId: string;
|
|
8
|
+
}>;
|
|
9
|
+
sessionLoad?(params: AcpSessionParams): Promise<{
|
|
10
|
+
sessionId: string;
|
|
11
|
+
}>;
|
|
12
|
+
prompt(params: AcpPromptParams, emit: (update: AcpSessionUpdate) => Promise<void>): Promise<void>;
|
|
13
|
+
respondPermission?(params: AcpPermissionResponseParams): Promise<void>;
|
|
14
|
+
cancel?(params: AcpCancelParams): Promise<void>;
|
|
15
|
+
setMode?(params: AcpSetModeParams): Promise<void>;
|
|
16
|
+
close?(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare class AcpGateway {
|
|
19
|
+
private readonly adapters;
|
|
20
|
+
constructor(adapters: AcpBackendAdapter | Iterable<AcpBackendAdapter>);
|
|
21
|
+
private get;
|
|
22
|
+
initialize(p: AcpInitializeParams): Promise<AcpInitializeResult>;
|
|
23
|
+
sessionNew(p: AcpSessionParams & {
|
|
24
|
+
backend?: AcpBackend;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
sessionId: string;
|
|
27
|
+
}>;
|
|
28
|
+
sessionLoad(p: AcpSessionParams & {
|
|
29
|
+
backend?: AcpBackend;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
sessionId: string;
|
|
32
|
+
}>;
|
|
33
|
+
prompt(p: AcpPromptParams & {
|
|
34
|
+
backend?: AcpBackend;
|
|
35
|
+
}, emit: (u: AcpSessionUpdate) => Promise<void>): Promise<void>;
|
|
36
|
+
respondPermission(p: AcpPermissionResponseParams & {
|
|
37
|
+
backend?: AcpBackend;
|
|
38
|
+
}): Promise<void>;
|
|
39
|
+
cancel(p: AcpCancelParams & {
|
|
40
|
+
backend?: AcpBackend;
|
|
41
|
+
}): Promise<void>;
|
|
42
|
+
setMode(p: AcpSetModeParams & {
|
|
43
|
+
backend?: AcpBackend;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
export interface AcpIdeConfig {
|
|
47
|
+
id: string;
|
|
48
|
+
command: string;
|
|
49
|
+
args?: string[];
|
|
50
|
+
cwd?: string;
|
|
51
|
+
}
|
|
52
|
+
export declare const DEFAULT_ACP_IDES: readonly AcpIdeConfig[];
|
|
53
|
+
/** JSON-RPC stdio bridge for ACP agents (Cursor/Kimi/CodeX). */
|
|
54
|
+
export declare class StdioAcpAdapter {
|
|
55
|
+
private readonly config;
|
|
56
|
+
readonly backend: AcpBackend;
|
|
57
|
+
private child?;
|
|
58
|
+
private nextId;
|
|
59
|
+
constructor(config: AcpIdeConfig);
|
|
60
|
+
private ensure;
|
|
61
|
+
initialize(params: AcpInitializeParams): Promise<AcpInitializeResult>;
|
|
62
|
+
sessionNew(params: AcpSessionParams): Promise<{
|
|
63
|
+
sessionId: string;
|
|
64
|
+
}>;
|
|
65
|
+
sessionLoad(params: AcpSessionParams): Promise<{
|
|
66
|
+
sessionId: string;
|
|
67
|
+
}>;
|
|
68
|
+
prompt(params: AcpPromptParams, emit: (u: AcpSessionUpdate) => Promise<void>): Promise<void>;
|
|
69
|
+
cancel(p: AcpCancelParams): Promise<void>;
|
|
70
|
+
setMode(p: AcpSetModeParams): Promise<void>;
|
|
71
|
+
respondPermission(p: AcpPermissionResponseParams): Promise<void>;
|
|
72
|
+
close(): Promise<void>;
|
|
73
|
+
private call;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=acp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp.d.ts","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAErN,2FAA2F;AAC3F,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;IAC5B,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACrE,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpE,WAAW,CAAC,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjG,iBAAiB,CAAC,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtE,MAAM,CAAC,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/C,OAAO,CAAC,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB;AAED,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,CAAC;IACtF,OAAO,CAAC,GAAG;IACX,UAAU,CAAC,CAAC,EAAE,mBAAmB;IACjC,UAAU,CAAC,CAAC,EAAE,gBAAgB,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE;mBAbE,MAAM;;IAcjE,WAAW,CAAC,CAAC,EAAE,gBAAgB,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE;mBAbG,MAAM;;IAcnE,MAAM,CAAC,CAAC,EAAE,eAAe,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC;IAClG,iBAAiB,CAAC,CAAC,EAAE,2BAA2B,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE;IAC3E,MAAM,CAAC,CAAC,EAAE,eAAe,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE;IACpD,OAAO,CAAC,CAAC,EAAE,gBAAgB,GAAG;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE;CACvD;AAID,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AAC5F,eAAO,MAAM,gBAAgB,EAAE,SAAS,YAAY,EAInD,CAAA;AAED,gEAAgE;AAChE,qBAAa,eAAe;IAId,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAgC;IAC9C,OAAO,CAAC,MAAM,CAAI;gBACW,MAAM,EAAE,YAAY;IACjD,OAAO,CAAC,MAAM;IACR,UAAU,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IACrE,UAAU,CAAC,MAAM,EAAE,gBAAgB;;;IACnC,WAAW,CAAC,MAAM,EAAE,gBAAgB;;;IACpC,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC;IAC5E,MAAM,CAAC,CAAC,EAAE,eAAe;IACzB,OAAO,CAAC,CAAC,EAAE,gBAAgB;IAC3B,iBAAiB,CAAC,CAAC,EAAE,2BAA2B;IAChD,KAAK;IACX,OAAO,CAAC,IAAI;CACb"}
|
package/dist/acp.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export class AcpGateway {
|
|
2
|
+
adapters;
|
|
3
|
+
constructor(adapters) {
|
|
4
|
+
this.adapters = adapters;
|
|
5
|
+
}
|
|
6
|
+
get(p) { const list = this.adapters instanceof Object && 'backend' in this.adapters ? [this.adapters] : [...this.adapters]; const a = list.find(x => !p.backend || x.backend === p.backend); if (!a)
|
|
7
|
+
throw new Error('CAPABILITY_NOT_SUPPORTED'); return a; }
|
|
8
|
+
initialize(p) { return this.get(p).initialize(p); }
|
|
9
|
+
sessionNew(p) { return this.get(p).sessionNew(p); }
|
|
10
|
+
sessionLoad(p) { const a = this.get(p); if (!a.sessionLoad)
|
|
11
|
+
throw new Error('CAPABILITY_NOT_SUPPORTED'); return a.sessionLoad(p); }
|
|
12
|
+
prompt(p, emit) { return this.get(p).prompt(p, emit); }
|
|
13
|
+
respondPermission(p) { const a = this.get(p); if (!a.respondPermission)
|
|
14
|
+
throw new Error('CAPABILITY_NOT_SUPPORTED'); return a.respondPermission(p); }
|
|
15
|
+
cancel(p) { const a = this.get(p); if (!a.cancel)
|
|
16
|
+
throw new Error('CAPABILITY_NOT_SUPPORTED'); return a.cancel(p); }
|
|
17
|
+
setMode(p) { const a = this.get(p); if (!a.setMode)
|
|
18
|
+
throw new Error('CAPABILITY_NOT_SUPPORTED'); return a.setMode(p); }
|
|
19
|
+
}
|
|
20
|
+
import { spawn } from 'node:child_process';
|
|
21
|
+
export const DEFAULT_ACP_IDES = [
|
|
22
|
+
{ id: 'codex', command: 'codex', args: ['acp'] },
|
|
23
|
+
{ id: 'cursor', command: 'agent', args: ['acp'] },
|
|
24
|
+
{ id: 'kimi', command: 'kimi', args: ['acp'] },
|
|
25
|
+
];
|
|
26
|
+
/** JSON-RPC stdio bridge for ACP agents (Cursor/Kimi/CodeX). */
|
|
27
|
+
export class StdioAcpAdapter {
|
|
28
|
+
config;
|
|
29
|
+
backend;
|
|
30
|
+
child;
|
|
31
|
+
nextId = 1;
|
|
32
|
+
constructor(config) {
|
|
33
|
+
this.config = config;
|
|
34
|
+
this.backend = config.id;
|
|
35
|
+
}
|
|
36
|
+
ensure() { if (!this.child)
|
|
37
|
+
this.child = spawn(this.config.command, this.config.args ?? [], { cwd: this.config.cwd, stdio: 'pipe' }); return this.child; }
|
|
38
|
+
async initialize(params) { await this.call('initialize', params); return { protocolVersion: 1, capability: 'agent.acp.v1', backend: this.backend, capabilities: ['session.new', 'session.load', 'session.prompt', 'session.cancel'] }; }
|
|
39
|
+
async sessionNew(params) { const r = await this.call('session/new', params); if (!r.sessionId)
|
|
40
|
+
throw new Error('INVALID_MESSAGE'); return { sessionId: r.sessionId }; }
|
|
41
|
+
async sessionLoad(params) { const r = await this.call('session/load', params); if (!r.sessionId)
|
|
42
|
+
throw new Error('INVALID_MESSAGE'); return { sessionId: r.sessionId }; }
|
|
43
|
+
async prompt(params, emit) { await this.call('session/prompt', params, async (n) => emit({ sessionId: params.sessionId, update: n, seq: this.nextId++ })); }
|
|
44
|
+
async cancel(p) { await this.call('session/cancel', p); }
|
|
45
|
+
async setMode(p) { await this.call('session/set_mode', p); }
|
|
46
|
+
async respondPermission(p) { await this.call('session/request_permission', p); }
|
|
47
|
+
async close() { this.child?.kill(); this.child = undefined; }
|
|
48
|
+
call(method, params, onNotification) { const c = this.ensure(); const id = this.nextId++; c.stdin.write(JSON.stringify({ jsonrpc: '2.0', id, method, params }) + '\n'); return new Promise((resolve, reject) => { let buf = ''; const onData = async (d) => { buf += d; const lines = buf.split('\n'); buf = lines.pop() ?? ''; for (const l of lines) {
|
|
49
|
+
try {
|
|
50
|
+
const m = JSON.parse(l);
|
|
51
|
+
if (m.id === id) {
|
|
52
|
+
c.stdout.off('data', onData);
|
|
53
|
+
m.error ? reject(new Error(m.error.message ?? 'ACP error')) : resolve(m.result);
|
|
54
|
+
}
|
|
55
|
+
else if (m.method && onNotification)
|
|
56
|
+
await onNotification(m.params);
|
|
57
|
+
}
|
|
58
|
+
catch { }
|
|
59
|
+
} }; c.stdout.on('data', onData); c.once('error', reject); }); }
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=acp.js.map
|
package/dist/acp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp.js","sourceRoot":"","sources":["../src/acp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ApiProxy } from '@deepseek-ai/dsh-host-apiproxy/api';
|
|
2
|
+
export type HarnessMode = 'local' | 'remote';
|
|
3
|
+
export interface RemoteTarget {
|
|
4
|
+
deviceId: string;
|
|
5
|
+
name: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Installs stable forwarding objects into the official ApiProxy instance.
|
|
9
|
+
* Existing HTTP/WebSocket carriers retain the same service identity while new
|
|
10
|
+
* requests resolve against the currently selected local or remote target.
|
|
11
|
+
*/
|
|
12
|
+
export declare class ApiProxySwitch {
|
|
13
|
+
private remote?;
|
|
14
|
+
private target?;
|
|
15
|
+
private mode;
|
|
16
|
+
private installed;
|
|
17
|
+
private readonly local;
|
|
18
|
+
private readonly originals;
|
|
19
|
+
private readonly localRespond;
|
|
20
|
+
constructor(local: ApiProxy);
|
|
21
|
+
install(): void;
|
|
22
|
+
selectRemote(api: ApiProxy, target: RemoteTarget): void;
|
|
23
|
+
selectLocal(): void;
|
|
24
|
+
status(): {
|
|
25
|
+
mode: HarnessMode;
|
|
26
|
+
target?: RemoteTarget;
|
|
27
|
+
};
|
|
28
|
+
restore(): void;
|
|
29
|
+
private selected;
|
|
30
|
+
private originalDomain;
|
|
31
|
+
private requireRemote;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=api-proxy-switch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-proxy-switch.d.ts","sourceRoot":"","sources":["../src/api-proxy-switch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAElE,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE5C,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAgBD;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,CAAU;IACzB,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiF;IAC3G,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAEtC,KAAK,EAAE,QAAQ;IAM3B,OAAO,IAAI,IAAI;IA6Bf,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IAOvD,WAAW,IAAI,IAAI;IAMnB,MAAM,IAAI;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,YAAY,CAAA;KAAE;IAItD,OAAO,IAAI,IAAI;IAkBf,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;CAItB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-proxy-switch.js","sourceRoot":"","sources":["../src/api-proxy-switch.ts"],"names":[],"mappings":"AASA,MAAM,gBAAgB,GAAG;IACvB,UAAU;IACV,WAAW;IACX,MAAM;IACN,WAAW;IACX,QAAQ;IACR,cAAc;IACd,QAAQ;IACR,OAAO;IACP,KAAK;IACL,UAAU;IACV,aAAa;CACmC,CAAA;AAElD;;;;GAIG;AACH,MAAM,OAAO,cAAc;IACjB,MAAM,CAAW;IACjB,MAAM,CAAe;IACrB,IAAI,GAAgB,OAAO,CAAA;IAC3B,SAAS,GAAG,KAAK,CAAA;IACR,KAAK,CAAU;IACf,SAAS,CAAiF;IAC1F,YAAY,CAAqB;IAElD,YAAY,KAAe;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACjF,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/C,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,SAAS;YAAE,OAAM;QAC1B,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;YACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACtC,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE;gBAC9B,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;oBACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAA4C,CAAA;oBACjF,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;oBAC3B,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;gBACnE,CAAC;aACF,CAAC,CAAA;YACF,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;gBACxC,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,SAA+B;aACvC,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE;YAC3C,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC,GAAG,IAAqC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;gBACzE,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;SAC/B,CAAC,CAAA;QACF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACvB,CAAC;IAED,YAAY,CAAC,GAAa,EAAE,MAAoB;QAC9C,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;QAChF,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;QACjB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;QAC3B,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAA;IACtB,CAAC;IAED,WAAW;QACT,IAAI,CAAC,IAAI,GAAG,OAAO,CAAA;QACnB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;IACzB,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAA;IAClG,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAM;QAC3B,IAAI,CAAC,WAAW,EAAE,CAAA;QAClB,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;gBACtF,YAAY,EAAE,IAAI;gBAClB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;gBACd,KAAK;aACN,CAAC,CAAA;QACF,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE;YAC3C,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI,CAAC,YAAY;SACzB,CAAC,CAAA;QACF,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACxB,CAAC;IAEO,QAAQ,CAAC,MAAuC;QACtD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;QAC7D,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;IAEO,cAAc,CAAC,MAAuC;QAC5D,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAA4B,CAAA;IAC9D,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QACvF,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,aAAa,EAEb,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,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"}
|