@burdenoff/vibe-plugin-ssh 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,30 +1,123 @@
1
+ /**
2
+ * Port-forwarding routes (Elysia + KV storage).
3
+ *
4
+ * Namespace: "ssh"
5
+ * Keys:
6
+ * "connections" → JSON array of SSHConnection objects (read-only here)
7
+ * "port-forwards" → JSON array of PortForward objects
8
+ */
9
+ import { Elysia } from "elysia";
1
10
  import crypto from "node:crypto";
2
11
  import { Client } from "ssh2";
3
- import { createServer } from "net";
4
- import { readFileSync } from "fs";
5
- // Store active connections and servers
12
+ import { createServer } from "node:net";
13
+ import { readFileSync } from "node:fs";
14
+ // ---------------------------------------------------------------------------
15
+ // In-memory map of currently active tunnels
16
+ // ---------------------------------------------------------------------------
6
17
  const activeConnections = new Map();
7
- export const portForwardRoutes = async (fastify) => {
8
- // Get all port forwards
9
- fastify.get("/", async (_request, _reply) => {
10
- const portForwards = fastify.db.getAllPortForwards();
18
+ // ---------------------------------------------------------------------------
19
+ // KV helpers connections (read-only from this module)
20
+ // ---------------------------------------------------------------------------
21
+ async function getConnectionById(storage, id) {
22
+ const raw = await storage.get("ssh", "connections");
23
+ if (!raw)
24
+ return undefined;
25
+ const all = JSON.parse(raw);
26
+ return all.find((c) => c.id === id);
27
+ }
28
+ async function getConnectionByName(storage, serverName) {
29
+ const raw = await storage.get("ssh", "connections");
30
+ if (!raw)
31
+ return undefined;
32
+ const all = JSON.parse(raw);
33
+ return all.find((c) => c.serverName === serverName);
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // KV helpers – port forwards
37
+ // ---------------------------------------------------------------------------
38
+ async function getAllPortForwards(storage) {
39
+ const raw = await storage.get("ssh", "port-forwards");
40
+ if (!raw)
41
+ return [];
42
+ return JSON.parse(raw);
43
+ }
44
+ async function getPortForwardById(storage, id) {
45
+ const all = await getAllPortForwards(storage);
46
+ return all.find((pf) => pf.id === id);
47
+ }
48
+ async function savePortForwards(storage, forwards) {
49
+ await storage.set("ssh", "port-forwards", JSON.stringify(forwards));
50
+ }
51
+ async function updatePortForward(storage, id, patch) {
52
+ const all = await getAllPortForwards(storage);
53
+ const idx = all.findIndex((pf) => pf.id === id);
54
+ if (idx !== -1) {
55
+ all[idx] = { ...all[idx], ...patch };
56
+ await savePortForwards(storage, all);
57
+ }
58
+ }
59
+ async function deletePortForwardById(storage, id) {
60
+ const all = await getAllPortForwards(storage);
61
+ const filtered = all.filter((pf) => pf.id !== id);
62
+ await savePortForwards(storage, filtered);
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // Build an ssh2 connect config from a stored connection
66
+ // ---------------------------------------------------------------------------
67
+ function buildConnectConfig(conn) {
68
+ const cfg = {
69
+ host: conn.host,
70
+ port: conn.port,
71
+ username: conn.username,
72
+ };
73
+ if (conn.privateKeyPath) {
74
+ cfg.privateKey = readFileSync(conn.privateKeyPath);
75
+ }
76
+ else if (conn.password) {
77
+ cfg.password = conn.password;
78
+ }
79
+ return cfg;
80
+ }
81
+ // ---------------------------------------------------------------------------
82
+ // Cleanup helper — exported so onServerStop can call it too
83
+ // ---------------------------------------------------------------------------
84
+ export function cleanupAllTunnels() {
85
+ for (const [, { client, server }] of activeConnections) {
86
+ server.close();
87
+ client.end();
88
+ }
89
+ activeConnections.clear();
90
+ }
91
+ // ---------------------------------------------------------------------------
92
+ // Route factory
93
+ // ---------------------------------------------------------------------------
94
+ export function createPortForwardRoutes(hostServices) {
95
+ const { storage, eventBus } = hostServices;
96
+ return new Elysia({ prefix: "/api/port-forward" })
97
+ // -----------------------------------------------------------------------
98
+ // GET /api/port-forward — list all port forwards
99
+ // -----------------------------------------------------------------------
100
+ .get("/", async () => {
101
+ const portForwards = await getAllPortForwards(storage);
11
102
  return { portForwards };
12
- });
13
- // Create new port forward
14
- fastify.post("/", async (request, reply) => {
15
- const { localPort, remoteHost, remotePort, connectionId } = request.body;
103
+ })
104
+ // -----------------------------------------------------------------------
105
+ // POST /api/port-forward create a new port forward config
106
+ // -----------------------------------------------------------------------
107
+ .post("/", async ({ body, set }) => {
108
+ const { localPort, remoteHost, remotePort, connectionId } = body;
16
109
  try {
17
- const existing = fastify.db
18
- .getAllPortForwards()
19
- .find((pf) => pf.localPort === localPort && pf.status === "active");
110
+ const existing = (await getAllPortForwards(storage)).find((pf) => pf.localPort === localPort && pf.status === "active");
20
111
  if (existing) {
21
- return reply.code(409).send({ error: "Local port is already in use" });
112
+ set.status = 409;
113
+ return { error: "Local port is already in use" };
22
114
  }
23
- const connectionConfig = fastify.db.getSSHConnection(connectionId);
115
+ const connectionConfig = await getConnectionById(storage, connectionId);
24
116
  if (!connectionConfig) {
25
- return reply.code(404).send({ error: "SSH connection not found" });
117
+ set.status = 404;
118
+ return { error: "SSH connection not found" };
26
119
  }
27
- const portForward = fastify.db.createPortForward({
120
+ const newPf = {
28
121
  id: crypto.randomUUID(),
29
122
  localPort,
30
123
  remoteHost,
@@ -32,34 +125,43 @@ export const portForwardRoutes = async (fastify) => {
32
125
  serverName: connectionConfig.serverName,
33
126
  connectionId,
34
127
  status: "inactive",
35
- });
36
- return { portForward };
128
+ createdAt: new Date().toISOString(),
129
+ };
130
+ const all = await getAllPortForwards(storage);
131
+ all.push(newPf);
132
+ await savePortForwards(storage, all);
133
+ return { portForward: newPf };
37
134
  }
38
135
  catch (error) {
39
- return reply.code(500).send({
136
+ set.status = 500;
137
+ return {
40
138
  error: "Failed to create port forward",
41
139
  details: error instanceof Error ? error.message : "Unknown error",
42
- });
140
+ };
43
141
  }
44
- });
45
- // Start port forwarding
46
- fastify.post("/:id/start", async (request, reply) => {
47
- const { id } = request.params;
142
+ })
143
+ // -----------------------------------------------------------------------
144
+ // POST /api/port-forward/:id/start start the tunnel
145
+ // -----------------------------------------------------------------------
146
+ .post("/:id/start", async ({ params, set }) => {
147
+ const { id } = params;
48
148
  try {
49
- const portForward = fastify.db.getPortForward(id);
149
+ const portForward = await getPortForwardById(storage, id);
50
150
  if (!portForward) {
51
- return reply.code(404).send({ error: "Port forward not found" });
151
+ set.status = 404;
152
+ return { error: "Port forward not found" };
52
153
  }
53
154
  if (portForward.status === "active") {
54
- return reply
55
- .code(400)
56
- .send({ error: "Port forward is already active" });
155
+ set.status = 400;
156
+ return { error: "Port forward is already active" };
57
157
  }
158
+ // Resolve connection config (by id first, then by serverName)
58
159
  const connectionConfig = portForward.connectionId
59
- ? fastify.db.getSSHConnection(portForward.connectionId)
60
- : fastify.db.getSSHConnectionByName(portForward.serverName);
160
+ ? await getConnectionById(storage, portForward.connectionId)
161
+ : await getConnectionByName(storage, portForward.serverName);
61
162
  if (!connectionConfig) {
62
- return reply.code(404).send({ error: "SSH connection not found" });
163
+ set.status = 404;
164
+ return { error: "SSH connection not found" };
63
165
  }
64
166
  const sshClient = new Client();
65
167
  const server = createServer((localSocket) => {
@@ -82,14 +184,17 @@ export const portForwardRoutes = async (fastify) => {
82
184
  sshClient.on("ready", () => {
83
185
  server.listen(portForward.localPort, () => {
84
186
  activeConnections.set(id, { client: sshClient, server });
85
- fastify.db.updatePortForward(id, {
86
- status: "active",
87
- connectionId: id,
88
- });
89
- fastify.io.emit("portforward:started", {
90
- id,
91
- localPort: portForward.localPort,
92
- });
187
+ // Persist status change
188
+ void updatePortForward(storage, id, { status: "active" });
189
+ if (eventBus) {
190
+ eventBus.emit("portforward:started", {
191
+ id,
192
+ localPort: portForward.localPort,
193
+ });
194
+ }
195
+ else {
196
+ console.log(`[port-forward] Started tunnel ${id} on localhost:${portForward.localPort}`);
197
+ }
93
198
  resolve({
94
199
  success: true,
95
200
  message: `Port forwarding started on localhost:${portForward.localPort}`,
@@ -97,49 +202,45 @@ export const portForwardRoutes = async (fastify) => {
97
202
  });
98
203
  server.on("error", (err) => {
99
204
  sshClient.end();
100
- resolve(reply.code(500).send({
205
+ set.status = 500;
206
+ resolve({
101
207
  error: "Failed to start local server",
102
208
  details: err.message,
103
- }));
209
+ });
104
210
  });
105
211
  });
106
212
  sshClient.on("error", (err) => {
107
- resolve(reply.code(500).send({
213
+ set.status = 500;
214
+ resolve({
108
215
  error: "SSH connection failed",
109
216
  details: err.message,
110
- }));
217
+ });
111
218
  });
112
- const connectConfig = {
113
- host: connectionConfig.host,
114
- port: connectionConfig.port,
115
- username: connectionConfig.username,
116
- };
117
- if (connectionConfig.privateKeyPath) {
118
- connectConfig.privateKey = readFileSync(connectionConfig.privateKeyPath);
119
- }
120
- else if (connectionConfig.password) {
121
- connectConfig.password = connectionConfig.password;
122
- }
123
- sshClient.connect(connectConfig);
219
+ sshClient.connect(buildConnectConfig(connectionConfig));
124
220
  });
125
221
  }
126
222
  catch (error) {
127
- return reply.code(500).send({
223
+ set.status = 500;
224
+ return {
128
225
  error: "Failed to start port forward",
129
226
  details: error instanceof Error ? error.message : "Unknown error",
130
- });
227
+ };
131
228
  }
132
- });
133
- // Stop port forwarding
134
- fastify.post("/:id/stop", async (request, reply) => {
135
- const { id } = request.params;
229
+ })
230
+ // -----------------------------------------------------------------------
231
+ // POST /api/port-forward/:id/stop stop an active tunnel
232
+ // -----------------------------------------------------------------------
233
+ .post("/:id/stop", async ({ params, set }) => {
234
+ const { id } = params;
136
235
  try {
137
- const portForward = fastify.db.getPortForward(id);
236
+ const portForward = await getPortForwardById(storage, id);
138
237
  if (!portForward) {
139
- return reply.code(404).send({ error: "Port forward not found" });
238
+ set.status = 404;
239
+ return { error: "Port forward not found" };
140
240
  }
141
241
  if (portForward.status !== "active") {
142
- return reply.code(400).send({ error: "Port forward is not active" });
242
+ set.status = 400;
243
+ return { error: "Port forward is not active" };
143
244
  }
144
245
  const active = activeConnections.get(id);
145
246
  if (active) {
@@ -147,31 +248,38 @@ export const portForwardRoutes = async (fastify) => {
147
248
  active.client.end();
148
249
  activeConnections.delete(id);
149
250
  }
150
- fastify.db.updatePortForward(id, {
151
- status: "inactive",
152
- connectionId: undefined,
153
- });
154
- fastify.io.emit("portforward:stopped", {
155
- id,
156
- localPort: portForward.localPort,
157
- });
251
+ await updatePortForward(storage, id, { status: "inactive" });
252
+ if (eventBus) {
253
+ eventBus.emit("portforward:stopped", {
254
+ id,
255
+ localPort: portForward.localPort,
256
+ });
257
+ }
258
+ else {
259
+ console.log(`[port-forward] Stopped tunnel ${id} (localhost:${portForward.localPort})`);
260
+ }
158
261
  return { success: true };
159
262
  }
160
263
  catch (error) {
161
- return reply.code(500).send({
264
+ set.status = 500;
265
+ return {
162
266
  error: "Failed to stop port forward",
163
267
  details: error instanceof Error ? error.message : "Unknown error",
164
- });
268
+ };
165
269
  }
166
- });
167
- // Delete port forward
168
- fastify.delete("/:id", async (request, reply) => {
169
- const { id } = request.params;
270
+ })
271
+ // -----------------------------------------------------------------------
272
+ // DELETE /api/port-forward/:id delete a port forward (stops if active)
273
+ // -----------------------------------------------------------------------
274
+ .delete("/:id", async ({ params, set }) => {
275
+ const { id } = params;
170
276
  try {
171
- const portForward = fastify.db.getPortForward(id);
277
+ const portForward = await getPortForwardById(storage, id);
172
278
  if (!portForward) {
173
- return reply.code(404).send({ error: "Port forward not found" });
279
+ set.status = 404;
280
+ return { error: "Port forward not found" };
174
281
  }
282
+ // Tear down tunnel if still active
175
283
  if (portForward.status === "active") {
176
284
  const active = activeConnections.get(id);
177
285
  if (active) {
@@ -180,23 +288,16 @@ export const portForwardRoutes = async (fastify) => {
180
288
  activeConnections.delete(id);
181
289
  }
182
290
  }
183
- fastify.db.deletePortForward(id);
291
+ await deletePortForwardById(storage, id);
184
292
  return { success: true };
185
293
  }
186
294
  catch (error) {
187
- return reply.code(500).send({
295
+ set.status = 500;
296
+ return {
188
297
  error: "Failed to delete port forward",
189
298
  details: error instanceof Error ? error.message : "Unknown error",
190
- });
191
- }
192
- });
193
- // Cleanup on server close
194
- fastify.addHook("onClose", async () => {
195
- for (const [, { client, server }] of activeConnections) {
196
- server.close();
197
- client.end();
299
+ };
198
300
  }
199
- activeConnections.clear();
200
301
  });
201
- };
302
+ }
202
303
  //# sourceMappingURL=port-forward.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"port-forward.js","sourceRoot":"","sources":["../../src/routes/port-forward.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"port-forward.js","sourceRoot":"","sources":["../../src/routes/port-forward.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAe,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAQvC,8EAA8E;AAC9E,4CAA4C;AAC5C,8EAA8E;AAE9E,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAG9B,CAAC;AAEJ,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAE9E,KAAK,UAAU,iBAAiB,CAC9B,OAAgC,EAChC,EAAU;IAEV,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;IAC/C,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,OAAgC,EAChC,UAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;IAC/C,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,KAAK,UAAU,kBAAkB,CAC/B,OAAgC;IAEhC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,OAAgC,EAChC,EAAU;IAEV,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9C,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,OAAgC,EAChC,QAAuB;IAEvB,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,OAAgC,EAChC,EAAU,EACV,KAA2B;IAE3B,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;QACrC,MAAM,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,OAAgC,EAChC,EAAU;IAEV,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,MAAM,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAE9E,SAAS,kBAAkB,CAAC,IAAmB;IAC7C,MAAM,GAAG,GAML;QACF,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;IAEF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,GAAG,CAAC,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,4DAA4D;AAC5D,8EAA8E;AAE9E,MAAM,UAAU,iBAAiB;IAC/B,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC;QACvD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,EAAE,CAAC;IACf,CAAC;IACD,iBAAiB,CAAC,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,UAAU,uBAAuB,CAAC,YAA0B;IAChE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC;IAE3C,OAAO,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;QAEhD,0EAA0E;QAC1E,iDAAiD;QACjD,0EAA0E;SACzE,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;QACnB,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACvD,OAAO,EAAE,YAAY,EAAE,CAAC;IAC1B,CAAC,CAAC;QAEF,0EAA0E;QAC1E,4DAA4D;QAC5D,0EAA0E;SACzE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;QACjC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,GACvD,IAA6B,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,CAAC,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACvD,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,CAC7D,CAAC;YAEF,IAAI,QAAQ,EAAE,CAAC;gBACb,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;gBACjB,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;YACnD,CAAC;YAED,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAC9C,OAAO,EACP,YAAY,CACb,CAAC;YACF,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;gBACjB,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;YAC/C,CAAC;YAED,MAAM,KAAK,GAAgB;gBACzB,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;gBACvB,SAAS;gBACT,UAAU;gBACV,UAAU;gBACV,UAAU,EAAE,gBAAgB,CAAC,UAAU;gBACvC,YAAY;gBACZ,MAAM,EAAE,UAAU;gBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,MAAM,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAErC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;YACjB,OAAO;gBACL,KAAK,EAAE,+BAA+B;gBACtC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;QAEF,0EAA0E;QAC1E,sDAAsD;QACtD,0EAA0E;SACzE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;QAC5C,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;gBACjB,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;YAC7C,CAAC;YAED,IAAI,WAAW,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACpC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;gBACjB,OAAO,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;YACrD,CAAC;YAED,8DAA8D;YAC9D,MAAM,gBAAgB,GAAG,WAAW,CAAC,YAAY;gBAC/C,CAAC,CAAC,MAAM,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,YAAY,CAAC;gBAC5D,CAAC,CAAC,MAAM,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;YAE/D,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;gBACjB,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;YAC/C,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,MAAM,EAAE,CAAC;YAE/B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC1C,SAAS,CAAC,UAAU,CAClB,WAAW,EACX,WAAW,CAAC,SAAS,EACrB,WAAW,CAAC,UAAU,EACtB,WAAW,CAAC,UAAU,EACtB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;oBACd,IAAI,GAAG,EAAE,CAAC;wBACR,WAAW,CAAC,GAAG,EAAE,CAAC;wBAClB,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;wBACrC,OAAO;oBACT,CAAC;oBAED,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBAE3C,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;wBAC3B,MAAM,CAAC,GAAG,EAAE,CAAC;oBACf,CAAC,CAAC,CAAC;oBAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;wBACtB,WAAW,CAAC,GAAG,EAAE,CAAC;oBACpB,CAAC,CAAC,CAAC;gBACL,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBACzB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE;wBACxC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;wBAEzD,wBAAwB;wBACxB,KAAK,iBAAiB,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;wBAE1D,IAAI,QAAQ,EAAE,CAAC;4BACb,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE;gCACnC,EAAE;gCACF,SAAS,EAAE,WAAW,CAAC,SAAS;6BACjC,CAAC,CAAC;wBACL,CAAC;6BAAM,CAAC;4BACN,OAAO,CAAC,GAAG,CACT,iCAAiC,EAAE,iBAAiB,WAAW,CAAC,SAAS,EAAE,CAC5E,CAAC;wBACJ,CAAC;wBAED,OAAO,CAAC;4BACN,OAAO,EAAE,IAAI;4BACb,OAAO,EAAE,wCAAwC,WAAW,CAAC,SAAS,EAAE;yBACzE,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;oBAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;wBACzB,SAAS,CAAC,GAAG,EAAE,CAAC;wBAChB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;wBACjB,OAAO,CAAC;4BACN,KAAK,EAAE,8BAA8B;4BACrC,OAAO,EAAE,GAAG,CAAC,OAAO;yBACrB,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC5B,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;oBACjB,OAAO,CAAC;wBACN,KAAK,EAAE,uBAAuB;wBAC9B,OAAO,EAAE,GAAG,CAAC,OAAO;qBACrB,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEH,SAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;YACjB,OAAO;gBACL,KAAK,EAAE,8BAA8B;gBACrC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;QAEF,0EAA0E;QAC1E,0DAA0D;QAC1D,0EAA0E;SACzE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;QAC3C,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;gBACjB,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;YAC7C,CAAC;YAED,IAAI,WAAW,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACpC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;gBACjB,OAAO,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;YACjD,CAAC;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACpB,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/B,CAAC;YAED,MAAM,iBAAiB,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YAE7D,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE;oBACnC,EAAE;oBACF,SAAS,EAAE,WAAW,CAAC,SAAS;iBACjC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,iCAAiC,EAAE,eAAe,WAAW,CAAC,SAAS,GAAG,CAC3E,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;YACjB,OAAO;gBACL,KAAK,EAAE,6BAA6B;gBACpC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;QAEF,0EAA0E;QAC1E,yEAAyE;QACzE,0EAA0E;SACzE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;QACxC,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;gBACjB,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;YAC7C,CAAC;YAED,mCAAmC;YACnC,IAAI,WAAW,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzC,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;oBACpB,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;YAED,MAAM,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAEzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;YACjB,OAAO;gBACL,KAAK,EAAE,+BAA+B;gBACtC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,3 +1,167 @@
1
- import { FastifyPluginAsync } from "fastify";
2
- export declare const sshRoutes: FastifyPluginAsync;
1
+ /**
2
+ * SSH connection management routes (Elysia + KV storage).
3
+ *
4
+ * Namespace: "ssh"
5
+ * Keys:
6
+ * "connections" → JSON array of SSHConnection objects
7
+ */
8
+ import { Elysia } from "elysia";
9
+ import type { HostServices, SSHConnection } from "../types.js";
10
+ export declare function createSSHRoutes(hostServices: HostServices): Elysia<"/api/ssh", {
11
+ decorator: {};
12
+ store: {};
13
+ derive: {};
14
+ resolve: {};
15
+ }, {
16
+ typebox: {};
17
+ error: {};
18
+ }, {
19
+ schema: {};
20
+ standaloneSchema: {};
21
+ macro: {};
22
+ macroFn: {};
23
+ parser: {};
24
+ response: {};
25
+ }, {
26
+ api: {
27
+ ssh: {
28
+ connections: {
29
+ get: {
30
+ body: unknown;
31
+ params: {};
32
+ query: unknown;
33
+ headers: unknown;
34
+ response: {
35
+ 200: {
36
+ connections: (Omit<SSHConnection, "password" | "privateKeyPath"> & {
37
+ privateKeyPath?: string;
38
+ })[];
39
+ };
40
+ };
41
+ };
42
+ };
43
+ };
44
+ };
45
+ } & {
46
+ api: {
47
+ ssh: {
48
+ connections: {
49
+ post: {
50
+ body: unknown;
51
+ params: {};
52
+ query: unknown;
53
+ headers: unknown;
54
+ response: {
55
+ 200: {
56
+ connection: Omit<SSHConnection, "password" | "privateKeyPath"> & {
57
+ privateKeyPath?: string;
58
+ };
59
+ error?: undefined;
60
+ details?: undefined;
61
+ } | {
62
+ error: string;
63
+ details: string;
64
+ connection?: undefined;
65
+ };
66
+ };
67
+ };
68
+ };
69
+ };
70
+ };
71
+ } & {
72
+ api: {
73
+ ssh: {
74
+ execute: {
75
+ post: {
76
+ body: unknown;
77
+ params: {};
78
+ query: unknown;
79
+ headers: unknown;
80
+ response: {};
81
+ };
82
+ };
83
+ };
84
+ };
85
+ } & {
86
+ api: {
87
+ ssh: {
88
+ test: {
89
+ ":connectionId": {
90
+ post: {
91
+ body: unknown;
92
+ params: {
93
+ connectionId: string;
94
+ } & {};
95
+ query: unknown;
96
+ headers: unknown;
97
+ response: {
98
+ 422: {
99
+ type: "validation";
100
+ on: string;
101
+ summary?: string;
102
+ message?: string;
103
+ found?: unknown;
104
+ property?: string;
105
+ expected?: string;
106
+ };
107
+ };
108
+ };
109
+ };
110
+ };
111
+ };
112
+ };
113
+ } & {
114
+ api: {
115
+ ssh: {
116
+ connections: {
117
+ ":id": {
118
+ delete: {
119
+ body: unknown;
120
+ params: {
121
+ id: string;
122
+ } & {};
123
+ query: unknown;
124
+ headers: unknown;
125
+ response: {
126
+ 200: {
127
+ error: string;
128
+ success?: undefined;
129
+ details?: undefined;
130
+ } | {
131
+ success: boolean;
132
+ error?: undefined;
133
+ details?: undefined;
134
+ } | {
135
+ error: string;
136
+ details: string;
137
+ success?: undefined;
138
+ };
139
+ 422: {
140
+ type: "validation";
141
+ on: string;
142
+ summary?: string;
143
+ message?: string;
144
+ found?: unknown;
145
+ property?: string;
146
+ expected?: string;
147
+ };
148
+ };
149
+ };
150
+ };
151
+ };
152
+ };
153
+ };
154
+ }, {
155
+ derive: {};
156
+ resolve: {};
157
+ schema: {};
158
+ standaloneSchema: {};
159
+ response: {};
160
+ }, {
161
+ derive: {};
162
+ resolve: {};
163
+ schema: {};
164
+ standaloneSchema: {};
165
+ response: {};
166
+ }>;
3
167
  //# sourceMappingURL=ssh.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/routes/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAoB7C,eAAO,MAAM,SAAS,EAAE,kBAsOvB,CAAC"}
1
+ {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/routes/ssh.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAGd,MAAM,aAAa,CAAC;AA4ErB,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;iDAxCvC,MAAM;;;;;;;;;;;;;;;;;;;;iDAAN,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2QxB"}