@mrrlin-dev/mcp 0.4.45 → 0.4.47

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 (2) hide show
  1. package/dist/bin.cjs +65 -27
  2. package/package.json +5 -5
package/dist/bin.cjs CHANGED
@@ -40132,8 +40132,21 @@ var ClaudeAgentHandle = class {
40132
40132
  };
40133
40133
 
40134
40134
  // ../../packages/agent-client/dist/registry.js
40135
+ var KNOWN_PROVIDERS = { codex: true, claude: true };
40136
+ var KNOWN_PROVIDER_IDS = Object.keys(KNOWN_PROVIDERS);
40137
+ function readProviderFromEnv(env) {
40138
+ const raw = env.MRRLIN_AGENT_PROVIDER;
40139
+ if (raw === void 0)
40140
+ return null;
40141
+ const normalized = raw.trim().toLowerCase();
40142
+ if (!normalized)
40143
+ return null;
40144
+ if (Object.hasOwn(KNOWN_PROVIDERS, normalized))
40145
+ return normalized;
40146
+ throw new Error(`MRRLIN_AGENT_PROVIDER is set to ${JSON.stringify(raw.slice(0, 64))}, which is not an agent provider this build can run. Valid values: ${KNOWN_PROVIDER_IDS.join(", ")}. Unset the variable to use the operator's persisted choice.`);
40147
+ }
40135
40148
  function resolveProvider(env, persisted) {
40136
- const id = env.MRRLIN_AGENT_PROVIDER ?? persisted ?? "codex";
40149
+ const id = readProviderFromEnv(env) ?? persisted ?? "codex";
40137
40150
  if (id === "codex") {
40138
40151
  return new CodexProviderAdapter();
40139
40152
  }
@@ -42295,7 +42308,7 @@ Do NOT derail the current task - if the operator has an in-flight question, answ
42295
42308
  }
42296
42309
 
42297
42310
  // src/_generated/version.ts
42298
- var PKG_VERSION = "0.4.45";
42311
+ var PKG_VERSION = "0.4.47";
42299
42312
 
42300
42313
  // src/api-base-url-migrate.ts
42301
42314
  var import_node_fs3 = __toESM(require("node:fs"), 1);
@@ -55918,6 +55931,7 @@ function describeZeroOutputLimit(signal) {
55918
55931
  resetAt: signal.resetAt
55919
55932
  };
55920
55933
  }
