@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/agent.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { EdgeEnrollmentService, type DeviceAuthorizationRequest, type EdgeConnection, type EdgeConnectionClient } from "./enrollment.js";
|
|
2
|
+
import { type EdgePlatform } from "./platform.js";
|
|
3
|
+
import { type EdgeConnectionRuntime, type EdgeRuntimeSummary, type EdgeRuntimeSummaryProvider } from "./runtime.js";
|
|
4
|
+
export type { EdgeRuntimeSummary, EdgeRuntimeSummaryProvider } from "./runtime.js";
|
|
5
|
+
export interface EdgeAgentStatus extends EdgeRuntimeSummary {
|
|
6
|
+
readonly enrolled: boolean;
|
|
7
|
+
readonly connected: boolean;
|
|
8
|
+
readonly edgeNodeId?: string;
|
|
9
|
+
readonly tenantId?: string;
|
|
10
|
+
readonly enrolledAt?: number;
|
|
11
|
+
readonly connectedAt?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface EdgeAgentOptions {
|
|
14
|
+
enrollment: EdgeEnrollmentService;
|
|
15
|
+
connection: EdgeConnectionClient;
|
|
16
|
+
platform: EdgePlatform;
|
|
17
|
+
runtime?: EdgeConnectionRuntime;
|
|
18
|
+
runtimeSummary?: EdgeRuntimeSummaryProvider;
|
|
19
|
+
}
|
|
20
|
+
/** Enrollment and connection lifecycle used by the CLI and embedders. */
|
|
21
|
+
export declare class EdgeAgent {
|
|
22
|
+
private readonly options;
|
|
23
|
+
private active?;
|
|
24
|
+
constructor(options: EdgeAgentOptions);
|
|
25
|
+
login(): Promise<import("./enrollment.js").EdgeLoginResult>;
|
|
26
|
+
connect(): Promise<void>;
|
|
27
|
+
reconnect(): Promise<void>;
|
|
28
|
+
status(): Promise<EdgeAgentStatus>;
|
|
29
|
+
disconnect(): Promise<void>;
|
|
30
|
+
revoke(): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
/** WebSocket connector that proves possession of the enrolled device key. */
|
|
33
|
+
export declare class WebSocketEdgeConnectionClient implements EdgeConnectionClient {
|
|
34
|
+
private readonly webSocketFactory;
|
|
35
|
+
constructor(webSocketFactory?: (url: string) => WebSocket);
|
|
36
|
+
connect(input: Parameters<EdgeConnectionClient["connect"]>[0]): Promise<EdgeConnection>;
|
|
37
|
+
}
|
|
38
|
+
export interface DefaultAgentOptions {
|
|
39
|
+
readonly controlPlaneUrl: string;
|
|
40
|
+
readonly platform?: EdgePlatform;
|
|
41
|
+
readonly onVerification: (request: DeviceAuthorizationRequest) => void | Promise<void>;
|
|
42
|
+
readonly executableAllowlist?: readonly string[];
|
|
43
|
+
readonly packageAllowlist?: readonly string[];
|
|
44
|
+
}
|
|
45
|
+
export declare function createDefaultEdgeAgent(options: DefaultAgentOptions): EdgeAgent;
|
|
46
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,qBAAqB,EAGrB,KAAK,0BAA0B,EAC/B,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAChC,MAAM,cAAc,CAAC;AAatB,YAAY,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAEnF,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,qBAAqB,CAAC;IAClC,UAAU,EAAE,oBAAoB,CAAC;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,cAAc,CAAC,EAAE,0BAA0B,CAAC;CAC7C;AAED,yEAAyE;AACzE,qBAAa,SAAS;IAGR,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,MAAM,CAAC,CAAiB;gBAEH,OAAO,EAAE,gBAAgB;IAEhD,KAAK;IAML,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAK1B,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAoBlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAM9B;AAED,6EAA6E;AAC7E,qBAAa,6BAA8B,YAAW,oBAAoB;IAC5D,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAuC;IAEjG,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;CAgI9F;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/C;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,CA0C9E"}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { randomBytes, sign } from "node:crypto";
|
|
2
|
+
import { hostname } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { EDGE_PROTOCOL_VERSION, edgeError, parseEdgeProtocolMessage, } from "@fentaris/core";
|
|
5
|
+
import { EdgeEnrollmentService, HttpDeviceAuthorizationProvider, HttpEdgeEnrollmentClient, } from "./enrollment.js";
|
|
6
|
+
import { ProtectedJsonStore, nodeEdgePlatform, } from "./platform.js";
|
|
7
|
+
import { EdgeAgentRuntime, } from "./runtime.js";
|
|
8
|
+
import { LocalSetupManager, NodeTerminalSetupPrompter, TerminalSetupProvider, } from "./setup.js";
|
|
9
|
+
import { EdgeWorkloadSupervisor, ExecutableAllowlistPolicy, } from "./supervisor.js";
|
|
10
|
+
import { StdioEdgeWorkloadFactory } from "./stdioWorkload.js";
|
|
11
|
+
/** Enrollment and connection lifecycle used by the CLI and embedders. */
|
|
12
|
+
export class EdgeAgent {
|
|
13
|
+
options;
|
|
14
|
+
active;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.options = options;
|
|
17
|
+
}
|
|
18
|
+
async login() {
|
|
19
|
+
const login = await this.options.enrollment.login();
|
|
20
|
+
await this.connect();
|
|
21
|
+
return login;
|
|
22
|
+
}
|
|
23
|
+
async connect() {
|
|
24
|
+
if (this.active)
|
|
25
|
+
return;
|
|
26
|
+
const credentials = await this.options.enrollment.connectionCredentials();
|
|
27
|
+
this.active = await this.options.connection.connect({
|
|
28
|
+
gatewayUrl: credentials.config.gatewayUrl,
|
|
29
|
+
edgeNodeId: credentials.config.edgeNodeId,
|
|
30
|
+
tenantId: credentials.config.tenantId,
|
|
31
|
+
deviceCredential: credentials.deviceCredential,
|
|
32
|
+
accessToken: credentials.accessToken,
|
|
33
|
+
publicKey: credentials.keyPair.publicKey,
|
|
34
|
+
privateKey: credentials.keyPair.privateKey,
|
|
35
|
+
runtime: this.options.runtime,
|
|
36
|
+
});
|
|
37
|
+
const active = this.active;
|
|
38
|
+
void active.closed?.finally(() => {
|
|
39
|
+
if (this.active === active)
|
|
40
|
+
this.active = undefined;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async reconnect() {
|
|
44
|
+
await this.disconnect();
|
|
45
|
+
await this.connect();
|
|
46
|
+
}
|
|
47
|
+
async status() {
|
|
48
|
+
const config = await this.options.platform.configStore.load();
|
|
49
|
+
const summary = await this.options.runtimeSummary?.summary() ?? {
|
|
50
|
+
desiredDeployments: 0,
|
|
51
|
+
readyDeployments: 0,
|
|
52
|
+
blockedDeployments: 0,
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
...summary,
|
|
56
|
+
enrolled: Boolean(config),
|
|
57
|
+
connected: Boolean(this.active),
|
|
58
|
+
...(config ? {
|
|
59
|
+
edgeNodeId: config.edgeNodeId,
|
|
60
|
+
tenantId: config.tenantId,
|
|
61
|
+
enrolledAt: config.enrolledAt,
|
|
62
|
+
} : {}),
|
|
63
|
+
...(this.active ? { connectedAt: this.active.connectedAt } : {}),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async disconnect() {
|
|
67
|
+
const active = this.active;
|
|
68
|
+
this.active = undefined;
|
|
69
|
+
await active?.close();
|
|
70
|
+
}
|
|
71
|
+
async revoke() {
|
|
72
|
+
await this.options.enrollment.revokeRemote();
|
|
73
|
+
await this.disconnect();
|
|
74
|
+
await this.options.runtime?.clearLocalState?.();
|
|
75
|
+
await this.options.enrollment.clearLocalIdentity();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** WebSocket connector that proves possession of the enrolled device key. */
|
|
79
|
+
export class WebSocketEdgeConnectionClient {
|
|
80
|
+
webSocketFactory;
|
|
81
|
+
constructor(webSocketFactory = (url) => new WebSocket(url)) {
|
|
82
|
+
this.webSocketFactory = webSocketFactory;
|
|
83
|
+
}
|
|
84
|
+
async connect(input) {
|
|
85
|
+
const url = new URL(input.gatewayUrl);
|
|
86
|
+
if (url.protocol !== "wss:" && !(url.protocol === "ws:" && isLoopback(url.hostname))) {
|
|
87
|
+
throw new Error("Edge gateway must use wss:// except for loopback development");
|
|
88
|
+
}
|
|
89
|
+
const socket = this.webSocketFactory(url.toString());
|
|
90
|
+
const nonce = randomBytes(32).toString("base64url");
|
|
91
|
+
const proof = sign(null, Buffer.from(`${input.edgeNodeId}.${nonce}`), input.privateKey).toString("base64url");
|
|
92
|
+
let ack;
|
|
93
|
+
let heartbeat;
|
|
94
|
+
let runtimeDisconnected = false;
|
|
95
|
+
let resolveClosed;
|
|
96
|
+
const closed = new Promise((resolve) => {
|
|
97
|
+
resolveClosed = resolve;
|
|
98
|
+
});
|
|
99
|
+
const disconnectRuntime = async () => {
|
|
100
|
+
if (runtimeDisconnected)
|
|
101
|
+
return;
|
|
102
|
+
runtimeDisconnected = true;
|
|
103
|
+
if (heartbeat)
|
|
104
|
+
clearInterval(heartbeat);
|
|
105
|
+
try {
|
|
106
|
+
await input.runtime?.disconnected();
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
resolveClosed();
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
const send = async (message) => {
|
|
113
|
+
if (socket.readyState !== WebSocket.OPEN) {
|
|
114
|
+
throw edgeError("EDGE_UNAVAILABLE", "Edge gateway connection is closed.");
|
|
115
|
+
}
|
|
116
|
+
socket.send(JSON.stringify(message));
|
|
117
|
+
};
|
|
118
|
+
let processing = Promise.resolve();
|
|
119
|
+
const authenticated = new Promise((resolve, reject) => {
|
|
120
|
+
const fail = (error) => {
|
|
121
|
+
reject(error);
|
|
122
|
+
try {
|
|
123
|
+
socket.close(4403, "edge protocol rejected");
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
void disconnectRuntime();
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
socket.addEventListener("error", () => {
|
|
130
|
+
if (!ack)
|
|
131
|
+
reject(new Error("Unable to establish the edge gateway connection"));
|
|
132
|
+
});
|
|
133
|
+
socket.addEventListener("open", () => {
|
|
134
|
+
socket.send(JSON.stringify({
|
|
135
|
+
version: EDGE_PROTOCOL_VERSION,
|
|
136
|
+
kind: "edge.hello",
|
|
137
|
+
tenantId: input.tenantId,
|
|
138
|
+
edgeNodeId: input.edgeNodeId,
|
|
139
|
+
supportedVersions: [EDGE_PROTOCOL_VERSION],
|
|
140
|
+
nonce,
|
|
141
|
+
proof,
|
|
142
|
+
deviceCredential: input.deviceCredential,
|
|
143
|
+
accessToken: input.accessToken,
|
|
144
|
+
publicKey: input.publicKey,
|
|
145
|
+
}));
|
|
146
|
+
}, { once: true });
|
|
147
|
+
socket.addEventListener("message", (event) => {
|
|
148
|
+
processing = processing.then(async () => {
|
|
149
|
+
try {
|
|
150
|
+
const message = parseEdgeProtocolMessage(String(event.data));
|
|
151
|
+
if (!ack) {
|
|
152
|
+
if (message.kind !== "edge.hello.ack") {
|
|
153
|
+
throw edgeError("EDGE_PROTOCOL", "Unexpected edge gateway handshake response.");
|
|
154
|
+
}
|
|
155
|
+
if (message.tenantId !== input.tenantId || message.edgeNodeId !== input.edgeNodeId) {
|
|
156
|
+
throw edgeError("EDGE_PROTOCOL", "Edge gateway acknowledged a different device identity.");
|
|
157
|
+
}
|
|
158
|
+
ack = message;
|
|
159
|
+
await input.runtime?.connected({
|
|
160
|
+
claims: {
|
|
161
|
+
tenantId: message.tenantId,
|
|
162
|
+
edgeNodeId: message.edgeNodeId,
|
|
163
|
+
connectionGeneration: message.connectionGeneration,
|
|
164
|
+
},
|
|
165
|
+
send,
|
|
166
|
+
});
|
|
167
|
+
heartbeat = setInterval(() => {
|
|
168
|
+
if (!ack || socket.readyState !== WebSocket.OPEN)
|
|
169
|
+
return;
|
|
170
|
+
void send({
|
|
171
|
+
version: EDGE_PROTOCOL_VERSION,
|
|
172
|
+
kind: "edge.heartbeat",
|
|
173
|
+
tenantId: ack.tenantId,
|
|
174
|
+
edgeNodeId: ack.edgeNodeId,
|
|
175
|
+
connectionGeneration: ack.connectionGeneration,
|
|
176
|
+
sentAt: Date.now(),
|
|
177
|
+
}).catch(() => socket.close(1011, "edge heartbeat failed"));
|
|
178
|
+
}, 10_000);
|
|
179
|
+
heartbeat.unref?.();
|
|
180
|
+
resolve(message);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (message.kind === "edge.hello.ack" || message.kind === "edge.hello") {
|
|
184
|
+
throw edgeError("EDGE_PROTOCOL", "Unexpected edge handshake frame after authentication.");
|
|
185
|
+
}
|
|
186
|
+
if (message.kind !== "edge.desired-state"
|
|
187
|
+
&& message.kind !== "mcp.request"
|
|
188
|
+
&& message.kind !== "mcp.cancel") {
|
|
189
|
+
throw edgeError("EDGE_PROTOCOL", "Unexpected message kind from the edge control plane.");
|
|
190
|
+
}
|
|
191
|
+
await input.runtime?.handle(message);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
fail(error);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
socket.addEventListener("close", () => {
|
|
199
|
+
void disconnectRuntime();
|
|
200
|
+
if (!ack)
|
|
201
|
+
reject(edgeError("EDGE_UNAVAILABLE", "Edge socket closed during authentication."));
|
|
202
|
+
}, { once: true });
|
|
203
|
+
});
|
|
204
|
+
const authenticatedAck = await authenticated;
|
|
205
|
+
return {
|
|
206
|
+
connectedAt: authenticatedAck.serverTime,
|
|
207
|
+
closed,
|
|
208
|
+
close: () => new Promise((resolve) => {
|
|
209
|
+
if (socket.readyState === WebSocket.CLOSED) {
|
|
210
|
+
void disconnectRuntime().then(resolve);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
closed.then(resolve);
|
|
214
|
+
socket.close(1000, "local disconnect");
|
|
215
|
+
}),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
export function createDefaultEdgeAgent(options) {
|
|
220
|
+
const platform = options.platform ?? nodeEdgePlatform();
|
|
221
|
+
const enrollment = new EdgeEnrollmentService({
|
|
222
|
+
platform,
|
|
223
|
+
authorization: new HttpDeviceAuthorizationProvider(options.controlPlaneUrl),
|
|
224
|
+
enrollment: new HttpEdgeEnrollmentClient(options.controlPlaneUrl),
|
|
225
|
+
callbacks: { onVerification: options.onVerification },
|
|
226
|
+
hostnameLabel: hostname,
|
|
227
|
+
});
|
|
228
|
+
const runtimeRef = {};
|
|
229
|
+
const setup = new LocalSetupManager({
|
|
230
|
+
store: new ProtectedJsonStore(path.join(platform.paths.dataDir, "grants.json")),
|
|
231
|
+
credentials: platform.credentialStore,
|
|
232
|
+
provider: new TerminalSetupProvider(new NodeTerminalSetupPrompter()),
|
|
233
|
+
onGrantRevoked: async (_grantId, deploymentIds) => {
|
|
234
|
+
const activeSupervisor = supervisor;
|
|
235
|
+
await Promise.all(deploymentIds.map((deploymentId) => activeSupervisor.blockDeployment(deploymentId)));
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
const supervisor = new EdgeWorkloadSupervisor({
|
|
239
|
+
setup,
|
|
240
|
+
factory: new StdioEdgeWorkloadFactory(),
|
|
241
|
+
executablePolicy: new ExecutableAllowlistPolicy({
|
|
242
|
+
executables: options.executableAllowlist ?? environmentList("FENTARIS_EDGE_ALLOWED_EXECUTABLES"),
|
|
243
|
+
packages: options.packageAllowlist ?? environmentList("FENTARIS_EDGE_ALLOWED_PACKAGES"),
|
|
244
|
+
}),
|
|
245
|
+
reportCapabilityManifest: (deploymentId, recipeDigest, manifest) => {
|
|
246
|
+
if (!runtimeRef.current) {
|
|
247
|
+
throw edgeError("EDGE_UNAVAILABLE", "Edge runtime is not initialized.");
|
|
248
|
+
}
|
|
249
|
+
return runtimeRef.current.reportCapabilityManifest(deploymentId, recipeDigest, manifest);
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
const runtime = new EdgeAgentRuntime({ setup, supervisor });
|
|
253
|
+
runtimeRef.current = runtime;
|
|
254
|
+
return new EdgeAgent({
|
|
255
|
+
enrollment,
|
|
256
|
+
connection: new WebSocketEdgeConnectionClient(),
|
|
257
|
+
platform,
|
|
258
|
+
runtime,
|
|
259
|
+
runtimeSummary: runtime,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
function isLoopback(host) {
|
|
263
|
+
return host === "localhost" || host === "127.0.0.1" || host === "::1";
|
|
264
|
+
}
|
|
265
|
+
function environmentList(name) {
|
|
266
|
+
return (process.env[name] ?? "")
|
|
267
|
+
.split(",")
|
|
268
|
+
.map((value) => value.trim())
|
|
269
|
+
.filter(Boolean);
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { EdgeAgent } from "./agent.js";
|
|
2
|
+
export interface EdgeCliIo {
|
|
3
|
+
out(value: string): void;
|
|
4
|
+
error(value: string): void;
|
|
5
|
+
}
|
|
6
|
+
export declare function runEdgeCli(argv: readonly string[], agent: EdgeAgent, io: EdgeCliIo): Promise<number>;
|
|
7
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAoC1G"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { redactEdgeValue, safeEdgeError } from "./redaction.js";
|
|
2
|
+
export async function runEdgeCli(argv, agent, io) {
|
|
3
|
+
const command = argv[0] ?? "status";
|
|
4
|
+
try {
|
|
5
|
+
switch (command) {
|
|
6
|
+
case "login": {
|
|
7
|
+
const result = await agent.login();
|
|
8
|
+
io.out(JSON.stringify(redactEdgeValue({
|
|
9
|
+
status: result.repeated ? "already-enrolled" : "enrolled",
|
|
10
|
+
edgeNodeId: result.config.edgeNodeId,
|
|
11
|
+
tenantId: result.config.tenantId,
|
|
12
|
+
connected: true,
|
|
13
|
+
})));
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
case "status":
|
|
17
|
+
io.out(JSON.stringify(redactEdgeValue(await agent.status())));
|
|
18
|
+
return 0;
|
|
19
|
+
case "disconnect":
|
|
20
|
+
await agent.disconnect();
|
|
21
|
+
io.out(JSON.stringify({ status: "disconnected" }));
|
|
22
|
+
return 0;
|
|
23
|
+
case "revoke":
|
|
24
|
+
await agent.revoke();
|
|
25
|
+
io.out(JSON.stringify({ status: "revoked" }));
|
|
26
|
+
return 0;
|
|
27
|
+
case "add":
|
|
28
|
+
io.error("MCP definitions and assignments are managed by Fentaris; fentaris-edge has no add command.");
|
|
29
|
+
return 2;
|
|
30
|
+
default:
|
|
31
|
+
io.error("Usage: fentaris-edge <login|status|disconnect|revoke>");
|
|
32
|
+
return 2;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
io.error(JSON.stringify(safeEdgeError(error)));
|
|
37
|
+
return 1;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAOhE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAuB,EAAE,KAAgB,EAAE,EAAa;IACvF,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IACpC,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;gBACnC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;oBACpC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU;oBACzD,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;oBACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ;oBAChC,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC,CAAC,CAAC;gBACL,OAAO,CAAC,CAAC;YACX,CAAC;YACD,KAAK,QAAQ;gBACX,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9D,OAAO,CAAC,CAAC;YACX,KAAK,YAAY;gBACf,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;gBACzB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;gBACnD,OAAO,CAAC,CAAC;YACX,KAAK,QAAQ;gBACX,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;gBACrB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC9C,OAAO,CAAC,CAAC;YACX,KAAK,KAAK;gBACR,EAAE,CAAC,KAAK,CAAC,4FAA4F,CAAC,CAAC;gBACvG,OAAO,CAAC,CAAC;YACX;gBACE,EAAE,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;gBAClE,OAAO,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { EdgeLocalConfig, EdgePlatform, StoredDeviceKeyPair } from "./platform.js";
|
|
2
|
+
import type { EdgeConnectionRuntime } from "./runtime.js";
|
|
3
|
+
export interface DeviceAuthorizationRequest {
|
|
4
|
+
readonly deviceCode: string;
|
|
5
|
+
readonly userCode: string;
|
|
6
|
+
readonly verificationUri: string;
|
|
7
|
+
readonly verificationUriComplete?: string;
|
|
8
|
+
readonly expiresIn: number;
|
|
9
|
+
readonly interval: number;
|
|
10
|
+
}
|
|
11
|
+
export interface EdgeAuthorizationTokens {
|
|
12
|
+
readonly accessToken: string;
|
|
13
|
+
readonly refreshToken: string;
|
|
14
|
+
readonly expiresAt: number;
|
|
15
|
+
}
|
|
16
|
+
export type DeviceAuthorizationPollResult = {
|
|
17
|
+
readonly status: "pending" | "slow-down";
|
|
18
|
+
} | {
|
|
19
|
+
readonly status: "authorized";
|
|
20
|
+
readonly tokens: EdgeAuthorizationTokens;
|
|
21
|
+
} | {
|
|
22
|
+
readonly status: "denied" | "expired";
|
|
23
|
+
};
|
|
24
|
+
export interface DeviceAuthorizationProvider {
|
|
25
|
+
begin(): Promise<DeviceAuthorizationRequest>;
|
|
26
|
+
poll(deviceCode: string): Promise<DeviceAuthorizationPollResult>;
|
|
27
|
+
refresh(refreshToken: string): Promise<EdgeAuthorizationTokens>;
|
|
28
|
+
}
|
|
29
|
+
export interface EdgeEnrollmentRequest {
|
|
30
|
+
readonly accessToken: string;
|
|
31
|
+
readonly publicKey: string;
|
|
32
|
+
readonly deviceCode: string;
|
|
33
|
+
readonly nonce: string;
|
|
34
|
+
readonly proof: string;
|
|
35
|
+
readonly hostnameLabel?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface EdgeEnrollmentResult {
|
|
38
|
+
readonly edgeNodeId: string;
|
|
39
|
+
readonly tenantId: string;
|
|
40
|
+
readonly gatewayUrl: string;
|
|
41
|
+
readonly deviceCredential: string;
|
|
42
|
+
}
|
|
43
|
+
export interface EdgeEnrollmentClient {
|
|
44
|
+
enroll(request: EdgeEnrollmentRequest): Promise<EdgeEnrollmentResult>;
|
|
45
|
+
revoke(edgeNodeId: string, accessToken: string): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
export interface EdgeConnection {
|
|
48
|
+
readonly connectedAt: number;
|
|
49
|
+
readonly closed?: Promise<void>;
|
|
50
|
+
close(): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
export interface EdgeConnectionClient {
|
|
53
|
+
connect(input: {
|
|
54
|
+
gatewayUrl: string;
|
|
55
|
+
edgeNodeId: string;
|
|
56
|
+
tenantId: string;
|
|
57
|
+
deviceCredential: string;
|
|
58
|
+
accessToken: string;
|
|
59
|
+
publicKey: string;
|
|
60
|
+
privateKey: string;
|
|
61
|
+
runtime?: EdgeConnectionRuntime;
|
|
62
|
+
}): Promise<EdgeConnection>;
|
|
63
|
+
}
|
|
64
|
+
export interface EnrollmentCallbacks {
|
|
65
|
+
onVerification(request: DeviceAuthorizationRequest): void | Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
export interface EdgeEnrollmentServiceOptions {
|
|
68
|
+
platform: EdgePlatform;
|
|
69
|
+
authorization: DeviceAuthorizationProvider;
|
|
70
|
+
enrollment: EdgeEnrollmentClient;
|
|
71
|
+
callbacks: EnrollmentCallbacks;
|
|
72
|
+
now?: () => number;
|
|
73
|
+
sleep?: (ms: number) => Promise<void>;
|
|
74
|
+
hostnameLabel?: () => string | undefined;
|
|
75
|
+
}
|
|
76
|
+
export interface EdgeLoginResult {
|
|
77
|
+
readonly config: EdgeLocalConfig;
|
|
78
|
+
readonly authorization: DeviceAuthorizationRequest;
|
|
79
|
+
readonly repeated: boolean;
|
|
80
|
+
}
|
|
81
|
+
/** Device-authorization enrollment with random key creation and proof-of-possession. */
|
|
82
|
+
export declare class EdgeEnrollmentService {
|
|
83
|
+
private readonly options;
|
|
84
|
+
private readonly now;
|
|
85
|
+
private readonly sleep;
|
|
86
|
+
constructor(options: EdgeEnrollmentServiceOptions);
|
|
87
|
+
login(): Promise<EdgeLoginResult>;
|
|
88
|
+
validAccessToken(): Promise<string>;
|
|
89
|
+
connectionCredentials(): Promise<{
|
|
90
|
+
config: EdgeLocalConfig;
|
|
91
|
+
keyPair: StoredDeviceKeyPair;
|
|
92
|
+
deviceCredential: string;
|
|
93
|
+
accessToken: string;
|
|
94
|
+
}>;
|
|
95
|
+
revokeRemote(): Promise<void>;
|
|
96
|
+
clearLocalIdentity(): Promise<void>;
|
|
97
|
+
private loadOrCreateKeyPair;
|
|
98
|
+
private awaitAuthorization;
|
|
99
|
+
private saveTokens;
|
|
100
|
+
}
|
|
101
|
+
/** HTTP device authorization provider for self-hosted or managed control planes. */
|
|
102
|
+
export declare class HttpDeviceAuthorizationProvider implements DeviceAuthorizationProvider {
|
|
103
|
+
private readonly baseUrl;
|
|
104
|
+
private readonly clientId;
|
|
105
|
+
constructor(baseUrl: string, clientId?: string);
|
|
106
|
+
begin(): Promise<DeviceAuthorizationRequest>;
|
|
107
|
+
poll(deviceCode: string): Promise<DeviceAuthorizationPollResult>;
|
|
108
|
+
refresh(refreshToken: string): Promise<EdgeAuthorizationTokens>;
|
|
109
|
+
}
|
|
110
|
+
/** HTTP enrollment client. Sensitive authorization fields are never included in errors. */
|
|
111
|
+
export declare class HttpEdgeEnrollmentClient implements EdgeEnrollmentClient {
|
|
112
|
+
private readonly baseUrl;
|
|
113
|
+
constructor(baseUrl: string);
|
|
114
|
+
enroll(request: EdgeEnrollmentRequest): Promise<EdgeEnrollmentResult>;
|
|
115
|
+
revoke(edgeNodeId: string, accessToken: string): Promise<void>;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=enrollment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrollment.d.ts","sourceRoot":"","sources":["../src/enrollment.ts"],"names":[],"mappings":"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"}
|