ssh-mcp-pro 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 (267) hide show
  1. package/AGENTS.md +127 -0
  2. package/ARCHITECTURE.md +145 -0
  3. package/LICENSE +21 -0
  4. package/LICENSES/MIT.txt +21 -0
  5. package/MIGRATION.md +14 -0
  6. package/README.md +175 -0
  7. package/REGISTRY_SUBMISSION.md +38 -0
  8. package/SECURITY.md +40 -0
  9. package/SECURITY_DECISIONS.md +59 -0
  10. package/dist/agent-bin.d.ts +3 -0
  11. package/dist/agent-bin.d.ts.map +1 -0
  12. package/dist/agent-bin.js +8 -0
  13. package/dist/agent-bin.js.map +1 -0
  14. package/dist/audit.d.ts +25 -0
  15. package/dist/audit.d.ts.map +1 -0
  16. package/dist/audit.js +50 -0
  17. package/dist/audit.js.map +1 -0
  18. package/dist/auth.d.ts +4 -0
  19. package/dist/auth.d.ts.map +1 -0
  20. package/dist/auth.js +33 -0
  21. package/dist/auth.js.map +1 -0
  22. package/dist/cli.d.ts +16 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +99 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/config.d.ts +103 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +490 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/connector-credentials.d.ts +8 -0
  31. package/dist/connector-credentials.d.ts.map +1 -0
  32. package/dist/connector-credentials.js +132 -0
  33. package/dist/connector-credentials.js.map +1 -0
  34. package/dist/connector-profile.d.ts +17 -0
  35. package/dist/connector-profile.d.ts.map +1 -0
  36. package/dist/connector-profile.js +81 -0
  37. package/dist/connector-profile.js.map +1 -0
  38. package/dist/container.d.ts +18 -0
  39. package/dist/container.d.ts.map +1 -0
  40. package/dist/container.js +52 -0
  41. package/dist/container.js.map +1 -0
  42. package/dist/detect.d.ts +7 -0
  43. package/dist/detect.d.ts.map +1 -0
  44. package/dist/detect.js +271 -0
  45. package/dist/detect.js.map +1 -0
  46. package/dist/ensure.d.ts +17 -0
  47. package/dist/ensure.d.ts.map +1 -0
  48. package/dist/ensure.js +531 -0
  49. package/dist/ensure.js.map +1 -0
  50. package/dist/errors.d.ts +54 -0
  51. package/dist/errors.d.ts.map +1 -0
  52. package/dist/errors.js +84 -0
  53. package/dist/errors.js.map +1 -0
  54. package/dist/fs-tools.d.ts +26 -0
  55. package/dist/fs-tools.d.ts.map +1 -0
  56. package/dist/fs-tools.js +599 -0
  57. package/dist/fs-tools.js.map +1 -0
  58. package/dist/http-rate-limit.d.ts +9 -0
  59. package/dist/http-rate-limit.d.ts.map +1 -0
  60. package/dist/http-rate-limit.js +41 -0
  61. package/dist/http-rate-limit.js.map +1 -0
  62. package/dist/http-security.d.ts +22 -0
  63. package/dist/http-security.d.ts.map +1 -0
  64. package/dist/http-security.js +88 -0
  65. package/dist/http-security.js.map +1 -0
  66. package/dist/index.d.ts +10 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +201 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/logging.d.ts +52 -0
  71. package/dist/logging.d.ts.map +1 -0
  72. package/dist/logging.js +180 -0
  73. package/dist/logging.js.map +1 -0
  74. package/dist/mcp.d.ts +16 -0
  75. package/dist/mcp.d.ts.map +1 -0
  76. package/dist/mcp.js +159 -0
  77. package/dist/mcp.js.map +1 -0
  78. package/dist/metrics.d.ts +95 -0
  79. package/dist/metrics.d.ts.map +1 -0
  80. package/dist/metrics.js +204 -0
  81. package/dist/metrics.js.map +1 -0
  82. package/dist/oauth.d.ts +14 -0
  83. package/dist/oauth.d.ts.map +1 -0
  84. package/dist/oauth.js +105 -0
  85. package/dist/oauth.js.map +1 -0
  86. package/dist/policy.d.ts +64 -0
  87. package/dist/policy.d.ts.map +1 -0
  88. package/dist/policy.js +368 -0
  89. package/dist/policy.js.map +1 -0
  90. package/dist/process.d.ts +24 -0
  91. package/dist/process.d.ts.map +1 -0
  92. package/dist/process.js +212 -0
  93. package/dist/process.js.map +1 -0
  94. package/dist/prompts.d.ts +49 -0
  95. package/dist/prompts.d.ts.map +1 -0
  96. package/dist/prompts.js +191 -0
  97. package/dist/prompts.js.map +1 -0
  98. package/dist/rate-limiter.d.ts +57 -0
  99. package/dist/rate-limiter.d.ts.map +1 -0
  100. package/dist/rate-limiter.js +141 -0
  101. package/dist/rate-limiter.js.map +1 -0
  102. package/dist/remote/agent-cli.d.ts +2 -0
  103. package/dist/remote/agent-cli.d.ts.map +1 -0
  104. package/dist/remote/agent-cli.js +270 -0
  105. package/dist/remote/agent-cli.js.map +1 -0
  106. package/dist/remote/agent-executor.d.ts +26 -0
  107. package/dist/remote/agent-executor.d.ts.map +1 -0
  108. package/dist/remote/agent-executor.js +400 -0
  109. package/dist/remote/agent-executor.js.map +1 -0
  110. package/dist/remote/config.d.ts +3 -0
  111. package/dist/remote/config.d.ts.map +1 -0
  112. package/dist/remote/config.js +52 -0
  113. package/dist/remote/config.js.map +1 -0
  114. package/dist/remote/control-plane.d.ts +57 -0
  115. package/dist/remote/control-plane.d.ts.map +1 -0
  116. package/dist/remote/control-plane.js +1248 -0
  117. package/dist/remote/control-plane.js.map +1 -0
  118. package/dist/remote/crypto.d.ts +38 -0
  119. package/dist/remote/crypto.d.ts.map +1 -0
  120. package/dist/remote/crypto.js +143 -0
  121. package/dist/remote/crypto.js.map +1 -0
  122. package/dist/remote/mcp-tools.d.ts +10 -0
  123. package/dist/remote/mcp-tools.d.ts.map +1 -0
  124. package/dist/remote/mcp-tools.js +201 -0
  125. package/dist/remote/mcp-tools.js.map +1 -0
  126. package/dist/remote/policy.d.ts +11 -0
  127. package/dist/remote/policy.d.ts.map +1 -0
  128. package/dist/remote/policy.js +94 -0
  129. package/dist/remote/policy.js.map +1 -0
  130. package/dist/remote/schemas.d.ts +298 -0
  131. package/dist/remote/schemas.d.ts.map +1 -0
  132. package/dist/remote/schemas.js +111 -0
  133. package/dist/remote/schemas.js.map +1 -0
  134. package/dist/remote/scopes.d.ts +6 -0
  135. package/dist/remote/scopes.d.ts.map +1 -0
  136. package/dist/remote/scopes.js +24 -0
  137. package/dist/remote/scopes.js.map +1 -0
  138. package/dist/remote/store.d.ts +45 -0
  139. package/dist/remote/store.d.ts.map +1 -0
  140. package/dist/remote/store.js +355 -0
  141. package/dist/remote/store.js.map +1 -0
  142. package/dist/remote/types.d.ts +183 -0
  143. package/dist/remote/types.d.ts.map +1 -0
  144. package/dist/remote/types.js +103 -0
  145. package/dist/remote/types.js.map +1 -0
  146. package/dist/remote/util.d.ts +6 -0
  147. package/dist/remote/util.d.ts.map +1 -0
  148. package/dist/remote/util.js +45 -0
  149. package/dist/remote/util.js.map +1 -0
  150. package/dist/remote/websocket.d.ts +26 -0
  151. package/dist/remote/websocket.d.ts.map +1 -0
  152. package/dist/remote/websocket.js +167 -0
  153. package/dist/remote/websocket.js.map +1 -0
  154. package/dist/render-http.d.ts +2 -0
  155. package/dist/render-http.d.ts.map +1 -0
  156. package/dist/render-http.js +14 -0
  157. package/dist/render-http.js.map +1 -0
  158. package/dist/resources.d.ts +19 -0
  159. package/dist/resources.d.ts.map +1 -0
  160. package/dist/resources.js +96 -0
  161. package/dist/resources.js.map +1 -0
  162. package/dist/retry.d.ts +45 -0
  163. package/dist/retry.d.ts.map +1 -0
  164. package/dist/retry.js +120 -0
  165. package/dist/retry.js.map +1 -0
  166. package/dist/safety.d.ts +31 -0
  167. package/dist/safety.d.ts.map +1 -0
  168. package/dist/safety.js +174 -0
  169. package/dist/safety.js.map +1 -0
  170. package/dist/server-http.d.ts +2 -0
  171. package/dist/server-http.d.ts.map +1 -0
  172. package/dist/server-http.js +432 -0
  173. package/dist/server-http.js.map +1 -0
  174. package/dist/session.d.ts +116 -0
  175. package/dist/session.d.ts.map +1 -0
  176. package/dist/session.js +666 -0
  177. package/dist/session.js.map +1 -0
  178. package/dist/shell.d.ts +10 -0
  179. package/dist/shell.d.ts.map +1 -0
  180. package/dist/shell.js +83 -0
  181. package/dist/shell.js.map +1 -0
  182. package/dist/ssh-config.d.ts +94 -0
  183. package/dist/ssh-config.d.ts.map +1 -0
  184. package/dist/ssh-config.js +234 -0
  185. package/dist/ssh-config.js.map +1 -0
  186. package/dist/streaming.d.ts +36 -0
  187. package/dist/streaming.d.ts.map +1 -0
  188. package/dist/streaming.js +140 -0
  189. package/dist/streaming.js.map +1 -0
  190. package/dist/telemetry.d.ts +17 -0
  191. package/dist/telemetry.d.ts.map +1 -0
  192. package/dist/telemetry.js +101 -0
  193. package/dist/telemetry.js.map +1 -0
  194. package/dist/tools/connector.provider.d.ts +28 -0
  195. package/dist/tools/connector.provider.d.ts.map +1 -0
  196. package/dist/tools/connector.provider.js +360 -0
  197. package/dist/tools/connector.provider.js.map +1 -0
  198. package/dist/tools/ensure.provider.d.ts +18 -0
  199. package/dist/tools/ensure.provider.d.ts.map +1 -0
  200. package/dist/tools/ensure.provider.js +173 -0
  201. package/dist/tools/ensure.provider.js.map +1 -0
  202. package/dist/tools/fs.provider.d.ts +21 -0
  203. package/dist/tools/fs.provider.d.ts.map +1 -0
  204. package/dist/tools/fs.provider.js +259 -0
  205. package/dist/tools/fs.provider.js.map +1 -0
  206. package/dist/tools/index.d.ts +4 -0
  207. package/dist/tools/index.d.ts.map +1 -0
  208. package/dist/tools/index.js +68 -0
  209. package/dist/tools/index.js.map +1 -0
  210. package/dist/tools/metadata.d.ts +11 -0
  211. package/dist/tools/metadata.d.ts.map +1 -0
  212. package/dist/tools/metadata.js +10 -0
  213. package/dist/tools/metadata.js.map +1 -0
  214. package/dist/tools/output-schemas.d.ts +217 -0
  215. package/dist/tools/output-schemas.d.ts.map +1 -0
  216. package/dist/tools/output-schemas.js +300 -0
  217. package/dist/tools/output-schemas.js.map +1 -0
  218. package/dist/tools/process.provider.d.ts +22 -0
  219. package/dist/tools/process.provider.d.ts.map +1 -0
  220. package/dist/tools/process.provider.js +146 -0
  221. package/dist/tools/process.provider.js.map +1 -0
  222. package/dist/tools/registry.d.ts +12 -0
  223. package/dist/tools/registry.d.ts.map +1 -0
  224. package/dist/tools/registry.js +163 -0
  225. package/dist/tools/registry.js.map +1 -0
  226. package/dist/tools/results.d.ts +4 -0
  227. package/dist/tools/results.d.ts.map +1 -0
  228. package/dist/tools/results.js +5 -0
  229. package/dist/tools/results.js.map +1 -0
  230. package/dist/tools/session.provider.d.ts +23 -0
  231. package/dist/tools/session.provider.d.ts.map +1 -0
  232. package/dist/tools/session.provider.js +299 -0
  233. package/dist/tools/session.provider.js.map +1 -0
  234. package/dist/tools/system.provider.d.ts +18 -0
  235. package/dist/tools/system.provider.d.ts.map +1 -0
  236. package/dist/tools/system.provider.js +81 -0
  237. package/dist/tools/system.provider.js.map +1 -0
  238. package/dist/tools/transfer.provider.d.ts +16 -0
  239. package/dist/tools/transfer.provider.d.ts.map +1 -0
  240. package/dist/tools/transfer.provider.js +85 -0
  241. package/dist/tools/transfer.provider.js.map +1 -0
  242. package/dist/tools/tunnel.provider.d.ts +18 -0
  243. package/dist/tools/tunnel.provider.d.ts.map +1 -0
  244. package/dist/tools/tunnel.provider.js +142 -0
  245. package/dist/tools/tunnel.provider.js.map +1 -0
  246. package/dist/tools/types.d.ts +16 -0
  247. package/dist/tools/types.d.ts.map +1 -0
  248. package/dist/tools/types.js +2 -0
  249. package/dist/tools/types.js.map +1 -0
  250. package/dist/transfer.d.ts +40 -0
  251. package/dist/transfer.d.ts.map +1 -0
  252. package/dist/transfer.js +363 -0
  253. package/dist/transfer.js.map +1 -0
  254. package/dist/tunnel.d.ts +37 -0
  255. package/dist/tunnel.d.ts.map +1 -0
  256. package/dist/tunnel.js +234 -0
  257. package/dist/tunnel.js.map +1 -0
  258. package/dist/types.d.ts +341 -0
  259. package/dist/types.d.ts.map +1 -0
  260. package/dist/types.js +184 -0
  261. package/dist/types.js.map +1 -0
  262. package/docs/docker.md +22 -0
  263. package/examples/README.md +77 -0
  264. package/mcp.json +21 -0
  265. package/package.json +147 -0
  266. package/registry/ssh-mcp-pro/mcp.json +21 -0
  267. package/server.json +76 -0
