@fentaris/edge 0.2.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/dist/agent.d.ts +46 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +271 -0
- package/dist/agent.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +40 -0
- package/dist/cli.js.map +1 -0
- package/dist/enrollment.d.ts +117 -0
- package/dist/enrollment.d.ts.map +1 -0
- package/dist/enrollment.js +186 -0
- package/dist/enrollment.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/platform.d.ts +82 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +112 -0
- package/dist/platform.js.map +1 -0
- package/dist/redaction.d.ts +7 -0
- package/dist/redaction.d.ts.map +1 -0
- package/dist/redaction.js +19 -0
- package/dist/redaction.js.map +1 -0
- package/dist/runtime.d.ts +54 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +162 -0
- package/dist/runtime.js.map +1 -0
- package/dist/setup.d.ts +115 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +427 -0
- package/dist/setup.js.map +1 -0
- package/dist/stdioWorkload.d.ts +7 -0
- package/dist/stdioWorkload.d.ts.map +1 -0
- package/dist/stdioWorkload.js +94 -0
- package/dist/stdioWorkload.js.map +1 -0
- package/dist/supervisor.d.ts +92 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +331 -0
- package/dist/supervisor.js.map +1 -0
- package/package.json +55 -0
package/dist/setup.js
ADDED
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { lstat, realpath } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { emitKeypressEvents } from "node:readline";
|
|
5
|
+
import { createInterface } from "node:readline/promises";
|
|
6
|
+
import { LAUNCH_RECIPE_VERSION, edgeError, isRuntimeValueToken, } from "@fentaris/core";
|
|
7
|
+
/** Interactive terminal prompter that suppresses local secret echo on a TTY. */
|
|
8
|
+
export class NodeTerminalSetupPrompter {
|
|
9
|
+
async confirm(message) {
|
|
10
|
+
const value = (await this.input(`${message} [y/N]:`)).trim().toLowerCase();
|
|
11
|
+
return value === "y" || value === "yes";
|
|
12
|
+
}
|
|
13
|
+
async input(message, options) {
|
|
14
|
+
if (options?.secret && process.stdin.isTTY) {
|
|
15
|
+
return hiddenInput(message);
|
|
16
|
+
}
|
|
17
|
+
const prompt = createInterface({ input: process.stdin, output: process.stdout });
|
|
18
|
+
try {
|
|
19
|
+
return await prompt.question(`${message} `);
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
prompt.close();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Initial terminal setup provider with explicit workload and resource consent. */
|
|
27
|
+
export class TerminalSetupProvider {
|
|
28
|
+
prompt;
|
|
29
|
+
constructor(prompt) {
|
|
30
|
+
this.prompt = prompt;
|
|
31
|
+
}
|
|
32
|
+
approveWorkload(requirement) {
|
|
33
|
+
return this.prompt.confirm(`Allow deployment "${requirement.deploymentId}" to run recipe ${requirement.recipe.digest}?`);
|
|
34
|
+
}
|
|
35
|
+
async collectField(field) {
|
|
36
|
+
const label = field.label ?? field.name;
|
|
37
|
+
if (field.kind === "folder" || field.kind === "file") {
|
|
38
|
+
const approved = await this.prompt.confirm(`Grant ${field.access} access for ${field.kind} "${label}"?`);
|
|
39
|
+
if (!approved)
|
|
40
|
+
return { approved: false };
|
|
41
|
+
}
|
|
42
|
+
const raw = await this.prompt.input(`${label}:`, { secret: field.kind === "secret" });
|
|
43
|
+
return { approved: true, value: parseTerminalValue(field, raw) };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Local setup/grant reconciliation and launch-plan compilation. */
|
|
47
|
+
export class LocalSetupManager {
|
|
48
|
+
options;
|
|
49
|
+
now;
|
|
50
|
+
grantId;
|
|
51
|
+
constructor(options) {
|
|
52
|
+
this.options = options;
|
|
53
|
+
this.now = options.now ?? Date.now;
|
|
54
|
+
this.grantId = options.grantId ?? randomUUID;
|
|
55
|
+
}
|
|
56
|
+
async ingest(requirement) {
|
|
57
|
+
assertDeclarative(requirement.recipe);
|
|
58
|
+
if (requirement.recipe.version !== LAUNCH_RECIPE_VERSION) {
|
|
59
|
+
throw edgeError("EDGE_PROTOCOL", "Unsupported launch recipe version.");
|
|
60
|
+
}
|
|
61
|
+
const database = await this.database();
|
|
62
|
+
const previous = database.states[requirement.deploymentId];
|
|
63
|
+
const grants = { ...database.grants };
|
|
64
|
+
const grantRefs = {};
|
|
65
|
+
const fieldDigests = {};
|
|
66
|
+
const missingFields = [];
|
|
67
|
+
const approved = new Set(database.approvedRecipeDigests);
|
|
68
|
+
const created = [];
|
|
69
|
+
const retired = [];
|
|
70
|
+
if (!approved.has(requirement.recipe.digest)) {
|
|
71
|
+
if (!await this.options.provider.approveWorkload(requirement)) {
|
|
72
|
+
const denied = stateFor(requirement, "denied", {}, {}, Object.keys(requirement.schema.fields));
|
|
73
|
+
await this.save({ ...database, grants, states: { ...database.states, [requirement.deploymentId]: denied } });
|
|
74
|
+
await this.emitTransition(denied);
|
|
75
|
+
return denied;
|
|
76
|
+
}
|
|
77
|
+
approved.add(requirement.recipe.digest);
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
for (const [name, field] of Object.entries(requirement.schema.fields)) {
|
|
81
|
+
const digest = fieldDigest(field);
|
|
82
|
+
fieldDigests[name] = digest;
|
|
83
|
+
const oldGrantId = previous?.grantRefs[name];
|
|
84
|
+
const oldGrant = oldGrantId ? grants[oldGrantId] : undefined;
|
|
85
|
+
if (oldGrant && oldGrant.fieldDigest === digest) {
|
|
86
|
+
grantRefs[name] = oldGrant.id;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (oldGrant) {
|
|
90
|
+
retired.push(oldGrant);
|
|
91
|
+
delete grants[oldGrant.id];
|
|
92
|
+
}
|
|
93
|
+
const response = await this.options.provider.collectField(field, requirement);
|
|
94
|
+
if (!response.approved) {
|
|
95
|
+
if (field.required)
|
|
96
|
+
missingFields.push(name);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const value = response.value ?? defaultValue(field);
|
|
100
|
+
if (value === undefined && !field.required)
|
|
101
|
+
continue;
|
|
102
|
+
if (value === undefined) {
|
|
103
|
+
missingFields.push(name);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const grant = await this.createGrant(requirement.deploymentId, field, digest, value);
|
|
107
|
+
created.push(grant);
|
|
108
|
+
grants[grant.id] = grant;
|
|
109
|
+
grantRefs[name] = grant.id;
|
|
110
|
+
}
|
|
111
|
+
for (const [name, oldGrantId] of Object.entries(previous?.grantRefs ?? {})) {
|
|
112
|
+
if (name in requirement.schema.fields)
|
|
113
|
+
continue;
|
|
114
|
+
const oldGrant = grants[oldGrantId];
|
|
115
|
+
if (oldGrant) {
|
|
116
|
+
retired.push(oldGrant);
|
|
117
|
+
delete grants[oldGrantId];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const status = missingFields.length === 0 ? "ready" : "pending";
|
|
121
|
+
const state = stateFor(requirement, status, grantRefs, fieldDigests, missingFields);
|
|
122
|
+
await this.save({
|
|
123
|
+
grants,
|
|
124
|
+
states: { ...database.states, [requirement.deploymentId]: state },
|
|
125
|
+
approvedRecipeDigests: [...approved],
|
|
126
|
+
});
|
|
127
|
+
await Promise.all(retired.map((grant) => this.deleteGrant(grant)));
|
|
128
|
+
await this.emitTransition(state);
|
|
129
|
+
return state;
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
await Promise.all(created.map((grant) => this.deleteGrant(grant)));
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async status(deploymentId) {
|
|
137
|
+
return (await this.database()).states[deploymentId];
|
|
138
|
+
}
|
|
139
|
+
/** Delete every local grant, setup state, and protected setup secret. */
|
|
140
|
+
async clear() {
|
|
141
|
+
const database = await this.database();
|
|
142
|
+
await Promise.all(Object.values(database.grants).map((grant) => this.deleteGrant(grant)));
|
|
143
|
+
await this.options.store.delete();
|
|
144
|
+
}
|
|
145
|
+
async compileLaunchPlan(requirement) {
|
|
146
|
+
assertDeclarative(requirement.recipe);
|
|
147
|
+
const database = await this.database();
|
|
148
|
+
const state = database.states[requirement.deploymentId];
|
|
149
|
+
if (!state
|
|
150
|
+
|| state.status !== "ready"
|
|
151
|
+
|| state.desiredStateVersion !== requirement.desiredStateVersion
|
|
152
|
+
|| state.recipeDigest !== requirement.recipe.digest
|
|
153
|
+
|| state.setupSchemaVersion !== requirement.schema.version) {
|
|
154
|
+
throw edgeError("EDGE_SETUP_REQUIRED", "Current desired deployment is not locally ready.", {
|
|
155
|
+
details: { deploymentId: requirement.deploymentId },
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
if (!database.approvedRecipeDigests.includes(requirement.recipe.digest)) {
|
|
159
|
+
throw edgeError("EDGE_SETUP_REQUIRED", "Launch recipe has not received local consent.");
|
|
160
|
+
}
|
|
161
|
+
const resolve = async (value) => {
|
|
162
|
+
if (typeof value === "string")
|
|
163
|
+
return value;
|
|
164
|
+
if (!isRuntimeValueToken(value)) {
|
|
165
|
+
throw edgeError("EDGE_PROTOCOL", "Launch recipe contains unsupported executable data.");
|
|
166
|
+
}
|
|
167
|
+
const grantId = state.grantRefs[value.ref];
|
|
168
|
+
const grant = grantId ? database.grants[grantId] : undefined;
|
|
169
|
+
if (!grant) {
|
|
170
|
+
throw edgeError("EDGE_SETUP_REQUIRED", "A required local setup grant is missing.", {
|
|
171
|
+
details: { deploymentId: requirement.deploymentId, field: value.ref },
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
if (value.kind === "secret") {
|
|
175
|
+
if (grant.kind !== "secret")
|
|
176
|
+
throw edgeError("EDGE_GRANT", "Runtime secret references a non-secret grant.");
|
|
177
|
+
const secret = await this.options.credentials.get(secretKey(grant.id));
|
|
178
|
+
if (secret === undefined)
|
|
179
|
+
throw edgeError("EDGE_GRANT", "Local secret grant was revoked.");
|
|
180
|
+
return secret;
|
|
181
|
+
}
|
|
182
|
+
return this.resolveGrantValue(grant);
|
|
183
|
+
};
|
|
184
|
+
const args = await Promise.all(requirement.recipe.args.map(resolve));
|
|
185
|
+
const env = {};
|
|
186
|
+
for (const [name, value] of Object.entries(requirement.recipe.env))
|
|
187
|
+
env[name] = await resolve(value);
|
|
188
|
+
return {
|
|
189
|
+
deploymentId: requirement.deploymentId,
|
|
190
|
+
recipeDigest: requirement.recipe.digest,
|
|
191
|
+
command: requirement.recipe.command,
|
|
192
|
+
args,
|
|
193
|
+
env,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/** Resolve a child path while rechecking canonical containment and access. */
|
|
197
|
+
async resolveGrantedPath(grantId, childPath = ".", requestedAccess = "read") {
|
|
198
|
+
const grant = (await this.database()).grants[grantId];
|
|
199
|
+
if (!grant || (grant.kind !== "folder" && grant.kind !== "file")) {
|
|
200
|
+
throw edgeError("EDGE_GRANT", "Filesystem grant is missing or revoked.");
|
|
201
|
+
}
|
|
202
|
+
if (requestedAccess === "read-write" && grant.access !== "read-write") {
|
|
203
|
+
throw edgeError("EDGE_GRANT", "Write access exceeds the approved local grant.");
|
|
204
|
+
}
|
|
205
|
+
const root = await realpath(grant.canonicalPath);
|
|
206
|
+
if (root !== grant.canonicalPath) {
|
|
207
|
+
throw edgeError("EDGE_GRANT", "Filesystem grant canonical path changed.");
|
|
208
|
+
}
|
|
209
|
+
if (grant.kind === "file") {
|
|
210
|
+
if (childPath !== "." && childPath !== "")
|
|
211
|
+
throw edgeError("EDGE_GRANT", "File grants do not allow child paths.");
|
|
212
|
+
return root;
|
|
213
|
+
}
|
|
214
|
+
const candidate = await realpath(path.resolve(root, childPath));
|
|
215
|
+
const relative = path.relative(root, candidate);
|
|
216
|
+
if (relative.startsWith("..") || path.isAbsolute(relative)) {
|
|
217
|
+
throw edgeError("EDGE_GRANT", "Resolved path escapes the approved local grant.");
|
|
218
|
+
}
|
|
219
|
+
return candidate;
|
|
220
|
+
}
|
|
221
|
+
async revokeGrant(grantId) {
|
|
222
|
+
const database = await this.database();
|
|
223
|
+
const grant = database.grants[grantId];
|
|
224
|
+
if (!grant)
|
|
225
|
+
return;
|
|
226
|
+
await this.deleteGrant(grant);
|
|
227
|
+
const grants = { ...database.grants };
|
|
228
|
+
delete grants[grantId];
|
|
229
|
+
const affected = [];
|
|
230
|
+
const states = {};
|
|
231
|
+
for (const [deploymentId, state] of Object.entries(database.states)) {
|
|
232
|
+
if (!Object.values(state.grantRefs).includes(grantId)) {
|
|
233
|
+
states[deploymentId] = state;
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
affected.push(deploymentId);
|
|
237
|
+
states[deploymentId] = {
|
|
238
|
+
...state,
|
|
239
|
+
status: "revoked",
|
|
240
|
+
missingFields: [...new Set([...state.missingFields, grant.fieldName])],
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
await this.save({ ...database, grants, states });
|
|
244
|
+
await this.options.onGrantRevoked?.(grantId, affected);
|
|
245
|
+
for (const deploymentId of affected) {
|
|
246
|
+
const state = states[deploymentId];
|
|
247
|
+
if (state)
|
|
248
|
+
await this.emitTransition(state);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
async createGrant(deploymentId, field, digest, value) {
|
|
252
|
+
const id = this.grantId();
|
|
253
|
+
const base = {
|
|
254
|
+
id,
|
|
255
|
+
deploymentId,
|
|
256
|
+
fieldName: field.name,
|
|
257
|
+
fieldDigest: digest,
|
|
258
|
+
createdAt: this.now(),
|
|
259
|
+
};
|
|
260
|
+
if (field.kind === "folder" || field.kind === "file") {
|
|
261
|
+
if (typeof value !== "string")
|
|
262
|
+
throw edgeError("EDGE_GRANT", `${field.kind} setup requires a local path.`);
|
|
263
|
+
const canonicalPath = await realpath(value);
|
|
264
|
+
const info = await lstat(canonicalPath);
|
|
265
|
+
if (field.kind === "folder" ? !info.isDirectory() : !info.isFile()) {
|
|
266
|
+
throw edgeError("EDGE_GRANT", `Selected path is not a ${field.kind}.`);
|
|
267
|
+
}
|
|
268
|
+
return { ...base, kind: field.kind, canonicalPath, access: field.access };
|
|
269
|
+
}
|
|
270
|
+
if (field.kind === "secret") {
|
|
271
|
+
if (typeof value !== "string" || value.length === 0)
|
|
272
|
+
throw edgeError("EDGE_GRANT", "Secret setup requires a value.");
|
|
273
|
+
await this.options.credentials.set(secretKey(id), value);
|
|
274
|
+
return { ...base, kind: "secret" };
|
|
275
|
+
}
|
|
276
|
+
const scalar = validateScalar(field, value);
|
|
277
|
+
return { ...base, kind: field.kind, value: scalar };
|
|
278
|
+
}
|
|
279
|
+
async resolveGrantValue(grant) {
|
|
280
|
+
if (grant.kind === "folder" || grant.kind === "file") {
|
|
281
|
+
return this.resolveGrantedPath(grant.id);
|
|
282
|
+
}
|
|
283
|
+
if (grant.kind === "secret") {
|
|
284
|
+
throw edgeError("EDGE_GRANT", "Secret grant requires a runtime.secret reference.");
|
|
285
|
+
}
|
|
286
|
+
if ("value" in grant)
|
|
287
|
+
return String(grant.value);
|
|
288
|
+
throw edgeError("EDGE_GRANT", "Unsupported local grant value.");
|
|
289
|
+
}
|
|
290
|
+
async deleteGrant(grant) {
|
|
291
|
+
if (grant.kind === "secret")
|
|
292
|
+
await this.options.credentials.delete(secretKey(grant.id));
|
|
293
|
+
}
|
|
294
|
+
async database() {
|
|
295
|
+
return await this.options.store.load() ?? { grants: {}, states: {}, approvedRecipeDigests: [] };
|
|
296
|
+
}
|
|
297
|
+
save(database) {
|
|
298
|
+
return this.options.store.save(database);
|
|
299
|
+
}
|
|
300
|
+
async emitTransition(state) {
|
|
301
|
+
await this.options.telemetry?.emit({
|
|
302
|
+
name: "edge.setup.transition",
|
|
303
|
+
deploymentId: state.deploymentId,
|
|
304
|
+
outcome: state.status,
|
|
305
|
+
metadata: {
|
|
306
|
+
desiredStateVersion: state.desiredStateVersion,
|
|
307
|
+
recipeDigest: state.recipeDigest,
|
|
308
|
+
setupSchemaVersion: state.setupSchemaVersion,
|
|
309
|
+
missingFields: state.missingFields,
|
|
310
|
+
},
|
|
311
|
+
}).catch(() => undefined);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
function stateFor(requirement, status, grantRefs, fieldDigests, missingFields) {
|
|
315
|
+
return {
|
|
316
|
+
deploymentId: requirement.deploymentId,
|
|
317
|
+
desiredStateVersion: requirement.desiredStateVersion,
|
|
318
|
+
recipeDigest: requirement.recipe.digest,
|
|
319
|
+
setupSchemaVersion: requirement.schema.version,
|
|
320
|
+
status,
|
|
321
|
+
grantRefs,
|
|
322
|
+
fieldDigests,
|
|
323
|
+
missingFields,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
function fieldDigest(field) {
|
|
327
|
+
return JSON.stringify(canonicalize(field));
|
|
328
|
+
}
|
|
329
|
+
function secretKey(grantId) {
|
|
330
|
+
return `setup-secret:${grantId}`;
|
|
331
|
+
}
|
|
332
|
+
function defaultValue(field) {
|
|
333
|
+
return "default" in field ? field.default : undefined;
|
|
334
|
+
}
|
|
335
|
+
function validateScalar(field, value) {
|
|
336
|
+
switch (field.kind) {
|
|
337
|
+
case "string":
|
|
338
|
+
if (typeof value !== "string")
|
|
339
|
+
break;
|
|
340
|
+
return value;
|
|
341
|
+
case "boolean":
|
|
342
|
+
if (typeof value !== "boolean")
|
|
343
|
+
break;
|
|
344
|
+
return value;
|
|
345
|
+
case "number":
|
|
346
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
347
|
+
break;
|
|
348
|
+
if (field.min !== undefined && value < field.min)
|
|
349
|
+
break;
|
|
350
|
+
if (field.max !== undefined && value > field.max)
|
|
351
|
+
break;
|
|
352
|
+
return value;
|
|
353
|
+
case "select":
|
|
354
|
+
if (typeof value !== "string" || !field.options.some((option) => option.value === value))
|
|
355
|
+
break;
|
|
356
|
+
return value;
|
|
357
|
+
default:
|
|
358
|
+
throw edgeError("EDGE_GRANT", `Field "${field.name}" is not scalar.`);
|
|
359
|
+
}
|
|
360
|
+
throw edgeError("EDGE_GRANT", `Invalid local value for ${field.kind} field "${field.name}".`);
|
|
361
|
+
}
|
|
362
|
+
function parseTerminalValue(field, raw) {
|
|
363
|
+
if (field.kind === "boolean") {
|
|
364
|
+
if (raw === "true" || raw === "yes")
|
|
365
|
+
return true;
|
|
366
|
+
if (raw === "false" || raw === "no")
|
|
367
|
+
return false;
|
|
368
|
+
return raw;
|
|
369
|
+
}
|
|
370
|
+
if (field.kind === "number")
|
|
371
|
+
return Number(raw);
|
|
372
|
+
return raw;
|
|
373
|
+
}
|
|
374
|
+
function assertDeclarative(value, seen = new Set()) {
|
|
375
|
+
if (typeof value === "function" || typeof value === "symbol") {
|
|
376
|
+
throw edgeError("EDGE_PROTOCOL", "Launch recipe contains executable code.");
|
|
377
|
+
}
|
|
378
|
+
if (!value || typeof value !== "object" || seen.has(value))
|
|
379
|
+
return;
|
|
380
|
+
seen.add(value);
|
|
381
|
+
for (const child of Object.values(value))
|
|
382
|
+
assertDeclarative(child, seen);
|
|
383
|
+
}
|
|
384
|
+
function canonicalize(value) {
|
|
385
|
+
if (Array.isArray(value))
|
|
386
|
+
return value.map(canonicalize);
|
|
387
|
+
if (!value || typeof value !== "object")
|
|
388
|
+
return value;
|
|
389
|
+
return Object.fromEntries(Object.entries(value)
|
|
390
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
391
|
+
.map(([key, child]) => [key, canonicalize(child)]));
|
|
392
|
+
}
|
|
393
|
+
function hiddenInput(message) {
|
|
394
|
+
process.stdout.write(`${message} `);
|
|
395
|
+
emitKeypressEvents(process.stdin);
|
|
396
|
+
process.stdin.setRawMode(true);
|
|
397
|
+
process.stdin.resume();
|
|
398
|
+
return new Promise((resolve, reject) => {
|
|
399
|
+
let value = "";
|
|
400
|
+
const onKeypress = (character, key) => {
|
|
401
|
+
if (key.ctrl && key.name === "c") {
|
|
402
|
+
finish();
|
|
403
|
+
reject(new Error("Terminal input cancelled"));
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
if (key.name === "return" || key.name === "enter") {
|
|
407
|
+
finish();
|
|
408
|
+
resolve(value);
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
if (key.name === "backspace") {
|
|
412
|
+
value = value.slice(0, -1);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
if (character && !key.ctrl)
|
|
416
|
+
value += character;
|
|
417
|
+
};
|
|
418
|
+
const finish = () => {
|
|
419
|
+
process.stdin.off("keypress", onKeypress);
|
|
420
|
+
process.stdin.setRawMode(false);
|
|
421
|
+
process.stdin.pause();
|
|
422
|
+
process.stdout.write("\n");
|
|
423
|
+
};
|
|
424
|
+
process.stdin.on("keypress", onKeypress);
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CompiledLocalLaunchPlan } from "./setup.js";
|
|
2
|
+
import type { EdgeWorkload, EdgeWorkloadFactory } from "./supervisor.js";
|
|
3
|
+
/** Production workload factory backed by one stdio MCP client per workload. */
|
|
4
|
+
export declare class StdioEdgeWorkloadFactory implements EdgeWorkloadFactory {
|
|
5
|
+
start(plan: CompiledLocalLaunchPlan, signal: AbortSignal): Promise<EdgeWorkload>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=stdioWorkload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdioWorkload.d.ts","sourceRoot":"","sources":["../src/stdioWorkload.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EAGpB,MAAM,iBAAiB,CAAC;AAqDzB,+EAA+E;AAC/E,qBAAa,wBAAyB,YAAW,mBAAmB;IAC5D,KAAK,CAAC,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CAmBvF"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { StdioTransport, edgeError, } from "@fentaris/core";
|
|
2
|
+
class StdioLocalMcpClient {
|
|
3
|
+
transport;
|
|
4
|
+
constructor(transport) {
|
|
5
|
+
this.transport = transport;
|
|
6
|
+
}
|
|
7
|
+
async request(operation, params, signal) {
|
|
8
|
+
const pending = this.dispatch(operation, params);
|
|
9
|
+
return abortable(pending, signal, () => this.transport.close());
|
|
10
|
+
}
|
|
11
|
+
async capabilityManifest() {
|
|
12
|
+
const capabilities = await this.transport.serverCapabilities();
|
|
13
|
+
const [tools, resources, resourceTemplates, prompts] = await Promise.all([
|
|
14
|
+
this.transport.listTools().then((result) => result.tools),
|
|
15
|
+
this.transport.listResources().then((result) => result.resources),
|
|
16
|
+
this.transport.listResourceTemplates().then((result) => result.resourceTemplates),
|
|
17
|
+
this.transport.listPrompts().then((result) => result.prompts),
|
|
18
|
+
]);
|
|
19
|
+
return {
|
|
20
|
+
tools,
|
|
21
|
+
resources,
|
|
22
|
+
resourceTemplates,
|
|
23
|
+
prompts,
|
|
24
|
+
supportsCompletion: Boolean(capabilities?.completions),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
dispatch(operation, params) {
|
|
28
|
+
switch (operation) {
|
|
29
|
+
case "tools/list":
|
|
30
|
+
return this.transport.listTools(params);
|
|
31
|
+
case "tools/call":
|
|
32
|
+
return this.transport.callTool(params);
|
|
33
|
+
case "resources/list":
|
|
34
|
+
return this.transport.listResources(params);
|
|
35
|
+
case "resources/read":
|
|
36
|
+
return this.transport.readResource(params);
|
|
37
|
+
case "resources/templates/list":
|
|
38
|
+
return this.transport.listResourceTemplates(params);
|
|
39
|
+
case "prompts/list":
|
|
40
|
+
return this.transport.listPrompts(params);
|
|
41
|
+
case "prompts/get":
|
|
42
|
+
return this.transport.getPrompt(params);
|
|
43
|
+
case "completion/complete":
|
|
44
|
+
return this.transport.complete(params);
|
|
45
|
+
case "ping":
|
|
46
|
+
return Promise.resolve({});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Production workload factory backed by one stdio MCP client per workload. */
|
|
51
|
+
export class StdioEdgeWorkloadFactory {
|
|
52
|
+
async start(plan, signal) {
|
|
53
|
+
const transport = new StdioTransport({
|
|
54
|
+
command: plan.command,
|
|
55
|
+
args: [...plan.args],
|
|
56
|
+
env: { ...plan.env },
|
|
57
|
+
clientName: "fentaris-edge",
|
|
58
|
+
});
|
|
59
|
+
try {
|
|
60
|
+
await abortable(transport.serverCapabilities(), signal, () => transport.close());
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
await transport.close().catch(() => undefined);
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
client: new StdioLocalMcpClient(transport),
|
|
68
|
+
stopGracefully: () => transport.close(),
|
|
69
|
+
forceKill: () => transport.close(),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function abortable(pending, signal, onAbort) {
|
|
74
|
+
if (signal.aborted) {
|
|
75
|
+
void onAbort();
|
|
76
|
+
return Promise.reject(edgeError("EDGE_WORKLOAD", "Edge MCP operation was cancelled."));
|
|
77
|
+
}
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
const aborted = () => {
|
|
80
|
+
signal.removeEventListener("abort", aborted);
|
|
81
|
+
reject(edgeError("EDGE_WORKLOAD", "Edge MCP operation was cancelled."));
|
|
82
|
+
void onAbort();
|
|
83
|
+
};
|
|
84
|
+
signal.addEventListener("abort", aborted, { once: true });
|
|
85
|
+
pending.then((value) => {
|
|
86
|
+
signal.removeEventListener("abort", aborted);
|
|
87
|
+
resolve(value);
|
|
88
|
+
}, (error) => {
|
|
89
|
+
signal.removeEventListener("abort", aborted);
|
|
90
|
+
reject(error);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=stdioWorkload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdioWorkload.js","sourceRoot":"","sources":["../src/stdioWorkload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { type EdgeMcpCancelEnvelope, type EdgeMcpErrorEnvelope, type EdgeMcpOperation, type EdgeMcpRequestEnvelope, type EdgeMcpResultEnvelope, type EdgeTelemetry } from "@fentaris/core";
|
|
2
|
+
import { type CompiledLocalLaunchPlan, type DesiredSetupRequirement, type LocalSetupManager } from "./setup.js";
|
|
3
|
+
export interface LocalMcpClient {
|
|
4
|
+
request(operation: EdgeMcpOperation, params: unknown, signal: AbortSignal): Promise<unknown>;
|
|
5
|
+
capabilityManifest?(): Promise<LocalMcpCapabilityManifest>;
|
|
6
|
+
}
|
|
7
|
+
export interface LocalMcpCapabilityManifest {
|
|
8
|
+
readonly tools: readonly unknown[];
|
|
9
|
+
readonly resources: readonly unknown[];
|
|
10
|
+
readonly resourceTemplates: readonly unknown[];
|
|
11
|
+
readonly prompts: readonly unknown[];
|
|
12
|
+
readonly supportsCompletion: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface EdgeWorkload {
|
|
15
|
+
readonly client: LocalMcpClient;
|
|
16
|
+
stopGracefully(): Promise<void>;
|
|
17
|
+
forceKill(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export interface EdgeWorkloadFactory {
|
|
20
|
+
start(plan: CompiledLocalLaunchPlan, signal: AbortSignal): Promise<EdgeWorkload>;
|
|
21
|
+
}
|
|
22
|
+
export interface SupervisedDesiredDeployment {
|
|
23
|
+
readonly requirement: DesiredSetupRequirement;
|
|
24
|
+
}
|
|
25
|
+
export interface EdgeWorkloadPolicy {
|
|
26
|
+
allow(plan: CompiledLocalLaunchPlan): boolean | Promise<boolean>;
|
|
27
|
+
}
|
|
28
|
+
export interface EdgeWorkloadSupervisorOptions {
|
|
29
|
+
readonly setup: LocalSetupManager;
|
|
30
|
+
readonly factory: EdgeWorkloadFactory;
|
|
31
|
+
readonly executablePolicy?: EdgeWorkloadPolicy;
|
|
32
|
+
readonly maxConcurrentWorkloads?: number;
|
|
33
|
+
readonly startupTimeoutMs?: number;
|
|
34
|
+
readonly operationTimeoutMs?: number;
|
|
35
|
+
readonly shutdownTimeoutMs?: number;
|
|
36
|
+
readonly idleLeaseMs?: number;
|
|
37
|
+
readonly maxOutputBytes?: number;
|
|
38
|
+
readonly reportCapabilityManifest?: (deploymentId: string, recipeDigest: string, manifest: LocalMcpCapabilityManifest) => void | Promise<void>;
|
|
39
|
+
readonly telemetry?: EdgeTelemetry;
|
|
40
|
+
readonly now?: () => number;
|
|
41
|
+
}
|
|
42
|
+
export interface DeploymentReconcileResult {
|
|
43
|
+
readonly deploymentId: string;
|
|
44
|
+
readonly status: "ready" | "blocked" | "removed";
|
|
45
|
+
readonly reason?: string;
|
|
46
|
+
}
|
|
47
|
+
/** Governed per-session MCP workload supervisor for cloud-defined deployments. */
|
|
48
|
+
export declare class EdgeWorkloadSupervisor {
|
|
49
|
+
private readonly options;
|
|
50
|
+
private readonly desired;
|
|
51
|
+
private readonly workloads;
|
|
52
|
+
private readonly starting;
|
|
53
|
+
private readonly requests;
|
|
54
|
+
private readonly locallyDenied;
|
|
55
|
+
private readonly blocked;
|
|
56
|
+
private readonly now;
|
|
57
|
+
private readonly limits;
|
|
58
|
+
constructor(options: EdgeWorkloadSupervisorOptions);
|
|
59
|
+
/** Reconcile only the cloud-defined desired deployment set. */
|
|
60
|
+
reconcile(deployments: readonly SupervisedDesiredDeployment[]): Promise<DeploymentReconcileResult[]>;
|
|
61
|
+
/** Handle one correlated edge protocol MCP request. */
|
|
62
|
+
handleRequest(request: EdgeMcpRequestEnvelope): Promise<EdgeMcpResultEnvelope | EdgeMcpErrorEnvelope>;
|
|
63
|
+
/** Propagate a correlated cancellation to the local MCP client signal. */
|
|
64
|
+
handleCancel(cancel: EdgeMcpCancelEnvelope): boolean;
|
|
65
|
+
/** Sticky local denial overrides all replayed desired state. */
|
|
66
|
+
denyDeployment(deploymentId: string): Promise<void>;
|
|
67
|
+
/** Explicit local action required before a denied deployment may run again. */
|
|
68
|
+
renewConsent(deploymentId: string): void;
|
|
69
|
+
/** Mark a deployment blocked after grant/workload revocation. */
|
|
70
|
+
blockDeployment(deploymentId: string): Promise<void>;
|
|
71
|
+
endSession(sessionId: string): Promise<void>;
|
|
72
|
+
sweepIdle(): Promise<readonly string[]>;
|
|
73
|
+
shutdown(): Promise<void>;
|
|
74
|
+
activeWorkloadCount(): number;
|
|
75
|
+
private workloadFor;
|
|
76
|
+
private startWorkload;
|
|
77
|
+
private stopDeployment;
|
|
78
|
+
private stopRecord;
|
|
79
|
+
private emitLifecycle;
|
|
80
|
+
}
|
|
81
|
+
export interface ExecutableAllowlistPolicyOptions {
|
|
82
|
+
readonly executables?: readonly string[];
|
|
83
|
+
readonly packages?: readonly string[];
|
|
84
|
+
}
|
|
85
|
+
/** Exact executable/package allowlist suitable for local edge launch policy. */
|
|
86
|
+
export declare class ExecutableAllowlistPolicy implements EdgeWorkloadPolicy {
|
|
87
|
+
private readonly executables;
|
|
88
|
+
private readonly packages;
|
|
89
|
+
constructor(options: ExecutableAllowlistPolicyOptions);
|
|
90
|
+
allow(plan: CompiledLocalLaunchPlan): boolean;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=supervisor.d.ts.map
|