@algosuite/vo-mcp 0.2.0-beta.28 → 0.2.0-beta.29

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.
@@ -151,6 +151,56 @@ function spawnClaudeSync(args = [], options = {}) {
151
151
  }
152
152
  }
153
153
 
154
+ // ../../scripts/virtual-office/code-runner/claude-credential-choice.mjs
155
+ var PREFER_LOGIN_ENV = "VO_RUNNER_PREFER_LOGIN";
156
+ var CLAUDE_PREFER_LOGIN_ENV = "VO_RUNNER_CLAUDE_PREFER_LOGIN";
157
+ var PREFER_KEY_ENV = "VO_RUNNER_PREFER_KEY";
158
+ var CLAUDE_PREFER_KEY_ENV = "VO_RUNNER_CLAUDE_PREFER_KEY";
159
+ var CLAUDE_CREDENTIAL_SOURCE = Object.freeze({
160
+ /** PREFER_LOGIN set (and not overridden): any API key is ignored. */
161
+ PREFER_LOGIN: "prefer_login",
162
+ /** An explicit ANTHROPIC_API_KEY in the environment — the manual override. */
163
+ ENV_KEY: "env_key",
164
+ /** No key anywhere; the spawn falls through to the login session. */
165
+ NO_KEY: "no_key",
166
+ /** A stored key, used because the operator explicitly opted out of tier 1. */
167
+ KEYCHAIN_PREFER_KEY: "keychain_prefer_key",
168
+ /** A stored key exists but a proven live subscription outranks it. */
169
+ SUBSCRIPTION_WINS: "subscription_wins",
170
+ /** A stored key, used because no live subscription was proven. */
171
+ KEYCHAIN: "keychain"
172
+ });
173
+ function isTruthyFlag(v) {
174
+ const s = String(v ?? "").trim().toLowerCase();
175
+ return s === "1" || s === "true" || s === "yes" || s === "on";
176
+ }
177
+ function wantsLogin(env) {
178
+ return isTruthyFlag(env[CLAUDE_PREFER_LOGIN_ENV]) || isTruthyFlag(env[PREFER_LOGIN_ENV]);
179
+ }
180
+ function wantsKey(env) {
181
+ return isTruthyFlag(env[CLAUDE_PREFER_KEY_ENV]) || isTruthyFlag(env[PREFER_KEY_ENV]);
182
+ }
183
+ function classifyClaudeCredential(baseEnv = {}, { getKey, probeLogin } = {}) {
184
+ const preferKey = wantsKey(baseEnv);
185
+ if (!preferKey && wantsLogin(baseEnv)) {
186
+ return { source: CLAUDE_CREDENTIAL_SOURCE.PREFER_LOGIN, key: null };
187
+ }
188
+ if (baseEnv.ANTHROPIC_API_KEY) {
189
+ return { source: CLAUDE_CREDENTIAL_SOURCE.ENV_KEY, key: null };
190
+ }
191
+ const key = getKey();
192
+ if (!key) {
193
+ return { source: CLAUDE_CREDENTIAL_SOURCE.NO_KEY, key: null };
194
+ }
195
+ if (preferKey) {
196
+ return { source: CLAUDE_CREDENTIAL_SOURCE.KEYCHAIN_PREFER_KEY, key };
197
+ }
198
+ if (probeLogin() === true) {
199
+ return { source: CLAUDE_CREDENTIAL_SOURCE.SUBSCRIPTION_WINS, key: null };
200
+ }
201
+ return { source: CLAUDE_CREDENTIAL_SOURCE.KEYCHAIN, key };
202
+ }
203
+
154
204
  // ../../scripts/virtual-office/code-runner/anthropic-key-store.mjs
155
205
  var require2 = createRequire(import.meta.url);
156
206
  var KEY_SERVICE = "algosuite-vo";
@@ -175,50 +225,30 @@ function getAnthropicKey({ EntryCtor = defaultEntryCtor() } = {}) {
175
225
  return null;
176
226
  }
177
227
  }
