@burdenoff/vibe-plugin-ssh 1.0.1 → 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.
- package/README.md +12 -12
- package/dist/index.d.ts +7 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -14
- package/dist/index.js.map +1 -1
- package/dist/routes/port-forward.d.ts +189 -2
- package/dist/routes/port-forward.d.ts.map +1 -1
- package/dist/routes/port-forward.js +196 -95
- package/dist/routes/port-forward.js.map +1 -1
- package/dist/routes/ssh.d.ts +166 -2
- package/dist/routes/ssh.d.ts.map +1 -1
- package/dist/routes/ssh.js +155 -93
- package/dist/routes/ssh.js.map +1 -1
- package/dist/types.d.ts +79 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -3
- package/dist/types.js.map +1 -1
- package/package.json +16 -15
|
@@ -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
|
-
//
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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 =
|
|
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
|
-
|
|
112
|
+
set.status = 409;
|
|
113
|
+
return { error: "Local port is already in use" };
|
|
22
114
|
}
|
|
23
|
-
const connectionConfig =
|
|
115
|
+
const connectionConfig = await getConnectionById(storage, connectionId);
|
|
24
116
|
if (!connectionConfig) {
|
|
25
|
-
|
|
117
|
+
set.status = 404;
|
|
118
|
+
return { error: "SSH connection not found" };
|
|
26
119
|
}
|
|
27
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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 =
|
|
149
|
+
const portForward = await getPortForwardById(storage, id);
|
|
50
150
|
if (!portForward) {
|
|
51
|
-
|
|
151
|
+
set.status = 404;
|
|
152
|
+
return { error: "Port forward not found" };
|
|
52
153
|
}
|
|
53
154
|
if (portForward.status === "active") {
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
?
|
|
60
|
-
:
|
|
160
|
+
? await getConnectionById(storage, portForward.connectionId)
|
|
161
|
+
: await getConnectionByName(storage, portForward.serverName);
|
|
61
162
|
if (!connectionConfig) {
|
|
62
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
|
|
213
|
+
set.status = 500;
|
|
214
|
+
resolve({
|
|
108
215
|
error: "SSH connection failed",
|
|
109
216
|
details: err.message,
|
|
110
|
-
})
|
|
217
|
+
});
|
|
111
218
|
});
|
|
112
|
-
|
|
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
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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 =
|
|
236
|
+
const portForward = await getPortForwardById(storage, id);
|
|
138
237
|
if (!portForward) {
|
|
139
|
-
|
|
238
|
+
set.status = 404;
|
|
239
|
+
return { error: "Port forward not found" };
|
|
140
240
|
}
|
|
141
241
|
if (portForward.status !== "active") {
|
|
142
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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 =
|
|
277
|
+
const portForward = await getPortForwardById(storage, id);
|
|
172
278
|
if (!portForward) {
|
|
173
|
-
|
|
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
|
-
|
|
291
|
+
await deletePortForwardById(storage, id);
|
|
184
292
|
return { success: true };
|
|
185
293
|
}
|
|
186
294
|
catch (error) {
|
|
187
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"port-forward.js","sourceRoot":"","sources":["../../src/routes/port-forward.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/ssh.d.ts
CHANGED
|
@@ -1,3 +1,167 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
package/dist/routes/ssh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/routes/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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"}
|