host-execution-mcp 1.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.
Files changed (126) hide show
  1. package/CHANGELOG.md +330 -0
  2. package/LICENSE +21 -0
  3. package/README.md +92 -0
  4. package/SECURITY.md +72 -0
  5. package/dist/access/docker-runtime.d.ts +38 -0
  6. package/dist/access/docker-runtime.js +61 -0
  7. package/dist/access/docker-runtime.js.map +1 -0
  8. package/dist/access/index.d.ts +110 -0
  9. package/dist/access/index.js +174 -0
  10. package/dist/access/index.js.map +1 -0
  11. package/dist/access/paradi-auth.d.ts +33 -0
  12. package/dist/access/paradi-auth.js +89 -0
  13. package/dist/access/paradi-auth.js.map +1 -0
  14. package/dist/access/paradi-transport.d.ts +10 -0
  15. package/dist/access/paradi-transport.js +39 -0
  16. package/dist/access/paradi-transport.js.map +1 -0
  17. package/dist/access/paradi-username.d.ts +5 -0
  18. package/dist/access/paradi-username.js +14 -0
  19. package/dist/access/paradi-username.js.map +1 -0
  20. package/dist/access/probe.d.ts +14 -0
  21. package/dist/access/probe.js +63 -0
  22. package/dist/access/probe.js.map +1 -0
  23. package/dist/access/session-pool.d.ts +25 -0
  24. package/dist/access/session-pool.js +46 -0
  25. package/dist/access/session-pool.js.map +1 -0
  26. package/dist/access/ssh-transport.d.ts +16 -0
  27. package/dist/access/ssh-transport.js +74 -0
  28. package/dist/access/ssh-transport.js.map +1 -0
  29. package/dist/access/types.d.ts +43 -0
  30. package/dist/access/types.js +21 -0
  31. package/dist/access/types.js.map +1 -0
  32. package/dist/config.d.ts +52 -0
  33. package/dist/config.js +179 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.js +19 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/instructions.d.ts +4 -0
  39. package/dist/instructions.js +93 -0
  40. package/dist/instructions.js.map +1 -0
  41. package/dist/kubectl/runner.d.ts +32 -0
  42. package/dist/kubectl/runner.js +79 -0
  43. package/dist/kubectl/runner.js.map +1 -0
  44. package/dist/server.d.ts +3 -0
  45. package/dist/server.js +24 -0
  46. package/dist/server.js.map +1 -0
  47. package/dist/ssh/access-client.d.ts +62 -0
  48. package/dist/ssh/access-client.js +470 -0
  49. package/dist/ssh/access-client.js.map +1 -0
  50. package/dist/ssh/access-errors.d.ts +53 -0
  51. package/dist/ssh/access-errors.js +180 -0
  52. package/dist/ssh/access-errors.js.map +1 -0
  53. package/dist/ssh/access-sftp.d.ts +14 -0
  54. package/dist/ssh/access-sftp.js +456 -0
  55. package/dist/ssh/access-sftp.js.map +1 -0
  56. package/dist/ssh/bastion-client.d.ts +60 -0
  57. package/dist/ssh/bastion-client.js +423 -0
  58. package/dist/ssh/bastion-client.js.map +1 -0
  59. package/dist/ssh/bastion-errors.d.ts +62 -0
  60. package/dist/ssh/bastion-errors.js +190 -0
  61. package/dist/ssh/bastion-errors.js.map +1 -0
  62. package/dist/ssh/hop1-sftp.d.ts +14 -0
  63. package/dist/ssh/hop1-sftp.js +437 -0
  64. package/dist/ssh/hop1-sftp.js.map +1 -0
  65. package/dist/tools/copy-job-schemas.d.ts +709 -0
  66. package/dist/tools/copy-job-schemas.js +48 -0
  67. package/dist/tools/copy-job-schemas.js.map +1 -0
  68. package/dist/tools/register.d.ts +14 -0
  69. package/dist/tools/register.js +619 -0
  70. package/dist/tools/register.js.map +1 -0
  71. package/dist/tools/remote-schemas.d.ts +879 -0
  72. package/dist/tools/remote-schemas.js +214 -0
  73. package/dist/tools/remote-schemas.js.map +1 -0
  74. package/dist/utils/copy-executor.d.ts +41 -0
  75. package/dist/utils/copy-executor.js +231 -0
  76. package/dist/utils/copy-executor.js.map +1 -0
  77. package/dist/utils/copy-job-manager.d.ts +34 -0
  78. package/dist/utils/copy-job-manager.js +400 -0
  79. package/dist/utils/copy-job-manager.js.map +1 -0
  80. package/dist/utils/copy-job-store.d.ts +18 -0
  81. package/dist/utils/copy-job-store.js +104 -0
  82. package/dist/utils/copy-job-store.js.map +1 -0
  83. package/dist/utils/copy-job-types.d.ts +133 -0
  84. package/dist/utils/copy-job-types.js +37 -0
  85. package/dist/utils/copy-job-types.js.map +1 -0
  86. package/dist/utils/copy-transfer.d.ts +59 -0
  87. package/dist/utils/copy-transfer.js +86 -0
  88. package/dist/utils/copy-transfer.js.map +1 -0
  89. package/dist/utils/remote-copy.d.ts +14 -0
  90. package/dist/utils/remote-copy.js +115 -0
  91. package/dist/utils/remote-copy.js.map +1 -0
  92. package/dist/utils/remote-executor.d.ts +15 -0
  93. package/dist/utils/remote-executor.js +34 -0
  94. package/dist/utils/remote-executor.js.map +1 -0
  95. package/dist/utils/remote-target.d.ts +22 -0
  96. package/dist/utils/remote-target.js +75 -0
  97. package/dist/utils/remote-target.js.map +1 -0
  98. package/dist/utils/result.d.ts +87 -0
  99. package/dist/utils/result.js +81 -0
  100. package/dist/utils/result.js.map +1 -0
  101. package/dist/utils/shell-quote.d.ts +22 -0
  102. package/dist/utils/shell-quote.js +55 -0
  103. package/dist/utils/shell-quote.js.map +1 -0
  104. package/dist/utils/timeout.d.ts +1 -0
  105. package/dist/utils/timeout.js +18 -0
  106. package/dist/utils/timeout.js.map +1 -0
  107. package/dist/utils/truncate.d.ts +5 -0
  108. package/dist/utils/truncate.js +12 -0
  109. package/dist/utils/truncate.js.map +1 -0
  110. package/dist/version.d.ts +1 -0
  111. package/dist/version.js +7 -0
  112. package/dist/version.js.map +1 -0
  113. package/docs/AGENT_GUIDE.md +161 -0
  114. package/docs/CONFIGURATION.md +130 -0
  115. package/docs/COPY_SPECIALIZED_TEST_CHECKLIST.md +9 -0
  116. package/docs/HOP1_E2E_CHECKLIST.md +128 -0
  117. package/docs/HOP1_E2E_RESULTS.json +647 -0
  118. package/docs/PARADI_ACCESS_PLAN.md +272 -0
  119. package/docs/REMOTE_COPY_JOB_API.md +92 -0
  120. package/docs/TODO.md +66 -0
  121. package/docs/USER_GUIDE.zh-CN.md +93 -0
  122. package/docs/clients/claude-desktop.json.example +12 -0
  123. package/docs/clients/cursor-npx.json.example +12 -0
  124. package/docs/clients/cursor.json.example +12 -0
  125. package/docs/clients/vscode.json.example +12 -0
  126. package/package.json +65 -0
