@canaryai/cli 0.1.14 → 0.2.1
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/{chunk-2T64Z2NI.js → chunk-7R4YFGP6.js} +53 -2
- package/dist/chunk-7R4YFGP6.js.map +1 -0
- package/dist/chunk-DXJNFJ3A.js +64 -0
- package/dist/chunk-DXJNFJ3A.js.map +1 -0
- package/dist/{chunk-V7U52ISX.js → chunk-HOYYXZPV.js} +136 -131
- package/dist/chunk-HOYYXZPV.js.map +1 -0
- package/dist/{chunk-ROTCL5WO.js → chunk-TO66FC4R.js} +688 -479
- package/dist/chunk-TO66FC4R.js.map +1 -0
- package/dist/chunk-UEOXNF5X.js +371 -0
- package/dist/chunk-UEOXNF5X.js.map +1 -0
- package/dist/{feature-flag-ESPSOSKG.js → feature-flag-ZDLDYRSF.js} +15 -92
- package/dist/feature-flag-ZDLDYRSF.js.map +1 -0
- package/dist/index.js +17 -65
- package/dist/index.js.map +1 -1
- package/dist/{knobs-HKONHY55.js → knobs-3MKMOXIV.js} +19 -104
- package/dist/knobs-3MKMOXIV.js.map +1 -0
- package/dist/{local-browser-SYPTG6IQ.js → local-browser-GG5GUXDS.js} +3 -3
- package/dist/{mcp-TMD2R5Z6.js → mcp-AD67OLQM.js} +4 -4
- package/dist/{psql-6IFVXM3A.js → psql-IVAPNYZV.js} +2 -2
- package/dist/{redis-HZC32IEO.js → redis-LWY7L6AS.js} +2 -2
- package/dist/{release-WOD3DAX4.js → release-KQFCTAXA.js} +5 -35
- package/dist/release-KQFCTAXA.js.map +1 -0
- package/dist/runner/preload.js +7 -323
- package/dist/runner/preload.js.map +1 -1
- package/dist/test.js +5 -340
- package/dist/test.js.map +1 -1
- package/package.json +2 -1
- package/dist/chunk-2T64Z2NI.js.map +0 -1
- package/dist/chunk-L26U3BST.js +0 -770
- package/dist/chunk-L26U3BST.js.map +0 -1
- package/dist/chunk-ROTCL5WO.js.map +0 -1
- package/dist/chunk-V7U52ISX.js.map +0 -1
- package/dist/feature-flag-ESPSOSKG.js.map +0 -1
- package/dist/knobs-HKONHY55.js.map +0 -1
- package/dist/release-WOD3DAX4.js.map +0 -1
- /package/dist/{local-browser-SYPTG6IQ.js.map → local-browser-GG5GUXDS.js.map} +0 -0
- /package/dist/{mcp-TMD2R5Z6.js.map → mcp-AD67OLQM.js.map} +0 -0
- /package/dist/{psql-6IFVXM3A.js.map → psql-IVAPNYZV.js.map} +0 -0
- /package/dist/{redis-HZC32IEO.js.map → redis-LWY7L6AS.js.map} +0 -0
|
@@ -1,92 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
apiRequest,
|
|
3
|
+
fetchList,
|
|
4
|
+
parseLifecycleStage,
|
|
5
|
+
toLifecycleLabel
|
|
6
|
+
} from "./chunk-DXJNFJ3A.js";
|
|
7
|
+
import {
|
|
8
|
+
getArgValue,
|
|
9
|
+
hasFlag,
|
|
10
|
+
resolveConfig
|
|
11
|
+
} from "./chunk-7R4YFGP6.js";
|
|
5
12
|
import "./chunk-DGUM43GV.js";
|
|
6
13
|
|
|
7
14
|
// src/feature-flag.ts
|
|
8
15
|
import process from "process";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
production: "https://api.trycanary.ai",
|
|
12
|
-
dev: "https://api.dev.trycanary.ai",
|
|
13
|
-
local: "http://localhost:3000"
|
|
14
|
-
};
|
|
15
|
-
function getArgValue(argv, key) {
|
|
16
|
-
const index = argv.indexOf(key);
|
|
17
|
-
if (index === -1 || index >= argv.length - 1) return void 0;
|
|
18
|
-
return argv[index + 1];
|
|
19
|
-
}
|
|
20
|
-
function hasFlag(argv, ...flags) {
|
|
21
|
-
return flags.some((flag) => argv.includes(flag));
|
|
22
|
-
}
|
|
23
|
-
function toLifecycleLabel(stage) {
|
|
24
|
-
switch (stage) {
|
|
25
|
-
case "deprecated":
|
|
26
|
-
return "deprecated";
|
|
27
|
-
case "ready_for_cleanup":
|
|
28
|
-
return "ready_for_cleanup";
|
|
29
|
-
default:
|
|
30
|
-
return "active";
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function parseLifecycleStage(argv) {
|
|
34
|
-
const stage = getArgValue(argv, "--stage");
|
|
35
|
-
if (!stage || !["active", "deprecated", "ready_for_cleanup"].includes(stage)) {
|
|
36
|
-
console.error("Error: --stage is required and must be one of: active, deprecated, ready_for_cleanup");
|
|
37
|
-
process.exit(1);
|
|
38
|
-
}
|
|
39
|
-
return stage;
|
|
40
|
-
}
|
|
41
|
-
async function resolveConfig(argv) {
|
|
42
|
-
const storedApiUrl = await readStoredApiUrl();
|
|
43
|
-
const env = getArgValue(argv, "--env");
|
|
44
|
-
if (env && !ENV_URLS[env]) {
|
|
45
|
-
console.error(`Unknown environment: ${env}`);
|
|
46
|
-
console.error("Valid environments: prod, dev, local");
|
|
47
|
-
process.exit(1);
|
|
48
|
-
}
|
|
49
|
-
const apiUrl = getArgValue(argv, "--api-url") ?? (env ? ENV_URLS[env] : void 0) ?? process.env.CANARY_API_URL ?? storedApiUrl ?? "https://api.trycanary.ai";
|
|
50
|
-
const token = getArgValue(argv, "--token") ?? process.env.CANARY_API_TOKEN ?? await readStoredToken();
|
|
51
|
-
if (!token) {
|
|
52
|
-
console.error("Error: No API token found.");
|
|
53
|
-
console.error("Run: canary login");
|
|
54
|
-
process.exit(1);
|
|
55
|
-
}
|
|
56
|
-
return { apiUrl, token };
|
|
57
|
-
}
|
|
58
|
-
async function apiRequest(apiUrl, token, method, path, body) {
|
|
59
|
-
const res = await fetch(`${apiUrl}${path}`, {
|
|
60
|
-
method,
|
|
61
|
-
headers: {
|
|
62
|
-
Authorization: `Bearer ${token}`,
|
|
63
|
-
"Content-Type": "application/json"
|
|
64
|
-
},
|
|
65
|
-
...body ? { body: JSON.stringify(body) } : {}
|
|
66
|
-
});
|
|
67
|
-
if (res.status === 401) {
|
|
68
|
-
console.error("Error: Unauthorized. Your session may have expired.");
|
|
69
|
-
console.error("Run: canary login");
|
|
70
|
-
process.exit(1);
|
|
71
|
-
}
|
|
72
|
-
const json = await res.json();
|
|
73
|
-
return json;
|
|
74
|
-
}
|
|
75
|
-
async function fetchFlags(apiUrl, token) {
|
|
76
|
-
const res = await fetch(`${apiUrl}/superadmin/feature-flags`, {
|
|
77
|
-
headers: { Authorization: `Bearer ${token}` }
|
|
78
|
-
});
|
|
79
|
-
if (res.status === 401) {
|
|
80
|
-
console.error("Error: Unauthorized. Your session may have expired.");
|
|
81
|
-
console.error("Run: canary login");
|
|
82
|
-
process.exit(1);
|
|
83
|
-
}
|
|
84
|
-
const json = await res.json();
|
|
85
|
-
if (!json.ok) {
|
|
86
|
-
console.error(`Error: ${json.error}`);
|
|
87
|
-
process.exit(1);
|
|
88
|
-
}
|
|
89
|
-
return json.flags ?? [];
|
|
16
|
+
function fetchFlags(apiUrl, token) {
|
|
17
|
+
return fetchList(apiUrl, token, "/superadmin/feature-flags", "flags");
|
|
90
18
|
}
|
|
91
19
|
async function handleList(argv, apiUrl, token) {
|
|
92
20
|
const jsonOutput = hasFlag(argv, "--json");
|
|
@@ -197,9 +125,7 @@ async function handleLifecycle(argv, apiUrl, token) {
|
|
|
197
125
|
const name = argv[0];
|
|
198
126
|
if (!name || name.startsWith("--")) {
|
|
199
127
|
console.error("Error: Missing flag name.");
|
|
200
|
-
console.error(
|
|
201
|
-
"Usage: canary feature-flag lifecycle <name> --stage <active|deprecated|ready_for_cleanup> [--final-value true|false]"
|
|
202
|
-
);
|
|
128
|
+
console.error("Usage: canary feature-flag lifecycle <name> --stage <active|deprecated|ready_for_cleanup> [--final-value true|false]");
|
|
203
129
|
process.exit(1);
|
|
204
130
|
}
|
|
205
131
|
const stage = parseLifecycleStage(argv);
|
|
@@ -236,10 +162,7 @@ async function handleLifecycle(argv, apiUrl, token) {
|
|
|
236
162
|
token,
|
|
237
163
|
"POST",
|
|
238
164
|
`/superadmin/feature-flags/${encodeURIComponent(name)}/lifecycle`,
|
|
239
|
-
{
|
|
240
|
-
stage,
|
|
241
|
-
finalValue
|
|
242
|
-
}
|
|
165
|
+
{ stage, finalValue }
|
|
243
166
|
);
|
|
244
167
|
if (!result.ok || !result.flag) {
|
|
245
168
|
console.error(`Error: ${result.error ?? "Failed to update lifecycle"}`);
|
|
@@ -309,4 +232,4 @@ async function runFeatureFlag(argv) {
|
|
|
309
232
|
export {
|
|
310
233
|
runFeatureFlag
|
|
311
234
|
};
|
|
312
|
-
//# sourceMappingURL=feature-flag-
|
|
235
|
+
//# sourceMappingURL=feature-flag-ZDLDYRSF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/feature-flag.ts"],"sourcesContent":["/**\n * CLI Feature Flag Management\n *\n * Allows superadmins to manage feature flags via the CLI.\n */\n\nimport process from \"node:process\";\nimport { resolveConfig, getArgValue, hasFlag } from \"./auth.js\";\nimport {\n type LifecycleStage,\n toLifecycleLabel,\n parseLifecycleStage,\n apiRequest,\n fetchList,\n} from \"./cli-helpers.js\";\n\ntype FeatureFlag = {\n id: string;\n name: string;\n description: string | null;\n lifecycleStage: LifecycleStage;\n finalValue: boolean | null;\n createdAt: string;\n organizations?: Array<{\n gateId: string;\n orgId: string;\n orgName: string;\n createdAt: string;\n }>;\n};\n\ntype FlagApiResponse = {\n ok: boolean;\n error?: string;\n flag?: FeatureFlag;\n};\n\nfunction fetchFlags(apiUrl: string, token: string): Promise<FeatureFlag[]> {\n return fetchList<FeatureFlag>(apiUrl, token, \"/superadmin/feature-flags\", \"flags\");\n}\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, \"--json\");\n const flags = await fetchFlags(apiUrl, token);\n\n if (jsonOutput) {\n console.log(JSON.stringify(flags, null, 2));\n return;\n }\n\n if (flags.length === 0) {\n console.log(\"No feature flags found.\");\n return;\n }\n\n for (const flag of flags) {\n const orgCount = flag.organizations?.length ?? 0;\n const lifecycle = `lifecycle=${toLifecycleLabel(flag.lifecycleStage)}`;\n const finalValue =\n flag.lifecycleStage === \"active\" ? \"\" : ` final=${flag.finalValue === true ? \"true\" : \"false\"}`;\n console.log(` ${flag.name} ${flag.description ?? \"\"} (${lifecycle}${finalValue}) [orgs=${orgCount}]`);\n }\n}\n\nasync function handleCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag create <name> [--description <text>]\");\n process.exit(1);\n }\n\n const description = getArgValue(argv, \"--description\") ?? null;\n const result = await apiRequest<FlagApiResponse>(apiUrl, token, \"POST\", \"/superadmin/feature-flags\", {\n name,\n description,\n });\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Created feature flag: ${name}`);\n}\n\nasync function handleDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag delete <name>\");\n process.exit(1);\n }\n\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"DELETE\", `/superadmin/feature-flags/${encodeURIComponent(name)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Deleted feature flag: ${name}`);\n}\n\nasync function handleEnable(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n const orgId = getArgValue(argv, \"--org\");\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag enable <name> --org <orgId>\");\n process.exit(1);\n }\n\n if (!orgId) {\n console.error(\"Error: Missing --org <orgId>.\");\n console.error(\"Usage: canary feature-flag enable <name> --org <orgId>\");\n process.exit(1);\n }\n\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"POST\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/organizations/${encodeURIComponent(orgId)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Enabled ${name} for org ${orgId}`);\n}\n\nasync function handleDisable(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n const orgId = getArgValue(argv, \"--org\");\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag disable <name> --org <orgId>\");\n process.exit(1);\n }\n\n if (!orgId) {\n console.error(\"Error: Missing --org <orgId>.\");\n console.error(\"Usage: canary feature-flag disable <name> --org <orgId>\");\n process.exit(1);\n }\n\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"DELETE\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/organizations/${encodeURIComponent(orgId)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Disabled ${name} for org ${orgId}`);\n}\n\nasync function handleLifecycle(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag lifecycle <name> --stage <active|deprecated|ready_for_cleanup> [--final-value true|false]\");\n process.exit(1);\n }\n\n const stage = parseLifecycleStage(argv);\n const rawFinalValue = getArgValue(argv, \"--final-value\");\n const clearFinalValue = hasFlag(argv, \"--clear-final-value\");\n\n if (rawFinalValue !== undefined && clearFinalValue) {\n console.error(\"Error: use either --final-value or --clear-final-value, not both.\");\n process.exit(1);\n }\n\n let finalValue: boolean | undefined = undefined;\n\n if (stage === \"active\") {\n if (rawFinalValue !== undefined) {\n console.error(\"Error: active stage does not accept --final-value.\");\n process.exit(1);\n }\n finalValue = undefined;\n } else {\n if (clearFinalValue) {\n console.error(\"Error: --clear-final-value can only be used with --stage active.\");\n process.exit(1);\n }\n if (!rawFinalValue) {\n console.error(\"Error: --final-value true|false is required for deprecated or ready_for_cleanup.\");\n process.exit(1);\n }\n if (rawFinalValue !== \"true\" && rawFinalValue !== \"false\") {\n console.error(\"Error: --final-value must be true or false.\");\n process.exit(1);\n }\n finalValue = rawFinalValue === \"true\";\n }\n\n const result = await apiRequest<FlagApiResponse>(\n apiUrl, token, \"POST\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/lifecycle`,\n { stage, finalValue }\n );\n\n if (!result.ok || !result.flag) {\n console.error(`Error: ${result.error ?? \"Failed to update lifecycle\"}`);\n process.exit(1);\n }\n\n const final =\n result.flag.lifecycleStage === \"active\"\n ? \"(none)\"\n : result.flag.finalValue === true\n ? \"true\"\n : \"false\";\n console.log(`Updated lifecycle for ${name}: stage=${toLifecycleLabel(result.flag.lifecycleStage)}, final=${final}`);\n}\n\nfunction printFeatureFlagHelp(): void {\n console.log(\n [\n \"Usage: canary feature-flag <sub-command> [options]\",\n \"\",\n \"Sub-commands:\",\n \" list List all feature flags\",\n \" create <name> [--description <text>] Create a new flag\",\n \" delete <name> Delete a flag and all its gates\",\n \" enable <name> --org <orgId> Enable a flag for an organization\",\n \" disable <name> --org <orgId> Disable a flag for an organization\",\n \" lifecycle <name> --stage <stage> [--final-value true|false]\",\n \" Mark lifecycle + final value\",\n \"\",\n \"Stages: active, deprecated, ready_for_cleanup\",\n \"\",\n \"Options:\",\n \" --final-value <true|false> Final value for deprecated/ready_for_cleanup\",\n \" --clear-final-value Clear final value (only valid with --stage active)\",\n \" --env <env> Target environment (prod, dev, local)\",\n \" --json Output as JSON (list only)\",\n \" --api-url <url> API URL override (takes precedence over --env)\",\n \" --token <key> API token override\",\n ].join(\"\\n\")\n );\n}\n\nexport async function runFeatureFlag(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === \"help\" || hasFlag(argv, \"--help\", \"-h\")) {\n printFeatureFlagHelp();\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n switch (subCommand) {\n case \"list\":\n await handleList(rest, apiUrl, token);\n break;\n case \"create\":\n await handleCreate(rest, apiUrl, token);\n break;\n case \"delete\":\n await handleDelete(rest, apiUrl, token);\n break;\n case \"enable\":\n await handleEnable(rest, apiUrl, token);\n break;\n case \"disable\":\n await handleDisable(rest, apiUrl, token);\n break;\n case \"lifecycle\":\n await handleLifecycle(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printFeatureFlagHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -4,15 +4,18 @@ import {
|
|
|
4
4
|
createTunnel,
|
|
5
5
|
runLocalTest,
|
|
6
6
|
runTunnel
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-HOYYXZPV.js";
|
|
8
8
|
import {
|
|
9
9
|
ENV_URLS,
|
|
10
|
+
envToProfile,
|
|
11
|
+
getArgValue,
|
|
12
|
+
hasFlag,
|
|
10
13
|
readAllStoredTokens,
|
|
11
|
-
readStoredApiUrl,
|
|
12
14
|
readStoredAuth,
|
|
13
15
|
readStoredToken,
|
|
16
|
+
resolveConfig,
|
|
14
17
|
saveAuth
|
|
15
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-7R4YFGP6.js";
|
|
16
19
|
import {
|
|
17
20
|
__require
|
|
18
21
|
} from "./chunk-DGUM43GV.js";
|
|
@@ -333,17 +336,6 @@ function countHealed(eventLogPath) {
|
|
|
333
336
|
import process2 from "process";
|
|
334
337
|
import readline from "readline";
|
|
335
338
|
import { spawn as spawn2 } from "child_process";
|
|
336
|
-
function envToProfile(env) {
|
|
337
|
-
if (env === "prod" || env === "production") return "production";
|
|
338
|
-
if (env === "dev") return "dev";
|
|
339
|
-
if (env === "local") return "local";
|
|
340
|
-
return env;
|
|
341
|
-
}
|
|
342
|
-
function getArgValue(argv, key) {
|
|
343
|
-
const index = argv.indexOf(key);
|
|
344
|
-
if (index === -1) return void 0;
|
|
345
|
-
return argv[index + 1];
|
|
346
|
-
}
|
|
347
339
|
function shouldOpenBrowser(argv) {
|
|
348
340
|
return !argv.includes("--no-open");
|
|
349
341
|
}
|
|
@@ -629,7 +621,7 @@ function getArgValue3(argv, key) {
|
|
|
629
621
|
if (index === -1 || index >= argv.length - 1) return void 0;
|
|
630
622
|
return argv[index + 1];
|
|
631
623
|
}
|
|
632
|
-
function
|
|
624
|
+
function hasFlag2(argv, ...flags) {
|
|
633
625
|
return flags.some((flag) => argv.includes(flag));
|
|
634
626
|
}
|
|
635
627
|
function formatFailedTests(failedTests, appUrl) {
|
|
@@ -646,7 +638,7 @@ async function runRemoteTest(argv) {
|
|
|
646
638
|
const token = getArgValue3(argv, "--token") ?? process5.env.CANARY_API_TOKEN ?? await readStoredToken();
|
|
647
639
|
const tag = getArgValue3(argv, "--tag");
|
|
648
640
|
const namePattern = getArgValue3(argv, "--name-pattern");
|
|
649
|
-
const verbose =
|
|
641
|
+
const verbose = hasFlag2(argv, "--verbose", "-v");
|
|
650
642
|
if (!token) {
|
|
651
643
|
console.error("Error: No API token found.");
|
|
652
644
|
console.error("");
|
|
@@ -811,32 +803,6 @@ import fs3 from "fs/promises";
|
|
|
811
803
|
import os2 from "os";
|
|
812
804
|
import path3 from "path";
|
|
813
805
|
import process6 from "process";
|
|
814
|
-
var ENV_URLS2 = {
|
|
815
|
-
prod: {
|
|
816
|
-
api: "https://api.trycanary.ai",
|
|
817
|
-
app: "https://app.trycanary.ai"
|
|
818
|
-
},
|
|
819
|
-
production: {
|
|
820
|
-
api: "https://api.trycanary.ai",
|
|
821
|
-
app: "https://app.trycanary.ai"
|
|
822
|
-
},
|
|
823
|
-
dev: {
|
|
824
|
-
api: "https://api.dev.trycanary.ai",
|
|
825
|
-
app: "https://app.dev.trycanary.ai"
|
|
826
|
-
},
|
|
827
|
-
local: {
|
|
828
|
-
api: "http://localhost:3000",
|
|
829
|
-
app: "http://localhost:5173"
|
|
830
|
-
}
|
|
831
|
-
};
|
|
832
|
-
function getArgValue4(argv, key) {
|
|
833
|
-
const index = argv.indexOf(key);
|
|
834
|
-
if (index === -1 || index >= argv.length - 1) return void 0;
|
|
835
|
-
return argv[index + 1];
|
|
836
|
-
}
|
|
837
|
-
function hasFlag2(argv, ...flags) {
|
|
838
|
-
return flags.some((flag) => argv.includes(flag));
|
|
839
|
-
}
|
|
840
806
|
async function writeDebugSession(loginUrl, expiresAt, apiUrl) {
|
|
841
807
|
const dir = path3.join(os2.homedir(), ".config", "canary-cli");
|
|
842
808
|
const filePath = path3.join(dir, "debug-session.json");
|
|
@@ -849,22 +815,8 @@ async function writeDebugSession(loginUrl, expiresAt, apiUrl) {
|
|
|
849
815
|
return filePath;
|
|
850
816
|
}
|
|
851
817
|
async function runDebugSession(argv) {
|
|
852
|
-
const
|
|
853
|
-
const
|
|
854
|
-
if (env && !envUrls) {
|
|
855
|
-
console.error(`Unknown environment: ${env}`);
|
|
856
|
-
console.error("Valid environments: prod, dev, local");
|
|
857
|
-
process6.exit(1);
|
|
858
|
-
}
|
|
859
|
-
const storedApiUrl = await readStoredApiUrl();
|
|
860
|
-
const apiUrl = getArgValue4(argv, "--api-url") ?? envUrls?.api ?? process6.env.CANARY_API_URL ?? storedApiUrl ?? "https://api.trycanary.ai";
|
|
861
|
-
const token = getArgValue4(argv, "--token") ?? process6.env.CANARY_API_TOKEN ?? await readStoredToken();
|
|
862
|
-
const jsonOutput = hasFlag2(argv, "--json");
|
|
863
|
-
if (!token) {
|
|
864
|
-
console.error("Error: No API token found.");
|
|
865
|
-
console.error("Run: canary login [--env <env>]");
|
|
866
|
-
process6.exit(1);
|
|
867
|
-
}
|
|
818
|
+
const { apiUrl, token } = await resolveConfig(argv);
|
|
819
|
+
const jsonOutput = hasFlag(argv, "--json");
|
|
868
820
|
try {
|
|
869
821
|
const res = await fetch(`${apiUrl}/auth/debug-session/create`, {
|
|
870
822
|
method: "POST",
|
|
@@ -957,8 +909,8 @@ function isSuperadminToken(token) {
|
|
|
957
909
|
// src/index.ts
|
|
958
910
|
var require2 = createRequire2(import.meta.url);
|
|
959
911
|
var pkg = require2("../package.json");
|
|
960
|
-
var loadMcp = () => import("./mcp-
|
|
961
|
-
var loadLocalBrowser = () => import("./local-browser-
|
|
912
|
+
var loadMcp = () => import("./mcp-AD67OLQM.js").then((m) => m.runMcp);
|
|
913
|
+
var loadLocalBrowser = () => import("./local-browser-GG5GUXDS.js").then((m) => m.runLocalBrowser);
|
|
962
914
|
var canary = { run };
|
|
963
915
|
var baseDir = typeof __dirname !== "undefined" ? __dirname : path4.dirname(fileURLToPath2(import.meta.url));
|
|
964
916
|
var preloadPath = path4.join(baseDir, "runner", "preload.js");
|
|
@@ -1195,27 +1147,27 @@ async function main(argv) {
|
|
|
1195
1147
|
return;
|
|
1196
1148
|
}
|
|
1197
1149
|
if (command === "psql") {
|
|
1198
|
-
const { runPsql } = await import("./psql-
|
|
1150
|
+
const { runPsql } = await import("./psql-IVAPNYZV.js");
|
|
1199
1151
|
await runPsql(rest);
|
|
1200
1152
|
return;
|
|
1201
1153
|
}
|
|
1202
1154
|
if (command === "redis") {
|
|
1203
|
-
const { runRedis } = await import("./redis-
|
|
1155
|
+
const { runRedis } = await import("./redis-LWY7L6AS.js");
|
|
1204
1156
|
await runRedis(rest);
|
|
1205
1157
|
return;
|
|
1206
1158
|
}
|
|
1207
1159
|
if (command === "release") {
|
|
1208
|
-
const { runRelease } = await import("./release-
|
|
1160
|
+
const { runRelease } = await import("./release-KQFCTAXA.js");
|
|
1209
1161
|
await runRelease(rest);
|
|
1210
1162
|
return;
|
|
1211
1163
|
}
|
|
1212
1164
|
if (command === "feature-flag") {
|
|
1213
|
-
const { runFeatureFlag } = await import("./feature-flag-
|
|
1165
|
+
const { runFeatureFlag } = await import("./feature-flag-ZDLDYRSF.js");
|
|
1214
1166
|
await runFeatureFlag(rest);
|
|
1215
1167
|
return;
|
|
1216
1168
|
}
|
|
1217
1169
|
if (command === "knobs") {
|
|
1218
|
-
const { runKnobs } = await import("./knobs-
|
|
1170
|
+
const { runKnobs } = await import("./knobs-3MKMOXIV.js");
|
|
1219
1171
|
await runKnobs(rest);
|
|
1220
1172
|
return;
|
|
1221
1173
|
}
|