ssh-mcp-pro 1.2.3 → 1.4.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 (200) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +12 -2
  3. package/dist/agent-bin.js +5 -2
  4. package/dist/agent-bin.js.map +1 -1
  5. package/dist/cli.d.ts +1 -0
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +38 -47
  8. package/dist/cli.js.map +1 -1
  9. package/dist/config-security-env.d.ts +4 -0
  10. package/dist/config-security-env.d.ts.map +1 -0
  11. package/dist/config-security-env.js +64 -0
  12. package/dist/config-security-env.js.map +1 -0
  13. package/dist/config.d.ts +2 -2
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +4 -67
  16. package/dist/config.js.map +1 -1
  17. package/dist/connector-profile.d.ts +1 -1
  18. package/dist/connector-profile.d.ts.map +1 -1
  19. package/dist/detect.d.ts.map +1 -1
  20. package/dist/detect.js +226 -192
  21. package/dist/detect.js.map +1 -1
  22. package/dist/ensure-package-service.d.ts +9 -0
  23. package/dist/ensure-package-service.d.ts.map +1 -0
  24. package/dist/ensure-package-service.js +146 -0
  25. package/dist/ensure-package-service.js.map +1 -0
  26. package/dist/ensure-pkg.js +4 -4
  27. package/dist/ensure-pkg.js.map +1 -1
  28. package/dist/ensure.d.ts.map +1 -1
  29. package/dist/ensure.js +15 -144
  30. package/dist/ensure.js.map +1 -1
  31. package/dist/fs-sftp.js +1 -1
  32. package/dist/fs-sftp.js.map +1 -1
  33. package/dist/fs-stat.d.ts +10 -0
  34. package/dist/fs-stat.d.ts.map +1 -0
  35. package/dist/fs-stat.js +62 -0
  36. package/dist/fs-stat.js.map +1 -0
  37. package/dist/fs-tools.d.ts.map +1 -1
  38. package/dist/fs-tools.js +6 -58
  39. package/dist/fs-tools.js.map +1 -1
  40. package/dist/http-security.d.ts.map +1 -1
  41. package/dist/http-security.js +6 -6
  42. package/dist/http-security.js.map +1 -1
  43. package/dist/http-server-runtime.d.ts.map +1 -1
  44. package/dist/http-server-runtime.js +41 -7
  45. package/dist/http-server-runtime.js.map +1 -1
  46. package/dist/index.js +6 -23
  47. package/dist/index.js.map +1 -1
  48. package/dist/mcp-http-web.d.ts +8 -0
  49. package/dist/mcp-http-web.d.ts.map +1 -0
  50. package/dist/mcp-http-web.js +35 -0
  51. package/dist/mcp-http-web.js.map +1 -0
  52. package/dist/mcp.d.ts +6 -2
  53. package/dist/mcp.d.ts.map +1 -1
  54. package/dist/mcp.js +22 -14
  55. package/dist/mcp.js.map +1 -1
  56. package/dist/policy.d.ts +8 -0
  57. package/dist/policy.d.ts.map +1 -1
  58. package/dist/policy.js +147 -105
  59. package/dist/policy.js.map +1 -1
  60. package/dist/process.d.ts.map +1 -1
  61. package/dist/process.js +11 -7
  62. package/dist/process.js.map +1 -1
  63. package/dist/remote/agent-activity-log.d.ts +26 -0
  64. package/dist/remote/agent-activity-log.d.ts.map +1 -0
  65. package/dist/remote/agent-activity-log.js +211 -0
  66. package/dist/remote/agent-activity-log.js.map +1 -0
  67. package/dist/remote/agent-cli.d.ts.map +1 -1
  68. package/dist/remote/agent-cli.js +92 -25
  69. package/dist/remote/agent-cli.js.map +1 -1
  70. package/dist/remote/agent-executor.d.ts.map +1 -1
  71. package/dist/remote/agent-executor.js +22 -10
  72. package/dist/remote/agent-executor.js.map +1 -1
  73. package/dist/remote/agent-handler.d.ts +2 -0
  74. package/dist/remote/agent-handler.d.ts.map +1 -1
  75. package/dist/remote/agent-handler.js +4 -0
  76. package/dist/remote/agent-handler.js.map +1 -1
  77. package/dist/remote/config.d.ts.map +1 -1
  78. package/dist/remote/config.js +12 -1
  79. package/dist/remote/config.js.map +1 -1
  80. package/dist/remote/control-plane.d.ts +12 -0
  81. package/dist/remote/control-plane.d.ts.map +1 -1
  82. package/dist/remote/control-plane.js +164 -56
  83. package/dist/remote/control-plane.js.map +1 -1
  84. package/dist/remote/crypto.d.ts +9 -4
  85. package/dist/remote/crypto.d.ts.map +1 -1
  86. package/dist/remote/crypto.js +41 -9
  87. package/dist/remote/crypto.js.map +1 -1
  88. package/dist/remote/http-util.d.ts.map +1 -1
  89. package/dist/remote/http-util.js +14 -7
  90. package/dist/remote/http-util.js.map +1 -1
  91. package/dist/remote/mcp-tools.d.ts +7 -0
  92. package/dist/remote/mcp-tools.d.ts.map +1 -1
  93. package/dist/remote/mcp-tools.js +28 -0
  94. package/dist/remote/mcp-tools.js.map +1 -1
  95. package/dist/remote/oauth-handler.d.ts +30 -3
  96. package/dist/remote/oauth-handler.d.ts.map +1 -1
  97. package/dist/remote/oauth-handler.js +232 -18
  98. package/dist/remote/oauth-handler.js.map +1 -1
  99. package/dist/remote/policy.js +2 -2
  100. package/dist/remote/policy.js.map +1 -1
  101. package/dist/remote/schemas.d.ts +9 -9
  102. package/dist/remote/schemas.js +6 -6
  103. package/dist/remote/schemas.js.map +1 -1
  104. package/dist/remote/store.d.ts +38 -1
  105. package/dist/remote/store.d.ts.map +1 -1
  106. package/dist/remote/store.js +149 -11
  107. package/dist/remote/store.js.map +1 -1
  108. package/dist/remote/types.d.ts +14 -0
  109. package/dist/remote/types.d.ts.map +1 -1
  110. package/dist/remote/types.js.map +1 -1
  111. package/dist/remote/web-dashboard-client-config.d.ts +77 -0
  112. package/dist/remote/web-dashboard-client-config.d.ts.map +1 -0
  113. package/dist/remote/web-dashboard-client-config.js +81 -0
  114. package/dist/remote/web-dashboard-client-config.js.map +1 -0
  115. package/dist/remote/web-dashboard-html.d.ts +2 -0
  116. package/dist/remote/web-dashboard-html.d.ts.map +1 -0
  117. package/dist/remote/web-dashboard-html.js +433 -0
  118. package/dist/remote/web-dashboard-html.js.map +1 -0
  119. package/dist/remote/web-dashboard-oauth-users.d.ts +4 -0
  120. package/dist/remote/web-dashboard-oauth-users.d.ts.map +1 -0
  121. package/dist/remote/web-dashboard-oauth-users.js +78 -0
  122. package/dist/remote/web-dashboard-oauth-users.js.map +1 -0
  123. package/dist/remote/web-dashboard-static.d.ts +4 -0
  124. package/dist/remote/web-dashboard-static.d.ts.map +1 -0
  125. package/dist/remote/web-dashboard-static.js +19 -0
  126. package/dist/remote/web-dashboard-static.js.map +1 -0
  127. package/dist/remote/web-dashboard-styles.d.ts +2 -0
  128. package/dist/remote/web-dashboard-styles.d.ts.map +1 -0
  129. package/dist/remote/web-dashboard-styles.js +187 -0
  130. package/dist/remote/web-dashboard-styles.js.map +1 -0
  131. package/dist/remote/web-dashboard.d.ts +62 -0
  132. package/dist/remote/web-dashboard.d.ts.map +1 -0
  133. package/dist/remote/web-dashboard.js +467 -0
  134. package/dist/remote/web-dashboard.js.map +1 -0
  135. package/dist/retry.d.ts.map +1 -1
  136. package/dist/retry.js +6 -3
  137. package/dist/retry.js.map +1 -1
  138. package/dist/safety.d.ts.map +1 -1
  139. package/dist/safety.js +56 -6
  140. package/dist/safety.js.map +1 -1
  141. package/dist/session-auth.js +7 -7
  142. package/dist/session-auth.js.map +1 -1
  143. package/dist/session.d.ts +1 -0
  144. package/dist/session.d.ts.map +1 -1
  145. package/dist/session.js +44 -40
  146. package/dist/session.js.map +1 -1
  147. package/dist/shell.d.ts.map +1 -1
  148. package/dist/shell.js +5 -4
  149. package/dist/shell.js.map +1 -1
  150. package/dist/ssh-config.d.ts +2 -2
  151. package/dist/ssh-config.d.ts.map +1 -1
  152. package/dist/ssh-config.js +24 -20
  153. package/dist/ssh-config.js.map +1 -1
  154. package/dist/telemetry.d.ts.map +1 -1
  155. package/dist/telemetry.js +9 -2
  156. package/dist/telemetry.js.map +1 -1
  157. package/dist/tools/connector.provider.d.ts +1 -1
  158. package/dist/tools/connector.provider.d.ts.map +1 -1
  159. package/dist/tools/ensure.provider.d.ts +1 -1
  160. package/dist/tools/ensure.provider.d.ts.map +1 -1
  161. package/dist/tools/fs.provider.d.ts +1 -1
  162. package/dist/tools/fs.provider.d.ts.map +1 -1
  163. package/dist/tools/metadata.d.ts +1 -1
  164. package/dist/tools/metadata.d.ts.map +1 -1
  165. package/dist/tools/output-schemas.d.ts +27 -135
  166. package/dist/tools/output-schemas.d.ts.map +1 -1
  167. package/dist/tools/process.provider.d.ts +1 -1
  168. package/dist/tools/process.provider.d.ts.map +1 -1
  169. package/dist/tools/registry.d.ts +1 -1
  170. package/dist/tools/registry.d.ts.map +1 -1
  171. package/dist/tools/registry.js +16 -13
  172. package/dist/tools/registry.js.map +1 -1
  173. package/dist/tools/session.provider.d.ts +1 -1
  174. package/dist/tools/session.provider.d.ts.map +1 -1
  175. package/dist/tools/system.provider.d.ts +1 -1
  176. package/dist/tools/system.provider.d.ts.map +1 -1
  177. package/dist/tools/transfer.provider.d.ts +1 -1
  178. package/dist/tools/transfer.provider.d.ts.map +1 -1
  179. package/dist/tools/tunnel.provider.d.ts +1 -1
  180. package/dist/tools/tunnel.provider.d.ts.map +1 -1
  181. package/dist/tools/types.d.ts +1 -1
  182. package/dist/tools/types.d.ts.map +1 -1
  183. package/dist/transfer.js +2 -2
  184. package/dist/transfer.js.map +1 -1
  185. package/dist/types.js +1 -1
  186. package/dist/types.js.map +1 -1
  187. package/docs/adding-a-device.md +39 -17
  188. package/docs/agent-activity-monitor.md +34 -0
  189. package/docs/coolify.md +29 -0
  190. package/docs/development/dependency-management.md +1 -1
  191. package/docs/development/mcp-protocol-2026.md +33 -0
  192. package/docs/doppler-guide.md +34 -0
  193. package/docs/reference/compatibility.md +1 -1
  194. package/docs/security/dependency-audit-exceptions.md +3 -7
  195. package/docs/security/hosted-data-inventory.md +81 -0
  196. package/docs/sonarcloud-analysis.md +9 -0
  197. package/mcp.json +1 -1
  198. package/package.json +26 -21
  199. package/registry/ssh-mcp-pro/mcp.json +1 -1
  200. package/server.json +3 -3
