@dbx-tools/appkit-lakebox 0.0.0-stage → 0.9.132
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 +197 -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,151 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { errorUtils, log } from "@dbx-tools/shared-core";
|
|
3
|
+
const logger = log.logger("appkit-lakebox:metrics");
|
|
4
|
+
const DEFAULT_CAPACITY = 120;
|
|
5
|
+
/**
|
|
6
|
+
* In-process metrics emitter for the app Lakebox.
|
|
7
|
+
*
|
|
8
|
+
* Sampling runs only between {@link start} and {@link stop}, which the runtime
|
|
9
|
+
* ties to the Lakebox running state. Samples contain machine-level CPU,
|
|
10
|
+
* memory, persistent storage, and network counters; they never contain
|
|
11
|
+
* process names, arguments, environment, or per-process usage.
|
|
12
|
+
*/
|
|
13
|
+
export class LakeboxMetrics extends EventEmitter {
|
|
14
|
+
read;
|
|
15
|
+
intervalMs;
|
|
16
|
+
capacity;
|
|
17
|
+
samples = [];
|
|
18
|
+
previous;
|
|
19
|
+
timer;
|
|
20
|
+
controller;
|
|
21
|
+
/** Creates a stopped emitter that reads raw counters with `read`. */
|
|
22
|
+
constructor(read, intervalMs, capacity = DEFAULT_CAPACITY) {
|
|
23
|
+
super();
|
|
24
|
+
this.read = read;
|
|
25
|
+
this.intervalMs = intervalMs;
|
|
26
|
+
this.capacity = capacity;
|
|
27
|
+
}
|
|
28
|
+
/** Whether sampling is active. */
|
|
29
|
+
get running() {
|
|
30
|
+
return this.controller !== undefined;
|
|
31
|
+
}
|
|
32
|
+
/** Recent samples, oldest first. */
|
|
33
|
+
series() {
|
|
34
|
+
return [...this.samples];
|
|
35
|
+
}
|
|
36
|
+
/** Seeds one validated sample without starting the recurring sampler or emitting an event. */
|
|
37
|
+
seed(output, at = Date.now()) {
|
|
38
|
+
const snapshot = this.record(parseLakeboxCounters(output, at), false);
|
|
39
|
+
return snapshot;
|
|
40
|
+
}
|
|
41
|
+
/** Starts sampling. Repeated calls are ignored. */
|
|
42
|
+
start() {
|
|
43
|
+
if (this.controller)
|
|
44
|
+
return;
|
|
45
|
+
this.controller = new AbortController();
|
|
46
|
+
void this.tick(this.controller.signal);
|
|
47
|
+
}
|
|
48
|
+
/** Stops sampling and clears the series. */
|
|
49
|
+
stop() {
|
|
50
|
+
this.controller?.abort();
|
|
51
|
+
this.controller = undefined;
|
|
52
|
+
if (this.timer)
|
|
53
|
+
clearTimeout(this.timer);
|
|
54
|
+
this.timer = undefined;
|
|
55
|
+
this.previous = undefined;
|
|
56
|
+
this.samples.length = 0;
|
|
57
|
+
}
|
|
58
|
+
async tick(signal) {
|
|
59
|
+
try {
|
|
60
|
+
const counters = parseLakeboxCounters(await this.read(signal));
|
|
61
|
+
if (signal.aborted)
|
|
62
|
+
return;
|
|
63
|
+
this.record(counters, true);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (!signal.aborted) {
|
|
67
|
+
logger.debug("Lakebox metrics sample failed", { error: errorUtils.toError(error) });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (signal.aborted)
|
|
71
|
+
return;
|
|
72
|
+
this.timer = setTimeout(() => void this.tick(signal), this.intervalMs);
|
|
73
|
+
this.timer.unref?.();
|
|
74
|
+
}
|
|
75
|
+
record(counters, emit) {
|
|
76
|
+
const snapshot = toSnapshot(counters, this.previous);
|
|
77
|
+
this.previous = counters;
|
|
78
|
+
this.samples.push(snapshot);
|
|
79
|
+
if (this.samples.length > this.capacity)
|
|
80
|
+
this.samples.shift();
|
|
81
|
+
if (emit)
|
|
82
|
+
this.emit("snapshot", snapshot);
|
|
83
|
+
return snapshot;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Parses the package-owned metrics command output.
|
|
88
|
+
*
|
|
89
|
+
* @throws When a required counter is missing.
|
|
90
|
+
*/
|
|
91
|
+
export function parseLakeboxCounters(output, at = Date.now()) {
|
|
92
|
+
const lines = new Map();
|
|
93
|
+
for (const line of output.split("\n")) {
|
|
94
|
+
const [key, ...values] = line.trim().split(/\s+/);
|
|
95
|
+
if (key)
|
|
96
|
+
lines.set(key.replace(/:$/, ""), values.map(Number));
|
|
97
|
+
}
|
|
98
|
+
const value = (key, index = 0) => {
|
|
99
|
+
const entry = lines.get(key)?.[index];
|
|
100
|
+
if (entry === undefined || !Number.isFinite(entry)) {
|
|
101
|
+
throw new Error(`Lakebox metrics output is missing ${key}`);
|
|
102
|
+
}
|
|
103
|
+
return entry;
|
|
104
|
+
};
|
|
105
|
+
const cpu = lines.get("cpu") ?? [];
|
|
106
|
+
const idle = (cpu[3] ?? 0) + (cpu[4] ?? 0);
|
|
107
|
+
const total = cpu
|
|
108
|
+
.slice(0, 8)
|
|
109
|
+
.reduce((sum, entry) => sum + (Number.isFinite(entry) ? entry : 0), 0);
|
|
110
|
+
return {
|
|
111
|
+
at,
|
|
112
|
+
cores: value("cores"),
|
|
113
|
+
cpuBusy: total - idle,
|
|
114
|
+
cpuTotal: total,
|
|
115
|
+
load1: value("load"),
|
|
116
|
+
memoryTotalBytes: value("MemTotal") * 1024,
|
|
117
|
+
memoryAvailableBytes: value("MemAvailable") * 1024,
|
|
118
|
+
storageTotalBytes: value("storage", 0),
|
|
119
|
+
storageUsedBytes: value("storage", 1),
|
|
120
|
+
rxBytes: value("network", 0),
|
|
121
|
+
txBytes: value("network", 1),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/** Converts cumulative counters to one snapshot using the previous sample for rates. */
|
|
125
|
+
export function toSnapshot(current, previous) {
|
|
126
|
+
const seconds = previous ? Math.max((current.at - previous.at) / 1_000, 0.001) : 0;
|
|
127
|
+
const cpuTotal = previous ? current.cpuTotal - previous.cpuTotal : 0;
|
|
128
|
+
const cpuBusy = previous ? current.cpuBusy - previous.cpuBusy : 0;
|
|
129
|
+
const rate = (now, before) => previous && before !== undefined ? Math.max(0, (now - before) / seconds) : 0;
|
|
130
|
+
return {
|
|
131
|
+
at: new Date(current.at).toISOString(),
|
|
132
|
+
cpu: {
|
|
133
|
+
cores: current.cores,
|
|
134
|
+
usedPercent: cpuTotal > 0 ? clamp((cpuBusy / cpuTotal) * 100) : 0,
|
|
135
|
+
load1: current.load1,
|
|
136
|
+
},
|
|
137
|
+
memory: {
|
|
138
|
+
totalBytes: current.memoryTotalBytes,
|
|
139
|
+
usedBytes: Math.max(0, current.memoryTotalBytes - current.memoryAvailableBytes),
|
|
140
|
+
},
|
|
141
|
+
storage: { totalBytes: current.storageTotalBytes, usedBytes: current.storageUsedBytes },
|
|
142
|
+
network: {
|
|
143
|
+
rxBytesPerSecond: rate(current.rxBytes, previous?.rxBytes),
|
|
144
|
+
txBytesPerSecond: rate(current.txBytes, previous?.txBytes),
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function clamp(value) {
|
|
149
|
+
return Math.min(100, Math.max(0, Math.round(value * 10) / 10));
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUd6RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFDcEQsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFzQjdCOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLFlBQWtDO0lBUWpEO0lBQ0E7SUFDQTtJQVRGLE9BQU8sR0FBNkIsRUFBRSxDQUFDO0lBQ2hELFFBQVEsQ0FBbUI7SUFDM0IsS0FBSyxDQUFpQztJQUN0QyxVQUFVLENBQW1CO0lBRXJDLHFFQUFxRTtJQUNyRSxZQUNtQixJQUE4QyxFQUM5QyxVQUFrQixFQUNsQixXQUFXLGdCQUFnQjtRQUU1QyxLQUFLLEVBQUUsQ0FBQztRQUpTLFNBQUksR0FBSixJQUFJLENBQTBDO1FBQzlDLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDbEIsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7SUFHOUMsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxvQ0FBb0M7SUFDcEMsTUFBTTtRQUNKLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsOEZBQThGO0lBQzlGLElBQUksQ0FBQyxNQUFjLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxD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S0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwibm9kZTpldmVudHNcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IExha2Vib3hNZXRyaWNzU25hcHNob3QgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbGFrZWJveFwiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXBwa2l0LWxha2Vib3g6bWV0cmljc1wiKTtcbmNvbnN0IERFRkFVTFRfQ0FQQUNJVFkgPSAxMjA7XG5cbi8qKiBSYXcgY3VtdWxhdGl2ZSBjb3VudGVycyByZWFkIGZyb20gb25lIHNhbXBsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJveENvdW50ZXJzIHtcbiAgYXQ6IG51bWJlcjtcbiAgY29yZXM6IG51bWJlcjtcbiAgY3B1QnVzeTogbnVtYmVyO1xuICBjcHVUb3RhbDogbnVtYmVyO1xuICBsb2FkMTogbnVtYmVyO1xuICBtZW1vcnlUb3RhbEJ5dGVzOiBudW1iZXI7XG4gIG1lbW9yeUF2YWlsYWJsZUJ5dGVzOiBudW1iZXI7XG4gIHN0b3JhZ2VUb3RhbEJ5dGVzOiBudW1iZXI7XG4gIHN0b3JhZ2VVc2VkQnl0ZXM6IG51bWJlcjtcbiAgcnhCeXRlczogbnVtYmVyO1xuICB0eEJ5dGVzOiBudW1iZXI7XG59XG5cbi8qKiBFdmVudHMgZW1pdHRlZCBieSB7QGxpbmsgTGFrZWJveE1ldHJpY3N9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYm94TWV0cmljc0V2ZW50cyB7XG4gIHNuYXBzaG90OiBbTGFrZWJveE1ldHJpY3NTbmFwc2hvdF07XG59XG5cbi8qKlxuICogSW4tcHJvY2VzcyBtZXRyaWNzIGVtaXR0ZXIgZm9yIHRoZSBhcHAgTGFrZWJveC5cbiAqXG4gKiBTYW1wbGluZyBydW5zIG9ubHkgYmV0d2VlbiB7QGxpbmsgc3RhcnR9IGFuZCB7QGxpbmsgc3RvcH0sIHdoaWNoIHRoZSBydW50aW1lXG4gKiB0aWVzIHRvIHRoZSBMYWtlYm94IHJ1bm5pbmcgc3RhdGUuIFNhbXBsZXMgY29udGFpbiBtYWNoaW5lLWxldmVsIENQVSxcbiAqIG1lbW9yeSwgcGVyc2lzdGVudCBzdG9yYWdlLCBhbmQgbmV0d29yayBjb3VudGVyczsgdGhleSBuZXZlciBjb250YWluXG4gKiBwcm9jZXNzIG5hbWVzLCBhcmd1bWVudHMsIGVudmlyb25tZW50LCBvciBwZXItcHJvY2VzcyB1c2FnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExha2Vib3hNZXRyaWNzIGV4dGVuZHMgRXZlbnRFbWl0dGVyPExha2Vib3hNZXRyaWNzRXZlbnRzPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2FtcGxlczogTGFrZWJveE1ldHJpY3NTbmFwc2hvdFtdID0gW107XG4gIHByaXZhdGUgcHJldmlvdXM/OiBMYWtlYm94Q291bnRlcnM7XG4gIHByaXZhdGUgdGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBjb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8qKiBDcmVhdGVzIGEgc3RvcHBlZCBlbWl0dGVyIHRoYXQgcmVhZHMgcmF3IGNvdW50ZXJzIHdpdGggYHJlYWRgLiAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlYWQ6IChzaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPHN0cmluZz4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnZhbE1zOiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXBhY2l0eSA9IERFRkFVTFRfQ0FQQUNJVFksXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKiogV2hldGhlciBzYW1wbGluZyBpcyBhY3RpdmUuICovXG4gIGdldCBydW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSZWNlbnQgc2FtcGxlcywgb2xkZXN0IGZpcnN0LiAqL1xuICBzZXJpZXMoKTogcmVhZG9ubHkgTGFrZWJveE1ldHJpY3NTbmFwc2hvdFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2FtcGxlc107XG4gIH1cblxuICAvKiogU2VlZHMgb25lIHZhbGlkYXRlZCBzYW1wbGUgd2l0aG91dCBzdGFydGluZyB0aGUgcmVjdXJyaW5nIHNhbXBsZXIgb3IgZW1pdHRpbmcgYW4gZXZlbnQuICovXG4gIHNlZWQob3V0cHV0OiBzdHJpbmcsIGF0ID0gRGF0ZS5ub3coKSk6IExha2Vib3hNZXRyaWNzU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5yZWNvcmQocGFyc2VMYWtlYm94Q291bnRlcnMob3V0cHV0LCBhdCksIGZhbHNlKTtcbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICAvKiogU3RhcnRzIHNhbXBsaW5nLiBSZXBlYXRlZCBjYWxscyBhcmUgaWdub3JlZC4gKi9cbiAgc3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udHJvbGxlcikgcmV0dXJuO1xuICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB2b2lkIHRoaXMudGljayh0aGlzLmNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBTdG9wcyBzYW1wbGluZyBhbmQgY2xlYXJzIHRoZSBzZXJpZXMuICovXG4gIHN0b3AoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMuY29udHJvbGxlciA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy50aW1lcikgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgIHRoaXMudGltZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNhbXBsZXMubGVuZ3RoID0gMDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdGljayhzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvdW50ZXJzID0gcGFyc2VMYWtlYm94Q291bnRlcnMoYXdhaXQgdGhpcy5yZWFkKHNpZ25hbCkpO1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICB0aGlzLnJlY29yZChjb3VudGVycywgdHJ1ZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiTGFrZWJveCBtZXRyaWNzIHNhbXBsZSBmYWlsZWRcIiwgeyBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVycm9yKSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdm9pZCB0aGlzLnRpY2soc2lnbmFsKSwgdGhpcy5pbnRlcnZhbE1zKTtcbiAgICB0aGlzLnRpbWVyLnVucmVmPy4oKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb3JkKGNvdW50ZXJzOiBMYWtlYm94Q291bnRlcnMsIGVtaXQ6IGJvb2xlYW4pOiBMYWtlYm94TWV0cmljc1NuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRvU25hcHNob3QoY291bnRlcnMsIHRoaXMucHJldmlvdXMpO1xuICAgIHRoaXMucHJldmlvdXMgPSBjb3VudGVycztcbiAgICB0aGlzLnNhbXBsZXMucHVzaChzbmFwc2hvdCk7XG4gICAgaWYgKHRoaXMuc2FtcGxlcy5sZW5ndGggPiB0aGlzLmNhcGFjaXR5KSB0aGlzLnNhbXBsZXMuc2hpZnQoKTtcbiAgICBpZiAoZW1pdCkgdGhpcy5lbWl0KFwic25hcHNob3RcIiwgc25hcHNob3QpO1xuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgcGFja2FnZS1vd25lZCBtZXRyaWNzIGNvbW1hbmQgb3V0cHV0LlxuICpcbiAqIEB0aHJvd3MgV2hlbiBhIHJlcXVpcmVkIGNvdW50ZXIgaXMgbWlzc2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGFrZWJveENvdW50ZXJzKG91dHB1dDogc3RyaW5nLCBhdCA9IERhdGUubm93KCkpOiBMYWtlYm94Q291bnRlcnMge1xuICBjb25zdCBsaW5lcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIG91dHB1dC5zcGxpdChcIlxcblwiKSkge1xuICAgIGNvbnN0IFtrZXksIC4uLnZhbHVlc10gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChrZXkpIGxpbmVzLnNldChrZXkucmVwbGFjZSgvOiQvLCBcIlwiKSwgdmFsdWVzLm1hcChOdW1iZXIpKTtcbiAgfVxuICBjb25zdCB2YWx1ZSA9IChrZXk6IHN0cmluZywgaW5kZXggPSAwKTogbnVtYmVyID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGxpbmVzLmdldChrZXkpPy5baW5kZXhdO1xuICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUoZW50cnkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExha2Vib3ggbWV0cmljcyBvdXRwdXQgaXMgbWlzc2luZyAke2tleX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9O1xuICBjb25zdCBjcHUgPSBsaW5lcy5nZXQoXCJjcHVcIikgPz8gW107XG4gIGNvbnN0IGlkbGUgPSAoY3B1WzNdID8/IDApICsgKGNwdVs0XSA/PyAwKTtcbiAgY29uc3QgdG90YWwgPSBjcHVcbiAgICAuc2xpY2UoMCwgOClcbiAgICAucmVkdWNlKChzdW0sIGVudHJ5KSA9PiBzdW0gKyAoTnVtYmVyLmlzRmluaXRlKGVudHJ5KSA/IGVudHJ5IDogMCksIDApO1xuICByZXR1cm4ge1xuICAgIGF0LFxuICAgIGNvcmVzOiB2YWx1ZShcImNvcmVzXCIpLFxuICAgIGNwdUJ1c3k6IHRvdGFsIC0gaWRsZSxcbiAgICBjcHVUb3RhbDogdG90YWwsXG4gICAgbG9hZDE6IHZhbHVlKFwibG9hZFwiKSxcbiAgICBtZW1vcnlUb3RhbEJ5dGVzOiB2YWx1ZShcIk1lbVRvdGFsXCIpICogMTAyNCxcbiAgICBtZW1vcnlBdmFpbGFibGVCeXRlczogdmFsdWUoXCJNZW1BdmFpbGFibGVcIikgKiAxMDI0LFxuICAgIHN0b3JhZ2VUb3RhbEJ5dGVzOiB2YWx1ZShcInN0b3JhZ2VcIiwgMCksXG4gICAgc3RvcmFnZVVzZWRCeXRlczogdmFsdWUoXCJzdG9yYWdlXCIsIDEpLFxuICAgIHJ4Qnl0ZXM6IHZhbHVlKFwibmV0d29ya1wiLCAwKSxcbiAgICB0eEJ5dGVzOiB2YWx1ZShcIm5ldHdvcmtcIiwgMSksXG4gIH07XG59XG5cbi8qKiBDb252ZXJ0cyBjdW11bGF0aXZlIGNvdW50ZXJzIHRvIG9uZSBzbmFwc2hvdCB1c2luZyB0aGUgcHJldmlvdXMgc2FtcGxlIGZvciByYXRlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NuYXBzaG90KFxuICBjdXJyZW50OiBMYWtlYm94Q291bnRlcnMsXG4gIHByZXZpb3VzPzogTGFrZWJveENvdW50ZXJzLFxuKTogTGFrZWJveE1ldHJpY3NTbmFwc2hvdCB7XG4gIGNvbnN0IHNlY29uZHMgPSBwcmV2aW91cyA/IE1hdGgubWF4KChjdXJyZW50LmF0IC0gcHJldmlvdXMuYXQpIC8gMV8wMDAsIDAuMDAxKSA6IDA7XG4gIGNvbnN0IGNwdVRvdGFsID0gcHJldmlvdXMgPyBjdXJyZW50LmNwdVRvdGFsIC0gcHJldmlvdXMuY3B1VG90YWwgOiAwO1xuICBjb25zdCBjcHVCdXN5ID0gcHJldmlvdXMgPyBjdXJyZW50LmNwdUJ1c3kgLSBwcmV2aW91cy5jcHVCdXN5IDogMDtcbiAgY29uc3QgcmF0ZSA9IChub3c6IG51bWJlciwgYmVmb3JlOiBudW1iZXIgfCB1bmRlZmluZWQpID0+XG4gICAgcHJldmlvdXMgJiYgYmVmb3JlICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCgwLCAobm93IC0gYmVmb3JlKSAvIHNlY29uZHMpIDogMDtcbiAgcmV0dXJuIHtcbiAgICBhdDogbmV3IERhdGUoY3VycmVudC5hdCkudG9JU09TdHJpbmcoKSxcbiAgICBjcHU6IHtcbiAgICAgIGNvcmVzOiBjdXJyZW50LmNvcmVzLFxuICAgICAgdXNlZFBlcmNlbnQ6IGNwdVRvdGFsID4gMCA/IGNsYW1wKChjcHVCdXN5IC8gY3B1VG90YWwpICogMTAwKSA6IDAsXG4gICAgICBsb2FkMTogY3VycmVudC5sb2FkMSxcbiAgICB9LFxuICAgIG1lbW9yeToge1xuICAgICAgdG90YWxCeXRlczogY3VycmVudC5tZW1vcnlUb3RhbEJ5dGVzLFxuICAgICAgdXNlZEJ5dGVzOiBNYXRoLm1heCgwLCBjdXJyZW50Lm1lbW9yeVRvdGFsQnl0ZXMgLSBjdXJyZW50Lm1lbW9yeUF2YWlsYWJsZUJ5dGVzKSxcbiAgICB9LFxuICAgIHN0b3JhZ2U6IHsgdG90YWxCeXRlczogY3VycmVudC5zdG9yYWdlVG90YWxCeXRlcywgdXNlZEJ5dGVzOiBjdXJyZW50LnN0b3JhZ2VVc2VkQnl0ZXMgfSxcbiAgICBuZXR3b3JrOiB7XG4gICAgICByeEJ5dGVzUGVyU2Vjb25kOiByYXRlKGN1cnJlbnQucnhCeXRlcywgcHJldmlvdXM/LnJ4Qnl0ZXMpLFxuICAgICAgdHhCeXRlc1BlclNlY29uZDogcmF0ZShjdXJyZW50LnR4Qnl0ZXMsIHByZXZpb3VzPy50eEJ5dGVzKSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFtcCh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh2YWx1ZSAqIDEwKSAvIDEwKSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { type IAppRouter } from "@databricks/appkit";
|
|
2
|
+
import { type ToolkitEntry, type ToolkitOptions, type ToolRegistry } from "@databricks/appkit/beta";
|
|
3
|
+
import { toolOperations, ToolRegistryPlugin, type AgentToolExecutionContext } from "@dbx-tools/appkit";
|
|
4
|
+
import { type CreateLakeboxServiceRequest, type LakeboxClientConfigInput, type LakeboxCommandRequest, type LakeboxServiceLogsRequest } from "@dbx-tools/shared-lakebox";
|
|
5
|
+
import type { JSONSchema7 } from "json-schema";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { type LakeboxPluginConfig } from "./config.ts";
|
|
8
|
+
import { LakeboxRuntime } from "./runtime.ts";
|
|
9
|
+
/**
|
|
10
|
+
* AppKit plugin for the single app Lakebox.
|
|
11
|
+
*
|
|
12
|
+
* Registers user-scoped REST routes, agent tools, the deterministic service
|
|
13
|
+
* proxy, and WebSocket upgrade handling. Every Lakebox lifecycle call uses the
|
|
14
|
+
* app service principal; the authenticated request identity only selects the
|
|
15
|
+
* user's Lakebox account and authorizes that user's routes.
|
|
16
|
+
*/
|
|
17
|
+
export declare class AppKitLakeboxPlugin extends ToolRegistryPlugin<LakeboxPluginConfig> {
|
|
18
|
+
static manifest: {
|
|
19
|
+
name: "lakebox";
|
|
20
|
+
displayName: string;
|
|
21
|
+
description: string;
|
|
22
|
+
stability: "beta";
|
|
23
|
+
resources: {
|
|
24
|
+
required: never[];
|
|
25
|
+
optional: never[];
|
|
26
|
+
};
|
|
27
|
+
config: {
|
|
28
|
+
schema: JSONSchema7;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
readonly runtime: LakeboxRuntime;
|
|
32
|
+
private mounted;
|
|
33
|
+
private httpServer?;
|
|
34
|
+
private upgradeAttachTimer?;
|
|
35
|
+
private upgradeIdentityGate?;
|
|
36
|
+
private readonly upgradeHandler;
|
|
37
|
+
/** Creates a plugin with a supplied shared runtime or one from resolved config. */
|
|
38
|
+
constructor(config?: LakeboxPluginConfig);
|
|
39
|
+
protected get toolRegistry(): ToolRegistry;
|
|
40
|
+
setup(): Promise<void>;
|
|
41
|
+
injectRoutes(router: IAppRouter): void;
|
|
42
|
+
/** Returns browser-safe route defaults published through AppKit client config. */
|
|
43
|
+
clientConfig(): LakeboxClientConfigInput;
|
|
44
|
+
/** Returns selected AppKit toolkit entries backed by this plugin's agent tools. */
|
|
45
|
+
toolkit(options?: ToolkitOptions): Record<string, ToolkitEntry>;
|
|
46
|
+
/** Executes one registered agent tool for the current execution identity. */
|
|
47
|
+
executeAgentTool(name: string, args: unknown, signal?: AbortSignal, context?: AgentToolExecutionContext): Promise<unknown>;
|
|
48
|
+
/** Returns the typed sibling-plugin API. */
|
|
49
|
+
exports(): {
|
|
50
|
+
summary: (identity: string) => Promise<{
|
|
51
|
+
supported: boolean;
|
|
52
|
+
auto: boolean;
|
|
53
|
+
status: "error" | "unknown" | "missing" | "starting" | "running" | "stopping" | "stopped";
|
|
54
|
+
name: string;
|
|
55
|
+
user: {
|
|
56
|
+
hash: string;
|
|
57
|
+
name: string;
|
|
58
|
+
uid: number;
|
|
59
|
+
home: string;
|
|
60
|
+
routePrefix: string;
|
|
61
|
+
};
|
|
62
|
+
services: {
|
|
63
|
+
name: string;
|
|
64
|
+
kind: "terminal" | "desktop" | "image";
|
|
65
|
+
state: "error" | "starting" | "stopped" | "ready";
|
|
66
|
+
port: number;
|
|
67
|
+
route: boolean;
|
|
68
|
+
path: string;
|
|
69
|
+
image?: string | undefined;
|
|
70
|
+
openPath?: string | undefined;
|
|
71
|
+
openUrl?: string | undefined;
|
|
72
|
+
error?: string | undefined;
|
|
73
|
+
log?: string | undefined;
|
|
74
|
+
}[];
|
|
75
|
+
servicesStale: boolean;
|
|
76
|
+
canStart: boolean;
|
|
77
|
+
canStop: boolean;
|
|
78
|
+
id?: string | undefined;
|
|
79
|
+
idleTimeoutSeconds?: number | undefined;
|
|
80
|
+
servicesObservedAt?: string | undefined;
|
|
81
|
+
}>;
|
|
82
|
+
start: () => Promise<void>;
|
|
83
|
+
stop: () => Promise<void>;
|
|
84
|
+
delete: () => Promise<boolean>;
|
|
85
|
+
executeCommand: (identity: string, input: LakeboxCommandRequest) => Promise<{
|
|
86
|
+
success: boolean;
|
|
87
|
+
exitCode: number;
|
|
88
|
+
stdout: string;
|
|
89
|
+
stderr: string;
|
|
90
|
+
executionTimeMs: number;
|
|
91
|
+
command: string;
|
|
92
|
+
args: string[];
|
|
93
|
+
timedOut?: boolean | undefined;
|
|
94
|
+
}>;
|
|
95
|
+
listServices: (identity: string) => Promise<{
|
|
96
|
+
name: string;
|
|
97
|
+
kind: "terminal" | "desktop" | "image";
|
|
98
|
+
state: "error" | "starting" | "stopped" | "ready";
|
|
99
|
+
port: number;
|
|
100
|
+
route: boolean;
|
|
101
|
+
path: string;
|
|
102
|
+
image?: string | undefined;
|
|
103
|
+
openPath?: string | undefined;
|
|
104
|
+
openUrl?: string | undefined;
|
|
105
|
+
error?: string | undefined;
|
|
106
|
+
log?: string | undefined;
|
|
107
|
+
}[]>;
|
|
108
|
+
createService: (identity: string, input: CreateLakeboxServiceRequest) => Promise<{
|
|
109
|
+
name: string;
|
|
110
|
+
kind: "terminal" | "desktop" | "image";
|
|
111
|
+
state: "error" | "starting" | "stopped" | "ready";
|
|
112
|
+
port: number;
|
|
113
|
+
route: boolean;
|
|
114
|
+
path: string;
|
|
115
|
+
image?: string | undefined;
|
|
116
|
+
openPath?: string | undefined;
|
|
117
|
+
openUrl?: string | undefined;
|
|
118
|
+
error?: string | undefined;
|
|
119
|
+
log?: string | undefined;
|
|
120
|
+
}>;
|
|
121
|
+
startService: (identity: string, name: string) => Promise<{
|
|
122
|
+
name: string;
|
|
123
|
+
kind: "terminal" | "desktop" | "image";
|
|
124
|
+
state: "error" | "starting" | "stopped" | "ready";
|
|
125
|
+
port: number;
|
|
126
|
+
route: boolean;
|
|
127
|
+
path: string;
|
|
128
|
+
image?: string | undefined;
|
|
129
|
+
openPath?: string | undefined;
|
|
130
|
+
openUrl?: string | undefined;
|
|
131
|
+
error?: string | undefined;
|
|
132
|
+
log?: string | undefined;
|
|
133
|
+
}>;
|
|
134
|
+
stopService: (identity: string, name: string) => Promise<{
|
|
135
|
+
name: string;
|
|
136
|
+
kind: "terminal" | "desktop" | "image";
|
|
137
|
+
state: "error" | "starting" | "stopped" | "ready";
|
|
138
|
+
port: number;
|
|
139
|
+
route: boolean;
|
|
140
|
+
path: string;
|
|
141
|
+
image?: string | undefined;
|
|
142
|
+
openPath?: string | undefined;
|
|
143
|
+
openUrl?: string | undefined;
|
|
144
|
+
error?: string | undefined;
|
|
145
|
+
log?: string | undefined;
|
|
146
|
+
}>;
|
|
147
|
+
removeService: (identity: string, name: string) => Promise<boolean>;
|
|
148
|
+
serviceLogs: (identity: string, input: LakeboxServiceLogsRequest) => Promise<{
|
|
149
|
+
log: string;
|
|
150
|
+
}>;
|
|
151
|
+
operations: (identity?: string) => {
|
|
152
|
+
readonly get_lakebox: toolOperations.AppKitOperation<z.ZodObject<{}, z.core.$strict>, unknown>;
|
|
153
|
+
readonly execute_lakebox_command: toolOperations.AppKitOperation<z.ZodObject<{
|
|
154
|
+
command: z.ZodString;
|
|
155
|
+
args: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
156
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
157
|
+
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
158
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
159
|
+
}, z.core.$strict>, unknown>;
|
|
160
|
+
readonly list_lakebox_services: toolOperations.AppKitOperation<z.ZodObject<{}, z.core.$strict>, unknown>;
|
|
161
|
+
readonly create_lakebox_service: toolOperations.AppKitOperation<z.ZodObject<{
|
|
162
|
+
name: z.ZodString;
|
|
163
|
+
image: z.ZodString;
|
|
164
|
+
command: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
165
|
+
env: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
166
|
+
workingDirectory: z.ZodOptional<z.ZodString>;
|
|
167
|
+
mounts: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
168
|
+
source: z.ZodString;
|
|
169
|
+
target: z.ZodString;
|
|
170
|
+
readOnly: z.ZodDefault<z.ZodBoolean>;
|
|
171
|
+
}, z.core.$strict>>>;
|
|
172
|
+
route: z.ZodDefault<z.ZodBoolean>;
|
|
173
|
+
openPath: z.ZodOptional<z.ZodString>;
|
|
174
|
+
stripPrefix: z.ZodDefault<z.ZodBoolean>;
|
|
175
|
+
pull: z.ZodDefault<z.ZodEnum<{
|
|
176
|
+
missing: "missing";
|
|
177
|
+
always: "always";
|
|
178
|
+
}>>;
|
|
179
|
+
}, z.core.$strict>, unknown>;
|
|
180
|
+
readonly start_lakebox_service: toolOperations.AppKitOperation<z.ZodObject<{
|
|
181
|
+
name: z.ZodString;
|
|
182
|
+
}, z.core.$strict>, unknown>;
|
|
183
|
+
readonly stop_lakebox_service: toolOperations.AppKitOperation<z.ZodObject<{
|
|
184
|
+
name: z.ZodString;
|
|
185
|
+
}, z.core.$strict>, unknown>;
|
|
186
|
+
readonly remove_lakebox_service: toolOperations.AppKitOperation<z.ZodObject<{
|
|
187
|
+
name: z.ZodString;
|
|
188
|
+
}, z.core.$strict>, unknown>;
|
|
189
|
+
readonly get_lakebox_service_logs: toolOperations.AppKitOperation<z.ZodObject<{
|
|
190
|
+
name: z.ZodString;
|
|
191
|
+
maxLines: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
192
|
+
maxChars: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
193
|
+
}, z.core.$strict>, unknown>;
|
|
194
|
+
};
|
|
195
|
+
toolkit: (options?: ToolkitOptions) => Record<string, ToolkitEntry>;
|
|
196
|
+
};
|
|
197
|
+
/** Cancels in-flight work before shutdown tears down resources. */
|
|
198
|
+
abortActiveOperations(): void;
|
|
199
|
+
/** Detaches WebSocket handling and closes the shared runtime. */
|
|
200
|
+
shutdown(): Promise<void>;
|
|
201
|
+
/** Returns the Zod-owned operation contracts used by agent tools. */
|
|
202
|
+
operations(identity?: string, origin?: string): {
|
|
203
|
+
readonly get_lakebox: toolOperations.AppKitOperation<z.ZodObject<{}, z.core.$strict>, unknown>;
|
|
204
|
+
readonly execute_lakebox_command: toolOperations.AppKitOperation<z.ZodObject<{
|
|
205
|
+
command: z.ZodString;
|
|
206
|
+
args: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
207
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
208
|
+
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
209
|
+
timeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
210
|
+
}, z.core.$strict>, unknown>;
|
|
211
|
+
readonly list_lakebox_services: toolOperations.AppKitOperation<z.ZodObject<{}, z.core.$strict>, unknown>;
|
|
212
|
+
readonly create_lakebox_service: toolOperations.AppKitOperation<z.ZodObject<{
|
|
213
|
+
name: z.ZodString;
|
|
214
|
+
image: z.ZodString;
|
|
215
|
+
command: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
216
|
+
env: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
217
|
+
workingDirectory: z.ZodOptional<z.ZodString>;
|
|
218
|
+
mounts: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
219
|
+
source: z.ZodString;
|
|
220
|
+
target: z.ZodString;
|
|
221
|
+
readOnly: z.ZodDefault<z.ZodBoolean>;
|
|
222
|
+
}, z.core.$strict>>>;
|
|
223
|
+
route: z.ZodDefault<z.ZodBoolean>;
|
|
224
|
+
openPath: z.ZodOptional<z.ZodString>;
|
|
225
|
+
stripPrefix: z.ZodDefault<z.ZodBoolean>;
|
|
226
|
+
pull: z.ZodDefault<z.ZodEnum<{
|
|
227
|
+
missing: "missing";
|
|
228
|
+
always: "always";
|
|
229
|
+
}>>;
|
|
230
|
+
}, z.core.$strict>, unknown>;
|
|
231
|
+
readonly start_lakebox_service: toolOperations.AppKitOperation<z.ZodObject<{
|
|
232
|
+
name: z.ZodString;
|
|
233
|
+
}, z.core.$strict>, unknown>;
|
|
234
|
+
readonly stop_lakebox_service: toolOperations.AppKitOperation<z.ZodObject<{
|
|
235
|
+
name: z.ZodString;
|
|
236
|
+
}, z.core.$strict>, unknown>;
|
|
237
|
+
readonly remove_lakebox_service: toolOperations.AppKitOperation<z.ZodObject<{
|
|
238
|
+
name: z.ZodString;
|
|
239
|
+
}, z.core.$strict>, unknown>;
|
|
240
|
+
readonly get_lakebox_service_logs: toolOperations.AppKitOperation<z.ZodObject<{
|
|
241
|
+
name: z.ZodString;
|
|
242
|
+
maxLines: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
243
|
+
maxChars: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
244
|
+
}, z.core.$strict>, unknown>;
|
|
245
|
+
};
|
|
246
|
+
private createToolRegistry;
|
|
247
|
+
private executionIdentity;
|
|
248
|
+
/**
|
|
249
|
+
* Resolves route identity with the same rules as REST: the forwarded user,
|
|
250
|
+
* or AppKit's development user for direct loopback navigation outside
|
|
251
|
+
* production. Everything else is anonymous and fails closed.
|
|
252
|
+
*/
|
|
253
|
+
private requestIdentity;
|
|
254
|
+
private streamMetrics;
|
|
255
|
+
private attachUpgradeHandler;
|
|
256
|
+
private handleUpgrade;
|
|
257
|
+
}
|
|
258
|
+
/** AppKit plugin factory for {@link AppKitLakeboxPlugin}. */
|
|
259
|
+
export declare const lakebox: import("@databricks/appkit").ToPlugin<typeof AppKitLakeboxPlugin, LakeboxPluginConfig | undefined, "lakebox">;
|