@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
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { generateKeyPairSync, randomBytes, sign } from "node:crypto";
|
|
2
|
+
const ACCESS_TOKEN = "access-token";
|
|
3
|
+
const REFRESH_TOKEN = "refresh-token";
|
|
4
|
+
const ACCESS_EXPIRES_AT = "access-expires-at";
|
|
5
|
+
const DEVICE_CREDENTIAL = "device-credential";
|
|
6
|
+
/** Device-authorization enrollment with random key creation and proof-of-possession. */
|
|
7
|
+
export class EdgeEnrollmentService {
|
|
8
|
+
options;
|
|
9
|
+
now;
|
|
10
|
+
sleep;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
this.now = options.now ?? Date.now;
|
|
14
|
+
this.sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
15
|
+
}
|
|
16
|
+
async login() {
|
|
17
|
+
const existing = await this.options.platform.configStore.load();
|
|
18
|
+
if (existing && await this.options.platform.credentialStore.get(DEVICE_CREDENTIAL)) {
|
|
19
|
+
await this.validAccessToken();
|
|
20
|
+
return {
|
|
21
|
+
config: existing,
|
|
22
|
+
authorization: {
|
|
23
|
+
deviceCode: "",
|
|
24
|
+
userCode: "",
|
|
25
|
+
verificationUri: "",
|
|
26
|
+
expiresIn: 0,
|
|
27
|
+
interval: 0,
|
|
28
|
+
},
|
|
29
|
+
repeated: true,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const keyPair = await this.loadOrCreateKeyPair();
|
|
33
|
+
const authorization = await this.options.authorization.begin();
|
|
34
|
+
await this.options.callbacks.onVerification(authorization);
|
|
35
|
+
const tokens = await this.awaitAuthorization(authorization);
|
|
36
|
+
const nonce = randomBytes(32).toString("base64url");
|
|
37
|
+
const proof = sign(null, Buffer.from(`${authorization.deviceCode}.${nonce}`), keyPair.privateKey).toString("base64url");
|
|
38
|
+
const enrolled = await this.options.enrollment.enroll({
|
|
39
|
+
accessToken: tokens.accessToken,
|
|
40
|
+
publicKey: keyPair.publicKey,
|
|
41
|
+
deviceCode: authorization.deviceCode,
|
|
42
|
+
nonce,
|
|
43
|
+
proof,
|
|
44
|
+
hostnameLabel: this.options.hostnameLabel?.(),
|
|
45
|
+
});
|
|
46
|
+
const config = {
|
|
47
|
+
edgeNodeId: enrolled.edgeNodeId,
|
|
48
|
+
tenantId: enrolled.tenantId,
|
|
49
|
+
gatewayUrl: enrolled.gatewayUrl,
|
|
50
|
+
enrolledAt: this.now(),
|
|
51
|
+
hostnameLabel: this.options.hostnameLabel?.(),
|
|
52
|
+
};
|
|
53
|
+
await this.options.platform.configStore.save(config);
|
|
54
|
+
await this.saveTokens(tokens);
|
|
55
|
+
await this.options.platform.credentialStore.set(DEVICE_CREDENTIAL, enrolled.deviceCredential);
|
|
56
|
+
return { config, authorization, repeated: false };
|
|
57
|
+
}
|
|
58
|
+
async validAccessToken() {
|
|
59
|
+
const accessToken = await this.options.platform.credentialStore.get(ACCESS_TOKEN);
|
|
60
|
+
const expiresAt = Number(await this.options.platform.credentialStore.get(ACCESS_EXPIRES_AT));
|
|
61
|
+
if (accessToken && Number.isFinite(expiresAt) && expiresAt > this.now() + 30_000) {
|
|
62
|
+
return accessToken;
|
|
63
|
+
}
|
|
64
|
+
const refreshToken = await this.options.platform.credentialStore.get(REFRESH_TOKEN);
|
|
65
|
+
if (!refreshToken)
|
|
66
|
+
throw new Error("Edge authorization is missing; run fentaris-edge login");
|
|
67
|
+
const refreshed = await this.options.authorization.refresh(refreshToken);
|
|
68
|
+
await this.saveTokens(refreshed);
|
|
69
|
+
return refreshed.accessToken;
|
|
70
|
+
}
|
|
71
|
+
async connectionCredentials() {
|
|
72
|
+
const config = await this.options.platform.configStore.load();
|
|
73
|
+
const keyPair = await this.options.platform.deviceKeyStore.load();
|
|
74
|
+
const deviceCredential = await this.options.platform.credentialStore.get(DEVICE_CREDENTIAL);
|
|
75
|
+
if (!config || !keyPair || !deviceCredential) {
|
|
76
|
+
throw new Error("Edge device is not enrolled; run fentaris-edge login");
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
config,
|
|
80
|
+
keyPair,
|
|
81
|
+
deviceCredential,
|
|
82
|
+
accessToken: await this.validAccessToken(),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async revokeRemote() {
|
|
86
|
+
const config = await this.options.platform.configStore.load();
|
|
87
|
+
if (!config)
|
|
88
|
+
return;
|
|
89
|
+
await this.options.enrollment.revoke(config.edgeNodeId, await this.validAccessToken());
|
|
90
|
+
}
|
|
91
|
+
async clearLocalIdentity() {
|
|
92
|
+
await Promise.all([
|
|
93
|
+
this.options.platform.configStore.delete(),
|
|
94
|
+
this.options.platform.deviceKeyStore.delete(),
|
|
95
|
+
this.options.platform.credentialStore.delete(ACCESS_TOKEN),
|
|
96
|
+
this.options.platform.credentialStore.delete(REFRESH_TOKEN),
|
|
97
|
+
this.options.platform.credentialStore.delete(ACCESS_EXPIRES_AT),
|
|
98
|
+
this.options.platform.credentialStore.delete(DEVICE_CREDENTIAL),
|
|
99
|
+
]);
|
|
100
|
+
}
|
|
101
|
+
async loadOrCreateKeyPair() {
|
|
102
|
+
const existing = await this.options.platform.deviceKeyStore.load();
|
|
103
|
+
if (existing)
|
|
104
|
+
return existing;
|
|
105
|
+
const generated = generateKeyPairSync("ed25519", {
|
|
106
|
+
publicKeyEncoding: { type: "spki", format: "pem" },
|
|
107
|
+
privateKeyEncoding: { type: "pkcs8", format: "pem" },
|
|
108
|
+
});
|
|
109
|
+
const keyPair = {
|
|
110
|
+
publicKey: generated.publicKey,
|
|
111
|
+
privateKey: generated.privateKey,
|
|
112
|
+
createdAt: this.now(),
|
|
113
|
+
};
|
|
114
|
+
await this.options.platform.deviceKeyStore.save(keyPair);
|
|
115
|
+
return keyPair;
|
|
116
|
+
}
|
|
117
|
+
async awaitAuthorization(request) {
|
|
118
|
+
const expiresAt = this.now() + request.expiresIn * 1_000;
|
|
119
|
+
let interval = Math.max(1, request.interval) * 1_000;
|
|
120
|
+
while (this.now() < expiresAt) {
|
|
121
|
+
const result = await this.options.authorization.poll(request.deviceCode);
|
|
122
|
+
if (result.status === "authorized")
|
|
123
|
+
return result.tokens;
|
|
124
|
+
if (result.status === "denied")
|
|
125
|
+
throw new Error("Device authorization was denied");
|
|
126
|
+
if (result.status === "expired")
|
|
127
|
+
break;
|
|
128
|
+
if (result.status === "slow-down")
|
|
129
|
+
interval += 5_000;
|
|
130
|
+
await this.sleep(interval);
|
|
131
|
+
}
|
|
132
|
+
throw new Error("Device authorization expired");
|
|
133
|
+
}
|
|
134
|
+
async saveTokens(tokens) {
|
|
135
|
+
await Promise.all([
|
|
136
|
+
this.options.platform.credentialStore.set(ACCESS_TOKEN, tokens.accessToken),
|
|
137
|
+
this.options.platform.credentialStore.set(REFRESH_TOKEN, tokens.refreshToken),
|
|
138
|
+
this.options.platform.credentialStore.set(ACCESS_EXPIRES_AT, String(tokens.expiresAt)),
|
|
139
|
+
]);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** HTTP device authorization provider for self-hosted or managed control planes. */
|
|
143
|
+
export class HttpDeviceAuthorizationProvider {
|
|
144
|
+
baseUrl;
|
|
145
|
+
clientId;
|
|
146
|
+
constructor(baseUrl, clientId = "fentaris-edge") {
|
|
147
|
+
this.baseUrl = baseUrl;
|
|
148
|
+
this.clientId = clientId;
|
|
149
|
+
}
|
|
150
|
+
async begin() {
|
|
151
|
+
return postJson(`${this.baseUrl}/device/authorize`, { clientId: this.clientId });
|
|
152
|
+
}
|
|
153
|
+
async poll(deviceCode) {
|
|
154
|
+
return postJson(`${this.baseUrl}/device/token`, { clientId: this.clientId, deviceCode });
|
|
155
|
+
}
|
|
156
|
+
async refresh(refreshToken) {
|
|
157
|
+
return postJson(`${this.baseUrl}/token/refresh`, { clientId: this.clientId, refreshToken });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** HTTP enrollment client. Sensitive authorization fields are never included in errors. */
|
|
161
|
+
export class HttpEdgeEnrollmentClient {
|
|
162
|
+
baseUrl;
|
|
163
|
+
constructor(baseUrl) {
|
|
164
|
+
this.baseUrl = baseUrl;
|
|
165
|
+
}
|
|
166
|
+
async enroll(request) {
|
|
167
|
+
return postJson(`${this.baseUrl}/edge/enroll`, request, request.accessToken);
|
|
168
|
+
}
|
|
169
|
+
async revoke(edgeNodeId, accessToken) {
|
|
170
|
+
await postJson(`${this.baseUrl}/edge/revoke`, { edgeNodeId }, accessToken);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function postJson(url, body, bearer) {
|
|
174
|
+
const response = await fetch(url, {
|
|
175
|
+
method: "POST",
|
|
176
|
+
headers: {
|
|
177
|
+
"content-type": "application/json",
|
|
178
|
+
...(bearer ? { authorization: `Bearer ${bearer}` } : {}),
|
|
179
|
+
},
|
|
180
|
+
body: JSON.stringify(body),
|
|
181
|
+
});
|
|
182
|
+
if (!response.ok)
|
|
183
|
+
throw new Error(`Edge control-plane request failed with HTTP ${response.status}`);
|
|
184
|
+
return response.json();
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=enrollment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrollment.js","sourceRoot":"","sources":["../src/enrollment.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createDefaultEdgeAgent, EdgeAgent, WebSocketEdgeConnectionClient } from "./agent.js";
|
|
3
|
+
import { runEdgeCli, type EdgeCliIo } from "./cli.js";
|
|
4
|
+
export { EdgeAgent, WebSocketEdgeConnectionClient, createDefaultEdgeAgent, runEdgeCli, };
|
|
5
|
+
export type { DefaultAgentOptions, EdgeAgentOptions, EdgeAgentStatus, EdgeRuntimeSummary, EdgeRuntimeSummaryProvider, } from "./agent.js";
|
|
6
|
+
export type { EdgeCliIo } from "./cli.js";
|
|
7
|
+
export { EdgeEnrollmentService, HttpDeviceAuthorizationProvider, HttpEdgeEnrollmentClient, } from "./enrollment.js";
|
|
8
|
+
export type { DeviceAuthorizationPollResult, DeviceAuthorizationProvider, DeviceAuthorizationRequest, EdgeAuthorizationTokens, EdgeConnection, EdgeConnectionClient, EdgeEnrollmentClient, EdgeEnrollmentRequest, EdgeEnrollmentResult, EdgeEnrollmentServiceOptions, EdgeLoginResult, EnrollmentCallbacks, } from "./enrollment.js";
|
|
9
|
+
export { NodeProcessSupervisor, ProtectedFileCredentialStore, ProtectedJsonStore, defaultEdgePaths, nodeEdgePlatform, } from "./platform.js";
|
|
10
|
+
export type { CredentialStore, EdgeLocalConfig, EdgePaths, EdgePlatform, JsonStore, ProcessStartOptions, ProcessSupervisorAdapter, StoredDeviceKeyPair, SupervisedProcess, } from "./platform.js";
|
|
11
|
+
export { redactEdgeValue, safeEdgeError } from "./redaction.js";
|
|
12
|
+
export { LocalSetupManager, NodeTerminalSetupPrompter, TerminalSetupProvider, } from "./setup.js";
|
|
13
|
+
export { EdgeWorkloadSupervisor, ExecutableAllowlistPolicy } from "./supervisor.js";
|
|
14
|
+
export { StdioEdgeWorkloadFactory } from "./stdioWorkload.js";
|
|
15
|
+
export { EdgeAgentRuntime } from "./runtime.js";
|
|
16
|
+
export type { EdgeAgentRuntimeOptions, EdgeConnectionRuntime, EdgeRuntimeConnection, } from "./runtime.js";
|
|
17
|
+
export type { DeploymentReconcileResult, EdgeWorkload, EdgeWorkloadFactory, EdgeWorkloadPolicy, EdgeWorkloadSupervisorOptions, ExecutableAllowlistPolicyOptions, LocalMcpClient, LocalMcpCapabilityManifest, SupervisedDesiredDeployment, } from "./supervisor.js";
|
|
18
|
+
export type { CompiledLocalLaunchPlan, DesiredSetupRequirement, LocalGrantDatabase, LocalGrantRecord, LocalSetupManagerOptions, LocalSetupProvider, LocalSetupState, LocalSetupStatus, SetupFieldResponse, TerminalSetupPrompter, } from "./setup.js";
|
|
19
|
+
export declare function main(argv: readonly string[], options?: {
|
|
20
|
+
agent?: EdgeAgent;
|
|
21
|
+
io?: EdgeCliIo;
|
|
22
|
+
controlPlaneUrl?: string;
|
|
23
|
+
}): Promise<number>;
|
|
24
|
+
export declare function isDirectCliInvocation(entrypointUrl?: string, argvPath?: string): boolean;
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,EACL,SAAS,EACT,6BAA6B,EAC7B,sBAAsB,EACtB,UAAU,GACX,CAAC;AACF,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,6BAA6B,EAC7B,2BAA2B,EAC3B,0BAA0B,EAC1B,uBAAuB,EACvB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,4BAA4B,EAC5B,eAAe,EACf,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,eAAe,EACf,eAAe,EACf,SAAS,EACT,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EACV,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,yBAAyB,EACzB,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,6BAA6B,EAC7B,gCAAgC,EAChC,cAAc,EACd,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,wBAAsB,IAAI,CACxB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CACrB,GACL,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,wBAAgB,qBAAqB,CAAC,aAAa,SAAkB,EAAE,QAAQ,SAAkB,GAAG,OAAO,CAG1G"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { createDefaultEdgeAgent, EdgeAgent, WebSocketEdgeConnectionClient } from "./agent.js";
|
|
5
|
+
import { runEdgeCli } from "./cli.js";
|
|
6
|
+
export { EdgeAgent, WebSocketEdgeConnectionClient, createDefaultEdgeAgent, runEdgeCli, };
|
|
7
|
+
export { EdgeEnrollmentService, HttpDeviceAuthorizationProvider, HttpEdgeEnrollmentClient, } from "./enrollment.js";
|
|
8
|
+
export { NodeProcessSupervisor, ProtectedFileCredentialStore, ProtectedJsonStore, defaultEdgePaths, nodeEdgePlatform, } from "./platform.js";
|
|
9
|
+
export { redactEdgeValue, safeEdgeError } from "./redaction.js";
|
|
10
|
+
export { LocalSetupManager, NodeTerminalSetupPrompter, TerminalSetupProvider, } from "./setup.js";
|
|
11
|
+
export { EdgeWorkloadSupervisor, ExecutableAllowlistPolicy } from "./supervisor.js";
|
|
12
|
+
export { StdioEdgeWorkloadFactory } from "./stdioWorkload.js";
|
|
13
|
+
export { EdgeAgentRuntime } from "./runtime.js";
|
|
14
|
+
export async function main(argv, options = {}) {
|
|
15
|
+
const io = options.io ?? {
|
|
16
|
+
out: (value) => console.log(value),
|
|
17
|
+
error: (value) => console.error(value),
|
|
18
|
+
};
|
|
19
|
+
const agent = options.agent ?? createDefaultEdgeAgent({
|
|
20
|
+
controlPlaneUrl: options.controlPlaneUrl ?? process.env.FENTARIS_EDGE_CONTROL_PLANE_URL ?? "",
|
|
21
|
+
onVerification: (request) => {
|
|
22
|
+
io.out(JSON.stringify({
|
|
23
|
+
verificationUri: request.verificationUri,
|
|
24
|
+
userCode: request.userCode,
|
|
25
|
+
}));
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
return runEdgeCli(argv, agent, io);
|
|
29
|
+
}
|
|
30
|
+
export function isDirectCliInvocation(entrypointUrl = import.meta.url, argvPath = process.argv[1]) {
|
|
31
|
+
if (!argvPath)
|
|
32
|
+
return false;
|
|
33
|
+
return resolvePath(fileURLToPath(entrypointUrl)) === resolvePath(argvPath);
|
|
34
|
+
}
|
|
35
|
+
if (isDirectCliInvocation()) {
|
|
36
|
+
main(process.argv.slice(2)).then((code) => {
|
|
37
|
+
process.exitCode = code;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function resolvePath(value) {
|
|
41
|
+
try {
|
|
42
|
+
return realpathSync(value);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAkB,MAAM,UAAU,CAAC;AAEtD,OAAO,EACL,SAAS,EACT,6BAA6B,EAC7B,sBAAsB,EACtB,UAAU,GACX,CAAC;AASF,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAezB,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAYvB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AA8BhD,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,IAAuB,EACvB,UAII,EAAE;IAEN,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI;QACvB,GAAG,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1C,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;KAC/C,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,sBAAsB,CAAC;QACpD,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,EAAE;QAC7F,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE;YAC1B,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACpB,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAC,CAAC;QACN,CAAC;KACF,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/F,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,KAAK,WAAW,CAAC,QAAQ,CAAC,CAAC;AAC7E,CAAC;AAED,IAAI,qBAAqB,EAAE,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACxC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export interface EdgePaths {
|
|
2
|
+
readonly dataDir: string;
|
|
3
|
+
readonly configFile: string;
|
|
4
|
+
readonly deviceKeyFile: string;
|
|
5
|
+
readonly credentialFile: string;
|
|
6
|
+
}
|
|
7
|
+
export interface JsonStore<T> {
|
|
8
|
+
load(): Promise<T | undefined>;
|
|
9
|
+
save(value: T): Promise<void>;
|
|
10
|
+
delete(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export interface CredentialStore {
|
|
13
|
+
get(name: string): Promise<string | undefined>;
|
|
14
|
+
set(name: string, value: string): Promise<void>;
|
|
15
|
+
delete(name: string): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export interface ProcessStartOptions {
|
|
18
|
+
readonly command: string;
|
|
19
|
+
readonly args?: readonly string[];
|
|
20
|
+
readonly env?: Readonly<Record<string, string>>;
|
|
21
|
+
readonly cwd?: string;
|
|
22
|
+
readonly stderr?: "inherit" | "pipe" | "ignore";
|
|
23
|
+
}
|
|
24
|
+
export interface SupervisedProcess {
|
|
25
|
+
readonly pid?: number;
|
|
26
|
+
readonly exited: Promise<{
|
|
27
|
+
code: number | null;
|
|
28
|
+
signal: NodeJS.Signals | null;
|
|
29
|
+
}>;
|
|
30
|
+
terminate(signal?: NodeJS.Signals): void;
|
|
31
|
+
}
|
|
32
|
+
export interface ProcessSupervisorAdapter {
|
|
33
|
+
start(options: ProcessStartOptions): Promise<SupervisedProcess>;
|
|
34
|
+
}
|
|
35
|
+
export interface EdgePlatform {
|
|
36
|
+
readonly paths: EdgePaths;
|
|
37
|
+
readonly deviceKeyStore: JsonStore<StoredDeviceKeyPair>;
|
|
38
|
+
readonly configStore: JsonStore<EdgeLocalConfig>;
|
|
39
|
+
readonly credentialStore: CredentialStore;
|
|
40
|
+
readonly processSupervisor: ProcessSupervisorAdapter;
|
|
41
|
+
}
|
|
42
|
+
export interface StoredDeviceKeyPair {
|
|
43
|
+
readonly publicKey: string;
|
|
44
|
+
readonly privateKey: string;
|
|
45
|
+
readonly createdAt: number;
|
|
46
|
+
}
|
|
47
|
+
export interface EdgeLocalConfig {
|
|
48
|
+
readonly edgeNodeId: string;
|
|
49
|
+
readonly tenantId: string;
|
|
50
|
+
readonly gatewayUrl: string;
|
|
51
|
+
readonly enrolledAt: number;
|
|
52
|
+
readonly hostnameLabel?: string;
|
|
53
|
+
}
|
|
54
|
+
/** Resolve platform-specific local state paths without using them as identity. */
|
|
55
|
+
export declare function defaultEdgePaths(home?: string, platform?: NodeJS.Platform): EdgePaths;
|
|
56
|
+
/** Protected JSON file store used for local config and fallback secret state. */
|
|
57
|
+
export declare class ProtectedJsonStore<T> implements JsonStore<T> {
|
|
58
|
+
private readonly file;
|
|
59
|
+
private readonly mode;
|
|
60
|
+
constructor(file: string, mode?: number);
|
|
61
|
+
load(): Promise<T | undefined>;
|
|
62
|
+
save(value: T): Promise<void>;
|
|
63
|
+
delete(): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Protected file credential fallback. Platforms with an OS credential manager
|
|
67
|
+
* should supply another {@link CredentialStore}; this adapter never exposes
|
|
68
|
+
* the backing path or stored values through status APIs.
|
|
69
|
+
*/
|
|
70
|
+
export declare class ProtectedFileCredentialStore implements CredentialStore {
|
|
71
|
+
private readonly store;
|
|
72
|
+
constructor(file: string);
|
|
73
|
+
get(name: string): Promise<string | undefined>;
|
|
74
|
+
set(name: string, value: string): Promise<void>;
|
|
75
|
+
delete(name: string): Promise<void>;
|
|
76
|
+
}
|
|
77
|
+
/** Node child-process implementation hidden behind the process supervisor seam. */
|
|
78
|
+
export declare class NodeProcessSupervisor implements ProcessSupervisorAdapter {
|
|
79
|
+
start(options: ProcessStartOptions): Promise<SupervisedProcess>;
|
|
80
|
+
}
|
|
81
|
+
export declare function nodeEdgePlatform(paths?: EdgePaths): EdgePlatform;
|
|
82
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
package/dist/platform.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { chmod, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
/** Resolve platform-specific local state paths without using them as identity. */
|
|
6
|
+
export function defaultEdgePaths(home = homedir(), platform = process.platform) {
|
|
7
|
+
const dataDir = platform === "win32"
|
|
8
|
+
? path.join(process.env.LOCALAPPDATA ?? home, "Fentaris", "edge")
|
|
9
|
+
: platform === "darwin"
|
|
10
|
+
? path.join(home, "Library", "Application Support", "Fentaris", "edge")
|
|
11
|
+
: path.join(process.env.XDG_STATE_HOME ?? path.join(home, ".local", "state"), "fentaris", "edge");
|
|
12
|
+
return {
|
|
13
|
+
dataDir,
|
|
14
|
+
configFile: path.join(dataDir, "config.json"),
|
|
15
|
+
deviceKeyFile: path.join(dataDir, "device-key.json"),
|
|
16
|
+
credentialFile: path.join(dataDir, "credentials.json"),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Protected JSON file store used for local config and fallback secret state. */
|
|
20
|
+
export class ProtectedJsonStore {
|
|
21
|
+
file;
|
|
22
|
+
mode;
|
|
23
|
+
constructor(file, mode = 0o600) {
|
|
24
|
+
this.file = file;
|
|
25
|
+
this.mode = mode;
|
|
26
|
+
}
|
|
27
|
+
async load() {
|
|
28
|
+
try {
|
|
29
|
+
return JSON.parse(await readFile(this.file, "utf8"));
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (isNotFound(error))
|
|
33
|
+
return undefined;
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async save(value) {
|
|
38
|
+
const directory = path.dirname(this.file);
|
|
39
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
40
|
+
await chmod(directory, 0o700).catch(() => undefined);
|
|
41
|
+
const temporary = `${this.file}.${process.pid}.tmp`;
|
|
42
|
+
await writeFile(temporary, JSON.stringify(value), { encoding: "utf8", mode: this.mode });
|
|
43
|
+
await chmod(temporary, this.mode).catch(() => undefined);
|
|
44
|
+
await rename(temporary, this.file);
|
|
45
|
+
await chmod(this.file, this.mode).catch(() => undefined);
|
|
46
|
+
}
|
|
47
|
+
async delete() {
|
|
48
|
+
await rm(this.file, { force: true });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Protected file credential fallback. Platforms with an OS credential manager
|
|
53
|
+
* should supply another {@link CredentialStore}; this adapter never exposes
|
|
54
|
+
* the backing path or stored values through status APIs.
|
|
55
|
+
*/
|
|
56
|
+
export class ProtectedFileCredentialStore {
|
|
57
|
+
store;
|
|
58
|
+
constructor(file) {
|
|
59
|
+
this.store = new ProtectedJsonStore(file);
|
|
60
|
+
}
|
|
61
|
+
async get(name) {
|
|
62
|
+
return (await this.store.load())?.[name];
|
|
63
|
+
}
|
|
64
|
+
async set(name, value) {
|
|
65
|
+
const credentials = await this.store.load() ?? {};
|
|
66
|
+
await this.store.save({ ...credentials, [name]: value });
|
|
67
|
+
}
|
|
68
|
+
async delete(name) {
|
|
69
|
+
const credentials = await this.store.load() ?? {};
|
|
70
|
+
delete credentials[name];
|
|
71
|
+
if (Object.keys(credentials).length === 0)
|
|
72
|
+
await this.store.delete();
|
|
73
|
+
else
|
|
74
|
+
await this.store.save(credentials);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Node child-process implementation hidden behind the process supervisor seam. */
|
|
78
|
+
export class NodeProcessSupervisor {
|
|
79
|
+
async start(options) {
|
|
80
|
+
const child = spawn(options.command, [...(options.args ?? [])], {
|
|
81
|
+
cwd: options.cwd,
|
|
82
|
+
env: options.env ? { ...process.env, ...options.env } : process.env,
|
|
83
|
+
stdio: ["pipe", "pipe", options.stderr ?? "pipe"],
|
|
84
|
+
windowsHide: true,
|
|
85
|
+
});
|
|
86
|
+
return childHandle(child);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export function nodeEdgePlatform(paths = defaultEdgePaths()) {
|
|
90
|
+
return {
|
|
91
|
+
paths,
|
|
92
|
+
deviceKeyStore: new ProtectedJsonStore(paths.deviceKeyFile),
|
|
93
|
+
configStore: new ProtectedJsonStore(paths.configFile),
|
|
94
|
+
credentialStore: new ProtectedFileCredentialStore(paths.credentialFile),
|
|
95
|
+
processSupervisor: new NodeProcessSupervisor(),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function childHandle(child) {
|
|
99
|
+
const exited = new Promise((resolve, reject) => {
|
|
100
|
+
child.once("error", reject);
|
|
101
|
+
child.once("exit", (code, signal) => resolve({ code, signal }));
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
pid: child.pid,
|
|
105
|
+
exited,
|
|
106
|
+
terminate: (signal = "SIGTERM") => child.kill(signal),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function isNotFound(error) {
|
|
110
|
+
return error instanceof Error && "code" in error && error.code === "ENOENT";
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Recursively redact credentials, secrets, full environments, and private paths. */
|
|
2
|
+
export declare function redactEdgeValue(value: unknown): unknown;
|
|
3
|
+
export declare function safeEdgeError(error: unknown): {
|
|
4
|
+
name: string;
|
|
5
|
+
message: string;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=redaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAEA,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEvD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAM/E"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { redactEdgeProtocolValue } from "@fentaris/core";
|
|
2
|
+
/** Recursively redact credentials, secrets, full environments, and private paths. */
|
|
3
|
+
export function redactEdgeValue(value) {
|
|
4
|
+
return redactEdgeProtocolValue(value);
|
|
5
|
+
}
|
|
6
|
+
export function safeEdgeError(error) {
|
|
7
|
+
const normalized = error instanceof Error ? error : new Error(String(error));
|
|
8
|
+
return {
|
|
9
|
+
name: normalized.name,
|
|
10
|
+
message: String(redactText(normalized.message)),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function redactText(message) {
|
|
14
|
+
return message
|
|
15
|
+
.replace(/Bearer\s+\S+/gi, "Bearer [REDACTED]")
|
|
16
|
+
.replace(/(token|secret|credential|authorization)=\S+/gi, "$1=[REDACTED]")
|
|
17
|
+
.replace(/(?:\/Users\/|\/home\/|[A-Za-z]:\\Users\\)[^\s"']+/g, "[REDACTED_PATH]");
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,qFAAqF;AACrF,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7E,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,OAAO;SACX,OAAO,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;SAC9C,OAAO,CAAC,+CAA+C,EAAE,eAAe,CAAC;SACzE,OAAO,CAAC,oDAAoD,EAAE,iBAAiB,CAAC,CAAC;AACtF,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type EdgeAgentMessage, type EdgeControlPlaneMessage, type EdgeProtocolClaims } from "@fentaris/core";
|
|
2
|
+
import type { LocalSetupManager } from "./setup.js";
|
|
3
|
+
import type { EdgeWorkloadSupervisor, LocalMcpCapabilityManifest } from "./supervisor.js";
|
|
4
|
+
export interface EdgeRuntimeSummary {
|
|
5
|
+
readonly desiredDeployments: number;
|
|
6
|
+
readonly readyDeployments: number;
|
|
7
|
+
readonly blockedDeployments: number;
|
|
8
|
+
}
|
|
9
|
+
export interface EdgeRuntimeSummaryProvider {
|
|
10
|
+
summary(): Promise<EdgeRuntimeSummary>;
|
|
11
|
+
}
|
|
12
|
+
export interface EdgeRuntimeConnection {
|
|
13
|
+
readonly claims: EdgeProtocolClaims;
|
|
14
|
+
send(message: EdgeAgentMessage): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/** Runtime callback surface consumed by the persistent WebSocket connection. */
|
|
17
|
+
export interface EdgeConnectionRuntime extends EdgeRuntimeSummaryProvider {
|
|
18
|
+
connected(connection: EdgeRuntimeConnection): void | Promise<void>;
|
|
19
|
+
handle(message: Exclude<EdgeControlPlaneMessage, {
|
|
20
|
+
kind: "edge.hello.ack";
|
|
21
|
+
}>): void | Promise<void>;
|
|
22
|
+
disconnected(): void | Promise<void>;
|
|
23
|
+
clearLocalState?(): void | Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export interface EdgeAgentRuntimeOptions {
|
|
26
|
+
readonly setup: LocalSetupManager;
|
|
27
|
+
readonly supervisor: EdgeWorkloadSupervisor;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Reconciles cloud desired state and bridges correlated MCP traffic to the
|
|
31
|
+
* locally governed workload supervisor.
|
|
32
|
+
*/
|
|
33
|
+
export declare class EdgeAgentRuntime implements EdgeConnectionRuntime {
|
|
34
|
+
private readonly options;
|
|
35
|
+
private connection?;
|
|
36
|
+
private desiredVersion;
|
|
37
|
+
private reconcileQueue;
|
|
38
|
+
private statuses;
|
|
39
|
+
constructor(options: EdgeAgentRuntimeOptions);
|
|
40
|
+
connected(connection: EdgeRuntimeConnection): void;
|
|
41
|
+
handle(message: Exclude<EdgeControlPlaneMessage, {
|
|
42
|
+
kind: "edge.hello.ack";
|
|
43
|
+
}>): Promise<void>;
|
|
44
|
+
disconnected(): Promise<void>;
|
|
45
|
+
clearLocalState(): Promise<void>;
|
|
46
|
+
summary(): Promise<EdgeRuntimeSummary>;
|
|
47
|
+
reportCapabilityManifest(deploymentId: string, recipeDigest: string, manifest: LocalMcpCapabilityManifest): Promise<void>;
|
|
48
|
+
private reconcile;
|
|
49
|
+
private enqueueReconcile;
|
|
50
|
+
private assertTrustedRoute;
|
|
51
|
+
private send;
|
|
52
|
+
private requireConnection;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,gBAAgB,EAErB,KAAK,uBAAuB,EAE5B,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EACV,sBAAsB,EACtB,0BAA0B,EAC3B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,gFAAgF;AAChF,MAAM,WAAW,qBAAsB,SAAQ,0BAA0B;IACvE,SAAS,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,uBAAuB,EAAE;QAAE,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpG,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,eAAe,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;CAC7C;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,qBAAqB;IAMhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,UAAU,CAAC,CAAwB;IAC3C,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAA0C;gBAE7B,OAAO,EAAE,uBAAuB;IAE7D,SAAS,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI;IAI5C,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,uBAAuB,EAAE;QAAE,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5F,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAQhC,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC;IActC,wBAAwB,CAC5B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC;YAaF,SAAS;IAoEvB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,iBAAiB;CAI1B"}
|