@@ -0,0 +1,17 @@
1
+ import type { FsService } from "./fs-tools.js";
2
+ import type { ProcessService } from "./process.js";
3
+ import type { SessionManager } from "./session.js";
4
+ import type { LinesInFileResult, PackageResult, PatchResult, ServiceResult } from "./types.js";
5
+ export interface EnsureService {
6
+ ensurePackage(sessionId: string, packageName: string, state?: "present" | "absent"): Promise<PackageResult>;
7
+ ensureService(sessionId: string, serviceName: string, state: "started" | "stopped" | "restarted" | "enabled" | "disabled"): Promise<ServiceResult>;
8
+ ensureLinesInFile(sessionId: string, filePath: string, lines: string[], createIfMissing?: boolean, state?: "present" | "absent"): Promise<LinesInFileResult>;
9
+ applyPatch(sessionId: string, filePath: string, diff: string): Promise<PatchResult>;
10
+ }
11
+ export interface EnsureServiceDeps {
12
+ sessionManager: Pick<SessionManager, "getSession" | "getOSInfo">;
13
+ processService: Pick<ProcessService, "execCommand" | "execSudo" | "commandExists">;
14
+ fsService: Pick<FsService, "readFile" | "writeFile" | "pathExists">;
15
+ }
16
+ export declare function createEnsureService({ sessionManager, processService, fsService, }: EnsureServiceDeps): EnsureService;
17
+ //# sourceMappingURL=ensure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure.d.ts","sourceRoot":"","sources":["../src/ensure.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EACV,iBAAiB,EAEjB,aAAa,EACb,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAC3B,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,GAClE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,iBAAiB,CACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EAAE,EACf,eAAe,CAAC,EAAE,OAAO,EACzB,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,GAAG,WAAW,CAAC,CAAC;IACjE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,UAAU,GAAG,eAAe,CAAC,CAAC;IACnF,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC;CACrE;AAwKD,wBAAgB,mBAAmB,CAAC,EAClC,cAAc,EACd,cAAc,EACd,SAAS,GACV,EAAE,iBAAiB,GAAG,aAAa,CAohBnC"}
package/dist/ensure.js ADDED
@@ -0,0 +1,531 @@
1
+ import { createPackageManagerError, createSudoError, createFilesystemError, createPatchError, createBadRequestError, } from "./errors.js";
2
+ import { logger } from "./logging.js";
3
+ import { resolveRemoteTempDir } from "./shell.js";
4
+ const SUPPORTED_PACKAGE_MANAGERS = [
5
+ "apt",
6
+ "dnf",
7
+ "yum",
8
+ "pacman",
9
+ "apk",
10
+ "zypper",
11
+ "brew",
12
+ "winget",
13
+ "choco",
14
+ ];
15
+ const SUPPORTED_PACKAGE_MANAGERS_HINT = `Supported package managers: ${SUPPORTED_PACKAGE_MANAGERS.join(", ")}`;
16
+ function sanitizePackageName(name) {
17
+ const validPackageName = /^[a-zA-Z0-9][a-zA-Z0-9._+-]*$/;
18
+ if (!validPackageName.test(name)) {
19
+ throw createBadRequestError(`Invalid package name: ${name}`, "Package names must start with alphanumeric and contain only letters, numbers, dots, dashes, underscores, or plus signs");
20
+ }
21
+ const dangerousChars = /[;&|`$(){}\[\]<>\\\"'\n\r]/;
22
+ if (dangerousChars.test(name)) {
23
+ throw createBadRequestError("Package name contains potentially dangerous characters", "Remove any shell special characters from the package name");
24
+ }
25
+ return name;
26
+ }
27
+ function sanitizeServiceName(name) {
28
+ const validServiceName = /^[a-zA-Z0-9][a-zA-Z0-9_.@:-]*$/;
29
+ if (!validServiceName.test(name)) {
30
+ throw createBadRequestError(`Invalid service name: ${name}`, "Service names must contain only letters, numbers, dots, dashes, underscores, colons, @, or path-safe instance names");
31
+ }
32
+ return name;
33
+ }
34
+ function shellQuote(value) {
35
+ return `'${String(value).replace(/'/g, `'"'"'`)}'`;
36
+ }
37
+ function powerShellQuote(value) {
38
+ return `'${value.replace(/'/g, "''")}'`;
39
+ }
40
+ function escapeRegExp(value) {
41
+ return value.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
42
+ }
43
+ function describeError(error) {
44
+ if (error instanceof Error && error.message) {
45
+ return error.message;
46
+ }
47
+ const code = error?.code;
48
+ return code ? String(code) : "unknown error";
49
+ }
50
+ function isPermissionError(error) {
51
+ const code = error?.code;
52
+ if (code === "EACCES" || code === "EPERM" || code === 13 || code === 1) {
53
+ return true;
54
+ }
55
+ return /\b(EACCES|EPERM|permission|permission denied|access denied|operation not permitted)\b/iu.test(describeError(error));
56
+ }
57
+ function getRemoveCommand(pm, packageName) {
58
+ switch (pm) {
59
+ case "apt":
60
+ return `apt-get remove -y ${packageName}`;
61
+ case "dnf":
62
+ return `dnf remove -y ${packageName}`;
63
+ case "yum":
64
+ return `yum remove -y ${packageName}`;
65
+ case "pacman":
66
+ return `pacman -R --noconfirm ${packageName}`;
67
+ case "apk":
68
+ return `apk del ${packageName}`;
69
+ case "zypper":
70
+ return `zypper remove -y ${packageName}`;
71
+ case "brew":
72
+ return `brew uninstall ${packageName}`;
73
+ case "winget":
74
+ return `winget uninstall --id ${packageName} --exact --silent --accept-source-agreements --disable-interactivity`;
75
+ case "choco":
76
+ return `choco uninstall ${packageName} -y --no-progress`;
77
+ default:
78
+ throw createPackageManagerError(`Unsupported package manager: ${pm}`);
79
+ }
80
+ }
81
+ function getInstallCommand(pm, packageName) {
82
+ switch (pm) {
83
+ case "apt":
84
+ return `apt-get update && apt-get install -y ${packageName}`;
85
+ case "dnf":
86
+ return `dnf install -y ${packageName}`;
87
+ case "yum":
88
+ return `yum install -y ${packageName}`;
89
+ case "pacman":
90
+ return `pacman -S --noconfirm ${packageName}`;
91
+ case "apk":
92
+ return `apk add ${packageName}`;
93
+ case "zypper":
94
+ return `zypper install -y ${packageName}`;
95
+ case "brew":
96
+ return `brew install ${packageName}`;
97
+ case "winget":
98
+ return `winget install --id ${packageName} --exact --silent --accept-source-agreements --accept-package-agreements --disable-interactivity`;
99
+ case "choco":
100
+ return `choco install ${packageName} -y --no-progress`;
101
+ default:
102
+ throw createPackageManagerError(`Unsupported package manager: ${pm}`);
103
+ }
104
+ }
105
+ function getPackageCheckCommand(pm, packageName) {
106
+ switch (pm) {
107
+ case "apt":
108
+ return `dpkg -l ${packageName} | grep -q '^ii'`;
109
+ case "dnf":
110
+ case "yum":
111
+ return `${pm} list installed ${packageName}`;
112
+ case "pacman":
113
+ return `pacman -Q ${packageName}`;
114
+ case "apk":
115
+ return `apk info -e ${packageName}`;
116
+ case "zypper":
117
+ return `zypper se -i ${packageName}`;
118
+ case "brew":
119
+ return `brew list --versions ${packageName}`;
120
+ case "winget":
121
+ return `$idPattern = ${powerShellQuote(`(^|\\s)${escapeRegExp(packageName)}(\\s|$)`)}; $package = winget list --id ${powerShellQuote(packageName)} --exact --disable-interactivity; if ($LASTEXITCODE -eq 0 -and ($package -match $idPattern)) { exit 0 } exit 1`;
122
+ case "choco":
123
+ return `$package = choco list --exact ${powerShellQuote(packageName)} --limit-output; if ($LASTEXITCODE -eq 0 -and ($package -like ${powerShellQuote(`${packageName}|*`)})) { exit 0 } exit 1`;
124
+ default:
125
+ return undefined;
126
+ }
127
+ }
128
+ function usesDirectPackageCommand(pm) {
129
+ return pm === "brew" || pm === "winget" || pm === "choco";
130
+ }
131
+ export function createEnsureService({ sessionManager, processService, fsService, }) {
132
+ async function checkPackageInstalled(sessionId, packageName, pm) {
133
+ const checkCommand = getPackageCheckCommand(pm, packageName);
134
+ if (!checkCommand) {
135
+ return false;
136
+ }
137
+ try {
138
+ const result = await processService.execCommand(sessionId, checkCommand);
139
+ return result.code === 0;
140
+ }
141
+ catch {
142
+ return false;
143
+ }
144
+ }
145
+ async function ensurePackage(sessionId, packageName, state = "present") {
146
+ const safePackageName = sanitizePackageName(packageName);
147
+ logger.debug("Ensuring package state", {
148
+ sessionId,
149
+ packageName: safePackageName,
150
+ state,
151
+ });
152
+ const session = sessionManager.getSession(sessionId);
153
+ if (!session) {
154
+ throw new Error(`Session ${sessionId} not found or expired`);
155
+ }
156
+ try {
157
+ const osInfo = await sessionManager.getOSInfo(sessionId);
158
+ const pm = osInfo.packageManager;
159
+ if (pm === "unknown") {
160
+ throw createPackageManagerError("No supported package manager found", SUPPORTED_PACKAGE_MANAGERS_HINT);
161
+ }
162
+ logger.debug("Detected package manager", { sessionId, pm });
163
+ const isInstalled = await checkPackageInstalled(sessionId, safePackageName, pm);
164
+ if (state === "absent") {
165
+ if (!isInstalled) {
166
+ logger.info("Package already not installed", {
167
+ sessionId,
168
+ packageName: safePackageName,
169
+ });
170
+ return {
171
+ ok: true,
172
+ pm,
173
+ code: 0,
174
+ stdout: `Package ${safePackageName} is not installed`,
175
+ stderr: "",
176
+ };
177
+ }
178
+ const removeCommand = getRemoveCommand(pm, safePackageName);
179
+ logger.debug("Removing package", {
180
+ sessionId,
181
+ packageName: safePackageName,
182
+ command: removeCommand,
183
+ });
184
+ const result = usesDirectPackageCommand(pm)
185
+ ? await processService.execCommand(sessionId, removeCommand)
186
+ : await processService.execSudo(sessionId, removeCommand, undefined, undefined, undefined, {
187
+ policyAction: "ensure.package",
188
+ rawSudo: false,
189
+ destructive: true,
190
+ });
191
+ const packageResult = {
192
+ ok: result.code === 0,
193
+ pm,
194
+ code: result.code,
195
+ stdout: result.stdout,
196
+ stderr: result.stderr,
197
+ };
198
+ if (result.code === 0) {
199
+ logger.info("Package removed successfully", {
200
+ sessionId,
201
+ packageName: safePackageName,
202
+ });
203
+ }
204
+ else {
205
+ logger.error("Package removal failed", {
206
+ sessionId,
207
+ packageName: safePackageName,
208
+ code: result.code,
209
+ });
210
+ }
211
+ return packageResult;
212
+ }
213
+ if (isInstalled) {
214
+ logger.info("Package already installed", {
215
+ sessionId,
216
+ packageName: safePackageName,
217
+ });
218
+ return {
219
+ ok: true,
220
+ pm,
221
+ code: 0,
222
+ stdout: `Package ${safePackageName} is already installed`,
223
+ stderr: "",
224
+ };
225
+ }
226
+ const installCommand = getInstallCommand(pm, safePackageName);
227
+ logger.debug("Installing package", {
228
+ sessionId,
229
+ packageName: safePackageName,
230
+ command: installCommand,
231
+ });
232
+ const result = usesDirectPackageCommand(pm)
233
+ ? await processService.execCommand(sessionId, installCommand)
234
+ : await processService.execSudo(sessionId, installCommand, undefined, undefined, undefined, {
235
+ policyAction: "ensure.package",
236
+ rawSudo: false,
237
+ });
238
+ const packageResult = {
239
+ ok: result.code === 0,
240
+ pm,
241
+ code: result.code,
242
+ stdout: result.stdout,
243
+ stderr: result.stderr,
244
+ };
245
+ if (result.code === 0) {
246
+ logger.info("Package installed successfully", {
247
+ sessionId,
248
+ packageName: safePackageName,
249
+ });
250
+ }
251
+ else {
252
+ logger.error("Package installation failed", {
253
+ sessionId,
254
+ packageName: safePackageName,
255
+ code: result.code,
256
+ });
257
+ }
258
+ return packageResult;
259
+ }
260
+ catch (error) {
261
+ logger.error("Failed to ensure package", {
262
+ sessionId,
263
+ packageName,
264
+ state,
265
+ error,
266
+ });
267
+ throw error;
268
+ }
269
+ }
270
+ async function ensureService(sessionId, serviceName, state) {
271
+ const safeServiceName = sanitizeServiceName(serviceName);
272
+ logger.debug("Ensuring service state", { sessionId, serviceName: safeServiceName, state });
273
+ const session = sessionManager.getSession(sessionId);
274
+ if (!session) {
275
+ throw new Error(`Session ${sessionId} not found or expired`);
276
+ }
277
+ try {
278
+ const osInfo = await sessionManager.getOSInfo(sessionId);
279
+ const initSystem = osInfo.init;
280
+ if (initSystem === "launchd") {
281
+ throw createSudoError("launchd services are not managed by this tool", "Use launchctl directly on macOS hosts");
282
+ }
283
+ if (initSystem === "windows-service") {
284
+ throw createSudoError("Windows services are not managed by this tool", "Use sc.exe or PowerShell to manage Windows services");
285
+ }
286
+ if (initSystem === "unknown") {
287
+ throw createSudoError("No supported init system found", "Supported init systems: systemd, service");
288
+ }
289
+ logger.debug("Detected init system", { sessionId, initSystem });
290
+ let command;
291
+ if (initSystem === "systemd") {
292
+ switch (state) {
293
+ case "started":
294
+ command = `systemctl start ${safeServiceName}`;
295
+ break;
296
+ case "stopped":
297
+ command = `systemctl stop ${safeServiceName}`;
298
+ break;
299
+ case "restarted":
300
+ command = `systemctl restart ${safeServiceName}`;
301
+ break;
302
+ case "enabled":
303
+ command = `systemctl enable ${safeServiceName}`;
304
+ break;
305
+ case "disabled":
306
+ command = `systemctl disable ${safeServiceName}`;
307
+ break;
308
+ }
309
+ }
310
+ else {
311
+ switch (state) {
312
+ case "started":
313
+ command = `service ${safeServiceName} start`;
314
+ break;
315
+ case "stopped":
316
+ command = `service ${safeServiceName} stop`;
317
+ break;
318
+ case "restarted":
319
+ command = `service ${safeServiceName} restart`;
320
+ break;
321
+ case "enabled":
322
+ command = `chkconfig ${safeServiceName} on || update-rc.d ${safeServiceName} enable`;
323
+ break;
324
+ case "disabled":
325
+ command = `chkconfig ${safeServiceName} off || update-rc.d ${safeServiceName} disable`;
326
+ break;
327
+ }
328
+ }
329
+ const result = await processService.execSudo(sessionId, command, undefined, undefined, undefined, {
330
+ policyAction: "ensure.service",
331
+ rawSudo: false,
332
+ destructive: ["stopped", "restarted", "disabled"].includes(state),
333
+ });
334
+ const serviceResult = { ok: result.code === 0 };
335
+ if (result.code === 0) {
336
+ logger.info("Service state changed successfully", {
337
+ sessionId,
338
+ serviceName: safeServiceName,
339
+ state,
340
+ });
341
+ }
342
+ else {
343
+ logger.error("Service state change failed", {
344
+ sessionId,
345
+ serviceName: safeServiceName,
346
+ state,
347
+ code: result.code,
348
+ stderr: result.stderr,
349
+ });
350
+ }
351
+ return serviceResult;
352
+ }
353
+ catch (error) {
354
+ logger.error("Failed to ensure service state", {
355
+ sessionId,
356
+ serviceName: safeServiceName,
357
+ state,
358
+ error,
359
+ });
360
+ throw error;
361
+ }
362
+ }
363
+ async function ensureLinesInFile(sessionId, filePath, lines, createIfMissing = true, state = "present") {
364
+ logger.debug("Ensuring lines in file", {
365
+ sessionId,
366
+ filePath,
367
+ lineCount: lines.length,
368
+ state,
369
+ });
370
+ try {
371
+ const osInfo = await sessionManager.getOSInfo(sessionId);
372
+ async function writeFileWithPrivilegeFallback(content, destructive) {
373
+ try {
374
+ await fsService.writeFile(sessionId, filePath, content);
375
+ return;
376
+ }
377
+ catch (directWriteError) {
378
+ if (!isPermissionError(directWriteError)) {
379
+ throw directWriteError;
380
+ }
381
+ const tempDir = resolveRemoteTempDir(osInfo);
382
+ const baseTempDir = tempDir.replace(/\/+$/, "");
383
+ const tempFile = `${baseTempDir}/ssh-mcp-${Date.now()}.tmp`;
384
+ try {
385
+ await fsService.writeFile(sessionId, tempFile, content);
386
+ }
387
+ catch (tempWriteError) {
388
+ throw createFilesystemError(`Failed to stage temporary file for ${filePath}`, `Direct write failed with ${describeError(directWriteError)}; temporary write failed with ${describeError(tempWriteError)}`);
389
+ }
390
+ const moveResult = await processService.execSudo(sessionId, `mv ${shellQuote(tempFile)} ${shellQuote(filePath)}`, undefined, undefined, undefined, {
391
+ policyAction: "ensure.lines",
392
+ rawSudo: false,
393
+ path: filePath,
394
+ destructive,
395
+ });
396
+ if (moveResult.code !== 0) {
397
+ throw createFilesystemError(`Failed to move temporary file to ${filePath}`, "Check file permissions and sudo access");
398
+ }
399
+ }
400
+ }
401
+ let fileContent = "";
402
+ let fileExists = false;
403
+ if (await fsService.pathExists(sessionId, filePath)) {
404
+ fileExists = true;
405
+ fileContent = await fsService.readFile(sessionId, filePath);
406
+ }
407
+ else if (state === "absent") {
408
+ logger.info("File does not exist, lines already absent", {
409
+ sessionId,
410
+ filePath,
411
+ });
412
+ return { ok: true, added: 0 };
413
+ }
414
+ else if (!createIfMissing) {
415
+ throw createFilesystemError(`File ${filePath} does not exist and createIfMissing is false`);
416
+ }
417
+ const existingLines = fileContent.split("\n");
418
+ if (state === "absent") {
419
+ const filteredLines = existingLines.filter((line) => !lines.includes(line));
420
+ if (filteredLines.length === existingLines.length) {
421
+ logger.info("No lines to remove from file", { sessionId, filePath });
422
+ return { ok: true, added: 0 };
423
+ }
424
+ const removedCount = existingLines.length - filteredLines.length;
425
+ const newContent = filteredLines.join("\n");
426
+ await writeFileWithPrivilegeFallback(newContent, true);
427
+ logger.info("Lines removed from file successfully", {
428
+ sessionId,
429
+ filePath,
430
+ removed: removedCount,
431
+ });
432
+ return { ok: true, added: -removedCount };
433
+ }
434
+ const missingLines = lines.filter((line) => !existingLines.includes(line));
435
+ if (missingLines.length === 0) {
436
+ logger.info("All lines already exist in file", { sessionId, filePath });
437
+ return { ok: true, added: 0 };
438
+ }
439
+ const newContent = fileExists
440
+ ? `${fileContent}\n${missingLines.join("\n")}`
441
+ : missingLines.join("\n");
442
+ await writeFileWithPrivilegeFallback(newContent, true);
443
+ logger.info("Lines added to file successfully", {
444
+ sessionId,
445
+ filePath,
446
+ added: missingLines.length,
447
+ });
448
+ return { ok: true, added: missingLines.length };
449
+ }
450
+ catch (error) {
451
+ logger.error("Failed to ensure lines in file", {
452
+ sessionId,
453
+ filePath,
454
+ state,
455
+ error,
456
+ });
457
+ throw error;
458
+ }
459
+ }
460
+ async function applyPatch(sessionId, filePath, diff) {
461
+ logger.debug("Applying patch to file", { sessionId, filePath });
462
+ try {
463
+ const osInfo = await sessionManager.getOSInfo(sessionId);
464
+ const hasPatch = await processService.commandExists(sessionId, "patch");
465
+ if (!hasPatch) {
466
+ throw createPatchError("patch command not found on remote system", "Install patch utility or apply changes manually");
467
+ }
468
+ const tempDir = resolveRemoteTempDir(osInfo);
469
+ const baseTempDir = tempDir.replace(/\/+$/, "");
470
+ const tempPatchFile = `${baseTempDir}/ssh-mcp-patch-${Date.now()}.patch`;
471
+ await fsService.writeFile(sessionId, tempPatchFile, diff);
472
+ try {
473
+ const testResult = await processService.execCommand(sessionId, `patch --dry-run -p0 ${shellQuote(filePath)} < ${shellQuote(tempPatchFile)}`);
474
+ if (testResult.code !== 0) {
475
+ throw createPatchError("Patch would fail to apply", `Patch test failed: ${testResult.stderr}`);
476
+ }
477
+ const applyCommand = `patch -p0 ${shellQuote(filePath)} < ${shellQuote(tempPatchFile)}`;
478
+ const directResult = await processService.execCommand(sessionId, applyCommand);
479
+ const result = directResult.code === 0
480
+ ? directResult
481
+ : await processService.execSudo(sessionId, applyCommand, undefined, undefined, undefined, {
482
+ policyAction: "patch.apply",
483
+ rawSudo: false,
484
+ path: filePath,
485
+ destructive: true,
486
+ });
487
+ const patchResult = {
488
+ ok: result.code === 0,
489
+ changed: result.code === 0,
490
+ };
491
+ if (result.code === 0) {
492
+ logger.info("Patch applied successfully", { sessionId, filePath });
493
+ }
494
+ else {
495
+ logger.error("Patch application failed", {
496
+ sessionId,
497
+ filePath,
498
+ code: result.code,
499
+ stderr: result.stderr,
500
+ });
501
+ }
502
+ return patchResult;
503
+ }
504
+ finally {
505
+ try {
506
+ const cleanupCommand = osInfo.platform === "windows"
507
+ ? `Remove-Item -Path ${shellQuote(tempPatchFile)} -Force -ErrorAction SilentlyContinue`
508
+ : `rm -f ${shellQuote(tempPatchFile)}`;
509
+ await processService.execCommand(sessionId, cleanupCommand);
510
+ }
511
+ catch (error) {
512
+ logger.warn("Failed to clean up temporary patch file", {
513
+ tempPatchFile,
514
+ error,
515
+ });
516
+ }
517
+ }
518
+ }
519
+ catch (error) {
520
+ logger.error("Failed to apply patch", { sessionId, filePath, error });
521
+ throw error;
522
+ }
523
+ }
524
+ return {
525
+ ensurePackage,
526
+ ensureService,
527
+ ensureLinesInFile,
528
+ applyPatch,
529
+ };
530
+ }
531
+ //# sourceMappingURL=ensure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure.js","sourceRoot":"","sources":["../src/ensure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { ErrorCode, SSHMCPError } from "./types.js";
2
+ /**
3
+ * Creates an authentication error
4
+ */
5
+ export declare function createAuthError(message: string, hint?: string): SSHMCPError;
6
+ /**
7
+ * Creates a connection error
8
+ */
9
+ export declare function createConnectionError(message: string, hint?: string): SSHMCPError;
10
+ /**
11
+ * Creates a timeout error
12
+ */
13
+ export declare function createTimeoutError(message: string, hint?: string): SSHMCPError;
14
+ /**
15
+ * Creates a sudo error
16
+ */
17
+ export declare function createSudoError(message: string, hint?: string): SSHMCPError;
18
+ /**
19
+ * Creates a package manager error
20
+ */
21
+ export declare function createPackageManagerError(message: string, hint?: string): SSHMCPError;
22
+ /**
23
+ * Creates a filesystem error
24
+ */
25
+ export declare function createFilesystemError(message: string, hint?: string): SSHMCPError;
26
+ /**
27
+ * Creates a patch error
28
+ */
29
+ export declare function createPatchError(message: string, hint?: string): SSHMCPError;
30
+ /**
31
+ * Creates a bad request error
32
+ */
33
+ export declare function createBadRequestError(message: string, hint?: string): SSHMCPError;
34
+ /**
35
+ * Creates a policy denial error
36
+ */
37
+ export declare function createPolicyError(message: string, hint?: string): SSHMCPError;
38
+ /**
39
+ * Creates a host key verification error
40
+ */
41
+ export declare function createHostKeyError(message: string, hint?: string): SSHMCPError;
42
+ /**
43
+ * Creates a configured limit error
44
+ */
45
+ export declare function createLimitError(message: string, hint?: string): SSHMCPError;
46
+ /**
47
+ * Creates an unsupported platform/capability error
48
+ */
49
+ export declare function createUnsupportedError(message: string, hint?: string): SSHMCPError;
50
+ /**
51
+ * Wraps an unknown error into an SSH MCP error
52
+ */
53
+ export declare function wrapError(error: unknown, code: ErrorCode, hint?: string): SSHMCPError;
54
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAS3E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CASjF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAS9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAS3E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CASrF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CASjF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAS5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CASjF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAS7E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAS9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAS5E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CASlF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAcrF"}