@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.
- package/dist/agent-auth-probe-cli.mjs +69 -37
- package/dist/cli.js +476 -42
- package/dist/cli.js.map +4 -4
- package/dist/index.js +467 -33
- package/dist/index.js.map +4 -4
- package/dist/runner-cli.js +265 -157
- package/dist/runner-cli.js.map +4 -4
- package/dist/set-key-cli.js +38 -2
- package/dist/set-key-cli.js.map +2 -2
- package/package.json +1 -1
|
@@ -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
|
-
|
|
194
|
-
|
|
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 (
|
|
199
|
-
|
|
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
|
-
|
|
209
|
-
|
|
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
|
-
/**
|
|
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
|
|
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
|
};
|