@@ -0,0 +1,128 @@
1
+ # Hop1 端到端测试清单(3.0.0)
2
+
3
+ **Last run:** 2026-07-16 — **43/43 PASS**
4
+ **Runner:** `scripts/hop1-e2e-one.mjs` + `scripts/hop1-e2e-all.mjs`(进程内 Engine,与包代码一致)
5
+ **Raw JSON:** [`HOP1_E2E_RESULTS.json`](HOP1_E2E_RESULTS.json)
6
+
7
+ ```bash
8
+ # 单例
9
+ TEST_ID=A1 node scripts/hop1-e2e-all.mjs # 或 hop1-e2e-one.mjs
10
+ # 全量
11
+ node scripts/hop1-e2e-all.mjs
12
+ ```
13
+
14
+ Job 类用例使用隔离 `BASTION_COPY_JOB_ROOT`。夹具:`%TEMP%\mcp-copy221-fixtures`(small-4k / large-34m)。
15
+
16
+ ---
17
+
18
+ ## A. 基础文件双向
19
+
20
+ | ID | 场景 | 期望 | 结果 | 备注 |
21
+ |----|------|------|------|------|
22
+ | A1 | local → bastion 小文件 | exit 0;MD5;`skippedBytes=0`;verified | **pass** | |
23
+ | A2 | bastion → local 小文件 | 同上 | **pass** | |
24
+ | A3 | local → bastion 大文件 | MD5;`usedFastPath=true` | **pass** | |
25
+ | A4 | bastion → local 大文件 | MD5 | **pass** | |
26
+ | A5 | 覆盖已存在远端(无 skip) | 内容为新源 MD5 | **pass** | |
27
+
28
+ ## B. 目录拷贝
29
+
30
+ | ID | 场景 | 期望 | 结果 | 备注 |
31
+ |----|------|------|------|------|
32
+ | B1 | 扁平目录 upload | 文件齐全 | **pass** | |
33
+ | B2 | 嵌套目录 upload | 保留 `sub/` | **pass** | |
34
+ | B3 | 目录 download | 本地结构一致 | **pass** | |
35
+ | B4 | 空目录 upload | 创建远端空目录或明确错误 | **pass** | 行为:创建空远端目录 |
36
+ | B5 | 目录 `verify=size` | verified | **pass** | |
37
+ | B6 | 目录 `verify=size+sha256` | 逐文件 hash 成功 | **pass** (updated) | 不再整树拒绝 |
38
+
39
+ ## C. skipIfComplete / skippedBytes
40
+
41
+ | ID | 场景 | 期望 | 结果 | 备注 |
42
+ |----|------|------|------|------|
43
+ | C1 | upload 二次同 size + skip | `skippedBytes>0` | **pass** | |
44
+ | C2 | download 残缺 size + skip | 全量重写;`skippedBytes=0` | **pass** | |
45
+ | C3 | 同 size 错误内容 + size / sha256 | 记录 size 风险;sha256 不静默 | **pass** | size-only 可 false-skip;sha256 会纠正/失败 |
46
+ | C4 | 默认无 skip | `skippedBytes=0` | **pass** | |
47
+ | C5 | schema 禁止 `resume`;skip+none | Zod + Engine reject | **pass** | |
48
+
49
+ ## D. Verify
50
+
51
+ | ID | 场景 | 期望 | 结果 | 备注 |
52
+ |----|------|------|------|------|
53
+ | D1 | `verify=none` | verified=false | **pass** | |
54
+ | D2 | `verify=size` 默认 | verified=true | **pass** | |
55
+ | D3 | `verify=size+sha256` 文件 | verified + MD5 | **pass** | |
56
+ | D4 | 损坏远端 + skip + sha256 | 校验失败后全量重传;`skippedBytes=0` | **pass** (fixed) | upload/download 均回落 rewrite |
57
+
58
+ ## E. 超时与 Abort
59
+
60
+ | ID | 场景 | 期望 | 结果 | 备注 |
61
+ |----|------|------|------|------|
62
+ | E1 | async 极小 totalTimeout | 终态 `timeout` | **pass** | |
63
+ | E2 | sync 极小 totalTimeout | 抛错不挂死 | **pass** | |
64
+ | E3 | cancel 大上传 | cancelled;exec SSH 存活 | **pass** | |
65
+ | E4 | cancel 后再拷贝 | 新 SFTP 成功 | **pass** | |
66
+ | E5 | 预 abort signal | 立即 Copy aborted | **pass** | |
67
+
68
+ ## F. 异步 Job API
69
+
70
+ | ID | 场景 | 期望 | 结果 | 备注 |
71
+ |----|------|------|------|------|
72
+ | F1 | start 小文件 → success | 立即 transferId | **pass** | |
73
+ | F2 | start 大文件 + progress | percent→100;字段形状 | **pass** | |
74
+ | F3 | sync transferId 查 status | Unknown | **pass** | |
75
+ | F4 | orphan reconcile | failed + MCP restarted | **pass** | |
76
+ | F5 | success 后 cancel | 仍 success | **pass** | |
77
+ | F6 | cancel 后晚到 success | 仍 cancelled | **pass** | 注入 runner |
78
+
79
+ ## G. 同步/异步边界
80
+
81
+ | ID | 场景 | 期望 | 结果 | 备注 |
82
+ |----|------|------|------|------|
83
+ | G1 | sync 阻塞且无 job 文件 | 无 `jobs/<id>.json` | **pass** | |
84
+ | G2 | 拒 `resume` / `idleTimeoutMs` | schema strict | **pass** | |
85
+ | G3 | `timeoutMs` 映射 wall budget | 触发超时 | **pass** | |
86
+
87
+ ## H. Pipeline(含 Hop1)
88
+
89
+ | ID | 场景 | 期望 | 结果 | 备注 |
90
+ |----|------|------|------|------|
91
+ | H1 | local → pod | pod 内可读 | **pass** | ns=`his-test` |
92
+ | H2 | local → host | host 文件存在 | **pass** | host=`10.121.32.74` |
93
+ | H3 | pipeline cancel | SSH 存活;Hop2 best-effort | **pass** | 终态可为 cancelled/failed/success |
94
+
95
+ ## I. 连接隔离与并发
96
+
97
+ | ID | 场景 | 期望 | 结果 | 备注 |
98
+ |----|------|------|------|------|
99
+ | I1 | SFTP 中并行 bastion exec | exec 成功且 job success | **pass** | 双连接 |
100
+ | I2 | 两路并行 Hop1 | 均 success | **pass** | |
101
+
102
+ ## J. 负向 / 清理
103
+
104
+ | ID | 场景 | 期望 | 结果 | 备注 |
105
+ |----|------|------|------|------|
106
+ | J1 | 本地路径不存在 | 明确错误 | **pass** | |
107
+ | J2 | 远端路径不存在 | 明确错误 | **pass** | |
108
+ | J3 | 无 `.copy-meta.json` | 仅 size+verify | **pass** | |
109
+ | J4 | 结果字段名 | 仅 `skippedBytes` | **pass** | 无 `resumedFrom` |
110
+
111
+ ---
112
+
113
+ ## skip / verify 等级(设计)
114
+
115
+ | Level | 选项 | 行为 |
116
+ |-------|------|------|
117
+ | 1 默认 | skip + `verify=size` | size match → skip(便宜;C3 内容风险) |
118
+ | 2 严格 | skip + `verify=size+sha256` | hash 门禁;fail → rewrite |
119
+ | 禁止 | skip + `verify=none` | Engine/schema 拒绝 |
120
+
121
+ ## 已知风险(测试中确认)
122
+
123
+ 1. **Level 1**:同 size 不同内容可能误 skip(C3)。内容保证请用 Level 2。
124
+ 2. **Hop2 cancel** 仍为 best-effort(H3);Hop1 cancel 会断开独立 SFTP,不影响 exec SSH。
125
+
126
+ ## 与旧 T1–T8 映射
127
+
128
+ T1→E3;T2→C2;T3→C1;T4→E1;T5→D3;T6→B1;T7→F4;T8→F5。