package/dist/detect.js CHANGED
@@ -17,7 +17,7 @@ async function safeExec(ssh, command) {
17
17
  function normalizeWindowsPath(path) {
18
18
  if (!path)
19
19
  return undefined;
20
- return path.replace(/\\\\/g, "/").replace(/\\/g, "/");
20
+ return path.replaceAll("\\\\", "/").replaceAll("\\", "/");
21
21
  }
22
22
  function parseKeyValueLine(line) {
23
23
  const separatorIndex = line.indexOf("=");
@@ -28,154 +28,244 @@ function parseKeyValueLine(line) {
28
28
  key: line.slice(0, separatorIndex),
29
29
  value: line
30
30
  .slice(separatorIndex + 1)
31
- .replace(/\"/g, "")
31
+ .replaceAll('"', "")
32
32
  .trim(),
33
33
  };
34
34
  }
35
+ async function detectArchitecture(ssh) {
36
+ // Detect architecture
37
+ const archResult = await safeExec(ssh, "uname -m");
38
+ let arch = archResult.stdout.trim();
39
+ if (!arch) {
40
+ const winArch = await safeExec(ssh, 'powershell -NoLogo -NoProfile -Command "$env:PROCESSOR_ARCHITECTURE"');
41
+ arch = winArch.stdout.trim();
42
+ }
43
+ if (!arch) {
44
+ arch = "unknown";
45
+ }
46
+ return arch;
47
+ }
48
+ async function detectPlatform(ssh) {
49
+ let platform = "unknown";
50
+ let version = "unknown";
51
+ const unameResult = await safeExec(ssh, "uname -s");
52
+ const uname = unameResult.stdout.trim().toLowerCase();
53
+ if (uname.includes("linux")) {
54
+ platform = "linux";
55
+ }
56
+ else if (uname.includes("darwin")) {
57
+ platform = "darwin";
58
+ }
59
+ else if (uname.includes("windows")) {
60
+ platform = "windows";
61
+ }
62
+ // Windows fallback detection (when uname is not available)
63
+ if (platform === "unknown") {
64
+ const winCheck = await safeExec(ssh, "cmd /c ver");
65
+ if (winCheck.code === 0 && winCheck.stdout) {
66
+ platform = "windows";
67
+ version = winCheck.stdout.trim();
68
+ }
69
+ }
70
+ // macOS detection fallback
71
+ if (platform === "unknown") {
72
+ const macCheck = await safeExec(ssh, "sw_vers -productName");
73
+ if (macCheck.code === 0 && macCheck.stdout.toLowerCase().includes("mac")) {
74
+ platform = "darwin";
75
+ }
76
+ }
77
+ return { platform, version };
78
+ }
79
+ async function detectWindows(ssh, arch, version) {
80
+ const platform = "windows";
81
+ const defaultShell = "powershell";
82
+ const psShell = await safeExec(ssh, "echo $env:SHELL");
83
+ const shell = psShell.stdout.trim();
84
+ const tempDir = normalizeWindowsPath((await safeExec(ssh, 'powershell -NoLogo -NoProfile -Command "$env:TEMP"')).stdout.trim()) ?? "C:/Windows/Temp";
85
+ let packageManager = "unknown";
86
+ const wingetCheck = await safeExec(ssh, 'powershell -NoLogo -NoProfile -Command "Get-Command winget -ErrorAction SilentlyContinue"');
87
+ if (wingetCheck.code === 0 && wingetCheck.stdout.toLowerCase().includes("winget")) {
88
+ packageManager = "winget";
89
+ }
90
+ else {
91
+ const chocoCheck = await safeExec(ssh, "choco -v");
92
+ if (chocoCheck.code === 0) {
93
+ packageManager = "choco";
94
+ }
95
+ }
96
+ const osInfo = {
97
+ platform,
98
+ distro: "windows",
99
+ version,
100
+ arch,
101
+ shell: shell !== "" ? shell : "powershell",
102
+ packageManager,
103
+ init: "windows-service",
104
+ defaultShell,
105
+ tempDir,
106
+ };
107
+ logger.debug("OS detection completed", osInfo);
108
+ return osInfo;
109
+ }
110
+ function readReleaseFields(stdout, distroKey, versionKey, lowerDistro) {
111
+ let distro = "unknown";
112
+ let version = "unknown";
113
+ for (const line of stdout.split("\n")) {
114
+ const parsedLine = parseKeyValueLine(line);
115
+ if (!parsedLine) {
116
+ continue;
117
+ }
118
+ if (parsedLine.key === distroKey) {
119
+ distro = lowerDistro ? parsedLine.value.toLowerCase() : parsedLine.value;
120
+ }
121
+ if (parsedLine.key === versionKey) {
122
+ version = parsedLine.value;
123
+ }
124
+ }
125
+ return { distro, version };
126
+ }
127
+ function isAsciiDigit(value, index) {
128
+ const code = value.codePointAt(index) ?? -1;
129
+ return code >= 48 && code <= 57;
130
+ }
131
+ function firstDottedVersion(value) {
132
+ for (let index = 0; index < value.length; index++) {
133
+ if (!isAsciiDigit(value, index)) {
134
+ continue;
135
+ }
136
+ const start = index;
137
+ while (isAsciiDigit(value, index)) {
138
+ index++;
139
+ }
140
+ if (value[index] !== "." || !isAsciiDigit(value, index + 1)) {
141
+ index--;
142
+ continue;
143
+ }
144
+ index++;
145
+ while (isAsciiDigit(value, index)) {
146
+ index++;
147
+ }
148
+ return value.slice(start, index);
149
+ }
150
+ return undefined;
151
+ }
152
+ function parseLinuxRelease(command, stdout) {
153
+ if (command === "cat /etc/os-release") {
154
+ return readReleaseFields(stdout, "ID", "VERSION_ID", false);
155
+ }
156
+ if (command === "cat /etc/lsb-release") {
157
+ return readReleaseFields(stdout, "DISTRIB_ID", "DISTRIB_RELEASE", true);
158
+ }
159
+ const output = stdout.toLowerCase();
160
+ if (output.includes("red hat") || output.includes("rhel") || output.includes("centos")) {
161
+ return { distro: "rhel", version: firstDottedVersion(stdout) ?? "unknown" };
162
+ }
163
+ if (output.includes("debian")) {
164
+ return { distro: "debian", version: stdout.trim() };
165
+ }
166
+ return undefined;
167
+ }
168
+ async function detectLinuxDistro(ssh) {
169
+ const commands = [
170
+ "cat /etc/os-release",
171
+ "cat /etc/lsb-release",
172
+ "cat /etc/redhat-release",
173
+ "cat /etc/debian_version",
174
+ ];
175
+ for (const command of commands) {
176
+ const result = await safeExec(ssh, command);
177
+ if (result.code !== 0 || !result.stdout.trim()) {
178
+ continue;
179
+ }
180
+ const parsed = parseLinuxRelease(command, result.stdout);
181
+ if (parsed) {
182
+ return parsed;
183
+ }
184
+ }
185
+ return { distro: "unknown", version: "unknown" };
186
+ }
187
+ async function detectPackageManager(ssh, platform) {
188
+ let packageManager = "unknown";
189
+ if (platform === "linux") {
190
+ const packageManagers = [
191
+ {
192
+ command: "command -v apt-get || which apt-get",
193
+ manager: "apt",
194
+ },
195
+ {
196
+ command: "command -v dnf || which dnf",
197
+ manager: "dnf",
198
+ },
199
+ {
200
+ command: "command -v yum || which yum",
201
+ manager: "yum",
202
+ },
203
+ {
204
+ command: "command -v pacman || which pacman",
205
+ manager: "pacman",
206
+ },
207
+ {
208
+ command: "command -v apk || which apk",
209
+ manager: "apk",
210
+ },
211
+ {
212
+ command: "command -v zypper || which zypper",
213
+ manager: "zypper",
214
+ },
215
+ ];
216
+ for (const { command, manager } of packageManagers) {
217
+ const result = await safeExec(ssh, command);
218
+ if (result.code === 0) {
219
+ packageManager = manager;
220
+ break;
221
+ }
222
+ }
223
+ }
224
+ else if (platform === "darwin") {
225
+ const brewResult = await safeExec(ssh, "command -v brew || which brew");
226
+ if (brewResult.code === 0) {
227
+ packageManager = "brew";
228
+ }
229
+ }
230
+ return packageManager;
231
+ }
232
+ async function detectInitSystem(ssh, platform) {
233
+ let init = "unknown";
234
+ if (platform === "linux") {
235
+ const systemctlResult = await safeExec(ssh, "command -v systemctl || which systemctl");
236
+ const serviceResult = await safeExec(ssh, "command -v service || which service");
237
+ if (systemctlResult.code === 0) {
238
+ init = "systemd";
239
+ }
240
+ else if (serviceResult.code === 0) {
241
+ init = "service";
242
+ }
243
+ }
244
+ else if (platform === "darwin") {
245
+ init = "launchd";
246
+ }
247
+ return init;
248
+ }
35
249
  /**
36
250
  * Detects OS information on the remote system
37
251
  */
38
252
  export async function detectOS(ssh) {
39
253
  logger.debug("Starting OS detection");
40
254
  try {
41
- // Detect architecture
42
- const archResult = await safeExec(ssh, "uname -m");
43
- let arch = archResult.stdout.trim();
44
- if (!arch) {
45
- const winArch = await safeExec(ssh, 'powershell -NoLogo -NoProfile -Command "$env:PROCESSOR_ARCHITECTURE"');
46
- arch = winArch.stdout.trim();
47
- }
48
- if (!arch) {
49
- arch = "unknown";
50
- }
51
- // Detect platform/kernel
52
- let platform = "unknown";
255
+ const arch = await detectArchitecture(ssh);
256
+ const { platform, version: initialVersion } = await detectPlatform(ssh);
53
257
  let distro = "unknown";
54
- let version = "unknown";
258
+ let version = initialVersion;
55
259
  let defaultShell = "unknown";
56
260
  let tempDir;
57
- const unameResult = await safeExec(ssh, "uname -s");
58
- const uname = unameResult.stdout.trim().toLowerCase();
59
- if (uname.includes("linux")) {
60
- platform = "linux";
61
- }
62
- else if (uname.includes("darwin")) {
63
- platform = "darwin";
64
- }
65
- else if (uname.includes("windows")) {
66
- platform = "windows";
67
- }
68
- // Windows fallback detection (when uname is not available)
69
- if (platform === "unknown") {
70
- const winCheck = await safeExec(ssh, "cmd /c ver");
71
- if (winCheck.code === 0 && winCheck.stdout) {
72
- platform = "windows";
73
- version = winCheck.stdout.trim();
74
- }
75
- }
76
- // macOS detection fallback
77
- if (platform === "unknown") {
78
- const macCheck = await safeExec(ssh, "sw_vers -productName");
79
- if (macCheck.code === 0 && macCheck.stdout.toLowerCase().includes("mac")) {
80
- platform = "darwin";
81
- }
82
- }
83
261
  // Detect shell
84
262
  if (platform === "windows") {
85
- defaultShell = "powershell";
86
- const psShell = await safeExec(ssh, "echo $env:SHELL");
87
- const shell = psShell.stdout.trim();
88
- tempDir =
89
- normalizeWindowsPath((await safeExec(ssh, 'powershell -NoLogo -NoProfile -Command "$env:TEMP"')).stdout.trim()) ?? "C:/Windows/Temp";
90
- let packageManager = "unknown";
91
- const wingetCheck = await safeExec(ssh, 'powershell -NoLogo -NoProfile -Command "Get-Command winget -ErrorAction SilentlyContinue"');
92
- if (wingetCheck.code === 0 && wingetCheck.stdout.toLowerCase().includes("winget")) {
93
- packageManager = "winget";
94
- }
95
- else {
96
- const chocoCheck = await safeExec(ssh, "choco -v");
97
- if (chocoCheck.code === 0) {
98
- packageManager = "choco";
99
- }
100
- }
101
- const osInfo = {
102
- platform,
103
- distro: "windows",
104
- version,
105
- arch,
106
- shell: shell !== "" ? shell : "powershell",
107
- packageManager,
108
- init: "windows-service",
109
- defaultShell,
110
- tempDir,
111
- };
112
- logger.debug("OS detection completed", osInfo);
113
- return osInfo;
263
+ return await detectWindows(ssh, arch, version);
114
264
  }
115
265
  const shellResult = await safeExec(ssh, "echo $SHELL");
116
266
  const shell = shellResult.stdout.trim().split("/").pop() ?? "unknown";
117
- // Linux distro detection
118
267
  if (platform === "linux") {
119
- const detectionCommands = [
120
- "cat /etc/os-release",
121
- "cat /etc/lsb-release",
122
- "cat /etc/redhat-release",
123
- "cat /etc/debian_version",
124
- ];
125
- for (const cmd of detectionCommands) {
126
- const result = await safeExec(ssh, cmd);
127
- if (result.code !== 0 || !result.stdout.trim()) {
128
- continue;
129
- }
130
- const output = result.stdout.toLowerCase();
131
- if (cmd === "cat /etc/os-release") {
132
- const lines = result.stdout.split("\n");
133
- for (const line of lines) {
134
- const parsedLine = parseKeyValueLine(line);
135
- if (!parsedLine) {
136
- continue;
137
- }
138
- if (parsedLine.key === "ID") {
139
- distro = parsedLine.value;
140
- }
141
- if (parsedLine.key === "VERSION_ID") {
142
- version = parsedLine.value;
143
- }
144
- }
145
- break;
146
- }
147
- else if (cmd === "cat /etc/lsb-release") {
148
- const lines = result.stdout.split("\n");
149
- for (const line of lines) {
150
- const parsedLine = parseKeyValueLine(line);
151
- if (!parsedLine) {
152
- continue;
153
- }
154
- if (parsedLine.key === "DISTRIB_ID") {
155
- distro = parsedLine.value.toLowerCase();
156
- }
157
- if (parsedLine.key === "DISTRIB_RELEASE") {
158
- version = parsedLine.value;
159
- }
160
- }
161
- break;
162
- }
163
- else if (output.includes("red hat") ||
164
- output.includes("rhel") ||
165
- output.includes("centos")) {
166
- distro = "rhel";
167
- const versionMatch = result.stdout.match(/(\d+\.\d+)/);
168
- if (versionMatch?.[1]) {
169
- version = versionMatch[1];
170
- }
171
- break;
172
- }
173
- else if (output.includes("debian")) {
174
- distro = "debian";
175
- version = result.stdout.trim();
176
- break;
177
- }
178
- }
268
+ ({ distro, version } = await detectLinuxDistro(ssh));
179
269
  }
180
270
  // macOS distro detection
181
271
  if (platform === "darwin") {
@@ -187,68 +277,12 @@ export async function detectOS(ssh) {
187
277
  version = productVersionValue !== "" ? productVersionValue : "unknown";
188
278
  defaultShell = shell.includes("zsh") ? "sh" : "bash";
189
279
  }
190
- // Package manager detection
191
- let packageManager = "unknown";
192
- if (platform === "linux") {
193
- const packageManagers = [
194
- {
195
- command: "command -v apt-get || which apt-get",
196
- manager: "apt",
197
- },
198
- {
199
- command: "command -v dnf || which dnf",
200
- manager: "dnf",
201
- },
202
- {
203
- command: "command -v yum || which yum",
204
- manager: "yum",
205
- },
206
- {
207
- command: "command -v pacman || which pacman",
208
- manager: "pacman",
209
- },
210
- {
211
- command: "command -v apk || which apk",
212
- manager: "apk",
213
- },
214
- {
215
- command: "command -v zypper || which zypper",
216
- manager: "zypper",
217
- },
218
- ];
219
- for (const { command, manager } of packageManagers) {
220
- const result = await safeExec(ssh, command);
221
- if (result.code === 0) {
222
- packageManager = manager;
223
- break;
224
- }
225
- }
226
- }
227
- else if (platform === "darwin") {
228
- const brewResult = await safeExec(ssh, "command -v brew || which brew");
229
- if (brewResult.code === 0) {
230
- packageManager = "brew";
231
- }
232
- defaultShell = shell.includes("zsh") ? "sh" : "bash";
233
- }
234
- // Init system detection
235
- let init = "unknown";
236
- if (platform === "linux") {
237
- const systemctlResult = await safeExec(ssh, "command -v systemctl || which systemctl");
238
- const serviceResult = await safeExec(ssh, "command -v service || which service");
239
- if (systemctlResult.code === 0) {
240
- init = "systemd";
241
- }
242
- else if (serviceResult.code === 0) {
243
- init = "service";
244
- }
245
- }
246
- else if (platform === "darwin") {
247
- init = "launchd";
248
- }
280
+ const packageManager = await detectPackageManager(ssh, platform);
281
+ const init = await detectInitSystem(ssh, platform);
249
282
  tempDir = platform === "darwin" || platform === "linux" ? "/tmp" : tempDir;
250
- defaultShell =
251
- defaultShell === "unknown" ? (shell.includes("bash") ? "bash" : "sh") : defaultShell;
283
+ if (defaultShell === "unknown") {
284
+ defaultShell = shell.includes("bash") ? "bash" : "sh";
285
+ }
252
286
  const osInfo = {
253
287
  platform,
254
288
  distro,
@@ -1 +1 @@
1
- {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ProcessService } from "./process.js";
2
+ import type { SessionManager } from "./session.js";
3
+ import type { PackageResult } from "./types.js";
4
+ /** Package-specific orchestration; public EnsureService entry point remains unchanged. */
5
+ export declare function createPackageEnsure({ sessionManager, processService, }: {
6
+ sessionManager: Pick<SessionManager, "getSession" | "getOSInfo">;
7
+ processService: Pick<ProcessService, "execCommand" | "execSudo">;
8
+ }): (sessionId: string, packageName: string, state?: "present" | "absent") => Promise<PackageResult>;
9
+ //# sourceMappingURL=ensure-package-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-package-service.d.ts","sourceRoot":"","sources":["../src/ensure-package-service.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhE,0FAA0F;AAC1F,wBAAgB,mBAAmB,CAAC,EAClC,cAAc,EACd,cAAc,GACf,EAAE;IACD,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,GAAG,WAAW,CAAC,CAAC;IACjE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC;CAClE,eAoBc,MAAM,eACJ,MAAM,UACZ,SAAS,GAAG,QAAQ,KAC1B,OAAO,CAAC,aAAa,CAAC,CA6J1B"}