@algosuite/vo-mcp 0.2.0-beta.27 → 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,48 +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
- if (wantsLogin(baseEnv)) {
194
- const next = { ...baseEnv };
229
+ const { source, key } = classifyClaudeCredential(baseEnv, { getKey, probeLogin });
230
+ const next = { ...baseEnv };
231
+ if (source === CLAUDE_CREDENTIAL_SOURCE.PREFER_LOGIN) {
195
232
  delete next.ANTHROPIC_API_KEY;
196
233
  return next;
197
234
  }
198
- if (baseEnv.ANTHROPIC_API_KEY) return { ...baseEnv };
199
- const key = getKey();
200
- if (!key) return { ...baseEnv };
201
- if (!wantsKey(baseEnv) && probeLogin() === true) return { ...baseEnv };
202
- return { ...baseEnv, ANTHROPIC_API_KEY: key };
235
+ if (key !== null) next.ANTHROPIC_API_KEY = key;
236
+ return next;
203
237
  }
204
238
  function claudeCostBasis(env = process.env) {
205
239
  return String(env.ANTHROPIC_API_KEY || "").trim() ? "vendor_billed" : "subscription_api_equivalent";
206
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
+ });
207
249
  function describeAnthropicAuthSource(baseEnv = {}, { getKey = getAnthropicKey, probeLogin = probeClaudeLoginState } = {}) {
208
- if (wantsLogin(baseEnv)) {
209
- return "claude auth login (VO_RUNNER_PREFER_LOGIN set \u2014 any API key ignored)";
210
- }
211
- if (baseEnv.ANTHROPIC_API_KEY) return "ANTHROPIC_API_KEY from environment";
212
- if (!getKey()) return "claude auth login session (no API key set)";
213
- if (wantsKey(baseEnv)) {
214
- return "ANTHROPIC_API_KEY from OS keychain (VO_RUNNER_PREFER_KEY set \u2014 subscription ignored)";
215
- }
216
- if (probeLogin() === true) {
217
- return "claude auth login session (subscription beats the stored keychain key)";
218
- }
219
- return "ANTHROPIC_API_KEY from OS keychain";
250
+ const { source } = classifyClaudeCredential(baseEnv, { getKey, probeLogin });
251
+ return AUTH_SOURCE_DESCRIPTION[source];
220
252
  }
221
253
  function probeClaudeLoginState({
222
254
  spawn: spawn2 = spawnSync2,
@@ -1347,7 +1379,7 @@ var OpenAICompatibleRunner = class {
1347
1379
  buildArgs(opts = {}) {
1348
1380
  void opts;
1349
1381
  throw new Error(
1350
- "OpenAI-compatible full-repository coding is disabled. Use an explicit sanitized task capsule through the AlgoSuite Model Firewall."
1382
+ "OpenAI-compatible full-repository coding is disabled. The `oai` runner lane is RETIRED (PR #8742) and executes nothing. Set VO_CODE_RUNNER_AGENT to claude, codex, cursor, local, or meta. Use an explicit sanitized task capsule through the AlgoSuite Model Firewall."
1351
1383
  );
1352
1384
  }
1353
1385
  /** Codex JSONL events map identically → reuse the proven parser. */
@@ -1370,14 +1402,14 @@ var OpenAICompatibleRunner = class {
1370
1402
  describeAuth(env = process.env) {
1371
1403
  const hasKey = Boolean(String(env[OAI_API_KEY_ENV] || "").trim());
1372
1404
  const baseUrl = resolveOaiBaseUrl(env);
1373
- return `oai-compat endpoint=${baseUrl || "<unset>"} key=${hasKey ? "set" : "MISSING"}`;
1405
+ return `oai-compat RETIRED endpoint=${baseUrl || "<unset>"} key=${hasKey ? "set" : "MISSING"}`;
1374
1406
  }
1375
- /** Best-effort: base URL chosen AND the codex transport is installed. */
1407
+ /** Always unavailable: the lane is retired, so nothing can authenticate it. */
1376
1408
  async checkAuth() {
1377
1409
  return {
1378
1410
  installed: false,
1379
1411
  authenticated: false,
1380
- message: "OpenAI-compatible coding is disabled; sanitized Model Firewall task capsules only"
1412
+ message: "the `oai` lane is RETIRED (PR #8742); OpenAI-compatible coding is disabled \u2014 sanitized Model Firewall task capsules only"
1381
1413
  };
1382
1414
  }
1383
1415
  };