aemeathcli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +607 -0
  2. package/dist/App-P4MYD4QY.js +2719 -0
  3. package/dist/App-P4MYD4QY.js.map +1 -0
  4. package/dist/api-key-fallback-YQQBOQIL.js +11 -0
  5. package/dist/api-key-fallback-YQQBOQIL.js.map +1 -0
  6. package/dist/chunk-4IJD72YB.js +184 -0
  7. package/dist/chunk-4IJD72YB.js.map +1 -0
  8. package/dist/chunk-6PDJ45T4.js +325 -0
  9. package/dist/chunk-6PDJ45T4.js.map +1 -0
  10. package/dist/chunk-CARHU3DO.js +562 -0
  11. package/dist/chunk-CARHU3DO.js.map +1 -0
  12. package/dist/chunk-CGEV3ARR.js +80 -0
  13. package/dist/chunk-CGEV3ARR.js.map +1 -0
  14. package/dist/chunk-CS5X3BWX.js +27 -0
  15. package/dist/chunk-CS5X3BWX.js.map +1 -0
  16. package/dist/chunk-CYQNBB25.js +44 -0
  17. package/dist/chunk-CYQNBB25.js.map +1 -0
  18. package/dist/chunk-DAHGLHNR.js +657 -0
  19. package/dist/chunk-DAHGLHNR.js.map +1 -0
  20. package/dist/chunk-H66O5Z2V.js +305 -0
  21. package/dist/chunk-H66O5Z2V.js.map +1 -0
  22. package/dist/chunk-HCIHOHLX.js +322 -0
  23. package/dist/chunk-HCIHOHLX.js.map +1 -0
  24. package/dist/chunk-HMJRPNPZ.js +1031 -0
  25. package/dist/chunk-HMJRPNPZ.js.map +1 -0
  26. package/dist/chunk-I5PZ4JTS.js +119 -0
  27. package/dist/chunk-I5PZ4JTS.js.map +1 -0
  28. package/dist/chunk-IYW62KKR.js +255 -0
  29. package/dist/chunk-IYW62KKR.js.map +1 -0
  30. package/dist/chunk-JAXXTYID.js +51 -0
  31. package/dist/chunk-JAXXTYID.js.map +1 -0
  32. package/dist/chunk-LSOYPSAT.js +183 -0
  33. package/dist/chunk-LSOYPSAT.js.map +1 -0
  34. package/dist/chunk-MFBHNWGV.js +416 -0
  35. package/dist/chunk-MFBHNWGV.js.map +1 -0
  36. package/dist/chunk-MXZSI3AY.js +311 -0
  37. package/dist/chunk-MXZSI3AY.js.map +1 -0
  38. package/dist/chunk-NBR3GHMT.js +72 -0
  39. package/dist/chunk-NBR3GHMT.js.map +1 -0
  40. package/dist/chunk-O3ZF22SW.js +246 -0
  41. package/dist/chunk-O3ZF22SW.js.map +1 -0
  42. package/dist/chunk-SUSJPZU2.js +181 -0
  43. package/dist/chunk-SUSJPZU2.js.map +1 -0
  44. package/dist/chunk-TEVZS4FA.js +310 -0
  45. package/dist/chunk-TEVZS4FA.js.map +1 -0
  46. package/dist/chunk-UY2SYSEZ.js +211 -0
  47. package/dist/chunk-UY2SYSEZ.js.map +1 -0
  48. package/dist/chunk-WAHVZH7V.js +260 -0
  49. package/dist/chunk-WAHVZH7V.js.map +1 -0
  50. package/dist/chunk-WPP3PEDE.js +234 -0
  51. package/dist/chunk-WPP3PEDE.js.map +1 -0
  52. package/dist/chunk-Y5XVD2CD.js +1610 -0
  53. package/dist/chunk-Y5XVD2CD.js.map +1 -0
  54. package/dist/chunk-YL5XFHR3.js +56 -0
  55. package/dist/chunk-YL5XFHR3.js.map +1 -0
  56. package/dist/chunk-ZGOHARPV.js +122 -0
  57. package/dist/chunk-ZGOHARPV.js.map +1 -0
  58. package/dist/claude-adapter-QMLFMSP3.js +6 -0
  59. package/dist/claude-adapter-QMLFMSP3.js.map +1 -0
  60. package/dist/claude-login-5WELXPKT.js +324 -0
  61. package/dist/claude-login-5WELXPKT.js.map +1 -0
  62. package/dist/cli.d.ts +1 -0
  63. package/dist/cli.js +703 -0
  64. package/dist/cli.js.map +1 -0
  65. package/dist/codex-login-7HHLJHBF.js +164 -0
  66. package/dist/codex-login-7HHLJHBF.js.map +1 -0
  67. package/dist/config-store-W6FBCQAQ.js +6 -0
  68. package/dist/config-store-W6FBCQAQ.js.map +1 -0
  69. package/dist/executor-6RIKIGXK.js +4 -0
  70. package/dist/executor-6RIKIGXK.js.map +1 -0
  71. package/dist/gemini-adapter-6JIHZ7WI.js +6 -0
  72. package/dist/gemini-adapter-6JIHZ7WI.js.map +1 -0
  73. package/dist/gemini-login-ZZLYC3J6.js +346 -0
  74. package/dist/gemini-login-ZZLYC3J6.js.map +1 -0
  75. package/dist/index.d.ts +2210 -0
  76. package/dist/index.js +1419 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/kimi-adapter-JN4HFFHU.js +6 -0
  79. package/dist/kimi-adapter-JN4HFFHU.js.map +1 -0
  80. package/dist/kimi-login-CZPS63NK.js +149 -0
  81. package/dist/kimi-login-CZPS63NK.js.map +1 -0
  82. package/dist/native-cli-adapters-OLW3XX57.js +6 -0
  83. package/dist/native-cli-adapters-OLW3XX57.js.map +1 -0
  84. package/dist/ollama-adapter-OJQ3FKWK.js +6 -0
  85. package/dist/ollama-adapter-OJQ3FKWK.js.map +1 -0
  86. package/dist/openai-adapter-XU46EN7B.js +6 -0
  87. package/dist/openai-adapter-XU46EN7B.js.map +1 -0
  88. package/dist/registry-4KD24ZC3.js +6 -0
  89. package/dist/registry-4KD24ZC3.js.map +1 -0
  90. package/dist/registry-H7B3AHPQ.js +5 -0
  91. package/dist/registry-H7B3AHPQ.js.map +1 -0
  92. package/dist/server-manager-PTGBHCLS.js +5 -0
  93. package/dist/server-manager-PTGBHCLS.js.map +1 -0
  94. package/dist/session-manager-ECEEACGY.js +12 -0
  95. package/dist/session-manager-ECEEACGY.js.map +1 -0
  96. package/dist/team-manager-HC4XGCFY.js +11 -0
  97. package/dist/team-manager-HC4XGCFY.js.map +1 -0
  98. package/dist/tmux-manager-GPYZ3WQH.js +6 -0
  99. package/dist/tmux-manager-GPYZ3WQH.js.map +1 -0
  100. package/dist/tools-TSMXMHIF.js +6 -0
  101. package/dist/tools-TSMXMHIF.js.map +1 -0
  102. package/package.json +89 -0