55934
+ var BOOTSTRAP_SEAT_REFRESH_TIMEOUT_MS = 3e3;
55921
55935
  function createBridgeMessageHandler(deps) {
55922
55936
  const tombstones = deps.tombstones ?? /* @__PURE__ */ new Map();
55923
55937
  const pendingTurnSessions = deps.pendingTurnSessions ?? /* @__PURE__ */ new Set();
@@ -56390,6 +56404,14 @@ function createBridgeMessageHandler(deps) {
56390
56404
  let bootstrapError;
56391
56405
  const fallbackModels = readCodexFallbackModels();
56392
56406
  try {
56407
+ if (deps.refreshSelectedProvider) {
56408
+ await withTimeout2(
56409
+ deps.refreshSelectedProvider(),
56410
+ deps.seatRefreshTimeoutMs ?? BOOTSTRAP_SEAT_REFRESH_TIMEOUT_MS,
56411
+ "seat refresh timed out"
56412
+ ).catch(() => {
56413
+ });
56414
+ }
56393
56415
  const bootstrapProviderId = resolveProvider(process.env, getSelectedProvider()).id;
56394
56416
  const codexClient2 = await deps.acquireCodex(bootstrapProviderId);
56395
56417
  try {
@@ -57084,20 +57106,18 @@ function checkTelemetryDefaultProject(env, warn) {
57084
57106
  }
57085
57107
  function createSelectedProviderRefresher(deps) {
57086
57108
  let lastError = null;
57087
- return () => {
57088
- deps.read().then((config2) => {
57089
- lastError = null;
57090
- deps.apply(config2.agentProvider);
57091
- }).catch((error51) => {
57092
- const message = error51 instanceof Error ? error51.message : String(error51);
57093
- if (message !== lastError) {
57094
- lastError = message;
57095
- deps.warn(
57096
- `[mrrlin-mcp director-bridge] agent-provider refresh failed; keeping the held seat: ${message}`
57097
- );
57098
- }
57099
- });
57100
- };
57109
+ return () => deps.read().then((config2) => {
57110
+ lastError = null;
57111
+ deps.apply(config2.agentProvider);
57112
+ }).catch((error51) => {
57113
+ const message = error51 instanceof Error ? error51.message : String(error51);
57114
+ if (message !== lastError) {
57115
+ lastError = message;
57116
+ deps.warn(
57117
+ `[mrrlin-mcp director-bridge] agent-provider refresh failed; keeping the held seat: ${message}`
57118
+ );
57119
+ }
57120
+ });
57101
57121
  }
57102
57122
  async function startDirectorBridge() {
57103
57123
  const config2 = parseConfig();
@@ -57545,10 +57565,20 @@ async function startDirectorBridge() {
57545
57565
  });
57546
57566
  return block.text;
57547
57567
  };
57568
+ let refreshSelectedProvider = null;
57569
+ if (tokenProvider) {
57570
+ refreshSelectedProvider = createSelectedProviderRefresher({
57571
+ read: () => client.getAgentProviderConfig(),
57572
+ apply: setSelectedProvider,
57573
+ warn: (m) => process.stderr.write(`${m}
57574
+ `)
57575
+ });
57576
+ }
57548
57577
  const sharedHandlerDeps = {
57549
57578
  acquireCodex: (providerId) => agentKeepalive.acquire(providerId),
57550
57579
  releaseCodex: (providerId) => agentKeepalive.release(providerId),
57551
57580
  refreshCodex: () => agentKeepalive.refreshNow(resolveProvider(process.env, getSelectedProvider()).id),
57581
+ ...refreshSelectedProvider ? { refreshSelectedProvider } : {},
57552
57582
  run: wrappedTurnLock.run,
57553
57583
  suspendedMs: () => suspensionDetector.suspendedMs(),
57554
57584
  buildStartParams: (msg, desiredModel) => buildThreadStartParams(msg, config2, desiredModel),
@@ -57875,15 +57905,10 @@ async function startDirectorBridge() {
57875
57905
  );
57876
57906
  }
57877
57907
  let selectedProviderTimer = null;
57878
- if (tokenProvider) {
57879
- const refreshSelectedProvider = createSelectedProviderRefresher({
57880
- read: () => client.getAgentProviderConfig(),
57881
- apply: setSelectedProvider,
57882
- warn: (m) => process.stderr.write(`${m}
57883
- `)
57884
- });
57885
- refreshSelectedProvider();
57886
- selectedProviderTimer = setInterval(refreshSelectedProvider, 6e4);
57908
+ if (refreshSelectedProvider) {
57909
+ const refresh = refreshSelectedProvider;
57910
+ void refresh();
57911
+ selectedProviderTimer = setInterval(() => void refresh(), 6e4);
57887
57912
  selectedProviderTimer.unref?.();
57888
57913
  }
57889
57914
  let agentPoolLoopHandle = null;
@@ -62045,11 +62070,24 @@ async function runShadowPanel(input, deps) {
62045
62070
  const res = await built.runner.runHead(persona, input.artifact, "");
62046
62071
  if (res.ok) {
62047
62072
  const parsed = parseVerdict(res.text);
62048
- return { persona, agent, verdict: parsed.verdict, ok: true };
62073
+ return {
62074
+ persona,
62075
+ agent,
62076
+ verdict: parsed.verdict,
62077
+ ok: true,
62078
+ // The optional chain is required by the TYPE, not left over from not knowing the
62079
+ // invariant: `MultiHeadRunResult.usage` is declared `usage?: ExecTokenUsage | null`
62080
+ // (optional so the shape stays assignable to the gate's older `RunResult`), even though
62081
+ // `parseDispatch` always sets it. `?? null` therefore covers both "no usage key" and
62082
+ // "usage was null" — and covers neither zero: a reported 0 is a measurement and
62083
+ // survives, which is the distinction this whole field exists to preserve.
62084
+ inputTokens: res.usage?.inputTokens ?? null,
62085
+ outputTokens: res.usage?.outputTokens ?? null
62086
+ };
62049
62087
  }
62050
62088
  } catch {
62051
62089
  }
62052
- return { persona, agent, verdict: "ERROR", ok: false };
62090
+ return { persona, agent, verdict: "ERROR", ok: false, inputTokens: null, outputTokens: null };
62053
62091
  })
62054
62092
  );
62055
62093
  for (const h of perHead) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mrrlin-dev/mcp",
3
- "version": "0.4.45",
3
+ "version": "0.4.47",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "mrrlin-mcp": "dist/bin.cjs"
@@ -21,12 +21,12 @@
21
21
  "@types/ws": "^8.18.1",
22
22
  "esbuild": "^0.24.0",
23
23
  "tsx": "^4.22.3",
24
- "@mrrlin/agent-client": "0.0.0",
25
- "@mrrlin/tsconfig": "0.0.0",
26
- "@mrrlin/wiki": "0.0.0",
27
24
  "@mrrlin/client": "0.0.0",
25
+ "@mrrlin/agent-client": "0.0.0",
28
26
  "@mrrlin/director-e2e": "0.0.0",
29
- "@mrrlin/schemas": "0.0.0"
27
+ "@mrrlin/schemas": "0.0.0",
28
+ "@mrrlin/tsconfig": "0.0.0",
29
+ "@mrrlin/wiki": "0.0.0"
30
30
  },
31
31
  "dependencies": {
32
32
  "@iarna/toml": "^2.2.5",