host-execution-mcp 1.0.0 → 2.0.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/CHANGELOG.md +44 -0
- package/README.md +14 -12
- package/SECURITY.md +3 -3
- package/dist/access/index.d.ts +21 -10
- package/dist/access/index.js +55 -27
- package/dist/access/index.js.map +1 -1
- package/dist/access/paradi-auth.d.ts +3 -3
- package/dist/access/paradi-auth.js +4 -4
- package/dist/access/paradi-auth.js.map +1 -1
- package/dist/access/paradi-transport.d.ts +1 -1
- package/dist/access/paradi-transport.js +3 -3
- package/dist/access/paradi-transport.js.map +1 -1
- package/dist/access/paradi-username.d.ts +1 -1
- package/dist/access/paradi-username.js +2 -2
- package/dist/access/paradi-username.js.map +1 -1
- package/dist/access/session-pool.d.ts +5 -0
- package/dist/access/session-pool.js +7 -0
- package/dist/access/session-pool.js.map +1 -1
- package/dist/access/ssh-transport.d.ts +1 -1
- package/dist/access/ssh-transport.js +3 -2
- package/dist/access/ssh-transport.js.map +1 -1
- package/dist/config-yaml.d.ts +54 -0
- package/dist/config-yaml.js +172 -0
- package/dist/config-yaml.js.map +1 -0
- package/dist/config.d.ts +45 -1
- package/dist/config.js +126 -22
- package/dist/config.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +4 -1
- package/dist/instructions.js +92 -70
- package/dist/instructions.js.map +1 -1
- package/dist/kubectl/runner.d.ts +7 -8
- package/dist/kubectl/runner.js +18 -21
- package/dist/kubectl/runner.js.map +1 -1
- package/dist/link-runtime.d.ts +39 -0
- package/dist/link-runtime.js +134 -0
- package/dist/link-runtime.js.map +1 -0
- package/dist/server.d.ts +2 -1
- package/dist/server.js +10 -12
- package/dist/server.js.map +1 -1
- package/dist/sources/guides.d.ts +34 -0
- package/dist/sources/guides.js +50 -0
- package/dist/sources/guides.js.map +1 -0
- package/dist/sources/index.d.ts +5 -0
- package/dist/sources/index.js +22 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/yaml-template.d.ts +31 -0
- package/dist/sources/yaml-template.js +35 -0
- package/dist/sources/yaml-template.js.map +1 -0
- package/dist/ssh/access-client.d.ts +6 -2
- package/dist/ssh/access-client.js +58 -27
- package/dist/ssh/access-client.js.map +1 -1
- package/dist/ssh/access-errors.js +1 -1
- package/dist/ssh/access-errors.js.map +1 -1
- package/dist/ssh/access-sftp.js +3 -3
- package/dist/ssh/access-sftp.js.map +1 -1
- package/dist/tools/copy-job-schemas.d.ts +96 -581
- package/dist/tools/copy-job-schemas.js +9 -9
- package/dist/tools/copy-job-schemas.js.map +1 -1
- package/dist/tools/register.d.ts +2 -10
- package/dist/tools/register.js +174 -331
- package/dist/tools/register.js.map +1 -1
- package/dist/tools/remote-schemas.d.ts +156 -708
- package/dist/tools/remote-schemas.js +99 -103
- package/dist/tools/remote-schemas.js.map +1 -1
- package/dist/utils/copy-executor.d.ts +3 -1
- package/dist/utils/copy-executor.js +39 -25
- package/dist/utils/copy-executor.js.map +1 -1
- package/dist/utils/copy-transfer.d.ts +2 -0
- package/dist/utils/copy-transfer.js.map +1 -1
- package/dist/utils/remote-executor.d.ts +3 -4
- package/dist/utils/remote-executor.js +8 -18
- package/dist/utils/remote-executor.js.map +1 -1
- package/dist/utils/remote-target.js +1 -1
- package/dist/utils/remote-target.js.map +1 -1
- package/docs/AGENT_GUIDE.md +31 -103
- package/docs/CONFIGURATION.md +39 -10
- package/docs/GUIDE.md +186 -0
- package/docs/PARADI_ACCESS_PLAN.md +6 -6
- package/docs/TODO.md +4 -11
- package/docs/USER_GUIDE.zh-CN.md +38 -69
- package/docs/host-execution.yaml +92 -0
- package/docs/paradi-gateway-interactive.png +0 -0
- package/package.json +67 -65
- package/dist/ssh/bastion-client.d.ts +0 -60
- package/dist/ssh/bastion-client.js +0 -423
- package/dist/ssh/bastion-client.js.map +0 -1
- package/dist/ssh/bastion-errors.d.ts +0 -62
- package/dist/ssh/bastion-errors.js +0 -190
- package/dist/ssh/bastion-errors.js.map +0 -1
- package/dist/ssh/hop1-sftp.d.ts +0 -14
- package/dist/ssh/hop1-sftp.js +0 -437
- package/dist/ssh/hop1-sftp.js.map +0 -1
package/docs/USER_GUIDE.zh-CN.md
CHANGED
|
@@ -1,93 +1,62 @@
|
|
|
1
1
|
# host-execution-mcp 使用教程
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
配置、`ACCESS_KIND`、怎么跟 Agent 说话,以 [GUIDE.md](./GUIDE.md) 为准(MCP Resource `host-execution://guides/user`)。本文只补 Codex 接法、旧包迁移和场景示例。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
建议配套 [k8s-multi-node-deploy](../../../skill/env/k8s-multi-node-deploy/) skill。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
帕拉迪网关长什么样(先连网关,再选手选资产 / 账号):
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+