@@ -0,0 +1,246 @@
1
+ import { SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
2
+ import { ModelNotFoundError } from './chunk-ZGOHARPV.js';
3
+ import { logger } from './chunk-JAXXTYID.js';
4
+
5
+ // src/providers/registry.ts
6
+ var ProviderRegistry = class {
7
+ providers = /* @__PURE__ */ new Map();
8
+ modelToProvider = /* @__PURE__ */ new Map();
9
+ /**
10
+ * Register a provider adapter.
11
+ * Automatically indexes all supported models to this provider.
12
+ */
13
+ register(provider) {
14
+ this.providers.set(provider.name, provider);
15
+ for (const modelId of provider.supportedModels) {
16
+ this.modelToProvider.set(modelId, provider.name);
17
+ }
18
+ logger.debug(
19
+ { provider: provider.name, models: provider.supportedModels },
20
+ "Provider registered"
21
+ );
22
+ }
23
+ /**
24
+ * Get a provider adapter by its name (e.g. "anthropic", "openai").
25
+ */
26
+ getByName(name) {
27
+ return this.providers.get(name);
28
+ }
29
+ /**
30
+ * Get the provider adapter that supports a given model ID.
31
+ * @throws ModelNotFoundError if no provider serves this model.
32
+ */
33
+ getForModel(modelId) {
34
+ const providerName = this.modelToProvider.get(modelId);
35
+ if (providerName === void 0) {
36
+ throw new ModelNotFoundError(modelId);
37
+ }
38
+ const provider = this.providers.get(providerName);
39
+ if (provider === void 0) {
40
+ throw new ModelNotFoundError(modelId);
41
+ }
42
+ return provider;
43
+ }
44
+ /**
45
+ * Resolve a model string to its provider.
46
+ * Supports both model IDs ("claude-sonnet-4-6") and provider-prefixed
47
+ * forms ("anthropic:claude-sonnet-4-6").
48
+ */
49
+ resolve(modelString) {
50
+ const colonIndex = modelString.indexOf(":");
51
+ if (colonIndex !== -1) {
52
+ const providerName = modelString.slice(0, colonIndex);
53
+ const modelId = modelString.slice(colonIndex + 1);
54
+ const provider2 = this.providers.get(providerName);
55
+ if (provider2 === void 0) {
56
+ throw new ModelNotFoundError(modelString);
57
+ }
58
+ return { provider: provider2, modelId };
59
+ }
60
+ const provider = this.getForModel(modelString);
61
+ return { provider, modelId: modelString };
62
+ }
63
+ /**
64
+ * List all registered model IDs across all providers.
65
+ */
66
+ listModels() {
67
+ const models = [];
68
+ for (const provider of this.providers.values()) {
69
+ for (const modelId of provider.supportedModels) {
70
+ const info = SUPPORTED_MODELS[modelId];
71
+ if (info !== void 0) {
72
+ models.push(info);
73
+ }
74
+ }
75
+ }
76
+ return models;
77
+ }
78
+ /**
79
+ * List all registered provider names.
80
+ */
81
+ listProviders() {
82
+ return [...this.providers.keys()];
83
+ }
84
+ /**
85
+ * Check if a model ID is supported by any registered provider.
86
+ */
87
+ hasModel(modelId) {
88
+ return this.modelToProvider.has(modelId);
89
+ }
90
+ /**
91
+ * Check if a provider is registered.
92
+ */
93
+ hasProvider(name) {
94
+ return this.providers.has(name);
95
+ }
96
+ /**
97
+ * List available models from all providers.
98
+ * Uses dynamic API listing where supported, falls back to static models.
99
+ */
100
+ async listAllAvailableModels() {
101
+ const entries = [...this.providers.entries()];
102
+ const fetched = await Promise.all(
103
+ entries.map(async ([name, provider]) => {
104
+ if (typeof provider.listAvailableModels === "function") {
105
+ try {
106
+ return [name, await provider.listAvailableModels()];
107
+ } catch {
108
+ return [name, [...provider.supportedModels]];
109
+ }
110
+ }
111
+ return [name, [...provider.supportedModels]];
112
+ })
113
+ );
114
+ const result = /* @__PURE__ */ new Map();
115
+ fetched.sort(([a], [b]) => a.localeCompare(b));
116
+ for (const [name, models] of fetched) {
117
+ result.set(name, models);
118
+ }
119
+ return result;
120
+ }
121
+ };
122
+ async function createDefaultRegistry() {
123
+ const registry = new ProviderRegistry();
124
+ const { SessionManager } = await import('./session-manager-ECEEACGY.js');
125
+ const session = new SessionManager();
126
+ const { execa } = await import('execa');
127
+ const preferSdk = process.env["AEMEATHCLI_PREFER_SDK"] === "1";
128
+ const cliAvailability = /* @__PURE__ */ new Map();
129
+ const hasCli = async (command) => {
130
+ const cached = cliAvailability.get(command);
131
+ if (cached !== void 0) {
132
+ return cached;
133
+ }
134
+ try {
135
+ await execa("which", [command], { timeout: 3e3 });
136
+ cliAvailability.set(command, true);
137
+ return true;
138
+ } catch {
139
+ cliAvailability.set(command, false);
140
+ return false;
141
+ }
142
+ };
143
+ const shouldUseNative = async (credential, cliCommand, envKeyName) => {
144
+ if (credential?.method === "native_login") {
145
+ return await hasCli(cliCommand);
146
+ }
147
+ if (preferSdk) {
148
+ const hasApiKey = credential?.token !== void 0 || process.env[envKeyName] !== void 0;
149
+ if (hasApiKey) {
150
+ return false;
151
+ }
152
+ return await hasCli(cliCommand);
153
+ }
154
+ return credential === void 0 && await hasCli(cliCommand);
155
+ };
156
+ const providerLoaders = [
157
+ {
158
+ name: "anthropic",
159
+ load: async () => {
160
+ const { ClaudeAdapter } = await import('./claude-adapter-QMLFMSP3.js');
161
+ const credential = await session.getActiveCredential("anthropic").catch(() => void 0);
162
+ const useNative = await shouldUseNative(credential, "claude", "ANTHROPIC_API_KEY");
163
+ if (useNative) {
164
+ const { ClaudeNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-OLW3XX57.js');
165
+ logNativeAdapterSelection("anthropic");
166
+ return new ClaudeNativeCLIAdapter();
167
+ }
168
+ return new ClaudeAdapter(
169
+ credential?.token !== void 0 ? { apiKey: credential.token } : void 0
170
+ );
171
+ }
172
+ },
173
+ {
174
+ name: "openai",
175
+ load: async () => {
176
+ const { OpenAIAdapter } = await import('./openai-adapter-XU46EN7B.js');
177
+ const credential = await session.getActiveCredential("openai").catch(() => void 0);
178
+ const useNative = await shouldUseNative(credential, "codex", "OPENAI_API_KEY");
179
+ if (useNative) {
180
+ const { CodexNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-OLW3XX57.js');
181
+ logNativeAdapterSelection("openai");
182
+ return new CodexNativeCLIAdapter();
183
+ }
184
+ return new OpenAIAdapter(
185
+ credential?.token !== void 0 ? { apiKey: credential.token } : void 0
186
+ );
187
+ }
188
+ },
189
+ {
190
+ name: "google",
191
+ load: async () => {
192
+ const { GeminiAdapter } = await import('./gemini-adapter-6JIHZ7WI.js');
193
+ const credential = await session.getActiveCredential("google").catch(() => void 0);
194
+ const useNative = await shouldUseNative(credential, "gemini", "GOOGLE_API_KEY");
195
+ if (useNative) {
196
+ const { GeminiNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-OLW3XX57.js');
197
+ logNativeAdapterSelection("google");
198
+ return new GeminiNativeCLIAdapter();
199
+ }
200
+ return new GeminiAdapter(
201
+ credential?.token !== void 0 ? { apiKey: credential.token } : void 0
202
+ );
203
+ }
204
+ },
205
+ {
206
+ name: "kimi",
207
+ load: async () => {
208
+ const { KimiAdapter } = await import('./kimi-adapter-JN4HFFHU.js');
209
+ const credential = await session.getActiveCredential("kimi").catch(() => void 0);
210
+ const useNative = await shouldUseNative(credential, "kimi", "MOONSHOT_API_KEY");
211
+ if (useNative) {
212
+ const { KimiNativeCLIAdapter, logNativeAdapterSelection } = await import('./native-cli-adapters-OLW3XX57.js');
213
+ logNativeAdapterSelection("kimi");
214
+ return new KimiNativeCLIAdapter();
215
+ }
216
+ return new KimiAdapter(
217
+ credential?.token !== void 0 ? { apiKey: credential.token } : void 0
218
+ );
219
+ }
220
+ }
221
+ ];
222
+ const ollamaTask = (async () => {
223
+ try {
224
+ const { OllamaAdapter } = await import('./ollama-adapter-OJQ3FKWK.js');
225
+ const ollama = new OllamaAdapter();
226
+ await ollama.refreshModels();
227
+ registry.register(ollama);
228
+ } catch {
229
+ }
230
+ })();
231
+ await Promise.all([
232
+ ...providerLoaders.map(async (config) => {
233
+ try {
234
+ const adapter = await config.load();
235
+ registry.register(adapter);
236
+ } catch {
237
+ }
238
+ }),
239
+ ollamaTask
240
+ ]);
241
+ return registry;
242
+ }
243
+
244
+ export { ProviderRegistry, createDefaultRegistry };
245
+ //# sourceMappingURL=chunk-O3ZF22SW.js.map
246
+ //# sourceMappingURL=chunk-O3ZF22SW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/registry.ts"],"names":["provider"],"mappings":";;;;;AAcO,IAAM,mBAAN,MAAuB;AAAA,EACX,SAAA,uBAAgB,GAAA,EAA4B;AAAA,EAC5C,eAAA,uBAAsB,GAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAM3D,SAAS,QAAA,EAAgC;AACvC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAE1C,IAAA,KAAA,MAAW,OAAA,IAAW,SAAS,eAAA,EAAiB;AAC9C,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,IAAI,CAAA;AAAA,IACjD;AAEA,IAAA,MAAA,CAAO,KAAA;AAAA,MACL,EAAE,QAAA,EAAU,QAAA,CAAS,IAAA,EAAM,MAAA,EAAQ,SAAS,eAAA,EAAgB;AAAA,MAC5D;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAA0C;AAClD,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,OAAA,EAAiC;AAC3C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA;AACrD,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,MAAA,MAAM,IAAI,mBAAmB,OAAO,CAAA;AAAA,IACtC;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA;AAChD,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,MAAM,IAAI,mBAAmB,OAAO,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,WAAA,EAAoE;AAC1E,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,OAAA,CAAQ,GAAG,CAAA;AAC1C,IAAA,IAAI,eAAe,EAAA,EAAI;AACrB,MAAA,MAAM,YAAA,GAAe,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,UAAU,CAAA;AACpD,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAChD,MAAA,MAAMA,SAAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA;AAChD,MAAA,IAAIA,cAAa,MAAA,EAAW;AAC1B,QAAA,MAAM,IAAI,mBAAmB,WAAW,CAAA;AAAA,MAC1C;AACA,MAAA,OAAO,EAAE,QAAA,EAAAA,SAAAA,EAAU,OAAA,EAAQ;AAAA,IAC7B;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,WAAW,CAAA;AAC7C,IAAA,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,WAAA,EAAY;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAoC;AAClC,IAAA,MAAM,SAAuB,EAAC;AAE9B,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC9C,MAAA,KAAA,MAAW,OAAA,IAAW,SAAS,eAAA,EAAiB;AAC9C,QAAA,MAAM,IAAA,GAAO,iBAAiB,OAAO,CAAA;AACrC,QAAA,IAAI,SAAS,MAAA,EAAW;AACtB,UAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAmC;AACjC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAA,EAA0B;AACjC,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAAuB;AACjC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,sBAAA,GAAkE;AACtE,IAAA,MAAM,UAAU,CAAC,GAAG,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC5B,QAAQ,GAAA,CAAI,OAAO,CAAC,IAAA,EAAM,QAAQ,CAAA,KAA4C;AAC5E,QAAA,IAAI,OAAO,QAAA,CAAS,mBAAA,KAAwB,UAAA,EAAY;AACtD,UAAA,IAAI;AACF,YAAA,OAAO,CAAC,IAAA,EAAM,MAAM,QAAA,CAAS,qBAAqB,CAAA;AAAA,UACpD,CAAA,CAAA,MAAQ;AACN,YAAA,OAAO,CAAC,IAAA,EAAM,CAAC,GAAG,QAAA,CAAS,eAAe,CAAC,CAAA;AAAA,UAC7C;AAAA,QACF;AACA,QAAA,OAAO,CAAC,IAAA,EAAM,CAAC,GAAG,QAAA,CAAS,eAAe,CAAC,CAAA;AAAA,MAC7C,CAAC;AAAA,KACH;AAEA,IAAA,MAAM,MAAA,uBAAa,GAAA,EAA+B;AAClD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAC7C,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,CAAA,IAAK,OAAA,EAAS;AACpC,MAAA,MAAA,CAAO,GAAA,CAAI,MAAM,MAAM,CAAA;AAAA,IACzB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAMA,eAAsB,qBAAA,GAAmD;AACvE,EAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,EAAiB;AAEtC,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,MAAM,OAAO,+BAA4B,CAAA;AACpE,EAAA,MAAM,OAAA,GAAU,IAAI,cAAA,EAAe;AACnC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,OAAO,CAAA;AAMtC,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,uBAAuB,CAAA,KAAM,GAAA;AAE3D,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAqB;AACjD,EAAA,MAAM,MAAA,GAAS,OAAO,OAAA,KAAsC;AAC1D,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,CAAM,SAAS,CAAC,OAAO,GAAG,EAAE,OAAA,EAAS,KAAM,CAAA;AACjD,MAAA,eAAA,CAAgB,GAAA,CAAI,SAAS,IAAI,CAAA;AACjC,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,eAAA,CAAgB,GAAA,CAAI,SAAS,KAAK,CAAA;AAClC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,OACtB,UAAA,EACA,UAAA,EACA,UAAA,KACqB;AAIrB,IAAA,IAAI,UAAA,EAAY,WAAW,cAAA,EAAgB;AACzC,MAAA,OAAO,MAAM,OAAO,UAAU,CAAA;AAAA,IAChC;AAGA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,YACJ,UAAA,EAAY,KAAA,KAAU,UACtB,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,KAAM,MAAA;AAC9B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,OAAO,MAAM,OAAO,UAAU,CAAA;AAAA,IAChC;AAGA,IAAA,OAAO,UAAA,KAAe,MAAA,IAAa,MAAM,MAAA,CAAO,UAAU,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,MAAM,eAAA,GAGD;AAAA,IACH;AAAA,MACE,IAAA,EAAM,WAAA;AAAA,MACN,MAAM,YAAY;AAChB,QAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,8BAAqB,CAAA;AAC5D,QAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,mBAAA,CAAoB,WAAW,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACvF,QAAA,MAAM,SAAA,GAAY,MAAM,eAAA,CAAgB,UAAA,EAAY,UAAU,mBAAmB,CAAA;AAEjF,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,EAAE,sBAAA,EAAwB,yBAAA,EAA0B,GAAI,MAAM,OAClE,mCACF,CAAA;AACA,UAAA,yBAAA,CAA0B,WAAW,CAAA;AACrC,UAAA,OAAO,IAAI,sBAAA,EAAuB;AAAA,QACpC;AAEA,QAAA,OAAO,IAAI,aAAA;AAAA,UACT,YAAY,KAAA,KAAU,MAAA,GAAY,EAAE,MAAA,EAAQ,UAAA,CAAW,OAAM,GAAI;AAAA,SACnE;AAAA,MACF;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,MAAM,YAAY;AAChB,QAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,8BAAqB,CAAA;AAC5D,QAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,mBAAA,CAAoB,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACpF,QAAA,MAAM,SAAA,GAAY,MAAM,eAAA,CAAgB,UAAA,EAAY,SAAS,gBAAgB,CAAA;AAE7E,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,EAAE,qBAAA,EAAuB,yBAAA,EAA0B,GAAI,MAAM,OACjE,mCACF,CAAA;AACA,UAAA,yBAAA,CAA0B,QAAQ,CAAA;AAClC,UAAA,OAAO,IAAI,qBAAA,EAAsB;AAAA,QACnC;AAEA,QAAA,OAAO,IAAI,aAAA;AAAA,UACT,YAAY,KAAA,KAAU,MAAA,GAAY,EAAE,MAAA,EAAQ,UAAA,CAAW,OAAM,GAAI;AAAA,SACnE;AAAA,MACF;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,MAAM,YAAY;AAChB,QAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,8BAAqB,CAAA;AAC5D,QAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,mBAAA,CAAoB,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACpF,QAAA,MAAM,SAAA,GAAY,MAAM,eAAA,CAAgB,UAAA,EAAY,UAAU,gBAAgB,CAAA;AAE9E,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,EAAE,sBAAA,EAAwB,yBAAA,EAA0B,GAAI,MAAM,OAClE,mCACF,CAAA;AACA,UAAA,yBAAA,CAA0B,QAAQ,CAAA;AAClC,UAAA,OAAO,IAAI,sBAAA,EAAuB;AAAA,QACpC;AAEA,QAAA,OAAO,IAAI,aAAA;AAAA,UACT,YAAY,KAAA,KAAU,MAAA,GAAY,EAAE,MAAA,EAAQ,UAAA,CAAW,OAAM,GAAI;AAAA,SACnE;AAAA,MACF;AAAA,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,MAAA;AAAA,MACN,MAAM,YAAY;AAChB,QAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,OAAO,4BAAmB,CAAA;AACxD,QAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,mBAAA,CAAoB,MAAM,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAClF,QAAA,MAAM,SAAA,GAAY,MAAM,eAAA,CAAgB,UAAA,EAAY,QAAQ,kBAAkB,CAAA;AAE9E,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,EAAE,oBAAA,EAAsB,yBAAA,EAA0B,GAAI,MAAM,OAChE,mCACF,CAAA;AACA,UAAA,yBAAA,CAA0B,MAAM,CAAA;AAChC,UAAA,OAAO,IAAI,oBAAA,EAAqB;AAAA,QAClC;AAEA,QAAA,OAAO,IAAI,WAAA;AAAA,UACT,YAAY,KAAA,KAAU,MAAA,GAAY,EAAE,MAAA,EAAQ,UAAA,CAAW,OAAM,GAAI;AAAA,SACnE;AAAA,MACF;AAAA;AACF,GACF;AAGA,EAAA,MAAM,cAAc,YAAY;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,aAAA,EAAc,GAAI,MAAM,OAAO,8BAAqB,CAAA;AAC5D,MAAA,MAAM,MAAA,GAAS,IAAI,aAAA,EAAc;AACjC,MAAA,MAAM,OAAO,aAAA,EAAc;AAC3B,MAAA,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,GAAG;AAEH,EAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,IAChB,GAAG,eAAA,CAAgB,GAAA,CAAI,OAAO,MAAA,KAAW;AACvC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAA,EAAK;AAClC,QAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,MAC3B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAC,CAAA;AAAA,IACD;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAA;AACT","file":"chunk-O3ZF22SW.js","sourcesContent":["/**\n * Provider registry per PRD section 7.1\n * Central registry for provider adapters — register, resolve, list.\n */\n\nimport { logger } from \"../utils/logger.js\";\nimport { ModelNotFoundError } from \"../types/errors.js\";\nimport { SUPPORTED_MODELS } from \"../types/model.js\";\nimport type { IModelInfo } from \"../types/model.js\";\nimport type { IModelProvider } from \"./types.js\";\n\n/**\n * Singleton registry that maps provider names and model IDs to provider adapters.\n */\nexport class ProviderRegistry {\n private readonly providers = new Map<string, IModelProvider>();\n private readonly modelToProvider = new Map<string, string>();\n\n /**\n * Register a provider adapter.\n * Automatically indexes all supported models to this provider.\n */\n register(provider: IModelProvider): void {\n this.providers.set(provider.name, provider);\n\n for (const modelId of provider.supportedModels) {\n this.modelToProvider.set(modelId, provider.name);\n }\n\n logger.debug(\n { provider: provider.name, models: provider.supportedModels },\n \"Provider registered\",\n );\n }\n\n /**\n * Get a provider adapter by its name (e.g. \"anthropic\", \"openai\").\n */\n getByName(name: string): IModelProvider | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Get the provider adapter that supports a given model ID.\n * @throws ModelNotFoundError if no provider serves this model.\n */\n getForModel(modelId: string): IModelProvider {\n const providerName = this.modelToProvider.get(modelId);\n if (providerName === undefined) {\n throw new ModelNotFoundError(modelId);\n }\n\n const provider = this.providers.get(providerName);\n if (provider === undefined) {\n throw new ModelNotFoundError(modelId);\n }\n\n return provider;\n }\n\n /**\n * Resolve a model string to its provider.\n * Supports both model IDs (\"claude-sonnet-4-6\") and provider-prefixed\n * forms (\"anthropic:claude-sonnet-4-6\").\n */\n resolve(modelString: string): { provider: IModelProvider; modelId: string } {\n const colonIndex = modelString.indexOf(\":\");\n if (colonIndex !== -1) {\n const providerName = modelString.slice(0, colonIndex);\n const modelId = modelString.slice(colonIndex + 1);\n const provider = this.providers.get(providerName);\n if (provider === undefined) {\n throw new ModelNotFoundError(modelString);\n }\n return { provider, modelId };\n }\n\n const provider = this.getForModel(modelString);\n return { provider, modelId: modelString };\n }\n\n /**\n * List all registered model IDs across all providers.\n */\n listModels(): readonly IModelInfo[] {\n const models: IModelInfo[] = [];\n\n for (const provider of this.providers.values()) {\n for (const modelId of provider.supportedModels) {\n const info = SUPPORTED_MODELS[modelId];\n if (info !== undefined) {\n models.push(info);\n }\n }\n }\n\n return models;\n }\n\n /**\n * List all registered provider names.\n */\n listProviders(): readonly string[] {\n return [...this.providers.keys()];\n }\n\n /**\n * Check if a model ID is supported by any registered provider.\n */\n hasModel(modelId: string): boolean {\n return this.modelToProvider.has(modelId);\n }\n\n /**\n * Check if a provider is registered.\n */\n hasProvider(name: string): boolean {\n return this.providers.has(name);\n }\n\n /**\n * List available models from all providers.\n * Uses dynamic API listing where supported, falls back to static models.\n */\n async listAllAvailableModels(): Promise<Map<string, readonly string[]>> {\n const entries = [...this.providers.entries()];\n const fetched = await Promise.all(\n entries.map(async ([name, provider]): Promise<[string, readonly string[]]> => {\n if (typeof provider.listAvailableModels === \"function\") {\n try {\n return [name, await provider.listAvailableModels()];\n } catch {\n return [name, [...provider.supportedModels]];\n }\n }\n return [name, [...provider.supportedModels]];\n }),\n );\n\n const result = new Map<string, readonly string[]>();\n fetched.sort(([a], [b]) => a.localeCompare(b));\n for (const [name, models] of fetched) {\n result.set(name, models);\n }\n\n return result;\n }\n}\n\n/**\n * Create a pre-populated registry with all available providers.\n * Resolves credentials via SessionManager (CLI delegation, API keys, env vars).\n */\nexport async function createDefaultRegistry(): Promise<ProviderRegistry> {\n const registry = new ProviderRegistry();\n\n const { SessionManager } = await import(\"../auth/session-manager.js\");\n const session = new SessionManager();\n const { execa } = await import(\"execa\");\n\n // When AEMEATHCLI_PREFER_SDK=1 (set for agent child processes), prefer\n // SDK-based adapters over native CLI adapters. Native CLI adapters shell\n // out to external binaries whose raw JSON output can interfere with IPC\n // streaming. Falls back to native only when no API key is available.\n const preferSdk = process.env[\"AEMEATHCLI_PREFER_SDK\"] === \"1\";\n\n const cliAvailability = new Map<string, boolean>();\n const hasCli = async (command: string): Promise<boolean> => {\n const cached = cliAvailability.get(command);\n if (cached !== undefined) {\n return cached;\n }\n\n try {\n await execa(\"which\", [command], { timeout: 3000 });\n cliAvailability.set(command, true);\n return true;\n } catch {\n cliAvailability.set(command, false);\n return false;\n }\n };\n\n /** Determine whether to use a native CLI adapter for a provider. */\n const shouldUseNative = async (\n credential: { method: string; token?: string | undefined } | undefined,\n cliCommand: string,\n envKeyName: string,\n ): Promise<boolean> => {\n // Native login credentials (OAuth sessions) must always use the native CLI\n // adapter. The stored token is an OAuth session token, NOT an API key — SDK\n // adapters will reject it with \"invalid x-api-key\" / \"API key not valid\".\n if (credential?.method === \"native_login\") {\n return await hasCli(cliCommand);\n }\n\n // When preferSdk is set, only use native if SDK has no way to authenticate.\n if (preferSdk) {\n const hasApiKey =\n credential?.token !== undefined ||\n process.env[envKeyName] !== undefined;\n if (hasApiKey) {\n return false;\n }\n // No API key available — fall back to native if CLI exists.\n return await hasCli(cliCommand);\n }\n\n // Default behavior: prefer native when CLI is available and no explicit credential.\n return credential === undefined && await hasCli(cliCommand);\n };\n\n const providerLoaders: ReadonlyArray<{\n name: string;\n load: () => Promise<IModelProvider>;\n }> = [\n {\n name: \"anthropic\",\n load: async () => {\n const { ClaudeAdapter } = await import(\"./claude-adapter.js\");\n const credential = await session.getActiveCredential(\"anthropic\").catch(() => undefined);\n const useNative = await shouldUseNative(credential, \"claude\", \"ANTHROPIC_API_KEY\");\n\n if (useNative) {\n const { ClaudeNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"anthropic\");\n return new ClaudeNativeCLIAdapter();\n }\n\n return new ClaudeAdapter(\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\n );\n },\n },\n {\n name: \"openai\",\n load: async () => {\n const { OpenAIAdapter } = await import(\"./openai-adapter.js\");\n const credential = await session.getActiveCredential(\"openai\").catch(() => undefined);\n const useNative = await shouldUseNative(credential, \"codex\", \"OPENAI_API_KEY\");\n\n if (useNative) {\n const { CodexNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"openai\");\n return new CodexNativeCLIAdapter();\n }\n\n return new OpenAIAdapter(\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\n );\n },\n },\n {\n name: \"google\",\n load: async () => {\n const { GeminiAdapter } = await import(\"./gemini-adapter.js\");\n const credential = await session.getActiveCredential(\"google\").catch(() => undefined);\n const useNative = await shouldUseNative(credential, \"gemini\", \"GOOGLE_API_KEY\");\n\n if (useNative) {\n const { GeminiNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"google\");\n return new GeminiNativeCLIAdapter();\n }\n\n return new GeminiAdapter(\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\n );\n },\n },\n {\n name: \"kimi\",\n load: async () => {\n const { KimiAdapter } = await import(\"./kimi-adapter.js\");\n const credential = await session.getActiveCredential(\"kimi\").catch(() => undefined);\n const useNative = await shouldUseNative(credential, \"kimi\", \"MOONSHOT_API_KEY\");\n\n if (useNative) {\n const { KimiNativeCLIAdapter, logNativeAdapterSelection } = await import(\n \"./native-cli-adapters.js\"\n );\n logNativeAdapterSelection(\"kimi\");\n return new KimiNativeCLIAdapter();\n }\n\n return new KimiAdapter(\n credential?.token !== undefined ? { apiKey: credential.token } : undefined,\n );\n },\n },\n ];\n\n // Initialize all providers in parallel (including Ollama)\n const ollamaTask = (async () => {\n try {\n const { OllamaAdapter } = await import(\"./ollama-adapter.js\");\n const ollama = new OllamaAdapter();\n await ollama.refreshModels();\n registry.register(ollama);\n } catch {\n // Ollama not available\n }\n })();\n\n await Promise.all([\n ...providerLoaders.map(async (config) => {\n try {\n const adapter = await config.load();\n registry.register(adapter);\n } catch {\n // Skip provider if adapter fails to initialize\n }\n }),\n ollamaTask,\n ]);\n\n return registry;\n}\n"]}
@@ -0,0 +1,181 @@
1
+ import { ApiKeyFallback } from './chunk-I5PZ4JTS.js';
2
+ import { CredentialStore } from './chunk-4IJD72YB.js';
3
+ import { AuthenticationError } from './chunk-ZGOHARPV.js';
4
+ import { logger } from './chunk-JAXXTYID.js';
5
+
6
+ // src/auth/session-manager.ts
7
+ var SessionManager = class {
8
+ credentialStore;
9
+ apiKeyFallback;
10
+ constructor(store) {
11
+ this.credentialStore = store ?? new CredentialStore();
12
+ this.apiKeyFallback = new ApiKeyFallback(this.credentialStore);
13
+ }
14
+ /**
15
+ * Get the best available credential for a provider.
16
+ * Follows resolution priority from PRD section 13.5.
17
+ */
18
+ async getActiveCredential(provider) {
19
+ const nativeCredential = await this.credentialStore.get(provider);
20
+ if (nativeCredential && nativeCredential.method === "native_login" && !this.isExpired(nativeCredential)) {
21
+ return nativeCredential;
22
+ }
23
+ if (nativeCredential && nativeCredential.method === "native_login" && this.isExpired(nativeCredential)) {
24
+ const refreshed = await this.refreshFromCliCache(provider);
25
+ if (refreshed) {
26
+ return refreshed;
27
+ }
28
+ }
29
+ if (!nativeCredential || nativeCredential.method !== "native_login") {
30
+ const fromCli = await this.refreshFromCliCache(provider);
31
+ if (fromCli) {
32
+ return fromCli;
33
+ }
34
+ }
35
+ const apiKeyCredential = await this.apiKeyFallback.getCredential(provider);
36
+ if (apiKeyCredential) {
37
+ return apiKeyCredential;
38
+ }
39
+ const envCredential = this.getFromEnvironment(provider);
40
+ if (envCredential) {
41
+ return envCredential;
42
+ }
43
+ throw new AuthenticationError(provider, `No credentials found for ${provider}`);
44
+ }
45
+ /**
46
+ * Check if a provider has any available credential.
47
+ */
48
+ async isAuthenticated(provider) {
49
+ try {
50
+ await this.getActiveCredential(provider);
51
+ return true;
52
+ } catch {
53
+ return false;
54
+ }
55
+ }
56
+ /**
57
+ * Get status info for a provider.
58
+ */
59
+ async getStatus(provider) {
60
+ try {
61
+ const credential = await this.getActiveCredential(provider);
62
+ return {
63
+ loggedIn: true,
64
+ method: credential.method,
65
+ ...credential.email !== void 0 ? { email: credential.email } : {},
66
+ ...credential.plan !== void 0 ? { plan: credential.plan } : {}
67
+ };
68
+ } catch {
69
+ return { loggedIn: false };
70
+ }
71
+ }
72
+ /**
73
+ * Get the API key or token string for a provider.
74
+ */
75
+ async getToken(provider) {
76
+ const credential = await this.getActiveCredential(provider);
77
+ if (!credential.token) {
78
+ throw new AuthenticationError(provider, "Credential has no token");
79
+ }
80
+ return credential.token;
81
+ }
82
+ /**
83
+ * Re-read tokens from the official CLI's cached storage.
84
+ * This is the "refresh" mechanism — instead of doing HTTP refresh ourselves,
85
+ * we re-read from the CLI tool's cache which may have been refreshed by the CLI.
86
+ */
87
+ async refreshFromCliCache(provider) {
88
+ try {
89
+ const loginModule = await this.loadLoginModule(provider);
90
+ if (!loginModule) {
91
+ return void 0;
92
+ }
93
+ if (typeof loginModule.getCachedCredential === "function") {
94
+ const cached = await loginModule.getCachedCredential();
95
+ if (cached) {
96
+ await this.credentialStore.set(provider, cached);
97
+ if (!this.isExpired(cached) || cached.refreshToken !== void 0) {
98
+ logger.info({ provider }, "Loaded credentials from provider CLI cache");
99
+ return cached;
100
+ }
101
+ }
102
+ }
103
+ const status = await loginModule.getStatus();
104
+ if (!status.loggedIn) {
105
+ return void 0;
106
+ }
107
+ const isStillLoggedIn = await loginModule.isLoggedIn();
108
+ if (!isStillLoggedIn) {
109
+ return void 0;
110
+ }
111
+ const credential = await this.credentialStore.get(provider);
112
+ if (credential && !this.isExpired(credential)) {
113
+ logger.info({ provider }, "Refreshed credentials from CLI cache");
114
+ return credential;
115
+ }
116
+ return void 0;
117
+ } catch (error) {
118
+ const msg = error instanceof Error ? error.message : String(error);
119
+ logger.debug({ provider, error: msg }, "Failed to refresh from CLI cache");
120
+ return void 0;
121
+ }
122
+ }
123
+ async loadLoginModule(provider) {
124
+ try {
125
+ switch (provider) {
126
+ case "anthropic": {
127
+ const mod = await import('./claude-login-5WELXPKT.js');
128
+ return new mod.ClaudeLogin(this.credentialStore);
129
+ }
130
+ case "openai": {
131
+ const mod = await import('./codex-login-7HHLJHBF.js');
132
+ return new mod.CodexLogin(this.credentialStore);
133
+ }
134
+ case "google": {
135
+ const mod = await import('./gemini-login-ZZLYC3J6.js');
136
+ return new mod.GeminiLogin(this.credentialStore);
137
+ }
138
+ case "kimi": {
139
+ const mod = await import('./kimi-login-CZPS63NK.js');
140
+ return new mod.KimiLogin(this.credentialStore);
141
+ }
142
+ default:
143
+ return void 0;
144
+ }
145
+ } catch {
146
+ return void 0;
147
+ }
148
+ }
149
+ isExpired(credential) {
150
+ if (!credential.expiresAt) {
151
+ return false;
152
+ }
153
+ return /* @__PURE__ */ new Date() > credential.expiresAt;
154
+ }
155
+ getFromEnvironment(provider) {
156
+ const envMap = {
157
+ anthropic: "ANTHROPIC_API_KEY",
158
+ openai: "OPENAI_API_KEY",
159
+ google: "GOOGLE_API_KEY",
160
+ kimi: "MOONSHOT_API_KEY",
161
+ ollama: ""
162
+ };
163
+ const envKey = envMap[provider];
164
+ if (!envKey) {
165
+ return void 0;
166
+ }
167
+ const token = process.env[envKey];
168
+ if (!token) {
169
+ return void 0;
170
+ }
171
+ return {
172
+ provider,
173
+ method: "env_variable",
174
+ token
175
+ };
176
+ }
177
+ };
178
+
179
+ export { SessionManager };
180
+ //# sourceMappingURL=chunk-SUSJPZU2.js.map
181
+ //# sourceMappingURL=chunk-SUSJPZU2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/session-manager.ts"],"names":[],"mappings":"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","file":"chunk-SUSJPZU2.js","sourcesContent":["/**\n * Multi-provider session lifecycle per PRD section 13.5\n * Resolution priority: native login (CLI delegation) > API key > env variable > credential helper\n *\n * Credentials are obtained by delegating to official CLI tools:\n * - Claude Code CLI → macOS Keychain\n * - Codex CLI → ~/.codex/auth.json\n * - Gemini CLI → ~/.gemini/oauth_creds.json\n * - Kimi CLI → ~/.kimi/credentials/kimi-code.json\n */\n\nimport type { ProviderName, ICredential, AuthMethod } from \"../types/index.js\";\nimport { AuthenticationError } from \"../types/index.js\";\nimport { CredentialStore } from \"./credential-store.js\";\nimport { ApiKeyFallback } from \"./api-key-fallback.js\";\nimport { logger } from \"../utils/index.js\";\n\nexport class SessionManager {\n private readonly credentialStore: CredentialStore;\n private readonly apiKeyFallback: ApiKeyFallback;\n\n constructor(store?: CredentialStore) {\n this.credentialStore = store ?? new CredentialStore();\n this.apiKeyFallback = new ApiKeyFallback(this.credentialStore);\n }\n\n /**\n * Get the best available credential for a provider.\n * Follows resolution priority from PRD section 13.5.\n */\n async getActiveCredential(provider: ProviderName): Promise<ICredential> {\n // 1. Native account session (delegated CLI login — stored in our credential store)\n const nativeCredential = await this.credentialStore.get(provider);\n if (nativeCredential && nativeCredential.method === \"native_login\" && !this.isExpired(nativeCredential)) {\n return nativeCredential;\n }\n\n // 1b. If expired, try re-reading from the official CLI's cached tokens\n if (nativeCredential && nativeCredential.method === \"native_login\" && this.isExpired(nativeCredential)) {\n const refreshed = await this.refreshFromCliCache(provider);\n if (refreshed) {\n return refreshed;\n }\n }\n\n // 1c. Even if no native credential stored, check CLI caches directly\n if (!nativeCredential || nativeCredential.method !== \"native_login\") {\n const fromCli = await this.refreshFromCliCache(provider);\n if (fromCli) {\n return fromCli;\n }\n }\n\n // 2. API key set via auth set-key\n const apiKeyCredential = await this.apiKeyFallback.getCredential(provider);\n if (apiKeyCredential) {\n return apiKeyCredential;\n }\n\n // 3. Environment variable\n const envCredential = this.getFromEnvironment(provider);\n if (envCredential) {\n return envCredential;\n }\n\n throw new AuthenticationError(provider, `No credentials found for ${provider}`);\n }\n\n /**\n * Check if a provider has any available credential.\n */\n async isAuthenticated(provider: ProviderName): Promise<boolean> {\n try {\n await this.getActiveCredential(provider);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get status info for a provider.\n */\n async getStatus(provider: ProviderName): Promise<{\n loggedIn: boolean;\n method?: AuthMethod | undefined;\n email?: string | undefined;\n plan?: string | undefined;\n }> {\n try {\n const credential = await this.getActiveCredential(provider);\n return {\n loggedIn: true,\n method: credential.method,\n ...(credential.email !== undefined ? { email: credential.email } : {}),\n ...(credential.plan !== undefined ? { plan: credential.plan } : {}),\n };\n } catch {\n return { loggedIn: false };\n }\n }\n\n /**\n * Get the API key or token string for a provider.\n */\n async getToken(provider: ProviderName): Promise<string> {\n const credential = await this.getActiveCredential(provider);\n if (!credential.token) {\n throw new AuthenticationError(provider, \"Credential has no token\");\n }\n return credential.token;\n }\n\n /**\n * Re-read tokens from the official CLI's cached storage.\n * This is the \"refresh\" mechanism — instead of doing HTTP refresh ourselves,\n * we re-read from the CLI tool's cache which may have been refreshed by the CLI.\n */\n private async refreshFromCliCache(provider: ProviderName): Promise<ICredential | undefined> {\n try {\n const loginModule = await this.loadLoginModule(provider);\n if (!loginModule) {\n return undefined;\n }\n\n // Prefer direct cached credential extraction from the provider login module.\n if (typeof loginModule.getCachedCredential === \"function\") {\n const cached = await loginModule.getCachedCredential();\n if (cached) {\n await this.credentialStore.set(provider, cached);\n if (!this.isExpired(cached) || cached.refreshToken !== undefined) {\n logger.info({ provider }, \"Loaded credentials from provider CLI cache\");\n return cached;\n }\n }\n }\n\n const status = await loginModule.getStatus();\n if (!status.loggedIn) {\n return undefined;\n }\n\n // The login module reads from the CLI's cache, check if we can get a fresh credential\n const isStillLoggedIn = await loginModule.isLoggedIn();\n if (!isStillLoggedIn) {\n return undefined;\n }\n\n // Re-read by checking the stored credential in our store\n // The login modules update the credential store when they find valid tokens\n const credential = await this.credentialStore.get(provider);\n if (credential && !this.isExpired(credential)) {\n logger.info({ provider }, \"Refreshed credentials from CLI cache\");\n return credential;\n }\n\n return undefined;\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.debug({ provider, error: msg }, \"Failed to refresh from CLI cache\");\n return undefined;\n }\n }\n\n private async loadLoginModule(provider: ProviderName): Promise<{\n getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }>;\n isLoggedIn(): Promise<boolean>;\n getCachedCredential?(): Promise<ICredential | undefined>;\n } | undefined> {\n try {\n switch (provider) {\n case \"anthropic\": {\n const mod = await import(\"./providers/claude-login.js\");\n return new mod.ClaudeLogin(this.credentialStore);\n }\n case \"openai\": {\n const mod = await import(\"./providers/codex-login.js\");\n return new mod.CodexLogin(this.credentialStore);\n }\n case \"google\": {\n const mod = await import(\"./providers/gemini-login.js\");\n return new mod.GeminiLogin(this.credentialStore);\n }\n case \"kimi\": {\n const mod = await import(\"./providers/kimi-login.js\");\n return new mod.KimiLogin(this.credentialStore);\n }\n default:\n return undefined;\n }\n } catch {\n return undefined;\n }\n }\n\n private isExpired(credential: ICredential): boolean {\n if (!credential.expiresAt) {\n return false;\n }\n return new Date() > credential.expiresAt;\n }\n\n private getFromEnvironment(provider: ProviderName): ICredential | undefined {\n const envMap: Record<ProviderName, string> = {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n kimi: \"MOONSHOT_API_KEY\",\n ollama: \"\",\n };\n\n const envKey = envMap[provider];\n if (!envKey) {\n return undefined;\n }\n\n const token = process.env[envKey];\n if (!token) {\n return undefined;\n }\n\n return {\n provider,\n method: \"env_variable\",\n token,\n };\n }\n}\n"]}