@phnx-labs/agents-cli 0.1.0 → 1.12.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.
Files changed (145) hide show
  1. package/README.md +14 -96
  2. package/dist/commands/exec.d.ts.map +1 -1
  3. package/dist/commands/exec.js +17 -135
  4. package/dist/commands/exec.js.map +1 -1
  5. package/dist/commands/models.d.ts.map +1 -1
  6. package/dist/commands/models.js +3 -30
  7. package/dist/commands/models.js.map +1 -1
  8. package/dist/commands/pull.d.ts.map +1 -1
  9. package/dist/commands/pull.js +3 -37
  10. package/dist/commands/pull.js.map +1 -1
  11. package/dist/commands/sessions.d.ts.map +1 -1
  12. package/dist/commands/sessions.js +0 -100
  13. package/dist/commands/sessions.js.map +1 -1
  14. package/dist/commands/view.d.ts.map +1 -1
  15. package/dist/commands/view.js +2 -42
  16. package/dist/commands/view.js.map +1 -1
  17. package/dist/index.js +8 -37
  18. package/dist/index.js.map +1 -1
  19. package/dist/lib/__tests__/hooks.test.js +2 -2
  20. package/dist/lib/__tests__/hooks.test.js.map +1 -1
  21. package/dist/lib/__tests__/models.test.js +1 -56
  22. package/dist/lib/__tests__/models.test.js.map +1 -1
  23. package/dist/lib/__tests__/usage.test.js +2 -4
  24. package/dist/lib/__tests__/usage.test.js.map +1 -1
  25. package/dist/lib/agents.d.ts.map +1 -1
  26. package/dist/lib/agents.js +2 -10
  27. package/dist/lib/agents.js.map +1 -1
  28. package/dist/lib/exec.d.ts +1 -4
  29. package/dist/lib/exec.d.ts.map +1 -1
  30. package/dist/lib/exec.js +15 -24
  31. package/dist/lib/exec.js.map +1 -1
  32. package/dist/lib/hooks.d.ts.map +1 -1
  33. package/dist/lib/hooks.js +1 -153
  34. package/dist/lib/hooks.js.map +1 -1
  35. package/dist/lib/models.d.ts +10 -18
  36. package/dist/lib/models.d.ts.map +1 -1
  37. package/dist/lib/models.js +12 -380
  38. package/dist/lib/models.js.map +1 -1
  39. package/dist/lib/session/types.d.ts +0 -8
  40. package/dist/lib/session/types.d.ts.map +1 -1
  41. package/dist/lib/shims.d.ts +2 -31
  42. package/dist/lib/shims.d.ts.map +1 -1
  43. package/dist/lib/shims.js +24 -75
  44. package/dist/lib/shims.js.map +1 -1
  45. package/dist/lib/state.d.ts +0 -7
  46. package/dist/lib/state.d.ts.map +1 -1
  47. package/dist/lib/state.js +1 -14
  48. package/dist/lib/state.js.map +1 -1
  49. package/dist/lib/usage.d.ts +0 -16
  50. package/dist/lib/usage.d.ts.map +1 -1
  51. package/dist/lib/usage.js +10 -27
  52. package/dist/lib/usage.js.map +1 -1
  53. package/dist/lib/versions.d.ts +1 -7
  54. package/dist/lib/versions.d.ts.map +1 -1
  55. package/dist/lib/versions.js +8 -30
  56. package/dist/lib/versions.js.map +1 -1
  57. package/package.json +2 -2
  58. package/dist/commands/cloud.d.ts +0 -3
  59. package/dist/commands/cloud.d.ts.map +0 -1
  60. package/dist/commands/cloud.js +0 -322
  61. package/dist/commands/cloud.js.map +0 -1
  62. package/dist/commands/profiles.d.ts +0 -3
  63. package/dist/commands/profiles.d.ts.map +0 -1
  64. package/dist/commands/profiles.js +0 -242
  65. package/dist/commands/profiles.js.map +0 -1
  66. package/dist/commands/secrets.d.ts +0 -3
  67. package/dist/commands/secrets.d.ts.map +0 -1
  68. package/dist/commands/secrets.js +0 -339
  69. package/dist/commands/secrets.js.map +0 -1
  70. package/dist/lib/__tests__/rotate.test.d.ts +0 -2
  71. package/dist/lib/__tests__/rotate.test.d.ts.map +0 -1
  72. package/dist/lib/__tests__/rotate.test.js +0 -80
  73. package/dist/lib/__tests__/rotate.test.js.map +0 -1
  74. package/dist/lib/__tests__/secrets-bundles.test.d.ts +0 -2
  75. package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +0 -1
  76. package/dist/lib/__tests__/secrets-bundles.test.js +0 -104
  77. package/dist/lib/__tests__/secrets-bundles.test.js.map +0 -1
  78. package/dist/lib/__tests__/secrets.test.d.ts +0 -2
  79. package/dist/lib/__tests__/secrets.test.d.ts.map +0 -1
  80. package/dist/lib/__tests__/secrets.test.js +0 -90
  81. package/dist/lib/__tests__/secrets.test.js.map +0 -1
  82. package/dist/lib/__tests__/shims.test.d.ts +0 -2
  83. package/dist/lib/__tests__/shims.test.d.ts.map +0 -1
  84. package/dist/lib/__tests__/shims.test.js +0 -39
  85. package/dist/lib/__tests__/shims.test.js.map +0 -1
  86. package/dist/lib/__tests__/versions.test.d.ts +0 -2
  87. package/dist/lib/__tests__/versions.test.d.ts.map +0 -1
  88. package/dist/lib/__tests__/versions.test.js +0 -63
  89. package/dist/lib/__tests__/versions.test.js.map +0 -1
  90. package/dist/lib/cloud/codex.d.ts +0 -19
  91. package/dist/lib/cloud/codex.d.ts.map +0 -1
  92. package/dist/lib/cloud/codex.js +0 -210
  93. package/dist/lib/cloud/codex.js.map +0 -1
  94. package/dist/lib/cloud/factory.d.ts +0 -26
  95. package/dist/lib/cloud/factory.d.ts.map +0 -1
  96. package/dist/lib/cloud/factory.js +0 -37
  97. package/dist/lib/cloud/factory.js.map +0 -1
  98. package/dist/lib/cloud/registry.d.ts +0 -6
  99. package/dist/lib/cloud/registry.d.ts.map +0 -1
  100. package/dist/lib/cloud/registry.js +0 -56
  101. package/dist/lib/cloud/registry.js.map +0 -1
  102. package/dist/lib/cloud/rush.d.ts +0 -15
  103. package/dist/lib/cloud/rush.d.ts.map +0 -1
  104. package/dist/lib/cloud/rush.js +0 -185
  105. package/dist/lib/cloud/rush.js.map +0 -1
  106. package/dist/lib/cloud/store.d.ts +0 -10
  107. package/dist/lib/cloud/store.d.ts.map +0 -1
  108. package/dist/lib/cloud/store.js +0 -96
  109. package/dist/lib/cloud/store.js.map +0 -1
  110. package/dist/lib/cloud/stream.d.ts +0 -18
  111. package/dist/lib/cloud/stream.d.ts.map +0 -1
  112. package/dist/lib/cloud/stream.js +0 -138
  113. package/dist/lib/cloud/stream.js.map +0 -1
  114. package/dist/lib/cloud/types.d.ts +0 -60
  115. package/dist/lib/cloud/types.d.ts.map +0 -1
  116. package/dist/lib/cloud/types.js +0 -2
  117. package/dist/lib/cloud/types.js.map +0 -1
  118. package/dist/lib/profiles-keychain.d.ts +0 -3
  119. package/dist/lib/profiles-keychain.d.ts.map +0 -1
  120. package/dist/lib/profiles-keychain.js +0 -10
  121. package/dist/lib/profiles-keychain.js.map +0 -1
  122. package/dist/lib/profiles-presets.d.ts +0 -15
  123. package/dist/lib/profiles-presets.d.ts.map +0 -1
  124. package/dist/lib/profiles-presets.js +0 -95
  125. package/dist/lib/profiles-presets.js.map +0 -1
  126. package/dist/lib/profiles.d.ts +0 -35
  127. package/dist/lib/profiles.d.ts.map +0 -1
  128. package/dist/lib/profiles.js +0 -123
  129. package/dist/lib/profiles.js.map +0 -1
  130. package/dist/lib/rotate.d.ts +0 -52
  131. package/dist/lib/rotate.d.ts.map +0 -1
  132. package/dist/lib/rotate.js +0 -87
  133. package/dist/lib/rotate.js.map +0 -1
  134. package/dist/lib/secrets-bundles.d.ts +0 -29
  135. package/dist/lib/secrets-bundles.d.ts.map +0 -1
  136. package/dist/lib/secrets-bundles.js +0 -168
  137. package/dist/lib/secrets-bundles.js.map +0 -1
  138. package/dist/lib/secrets.d.ts +0 -27
  139. package/dist/lib/secrets.d.ts.map +0 -1
  140. package/dist/lib/secrets.js +0 -127
  141. package/dist/lib/secrets.js.map +0 -1
  142. package/dist/lib/session/artifacts.d.ts +0 -5
  143. package/dist/lib/session/artifacts.d.ts.map +0 -1
  144. package/dist/lib/session/artifacts.js +0 -75
  145. package/dist/lib/session/artifacts.js.map +0 -1
