@mastra/code-sdk 1.14.0 → 1.15.0-alpha.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.
@@ -36,7 +36,7 @@ export declare function setCredentialStoreProvider(provider: CredentialStoreProv
36
36
  export declare function prepareCredentialTenant(requestContext?: RequestContext): Promise<void>;
37
37
  export declare function withCredentialTenantPreparation<T>(resolve: (ctx: {
38
38
  requestContext: RequestContext;
39
- }) => T): (ctx: {
39
+ }) => T | Promise<T>): (ctx: {
40
40
  requestContext: RequestContext;
41
41
  }) => Promise<T>;
42
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"credential-resolver.d.ts","sourceRoot":"","sources":["../../src/agents/credential-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjD,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,eAAe,EAAE,eAAe,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,eAAe,GAAG,SAAS,CAAC;AAEhG,MAAM,MAAM,wBAAwB,GAAG,CAAC,cAAc,EAAE,cAAc,KAAK,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;AAqBjH,mFAAmF;AACnF,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,uBAAuB,GAAG,SAAS,EAC7C,aAAa,CAAC,EAAE,wBAAwB,GACvC,IAAI,CAIN;AAED,uGAAuG;AACvG,wBAAsB,uBAAuB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB5F;AA0BD,wBAAgB,+BAA+B,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE;IAAE,cAAc,EAAE,cAAc,CAAA;CAAE,KAAK,CAAC,IAC1F,KAAK;IAAE,cAAc,EAAE,cAAc,CAAA;CAAE,KAAG,OAAO,CAAC,CAAC,CAAC,CAInE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAED,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAkBD,wBAAgB,sBAAsB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,eAAe,CAEvF;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS,CAI7G;AAED,mFAAmF;AACnF,wBAAgB,oCAAoC,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS,CAclH;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,eAAe,GAAG,SAAS,CAsBnG"}
1
+ {"version":3,"file":"credential-resolver.d.ts","sourceRoot":"","sources":["../../src/agents/credential-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjD,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,eAAe,EAAE,eAAe,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,eAAe,GAAG,SAAS,CAAC;AAEhG,MAAM,MAAM,wBAAwB,GAAG,CAAC,cAAc,EAAE,cAAc,KAAK,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;AAqBjH,mFAAmF;AACnF,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,uBAAuB,GAAG,SAAS,EAC7C,aAAa,CAAC,EAAE,wBAAwB,GACvC,IAAI,CAIN;AAED,uGAAuG;AACvG,wBAAsB,uBAAuB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB5F;AA0BD,wBAAgB,+BAA+B,CAAC,CAAC,EAC/C,OAAO,EAAE,CAAC,GAAG,EAAE;IAAE,cAAc,EAAE,cAAc,CAAA;CAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAEtD,KAAK;IAAE,cAAc,EAAE,cAAc,CAAA;CAAE,KAAG,OAAO,CAAC,CAAC,CAAC,CAInE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAED,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAkBD,wBAAgB,sBAAsB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,eAAe,CAEvF;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS,CAI7G;AAED,mFAAmF;AACnF,wBAAgB,oCAAoC,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS,CAclH;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,eAAe,GAAG,SAAS,CAsBnG"}
@@ -1 +1 @@
1
- {"version":3,"file":"credential-resolver.js","names":[],"sources":["../../src/agents/credential-resolver.ts"],"sourcesContent":["/**\n * Per-tenant credential resolution seam for deployed (multi-user) servers.\n *\n * Locally, model resolution reads the server-global file-backed `AuthStorage`.\n * A deployed web host registers a {@link CredentialStoreProvider} at boot; from\n * then on `resolveModel` uses the host's trusted execution policy, never mutable\n * session state. Factory scope reads organization credentials only. User scope reads\n * the Factory session owner's credentials only, or the authenticated principal\n * for project-less personal sessions.\n *\n * When no provider is registered (TUI, local web), everything falls through to\n * the existing global behavior unchanged.\n */\n\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { CredentialStore } from '../auth/types.js';\n\nexport type CredentialScope = 'factory' | 'user';\n\n/** The identity and exclusive scope a credential lookup is resolved against. */\nexport interface CredentialTenant {\n /** Org tenant; absent for personal accounts (store impls may synthesize one). */\n orgId?: string;\n /** Stable user id used for user-scoped credentials and tenant cache keys. */\n userId: string;\n /** Exclusive credential scope for this request. */\n credentialScope: CredentialScope;\n}\n\n/**\n * Returns a tenant-scoped {@link CredentialStore}, or `undefined` when tenant\n * storage is unavailable. Must be synchronous — implementations serve from a\n * primed snapshot and do authoritative async work inside `getApiKey`.\n */\nexport type CredentialStoreProvider = (tenant: CredentialTenant) => CredentialStore | undefined;\n\nexport type CredentialTenantResolver = (requestContext: RequestContext) => Promise<CredentialTenant | undefined>;\n\nconst CREDENTIAL_POLICY_KEY = 'mastracode__credentialPolicy';\nlet credentialStoreProvider: CredentialStoreProvider | undefined;\nlet credentialTenantResolver: CredentialTenantResolver | undefined;\nlet trustedTenants = new WeakMap<object, { tenant?: CredentialTenant; sourceContext: RequestContext }>();\n\nconst unavailableTenantCredentialStore: CredentialStore = {\n allowEnvironmentFallback: false,\n reload() {},\n get() {\n return undefined;\n },\n getStoredApiKey() {\n return undefined;\n },\n async getApiKey() {\n return undefined;\n },\n};\n\n/** Register (or clear) the tenant credential store provider. Deployed-web only. */\nexport function setCredentialStoreProvider(\n provider: CredentialStoreProvider | undefined,\n resolveTenant?: CredentialTenantResolver,\n): void {\n credentialStoreProvider = provider;\n credentialTenantResolver = provider ? resolveTenant : undefined;\n trustedTenants = new WeakMap();\n}\n\n/** Refresh authority before a fresh model invocation; cloned contexts inherit only an opaque token. */\nexport async function prepareCredentialTenant(requestContext?: RequestContext): Promise<void> {\n if (!credentialTenantResolver) return;\n if (!requestContext) throw new Error('Tenant model resolution requires a request context.');\n const inheritedToken = requestContext.get(CREDENTIAL_POLICY_KEY);\n const inheritedPolicy =\n inheritedToken && typeof inheritedToken === 'object' ? trustedTenants.get(inheritedToken) : undefined;\n // Subagents and internal memory contexts can strip the controller's thread identity.\n // Keep their billing origin outside those mutable context fields.\n const sourceController = inheritedPolicy?.sourceContext.get('controller') as { resourceId?: string } | undefined;\n const sourceContext =\n inheritedPolicy && sourceController?.resourceId ? inheritedPolicy.sourceContext : requestContext;\n const token = {};\n requestContext.set(CREDENTIAL_POLICY_KEY, token);\n trustedTenants.set(token, { sourceContext });\n const tenant = await credentialTenantResolver(sourceContext);\n if (!tenant) throw unresolvedTenantError(sourceContext, Boolean(inheritedPolicy));\n trustedTenants.set(token, { tenant, sourceContext });\n}\n\n/**\n * Explain a failed tenant resolution. The message is safe to show the end user\n * (channels post it into the chat); the warning carries non-secret diagnostics\n * and the stack, which is what locates a caller that dropped the request context.\n */\nfunction unresolvedTenantError(sourceContext: RequestContext, inherited: boolean): Error {\n const authenticated = resolveAuthenticatedCredentialTenant(sourceContext) !== undefined;\n const error = new Error(\n authenticated\n ? 'Tenant model credential policy could not be resolved: no credential policy applies to this request.'\n : 'Tenant model credential policy could not be resolved: the request has no authenticated user.',\n );\n const controller = sourceContext.get('controller') as { resourceId?: unknown; threadId?: unknown } | undefined;\n console.warn('[MastraCode] Tenant model credential policy could not be resolved', {\n reason: authenticated ? 'no-policy-for-principal' : 'missing-user-context',\n hasUser: sourceContext.get('user') !== undefined,\n inheritedPolicy: inherited,\n hasControllerResource: typeof controller?.resourceId === 'string',\n hasControllerThread: typeof controller?.threadId === 'string',\n stack: error.stack,\n });\n return error;\n}\n\nexport function withCredentialTenantPreparation<T>(resolve: (ctx: { requestContext: RequestContext }) => T) {\n return async (ctx: { requestContext: RequestContext }): Promise<T> => {\n await prepareCredentialTenant(ctx.requestContext);\n return resolve(ctx);\n };\n}\n\n/**\n * Whether a tenant provider is registered. Used to disable the\n * `loadStoredApiKeysIntoEnv` side-channel in deployed mode — per-tenant\n * credentials must never leak into process-global env vars.\n */\nexport function hasCredentialStoreProvider(): boolean {\n return credentialStoreProvider !== undefined;\n}\n\nexport function hasCredentialTenantResolver(): boolean {\n return credentialTenantResolver !== undefined;\n}\n\n/** Shape the web auth gate stashes on the request context under `user`. */\ninterface RequestContextUser {\n workosId?: string;\n id?: string;\n organizationId?: string;\n}\n\n/**\n * Session-shaped `authenticateToken` results (better-auth) arrive as a wrapper\n * whose active org lives on the session half rather than on the user.\n */\ninterface RequestContextSession {\n user?: RequestContextUser;\n session?: { activeOrganizationId?: string };\n}\n\nexport function resolveCredentialScope(requestContext?: RequestContext): CredentialScope {\n return resolveTenantFromRequestContext(requestContext)?.credentialScope ?? 'user';\n}\n\n/**\n * Derive the calling tenant from a request context, if an authenticated web\n * user was stashed on it. Mirrors the web layer's stable-id resolution\n * (`workosId` falling back to the provider `id`).\n *\n * Session state and HTTP-supplied policy values never establish credential authority.\n */\nexport function resolveTenantFromRequestContext(requestContext?: RequestContext): CredentialTenant | undefined {\n if (!credentialTenantResolver) return resolveAuthenticatedCredentialTenant(requestContext);\n const token = requestContext?.get(CREDENTIAL_POLICY_KEY);\n return token && typeof token === 'object' ? trustedTenants.get(token)?.tenant : undefined;\n}\n\n/** Authenticated principal only, for hosts resolving durable session ownership. */\nexport function resolveAuthenticatedCredentialTenant(requestContext?: RequestContext): CredentialTenant | undefined {\n const raw = requestContext?.get('user') as (RequestContextUser & RequestContextSession) | undefined;\n if (!raw || typeof raw !== 'object') return undefined;\n\n // Precedence matches `toFactoryAuthUser` in `@mastra/factory`: a wrapper's org\n // comes from the session half only, never from the inner user.\n const wrapped = Boolean(raw.user && typeof raw.user === 'object' && raw.session && typeof raw.session === 'object');\n const user = wrapped ? (raw.user as RequestContextUser) : raw;\n const principalOrgId = wrapped ? raw.session?.activeOrganizationId : user.organizationId;\n const principalUserId = user.workosId ?? user.id;\n if (typeof principalUserId !== 'string' || !principalUserId) return undefined;\n if (principalOrgId !== undefined && typeof principalOrgId !== 'string') return undefined;\n\n return { orgId: principalOrgId, userId: principalUserId, credentialScope: 'user' };\n}\n\n/**\n * Resolve the credential store for a request. Local mode returns `undefined`\n * and keeps the global `AuthStorage` behavior. Once deployed web registers a\n * provider, missing tenant identity or unavailable tenant storage fails closed\n * through an empty store that also disables process-environment fallback.\n */\nexport function resolveCredentialStore(requestContext?: RequestContext): CredentialStore | undefined {\n if (!credentialStoreProvider) return undefined;\n const tenant = resolveTenantFromRequestContext(requestContext);\n if (!tenant) {\n const rawUser = requestContext?.get('user');\n console.warn('[MastraCode] Tenant credential resolution failed closed', {\n reason: rawUser === undefined ? 'missing-user-context' : 'credential-policy-unavailable',\n hasRequestContext: requestContext !== undefined,\n });\n return unavailableTenantCredentialStore;\n }\n const store = credentialStoreProvider(tenant);\n if (!store) {\n console.warn('[MastraCode] Tenant credential resolution failed closed', {\n reason: 'credential-store-unavailable',\n hasOrganization: tenant.orgId !== undefined,\n credentialScope: tenant.credentialScope,\n ownerResolved: tenant.credentialScope === 'factory' || tenant.userId !== undefined,\n });\n return unavailableTenantCredentialStore;\n }\n return store;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"credential-resolver.js","names":[],"sources":["../../src/agents/credential-resolver.ts"],"sourcesContent":["/**\n * Per-tenant credential resolution seam for deployed (multi-user) servers.\n *\n * Locally, model resolution reads the server-global file-backed `AuthStorage`.\n * A deployed web host registers a {@link CredentialStoreProvider} at boot; from\n * then on `resolveModel` uses the host's trusted execution policy, never mutable\n * session state. Factory scope reads organization credentials only. User scope reads\n * the Factory session owner's credentials only, or the authenticated principal\n * for project-less personal sessions.\n *\n * When no provider is registered (TUI, local web), everything falls through to\n * the existing global behavior unchanged.\n */\n\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { CredentialStore } from '../auth/types.js';\n\nexport type CredentialScope = 'factory' | 'user';\n\n/** The identity and exclusive scope a credential lookup is resolved against. */\nexport interface CredentialTenant {\n /** Org tenant; absent for personal accounts (store impls may synthesize one). */\n orgId?: string;\n /** Stable user id used for user-scoped credentials and tenant cache keys. */\n userId: string;\n /** Exclusive credential scope for this request. */\n credentialScope: CredentialScope;\n}\n\n/**\n * Returns a tenant-scoped {@link CredentialStore}, or `undefined` when tenant\n * storage is unavailable. Must be synchronous — implementations serve from a\n * primed snapshot and do authoritative async work inside `getApiKey`.\n */\nexport type CredentialStoreProvider = (tenant: CredentialTenant) => CredentialStore | undefined;\n\nexport type CredentialTenantResolver = (requestContext: RequestContext) => Promise<CredentialTenant | undefined>;\n\nconst CREDENTIAL_POLICY_KEY = 'mastracode__credentialPolicy';\nlet credentialStoreProvider: CredentialStoreProvider | undefined;\nlet credentialTenantResolver: CredentialTenantResolver | undefined;\nlet trustedTenants = new WeakMap<object, { tenant?: CredentialTenant; sourceContext: RequestContext }>();\n\nconst unavailableTenantCredentialStore: CredentialStore = {\n allowEnvironmentFallback: false,\n reload() {},\n get() {\n return undefined;\n },\n getStoredApiKey() {\n return undefined;\n },\n async getApiKey() {\n return undefined;\n },\n};\n\n/** Register (or clear) the tenant credential store provider. Deployed-web only. */\nexport function setCredentialStoreProvider(\n provider: CredentialStoreProvider | undefined,\n resolveTenant?: CredentialTenantResolver,\n): void {\n credentialStoreProvider = provider;\n credentialTenantResolver = provider ? resolveTenant : undefined;\n trustedTenants = new WeakMap();\n}\n\n/** Refresh authority before a fresh model invocation; cloned contexts inherit only an opaque token. */\nexport async function prepareCredentialTenant(requestContext?: RequestContext): Promise<void> {\n if (!credentialTenantResolver) return;\n if (!requestContext) throw new Error('Tenant model resolution requires a request context.');\n const inheritedToken = requestContext.get(CREDENTIAL_POLICY_KEY);\n const inheritedPolicy =\n inheritedToken && typeof inheritedToken === 'object' ? trustedTenants.get(inheritedToken) : undefined;\n // Subagents and internal memory contexts can strip the controller's thread identity.\n // Keep their billing origin outside those mutable context fields.\n const sourceController = inheritedPolicy?.sourceContext.get('controller') as { resourceId?: string } | undefined;\n const sourceContext =\n inheritedPolicy && sourceController?.resourceId ? inheritedPolicy.sourceContext : requestContext;\n const token = {};\n requestContext.set(CREDENTIAL_POLICY_KEY, token);\n trustedTenants.set(token, { sourceContext });\n const tenant = await credentialTenantResolver(sourceContext);\n if (!tenant) throw unresolvedTenantError(sourceContext, Boolean(inheritedPolicy));\n trustedTenants.set(token, { tenant, sourceContext });\n}\n\n/**\n * Explain a failed tenant resolution. The message is safe to show the end user\n * (channels post it into the chat); the warning carries non-secret diagnostics\n * and the stack, which is what locates a caller that dropped the request context.\n */\nfunction unresolvedTenantError(sourceContext: RequestContext, inherited: boolean): Error {\n const authenticated = resolveAuthenticatedCredentialTenant(sourceContext) !== undefined;\n const error = new Error(\n authenticated\n ? 'Tenant model credential policy could not be resolved: no credential policy applies to this request.'\n : 'Tenant model credential policy could not be resolved: the request has no authenticated user.',\n );\n const controller = sourceContext.get('controller') as { resourceId?: unknown; threadId?: unknown } | undefined;\n console.warn('[MastraCode] Tenant model credential policy could not be resolved', {\n reason: authenticated ? 'no-policy-for-principal' : 'missing-user-context',\n hasUser: sourceContext.get('user') !== undefined,\n inheritedPolicy: inherited,\n hasControllerResource: typeof controller?.resourceId === 'string',\n hasControllerThread: typeof controller?.threadId === 'string',\n stack: error.stack,\n });\n return error;\n}\n\nexport function withCredentialTenantPreparation<T>(\n resolve: (ctx: { requestContext: RequestContext }) => T | Promise<T>,\n) {\n return async (ctx: { requestContext: RequestContext }): Promise<T> => {\n await prepareCredentialTenant(ctx.requestContext);\n return resolve(ctx);\n };\n}\n\n/**\n * Whether a tenant provider is registered. Used to disable the\n * `loadStoredApiKeysIntoEnv` side-channel in deployed mode — per-tenant\n * credentials must never leak into process-global env vars.\n */\nexport function hasCredentialStoreProvider(): boolean {\n return credentialStoreProvider !== undefined;\n}\n\nexport function hasCredentialTenantResolver(): boolean {\n return credentialTenantResolver !== undefined;\n}\n\n/** Shape the web auth gate stashes on the request context under `user`. */\ninterface RequestContextUser {\n workosId?: string;\n id?: string;\n organizationId?: string;\n}\n\n/**\n * Session-shaped `authenticateToken` results (better-auth) arrive as a wrapper\n * whose active org lives on the session half rather than on the user.\n */\ninterface RequestContextSession {\n user?: RequestContextUser;\n session?: { activeOrganizationId?: string };\n}\n\nexport function resolveCredentialScope(requestContext?: RequestContext): CredentialScope {\n return resolveTenantFromRequestContext(requestContext)?.credentialScope ?? 'user';\n}\n\n/**\n * Derive the calling tenant from a request context, if an authenticated web\n * user was stashed on it. Mirrors the web layer's stable-id resolution\n * (`workosId` falling back to the provider `id`).\n *\n * Session state and HTTP-supplied policy values never establish credential authority.\n */\nexport function resolveTenantFromRequestContext(requestContext?: RequestContext): CredentialTenant | undefined {\n if (!credentialTenantResolver) return resolveAuthenticatedCredentialTenant(requestContext);\n const token = requestContext?.get(CREDENTIAL_POLICY_KEY);\n return token && typeof token === 'object' ? trustedTenants.get(token)?.tenant : undefined;\n}\n\n/** Authenticated principal only, for hosts resolving durable session ownership. */\nexport function resolveAuthenticatedCredentialTenant(requestContext?: RequestContext): CredentialTenant | undefined {\n const raw = requestContext?.get('user') as (RequestContextUser & RequestContextSession) | undefined;\n if (!raw || typeof raw !== 'object') return undefined;\n\n // Precedence matches `toFactoryAuthUser` in `@mastra/factory`: a wrapper's org\n // comes from the session half only, never from the inner user.\n const wrapped = Boolean(raw.user && typeof raw.user === 'object' && raw.session && typeof raw.session === 'object');\n const user = wrapped ? (raw.user as RequestContextUser) : raw;\n const principalOrgId = wrapped ? raw.session?.activeOrganizationId : user.organizationId;\n const principalUserId = user.workosId ?? user.id;\n if (typeof principalUserId !== 'string' || !principalUserId) return undefined;\n if (principalOrgId !== undefined && typeof principalOrgId !== 'string') return undefined;\n\n return { orgId: principalOrgId, userId: principalUserId, credentialScope: 'user' };\n}\n\n/**\n * Resolve the credential store for a request. Local mode returns `undefined`\n * and keeps the global `AuthStorage` behavior. Once deployed web registers a\n * provider, missing tenant identity or unavailable tenant storage fails closed\n * through an empty store that also disables process-environment fallback.\n */\nexport function resolveCredentialStore(requestContext?: RequestContext): CredentialStore | undefined {\n if (!credentialStoreProvider) return undefined;\n const tenant = resolveTenantFromRequestContext(requestContext);\n if (!tenant) {\n const rawUser = requestContext?.get('user');\n console.warn('[MastraCode] Tenant credential resolution failed closed', {\n reason: rawUser === undefined ? 'missing-user-context' : 'credential-policy-unavailable',\n hasRequestContext: requestContext !== undefined,\n });\n return unavailableTenantCredentialStore;\n }\n const store = credentialStoreProvider(tenant);\n if (!store) {\n console.warn('[MastraCode] Tenant credential resolution failed closed', {\n reason: 'credential-store-unavailable',\n hasOrganization: tenant.orgId !== undefined,\n credentialScope: tenant.credentialScope,\n ownerResolved: tenant.credentialScope === 'factory' || tenant.userId !== undefined,\n });\n return unavailableTenantCredentialStore;\n }\n return store;\n}\n"],"mappings":";AAsCA,MAAM,wBAAwB;AAC9B,IAAI;AACJ,IAAI;AACJ,IAAI,iCAAiB,IAAI,QAA8E;AAEvG,MAAM,mCAAoD;CACxD,0BAA0B;CAC1B,SAAS,CAAC;CACV,MAAM,CAEN;CACA,kBAAkB,CAElB;CACA,MAAM,YAAY,CAElB;AACF;;AAGA,SAAgB,2BACd,UACA,eACM;CACN,0BAA0B;CAC1B,2BAA2B,WAAW,gBAAgB,KAAA;CACtD,iCAAiB,IAAI,QAAQ;AAC/B;;AAGA,eAAsB,wBAAwB,gBAAgD;CAC5F,IAAI,CAAC,0BAA0B;CAC/B,IAAI,CAAC,gBAAgB,MAAM,IAAI,MAAM,qDAAqD;CAC1F,MAAM,iBAAiB,eAAe,IAAI,qBAAqB;CAC/D,MAAM,kBACJ,kBAAkB,OAAO,mBAAmB,WAAW,eAAe,IAAI,cAAc,IAAI,KAAA;CAG9F,MAAM,mBAAmB,iBAAiB,cAAc,IAAI,YAAY;CACxE,MAAM,gBACJ,mBAAmB,kBAAkB,aAAa,gBAAgB,gBAAgB;CACpF,MAAM,QAAQ,CAAC;CACf,eAAe,IAAI,uBAAuB,KAAK;CAC/C,eAAe,IAAI,OAAO,EAAE,cAAc,CAAC;CAC3C,MAAM,SAAS,MAAM,yBAAyB,aAAa;CAC3D,IAAI,CAAC,QAAQ,MAAM,sBAAsB,eAAe,QAAQ,eAAe,CAAC;CAChF,eAAe,IAAI,OAAO;EAAE;EAAQ;CAAc,CAAC;AACrD;;;;;;AAOA,SAAS,sBAAsB,eAA+B,WAA2B;CACvF,MAAM,gBAAgB,qCAAqC,aAAa,MAAM,KAAA;CAC9E,MAAM,wBAAQ,IAAI,MAChB,gBACI,wGACA,8FACN;CACA,MAAM,aAAa,cAAc,IAAI,YAAY;CACjD,QAAQ,KAAK,qEAAqE;EAChF,QAAQ,gBAAgB,4BAA4B;EACpD,SAAS,cAAc,IAAI,MAAM,MAAM,KAAA;EACvC,iBAAiB;EACjB,uBAAuB,OAAO,YAAY,eAAe;EACzD,qBAAqB,OAAO,YAAY,aAAa;EACrD,OAAO,MAAM;CACf,CAAC;CACD,OAAO;AACT;AAEA,SAAgB,gCACd,SACA;CACA,OAAO,OAAO,QAAwD;EACpE,MAAM,wBAAwB,IAAI,cAAc;EAChD,OAAO,QAAQ,GAAG;CACpB;AACF;;;;;;AAOA,SAAgB,6BAAsC;CACpD,OAAO,4BAA4B,KAAA;AACrC;AAEA,SAAgB,8BAAuC;CACrD,OAAO,6BAA6B,KAAA;AACtC;AAkBA,SAAgB,uBAAuB,gBAAkD;CACvF,OAAO,gCAAgC,cAAc,CAAC,EAAE,mBAAmB;AAC7E;;;;;;;;AASA,SAAgB,gCAAgC,gBAA+D;CAC7G,IAAI,CAAC,0BAA0B,OAAO,qCAAqC,cAAc;CACzF,MAAM,QAAQ,gBAAgB,IAAI,qBAAqB;CACvD,OAAO,SAAS,OAAO,UAAU,WAAW,eAAe,IAAI,KAAK,CAAC,EAAE,SAAS,KAAA;AAClF;;AAGA,SAAgB,qCAAqC,gBAA+D;CAClH,MAAM,MAAM,gBAAgB,IAAI,MAAM;CACtC,IAAI,CAAC,OAAO,OAAO,QAAQ,UAAU,OAAO,KAAA;CAI5C,MAAM,UAAU,QAAQ,IAAI,QAAQ,OAAO,IAAI,SAAS,YAAY,IAAI,WAAW,OAAO,IAAI,YAAY,QAAQ;CAClH,MAAM,OAAO,UAAW,IAAI,OAA8B;CAC1D,MAAM,iBAAiB,UAAU,IAAI,SAAS,uBAAuB,KAAK;CAC1E,MAAM,kBAAkB,KAAK,YAAY,KAAK;CAC9C,IAAI,OAAO,oBAAoB,YAAY,CAAC,iBAAiB,OAAO,KAAA;CACpE,IAAI,mBAAmB,KAAA,KAAa,OAAO,mBAAmB,UAAU,OAAO,KAAA;CAE/E,OAAO;EAAE,OAAO;EAAgB,QAAQ;EAAiB,iBAAiB;CAAO;AACnF;;;;;;;AAQA,SAAgB,uBAAuB,gBAA8D;CACnG,IAAI,CAAC,yBAAyB,OAAO,KAAA;CACrC,MAAM,SAAS,gCAAgC,cAAc;CAC7D,IAAI,CAAC,QAAQ;EACX,MAAM,UAAU,gBAAgB,IAAI,MAAM;EAC1C,QAAQ,KAAK,2DAA2D;GACtE,QAAQ,YAAY,KAAA,IAAY,yBAAyB;GACzD,mBAAmB,mBAAmB,KAAA;EACxC,CAAC;EACD,OAAO;CACT;CACA,MAAM,QAAQ,wBAAwB,MAAM;CAC5C,IAAI,CAAC,OAAO;EACV,QAAQ,KAAK,2DAA2D;GACtE,QAAQ;GACR,iBAAiB,OAAO,UAAU,KAAA;GAClC,iBAAiB,OAAO;GACxB,eAAe,OAAO,oBAAoB,aAAa,OAAO,WAAW,KAAA;EAC3E,CAAC;EACD,OAAO;CACT;CACA,OAAO;AACT"}
@@ -42,6 +42,12 @@ export declare function getAnthropicApiKey(credentials?: CredentialStore): strin
42
42
  */
43
43
  export declare function getOpenAIApiKey(credentials?: CredentialStore): string | undefined;
44
44
  export declare function resolveAuth(request: GatewayAuthRequest, mastraGatewayApiKey?: string): GatewayAuthResult | undefined;
45
+ /**
46
+ * Whether the process environment has a key for a models.dev provider. Checks every
47
+ * env var the registry lists, as the models.dev gateway does when `resolveModel`
48
+ * gets no gateway credential (e.g. `GOOGLE_API_KEY` or `GOOGLE_GENERATIVE_AI_API_KEY`).
49
+ */
50
+ export declare function hasProviderEnvironmentKey(providerId: string): boolean;
45
51
  export declare class MastraCodeGateway extends MastraModelGateway {
46
52
  #private;
47
53
  readonly id = "mastracode";
@@ -1 +1 @@
1
- {"version":3,"file":"mastracode-gateway.d.ts","sourceRoot":"","sources":["../../src/agents/mastracode-gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mastracode-gateway.d.ts","sourceRoot":"","sources":["../../src/agents/mastracode-gateway.ts"],"names":[],"mappings":"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"}
@@ -153,6 +153,16 @@ function getApiKeyEnvVar(providerConfig) {
153
153
  const envVars = providerConfig?.apiKeyEnvVar;
154
154
  return Array.isArray(envVars) ? envVars[0] : envVars;
155
155
  }
156
+ /**
157
+ * Whether the process environment has a key for a models.dev provider. Checks every
158
+ * env var the registry lists, as the models.dev gateway does when `resolveModel`
159
+ * gets no gateway credential (e.g. `GOOGLE_API_KEY` or `GOOGLE_GENERATIVE_AI_API_KEY`).
160
+ */
161
+ function hasProviderEnvironmentKey(providerId) {
162
+ const envVars = PROVIDER_REGISTRY[providerId]?.apiKeyEnvVar;
163
+ if (!envVars) return false;
164
+ return (Array.isArray(envVars) ? envVars : [envVars]).some((envVar) => Boolean(process.env[envVar]?.trim()));
165
+ }
156
166
  var MastraCodeGateway = class MastraCodeGateway extends MastraModelGateway {
157
167
  id = MASTRACODE_GATEWAY_ID;
158
168
  name = "MastraCode Gateway";
@@ -429,6 +439,6 @@ var MastraCodeGateway = class MastraCodeGateway extends MastraModelGateway {
429
439
  }
430
440
  };
431
441
  //#endregion
432
- export { MASTRACODE_GATEWAY_ID, MASTRA_GATEWAY_PREFIX, MastraCodeGateway, OPENAI_PREFIX, getAnthropicApiKey, getGlobalAuthStorage, getOpenAIApiKey, reloadAuthStorage, remapOpenAIModelForCodexOAuth, resolveAuth, stripMastraGatewayPrefix };
442
+ export { MASTRACODE_GATEWAY_ID, MASTRA_GATEWAY_PREFIX, MastraCodeGateway, OPENAI_PREFIX, getAnthropicApiKey, getGlobalAuthStorage, getOpenAIApiKey, hasProviderEnvironmentKey, reloadAuthStorage, remapOpenAIModelForCodexOAuth, resolveAuth, stripMastraGatewayPrefix };
433
443
 
434
444
  //# sourceMappingURL=mastracode-gateway.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mastracode-gateway.js","names":["#mastraGateway","#mastraGatewayBaseUrl","#mastraGatewayApiKey","#routeThroughMastraGateway","#thinkingLevel","#anthropicPromptCacheScope","#customProviders","#settingsPath","#credentials","#getCustomProviders","#resolveAnthropicModel","#resolveOpenAIModel","#resolveGoogleModel"],"sources":["../../src/agents/mastracode-gateway.ts"],"sourcesContent":["import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport type { CustomAvailableModel, CustomModelCatalogProvider } from '@mastra/core/agent-controller';\nimport {\n GATEWAY_AUTH_HEADER,\n MastraGateway,\n MastraModelGateway,\n ModelRouterLanguageModel,\n PROVIDER_REGISTRY,\n} from '@mastra/core/llm';\nimport type {\n GatewayAuthRequest,\n GatewayAuthResult,\n GatewayLanguageModel,\n MastraModelGatewayInterface,\n ProviderConfig,\n} from '@mastra/core/llm';\nimport { wrapLanguageModel } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\nimport type { CredentialStore } from '../auth/types.js';\nimport { getCustomProviderId, loadSettings, MASTRA_GATEWAY_PROVIDER } from '../onboarding/settings.js';\nimport type { AnthropicPromptCacheScope } from '../providers/anthropic-prompt-cache.js';\nimport {\n buildAnthropicOAuthFetch,\n claudeCodeMiddleware,\n createAnthropicThinkingMiddleware,\n createPromptCacheMiddleware,\n opencodeClaudeMaxProvider,\n} from '../providers/claude-max.js';\nimport { githubCopilotProvider } from '../providers/github-copilot.js';\nimport { createGoogleThinkingMiddleware } from '../providers/google-thinking.js';\nimport { kimiCodingProvider } from '../providers/kimi-coding.js';\nimport {\n getCredentialProviderId,\n KIMI_CODING_CREDENTIAL_ID,\n KIMI_CODING_PROVIDER_ID,\n normalizeAnthropicModelId,\n OPENAI_PREFIX,\n remapOpenAIModelForCodexOAuth,\n stripMastraGatewayPrefix,\n} from '../providers/model-ids.js';\nimport {\n buildOpenAICodexOAuthFetch,\n createCodexMiddleware,\n createReasoningEffortMiddleware,\n getEffectiveThinkingLevel,\n openaiCodexProvider,\n THINKING_LEVEL_TO_REASONING_EFFORT,\n} from '../providers/openai-codex.js';\nimport type { ThinkingLevel } from '../providers/openai-codex.js';\nimport {\n ModelRouterLanguageModelWithThinking,\n providerThinkingOptions,\n withThinkingOptionsModel,\n} from '../providers/provider-thinking.js';\nimport { xaiProvider } from '../providers/xai.js';\nimport { getAppDataDir } from '../utils/project.js';\nimport { resolveCustomProviders } from './custom-provider-source.js';\n\nexport {\n MASTRA_GATEWAY_PREFIX,\n OPENAI_PREFIX,\n remapOpenAIModelForCodexOAuth,\n stripMastraGatewayPrefix,\n} from '../providers/model-ids.js';\n\nexport const MASTRACODE_GATEWAY_ID = 'mastracode';\n\ntype ModelRequestHeaders = Record<string, string>;\n\nexport type MastraCodeCustomProvider = { name: string; url: string; apiKey?: string; models?: string[] };\n\nexport type MastraCodeGatewayOptions = {\n mastraGatewayBaseUrl: string;\n mastraGatewayApiKey?: string;\n routeThroughMastraGateway: boolean;\n thinkingLevel?: ThinkingLevel;\n /** Anthropic prompt-cache breakpoints to write. Defaults to `conversation`. */\n anthropicPromptCacheScope?: AnthropicPromptCacheScope;\n customProviders?: MastraCodeCustomProvider[];\n settingsPath?: string;\n /**\n * Per-tenant credential source for this gateway instance. Defaults to the\n * server-global file-backed `AuthStorage`; deployed web passes the calling\n * tenant's store so model calls use the caller's own credentials.\n */\n credentialStore?: CredentialStore;\n};\n\n/**\n * Global file-backed credential store for local (TUI) model resolution.\n *\n * Constructed lazily, NOT at module scope: `AuthStorage`'s default path is\n * resolved from `MASTRA_APP_DATA_DIR` at construction, and this module is\n * routinely imported before test harnesses / embedders point that variable at\n * an isolated directory — an import-time construction would permanently pin\n * the developer's real app-data dir for every credential read.\n */\nlet authStorageSingleton: AuthStorage | undefined;\nlet authStorageSingletonDir: string | undefined;\n\nexport function getGlobalAuthStorage(): AuthStorage {\n // Keyed by the resolved app-data dir: in-process harnesses re-point\n // MASTRA_APP_DATA_DIR per run inside one long-lived worker, so a store\n // pinned to a previous dir must be discarded, not reused.\n const dir = getAppDataDir();\n if (!authStorageSingleton || authStorageSingletonDir !== dir) {\n authStorageSingleton = new AuthStorage();\n authStorageSingletonDir = dir;\n }\n return authStorageSingleton;\n}\n\nexport function reloadAuthStorage() {\n getGlobalAuthStorage().reload();\n}\n\n/**\n * Resolve the Anthropic API key.\n * Main slot → dedicated apikey: slot → env var.\n */\nexport function getAnthropicApiKey(credentials: CredentialStore = getGlobalAuthStorage()): string | undefined {\n const storedCred = credentials.get('anthropic');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey('anthropic')?.trim();\n if (dedicatedKey) return dedicatedKey;\n return credentials.allowEnvironmentFallback === false\n ? undefined\n : process.env.ANTHROPIC_API_KEY?.trim() || undefined;\n}\n\n/**\n * Resolve the OpenAI API key.\n * Main slot → dedicated apikey: slot → env var.\n */\nexport function getOpenAIApiKey(credentials: CredentialStore = getGlobalAuthStorage()): string | undefined {\n const storedCred = credentials.get('openai-codex');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey('openai-codex')?.trim();\n if (dedicatedKey) return dedicatedKey;\n return credentials.allowEnvironmentFallback === false ? undefined : process.env.OPENAI_API_KEY?.trim() || undefined;\n}\n\nfunction anthropicApiKeyProvider(\n modelId: string,\n apiKey: string,\n headers: ModelRequestHeaders | undefined,\n thinkingLevel: ThinkingLevel | undefined,\n promptCacheScope: AnthropicPromptCacheScope,\n) {\n const anthropic = createAnthropic({ apiKey, headers });\n const thinkingMiddleware = createAnthropicThinkingMiddleware(modelId, thinkingLevel);\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [createPromptCacheMiddleware(promptCacheScope), ...(thinkingMiddleware ? [thinkingMiddleware] : [])],\n });\n}\n\nfunction openaiApiKeyProvider(\n modelId: string,\n apiKey: string,\n headers?: ModelRequestHeaders,\n thinkingLevel?: ThinkingLevel,\n) {\n const openai = createOpenAI({ apiKey, baseURL: process.env.OPENAI_BASE_URL, headers });\n const middleware =\n thinkingLevel && thinkingLevel !== 'off'\n ? createReasoningEffortMiddleware(\n 'openai',\n THINKING_LEVEL_TO_REASONING_EFFORT[getEffectiveThinkingLevel(modelId, thinkingLevel)],\n )\n : undefined;\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: middleware ? [middleware] : [],\n });\n}\n\nfunction getProviderAuthKey(\n providerId: string,\n credentials: CredentialStore = getGlobalAuthStorage(),\n): string | undefined {\n const authProviderId = getCredentialProviderId(providerId);\n const storedCred = credentials.get(authProviderId);\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey(authProviderId)?.trim();\n if (dedicatedKey) return dedicatedKey;\n // `/api-keys` stores keys under the catalog provider id (`kimi-code-plan-cn`),\n // which can differ from the credential id.\n const catalogKey = authProviderId !== providerId ? credentials.getStoredApiKey(providerId)?.trim() : undefined;\n if (catalogKey) return catalogKey;\n if (credentials.allowEnvironmentFallback === false) return undefined;\n return authProviderId === KIMI_CODING_CREDENTIAL_ID ? process.env.KIMI_API_KEY?.trim() || undefined : undefined;\n}\n\nexport function resolveAuth(request: GatewayAuthRequest, mastraGatewayApiKey?: string): GatewayAuthResult | undefined {\n return MastraCodeGateway.resolveProviderAuth(request, mastraGatewayApiKey);\n}\n\nfunction getGatewayProviderKey(gatewayId: string, providerId: string): string {\n if (gatewayId === 'models.dev') return providerId;\n return providerId === gatewayId ? gatewayId : `${gatewayId}/${providerId}`;\n}\n\nfunction parseGatewayRouterId(\n routerId: string,\n gateway: MastraModelGatewayInterface,\n): { gatewayId: string; providerId: string; modelId: string } {\n const [firstPart = '', secondPart = '', ...restParts] = routerId.split('/');\n const gatewayId = gateway.id;\n\n if (firstPart === gatewayId && secondPart) {\n return {\n gatewayId,\n providerId: secondPart,\n modelId: restParts.join('/'),\n };\n }\n\n return {\n gatewayId,\n providerId: firstPart,\n modelId: [secondPart, ...restParts].filter(Boolean).join('/'),\n };\n}\n\nfunction hasResolvedAuth(auth: GatewayAuthResult | undefined): boolean {\n if (!auth) return false;\n if (auth.apiKey || auth.bearerToken) return true;\n return auth.headers ? Object.keys(auth.headers).length > 0 : false;\n}\n\nasync function resolveGatewayProviderAuth(\n gateway: MastraModelGatewayInterface,\n routerId: string,\n): Promise<GatewayAuthResult | undefined> {\n if (!gateway.resolveAuth) return undefined;\n\n const parsed = parseGatewayRouterId(routerId, gateway);\n try {\n const result = await gateway.resolveAuth({\n gatewayId: parsed.gatewayId,\n providerId: parsed.providerId,\n modelId: parsed.modelId,\n routerId,\n });\n return hasResolvedAuth(result) ? result : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function getMastraCodeProviderConfigs(\n gateway: MastraModelGatewayInterface,\n): Promise<Record<string, ProviderConfig>> {\n const providers: Record<string, ProviderConfig> = { ...(PROVIDER_REGISTRY as Record<string, ProviderConfig>) };\n\n try {\n const gatewayProviders = await gateway.fetchProviders();\n for (const [providerId, config] of Object.entries(gatewayProviders)) {\n providers[getGatewayProviderKey(gateway.id, providerId)] = {\n ...config,\n gateway: gateway.id,\n };\n }\n } catch (error) {\n console.warn(`Failed to load providers from gateway ${gateway.id}:`, error);\n }\n\n return providers;\n}\n\nfunction getApiKeyEnvVar(providerConfig: Pick<ProviderConfig, 'apiKeyEnvVar'> | undefined): string | undefined {\n const envVars = providerConfig?.apiKeyEnvVar;\n return Array.isArray(envVars) ? envVars[0] : envVars;\n}\n\nexport class MastraCodeGateway extends MastraModelGateway {\n readonly id = MASTRACODE_GATEWAY_ID;\n readonly name = 'MastraCode Gateway';\n\n readonly #mastraGateway: MastraGateway;\n readonly #mastraGatewayBaseUrl: string;\n readonly #mastraGatewayApiKey?: string;\n readonly #routeThroughMastraGateway: boolean;\n readonly #thinkingLevel?: ThinkingLevel;\n readonly #anthropicPromptCacheScope: AnthropicPromptCacheScope;\n readonly #customProviders?: MastraCodeCustomProvider[];\n readonly #settingsPath?: string;\n readonly #credentials: CredentialStore;\n\n constructor({\n mastraGatewayBaseUrl,\n mastraGatewayApiKey,\n routeThroughMastraGateway,\n thinkingLevel,\n anthropicPromptCacheScope,\n customProviders,\n settingsPath,\n credentialStore,\n }: MastraCodeGatewayOptions) {\n super();\n this.#mastraGateway = new MastraGateway({ baseUrl: mastraGatewayBaseUrl });\n this.#mastraGatewayBaseUrl = mastraGatewayBaseUrl;\n this.#mastraGatewayApiKey = mastraGatewayApiKey;\n this.#routeThroughMastraGateway = routeThroughMastraGateway;\n this.#thinkingLevel = thinkingLevel;\n this.#anthropicPromptCacheScope = anthropicPromptCacheScope ?? 'conversation';\n this.#customProviders = customProviders;\n this.#settingsPath = settingsPath;\n this.#credentials = credentialStore ?? getGlobalAuthStorage();\n }\n\n static getMastraGatewayApiKey(): string | undefined {\n return getGlobalAuthStorage().getStoredApiKey(MASTRA_GATEWAY_PROVIDER) ?? process.env['MASTRA_GATEWAY_API_KEY'];\n }\n\n /** @deprecated Renamed to {@link MastraCodeGateway.getMastraGatewayApiKey}. */\n static getMemoryGatewayApiKey(): string | undefined {\n return MastraCodeGateway.getMastraGatewayApiKey();\n }\n\n /**\n * Claim an unprefixed model id (e.g. a bare `anthropic/...`) when this gateway\n * can authenticate it via OAuth or a stored/env credential. This lets the\n * shared gateway router select MastraCode for auth resolution, so the status\n * bar and `/api-keys` reflect OAuth logins instead of only checking env vars.\n */\n handlesModel(modelId: string): boolean {\n const parsed = parseGatewayRouterId(modelId, this);\n if (!parsed.providerId || !parsed.modelId) return false;\n if (this.#routeThroughMastraGateway && this.#mastraGatewayApiKey) return true;\n const customProvider = this.#getCustomProviders().find(\n provider => parsed.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider?.apiKey) return true;\n return hasResolvedAuth(\n MastraCodeGateway.resolveProviderAuth(\n {\n gatewayId: this.id,\n providerId: parsed.providerId,\n modelId: parsed.modelId,\n routerId: modelId,\n },\n undefined,\n this.#credentials,\n ),\n );\n }\n\n static resolveProviderAuth(\n request: GatewayAuthRequest,\n mastraGatewayApiKey?: string,\n credentials: CredentialStore = getGlobalAuthStorage(),\n ): GatewayAuthResult | undefined {\n if (request.gatewayId === 'mastra' && mastraGatewayApiKey) {\n return { apiKey: mastraGatewayApiKey, source: 'gateway' };\n }\n\n const authProviderId = getCredentialProviderId(request.providerId);\n const storedCred = credentials.get(authProviderId);\n if (storedCred?.type === 'oauth') {\n return { bearerToken: 'oauth', source: 'gateway' };\n }\n\n const apiKey = getProviderAuthKey(request.providerId, credentials);\n return apiKey ? { apiKey, source: 'gateway' } : undefined;\n }\n\n static createModelCatalogProvider(gateway: MastraModelGatewayInterface): CustomModelCatalogProvider {\n return async () => {\n const registry = await getMastraCodeProviderConfigs(gateway);\n const models: CustomAvailableModel[] = [];\n\n for (const [provider, providerConfig] of Object.entries(registry)) {\n const apiKeyEnvVar = getApiKeyEnvVar(providerConfig);\n const hasEnvKey = apiKeyEnvVar ? Boolean(process.env[apiKeyEnvVar]) : false;\n const modelNames = providerConfig.models;\n if (!Array.isArray(modelNames)) continue;\n\n const gatewayAuth = modelNames[0]\n ? await resolveGatewayProviderAuth(gateway, `${provider}/${modelNames[0]}`)\n : undefined;\n\n for (const modelName of modelNames) {\n const id = `${provider}/${modelName}`;\n models.push({\n id,\n provider,\n modelName,\n hasApiKey: hasEnvKey || Boolean(gatewayAuth),\n apiKeyEnvVar: apiKeyEnvVar || undefined,\n });\n }\n }\n\n return models;\n };\n }\n\n createModelCatalogProvider(): CustomModelCatalogProvider {\n return MastraCodeGateway.createModelCatalogProvider(this);\n }\n\n #getCustomProviders(): MastraCodeCustomProvider[] {\n // Explicit constructor list wins; then a registered source (deployed web,\n // DB-backed — authoritative, so settings.json is never consulted); then\n // the local file-backed settings.\n return this.#customProviders ?? resolveCustomProviders() ?? loadSettings(this.#settingsPath).customProviders;\n }\n\n async fetchProviders(): Promise<Record<string, ProviderConfig>> {\n // Catalog auth (`handlesModel`, `resolveAuth`) reads this store, while\n // `/api-keys` and logins write through other AuthStorage instances. Pick\n // up their changes on every catalog refresh.\n this.#credentials.reload();\n const providers: Record<string, ProviderConfig> = {};\n for (const provider of this.#getCustomProviders()) {\n const models = provider.models ?? [];\n if (!models.length) continue;\n providers[getCustomProviderId(provider.name)] = {\n name: provider.name,\n url: provider.url,\n apiKeyEnvVar: '',\n apiKeyHeader: 'Authorization',\n gateway: this.id,\n models,\n };\n }\n\n // Subscription providers are not listed here: catalog ids from this gateway\n // are namespaced (`mastracode/<provider>/...`). Kimi augments the models.dev\n // `kimi-code-plan-cn` provider (claimed via `handlesModel`), and Copilot,\n // which models.dev excludes, has its own `github-copilot` gateway.\n return providers;\n }\n\n buildUrl(modelId: string): string | undefined | Promise<string | undefined> {\n return this.#routeThroughMastraGateway ? this.#mastraGateway.buildUrl(modelId) : modelId;\n }\n\n async getApiKey(modelId: string): Promise<string> {\n const providerId = stripMastraGatewayPrefix(modelId).split('/', 1)[0];\n if (this.#routeThroughMastraGateway) return this.#mastraGatewayApiKey ?? '';\n return providerId ? (getProviderAuthKey(providerId, this.#credentials) ?? '') : '';\n }\n\n resolveAuth(request: GatewayAuthRequest): GatewayAuthResult | undefined {\n if (this.#routeThroughMastraGateway && this.#mastraGatewayApiKey) {\n return { apiKey: this.#mastraGatewayApiKey, source: 'gateway' };\n }\n\n const customProvider = this.#getCustomProviders().find(\n provider => request.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider?.apiKey) {\n return { apiKey: customProvider.apiKey, source: 'gateway' };\n }\n\n return MastraCodeGateway.resolveProviderAuth(request, undefined, this.#credentials);\n }\n\n resolveLanguageModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const customProvider = this.#getCustomProviders().find(\n provider => args.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider) {\n const provider = createOpenAICompatible({\n name: args.providerId,\n baseURL: customProvider.url,\n apiKey: args.apiKey,\n headers: args.headers,\n });\n const reasoningEffort = this.#thinkingLevel ? THINKING_LEVEL_TO_REASONING_EFFORT[this.#thinkingLevel] : undefined;\n const middleware = createReasoningEffortMiddleware(args.providerId, reasoningEffort);\n if (!middleware) {\n return provider.chatModel(args.modelId);\n }\n return wrapLanguageModel({\n model: provider.chatModel(args.modelId),\n middleware: [middleware],\n });\n }\n\n if (args.providerId === 'github-copilot') {\n return githubCopilotProvider(args.modelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'moonshotai') {\n // Prefer the gateway-resolved key (stored credentials), then the canonical\n // registry env var. Keep the legacy typo name as a fallback for anyone who\n // set it because of the previous error message.\n const apiKey =\n args.apiKey?.trim() || process.env.MOONSHOT_API_KEY?.trim() || process.env.MOONSHOT_AI_API_KEY?.trim();\n if (!apiKey) {\n throw new Error('Need MOONSHOT_API_KEY');\n }\n return createAnthropic({\n apiKey,\n baseURL: 'https://api.moonshot.ai/anthropic/v1',\n name: 'moonshotai.anthropicv1',\n headers: args.headers,\n })(args.modelId);\n }\n\n if (args.providerId === 'anthropic') {\n return this.#resolveAnthropicModel(args);\n }\n\n if (args.providerId === 'openai') {\n const openaiModel = this.#resolveOpenAIModel(args);\n if (openaiModel) return openaiModel;\n }\n\n if (args.providerId === 'xai' && this.#credentials.get('xai')?.type === 'oauth') {\n return withThinkingOptionsModel(\n xaiProvider(args.modelId, { headers: args.headers, authStorage: this.#credentials }),\n providerThinkingOptions(`xai/${args.modelId}`, this.#thinkingLevel),\n );\n }\n\n if (this.#routeThroughMastraGateway) return this.#mastraGateway.resolveLanguageModel(args);\n\n if (args.providerId === 'google') {\n return this.#resolveGoogleModel(args);\n }\n\n if (args.providerId === KIMI_CODING_PROVIDER_ID || args.providerId === KIMI_CODING_CREDENTIAL_ID) {\n return kimiCodingProvider(args.modelId, {\n apiKey: args.apiKey,\n headers: args.headers,\n credentialStore: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n const routedModelId: `${string}/${string}` = `${args.providerId}/${args.modelId}`;\n return new ModelRouterLanguageModelWithThinking(\n { id: routedModelId, apiKey: args.apiKey, headers: args.headers },\n providerThinkingOptions(routedModelId, this.#thinkingLevel),\n ) as unknown as GatewayLanguageModel;\n }\n\n #resolveAnthropicModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const bareModelId = normalizeAnthropicModelId(args.modelId);\n const storedCred = this.#credentials.get('anthropic');\n const thinkingMiddleware = createAnthropicThinkingMiddleware(bareModelId, this.#thinkingLevel);\n\n if (this.#routeThroughMastraGateway) {\n if (storedCred?.type === 'oauth') {\n const anthropic = createAnthropic({\n apiKey: 'oauth-gateway-placeholder',\n baseURL: `${this.#mastraGatewayBaseUrl}/v1`,\n headers: {\n [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,\n ...args.headers,\n },\n fetch: buildAnthropicOAuthFetch({ authStorage: this.#credentials }),\n });\n\n return wrapLanguageModel({\n model: anthropic(bareModelId),\n middleware: [\n claudeCodeMiddleware,\n createPromptCacheMiddleware(this.#anthropicPromptCacheScope),\n ...(thinkingMiddleware ? [thinkingMiddleware] : []),\n ],\n });\n }\n\n return this.#mastraGateway.resolveLanguageModel({ ...args, modelId: bareModelId });\n }\n\n if (storedCred?.type === 'oauth') {\n return opencodeClaudeMaxProvider(bareModelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n thinkingLevel: this.#thinkingLevel,\n promptCacheScope: this.#anthropicPromptCacheScope,\n }) as unknown as GatewayLanguageModel;\n }\n\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return anthropicApiKeyProvider(\n bareModelId,\n storedCred.key.trim(),\n args.headers,\n this.#thinkingLevel,\n this.#anthropicPromptCacheScope,\n );\n }\n\n const apiKey = getAnthropicApiKey(this.#credentials);\n if (apiKey) {\n return anthropicApiKeyProvider(\n bareModelId,\n apiKey,\n args.headers,\n this.#thinkingLevel,\n this.#anthropicPromptCacheScope,\n );\n }\n\n // No stored credentials: use the OAuth-backed provider so the first request can trigger login.\n return opencodeClaudeMaxProvider(bareModelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n thinkingLevel: this.#thinkingLevel,\n promptCacheScope: this.#anthropicPromptCacheScope,\n }) as unknown as GatewayLanguageModel;\n }\n\n #resolveOpenAIModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel | undefined {\n const storedCred = this.#credentials.get('openai-codex');\n\n if (this.#routeThroughMastraGateway) {\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);\n const resolvedBareModelId = resolvedModelId.substring(OPENAI_PREFIX.length);\n const effectiveLevel = getEffectiveThinkingLevel(args.modelId, this.#thinkingLevel ?? 'medium');\n const reasoningEffort = THINKING_LEVEL_TO_REASONING_EFFORT[effectiveLevel];\n const middleware = createCodexMiddleware(reasoningEffort);\n const openai = createOpenAI({\n apiKey: 'oauth-gateway-placeholder',\n baseURL: `${this.#mastraGatewayBaseUrl}/v1`,\n headers: {\n [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,\n ...args.headers,\n },\n fetch: buildOpenAICodexOAuthFetch({ authStorage: this.#credentials, rewriteUrl: false }),\n });\n\n return wrapLanguageModel({\n model: openai.responses(resolvedBareModelId),\n middleware: [middleware],\n });\n }\n\n return this.#mastraGateway.resolveLanguageModel(args);\n }\n\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);\n return openaiCodexProvider(resolvedModelId.substring(OPENAI_PREFIX.length), {\n thinkingLevel: this.#thinkingLevel && getEffectiveThinkingLevel(args.modelId, this.#thinkingLevel),\n headers: args.headers,\n authStorage: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n const apiKey = getOpenAIApiKey(this.#credentials);\n if (apiKey) {\n return openaiApiKeyProvider(args.modelId, apiKey, args.headers, this.#thinkingLevel);\n }\n\n return undefined;\n }\n\n #resolveGoogleModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const routerModel = new ModelRouterLanguageModel({\n id: `${args.providerId}/${args.modelId}`,\n apiKey: args.apiKey,\n headers: args.headers,\n }) as unknown as GatewayLanguageModel;\n const thinkingMiddleware = createGoogleThinkingMiddleware(args.modelId, this.#thinkingLevel);\n if (!thinkingMiddleware) return routerModel;\n\n return wrapLanguageModel({\n model: routerModel as any,\n middleware: [thinkingMiddleware],\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mastracode-gateway.js","names":["#mastraGateway","#mastraGatewayBaseUrl","#mastraGatewayApiKey","#routeThroughMastraGateway","#thinkingLevel","#anthropicPromptCacheScope","#customProviders","#settingsPath","#credentials","#getCustomProviders","#resolveAnthropicModel","#resolveOpenAIModel","#resolveGoogleModel"],"sources":["../../src/agents/mastracode-gateway.ts"],"sourcesContent":["import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport type { CustomAvailableModel, CustomModelCatalogProvider } from '@mastra/core/agent-controller';\nimport {\n GATEWAY_AUTH_HEADER,\n MastraGateway,\n MastraModelGateway,\n ModelRouterLanguageModel,\n PROVIDER_REGISTRY,\n} from '@mastra/core/llm';\nimport type {\n GatewayAuthRequest,\n GatewayAuthResult,\n GatewayLanguageModel,\n MastraModelGatewayInterface,\n ProviderConfig,\n} from '@mastra/core/llm';\nimport { wrapLanguageModel } from 'ai';\nimport { AuthStorage } from '../auth/storage.js';\nimport type { CredentialStore } from '../auth/types.js';\nimport { getCustomProviderId, loadSettings, MASTRA_GATEWAY_PROVIDER } from '../onboarding/settings.js';\nimport type { AnthropicPromptCacheScope } from '../providers/anthropic-prompt-cache.js';\nimport {\n buildAnthropicOAuthFetch,\n claudeCodeMiddleware,\n createAnthropicThinkingMiddleware,\n createPromptCacheMiddleware,\n opencodeClaudeMaxProvider,\n} from '../providers/claude-max.js';\nimport { githubCopilotProvider } from '../providers/github-copilot.js';\nimport { createGoogleThinkingMiddleware } from '../providers/google-thinking.js';\nimport { kimiCodingProvider } from '../providers/kimi-coding.js';\nimport {\n getCredentialProviderId,\n KIMI_CODING_CREDENTIAL_ID,\n KIMI_CODING_PROVIDER_ID,\n normalizeAnthropicModelId,\n OPENAI_PREFIX,\n remapOpenAIModelForCodexOAuth,\n stripMastraGatewayPrefix,\n} from '../providers/model-ids.js';\nimport {\n buildOpenAICodexOAuthFetch,\n createCodexMiddleware,\n createReasoningEffortMiddleware,\n getEffectiveThinkingLevel,\n openaiCodexProvider,\n THINKING_LEVEL_TO_REASONING_EFFORT,\n} from '../providers/openai-codex.js';\nimport type { ThinkingLevel } from '../providers/openai-codex.js';\nimport {\n ModelRouterLanguageModelWithThinking,\n providerThinkingOptions,\n withThinkingOptionsModel,\n} from '../providers/provider-thinking.js';\nimport { xaiProvider } from '../providers/xai.js';\nimport { getAppDataDir } from '../utils/project.js';\nimport { resolveCustomProviders } from './custom-provider-source.js';\n\nexport {\n MASTRA_GATEWAY_PREFIX,\n OPENAI_PREFIX,\n remapOpenAIModelForCodexOAuth,\n stripMastraGatewayPrefix,\n} from '../providers/model-ids.js';\n\nexport const MASTRACODE_GATEWAY_ID = 'mastracode';\n\ntype ModelRequestHeaders = Record<string, string>;\n\nexport type MastraCodeCustomProvider = { name: string; url: string; apiKey?: string; models?: string[] };\n\nexport type MastraCodeGatewayOptions = {\n mastraGatewayBaseUrl: string;\n mastraGatewayApiKey?: string;\n routeThroughMastraGateway: boolean;\n thinkingLevel?: ThinkingLevel;\n /** Anthropic prompt-cache breakpoints to write. Defaults to `conversation`. */\n anthropicPromptCacheScope?: AnthropicPromptCacheScope;\n customProviders?: MastraCodeCustomProvider[];\n settingsPath?: string;\n /**\n * Per-tenant credential source for this gateway instance. Defaults to the\n * server-global file-backed `AuthStorage`; deployed web passes the calling\n * tenant's store so model calls use the caller's own credentials.\n */\n credentialStore?: CredentialStore;\n};\n\n/**\n * Global file-backed credential store for local (TUI) model resolution.\n *\n * Constructed lazily, NOT at module scope: `AuthStorage`'s default path is\n * resolved from `MASTRA_APP_DATA_DIR` at construction, and this module is\n * routinely imported before test harnesses / embedders point that variable at\n * an isolated directory — an import-time construction would permanently pin\n * the developer's real app-data dir for every credential read.\n */\nlet authStorageSingleton: AuthStorage | undefined;\nlet authStorageSingletonDir: string | undefined;\n\nexport function getGlobalAuthStorage(): AuthStorage {\n // Keyed by the resolved app-data dir: in-process harnesses re-point\n // MASTRA_APP_DATA_DIR per run inside one long-lived worker, so a store\n // pinned to a previous dir must be discarded, not reused.\n const dir = getAppDataDir();\n if (!authStorageSingleton || authStorageSingletonDir !== dir) {\n authStorageSingleton = new AuthStorage();\n authStorageSingletonDir = dir;\n }\n return authStorageSingleton;\n}\n\nexport function reloadAuthStorage() {\n getGlobalAuthStorage().reload();\n}\n\n/**\n * Resolve the Anthropic API key.\n * Main slot → dedicated apikey: slot → env var.\n */\nexport function getAnthropicApiKey(credentials: CredentialStore = getGlobalAuthStorage()): string | undefined {\n const storedCred = credentials.get('anthropic');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey('anthropic')?.trim();\n if (dedicatedKey) return dedicatedKey;\n return credentials.allowEnvironmentFallback === false\n ? undefined\n : process.env.ANTHROPIC_API_KEY?.trim() || undefined;\n}\n\n/**\n * Resolve the OpenAI API key.\n * Main slot → dedicated apikey: slot → env var.\n */\nexport function getOpenAIApiKey(credentials: CredentialStore = getGlobalAuthStorage()): string | undefined {\n const storedCred = credentials.get('openai-codex');\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey('openai-codex')?.trim();\n if (dedicatedKey) return dedicatedKey;\n return credentials.allowEnvironmentFallback === false ? undefined : process.env.OPENAI_API_KEY?.trim() || undefined;\n}\n\nfunction anthropicApiKeyProvider(\n modelId: string,\n apiKey: string,\n headers: ModelRequestHeaders | undefined,\n thinkingLevel: ThinkingLevel | undefined,\n promptCacheScope: AnthropicPromptCacheScope,\n) {\n const anthropic = createAnthropic({ apiKey, headers });\n const thinkingMiddleware = createAnthropicThinkingMiddleware(modelId, thinkingLevel);\n return wrapLanguageModel({\n model: anthropic(modelId),\n middleware: [createPromptCacheMiddleware(promptCacheScope), ...(thinkingMiddleware ? [thinkingMiddleware] : [])],\n });\n}\n\nfunction openaiApiKeyProvider(\n modelId: string,\n apiKey: string,\n headers?: ModelRequestHeaders,\n thinkingLevel?: ThinkingLevel,\n) {\n const openai = createOpenAI({ apiKey, baseURL: process.env.OPENAI_BASE_URL, headers });\n const middleware =\n thinkingLevel && thinkingLevel !== 'off'\n ? createReasoningEffortMiddleware(\n 'openai',\n THINKING_LEVEL_TO_REASONING_EFFORT[getEffectiveThinkingLevel(modelId, thinkingLevel)],\n )\n : undefined;\n return wrapLanguageModel({\n model: openai.responses(modelId),\n middleware: middleware ? [middleware] : [],\n });\n}\n\nfunction getProviderAuthKey(\n providerId: string,\n credentials: CredentialStore = getGlobalAuthStorage(),\n): string | undefined {\n const authProviderId = getCredentialProviderId(providerId);\n const storedCred = credentials.get(authProviderId);\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return storedCred.key.trim();\n }\n const dedicatedKey = credentials.getStoredApiKey(authProviderId)?.trim();\n if (dedicatedKey) return dedicatedKey;\n // `/api-keys` stores keys under the catalog provider id (`kimi-code-plan-cn`),\n // which can differ from the credential id.\n const catalogKey = authProviderId !== providerId ? credentials.getStoredApiKey(providerId)?.trim() : undefined;\n if (catalogKey) return catalogKey;\n if (credentials.allowEnvironmentFallback === false) return undefined;\n return authProviderId === KIMI_CODING_CREDENTIAL_ID ? process.env.KIMI_API_KEY?.trim() || undefined : undefined;\n}\n\nexport function resolveAuth(request: GatewayAuthRequest, mastraGatewayApiKey?: string): GatewayAuthResult | undefined {\n return MastraCodeGateway.resolveProviderAuth(request, mastraGatewayApiKey);\n}\n\nfunction getGatewayProviderKey(gatewayId: string, providerId: string): string {\n if (gatewayId === 'models.dev') return providerId;\n return providerId === gatewayId ? gatewayId : `${gatewayId}/${providerId}`;\n}\n\nfunction parseGatewayRouterId(\n routerId: string,\n gateway: MastraModelGatewayInterface,\n): { gatewayId: string; providerId: string; modelId: string } {\n const [firstPart = '', secondPart = '', ...restParts] = routerId.split('/');\n const gatewayId = gateway.id;\n\n if (firstPart === gatewayId && secondPart) {\n return {\n gatewayId,\n providerId: secondPart,\n modelId: restParts.join('/'),\n };\n }\n\n return {\n gatewayId,\n providerId: firstPart,\n modelId: [secondPart, ...restParts].filter(Boolean).join('/'),\n };\n}\n\nfunction hasResolvedAuth(auth: GatewayAuthResult | undefined): boolean {\n if (!auth) return false;\n if (auth.apiKey || auth.bearerToken) return true;\n return auth.headers ? Object.keys(auth.headers).length > 0 : false;\n}\n\nasync function resolveGatewayProviderAuth(\n gateway: MastraModelGatewayInterface,\n routerId: string,\n): Promise<GatewayAuthResult | undefined> {\n if (!gateway.resolveAuth) return undefined;\n\n const parsed = parseGatewayRouterId(routerId, gateway);\n try {\n const result = await gateway.resolveAuth({\n gatewayId: parsed.gatewayId,\n providerId: parsed.providerId,\n modelId: parsed.modelId,\n routerId,\n });\n return hasResolvedAuth(result) ? result : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function getMastraCodeProviderConfigs(\n gateway: MastraModelGatewayInterface,\n): Promise<Record<string, ProviderConfig>> {\n const providers: Record<string, ProviderConfig> = { ...(PROVIDER_REGISTRY as Record<string, ProviderConfig>) };\n\n try {\n const gatewayProviders = await gateway.fetchProviders();\n for (const [providerId, config] of Object.entries(gatewayProviders)) {\n providers[getGatewayProviderKey(gateway.id, providerId)] = {\n ...config,\n gateway: gateway.id,\n };\n }\n } catch (error) {\n console.warn(`Failed to load providers from gateway ${gateway.id}:`, error);\n }\n\n return providers;\n}\n\nfunction getApiKeyEnvVar(providerConfig: Pick<ProviderConfig, 'apiKeyEnvVar'> | undefined): string | undefined {\n const envVars = providerConfig?.apiKeyEnvVar;\n return Array.isArray(envVars) ? envVars[0] : envVars;\n}\n\n/**\n * Whether the process environment has a key for a models.dev provider. Checks every\n * env var the registry lists, as the models.dev gateway does when `resolveModel`\n * gets no gateway credential (e.g. `GOOGLE_API_KEY` or `GOOGLE_GENERATIVE_AI_API_KEY`).\n */\nexport function hasProviderEnvironmentKey(providerId: string): boolean {\n const envVars = (PROVIDER_REGISTRY as Record<string, ProviderConfig>)[providerId]?.apiKeyEnvVar;\n if (!envVars) return false;\n return (Array.isArray(envVars) ? envVars : [envVars]).some(envVar => Boolean(process.env[envVar]?.trim()));\n}\n\nexport class MastraCodeGateway extends MastraModelGateway {\n readonly id = MASTRACODE_GATEWAY_ID;\n readonly name = 'MastraCode Gateway';\n\n readonly #mastraGateway: MastraGateway;\n readonly #mastraGatewayBaseUrl: string;\n readonly #mastraGatewayApiKey?: string;\n readonly #routeThroughMastraGateway: boolean;\n readonly #thinkingLevel?: ThinkingLevel;\n readonly #anthropicPromptCacheScope: AnthropicPromptCacheScope;\n readonly #customProviders?: MastraCodeCustomProvider[];\n readonly #settingsPath?: string;\n readonly #credentials: CredentialStore;\n\n constructor({\n mastraGatewayBaseUrl,\n mastraGatewayApiKey,\n routeThroughMastraGateway,\n thinkingLevel,\n anthropicPromptCacheScope,\n customProviders,\n settingsPath,\n credentialStore,\n }: MastraCodeGatewayOptions) {\n super();\n this.#mastraGateway = new MastraGateway({ baseUrl: mastraGatewayBaseUrl });\n this.#mastraGatewayBaseUrl = mastraGatewayBaseUrl;\n this.#mastraGatewayApiKey = mastraGatewayApiKey;\n this.#routeThroughMastraGateway = routeThroughMastraGateway;\n this.#thinkingLevel = thinkingLevel;\n this.#anthropicPromptCacheScope = anthropicPromptCacheScope ?? 'conversation';\n this.#customProviders = customProviders;\n this.#settingsPath = settingsPath;\n this.#credentials = credentialStore ?? getGlobalAuthStorage();\n }\n\n static getMastraGatewayApiKey(): string | undefined {\n return getGlobalAuthStorage().getStoredApiKey(MASTRA_GATEWAY_PROVIDER) ?? process.env['MASTRA_GATEWAY_API_KEY'];\n }\n\n /** @deprecated Renamed to {@link MastraCodeGateway.getMastraGatewayApiKey}. */\n static getMemoryGatewayApiKey(): string | undefined {\n return MastraCodeGateway.getMastraGatewayApiKey();\n }\n\n /**\n * Claim an unprefixed model id (e.g. a bare `anthropic/...`) when this gateway\n * can authenticate it via OAuth or a stored/env credential. This lets the\n * shared gateway router select MastraCode for auth resolution, so the status\n * bar and `/api-keys` reflect OAuth logins instead of only checking env vars.\n */\n handlesModel(modelId: string): boolean {\n const parsed = parseGatewayRouterId(modelId, this);\n if (!parsed.providerId || !parsed.modelId) return false;\n if (this.#routeThroughMastraGateway && this.#mastraGatewayApiKey) return true;\n const customProvider = this.#getCustomProviders().find(\n provider => parsed.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider?.apiKey) return true;\n return hasResolvedAuth(\n MastraCodeGateway.resolveProviderAuth(\n {\n gatewayId: this.id,\n providerId: parsed.providerId,\n modelId: parsed.modelId,\n routerId: modelId,\n },\n undefined,\n this.#credentials,\n ),\n );\n }\n\n static resolveProviderAuth(\n request: GatewayAuthRequest,\n mastraGatewayApiKey?: string,\n credentials: CredentialStore = getGlobalAuthStorage(),\n ): GatewayAuthResult | undefined {\n if (request.gatewayId === 'mastra' && mastraGatewayApiKey) {\n return { apiKey: mastraGatewayApiKey, source: 'gateway' };\n }\n\n const authProviderId = getCredentialProviderId(request.providerId);\n const storedCred = credentials.get(authProviderId);\n if (storedCred?.type === 'oauth') {\n return { bearerToken: 'oauth', source: 'gateway' };\n }\n\n const apiKey = getProviderAuthKey(request.providerId, credentials);\n return apiKey ? { apiKey, source: 'gateway' } : undefined;\n }\n\n static createModelCatalogProvider(gateway: MastraModelGatewayInterface): CustomModelCatalogProvider {\n return async () => {\n const registry = await getMastraCodeProviderConfigs(gateway);\n const models: CustomAvailableModel[] = [];\n\n for (const [provider, providerConfig] of Object.entries(registry)) {\n const apiKeyEnvVar = getApiKeyEnvVar(providerConfig);\n const hasEnvKey = apiKeyEnvVar ? Boolean(process.env[apiKeyEnvVar]) : false;\n const modelNames = providerConfig.models;\n if (!Array.isArray(modelNames)) continue;\n\n const gatewayAuth = modelNames[0]\n ? await resolveGatewayProviderAuth(gateway, `${provider}/${modelNames[0]}`)\n : undefined;\n\n for (const modelName of modelNames) {\n const id = `${provider}/${modelName}`;\n models.push({\n id,\n provider,\n modelName,\n hasApiKey: hasEnvKey || Boolean(gatewayAuth),\n apiKeyEnvVar: apiKeyEnvVar || undefined,\n });\n }\n }\n\n return models;\n };\n }\n\n createModelCatalogProvider(): CustomModelCatalogProvider {\n return MastraCodeGateway.createModelCatalogProvider(this);\n }\n\n #getCustomProviders(): MastraCodeCustomProvider[] {\n // Explicit constructor list wins; then a registered source (deployed web,\n // DB-backed — authoritative, so settings.json is never consulted); then\n // the local file-backed settings.\n return this.#customProviders ?? resolveCustomProviders() ?? loadSettings(this.#settingsPath).customProviders;\n }\n\n async fetchProviders(): Promise<Record<string, ProviderConfig>> {\n // Catalog auth (`handlesModel`, `resolveAuth`) reads this store, while\n // `/api-keys` and logins write through other AuthStorage instances. Pick\n // up their changes on every catalog refresh.\n this.#credentials.reload();\n const providers: Record<string, ProviderConfig> = {};\n for (const provider of this.#getCustomProviders()) {\n const models = provider.models ?? [];\n if (!models.length) continue;\n providers[getCustomProviderId(provider.name)] = {\n name: provider.name,\n url: provider.url,\n apiKeyEnvVar: '',\n apiKeyHeader: 'Authorization',\n gateway: this.id,\n models,\n };\n }\n\n // Subscription providers are not listed here: catalog ids from this gateway\n // are namespaced (`mastracode/<provider>/...`). Kimi augments the models.dev\n // `kimi-code-plan-cn` provider (claimed via `handlesModel`), and Copilot,\n // which models.dev excludes, has its own `github-copilot` gateway.\n return providers;\n }\n\n buildUrl(modelId: string): string | undefined | Promise<string | undefined> {\n return this.#routeThroughMastraGateway ? this.#mastraGateway.buildUrl(modelId) : modelId;\n }\n\n async getApiKey(modelId: string): Promise<string> {\n const providerId = stripMastraGatewayPrefix(modelId).split('/', 1)[0];\n if (this.#routeThroughMastraGateway) return this.#mastraGatewayApiKey ?? '';\n return providerId ? (getProviderAuthKey(providerId, this.#credentials) ?? '') : '';\n }\n\n resolveAuth(request: GatewayAuthRequest): GatewayAuthResult | undefined {\n if (this.#routeThroughMastraGateway && this.#mastraGatewayApiKey) {\n return { apiKey: this.#mastraGatewayApiKey, source: 'gateway' };\n }\n\n const customProvider = this.#getCustomProviders().find(\n provider => request.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider?.apiKey) {\n return { apiKey: customProvider.apiKey, source: 'gateway' };\n }\n\n return MastraCodeGateway.resolveProviderAuth(request, undefined, this.#credentials);\n }\n\n resolveLanguageModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const customProvider = this.#getCustomProviders().find(\n provider => args.providerId === getCustomProviderId(provider.name),\n );\n if (customProvider) {\n const provider = createOpenAICompatible({\n name: args.providerId,\n baseURL: customProvider.url,\n apiKey: args.apiKey,\n headers: args.headers,\n });\n const reasoningEffort = this.#thinkingLevel ? THINKING_LEVEL_TO_REASONING_EFFORT[this.#thinkingLevel] : undefined;\n const middleware = createReasoningEffortMiddleware(args.providerId, reasoningEffort);\n if (!middleware) {\n return provider.chatModel(args.modelId);\n }\n return wrapLanguageModel({\n model: provider.chatModel(args.modelId),\n middleware: [middleware],\n });\n }\n\n if (args.providerId === 'github-copilot') {\n return githubCopilotProvider(args.modelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n if (args.providerId === 'moonshotai') {\n // Prefer the gateway-resolved key (stored credentials), then the canonical\n // registry env var. Keep the legacy typo name as a fallback for anyone who\n // set it because of the previous error message.\n const apiKey =\n args.apiKey?.trim() || process.env.MOONSHOT_API_KEY?.trim() || process.env.MOONSHOT_AI_API_KEY?.trim();\n if (!apiKey) {\n throw new Error('Need MOONSHOT_API_KEY');\n }\n return createAnthropic({\n apiKey,\n baseURL: 'https://api.moonshot.ai/anthropic/v1',\n name: 'moonshotai.anthropicv1',\n headers: args.headers,\n })(args.modelId);\n }\n\n if (args.providerId === 'anthropic') {\n return this.#resolveAnthropicModel(args);\n }\n\n if (args.providerId === 'openai') {\n const openaiModel = this.#resolveOpenAIModel(args);\n if (openaiModel) return openaiModel;\n }\n\n if (args.providerId === 'xai' && this.#credentials.get('xai')?.type === 'oauth') {\n return withThinkingOptionsModel(\n xaiProvider(args.modelId, { headers: args.headers, authStorage: this.#credentials }),\n providerThinkingOptions(`xai/${args.modelId}`, this.#thinkingLevel),\n );\n }\n\n if (this.#routeThroughMastraGateway) return this.#mastraGateway.resolveLanguageModel(args);\n\n if (args.providerId === 'google') {\n return this.#resolveGoogleModel(args);\n }\n\n if (args.providerId === KIMI_CODING_PROVIDER_ID || args.providerId === KIMI_CODING_CREDENTIAL_ID) {\n return kimiCodingProvider(args.modelId, {\n apiKey: args.apiKey,\n headers: args.headers,\n credentialStore: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n const routedModelId: `${string}/${string}` = `${args.providerId}/${args.modelId}`;\n return new ModelRouterLanguageModelWithThinking(\n { id: routedModelId, apiKey: args.apiKey, headers: args.headers },\n providerThinkingOptions(routedModelId, this.#thinkingLevel),\n ) as unknown as GatewayLanguageModel;\n }\n\n #resolveAnthropicModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const bareModelId = normalizeAnthropicModelId(args.modelId);\n const storedCred = this.#credentials.get('anthropic');\n const thinkingMiddleware = createAnthropicThinkingMiddleware(bareModelId, this.#thinkingLevel);\n\n if (this.#routeThroughMastraGateway) {\n if (storedCred?.type === 'oauth') {\n const anthropic = createAnthropic({\n apiKey: 'oauth-gateway-placeholder',\n baseURL: `${this.#mastraGatewayBaseUrl}/v1`,\n headers: {\n [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,\n ...args.headers,\n },\n fetch: buildAnthropicOAuthFetch({ authStorage: this.#credentials }),\n });\n\n return wrapLanguageModel({\n model: anthropic(bareModelId),\n middleware: [\n claudeCodeMiddleware,\n createPromptCacheMiddleware(this.#anthropicPromptCacheScope),\n ...(thinkingMiddleware ? [thinkingMiddleware] : []),\n ],\n });\n }\n\n return this.#mastraGateway.resolveLanguageModel({ ...args, modelId: bareModelId });\n }\n\n if (storedCred?.type === 'oauth') {\n return opencodeClaudeMaxProvider(bareModelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n thinkingLevel: this.#thinkingLevel,\n promptCacheScope: this.#anthropicPromptCacheScope,\n }) as unknown as GatewayLanguageModel;\n }\n\n if (storedCred?.type === 'api_key' && storedCred.key.trim().length > 0) {\n return anthropicApiKeyProvider(\n bareModelId,\n storedCred.key.trim(),\n args.headers,\n this.#thinkingLevel,\n this.#anthropicPromptCacheScope,\n );\n }\n\n const apiKey = getAnthropicApiKey(this.#credentials);\n if (apiKey) {\n return anthropicApiKeyProvider(\n bareModelId,\n apiKey,\n args.headers,\n this.#thinkingLevel,\n this.#anthropicPromptCacheScope,\n );\n }\n\n // No stored credentials: use the OAuth-backed provider so the first request can trigger login.\n return opencodeClaudeMaxProvider(bareModelId, {\n headers: args.headers,\n authStorage: this.#credentials,\n thinkingLevel: this.#thinkingLevel,\n promptCacheScope: this.#anthropicPromptCacheScope,\n }) as unknown as GatewayLanguageModel;\n }\n\n #resolveOpenAIModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel | undefined {\n const storedCred = this.#credentials.get('openai-codex');\n\n if (this.#routeThroughMastraGateway) {\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);\n const resolvedBareModelId = resolvedModelId.substring(OPENAI_PREFIX.length);\n const effectiveLevel = getEffectiveThinkingLevel(args.modelId, this.#thinkingLevel ?? 'medium');\n const reasoningEffort = THINKING_LEVEL_TO_REASONING_EFFORT[effectiveLevel];\n const middleware = createCodexMiddleware(reasoningEffort);\n const openai = createOpenAI({\n apiKey: 'oauth-gateway-placeholder',\n baseURL: `${this.#mastraGatewayBaseUrl}/v1`,\n headers: {\n [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,\n ...args.headers,\n },\n fetch: buildOpenAICodexOAuthFetch({ authStorage: this.#credentials, rewriteUrl: false }),\n });\n\n return wrapLanguageModel({\n model: openai.responses(resolvedBareModelId),\n middleware: [middleware],\n });\n }\n\n return this.#mastraGateway.resolveLanguageModel(args);\n }\n\n if (storedCred?.type === 'oauth') {\n const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);\n return openaiCodexProvider(resolvedModelId.substring(OPENAI_PREFIX.length), {\n thinkingLevel: this.#thinkingLevel && getEffectiveThinkingLevel(args.modelId, this.#thinkingLevel),\n headers: args.headers,\n authStorage: this.#credentials,\n }) as unknown as GatewayLanguageModel;\n }\n\n const apiKey = getOpenAIApiKey(this.#credentials);\n if (apiKey) {\n return openaiApiKeyProvider(args.modelId, apiKey, args.headers, this.#thinkingLevel);\n }\n\n return undefined;\n }\n\n #resolveGoogleModel(args: {\n modelId: string;\n providerId: string;\n apiKey: string;\n headers?: Record<string, string>;\n transport?: any;\n responsesWebSocket?: any;\n }): GatewayLanguageModel {\n const routerModel = new ModelRouterLanguageModel({\n id: `${args.providerId}/${args.modelId}`,\n apiKey: args.apiKey,\n headers: args.headers,\n }) as unknown as GatewayLanguageModel;\n const thinkingMiddleware = createGoogleThinkingMiddleware(args.modelId, this.#thinkingLevel);\n if (!thinkingMiddleware) return routerModel;\n\n return wrapLanguageModel({\n model: routerModel as any,\n middleware: [thinkingMiddleware],\n });\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/agents/memory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAgB,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAiC,MAAM,uBAAuB,CAAC;AAI9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAsLpD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AA8BlC;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAE/E;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,SAAS,GAAG,OAAO,CAElH;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,oBAAoB,EAC7B,MAAM,CAAC,EAAE,YAAY,EACrB,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7C,SAAS,CAAC,EAAE,SAAS,yBAsBsB;IAAE,cAAc,EAAE,cAAc,CAAA;CAAE;IAmJ3E;;;OAGG;eACc,OAAO,CAAC,IAAI,CAAC;EAKjC"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/agents/memory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAgB,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAiC,MAAM,uBAAuB,CAAC;AAI9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA2LpD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AA8BlC;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAE/E;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,EAAE,KAAK,EAAE,eAAe,GAAG,SAAS,GAAG,OAAO,CAElH;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,oBAAoB,EAC7B,MAAM,CAAC,EAAE,YAAY,EACrB,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7C,SAAS,CAAC,EAAE,SAAS,yBAsBsB;IAAE,cAAc,EAAE,cAAc,CAAA;CAAE;IAyJ3E;;;OAGG;eACc,OAAO,CAAC,IAAI,CAAC;EAKjC"}
@@ -4,7 +4,7 @@ import { MASTRACODE_AUTO_OM_MODELS, resolveAutoOMModelId } from "../onboarding/p
4
4
  import { loadSettings } from "../onboarding/settings.js";
5
5
  import { LOCAL_KNOWLEDGE_ORG_ID, resolveKnowledgeScopeIdentity } from "../knowledge-scope.js";
6
6
  import "../providers/anthropic-prompt-cache.js";
7
- import { getActiveMemoryRoute, resolveModel } from "./model.js";
7
+ import { canUseProvider, getActiveMemoryRoute, resolveModel } from "./model.js";
8
8
  import { Memory, Subconscious } from "@mastra/memory";
9
9
  import { fastembed } from "@mastra/fastembed";
10
10
  //#region src/agents/memory.ts
@@ -69,7 +69,7 @@ function resolveOmRoleModelForRequest(role, requestContext, settingsPath, option
69
69
  };
70
70
  const useAuto = () => {
71
71
  requestContext.set(`om.${role}.selectionMode`, "auto");
72
- requestContext.set(`om.${role}.effectiveModelId`, resolveAutoOMModelId(getMainModelId(requestContext)));
72
+ requestContext.set(`om.${role}.effectiveModelId`, resolveAutoOMModelId(getMainModelId(requestContext), (providerId) => canUseProvider(providerId, { requestContext })));
73
73
  return "auto";
74
74
  };
75
75
  if (isFactoryMemorySettingsUnavailable(factorySettingsContext) || factorySettingsContext === void 0 && isFactory) return useAuto();
@@ -207,12 +207,13 @@ function getDynamicMemory(storage, vector, settingsPath, options, knowledge) {
207
207
  options: {
208
208
  generateTitle: process.env.MASTRACODE_DISABLE_TITLE_GENERATION === "1" ? false : { model: ({ requestContext }) => {
209
209
  const resolved = getObserverModel({ requestContext });
210
- if (resolved === "auto") return resolveMemoryModel(resolveAutoOMModelId(getMainModelId(requestContext)), { requestContext });
210
+ if (resolved === "auto") return resolveMemoryModel(resolveAutoOMModelId(getMainModelId(requestContext), (providerId) => canUseProvider(providerId, { requestContext })), { requestContext });
211
211
  return Array.isArray(resolved) ? resolved[0].model : resolved;
212
212
  } },
213
213
  observationalMemory: process.env.MASTRACODE_DISABLE_OBSERVATIONAL_MEMORY === "1" ? false : {
214
214
  enabled: true,
215
215
  autoModels: MASTRACODE_AUTO_OM_MODELS,
216
+ canUseProvider,
216
217
  resolveModel: resolveMemoryModel,
217
218
  temporalMarkers: true,
218
219
  retrieval: vector ? { vector: true } : true,
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","names":[],"sources":["../../src/agents/memory.ts"],"sourcesContent":["import type { AgentControllerRequestContext } from '@mastra/core/agent-controller';\nimport type { Knowledge } from '@mastra/core/knowledge';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MastraCompositeStore } from '@mastra/core/storage';\nimport type { MastraVector } from '@mastra/core/vector';\nimport { fastembed } from '@mastra/fastembed';\nimport { Memory, Subconscious } from '@mastra/memory';\nimport { DEFAULT_OBS_THRESHOLD, DEFAULT_REF_THRESHOLD } from '../constants.js';\nimport { LOCAL_KNOWLEDGE_ORG_ID, resolveKnowledgeScopeIdentity } from '../knowledge-scope.js';\nimport { MASTRACODE_AUTO_OM_MODELS, resolveAutoOMModelId } from '../onboarding/packs.js';\nimport { loadSettings } from '../onboarding/settings.js';\nimport { ANTHROPIC_PROMPT_CACHE_TTL } from '../providers/anthropic-prompt-cache.js';\nimport type { MastraCodeState } from '../schema.js';\nimport { getOmScope } from '../utils/project.js';\nimport { getActiveMemoryRoute, resolveModel } from './model.js';\n\n/** Route-backed OM fallback entry. */\ntype MemoryModelRouteEntry = { id: string; model: ReturnType<typeof resolveModel> };\n\n/**\n * Resolve the active model route's memory models, starting at a same-thread\n * pending fallback hop. Returns `'auto'` when the route's first memory model is\n * Auto, and `undefined` when the route sets no memory model.\n */\nfunction resolveRouteMemoryModels(\n state: MastraCodeState | undefined,\n threadId: string | null | undefined,\n resolve: (modelId: string) => ReturnType<typeof resolveModel>,\n): MemoryModelRouteEntry[] | 'auto' | undefined {\n const memoryRoute = getActiveMemoryRoute(state, threadId);\n if (memoryRoute[0]?.memoryModelId === 'auto') return 'auto';\n const seenModelIds = new Set<string>();\n const appearances = new Map<string, number>();\n const entries: MemoryModelRouteEntry[] = [];\n for (const entry of memoryRoute) {\n if (!entry.memoryModelId || entry.memoryModelId === 'auto' || seenModelIds.has(entry.memoryModelId)) continue;\n seenModelIds.add(entry.memoryModelId);\n const occurrence = (appearances.get(entry.id) ?? 0) + 1;\n appearances.set(entry.id, occurrence);\n try {\n entries.push({\n id: `${entry.id}:memory${occurrence === 1 ? '' : `#${occurrence}`}`,\n model: resolve(entry.memoryModelId),\n });\n } catch {\n break;\n }\n }\n return entries.length > 0 ? entries : undefined;\n}\n\n/**\n * The authoritative per-caller Factory memory-settings row, placed on the request\n * context before Factory's model-dependent processors run. `null` means the row\n * exists but is empty (every role auto). An unavailable sentinel or a missing\n * value on a Factory-owned session falls back to Auto roles and default\n * thresholds/attachments, so memory keeps working while Factory reports the error.\n */\ninterface FactoryMemorySettings {\n observerModelId: string | null;\n reflectorModelId: string | null;\n observationThreshold: number | null;\n reflectionThreshold: number | null;\n observeAttachments: 'auto' | boolean | null;\n}\n\ntype FactoryMemorySettingsContext =\n | FactoryMemorySettings\n | null\n | { status: 'unavailable'; reason: string }\n | undefined;\n\nfunction getFactoryMemorySettingsContext(requestContext: RequestContext): FactoryMemorySettingsContext {\n return requestContext.get('mastra__factoryMemorySettings') as FactoryMemorySettingsContext;\n}\n\nfunction isFactoryMemorySettingsUnavailable(\n settings: FactoryMemorySettingsContext,\n): settings is { status: 'unavailable'; reason: string } {\n return settings !== null && typeof settings === 'object' && 'status' in settings && settings.status === 'unavailable';\n}\n\nfunction getMainModelId(requestContext: RequestContext): string | undefined {\n const controller = requestContext.get('controller') as AgentControllerRequestContext<MastraCodeState> | undefined;\n return controller?.session.modelId || (controller?.getState()?.currentModelId as string | undefined);\n}\n\n/**\n * Resolve one OM role's model for this invocation. Returns `'auto'` for Memory's\n * auto policy, or a concrete model. Factory's DB row is authoritative for\n * Factory sessions (an unreadable row falls back to auto). Otherwise the active\n * model route's memory models win, then the per-role selection, then legacy\n * concrete settings.\n */\nfunction resolveOmRoleModelForRequest(\n role: 'observer' | 'reflector',\n requestContext: RequestContext,\n settingsPath?: string,\n options?: { disableSettingsOmSeed?: boolean },\n): 'auto' | ReturnType<typeof resolveModel> | MemoryModelRouteEntry[] {\n const controller = requestContext.get('controller') as AgentControllerRequestContext<MastraCodeState> | undefined;\n const state = controller?.getState() as MastraCodeState | undefined;\n const resolveOptions = { remapForCodexOAuth: true, requestContext, anthropicPromptCacheScope: 'system' } as const;\n const factorySettingsContext = getFactoryMemorySettingsContext(requestContext);\n const isFactory = typeof state?.factoryProjectId === 'string';\n\n const useModel = (modelId: string) => {\n requestContext.set(`om.${role}.selectionMode`, 'model');\n requestContext.set(`om.${role}.effectiveModelId`, modelId);\n return resolveModel(modelId, resolveOptions);\n };\n const useAuto = () => {\n requestContext.set(`om.${role}.selectionMode`, 'auto');\n // These two keys are declared in the span-context allowlist\n // (`mastracode/sdk/src/index.ts`), so traces can report intent separately from\n // the effective concrete model without either being mistaken for a model ID.\n requestContext.set(`om.${role}.effectiveModelId`, resolveAutoOMModelId(getMainModelId(requestContext)));\n return 'auto' as const;\n };\n\n if (\n isFactoryMemorySettingsUnavailable(factorySettingsContext) ||\n (factorySettingsContext === undefined && isFactory)\n ) {\n return useAuto();\n }\n if (factorySettingsContext !== undefined) {\n const factoryModelId = factorySettingsContext?.[`${role}ModelId`];\n return factoryModelId ? useModel(factoryModelId) : useAuto();\n }\n\n // The configured settings file, not the default one: a caller that points the\n // agent at another settings path must get the same override resolution for\n // observational memory as it does for the main model. Hosts that disable the\n // settings seed never read it.\n const settings = options?.disableSettingsOmSeed ? undefined : loadSettings(settingsPath);\n const routeMemory = resolveRouteMemoryModels(state, controller?.threadId, modelId =>\n resolveModel(modelId, resolveOptions),\n );\n if (routeMemory === 'auto') return useAuto();\n if (routeMemory) {\n requestContext.set(`om.${role}.selectionMode`, 'model');\n requestContext.set(`om.${role}.effectiveModelId`, routeMemory[0]?.model.modelId);\n return routeMemory.length === 1 ? routeMemory[0]!.model : routeMemory;\n }\n\n const selection: unknown = state?.[`${role}ModelSelection`];\n if (selection === 'auto') return useAuto();\n if (typeof selection === 'string' && selection) return useModel(selection);\n if (\n selection &&\n typeof selection === 'object' &&\n 'modelId' in selection &&\n typeof selection.modelId === 'string' &&\n selection.modelId\n ) {\n return useModel(selection.modelId);\n }\n\n const roleOverride =\n role === 'observer' ? settings?.models?.observerModelOverride : settings?.models?.reflectorModelOverride;\n if (roleOverride) return useModel(roleOverride);\n const legacyModelId = state?.[`${role}ModelId`];\n if (typeof legacyModelId === 'string' && legacyModelId) return useModel(legacyModelId);\n return useAuto();\n}\n\nconst DYNAMIC_AGENTS_MD_INSTRUCTION =\n 'Messages wrapped in <system-reminder type=\"dynamic-agents-md\" ...>...</system-reminder> are ephemeral project-context instructions injected from files on disk. Do NOT observe or extract information from these messages — they are reloaded automatically when needed and should not be stored in memory.';\n\n// Derived from https://github.com/JuliusBrussee/caveman and adapted for OM use with fixed full-level compression.\nconst CAVEMAN_OM_INSTRUCTION = `Respond terse like smart caveman. All technical substance stay. Only fluff die.\n\nUse full caveman compression style.\n\nDrop: articles (a/an/the), filler (just/really/basically/actually/simply), pleasantries (sure/certainly/of course/happy to), hedging. Fragments OK. Short synonyms (big not extensive, fix not \"implement a solution for\"). Technical terms exact. Code blocks unchanged. Errors quoted exact. Leave out the words \"agent\" and \"assistant\" at the start of each observation line, it is assumed each line is referring to the assistant unless it specifically says it was about the user. Leave out parenthesis and other text characters like * that would not contribute to understanding the observations.\n\nPattern: \\`[thing] [action] [reason]. [next step]\\`\n\nNot: \"Sure! I'd be happy to help you with that. The issue you're experiencing is likely caused by...\"\nYes: \"Bug in auth middleware. Token expiry check use < not <=. Fix:\"\n\nExample 1\n🔴 14:31 user asks why React component rerenders\n🟡 14:32 saw inline object prop create new ref each render, cause rerender\n✅ 14:34 fixed render issue by wrap object in useMemo\n\nExample 2\n🟡 15:10 explained pool reuse DB connections, skip repeat handshake overhead\n\nDon't say \"Agent did x\", say \"did x\". It will be assumed the agent did what was observed. The who should only be specified for the user or other third parties: \"user asked x\"\n\nDrop caveman for: security warnings, irreversible action confirmations, multi-step sequences where fragment order risks misread, user asks to clarify or repeats question, and anything that requires remembering verbatim content. Resume caveman after clear part done`;\n\nexport { LOCAL_KNOWLEDGE_ORG_ID };\n\n// One error per session, not per memory resolution. Keyed on the session id\n// rather than the controller object: the controller is read off the request\n// context on every resolution, so it is a fresh object per request and would\n// dedupe nothing. Bounded so a long-running Factory process cannot grow this\n// without limit — refusing sessions are rare, and losing the oldest ids only\n// costs one extra log line.\nconst REPORTED_ORG_UNRESOLVED_LIMIT = 500;\nconst reportedOrgUnresolved = new Set<string>();\n\nfunction reportOrgUnresolved(\n controller: AgentControllerRequestContext<MastraCodeState> | undefined,\n factoryProjectId: string | undefined,\n reason?: string,\n) {\n const sessionId = controller?.session?.id;\n if (sessionId) {\n if (reportedOrgUnresolved.has(sessionId)) return;\n if (reportedOrgUnresolved.size >= REPORTED_ORG_UNRESOLVED_LIMIT) {\n reportedOrgUnresolved.delete(reportedOrgUnresolved.values().next().value as string);\n }\n reportedOrgUnresolved.add(sessionId);\n }\n const session = controller?.session;\n console.error(\n `[Subconscious] Knowledge curation disabled: no organization resolved for session ${session?.id ?? 'unknown'} (project ${factoryProjectId ?? 'none'})${reason ? `: ${reason}` : ''}. Knowledge is not written rather than written where it cannot be read.`,\n );\n}\n\n/**\n * Whether the experimental subconscious (knowledge graph + reminder sidekick)\n * is switched on for this process: it needs a vector store and the opt-in flag.\n */\nexport function isSubconsciousEnabled(vector: MastraVector | undefined): boolean {\n return Boolean(vector) && process.env.MASTRACODE_EXPERIMENTAL_SUBCONSCIOUS === '1';\n}\n\n/**\n * Whether the subconscious tools (`knowledge_*`, `ask_memory`) are registered\n * for a given session. Beyond the process-level switch, a Factory-owned\n * session that cannot resolve its org refuses the subconscious entirely (see\n * `getDynamicMemory`, which applies the same two checks inline because it also\n * needs the resolved identity). The system prompt's tool guidance calls here so\n * it never advertises tools that `getDynamicMemory` did not register.\n */\nexport function hasSubconsciousTools(vector: MastraVector | undefined, state: MastraCodeState | undefined): boolean {\n return isSubconsciousEnabled(vector) && resolveKnowledgeScopeIdentity(state).resolved;\n}\n\n/**\n * Dynamic memory factory function.\n * Reads OM thresholds from controller state via requestContext.\n * Model functions also read from requestContext (no mutable bridge needed).\n */\nexport function getDynamicMemory(\n storage: MastraCompositeStore,\n vector?: MastraVector,\n settingsPath?: string,\n options?: { disableSettingsOmSeed?: boolean },\n knowledge?: Knowledge,\n) {\n // Cache is scoped per storage instance (per getDynamicMemory call) so a\n // Memory bound to one storage is never reused after storage changes.\n let cachedMemory: Memory | null = null;\n let cachedMemoryKey: string | null = null;\n // Instances replaced by a config change may still have background work in flight.\n const retiredMemories = new Set<Memory>();\n\n // Observer/reflector model functions — read the current model ID from\n // controller state via requestContext (propagated by OM's agent.generate).\n // Bound here so the configured settings path reaches role overrides and pack\n // memory-model resolution.\n const getObserverModel = ({ requestContext }: { requestContext: RequestContext }) =>\n resolveOmRoleModelForRequest('observer', requestContext, settingsPath, options);\n const getReflectorModel = ({ requestContext }: { requestContext: RequestContext }) =>\n resolveOmRoleModelForRequest('reflector', requestContext, settingsPath, options);\n // Routes the concrete model Memory's `'auto'` picks through Mastra Code's\n // credential-aware resolver, like every other Mastra Code model.\n const resolveMemoryModel = (modelId: string, { requestContext }: { requestContext?: RequestContext }) =>\n resolveModel(modelId, { remapForCodexOAuth: true, requestContext, anthropicPromptCacheScope: 'system' });\n\n const resolveMemory = ({ requestContext }: { requestContext: RequestContext }) => {\n const controller = requestContext.get('controller') as AgentControllerRequestContext<MastraCodeState> | undefined;\n const state = controller?.getState() as MastraCodeState | undefined;\n const subconsciousEnabled = isSubconsciousEnabled(vector);\n const factoryProjectId = state?.factoryProjectId;\n const isFactory = typeof factoryProjectId === 'string' && factoryProjectId.trim().length > 0;\n\n // A Factory-owned session that could not resolve its org refuses to curate:\n // writing under a substituted identity produces knowledge the fail-closed\n // read path can never see.\n let orgUnresolvedRefusal = false;\n\n if (subconsciousEnabled) {\n const identity = resolveKnowledgeScopeIdentity(state);\n if (identity.resolved) {\n requestContext.set('organizationId', identity.organizationId);\n } else {\n orgUnresolvedRefusal = true;\n reportOrgUnresolved(controller, identity.knowledgeResourceId, identity.reason);\n }\n if (identity.knowledgeResourceId) {\n requestContext.set('knowledgeResourceId', identity.knowledgeResourceId);\n }\n }\n\n const subconsciousAvailable = subconsciousEnabled && !orgUnresolvedRefusal;\n\n const omScope = state?.omScope ?? getOmScope(state?.projectPath);\n\n // The Factory row is authoritative and read per invocation, so a stored\n // threshold/attachment change reaches the running Memory without a session.\n const factorySettingsContext = getFactoryMemorySettingsContext(requestContext);\n const factorySettingsUnavailable =\n isFactoryMemorySettingsUnavailable(factorySettingsContext) || (factorySettingsContext === undefined && isFactory);\n const factorySettings = factorySettingsUnavailable ? null : factorySettingsContext;\n const obsThreshold =\n factorySettings !== undefined\n ? (factorySettings?.observationThreshold ?? DEFAULT_OBS_THRESHOLD)\n : (state?.observationThreshold ?? DEFAULT_OBS_THRESHOLD);\n const refThreshold =\n factorySettings !== undefined\n ? (factorySettings?.reflectionThreshold ?? DEFAULT_REF_THRESHOLD)\n : (state?.reflectionThreshold ?? DEFAULT_REF_THRESHOLD);\n const caveman = state?.cavemanObservations ?? false;\n\n const observerPreviousObservationTokens = 1000;\n // The row is authoritative: an absent value means the user left it on Auto,\n // which the config API reports as 'auto' and Memory resolves by model\n // capability.\n const observeAttachments =\n factorySettings !== undefined ? (factorySettings?.observeAttachments ?? 'auto') : state?.observeAttachments;\n // Factory sessions get a factory-only Subconscious config, so the cache key\n // carries Factory presence and settings availability to keep those configs\n // from cross-serving.\n const cacheKey = `${obsThreshold}:${refThreshold}:${omScope}:${observerPreviousObservationTokens}:${caveman ? 1 : 0}:${observeAttachments}:${isFactory ? 1 : 0}:${subconsciousAvailable ? 1 : 0}`;\n if (cachedMemory && cachedMemoryKey === cacheKey) {\n return cachedMemory;\n }\n\n // Async buffering is not supported with resource scope — disable it\n const isResourceScope = omScope === 'resource';\n\n const observerInstruction = caveman\n ? `${DYNAMIC_AGENTS_MD_INSTRUCTION}\\n\\n${CAVEMAN_OM_INSTRUCTION}`\n : DYNAMIC_AGENTS_MD_INSTRUCTION;\n const reflectionInstruction = caveman ? CAVEMAN_OM_INSTRUCTION : undefined;\n\n if (cachedMemory) {\n const retired = cachedMemory;\n retiredMemories.add(retired);\n // settled() rejects if the instance's OM engine failed to start; that must not surface as\n // an unhandled rejection from a background retirement.\n void retired\n .settled()\n .catch(() => {})\n .finally(() => retiredMemories.delete(retired));\n }\n\n cachedMemory = new Memory({\n storage,\n ...(knowledge ? { knowledge } : {}),\n vector: vector || false,\n embedder: vector ? fastembed.small : undefined,\n options: {\n // Generate a durable title from the first user message. Every client uses\n // the same title in its thread list and active-session chrome. Title\n // generation takes the primary OM model only — its model field does not\n // accept fallback arrays.\n generateTitle:\n process.env.MASTRACODE_DISABLE_TITLE_GENERATION === '1'\n ? false\n : {\n model: ({ requestContext }) => {\n const resolved = getObserverModel({ requestContext });\n if (resolved === 'auto') {\n return resolveMemoryModel(resolveAutoOMModelId(getMainModelId(requestContext)), { requestContext });\n }\n return Array.isArray(resolved) ? resolved[0]!.model : resolved;\n },\n },\n observationalMemory:\n process.env.MASTRACODE_DISABLE_OBSERVATIONAL_MEMORY === '1'\n ? false\n : {\n enabled: true,\n autoModels: MASTRACODE_AUTO_OM_MODELS,\n resolveModel: resolveMemoryModel,\n temporalMarkers: true,\n retrieval: vector ? { vector: true } : true,\n experimental_subconscious: subconsciousAvailable\n ? new Subconscious({\n defaultScope: 'resource',\n pins: true,\n ...(isFactory ? { maxSteps: 25 } : {}),\n })\n : undefined,\n scope: omScope,\n // The main agent writes Anthropic cache entries with this TTL; 'auto' can't see it.\n activateAfterIdle: { default: 'auto', anthropic: ANTHROPIC_PROMPT_CACHE_TTL },\n activateOnProviderChange: true,\n observation: {\n bufferTokens: isResourceScope ? false : 1 / 5,\n bufferActivation: isResourceScope ? undefined : 2000,\n model: getObserverModel,\n messageTokens: obsThreshold,\n blockAfter: 2,\n previousObserverTokens: observerPreviousObservationTokens,\n threadTitle: true,\n instruction: observerInstruction,\n observeAttachments,\n },\n reflection: {\n bufferActivation: isResourceScope ? undefined : 1 / 2,\n blockAfter: 1.1,\n model: getReflectorModel,\n observationTokens: refThreshold,\n instruction: reflectionInstruction,\n },\n },\n },\n });\n cachedMemoryKey = cacheKey;\n\n return cachedMemory;\n };\n\n return Object.assign(resolveMemory, {\n /**\n * Wait for background memory work (buffered observations, reflections, indexing) in every\n * instance this factory created. Await before closing storage.\n */\n async settled(): Promise<void> {\n // Drain every instance even if one rejects, so teardown can still close storage.\n await Promise.allSettled([cachedMemory?.settled(), ...[...retiredMemories].map(memory => memory.settled())]);\n },\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","names":[],"sources":["../../src/agents/memory.ts"],"sourcesContent":["import type { AgentControllerRequestContext } from '@mastra/core/agent-controller';\nimport type { Knowledge } from '@mastra/core/knowledge';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { MastraCompositeStore } from '@mastra/core/storage';\nimport type { MastraVector } from '@mastra/core/vector';\nimport { fastembed } from '@mastra/fastembed';\nimport { Memory, Subconscious } from '@mastra/memory';\nimport { DEFAULT_OBS_THRESHOLD, DEFAULT_REF_THRESHOLD } from '../constants.js';\nimport { LOCAL_KNOWLEDGE_ORG_ID, resolveKnowledgeScopeIdentity } from '../knowledge-scope.js';\nimport { MASTRACODE_AUTO_OM_MODELS, resolveAutoOMModelId } from '../onboarding/packs.js';\nimport { loadSettings } from '../onboarding/settings.js';\nimport { ANTHROPIC_PROMPT_CACHE_TTL } from '../providers/anthropic-prompt-cache.js';\nimport type { MastraCodeState } from '../schema.js';\nimport { getOmScope } from '../utils/project.js';\nimport { canUseProvider, getActiveMemoryRoute, resolveModel } from './model.js';\n\n/** Route-backed OM fallback entry. */\ntype MemoryModelRouteEntry = { id: string; model: ReturnType<typeof resolveModel> };\n\n/**\n * Resolve the active model route's memory models, starting at a same-thread\n * pending fallback hop. Returns `'auto'` when the route's first memory model is\n * Auto, and `undefined` when the route sets no memory model.\n */\nfunction resolveRouteMemoryModels(\n state: MastraCodeState | undefined,\n threadId: string | null | undefined,\n resolve: (modelId: string) => ReturnType<typeof resolveModel>,\n): MemoryModelRouteEntry[] | 'auto' | undefined {\n const memoryRoute = getActiveMemoryRoute(state, threadId);\n if (memoryRoute[0]?.memoryModelId === 'auto') return 'auto';\n const seenModelIds = new Set<string>();\n const appearances = new Map<string, number>();\n const entries: MemoryModelRouteEntry[] = [];\n for (const entry of memoryRoute) {\n if (!entry.memoryModelId || entry.memoryModelId === 'auto' || seenModelIds.has(entry.memoryModelId)) continue;\n seenModelIds.add(entry.memoryModelId);\n const occurrence = (appearances.get(entry.id) ?? 0) + 1;\n appearances.set(entry.id, occurrence);\n try {\n entries.push({\n id: `${entry.id}:memory${occurrence === 1 ? '' : `#${occurrence}`}`,\n model: resolve(entry.memoryModelId),\n });\n } catch {\n break;\n }\n }\n return entries.length > 0 ? entries : undefined;\n}\n\n/**\n * The authoritative per-caller Factory memory-settings row, placed on the request\n * context before Factory's model-dependent processors run. `null` means the row\n * exists but is empty (every role auto). An unavailable sentinel or a missing\n * value on a Factory-owned session falls back to Auto roles and default\n * thresholds/attachments, so memory keeps working while Factory reports the error.\n */\ninterface FactoryMemorySettings {\n observerModelId: string | null;\n reflectorModelId: string | null;\n observationThreshold: number | null;\n reflectionThreshold: number | null;\n observeAttachments: 'auto' | boolean | null;\n}\n\ntype FactoryMemorySettingsContext =\n | FactoryMemorySettings\n | null\n | { status: 'unavailable'; reason: string }\n | undefined;\n\nfunction getFactoryMemorySettingsContext(requestContext: RequestContext): FactoryMemorySettingsContext {\n return requestContext.get('mastra__factoryMemorySettings') as FactoryMemorySettingsContext;\n}\n\nfunction isFactoryMemorySettingsUnavailable(\n settings: FactoryMemorySettingsContext,\n): settings is { status: 'unavailable'; reason: string } {\n return settings !== null && typeof settings === 'object' && 'status' in settings && settings.status === 'unavailable';\n}\n\nfunction getMainModelId(requestContext: RequestContext): string | undefined {\n const controller = requestContext.get('controller') as AgentControllerRequestContext<MastraCodeState> | undefined;\n return controller?.session.modelId || (controller?.getState()?.currentModelId as string | undefined);\n}\n\n/**\n * Resolve one OM role's model for this invocation. Returns `'auto'` for Memory's\n * auto policy, or a concrete model. Factory's DB row is authoritative for\n * Factory sessions (an unreadable row falls back to auto). Otherwise the active\n * model route's memory models win, then the per-role selection, then legacy\n * concrete settings.\n */\nfunction resolveOmRoleModelForRequest(\n role: 'observer' | 'reflector',\n requestContext: RequestContext,\n settingsPath?: string,\n options?: { disableSettingsOmSeed?: boolean },\n): 'auto' | ReturnType<typeof resolveModel> | MemoryModelRouteEntry[] {\n const controller = requestContext.get('controller') as AgentControllerRequestContext<MastraCodeState> | undefined;\n const state = controller?.getState() as MastraCodeState | undefined;\n const resolveOptions = { remapForCodexOAuth: true, requestContext, anthropicPromptCacheScope: 'system' } as const;\n const factorySettingsContext = getFactoryMemorySettingsContext(requestContext);\n const isFactory = typeof state?.factoryProjectId === 'string';\n\n const useModel = (modelId: string) => {\n requestContext.set(`om.${role}.selectionMode`, 'model');\n requestContext.set(`om.${role}.effectiveModelId`, modelId);\n return resolveModel(modelId, resolveOptions);\n };\n const useAuto = () => {\n requestContext.set(`om.${role}.selectionMode`, 'auto');\n // These two keys are declared in the span-context allowlist\n // (`mastracode/sdk/src/index.ts`), so traces can report intent separately from\n // the effective concrete model without either being mistaken for a model ID.\n requestContext.set(\n `om.${role}.effectiveModelId`,\n resolveAutoOMModelId(getMainModelId(requestContext), providerId =>\n canUseProvider(providerId, { requestContext }),\n ),\n );\n return 'auto' as const;\n };\n\n if (\n isFactoryMemorySettingsUnavailable(factorySettingsContext) ||\n (factorySettingsContext === undefined && isFactory)\n ) {\n return useAuto();\n }\n if (factorySettingsContext !== undefined) {\n const factoryModelId = factorySettingsContext?.[`${role}ModelId`];\n return factoryModelId ? useModel(factoryModelId) : useAuto();\n }\n\n // The configured settings file, not the default one: a caller that points the\n // agent at another settings path must get the same override resolution for\n // observational memory as it does for the main model. Hosts that disable the\n // settings seed never read it.\n const settings = options?.disableSettingsOmSeed ? undefined : loadSettings(settingsPath);\n const routeMemory = resolveRouteMemoryModels(state, controller?.threadId, modelId =>\n resolveModel(modelId, resolveOptions),\n );\n if (routeMemory === 'auto') return useAuto();\n if (routeMemory) {\n requestContext.set(`om.${role}.selectionMode`, 'model');\n requestContext.set(`om.${role}.effectiveModelId`, routeMemory[0]?.model.modelId);\n return routeMemory.length === 1 ? routeMemory[0]!.model : routeMemory;\n }\n\n const selection: unknown = state?.[`${role}ModelSelection`];\n if (selection === 'auto') return useAuto();\n if (typeof selection === 'string' && selection) return useModel(selection);\n if (\n selection &&\n typeof selection === 'object' &&\n 'modelId' in selection &&\n typeof selection.modelId === 'string' &&\n selection.modelId\n ) {\n return useModel(selection.modelId);\n }\n\n const roleOverride =\n role === 'observer' ? settings?.models?.observerModelOverride : settings?.models?.reflectorModelOverride;\n if (roleOverride) return useModel(roleOverride);\n const legacyModelId = state?.[`${role}ModelId`];\n if (typeof legacyModelId === 'string' && legacyModelId) return useModel(legacyModelId);\n return useAuto();\n}\n\nconst DYNAMIC_AGENTS_MD_INSTRUCTION =\n 'Messages wrapped in <system-reminder type=\"dynamic-agents-md\" ...>...</system-reminder> are ephemeral project-context instructions injected from files on disk. Do NOT observe or extract information from these messages — they are reloaded automatically when needed and should not be stored in memory.';\n\n// Derived from https://github.com/JuliusBrussee/caveman and adapted for OM use with fixed full-level compression.\nconst CAVEMAN_OM_INSTRUCTION = `Respond terse like smart caveman. All technical substance stay. Only fluff die.\n\nUse full caveman compression style.\n\nDrop: articles (a/an/the), filler (just/really/basically/actually/simply), pleasantries (sure/certainly/of course/happy to), hedging. Fragments OK. Short synonyms (big not extensive, fix not \"implement a solution for\"). Technical terms exact. Code blocks unchanged. Errors quoted exact. Leave out the words \"agent\" and \"assistant\" at the start of each observation line, it is assumed each line is referring to the assistant unless it specifically says it was about the user. Leave out parenthesis and other text characters like * that would not contribute to understanding the observations.\n\nPattern: \\`[thing] [action] [reason]. [next step]\\`\n\nNot: \"Sure! I'd be happy to help you with that. The issue you're experiencing is likely caused by...\"\nYes: \"Bug in auth middleware. Token expiry check use < not <=. Fix:\"\n\nExample 1\n🔴 14:31 user asks why React component rerenders\n🟡 14:32 saw inline object prop create new ref each render, cause rerender\n✅ 14:34 fixed render issue by wrap object in useMemo\n\nExample 2\n🟡 15:10 explained pool reuse DB connections, skip repeat handshake overhead\n\nDon't say \"Agent did x\", say \"did x\". It will be assumed the agent did what was observed. The who should only be specified for the user or other third parties: \"user asked x\"\n\nDrop caveman for: security warnings, irreversible action confirmations, multi-step sequences where fragment order risks misread, user asks to clarify or repeats question, and anything that requires remembering verbatim content. Resume caveman after clear part done`;\n\nexport { LOCAL_KNOWLEDGE_ORG_ID };\n\n// One error per session, not per memory resolution. Keyed on the session id\n// rather than the controller object: the controller is read off the request\n// context on every resolution, so it is a fresh object per request and would\n// dedupe nothing. Bounded so a long-running Factory process cannot grow this\n// without limit — refusing sessions are rare, and losing the oldest ids only\n// costs one extra log line.\nconst REPORTED_ORG_UNRESOLVED_LIMIT = 500;\nconst reportedOrgUnresolved = new Set<string>();\n\nfunction reportOrgUnresolved(\n controller: AgentControllerRequestContext<MastraCodeState> | undefined,\n factoryProjectId: string | undefined,\n reason?: string,\n) {\n const sessionId = controller?.session?.id;\n if (sessionId) {\n if (reportedOrgUnresolved.has(sessionId)) return;\n if (reportedOrgUnresolved.size >= REPORTED_ORG_UNRESOLVED_LIMIT) {\n reportedOrgUnresolved.delete(reportedOrgUnresolved.values().next().value as string);\n }\n reportedOrgUnresolved.add(sessionId);\n }\n const session = controller?.session;\n console.error(\n `[Subconscious] Knowledge curation disabled: no organization resolved for session ${session?.id ?? 'unknown'} (project ${factoryProjectId ?? 'none'})${reason ? `: ${reason}` : ''}. Knowledge is not written rather than written where it cannot be read.`,\n );\n}\n\n/**\n * Whether the experimental subconscious (knowledge graph + reminder sidekick)\n * is switched on for this process: it needs a vector store and the opt-in flag.\n */\nexport function isSubconsciousEnabled(vector: MastraVector | undefined): boolean {\n return Boolean(vector) && process.env.MASTRACODE_EXPERIMENTAL_SUBCONSCIOUS === '1';\n}\n\n/**\n * Whether the subconscious tools (`knowledge_*`, `ask_memory`) are registered\n * for a given session. Beyond the process-level switch, a Factory-owned\n * session that cannot resolve its org refuses the subconscious entirely (see\n * `getDynamicMemory`, which applies the same two checks inline because it also\n * needs the resolved identity). The system prompt's tool guidance calls here so\n * it never advertises tools that `getDynamicMemory` did not register.\n */\nexport function hasSubconsciousTools(vector: MastraVector | undefined, state: MastraCodeState | undefined): boolean {\n return isSubconsciousEnabled(vector) && resolveKnowledgeScopeIdentity(state).resolved;\n}\n\n/**\n * Dynamic memory factory function.\n * Reads OM thresholds from controller state via requestContext.\n * Model functions also read from requestContext (no mutable bridge needed).\n */\nexport function getDynamicMemory(\n storage: MastraCompositeStore,\n vector?: MastraVector,\n settingsPath?: string,\n options?: { disableSettingsOmSeed?: boolean },\n knowledge?: Knowledge,\n) {\n // Cache is scoped per storage instance (per getDynamicMemory call) so a\n // Memory bound to one storage is never reused after storage changes.\n let cachedMemory: Memory | null = null;\n let cachedMemoryKey: string | null = null;\n // Instances replaced by a config change may still have background work in flight.\n const retiredMemories = new Set<Memory>();\n\n // Observer/reflector model functions — read the current model ID from\n // controller state via requestContext (propagated by OM's agent.generate).\n // Bound here so the configured settings path reaches role overrides and pack\n // memory-model resolution.\n const getObserverModel = ({ requestContext }: { requestContext: RequestContext }) =>\n resolveOmRoleModelForRequest('observer', requestContext, settingsPath, options);\n const getReflectorModel = ({ requestContext }: { requestContext: RequestContext }) =>\n resolveOmRoleModelForRequest('reflector', requestContext, settingsPath, options);\n // Routes the concrete model Memory's `'auto'` picks through Mastra Code's\n // credential-aware resolver, like every other Mastra Code model.\n const resolveMemoryModel = (modelId: string, { requestContext }: { requestContext?: RequestContext }) =>\n resolveModel(modelId, { remapForCodexOAuth: true, requestContext, anthropicPromptCacheScope: 'system' });\n\n const resolveMemory = ({ requestContext }: { requestContext: RequestContext }) => {\n const controller = requestContext.get('controller') as AgentControllerRequestContext<MastraCodeState> | undefined;\n const state = controller?.getState() as MastraCodeState | undefined;\n const subconsciousEnabled = isSubconsciousEnabled(vector);\n const factoryProjectId = state?.factoryProjectId;\n const isFactory = typeof factoryProjectId === 'string' && factoryProjectId.trim().length > 0;\n\n // A Factory-owned session that could not resolve its org refuses to curate:\n // writing under a substituted identity produces knowledge the fail-closed\n // read path can never see.\n let orgUnresolvedRefusal = false;\n\n if (subconsciousEnabled) {\n const identity = resolveKnowledgeScopeIdentity(state);\n if (identity.resolved) {\n requestContext.set('organizationId', identity.organizationId);\n } else {\n orgUnresolvedRefusal = true;\n reportOrgUnresolved(controller, identity.knowledgeResourceId, identity.reason);\n }\n if (identity.knowledgeResourceId) {\n requestContext.set('knowledgeResourceId', identity.knowledgeResourceId);\n }\n }\n\n const subconsciousAvailable = subconsciousEnabled && !orgUnresolvedRefusal;\n\n const omScope = state?.omScope ?? getOmScope(state?.projectPath);\n\n // The Factory row is authoritative and read per invocation, so a stored\n // threshold/attachment change reaches the running Memory without a session.\n const factorySettingsContext = getFactoryMemorySettingsContext(requestContext);\n const factorySettingsUnavailable =\n isFactoryMemorySettingsUnavailable(factorySettingsContext) || (factorySettingsContext === undefined && isFactory);\n const factorySettings = factorySettingsUnavailable ? null : factorySettingsContext;\n const obsThreshold =\n factorySettings !== undefined\n ? (factorySettings?.observationThreshold ?? DEFAULT_OBS_THRESHOLD)\n : (state?.observationThreshold ?? DEFAULT_OBS_THRESHOLD);\n const refThreshold =\n factorySettings !== undefined\n ? (factorySettings?.reflectionThreshold ?? DEFAULT_REF_THRESHOLD)\n : (state?.reflectionThreshold ?? DEFAULT_REF_THRESHOLD);\n const caveman = state?.cavemanObservations ?? false;\n\n const observerPreviousObservationTokens = 1000;\n // The row is authoritative: an absent value means the user left it on Auto,\n // which the config API reports as 'auto' and Memory resolves by model\n // capability.\n const observeAttachments =\n factorySettings !== undefined ? (factorySettings?.observeAttachments ?? 'auto') : state?.observeAttachments;\n // Factory sessions get a factory-only Subconscious config, so the cache key\n // carries Factory presence and settings availability to keep those configs\n // from cross-serving.\n const cacheKey = `${obsThreshold}:${refThreshold}:${omScope}:${observerPreviousObservationTokens}:${caveman ? 1 : 0}:${observeAttachments}:${isFactory ? 1 : 0}:${subconsciousAvailable ? 1 : 0}`;\n if (cachedMemory && cachedMemoryKey === cacheKey) {\n return cachedMemory;\n }\n\n // Async buffering is not supported with resource scope — disable it\n const isResourceScope = omScope === 'resource';\n\n const observerInstruction = caveman\n ? `${DYNAMIC_AGENTS_MD_INSTRUCTION}\\n\\n${CAVEMAN_OM_INSTRUCTION}`\n : DYNAMIC_AGENTS_MD_INSTRUCTION;\n const reflectionInstruction = caveman ? CAVEMAN_OM_INSTRUCTION : undefined;\n\n if (cachedMemory) {\n const retired = cachedMemory;\n retiredMemories.add(retired);\n // settled() rejects if the instance's OM engine failed to start; that must not surface as\n // an unhandled rejection from a background retirement.\n void retired\n .settled()\n .catch(() => {})\n .finally(() => retiredMemories.delete(retired));\n }\n\n cachedMemory = new Memory({\n storage,\n ...(knowledge ? { knowledge } : {}),\n vector: vector || false,\n embedder: vector ? fastembed.small : undefined,\n options: {\n // Generate a durable title from the first user message. Every client uses\n // the same title in its thread list and active-session chrome. Title\n // generation takes the primary OM model only — its model field does not\n // accept fallback arrays.\n generateTitle:\n process.env.MASTRACODE_DISABLE_TITLE_GENERATION === '1'\n ? false\n : {\n model: ({ requestContext }) => {\n const resolved = getObserverModel({ requestContext });\n if (resolved === 'auto') {\n return resolveMemoryModel(\n resolveAutoOMModelId(getMainModelId(requestContext), providerId =>\n canUseProvider(providerId, { requestContext }),\n ),\n { requestContext },\n );\n }\n return Array.isArray(resolved) ? resolved[0]!.model : resolved;\n },\n },\n observationalMemory:\n process.env.MASTRACODE_DISABLE_OBSERVATIONAL_MEMORY === '1'\n ? false\n : {\n enabled: true,\n autoModels: MASTRACODE_AUTO_OM_MODELS,\n canUseProvider,\n resolveModel: resolveMemoryModel,\n temporalMarkers: true,\n retrieval: vector ? { vector: true } : true,\n experimental_subconscious: subconsciousAvailable\n ? new Subconscious({\n defaultScope: 'resource',\n pins: true,\n ...(isFactory ? { maxSteps: 25 } : {}),\n })\n : undefined,\n scope: omScope,\n // The main agent writes Anthropic cache entries with this TTL; 'auto' can't see it.\n activateAfterIdle: { default: 'auto', anthropic: ANTHROPIC_PROMPT_CACHE_TTL },\n activateOnProviderChange: true,\n observation: {\n bufferTokens: isResourceScope ? false : 1 / 5,\n bufferActivation: isResourceScope ? undefined : 2000,\n model: getObserverModel,\n messageTokens: obsThreshold,\n blockAfter: 2,\n previousObserverTokens: observerPreviousObservationTokens,\n threadTitle: true,\n instruction: observerInstruction,\n observeAttachments,\n },\n reflection: {\n bufferActivation: isResourceScope ? undefined : 1 / 2,\n blockAfter: 1.1,\n model: getReflectorModel,\n observationTokens: refThreshold,\n instruction: reflectionInstruction,\n },\n },\n },\n });\n cachedMemoryKey = cacheKey;\n\n return cachedMemory;\n };\n\n return Object.assign(resolveMemory, {\n /**\n * Wait for background memory work (buffered observations, reflections, indexing) in every\n * instance this factory created. Await before closing storage.\n */\n async settled(): Promise<void> {\n // Drain every instance even if one rejects, so teardown can still close storage.\n await Promise.allSettled([cachedMemory?.settled(), ...[...retiredMemories].map(memory => memory.settled())]);\n },\n });\n}\n"],"mappings":"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"}
@@ -38,6 +38,14 @@ export declare function resolveModel(modelId: string, options?: {
38
38
  requestContext?: RequestContext;
39
39
  anthropicPromptCacheScope?: AnthropicPromptCacheScope;
40
40
  }): ResolvedModel;
41
+ /**
42
+ * Whether `resolveModel` can authenticate a provider for this request, using the
43
+ * same credential lookup: the tenant store in deployed Factory (no environment
44
+ * keys), otherwise local auth and then the provider's environment keys.
45
+ */
46
+ export declare function canUseProvider(providerId: string, options?: {
47
+ requestContext?: RequestContext;
48
+ }): boolean;
41
49
  export interface ThinkingRequestContext {
42
50
  state?: {
43
51
  thinkingLevel?: unknown;
@@ -52,15 +60,17 @@ export interface ThinkingRequestContext {
52
60
  * Precedence:
53
61
  * 1. Session override (`state.thinkingLevel`, set via /think or the session
54
62
  * settings panel).
55
- * 2. Per-mode default from settings (`models.modeThinkingDefaults[mode]`),
63
+ * 2. The host's default for this request (`hostDefault`), when the host
64
+ * stores thinking defaults itself (the Factory keeps one per Factory).
65
+ * 3. Per-mode default from settings (`models.modeThinkingDefaults[mode]`),
56
66
  * only when the context carries a session mode.
57
- * 3. Global default (`preferences.thinkingLevel`).
67
+ * 4. Global default (`preferences.thinkingLevel`).
58
68
  *
59
69
  * Resolved per-request (not seeded at session start) so configuration changes
60
70
  * apply to the next request of every session — including automated
61
71
  * (rule-driven) Factory runs that nobody ever opens interactively.
62
72
  */
63
- export declare function resolveRequestThinkingLevel(agentControllerContext: ThinkingRequestContext | undefined, settingsPath?: string): ThinkingLevelSetting;
73
+ export declare function resolveRequestThinkingLevel(agentControllerContext: ThinkingRequestContext | undefined, settingsPath?: string, hostDefault?: ThinkingLevelSetting): ThinkingLevelSetting;
64
74
  /**
65
75
  * Dynamic model function that reads the current model and optional ordered
66
76
  * fallback route from controller state. Route entry ids are opaque host-owned
@@ -69,8 +79,9 @@ export declare function resolveRequestThinkingLevel(agentControllerContext: Thin
69
79
  */
70
80
  export declare function getDynamicModel({ requestContext }: {
71
81
  requestContext: RequestContext;
72
- }, settingsPath?: string, { modeless }?: {
82
+ }, settingsPath?: string, { modeless, defaultThinkingLevel }?: {
73
83
  modeless?: boolean;
84
+ defaultThinkingLevel?: ThinkingLevelSetting;
74
85
  }): IdentifiedModelConfig | ModelWithRetries[];
75
86
  type MemoryRouteState = {
76
87
  modelRoute?: {
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/agents/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/agents/model.ts"],"names":[],"mappings":"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"}