|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## Codex
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
node -v
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## 2. MCP 配置(Cursor)
|
|
20
|
-
|
|
21
|
-
配置文件:`.cursor/mcp.json`,或 Cursor → Settings → MCP → Edit Config。
|
|
22
|
-
|
|
23
|
-
```json
|
|
24
|
-
{
|
|
25
|
-
"mcpServers": {
|
|
26
|
-
"host-execution": {
|
|
27
|
-
"command": "npx",
|
|
28
|
-
"args": ["-y", "host-execution-mcp@latest"],
|
|
29
|
-
"env": {
|
|
30
|
-
"ACCESS_HOST": "10.121.120.7",
|
|
31
|
-
"ACCESS_USER": "your-user"
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
`ACCESS_HOST` + `ACCESS_USER` 填你**本机能 SSH 直连的入口机**(跳板或目标机)即可。可选 `TARGET_HOST` / `TARGET_USER` / `TARGET_PASSWORD` 作为默认第二跳(见 CONFIGURATION.md)。
|
|
39
|
-
|
|
40
|
-
保存后重启 MCP 服务。验证连通:
|
|
41
|
-
|
|
42
|
-
> 先用 host-execution 跑 `access_check`。若要做 Kubernetes 相关操作,通过后再跑 `kubectl cluster-info --request-timeout=5s`(纯 ACCESS/主机 SSH 任务不必跑 cluster-info)。
|
|
13
|
+
把 GUIDE §2 的 `env` 配进 Codex。不要把密码写进仓库或对话。
|
|
43
14
|
|
|
44
|
-
|
|
15
|
+
也可把 GUIDE 里的 JSON 交给 Codex,让它按 GUIDE 配。`~/.codex/config.toml` 示意:
|
|
45
16
|
|
|
46
|
-
|
|
17
|
+
```toml
|
|
18
|
+
[mcp_servers.host-execution]
|
|
19
|
+
command = "npx"
|
|
20
|
+
args = ["-y", "host-execution-mcp@latest"]
|
|
47
21
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
| 看日志 | Pod 名 + 日志**文件路径**(训练日志多在挂载盘,不是 stdout) |
|
|
56
|
-
| 拷到本地 | 远程路径 + 本地目录(Agent 读取后写入本机) |
|
|
57
|
-
| 排查故障 | 日志 / dmesg / core 路径 + 「只读分析」 |
|
|
58
|
-
|
|
59
|
-
输出太大被截断时,让 Agent 用 `grep`、`tail` 缩小范围。
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## 4. 示例话术
|
|
22
|
+
[mcp_servers.host-execution.env]
|
|
23
|
+
ACCESS_KIND = "ssh"
|
|
24
|
+
ACCESS_HOST = "<入口机 IP>"
|
|
25
|
+
ACCESS_USER = "<入口机用户>"
|
|
26
|
+
ACCESS_PASSWORD = "<入口机密码>"
|
|
27
|
+
ACCESS_PORT = "22"
|
|
28
|
+
```
|
|
64
29
|
|
|
65
|
-
|
|
30
|
+
> 使用时整个 vscode 窗口只能当作一个类似 Codex 桌面版 app,建议配合 terminal 使用。
|
|
66
31
|
|
|
67
|
-
|
|
32
|
+
## 与旧包对照(迁移)
|
|
68
33
|
|
|
69
|
-
|
|
34
|
+
| 旧(bastion-k8s-mcp) | 新(host-execution-mcp) |
|
|
35
|
+
| --- | --- |
|
|
36
|
+
| `bastion-k8s-mcp@3.x` | `host-execution-mcp@1.0.0` |
|
|
37
|
+
| `BASTION_HOST` / `USER` / `PASSWORD` / `PORT` | `ACCESS_HOST` / `USER` / `PASSWORD` / `PORT` |
|
|
38
|
+
| `REMOTE_SSH_USER` / `PASSWORD` | `TARGET_USER` / `TARGET_PASSWORD` |
|
|
39
|
+
| `bastion_check` / `bastion_exec` | `access_check` / `shell_exec` |
|
|
40
|
+
| — | `ACCESS_KIND=paradi-gateway` + `TARGET_*`(帕拉迪) |
|
|
70
41
|
|
|
71
|
-
|
|
42
|
+
## 场景示例
|
|
72
43
|
|
|
73
|
-
|
|
44
|
+
1. MCP + SKILL → 让从零重新创建一个负载,然后拉 128 个节点
|
|
74
45
|
|
|
75
|
-
|
|
46
|
+

|
|
76
47
|
|
|
77
|
-
|
|
48
|
+
2. 帮进行多机 mccl-test 测试(替换新 mccl 测试)
|
|
78
49
|
|
|
79
|
-
|
|
50
|
+
(上下文信息已经有了对应 16 机信息)
|
|
80
51
|
|
|
81
|
-
|
|
52
|
+

|
|
82
53
|
|
|
83
|
-
|
|
54
|
+
3. 批量配置 128 机环境,并帮拉起训练做对比验证
|
|
84
55
|
|
|
85
|
-
|
|
56
|
+

|
|
86
57
|
|
|
87
|
-
|
|
58
|
+
4. 负载任务
|
|
88
59
|
|
|
89
|
-
-
|
|
90
|
-
- **k8s_logs 为空**:容器日志流(stdout+stderr)可能为空;日志在文件里时让 Agent 读挂载路径,不要只用 `k8s_logs`
|
|
91
|
-
- **多个节点都 Killed**:先找第一个报 MUSA/SIGABRT 的 rank,其余可能是连锁退出
|
|
60
|
+

|
|
92
61
|
|
|
93
|
-
|
|
62
|
+
常见问题见 [GUIDE.md](./GUIDE.md)。更多环境变量见 [CONFIGURATION.md](./CONFIGURATION.md)。
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# host-execution 名册(对照 docs/GUIDE.md §2)
|
|
2
|
+
# 路径写死:
|
|
3
|
+
# Linux/mac ~/.agents/host-execution.yaml
|
|
4
|
+
# Windows %USERPROFILE%\.agents\host-execution.yaml
|
|
5
|
+
#
|
|
6
|
+
# 一条链路 = GUIDE 里一份 mcp.json env。description 必填且唯一,写清场景用途(谁、干什么、哪台),不要只写「本机直连 + IP」。
|
|
7
|
+
# 追加:在 links 下复制下面某一段示例,去掉行首 #,改 description 与账号。
|
|
8
|
+
# 对话里出现新的 user+IP(新跳板/网关/账号,或同一 IP 换用户)→ 追加一条,不要只记在对话里。
|
|
9
|
+
# 同一 ACCESS 且同一 TARGET_USER、只是多了一个目标 IP → 往该条 TARGET_HOSTS 加一项。
|
|
10
|
+
# 同一 IP、不同用户(root vs mccxadmin)是两条链路,不要写进同一条 TARGET_HOSTS。
|
|
11
|
+
# description 不准(场景变了、或「本机/跳板/生产」说错)→ 当场改名,随后按新名精确选用;不要把旧名当不可改主键。
|
|
12
|
+
# 本轮对话一直指向某一条 → 一直用那条,不要因为本文件有多条(含同 IP 另一用户)就换。
|
|
13
|
+
# 选用时 description 必须精确相等。不要 CIDR / 通配。
|
|
14
|
+
# 帕拉迪:不要手写 USER/HOST/OSUSER 或 密码@##@… ,由 MCP 编码。
|
|
15
|
+
|
|
16
|
+
links: []
|
|
17
|
+
|
|
18
|
+
# --- GUIDE §2.1 最少:只上入口机 ---
|
|
19
|
+
# - description: 入口机本机作业
|
|
20
|
+
# ACCESS_KIND: ssh # 可省,默认 ssh
|
|
21
|
+
# ACCESS_HOST: "<入口机 IP>"
|
|
22
|
+
# ACCESS_USER: "<入口机用户>"
|
|
23
|
+
# ACCESS_PASSWORD: "<入口机密码>"
|
|
24
|
+
# ACCESS_PORT: 22 # 可省
|
|
25
|
+
|
|
26
|
+
# --- GUIDE §2.1 密钥代替密码 ---
|
|
27
|
+
# - description: 入口机密钥登录
|
|
28
|
+
# ACCESS_HOST: "<入口机 IP>"
|
|
29
|
+
# ACCESS_USER: "<入口机用户>"
|
|
30
|
+
# ACCESS_PRIVATE_KEY_PATH: "<密钥路径>"
|
|
31
|
+
|
|
32
|
+
# --- GUIDE §2.1 限制 kubectl 命名空间 ---
|
|
33
|
+
# ALLOWED_NAMESPACES: "his-test"
|
|
34
|
+
|
|
35
|
+
# --- GUIDE §2.1 跳板 + 一台默认第二跳 ---
|
|
36
|
+
# - description: 跳板再上训练机
|
|
37
|
+
# ACCESS_HOST: "<入口机 IP>"
|
|
38
|
+
# ACCESS_USER: "<入口机用户>"
|
|
39
|
+
# ACCESS_PASSWORD: "<入口机密码>"
|
|
40
|
+
# TARGET_HOSTS:
|
|
41
|
+
# - "<目标机 IP>"
|
|
42
|
+
# TARGET_USER: "<目标机用户>"
|
|
43
|
+
# TARGET_PASSWORD: "<目标机密码>"
|
|
44
|
+
|
|
45
|
+
# --- GUIDE §2.1 跳板 + 多台已知 IP(同一账号)---
|
|
46
|
+
# - description: 跳板再上多台训练机
|
|
47
|
+
# ACCESS_HOST: "<入口机 IP>"
|
|
48
|
+
# ACCESS_USER: "<入口机用户>"
|
|
49
|
+
# ACCESS_PASSWORD: "<入口机密码>"
|
|
50
|
+
# TARGET_HOSTS:
|
|
51
|
+
# - "<目标机 IP>"
|
|
52
|
+
# - "<目标机 IP>"
|
|
53
|
+
# TARGET_USER: "<目标机用户>"
|
|
54
|
+
# TARGET_PASSWORD: "<目标机密码>"
|
|
55
|
+
|
|
56
|
+
# --- GUIDE §2.1 只留账号,对话里说 IP ---
|
|
57
|
+
# - description: 跳板账号已配,目标 IP 对话指定
|
|
58
|
+
# ACCESS_HOST: "<入口机 IP>"
|
|
59
|
+
# ACCESS_USER: "<入口机用户>"
|
|
60
|
+
# ACCESS_PASSWORD: "<入口机密码>"
|
|
61
|
+
# TARGET_USER: "<目标机用户>"
|
|
62
|
+
# TARGET_PASSWORD: "<目标机密码>"
|
|
63
|
+
|
|
64
|
+
# --- GUIDE §2.2 帕拉迪 ---
|
|
65
|
+
# - description: 经网关上业务机
|
|
66
|
+
# ACCESS_KIND: paradi-gateway
|
|
67
|
+
# ACCESS_HOST: "<网关 IP>"
|
|
68
|
+
# ACCESS_PORT: 22
|
|
69
|
+
# ACCESS_USER: "<网关用户>"
|
|
70
|
+
# ACCESS_PASSWORD: "<网关密码>"
|
|
71
|
+
# ACCESS_PARADI_AUTH: auto # auto | slash | compound
|
|
72
|
+
# TARGET_HOSTS:
|
|
73
|
+
# - "<目标机 IP>"
|
|
74
|
+
# TARGET_USER: "<目标机系统用户>"
|
|
75
|
+
|
|
76
|
+
# --- 同一 IP、不同用户:两条链路 ---
|
|
77
|
+
# - description: 业务机 mccxadmin
|
|
78
|
+
# ACCESS_HOST: "<入口机 IP>"
|
|
79
|
+
# ACCESS_USER: "<入口机用户>"
|
|
80
|
+
# ACCESS_PASSWORD: "<入口机密码>"
|
|
81
|
+
# TARGET_HOSTS:
|
|
82
|
+
# - "<目标机 IP>"
|
|
83
|
+
# TARGET_USER: "mccxadmin"
|
|
84
|
+
# TARGET_PASSWORD: "<该用户密码>"
|
|
85
|
+
# - description: 业务机 root
|
|
86
|
+
# ACCESS_HOST: "<入口机 IP>"
|
|
87
|
+
# ACCESS_USER: "<入口机用户>"
|
|
88
|
+
# ACCESS_PASSWORD: "<入口机密码>"
|
|
89
|
+
# TARGET_HOSTS:
|
|
90
|
+
# - "<目标机 IP>"
|
|
91
|
+
# TARGET_USER: "root"
|
|
92
|
+
# TARGET_PASSWORD: "<该用户密码>"
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,65 +1,67 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "host-execution-mcp",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Access -> HostExecutionContext -> Runtime MCP for remote shell/docker/kubectl (SSH jump or Paradi gateway)",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
|
-
"bin": {
|
|
8
|
-
"host-execution-mcp": "dist/index.js"
|
|
9
|
-
},
|
|
10
|
-
"files": [
|
|
11
|
-
"dist",
|
|
12
|
-
"README.md",
|
|
13
|
-
"LICENSE",
|
|
14
|
-
"CHANGELOG.md",
|
|
15
|
-
"SECURITY.md",
|
|
16
|
-
"docs"
|
|
17
|
-
],
|
|
18
|
-
"scripts": {
|
|
19
|
-
"build": "tsc",
|
|
20
|
-
"start": "node dist/index.js",
|
|
21
|
-
"dev": "tsc && node dist/index.js",
|
|
22
|
-
"test": "node --import tsx --test tests/*.test.ts",
|
|
23
|
-
"lint": "eslint src tests",
|
|
24
|
-
"format": "prettier --write .",
|
|
25
|
-
"format:check": "prettier --check .",
|
|
26
|
-
"prepublishOnly": "npm run build && npm test"
|
|
27
|
-
},
|
|
28
|
-
"engines": {
|
|
29
|
-
"node": ">=18"
|
|
30
|
-
},
|
|
31
|
-
"keywords": [
|
|
32
|
-
"mcp",
|
|
33
|
-
"host-execution",
|
|
34
|
-
"kubernetes",
|
|
35
|
-
"kubectl",
|
|
36
|
-
"ssh",
|
|
37
|
-
"paradi"
|
|
38
|
-
],
|
|
39
|
-
"license": "MIT",
|
|
40
|
-
"repository": {
|
|
41
|
-
"type": "git",
|
|
42
|
-
"url": "git+https://github.com/your-org/host-execution-mcp.git"
|
|
43
|
-
},
|
|
44
|
-
"bugs": {
|
|
45
|
-
"url": "https://github.com/your-org/host-execution-mcp/issues"
|
|
46
|
-
},
|
|
47
|
-
"homepage": "https://github.com/your-org/host-execution-mcp#readme",
|
|
48
|
-
"dependencies": {
|
|
49
|
-
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
50
|
-
"
|
|
51
|
-
"ssh2
|
|
52
|
-
"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"@
|
|
57
|
-
"@types/
|
|
58
|
-
"@types/
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
|
|
65
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "host-execution-mcp",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Access -> HostExecutionContext -> Runtime MCP for remote shell/docker/kubectl (SSH jump or Paradi gateway)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"host-execution-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE",
|
|
14
|
+
"CHANGELOG.md",
|
|
15
|
+
"SECURITY.md",
|
|
16
|
+
"docs"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"start": "node dist/index.js",
|
|
21
|
+
"dev": "tsc && node dist/index.js",
|
|
22
|
+
"test": "node --import tsx --test tests/*.test.ts",
|
|
23
|
+
"lint": "eslint src tests",
|
|
24
|
+
"format": "prettier --write .",
|
|
25
|
+
"format:check": "prettier --check .",
|
|
26
|
+
"prepublishOnly": "npm run build && npm test"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"mcp",
|
|
33
|
+
"host-execution",
|
|
34
|
+
"kubernetes",
|
|
35
|
+
"kubectl",
|
|
36
|
+
"ssh",
|
|
37
|
+
"paradi"
|
|
38
|
+
],
|
|
39
|
+
"license": "MIT",
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "git+https://github.com/your-org/host-execution-mcp.git"
|
|
43
|
+
},
|
|
44
|
+
"bugs": {
|
|
45
|
+
"url": "https://github.com/your-org/host-execution-mcp/issues"
|
|
46
|
+
},
|
|
47
|
+
"homepage": "https://github.com/your-org/host-execution-mcp#readme",
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
50
|
+
"js-yaml": "^5.4.2",
|
|
51
|
+
"ssh2": "^1.16.0",
|
|
52
|
+
"ssh2-sftp-client": "^12.1.1",
|
|
53
|
+
"zod": "^3.24.2"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@eslint/js": "^9.23.0",
|
|
57
|
+
"@types/js-yaml": "^4.0.9",
|
|
58
|
+
"@types/node": "^22.13.10",
|
|
59
|
+
"@types/ssh2": "^1.15.4",
|
|
60
|
+
"@types/ssh2-sftp-client": "^9.0.6",
|
|
61
|
+
"eslint": "^9.23.0",
|
|
62
|
+
"prettier": "^3.5.3",
|
|
63
|
+
"tsx": "^4.19.3",
|
|
64
|
+
"typescript": "^5.8.2",
|
|
65
|
+
"typescript-eslint": "^8.28.0"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import type { AppConfig } from "../config.js";
|
|
2
|
-
import { type SftpCopyOptions, type SftpTransferResult } from "../utils/copy-transfer.js";
|
|
3
|
-
import { type AccessCheckResult } from "./bastion-errors.js";
|
|
4
|
-
export interface ExecOutput {
|
|
5
|
-
stdout: string;
|
|
6
|
-
stderr: string;
|
|
7
|
-
exitCode: number;
|
|
8
|
-
durationMs: number;
|
|
9
|
-
}
|
|
10
|
-
export declare class BastionClient {
|
|
11
|
-
private client;
|
|
12
|
-
private connecting;
|
|
13
|
-
/** Serializes ensureBastionReady / check cache updates. */
|
|
14
|
-
private gate;
|
|
15
|
-
private readonly config;
|
|
16
|
-
private readyUntil;
|
|
17
|
-
private unavailableUntil;
|
|
18
|
-
private lastUnavailable;
|
|
19
|
-
constructor(config: AppConfig);
|
|
20
|
-
/**
|
|
21
|
-
* Ensure bastion is reachable (TTL-cached). Uses an ephemeral SSH probe ?
|
|
22
|
-
* never disconnects an in-flight shared exec session on success.
|
|
23
|
-
*/
|
|
24
|
-
ensureBastionReady(): Promise<void>;
|
|
25
|
-
/**
|
|
26
|
-
* Short-timeout Local to ACCESS probe (ephemeral client; <=10s worst case).
|
|
27
|
-
* Respects negative TTL (returns cached failure). Does not sever shared exec SSH.
|
|
28
|
-
*/
|
|
29
|
-
check(): Promise<AccessCheckResult>;
|
|
30
|
-
exec(command: string, timeoutMs?: number, cwd?: string, signal?: AbortSignal): Promise<ExecOutput>;
|
|
31
|
-
disconnect(): void;
|
|
32
|
-
/**
|
|
33
|
-
* Upload local path (file or directory) ? bastion via independent Hop1 SFTP.
|
|
34
|
-
* Transfer-phase errors are not reclassified into ACCESS_UNAVAILABLE.
|
|
35
|
-
*/
|
|
36
|
-
uploadPath(localPath: string, remotePath: string, options?: SftpCopyOptions): Promise<SftpTransferResult>;
|
|
37
|
-
/**
|
|
38
|
-
* Download bastion path (file or directory) ? local via independent Hop1 SFTP.
|
|
39
|
-
*/
|
|
40
|
-
downloadPath(remotePath: string, localPath: string, options?: SftpCopyOptions): Promise<SftpTransferResult>;
|
|
41
|
-
private withGate;
|
|
42
|
-
private markReady;
|
|
43
|
-
/**
|
|
44
|
-
* Record a connect-phase failure. Negative TTL only for classified causes
|
|
45
|
-
* (not UNKNOWN), so transient unknowns are not blackholed for 15s.
|
|
46
|
-
*/
|
|
47
|
-
private markConnectUnavailable;
|
|
48
|
-
/** Ephemeral SSH + shell probe; never assigns or disconnects `this.client`. */
|
|
49
|
-
private probeEphemeral;
|
|
50
|
-
private remoteSha256;
|
|
51
|
-
private ensureConnected;
|
|
52
|
-
private ensureConnectedUnlocked;
|
|
53
|
-
private requireClient;
|
|
54
|
-
/**
|
|
55
|
-
* Open a dedicated ssh2 Client with readyTimeout + hard deadline
|
|
56
|
-
* (covers TCP blackhole where ssh2 readyTimeout alone is insufficient).
|
|
57
|
-
*/
|
|
58
|
-
private openSshClient;
|
|
59
|
-
private execOnClient;
|
|
60
|
-
}
|