zerogpu-cli 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/classifyIabEnriched.d.ts +3 -0
- package/dist/commands/classifyIabEnriched.d.ts.map +1 -0
- package/dist/commands/classifyIabEnriched.js +58 -0
- package/dist/commands/classifyIabEnriched.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +65 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +29 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/lib/auth.d.ts +21 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +46 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +27 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/prompt.d.ts +3 -0
- package/dist/lib/prompt.d.ts.map +1 -0
- package/dist/lib/prompt.js +52 -0
- package/dist/lib/prompt.js.map +1 -0
- package/dist/lib/shellEnv.d.ts +7 -0
- package/dist/lib/shellEnv.d.ts.map +1 -0
- package/dist/lib/shellEnv.js +80 -0
- package/dist/lib/shellEnv.js.map +1 -0
- package/package.json +2 -2
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,YAAY,IAAI,OAAO,CAatC;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAExC"}
|
package/dist/cli.js
CHANGED
|
@@ -2,6 +2,9 @@ import { readFileSync } from "node:fs";
|
|
|
2
2
|
import { dirname, resolve } from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { Command } from "commander";
|
|
5
|
+
import { registerClassifyIabEnrichedCommand } from "./commands/classifyIabEnriched.js";
|
|
6
|
+
import { registerLoginCommand } from "./commands/login.js";
|
|
7
|
+
import { registerStatusCommand } from "./commands/status.js";
|
|
5
8
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
9
|
const pkg = JSON.parse(readFileSync(resolve(__dirname, "..", "package.json"), "utf8"));
|
|
7
10
|
export function buildProgram() {
|
|
@@ -10,6 +13,9 @@ export function buildProgram() {
|
|
|
10
13
|
.name("zerogpu")
|
|
11
14
|
.description("Command-line interface for ZeroGPU.")
|
|
12
15
|
.version(pkg.version, "-v, --version", "Output the current version.");
|
|
16
|
+
registerLoginCommand(program);
|
|
17
|
+
registerStatusCommand(program);
|
|
18
|
+
registerClassifyIabEnrichedCommand(program);
|
|
13
19
|
return program;
|
|
14
20
|
}
|
|
15
21
|
export function run(argv) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kCAAkC,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACxC,CAAC;AAEzB,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,qCAAqC,CAAC;SAClD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,6BAA6B,CAAC,CAAC;IAExE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,kCAAkC,CAAC,OAAO,CAAC,CAAC;IAE5C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAc;IAChC,YAAY,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifyIabEnriched.d.ts","sourceRoot":"","sources":["../../src/commands/classifyIabEnriched.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6DzE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getApiKey, getProjectId } from "../lib/auth.js";
|
|
2
|
+
const ENDPOINT = "https://api.zerogpu.ai/v1/responses";
|
|
3
|
+
const MODEL = "zlm-v1-iab-classify-edge-enriched";
|
|
4
|
+
export function registerClassifyIabEnrichedCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("classify_iab_enriched <text>")
|
|
7
|
+
.description("Classify text with the IAB enriched edge model (audience, topics, keywords, intent).")
|
|
8
|
+
.action(async (text) => {
|
|
9
|
+
const apiKey = getApiKey();
|
|
10
|
+
const projectId = getProjectId();
|
|
11
|
+
if (!apiKey || !projectId) {
|
|
12
|
+
console.error("You're not fully signed in yet. Run 'zerogpu login' to set your API key and project ID.");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
let response;
|
|
16
|
+
try {
|
|
17
|
+
response = await fetch(ENDPOINT, {
|
|
18
|
+
method: "POST",
|
|
19
|
+
headers: {
|
|
20
|
+
"content-type": "application/json",
|
|
21
|
+
"x-api-key": apiKey.apiKey,
|
|
22
|
+
"x-project-id": projectId.projectId,
|
|
23
|
+
},
|
|
24
|
+
body: JSON.stringify({
|
|
25
|
+
model: MODEL,
|
|
26
|
+
input: text,
|
|
27
|
+
}),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
32
|
+
console.error(`Request failed: ${message}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
const body = await response.text();
|
|
37
|
+
console.error(`Request failed with status ${response.status}.`);
|
|
38
|
+
if (body)
|
|
39
|
+
console.error(body);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const data = (await response.json());
|
|
43
|
+
const content = data.output?.[0]?.content?.find((c) => c.type === "output_text")?.text ?? data.output?.[0]?.content?.[0]?.text;
|
|
44
|
+
if (!content) {
|
|
45
|
+
console.error("Response did not contain any classification content.");
|
|
46
|
+
console.error(JSON.stringify(data, null, 2));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const parsed = JSON.parse(content);
|
|
51
|
+
console.log(JSON.stringify(parsed, null, 2));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
console.log(content);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=classifyIabEnriched.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifyIabEnriched.js","sourceRoot":"","sources":["../../src/commands/classifyIabEnriched.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,QAAQ,GAAG,qCAAqC,CAAC;AACvD,MAAM,KAAK,GAAG,mCAAmC,CAAC;AAWlD,MAAM,UAAU,kCAAkC,CAAC,OAAgB;IACjE,OAAO;SACJ,OAAO,CAAC,8BAA8B,CAAC;SACvC,WAAW,CACV,sFAAsF,CACvF;SACA,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QAEjC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CACX,yFAAyF,CAC1F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBAC/B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,WAAW,EAAE,MAAM,CAAC,MAAM;oBAC1B,cAAc,EAAE,SAAS,CAAC,SAAS;iBACpC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,IAAI;iBACZ,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,8BAA8B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAChE,IAAI,IAAI;gBAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAChC,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;YACtE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6E3D"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { validateApiKey, validateProjectId } from "../lib/auth.js";
|
|
2
|
+
import { writeConfig, readConfig } from "../lib/config.js";
|
|
3
|
+
import { promptMasked, promptPlain } from "../lib/prompt.js";
|
|
4
|
+
import { upsertEnvExport } from "../lib/shellEnv.js";
|
|
5
|
+
export function registerLoginCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command("login")
|
|
8
|
+
.description("Sign in to ZeroGPU with your API key.")
|
|
9
|
+
.option("--api-key <key>", "Provide your API key directly (skips the prompt).")
|
|
10
|
+
.option("--project-id <id>", "Provide your ZeroGPU project ID directly (skips the prompt).")
|
|
11
|
+
.action(async (options) => {
|
|
12
|
+
let rawKey = options.apiKey;
|
|
13
|
+
if (!rawKey) {
|
|
14
|
+
try {
|
|
15
|
+
rawKey = await promptMasked("Please paste your ZeroGPU API key: ");
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
console.error("Login cancelled. No changes were made.");
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const result = validateApiKey(rawKey ?? "");
|
|
23
|
+
if (!result.ok) {
|
|
24
|
+
console.error(`That doesn't look like a valid API key — ${result.reason}`);
|
|
25
|
+
console.error("Your key should start with \"zgpu-api-\". Please try again.");
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
let rawProjectId = options.projectId;
|
|
29
|
+
if (!rawProjectId) {
|
|
30
|
+
try {
|
|
31
|
+
rawProjectId = await promptPlain("Please enter your ZeroGPU project ID: ");
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
console.error("Login cancelled. No changes were made.");
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const projectResult = validateProjectId(rawProjectId ?? "");
|
|
39
|
+
if (!projectResult.ok) {
|
|
40
|
+
console.error(`That doesn't look like a valid project ID — ${projectResult.reason}`);
|
|
41
|
+
console.error("It should be a UUID like 4ed3e5bb-c2ed-4d4a-8a66-2b161a27fd1a. Please try again.");
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const existing = readConfig();
|
|
45
|
+
writeConfig({
|
|
46
|
+
...existing,
|
|
47
|
+
apiKey: result.key,
|
|
48
|
+
projectId: projectResult.key,
|
|
49
|
+
});
|
|
50
|
+
const env = upsertEnvExport("ZEROGPU_API_KEY", result.key);
|
|
51
|
+
process.env["ZEROGPU_API_KEY"] = result.key;
|
|
52
|
+
console.log("You're logged in. Your API key has been saved.");
|
|
53
|
+
if (env.shell === "windows") {
|
|
54
|
+
console.log(env.note ??
|
|
55
|
+
"We also tried to save it as an environment variable for other tools.");
|
|
56
|
+
console.log("Tip: open a new terminal window so other programs can see ZEROGPU_API_KEY.");
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log(`We also added ZEROGPU_API_KEY to your shell config (${env.path}) so other tools can use it.`);
|
|
60
|
+
console.log(`To use it right away in this terminal, run: source ${env.path}`);
|
|
61
|
+
console.log("Or just open a new terminal window — it'll be there automatically.");
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmB5D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { API_KEY_PREFIX, getApiKey } from "../lib/auth.js";
|
|
2
|
+
function maskKey(key) {
|
|
3
|
+
const body = key.startsWith(API_KEY_PREFIX)
|
|
4
|
+
? key.slice(API_KEY_PREFIX.length)
|
|
5
|
+
: key;
|
|
6
|
+
const last4 = body.slice(-4);
|
|
7
|
+
return `${API_KEY_PREFIX}****${last4}`;
|
|
8
|
+
}
|
|
9
|
+
export function registerStatusCommand(program) {
|
|
10
|
+
program
|
|
11
|
+
.command("status")
|
|
12
|
+
.description("Check whether you're signed in to ZeroGPU.")
|
|
13
|
+
.action(() => {
|
|
14
|
+
const resolved = getApiKey();
|
|
15
|
+
if (resolved) {
|
|
16
|
+
const where = resolved.source === "config file"
|
|
17
|
+
? "saved on this computer"
|
|
18
|
+
: "from your ZEROGPU_API_KEY environment variable";
|
|
19
|
+
console.log("You're signed in to ZeroGPU.");
|
|
20
|
+
console.log(` API key: ${maskKey(resolved.apiKey)} (${where})`);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
console.log("You're not signed in yet.");
|
|
24
|
+
console.log("Run 'zerogpu login' to get started.");
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3D,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;QACzC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;QAClC,CAAC,CAAC,GAAG,CAAC;IACR,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,GAAG,cAAc,OAAO,KAAK,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,KAAK,GACT,QAAQ,CAAC,MAAM,KAAK,aAAa;gBAC/B,CAAC,CAAC,wBAAwB;gBAC1B,CAAC,CAAC,gDAAgD,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const API_KEY_PREFIX = "zgpu-api-";
|
|
2
|
+
export type ValidationResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
key: string;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
reason: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function validateApiKey(input: string): ValidationResult;
|
|
10
|
+
export interface ResolvedKey {
|
|
11
|
+
apiKey: string;
|
|
12
|
+
source: "config file" | "env var";
|
|
13
|
+
}
|
|
14
|
+
export declare function getApiKey(): ResolvedKey | undefined;
|
|
15
|
+
export declare function validateProjectId(input: string): ValidationResult;
|
|
16
|
+
export interface ResolvedProjectId {
|
|
17
|
+
projectId: string;
|
|
18
|
+
source: "config file" | "env var";
|
|
19
|
+
}
|
|
20
|
+
export declare function getProjectId(): ResolvedProjectId | undefined;
|
|
21
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAa9D;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;CACnC;AAED,wBAAgB,SAAS,IAAI,WAAW,GAAG,SAAS,CAMnD;AAKD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAOjE;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;CACnC;AAED,wBAAgB,YAAY,IAAI,iBAAiB,GAAG,SAAS,CAM5D"}
|
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { readConfig } from "./config.js";
|
|
2
|
+
export const API_KEY_PREFIX = "zgpu-api-";
|
|
3
|
+
export function validateApiKey(input) {
|
|
4
|
+
const key = (input ?? "").trim();
|
|
5
|
+
if (!key)
|
|
6
|
+
return { ok: false, reason: "API key is empty." };
|
|
7
|
+
if (!key.startsWith(API_KEY_PREFIX)) {
|
|
8
|
+
return {
|
|
9
|
+
ok: false,
|
|
10
|
+
reason: `API key must start with "${API_KEY_PREFIX}".`,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
if (key.length <= API_KEY_PREFIX.length) {
|
|
14
|
+
return { ok: false, reason: "API key is missing its body after the prefix." };
|
|
15
|
+
}
|
|
16
|
+
return { ok: true, key };
|
|
17
|
+
}
|
|
18
|
+
export function getApiKey() {
|
|
19
|
+
const fromConfig = readConfig().apiKey;
|
|
20
|
+
if (fromConfig)
|
|
21
|
+
return { apiKey: fromConfig, source: "config file" };
|
|
22
|
+
const fromEnv = process.env["ZEROGPU_API_KEY"];
|
|
23
|
+
if (fromEnv)
|
|
24
|
+
return { apiKey: fromEnv, source: "env var" };
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
28
|
+
export function validateProjectId(input) {
|
|
29
|
+
const id = (input ?? "").trim();
|
|
30
|
+
if (!id)
|
|
31
|
+
return { ok: false, reason: "Project ID is empty." };
|
|
32
|
+
if (!UUID_RE.test(id)) {
|
|
33
|
+
return { ok: false, reason: "Project ID must be a UUID." };
|
|
34
|
+
}
|
|
35
|
+
return { ok: true, key: id };
|
|
36
|
+
}
|
|
37
|
+
export function getProjectId() {
|
|
38
|
+
const fromConfig = readConfig().projectId;
|
|
39
|
+
if (fromConfig)
|
|
40
|
+
return { projectId: fromConfig, source: "config file" };
|
|
41
|
+
const fromEnv = process.env["ZEROGPU_PROJECT_ID"];
|
|
42
|
+
if (fromEnv)
|
|
43
|
+
return { projectId: fromEnv, source: "env var" };
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;AAM1C,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC5D,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,4BAA4B,cAAc,IAAI;SACvD,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;QACxC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,+CAA+C,EAAE,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAC3B,CAAC;AAOD,MAAM,UAAU,SAAS;IACvB,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC,MAAM,CAAC;IACvC,IAAI,UAAU;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/C,IAAI,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC3D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,GACX,iEAAiE,CAAC;AAEpE,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAC9D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;AAC/B,CAAC;AAOD,MAAM,UAAU,YAAY;IAC1B,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC,SAAS,CAAC;IAC1C,IAAI,UAAU;QAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClD,IAAI,OAAO;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC9D,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface Config {
|
|
2
|
+
apiKey?: string;
|
|
3
|
+
projectId?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function configDir(): string;
|
|
6
|
+
export declare function configPath(): string;
|
|
7
|
+
export declare function readConfig(): Config;
|
|
8
|
+
export declare function writeConfig(cfg: Config): void;
|
|
9
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAUnC;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG7C"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
export function configDir() {
|
|
5
|
+
return join(homedir(), ".zerogpu");
|
|
6
|
+
}
|
|
7
|
+
export function configPath() {
|
|
8
|
+
return join(configDir(), "config.json");
|
|
9
|
+
}
|
|
10
|
+
export function readConfig() {
|
|
11
|
+
const path = configPath();
|
|
12
|
+
if (!existsSync(path))
|
|
13
|
+
return {};
|
|
14
|
+
try {
|
|
15
|
+
const raw = readFileSync(path, "utf8");
|
|
16
|
+
const parsed = JSON.parse(raw);
|
|
17
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function writeConfig(cfg) {
|
|
24
|
+
mkdirSync(configDir(), { recursive: true, mode: 0o700 });
|
|
25
|
+
writeFileSync(configPath(), JSON.stringify(cfg, null, 2), { mode: 0o600 });
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAW,CAAC;QACzC,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,aAAa,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC9D;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB7D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { createInterface } from "node:readline";
|
|
2
|
+
import { Writable } from "node:stream";
|
|
3
|
+
export function promptMasked(question) {
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
let muted = false;
|
|
6
|
+
const output = new Writable({
|
|
7
|
+
write(chunk, _encoding, callback) {
|
|
8
|
+
if (!muted) {
|
|
9
|
+
process.stdout.write(chunk);
|
|
10
|
+
}
|
|
11
|
+
callback();
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
const rl = createInterface({
|
|
15
|
+
input: process.stdin,
|
|
16
|
+
output,
|
|
17
|
+
terminal: true,
|
|
18
|
+
});
|
|
19
|
+
rl.question(question, (answer) => {
|
|
20
|
+
muted = false;
|
|
21
|
+
process.stdout.write("\n");
|
|
22
|
+
rl.close();
|
|
23
|
+
resolve(answer);
|
|
24
|
+
});
|
|
25
|
+
// Mute after the question prompt has been written.
|
|
26
|
+
muted = true;
|
|
27
|
+
rl.on("SIGINT", () => {
|
|
28
|
+
rl.close();
|
|
29
|
+
process.stdout.write("\n");
|
|
30
|
+
reject(new Error("Aborted."));
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export function promptPlain(question) {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
const rl = createInterface({
|
|
37
|
+
input: process.stdin,
|
|
38
|
+
output: process.stdout,
|
|
39
|
+
terminal: true,
|
|
40
|
+
});
|
|
41
|
+
rl.question(question, (answer) => {
|
|
42
|
+
rl.close();
|
|
43
|
+
resolve(answer);
|
|
44
|
+
});
|
|
45
|
+
rl.on("SIGINT", () => {
|
|
46
|
+
rl.close();
|
|
47
|
+
process.stdout.write("\n");
|
|
48
|
+
reject(new Error("Aborted."));
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC;YAC1B,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ;gBAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;gBACD,QAAQ,EAAE,CAAC;YACb,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAc,eAAe,CAAC;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM;YACN,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,KAAK,GAAG,KAAK,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,mDAAmD;QACnD,KAAK,GAAG,IAAI,CAAC;QAEb,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACnB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,EAAE,GAAc,eAAe,CAAC;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACnB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shellEnv.d.ts","sourceRoot":"","sources":["../../src/lib/shellEnv.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAmDD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAiCzE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, appendFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { basename, join } from "node:path";
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
const SENTINEL_START = "# >>> zerogpu cli >>>";
|
|
6
|
+
const SENTINEL_END = "# <<< zerogpu cli <<<";
|
|
7
|
+
function detectShell() {
|
|
8
|
+
const shell = basename(process.env["SHELL"] ?? "").toLowerCase();
|
|
9
|
+
if (shell === "zsh")
|
|
10
|
+
return "zsh";
|
|
11
|
+
if (shell === "bash")
|
|
12
|
+
return "bash";
|
|
13
|
+
if (shell === "fish")
|
|
14
|
+
return "fish";
|
|
15
|
+
return "posix";
|
|
16
|
+
}
|
|
17
|
+
function rcPathFor(shell) {
|
|
18
|
+
const home = homedir();
|
|
19
|
+
switch (shell) {
|
|
20
|
+
case "zsh":
|
|
21
|
+
return join(home, ".zshrc");
|
|
22
|
+
case "bash":
|
|
23
|
+
return join(home, process.platform === "darwin" ? ".bash_profile" : ".bashrc");
|
|
24
|
+
case "fish":
|
|
25
|
+
return join(home, ".config", "fish", "config.fish");
|
|
26
|
+
default:
|
|
27
|
+
return join(home, ".profile");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function buildBlock(shell, name, value) {
|
|
31
|
+
const safe = value.replace(/"/g, '\\"');
|
|
32
|
+
const line = shell === "fish"
|
|
33
|
+
? `set -x ${name} "${safe}"`
|
|
34
|
+
: `export ${name}="${safe}"`;
|
|
35
|
+
return `${SENTINEL_START}\n${line}\n${SENTINEL_END}\n`;
|
|
36
|
+
}
|
|
37
|
+
function stripExisting(content) {
|
|
38
|
+
const startIdx = content.indexOf(SENTINEL_START);
|
|
39
|
+
if (startIdx === -1)
|
|
40
|
+
return content;
|
|
41
|
+
const endIdx = content.indexOf(SENTINEL_END, startIdx);
|
|
42
|
+
if (endIdx === -1)
|
|
43
|
+
return content;
|
|
44
|
+
const after = content.slice(endIdx + SENTINEL_END.length);
|
|
45
|
+
const before = content.slice(0, startIdx).replace(/\s+$/, "");
|
|
46
|
+
const trimmedAfter = after.replace(/^\s*\n/, "");
|
|
47
|
+
return (before ? before + "\n" : "") + trimmedAfter;
|
|
48
|
+
}
|
|
49
|
+
export function upsertEnvExport(name, value) {
|
|
50
|
+
if (process.platform === "win32") {
|
|
51
|
+
const res = spawnSync("setx", [name, value], { stdio: "ignore" });
|
|
52
|
+
return {
|
|
53
|
+
path: "(Windows user environment via setx)",
|
|
54
|
+
shell: "windows",
|
|
55
|
+
note: res.status === 0
|
|
56
|
+
? "We saved ZEROGPU_API_KEY to your Windows user environment so other tools can use it."
|
|
57
|
+
: "Heads up: we couldn't save ZEROGPU_API_KEY as a system environment variable, but your key is still saved and the CLI will work fine.",
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const shell = detectShell();
|
|
61
|
+
const path = rcPathFor(shell);
|
|
62
|
+
const existing = existsSync(path) ? readFileSync(path, "utf8") : "";
|
|
63
|
+
const stripped = stripExisting(existing);
|
|
64
|
+
const block = buildBlock(shell, name, value);
|
|
65
|
+
const needsLeadingNewline = stripped.length > 0 && !stripped.endsWith("\n");
|
|
66
|
+
const next = stripped + (needsLeadingNewline ? "\n" : "") + block;
|
|
67
|
+
if (existsSync(path)) {
|
|
68
|
+
writeFileSync(path, next);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// fish config may need its directory created; for the rest, the parent
|
|
72
|
+
// is always $HOME which exists.
|
|
73
|
+
if (shell === "fish") {
|
|
74
|
+
mkdirSync(join(homedir(), ".config", "fish"), { recursive: true });
|
|
75
|
+
}
|
|
76
|
+
appendFileSync(path, next);
|
|
77
|
+
}
|
|
78
|
+
return { path, shell };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=shellEnv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shellEnv.js","sourceRoot":"","sources":["../../src/lib/shellEnv.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zerogpu-cli",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Command-line interface for ZeroGPU.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"zerogpu": "
|
|
7
|
+
"zerogpu": "dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"main": "./dist/index.js",
|
|
10
10
|
"types": "./dist/index.d.ts",
|