@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.
- package/README.md +14 -96
- package/dist/commands/exec.d.ts.map +1 -1
- package/dist/commands/exec.js +17 -135
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/models.d.ts.map +1 -1
- package/dist/commands/models.js +3 -30
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +3 -37
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/sessions.d.ts.map +1 -1
- package/dist/commands/sessions.js +0 -100
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +2 -42
- package/dist/commands/view.js.map +1 -1
- package/dist/index.js +8 -37
- package/dist/index.js.map +1 -1
- package/dist/lib/__tests__/hooks.test.js +2 -2
- package/dist/lib/__tests__/hooks.test.js.map +1 -1
- package/dist/lib/__tests__/models.test.js +1 -56
- package/dist/lib/__tests__/models.test.js.map +1 -1
- package/dist/lib/__tests__/usage.test.js +2 -4
- package/dist/lib/__tests__/usage.test.js.map +1 -1
- package/dist/lib/agents.d.ts.map +1 -1
- package/dist/lib/agents.js +2 -10
- package/dist/lib/agents.js.map +1 -1
- package/dist/lib/exec.d.ts +1 -4
- package/dist/lib/exec.d.ts.map +1 -1
- package/dist/lib/exec.js +15 -24
- package/dist/lib/exec.js.map +1 -1
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +1 -153
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/models.d.ts +10 -18
- package/dist/lib/models.d.ts.map +1 -1
- package/dist/lib/models.js +12 -380
- package/dist/lib/models.js.map +1 -1
- package/dist/lib/session/types.d.ts +0 -8
- package/dist/lib/session/types.d.ts.map +1 -1
- package/dist/lib/shims.d.ts +2 -31
- package/dist/lib/shims.d.ts.map +1 -1
- package/dist/lib/shims.js +24 -75
- package/dist/lib/shims.js.map +1 -1
- package/dist/lib/state.d.ts +0 -7
- package/dist/lib/state.d.ts.map +1 -1
- package/dist/lib/state.js +1 -14
- package/dist/lib/state.js.map +1 -1
- package/dist/lib/usage.d.ts +0 -16
- package/dist/lib/usage.d.ts.map +1 -1
- package/dist/lib/usage.js +10 -27
- package/dist/lib/usage.js.map +1 -1
- package/dist/lib/versions.d.ts +1 -7
- package/dist/lib/versions.d.ts.map +1 -1
- package/dist/lib/versions.js +8 -30
- package/dist/lib/versions.js.map +1 -1
- package/package.json +2 -2
- package/dist/commands/cloud.d.ts +0 -3
- package/dist/commands/cloud.d.ts.map +0 -1
- package/dist/commands/cloud.js +0 -322
- package/dist/commands/cloud.js.map +0 -1
- package/dist/commands/profiles.d.ts +0 -3
- package/dist/commands/profiles.d.ts.map +0 -1
- package/dist/commands/profiles.js +0 -242
- package/dist/commands/profiles.js.map +0 -1
- package/dist/commands/secrets.d.ts +0 -3
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js +0 -339
- package/dist/commands/secrets.js.map +0 -1
- package/dist/lib/__tests__/rotate.test.d.ts +0 -2
- package/dist/lib/__tests__/rotate.test.d.ts.map +0 -1
- package/dist/lib/__tests__/rotate.test.js +0 -80
- package/dist/lib/__tests__/rotate.test.js.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.js +0 -104
- package/dist/lib/__tests__/secrets-bundles.test.js.map +0 -1
- package/dist/lib/__tests__/secrets.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets.test.js +0 -90
- package/dist/lib/__tests__/secrets.test.js.map +0 -1
- package/dist/lib/__tests__/shims.test.d.ts +0 -2
- package/dist/lib/__tests__/shims.test.d.ts.map +0 -1
- package/dist/lib/__tests__/shims.test.js +0 -39
- package/dist/lib/__tests__/shims.test.js.map +0 -1
- package/dist/lib/__tests__/versions.test.d.ts +0 -2
- package/dist/lib/__tests__/versions.test.d.ts.map +0 -1
- package/dist/lib/__tests__/versions.test.js +0 -63
- package/dist/lib/__tests__/versions.test.js.map +0 -1
- package/dist/lib/cloud/codex.d.ts +0 -19
- package/dist/lib/cloud/codex.d.ts.map +0 -1
- package/dist/lib/cloud/codex.js +0 -210
- package/dist/lib/cloud/codex.js.map +0 -1
- package/dist/lib/cloud/factory.d.ts +0 -26
- package/dist/lib/cloud/factory.d.ts.map +0 -1
- package/dist/lib/cloud/factory.js +0 -37
- package/dist/lib/cloud/factory.js.map +0 -1
- package/dist/lib/cloud/registry.d.ts +0 -6
- package/dist/lib/cloud/registry.d.ts.map +0 -1
- package/dist/lib/cloud/registry.js +0 -56
- package/dist/lib/cloud/registry.js.map +0 -1
- package/dist/lib/cloud/rush.d.ts +0 -15
- package/dist/lib/cloud/rush.d.ts.map +0 -1
- package/dist/lib/cloud/rush.js +0 -185
- package/dist/lib/cloud/rush.js.map +0 -1
- package/dist/lib/cloud/store.d.ts +0 -10
- package/dist/lib/cloud/store.d.ts.map +0 -1
- package/dist/lib/cloud/store.js +0 -96
- package/dist/lib/cloud/store.js.map +0 -1
- package/dist/lib/cloud/stream.d.ts +0 -18
- package/dist/lib/cloud/stream.d.ts.map +0 -1
- package/dist/lib/cloud/stream.js +0 -138
- package/dist/lib/cloud/stream.js.map +0 -1
- package/dist/lib/cloud/types.d.ts +0 -60
- package/dist/lib/cloud/types.d.ts.map +0 -1
- package/dist/lib/cloud/types.js +0 -2
- package/dist/lib/cloud/types.js.map +0 -1
- package/dist/lib/profiles-keychain.d.ts +0 -3
- package/dist/lib/profiles-keychain.d.ts.map +0 -1
- package/dist/lib/profiles-keychain.js +0 -10
- package/dist/lib/profiles-keychain.js.map +0 -1
- package/dist/lib/profiles-presets.d.ts +0 -15
- package/dist/lib/profiles-presets.d.ts.map +0 -1
- package/dist/lib/profiles-presets.js +0 -95
- package/dist/lib/profiles-presets.js.map +0 -1
- package/dist/lib/profiles.d.ts +0 -35
- package/dist/lib/profiles.d.ts.map +0 -1
- package/dist/lib/profiles.js +0 -123
- package/dist/lib/profiles.js.map +0 -1
- package/dist/lib/rotate.d.ts +0 -52
- package/dist/lib/rotate.d.ts.map +0 -1
- package/dist/lib/rotate.js +0 -87
- package/dist/lib/rotate.js.map +0 -1
- package/dist/lib/secrets-bundles.d.ts +0 -29
- package/dist/lib/secrets-bundles.d.ts.map +0 -1
- package/dist/lib/secrets-bundles.js +0 -168
- package/dist/lib/secrets-bundles.js.map +0 -1
- package/dist/lib/secrets.d.ts +0 -27
- package/dist/lib/secrets.d.ts.map +0 -1
- package/dist/lib/secrets.js +0 -127
- package/dist/lib/secrets.js.map +0 -1
- package/dist/lib/session/artifacts.d.ts +0 -5
- package/dist/lib/session/artifacts.d.ts.map +0 -1
- package/dist/lib/session/artifacts.js +0 -75
- package/dist/lib/session/artifacts.js.map +0 -1
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
// Model IDs verified against openrouter.ai/api/v1/models on 2026-04-20.
|
|
2
|
-
// Presets target the top-ranked open-source model per provider based on
|
|
3
|
-
// SWE-bench Verified, LiveCodeBench, HumanEval, and Chatbot Arena rankings.
|
|
4
|
-
//
|
|
5
|
-
// Important limitation of Claude Code + non-Anthropic models via OpenRouter:
|
|
6
|
-
// Claude Code sends `thinking:{type:"enabled"}` in its Anthropic payload by
|
|
7
|
-
// default, and its `--print` consolidation returns empty text when a response
|
|
8
|
-
// contains thinking/redacted_thinking blocks — even when the model *also*
|
|
9
|
-
// emits a text block. This means reasoning models work fine in interactive
|
|
10
|
-
// `claude` mode (same env vars) but `agents run <profile> --print` sees
|
|
11
|
-
// empty stdout.
|
|
12
|
-
//
|
|
13
|
-
// Presets flagged "print-safe" use non-reasoning variants that ignore
|
|
14
|
-
// thinking:enabled. Presets flagged "reasoning" are the leaderboard leaders
|
|
15
|
-
// but are best invoked interactively.
|
|
16
|
-
const OPENROUTER_BASE = 'https://openrouter.ai/api';
|
|
17
|
-
const OPENROUTER_AUTH = {
|
|
18
|
-
provider: 'openrouter',
|
|
19
|
-
host: 'claude',
|
|
20
|
-
authEnvVar: 'ANTHROPIC_AUTH_TOKEN',
|
|
21
|
-
signupUrl: 'https://openrouter.ai/keys',
|
|
22
|
-
};
|
|
23
|
-
export const PRESETS = [
|
|
24
|
-
// ----- Top coding (via OpenRouter) -----
|
|
25
|
-
{
|
|
26
|
-
name: 'kimi',
|
|
27
|
-
description: 'Kimi K2.5 via OpenRouter (262K ctx, $0.38/$1.72 per 1M). Top Kimi: 99% HumanEval, 76.8% SWE-bench. REASONING — works interactively, but `agents run --print` returns empty stdout. Use `kimi-chat` preset for scripting.',
|
|
28
|
-
...OPENROUTER_AUTH,
|
|
29
|
-
env: {
|
|
30
|
-
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
31
|
-
ANTHROPIC_MODEL: 'moonshotai/kimi-k2.5',
|
|
32
|
-
ANTHROPIC_SMALL_FAST_MODEL: 'moonshotai/kimi-k2.5',
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: 'kimi-chat',
|
|
37
|
-
description: 'Kimi K2 0905 via OpenRouter (262K ctx, $0.40/$2.00 per 1M). Non-reasoning sibling of K2.5 — slightly older but PRINT-SAFE, works end-to-end with `agents run --print` and in scripts/automation.',
|
|
38
|
-
...OPENROUTER_AUTH,
|
|
39
|
-
env: {
|
|
40
|
-
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
41
|
-
ANTHROPIC_MODEL: 'moonshotai/kimi-k2-0905',
|
|
42
|
-
ANTHROPIC_SMALL_FAST_MODEL: 'moonshotai/kimi-k2-0905',
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
name: 'minimax',
|
|
47
|
-
description: 'MiniMax M2.5 via OpenRouter (230B params). #1 SWE-bench Verified (80.2%) on Apr 2026 leaderboards. REASONING — works interactively, --print returns empty.',
|
|
48
|
-
...OPENROUTER_AUTH,
|
|
49
|
-
env: {
|
|
50
|
-
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
51
|
-
ANTHROPIC_MODEL: 'minimax/minimax-m2.5',
|
|
52
|
-
ANTHROPIC_SMALL_FAST_MODEL: 'minimax/minimax-m2.5',
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
name: 'glm',
|
|
57
|
-
description: 'GLM 5 via OpenRouter (80K ctx, $0.72/$2.30 per 1M). #1 Chatbot Arena ELO (1451) among open-weight models on BenchLM.ai (Apr 2026). Prompt-complexity-dependent reasoning — Claude Code\'s 38K system prompt typically triggers thinking blocks, so --print is unreliable. Interactive use is fine.',
|
|
58
|
-
...OPENROUTER_AUTH,
|
|
59
|
-
env: {
|
|
60
|
-
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
61
|
-
ANTHROPIC_MODEL: 'z-ai/glm-5',
|
|
62
|
-
ANTHROPIC_SMALL_FAST_MODEL: 'z-ai/glm-5',
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
name: 'qwen',
|
|
67
|
-
description: 'Qwen3 Coder Next via OpenRouter (256K ctx, $0.15/$0.80 per 1M, sparse MoE 80B/3B active). Latest coding-specific Qwen (Feb 2026). PRINT-SAFE — works with `agents run --print`.',
|
|
68
|
-
...OPENROUTER_AUTH,
|
|
69
|
-
env: {
|
|
70
|
-
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
71
|
-
ANTHROPIC_MODEL: 'qwen/qwen3-coder-next',
|
|
72
|
-
ANTHROPIC_SMALL_FAST_MODEL: 'qwen/qwen3-coder-next',
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
name: 'deepseek',
|
|
77
|
-
description: 'DeepSeek Chat V3 (0324) via OpenRouter. Latest DeepSeek Chat variant that ignores thinking:enabled. PRINT-SAFE. The newer V3.2 / V3.1-Terminus / V3.2-Speciale are reasoning variants — use `--model deepseek/deepseek-v3.2` to override if you want those for interactive use.',
|
|
78
|
-
...OPENROUTER_AUTH,
|
|
79
|
-
env: {
|
|
80
|
-
ANTHROPIC_BASE_URL: OPENROUTER_BASE,
|
|
81
|
-
ANTHROPIC_MODEL: 'deepseek/deepseek-chat-v3-0324',
|
|
82
|
-
ANTHROPIC_SMALL_FAST_MODEL: 'deepseek/deepseek-chat-v3-0324',
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
];
|
|
86
|
-
export function getPreset(name) {
|
|
87
|
-
return PRESETS.find((p) => p.name === name);
|
|
88
|
-
}
|
|
89
|
-
export function listPresets() {
|
|
90
|
-
return [...PRESETS];
|
|
91
|
-
}
|
|
92
|
-
export function listProviders() {
|
|
93
|
-
return [...new Set(PRESETS.map((p) => p.provider))];
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=profiles-presets.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiles-presets.js","sourceRoot":"","sources":["../../src/lib/profiles-presets.ts"],"names":[],"mappings":"AAYA,wEAAwE;AACxE,wEAAwE;AACxE,4EAA4E;AAC5E,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAC1E,2EAA2E;AAC3E,wEAAwE;AACxE,gBAAgB;AAChB,EAAE;AACF,sEAAsE;AACtE,4EAA4E;AAC5E,sCAAsC;AAEtC,MAAM,eAAe,GAAG,2BAA2B,CAAC;AACpD,MAAM,eAAe,GAAmE;IACtF,QAAQ,EAAE,YAAY;IACtB,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,sBAAsB;IAClC,SAAS,EAAE,4BAA4B;CACxC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAa;IAC/B,0CAA0C;IAC1C;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,0NAA0N;QACvO,GAAG,eAAe;QAClB,GAAG,EAAE;YACH,kBAAkB,EAAE,eAAe;YACnC,eAAe,EAAE,sBAAsB;YACvC,0BAA0B,EAAE,sBAAsB;SACnD;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,kMAAkM;QAC/M,GAAG,eAAe;QAClB,GAAG,EAAE;YACH,kBAAkB,EAAE,eAAe;YACnC,eAAe,EAAE,yBAAyB;YAC1C,0BAA0B,EAAE,yBAAyB;SACtD;KACF;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,4JAA4J;QACzK,GAAG,eAAe;QAClB,GAAG,EAAE;YACH,kBAAkB,EAAE,eAAe;YACnC,eAAe,EAAE,sBAAsB;YACvC,0BAA0B,EAAE,sBAAsB;SACnD;KACF;IACD;QACE,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,oSAAoS;QACjT,GAAG,eAAe;QAClB,GAAG,EAAE;YACH,kBAAkB,EAAE,eAAe;YACnC,eAAe,EAAE,YAAY;YAC7B,0BAA0B,EAAE,YAAY;SACzC;KACF;IACD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,iLAAiL;QAC9L,GAAG,eAAe;QAClB,GAAG,EAAE;YACH,kBAAkB,EAAE,eAAe;YACnC,eAAe,EAAE,uBAAuB;YACxC,0BAA0B,EAAE,uBAAuB;SACpD;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,iRAAiR;QAC9R,GAAG,eAAe;QAClB,GAAG,EAAE;YACH,kBAAkB,EAAE,eAAe;YACnC,eAAe,EAAE,gCAAgC;YACjD,0BAA0B,EAAE,gCAAgC;SAC7D;KACF;CACF,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC"}
|
package/dist/lib/profiles.d.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { AgentId } from './types.js';
|
|
2
|
-
import { type Preset } from './profiles-presets.js';
|
|
3
|
-
export interface Profile {
|
|
4
|
-
name: string;
|
|
5
|
-
host: {
|
|
6
|
-
agent: AgentId;
|
|
7
|
-
version?: string;
|
|
8
|
-
};
|
|
9
|
-
env: Record<string, string>;
|
|
10
|
-
auth?: {
|
|
11
|
-
envVar: string;
|
|
12
|
-
keychainItem: string;
|
|
13
|
-
};
|
|
14
|
-
description?: string;
|
|
15
|
-
preset?: string;
|
|
16
|
-
provider?: string;
|
|
17
|
-
}
|
|
18
|
-
export declare function getProfilesDir(): string;
|
|
19
|
-
export declare function validateProfileName(name: string): void;
|
|
20
|
-
export declare function profileExists(name: string): boolean;
|
|
21
|
-
export declare function readProfile(name: string): Profile;
|
|
22
|
-
export declare function writeProfile(profile: Profile): void;
|
|
23
|
-
export declare function deleteProfile(name: string): boolean;
|
|
24
|
-
export declare function listProfiles(): Profile[];
|
|
25
|
-
export declare function profileFromPreset(profileName: string, preset: Preset, version?: string): Profile;
|
|
26
|
-
export declare function resolveProfileEnv(profile: Profile): Record<string, string>;
|
|
27
|
-
export interface ResolvedProfileRun {
|
|
28
|
-
agent: AgentId;
|
|
29
|
-
version?: string;
|
|
30
|
-
env: Record<string, string>;
|
|
31
|
-
profileName: string;
|
|
32
|
-
}
|
|
33
|
-
export declare function resolveProfileForRun(name: string): ResolvedProfileRun;
|
|
34
|
-
export declare function getPresetForProfile(profile: Profile): Preset | undefined;
|
|
35
|
-
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/lib/profiles.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAItD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmBjD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CASnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMnD;AAED,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAcxC;AAKD,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAahG;AAKD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO1E;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAKD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAQrE;AAID,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAExE"}
|
package/dist/lib/profiles.js
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import * as path from 'path';
|
|
3
|
-
import * as yaml from 'yaml';
|
|
4
|
-
import { getAgentsDir } from './state.js';
|
|
5
|
-
import { getKeychainToken, keychainItemName } from './profiles-keychain.js';
|
|
6
|
-
import { getPreset } from './profiles-presets.js';
|
|
7
|
-
const PROFILE_NAME_PATTERN = /^[a-z0-9][a-z0-9-_]{0,48}$/i;
|
|
8
|
-
export function getProfilesDir() {
|
|
9
|
-
return path.join(getAgentsDir(), 'profiles');
|
|
10
|
-
}
|
|
11
|
-
function profilePath(name) {
|
|
12
|
-
return path.join(getProfilesDir(), `${name}.yml`);
|
|
13
|
-
}
|
|
14
|
-
export function validateProfileName(name) {
|
|
15
|
-
if (!PROFILE_NAME_PATTERN.test(name)) {
|
|
16
|
-
throw new Error(`Invalid profile name '${name}'. Use letters, digits, dash, underscore (max 48 chars).`);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export function profileExists(name) {
|
|
20
|
-
return fs.existsSync(profilePath(name));
|
|
21
|
-
}
|
|
22
|
-
export function readProfile(name) {
|
|
23
|
-
validateProfileName(name);
|
|
24
|
-
const file = profilePath(name);
|
|
25
|
-
if (!fs.existsSync(file)) {
|
|
26
|
-
throw new Error(`Profile '${name}' not found.`);
|
|
27
|
-
}
|
|
28
|
-
const raw = fs.readFileSync(file, 'utf-8');
|
|
29
|
-
const parsed = yaml.parse(raw);
|
|
30
|
-
if (!parsed || typeof parsed !== 'object') {
|
|
31
|
-
throw new Error(`Profile '${name}' is malformed.`);
|
|
32
|
-
}
|
|
33
|
-
if (!parsed.name)
|
|
34
|
-
parsed.name = name;
|
|
35
|
-
if (!parsed.host?.agent) {
|
|
36
|
-
throw new Error(`Profile '${name}' is missing host.agent.`);
|
|
37
|
-
}
|
|
38
|
-
if (!parsed.env || typeof parsed.env !== 'object') {
|
|
39
|
-
parsed.env = {};
|
|
40
|
-
}
|
|
41
|
-
return parsed;
|
|
42
|
-
}
|
|
43
|
-
export function writeProfile(profile) {
|
|
44
|
-
validateProfileName(profile.name);
|
|
45
|
-
const dir = getProfilesDir();
|
|
46
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
47
|
-
const body = yaml.stringify(profile);
|
|
48
|
-
const file = profilePath(profile.name);
|
|
49
|
-
const tmp = `${file}.tmp-${process.pid}`;
|
|
50
|
-
fs.writeFileSync(tmp, body, 'utf-8');
|
|
51
|
-
fs.renameSync(tmp, file);
|
|
52
|
-
}
|
|
53
|
-
export function deleteProfile(name) {
|
|
54
|
-
validateProfileName(name);
|
|
55
|
-
const file = profilePath(name);
|
|
56
|
-
if (!fs.existsSync(file))
|
|
57
|
-
return false;
|
|
58
|
-
fs.unlinkSync(file);
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
export function listProfiles() {
|
|
62
|
-
const dir = getProfilesDir();
|
|
63
|
-
if (!fs.existsSync(dir))
|
|
64
|
-
return [];
|
|
65
|
-
const entries = fs.readdirSync(dir).filter((f) => f.endsWith('.yml') || f.endsWith('.yaml'));
|
|
66
|
-
const profiles = [];
|
|
67
|
-
for (const entry of entries) {
|
|
68
|
-
const name = entry.replace(/\.(yml|yaml)$/, '');
|
|
69
|
-
try {
|
|
70
|
-
profiles.push(readProfile(name));
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
// Skip malformed profile files; surfacing via `agents profiles view <name>`.
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return profiles.sort((a, b) => a.name.localeCompare(b.name));
|
|
77
|
-
}
|
|
78
|
-
// Build a profile from a preset. The keychain item is shared across all
|
|
79
|
-
// profiles that point at the same provider, so adding kimi + deepseek prompts
|
|
80
|
-
// for the OpenRouter key exactly once.
|
|
81
|
-
export function profileFromPreset(profileName, preset, version) {
|
|
82
|
-
return {
|
|
83
|
-
name: profileName,
|
|
84
|
-
host: { agent: preset.host, version },
|
|
85
|
-
env: { ...preset.env },
|
|
86
|
-
auth: {
|
|
87
|
-
envVar: preset.authEnvVar,
|
|
88
|
-
keychainItem: keychainItemName(preset.provider),
|
|
89
|
-
},
|
|
90
|
-
description: preset.description,
|
|
91
|
-
preset: preset.name,
|
|
92
|
-
provider: preset.provider,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
// Resolve a profile into the env block that should be injected into the
|
|
96
|
-
// spawned agent process. Reads the token from keychain at exec time so the
|
|
97
|
-
// profile YAML never holds secrets.
|
|
98
|
-
export function resolveProfileEnv(profile) {
|
|
99
|
-
const env = { ...profile.env };
|
|
100
|
-
if (profile.auth) {
|
|
101
|
-
const token = getKeychainToken(profile.auth.keychainItem);
|
|
102
|
-
env[profile.auth.envVar] = token;
|
|
103
|
-
}
|
|
104
|
-
return env;
|
|
105
|
-
}
|
|
106
|
-
// Resolve a name into (agent, version, env). Throws if the name is not a
|
|
107
|
-
// profile. Callers are expected to try agent-id resolution first and fall
|
|
108
|
-
// back to this when that fails, so we don't need a "isProfile" probe.
|
|
109
|
-
export function resolveProfileForRun(name) {
|
|
110
|
-
const profile = readProfile(name);
|
|
111
|
-
return {
|
|
112
|
-
agent: profile.host.agent,
|
|
113
|
-
version: profile.host.version,
|
|
114
|
-
env: resolveProfileEnv(profile),
|
|
115
|
-
profileName: profile.name,
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
// Look up the preset a profile was created from, if any. Used by
|
|
119
|
-
// `profiles view` to show upstream metadata like signup URLs.
|
|
120
|
-
export function getPresetForProfile(profile) {
|
|
121
|
-
return profile.preset ? getPreset(profile.preset) : undefined;
|
|
122
|
-
}
|
|
123
|
-
//# sourceMappingURL=profiles.js.map
|
package/dist/lib/profiles.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/lib/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAe,MAAM,uBAAuB,CAAC;AAkB/D,MAAM,oBAAoB,GAAG,6BAA6B,CAAC;AAE3D,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,0DAA0D,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,cAAc,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IAC1C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,iBAAiB,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,0BAA0B,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7F,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,6EAA6E;QAC/E,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,wEAAwE;AACxE,8EAA8E;AAC9E,uCAAuC;AACvC,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,MAAc,EAAE,OAAgB;IACrF,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE;QACrC,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE;QACtB,IAAI,EAAE;YACJ,MAAM,EAAE,MAAM,CAAC,UAAU;YACzB,YAAY,EAAE,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC;SAChD;QACD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,2EAA2E;AAC3E,oCAAoC;AACpC,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,GAAG,GAA2B,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACvD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1D,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;IACnC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AASD,yEAAyE;AACzE,0EAA0E;AAC1E,sEAAsE;AACtE,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK;QACzB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO;QAC7B,GAAG,EAAE,iBAAiB,CAAC,OAAO,CAAC;QAC/B,WAAW,EAAE,OAAO,CAAC,IAAI;KAC1B,CAAC;AACJ,CAAC;AAED,iEAAiE;AACjE,8DAA8D;AAC9D,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChE,CAAC"}
|
package/dist/lib/rotate.d.ts
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import type { AgentId } from './types.js';
|
|
2
|
-
import { type AccountInfo } from './agents.js';
|
|
3
|
-
export interface RotateCandidate {
|
|
4
|
-
agent: AgentId;
|
|
5
|
-
version: string;
|
|
6
|
-
email: string | null;
|
|
7
|
-
usageStatus: AccountInfo['usageStatus'];
|
|
8
|
-
authValid: boolean;
|
|
9
|
-
lastActive: Date | null;
|
|
10
|
-
}
|
|
11
|
-
export interface RotateResult {
|
|
12
|
-
/** The version picked for this run. */
|
|
13
|
-
picked: RotateCandidate;
|
|
14
|
-
/** Candidates that were considered healthy (including the picked one). */
|
|
15
|
-
healthy: RotateCandidate[];
|
|
16
|
-
/** Candidates excluded (not signed in, or out of credits). */
|
|
17
|
-
excluded: RotateCandidate[];
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Pure selection: given a set of candidates, return the best one for the
|
|
21
|
-
* next run. Kept separate from I/O so it can be unit-tested with fixtures.
|
|
22
|
-
*
|
|
23
|
-
* Eligibility: signed in (email present) and not out of credits.
|
|
24
|
-
* Tie-break: least-recently-active wins. Never-used versions sort oldest
|
|
25
|
-
* so fresh installs are tried before recently-used ones.
|
|
26
|
-
*/
|
|
27
|
-
export declare function pickRotateCandidate(candidates: RotateCandidate[]): RotateResult | null;
|
|
28
|
-
/**
|
|
29
|
-
* Rotate across installed versions of an agent and pick the best one for the
|
|
30
|
-
* next run. "Best" means: signed in, not out of credits, and least-recently-
|
|
31
|
-
* active (so two back-to-back runs hit different accounts automatically).
|
|
32
|
-
*
|
|
33
|
-
* No external state: rotation and health are both read off per-version
|
|
34
|
-
* AccountInfo — the same data `agents view` already surfaces. `lastActive`
|
|
35
|
-
* advances naturally after each run, so the cursor is self-maintaining.
|
|
36
|
-
*
|
|
37
|
-
* Returns null if no installed version is eligible (either nothing installed
|
|
38
|
-
* or every account is exhausted / not signed in). Callers fall back to the
|
|
39
|
-
* global default so behavior stays predictable — we never refuse to run.
|
|
40
|
-
*/
|
|
41
|
-
export declare function selectRotateVersion(agent: AgentId): Promise<RotateResult | null>;
|
|
42
|
-
/**
|
|
43
|
-
* Resolve the version `agents run` should use when the caller did not pin
|
|
44
|
-
* one with `@version`. Rotation is the default; falls back to the global
|
|
45
|
-
* default if no version is healthy, and to null if the agent isn't installed
|
|
46
|
-
* under agents-cli at all (let exec surface its own error).
|
|
47
|
-
*/
|
|
48
|
-
export declare function resolveRunVersion(agent: AgentId): Promise<{
|
|
49
|
-
version: string | null;
|
|
50
|
-
rotation: RotateResult | null;
|
|
51
|
-
}>;
|
|
52
|
-
//# sourceMappingURL=rotate.d.ts.map
|
package/dist/lib/rotate.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rotate.d.ts","sourceRoot":"","sources":["../../src/lib/rotate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,MAAM,EAAE,eAAe,CAAC;IACxB,0EAA0E;IAC1E,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,YAAY,GAAG,IAAI,CA4BtF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAuBtF;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAC/D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/B,CAAC,CAOD"}
|
package/dist/lib/rotate.js
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { getAccountInfo } from './agents.js';
|
|
2
|
-
import { listInstalledVersions, getVersionHomePath, getGlobalDefault } from './versions.js';
|
|
3
|
-
import { isClaudeAuthValid } from './usage.js';
|
|
4
|
-
/**
|
|
5
|
-
* Pure selection: given a set of candidates, return the best one for the
|
|
6
|
-
* next run. Kept separate from I/O so it can be unit-tested with fixtures.
|
|
7
|
-
*
|
|
8
|
-
* Eligibility: signed in (email present) and not out of credits.
|
|
9
|
-
* Tie-break: least-recently-active wins. Never-used versions sort oldest
|
|
10
|
-
* so fresh installs are tried before recently-used ones.
|
|
11
|
-
*/
|
|
12
|
-
export function pickRotateCandidate(candidates) {
|
|
13
|
-
const healthy = [];
|
|
14
|
-
const excluded = [];
|
|
15
|
-
for (const c of candidates) {
|
|
16
|
-
if (!c.email) {
|
|
17
|
-
excluded.push(c);
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
if (c.usageStatus === 'out_of_credits') {
|
|
21
|
-
excluded.push(c);
|
|
22
|
-
continue;
|
|
23
|
-
}
|
|
24
|
-
if (!c.authValid) {
|
|
25
|
-
excluded.push(c);
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
|
-
healthy.push(c);
|
|
29
|
-
}
|
|
30
|
-
if (healthy.length === 0)
|
|
31
|
-
return null;
|
|
32
|
-
const sorted = [...healthy].sort((a, b) => {
|
|
33
|
-
const ta = a.lastActive ? a.lastActive.getTime() : 0;
|
|
34
|
-
const tb = b.lastActive ? b.lastActive.getTime() : 0;
|
|
35
|
-
return ta - tb;
|
|
36
|
-
});
|
|
37
|
-
return { picked: sorted[0], healthy: sorted, excluded };
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Rotate across installed versions of an agent and pick the best one for the
|
|
41
|
-
* next run. "Best" means: signed in, not out of credits, and least-recently-
|
|
42
|
-
* active (so two back-to-back runs hit different accounts automatically).
|
|
43
|
-
*
|
|
44
|
-
* No external state: rotation and health are both read off per-version
|
|
45
|
-
* AccountInfo — the same data `agents view` already surfaces. `lastActive`
|
|
46
|
-
* advances naturally after each run, so the cursor is self-maintaining.
|
|
47
|
-
*
|
|
48
|
-
* Returns null if no installed version is eligible (either nothing installed
|
|
49
|
-
* or every account is exhausted / not signed in). Callers fall back to the
|
|
50
|
-
* global default so behavior stays predictable — we never refuse to run.
|
|
51
|
-
*/
|
|
52
|
-
export async function selectRotateVersion(agent) {
|
|
53
|
-
const versions = listInstalledVersions(agent);
|
|
54
|
-
if (versions.length === 0)
|
|
55
|
-
return null;
|
|
56
|
-
const candidates = await Promise.all(versions.map(async (version) => {
|
|
57
|
-
const home = getVersionHomePath(agent, version);
|
|
58
|
-
const info = await getAccountInfo(agent, home);
|
|
59
|
-
const authValid = info.email
|
|
60
|
-
? agent === 'claude' ? await isClaudeAuthValid(home) : true
|
|
61
|
-
: false;
|
|
62
|
-
return {
|
|
63
|
-
agent,
|
|
64
|
-
version,
|
|
65
|
-
email: info.email,
|
|
66
|
-
usageStatus: info.usageStatus,
|
|
67
|
-
authValid,
|
|
68
|
-
lastActive: info.lastActive,
|
|
69
|
-
};
|
|
70
|
-
}));
|
|
71
|
-
return pickRotateCandidate(candidates);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Resolve the version `agents run` should use when the caller did not pin
|
|
75
|
-
* one with `@version`. Rotation is the default; falls back to the global
|
|
76
|
-
* default if no version is healthy, and to null if the agent isn't installed
|
|
77
|
-
* under agents-cli at all (let exec surface its own error).
|
|
78
|
-
*/
|
|
79
|
-
export async function resolveRunVersion(agent) {
|
|
80
|
-
const rotation = await selectRotateVersion(agent);
|
|
81
|
-
if (rotation) {
|
|
82
|
-
return { version: rotation.picked.version, rotation };
|
|
83
|
-
}
|
|
84
|
-
const fallback = getGlobalDefault(agent);
|
|
85
|
-
return { version: fallback, rotation: null };
|
|
86
|
-
}
|
|
87
|
-
//# sourceMappingURL=rotate.js.map
|
package/dist/lib/rotate.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rotate.js","sourceRoot":"","sources":["../../src/lib/rotate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { type BundleValue, type SecretRef } from './secrets.js';
|
|
2
|
-
export interface SecretsBundle {
|
|
3
|
-
name: string;
|
|
4
|
-
description?: string;
|
|
5
|
-
allow_exec?: boolean;
|
|
6
|
-
vars: Record<string, BundleValue>;
|
|
7
|
-
}
|
|
8
|
-
export declare function validateBundleName(name: string): void;
|
|
9
|
-
export declare function validateEnvKey(key: string): void;
|
|
10
|
-
export declare function bundleExists(name: string): boolean;
|
|
11
|
-
export declare function readBundle(name: string): SecretsBundle;
|
|
12
|
-
export declare function writeBundle(bundle: SecretsBundle): void;
|
|
13
|
-
export declare function deleteBundle(name: string): boolean;
|
|
14
|
-
export declare function listBundles(): SecretsBundle[];
|
|
15
|
-
export interface BundleEntryInfo {
|
|
16
|
-
key: string;
|
|
17
|
-
kind: 'literal' | 'keychain' | 'env' | 'file' | 'exec';
|
|
18
|
-
detail: string;
|
|
19
|
-
}
|
|
20
|
-
export declare function describeBundle(bundle: SecretsBundle): BundleEntryInfo[];
|
|
21
|
-
export declare function resolveBundleEnv(bundle: SecretsBundle): Record<string, string>;
|
|
22
|
-
export declare function keychainRef(key: string): string;
|
|
23
|
-
export declare function keychainItemsForBundle(bundle: SecretsBundle): Array<{
|
|
24
|
-
key: string;
|
|
25
|
-
item: string;
|
|
26
|
-
}>;
|
|
27
|
-
export declare function parseDotenv(content: string): Record<string, string>;
|
|
28
|
-
export type { SecretRef };
|
|
29
|
-
//# sourceMappingURL=secrets-bundles.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"secrets-bundles.d.ts","sourceRoot":"","sources":["../../src/lib/secrets-bundles.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACnC;AAKD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIrD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIhD;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAqBtD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAiBvD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMlD;AAED,wBAAgB,WAAW,IAAI,aAAa,EAAE,CAc7C;AAGD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IACvD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,EAAE,CAWvE;AAMD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwB9E;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAGD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CASlG;AAGD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBnE;AAED,YAAY,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import * as path from 'path';
|
|
3
|
-
import * as yaml from 'yaml';
|
|
4
|
-
import { getSecretsDir } from './state.js';
|
|
5
|
-
import { parseBundleValue, resolveRef, secretsKeychainItem, } from './secrets.js';
|
|
6
|
-
const BUNDLE_NAME_PATTERN = /^[a-z0-9][a-z0-9-_]{0,48}$/i;
|
|
7
|
-
const ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
8
|
-
export function validateBundleName(name) {
|
|
9
|
-
if (!BUNDLE_NAME_PATTERN.test(name)) {
|
|
10
|
-
throw new Error(`Invalid bundle name '${name}'. Use letters, digits, dash, underscore (max 48 chars).`);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
export function validateEnvKey(key) {
|
|
14
|
-
if (!ENV_KEY_PATTERN.test(key)) {
|
|
15
|
-
throw new Error(`Invalid environment variable name '${key}'. Must match [A-Za-z_][A-Za-z0-9_]*.`);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
function bundlePath(name) {
|
|
19
|
-
return path.join(getSecretsDir(), `${name}.yml`);
|
|
20
|
-
}
|
|
21
|
-
export function bundleExists(name) {
|
|
22
|
-
return fs.existsSync(bundlePath(name));
|
|
23
|
-
}
|
|
24
|
-
export function readBundle(name) {
|
|
25
|
-
validateBundleName(name);
|
|
26
|
-
const file = bundlePath(name);
|
|
27
|
-
if (!fs.existsSync(file)) {
|
|
28
|
-
throw new Error(`Secrets bundle '${name}' not found.`);
|
|
29
|
-
}
|
|
30
|
-
const raw = fs.readFileSync(file, 'utf-8');
|
|
31
|
-
const parsed = yaml.parse(raw);
|
|
32
|
-
if (!parsed || typeof parsed !== 'object') {
|
|
33
|
-
throw new Error(`Bundle '${name}' is malformed.`);
|
|
34
|
-
}
|
|
35
|
-
const bundle = {
|
|
36
|
-
name: parsed.name || name,
|
|
37
|
-
description: parsed.description,
|
|
38
|
-
allow_exec: Boolean(parsed.allow_exec),
|
|
39
|
-
vars: parsed.vars && typeof parsed.vars === 'object' ? parsed.vars : {},
|
|
40
|
-
};
|
|
41
|
-
for (const key of Object.keys(bundle.vars)) {
|
|
42
|
-
validateEnvKey(key);
|
|
43
|
-
}
|
|
44
|
-
return bundle;
|
|
45
|
-
}
|
|
46
|
-
export function writeBundle(bundle) {
|
|
47
|
-
validateBundleName(bundle.name);
|
|
48
|
-
for (const key of Object.keys(bundle.vars)) {
|
|
49
|
-
validateEnvKey(key);
|
|
50
|
-
}
|
|
51
|
-
const dir = getSecretsDir();
|
|
52
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
53
|
-
const body = yaml.stringify({
|
|
54
|
-
name: bundle.name,
|
|
55
|
-
description: bundle.description,
|
|
56
|
-
allow_exec: bundle.allow_exec ? true : undefined,
|
|
57
|
-
vars: bundle.vars,
|
|
58
|
-
});
|
|
59
|
-
const file = bundlePath(bundle.name);
|
|
60
|
-
const tmp = `${file}.tmp-${process.pid}`;
|
|
61
|
-
fs.writeFileSync(tmp, body, 'utf-8');
|
|
62
|
-
fs.renameSync(tmp, file);
|
|
63
|
-
}
|
|
64
|
-
export function deleteBundle(name) {
|
|
65
|
-
validateBundleName(name);
|
|
66
|
-
const file = bundlePath(name);
|
|
67
|
-
if (!fs.existsSync(file))
|
|
68
|
-
return false;
|
|
69
|
-
fs.unlinkSync(file);
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
export function listBundles() {
|
|
73
|
-
const dir = getSecretsDir();
|
|
74
|
-
if (!fs.existsSync(dir))
|
|
75
|
-
return [];
|
|
76
|
-
const entries = fs.readdirSync(dir).filter((f) => f.endsWith('.yml') || f.endsWith('.yaml'));
|
|
77
|
-
const bundles = [];
|
|
78
|
-
for (const entry of entries) {
|
|
79
|
-
const name = entry.replace(/\.(yml|yaml)$/, '');
|
|
80
|
-
try {
|
|
81
|
-
bundles.push(readBundle(name));
|
|
82
|
-
}
|
|
83
|
-
catch {
|
|
84
|
-
// Skip malformed bundles; surfaced via `agents secrets view <name>`.
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return bundles.sort((a, b) => a.name.localeCompare(b.name));
|
|
88
|
-
}
|
|
89
|
-
export function describeBundle(bundle) {
|
|
90
|
-
const out = [];
|
|
91
|
-
for (const [key, raw] of Object.entries(bundle.vars)) {
|
|
92
|
-
const parsed = parseBundleValue(raw);
|
|
93
|
-
if ('literal' in parsed) {
|
|
94
|
-
out.push({ key, kind: 'literal', detail: '' });
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
out.push({ key, kind: parsed.ref.provider, detail: parsed.ref.value });
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return out;
|
|
101
|
-
}
|
|
102
|
-
// Walk the bundle and produce a flat env map. Keychain refs are translated via
|
|
103
|
-
// the bundle-scoped naming scheme so two bundles with the same short ID never
|
|
104
|
-
// collide. Throws on the first missing secret so `agents run` fails loudly
|
|
105
|
-
// rather than silently injecting empty strings.
|
|
106
|
-
export function resolveBundleEnv(bundle) {
|
|
107
|
-
const env = {};
|
|
108
|
-
for (const [key, raw] of Object.entries(bundle.vars)) {
|
|
109
|
-
const parsed = parseBundleValue(raw);
|
|
110
|
-
if ('literal' in parsed) {
|
|
111
|
-
env[key] = parsed.literal;
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
try {
|
|
115
|
-
env[key] = resolveRef(parsed.ref, {
|
|
116
|
-
allowExec: bundle.allow_exec,
|
|
117
|
-
keychainItemFor: (shortId) => secretsKeychainItem(bundle.name, shortId),
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
catch (err) {
|
|
121
|
-
const msg = err.message;
|
|
122
|
-
if (parsed.ref.provider === 'keychain' && /not found/.test(msg)) {
|
|
123
|
-
throw new Error(`${msg} Run: agents secrets set ${bundle.name} ${key}`);
|
|
124
|
-
}
|
|
125
|
-
throw new Error(`Bundle '${bundle.name}' key '${key}': ${msg}`);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return env;
|
|
129
|
-
}
|
|
130
|
-
// Build a keychain ref expression from a bundle+key pair, for storage in YAML.
|
|
131
|
-
export function keychainRef(key) {
|
|
132
|
-
return `keychain:${key}`;
|
|
133
|
-
}
|
|
134
|
-
// Iterate all keychain-backed keys in a bundle for cleanup on rm/unset.
|
|
135
|
-
export function keychainItemsForBundle(bundle) {
|
|
136
|
-
const items = [];
|
|
137
|
-
for (const [key, raw] of Object.entries(bundle.vars)) {
|
|
138
|
-
const parsed = parseBundleValue(raw);
|
|
139
|
-
if ('ref' in parsed && parsed.ref.provider === 'keychain') {
|
|
140
|
-
items.push({ key, item: secretsKeychainItem(bundle.name, parsed.ref.value) });
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return items;
|
|
144
|
-
}
|
|
145
|
-
// Parse a dotenv string into key=value pairs, preserving last-wins on duplicates.
|
|
146
|
-
export function parseDotenv(content) {
|
|
147
|
-
const out = {};
|
|
148
|
-
for (const raw of content.split('\n')) {
|
|
149
|
-
const line = raw.trim();
|
|
150
|
-
if (!line || line.startsWith('#'))
|
|
151
|
-
continue;
|
|
152
|
-
const stripped = line.startsWith('export ') ? line.slice('export '.length) : line;
|
|
153
|
-
const eq = stripped.indexOf('=');
|
|
154
|
-
if (eq <= 0)
|
|
155
|
-
continue;
|
|
156
|
-
const key = stripped.slice(0, eq).trim();
|
|
157
|
-
let value = stripped.slice(eq + 1).trim();
|
|
158
|
-
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
159
|
-
(value.startsWith("'") && value.endsWith("'"))) {
|
|
160
|
-
value = value.slice(1, -1);
|
|
161
|
-
}
|
|
162
|
-
if (ENV_KEY_PATTERN.test(key)) {
|
|
163
|
-
out[key] = value;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
return out;
|
|
167
|
-
}
|
|
168
|
-
//# sourceMappingURL=secrets-bundles.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"secrets-bundles.js","sourceRoot":"","sources":["../../src/lib/secrets-bundles.ts"],"names":[],"mappings":"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"}
|