@agentproto/runtime 2.10.0 → 2.10.1

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/index.d.ts CHANGED
@@ -4924,6 +4924,16 @@ interface SessionDescriptor {
4924
4924
  * may name a gateway route.
4925
4925
  */
4926
4926
  adapterProvider?: string;
4927
+ /**
4928
+ * The adapter manifest's `authDescriptor.modelDerivedApiKey` — recorded at
4929
+ * spawn time so a live `setModel` applies the SAME wire normalization the
4930
+ * spawn path used (`normalizeModelForWire`'s `ModelWireOptions.modelDerivedApiKey`
4931
+ * doc): for a `derived-from-model` adapter billed through a gateway/router,
4932
+ * this decides whether the wire model needs the router re-added as a
4933
+ * literal leading segment (opencode/mastracode/jcode/pi/mastra-agent) or
4934
+ * left bare (hermes).
4935
+ */
4936
+ modelDerivedApiKey?: boolean;
4927
4937
  /**
4928
4938
  * AIP-45 mode the session was spawned with (`AgentCliStartOptions.config.
4929
4939
  * mode` — e.g. claude-code's `plan`/`accept-edits`, a gateway preset mode
@@ -6240,6 +6250,10 @@ interface SpawnAgentInput {
6240
6250
  * {@link SessionDescriptor.adapterProvider} so live `setModel` knows when
6241
6251
  * to bare a direct `vendor/product` ref; ignored for derived adapters. */
6242
6252
  adapterProvider?: string;
6253
+ /** Manifest-declared `authDescriptor.modelDerivedApiKey` — recorded onto
6254
+ * {@link SessionDescriptor.modelDerivedApiKey} so live `setModel` applies
6255
+ * the same router re-prefixing the spawn path used. */
6256
+ modelDerivedApiKey?: boolean;
6243
6257
  /** Optional initial prompt to dispatch immediately. The promise
6244
6258
  * the registry returns resolves AFTER the spawn — the prompt
6245
6259
  * runs in the background, projecting events into the ring
@@ -8489,6 +8503,10 @@ interface RouteAwareLaunchConfigInput {
8489
8503
  routeSelection?: "free" | "derived-from-model";
8490
8504
  /** Fixed provider for this adapter (e.g. `"anthropic"`), used for wire-model prefix stripping. */
8491
8505
  adapterProvider?: string;
8506
+ /** `AdapterAuthDescriptor.modelDerivedApiKey` — see `normalizeModelForWire`'s
8507
+ * `ModelWireOptions.modelDerivedApiKey` doc for why this changes the wire
8508
+ * shape on a gateway-routed `derived-from-model` adapter. */
8509
+ modelDerivedApiKey?: boolean;
8492
8510
  /** Skills list folded into `options.skills` per the manifest's declared shape. */
8493
8511
  skills?: string[];
8494
8512
  /**
package/dist/index.mjs CHANGED
@@ -11,7 +11,7 @@ import { EventEmitter } from 'events';
11
11
  import { listAuthProfiles, eligibleProfiles, getAuthProfile, createAuthProfile, AuthProfileValidationError, deleteAuthProfile, KeychainStore, removeAuthProfile, addAuthProfile, setAuthProfileEnabled, setAuthProfileModels, refreshAuthProfileModels, credentialIdentity } from '@agentproto/auth';
12
12
  import { resolveRecipeMethod, resolveSourceSpec } from '@agentproto/secrets/provision/recipe';
13
13
  import { getModelProvider, resolveContextWindow, formatTokens, resolvePricing, LLM_PRICING_CATALOG, resolvePricingExact, MODEL_ALIASES } from '@agentproto/model-catalog/llm';
14
- import { resolveCustomRoute, registerCustomRoute, stripRouteSuffix, stripFixedNativeVendor, formatModelRef, resolveLlmModelRoute, tryParseModelRef } from '@agentproto/model-catalog/route-identity';
14
+ import { resolveCustomRoute, registerCustomRoute, formatModelRef, resolveLlmModelRoute, tryParseModelRef, stripRouteSuffix, stripFixedNativeVendor } from '@agentproto/model-catalog/route-identity';
15
15
  import { findAnthropicGatewayPreset, anthropicGatewayPresetList, getAnthropicGatewayPreset } from '@agentproto/provider-presets';
16
16
  import * as providers_store_star from '@agentproto/providers-store';
17
17
  import { makeAdapterLister, makeAdapterResolver, makeCredsStore, discoverAdapterPackages, makeSetupLedger, makeListTool, makeSetupTool } from '@agentproto/provider-kit';
@@ -3831,60 +3831,6 @@ function resolveWorktreeIdentity(cwd) {
3831
3831
  dir = parent;
3832
3832
  }
3833
3833
  }
3834
- function normalizeModelForWire(model, opts) {
3835
- if (opts.routeSelection === "derived-from-model") {
3836
- return stripRouteSuffix(model);
3837
- }
3838
- const nativeVendor = opts.gateway ?? opts.fixedProvider;
3839
- if (nativeVendor) {
3840
- return stripFixedNativeVendor(model, nativeVendor);
3841
- }
3842
- return stripRouteSuffix(model);
3843
- }
3844
-
3845
- // src/launch-config.ts
3846
- function buildRouteAwareLaunchConfig(input) {
3847
- const prefix = input.prefix ?? "agent_start";
3848
- const baseOptions = input.options ?? {};
3849
- const hasExplicitBaseUrlOption = typeof baseOptions.base_url === "string" && baseOptions.base_url.length > 0;
3850
- const gatewayResolvedBaseUrl = input.authSpec?.baseUrl;
3851
- const resolvedBaseUrl = gatewayResolvedBaseUrl ?? input.route?.baseUrl;
3852
- let routedOptions = baseOptions;
3853
- if (!hasExplicitBaseUrlOption && typeof resolvedBaseUrl === "string" && resolvedBaseUrl.length > 0) {
3854
- const declaresBaseUrl = input.declaredOptions?.some((o) => o.id === "base_url") ?? false;
3855
- const declaredOptionsKnown = input.declaredOptions !== void 0;
3856
- if (declaresBaseUrl || !declaredOptionsKnown) {
3857
- routedOptions = { ...baseOptions, base_url: resolvedBaseUrl };
3858
- } else if (input.routeSelection === "derived-from-model") {
3859
- routedOptions = baseOptions;
3860
- } else {
3861
- throw new Error(
3862
- `${prefix}: adapter "${input.adapter}" cannot be routed through gateway "${input.route?.gateway ?? "unknown"}" \u2014 it declares no \`base_url\` option and does not derive its route from the model id (routeSelection !== "derived-from-model"), so the resolved gateway endpoint has nowhere to go. Declare a \`base_url\` option on the adapter manifest, or mark it \`routeSelection: "derived-from-model"\` if it already resolves its own gateway from the model prefix.`
3863
- );
3864
- }
3865
- }
3866
- const effectiveOptions = normalizeSkillsOption(
3867
- input.skills ?? [],
3868
- routedOptions,
3869
- input.declaredOptions
3870
- );
3871
- const wireModel = input.model ? normalizeModelForWire(input.model, {
3872
- routeSelection: input.routeSelection,
3873
- gateway: input.route?.gateway,
3874
- fixedProvider: input.adapterProvider
3875
- }) : void 0;
3876
- const out = {};
3877
- if (Object.keys(effectiveOptions).length > 0) {
3878
- out.options = effectiveOptions;
3879
- }
3880
- if (wireModel) {
3881
- out.wireModel = wireModel;
3882
- }
3883
- if (resolvedBaseUrl) {
3884
- out.resolvedBaseUrl = resolvedBaseUrl;
3885
- }
3886
- return out;
3887
- }
3888
3834
  var WIDENING_ROUTES = ["openrouter", "requesty", "huggingface"];
3889
3835
  var VENDOR_COMPATIBILITY_ROUTES = {
3890
3836
  xai: ["xai", "xai-anthropic"]
@@ -4279,6 +4225,67 @@ function modelWalletIneligibleMessage(opts) {
4279
4225
  return `${opts.prefix}: model "${opts.model}" is not serviceable on the resolved ${wallet} (adapter "${opts.adapter}") and would 404 upstream. This model bills route "${primary}"${also} \u2014 re-spawn on it: set route.gateway="${primary}" with an eligible "${primary}" api-key profile (access.profileRef). This guard only rejects; it never switches wallets for you.`;
4280
4226
  }
4281
4227
 
4228
+ // src/model-wire.ts
4229
+ function normalizeModelForWire(model, opts) {
4230
+ if (opts.routeSelection === "derived-from-model") {
4231
+ const bare = stripRouteSuffix(model);
4232
+ if (opts.modelDerivedApiKey && opts.gateway && WIDENING_ROUTES.includes(opts.gateway) && !bare.startsWith(`${opts.gateway}/`)) {
4233
+ return `${opts.gateway}/${bare}`;
4234
+ }
4235
+ return bare;
4236
+ }
4237
+ const nativeVendor = opts.gateway ?? opts.fixedProvider;
4238
+ if (nativeVendor) {
4239
+ return stripFixedNativeVendor(model, nativeVendor);
4240
+ }
4241
+ return stripRouteSuffix(model);
4242
+ }
4243
+
4244
+ // src/launch-config.ts
4245
+ function buildRouteAwareLaunchConfig(input) {
4246
+ const prefix = input.prefix ?? "agent_start";
4247
+ const baseOptions = input.options ?? {};
4248
+ const hasExplicitBaseUrlOption = typeof baseOptions.base_url === "string" && baseOptions.base_url.length > 0;
4249
+ const gatewayResolvedBaseUrl = input.authSpec?.baseUrl;
4250
+ const resolvedBaseUrl = gatewayResolvedBaseUrl ?? input.route?.baseUrl;
4251
+ let routedOptions = baseOptions;
4252
+ if (!hasExplicitBaseUrlOption && typeof resolvedBaseUrl === "string" && resolvedBaseUrl.length > 0) {
4253
+ const declaresBaseUrl = input.declaredOptions?.some((o) => o.id === "base_url") ?? false;
4254
+ const declaredOptionsKnown = input.declaredOptions !== void 0;
4255
+ if (declaresBaseUrl || !declaredOptionsKnown) {
4256
+ routedOptions = { ...baseOptions, base_url: resolvedBaseUrl };
4257
+ } else if (input.routeSelection === "derived-from-model") {
4258
+ routedOptions = baseOptions;
4259
+ } else {
4260
+ throw new Error(
4261
+ `${prefix}: adapter "${input.adapter}" cannot be routed through gateway "${input.route?.gateway ?? "unknown"}" \u2014 it declares no \`base_url\` option and does not derive its route from the model id (routeSelection !== "derived-from-model"), so the resolved gateway endpoint has nowhere to go. Declare a \`base_url\` option on the adapter manifest, or mark it \`routeSelection: "derived-from-model"\` if it already resolves its own gateway from the model prefix.`
4262
+ );
4263
+ }
4264
+ }
4265
+ const effectiveOptions = normalizeSkillsOption(
4266
+ input.skills ?? [],
4267
+ routedOptions,
4268
+ input.declaredOptions
4269
+ );
4270
+ const wireModel = input.model ? normalizeModelForWire(input.model, {
4271
+ routeSelection: input.routeSelection,
4272
+ gateway: input.route?.gateway,
4273
+ fixedProvider: input.adapterProvider,
4274
+ modelDerivedApiKey: input.modelDerivedApiKey
4275
+ }) : void 0;
4276
+ const out = {};
4277
+ if (Object.keys(effectiveOptions).length > 0) {
4278
+ out.options = effectiveOptions;
4279
+ }
4280
+ if (wireModel) {
4281
+ out.wireModel = wireModel;
4282
+ }
4283
+ if (resolvedBaseUrl) {
4284
+ out.resolvedBaseUrl = resolvedBaseUrl;
4285
+ }
4286
+ return out;
4287
+ }
4288
+
4282
4289
  // src/context-continuity.ts
4283
4290
  var CONTEXT_CONTINUITY_DEFAULTS = {
4284
4291
  mode: "ask",
@@ -6248,6 +6255,7 @@ async function spawnAgentSession(deps2, input) {
6248
6255
  declaredOptions: resolved?.declaredOptions,
6249
6256
  routeSelection: resolved?.routeSelection,
6250
6257
  adapterProvider: resolved?.authDescriptor?.provider,
6258
+ modelDerivedApiKey: resolved?.authDescriptor?.modelDerivedApiKey,
6251
6259
  skills: spawnDefaults.skills,
6252
6260
  prefix: "agent_start"
6253
6261
  });
@@ -6352,6 +6360,7 @@ async function spawnAgentSession(deps2, input) {
6352
6360
  ...worktreeAutoProvisioned ? { worktreeAutoProvisioned: true } : {},
6353
6361
  ...resolved?.routeSelection !== void 0 ? { routeSelection: resolved.routeSelection } : {},
6354
6362
  ...resolved?.authDescriptor?.provider !== void 0 ? { adapterProvider: resolved.authDescriptor.provider } : {},
6363
+ ...resolved?.authDescriptor?.modelDerivedApiKey !== void 0 ? { modelDerivedApiKey: resolved.authDescriptor.modelDerivedApiKey } : {},
6355
6364
  ...input.model ? { model: input.model } : defaultModel2 ? { model: defaultModel2 } : {},
6356
6365
  ...input.mode ? { mode: input.mode } : {},
6357
6366
  ...input.effort ? { effort: input.effort } : {},
@@ -6629,6 +6638,7 @@ ${effectivePrompt}`;
6629
6638
  harness: input.harness ?? input.adapter,
6630
6639
  ...resolved?.routeSelection !== void 0 ? { routeSelection: resolved.routeSelection } : {},
6631
6640
  ...resolved?.authDescriptor?.provider !== void 0 ? { adapterProvider: resolved.authDescriptor.provider } : {},
6641
+ ...resolved?.authDescriptor?.modelDerivedApiKey !== void 0 ? { modelDerivedApiKey: resolved.authDescriptor.modelDerivedApiKey } : {},
6632
6642
  ...input.model ? { model: input.model } : defaultModel ? { model: defaultModel } : {},
6633
6643
  ...input.mode ? { mode: input.mode } : {},
6634
6644
  ...input.effort ? { effort: input.effort } : {},
@@ -10151,6 +10161,7 @@ ${message}`;
10151
10161
  harness: input.harness ?? input.adapterSlug,
10152
10162
  ...input.routeSelection !== void 0 ? { routeSelection: input.routeSelection } : {},
10153
10163
  ...input.adapterProvider !== void 0 ? { adapterProvider: input.adapterProvider } : {},
10164
+ ...input.modelDerivedApiKey !== void 0 ? { modelDerivedApiKey: input.modelDerivedApiKey } : {},
10154
10165
  // ACP-level session id — sticks across daemon restart so
10155
10166
  // `agentproto sessions restart <id>` can pass it as
10156
10167
  // `resumeSessionId` and the adapter reattaches to the prior
@@ -10276,6 +10287,7 @@ ${message}`;
10276
10287
  harness: input.harness ?? input.adapterSlug,
10277
10288
  ...input.routeSelection !== void 0 ? { routeSelection: input.routeSelection } : {},
10278
10289
  ...input.adapterProvider !== void 0 ? { adapterProvider: input.adapterProvider } : {},
10290
+ ...input.modelDerivedApiKey !== void 0 ? { modelDerivedApiKey: input.modelDerivedApiKey } : {},
10279
10291
  ...input.label ? { label: input.label } : {},
10280
10292
  ...input.title ? { title: input.title } : {},
10281
10293
  ...input.label ? { renamedByUser: false } : {},
@@ -10812,7 +10824,8 @@ ${message}`;
10812
10824
  }
10813
10825
  let routeSelection = rt.desc.routeSelection;
10814
10826
  let adapterProvider = rt.desc.adapterProvider;
10815
- const needsAdapterMetadata = routeSelection === void 0 || routeSelection !== "derived-from-model" && adapterProvider === void 0;
10827
+ let modelDerivedApiKey = rt.desc.modelDerivedApiKey;
10828
+ const needsAdapterMetadata = routeSelection === void 0 || modelDerivedApiKey === void 0 || routeSelection !== "derived-from-model" && adapterProvider === void 0;
10816
10829
  const adapterSlug = rt.desc.adapterSlug ?? rt.adapterSlug;
10817
10830
  if (needsAdapterMetadata && resolveAgentAdapter && adapterSlug) {
10818
10831
  try {
@@ -10828,6 +10841,11 @@ ${message}`;
10828
10841
  rt.desc.adapterProvider = adapterProvider;
10829
10842
  hydrated = true;
10830
10843
  }
10844
+ if (modelDerivedApiKey === void 0 && resolved?.authDescriptor?.modelDerivedApiKey !== void 0) {
10845
+ modelDerivedApiKey = resolved.authDescriptor.modelDerivedApiKey;
10846
+ rt.desc.modelDerivedApiKey = modelDerivedApiKey;
10847
+ hydrated = true;
10848
+ }
10831
10849
  if (hydrated) schedulePersist();
10832
10850
  } catch {
10833
10851
  }
@@ -10835,7 +10853,8 @@ ${message}`;
10835
10853
  const wireModel = normalizeModelForWire(modelId, {
10836
10854
  routeSelection,
10837
10855
  gateway: rt.desc.route?.gateway,
10838
- fixedProvider: adapterProvider
10856
+ fixedProvider: adapterProvider,
10857
+ modelDerivedApiKey
10839
10858
  });
10840
10859
  const result = await rt.agentSession.setModel(wireModel);
10841
10860
  if (result.applied) {
@@ -13989,6 +14008,7 @@ async function restartAgentSession(registry, resolveAgentAdapter, prev, opts = {
13989
14008
  declaredOptions: resolved.declaredOptions,
13990
14009
  routeSelection: resolved.routeSelection,
13991
14010
  adapterProvider: resolved.authDescriptor?.provider,
14011
+ modelDerivedApiKey: resolved.authDescriptor?.modelDerivedApiKey,
13992
14012
  prefix: "restart"
13993
14013
  });
13994
14014
  } catch (err) {
@@ -14031,6 +14051,7 @@ async function restartAgentSession(registry, resolveAgentAdapter, prev, opts = {
14031
14051
  harness: effHarness,
14032
14052
  ...resolved.routeSelection !== void 0 ? { routeSelection: resolved.routeSelection } : {},
14033
14053
  ...resolved.authDescriptor?.provider !== void 0 ? { adapterProvider: resolved.authDescriptor.provider } : {},
14054
+ ...resolved.authDescriptor?.modelDerivedApiKey !== void 0 ? { modelDerivedApiKey: resolved.authDescriptor.modelDerivedApiKey } : {},
14034
14055
  ...prev.label ? { label: prev.label } : {},
14035
14056
  ...prev.mcpServers ? { mcpServers: prev.mcpServers } : {},
14036
14057
  ...effModel ? { model: effModel } : {},