@dbx-tools/appkit-lakebox 0.0.0-stage → 0.9.131
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/LICENSE +202 -0
- package/README.md +104 -2
- package/index.ts +32 -0
- package/lib/index.d.ts +28 -0
- package/lib/index.js +26 -0
- package/lib/src/_package.d.ts +2 -0
- package/lib/src/_package.js +11 -0
- package/lib/src/_resource-registry.d.ts +41 -0
- package/lib/src/_resource-registry.js +128 -0
- package/lib/src/_service-snapshots.d.ts +55 -0
- package/lib/src/_service-snapshots.js +65 -0
- package/lib/src/config.d.ts +40 -0
- package/lib/src/config.js +86 -0
- package/lib/src/desktop.d.ts +6 -0
- package/lib/src/desktop.js +88 -0
- package/lib/src/metrics.d.ts +59 -0
- package/lib/src/metrics.js +151 -0
- package/lib/src/plugin.d.ts +259 -0
- package/lib/src/plugin.js +329 -0
- package/lib/src/routes.d.ts +75 -0
- package/lib/src/routes.js +441 -0
- package/lib/src/runtime.d.ts +154 -0
- package/lib/src/runtime.js +760 -0
- package/lib/src/services.d.ts +101 -0
- package/lib/src/services.js +188 -0
- package/lib/src/skills.d.ts +5 -0
- package/lib/src/skills.js +21 -0
- package/lib/src/user.d.ts +46 -0
- package/lib/src/user.js +76 -0
- package/lib/src/workspace.d.ts +43 -0
- package/lib/src/workspace.js +138 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +167 -4
- package/scripts/desktop-prerequisites.sh +66 -0
- package/scripts/desktop-session.sh +307 -0
- package/scripts/lakebox-admin.sh +234 -0
- package/scripts/lakebox-service.py +449 -0
- package/skills/html-page/SKILL.md +40 -0
- package/skills/jupyter-lab/SKILL.md +32 -0
- package/skills/lakebox-showcase/SKILL.md +66 -0
- package/skills/network-speed-test/SKILL.md +29 -0
- package/skills/realtime-whiteboard/SKILL.md +28 -0
- package/src/_package.ts +11 -0
- package/src/_resource-registry.ts +160 -0
- package/src/_service-snapshots.ts +84 -0
- package/src/config.ts +128 -0
- package/src/desktop.ts +97 -0
- package/src/metrics.ts +178 -0
- package/src/plugin.ts +446 -0
- package/src/routes.ts +524 -0
- package/src/runtime.ts +952 -0
- package/src/services.ts +239 -0
- package/src/skills.ts +23 -0
- package/src/user.ts +88 -0
- package/src/workspace.ts +185 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { type CreateLakeboxServiceRequest, type LakeboxBuiltInServiceName, type LakeboxService, type LakeboxUser } from "@dbx-tools/shared-lakebox";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export declare const LakeboxControllerDefinitionSchema: z.ZodObject<{
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
kind: z.ZodEnum<{
|
|
6
|
+
terminal: "terminal";
|
|
7
|
+
desktop: "desktop";
|
|
8
|
+
image: "image";
|
|
9
|
+
}>;
|
|
10
|
+
image: z.ZodOptional<z.ZodString>;
|
|
11
|
+
pull: z.ZodDefault<z.ZodEnum<{
|
|
12
|
+
missing: "missing";
|
|
13
|
+
always: "always";
|
|
14
|
+
}>>;
|
|
15
|
+
command: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
16
|
+
env: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
17
|
+
workingDirectory: z.ZodOptional<z.ZodString>;
|
|
18
|
+
mounts: z.ZodArray<z.ZodObject<{
|
|
19
|
+
source: z.ZodString;
|
|
20
|
+
target: z.ZodString;
|
|
21
|
+
readOnly: z.ZodBoolean;
|
|
22
|
+
}, z.core.$strict>>;
|
|
23
|
+
port: z.ZodNumber;
|
|
24
|
+
readiness: z.ZodEnum<{
|
|
25
|
+
tcp: "tcp";
|
|
26
|
+
none: "none";
|
|
27
|
+
}>;
|
|
28
|
+
readySeconds: z.ZodNumber;
|
|
29
|
+
autostart: z.ZodBoolean;
|
|
30
|
+
route: z.ZodBoolean;
|
|
31
|
+
stripPrefix: z.ZodBoolean;
|
|
32
|
+
openPath: z.ZodOptional<z.ZodString>;
|
|
33
|
+
}, z.core.$strict>;
|
|
34
|
+
/** Service definition persisted in the user's Lakebox home. */
|
|
35
|
+
export type LakeboxControllerDefinition = z.output<typeof LakeboxControllerDefinitionSchema>;
|
|
36
|
+
export declare const LakeboxControllerServiceSchema: z.ZodObject<{
|
|
37
|
+
name: z.ZodString;
|
|
38
|
+
state: z.ZodEnum<{
|
|
39
|
+
error: "error";
|
|
40
|
+
starting: "starting";
|
|
41
|
+
stopped: "stopped";
|
|
42
|
+
ready: "ready";
|
|
43
|
+
}>;
|
|
44
|
+
definition: z.ZodObject<{
|
|
45
|
+
name: z.ZodString;
|
|
46
|
+
kind: z.ZodEnum<{
|
|
47
|
+
terminal: "terminal";
|
|
48
|
+
desktop: "desktop";
|
|
49
|
+
image: "image";
|
|
50
|
+
}>;
|
|
51
|
+
image: z.ZodOptional<z.ZodString>;
|
|
52
|
+
pull: z.ZodDefault<z.ZodEnum<{
|
|
53
|
+
missing: "missing";
|
|
54
|
+
always: "always";
|
|
55
|
+
}>>;
|
|
56
|
+
command: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
57
|
+
env: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
58
|
+
workingDirectory: z.ZodOptional<z.ZodString>;
|
|
59
|
+
mounts: z.ZodArray<z.ZodObject<{
|
|
60
|
+
source: z.ZodString;
|
|
61
|
+
target: z.ZodString;
|
|
62
|
+
readOnly: z.ZodBoolean;
|
|
63
|
+
}, z.core.$strict>>;
|
|
64
|
+
port: z.ZodNumber;
|
|
65
|
+
readiness: z.ZodEnum<{
|
|
66
|
+
tcp: "tcp";
|
|
67
|
+
none: "none";
|
|
68
|
+
}>;
|
|
69
|
+
readySeconds: z.ZodNumber;
|
|
70
|
+
autostart: z.ZodBoolean;
|
|
71
|
+
route: z.ZodBoolean;
|
|
72
|
+
stripPrefix: z.ZodBoolean;
|
|
73
|
+
openPath: z.ZodOptional<z.ZodString>;
|
|
74
|
+
}, z.core.$strict>;
|
|
75
|
+
error: z.ZodOptional<z.ZodString>;
|
|
76
|
+
log: z.ZodOptional<z.ZodString>;
|
|
77
|
+
}, z.core.$loose>;
|
|
78
|
+
/** One service as reported by the remote controller. */
|
|
79
|
+
export type LakeboxControllerService = z.infer<typeof LakeboxControllerServiceSchema>;
|
|
80
|
+
/** Routing behavior derived from a saved definition. */
|
|
81
|
+
export interface LakeboxServiceRoute {
|
|
82
|
+
port: number;
|
|
83
|
+
stripPrefix: boolean;
|
|
84
|
+
redirectToSlash: boolean;
|
|
85
|
+
htmlHead?: string;
|
|
86
|
+
}
|
|
87
|
+
/** Builds the package-owned definition for a built-in service. */
|
|
88
|
+
export declare function builtInDefinition(name: LakeboxBuiltInServiceName, user: LakeboxUser): LakeboxControllerDefinition;
|
|
89
|
+
/**
|
|
90
|
+
* Validates an agent or REST service request and resolves it to a persisted
|
|
91
|
+
* definition with injected variables and home-relative mounts.
|
|
92
|
+
*/
|
|
93
|
+
export declare function imageDefinition(input: CreateLakeboxServiceRequest, user: LakeboxUser): LakeboxControllerDefinition;
|
|
94
|
+
/** Returns route behavior for a saved definition. */
|
|
95
|
+
export declare function serviceRoute(definition: LakeboxControllerDefinition): LakeboxServiceRoute;
|
|
96
|
+
/** Maps a controller report to the shared service shape. */
|
|
97
|
+
export declare function toLakeboxService(service: LakeboxControllerService, user: LakeboxUser, routePrefix: string): LakeboxService;
|
|
98
|
+
/** Resolve a routed service path against the browser app origin for agent output. */
|
|
99
|
+
export declare function withServiceOrigin(service: LakeboxService, origin?: string): LakeboxService;
|
|
100
|
+
/** Returns the stopped placeholder for a built-in service that has never started. */
|
|
101
|
+
export declare function idleBuiltInService(name: LakeboxBuiltInServiceName, user: LakeboxUser, routePrefix: string): LakeboxService;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { createLakeboxServiceRequestSchema, lakeboxServiceKindSchema, lakeboxServiceStateSchema, } from "@dbx-tools/shared-lakebox";
|
|
2
|
+
import { lakeboxServicePath } from "@dbx-tools/shared-lakebox/client";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { desktopEnvironment, desktopHtmlHead, desktopOpenUrl } from "./desktop.js";
|
|
5
|
+
import { LAKEBOX_RUNTIME_ROOT, lakeboxServicePort } from "./user.js";
|
|
6
|
+
const TTYD_CLIENT_OPTIONS = [
|
|
7
|
+
"term=xterm-256color",
|
|
8
|
+
"rendererType=webgl",
|
|
9
|
+
"cursorStyle=bar",
|
|
10
|
+
"copyOnSelect=true",
|
|
11
|
+
"rightClickSelectsWord=true",
|
|
12
|
+
"disableLeaveAlert=true",
|
|
13
|
+
"disableResizeOverlay=true",
|
|
14
|
+
];
|
|
15
|
+
export const LakeboxControllerDefinitionSchema = z
|
|
16
|
+
.object({
|
|
17
|
+
name: z.string().describe("Service name."),
|
|
18
|
+
kind: lakeboxServiceKindSchema,
|
|
19
|
+
image: z.string().optional().describe("OCI image for image services."),
|
|
20
|
+
pull: z.enum(["missing", "always"]).default("missing").describe("Image pull policy."),
|
|
21
|
+
command: z
|
|
22
|
+
.array(z.string())
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("Argv; omitted to use the image entrypoint and command."),
|
|
25
|
+
env: z
|
|
26
|
+
.record(z.string(), z.string())
|
|
27
|
+
.describe("Container environment, including injected values."),
|
|
28
|
+
workingDirectory: z.string().optional().describe("Container working directory."),
|
|
29
|
+
mounts: z
|
|
30
|
+
.array(z
|
|
31
|
+
.object({
|
|
32
|
+
source: z
|
|
33
|
+
.string()
|
|
34
|
+
.startsWith("/")
|
|
35
|
+
.describe("Absolute host path beneath the user's home."),
|
|
36
|
+
target: z.string().startsWith("/").describe("Container path."),
|
|
37
|
+
readOnly: z.boolean().describe("Read-only bind."),
|
|
38
|
+
})
|
|
39
|
+
.strict())
|
|
40
|
+
.describe("Bind mounts."),
|
|
41
|
+
port: z.number().int().describe("Derived loopback port."),
|
|
42
|
+
readiness: z.enum(["tcp", "none"]).describe("Readiness check."),
|
|
43
|
+
readySeconds: z.number().int().positive().describe("Maximum readiness wait."),
|
|
44
|
+
autostart: z.boolean().describe("Whether the service restarts when the Lakebox starts."),
|
|
45
|
+
route: z.boolean().describe("Whether AppKit routes the service."),
|
|
46
|
+
stripPrefix: z.boolean().describe("Whether the route prefix is removed before forwarding."),
|
|
47
|
+
openPath: z.string().optional().describe("Entry path appended to the route."),
|
|
48
|
+
})
|
|
49
|
+
.strict()
|
|
50
|
+
.describe("Service definition persisted in the user's Lakebox home and read by the controller.");
|
|
51
|
+
export const LakeboxControllerServiceSchema = z
|
|
52
|
+
.object({
|
|
53
|
+
name: z.string(),
|
|
54
|
+
state: lakeboxServiceStateSchema,
|
|
55
|
+
definition: LakeboxControllerDefinitionSchema,
|
|
56
|
+
error: z.string().optional(),
|
|
57
|
+
log: z.string().optional(),
|
|
58
|
+
})
|
|
59
|
+
.passthrough()
|
|
60
|
+
.describe("One service as reported by the remote controller.");
|
|
61
|
+
/** Builds the package-owned definition for a built-in service. */
|
|
62
|
+
export function builtInDefinition(name, user) {
|
|
63
|
+
const port = lakeboxServicePort(user.hash, name);
|
|
64
|
+
const common = {
|
|
65
|
+
name,
|
|
66
|
+
kind: name,
|
|
67
|
+
pull: "missing",
|
|
68
|
+
mounts: [],
|
|
69
|
+
port,
|
|
70
|
+
readiness: "tcp",
|
|
71
|
+
autostart: false,
|
|
72
|
+
route: true,
|
|
73
|
+
stripPrefix: true,
|
|
74
|
+
};
|
|
75
|
+
if (name === "terminal") {
|
|
76
|
+
return {
|
|
77
|
+
...common,
|
|
78
|
+
readySeconds: 60,
|
|
79
|
+
env: injectedEnvironment(user, name, port),
|
|
80
|
+
command: [
|
|
81
|
+
`${LAKEBOX_RUNTIME_ROOT}/bin/ttyd`,
|
|
82
|
+
"--interface",
|
|
83
|
+
"127.0.0.1",
|
|
84
|
+
"--port",
|
|
85
|
+
String(port),
|
|
86
|
+
"--writable",
|
|
87
|
+
...TTYD_CLIENT_OPTIONS.flatMap((option) => ["--client-option", option]),
|
|
88
|
+
"/bin/bash",
|
|
89
|
+
"-l",
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
...common,
|
|
95
|
+
readySeconds: 180,
|
|
96
|
+
env: { ...desktopEnvironment(), ...injectedEnvironment(user, name, port) },
|
|
97
|
+
command: ["/bin/sh", `${LAKEBOX_RUNTIME_ROOT}/bin/desktop-session`],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Validates an agent or REST service request and resolves it to a persisted
|
|
102
|
+
* definition with injected variables and home-relative mounts.
|
|
103
|
+
*/
|
|
104
|
+
export function imageDefinition(input, user) {
|
|
105
|
+
const request = createLakeboxServiceRequestSchema.parse(input);
|
|
106
|
+
const port = lakeboxServicePort(user.hash, request.name);
|
|
107
|
+
return {
|
|
108
|
+
name: request.name,
|
|
109
|
+
kind: "image",
|
|
110
|
+
image: request.image,
|
|
111
|
+
pull: request.pull,
|
|
112
|
+
...(request.command ? { command: request.command } : {}),
|
|
113
|
+
env: { ...request.env, ...injectedEnvironment(user, request.name, port, request.route) },
|
|
114
|
+
...(request.workingDirectory ? { workingDirectory: request.workingDirectory } : {}),
|
|
115
|
+
mounts: request.mounts.map((mount) => ({
|
|
116
|
+
source: `${user.home}/${mount.source.replace(/^\.\/+|\/+$/g, "")}`,
|
|
117
|
+
target: mount.target,
|
|
118
|
+
readOnly: mount.readOnly,
|
|
119
|
+
})),
|
|
120
|
+
port,
|
|
121
|
+
readiness: request.route ? "tcp" : "none",
|
|
122
|
+
readySeconds: 300,
|
|
123
|
+
autostart: true,
|
|
124
|
+
route: request.route,
|
|
125
|
+
stripPrefix: request.stripPrefix,
|
|
126
|
+
...(request.openPath ? { openPath: request.openPath.replace(/^\/+/, "") } : {}),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/** Returns route behavior for a saved definition. */
|
|
130
|
+
export function serviceRoute(definition) {
|
|
131
|
+
return {
|
|
132
|
+
port: definition.port,
|
|
133
|
+
stripPrefix: definition.stripPrefix,
|
|
134
|
+
redirectToSlash: true,
|
|
135
|
+
...(definition.kind === "desktop" ? { htmlHead: desktopHtmlHead } : {}),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/** Maps a controller report to the shared service shape. */
|
|
139
|
+
export function toLakeboxService(service, user, routePrefix) {
|
|
140
|
+
const { definition } = service;
|
|
141
|
+
const path = lakeboxServicePath(routePrefix, user.hash, definition.name);
|
|
142
|
+
return {
|
|
143
|
+
name: definition.name,
|
|
144
|
+
kind: definition.kind,
|
|
145
|
+
...(definition.image ? { image: definition.image } : {}),
|
|
146
|
+
...(definition.openPath ? { openPath: definition.openPath } : {}),
|
|
147
|
+
state: service.state,
|
|
148
|
+
port: definition.port,
|
|
149
|
+
route: definition.route,
|
|
150
|
+
path,
|
|
151
|
+
...(definition.route ? { openUrl: openUrl(definition, path) } : {}),
|
|
152
|
+
...(service.error ? { error: service.error } : {}),
|
|
153
|
+
...(service.log !== undefined ? { log: service.log } : {}),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/** Resolve a routed service path against the browser app origin for agent output. */
|
|
157
|
+
export function withServiceOrigin(service, origin) {
|
|
158
|
+
if (!service.openUrl || !origin)
|
|
159
|
+
return service;
|
|
160
|
+
try {
|
|
161
|
+
const base = new URL(origin);
|
|
162
|
+
if (base.protocol !== "http:" && base.protocol !== "https:")
|
|
163
|
+
return service;
|
|
164
|
+
return { ...service, openUrl: new URL(service.openUrl, base).href };
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return service;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** Returns the stopped placeholder for a built-in service that has never started. */
|
|
171
|
+
export function idleBuiltInService(name, user, routePrefix) {
|
|
172
|
+
return toLakeboxService({ name, state: "stopped", definition: builtInDefinition(name, user) }, user, routePrefix);
|
|
173
|
+
}
|
|
174
|
+
function openUrl(definition, path) {
|
|
175
|
+
if (definition.kind === "desktop")
|
|
176
|
+
return desktopOpenUrl(path);
|
|
177
|
+
return `${path}/${definition.openPath ?? ""}`;
|
|
178
|
+
}
|
|
179
|
+
function injectedEnvironment(user, name, port, route = true) {
|
|
180
|
+
const value = String(port);
|
|
181
|
+
return {
|
|
182
|
+
SERVICE_NAME: name,
|
|
183
|
+
SERVICE_PATH: route ? `${user.routePrefix}/${name}` : "",
|
|
184
|
+
SERVICE_PORT: value,
|
|
185
|
+
PORT: value,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlDQUFpQyxFQUNqQyx3QkFBd0IsRUFDeEIseUJBQXlCLEdBSzFCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFckUsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixxQkFBcUI7SUFDckIsb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixtQkFBbUI7SUFDbkIsNEJBQTRCO0lBQzVCLHdCQUF3QjtJQUN4QiwyQkFBMkI7Q0FDNUIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLENBQUM7S0FDL0MsTUFBTSxDQUFDO0lBQ04sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO0lBQzFDLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUM7SUFDdEUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDO0lBQ3JGLE9BQU8sRUFBRSxDQUFDO1NBQ1AsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FB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Z0JBQWdCLENBQ3JCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUNyRSxJQUFJLEVBQ0osV0FBVyxDQUNaLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsVUFBdUMsRUFBRSxJQUFZO0lBQ3BFLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsT0FBTyxHQUFHLElBQUksSUFBSSxVQUFVLENBQUMsUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO0FBQ2hELENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUMxQixJQUFpQixFQUNqQixJQUFZLEVBQ1osSUFBWSxFQUNaLEtBQUssR0FBRyxJQUFJO0lBRVosTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLE9BQU87UUFDTCxZQUFZLEVBQUUsSUFBSTtRQUNsQixZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDeEQsWUFBWSxFQUFFLEtBQUs7UUFDbkIsSUFBSSxFQUFFLEtBQUs7S0FDWixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNyZWF0ZUxha2Vib3hTZXJ2aWNlUmVxdWVzdFNjaGVtYSxcbiAgbGFrZWJveFNlcnZpY2VLaW5kU2NoZW1hLFxuICBsYWtlYm94U2VydmljZVN0YXRlU2NoZW1hLFxuICB0eXBlIENyZWF0ZUxha2Vib3hTZXJ2aWNlUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94QnVpbHRJblNlcnZpY2VOYW1lLFxuICB0eXBlIExha2Vib3hTZXJ2aWNlLFxuICB0eXBlIExha2Vib3hVc2VyLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbGFrZWJveFwiO1xuaW1wb3J0IHsgbGFrZWJveFNlcnZpY2VQYXRoIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWxha2Vib3gvY2xpZW50XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgZGVza3RvcEVudmlyb25tZW50LCBkZXNrdG9wSHRtbEhlYWQsIGRlc2t0b3BPcGVuVXJsIH0gZnJvbSBcIi4vZGVza3RvcC50c1wiO1xuaW1wb3J0IHsgTEFLRUJPWF9SVU5USU1FX1JPT1QsIGxha2Vib3hTZXJ2aWNlUG9ydCB9IGZyb20gXCIuL3VzZXIudHNcIjtcblxuY29uc3QgVFRZRF9DTElFTlRfT1BUSU9OUyA9IFtcbiAgXCJ0ZXJtPXh0ZXJtLTI1NmNvbG9yXCIsXG4gIFwicmVuZGVyZXJUeXBlPXdlYmdsXCIsXG4gIFwiY3Vyc29yU3R5bGU9YmFyXCIsXG4gIFwiY29weU9uU2VsZWN0PXRydWVcIixcbiAgXCJyaWdodENsaWNrU2VsZWN0c1dvcmQ9dHJ1ZVwiLFxuICBcImRpc2FibGVMZWF2ZUFsZXJ0PXRydWVcIixcbiAgXCJkaXNhYmxlUmVzaXplT3ZlcmxheT10cnVlXCIsXG5dO1xuXG5leHBvcnQgY29uc3QgTGFrZWJveENvbnRyb2xsZXJEZWZpbml0aW9uU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBuYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiU2VydmljZSBuYW1lLlwiKSxcbiAgICBraW5kOiBsYWtlYm94U2VydmljZUtpbmRTY2hlbWEsXG4gICAgaW1hZ2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIk9DSSBpbWFnZSBmb3IgaW1hZ2Ugc2VydmljZXMuXCIpLFxuICAgIHB1bGw6IHouZW51bShbXCJtaXNzaW5nXCIsIFwiYWx3YXlzXCJdKS5kZWZhdWx0KFwibWlzc2luZ1wiKS5kZXNjcmliZShcIkltYWdlIHB1bGwgcG9saWN5LlwiKSxcbiAgICBjb21tYW5kOiB6XG4gICAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJBcmd2OyBvbWl0dGVkIHRvIHVzZSB0aGUgaW1hZ2UgZW50cnlwb2ludCBhbmQgY29tbWFuZC5cIiksXG4gICAgZW52OiB6XG4gICAgICAucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpXG4gICAgICAuZGVzY3JpYmUoXCJDb250YWluZXIgZW52aXJvbm1lbnQsIGluY2x1ZGluZyBpbmplY3RlZCB2YWx1ZXMuXCIpLFxuICAgIHdvcmtpbmdEaXJlY3Rvcnk6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkNvbnRhaW5lciB3b3JraW5nIGRpcmVjdG9yeS5cIiksXG4gICAgbW91bnRzOiB6XG4gICAgICAuYXJyYXkoXG4gICAgICAgIHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHNvdXJjZTogelxuICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICAgICAgICAgIC5kZXNjcmliZShcIkFic29sdXRlIGhvc3QgcGF0aCBiZW5lYXRoIHRoZSB1c2VyJ3MgaG9tZS5cIiksXG4gICAgICAgICAgICB0YXJnZXQ6IHouc3RyaW5nKCkuc3RhcnRzV2l0aChcIi9cIikuZGVzY3JpYmUoXCJDb250YWluZXIgcGF0aC5cIiksXG4gICAgICAgICAgICByZWFkT25seTogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJSZWFkLW9ubHkgYmluZC5cIiksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc3RyaWN0KCksXG4gICAgICApXG4gICAgICAuZGVzY3JpYmUoXCJCaW5kIG1vdW50cy5cIiksXG4gICAgcG9ydDogei5udW1iZXIoKS5pbnQoKS5kZXNjcmliZShcIkRlcml2ZWQgbG9vcGJhY2sgcG9ydC5cIiksXG4gICAgcmVhZGluZXNzOiB6LmVudW0oW1widGNwXCIsIFwibm9uZVwiXSkuZGVzY3JpYmUoXCJSZWFkaW5lc3MgY2hlY2suXCIpLFxuICAgIHJlYWR5U2Vjb25kczogei5udW1iZXIoKS5pbnQoKS5wb3NpdGl2ZSgpLmRlc2NyaWJlKFwiTWF4aW11bSByZWFkaW5lc3Mgd2FpdC5cIiksXG4gICAgYXV0b3N0YXJ0OiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIldoZXRoZXIgdGhlIHNlcnZpY2UgcmVzdGFydHMgd2hlbiB0aGUgTGFrZWJveCBzdGFydHMuXCIpLFxuICAgIHJvdXRlOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIldoZXRoZXIgQXBwS2l0IHJvdXRlcyB0aGUgc2VydmljZS5cIiksXG4gICAgc3RyaXBQcmVmaXg6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiV2hldGhlciB0aGUgcm91dGUgcHJlZml4IGlzIHJlbW92ZWQgYmVmb3JlIGZvcndhcmRpbmcuXCIpLFxuICAgIG9wZW5QYXRoOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFbnRyeSBwYXRoIGFwcGVuZGVkIHRvIHRoZSByb3V0ZS5cIiksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJTZXJ2aWNlIGRlZmluaXRpb24gcGVyc2lzdGVkIGluIHRoZSB1c2VyJ3MgTGFrZWJveCBob21lIGFuZCByZWFkIGJ5IHRoZSBjb250cm9sbGVyLlwiKTtcbi8qKiBTZXJ2aWNlIGRlZmluaXRpb24gcGVyc2lzdGVkIGluIHRoZSB1c2VyJ3MgTGFrZWJveCBob21lLiAqL1xuZXhwb3J0IHR5cGUgTGFrZWJveENvbnRyb2xsZXJEZWZpbml0aW9uID0gei5vdXRwdXQ8dHlwZW9mIExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvblNjaGVtYT47XG5cbmV4cG9ydCBjb25zdCBMYWtlYm94Q29udHJvbGxlclNlcnZpY2VTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgc3RhdGU6IGxha2Vib3hTZXJ2aWNlU3RhdGVTY2hlbWEsXG4gICAgZGVmaW5pdGlvbjogTGFrZWJveENvbnRyb2xsZXJEZWZpbml0aW9uU2NoZW1hLFxuICAgIGVycm9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgbG9nOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5wYXNzdGhyb3VnaCgpXG4gIC5kZXNjcmliZShcIk9uZSBzZXJ2aWNlIGFzIHJlcG9ydGVkIGJ5IHRoZSByZW1vdGUgY29udHJvbGxlci5cIik7XG4vKiogT25lIHNlcnZpY2UgYXMgcmVwb3J0ZWQgYnkgdGhlIHJlbW90ZSBjb250cm9sbGVyLiAqL1xuZXhwb3J0IHR5cGUgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlID0gei5pbmZlcjx0eXBlb2YgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlU2NoZW1hPjtcblxuLyoqIFJvdXRpbmcgYmVoYXZpb3IgZGVyaXZlZCBmcm9tIGEgc2F2ZWQgZGVmaW5pdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJveFNlcnZpY2VSb3V0ZSB7XG4gIHBvcnQ6IG51bWJlcjtcbiAgc3RyaXBQcmVmaXg6IGJvb2xlYW47XG4gIHJlZGlyZWN0VG9TbGFzaDogYm9vbGVhbjtcbiAgaHRtbEhlYWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBCdWlsZHMgdGhlIHBhY2thZ2Utb3duZWQgZGVmaW5pdGlvbiBmb3IgYSBidWlsdC1pbiBzZXJ2aWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWx0SW5EZWZpbml0aW9uKFxuICBuYW1lOiBMYWtlYm94QnVpbHRJblNlcnZpY2VOYW1lLFxuICB1c2VyOiBMYWtlYm94VXNlcixcbik6IExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbiB7XG4gIGNvbnN0IHBvcnQgPSBsYWtlYm94U2VydmljZVBvcnQodXNlci5oYXNoLCBuYW1lKTtcbiAgY29uc3QgY29tbW9uID0ge1xuICAgIG5hbWUsXG4gICAga2luZDogbmFtZSxcbiAgICBwdWxsOiBcIm1pc3NpbmdcIiBhcyBjb25zdCxcbiAgICBtb3VudHM6IFtdLFxuICAgIHBvcnQsXG4gICAgcmVhZGluZXNzOiBcInRjcFwiIGFzIGNvbnN0LFxuICAgIGF1dG9zdGFydDogZmFsc2UsXG4gICAgcm91dGU6IHRydWUsXG4gICAgc3RyaXBQcmVmaXg6IHRydWUsXG4gIH07XG4gIGlmIChuYW1lID09PSBcInRlcm1pbmFsXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tbW9uLFxuICAgICAgcmVhZHlTZWNvbmRzOiA2MCxcbiAgICAgIGVudjogaW5qZWN0ZWRFbnZpcm9ubWVudCh1c2VyLCBuYW1lLCBwb3J0KSxcbiAgICAgIGNvbW1hbmQ6IFtcbiAgICAgICAgYCR7TEFLRUJPWF9SVU5USU1FX1JPT1R9L2Jpbi90dHlkYCxcbiAgICAgICAgXCItLWludGVyZmFjZVwiLFxuICAgICAgICBcIjEyNy4wLjAuMVwiLFxuICAgICAgICBcIi0tcG9ydFwiLFxuICAgICAgICBTdHJpbmcocG9ydCksXG4gICAgICAgIFwiLS13cml0YWJsZVwiLFxuICAgICAgICAuLi5UVFlEX0NMSUVOVF9PUFRJT05TLmZsYXRNYXAoKG9wdGlvbikgPT4gW1wiLS1jbGllbnQtb3B0aW9uXCIsIG9wdGlvbl0pLFxuICAgICAgICBcIi9iaW4vYmFzaFwiLFxuICAgICAgICBcIi1sXCIsXG4gICAgICBdLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5jb21tb24sXG4gICAgcmVhZHlTZWNvbmRzOiAxODAsXG4gICAgZW52OiB7IC4uLmRlc2t0b3BFbnZpcm9ubWVudCgpLCAuLi5pbmplY3RlZEVudmlyb25tZW50KHVzZXIsIG5hbWUsIHBvcnQpIH0sXG4gICAgY29tbWFuZDogW1wiL2Jpbi9zaFwiLCBgJHtMQUtFQk9YX1JVTlRJTUVfUk9PVH0vYmluL2Rlc2t0b3Atc2Vzc2lvbmBdLFxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhbiBhZ2VudCBvciBSRVNUIHNlcnZpY2UgcmVxdWVzdCBhbmQgcmVzb2x2ZXMgaXQgdG8gYSBwZXJzaXN0ZWRcbiAqIGRlZmluaXRpb24gd2l0aCBpbmplY3RlZCB2YXJpYWJsZXMgYW5kIGhvbWUtcmVsYXRpdmUgbW91bnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VEZWZpbml0aW9uKFxuICBpbnB1dDogQ3JlYXRlTGFrZWJveFNlcnZpY2VSZXF1ZXN0LFxuICB1c2VyOiBMYWtlYm94VXNlcixcbik6IExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbiB7XG4gIGNvbnN0IHJlcXVlc3QgPSBjcmVhdGVMYWtlYm94U2VydmljZVJlcXVlc3RTY2hlbWEucGFyc2UoaW5wdXQpO1xuICBjb25zdCBwb3J0ID0gbGFrZWJveFNlcnZpY2VQb3J0KHVzZXIuaGFzaCwgcmVxdWVzdC5uYW1lKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiByZXF1ZXN0Lm5hbWUsXG4gICAga2luZDogXCJpbWFnZVwiLFxuICAgIGltYWdlOiByZXF1ZXN0LmltYWdlLFxuICAgIHB1bGw6IHJlcXVlc3QucHVsbCxcbiAgICAuLi4ocmVxdWVzdC5jb21tYW5kID8geyBjb21tYW5kOiByZXF1ZXN0LmNvbW1hbmQgfSA6IHt9KSxcbiAgICBlbnY6IHsgLi4ucmVxdWVzdC5lbnYsIC4uLmluamVjdGVkRW52aXJvbm1lbnQodXNlciwgcmVxdWVzdC5uYW1lLCBwb3J0LCByZXF1ZXN0LnJvdXRlKSB9LFxuICAgIC4uLihyZXF1ZXN0LndvcmtpbmdEaXJlY3RvcnkgPyB7IHdvcmtpbmdEaXJlY3Rvcnk6IHJlcXVlc3Qud29ya2luZ0RpcmVjdG9yeSB9IDoge30pLFxuICAgIG1vdW50czogcmVxdWVzdC5tb3VudHMubWFwKChtb3VudCkgPT4gKHtcbiAgICAgIHNvdXJjZTogYCR7dXNlci5ob21lfS8ke21vdW50LnNvdXJjZS5yZXBsYWNlKC9eXFwuXFwvK3xcXC8rJC9nLCBcIlwiKX1gLFxuICAgICAgdGFyZ2V0OiBtb3VudC50YXJnZXQsXG4gICAgICByZWFkT25seTogbW91bnQucmVhZE9ubHksXG4gICAgfSkpLFxuICAgIHBvcnQsXG4gICAgcmVhZGluZXNzOiByZXF1ZXN0LnJvdXRlID8gXCJ0Y3BcIiA6IFwibm9uZVwiLFxuICAgIHJlYWR5U2Vjb25kczogMzAwLFxuICAgIGF1dG9zdGFydDogdHJ1ZSxcbiAgICByb3V0ZTogcmVxdWVzdC5yb3V0ZSxcbiAgICBzdHJpcFByZWZpeDogcmVxdWVzdC5zdHJpcFByZWZpeCxcbiAgICAuLi4ocmVxdWVzdC5vcGVuUGF0aCA/IHsgb3BlblBhdGg6IHJlcXVlc3Qub3BlblBhdGgucmVwbGFjZSgvXlxcLysvLCBcIlwiKSB9IDoge30pLFxuICB9O1xufVxuXG4vKiogUmV0dXJucyByb3V0ZSBiZWhhdmlvciBmb3IgYSBzYXZlZCBkZWZpbml0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VSb3V0ZShkZWZpbml0aW9uOiBMYWtlYm94Q29udHJvbGxlckRlZmluaXRpb24pOiBMYWtlYm94U2VydmljZVJvdXRlIHtcbiAgcmV0dXJuIHtcbiAgICBwb3J0OiBkZWZpbml0aW9uLnBvcnQsXG4gICAgc3RyaXBQcmVmaXg6IGRlZmluaXRpb24uc3RyaXBQcmVmaXgsXG4gICAgcmVkaXJlY3RUb1NsYXNoOiB0cnVlLFxuICAgIC4uLihkZWZpbml0aW9uLmtpbmQgPT09IFwiZGVza3RvcFwiID8geyBodG1sSGVhZDogZGVza3RvcEh0bWxIZWFkIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBNYXBzIGEgY29udHJvbGxlciByZXBvcnQgdG8gdGhlIHNoYXJlZCBzZXJ2aWNlIHNoYXBlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTGFrZWJveFNlcnZpY2UoXG4gIHNlcnZpY2U6IExha2Vib3hDb250cm9sbGVyU2VydmljZSxcbiAgdXNlcjogTGFrZWJveFVzZXIsXG4gIHJvdXRlUHJlZml4OiBzdHJpbmcsXG4pOiBMYWtlYm94U2VydmljZSB7XG4gIGNvbnN0IHsgZGVmaW5pdGlvbiB9ID0gc2VydmljZTtcbiAgY29uc3QgcGF0aCA9IGxha2Vib3hTZXJ2aWNlUGF0aChyb3V0ZVByZWZpeCwgdXNlci5oYXNoLCBkZWZpbml0aW9uLm5hbWUpO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGRlZmluaXRpb24ubmFtZSxcbiAgICBraW5kOiBkZWZpbml0aW9uLmtpbmQsXG4gICAgLi4uKGRlZmluaXRpb24uaW1hZ2UgPyB7IGltYWdlOiBkZWZpbml0aW9uLmltYWdlIH0gOiB7fSksXG4gICAgLi4uKGRlZmluaXRpb24ub3BlblBhdGggPyB7IG9wZW5QYXRoOiBkZWZpbml0aW9uLm9wZW5QYXRoIH0gOiB7fSksXG4gICAgc3RhdGU6IHNlcnZpY2Uuc3RhdGUsXG4gICAgcG9ydDogZGVmaW5pdGlvbi5wb3J0LFxuICAgIHJvdXRlOiBkZWZpbml0aW9uLnJvdXRlLFxuICAgIHBhdGgsXG4gICAgLi4uKGRlZmluaXRpb24ucm91dGUgPyB7IG9wZW5Vcmw6IG9wZW5VcmwoZGVmaW5pdGlvbiwgcGF0aCkgfSA6IHt9KSxcbiAgICAuLi4oc2VydmljZS5lcnJvciA/IHsgZXJyb3I6IHNlcnZpY2UuZXJyb3IgfSA6IHt9KSxcbiAgICAuLi4oc2VydmljZS5sb2cgIT09IHVuZGVmaW5lZCA/IHsgbG9nOiBzZXJ2aWNlLmxvZyB9IDoge30pLFxuICB9O1xufVxuXG4vKiogUmVzb2x2ZSBhIHJvdXRlZCBzZXJ2aWNlIHBhdGggYWdhaW5zdCB0aGUgYnJvd3NlciBhcHAgb3JpZ2luIGZvciBhZ2VudCBvdXRwdXQuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNlcnZpY2VPcmlnaW4oc2VydmljZTogTGFrZWJveFNlcnZpY2UsIG9yaWdpbj86IHN0cmluZyk6IExha2Vib3hTZXJ2aWNlIHtcbiAgaWYgKCFzZXJ2aWNlLm9wZW5VcmwgfHwgIW9yaWdpbikgcmV0dXJuIHNlcnZpY2U7XG4gIHRyeSB7XG4gICAgY29uc3QgYmFzZSA9IG5ldyBVUkwob3JpZ2luKTtcbiAgICBpZiAoYmFzZS5wcm90b2NvbCAhPT0gXCJodHRwOlwiICYmIGJhc2UucHJvdG9jb2wgIT09IFwiaHR0cHM6XCIpIHJldHVybiBzZXJ2aWNlO1xuICAgIHJldHVybiB7IC4uLnNlcnZpY2UsIG9wZW5Vcmw6IG5ldyBVUkwoc2VydmljZS5vcGVuVXJsLCBiYXNlKS5ocmVmIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBzZXJ2aWNlO1xuICB9XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBzdG9wcGVkIHBsYWNlaG9sZGVyIGZvciBhIGJ1aWx0LWluIHNlcnZpY2UgdGhhdCBoYXMgbmV2ZXIgc3RhcnRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGxlQnVpbHRJblNlcnZpY2UoXG4gIG5hbWU6IExha2Vib3hCdWlsdEluU2VydmljZU5hbWUsXG4gIHVzZXI6IExha2Vib3hVc2VyLFxuICByb3V0ZVByZWZpeDogc3RyaW5nLFxuKTogTGFrZWJveFNlcnZpY2Uge1xuICByZXR1cm4gdG9MYWtlYm94U2VydmljZShcbiAgICB7IG5hbWUsIHN0YXRlOiBcInN0b3BwZWRcIiwgZGVmaW5pdGlvbjogYnVpbHRJbkRlZmluaXRpb24obmFtZSwgdXNlcikgfSxcbiAgICB1c2VyLFxuICAgIHJvdXRlUHJlZml4LFxuICApO1xufVxuXG5mdW5jdGlvbiBvcGVuVXJsKGRlZmluaXRpb246IExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbiwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGRlZmluaXRpb24ua2luZCA9PT0gXCJkZXNrdG9wXCIpIHJldHVybiBkZXNrdG9wT3BlblVybChwYXRoKTtcbiAgcmV0dXJuIGAke3BhdGh9LyR7ZGVmaW5pdGlvbi5vcGVuUGF0aCA/PyBcIlwifWA7XG59XG5cbmZ1bmN0aW9uIGluamVjdGVkRW52aXJvbm1lbnQoXG4gIHVzZXI6IExha2Vib3hVc2VyLFxuICBuYW1lOiBzdHJpbmcsXG4gIHBvcnQ6IG51bWJlcixcbiAgcm91dGUgPSB0cnVlLFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHZhbHVlID0gU3RyaW5nKHBvcnQpO1xuICByZXR1cm4ge1xuICAgIFNFUlZJQ0VfTkFNRTogbmFtZSxcbiAgICBTRVJWSUNFX1BBVEg6IHJvdXRlID8gYCR7dXNlci5yb3V0ZVByZWZpeH0vJHtuYW1lfWAgOiBcIlwiLFxuICAgIFNFUlZJQ0VfUE9SVDogdmFsdWUsXG4gICAgUE9SVDogdmFsdWUsXG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { LocalSkillDirectoryMount } from "@dbx-tools/appkit-mastra";
|
|
2
|
+
/** Default agent-workspace path for packaged Lakebox service recipes. */
|
|
3
|
+
export declare const LAKEBOX_SKILLS_MOUNT = "/.dbx-tools/skills";
|
|
4
|
+
/** Returns the packaged Lakebox recipe tree as a Mastra local skill mount. */
|
|
5
|
+
export declare function lakeboxSkillMounts(): LocalSkillDirectoryMount[];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
/** Default agent-workspace path for packaged Lakebox service recipes. */
|
|
5
|
+
export const LAKEBOX_SKILLS_MOUNT = "/.dbx-tools/skills";
|
|
6
|
+
/** Returns the packaged Lakebox recipe tree as a Mastra local skill mount. */
|
|
7
|
+
export function lakeboxSkillMounts() {
|
|
8
|
+
return [{ root: lakeboxSkillsRoot(), mountPath: LAKEBOX_SKILLS_MOUNT }];
|
|
9
|
+
}
|
|
10
|
+
function lakeboxSkillsRoot() {
|
|
11
|
+
const moduleDirectory = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const candidates = [
|
|
13
|
+
resolve(moduleDirectory, "../skills"),
|
|
14
|
+
resolve(moduleDirectory, "../../skills"),
|
|
15
|
+
];
|
|
16
|
+
const root = candidates.find((candidate) => existsSync(candidate));
|
|
17
|
+
if (!root)
|
|
18
|
+
throw new Error("Packaged Lakebox skills are unavailable");
|
|
19
|
+
return root;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tpbGxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NraWxscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHekMseUVBQXlFO0FBQ3pFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO0FBRXpELDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsa0JBQWtCO0lBQ2hDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUVELFNBQVMsaUJBQWlCO0lBQ3hCLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLE9BQU8sQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDO0tBQ3pDLENBQUM7SUFDRixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNuRSxJQUFJLENBQUMsSUFBSTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUN0RSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgdHlwZSB7IExvY2FsU2tpbGxEaXJlY3RvcnlNb3VudCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcblxuLyoqIERlZmF1bHQgYWdlbnQtd29ya3NwYWNlIHBhdGggZm9yIHBhY2thZ2VkIExha2Vib3ggc2VydmljZSByZWNpcGVzLiAqL1xuZXhwb3J0IGNvbnN0IExBS0VCT1hfU0tJTExTX01PVU5UID0gXCIvLmRieC10b29scy9za2lsbHNcIjtcblxuLyoqIFJldHVybnMgdGhlIHBhY2thZ2VkIExha2Vib3ggcmVjaXBlIHRyZWUgYXMgYSBNYXN0cmEgbG9jYWwgc2tpbGwgbW91bnQuICovXG5leHBvcnQgZnVuY3Rpb24gbGFrZWJveFNraWxsTW91bnRzKCk6IExvY2FsU2tpbGxEaXJlY3RvcnlNb3VudFtdIHtcbiAgcmV0dXJuIFt7IHJvb3Q6IGxha2Vib3hTa2lsbHNSb290KCksIG1vdW50UGF0aDogTEFLRUJPWF9TS0lMTFNfTU9VTlQgfV07XG59XG5cbmZ1bmN0aW9uIGxha2Vib3hTa2lsbHNSb290KCk6IHN0cmluZyB7XG4gIGNvbnN0IG1vZHVsZURpcmVjdG9yeSA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICByZXNvbHZlKG1vZHVsZURpcmVjdG9yeSwgXCIuLi9za2lsbHNcIiksXG4gICAgcmVzb2x2ZShtb2R1bGVEaXJlY3RvcnksIFwiLi4vLi4vc2tpbGxzXCIpLFxuICBdO1xuICBjb25zdCByb290ID0gY2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGV4aXN0c1N5bmMoY2FuZGlkYXRlKSk7XG4gIGlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKFwiUGFja2FnZWQgTGFrZWJveCBza2lsbHMgYXJlIHVuYXZhaWxhYmxlXCIpO1xuICByZXR1cm4gcm9vdDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic Lakebox user and service-port derivation.
|
|
3
|
+
*
|
|
4
|
+
* One FNV-1a hash of the authenticated identity is the only routing key. It
|
|
5
|
+
* selects the Linux account, UID, persistent home, AppKit route segment, and,
|
|
6
|
+
* with a service name, the loopback service port. Nothing here is persisted:
|
|
7
|
+
* every caller recomputes the same values, and collisions fail closed where
|
|
8
|
+
* they are observed.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import type { LakeboxUser } from "@dbx-tools/shared-lakebox";
|
|
13
|
+
/** Platform account that owns the persistent volume and the SSH session. */
|
|
14
|
+
export declare const LAKEBOX_AGENT_USER = "sandbox-agent";
|
|
15
|
+
/** Persistent home mounted by the platform. Only this path survives a restart. */
|
|
16
|
+
export declare const LAKEBOX_AGENT_HOME = "/home/sandbox-agent";
|
|
17
|
+
/** Root of package-owned persistent state. */
|
|
18
|
+
export declare const LAKEBOX_STATE_ROOT = "/home/sandbox-agent/.dbx-tools";
|
|
19
|
+
/** Persistent backing directories for Lakebox user homes. */
|
|
20
|
+
export declare const LAKEBOX_USERS_ROOT = "/home/sandbox-agent/.dbx-tools/users";
|
|
21
|
+
/** Shared read-only runtime binaries, such as the container bundle and ttyd. */
|
|
22
|
+
export declare const LAKEBOX_RUNTIME_ROOT = "/home/sandbox-agent/.dbx-tools/runtime";
|
|
23
|
+
/** Per-boot runtime state root; reset with the root filesystem. */
|
|
24
|
+
export declare const LAKEBOX_RUN_ROOT = "/run/lakebox";
|
|
25
|
+
/** First derived Linux UID. The persistent idmapped volume stores UIDs below 65536. */
|
|
26
|
+
export declare const LAKEBOX_UID_MIN = 20000;
|
|
27
|
+
/** Number of derivable UIDs. */
|
|
28
|
+
export declare const LAKEBOX_UID_COUNT = 40000;
|
|
29
|
+
/** First derived service port. Platform listeners stay below this value. */
|
|
30
|
+
export declare const LAKEBOX_PORT_MIN = 20000;
|
|
31
|
+
/** Number of derivable service ports; the kernel ephemeral range starts at 32768. */
|
|
32
|
+
export declare const LAKEBOX_PORT_COUNT = 12000;
|
|
33
|
+
/** Normalizes an authenticated identity before hashing. */
|
|
34
|
+
export declare function normalizeLakeboxIdentity(identity: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* Derives the Lakebox account for one authenticated identity.
|
|
37
|
+
*
|
|
38
|
+
* @param routePrefix - AppKit root for user service routes.
|
|
39
|
+
*/
|
|
40
|
+
export declare function lakeboxUser(identity: string, routePrefix: string): LakeboxUser;
|
|
41
|
+
/** Returns the persistent backing directory for a user hash. */
|
|
42
|
+
export declare function lakeboxPersistentHome(userHash: string): string;
|
|
43
|
+
/** Derives the loopback port for one user's service. */
|
|
44
|
+
export declare function lakeboxServicePort(userHash: string, serviceName: string): number;
|
|
45
|
+
/** Returns whether a route segment has the shape of a user hash. */
|
|
46
|
+
export declare function isLakeboxUserHash(value: string): boolean;
|
package/lib/src/user.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic Lakebox user and service-port derivation.
|
|
3
|
+
*
|
|
4
|
+
* One FNV-1a hash of the authenticated identity is the only routing key. It
|
|
5
|
+
* selects the Linux account, UID, persistent home, AppKit route segment, and,
|
|
6
|
+
* with a service name, the loopback service port. Nothing here is persisted:
|
|
7
|
+
* every caller recomputes the same values, and collisions fail closed where
|
|
8
|
+
* they are observed.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import { hash } from "@dbx-tools/shared-core";
|
|
13
|
+
/** Platform account that owns the persistent volume and the SSH session. */
|
|
14
|
+
export const LAKEBOX_AGENT_USER = "sandbox-agent";
|
|
15
|
+
/** Persistent home mounted by the platform. Only this path survives a restart. */
|
|
16
|
+
export const LAKEBOX_AGENT_HOME = `/home/${LAKEBOX_AGENT_USER}`;
|
|
17
|
+
/** Root of package-owned persistent state. */
|
|
18
|
+
export const LAKEBOX_STATE_ROOT = `${LAKEBOX_AGENT_HOME}/.dbx-tools`;
|
|
19
|
+
/** Persistent backing directories for Lakebox user homes. */
|
|
20
|
+
export const LAKEBOX_USERS_ROOT = `${LAKEBOX_STATE_ROOT}/users`;
|
|
21
|
+
/** Shared read-only runtime binaries, such as the container bundle and ttyd. */
|
|
22
|
+
export const LAKEBOX_RUNTIME_ROOT = `${LAKEBOX_STATE_ROOT}/runtime`;
|
|
23
|
+
/** Per-boot runtime state root; reset with the root filesystem. */
|
|
24
|
+
export const LAKEBOX_RUN_ROOT = "/run/lakebox";
|
|
25
|
+
/** First derived Linux UID. The persistent idmapped volume stores UIDs below 65536. */
|
|
26
|
+
export const LAKEBOX_UID_MIN = 20_000;
|
|
27
|
+
/** Number of derivable UIDs. */
|
|
28
|
+
export const LAKEBOX_UID_COUNT = 40_000;
|
|
29
|
+
/** First derived service port. Platform listeners stay below this value. */
|
|
30
|
+
export const LAKEBOX_PORT_MIN = 20_000;
|
|
31
|
+
/** Number of derivable service ports; the kernel ephemeral range starts at 32768. */
|
|
32
|
+
export const LAKEBOX_PORT_COUNT = 12_000;
|
|
33
|
+
const USER_PREFIX = "lakebox-";
|
|
34
|
+
const HASH_ALPHABET = "0123456789abcdefghijklmnopqrstuv";
|
|
35
|
+
/** Normalizes an authenticated identity before hashing. */
|
|
36
|
+
export function normalizeLakeboxIdentity(identity) {
|
|
37
|
+
const normalized = identity.trim().toLowerCase();
|
|
38
|
+
if (!normalized)
|
|
39
|
+
throw new Error("Lakebox users require an authenticated identity");
|
|
40
|
+
return normalized;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Derives the Lakebox account for one authenticated identity.
|
|
44
|
+
*
|
|
45
|
+
* @param routePrefix - AppKit root for user service routes.
|
|
46
|
+
*/
|
|
47
|
+
export function lakeboxUser(identity, routePrefix) {
|
|
48
|
+
const userHash = digestText("lakebox-user", normalizeLakeboxIdentity(identity));
|
|
49
|
+
const name = `${USER_PREFIX}${userHash}`;
|
|
50
|
+
return {
|
|
51
|
+
hash: userHash,
|
|
52
|
+
name,
|
|
53
|
+
uid: LAKEBOX_UID_MIN + (digestValue("lakebox-uid", userHash) % LAKEBOX_UID_COUNT),
|
|
54
|
+
home: `/home/${name}`,
|
|
55
|
+
routePrefix: `${routePrefix.replace(/\/+$/, "")}/${userHash}`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Returns the persistent backing directory for a user hash. */
|
|
59
|
+
export function lakeboxPersistentHome(userHash) {
|
|
60
|
+
return `${LAKEBOX_USERS_ROOT}/${userHash}`;
|
|
61
|
+
}
|
|
62
|
+
/** Derives the loopback port for one user's service. */
|
|
63
|
+
export function lakeboxServicePort(userHash, serviceName) {
|
|
64
|
+
return (LAKEBOX_PORT_MIN + (digestValue("lakebox-port", userHash, serviceName) % LAKEBOX_PORT_COUNT));
|
|
65
|
+
}
|
|
66
|
+
/** Returns whether a route segment has the shape of a user hash. */
|
|
67
|
+
export function isLakeboxUserHash(value) {
|
|
68
|
+
return /^[0-9a-v]{7}$/.test(value);
|
|
69
|
+
}
|
|
70
|
+
function digestText(...values) {
|
|
71
|
+
return hash.fnvHashWithOptions({ length: 7, alphabet: HASH_ALPHABET }, ...values);
|
|
72
|
+
}
|
|
73
|
+
function digestValue(...values) {
|
|
74
|
+
return Number.parseInt(digestText(...values), 32);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91c2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHOUMsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLGVBQWUsQ0FBQztBQUNsRCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxrQkFBa0IsRUFBRSxDQUFDO0FBQ2hFLDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLGtCQUFrQixhQUFhLENBQUM7QUFDckUsNkRBQTZEO0FBQzdELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsa0JBQWtCLFFBQVEsQ0FBQztBQUNoRSxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxrQkFBa0IsVUFBVSxDQUFDO0FBQ3BFLG1FQUFtRTtBQUNuRSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUM7QUFFL0MsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUM7QUFDdEMsZ0NBQWdDO0FBQ2hDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztBQUN4Qyw0RUFBNEU7QUFDNUUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLHFGQUFxRjtBQUNyRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFFekMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO0FBQy9CLE1BQU0sYUFBYSxHQUFHLGtDQUFrQyxDQUFDO0FBRXpELDJEQUEyRDtBQUMzRCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsUUFBZ0I7SUFDdkQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pELElBQUksQ0FBQyxVQUFVO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0lBQ3BGLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxRQUFnQixFQUFFLFdBQW1CO0lBQy9ELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxjQUFjLEVBQUUsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNoRixNQUFNLElBQUksR0FBRyxHQUFHLFdBQVcsR0FBRyxRQUFRLEVBQUUsQ0FBQztJQUN6QyxPQUFPO1FBQ0wsSUFBSSxFQUFFLFFBQVE7UUFDZCxJQUFJO1FBQ0osR0FBRyxFQUFFLGVBQWUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7UUFDakYsSUFBSSxFQUFFLFNBQVMsSUFBSSxFQUFFO1FBQ3JCLFdBQVcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRTtLQUM5RCxDQUFDO0FBQ0osQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxNQUFNLFVBQVUscUJBQXFCLENBQUMsUUFBZ0I7SUFDcEQsT0FBTyxHQUFHLGtCQUFrQixJQUFJLFFBQVEsRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFFRCx3REFBd0Q7QUFDeEQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFFBQWdCLEVBQUUsV0FBbUI7SUFDdEUsT0FBTyxDQUNMLGdCQUFnQixHQUFHLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FDN0YsQ0FBQztBQUNKLENBQUM7QUFFRCxvRUFBb0U7QUFDcEUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWE7SUFDN0MsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxHQUFHLE1BQWdCO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUNwRixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsR0FBRyxNQUFnQjtJQUN0QyxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGV0ZXJtaW5pc3RpYyBMYWtlYm94IHVzZXIgYW5kIHNlcnZpY2UtcG9ydCBkZXJpdmF0aW9uLlxuICpcbiAqIE9uZSBGTlYtMWEgaGFzaCBvZiB0aGUgYXV0aGVudGljYXRlZCBpZGVudGl0eSBpcyB0aGUgb25seSByb3V0aW5nIGtleS4gSXRcbiAqIHNlbGVjdHMgdGhlIExpbnV4IGFjY291bnQsIFVJRCwgcGVyc2lzdGVudCBob21lLCBBcHBLaXQgcm91dGUgc2VnbWVudCwgYW5kLFxuICogd2l0aCBhIHNlcnZpY2UgbmFtZSwgdGhlIGxvb3BiYWNrIHNlcnZpY2UgcG9ydC4gTm90aGluZyBoZXJlIGlzIHBlcnNpc3RlZDpcbiAqIGV2ZXJ5IGNhbGxlciByZWNvbXB1dGVzIHRoZSBzYW1lIHZhbHVlcywgYW5kIGNvbGxpc2lvbnMgZmFpbCBjbG9zZWQgd2hlcmVcbiAqIHRoZXkgYXJlIG9ic2VydmVkLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBoYXNoIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgTGFrZWJveFVzZXIgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbGFrZWJveFwiO1xuXG4vKiogUGxhdGZvcm0gYWNjb3VudCB0aGF0IG93bnMgdGhlIHBlcnNpc3RlbnQgdm9sdW1lIGFuZCB0aGUgU1NIIHNlc3Npb24uICovXG5leHBvcnQgY29uc3QgTEFLRUJPWF9BR0VOVF9VU0VSID0gXCJzYW5kYm94LWFnZW50XCI7XG4vKiogUGVyc2lzdGVudCBob21lIG1vdW50ZWQgYnkgdGhlIHBsYXRmb3JtLiBPbmx5IHRoaXMgcGF0aCBzdXJ2aXZlcyBhIHJlc3RhcnQuICovXG5leHBvcnQgY29uc3QgTEFLRUJPWF9BR0VOVF9IT01FID0gYC9ob21lLyR7TEFLRUJPWF9BR0VOVF9VU0VSfWA7XG4vKiogUm9vdCBvZiBwYWNrYWdlLW93bmVkIHBlcnNpc3RlbnQgc3RhdGUuICovXG5leHBvcnQgY29uc3QgTEFLRUJPWF9TVEFURV9ST09UID0gYCR7TEFLRUJPWF9BR0VOVF9IT01FfS8uZGJ4LXRvb2xzYDtcbi8qKiBQZXJzaXN0ZW50IGJhY2tpbmcgZGlyZWN0b3JpZXMgZm9yIExha2Vib3ggdXNlciBob21lcy4gKi9cbmV4cG9ydCBjb25zdCBMQUtFQk9YX1VTRVJTX1JPT1QgPSBgJHtMQUtFQk9YX1NUQVRFX1JPT1R9L3VzZXJzYDtcbi8qKiBTaGFyZWQgcmVhZC1vbmx5IHJ1bnRpbWUgYmluYXJpZXMsIHN1Y2ggYXMgdGhlIGNvbnRhaW5lciBidW5kbGUgYW5kIHR0eWQuICovXG5leHBvcnQgY29uc3QgTEFLRUJPWF9SVU5USU1FX1JPT1QgPSBgJHtMQUtFQk9YX1NUQVRFX1JPT1R9L3J1bnRpbWVgO1xuLyoqIFBlci1ib290IHJ1bnRpbWUgc3RhdGUgcm9vdDsgcmVzZXQgd2l0aCB0aGUgcm9vdCBmaWxlc3lzdGVtLiAqL1xuZXhwb3J0IGNvbnN0IExBS0VCT1hfUlVOX1JPT1QgPSBcIi9ydW4vbGFrZWJveFwiO1xuXG4vKiogRmlyc3QgZGVyaXZlZCBMaW51eCBVSUQuIFRoZSBwZXJzaXN0ZW50IGlkbWFwcGVkIHZvbHVtZSBzdG9yZXMgVUlEcyBiZWxvdyA2NTUzNi4gKi9cbmV4cG9ydCBjb25zdCBMQUtFQk9YX1VJRF9NSU4gPSAyMF8wMDA7XG4vKiogTnVtYmVyIG9mIGRlcml2YWJsZSBVSURzLiAqL1xuZXhwb3J0IGNvbnN0IExBS0VCT1hfVUlEX0NPVU5UID0gNDBfMDAwO1xuLyoqIEZpcnN0IGRlcml2ZWQgc2VydmljZSBwb3J0LiBQbGF0Zm9ybSBsaXN0ZW5lcnMgc3RheSBiZWxvdyB0aGlzIHZhbHVlLiAqL1xuZXhwb3J0IGNvbnN0IExBS0VCT1hfUE9SVF9NSU4gPSAyMF8wMDA7XG4vKiogTnVtYmVyIG9mIGRlcml2YWJsZSBzZXJ2aWNlIHBvcnRzOyB0aGUga2VybmVsIGVwaGVtZXJhbCByYW5nZSBzdGFydHMgYXQgMzI3NjguICovXG5leHBvcnQgY29uc3QgTEFLRUJPWF9QT1JUX0NPVU5UID0gMTJfMDAwO1xuXG5jb25zdCBVU0VSX1BSRUZJWCA9IFwibGFrZWJveC1cIjtcbmNvbnN0IEhBU0hfQUxQSEFCRVQgPSBcIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2XCI7XG5cbi8qKiBOb3JtYWxpemVzIGFuIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkgYmVmb3JlIGhhc2hpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTGFrZWJveElkZW50aXR5KGlkZW50aXR5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkID0gaWRlbnRpdHkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghbm9ybWFsaXplZCkgdGhyb3cgbmV3IEVycm9yKFwiTGFrZWJveCB1c2VycyByZXF1aXJlIGFuIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHlcIik7XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vKipcbiAqIERlcml2ZXMgdGhlIExha2Vib3ggYWNjb3VudCBmb3Igb25lIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkuXG4gKlxuICogQHBhcmFtIHJvdXRlUHJlZml4IC0gQXBwS2l0IHJvb3QgZm9yIHVzZXIgc2VydmljZSByb3V0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYWtlYm94VXNlcihpZGVudGl0eTogc3RyaW5nLCByb3V0ZVByZWZpeDogc3RyaW5nKTogTGFrZWJveFVzZXIge1xuICBjb25zdCB1c2VySGFzaCA9IGRpZ2VzdFRleHQoXCJsYWtlYm94LXVzZXJcIiwgbm9ybWFsaXplTGFrZWJveElkZW50aXR5KGlkZW50aXR5KSk7XG4gIGNvbnN0IG5hbWUgPSBgJHtVU0VSX1BSRUZJWH0ke3VzZXJIYXNofWA7XG4gIHJldHVybiB7XG4gICAgaGFzaDogdXNlckhhc2gsXG4gICAgbmFtZSxcbiAgICB1aWQ6IExBS0VCT1hfVUlEX01JTiArIChkaWdlc3RWYWx1ZShcImxha2Vib3gtdWlkXCIsIHVzZXJIYXNoKSAlIExBS0VCT1hfVUlEX0NPVU5UKSxcbiAgICBob21lOiBgL2hvbWUvJHtuYW1lfWAsXG4gICAgcm91dGVQcmVmaXg6IGAke3JvdXRlUHJlZml4LnJlcGxhY2UoL1xcLyskLywgXCJcIil9LyR7dXNlckhhc2h9YCxcbiAgfTtcbn1cblxuLyoqIFJldHVybnMgdGhlIHBlcnNpc3RlbnQgYmFja2luZyBkaXJlY3RvcnkgZm9yIGEgdXNlciBoYXNoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxha2Vib3hQZXJzaXN0ZW50SG9tZSh1c2VySGFzaDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0xBS0VCT1hfVVNFUlNfUk9PVH0vJHt1c2VySGFzaH1gO1xufVxuXG4vKiogRGVyaXZlcyB0aGUgbG9vcGJhY2sgcG9ydCBmb3Igb25lIHVzZXIncyBzZXJ2aWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxha2Vib3hTZXJ2aWNlUG9ydCh1c2VySGFzaDogc3RyaW5nLCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIChcbiAgICBMQUtFQk9YX1BPUlRfTUlOICsgKGRpZ2VzdFZhbHVlKFwibGFrZWJveC1wb3J0XCIsIHVzZXJIYXNoLCBzZXJ2aWNlTmFtZSkgJSBMQUtFQk9YX1BPUlRfQ09VTlQpXG4gICk7XG59XG5cbi8qKiBSZXR1cm5zIHdoZXRoZXIgYSByb3V0ZSBzZWdtZW50IGhhcyB0aGUgc2hhcGUgb2YgYSB1c2VyIGhhc2guICovXG5leHBvcnQgZnVuY3Rpb24gaXNMYWtlYm94VXNlckhhc2godmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15bMC05YS12XXs3fSQvLnRlc3QodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBkaWdlc3RUZXh0KC4uLnZhbHVlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gaGFzaC5mbnZIYXNoV2l0aE9wdGlvbnMoeyBsZW5ndGg6IDcsIGFscGhhYmV0OiBIQVNIX0FMUEhBQkVUIH0sIC4uLnZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIGRpZ2VzdFZhbHVlKC4uLnZhbHVlczogc3RyaW5nW10pOiBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyLnBhcnNlSW50KGRpZ2VzdFRleHQoLi4udmFsdWVzKSwgMzIpO1xufVxuIl19
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { MastraSandbox, type CommandResult, type ExecuteCommandOptions, type SandboxInfo, type SandboxStartOptions, type SandboxStartResult, type WorkspaceSandbox, type WorkspaceSandboxResolver } from "@mastra/core/workspace";
|
|
2
|
+
import type { LakeboxRuntime } from "./runtime.ts";
|
|
3
|
+
/** Options for the Lakebox-backed Mastra workspace sandbox. */
|
|
4
|
+
export interface LakeboxWorkspaceSandboxOptions {
|
|
5
|
+
/** Optional display name presented by Mastra instead of Lakebox. */
|
|
6
|
+
displayName?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Mastra workspace sandbox backed by the app Lakebox.
|
|
10
|
+
*
|
|
11
|
+
* Commands run as the requesting user's Lakebox account through the shared
|
|
12
|
+
* {@link LakeboxRuntime}, so identity, credential scrubbing, and transport
|
|
13
|
+
* policy match the AppKit plugin tools and routes.
|
|
14
|
+
*/
|
|
15
|
+
export declare class LakeboxWorkspaceSandbox extends MastraSandbox {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly name: string;
|
|
18
|
+
private readonly runtime;
|
|
19
|
+
private readonly identity;
|
|
20
|
+
readonly provider = "appkit-lakebox";
|
|
21
|
+
status: WorkspaceSandbox["status"];
|
|
22
|
+
constructor(id: string, name: string, runtime: LakeboxRuntime, identity: string);
|
|
23
|
+
/** Creates or starts the app Lakebox. */
|
|
24
|
+
start(options?: SandboxStartOptions): Promise<SandboxStartResult>;
|
|
25
|
+
/** Leaves the shared Lakebox running; its platform idle timeout stops it. */
|
|
26
|
+
stop(): Promise<void>;
|
|
27
|
+
/** Releases this handle without changing the shared Lakebox. */
|
|
28
|
+
destroy(): Promise<void>;
|
|
29
|
+
/** Mastra snapshot hook. Lakeboxes do not expose snapshot operations. */
|
|
30
|
+
snapshot(): Promise<void>;
|
|
31
|
+
/** Runs a command as the current user's Lakebox account. */
|
|
32
|
+
executeCommand(command: string, args?: string[], options?: ExecuteCommandOptions): Promise<CommandResult>;
|
|
33
|
+
/** Returns the current Lakebox status in Mastra's sandbox shape. */
|
|
34
|
+
getInfo(): Promise<SandboxInfo>;
|
|
35
|
+
/** Returns agent instructions for services, routes, and command execution. */
|
|
36
|
+
getInstructions(): string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Creates a request-scoped Mastra workspace resolver for the app Lakebox.
|
|
40
|
+
*
|
|
41
|
+
* Resolution never creates compute; the first command or service does.
|
|
42
|
+
*/
|
|
43
|
+
export declare function lakeboxWorkspaceSandbox(runtime: LakeboxRuntime, options?: LakeboxWorkspaceSandboxOptions): WorkspaceSandboxResolver;
|