178
- var PREFER_LOGIN_ENV = "VO_RUNNER_PREFER_LOGIN";
179
- var CLAUDE_PREFER_LOGIN_ENV = "VO_RUNNER_CLAUDE_PREFER_LOGIN";
180
- var PREFER_KEY_ENV = "VO_RUNNER_PREFER_KEY";
181
- var CLAUDE_PREFER_KEY_ENV = "VO_RUNNER_CLAUDE_PREFER_KEY";
182
- function isTruthyFlag(v) {
183
- const s = String(v ?? "").trim().toLowerCase();
184
- return s === "1" || s === "true" || s === "yes" || s === "on";
185
- }
186
- function wantsLogin(env) {
187
- return isTruthyFlag(env[CLAUDE_PREFER_LOGIN_ENV]) || isTruthyFlag(env[PREFER_LOGIN_ENV]);
188
- }
189
- function wantsKey(env) {
190
- return isTruthyFlag(env[CLAUDE_PREFER_KEY_ENV]) || isTruthyFlag(env[PREFER_KEY_ENV]);
191
- }
192
228
  function withAnthropicKey(baseEnv = {}, { getKey = getAnthropicKey, probeLogin = probeClaudeLoginState } = {}) {
193
- const preferKey = wantsKey(baseEnv);
194
- if (!preferKey && wantsLogin(baseEnv)) {
195
- const next = { ...baseEnv };
229
+ const { source, key } = classifyClaudeCredential(baseEnv, { getKey, probeLogin });
230
+ const next = { ...baseEnv };
231
+ if (source === CLAUDE_CREDENTIAL_SOURCE.PREFER_LOGIN) {
196
232
  delete next.ANTHROPIC_API_KEY;
197
233
  return next;
198
234
  }
199
- if (baseEnv.ANTHROPIC_API_KEY) return { ...baseEnv };
200
- const key = getKey();
201
- if (!key) return { ...baseEnv };
202
- if (!preferKey && probeLogin() === true) return { ...baseEnv };
203
- return { ...baseEnv, ANTHROPIC_API_KEY: key };
235
+ if (key !== null) next.ANTHROPIC_API_KEY = key;
236
+ return next;
204
237
  }
205
238
  function claudeCostBasis(env = process.env) {
206
239
  return String(env.ANTHROPIC_API_KEY || "").trim() ? "vendor_billed" : "subscription_api_equivalent";
207
240
  }
241
+ var AUTH_SOURCE_DESCRIPTION = Object.freeze({
242
+ [CLAUDE_CREDENTIAL_SOURCE.PREFER_LOGIN]: "claude auth login (VO_RUNNER_PREFER_LOGIN set \u2014 any API key ignored)",
243
+ [CLAUDE_CREDENTIAL_SOURCE.ENV_KEY]: "ANTHROPIC_API_KEY from environment",
244
+ [CLAUDE_CREDENTIAL_SOURCE.NO_KEY]: "claude auth login session (no API key set)",
245
+ [CLAUDE_CREDENTIAL_SOURCE.KEYCHAIN_PREFER_KEY]: "ANTHROPIC_API_KEY from OS keychain (VO_RUNNER_PREFER_KEY set \u2014 subscription ignored)",
246
+ [CLAUDE_CREDENTIAL_SOURCE.SUBSCRIPTION_WINS]: "claude auth login session (subscription beats the stored keychain key)",
247
+ [CLAUDE_CREDENTIAL_SOURCE.KEYCHAIN]: "ANTHROPIC_API_KEY from OS keychain"
248
+ });
208
249
  function describeAnthropicAuthSource(baseEnv = {}, { getKey = getAnthropicKey, probeLogin = probeClaudeLoginState } = {}) {
209
- const preferKey = wantsKey(baseEnv);
210
- if (!preferKey && wantsLogin(baseEnv)) {
211
- return "claude auth login (VO_RUNNER_PREFER_LOGIN set \u2014 any API key ignored)";
212
- }
213
- if (baseEnv.ANTHROPIC_API_KEY) return "ANTHROPIC_API_KEY from environment";
214
- if (!getKey()) return "claude auth login session (no API key set)";
215
- if (preferKey) {
216
- return "ANTHROPIC_API_KEY from OS keychain (VO_RUNNER_PREFER_KEY set \u2014 subscription ignored)";
217
- }
218
- if (probeLogin() === true) {
219
- return "claude auth login session (subscription beats the stored keychain key)";
220
- }
221
- return "ANTHROPIC_API_KEY from OS keychain";
250
+ const { source } = classifyClaudeCredential(baseEnv, { getKey, probeLogin });
251
+ return AUTH_SOURCE_DESCRIPTION[source];
222
252
  }
223
253
  function probeClaudeLoginState({
224
254
  spawn: spawn2 = spawnSync2,