@iterable/cli 0.1.4 → 0.1.6
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 +3 -2
- package/dist/config.d.ts +1 -9
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -30
- package/dist/config.js.map +1 -1
- package/dist/index.js +34 -30
- package/dist/index.js.map +1 -1
- package/dist/key-manager.d.ts +1 -0
- package/dist/key-manager.d.ts.map +1 -1
- package/dist/key-manager.js +35 -74
- package/dist/key-manager.js.map +1 -1
- package/dist/keys-cli.d.ts +1 -1
- package/dist/keys-cli.d.ts.map +1 -1
- package/dist/keys-cli.js +14 -14
- package/dist/keys-cli.js.map +1 -1
- package/dist/output.d.ts +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +94 -45
- package/dist/output.js.map +1 -1
- package/dist/router.d.ts +1 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +83 -50
- package/dist/router.js.map +1 -1
- package/dist/utils/theme.d.ts +0 -1
- package/dist/utils/theme.d.ts.map +1 -1
- package/dist/utils/theme.js +0 -1
- package/dist/utils/theme.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -119,6 +119,7 @@ See the [full command reference](COMMANDS.md) for all 109 commands with paramete
|
|
|
119
119
|
| `--columns <cols>` | Comma-separated columns for table output |
|
|
120
120
|
| `--json <data>` | Pass raw JSON (use `-` for stdin) |
|
|
121
121
|
| `--file <path>` | Read JSON input from a file |
|
|
122
|
+
| `--key, -k <name>` | Use a specific stored key (overrides env var and active key) |
|
|
122
123
|
| `--force, -f` | Skip confirmation prompts for destructive commands |
|
|
123
124
|
|
|
124
125
|
## Output Formats
|
|
@@ -147,8 +148,8 @@ Without `--columns`, all fields are shown.
|
|
|
147
148
|
|
|
148
149
|
| Variable | Description | Default |
|
|
149
150
|
|----------|-------------|---------|
|
|
150
|
-
| `ITERABLE_API_KEY` | API key (overrides key manager) | — |
|
|
151
|
-
| `ITERABLE_BASE_URL` | API base URL (
|
|
151
|
+
| `ITERABLE_API_KEY` | API key (overrides key manager; `--key` flag takes precedence) | — |
|
|
152
|
+
| `ITERABLE_BASE_URL` | API base URL (used with env var key only) | `https://api.iterable.com` |
|
|
152
153
|
| `ITERABLE_DEBUG` | Enable debug logging (HTTP requests/responses to stderr) | `false` |
|
|
153
154
|
| `ITERABLE_DEBUG_VERBOSE` | Include response bodies in debug output (may contain PII) | `false` |
|
|
154
155
|
|
package/dist/config.d.ts
CHANGED
|
@@ -2,13 +2,5 @@ export interface CliConfig {
|
|
|
2
2
|
readonly apiKey: string;
|
|
3
3
|
readonly baseUrl: string;
|
|
4
4
|
}
|
|
5
|
-
|
|
6
|
-
* Load configuration.
|
|
7
|
-
*
|
|
8
|
-
* Resolution order:
|
|
9
|
-
* 1. ITERABLE_API_KEY env var (if set, use directly -- enables CI/scripting override)
|
|
10
|
-
* 2. Key manager active key
|
|
11
|
-
* 3. Error with guidance
|
|
12
|
-
*/
|
|
13
|
-
export declare function loadCliConfig(): Promise<CliConfig>;
|
|
5
|
+
export declare function loadCliConfig(keyNameOrId?: string): Promise<CliConfig>;
|
|
14
6
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAYD,wBAAsB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAoE5E"}
|
package/dist/config.js
CHANGED
|
@@ -8,53 +8,57 @@ import { sanitizeString } from "./utils/sanitize.js";
|
|
|
8
8
|
* Load configuration.
|
|
9
9
|
*
|
|
10
10
|
* Resolution order:
|
|
11
|
-
* 1.
|
|
12
|
-
* 2.
|
|
13
|
-
* 3.
|
|
11
|
+
* 1. --key flag (specific stored key by name or ID)
|
|
12
|
+
* 2. ITERABLE_API_KEY env var (enables CI/scripting override)
|
|
13
|
+
* 3. Key manager active key
|
|
14
14
|
*/
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
const DEFAULT_BASE_URL = "https://api.iterable.com";
|
|
16
|
+
export async function loadCliConfig(keyNameOrId) {
|
|
17
|
+
if (keyNameOrId && !isTestEnv()) {
|
|
18
|
+
const keyManager = getKeyManager();
|
|
19
|
+
const keys = await keyManager.listKeys();
|
|
20
|
+
const keyMeta = keys.find((k) => k.name === keyNameOrId || k.id === keyNameOrId);
|
|
21
|
+
if (!keyMeta) {
|
|
22
|
+
throw new CliError(`Key not found: "${keyNameOrId}". Run "${COMMAND_NAME} keys list" to see available keys.`, 2);
|
|
23
|
+
}
|
|
24
|
+
const apiKey = await keyManager.getKey(keyMeta.id);
|
|
25
|
+
if (!apiKey) {
|
|
26
|
+
throw new CliError(`Failed to retrieve key "${keyNameOrId}". Try "${COMMAND_NAME} keys update ${keyNameOrId}".`, 1);
|
|
27
|
+
}
|
|
28
|
+
return { apiKey, baseUrl: keyMeta.baseUrl };
|
|
29
|
+
}
|
|
17
30
|
if (process.env.ITERABLE_API_KEY) {
|
|
18
|
-
return {
|
|
31
|
+
return {
|
|
32
|
+
apiKey: process.env.ITERABLE_API_KEY,
|
|
33
|
+
baseUrl: process.env.ITERABLE_BASE_URL ?? DEFAULT_BASE_URL,
|
|
34
|
+
};
|
|
19
35
|
}
|
|
20
36
|
if (!isTestEnv()) {
|
|
21
37
|
try {
|
|
22
38
|
const keyManager = getKeyManager();
|
|
23
|
-
await keyManager.initialize();
|
|
24
39
|
if (await keyManager.hasKeys()) {
|
|
25
40
|
if (!(await keyManager.hasActiveKey())) {
|
|
26
|
-
throw new CliError(`No active API key. Run "${COMMAND_NAME} keys activate <name>"
|
|
41
|
+
throw new CliError(`No active API key. Run "${COMMAND_NAME} keys activate <name>", use --key <name>, or set ITERABLE_API_KEY.`, 2);
|
|
27
42
|
}
|
|
28
43
|
const apiKey = await keyManager.getActiveKey();
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (meta?.baseUrl) {
|
|
33
|
-
baseUrl = meta.baseUrl;
|
|
34
|
-
}
|
|
35
|
-
return { apiKey, baseUrl };
|
|
44
|
+
const meta = await keyManager.getActiveKeyMetadata();
|
|
45
|
+
if (apiKey && meta) {
|
|
46
|
+
return { apiKey, baseUrl: meta.baseUrl };
|
|
36
47
|
}
|
|
37
48
|
}
|
|
38
49
|
}
|
|
39
50
|
catch (error) {
|
|
40
51
|
if (error instanceof CliError)
|
|
41
52
|
throw error;
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
logger.error("Unexpected error loading from key manager", {
|
|
50
|
-
error: sanitizedMessage,
|
|
51
|
-
});
|
|
52
|
-
console.error(
|
|
53
|
-
// eslint-disable-line no-console
|
|
54
|
-
"Warning: Failed to load API key from key storage:", sanitizedMessage);
|
|
55
|
-
}
|
|
53
|
+
const sanitizedMessage = sanitizeString(error instanceof Error ? error.message : String(error));
|
|
54
|
+
logger.error("Failed to load from key manager", {
|
|
55
|
+
error: sanitizedMessage,
|
|
56
|
+
});
|
|
57
|
+
console.error(
|
|
58
|
+
// eslint-disable-line no-console
|
|
59
|
+
"Warning: Failed to load API key from key storage:", sanitizedMessage);
|
|
56
60
|
}
|
|
57
61
|
}
|
|
58
|
-
throw new CliError(`No API key found. Run "${COMMAND_NAME} keys add" to add one, or set ITERABLE_API_KEY
|
|
62
|
+
throw new CliError(`No API key found. Run "${COMMAND_NAME} keys add" to add one, or set ITERABLE_API_KEY.`, 2);
|
|
59
63
|
}
|
|
60
64
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAOrD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { IterableClient } from "@iterable/api";
|
|
3
|
+
import chalk from "chalk";
|
|
3
4
|
import { readFileSync } from "fs";
|
|
4
5
|
import { z } from "zod";
|
|
5
6
|
import { loadCliConfig } from "./config.js";
|
|
@@ -8,6 +9,10 @@ import { formatOutput, getDefaultFormat } from "./output.js";
|
|
|
8
9
|
import { buildParser, parseCommand } from "./parser.js";
|
|
9
10
|
import { findCommand, parseArgs, showCategoryHelp, showGlobalHelp, showVersion, } from "./router.js";
|
|
10
11
|
import { COMMAND_NAME } from "./utils/command-info.js";
|
|
12
|
+
const CLI_PAGINATION_DEFAULTS = {
|
|
13
|
+
page: 1,
|
|
14
|
+
pageSize: 10,
|
|
15
|
+
};
|
|
11
16
|
async function main() {
|
|
12
17
|
const parsed = parseArgs(process.argv.slice(2));
|
|
13
18
|
if (parsed.globalFlags.version) {
|
|
@@ -25,7 +30,7 @@ async function main() {
|
|
|
25
30
|
}
|
|
26
31
|
if (parsed.category === "keys") {
|
|
27
32
|
const { handleKeysCommand } = await import("./keys-cli.js");
|
|
28
|
-
await handleKeysCommand(parsed.action ? [parsed.action, ...parsed.rest] : []);
|
|
33
|
+
await handleKeysCommand(parsed.action ? [parsed.action, ...parsed.rest] : [], parsed.globalFlags.key);
|
|
29
34
|
return;
|
|
30
35
|
}
|
|
31
36
|
if (!parsed.action) {
|
|
@@ -46,7 +51,7 @@ async function main() {
|
|
|
46
51
|
}
|
|
47
52
|
return;
|
|
48
53
|
}
|
|
49
|
-
const config = await loadCliConfig();
|
|
54
|
+
const config = await loadCliConfig(parsed.globalFlags.key);
|
|
50
55
|
const debug = process.env.ITERABLE_DEBUG === "true" ||
|
|
51
56
|
process.env.ITERABLE_DEBUG_VERBOSE === "true";
|
|
52
57
|
const client = new IterableClient({
|
|
@@ -62,6 +67,14 @@ async function main() {
|
|
|
62
67
|
restArgs = ["--json", content];
|
|
63
68
|
}
|
|
64
69
|
const params = await parseCommand(command.schema, `iterable ${parsed.category} ${parsed.action}`, restArgs, command.positionalArgs, command.cliTransforms);
|
|
70
|
+
const schemaKeys = command.schema instanceof z.ZodObject
|
|
71
|
+
? new Set(Object.keys(command.schema.shape))
|
|
72
|
+
: new Set();
|
|
73
|
+
for (const [key, defaultVal] of Object.entries(CLI_PAGINATION_DEFAULTS)) {
|
|
74
|
+
if (schemaKeys.has(key)) {
|
|
75
|
+
params[key] ??= defaultVal;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
65
78
|
if (command.destructive &&
|
|
66
79
|
!parsed.globalFlags.force &&
|
|
67
80
|
process.stdin.isTTY) {
|
|
@@ -80,8 +93,9 @@ async function main() {
|
|
|
80
93
|
}
|
|
81
94
|
}
|
|
82
95
|
const result = await command.execute(client, params);
|
|
83
|
-
const format = parsed.globalFlags.output ??
|
|
84
|
-
|
|
96
|
+
const format = parsed.globalFlags.output ??
|
|
97
|
+
(parsed.globalFlags.columns ? "table" : getDefaultFormat());
|
|
98
|
+
console.log(formatOutput(result, format, parsed.globalFlags.columns, params)); // eslint-disable-line no-console
|
|
85
99
|
}
|
|
86
100
|
finally {
|
|
87
101
|
client.destroy();
|
|
@@ -89,46 +103,36 @@ async function main() {
|
|
|
89
103
|
}
|
|
90
104
|
main().catch(async (error) => {
|
|
91
105
|
const { IterableApiError, IterableNetworkError, IterableRawError, IterableResponseValidationError, } = await import("@iterable/api");
|
|
92
|
-
|
|
106
|
+
const err = (msg) => console.error(chalk.red(`✖ ${msg}`)); // eslint-disable-line no-console
|
|
107
|
+
const hint = (msg) => console.error(chalk.dim(` ${msg}`)); // eslint-disable-line no-console
|
|
93
108
|
if (error instanceof CliError) {
|
|
94
|
-
|
|
109
|
+
err(error.message);
|
|
95
110
|
process.exit(error.exitCode);
|
|
96
111
|
}
|
|
97
112
|
if (error instanceof z.ZodError) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
.join("
|
|
101
|
-
|
|
113
|
+
err("Validation error");
|
|
114
|
+
for (const issue of error.issues) {
|
|
115
|
+
hint(`${issue.path.join(".")}: ${issue.message}`);
|
|
116
|
+
}
|
|
102
117
|
process.exit(2);
|
|
103
118
|
}
|
|
104
|
-
if (error instanceof IterableApiError
|
|
105
|
-
|
|
119
|
+
if (error instanceof IterableApiError ||
|
|
120
|
+
error instanceof IterableRawError ||
|
|
121
|
+
error instanceof IterableResponseValidationError) {
|
|
122
|
+
err(`${error.message} (${error.statusCode})`);
|
|
106
123
|
if (error.endpoint)
|
|
107
|
-
|
|
108
|
-
if (error.statusCode === 401) {
|
|
109
|
-
|
|
124
|
+
hint(`Endpoint: ${error.endpoint}`);
|
|
125
|
+
if (error instanceof IterableApiError && error.statusCode === 401) {
|
|
126
|
+
hint(`Run '${COMMAND_NAME} keys add' to configure your API key`);
|
|
110
127
|
}
|
|
111
128
|
process.exit(1);
|
|
112
129
|
}
|
|
113
|
-
if (error instanceof IterableRawError) {
|
|
114
|
-
console.error(`API error (${error.statusCode}): ${error.message}`);
|
|
115
|
-
if (error.endpoint)
|
|
116
|
-
console.error(` Endpoint: ${error.endpoint}`);
|
|
117
|
-
process.exit(1);
|
|
118
|
-
}
|
|
119
|
-
if (error instanceof IterableResponseValidationError) {
|
|
120
|
-
console.error(`Response validation error (${error.statusCode}): ${error.message}`);
|
|
121
|
-
if (error.endpoint)
|
|
122
|
-
console.error(` Endpoint: ${error.endpoint}`);
|
|
123
|
-
process.exit(1);
|
|
124
|
-
}
|
|
125
130
|
if (error instanceof IterableNetworkError) {
|
|
126
|
-
|
|
131
|
+
err(error.message);
|
|
127
132
|
process.exit(1);
|
|
128
133
|
}
|
|
129
|
-
/* eslint-enable no-console */
|
|
130
134
|
const msg = error instanceof Error ? error.message : String(error);
|
|
131
|
-
|
|
135
|
+
err(msg);
|
|
132
136
|
process.exit(1);
|
|
133
137
|
});
|
|
134
138
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EACL,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhD,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAC/B,WAAW,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,cAAc,EAAE,CAAC;QACzB,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QAC5D,MAAM,iBAAiB,CACrB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/key-manager.d.ts
CHANGED
|
@@ -52,6 +52,7 @@ export declare class KeyManager {
|
|
|
52
52
|
* @param execSecurity - Optional security command executor (for dependency injection in tests)
|
|
53
53
|
*/
|
|
54
54
|
constructor(configDir?: string, execSecurity?: SecurityExecutor);
|
|
55
|
+
private ensureStore;
|
|
55
56
|
/**
|
|
56
57
|
* Validate metadata against keychain and clean up orphaned entries (macOS only)
|
|
57
58
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-manager.d.ts","sourceRoot":"","sources":["../src/key-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA0CH,MAAM,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAcnE,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AASD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C;;;;;OAKG;gBACS,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"key-manager.d.ts","sourceRoot":"","sources":["../src/key-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/key-manager.js
CHANGED
|
@@ -98,6 +98,15 @@ export class KeyManager {
|
|
|
98
98
|
this.storageMethod = StorageMethod.FILE;
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
|
+
async ensureStore() {
|
|
102
|
+
if (!this.store) {
|
|
103
|
+
await this.initialize();
|
|
104
|
+
}
|
|
105
|
+
if (!this.store) {
|
|
106
|
+
throw new Error("Key store not initialized");
|
|
107
|
+
}
|
|
108
|
+
return this.store;
|
|
109
|
+
}
|
|
101
110
|
/**
|
|
102
111
|
* Validate metadata against keychain and clean up orphaned entries (macOS only)
|
|
103
112
|
*
|
|
@@ -493,9 +502,6 @@ export class KeyManager {
|
|
|
493
502
|
* @returns The ID of the saved key
|
|
494
503
|
*/
|
|
495
504
|
async saveKey(name, apiKey, baseUrl, envOverrides, idOrName) {
|
|
496
|
-
if (!this.store) {
|
|
497
|
-
await this.initialize();
|
|
498
|
-
}
|
|
499
505
|
if (!this.store) {
|
|
500
506
|
throw new Error("Key store not initialized");
|
|
501
507
|
}
|
|
@@ -616,6 +622,7 @@ export class KeyManager {
|
|
|
616
622
|
* @throws {Error} If the key name already exists, validation fails, or storage fails
|
|
617
623
|
*/
|
|
618
624
|
async addKey(name, apiKey, baseUrl, envOverrides) {
|
|
625
|
+
await this.ensureStore();
|
|
619
626
|
return this.saveKey(name, apiKey, baseUrl, envOverrides);
|
|
620
627
|
}
|
|
621
628
|
/**
|
|
@@ -632,6 +639,7 @@ export class KeyManager {
|
|
|
632
639
|
* @throws {Error} If the key is not found, name conflict, validation fails, or storage fails
|
|
633
640
|
*/
|
|
634
641
|
async updateKey(idOrName, name, apiKey, baseUrl, envOverrides) {
|
|
642
|
+
await this.ensureStore();
|
|
635
643
|
return this.saveKey(name, apiKey, baseUrl, envOverrides, idOrName);
|
|
636
644
|
}
|
|
637
645
|
/**
|
|
@@ -644,13 +652,8 @@ export class KeyManager {
|
|
|
644
652
|
* @throws {Error} If the key store is not initialized
|
|
645
653
|
*/
|
|
646
654
|
async listKeys() {
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
}
|
|
650
|
-
if (!this.store) {
|
|
651
|
-
throw new Error("Key store not initialized");
|
|
652
|
-
}
|
|
653
|
-
return [...this.store.keys];
|
|
655
|
+
const store = await this.ensureStore();
|
|
656
|
+
return [...store.keys];
|
|
654
657
|
}
|
|
655
658
|
/**
|
|
656
659
|
* Get key metadata by ID
|
|
@@ -672,14 +675,9 @@ export class KeyManager {
|
|
|
672
675
|
* @throws {Error} If storage access fails
|
|
673
676
|
*/
|
|
674
677
|
async getKey(idOrName) {
|
|
675
|
-
|
|
676
|
-
await this.initialize();
|
|
677
|
-
}
|
|
678
|
-
if (!this.store) {
|
|
679
|
-
throw new Error("Key store not initialized");
|
|
680
|
-
}
|
|
678
|
+
const store = await this.ensureStore();
|
|
681
679
|
// Find the key metadata
|
|
682
|
-
const keyMeta =
|
|
680
|
+
const keyMeta = store.keys.find((k) => k.id === idOrName || k.name === idOrName);
|
|
683
681
|
if (!keyMeta) {
|
|
684
682
|
return null;
|
|
685
683
|
}
|
|
@@ -750,13 +748,8 @@ export class KeyManager {
|
|
|
750
748
|
* @throws {Error} If storage access fails
|
|
751
749
|
*/
|
|
752
750
|
async getActiveKey() {
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
}
|
|
756
|
-
if (!this.store) {
|
|
757
|
-
throw new Error("Key store not initialized");
|
|
758
|
-
}
|
|
759
|
-
const activeKey = this.store.keys.find((k) => k.isActive);
|
|
751
|
+
const store = await this.ensureStore();
|
|
752
|
+
const activeKey = store.keys.find((k) => k.isActive);
|
|
760
753
|
if (!activeKey) {
|
|
761
754
|
return null;
|
|
762
755
|
}
|
|
@@ -772,13 +765,8 @@ export class KeyManager {
|
|
|
772
765
|
* @throws {Error} If the key store is not initialized
|
|
773
766
|
*/
|
|
774
767
|
async getActiveKeyMetadata() {
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
}
|
|
778
|
-
if (!this.store) {
|
|
779
|
-
throw new Error("Key store not initialized");
|
|
780
|
-
}
|
|
781
|
-
return this.store.keys.find((k) => k.isActive) || null;
|
|
768
|
+
const store = await this.ensureStore();
|
|
769
|
+
return store.keys.find((k) => k.isActive) || null;
|
|
782
770
|
}
|
|
783
771
|
/**
|
|
784
772
|
* Set a key as active by ID or name
|
|
@@ -791,19 +779,14 @@ export class KeyManager {
|
|
|
791
779
|
* @throws {Error} If the key is not found or the store is not initialized
|
|
792
780
|
*/
|
|
793
781
|
async setActiveKey(idOrName) {
|
|
794
|
-
|
|
795
|
-
await this.initialize();
|
|
796
|
-
}
|
|
797
|
-
if (!this.store) {
|
|
798
|
-
throw new Error("Key store not initialized");
|
|
799
|
-
}
|
|
782
|
+
const store = await this.ensureStore();
|
|
800
783
|
// Find the key
|
|
801
|
-
const keyMeta =
|
|
784
|
+
const keyMeta = store.keys.find((k) => k.id === idOrName || k.name === idOrName);
|
|
802
785
|
if (!keyMeta) {
|
|
803
786
|
throw new Error(`Key not found: ${idOrName}`);
|
|
804
787
|
}
|
|
805
788
|
// Deactivate all keys
|
|
806
|
-
|
|
789
|
+
store.keys.forEach((k) => {
|
|
807
790
|
k.isActive = false;
|
|
808
791
|
});
|
|
809
792
|
// Activate the selected key
|
|
@@ -820,18 +803,13 @@ export class KeyManager {
|
|
|
820
803
|
* @throws {Error} If the key is not found or the store is not initialized
|
|
821
804
|
*/
|
|
822
805
|
async deleteKey(id) {
|
|
823
|
-
|
|
824
|
-
await this.initialize();
|
|
825
|
-
}
|
|
826
|
-
if (!this.store) {
|
|
827
|
-
throw new Error("Key store not initialized");
|
|
828
|
-
}
|
|
806
|
+
const store = await this.ensureStore();
|
|
829
807
|
// Find the key by ID only
|
|
830
|
-
const index =
|
|
808
|
+
const index = store.keys.findIndex((k) => k.id === id);
|
|
831
809
|
if (index === -1) {
|
|
832
810
|
throw new Error(`Key not found with ID: ${id}`);
|
|
833
811
|
}
|
|
834
|
-
const keyMeta =
|
|
812
|
+
const keyMeta = store.keys[index];
|
|
835
813
|
if (!keyMeta) {
|
|
836
814
|
throw new Error(`Key not found with ID: ${id}`);
|
|
837
815
|
}
|
|
@@ -857,7 +835,7 @@ export class KeyManager {
|
|
|
857
835
|
// Continue anyway to clean up metadata, but warn the user
|
|
858
836
|
}
|
|
859
837
|
// Remove from metadata
|
|
860
|
-
|
|
838
|
+
store.keys.splice(index, 1);
|
|
861
839
|
await this.saveMetadata();
|
|
862
840
|
if (!keychainDeleted) {
|
|
863
841
|
logger.warn("Key removed from metadata but may still exist in Keychain", {
|
|
@@ -873,7 +851,7 @@ export class KeyManager {
|
|
|
873
851
|
}
|
|
874
852
|
else {
|
|
875
853
|
// Windows/Linux: Just remove from JSON
|
|
876
|
-
|
|
854
|
+
store.keys.splice(index, 1);
|
|
877
855
|
await this.saveMetadata();
|
|
878
856
|
logger.debug("API key deleted", { id: keyMeta.id, name: keyMeta.name });
|
|
879
857
|
}
|
|
@@ -887,30 +865,18 @@ export class KeyManager {
|
|
|
887
865
|
* @throws {Error} If the key store is not initialized
|
|
888
866
|
*/
|
|
889
867
|
async hasKeys() {
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
}
|
|
893
|
-
if (!this.store) {
|
|
894
|
-
throw new Error("Key store not initialized");
|
|
895
|
-
}
|
|
896
|
-
return this.store.keys.length > 0;
|
|
868
|
+
const store = await this.ensureStore();
|
|
869
|
+
return store.keys.length > 0;
|
|
897
870
|
}
|
|
898
871
|
/** Check if any key is currently marked as active (metadata only, no keychain call). */
|
|
899
872
|
async hasActiveKey() {
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
}
|
|
903
|
-
if (!this.store) {
|
|
904
|
-
throw new Error("Key store not initialized");
|
|
905
|
-
}
|
|
906
|
-
return this.store.keys.some((k) => k.isActive);
|
|
873
|
+
const store = await this.ensureStore();
|
|
874
|
+
return store.keys.some((k) => k.isActive);
|
|
907
875
|
}
|
|
908
876
|
/** Deactivate all keys (no key will be active). */
|
|
909
877
|
async deactivateAllKeys() {
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
}
|
|
913
|
-
this.store.keys.forEach((k) => {
|
|
878
|
+
const store = await this.ensureStore();
|
|
879
|
+
store.keys.forEach((k) => {
|
|
914
880
|
k.isActive = false;
|
|
915
881
|
});
|
|
916
882
|
await this.saveMetadata();
|
|
@@ -926,14 +892,9 @@ export class KeyManager {
|
|
|
926
892
|
* @throws {Error} If storage access fails
|
|
927
893
|
*/
|
|
928
894
|
async findKeyByValue(apiKeyValue) {
|
|
929
|
-
|
|
930
|
-
await this.initialize();
|
|
931
|
-
}
|
|
932
|
-
if (!this.store) {
|
|
933
|
-
throw new Error("Key store not initialized");
|
|
934
|
-
}
|
|
895
|
+
const store = await this.ensureStore();
|
|
935
896
|
// Check each key to see if the value matches
|
|
936
|
-
for (const keyMeta of
|
|
897
|
+
for (const keyMeta of store.keys) {
|
|
937
898
|
try {
|
|
938
899
|
let storedKey;
|
|
939
900
|
switch (this.storageMethod) {
|