@goodandready/dsh-remote-workspace 0.3.7 → 0.3.9
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 +49 -2
- package/README.ru.md +49 -2
- package/README.zh.md +49 -2
- package/lib/agent-endpoint.js +16 -0
- package/lib/client.js +1367 -418
- package/lib/cluster-service.js +57 -0
- package/lib/exec-retry.js +24 -0
- package/lib/file-transfer.js +56 -0
- package/lib/host-projection.js +42 -0
- package/lib/index.js +23 -4
- package/lib/jump-chain.js +56 -0
- package/lib/poll-gate.js +5 -0
- package/lib/profile-groups.js +60 -0
- package/lib/proxy-command.js +53 -0
- package/lib/remote-fs-service.js +25 -0
- package/lib/routes/files.js +75 -0
- package/lib/routes/profiles.js +82 -8
- package/lib/routes/terminal.js +19 -0
- package/lib/ssh-config-parser.js +111 -49
- package/lib/ssh-service.js +180 -21
- package/lib/terminal-font.js +12 -0
- package/lib/tools.js +52 -1
- package/lib/tunnel-service.js +3 -0
- package/lib/types.js +7 -0
- package/lib/updater-service.js +3 -18
- package/lib/workspace-mount.js +5 -0
- package/package.json +1 -2
- package/docs/design/DESIGN.md +0 -91
package/lib/updater-service.js
CHANGED
|
@@ -31,21 +31,9 @@ function isLoopback(value) {
|
|
|
31
31
|
)
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
function isPrivateLan(value) {
|
|
35
|
-
const address = value?.toLowerCase().replace(/^\[|\]$/g, '')
|
|
36
|
-
if (!address) return false
|
|
37
|
-
const ipv4 = address.startsWith('::ffff:') ? address.slice(7) : address
|
|
38
|
-
return (
|
|
39
|
-
ipv4.startsWith('192.168.') ||
|
|
40
|
-
ipv4.startsWith('10.') ||
|
|
41
|
-
/^172\.(1[6-9]|2[0-9]|3[0-1])\./.test(ipv4)
|
|
42
|
-
)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
34
|
export function isTrustedUpdateRequest(request) {
|
|
46
35
|
if (header(request, UPDATE_HEADER) !== '1') return false
|
|
47
|
-
|
|
48
|
-
if (!isLoopback(remote) && !isPrivateLan(remote)) return false
|
|
36
|
+
if (!isLoopback(request.socket?.remoteAddress)) return false
|
|
49
37
|
const site = header(request, 'sec-fetch-site')
|
|
50
38
|
if (site !== undefined && site !== 'same-origin') return false
|
|
51
39
|
const origin = header(request, 'origin')
|
|
@@ -53,11 +41,8 @@ export function isTrustedUpdateRequest(request) {
|
|
|
53
41
|
if (origin === undefined || host === undefined) return false
|
|
54
42
|
try {
|
|
55
43
|
const url = new URL(origin)
|
|
56
|
-
return (
|
|
57
|
-
(url.
|
|
58
|
-
(isLoopback(url.hostname) || isPrivateLan(url.hostname)) &&
|
|
59
|
-
url.host === host
|
|
60
|
-
)
|
|
44
|
+
return (url.protocol === 'http:' || url.protocol === 'https:')
|
|
45
|
+
&& isLoopback(url.hostname) && url.host === host
|
|
61
46
|
} catch (err) { /* best-effort fallback */
|
|
62
47
|
return false
|
|
63
48
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@goodandready/dsh-remote-workspace",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.9",
|
|
4
4
|
"description": "Enterprise Remote Workspace Plugin for DeepSeek Harness: SSH2 connection pool, SFTP operations, 3-way conflict-aware mirror sync, port forwarding, and native DSH UI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
"README.md",
|
|
17
17
|
"README.ru.md",
|
|
18
18
|
"README.zh.md",
|
|
19
|
-
"docs/design/DESIGN.md",
|
|
20
19
|
"LICENSE"
|
|
21
20
|
],
|
|
22
21
|
"scripts": {
|
package/docs/design/DESIGN.md
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# DESIGN.md — dsh-remote-workspace
|
|
2
|
-
|
|
3
|
-
## Product / Purpose
|
|
4
|
-
- **Назначение**: Полнофункциональный корпоративный плагин удалённой разработки для DeepSeek Harness (DSH). Обеспечивает подключение к удалённым серверам по SSH (ключ / пароль), SFTP-навигацию, 3-way синхронизацию локального зеркала, SSH-туннелирование (port forwarding) и компактный набор инструментов для LLM агента (
|
|
5
|
-
emote_exec,
|
|
6
|
-
emote_fs,
|
|
7
|
-
emote_sync,
|
|
8
|
-
emote_tunnel).
|
|
9
|
-
- **Аудитория**: Разработчики и инженеры, использующие DSH для работы с проектами на VPS, удаленных серверах, облачных инстансах и MiniPC.
|
|
10
|
-
- **Статус**: Стабильный релиз v0.3.3 (One-Click Updater, Cross-Plugin API, Clean Tokens, Modular Routes).
|
|
11
|
-
|
|
12
|
-
## User Surfaces
|
|
13
|
-
- **Web/UI**: Нативная карточка настроек профилей хостов (settings.plugin.item), удаленный SFTP браузер каталогов, чип статуса подключения в шапке сессии (conversation.session.header.utilities).
|
|
14
|
-
- **DSH UI / settings / slots**:
|
|
15
|
-
- Карточка плагина: settings.plugin.item для @goodandready/dsh-remote-workspace.
|
|
16
|
-
- Статусный чип сессии: conversation.session.header.utilities (order: 30).
|
|
17
|
-
- Запрещённые слоты: settings.section (запрещён стандартом authoring, все настройки только внутри settings.plugin.item).
|
|
18
|
-
- **API маршруты**:
|
|
19
|
-
- GET /dsh-remote-workspace/state: получение профилей, активного хоста и туннелей.
|
|
20
|
-
- POST /dsh-remote-workspace/profiles/save: сохранение профиля (с валидацией и сбросом старых соединений).
|
|
21
|
-
- POST /dsh-remote-workspace/profiles/delete: удаление профиля.
|
|
22
|
-
- POST /dsh-remote-workspace/profiles/active: переключение активного профиля.
|
|
23
|
-
- POST /dsh-remote-workspace/test: live-проверка связи (Ping, OS, Latency).
|
|
24
|
-
- POST /dsh-remote-workspace/browse: чтение содержимого удалённой папки (SFTP).
|
|
25
|
-
- POST /dsh-remote-workspace/sync: запуск двусторонней 3-way синхронизации зеркала (pull/push).
|
|
26
|
-
- POST /dsh-remote-workspace/tunnels/start: создание локального SSH-туннеля.
|
|
27
|
-
- POST /dsh-remote-workspace/tunnels/stop: остановка активного SSH-туннеля.
|
|
28
|
-
- **CLI / Model Tools**:
|
|
29
|
-
-
|
|
30
|
-
emote_exec: выполнение команд на сервере.
|
|
31
|
-
-
|
|
32
|
-
emote_fs: чтение, атомарная запись, stat, mkdir, remove.
|
|
33
|
-
-
|
|
34
|
-
emote_sync: запуск 3-way синхронизации с контролем конфликтов.
|
|
35
|
-
-
|
|
36
|
-
emote_tunnel: создание/остановка/листинг туннелей.
|
|
37
|
-
|
|
38
|
-
## Visual Direction (Единый стиль dsh-clinebot)
|
|
39
|
-
- **Атмосфера**: Премиальный инженерный интерфейс уровня VS Code Remote / Linear. Строгая типографика, плотные функциональные карточки, чистые переходы и отсутствие лишних теней.
|
|
40
|
-
- **Токены ядра DSH**:
|
|
41
|
-
- Фоны: ar(--dsw-alias-bg-layer-3) (карточки), ar(--dsw-alias-bg-layer-2) (поля ввода, вложенные блоки, таблицы), ar(--dsw-alias-bg-layer-1) (сегменты, подложка).
|
|
42
|
-
- Границы: ar(--dsw-alias-border-l2).
|
|
43
|
-
- Текст: ar(--dsw-alias-label-primary), ar(--dsw-alias-label-secondary), ar(--dsw-alias-label-dimmed).
|
|
44
|
-
- Статусы: ar(--dsw-alias-state-success-primary), ar(--dsw-alias-state-warning-primary), ar(--dsw-alias-state-error-primary), ar(--dsw-alias-state-brand-primary).
|
|
45
|
-
- **Шапка карточки**:
|
|
46
|
-
- Название плагина, подзаголовок, статусный аккордеонный шеврон.
|
|
47
|
-
- Статусные пилюли (Badges): Host online / Offline, Active Profile, Active Tunnels count.
|
|
48
|
-
|
|
49
|
-
## Components And States
|
|
50
|
-
1. **Секция 1: Профили серверов (SSH Profiles)**:
|
|
51
|
-
- Таблица настроенных машин с бейджами типа аутентификации (🔑 key / 🔒 pwd), меткой активного сервера, кнопками «Сделать активным», «Редактировать», «Удалить».
|
|
52
|
-
- Пустое состояние: ясное сообщение и кнопка + Добавить хост.
|
|
53
|
-
2. **Секция 2: Интерактивный редактор профиля**:
|
|
54
|
-
- Название, Хост/IP, Порт, Пользователь.
|
|
55
|
-
- Сегментированный переключатель авторизации (SSH-ключ vs Пароль).
|
|
56
|
-
- Поля авторизации: путь к приватному ключу, парольная фраза, либо пароль (маскированный).
|
|
57
|
-
- Директории: Удалённый каталог проекта (с кнопкой вызова SFTP браузера) и **Локальная папка зеркала** (с подсказкой назначения).
|
|
58
|
-
- Кнопки: «⚡ Проверить связь (Ping)», «Отмена», «Сохранить».
|
|
59
|
-
- Результат пинга: отображение Latency: X ms | OS: Y или понятный текст ошибки.
|
|
60
|
-
3. **Секция 3: Диагностика активного подключения**:
|
|
61
|
-
- Четырёхколоночная сетка метрик активного сервера (Хост, Удалённая папка, Метод авторизации, Статус ядра).
|
|
62
|
-
4. **Секция 4: Синхронизация зеркала (Mirror Sync)**:
|
|
63
|
-
- Кнопки Pull (Remote -> Local) и Push (Local -> Remote) с индикацией процесса, результатом и предупреждением при конфликтах.
|
|
64
|
-
5. **Секция 5: SSH-туннели (Port Forwarding)**:
|
|
65
|
-
- Таблица активных туннелей (ID, Локальный порт -> Удалённый порт) с кнопкой закрытия.
|
|
66
|
-
- Форма создания нового туннеля (Local Port, Remote Port, кнопка «Открыть туннель»).
|
|
67
|
-
|
|
68
|
-
## Security & Reliability
|
|
69
|
-
- Защита всех мутирующих эндпоинтов проверкой isTrustedSettingsRequest(req) (защита от cross-site атак).
|
|
70
|
-
- Безопасное чтение Cordis сервисов через .get() с fallback.
|
|
71
|
-
- Изоляция жизненного цикла стримов в TunnelService (прослушивание сокетных и потоковых ошибок).
|
|
72
|
-
|
|
73
|
-
### v0.3.3 Client Architecture Modularization (Refs: #14)
|
|
74
|
-
- Client-side code decomposed into modular ES components under `src/client/`:
|
|
75
|
-
- `src/client/styles.js` — CSS styling with DSH theme variables
|
|
76
|
-
- `src/client/locales.js` — English and Chinese translation dictionaries
|
|
77
|
-
- `src/client/env-editor.js` — Remote .env manager tab component
|
|
78
|
-
- `src/client/docker.js` — Container inspector tab component
|
|
79
|
-
- `src/client/terminal.js` — Web terminal tab component
|
|
80
|
-
- `src/client/file-browser.js` — Remote file explorer tab component
|
|
81
|
-
- `src/client/settings-view.js` — Profiles, tunnels, and sync settings component
|
|
82
|
-
- `src/client/updater-section.js` — One-click updater section component
|
|
83
|
-
- `src/client/plugin-card.js` — Plugin card and status chip components
|
|
84
|
-
- `src/client/entry.js` — Cordis client plugin apply and slot registration
|
|
85
|
-
- Added native builder `scripts/build-client.mjs` hooked into `prepack` and `npm test`.
|
|
86
|
-
|
|
87
|
-
### v0.3.6 Model Tools JSON Schema Standardization (Refs: #33)
|
|
88
|
-
- Все 9 инструментов (`remote_exec`, `remote_fs`, `remote_sync`, `remote_tunnel`, `remote_docker`, `remote_service`, `remote_transfer`, `remote_diagnose`, `remote_env`) переведены на компиляцию через `defineTool()` из `@deepseek-ai/dsh-tools`.
|
|
89
|
-
- Параметры инструментов компилируются в строгий JSON Schema с корнем `{ type: 'object', properties: ..., required: [...] }`.
|
|
90
|
-
- Предотвращены ошибки валидации схем в OpenAI-совместимых провайдерах (`Invalid schema: schema must be a JSON Schema of 'type: "object"', got 'type: null'`).
|
|
91
|
-
- Схема вывода стандартизирована с явным `{ type: 'object', additionalProperties: true }`.
|