@@ -1,339 +0,0 @@
1
- import chalk from 'chalk';
2
- import * as fs from 'fs';
3
- import { bundleExists, deleteBundle, describeBundle, keychainItemsForBundle, keychainRef, listBundles, parseDotenv, readBundle, validateBundleName, validateEnvKey, writeBundle, } from '../lib/secrets-bundles.js';
4
- import { deleteKeychainToken, getKeychainToken, hasKeychainToken, secretsKeychainItem, setKeychainToken, } from '../lib/secrets.js';
5
- import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
6
- async function promptForSecret(message) {
7
- if (!isInteractiveTerminal()) {
8
- throw new Error('A secret is required but the shell is not interactive. Pass --value, --value-stdin, or run from a TTY.');
9
- }
10
- const { password } = await import('@inquirer/prompts');
11
- return await password({ message, mask: true });
12
- }
13
- function readStdinSync() {
14
- const chunks = [];
15
- const buf = Buffer.alloc(65536);
16
- while (true) {
17
- let bytesRead;
18
- try {
19
- bytesRead = fs.readSync(0, buf, 0, buf.length, null);
20
- }
21
- catch {
22
- break;
23
- }
24
- if (bytesRead === 0)
25
- break;
26
- chunks.push(Buffer.from(buf.subarray(0, bytesRead)));
27
- }
28
- return Buffer.concat(chunks).toString('utf-8').trim();
29
- }
30
- function renderBundleRow(b) {
31
- const entries = describeBundle(b);
32
- const keys = entries.length;
33
- const sensitive = entries.filter((e) => e.kind === 'keychain').length;
34
- return `${chalk.cyan(b.name.padEnd(20))} ${String(keys).padEnd(6)} ${chalk.yellow(String(sensitive).padEnd(10))} ${chalk.gray(b.description || '')}`;
35
- }
36
- function kindLabel(kind) {
37
- switch (kind) {
38
- case 'literal': return chalk.gray('literal');
39
- case 'keychain': return chalk.green('keychain');
40
- case 'env': return chalk.blue('env');
41
- case 'file': return chalk.magenta('file');
42
- case 'exec': return chalk.red('exec');
43
- default: return kind;
44
- }
45
- }
46
- function redact(value, reveal) {
47
- if (reveal)
48
- return value;
49
- if (!value)
50
- return '';
51
- return '*'.repeat(Math.min(value.length, 8));
52
- }
53
- export function registerSecretsCommands(program) {
54
- const cmd = program
55
- .command('secrets')
56
- .description('Named bundles of env variables backed by macOS Keychain. Inject into agents via `agents run --secrets <name>`.');
57
- cmd
58
- .command('list')
59
- .alias('ls')
60
- .description('List configured secrets bundles')
61
- .action(() => {
62
- const bundles = listBundles();
63
- if (bundles.length === 0) {
64
- console.log(chalk.gray('No secrets bundles configured.'));
65
- console.log(chalk.gray('Try: agents secrets add <name>'));
66
- return;
67
- }
68
- console.log(chalk.bold(`${'NAME'.padEnd(20)} ${'KEYS'.padEnd(6)} ${'SENSITIVE'.padEnd(10)} DESCRIPTION`));
69
- for (const b of bundles) {
70
- console.log(renderBundleRow(b));
71
- }
72
- });
73
- cmd
74
- .command('view <name>')
75
- .alias('show')
76
- .description('Show a bundle. Keychain values are masked by default — pass --reveal to see them.')
77
- .option('--reveal', 'Print keychain-backed values in the clear (TTY only unless --plaintext)')
78
- .option('--plaintext', 'Allow --reveal in non-interactive shells (use with care)')
79
- .action((name, opts) => {
80
- try {
81
- const bundle = readBundle(name);
82
- const entries = describeBundle(bundle);
83
- console.log(chalk.bold(bundle.name));
84
- if (bundle.description)
85
- console.log(chalk.gray(bundle.description));
86
- if (bundle.allow_exec)
87
- console.log(chalk.yellow('allow_exec: true'));
88
- console.log();
89
- if (entries.length === 0) {
90
- console.log(chalk.gray('(no keys)'));
91
- return;
92
- }
93
- const reveal = Boolean(opts.reveal);
94
- if (reveal && !isInteractiveTerminal() && !opts.plaintext) {
95
- console.error(chalk.red('--reveal in a non-TTY requires --plaintext.'));
96
- process.exit(1);
97
- }
98
- for (const e of entries) {
99
- if (e.kind === 'keychain') {
100
- const item = secretsKeychainItem(bundle.name, e.detail);
101
- const stored = hasKeychainToken(item);
102
- const marker = stored ? chalk.green('stored') : chalk.red('missing');
103
- let valueCol = `[keychain:${e.detail}] ${marker}`;
104
- if (reveal && stored) {
105
- try {
106
- valueCol = redact(getKeychainToken(item), true);
107
- }
108
- catch {
109
- // fall through to masked
110
- }
111
- }
112
- console.log(` ${chalk.cyan(e.key.padEnd(28))} ${kindLabel(e.kind).padEnd(18)} ${valueCol}`);
113
- }
114
- else if (e.kind === 'literal') {
115
- const raw = bundle.vars[e.key];
116
- const literalValue = typeof raw === 'string'
117
- ? raw
118
- : (raw && typeof raw === 'object' && 'value' in raw ? raw.value : '');
119
- console.log(` ${chalk.cyan(e.key.padEnd(28))} ${kindLabel(e.kind).padEnd(18)} ${literalValue}`);
120
- }
121
- else {
122
- console.log(` ${chalk.cyan(e.key.padEnd(28))} ${kindLabel(e.kind).padEnd(18)} ${e.detail}`);
123
- }
124
- }
125
- }
126
- catch (err) {
127
- console.error(chalk.red(err.message));
128
- process.exit(1);
129
- }
130
- });
131
- cmd
132
- .command('add <name>')
133
- .description('Create an empty bundle')
134
- .option('--description <text>', 'Free-form description')
135
- .option('--allow-exec', 'Allow exec: refs in this bundle (off by default)')
136
- .option('--force', 'Overwrite an existing bundle')
137
- .action((name, opts) => {
138
- try {
139
- validateBundleName(name);
140
- if (bundleExists(name) && !opts.force) {
141
- console.error(chalk.red(`Bundle '${name}' already exists. Use --force to overwrite.`));
142
- process.exit(1);
143
- }
144
- const bundle = {
145
- name,
146
- description: opts.description,
147
- allow_exec: opts.allowExec,
148
- vars: {},
149
- };
150
- writeBundle(bundle);
151
- console.log(chalk.green(`Bundle '${name}' created.`));
152
- console.log(chalk.gray(`Try: agents secrets set ${name} MY_KEY`));
153
- }
154
- catch (err) {
155
- console.error(chalk.red(err.message));
156
- process.exit(1);
157
- }
158
- });
159
- cmd
160
- .command('set <bundle> <key>')
161
- .description('Set a variable. Defaults to keychain-backed; pass --value for literal, --env/--file/--exec for refs.')
162
- .option('--value <v>', 'Store as a plaintext literal in the YAML (non-sensitive values only)')
163
- .option('--value-stdin', 'Read the value from stdin (stored in keychain unless combined with --value)')
164
- .option('--env <VAR>', 'Store as an env: ref that reads from the parent process.env at run time')
165
- .option('--file <path>', 'Store as a file: ref that reads from a file at run time')
166
- .option('--exec <cmd>', 'Store as an exec: ref that runs a command at run time (requires allow_exec)')
167
- .action(async (bundleName, key, opts) => {
168
- try {
169
- validateEnvKey(key);
170
- const bundle = readBundle(bundleName);
171
- const sources = [opts.value !== undefined, Boolean(opts.env), Boolean(opts.file), Boolean(opts.exec)].filter(Boolean).length;
172
- if (sources > 1) {
173
- throw new Error('Pick one of: --value, --env, --file, --exec.');
174
- }
175
- if (opts.env) {
176
- bundle.vars[key] = `env:${opts.env}`;
177
- writeBundle(bundle);
178
- console.log(chalk.green(`${bundleName}.${key} -> env:${opts.env}`));
179
- return;
180
- }
181
- if (opts.file) {
182
- bundle.vars[key] = `file:${opts.file}`;
183
- writeBundle(bundle);
184
- console.log(chalk.green(`${bundleName}.${key} -> file:${opts.file}`));
185
- return;
186
- }
187
- if (opts.exec) {
188
- if (!bundle.allow_exec) {
189
- throw new Error(`Bundle '${bundleName}' does not allow exec refs. Re-create with --allow-exec.`);
190
- }
191
- bundle.vars[key] = `exec:${opts.exec}`;
192
- writeBundle(bundle);
193
- console.log(chalk.green(`${bundleName}.${key} -> exec:${opts.exec}`));
194
- return;
195
- }
196
- if (opts.value !== undefined) {
197
- bundle.vars[key] = { value: opts.value };
198
- writeBundle(bundle);
199
- console.log(chalk.green(`${bundleName}.${key} = <literal>`));
200
- return;
201
- }
202
- // Default path: keychain-backed.
203
- let secretValue;
204
- if (opts.valueStdin) {
205
- secretValue = readStdinSync();
206
- if (!secretValue)
207
- throw new Error('No value received on stdin.');
208
- }
209
- else {
210
- secretValue = await promptForSecret(`Enter value for ${bundleName}.${key}`);
211
- }
212
- const item = secretsKeychainItem(bundleName, key);
213
- setKeychainToken(item, secretValue);
214
- bundle.vars[key] = keychainRef(key);
215
- writeBundle(bundle);
216
- console.log(chalk.green(`${bundleName}.${key} stored in keychain (${item}).`));
217
- }
218
- catch (err) {
219
- if (isPromptCancelled(err))
220
- return;
221
- console.error(chalk.red(err.message));
222
- process.exit(1);
223
- }
224
- });
225
- cmd
226
- .command('unset <bundle> <key>')
227
- .description('Remove a key from the bundle. Purges the keychain item if the ref was keychain:. Use --keep-secret to retain it.')
228
- .option('--keep-secret', 'Leave the keychain item in place after removing the YAML ref')
229
- .action((bundleName, key, opts) => {
230
- try {
231
- const bundle = readBundle(bundleName);
232
- if (!(key in bundle.vars)) {
233
- console.error(chalk.red(`Key '${key}' not found in bundle '${bundleName}'.`));
234
- process.exit(1);
235
- }
236
- const raw = bundle.vars[key];
237
- delete bundle.vars[key];
238
- writeBundle(bundle);
239
- if (!opts.keepSecret && typeof raw === 'string' && raw.startsWith('keychain:')) {
240
- const item = secretsKeychainItem(bundleName, raw.slice('keychain:'.length));
241
- const removed = deleteKeychainToken(item);
242
- if (removed) {
243
- console.log(chalk.green(`Removed ${bundleName}.${key} and purged keychain item.`));
244
- return;
245
- }
246
- }
247
- console.log(chalk.green(`Removed ${bundleName}.${key}.`));
248
- }
249
- catch (err) {
250
- console.error(chalk.red(err.message));
251
- process.exit(1);
252
- }
253
- });
254
- cmd
255
- .command('rm <name>')
256
- .alias('remove')
257
- .description('Delete a bundle and purge all its keychain items (use --keep-secrets to retain them).')
258
- .option('--keep-secrets', 'Leave keychain items in place after deleting the bundle file')
259
- .action((name, opts) => {
260
- try {
261
- const bundle = readBundle(name);
262
- if (!opts.keepSecrets) {
263
- for (const { item } of keychainItemsForBundle(bundle)) {
264
- deleteKeychainToken(item);
265
- }
266
- }
267
- const existed = deleteBundle(name);
268
- if (!existed) {
269
- console.error(chalk.red(`Bundle '${name}' not found.`));
270
- process.exit(1);
271
- }
272
- console.log(chalk.green(`Bundle '${name}' removed.`));
273
- }
274
- catch (err) {
275
- console.error(chalk.red(err.message));
276
- process.exit(1);
277
- }
278
- });
279
- cmd
280
- .command('import <bundle>')
281
- .description('Import keys from a .env file into a bundle. By default every key is stored in keychain.')
282
- .requiredOption('--from <path>', 'Path to a .env file')
283
- .option('--all-plaintext', 'Store every imported value as a YAML literal (skip keychain prompts)')
284
- .option('--force', 'Overwrite an existing key in the bundle')
285
- .action((bundleName, opts) => {
286
- try {
287
- const bundle = readBundle(bundleName);
288
- const raw = fs.readFileSync(opts.from, 'utf-8');
289
- const pairs = parseDotenv(raw);
290
- let added = 0;
291
- let skipped = 0;
292
- for (const [key, value] of Object.entries(pairs)) {
293
- if (!opts.force && key in bundle.vars) {
294
- skipped++;
295
- continue;
296
- }
297
- if (opts.allPlaintext) {
298
- bundle.vars[key] = { value };
299
- }
300
- else {
301
- const item = secretsKeychainItem(bundleName, key);
302
- setKeychainToken(item, value);
303
- bundle.vars[key] = keychainRef(key);
304
- }
305
- added++;
306
- }
307
- writeBundle(bundle);
308
- console.log(chalk.green(`Imported ${added} key(s)${skipped ? `, skipped ${skipped} (already set, pass --force)` : ''}.`));
309
- }
310
- catch (err) {
311
- console.error(chalk.red(err.message));
312
- process.exit(1);
313
- }
314
- });
315
- cmd
316
- .command('export <bundle>')
317
- .description('Resolve a bundle and print KEY=VALUE lines (for `eval "$(agents secrets export prod)"`). Refuses on a TTY unless --plaintext.')
318
- .option('--plaintext', 'Acknowledge that the resolved values will be printed in the clear')
319
- .action(async (bundleName, opts) => {
320
- try {
321
- const { resolveBundleEnv } = await import('../lib/secrets-bundles.js');
322
- const bundle = readBundle(bundleName);
323
- if (isInteractiveTerminal() && !opts.plaintext) {
324
- console.error(chalk.red('export to a TTY requires --plaintext (prevents shoulder-surfing).'));
325
- process.exit(1);
326
- }
327
- const env = resolveBundleEnv(bundle);
328
- for (const [k, v] of Object.entries(env)) {
329
- const escaped = v.replace(/'/g, `'\\''`);
330
- process.stdout.write(`export ${k}='${escaped}'\n`);
331
- }
332
- }
333
- catch (err) {
334
- console.error(chalk.red(err.message));
335
- process.exit(1);
336
- }
337
- });
338
- }
339
- //# sourceMappingURL=secrets.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/commands/secrets.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=rotate.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rotate.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/rotate.test.ts"],"names":[],"mappings":""}
@@ -1,80 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { pickRotateCandidate } from '../rotate.js';
3
- function cand(overrides) {
4
- return {
5
- agent: 'claude',
6
- version: '0.0.0',
7
- email: 'a@b.com',
8
- usageStatus: 'available',
9
- authValid: true,
10
- lastActive: new Date('2026-01-01T00:00:00Z'),
11
- ...overrides,
12
- };
13
- }
14
- describe('pickRotateCandidate', () => {
15
- it('returns null when nothing is signed in', () => {
16
- const result = pickRotateCandidate([
17
- cand({ version: '1.0.0', email: null }),
18
- cand({ version: '2.0.0', email: null }),
19
- ]);
20
- expect(result).toBeNull();
21
- });
22
- it('returns null when every signed-in account is out of credits', () => {
23
- const result = pickRotateCandidate([
24
- cand({ version: '1.0.0', usageStatus: 'out_of_credits' }),
25
- cand({ version: '2.0.0', usageStatus: 'out_of_credits' }),
26
- ]);
27
- expect(result).toBeNull();
28
- });
29
- it('returns null for an empty list', () => {
30
- expect(pickRotateCandidate([])).toBeNull();
31
- });
32
- it('picks the least-recently-active healthy candidate', () => {
33
- const newest = cand({ version: '2.1.113', lastActive: new Date('2026-04-20T10:00:00Z') });
34
- const middle = cand({ version: '2.1.112', lastActive: new Date('2026-04-20T05:00:00Z') });
35
- const oldest = cand({ version: '2.1.92', lastActive: new Date('2026-04-16T00:00:00Z') });
36
- const result = pickRotateCandidate([newest, middle, oldest]);
37
- expect(result).not.toBeNull();
38
- expect(result.picked.version).toBe('2.1.92');
39
- expect(result.healthy.map((c) => c.version)).toEqual(['2.1.92', '2.1.112', '2.1.113']);
40
- });
41
- it('treats never-used versions (null lastActive) as oldest', () => {
42
- const used = cand({ version: '2.1.113', lastActive: new Date('2026-04-20T10:00:00Z') });
43
- const fresh = cand({ version: '2.1.120', lastActive: null });
44
- const result = pickRotateCandidate([used, fresh]);
45
- expect(result.picked.version).toBe('2.1.120');
46
- });
47
- it('excludes out-of-credits but keeps them reported', () => {
48
- const healthy = cand({ version: '2.1.113', lastActive: new Date('2026-04-20T10:00:00Z') });
49
- const dead = cand({ version: '2.1.85', usageStatus: 'out_of_credits', lastActive: new Date('2026-04-15T00:00:00Z') });
50
- const result = pickRotateCandidate([healthy, dead]);
51
- expect(result.picked.version).toBe('2.1.113');
52
- expect(result.healthy).toHaveLength(1);
53
- expect(result.excluded).toHaveLength(1);
54
- expect(result.excluded[0].version).toBe('2.1.85');
55
- });
56
- it('excludes not-signed-in versions (fresh installs with no auth)', () => {
57
- const healthy = cand({ version: '2.1.113' });
58
- const notAuthed = cand({ version: '2.1.120', email: null, lastActive: null });
59
- const result = pickRotateCandidate([healthy, notAuthed]);
60
- expect(result.picked.version).toBe('2.1.113');
61
- expect(result.excluded).toHaveLength(1);
62
- });
63
- it('excludes accounts with invalid auth tokens', () => {
64
- const valid = cand({ version: '2.1.110', lastActive: new Date('2026-04-20T10:00:00Z') });
65
- const expired = cand({ version: '2.1.112', authValid: false, lastActive: new Date('2026-04-15T00:00:00Z') });
66
- const result = pickRotateCandidate([valid, expired]);
67
- expect(result.picked.version).toBe('2.1.110');
68
- expect(result.healthy).toHaveLength(1);
69
- expect(result.excluded).toHaveLength(1);
70
- expect(result.excluded[0].version).toBe('2.1.112');
71
- });
72
- it('treats rate_limited as healthy (transient, not exhausted)', () => {
73
- const rateLimited = cand({ version: '2.1.113', usageStatus: 'rate_limited', lastActive: new Date('2026-04-15T00:00:00Z') });
74
- const newer = cand({ version: '2.1.112', lastActive: new Date('2026-04-20T10:00:00Z') });
75
- const result = pickRotateCandidate([rateLimited, newer]);
76
- expect(result.picked.version).toBe('2.1.113');
77
- expect(result.healthy).toHaveLength(2);
78
- });
79
- });
80
- //# sourceMappingURL=rotate.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rotate.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/rotate.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=secrets-bundles.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"secrets-bundles.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/secrets-bundles.test.ts"],"names":[],"mappings":""}
@@ -1,104 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import * as fs from 'fs';
3
- import * as os from 'os';
4
- import * as path from 'path';
5
- import { describeBundle, keychainItemsForBundle, parseDotenv, resolveBundleEnv, validateBundleName, validateEnvKey, } from '../secrets-bundles.js';
6
- // Redirect the secrets dir into a per-test tmp path so nothing touches the
7
- // real ~/.agents/secrets. The state module reads HOME at import time, so we
8
- // shim getSecretsDir via a mock-friendly env override.
9
- const originalHome = process.env.HOME;
10
- let tmpHome;
11
- beforeEach(() => {
12
- tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'agents-secrets-test-'));
13
- process.env.HOME = tmpHome;
14
- // state.ts captured HOME at module load; reset its module cache so
15
- // getSecretsDir picks up the new HOME for every test run.
16
- // eslint-disable-next-line @typescript-eslint/no-require-imports
17
- });
18
- afterEach(() => {
19
- if (originalHome !== undefined)
20
- process.env.HOME = originalHome;
21
- fs.rmSync(tmpHome, { recursive: true, force: true });
22
- });
23
- describe('validation', () => {
24
- it('validateBundleName accepts lowercase letters, digits, dash, underscore', () => {
25
- expect(() => validateBundleName('prod-stripe_1')).not.toThrow();
26
- expect(() => validateBundleName('A')).not.toThrow();
27
- });
28
- it('validateBundleName rejects names starting with a special char', () => {
29
- expect(() => validateBundleName('-bad')).toThrow();
30
- expect(() => validateBundleName('_bad')).toThrow();
31
- });
32
- it('validateEnvKey matches parseExecEnv conventions', () => {
33
- expect(() => validateEnvKey('MY_KEY')).not.toThrow();
34
- expect(() => validateEnvKey('_private')).not.toThrow();
35
- expect(() => validateEnvKey('1starts_with_digit')).toThrow();
36
- expect(() => validateEnvKey('KEY-WITH-DASH')).toThrow();
37
- });
38
- });
39
- describe('parseDotenv', () => {
40
- it('parses simple KEY=VALUE lines', () => {
41
- expect(parseDotenv('A=1\nB=two')).toEqual({ A: '1', B: 'two' });
42
- });
43
- it('skips comments and blank lines', () => {
44
- expect(parseDotenv('# comment\n\nA=1\n')).toEqual({ A: '1' });
45
- });
46
- it('strips matching quotes around values', () => {
47
- expect(parseDotenv('A="quoted"\nB=\'quoted2\'')).toEqual({ A: 'quoted', B: 'quoted2' });
48
- });
49
- it('accepts `export` prefix', () => {
50
- expect(parseDotenv('export GH_TOKEN=abc')).toEqual({ GH_TOKEN: 'abc' });
51
- });
52
- it('last-wins on duplicate keys', () => {
53
- expect(parseDotenv('A=1\nA=2')).toEqual({ A: '2' });
54
- });
55
- it('ignores invalid key names', () => {
56
- expect(parseDotenv('1BAD=x\nA=1')).toEqual({ A: '1' });
57
- });
58
- });
59
- describe('describeBundle + resolveBundleEnv', () => {
60
- function b(vars, extra = {}) {
61
- return { name: 'unit', vars, ...extra };
62
- }
63
- it('classifies each var by kind', () => {
64
- const bundle = b({
65
- A: 'literal-val',
66
- B: 'keychain:MY_KEY',
67
- C: 'env:HOME',
68
- D: 'file:/tmp/x',
69
- E: 'exec:echo hi',
70
- F: { value: 'keychain:escaped' },
71
- });
72
- const info = describeBundle(bundle);
73
- const byKey = Object.fromEntries(info.map((e) => [e.key, e.kind]));
74
- expect(byKey).toEqual({
75
- A: 'literal',
76
- B: 'keychain',
77
- C: 'env',
78
- D: 'file',
79
- E: 'exec',
80
- F: 'literal',
81
- });
82
- });
83
- it('resolveBundleEnv inlines literals and resolves env: refs', () => {
84
- process.env.__AGENTS_RESOLVE_TEST = 'resolved-value';
85
- const bundle = b({ STATIC: 'x', DYN: 'env:__AGENTS_RESOLVE_TEST' });
86
- expect(resolveBundleEnv(bundle)).toEqual({ STATIC: 'x', DYN: 'resolved-value' });
87
- });
88
- it('resolveBundleEnv wraps missing-keychain errors with the remediation hint', () => {
89
- const bundle = b({ MISSING: 'keychain:NEVER_SET' });
90
- expect(() => resolveBundleEnv(bundle)).toThrow(/agents secrets set unit MISSING/);
91
- });
92
- it('keychainItemsForBundle enumerates keychain-backed keys only', () => {
93
- const bundle = b({
94
- A: 'literal',
95
- B: 'keychain:KEY_B',
96
- C: 'env:SHELL',
97
- D: 'keychain:KEY_D',
98
- });
99
- const items = keychainItemsForBundle(bundle);
100
- expect(items.map((i) => i.key).sort()).toEqual(['B', 'D']);
101
- expect(items.find((i) => i.key === 'B')?.item).toBe('agents-cli.secrets.unit.KEY_B');
102
- });
103
- });
104
- //# sourceMappingURL=secrets-bundles.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"secrets-bundles.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/secrets-bundles.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=secrets.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"secrets.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/secrets.test.ts"],"names":[],"mappings":""}