@dbx-tools/cli 0.9.58 → 0.9.61
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/README.md +594 -57
- package/bin/dbx-genie.ts +13 -0
- package/bin/dbx-graphiti.ts +5 -0
- package/bin/dbx-lakebase-proxy.ts +4 -0
- package/bin/dbx-model-gateway.ts +5 -0
- package/index.ts +47 -1
- package/lib/bin/dbx-genie.d.ts +2 -0
- package/lib/bin/dbx-genie.js +10 -0
- package/lib/bin/dbx-graphiti.d.ts +2 -0
- package/lib/bin/dbx-graphiti.js +4 -0
- package/lib/bin/dbx-lakebase-proxy.d.ts +2 -0
- package/lib/bin/dbx-lakebase-proxy.js +4 -0
- package/lib/bin/dbx-model-gateway.d.ts +2 -0
- package/lib/bin/dbx-model-gateway.js +4 -0
- package/lib/index.d.ts +47 -1
- package/lib/index.js +34 -2
- package/lib/src/appkit/cli.d.ts +24 -0
- package/lib/src/appkit/cli.js +54 -0
- package/lib/src/appkit/env-export.d.ts +40 -0
- package/lib/src/appkit/env-export.js +99 -0
- package/lib/src/auth/cli.d.ts +20 -0
- package/lib/src/auth/cli.js +129 -0
- package/lib/src/auth/options.d.ts +45 -0
- package/lib/src/auth/options.js +68 -0
- package/lib/src/cli.d.ts +2 -0
- package/lib/src/cli.js +19 -9
- package/lib/src/genie-code/cli.d.ts +19 -0
- package/lib/src/genie-code/cli.js +36 -0
- package/lib/src/genie-code/config.d.ts +38 -0
- package/lib/src/genie-code/config.js +111 -0
- package/lib/src/genie-code/install.d.ts +21 -0
- package/lib/src/genie-code/install.js +69 -0
- package/lib/src/genie-code/options.d.ts +7 -0
- package/lib/src/genie-code/options.js +7 -0
- package/lib/src/genie-code/runner.d.ts +21 -0
- package/lib/src/genie-code/runner.js +90 -0
- package/lib/src/genie-code/runtime.d.ts +48 -0
- package/lib/src/genie-code/runtime.js +162 -0
- package/lib/src/graphiti/cli.d.ts +18 -0
- package/lib/src/graphiti/cli.js +43 -0
- package/lib/src/graphiti/options.d.ts +10 -0
- package/lib/src/graphiti/options.js +10 -0
- package/lib/src/lakebase-proxy/cancellation.d.ts +22 -0
- package/lib/src/lakebase-proxy/cancellation.js +100 -0
- package/lib/src/lakebase-proxy/cli.d.ts +13 -0
- package/lib/src/lakebase-proxy/cli.js +54 -0
- package/lib/src/lakebase-proxy/options.d.ts +23 -0
- package/lib/src/lakebase-proxy/options.js +41 -0
- package/lib/src/lakebase-proxy/protocol.d.ts +37 -0
- package/lib/src/lakebase-proxy/protocol.js +124 -0
- package/lib/src/lakebase-proxy/proxy.d.ts +22 -0
- package/lib/src/lakebase-proxy/proxy.js +200 -0
- package/lib/src/model-gateway/cli.d.ts +19 -0
- package/lib/src/model-gateway/cli.js +63 -0
- package/lib/src/model-gateway/server.d.ts +16 -0
- package/lib/src/model-gateway/server.js +83 -0
- package/lib/src/tunnel/app.d.ts +20 -0
- package/lib/src/tunnel/app.js +52 -0
- package/lib/src/tunnel/cli.d.ts +27 -0
- package/lib/src/tunnel/cli.js +190 -0
- package/lib/src/tunnel/options.d.ts +72 -0
- package/lib/src/tunnel/options.js +138 -0
- package/lib/src/tunnel/proxy.d.ts +51 -0
- package/lib/src/tunnel/proxy.js +143 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +146 -9
- package/src/appkit/cli.ts +72 -0
- package/src/appkit/env-export.ts +124 -0
- package/src/auth/cli.ts +175 -0
- package/src/auth/options.ts +83 -0
- package/src/cli.ts +35 -8
- package/src/genie-code/cli.ts +58 -0
- package/src/genie-code/config.ts +161 -0
- package/src/genie-code/install.ts +103 -0
- package/src/genie-code/options.ts +14 -0
- package/src/genie-code/runner.ts +106 -0
- package/src/genie-code/runtime.ts +212 -0
- package/src/graphiti/cli.ts +75 -0
- package/src/graphiti/options.ts +20 -0
- package/src/lakebase-proxy/cancellation.ts +116 -0
- package/src/lakebase-proxy/cli.ts +80 -0
- package/src/lakebase-proxy/options.ts +56 -0
- package/src/lakebase-proxy/protocol.ts +170 -0
- package/src/lakebase-proxy/proxy.ts +256 -0
- package/src/model-gateway/cli.ts +93 -0
- package/src/model-gateway/server.ts +94 -0
- package/src/tunnel/app.ts +58 -0
- package/src/tunnel/cli.ts +218 -0
- package/src/tunnel/options.ts +169 -0
- package/src/tunnel/proxy.ts +194 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate one persistent Genie Code home per exact profile-model pairing.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
7
|
+
import { chmod, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
8
|
+
import { homedir } from "node:os";
|
|
9
|
+
import { dirname, join, resolve } from "node:path";
|
|
10
|
+
import { withFileLock } from "@dbx-tools/core/file-lock";
|
|
11
|
+
import { object } from "@dbx-tools/shared-core";
|
|
12
|
+
import { GenieCodeBaseConfigSchema, GenieCodeConfigSchema, GenieCodeProviderOverlaySchema, } from "@dbx-tools/shared-genie-code/config";
|
|
13
|
+
import { genieCodePairingName } from "@dbx-tools/shared-genie-code/options";
|
|
14
|
+
import { parse, stringify } from "smol-toml";
|
|
15
|
+
/** Provider identifier written to the base and invocation overlay configurations. */
|
|
16
|
+
export const GENIE_CODE_GATEWAY_PROVIDER = "dbx_tools_model_gateway";
|
|
17
|
+
/** Derive the stable home for one exact profile-model pair. */
|
|
18
|
+
export function genieCodeHome(profile, model, homeDirectory = homedir()) {
|
|
19
|
+
const digest = createHash("sha256")
|
|
20
|
+
.update(JSON.stringify([profile, model]))
|
|
21
|
+
.digest("hex")
|
|
22
|
+
.slice(0, 12);
|
|
23
|
+
const name = genieCodePairingName({ profile, model, digest });
|
|
24
|
+
const home = join(homeDirectory, ".dbx-tools", "genie", "profiles", name);
|
|
25
|
+
return { name, home, configPath: join(home, "config.toml") };
|
|
26
|
+
}
|
|
27
|
+
/** Render the persistent profile-model configuration. */
|
|
28
|
+
export function genieCodeBaseConfig(options, existingProjects = {}) {
|
|
29
|
+
const projects = Object.fromEntries(Object.entries(existingProjects).filter(([, value]) => object.isRecord(value) && value.trust_level === "trusted"));
|
|
30
|
+
return GenieCodeBaseConfigSchema.parse({
|
|
31
|
+
model_provider: GENIE_CODE_GATEWAY_PROVIDER,
|
|
32
|
+
model: options.model,
|
|
33
|
+
databricks_profile: options.profile,
|
|
34
|
+
projects: {
|
|
35
|
+
...projects,
|
|
36
|
+
[resolve(options.projectDirectory)]: {
|
|
37
|
+
trust_level: "trusted",
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
tui: {
|
|
41
|
+
model_availability_nux: {
|
|
42
|
+
[options.model]: 1,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** Render the invocation-specific guarded provider configuration. */
|
|
48
|
+
export function genieCodeProviderOverlay(options) {
|
|
49
|
+
return GenieCodeProviderOverlaySchema.parse({
|
|
50
|
+
model_providers: {
|
|
51
|
+
[GENIE_CODE_GATEWAY_PROVIDER]: {
|
|
52
|
+
name: "dbx-tools model gateway",
|
|
53
|
+
base_url: options.gatewayBaseUrl,
|
|
54
|
+
wire_api: "responses",
|
|
55
|
+
requires_openai_auth: false,
|
|
56
|
+
supports_websockets: false,
|
|
57
|
+
http_headers: {
|
|
58
|
+
Authorization: `Bearer ${options.bearerToken}`,
|
|
59
|
+
Originator: "codex",
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/** Render the merged configuration used by validation and tests. */
|
|
66
|
+
export function genieCodeConfig(options) {
|
|
67
|
+
return GenieCodeConfigSchema.parse({
|
|
68
|
+
...genieCodeBaseConfig(options),
|
|
69
|
+
...genieCodeProviderOverlay(options),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async function existingProjects(path) {
|
|
73
|
+
try {
|
|
74
|
+
const value = parse(await readFile(path, "utf8"));
|
|
75
|
+
return object.isRecord(value.projects) ? value.projects : {};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
79
|
+
return {};
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function writePrivateToml(path, value) {
|
|
84
|
+
const staged = join(dirname(path), `.${randomUUID()}.toml`);
|
|
85
|
+
try {
|
|
86
|
+
await writeFile(staged, stringify(value), { mode: 0o600 });
|
|
87
|
+
await chmod(staged, 0o600);
|
|
88
|
+
await rename(staged, path);
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
await rm(staged, { force: true });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** Update the persistent base config and write one private invocation overlay. */
|
|
95
|
+
export async function writeGenieCodeConfig(options) {
|
|
96
|
+
const base = genieCodeHome(options.profile, options.model, options.homeDirectory);
|
|
97
|
+
const overlayName = `dbx-${randomUUID().replaceAll("-", "")}`;
|
|
98
|
+
const destination = {
|
|
99
|
+
...base,
|
|
100
|
+
overlayName,
|
|
101
|
+
overlayPath: join(base.home, `${overlayName}.config.toml`),
|
|
102
|
+
};
|
|
103
|
+
await mkdir(destination.home, { recursive: true });
|
|
104
|
+
await withFileLock(["genie-code-config", destination.configPath], async () => {
|
|
105
|
+
const projects = await existingProjects(destination.configPath);
|
|
106
|
+
await writePrivateToml(destination.configPath, genieCodeBaseConfig(options, projects));
|
|
107
|
+
});
|
|
108
|
+
await writePrivateToml(destination.overlayPath, genieCodeProviderOverlay(options));
|
|
109
|
+
return destination;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dlbmllLWNvZGUvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hELE9BQU8sRUFDTCx5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLDhCQUE4QixHQUkvQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTdDLHFGQUFxRjtBQUNyRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyx5QkFBeUIsQ0FBQztBQXlCckUsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxhQUFhLENBQzNCLE9BQWUsRUFDZixLQUFhLEVBQ2IsZ0JBQXdCLE9BQU8sRUFBRTtJQUVqQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO1NBQ2hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDeEMsTUFBTSxDQUFDLEtBQUss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QVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sWUFBWSxDQUFDLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzNFLE1BQU0sUUFBUSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ25GLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlIG9uZSBwZXJzaXN0ZW50IEdlbmllIENvZGUgaG9tZSBwZXIgZXhhY3QgcHJvZmlsZS1tb2RlbCBwYWlyaW5nLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVIYXNoLCByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBjaG1vZCwgbWtkaXIsIHJlYWRGaWxlLCByZW5hbWUsIHJtLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgd2l0aEZpbGVMb2NrIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZS9maWxlLWxvY2tcIjtcbmltcG9ydCB7IG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBHZW5pZUNvZGVCYXNlQ29uZmlnU2NoZW1hLFxuICBHZW5pZUNvZGVDb25maWdTY2hlbWEsXG4gIEdlbmllQ29kZVByb3ZpZGVyT3ZlcmxheVNjaGVtYSxcbiAgdHlwZSBHZW5pZUNvZGVCYXNlQ29uZmlnLFxuICB0eXBlIEdlbmllQ29kZUNvbmZpZyxcbiAgdHlwZSBHZW5pZUNvZGVQcm92aWRlck92ZXJsYXksXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5pZS1jb2RlL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2VuaWVDb2RlUGFpcmluZ05hbWUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZ2VuaWUtY29kZS9vcHRpb25zXCI7XG5pbXBvcnQgeyBwYXJzZSwgc3RyaW5naWZ5IH0gZnJvbSBcInNtb2wtdG9tbFwiO1xuXG4vKiogUHJvdmlkZXIgaWRlbnRpZmllciB3cml0dGVuIHRvIHRoZSBiYXNlIGFuZCBpbnZvY2F0aW9uIG92ZXJsYXkgY29uZmlndXJhdGlvbnMuICovXG5leHBvcnQgY29uc3QgR0VOSUVfQ09ERV9HQVRFV0FZX1BST1ZJREVSID0gXCJkYnhfdG9vbHNfbW9kZWxfZ2F0ZXdheVwiO1xuXG4vKiogSW5wdXRzIHVzZWQgdG8gdXBkYXRlIGEgcGVyc2lzdGVudCBob21lIGFuZCBjcmVhdGUgb25lIGludm9jYXRpb24gb3ZlcmxheS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVHZW5pZUNvZGVDb25maWdPcHRpb25zIHtcbiAgYmVhcmVyVG9rZW46IHN0cmluZztcbiAgZ2F0ZXdheUJhc2VVcmw6IHN0cmluZztcbiAgaG9tZURpcmVjdG9yeT86IHN0cmluZztcbiAgbW9kZWw6IHN0cmluZztcbiAgcHJvZmlsZTogc3RyaW5nO1xuICBwcm9qZWN0RGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbi8qKiBTdGFibGUgcGVyc2lzdGVudCBob21lIGZvciBvbmUgZXhhY3QgcHJvZmlsZS1tb2RlbCBwYWlyaW5nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5pZUNvZGVQYWlyaW5nSG9tZSB7XG4gIGNvbmZpZ1BhdGg6IHN0cmluZztcbiAgaG9tZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKiBQZXJzaXN0ZW50IHBhaXJpbmcgaG9tZSBhbmQgaW52b2NhdGlvbi1zcGVjaWZpYyBwcm92aWRlciBvdmVybGF5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5pZUNvZGVIb21lIGV4dGVuZHMgR2VuaWVDb2RlUGFpcmluZ0hvbWUge1xuICBvdmVybGF5TmFtZTogc3RyaW5nO1xuICBvdmVybGF5UGF0aDogc3RyaW5nO1xufVxuXG4vKiogRGVyaXZlIHRoZSBzdGFibGUgaG9tZSBmb3Igb25lIGV4YWN0IHByb2ZpbGUtbW9kZWwgcGFpci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5pZUNvZGVIb21lKFxuICBwcm9maWxlOiBzdHJpbmcsXG4gIG1vZGVsOiBzdHJpbmcsXG4gIGhvbWVEaXJlY3Rvcnk6IHN0cmluZyA9IGhvbWVkaXIoKSxcbik6IEdlbmllQ29kZVBhaXJpbmdIb21lIHtcbiAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUoSlNPTi5zdHJpbmdpZnkoW3Byb2ZpbGUsIG1vZGVsXSkpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAxMik7XG4gIGNvbnN0IG5hbWUgPSBnZW5pZUNvZGVQYWlyaW5nTmFtZSh7IHByb2ZpbGUsIG1vZGVsLCBkaWdlc3QgfSk7XG4gIGNvbnN0IGhvbWUgPSBqb2luKGhvbWVEaXJlY3RvcnksIFwiLmRieC10b29sc1wiLCBcImdlbmllXCIsIFwicHJvZmlsZXNcIiwgbmFtZSk7XG4gIHJldHVybiB7IG5hbWUsIGhvbWUsIGNvbmZpZ1BhdGg6IGpvaW4oaG9tZSwgXCJjb25maWcudG9tbFwiKSB9O1xufVxuXG4vKiogUmVuZGVyIHRoZSBwZXJzaXN0ZW50IHByb2ZpbGUtbW9kZWwgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5pZUNvZGVCYXNlQ29uZmlnKFxuICBvcHRpb25zOiBXcml0ZUdlbmllQ29kZUNvbmZpZ09wdGlvbnMsXG4gIGV4aXN0aW5nUHJvamVjdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHt9LFxuKTogR2VuaWVDb2RlQmFzZUNvbmZpZyB7XG4gIGNvbnN0IHByb2plY3RzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGV4aXN0aW5nUHJvamVjdHMpLmZpbHRlcihcbiAgICAgIChbLCB2YWx1ZV0pID0+IG9iamVjdC5pc1JlY29yZCh2YWx1ZSkgJiYgdmFsdWUudHJ1c3RfbGV2ZWwgPT09IFwidHJ1c3RlZFwiLFxuICAgICksXG4gICk7XG4gIHJldHVybiBHZW5pZUNvZGVCYXNlQ29uZmlnU2NoZW1hLnBhcnNlKHtcbiAgICBtb2RlbF9wcm92aWRlcjogR0VOSUVfQ09ERV9HQVRFV0FZX1BST1ZJREVSLFxuICAgIG1vZGVsOiBvcHRpb25zLm1vZGVsLFxuICAgIGRhdGFicmlja3NfcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlLFxuICAgIHByb2plY3RzOiB7XG4gICAgICAuLi5wcm9qZWN0cyxcbiAgICAgIFtyZXNvbHZlKG9wdGlvbnMucHJvamVjdERpcmVjdG9yeSldOiB7XG4gICAgICAgIHRydXN0X2xldmVsOiBcInRydXN0ZWRcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgICB0dWk6IHtcbiAgICAgIG1vZGVsX2F2YWlsYWJpbGl0eV9udXg6IHtcbiAgICAgICAgW29wdGlvbnMubW9kZWxdOiAxLFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqIFJlbmRlciB0aGUgaW52b2NhdGlvbi1zcGVjaWZpYyBndWFyZGVkIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuaWVDb2RlUHJvdmlkZXJPdmVybGF5KFxuICBvcHRpb25zOiBXcml0ZUdlbmllQ29kZUNvbmZpZ09wdGlvbnMsXG4pOiBHZW5pZUNvZGVQcm92aWRlck92ZXJsYXkge1xuICByZXR1cm4gR2VuaWVDb2RlUHJvdmlkZXJPdmVybGF5U2NoZW1hLnBhcnNlKHtcbiAgICBtb2RlbF9wcm92aWRlcnM6IHtcbiAgICAgIFtHRU5JRV9DT0RFX0dBVEVXQVlfUFJPVklERVJdOiB7XG4gICAgICAgIG5hbWU6IFwiZGJ4LXRvb2xzIG1vZGVsIGdhdGV3YXlcIixcbiAgICAgICAgYmFzZV91cmw6IG9wdGlvbnMuZ2F0ZXdheUJhc2VVcmwsXG4gICAgICAgIHdpcmVfYXBpOiBcInJlc3BvbnNlc1wiLFxuICAgICAgICByZXF1aXJlc19vcGVuYWlfYXV0aDogZmFsc2UsXG4gICAgICAgIHN1cHBvcnRzX3dlYnNvY2tldHM6IGZhbHNlLFxuICAgICAgICBodHRwX2hlYWRlcnM6IHtcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7b3B0aW9ucy5iZWFyZXJUb2tlbn1gLFxuICAgICAgICAgIE9yaWdpbmF0b3I6IFwiY29kZXhcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKiBSZW5kZXIgdGhlIG1lcmdlZCBjb25maWd1cmF0aW9uIHVzZWQgYnkgdmFsaWRhdGlvbiBhbmQgdGVzdHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuaWVDb2RlQ29uZmlnKG9wdGlvbnM6IFdyaXRlR2VuaWVDb2RlQ29uZmlnT3B0aW9ucyk6IEdlbmllQ29kZUNvbmZpZyB7XG4gIHJldHVybiBHZW5pZUNvZGVDb25maWdTY2hlbWEucGFyc2Uoe1xuICAgIC4uLmdlbmllQ29kZUJhc2VDb25maWcob3B0aW9ucyksXG4gICAgLi4uZ2VuaWVDb2RlUHJvdmlkZXJPdmVybGF5KG9wdGlvbnMpLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhpc3RpbmdQcm9qZWN0cyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZShhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0ZjhcIikpO1xuICAgIHJldHVybiBvYmplY3QuaXNSZWNvcmQodmFsdWUucHJvamVjdHMpID8gdmFsdWUucHJvamVjdHMgOiB7fTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm4ge307XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVQcml2YXRlVG9tbChwYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHN0YWdlZCA9IGpvaW4oZGlybmFtZShwYXRoKSwgYC4ke3JhbmRvbVVVSUQoKX0udG9tbGApO1xuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlRmlsZShzdGFnZWQsIHN0cmluZ2lmeSh2YWx1ZSksIHsgbW9kZTogMG82MDAgfSk7XG4gICAgYXdhaXQgY2htb2Qoc3RhZ2VkLCAwbzYwMCk7XG4gICAgYXdhaXQgcmVuYW1lKHN0YWdlZCwgcGF0aCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcm0oc3RhZ2VkLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbi8qKiBVcGRhdGUgdGhlIHBlcnNpc3RlbnQgYmFzZSBjb25maWcgYW5kIHdyaXRlIG9uZSBwcml2YXRlIGludm9jYXRpb24gb3ZlcmxheS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUdlbmllQ29kZUNvbmZpZyhcbiAgb3B0aW9uczogV3JpdGVHZW5pZUNvZGVDb25maWdPcHRpb25zLFxuKTogUHJvbWlzZTxHZW5pZUNvZGVIb21lPiB7XG4gIGNvbnN0IGJhc2UgPSBnZW5pZUNvZGVIb21lKG9wdGlvbnMucHJvZmlsZSwgb3B0aW9ucy5tb2RlbCwgb3B0aW9ucy5ob21lRGlyZWN0b3J5KTtcbiAgY29uc3Qgb3ZlcmxheU5hbWUgPSBgZGJ4LSR7cmFuZG9tVVVJRCgpLnJlcGxhY2VBbGwoXCItXCIsIFwiXCIpfWA7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0ge1xuICAgIC4uLmJhc2UsXG4gICAgb3ZlcmxheU5hbWUsXG4gICAgb3ZlcmxheVBhdGg6IGpvaW4oYmFzZS5ob21lLCBgJHtvdmVybGF5TmFtZX0uY29uZmlnLnRvbWxgKSxcbiAgfTtcbiAgYXdhaXQgbWtkaXIoZGVzdGluYXRpb24uaG9tZSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdpdGhGaWxlTG9jayhbXCJnZW5pZS1jb2RlLWNvbmZpZ1wiLCBkZXN0aW5hdGlvbi5jb25maWdQYXRoXSwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZXhpc3RpbmdQcm9qZWN0cyhkZXN0aW5hdGlvbi5jb25maWdQYXRoKTtcbiAgICBhd2FpdCB3cml0ZVByaXZhdGVUb21sKGRlc3RpbmF0aW9uLmNvbmZpZ1BhdGgsIGdlbmllQ29kZUJhc2VDb25maWcob3B0aW9ucywgcHJvamVjdHMpKTtcbiAgfSk7XG4gIGF3YWl0IHdyaXRlUHJpdmF0ZVRvbWwoZGVzdGluYXRpb24ub3ZlcmxheVBhdGgsIGdlbmllQ29kZVByb3ZpZGVyT3ZlcmxheShvcHRpb25zKSk7XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install the pinned multi-file Genie Code runtime under dbx-tools ownership.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { bin } from "@dbx-tools/core";
|
|
7
|
+
interface GenieCodeAsset {
|
|
8
|
+
target: string;
|
|
9
|
+
sha256: string;
|
|
10
|
+
}
|
|
11
|
+
/** Host overrides used by installation tests and embedded callers. */
|
|
12
|
+
export interface InstallGenieCodeOptions {
|
|
13
|
+
homeDirectory?: string;
|
|
14
|
+
platform?: NodeJS.Platform;
|
|
15
|
+
architecture?: NodeJS.Architecture;
|
|
16
|
+
}
|
|
17
|
+
/** Resolve the pinned release asset for one supported host. */
|
|
18
|
+
export declare function genieCodeAsset(platform?: NodeJS.Platform, architecture?: NodeJS.Architecture): GenieCodeAsset;
|
|
19
|
+
/** Install and return the shared Genie Code package entrypoint. */
|
|
20
|
+
export declare function installGenieCode(options?: InstallGenieCodeOptions): Promise<bin.BinContext>;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install the pinned multi-file Genie Code runtime under dbx-tools ownership.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
import { dirname, join } from "node:path";
|
|
8
|
+
import { bin } from "@dbx-tools/core";
|
|
9
|
+
import { GENIE_CODE_VERSION } from "@dbx-tools/shared-genie-code/options";
|
|
10
|
+
const GENIE_CODE_ASSETS = {
|
|
11
|
+
"darwin:arm64": {
|
|
12
|
+
target: "aarch64-apple-darwin",
|
|
13
|
+
sha256: "78cc7e358c8bfc62d6da26364c762be37fc2e2a10b7e83f21a3b166f901f528e",
|
|
14
|
+
},
|
|
15
|
+
"darwin:x64": {
|
|
16
|
+
target: "x86_64-apple-darwin",
|
|
17
|
+
sha256: "2021b8b27ec3116fc015c1676b5f65c3ce11d57f1dff9c302aae135f6e4f1a5f",
|
|
18
|
+
},
|
|
19
|
+
"linux:arm64": {
|
|
20
|
+
target: "aarch64-unknown-linux-musl",
|
|
21
|
+
sha256: "dfd278c267dde43e1fe7e7d7a0da8d7a1a148cdf3d2004bd30b351645c4fe0a7",
|
|
22
|
+
},
|
|
23
|
+
"linux:x64": {
|
|
24
|
+
target: "x86_64-unknown-linux-musl",
|
|
25
|
+
sha256: "e3d9a55f6d51bdc745eda4744fb827ba1df6dacf1069518f7347a59f48c89430",
|
|
26
|
+
},
|
|
27
|
+
"win32:arm64": {
|
|
28
|
+
target: "aarch64-pc-windows-msvc",
|
|
29
|
+
sha256: "aeac95bd0148f942194270ba932245cec32e98da67292ba7b008bcab675ba7f8",
|
|
30
|
+
},
|
|
31
|
+
"win32:x64": {
|
|
32
|
+
target: "x86_64-pc-windows-msvc",
|
|
33
|
+
sha256: "c9f92c8d60273250262527bca525451501c4e8351e59927a1686c305be29a922",
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
/** Resolve the pinned release asset for one supported host. */
|
|
37
|
+
export function genieCodeAsset(platform = process.platform, architecture = process.arch) {
|
|
38
|
+
const asset = GENIE_CODE_ASSETS[`${platform}:${architecture}`];
|
|
39
|
+
if (!asset) {
|
|
40
|
+
throw new Error(`Genie Code ${GENIE_CODE_VERSION} does not support ${platform}/${architecture}`);
|
|
41
|
+
}
|
|
42
|
+
return asset;
|
|
43
|
+
}
|
|
44
|
+
/** Install and return the shared Genie Code package entrypoint. */
|
|
45
|
+
export async function installGenieCode(options = {}) {
|
|
46
|
+
const platform = options.platform ?? process.platform;
|
|
47
|
+
const asset = genieCodeAsset(platform, options.architecture ?? process.arch);
|
|
48
|
+
const executable = platform === "win32" ? "genie.exe" : "genie";
|
|
49
|
+
const helper = platform === "win32" ? "genie-code-mode-host.exe" : "genie-code-mode-host";
|
|
50
|
+
const entrypoint = join("bin", executable);
|
|
51
|
+
const root = join(options.homeDirectory ?? homedir(), ".dbx-tools", "genie", "releases", `${GENIE_CODE_VERSION}-${asset.target}`);
|
|
52
|
+
const destination = {
|
|
53
|
+
root,
|
|
54
|
+
binDir: join(root, dirname(entrypoint)),
|
|
55
|
+
path: join(root, entrypoint),
|
|
56
|
+
};
|
|
57
|
+
const url = `https://github.com/databricks/genie-code-cli/releases/download/v${GENIE_CODE_VERSION}/` +
|
|
58
|
+
`genie-package-${asset.target}.tar.gz`;
|
|
59
|
+
return bin.ensure("genie", { url, sha256: asset.sha256 }, {
|
|
60
|
+
destination,
|
|
61
|
+
minVersion: "0.1.0",
|
|
62
|
+
versionParser: ({ stdout }) => stdout.trim() === `genie ${GENIE_CODE_VERSION}` ? "0.1.0" : undefined,
|
|
63
|
+
package: {
|
|
64
|
+
entrypoint,
|
|
65
|
+
requiredPaths: ["genie-package.json", join("bin", helper), "genie-path", "genie-resources"],
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nZW5pZS1jb2RlL2luc3RhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBTzFFLE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsY0FBYyxFQUFFO1FBQ2QsTUFBTSxFQUFFLHNCQUFzQjtRQUM5QixNQUFNLEVBQUUsa0VBQWtFO0tBQzNFO0lBQ0QsWUFBWSxFQUFFO1FBQ1osTUFBTSxFQUFFLHFCQUFxQjtRQUM3QixNQUFNLEVBQUUsa0VBQWtFO0tBQzNFO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsTUFBTSxFQUFFLDRCQUE0QjtRQUNwQyxNQUFNLEVBQUUsa0VBQWtFO0tBQzNFO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsTUFBTSxFQUFFLDJCQUEyQjtRQUNuQyxNQUFNLEVBQUUsa0VBQWtFO0tBQzNFO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsTUFBTSxFQUFFLHlCQUF5QjtRQUNqQyxNQUFNLEVBQUUsa0VBQWtFO0tBQzNFO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsTUFBTSxFQUFFLHdCQUF3QjtRQUNoQyxNQUFNLEVBQUUsa0VBQWtFO0tBQzNFO0NBQ2dELENBQUM7QUFTcEQsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxjQUFjLENBQzVCLFdBQTRCLE9BQU8sQ0FBQyxRQUFRLEVBQzVDLGVBQW9DLE9BQU8sQ0FBQyxJQUFJO0lBRWhELE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsUUFBUSxJQUFJLFlBQVksRUFBb0MsQ0FBQyxDQUFDO0lBQ2pHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxLQUFLLENBQ2IsY0FBYyxrQkFBa0IscUJBQXFCLFFBQVEsSUFBSSxZQUFZLEVBQUUsQ0FDaEYsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxtRUFBbUU7QUFDbkUsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsVUFBbUMsRUFBRTtJQUVyQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDdEQsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RSxNQUFNLFVBQVUsR0FBRyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUNoRSxNQUFNLE1BQU0sR0FBRyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUM7SUFDMUYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQ2YsT0FBTyxDQUFDLGFBQWEsSUFBSSxPQUFPLEVBQUUsRUFDbEMsWUFBWSxFQUNaLE9BQU8sRUFDUCxVQUFVLEVBQ1YsR0FBRyxrQkFBa0IsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQ3hDLENBQUM7SUFDRixNQUFNLFdBQVcsR0FBbUI7UUFDbEMsSUFBSTtRQUNKLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUM7S0FDN0IsQ0FBQztJQUNGLE1BQU0sR0FBRyxHQUNQLG1FQUFtRSxrQkFBa0IsR0FBRztRQUN4RixpQkFBaUIsS0FBSyxDQUFDLE1BQU0sU0FBUyxDQUFDO0lBQ3pDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FDZixPQUFPLEVBQ1AsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFDN0I7UUFDRSxXQUFXO1FBQ1gsVUFBVSxFQUFFLE9BQU87UUFDbkIsYUFBYSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQzVCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxTQUFTLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUztRQUN2RSxPQUFPLEVBQUU7WUFDUCxVQUFVO1lBQ1YsYUFBYSxFQUFFLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLENBQUM7U0FDNUY7S0FDRixDQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnN0YWxsIHRoZSBwaW5uZWQgbXVsdGktZmlsZSBHZW5pZSBDb2RlIHJ1bnRpbWUgdW5kZXIgZGJ4LXRvb2xzIG93bmVyc2hpcC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgYmluIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgR0VOSUVfQ09ERV9WRVJTSU9OIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWdlbmllLWNvZGUvb3B0aW9uc1wiO1xuXG5pbnRlcmZhY2UgR2VuaWVDb2RlQXNzZXQge1xuICB0YXJnZXQ6IHN0cmluZztcbiAgc2hhMjU2OiBzdHJpbmc7XG59XG5cbmNvbnN0IEdFTklFX0NPREVfQVNTRVRTID0ge1xuICBcImRhcndpbjphcm02NFwiOiB7XG4gICAgdGFyZ2V0OiBcImFhcmNoNjQtYXBwbGUtZGFyd2luXCIsXG4gICAgc2hhMjU2OiBcIjc4Y2M3ZTM1OGM4YmZjNjJkNmRhMjYzNjRjNzYyYmUzN2ZjMmUyYTEwYjdlODNmMjFhM2IxNjZmOTAxZjUyOGVcIixcbiAgfSxcbiAgXCJkYXJ3aW46eDY0XCI6IHtcbiAgICB0YXJnZXQ6IFwieDg2XzY0LWFwcGxlLWRhcndpblwiLFxuICAgIHNoYTI1NjogXCIyMDIxYjhiMjdlYzMxMTZmYzAxNWMxNjc2YjVmNjVjM2NlMTFkNTdmMWRmZjljMzAyYWFlMTM1ZjZlNGYxYTVmXCIsXG4gIH0sXG4gIFwibGludXg6YXJtNjRcIjoge1xuICAgIHRhcmdldDogXCJhYXJjaDY0LXVua25vd24tbGludXgtbXVzbFwiLFxuICAgIHNoYTI1NjogXCJkZmQyNzhjMjY3ZGRlNDNlMWZlN2U3ZDdhMGRhOGQ3YTFhMTQ4Y2RmM2QyMDA0YmQzMGIzNTE2NDVjNGZlMGE3XCIsXG4gIH0sXG4gIFwibGludXg6eDY0XCI6IHtcbiAgICB0YXJnZXQ6IFwieDg2XzY0LXVua25vd24tbGludXgtbXVzbFwiLFxuICAgIHNoYTI1NjogXCJlM2Q5YTU1ZjZkNTFiZGM3NDVlZGE0NzQ0ZmI4MjdiYTFkZjZkYWNmMTA2OTUxOGY3MzQ3YTU5ZjQ4Yzg5NDMwXCIsXG4gIH0sXG4gIFwid2luMzI6YXJtNjRcIjoge1xuICAgIHRhcmdldDogXCJhYXJjaDY0LXBjLXdpbmRvd3MtbXN2Y1wiLFxuICAgIHNoYTI1NjogXCJhZWFjOTViZDAxNDhmOTQyMTk0MjcwYmE5MzIyNDVjZWMzMmU5OGRhNjcyOTJiYTdiMDA4YmNhYjY3NWJhN2Y4XCIsXG4gIH0sXG4gIFwid2luMzI6eDY0XCI6IHtcbiAgICB0YXJnZXQ6IFwieDg2XzY0LXBjLXdpbmRvd3MtbXN2Y1wiLFxuICAgIHNoYTI1NjogXCJjOWY5MmM4ZDYwMjczMjUwMjYyNTI3YmNhNTI1NDUxNTAxYzRlODM1MWU1OTkyN2ExNjg2YzMwNWJlMjlhOTIyXCIsXG4gIH0sXG59IGFzIGNvbnN0IHNhdGlzZmllcyBSZWNvcmQ8c3RyaW5nLCBHZW5pZUNvZGVBc3NldD47XG5cbi8qKiBIb3N0IG92ZXJyaWRlcyB1c2VkIGJ5IGluc3RhbGxhdGlvbiB0ZXN0cyBhbmQgZW1iZWRkZWQgY2FsbGVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGFsbEdlbmllQ29kZU9wdGlvbnMge1xuICBob21lRGlyZWN0b3J5Pzogc3RyaW5nO1xuICBwbGF0Zm9ybT86IE5vZGVKUy5QbGF0Zm9ybTtcbiAgYXJjaGl0ZWN0dXJlPzogTm9kZUpTLkFyY2hpdGVjdHVyZTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIHBpbm5lZCByZWxlYXNlIGFzc2V0IGZvciBvbmUgc3VwcG9ydGVkIGhvc3QuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuaWVDb2RlQXNzZXQoXG4gIHBsYXRmb3JtOiBOb2RlSlMuUGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtLFxuICBhcmNoaXRlY3R1cmU6IE5vZGVKUy5BcmNoaXRlY3R1cmUgPSBwcm9jZXNzLmFyY2gsXG4pOiBHZW5pZUNvZGVBc3NldCB7XG4gIGNvbnN0IGFzc2V0ID0gR0VOSUVfQ09ERV9BU1NFVFNbYCR7cGxhdGZvcm19OiR7YXJjaGl0ZWN0dXJlfWAgYXMga2V5b2YgdHlwZW9mIEdFTklFX0NPREVfQVNTRVRTXTtcbiAgaWYgKCFhc3NldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBHZW5pZSBDb2RlICR7R0VOSUVfQ09ERV9WRVJTSU9OfSBkb2VzIG5vdCBzdXBwb3J0ICR7cGxhdGZvcm19LyR7YXJjaGl0ZWN0dXJlfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYXNzZXQ7XG59XG5cbi8qKiBJbnN0YWxsIGFuZCByZXR1cm4gdGhlIHNoYXJlZCBHZW5pZSBDb2RlIHBhY2thZ2UgZW50cnlwb2ludC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsR2VuaWVDb2RlKFxuICBvcHRpb25zOiBJbnN0YWxsR2VuaWVDb2RlT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxiaW4uQmluQ29udGV4dD4ge1xuICBjb25zdCBwbGF0Zm9ybSA9IG9wdGlvbnMucGxhdGZvcm0gPz8gcHJvY2Vzcy5wbGF0Zm9ybTtcbiAgY29uc3QgYXNzZXQgPSBnZW5pZUNvZGVBc3NldChwbGF0Zm9ybSwgb3B0aW9ucy5hcmNoaXRlY3R1cmUgPz8gcHJvY2Vzcy5hcmNoKTtcbiAgY29uc3QgZXhlY3V0YWJsZSA9IHBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcImdlbmllLmV4ZVwiIDogXCJnZW5pZVwiO1xuICBjb25zdCBoZWxwZXIgPSBwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJnZW5pZS1jb2RlLW1vZGUtaG9zdC5leGVcIiA6IFwiZ2VuaWUtY29kZS1tb2RlLWhvc3RcIjtcbiAgY29uc3QgZW50cnlwb2ludCA9IGpvaW4oXCJiaW5cIiwgZXhlY3V0YWJsZSk7XG4gIGNvbnN0IHJvb3QgPSBqb2luKFxuICAgIG9wdGlvbnMuaG9tZURpcmVjdG9yeSA/PyBob21lZGlyKCksXG4gICAgXCIuZGJ4LXRvb2xzXCIsXG4gICAgXCJnZW5pZVwiLFxuICAgIFwicmVsZWFzZXNcIixcbiAgICBgJHtHRU5JRV9DT0RFX1ZFUlNJT059LSR7YXNzZXQudGFyZ2V0fWAsXG4gICk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uOiBiaW4uQmluQ29udGV4dCA9IHtcbiAgICByb290LFxuICAgIGJpbkRpcjogam9pbihyb290LCBkaXJuYW1lKGVudHJ5cG9pbnQpKSxcbiAgICBwYXRoOiBqb2luKHJvb3QsIGVudHJ5cG9pbnQpLFxuICB9O1xuICBjb25zdCB1cmwgPVxuICAgIGBodHRwczovL2dpdGh1Yi5jb20vZGF0YWJyaWNrcy9nZW5pZS1jb2RlLWNsaS9yZWxlYXNlcy9kb3dubG9hZC92JHtHRU5JRV9DT0RFX1ZFUlNJT059L2AgK1xuICAgIGBnZW5pZS1wYWNrYWdlLSR7YXNzZXQudGFyZ2V0fS50YXIuZ3pgO1xuICByZXR1cm4gYmluLmVuc3VyZShcbiAgICBcImdlbmllXCIsXG4gICAgeyB1cmwsIHNoYTI1NjogYXNzZXQuc2hhMjU2IH0sXG4gICAge1xuICAgICAgZGVzdGluYXRpb24sXG4gICAgICBtaW5WZXJzaW9uOiBcIjAuMS4wXCIsXG4gICAgICB2ZXJzaW9uUGFyc2VyOiAoeyBzdGRvdXQgfSkgPT5cbiAgICAgICAgc3Rkb3V0LnRyaW0oKSA9PT0gYGdlbmllICR7R0VOSUVfQ09ERV9WRVJTSU9OfWAgPyBcIjAuMS4wXCIgOiB1bmRlZmluZWQsXG4gICAgICBwYWNrYWdlOiB7XG4gICAgICAgIGVudHJ5cG9pbnQsXG4gICAgICAgIHJlcXVpcmVkUGF0aHM6IFtcImdlbmllLXBhY2thZ2UuanNvblwiLCBqb2luKFwiYmluXCIsIGhlbHBlciksIFwiZ2VuaWUtcGF0aFwiLCBcImdlbmllLXJlc291cmNlc1wiXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI projection of the shared managed Genie Code options.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
export { GenieCodeOptionsSchema as GenieCodeCliOptionsSchema, resolveGenieCodeOptions as resolveGenieCodeCliOptions, } from "@dbx-tools/shared-genie-code/options";
|
|
7
|
+
export type { GenieCodeOptions as GenieCodeCliOptions, ResolvedGenieCodeOptions as ResolvedGenieCodeCliOptions, } from "@dbx-tools/shared-genie-code/options";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI projection of the shared managed Genie Code options.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
export { GenieCodeOptionsSchema as GenieCodeCliOptionsSchema, resolveGenieCodeOptions as resolveGenieCodeCliOptions, } from "@dbx-tools/shared-genie-code/options";
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nZW5pZS1jb2RlL29wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFDTCxzQkFBc0IsSUFBSSx5QkFBeUIsRUFDbkQsdUJBQXVCLElBQUksMEJBQTBCLEdBQ3RELE1BQU0sc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENMSSBwcm9qZWN0aW9uIG9mIHRoZSBzaGFyZWQgbWFuYWdlZCBHZW5pZSBDb2RlIG9wdGlvbnMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmV4cG9ydCB7XG4gIEdlbmllQ29kZU9wdGlvbnNTY2hlbWEgYXMgR2VuaWVDb2RlQ2xpT3B0aW9uc1NjaGVtYSxcbiAgcmVzb2x2ZUdlbmllQ29kZU9wdGlvbnMgYXMgcmVzb2x2ZUdlbmllQ29kZUNsaU9wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5pZS1jb2RlL29wdGlvbnNcIjtcbmV4cG9ydCB0eXBlIHtcbiAgR2VuaWVDb2RlT3B0aW9ucyBhcyBHZW5pZUNvZGVDbGlPcHRpb25zLFxuICBSZXNvbHZlZEdlbmllQ29kZU9wdGlvbnMgYXMgUmVzb2x2ZWRHZW5pZUNvZGVDbGlPcHRpb25zLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZ2VuaWUtY29kZS9vcHRpb25zXCI7XG4iXX0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal readiness gate and interactive Genie Code child process.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
/** Private environment field carrying serialized runner options. */
|
|
7
|
+
declare const RUNNER_OPTIONS_ENV = "DBX_TOOLS_GENIE_RUNNER_OPTIONS";
|
|
8
|
+
/** Parse the serialized runner boundary from its private environment field. */
|
|
9
|
+
export declare function genieCodeRunnerOptions(environment?: NodeJS.ProcessEnv): {
|
|
10
|
+
executable: string;
|
|
11
|
+
arguments: readonly string[];
|
|
12
|
+
home: string;
|
|
13
|
+
gatewayHealthUrl: string;
|
|
14
|
+
bearerToken: string;
|
|
15
|
+
startupTimeoutMs: number;
|
|
16
|
+
};
|
|
17
|
+
/** Wait until the guarded model-gateway health route accepts the runner token. */
|
|
18
|
+
export declare function waitForGenieCodeGateway(healthUrl: string, bearerToken: string, timeoutMs: number): Promise<void>;
|
|
19
|
+
/** Run Genie Code with inherited terminal streams after its gateway is ready. */
|
|
20
|
+
export declare function runGenieCodeChild(environment?: NodeJS.ProcessEnv): Promise<void>;
|
|
21
|
+
export { RUNNER_OPTIONS_ENV };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal readiness gate and interactive Genie Code child process.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { AppKitChildProcess } from "@dbx-tools/appkit/child-process";
|
|
7
|
+
import { asyncUtils, log } from "@dbx-tools/shared-core";
|
|
8
|
+
import { GenieCodeRunnerOptionsSchema } from "@dbx-tools/shared-genie-code/options";
|
|
9
|
+
/** Private environment field carrying serialized runner options. */
|
|
10
|
+
const RUNNER_OPTIONS_ENV = "DBX_TOOLS_GENIE_RUNNER_OPTIONS";
|
|
11
|
+
const logger = log.logger("genie-code:runner");
|
|
12
|
+
/** Parse the serialized runner boundary from its private environment field. */
|
|
13
|
+
export function genieCodeRunnerOptions(environment = process.env) {
|
|
14
|
+
const serialized = environment[RUNNER_OPTIONS_ENV];
|
|
15
|
+
if (!serialized)
|
|
16
|
+
throw new Error(`${RUNNER_OPTIONS_ENV} is required`);
|
|
17
|
+
return GenieCodeRunnerOptionsSchema.parse(JSON.parse(serialized));
|
|
18
|
+
}
|
|
19
|
+
/** Wait until the guarded model-gateway health route accepts the runner token. */
|
|
20
|
+
export async function waitForGenieCodeGateway(healthUrl, bearerToken, timeoutMs) {
|
|
21
|
+
for await (const ready of asyncUtils.poll(async ({ signal }) => {
|
|
22
|
+
try {
|
|
23
|
+
const response = await fetch(healthUrl, {
|
|
24
|
+
headers: { authorization: `Bearer ${bearerToken}` },
|
|
25
|
+
signal,
|
|
26
|
+
});
|
|
27
|
+
return response.ok;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}, {
|
|
33
|
+
intervalMs: 200,
|
|
34
|
+
timeoutMs,
|
|
35
|
+
predicate: (ready) => !ready,
|
|
36
|
+
})) {
|
|
37
|
+
if (ready)
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Run Genie Code with inherited terminal streams after its gateway is ready. */
|
|
42
|
+
export async function runGenieCodeChild(environment = process.env) {
|
|
43
|
+
const options = genieCodeRunnerOptions(environment);
|
|
44
|
+
logger.info("waiting for model gateway", {
|
|
45
|
+
gateway: options.gatewayHealthUrl,
|
|
46
|
+
timeoutMs: options.startupTimeoutMs,
|
|
47
|
+
});
|
|
48
|
+
await waitForGenieCodeGateway(options.gatewayHealthUrl, options.bearerToken, options.startupTimeoutMs);
|
|
49
|
+
logger.info("model gateway ready; starting Genie Code", {
|
|
50
|
+
executable: options.executable,
|
|
51
|
+
home: options.home,
|
|
52
|
+
});
|
|
53
|
+
const child = new AppKitChildProcess([
|
|
54
|
+
options.executable,
|
|
55
|
+
[...options.arguments],
|
|
56
|
+
{
|
|
57
|
+
cwd: process.cwd(),
|
|
58
|
+
env: {
|
|
59
|
+
...environment,
|
|
60
|
+
GENIE_HOME: options.home,
|
|
61
|
+
},
|
|
62
|
+
stdin: "inherit",
|
|
63
|
+
stdout: "inherit",
|
|
64
|
+
stderr: "inherit",
|
|
65
|
+
},
|
|
66
|
+
], {
|
|
67
|
+
gracefulTimeoutMs: 5_000,
|
|
68
|
+
forceTimeoutMs: 1_000,
|
|
69
|
+
});
|
|
70
|
+
const running = child.start();
|
|
71
|
+
const shutdown = () => {
|
|
72
|
+
void child.shutdown();
|
|
73
|
+
};
|
|
74
|
+
for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) {
|
|
75
|
+
process.once(signal, shutdown);
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const result = await running;
|
|
79
|
+
if (result.exitCode !== 0)
|
|
80
|
+
process.exitCode = result.exitCode;
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
for (const signal of ["SIGINT", "SIGTERM", "SIGHUP"]) {
|
|
84
|
+
process.off(signal, shutdown);
|
|
85
|
+
}
|
|
86
|
+
await child.shutdown();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export { RUNNER_OPTIONS_ENV };
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dlbmllLWNvZGUvcnVubmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXBGLG9FQUFvRTtBQUNwRSxNQUFNLGtCQUFrQixHQUFHLGdDQUFnQyxDQUFDO0FBQzVELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUUvQywrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLHNCQUFzQixDQUFDLGNBQWlDLE9BQU8sQ0FBQyxHQUFHO0lBQ2pGLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ25ELElBQUksQ0FBQyxVQUFVO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLGtCQUFrQixjQUFjLENBQUMsQ0FBQztJQUN0RSxPQUFPLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxTQUFpQixFQUNqQixXQUFtQixFQUNuQixTQUFpQjtJQUVqQixJQUFJLEtBQUssRUFBRSxNQUFNLEtBQUssSUFBSSxVQUFVLENBQUMsSUFBSSxDQUN2QyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQ25CLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFNBQVMsRUFBRTtnQkFDdEMsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsV0FBVyxFQUFFLEVBQUU7Z0JBQ25ELE1BQU07YUFDUCxDQUFDLENBQUM7WUFDSCxPQUFPLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUMsRUFDRDtRQUNFLFVBQVUsRUFBRSxHQUFHO1FBQ2YsU0FBUztRQUNULFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLO0tBQzdCLENBQ0YsRUFBRSxDQUFDO1FBQ0YsSUFBSSxLQUFLO1lBQUUsT0FBTztJQUNwQixDQUFDO0FBQ0gsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxjQUFpQyxPQUFPLENBQUMsR0FBRztJQUU1QyxNQUFNLE9BQU8sR0FBRyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFO1FBQ3ZDLE9BQU8sRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1FBQ2pDLFNBQVMsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO0tBQ3BDLENBQUMsQ0FBQztJQUNILE1BQU0sdUJBQXVCLENBQzNCLE9BQU8sQ0FBQyxnQkFBZ0IsRUFDeEIsT0FBTyxDQUFDLFdBQVcsRUFDbkIsT0FBTyxDQUFDLGdCQUFnQixDQUN6QixDQUFDO0lBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQywwQ0FBMEMsRUFBRTtRQUN0RCxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7UUFDOUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO0tBQ25CLENBQUMsQ0FBQztJQUNILE1BQU0sS0FBSyxHQUFHLElBQUksa0JBQWtCLENBQ2xDO1FBQ0UsT0FBTyxDQUFDLFVBQVU7UUFDbEIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDdEI7WUFDRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUNsQixHQUFHLEVBQUU7Z0JBQ0gsR0FBRyxXQUFXO2dCQUNkLFVBQVUsRUFBRSxPQUFPLENBQUMsSUFBSTthQUN6QjtZQUNELEtBQUssRUFBRSxTQUFTO1lBQ2hCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxTQUFTO1NBQ2xCO0tBQ0YsRUFDRDtRQUNFLGlCQUFpQixFQUFFLEtBQUs7UUFDeEIsY0FBYyxFQUFFLEtBQUs7S0FDdEIsQ0FDRixDQUFDO0lBQ0YsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzlCLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRTtRQUNwQixLQUFLLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4QixDQUFDLENBQUM7SUFDRixLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQVUsRUFBRSxDQUFDO1FBQzlELE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQztRQUM3QixJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUNoRSxDQUFDO1lBQVMsQ0FBQztRQUNULEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBVSxFQUFFLENBQUM7WUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELE1BQU0sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7QUFDSCxDQUFDO0FBRUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVybmFsIHJlYWRpbmVzcyBnYXRlIGFuZCBpbnRlcmFjdGl2ZSBHZW5pZSBDb2RlIGNoaWxkIHByb2Nlc3MuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEFwcEtpdENoaWxkUHJvY2VzcyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC9jaGlsZC1wcm9jZXNzXCI7XG5pbXBvcnQgeyBhc3luY1V0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgR2VuaWVDb2RlUnVubmVyT3B0aW9uc1NjaGVtYSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5pZS1jb2RlL29wdGlvbnNcIjtcblxuLyoqIFByaXZhdGUgZW52aXJvbm1lbnQgZmllbGQgY2Fycnlpbmcgc2VyaWFsaXplZCBydW5uZXIgb3B0aW9ucy4gKi9cbmNvbnN0IFJVTk5FUl9PUFRJT05TX0VOViA9IFwiREJYX1RPT0xTX0dFTklFX1JVTk5FUl9PUFRJT05TXCI7XG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiZ2VuaWUtY29kZTpydW5uZXJcIik7XG5cbi8qKiBQYXJzZSB0aGUgc2VyaWFsaXplZCBydW5uZXIgYm91bmRhcnkgZnJvbSBpdHMgcHJpdmF0ZSBlbnZpcm9ubWVudCBmaWVsZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5pZUNvZGVSdW5uZXJPcHRpb25zKGVudmlyb25tZW50OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHByb2Nlc3MuZW52KSB7XG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBlbnZpcm9ubWVudFtSVU5ORVJfT1BUSU9OU19FTlZdO1xuICBpZiAoIXNlcmlhbGl6ZWQpIHRocm93IG5ldyBFcnJvcihgJHtSVU5ORVJfT1BUSU9OU19FTlZ9IGlzIHJlcXVpcmVkYCk7XG4gIHJldHVybiBHZW5pZUNvZGVSdW5uZXJPcHRpb25zU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uoc2VyaWFsaXplZCkpO1xufVxuXG4vKiogV2FpdCB1bnRpbCB0aGUgZ3VhcmRlZCBtb2RlbC1nYXRld2F5IGhlYWx0aCByb3V0ZSBhY2NlcHRzIHRoZSBydW5uZXIgdG9rZW4uICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdEZvckdlbmllQ29kZUdhdGV3YXkoXG4gIGhlYWx0aFVybDogc3RyaW5nLFxuICBiZWFyZXJUb2tlbjogc3RyaW5nLFxuICB0aW1lb3V0TXM6IG51bWJlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgYXdhaXQgKGNvbnN0IHJlYWR5IG9mIGFzeW5jVXRpbHMucG9sbChcbiAgICBhc3luYyAoeyBzaWduYWwgfSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChoZWFsdGhVcmwsIHtcbiAgICAgICAgICBoZWFkZXJzOiB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gIH0sXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLm9rO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGludGVydmFsTXM6IDIwMCxcbiAgICAgIHRpbWVvdXRNcyxcbiAgICAgIHByZWRpY2F0ZTogKHJlYWR5KSA9PiAhcmVhZHksXG4gICAgfSxcbiAgKSkge1xuICAgIGlmIChyZWFkeSkgcmV0dXJuO1xuICB9XG59XG5cbi8qKiBSdW4gR2VuaWUgQ29kZSB3aXRoIGluaGVyaXRlZCB0ZXJtaW5hbCBzdHJlYW1zIGFmdGVyIGl0cyBnYXRld2F5IGlzIHJlYWR5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkdlbmllQ29kZUNoaWxkKFxuICBlbnZpcm9ubWVudDogTm9kZUpTLlByb2Nlc3NFbnYgPSBwcm9jZXNzLmVudixcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBvcHRpb25zID0gZ2VuaWVDb2RlUnVubmVyT3B0aW9ucyhlbnZpcm9ubWVudCk7XG4gIGxvZ2dlci5pbmZvKFwid2FpdGluZyBmb3IgbW9kZWwgZ2F0ZXdheVwiLCB7XG4gICAgZ2F0ZXdheTogb3B0aW9ucy5nYXRld2F5SGVhbHRoVXJsLFxuICAgIHRpbWVvdXRNczogb3B0aW9ucy5zdGFydHVwVGltZW91dE1zLFxuICB9KTtcbiAgYXdhaXQgd2FpdEZvckdlbmllQ29kZUdhdGV3YXkoXG4gICAgb3B0aW9ucy5nYXRld2F5SGVhbHRoVXJsLFxuICAgIG9wdGlvbnMuYmVhcmVyVG9rZW4sXG4gICAgb3B0aW9ucy5zdGFydHVwVGltZW91dE1zLFxuICApO1xuICBsb2dnZXIuaW5mbyhcIm1vZGVsIGdhdGV3YXkgcmVhZHk7IHN0YXJ0aW5nIEdlbmllIENvZGVcIiwge1xuICAgIGV4ZWN1dGFibGU6IG9wdGlvbnMuZXhlY3V0YWJsZSxcbiAgICBob21lOiBvcHRpb25zLmhvbWUsXG4gIH0pO1xuICBjb25zdCBjaGlsZCA9IG5ldyBBcHBLaXRDaGlsZFByb2Nlc3MoXG4gICAgW1xuICAgICAgb3B0aW9ucy5leGVjdXRhYmxlLFxuICAgICAgWy4uLm9wdGlvbnMuYXJndW1lbnRzXSxcbiAgICAgIHtcbiAgICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICAuLi5lbnZpcm9ubWVudCxcbiAgICAgICAgICBHRU5JRV9IT01FOiBvcHRpb25zLmhvbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHN0ZGluOiBcImluaGVyaXRcIixcbiAgICAgICAgc3Rkb3V0OiBcImluaGVyaXRcIixcbiAgICAgICAgc3RkZXJyOiBcImluaGVyaXRcIixcbiAgICAgIH0sXG4gICAgXSxcbiAgICB7XG4gICAgICBncmFjZWZ1bFRpbWVvdXRNczogNV8wMDAsXG4gICAgICBmb3JjZVRpbWVvdXRNczogMV8wMDAsXG4gICAgfSxcbiAgKTtcbiAgY29uc3QgcnVubmluZyA9IGNoaWxkLnN0YXJ0KCk7XG4gIGNvbnN0IHNodXRkb3duID0gKCkgPT4ge1xuICAgIHZvaWQgY2hpbGQuc2h1dGRvd24oKTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiLCBcIlNJR0hVUFwiXSBhcyBjb25zdCkge1xuICAgIHByb2Nlc3Mub25jZShzaWduYWwsIHNodXRkb3duKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bm5pbmc7XG4gICAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkgcHJvY2Vzcy5leGl0Q29kZSA9IHJlc3VsdC5leGl0Q29kZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbXCJTSUdJTlRcIiwgXCJTSUdURVJNXCIsIFwiU0lHSFVQXCJdIGFzIGNvbnN0KSB7XG4gICAgICBwcm9jZXNzLm9mZihzaWduYWwsIHNodXRkb3duKTtcbiAgICB9XG4gICAgYXdhaXQgY2hpbGQuc2h1dGRvd24oKTtcbiAgfVxufVxuXG5leHBvcnQgeyBSVU5ORVJfT1BUSU9OU19FTlYgfTtcbiJdfQ==
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supervise Genie Code and its authenticated local model gateway.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import * as auth from "@dbx-tools/auth";
|
|
7
|
+
import type { BinContext } from "@dbx-tools/core/bin";
|
|
8
|
+
import { type GenieCodeOptions } from "@dbx-tools/shared-genie-code/options";
|
|
9
|
+
import concurrently from "concurrently";
|
|
10
|
+
import { writeGenieCodeConfig, type GenieCodeHome } from "./config.ts";
|
|
11
|
+
import { installGenieCode } from "./install.ts";
|
|
12
|
+
/** Injectable owners used to prepare and supervise managed Genie Code. */
|
|
13
|
+
export interface GenieCodeRuntimeDependencies {
|
|
14
|
+
createAuthClient: typeof auth.client.createAuthClient;
|
|
15
|
+
install: typeof installGenieCode;
|
|
16
|
+
port(options: {
|
|
17
|
+
host: string;
|
|
18
|
+
port?: number;
|
|
19
|
+
}): Promise<number>;
|
|
20
|
+
resolveBin(packageReference: string, binName: string): string;
|
|
21
|
+
resolveCodexModel(model: string, profile: string): Promise<string>;
|
|
22
|
+
supervise: typeof concurrently;
|
|
23
|
+
token(): string;
|
|
24
|
+
writeConfig: typeof writeGenieCodeConfig;
|
|
25
|
+
}
|
|
26
|
+
/** Inputs accepted by managed Genie Code preparation and execution. */
|
|
27
|
+
export interface RunGenieCodeOptions {
|
|
28
|
+
cwd?: string;
|
|
29
|
+
dependencies?: Partial<GenieCodeRuntimeDependencies>;
|
|
30
|
+
genieArgs?: readonly string[];
|
|
31
|
+
options?: GenieCodeOptions;
|
|
32
|
+
}
|
|
33
|
+
/** Resolved installation, auth, listener, and home for one invocation. */
|
|
34
|
+
export interface PreparedGenieCodeRuntime {
|
|
35
|
+
bearerToken: string;
|
|
36
|
+
gatewayBaseUrl: string;
|
|
37
|
+
gatewayHealthUrl: string;
|
|
38
|
+
gatewayListen: string;
|
|
39
|
+
gatewayPort: number;
|
|
40
|
+
home: GenieCodeHome;
|
|
41
|
+
installation: BinContext;
|
|
42
|
+
model: string;
|
|
43
|
+
profile: string;
|
|
44
|
+
}
|
|
45
|
+
/** Resolve auth, installation, listener, and configuration before spawning children. */
|
|
46
|
+
export declare function prepareGenieCodeRuntime(input?: RunGenieCodeOptions): Promise<PreparedGenieCodeRuntime>;
|
|
47
|
+
/** Run Genie Code and the model gateway until either process exits. */
|
|
48
|
+
export declare function runGenieCode(input?: RunGenieCodeOptions): Promise<void>;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supervise Genie Code and its authenticated local model gateway.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { randomBytes } from "node:crypto";
|
|
7
|
+
import { rm } from "node:fs/promises";
|
|
8
|
+
import { delimiter, dirname } from "node:path";
|
|
9
|
+
import { DatabricksModelRegistry, models } from "@dbx-tools/appkit-model-gateway";
|
|
10
|
+
import * as auth from "@dbx-tools/auth";
|
|
11
|
+
import { resolveServicePackageBin } from "@dbx-tools/cli-service/definition";
|
|
12
|
+
import { workspaceClient } from "@dbx-tools/databricks";
|
|
13
|
+
import { log } from "@dbx-tools/shared-core";
|
|
14
|
+
import { resolveGenieCodeOptions, } from "@dbx-tools/shared-genie-code/options";
|
|
15
|
+
import concurrently from "concurrently";
|
|
16
|
+
import getPort from "get-port";
|
|
17
|
+
import { writeGenieCodeConfig } from "./config.js";
|
|
18
|
+
import { installGenieCode } from "./install.js";
|
|
19
|
+
import { RUNNER_OPTIONS_ENV } from "./runner.js";
|
|
20
|
+
const logger = log.logger("genie-code");
|
|
21
|
+
const DEFAULT_DEPENDENCIES = {
|
|
22
|
+
createAuthClient: auth.client.createAuthClient,
|
|
23
|
+
install: installGenieCode,
|
|
24
|
+
port: ({ host, port }) => getPort({ host, ...(port ? { port } : {}) }),
|
|
25
|
+
resolveBin: resolveServicePackageBin,
|
|
26
|
+
resolveCodexModel,
|
|
27
|
+
supervise: concurrently,
|
|
28
|
+
token: () => randomBytes(32).toString("base64url"),
|
|
29
|
+
writeConfig: writeGenieCodeConfig,
|
|
30
|
+
};
|
|
31
|
+
/** Resolve a Genie `--model` value to the Codex catalogue slug the gateway publishes. */
|
|
32
|
+
async function resolveCodexModel(model, profile) {
|
|
33
|
+
const client = await workspaceClient.createWorkspaceClient({ profile });
|
|
34
|
+
const target = await new DatabricksModelRegistry({ client }).resolve(model, {
|
|
35
|
+
requiresTools: true,
|
|
36
|
+
});
|
|
37
|
+
if (!target)
|
|
38
|
+
throw new Error(`Genie Code model not found: ${model}`);
|
|
39
|
+
return models.codexModelSlug(target);
|
|
40
|
+
}
|
|
41
|
+
/** Resolve auth, installation, listener, and configuration before spawning children. */
|
|
42
|
+
export async function prepareGenieCodeRuntime(input = {}) {
|
|
43
|
+
const dependencies = { ...DEFAULT_DEPENDENCIES, ...input.dependencies };
|
|
44
|
+
const options = resolveGenieCodeOptions(input.options);
|
|
45
|
+
logger.info("resolving Databricks authentication", {
|
|
46
|
+
requestedProfile: options.profile,
|
|
47
|
+
});
|
|
48
|
+
const authClient = await dependencies.createAuthClient(options.profile ? { profile: options.profile } : {});
|
|
49
|
+
const profile = authClient.profile;
|
|
50
|
+
if (!profile) {
|
|
51
|
+
throw new Error("Genie Code requires a configured Databricks profile");
|
|
52
|
+
}
|
|
53
|
+
logger.info("preparing Genie Code runtime", {
|
|
54
|
+
profile,
|
|
55
|
+
model: options.model,
|
|
56
|
+
});
|
|
57
|
+
const installation = await dependencies.install();
|
|
58
|
+
const host = options.gatewayListen.host;
|
|
59
|
+
const requestedPort = options.gatewayListen.port;
|
|
60
|
+
const gatewayPort = await dependencies.port({
|
|
61
|
+
host,
|
|
62
|
+
...(requestedPort > 0 ? { port: requestedPort } : {}),
|
|
63
|
+
});
|
|
64
|
+
if (requestedPort > 0 && gatewayPort !== requestedPort) {
|
|
65
|
+
throw new Error(`Genie Code gateway port ${requestedPort} is already in use`);
|
|
66
|
+
}
|
|
67
|
+
const model = await dependencies.resolveCodexModel(options.model, profile);
|
|
68
|
+
logger.info("resolved Genie Code model", { requested: options.model, model });
|
|
69
|
+
const urlHost = host.includes(":") ? `[${host}]` : host;
|
|
70
|
+
const gatewayBaseUrl = `http://${urlHost}:${gatewayPort}/v1`;
|
|
71
|
+
const gatewayHealthUrl = `http://${urlHost}:${gatewayPort}/api/healthz`;
|
|
72
|
+
const gatewayListen = `tcp://${urlHost}:${gatewayPort}`;
|
|
73
|
+
const bearerToken = dependencies.token();
|
|
74
|
+
const home = await dependencies.writeConfig({
|
|
75
|
+
bearerToken,
|
|
76
|
+
gatewayBaseUrl,
|
|
77
|
+
model,
|
|
78
|
+
profile,
|
|
79
|
+
projectDirectory: input.cwd ?? process.cwd(),
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
bearerToken,
|
|
83
|
+
gatewayBaseUrl,
|
|
84
|
+
gatewayHealthUrl,
|
|
85
|
+
gatewayListen,
|
|
86
|
+
gatewayPort,
|
|
87
|
+
home,
|
|
88
|
+
installation,
|
|
89
|
+
model,
|
|
90
|
+
profile,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function shellExecutable(path) {
|
|
94
|
+
if (process.platform === "win32")
|
|
95
|
+
return `"${path.replaceAll('"', '""')}"`;
|
|
96
|
+
return `'${path.replaceAll("'", "'\\''")}'`;
|
|
97
|
+
}
|
|
98
|
+
function childPath(...paths) {
|
|
99
|
+
return [...new Set([...paths.map(dirname), process.env.PATH].filter(Boolean))].join(delimiter);
|
|
100
|
+
}
|
|
101
|
+
/** Run Genie Code and the model gateway until either process exits. */
|
|
102
|
+
export async function runGenieCode(input = {}) {
|
|
103
|
+
const dependencies = { ...DEFAULT_DEPENDENCIES, ...input.dependencies };
|
|
104
|
+
const prepared = await prepareGenieCodeRuntime({
|
|
105
|
+
...input,
|
|
106
|
+
dependencies,
|
|
107
|
+
});
|
|
108
|
+
const gatewayBin = dependencies.resolveBin(import.meta.url, "dbx-model-gateway");
|
|
109
|
+
const runnerBin = dependencies.resolveBin(import.meta.url, "dbx-genie");
|
|
110
|
+
const path = childPath(gatewayBin, runnerBin);
|
|
111
|
+
const runnerOptions = {
|
|
112
|
+
executable: prepared.installation.path,
|
|
113
|
+
arguments: ["-p", prepared.home.overlayName, ...(input.genieArgs ?? [])],
|
|
114
|
+
home: prepared.home.home,
|
|
115
|
+
gatewayHealthUrl: prepared.gatewayHealthUrl,
|
|
116
|
+
bearerToken: prepared.bearerToken,
|
|
117
|
+
startupTimeoutMs: 60_000,
|
|
118
|
+
};
|
|
119
|
+
const { result } = dependencies.supervise([
|
|
120
|
+
{
|
|
121
|
+
command: shellExecutable(gatewayBin),
|
|
122
|
+
name: "gateway",
|
|
123
|
+
env: {
|
|
124
|
+
...process.env,
|
|
125
|
+
PATH: path,
|
|
126
|
+
LISTEN: prepared.gatewayListen,
|
|
127
|
+
DATABRICKS_CONFIG_PROFILE: prepared.profile,
|
|
128
|
+
DBX_TOOLS_MODEL_GATEWAY_BEARER_TOKEN: prepared.bearerToken,
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
command: shellExecutable(runnerBin),
|
|
133
|
+
name: "genie",
|
|
134
|
+
env: {
|
|
135
|
+
...process.env,
|
|
136
|
+
PATH: path,
|
|
137
|
+
DATABRICKS_CONFIG_PROFILE: prepared.profile,
|
|
138
|
+
[RUNNER_OPTIONS_ENV]: JSON.stringify(runnerOptions),
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
], {
|
|
142
|
+
cwd: input.cwd ?? process.cwd(),
|
|
143
|
+
raw: true,
|
|
144
|
+
killOthersOn: ["failure", "success"],
|
|
145
|
+
killSignal: "SIGTERM",
|
|
146
|
+
killTimeout: 17_000,
|
|
147
|
+
successCondition: "command-genie",
|
|
148
|
+
});
|
|
149
|
+
logger.info("started Genie Code and model gateway", {
|
|
150
|
+
profile: prepared.profile,
|
|
151
|
+
model: prepared.model,
|
|
152
|
+
gateway: prepared.gatewayBaseUrl,
|
|
153
|
+
home: prepared.home.home,
|
|
154
|
+
});
|
|
155
|
+
try {
|
|
156
|
+
await result;
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
await rm(prepared.home.overlayPath, { force: true });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nZW5pZS1jb2RlL3J1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRixPQUFPLEtBQUssSUFBSSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRTdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLHVCQUF1QixHQUd4QixNQUFNLHNDQUFzQyxDQUFDO0FBQzlDLE9BQU8sWUFBWSxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLE9BQU8sTUFBTSxVQUFVLENBQUM7QUFFL0IsT0FBTyxFQUFFLG9CQUFvQixFQUFzQixNQUFNLGFBQWEsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFjeEMsTUFBTSxvQkFBb0IsR0FBaUM7SUFDekQsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0I7SUFDOUMsT0FBTyxFQUFFLGdCQUFnQjtJQUN6QixJQUFJLEVBQUUsQ0FBQyxF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ekIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1FBQ3JCLE9BQU8sRUFBRSxRQUFRLENBQUMsY0FBYztRQUNoQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJO0tBQ3pCLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxDQUFDO0lBQ2YsQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdXBlcnZpc2UgR2VuaWUgQ29kZSBhbmQgaXRzIGF1dGhlbnRpY2F0ZWQgbG9jYWwgbW9kZWwgZ2F0ZXdheS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHJtIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGRlbGltaXRlciwgZGlybmFtZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5LCBtb2RlbHMgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbW9kZWwtZ2F0ZXdheVwiO1xuaW1wb3J0ICogYXMgYXV0aCBmcm9tIFwiQGRieC10b29scy9hdXRoXCI7XG5pbXBvcnQgeyByZXNvbHZlU2VydmljZVBhY2thZ2VCaW4gfSBmcm9tIFwiQGRieC10b29scy9jbGktc2VydmljZS9kZWZpbml0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEJpbkNvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9jb3JlL2JpblwiO1xuaW1wb3J0IHsgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIHJlc29sdmVHZW5pZUNvZGVPcHRpb25zLFxuICB0eXBlIEdlbmllQ29kZU9wdGlvbnMsXG4gIHR5cGUgR2VuaWVDb2RlUnVubmVyT3B0aW9ucyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWdlbmllLWNvZGUvb3B0aW9uc1wiO1xuaW1wb3J0IGNvbmN1cnJlbnRseSBmcm9tIFwiY29uY3VycmVudGx5XCI7XG5pbXBvcnQgZ2V0UG9ydCBmcm9tIFwiZ2V0LXBvcnRcIjtcblxuaW1wb3J0IHsgd3JpdGVHZW5pZUNvZGVDb25maWcsIHR5cGUgR2VuaWVDb2RlSG9tZSB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgaW5zdGFsbEdlbmllQ29kZSB9IGZyb20gXCIuL2luc3RhbGwudHNcIjtcbmltcG9ydCB7IFJVTk5FUl9PUFRJT05TX0VOViB9IGZyb20gXCIuL3J1bm5lci50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiZ2VuaWUtY29kZVwiKTtcblxuLyoqIEluamVjdGFibGUgb3duZXJzIHVzZWQgdG8gcHJlcGFyZSBhbmQgc3VwZXJ2aXNlIG1hbmFnZWQgR2VuaWUgQ29kZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuaWVDb2RlUnVudGltZURlcGVuZGVuY2llcyB7XG4gIGNyZWF0ZUF1dGhDbGllbnQ6IHR5cGVvZiBhdXRoLmNsaWVudC5jcmVhdGVBdXRoQ2xpZW50O1xuICBpbnN0YWxsOiB0eXBlb2YgaW5zdGFsbEdlbmllQ29kZTtcbiAgcG9ydChvcHRpb25zOiB7IGhvc3Q6IHN0cmluZzsgcG9ydD86IG51bWJlciB9KTogUHJvbWlzZTxudW1iZXI+O1xuICByZXNvbHZlQmluKHBhY2thZ2VSZWZlcmVuY2U6IHN0cmluZywgYmluTmFtZTogc3RyaW5nKTogc3RyaW5nO1xuICByZXNvbHZlQ29kZXhNb2RlbChtb2RlbDogc3RyaW5nLCBwcm9maWxlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gIHN1cGVydmlzZTogdHlwZW9mIGNvbmN1cnJlbnRseTtcbiAgdG9rZW4oKTogc3RyaW5nO1xuICB3cml0ZUNvbmZpZzogdHlwZW9mIHdyaXRlR2VuaWVDb2RlQ29uZmlnO1xufVxuXG5jb25zdCBERUZBVUxUX0RFUEVOREVOQ0lFUzogR2VuaWVDb2RlUnVudGltZURlcGVuZGVuY2llcyA9IHtcbiAgY3JlYXRlQXV0aENsaWVudDogYXV0aC5jbGllbnQuY3JlYXRlQXV0aENsaWVudCxcbiAgaW5zdGFsbDogaW5zdGFsbEdlbmllQ29kZSxcbiAgcG9ydDogKHsgaG9zdCwgcG9ydCB9KSA9PiBnZXRQb3J0KHsgaG9zdCwgLi4uKHBvcnQgPyB7IHBvcnQgfSA6IHt9KSB9KSxcbiAgcmVzb2x2ZUJpbjogcmVzb2x2ZVNlcnZpY2VQYWNrYWdlQmluLFxuICByZXNvbHZlQ29kZXhNb2RlbCxcbiAgc3VwZXJ2aXNlOiBjb25jdXJyZW50bHksXG4gIHRva2VuOiAoKSA9PiByYW5kb21CeXRlcygzMikudG9TdHJpbmcoXCJiYXNlNjR1cmxcIiksXG4gIHdyaXRlQ29uZmlnOiB3cml0ZUdlbmllQ29kZUNvbmZpZyxcbn07XG5cbi8qKiBSZXNvbHZlIGEgR2VuaWUgYC0tbW9kZWxgIHZhbHVlIHRvIHRoZSBDb2RleCBjYXRhbG9ndWUgc2x1ZyB0aGUgZ2F0ZXdheSBwdWJsaXNoZXMuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ29kZXhNb2RlbChtb2RlbDogc3RyaW5nLCBwcm9maWxlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCB3b3Jrc3BhY2VDbGllbnQuY3JlYXRlV29ya3NwYWNlQ2xpZW50KHsgcHJvZmlsZSB9KTtcbiAgY29uc3QgdGFyZ2V0ID0gYXdhaXQgbmV3IERhdGFicmlja3NNb2RlbFJlZ2lzdHJ5KHsgY2xpZW50IH0pLnJlc29sdmUobW9kZWwsIHtcbiAgICByZXF1aXJlc1Rvb2xzOiB0cnVlLFxuICB9KTtcbiAgaWYgKCF0YXJnZXQpIHRocm93IG5ldyBFcnJvcihgR2VuaWUgQ29kZSBtb2RlbCBub3QgZm91bmQ6ICR7bW9kZWx9YCk7XG4gIHJldHVybiBtb2RlbHMuY29kZXhNb2RlbFNsdWcodGFyZ2V0KTtcbn1cblxuLyoqIElucHV0cyBhY2NlcHRlZCBieSBtYW5hZ2VkIEdlbmllIENvZGUgcHJlcGFyYXRpb24gYW5kIGV4ZWN1dGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuR2VuaWVDb2RlT3B0aW9ucyB7XG4gIGN3ZD86IHN0cmluZztcbiAgZGVwZW5kZW5jaWVzPzogUGFydGlhbDxHZW5pZUNvZGVSdW50aW1lRGVwZW5kZW5jaWVzPjtcbiAgZ2VuaWVBcmdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIG9wdGlvbnM/OiBHZW5pZUNvZGVPcHRpb25zO1xufVxuXG4vKiogUmVzb2x2ZWQgaW5zdGFsbGF0aW9uLCBhdXRoLCBsaXN0ZW5lciwgYW5kIGhvbWUgZm9yIG9uZSBpbnZvY2F0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlZEdlbmllQ29kZVJ1bnRpbWUge1xuICBiZWFyZXJUb2tlbjogc3RyaW5nO1xuICBnYXRld2F5QmFzZVVybDogc3RyaW5nO1xuICBnYXRld2F5SGVhbHRoVXJsOiBzdHJpbmc7XG4gIGdhdGV3YXlMaXN0ZW46IHN0cmluZztcbiAgZ2F0ZXdheVBvcnQ6IG51bWJlcjtcbiAgaG9tZTogR2VuaWVDb2RlSG9tZTtcbiAgaW5zdGFsbGF0aW9uOiBCaW5Db250ZXh0O1xuICBtb2RlbDogc3RyaW5nO1xuICBwcm9maWxlOiBzdHJpbmc7XG59XG5cbi8qKiBSZXNvbHZlIGF1dGgsIGluc3RhbGxhdGlvbiwgbGlzdGVuZXIsIGFuZCBjb25maWd1cmF0aW9uIGJlZm9yZSBzcGF3bmluZyBjaGlsZHJlbi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlR2VuaWVDb2RlUnVudGltZShcbiAgaW5wdXQ6IFJ1bkdlbmllQ29kZU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8UHJlcGFyZWRHZW5pZUNvZGVSdW50aW1lPiB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHsgLi4uREVGQVVMVF9ERVBFTkRFTkNJRVMsIC4uLmlucHV0LmRlcGVuZGVuY2llcyB9O1xuICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZUdlbmllQ29kZU9wdGlvbnMoaW5wdXQub3B0aW9ucyk7XG4gIGxvZ2dlci5pbmZvKFwicmVzb2x2aW5nIERhdGFicmlja3MgYXV0aGVudGljYXRpb25cIiwge1xuICAgIHJlcXVlc3RlZFByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSxcbiAgfSk7XG4gIGNvbnN0IGF1dGhDbGllbnQgPSBhd2FpdCBkZXBlbmRlbmNpZXMuY3JlYXRlQXV0aENsaWVudChcbiAgICBvcHRpb25zLnByb2ZpbGUgPyB7IHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSB9IDoge30sXG4gICk7XG4gIGNvbnN0IHByb2ZpbGUgPSBhdXRoQ2xpZW50LnByb2ZpbGU7XG4gIGlmICghcHJvZmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmllIENvZGUgcmVxdWlyZXMgYSBjb25maWd1cmVkIERhdGFicmlja3MgcHJvZmlsZVwiKTtcbiAgfVxuICBsb2dnZXIuaW5mbyhcInByZXBhcmluZyBHZW5pZSBDb2RlIHJ1bnRpbWVcIiwge1xuICAgIHByb2ZpbGUsXG4gICAgbW9kZWw6IG9wdGlvbnMubW9kZWwsXG4gIH0pO1xuICBjb25zdCBpbnN0YWxsYXRpb24gPSBhd2FpdCBkZXBlbmRlbmNpZXMuaW5zdGFsbCgpO1xuICBjb25zdCBob3N0ID0gb3B0aW9ucy5nYXRld2F5TGlzdGVuLmhvc3Q7XG4gIGNvbnN0IHJlcXVlc3RlZFBvcnQgPSBvcHRpb25zLmdhdGV3YXlMaXN0ZW4ucG9ydDtcbiAgY29uc3QgZ2F0ZXdheVBvcnQgPSBhd2FpdCBkZXBlbmRlbmNpZXMucG9ydCh7XG4gICAgaG9zdCxcbiAgICAuLi4ocmVxdWVzdGVkUG9ydCA+IDAgPyB7IHBvcnQ6IHJlcXVlc3RlZFBvcnQgfSA6IHt9KSxcbiAgfSk7XG4gIGlmIChyZXF1ZXN0ZWRQb3J0ID4gMCAmJiBnYXRld2F5UG9ydCAhPT0gcmVxdWVzdGVkUG9ydCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgR2VuaWUgQ29kZSBnYXRld2F5IHBvcnQgJHtyZXF1ZXN0ZWRQb3J0fSBpcyBhbHJlYWR5IGluIHVzZWApO1xuICB9XG4gIGNvbnN0IG1vZGVsID0gYXdhaXQgZGVwZW5kZW5jaWVzLnJlc29sdmVDb2RleE1vZGVsKG9wdGlvbnMubW9kZWwsIHByb2ZpbGUpO1xuICBsb2dnZXIuaW5mbyhcInJlc29sdmVkIEdlbmllIENvZGUgbW9kZWxcIiwgeyByZXF1ZXN0ZWQ6IG9wdGlvbnMubW9kZWwsIG1vZGVsIH0pO1xuICBjb25zdCB1cmxIb3N0ID0gaG9zdC5pbmNsdWRlcyhcIjpcIikgPyBgWyR7aG9zdH1dYCA6IGhvc3Q7XG4gIGNvbnN0IGdhdGV3YXlCYXNlVXJsID0gYGh0dHA6Ly8ke3VybEhvc3R9OiR7Z2F0ZXdheVBvcnR9L3YxYDtcbiAgY29uc3QgZ2F0ZXdheUhlYWx0aFVybCA9IGBodHRwOi8vJHt1cmxIb3N0fToke2dhdGV3YXlQb3J0fS9hcGkvaGVhbHRoemA7XG4gIGNvbnN0IGdhdGV3YXlMaXN0ZW4gPSBgdGNwOi8vJHt1cmxIb3N0fToke2dhdGV3YXlQb3J0fWA7XG4gIGNvbnN0IGJlYXJlclRva2VuID0gZGVwZW5kZW5jaWVzLnRva2VuKCk7XG4gIGNvbnN0IGhvbWUgPSBhd2FpdCBkZXBlbmRlbmNpZXMud3JpdGVDb25maWcoe1xuICAgIGJlYXJlclRva2VuLFxuICAgIGdhdGV3YXlCYXNlVXJsLFxuICAgIG1vZGVsLFxuICAgIHByb2ZpbGUsXG4gICAgcHJvamVjdERpcmVjdG9yeTogaW5wdXQuY3dkID8/IHByb2Nlc3MuY3dkKCksXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGJlYXJlclRva2VuLFxuICAgIGdhdGV3YXlCYXNlVXJsLFxuICAgIGdhdGV3YXlIZWFsdGhVcmwsXG4gICAgZ2F0ZXdheUxpc3RlbixcbiAgICBnYXRld2F5UG9ydCxcbiAgICBob21lLFxuICAgIGluc3RhbGxhdGlvbixcbiAgICBtb2RlbCxcbiAgICBwcm9maWxlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzaGVsbEV4ZWN1dGFibGUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikgcmV0dXJuIGBcIiR7cGF0aC5yZXBsYWNlQWxsKCdcIicsICdcIlwiJyl9XCJgO1xuICByZXR1cm4gYCcke3BhdGgucmVwbGFjZUFsbChcIidcIiwgXCInXFxcXCcnXCIpfSdgO1xufVxuXG5mdW5jdGlvbiBjaGlsZFBhdGgoLi4ucGF0aHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5wYXRocy5tYXAoZGlybmFtZSksIHByb2Nlc3MuZW52LlBBVEhdLmZpbHRlcihCb29sZWFuKSldLmpvaW4oZGVsaW1pdGVyKTtcbn1cblxuLyoqIFJ1biBHZW5pZSBDb2RlIGFuZCB0aGUgbW9kZWwgZ2F0ZXdheSB1bnRpbCBlaXRoZXIgcHJvY2VzcyBleGl0cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5HZW5pZUNvZGUoaW5wdXQ6IFJ1bkdlbmllQ29kZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7IC4uLkRFRkFVTFRfREVQRU5ERU5DSUVTLCAuLi5pbnB1dC5kZXBlbmRlbmNpZXMgfTtcbiAgY29uc3QgcHJlcGFyZWQgPSBhd2FpdCBwcmVwYXJlR2VuaWVDb2RlUnVudGltZSh7XG4gICAgLi4uaW5wdXQsXG4gICAgZGVwZW5kZW5jaWVzLFxuICB9KTtcbiAgY29uc3QgZ2F0ZXdheUJpbiA9IGRlcGVuZGVuY2llcy5yZXNvbHZlQmluKGltcG9ydC5tZXRhLnVybCwgXCJkYngtbW9kZWwtZ2F0ZXdheVwiKTtcbiAgY29uc3QgcnVubmVyQmluID0gZGVwZW5kZW5jaWVzLnJlc29sdmVCaW4oaW1wb3J0Lm1ldGEudXJsLCBcImRieC1nZW5pZVwiKTtcbiAgY29uc3QgcGF0aCA9IGNoaWxkUGF0aChnYXRld2F5QmluLCBydW5uZXJCaW4pO1xuICBjb25zdCBydW5uZXJPcHRpb25zOiBHZW5pZUNvZGVSdW5uZXJPcHRpb25zID0ge1xuICAgIGV4ZWN1dGFibGU6IHByZXBhcmVkLmluc3RhbGxhdGlvbi5wYXRoLFxuICAgIGFyZ3VtZW50czogW1wiLXBcIiwgcHJlcGFyZWQuaG9tZS5vdmVybGF5TmFtZSwgLi4uKGlucHV0LmdlbmllQXJncyA/PyBbXSldLFxuICAgIGhvbWU6IHByZXBhcmVkLmhvbWUuaG9tZSxcbiAgICBnYXRld2F5SGVhbHRoVXJsOiBwcmVwYXJlZC5nYXRld2F5SGVhbHRoVXJsLFxuICAgIGJlYXJlclRva2VuOiBwcmVwYXJlZC5iZWFyZXJUb2tlbixcbiAgICBzdGFydHVwVGltZW91dE1zOiA2MF8wMDAsXG4gIH07XG4gIGNvbnN0IHsgcmVzdWx0IH0gPSBkZXBlbmRlbmNpZXMuc3VwZXJ2aXNlKFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAgY29tbWFuZDogc2hlbGxFeGVjdXRhYmxlKGdhdGV3YXlCaW4pLFxuICAgICAgICBuYW1lOiBcImdhdGV3YXlcIixcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgUEFUSDogcGF0aCxcbiAgICAgICAgICBMSVNURU46IHByZXBhcmVkLmdhdGV3YXlMaXN0ZW4sXG4gICAgICAgICAgREFUQUJSSUNLU19DT05GSUdfUFJPRklMRTogcHJlcGFyZWQucHJvZmlsZSxcbiAgICAgICAgICBEQlhfVE9PTFNfTU9ERUxfR0FURVdBWV9CRUFSRVJfVE9LRU46IHByZXBhcmVkLmJlYXJlclRva2VuLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29tbWFuZDogc2hlbGxFeGVjdXRhYmxlKHJ1bm5lckJpbiksXG4gICAgICAgIG5hbWU6IFwiZ2VuaWVcIixcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgUEFUSDogcGF0aCxcbiAgICAgICAgICBEQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFOiBwcmVwYXJlZC5wcm9maWxlLFxuICAgICAgICAgIFtSVU5ORVJfT1BUSU9OU19FTlZdOiBKU09OLnN0cmluZ2lmeShydW5uZXJPcHRpb25zKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICB7XG4gICAgICBjd2Q6IGlucHV0LmN3ZCA/PyBwcm9jZXNzLmN3ZCgpLFxuICAgICAgcmF3OiB0cnVlLFxuICAgICAga2lsbE90aGVyc09uOiBbXCJmYWlsdXJlXCIsIFwic3VjY2Vzc1wiXSxcbiAgICAgIGtpbGxTaWduYWw6IFwiU0lHVEVSTVwiLFxuICAgICAga2lsbFRpbWVvdXQ6IDE3XzAwMCxcbiAgICAgIHN1Y2Nlc3NDb25kaXRpb246IFwiY29tbWFuZC1nZW5pZVwiLFxuICAgIH0sXG4gICk7XG4gIGxvZ2dlci5pbmZvKFwic3RhcnRlZCBHZW5pZSBDb2RlIGFuZCBtb2RlbCBnYXRld2F5XCIsIHtcbiAgICBwcm9maWxlOiBwcmVwYXJlZC5wcm9maWxlLFxuICAgIG1vZGVsOiBwcmVwYXJlZC5tb2RlbCxcbiAgICBnYXRld2F5OiBwcmVwYXJlZC5nYXRld2F5QmFzZVVybCxcbiAgICBob21lOiBwcmVwYXJlZC5ob21lLmhvbWUsXG4gIH0pO1xuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdDtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBybShwcmVwYXJlZC5ob21lLm92ZXJsYXlQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG4iXX0=
|