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,132 @@
1
+ import { spawn } from "node:child_process";
2
+ import { z } from "zod";
3
+ import { resolveSSHHost } from "./ssh-config.js";
4
+ const CommandCredentialResponseSchema = z
5
+ .object({
6
+ host: z.string().min(1).optional(),
7
+ username: z.string().min(1).optional(),
8
+ port: z.number().int().min(1).max(65535).optional(),
9
+ auth: z.enum(["agent", "key"]).optional().default("agent"),
10
+ privateKeyPath: z.string().min(1).optional(),
11
+ knownHostsPath: z.string().min(1).optional(),
12
+ expectedHostKeySha256: z.string().min(1).optional(),
13
+ hostKeyPolicy: z.enum(["strict", "accept-new"]).optional().default("strict"),
14
+ readyTimeoutMs: z.number().int().min(1000).max(60000).optional(),
15
+ ttlMs: z.number().int().min(10000).max(900000).optional(),
16
+ })
17
+ .strict();
18
+ export async function resolveConnectorCredentials(request, config) {
19
+ switch (config.connector.credentialProvider) {
20
+ case "agent":
21
+ return resolveAgentCredentials(request, config);
22
+ case "command":
23
+ return resolveCommandCredentials(request, config);
24
+ case "none":
25
+ default:
26
+ throw new Error("Remote connector credential provider is not configured. Set SSH_MCP_CONNECTOR_CREDENTIAL_PROVIDER=agent or command.");
27
+ }
28
+ }
29
+ async function resolveAgentCredentials(request, config) {
30
+ const resolved = await resolveSSHHost(request.hostAlias);
31
+ const username = resolved.username ?? config.connector.defaultUsername;
32
+ if (!username) {
33
+ throw new Error("Remote connector agent provider requires User in SSH config or SSH_MCP_CONNECTOR_DEFAULT_USERNAME.");
34
+ }
35
+ return {
36
+ host: resolved.host,
37
+ policyHost: request.hostAlias,
38
+ username,
39
+ ...(resolved.port !== undefined ? { port: resolved.port } : {}),
40
+ auth: "agent",
41
+ useAgent: true,
42
+ hostKeyPolicy: "strict",
43
+ policyMode: "enforce",
44
+ };
45
+ }
46
+ async function resolveCommandCredentials(request, config) {
47
+ if (!config.connector.credentialCommand) {
48
+ throw new Error("Remote connector command provider requires SSH_MCP_CONNECTOR_CREDENTIAL_COMMAND.");
49
+ }
50
+ const resolved = await resolveSSHHost(request.hostAlias);
51
+ const commandResult = await runCredentialCommand(request, config.connector);
52
+ const username = commandResult.username ?? resolved.username ?? config.connector.defaultUsername;
53
+ if (!username) {
54
+ throw new Error("Credential command did not return a username and no default is configured.");
55
+ }
56
+ if (commandResult.auth === "key" && !commandResult.privateKeyPath) {
57
+ throw new Error("Credential command auth=key requires privateKeyPath.");
58
+ }
59
+ return {
60
+ host: commandResult.host ?? resolved.host,
61
+ policyHost: request.hostAlias,
62
+ username,
63
+ ...((commandResult.port ?? resolved.port) ? { port: commandResult.port ?? resolved.port } : {}),
64
+ auth: commandResult.auth,
65
+ useAgent: commandResult.auth === "agent",
66
+ hostKeyPolicy: commandResult.hostKeyPolicy,
67
+ policyMode: "enforce",
68
+ readyTimeoutMs: commandResult.readyTimeoutMs ?? 20000,
69
+ ttlMs: commandResult.ttlMs ?? 120000,
70
+ ...(commandResult.privateKeyPath ? { privateKeyPath: commandResult.privateKeyPath } : {}),
71
+ ...(commandResult.knownHostsPath ? { knownHostsPath: commandResult.knownHostsPath } : {}),
72
+ ...(commandResult.expectedHostKeySha256
73
+ ? { expectedHostKeySha256: commandResult.expectedHostKeySha256 }
74
+ : {}),
75
+ };
76
+ }
77
+ async function runCredentialCommand(request, config) {
78
+ const command = config.credentialCommand;
79
+ if (!command) {
80
+ throw new Error("Credential command is not configured.");
81
+ }
82
+ const input = JSON.stringify(request);
83
+ const timeoutMs = config.credentialCommandTimeoutMs;
84
+ return new Promise((resolve, reject) => {
85
+ const child = spawn(command, config.credentialCommandArgs, {
86
+ stdio: ["pipe", "pipe", "pipe"],
87
+ windowsHide: true,
88
+ env: {
89
+ ...process.env,
90
+ SSH_MCP_CONNECTOR_HOST_ALIAS: request.hostAlias,
91
+ SSH_MCP_CONNECTOR_PURPOSE: request.purpose,
92
+ },
93
+ });
94
+ const timeout = setTimeout(() => {
95
+ child.kill();
96
+ reject(new Error("Credential command timed out."));
97
+ }, timeoutMs);
98
+ let stdout = "";
99
+ let stdoutBytes = 0;
100
+ child.stdout.setEncoding("utf8");
101
+ child.stdout.on("data", (chunk) => {
102
+ stdoutBytes += Buffer.byteLength(chunk);
103
+ if (stdoutBytes > 32 * 1024) {
104
+ child.kill();
105
+ reject(new Error("Credential command output exceeded 32 KiB."));
106
+ return;
107
+ }
108
+ stdout += chunk;
109
+ });
110
+ child.stderr.resume();
111
+ child.on("error", (error) => {
112
+ clearTimeout(timeout);
113
+ reject(error);
114
+ });
115
+ child.on("close", (code) => {
116
+ clearTimeout(timeout);
117
+ if (code !== 0) {
118
+ reject(new Error("Credential command failed."));
119
+ return;
120
+ }
121
+ try {
122
+ const parsed = JSON.parse(stdout);
123
+ resolve(CommandCredentialResponseSchema.parse(parsed));
124
+ }
125
+ catch (error) {
126
+ reject(error);
127
+ }
128
+ });
129
+ child.stdin.end(input);
130
+ });
131
+ }
132
+ //# sourceMappingURL=connector-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-credentials.js","sourceRoot":"","sources":["../src/connector-credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { MCPPromptDefinition } from "./prompts.js";
2
+ import type { MCPResource } from "./resources.js";
3
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
4
+ export declare const TOOL_PROFILES: readonly ["full", "remote-safe", "chatgpt", "claude", "remote-readonly", "remote-broker"];
5
+ export type ToolProfile = (typeof TOOL_PROFILES)[number];
6
+ export declare const CHATGPT_EXTRA_TOOLS: Set<string>;
7
+ export declare const CLAUDE_EXTRA_TOOLS: Set<string>;
8
+ export declare const PROFILE_TOOL_SETS: Record<ToolProfile, Set<string>>;
9
+ export declare function parseToolProfile(value: string | undefined, fallback: ToolProfile): ToolProfile;
10
+ export declare function isRemoteSafeToolProfile(profile: ToolProfile): boolean;
11
+ export declare function isToolAllowedForProfile(toolName: string, profile: ToolProfile): boolean;
12
+ export declare function filterToolsForProfile(tools: Tool[], profile: ToolProfile): Tool[];
13
+ export declare function filterResourcesForProfile(resources: MCPResource[], profile: ToolProfile): MCPResource[];
14
+ export declare function isResourceAllowedForProfile(uri: string, profile: ToolProfile): boolean;
15
+ export declare function filterPromptsForProfile(prompts: MCPPromptDefinition[], profile: ToolProfile): MCPPromptDefinition[];
16
+ export declare function isPromptAllowedForProfile(name: string, profile: ToolProfile): boolean;
17
+ //# sourceMappingURL=connector-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-profile.d.ts","sourceRoot":"","sources":["../src/connector-profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D,eAAO,MAAM,aAAa,2FAOhB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAczD,eAAO,MAAM,mBAAmB,aAAoB,CAAC;AACrD,eAAO,MAAM,kBAAkB,aAAoB,CAAC;AAEpD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAO9D,CAAC;AAoBF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,WAAW,GAAG,WAAW,CAQ9F;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAErE;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAEvF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,CAMjF;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,WAAW,iBAKvF;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAEtF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,OAAO,EAAE,WAAW,yBAK3F;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAErF"}
@@ -0,0 +1,81 @@
1
+ export const TOOL_PROFILES = [
2
+ "full",
3
+ "remote-safe",
4
+ "chatgpt",
5
+ "claude",
6
+ "remote-readonly",
7
+ "remote-broker",
8
+ ];
9
+ const REMOTE_CONNECTOR_TOOL_NAMES = [
10
+ "connector_status",
11
+ "ssh_hosts_list",
12
+ "ssh_policy_explain",
13
+ "ssh_host_inspect",
14
+ "ssh_mutation_plan",
15
+ ];
16
+ function createRemoteConnectorToolSet() {
17
+ return new Set(REMOTE_CONNECTOR_TOOL_NAMES);
18
+ }
19
+ export const CHATGPT_EXTRA_TOOLS = new Set();
20
+ export const CLAUDE_EXTRA_TOOLS = new Set();
21
+ export const PROFILE_TOOL_SETS = {
22
+ full: new Set(),
23
+ "remote-safe": createRemoteConnectorToolSet(),
24
+ chatgpt: createRemoteConnectorToolSet(),
25
+ claude: createRemoteConnectorToolSet(),
26
+ "remote-readonly": createRemoteConnectorToolSet(),
27
+ "remote-broker": createRemoteConnectorToolSet(),
28
+ };
29
+ const REMOTE_CONNECTOR_RESOURCES = new Set(["ssh-mcp-pro://capabilities/support-matrix"]);
30
+ const REMOTE_CONNECTOR_PROMPTS = new Set(["inspect-host-capabilities", "plan-mutation"]);
31
+ function getProfileToolSet(profile) {
32
+ const profileTools = PROFILE_TOOL_SETS[profile];
33
+ if (profile === "chatgpt" && CHATGPT_EXTRA_TOOLS.size > 0) {
34
+ return new Set([...profileTools, ...CHATGPT_EXTRA_TOOLS]);
35
+ }
36
+ if (profile === "claude" && CLAUDE_EXTRA_TOOLS.size > 0) {
37
+ return new Set([...profileTools, ...CLAUDE_EXTRA_TOOLS]);
38
+ }
39
+ return profileTools;
40
+ }
41
+ export function parseToolProfile(value, fallback) {
42
+ if (value === undefined || value === "") {
43
+ return fallback;
44
+ }
45
+ if (TOOL_PROFILES.includes(value)) {
46
+ return value;
47
+ }
48
+ return fallback;
49
+ }
50
+ export function isRemoteSafeToolProfile(profile) {
51
+ return profile !== "full";
52
+ }
53
+ export function isToolAllowedForProfile(toolName, profile) {
54
+ return profile === "full" || getProfileToolSet(profile).has(toolName);
55
+ }
56
+ export function filterToolsForProfile(tools, profile) {
57
+ if (profile === "full") {
58
+ return tools;
59
+ }
60
+ const profileTools = getProfileToolSet(profile);
61
+ return tools.filter((tool) => profileTools.has(tool.name));
62
+ }
63
+ export function filterResourcesForProfile(resources, profile) {
64
+ if (profile === "full") {
65
+ return resources;
66
+ }
67
+ return resources.filter((resource) => REMOTE_CONNECTOR_RESOURCES.has(resource.uri));
68
+ }
69
+ export function isResourceAllowedForProfile(uri, profile) {
70
+ return profile === "full" || REMOTE_CONNECTOR_RESOURCES.has(uri);
71
+ }
72
+ export function filterPromptsForProfile(prompts, profile) {
73
+ if (profile === "full") {
74
+ return prompts;
75
+ }
76
+ return prompts.filter((prompt) => REMOTE_CONNECTOR_PROMPTS.has(prompt.name));
77
+ }
78
+ export function isPromptAllowedForProfile(name, profile) {
79
+ return profile === "full" || REMOTE_CONNECTOR_PROMPTS.has(name);
80
+ }
81
+ //# sourceMappingURL=connector-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-profile.js","sourceRoot":"","sources":["../src/connector-profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { ConfigManager, type ServerConfig } from "./config.js";
2
+ import { AuditLog } from "./audit.js";
3
+ import { MetricsCollector } from "./metrics.js";
4
+ import { PolicyEngine } from "./policy.js";
5
+ import { RateLimiter } from "./rate-limiter.js";
6
+ import { SessionManager } from "./session.js";
7
+ import { type TunnelService } from "./tunnel.js";
8
+ export interface AppContainer {
9
+ config: ConfigManager;
10
+ rateLimiter: RateLimiter;
11
+ metrics: MetricsCollector;
12
+ auditLog: AuditLog;
13
+ policy: PolicyEngine;
14
+ sessionManager: SessionManager;
15
+ tunnelService: TunnelService;
16
+ }
17
+ export declare function createContainer(configOverrides?: Partial<ServerConfig>): AppContainer;
18
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAkBtE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,wBAAgB,eAAe,CAAC,eAAe,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,YAAY,CA6CzF"}
@@ -0,0 +1,52 @@
1
+ import { ConfigManager } from "./config.js";
2
+ import { AuditLog } from "./audit.js";
3
+ import { MetricsCollector } from "./metrics.js";
4
+ import { PolicyEngine } from "./policy.js";
5
+ import { RateLimiter } from "./rate-limiter.js";
6
+ import { SessionManager } from "./session.js";
7
+ import { createTunnelService } from "./tunnel.js";
8
+ function auditDetails(action, values) {
9
+ return {
10
+ action,
11
+ ...(values.host ? { host: values.host } : {}),
12
+ ...(values.username ? { username: values.username } : {}),
13
+ ...(values.target ? { target: values.target } : {}),
14
+ };
15
+ }
16
+ export function createContainer(configOverrides = {}) {
17
+ const config = new ConfigManager(configOverrides);
18
+ const rateLimiter = new RateLimiter({
19
+ maxRequests: config.get("rateLimit").maxRequests,
20
+ windowMs: config.get("rateLimit").windowMs,
21
+ blockOnLimit: true,
22
+ });
23
+ const metrics = new MetricsCollector();
24
+ const auditLog = new AuditLog();
25
+ const policy = new PolicyEngine(config.get("policy"), (decision, context) => {
26
+ metrics.recordPolicyDecision(decision.allowed, decision.mode);
27
+ auditLog.recordPolicyDecision(decision, auditDetails(context.action, {
28
+ host: context.host,
29
+ username: context.username,
30
+ target: context.path ?? context.command,
31
+ }));
32
+ });
33
+ const sessionManager = new SessionManager(config.get("maxSessions"), config.get("sessionTtlMs"), config.get("cleanupIntervalMs"), config.get("security"), policy);
34
+ const tunnelService = createTunnelService({
35
+ sessionManager,
36
+ metrics,
37
+ policy,
38
+ });
39
+ sessionManager.onSessionClose(async (sessionId) => {
40
+ await tunnelService.closeSessionTunnels(sessionId);
41
+ });
42
+ return {
43
+ config,
44
+ rateLimiter,
45
+ metrics,
46
+ auditLog,
47
+ policy,
48
+ sessionManager,
49
+ tunnelService,
50
+ };
51
+ }
52
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAsB,MAAM,aAAa,CAAC;AAEtE,SAAS,YAAY,CACnB,MAAc,EACd,MAIC;IAED,OAAO;QACL,MAAM;QACN,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC;AACJ,CAAC;AAYD,MAAM,UAAU,eAAe,CAAC,kBAAyC,EAAE;IACzE,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,eAAe,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,WAAW;QAChD,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,QAAQ;QAC1C,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QAC1E,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9D,QAAQ,CAAC,oBAAoB,CAC3B,QAAQ,EACR,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE;YAC3B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO;SACxC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,IAAI,cAAc,CACvC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EACzB,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,EAC1B,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAC/B,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EACtB,MAAM,CACP,CAAC;IACF,MAAM,aAAa,GAAG,mBAAmB,CAAC;QACxC,cAAc;QACd,OAAO;QACP,MAAM;KACP,CAAC,CAAC;IACH,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QAChD,MAAM,aAAa,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,WAAW;QACX,OAAO;QACP,QAAQ;QACR,MAAM;QACN,cAAc;QACd,aAAa;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { NodeSSH } from "node-ssh";
2
+ import { OSInfo } from "./types.js";
3
+ /**
4
+ * Detects OS information on the remote system
5
+ */
6
+ export declare function detectOS(ssh: NodeSSH): Promise<OSInfo>;
7
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAc,MAAM,EAAuC,MAAM,YAAY,CAAC;AAyCrF;;GAEG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAmQ5D"}
package/dist/detect.js ADDED
@@ -0,0 +1,271 @@
1
+ import { logger } from "./logging.js";
2
+ import { createFilesystemError } from "./errors.js";
3
+ async function safeExec(ssh, command) {
4
+ try {
5
+ const result = await ssh.execCommand(command);
6
+ return {
7
+ code: result.code ?? 0,
8
+ stdout: result.stdout ?? "",
9
+ stderr: result.stderr ?? "",
10
+ };
11
+ }
12
+ catch (error) {
13
+ logger.debug("OS detection command failed", { command, error });
14
+ return { code: 1, stdout: "", stderr: String(error) };
15
+ }
16
+ }
17
+ function normalizeWindowsPath(path) {
18
+ if (!path)
19
+ return undefined;
20
+ return path.replace(/\\\\/g, "/").replace(/\\/g, "/");
21
+ }
22
+ function parseKeyValueLine(line) {
23
+ const separatorIndex = line.indexOf("=");
24
+ if (separatorIndex === -1) {
25
+ return undefined;
26
+ }
27
+ return {
28
+ key: line.slice(0, separatorIndex),
29
+ value: line
30
+ .slice(separatorIndex + 1)
31
+ .replace(/\"/g, "")
32
+ .trim(),
33
+ };
34
+ }
35
+ /**
36
+ * Detects OS information on the remote system
37
+ */
38
+ export async function detectOS(ssh) {
39
+ logger.debug("Starting OS detection");
40
+ 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";
53
+ let distro = "unknown";
54
+ let version = "unknown";
55
+ let defaultShell = "unknown";
56
+ 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
+ // Detect shell
84
+ 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;
114
+ }
115
+ const shellResult = await safeExec(ssh, "echo $SHELL");
116
+ const shell = shellResult.stdout.trim().split("/").pop() ?? "unknown";
117
+ // Linux distro detection
118
+ 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
+ }
179
+ }
180
+ // macOS distro detection
181
+ if (platform === "darwin") {
182
+ const productName = await safeExec(ssh, "sw_vers -productName");
183
+ const productVersion = await safeExec(ssh, "sw_vers -productVersion");
184
+ const productNameValue = productName.stdout.trim();
185
+ const productVersionValue = productVersion.stdout.trim();
186
+ distro = productNameValue !== "" ? productNameValue : "macos";
187
+ version = productVersionValue !== "" ? productVersionValue : "unknown";
188
+ defaultShell = shell.includes("zsh") ? "sh" : "bash";
189
+ }
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
+ }
249
+ tempDir = platform === "darwin" || platform === "linux" ? "/tmp" : tempDir;
250
+ defaultShell =
251
+ defaultShell === "unknown" ? (shell.includes("bash") ? "bash" : "sh") : defaultShell;
252
+ const osInfo = {
253
+ platform,
254
+ distro,
255
+ version,
256
+ arch,
257
+ shell,
258
+ packageManager,
259
+ init,
260
+ defaultShell,
261
+ ...(tempDir ? { tempDir } : {}),
262
+ };
263
+ logger.debug("OS detection completed", osInfo);
264
+ return osInfo;
265
+ }
266
+ catch (error) {
267
+ logger.error("Failed to detect OS information", { error });
268
+ throw createFilesystemError("Failed to detect OS information", "Ensure the SSH connection is working and the remote system responds to basic commands");
269
+ }
270
+ }
271
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}