@dbx-tools/cli 0.9.60 → 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 +64 -17
- package/bin/dbx-genie.ts +13 -0
- package/index.ts +13 -1
- package/lib/bin/dbx-genie.d.ts +2 -0
- package/lib/bin/dbx-genie.js +10 -0
- package/lib/index.d.ts +13 -1
- package/lib/index.js +10 -2
- package/lib/src/auth/cli.js +13 -2
- package/lib/src/auth/options.d.ts +4 -0
- package/lib/src/auth/options.js +5 -1
- package/lib/src/cli.js +8 -4
- 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/model-gateway/cli.js +3 -3
- package/lib/src/model-gateway/server.d.ts +3 -0
- package/lib/src/model-gateway/server.js +36 -6
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +40 -18
- package/src/auth/cli.ts +11 -1
- package/src/auth/options.ts +4 -0
- package/src/cli.ts +13 -2
- 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/model-gateway/cli.ts +6 -2
- package/src/model-gateway/server.ts +37 -5
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate one persistent Genie Code home per exact profile-model pairing.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { type GenieCodeBaseConfig, type GenieCodeConfig, type GenieCodeProviderOverlay } from "@dbx-tools/shared-genie-code/config";
|
|
7
|
+
/** Provider identifier written to the base and invocation overlay configurations. */
|
|
8
|
+
export declare const GENIE_CODE_GATEWAY_PROVIDER = "dbx_tools_model_gateway";
|
|
9
|
+
/** Inputs used to update a persistent home and create one invocation overlay. */
|
|
10
|
+
export interface WriteGenieCodeConfigOptions {
|
|
11
|
+
bearerToken: string;
|
|
12
|
+
gatewayBaseUrl: string;
|
|
13
|
+
homeDirectory?: string;
|
|
14
|
+
model: string;
|
|
15
|
+
profile: string;
|
|
16
|
+
projectDirectory: string;
|
|
17
|
+
}
|
|
18
|
+
/** Stable persistent home for one exact profile-model pairing. */
|
|
19
|
+
export interface GenieCodePairingHome {
|
|
20
|
+
configPath: string;
|
|
21
|
+
home: string;
|
|
22
|
+
name: string;
|
|
23
|
+
}
|
|
24
|
+
/** Persistent pairing home and invocation-specific provider overlay. */
|
|
25
|
+
export interface GenieCodeHome extends GenieCodePairingHome {
|
|
26
|
+
overlayName: string;
|
|
27
|
+
overlayPath: string;
|
|
28
|
+
}
|
|
29
|
+
/** Derive the stable home for one exact profile-model pair. */
|
|
30
|
+
export declare function genieCodeHome(profile: string, model: string, homeDirectory?: string): GenieCodePairingHome;
|
|
31
|
+
/** Render the persistent profile-model configuration. */
|
|
32
|
+
export declare function genieCodeBaseConfig(options: WriteGenieCodeConfigOptions, existingProjects?: Readonly<Record<string, unknown>>): GenieCodeBaseConfig;
|
|
33
|
+
/** Render the invocation-specific guarded provider configuration. */
|
|
34
|
+
export declare function genieCodeProviderOverlay(options: WriteGenieCodeConfigOptions): GenieCodeProviderOverlay;
|
|
35
|
+
/** Render the merged configuration used by validation and tests. */
|
|
36
|
+
export declare function genieCodeConfig(options: WriteGenieCodeConfigOptions): GenieCodeConfig;
|
|
37
|
+
/** Update the persistent base config and write one private invocation overlay. */
|
|
38
|
+
export declare function writeGenieCodeConfig(options: WriteGenieCodeConfigOptions): Promise<GenieCodeHome>;
|
|
@@ -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>;
|