@mastra/factory 0.23.0 → 0.24.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +3 -3
  2. package/dist/factory.d.ts.map +1 -1
  3. package/dist/factory.js +15 -65
  4. package/dist/factory.js.map +1 -1
  5. package/dist/index.js +2 -2
  6. package/dist/integrations/github/session-subscriptions.js +1 -1
  7. package/dist/integrations/slack/slack.js +1 -1
  8. package/dist/routes/attention-providers.d.ts +0 -17
  9. package/dist/routes/attention-providers.d.ts.map +1 -1
  10. package/dist/routes/attention-providers.js +2 -128
  11. package/dist/routes/attention-providers.js.map +1 -1
  12. package/dist/routes/attention.d.ts.map +1 -1
  13. package/dist/routes/attention.js +1 -2
  14. package/dist/routes/attention.js.map +1 -1
  15. package/dist/routes/config.d.ts +0 -28
  16. package/dist/routes/config.d.ts.map +1 -1
  17. package/dist/routes/config.js +4 -78
  18. package/dist/routes/config.js.map +1 -1
  19. package/dist/routes/contracts.d.ts +19 -35
  20. package/dist/routes/contracts.d.ts.map +1 -1
  21. package/dist/routes/contracts.js +4 -24
  22. package/dist/routes/contracts.js.map +1 -1
  23. package/dist/routes/projects.d.ts.map +1 -1
  24. package/dist/routes/projects.js +3 -2
  25. package/dist/routes/projects.js.map +1 -1
  26. package/dist/routes/surface.d.ts +0 -2
  27. package/dist/routes/surface.d.ts.map +1 -1
  28. package/dist/routes/surface.js +4 -5
  29. package/dist/routes/surface.js.map +1 -1
  30. package/dist/routes/work-items.d.ts.map +1 -1
  31. package/dist/routes/work-items.js +1 -7
  32. package/dist/routes/work-items.js.map +1 -1
  33. package/dist/rules/processor.d.ts +3 -0
  34. package/dist/rules/processor.d.ts.map +1 -1
  35. package/dist/rules/processor.js +3 -3
  36. package/dist/rules/processor.js.map +1 -1
  37. package/dist/session/credential-policy.d.ts.map +1 -1
  38. package/dist/session/credential-policy.js +0 -15
  39. package/dist/session/credential-policy.js.map +1 -1
  40. package/dist/session/factory-session.js +2 -2
  41. package/dist/session/thinking-default.d.ts +18 -0
  42. package/dist/session/thinking-default.d.ts.map +1 -0
  43. package/dist/session/thinking-default.js +42 -0
  44. package/dist/session/thinking-default.js.map +1 -0
  45. package/dist/storage/domains/audit/domain.d.ts +1 -1
  46. package/dist/storage/domains/audit/domain.d.ts.map +1 -1
  47. package/dist/storage/domains/audit/domain.js.map +1 -1
  48. package/dist/storage/domains/projects/base.d.ts +5 -0
  49. package/dist/storage/domains/projects/base.d.ts.map +1 -1
  50. package/dist/storage/domains/projects/base.js +9 -1
  51. package/dist/storage/domains/projects/base.js.map +1 -1
  52. package/dist/storage/domains/work-items/base.d.ts +1 -36
  53. package/dist/storage/domains/work-items/base.d.ts.map +1 -1
  54. package/dist/storage/domains/work-items/base.js +2 -144
  55. package/dist/storage/domains/work-items/base.js.map +1 -1
  56. package/dist/telemetry-types.d.ts +1 -1
  57. package/dist/telemetry-types.d.ts.map +1 -1
  58. package/dist/telemetry-types.js +0 -1
  59. package/dist/telemetry-types.js.map +1 -1
  60. package/dist/workspace.d.ts +1 -1
  61. package/dist/workspace.d.ts.map +1 -1
  62. package/dist/workspace.js +1 -11
  63. package/dist/workspace.js.map +1 -1
  64. package/factory-skills/configure-factory-rules/SKILL.md +2 -2
  65. package/package.json +11 -11
  66. package/dist/routes/supervisor.d.ts +0 -25
  67. package/dist/routes/supervisor.d.ts.map +0 -1
  68. package/dist/routes/supervisor.js +0 -35
  69. package/dist/routes/supervisor.js.map +0 -1
  70. package/dist/supervisor/health-worker.d.ts +0 -19
  71. package/dist/supervisor/health-worker.d.ts.map +0 -1
  72. package/dist/supervisor/health-worker.js +0 -74
  73. package/dist/supervisor/health-worker.js.map +0 -1
  74. package/dist/supervisor/health.d.ts +0 -79
  75. package/dist/supervisor/health.d.ts.map +0 -1
  76. package/dist/supervisor/health.js +0 -228
  77. package/dist/supervisor/health.js.map +0 -1
  78. package/dist/supervisor/instructions.d.ts +0 -6
  79. package/dist/supervisor/instructions.d.ts.map +0 -1
  80. package/dist/supervisor/instructions.js +0 -66
  81. package/dist/supervisor/instructions.js.map +0 -1
  82. package/dist/supervisor/read-tools.d.ts +0 -43
  83. package/dist/supervisor/read-tools.d.ts.map +0 -1
  84. package/dist/supervisor/read-tools.js +0 -343
  85. package/dist/supervisor/read-tools.js.map +0 -1
  86. package/dist/supervisor/session-messaging.d.ts +0 -26
  87. package/dist/supervisor/session-messaging.d.ts.map +0 -1
  88. package/dist/supervisor/session-messaging.js +0 -21
  89. package/dist/supervisor/session-messaging.js.map +0 -1
  90. package/dist/supervisor/session.d.ts +0 -38
  91. package/dist/supervisor/session.d.ts.map +0 -1
  92. package/dist/supervisor/session.js +0 -79
  93. package/dist/supervisor/session.js.map +0 -1
  94. package/dist/supervisor/write-tools.d.ts +0 -30
  95. package/dist/supervisor/write-tools.d.ts.map +0 -1
  96. package/dist/supervisor/write-tools.js +0 -231
  97. package/dist/supervisor/write-tools.js.map +0 -1
@@ -5,11 +5,11 @@ import { factoryMemorySettingsUserId } from "../storage/domains/memory-settings/
5
5
  import { Route } from "./route.js";
6
6
  import { RequestContext } from "@mastra/core/request-context";
7
7
  import { registerApiRoute } from "@mastra/core/server";
8
- import { MASTRA_GATEWAY_PREFIX } from "@mastra/code-sdk/providers/model-ids";
9
8
  import { z } from "zod";
9
+ import { MASTRA_GATEWAY_PREFIX } from "@mastra/code-sdk/providers/model-ids";
10
10
  import { MastraCodeGateway } from "@mastra/code-sdk/agents/mastracode-gateway";
11
11
  import { resolveAutoOMModelId } from "@mastra/code-sdk/onboarding/packs";
12
- import { MASTRA_GATEWAY_PROVIDER, THINKING_LEVEL_VALUES, getCustomProviderId, isThinkingLevelSetting, loadSettings, saveSettings } from "@mastra/code-sdk/onboarding/settings";
12
+ import { MASTRA_GATEWAY_PROVIDER, getCustomProviderId } from "@mastra/code-sdk/onboarding/settings";
13
13
  import { AMAZON_BEDROCK_GATEWAY_ID } from "@mastra/code-sdk/providers/amazon-bedrock-gateway";
14
14
  import { getModelReasoningOptions } from "@mastra/core/llm";
15
15
  //#region src/routes/config.ts
@@ -231,7 +231,7 @@ function roleConfig(model, effectiveModelId, autoModelSource, availableProviders
231
231
  };
232
232
  }
233
233
  function readStoredOMConfig(record, currentModelId, autoModelSource, availableProviders) {
234
- const autoModelId = resolveAutoOMModelId(currentModelId);
234
+ const autoModelId = resolveAutoOMModelId(currentModelId, (providerId) => availableProviders.has(providerId));
235
235
  const observerModelId = record?.observerModelId ?? autoModelId;
236
236
  const reflectorModelId = record?.reflectorModelId ?? autoModelId;
237
237
  return {
@@ -303,8 +303,6 @@ async function persistMemorySettings(context, patch) {
303
303
  * - `GET /web/config/custom-providers` — list custom OpenAI-compatible providers
304
304
  * - `POST /web/config/custom-providers` — create/update a custom provider
305
305
  * - `DELETE /web/config/custom-providers/:id` — remove a custom provider
306
- * - `GET /web/config/thinking` — read thinking (reasoning-effort) defaults
307
- * - `PUT /web/config/thinking` — set the global thinking default
308
306
  * - `GET /web/config/om` — read OM models/thresholds/observe-attachments
309
307
  * - `PUT /web/config/om/:role/model` — switch observer/reflector model
310
308
  * - `PUT /web/config/om/thresholds` — set observation/reflection thresholds
@@ -342,36 +340,11 @@ var ConfigRoutes = class extends Route {
342
340
  };
343
341
  const factoryOmFallback = async (factoryProjectId) => {
344
342
  try {
345
- const defaultModelId = factoryProjectId ? await options.factoryProjects?.getById({ id: factoryProjectId }).then((project) => project?.defaultModelId ?? void 0) : controller.listModes?.().find((mode) => mode.defaultModelId)?.defaultModelId;
346
- return defaultModelId ? resolveAutoOMModelId(defaultModelId) : void 0;
343
+ return factoryProjectId ? await options.factoryProjects?.getById({ id: factoryProjectId }).then((project) => project?.defaultModelId ?? void 0) : controller.listModes?.().find((mode) => mode.defaultModelId)?.defaultModelId;
347
344
  } catch {
348
345
  return;
349
346
  }
350
347
  };
351
- const deploymentThinkingAccess = async (c) => {
352
- if (!auth.enabled()) return { ok: true };
353
- await auth.ensureUser(c);
354
- const tenant = auth.tenant(c);
355
- if (!tenant) return {
356
- ok: false,
357
- status: 401,
358
- error: "unauthorized"
359
- };
360
- const orgId = tenantOrgId(tenant);
361
- if (!options.deploymentOrganizationId || orgId !== options.deploymentOrganizationId) return {
362
- ok: false,
363
- status: 403,
364
- error: "deployment_organization_required",
365
- message: "Deployment thinking defaults are shared by the whole deployment. Set MASTRACODE_DEPLOYMENT_ORGANIZATION_ID to let that organization's admins change them while authentication is enabled"
366
- };
367
- if (!await auth.isOrganizationAdmin(c, orgId)) return {
368
- ok: false,
369
- status: 403,
370
- error: "organization_admin_required",
371
- message: "Only organization admins can change deployment thinking defaults while authentication is enabled"
372
- };
373
- return { ok: true };
374
- };
375
348
  return [
376
349
  registerApiRoute("/web/config/features", {
377
350
  method: "GET",
@@ -798,53 +771,6 @@ var ConfigRoutes = class extends Route {
798
771
  }
799
772
  }
800
773
  }),
801
- registerApiRoute("/web/config/thinking", {
802
- method: "GET",
803
- requiresAuth: false,
804
- handler: async (c) => {
805
- try {
806
- const settings = loadSettings(options.settingsPath);
807
- return c.json({
808
- levels: THINKING_LEVEL_VALUES,
809
- globalDefault: settings.preferences.thinkingLevel,
810
- editable: (await deploymentThinkingAccess(loose(c))).ok
811
- });
812
- } catch (error) {
813
- return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);
814
- }
815
- }
816
- }),
817
- registerApiRoute("/web/config/thinking", {
818
- method: "PUT",
819
- requiresAuth: false,
820
- handler: async (c) => {
821
- const access = await deploymentThinkingAccess(loose(c));
822
- if (!access.ok) return c.json({
823
- error: access.error,
824
- ...access.message ? { message: access.message } : {}
825
- }, access.status);
826
- let body;
827
- try {
828
- body = await c.req.json();
829
- } catch {
830
- return c.json({ error: "Invalid JSON body" }, 400);
831
- }
832
- const parsed = z.object({ globalDefault: z.custom(isThinkingLevelSetting) }).strict().safeParse(body);
833
- if (!parsed.success) return c.json({ error: `Expected only globalDefault, one of: ${THINKING_LEVEL_VALUES.join(", ")}` }, 400);
834
- const { globalDefault } = parsed.data;
835
- try {
836
- const settings = loadSettings(options.settingsPath);
837
- settings.preferences.thinkingLevel = globalDefault;
838
- saveSettings(settings, options.settingsPath);
839
- return c.json({
840
- ok: true,
841
- globalDefault: settings.preferences.thinkingLevel
842
- });
843
- } catch (error) {
844
- return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);
845
- }
846
- }
847
- }),
848
774
  registerApiRoute("/web/config/om", {
849
775
  method: "GET",
850
776
  requiresAuth: false,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","names":[],"sources":["../../src/routes/config.ts"],"sourcesContent":["import { MastraCodeGateway } from '@mastra/code-sdk/agents/mastracode-gateway';\nimport type { AuthStorage } from '@mastra/code-sdk/auth/storage';\nimport { resolveAutoOMModelId } from '@mastra/code-sdk/onboarding/packs';\nimport type { ProviderAccess, ProviderAccessLevel } from '@mastra/code-sdk/onboarding/packs';\nimport {\n getCustomProviderId,\n isThinkingLevelSetting,\n loadSettings,\n MASTRA_GATEWAY_PROVIDER,\n saveSettings,\n THINKING_LEVEL_VALUES,\n} from '@mastra/code-sdk/onboarding/settings';\nimport type { CustomProviderSetting, ThinkingLevelSetting } from '@mastra/code-sdk/onboarding/settings';\nimport { AMAZON_BEDROCK_GATEWAY_ID } from '@mastra/code-sdk/providers/amazon-bedrock-gateway';\nimport { MASTRA_GATEWAY_PREFIX } from '@mastra/code-sdk/providers/model-ids';\nimport { getModelReasoningOptions } from '@mastra/core/llm';\nimport { RequestContext } from '@mastra/core/request-context';\nimport type { ApiRoute } from '@mastra/core/server';\nimport { registerApiRoute } from '@mastra/core/server';\n\nimport type { Context } from 'hono';\nimport { z } from 'zod';\nimport { resolveFactoryModelPolicy } from '../session/credential-policy.js';\nimport { DEFAULT_OBSERVATION_THRESHOLD, DEFAULT_REFLECTION_THRESHOLD } from '../session/memory-settings-hydration.js';\nimport type {\n CredentialRecord,\n LoginSessionKind,\n ModelCredentialsStorage,\n} from '../storage/domains/credentials/base.js';\nimport type { CustomProviderRecord, CustomProvidersStorage } from '../storage/domains/custom-providers/base.js';\nimport { factoryMemorySettingsUserId } from '../storage/domains/memory-settings/base.js';\nimport type {\n MemorySettingsPatch,\n MemorySettingsRecord,\n MemorySettingsStorage,\n} from '../storage/domains/memory-settings/base.js';\nimport type { ModelDefaultsStorage } from '../storage/domains/model-defaults/base.js';\nimport type { FactoryProjectsStorage } from '../storage/domains/projects/base.js';\nimport type { SourceControlStorageHandle } from '../storage/domains/source-control/base.js';\nimport type { WorkItemsStorage } from '../storage/domains/work-items/base.js';\nimport {\n getAuthProviderId,\n listTenantCredentialsForRequest,\n resolveCredentialContext,\n tenantOrgId,\n WEB_OAUTH_FLOW_KINDS,\n} from './provider-credentials.js';\nimport { Route } from './route.js';\nimport type { RouteAuth, RouteDependencies } from './route.js';\n\n/** Widen a route-local Hono context to the plain `Context` the auth helpers take. */\nfunction loose(c: unknown): Context {\n return c as Context;\n}\n\n/**\n * Server-side configuration routes for the web app.\n *\n * The browser has no access to the credential store or the model catalog, so\n * the web settings panel asks the server — which owns both — to list providers\n * and manage API keys. This mirrors the TUI's `/api-keys` command, exposing the\n * same `AuthStorage`-backed key management over HTTP.\n *\n * Keys are never returned to the client; only their presence and source.\n */\n\n/**\n * Where a provider's active credential comes from, as seen by the caller.\n * Local mode reports `oauth`/`stored` (server-global `auth.json`); tenant mode\n * reports the scoped variants (`oauth-user`/`stored-user`/`stored-org`).\n * `deployment` (tenant mode) marks a provider the operator opted in to run on\n * the server process's own credentials (e.g. Amazon Bedrock's AWS chain).\n */\nexport type ProviderCredentialSource =\n | 'deployment'\n | 'oauth'\n | 'stored'\n | 'env'\n | 'none'\n | 'oauth-user'\n | 'oauth-org'\n | 'stored-user'\n | 'stored-org';\n\n/** A model provider with the current source of its credentials. */\nexport interface ProviderInfo {\n provider: string;\n /** Env var the provider's key is read from, if any. */\n envVar?: string;\n /** Where the active credential comes from. */\n source: ProviderCredentialSource;\n /**\n * Tenant mode: whether an org-wide API key exists for this provider, even\n * when the caller's personal credential shadows it. Lets the UI tell\n * \"shared with the org\" apart from \"only works for me\".\n */\n orgKey?: boolean;\n /**\n * Tenant mode: the caller's personal credential for this provider, if any.\n * Reported independently of `source` so the UI can manage each scope even\n * when one shadows the other.\n */\n userCredential?: 'oauth' | 'api_key';\n /** Tenant mode: the shared org credential for this provider, if any. */\n orgCredential?: 'oauth' | 'api_key';\n /** Web OAuth sign-in capability, when the provider supports it. */\n oauth?: { supported: true; modes: LoginSessionKind[] };\n}\n\n/** Minimal session surface the config routes touch. */\nexport interface OMSession {\n /** `get()` returns '' when no model is selected, so callers fall back on falsy. */\n model: { get: () => string };\n}\n\n/** Minimal controller surface this module needs (model catalog + modes + sessions). */\ninterface ModelCatalog {\n listAvailableModels: () => Promise<\n Array<{ id?: string; modelName?: string; provider: string; hasApiKey: boolean; apiKeyEnvVar?: string }>\n >;\n listModes?: () => Array<{ id: string; defaultModelId?: string }>;\n getSessionByResource?: (resourceId: string, scope?: string) => Promise<OMSession | undefined>;\n}\n\n/**\n * Build a deduplicated, sorted list of providers from the model catalog,\n * annotated with where each provider's credential currently comes from.\n * Mirrors the TUI's `/api-keys` provider list.\n *\n * When `tenantCredentials` is given (deployed mode), sources reflect the\n * *caller's* tenant rows with user > org precedence and the server-global\n * `authStorage` is ignored; otherwise the local `auth.json` view is reported.\n */\nexport async function listProviders({\n controller,\n authStorage,\n tenantCredentials,\n deploymentProviders,\n}: {\n controller: ModelCatalog;\n authStorage?: AuthStorage;\n tenantCredentials?: CredentialRecord[];\n deploymentProviders?: ReadonlySet<string>;\n}): Promise<ProviderInfo[]> {\n const models = await controller.listAvailableModels();\n const seen = new Map<string, ProviderInfo>();\n\n for (const model of models) {\n if (seen.has(model.provider)) continue;\n\n if (tenantCredentials && isDeploymentModelProvider(model.provider)) {\n // Credentials for these providers live on the server process, never in\n // tenant rows, so no account can connect them. List them only when the\n // operator opted the deployment in and the server has credentials.\n const usable =\n deploymentProviders?.has(model.provider) && models.some(m => m.provider === model.provider && m.hasApiKey);\n if (usable) seen.set(model.provider, { provider: model.provider, source: 'deployment' });\n continue;\n }\n\n const authProviderId = getAuthProviderId(model.provider);\n let source: ProviderInfo['source'] = 'none';\n let orgKey: boolean | undefined;\n let userCredential: ProviderInfo['userCredential'];\n let orgCredential: ProviderInfo['orgCredential'];\n if (tenantCredentials) {\n const userRec = tenantCredentials.find(r => r.scope === 'user' && r.provider === authProviderId);\n const orgRec = tenantCredentials.find(r => r.scope === 'org' && r.provider === authProviderId);\n // Any shared org credential (API key or org-wide OAuth) counts.\n orgKey = orgRec !== undefined;\n userCredential = userRec?.credential.type;\n orgCredential = orgRec?.credential.type;\n if (userRec?.credential.type === 'oauth') {\n source = 'oauth-user';\n } else if (userRec?.credential.type === 'api_key') {\n source = 'stored-user';\n } else if (orgRec?.credential.type === 'oauth') {\n source = 'oauth-org';\n } else if (orgRec?.credential.type === 'api_key') {\n source = 'stored-org';\n }\n } else if (authStorage?.isLoggedIn(authProviderId)) {\n source = 'oauth';\n } else if (authStorage?.hasStoredApiKey(model.provider)) {\n source = 'stored';\n } else if (model.apiKeyEnvVar && process.env[model.apiKeyEnvVar]) {\n source = 'env';\n } else if (model.hasApiKey) {\n source = 'env';\n }\n\n const flowKind = WEB_OAUTH_FLOW_KINDS[model.provider];\n seen.set(model.provider, {\n provider: model.provider,\n envVar: model.apiKeyEnvVar,\n source,\n ...(orgKey !== undefined ? { orgKey } : {}),\n ...(userCredential ? { userCredential } : {}),\n ...(orgCredential ? { orgCredential } : {}),\n ...(flowKind ? { oauth: { supported: true as const, modes: [flowKind] } } : {}),\n });\n }\n\n return Array.from(seen.values()).sort((a, b) => a.provider.localeCompare(b.provider));\n}\n\n/** A user-defined OpenAI-compatible provider, with key presence (never the key). */\nexport interface CustomProviderInfo {\n id: string;\n name: string;\n url: string;\n hasApiKey: boolean;\n models: string[];\n}\n\n/** Redact a stored custom-provider row for the client (key presence only). */\nfunction toCustomProviderInfo(record: CustomProviderRecord): CustomProviderInfo {\n return {\n id: record.providerId,\n name: record.name,\n url: record.url,\n hasApiKey: Boolean(record.apiKey),\n models: record.models,\n };\n}\n\n/** The resolved custom-providers storage scope for a request. */\ninterface CustomProvidersContext {\n storage: CustomProvidersStorage;\n orgId: string;\n userId: string;\n}\n\n/**\n * Resolve the custom-providers context for a request, or a ready-to-return\n * error response. Same posture as memory settings: tenant rows in deployed\n * mode, a sentinel `local` org in no-auth mode — never settings.json.\n */\nasync function resolveCustomProvidersContext({\n c,\n auth,\n customProviders,\n}: {\n c: Context;\n auth: RouteAuth;\n customProviders?: CustomProvidersStorage;\n}): Promise<CustomProvidersContext | { response: Response }> {\n await auth.ensureUser(c);\n const tenant = auth.tenant(c);\n if (!tenant && auth.enabled()) return { response: c.json({ error: 'unauthorized' }, 401) };\n if (customProviders) {\n try {\n await customProviders.ensureReady();\n return tenant\n ? { storage: customProviders, orgId: tenantOrgId(tenant), userId: tenant.userId }\n : { storage: customProviders, orgId: 'local', userId: 'local' };\n } catch {\n // fall through to the unavailable response\n }\n }\n return {\n response: c.json(\n {\n error: 'custom_providers_unavailable',\n message: 'Custom provider storage is unavailable — the app database is not configured or failed to start.',\n },\n 503,\n ),\n };\n}\n\n/** Validate + coerce a request body into a CustomProviderSetting. */\nfunction parseCustomProviderBody(body: unknown): CustomProviderSetting | { error: string } {\n if (!body || typeof body !== 'object') return { error: 'Invalid JSON body' };\n const b = body as Record<string, unknown>;\n const name = typeof b.name === 'string' ? b.name.trim() : '';\n if (!name) return { error: 'Missing required field: name' };\n const url = typeof b.url === 'string' ? b.url.trim() : '';\n if (!url) return { error: 'Missing required field: url' };\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return { error: 'url must be an http(s) URL' };\n }\n } catch {\n return { error: 'url must be a valid URL' };\n }\n const apiKey = typeof b.apiKey === 'string' && b.apiKey.trim() ? b.apiKey.trim() : undefined;\n const models = Array.isArray(b.models)\n ? b.models.filter((m): m is string => typeof m === 'string' && m.trim().length > 0).map(m => m.trim())\n : [];\n return { name, url, apiKey, models };\n}\n\n/**\n * Providers whose credentials can only come from the server process (Amazon\n * Bedrock authenticates through the AWS credential chain). In tenant mode they\n * are usable only when the operator lists them in\n * `MastraFactoryConfig.deploymentModelProviders`.\n */\nexport const DEPLOYMENT_MODEL_PROVIDERS: readonly string[] = [AMAZON_BEDROCK_GATEWAY_ID];\n\nexport function isDeploymentModelProvider(provider: string): boolean {\n return DEPLOYMENT_MODEL_PROVIDERS.includes(provider);\n}\n\n/**\n * Normalize the operator's `deploymentModelProviders` list. Unsupported ids are\n * ignored with a warning rather than failing boot.\n */\nexport function resolveDeploymentModelProviders(providers: readonly string[] | undefined): ReadonlySet<string> {\n const resolved = new Set<string>();\n for (const raw of providers ?? []) {\n const provider = raw.trim();\n if (!provider) continue;\n if (isDeploymentModelProvider(provider)) {\n resolved.add(provider);\n } else {\n console.warn(\n `[factory] Ignoring deployment model provider \"${provider}\". Supported: ${DEPLOYMENT_MODEL_PROVIDERS.join(', ')}.`,\n );\n }\n }\n return resolved;\n}\n\n/**\n * Compute which providers the user can reach, mirroring the TUI's\n * `/models-pack` access derivation: OAuth/api-key from the credential store for\n * the named providers, plus any other provider that has a usable key.\n */\nexport async function buildProviderAccess({\n controller,\n authStorage,\n tenantCredentials,\n deploymentProviders,\n}: {\n controller: ModelCatalog;\n authStorage?: AuthStorage;\n tenantCredentials?: CredentialRecord[];\n deploymentProviders?: ReadonlySet<string>;\n}): Promise<ProviderAccess> {\n const models = await controller.listAvailableModels();\n const hasModelKey = (provider: string) => models.some(m => m.provider === provider && m.hasApiKey);\n const accessLevel = (provider: string): ProviderAccessLevel => {\n const authProviderId = getAuthProviderId(provider);\n if (tenantCredentials) {\n // Tenant rows never authenticate these providers; only an operator\n // opt-in plus credentials on the server process does.\n if (isDeploymentModelProvider(provider)) {\n return deploymentProviders?.has(provider) && hasModelKey(provider) ? 'apikey' : false;\n }\n const userRec = tenantCredentials.find(r => r.scope === 'user' && r.provider === authProviderId);\n const orgRec = tenantCredentials.find(r => r.scope === 'org' && r.provider === authProviderId);\n const credential = userRec?.credential ?? orgRec?.credential;\n if (credential?.type === 'oauth') return 'oauth';\n if (credential?.type === 'api_key' && credential.key.trim().length > 0) return 'apikey';\n return false;\n }\n\n const oauthCredential = authStorage?.get(authProviderId);\n if (oauthCredential?.type === 'oauth') return 'oauth';\n if (authStorage?.hasStoredApiKey(provider)) return 'apikey';\n const directCredential = authStorage?.get(provider);\n if (directCredential?.type === 'api_key' && directCredential.key.trim().length > 0) return 'apikey';\n return hasModelKey(provider) ? 'apikey' : false;\n };\n const access: ProviderAccess = {\n anthropic: accessLevel('anthropic'),\n openai: accessLevel('openai'),\n cerebras: accessLevel('cerebras'),\n google: accessLevel('google'),\n deepseek: accessLevel('deepseek'),\n 'github-copilot': accessLevel('github-copilot'),\n };\n const seen = new Set(Object.keys(access));\n for (const m of models) {\n if (!seen.has(m.provider)) {\n access[m.provider] = accessLevel(m.provider);\n seen.add(m.provider);\n }\n }\n return access;\n}\n\nfunction canUseModelProvider(access: ProviderAccess, provider: string): boolean {\n return Boolean(access[provider]);\n}\n\n/** Per-user default model context for the current request. */\nexport interface ModelDefaultsContext {\n storage: ModelDefaultsStorage;\n orgId: string;\n userId: string;\n}\n\n/** Resolve the default-model context for a request, or a ready-to-return error response. */\nasync function resolveModelDefaultsContext({\n c,\n auth,\n modelDefaults,\n}: {\n c: Context;\n auth: RouteAuth;\n modelDefaults?: ModelDefaultsStorage;\n}): Promise<ModelDefaultsContext | { response: Response }> {\n await auth.ensureUser(c);\n const tenant = auth.tenant(c);\n if (!tenant && auth.enabled()) return { response: c.json({ error: 'unauthorized' }, 401) };\n if (modelDefaults) {\n try {\n await modelDefaults.ensureReady();\n return tenant\n ? { storage: modelDefaults, orgId: tenantOrgId(tenant), userId: tenant.userId }\n : { storage: modelDefaults, orgId: 'local', userId: 'local' };\n } catch {\n // fall through to the unavailable response\n }\n }\n return {\n response: c.json(\n {\n error: 'model_defaults_unavailable',\n message: 'Default model storage is unavailable — the app database is not configured or failed to start.',\n },\n 503,\n ),\n };\n}\n\n// Mirrors the TUI `/om` command. Settings are persisted per organization and\n// user in the Factory app database, then loaded into request context for each\n// invocation without copying them into mutable session state.\n\nexport interface OMRoleConfigInfo {\n model: 'auto' | string;\n effectiveModelId: string;\n effectiveModelSource: 'explicit' | 'live-session' | 'configured-default';\n providerStatus: 'available' | 'unavailable';\n}\n\n/** Persisted intent plus the concrete models the current Factory configuration resolves. */\nexport interface OMConfigInfo {\n observer: OMRoleConfigInfo;\n reflector: OMRoleConfigInfo;\n /** @deprecated Use `observer.effectiveModelId`. */\n observerModelId: string;\n /** @deprecated Use `reflector.effectiveModelId`. */\n reflectorModelId: string;\n observationThreshold: number;\n reflectionThreshold: number;\n observeAttachments: 'auto' | boolean;\n}\n\nexport interface ProviderOMDefaultsResponse {\n ok: true;\n config: OMConfigInfo;\n}\n\n/** `GET /web/config/thinking` — deployment-scoped reasoning-effort defaults. */\nexport interface ThinkingConfigInfo {\n /** All selectable levels, in escalation order. */\n levels: readonly ThinkingLevelSetting[];\n /** `preferences.thinkingLevel` — what every run uses without a session override. */\n globalDefault: ThinkingLevelSetting;\n /** False when the deployment refuses writes, so the UI can render read-only rows. */\n editable: boolean;\n}\n\n/** `PUT /web/config/thinking` success payload. */\nexport interface UpdateThinkingConfigResponse {\n ok: true;\n globalDefault: ThinkingLevelSetting;\n}\n\nfunction modelProvider(modelId: string): string {\n // Effective IDs keep their `mastra/` route; the provider segment after it is what\n // the SDK resolver falls back to when the gateway is not configured.\n const normalized = modelId.replace(/^mastracode\\//, '').replace(/^mastra\\//, '');\n return normalized.split('/', 1)[0] ?? '';\n}\n\nfunction roleConfig(\n model: OMRoleConfigInfo['model'],\n effectiveModelId: string,\n autoModelSource: 'live-session' | 'configured-default',\n availableProviders: ReadonlySet<string>,\n): OMRoleConfigInfo {\n return {\n model,\n effectiveModelId,\n effectiveModelSource: model === 'auto' ? autoModelSource : 'explicit',\n providerStatus:\n availableProviders.has(modelProvider(effectiveModelId)) ||\n (effectiveModelId.startsWith(MASTRA_GATEWAY_PREFIX) && availableProviders.has(MASTRA_GATEWAY_PROVIDER))\n ? 'available'\n : 'unavailable',\n };\n}\n\nfunction readStoredOMConfig(\n record: MemorySettingsRecord | null,\n currentModelId: string | undefined,\n autoModelSource: 'live-session' | 'configured-default',\n availableProviders: ReadonlySet<string>,\n): OMConfigInfo {\n const autoModelId = resolveAutoOMModelId(currentModelId);\n const observerModelId = record?.observerModelId ?? autoModelId;\n const reflectorModelId = record?.reflectorModelId ?? autoModelId;\n return {\n observer: roleConfig(record?.observerModelId ?? 'auto', observerModelId, autoModelSource, availableProviders),\n reflector: roleConfig(record?.reflectorModelId ?? 'auto', reflectorModelId, autoModelSource, availableProviders),\n observerModelId,\n reflectorModelId,\n observationThreshold: record?.observationThreshold ?? DEFAULT_OBSERVATION_THRESHOLD,\n reflectionThreshold: record?.reflectionThreshold ?? DEFAULT_REFLECTION_THRESHOLD,\n observeAttachments: record?.observeAttachments ?? 'auto',\n };\n}\n\n/**\n * Where a request's OM settings live: the `memory-settings` factory storage\n * domain, one row per (org, user). Without a tenant (auth disabled), settings\n * land on a sentinel `(local, local)` row in the same table — the web surface\n * never reads or writes `settings.json` for memory settings.\n */\ninterface MemorySettingsContext {\n storage: MemorySettingsStorage;\n orgId: string;\n userId: string;\n}\n\n/**\n * Resolve the memory-settings context for a request, or a ready-to-return\n * error response. When `factoryProjectId` is provided the row addressed is the\n * factory project's shared settings (a sentinel user id in the caller's org)\n * instead of the caller's personal row — this is what factory board runs and\n * channel sessions hydrate from.\n */\nasync function resolveMemorySettingsContext({\n c,\n auth,\n memorySettings,\n factoryProjectId,\n factoryProjects,\n}: {\n c: Context;\n auth: RouteAuth;\n memorySettings?: MemorySettingsStorage;\n factoryProjectId?: string;\n factoryProjects?: FactoryProjectsStorage;\n}): Promise<MemorySettingsContext | { response: Response }> {\n await auth.ensureUser(c);\n const tenant = auth.tenant(c);\n if (!tenant && auth.enabled()) return { response: c.json({ error: 'unauthorized' }, 401) };\n // Factory-scoped rows are shared org state: the target project must exist in\n // the caller's org before its settings row can be read or written.\n if (factoryProjectId && tenant) {\n if (!factoryProjects) return { response: c.json({ error: 'factory_unavailable' }, 503) };\n try {\n await factoryProjects.ensureReady();\n const project = await factoryProjects.get({ orgId: tenantOrgId(tenant), id: factoryProjectId });\n if (!project) return { response: c.json({ error: 'factory_project_not_found' }, 404) };\n } catch {\n return { response: c.json({ error: 'factory_unavailable' }, 503) };\n }\n }\n if (memorySettings) {\n try {\n await memorySettings.ensureReady();\n const factoryUserId = factoryProjectId ? factoryMemorySettingsUserId(factoryProjectId) : undefined;\n return tenant\n ? { storage: memorySettings, orgId: tenantOrgId(tenant), userId: factoryUserId ?? tenant.userId }\n : { storage: memorySettings, orgId: 'local', userId: factoryUserId ?? 'local' };\n } catch {\n // fall through to the unavailable response\n }\n }\n return {\n response: c.json(\n {\n error: 'memory_settings_unavailable',\n message: 'Memory settings storage is unavailable — the app database is not configured or failed to start.',\n },\n 503,\n ),\n };\n}\n\n/** Persist an OM knob change to the caller's memory-settings row. */\nasync function persistMemorySettings(context: MemorySettingsContext, patch: MemorySettingsPatch): Promise<void> {\n await context.storage.patch({ orgId: context.orgId, userId: context.userId, patch });\n}\n\n/** Dependencies injected into {@link ConfigRoutes}. */\nexport interface ConfigRoutesDeps extends RouteDependencies {\n controller: ModelCatalog;\n features?: { knowledge: boolean };\n authStorage?: AuthStorage;\n /** Tenant credential domain handle; absent in local (no-DB) mode. */\n modelCredentials?: ModelCredentialsStorage;\n /** Tenant model-defaults domain handle; absent in local (no-DB) mode. */\n modelDefaults?: ModelDefaultsStorage;\n /** Source-control sessions available to config route integrations. */\n sourceControlSessions?: Pick<SourceControlStorageHandle['sessions'], 'getBySessionId'>;\n /** Thread membership used to resolve the same model policy as an invocation. */\n workItems?: WorkItemsStorage;\n /** Tenant memory-settings domain handle; absent in local (no-DB) mode. */\n memorySettings?: MemorySettingsStorage;\n /** Factory projects domain, used to derive OM fallbacks from a factory's default model. */\n factoryProjects?: FactoryProjectsStorage;\n /** Custom-providers domain handle; absent when the app database is missing. */\n customProviders?: CustomProvidersStorage;\n /** Notifies the host after tenant credentials change so caches can be dropped. */\n onCredentialsChanged?: (tenant: { orgId: string; userId?: string }) => void;\n /** Notifies the host after custom providers change so model-router caches can be dropped. */\n onCustomProvidersChanged?: (tenant: { orgId: string }) => void;\n /**\n * Tenant mode: providers the operator opted in to run on the server process's\n * own credentials (see `DEPLOYMENT_MODEL_PROVIDERS`).\n */\n deploymentProviders?: ReadonlySet<string>;\n /**\n * Path of the server's settings.json backing the deployment-scoped thinking\n * defaults. Defaults to the standard app-data location; injectable for tests.\n */\n settingsPath?: string;\n /**\n * Organization this deployment serves (`MASTRACODE_DEPLOYMENT_ORGANIZATION_ID`).\n * When auth is enabled, only admins of this organization may write\n * deployment-wide settings; without it those writes stay blocked.\n */\n deploymentOrganizationId?: string;\n}\n\n/**\n * The web config routes as Mastra `apiRoutes`:\n * - `GET /web/config/features` — list server-enabled product features\n * - `GET /web/config/providers` — list providers + key source\n * - `PUT /web/config/providers/:provider/key` — set/update a provider's API key\n * - `DELETE /web/config/providers/:provider/key` — remove a stored API key\n * - `GET /web/config/models` — list available models (credentialed providers)\n * - `GET /web/config/custom-providers` — list custom OpenAI-compatible providers\n * - `POST /web/config/custom-providers` — create/update a custom provider\n * - `DELETE /web/config/custom-providers/:id` — remove a custom provider\n * - `GET /web/config/thinking` — read thinking (reasoning-effort) defaults\n * - `PUT /web/config/thinking` — set the global thinking default\n * - `GET /web/config/om` — read OM models/thresholds/observe-attachments\n * - `PUT /web/config/om/:role/model` — switch observer/reflector model\n * - `PUT /web/config/om/thresholds` — set observation/reflection thresholds\n * - `PUT /web/config/om/observe-attachments` — set observe-attachments (auto/on/off)\n */\nexport class ConfigRoutes extends Route<ConfigRoutesDeps> {\n routes(): ApiRoute[] {\n const options = this.deps;\n const { controller, authStorage, auth, deploymentProviders } = options;\n const onCredentialsChanged = options.onCredentialsChanged ?? (() => {});\n const onCustomProvidersChanged = options.onCustomProvidersChanged ?? (() => {});\n\n const resolveOMResponseContext = async (c: Context) => {\n const tenantCredentials = await listTenantCredentialsForRequest({\n c: loose(c),\n auth,\n credentials: options.modelCredentials,\n });\n const access = await buildProviderAccess({\n controller,\n authStorage: tenantCredentials ? undefined : authStorage,\n tenantCredentials,\n deploymentProviders,\n });\n const availableProviders = new Set(\n Object.entries(access).flatMap(([providerId, configured]) => (configured ? [providerId] : [])),\n );\n // `mastra/` routes run through the Mastra gateway whenever its key is configured.\n if (MastraCodeGateway.getMastraGatewayApiKey()) availableProviders.add(MASTRA_GATEWAY_PROVIDER);\n if (options.customProviders) {\n const context = await resolveCustomProvidersContext({\n c: loose(c),\n auth,\n customProviders: options.customProviders,\n });\n if (!('response' in context)) {\n for (const provider of await context.storage.list({ orgId: context.orgId })) {\n availableProviders.add(provider.providerId);\n }\n }\n }\n return availableProviders;\n };\n\n // Factory-scoped OM reads without a stored row fall back to the low-cost\n // OM model of the factory default model's provider — not the global\n // built-in default, whose provider may have no credential here.\n const factoryOmFallback = async (factoryProjectId: string | undefined): Promise<string | undefined> => {\n try {\n const defaultModelId = factoryProjectId\n ? await options.factoryProjects\n ?.getById({ id: factoryProjectId })\n .then(project => project?.defaultModelId ?? undefined)\n : controller.listModes?.().find(mode => mode.defaultModelId)?.defaultModelId;\n return defaultModelId ? resolveAutoOMModelId(defaultModelId) : undefined;\n } catch {\n return undefined;\n }\n };\n\n const deploymentThinkingAccess = async (\n c: Context,\n ): Promise<{ ok: true } | { ok: false; status: 401 | 403; error: string; message?: string }> => {\n if (!auth.enabled()) return { ok: true };\n await auth.ensureUser(c);\n const tenant = auth.tenant(c);\n if (!tenant) return { ok: false, status: 401, error: 'unauthorized' };\n const orgId = tenantOrgId(tenant);\n if (!options.deploymentOrganizationId || orgId !== options.deploymentOrganizationId) {\n return {\n ok: false,\n status: 403,\n error: 'deployment_organization_required',\n message:\n \"Deployment thinking defaults are shared by the whole deployment. Set MASTRACODE_DEPLOYMENT_ORGANIZATION_ID to let that organization's admins change them while authentication is enabled\",\n };\n }\n if (!(await auth.isOrganizationAdmin(c, orgId))) {\n return {\n ok: false,\n status: 403,\n error: 'organization_admin_required',\n message: 'Only organization admins can change deployment thinking defaults while authentication is enabled',\n };\n }\n return { ok: true };\n };\n\n return [\n registerApiRoute('/web/config/features', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => c.json({ knowledge: options.features?.knowledge ?? false }),\n }),\n\n registerApiRoute('/web/config/providers', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n try {\n // Tenant mode lists the caller's rows and never exposes the\n // server-global auth.json; local mode is unchanged.\n const tenantCredentials = await listTenantCredentialsForRequest({\n c: loose(c),\n auth,\n credentials: options.modelCredentials,\n });\n // Tenant mode also reports whether the caller may write org-wide\n // keys, so the settings UI can gate the \"Everyone in org\" option.\n const tenant = auth.tenant(loose(c));\n const orgKeyAdmin = tenant ? await auth.isOrganizationAdmin(loose(c), tenantOrgId(tenant)) : undefined;\n return c.json({\n providers: await listProviders({\n controller,\n authStorage: tenantCredentials ? undefined : authStorage,\n tenantCredentials,\n deploymentProviders,\n }),\n ...(orgKeyAdmin !== undefined ? { orgKeyAdmin } : {}),\n });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/providers/:provider/key', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n const ctx = await resolveCredentialContext({ c: loose(c), auth, credentials: options.modelCredentials });\n if ('response' in ctx) return ctx.response;\n\n const provider = c.req.param('provider');\n let body: { key?: unknown; envVar?: unknown; scope?: unknown };\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const key = typeof body.key === 'string' ? body.key.trim() : '';\n if (!key) return c.json({ error: 'Missing required field: key' }, 400);\n const envVar = typeof body.envVar === 'string' ? body.envVar : undefined;\n const scope = body.scope === 'org' ? 'org' : 'user';\n try {\n if (ctx.mode === 'tenant') {\n // A stored key would never be read: these providers authenticate\n // with the server process's credentials only.\n if (isDeploymentModelProvider(provider)) {\n return c.json(\n {\n error: 'provider_configured_by_deployment',\n message: `${provider} is configured by the Factory deployment (credentials on the server), not per account.`,\n },\n 400,\n );\n }\n if (scope === 'org' && !(await auth.isOrganizationAdmin(loose(c), ctx.orgId))) {\n return c.json({ error: 'organization_admin_required' }, 403);\n }\n const tenant = scope === 'org' ? { orgId: ctx.orgId } : { orgId: ctx.orgId, userId: ctx.userId };\n // envVar is intentionally ignored: tenant credentials are resolved\n // per-request, never written into process.env.\n await ctx.storage.setCredential(tenant, getAuthProviderId(provider), { type: 'api_key', key });\n onCredentialsChanged(tenant);\n const records = await ctx.storage.listCredentials(ctx.orgId, ctx.userId);\n const providers = await listProviders({ controller, tenantCredentials: records, deploymentProviders });\n return c.json({ ok: true, provider: providers.find(p => p.provider === provider) });\n }\n if (!authStorage) return c.json({ error: 'Credential storage is not available' }, 503);\n // Local mode is single-user: scope is meaningless and ignored.\n authStorage.setStoredApiKey(provider, key, envVar);\n const providers = await listProviders({ controller, authStorage });\n return c.json({ ok: true, provider: providers.find(p => p.provider === provider) });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/providers/:provider/key', {\n method: 'DELETE',\n requiresAuth: false,\n handler: async c => {\n const ctx = await resolveCredentialContext({ c: loose(c), auth, credentials: options.modelCredentials });\n if ('response' in ctx) return ctx.response;\n\n const provider = c.req.param('provider');\n const scope = c.req.query('scope') === 'org' ? 'org' : 'user';\n try {\n if (ctx.mode === 'tenant') {\n if (scope === 'org' && !(await auth.isOrganizationAdmin(loose(c), ctx.orgId))) {\n return c.json({ error: 'organization_admin_required' }, 403);\n }\n const tenant = scope === 'org' ? { orgId: ctx.orgId } : { orgId: ctx.orgId, userId: ctx.userId };\n await ctx.storage.removeCredential(tenant, getAuthProviderId(provider));\n onCredentialsChanged(tenant);\n const records = await ctx.storage.listCredentials(ctx.orgId, ctx.userId);\n const providers = await listProviders({ controller, tenantCredentials: records, deploymentProviders });\n return c.json({ ok: true, provider: providers.find(p => p.provider === provider) });\n }\n if (!authStorage) return c.json({ error: 'Credential storage is not available' }, 503);\n authStorage.remove(`apikey:${provider}`);\n const providers = await listProviders({ controller, authStorage });\n return c.json({ ok: true, provider: providers.find(p => p.provider === provider) });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n // Mirrors the TUI's /custom-providers command, but backed by the\n // `custom-providers` domain (org rows in tenant mode, a sentinel `local`\n // org in no-auth mode) — the server never reads settings.json for these.\n\n registerApiRoute('/web/config/custom-providers', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n const ctx = await resolveCustomProvidersContext({\n c: loose(c),\n auth,\n customProviders: options.customProviders,\n });\n if ('response' in ctx) return ctx.response;\n try {\n const records = await ctx.storage.list({ orgId: ctx.orgId });\n return c.json({ providers: records.map(toCustomProviderInfo) });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/custom-providers', {\n method: 'POST',\n requiresAuth: false,\n handler: async c => {\n const ctx = await resolveCustomProvidersContext({\n c: loose(c),\n auth,\n customProviders: options.customProviders,\n });\n if ('response' in ctx) return ctx.response;\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const parsed = parseCustomProviderBody(body);\n if ('error' in parsed) return c.json({ error: parsed.error }, 400);\n // `previousId` lets a rename remove the old entry as well as any name clash.\n const previousId =\n body && typeof body === 'object' && typeof (body as Record<string, unknown>).previousId === 'string'\n ? ((body as Record<string, unknown>).previousId as string)\n : undefined;\n try {\n const record = await ctx.storage.upsert({\n orgId: ctx.orgId,\n userId: ctx.userId,\n input: {\n providerId: getCustomProviderId(parsed.name),\n name: parsed.name,\n url: parsed.url,\n apiKey: parsed.apiKey,\n models: parsed.models,\n },\n previousProviderId: previousId,\n });\n onCustomProvidersChanged({ orgId: ctx.orgId });\n return c.json({ ok: true, provider: toCustomProviderInfo(record) });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/custom-providers/:id', {\n method: 'DELETE',\n requiresAuth: false,\n handler: async c => {\n const ctx = await resolveCustomProvidersContext({\n c: loose(c),\n auth,\n customProviders: options.customProviders,\n });\n if ('response' in ctx) return ctx.response;\n const id = c.req.param('id');\n try {\n await ctx.storage.delete({ orgId: ctx.orgId, providerId: id });\n onCustomProvidersChanged({ orgId: ctx.orgId });\n return c.json({ ok: true });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n // Session-independent model catalog for settings pickers (Factory default\n // model, pack editors). Only models whose provider has a credential are\n // returned — the same filter the session-scoped hook applies client-side.\n\n registerApiRoute('/web/config/models', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n try {\n const allTenantCredentials = await listTenantCredentialsForRequest({\n c: loose(c),\n auth,\n credentials: options.modelCredentials,\n });\n const factoryProjectId = c.req.query('factoryId') || undefined;\n const tenant = auth.tenant(c);\n let tenantCredentials = allTenantCredentials;\n let sessionPolicy: { modelScope: 'factory' | 'user'; defaultModelId: string | null } | undefined;\n const resourceId = c.req.query('resourceId');\n const threadId = c.req.query('threadId');\n if (resourceId !== undefined || threadId !== undefined) {\n const address = z\n .object({ resourceId: z.string().trim().min(1), threadId: z.string().trim().min(1) })\n .safeParse({ resourceId, threadId });\n if (!address.success) return c.json({ error: 'invalid_session_context' }, 400);\n if (!tenant && auth.enabled()) return c.json({ error: 'unauthorized' }, 401);\n if (tenant) {\n if (\n !options.factoryProjects ||\n !options.sourceControlSessions ||\n !options.workItems ||\n !options.modelCredentials\n )\n return c.json({ error: 'session_model_policy_unavailable' }, 503);\n const requestContext = new RequestContext();\n requestContext.set('user', { id: tenant.userId, organizationId: tenantOrgId(tenant) });\n requestContext.set('controller', address.data);\n let policy;\n try {\n policy = await resolveFactoryModelPolicy(requestContext, {\n projects: options.factoryProjects,\n sourceControl: options.sourceControlSessions,\n workItems: options.workItems,\n });\n } catch {\n return c.json({ error: 'session_model_policy_unavailable' }, 403);\n }\n if (!policy) return c.json({ error: 'unauthorized' }, 401);\n const orgId = policy.tenant.orgId ?? tenantOrgId(tenant);\n const modelScope = policy.tenant.credentialScope ?? 'user';\n const storageScope = modelScope === 'factory' ? 'org' : 'user';\n tenantCredentials = (\n await options.modelCredentials.listCredentials(orgId, policy.tenant.userId)\n ).filter(record => record.scope === storageScope);\n let defaultModelId = policy.factoryDefaultModelId ?? null;\n if (modelScope === 'user') {\n if (!options.modelDefaults) return c.json({ error: 'model_defaults_unavailable' }, 503);\n await options.modelDefaults.ensureReady();\n defaultModelId =\n (await options.modelDefaults.get({ orgId, userId: policy.tenant.userId }))?.modelId ?? null;\n }\n sessionPolicy = { modelScope, defaultModelId };\n }\n } else if (c.req.query('scope') !== undefined) {\n // Explicit settings scopes never override a live thread's owner and policy above.\n const scope = z.enum(['org', 'user']).safeParse(c.req.query('scope'));\n if (!scope.success) return c.json({ error: 'invalid_model_scope' }, 400);\n tenantCredentials = allTenantCredentials?.filter(record => record.scope === scope.data);\n } else if (allTenantCredentials && factoryProjectId && tenant) {\n if (!options.factoryProjects) return c.json({ error: 'factory_unavailable' }, 503);\n await options.factoryProjects.ensureReady();\n const project = await options.factoryProjects.get({ orgId: tenantOrgId(tenant), id: factoryProjectId });\n if (!project) return c.json({ error: 'factory_project_not_found' }, 404);\n const credentialScope = project.modelScope === 'user' ? 'user' : 'org';\n tenantCredentials = allTenantCredentials.filter(record => record.scope === credentialScope);\n }\n const [models, access] = await Promise.all([\n controller.listAvailableModels(),\n buildProviderAccess({\n controller,\n authStorage: tenantCredentials ? undefined : authStorage,\n tenantCredentials,\n deploymentProviders,\n }),\n ]);\n const catalog = models.flatMap(({ id, provider, modelName }) =>\n typeof id === 'string' && canUseModelProvider(access, provider)\n ? [{ id, provider, modelName, hasApiKey: true, reasoningOptions: getModelReasoningOptions(id) }]\n : [],\n );\n // Append the caller's custom provider models (DB-backed, org rows in\n // tenant mode / sentinel `local` org in no-auth mode). The boot-time\n // gateway catalog only carries the local list, so tenant callers get\n // theirs here. Dedupe against ids already present.\n if (options.customProviders) {\n try {\n const ctx = await resolveCustomProvidersContext({\n c: loose(c),\n auth,\n customProviders: options.customProviders,\n });\n if (!('response' in ctx)) {\n const known = new Set(catalog.map(m => m.id));\n for (const record of await ctx.storage.list({ orgId: ctx.orgId })) {\n for (const model of record.models) {\n const id = `${record.providerId}/${model}`;\n if (known.has(id)) continue;\n known.add(id);\n catalog.push({\n id,\n provider: record.providerId,\n modelName: model,\n hasApiKey: true,\n reasoningOptions: undefined,\n });\n }\n }\n }\n } catch {\n // Fail soft: the catalog still serves the built-in models.\n }\n }\n return c.json({\n ...sessionPolicy,\n models: catalog.sort((a, b) =>\n a.provider === b.provider ? a.id.localeCompare(b.id) : a.provider.localeCompare(b.provider),\n ),\n });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/default-model', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n const context = await resolveModelDefaultsContext({\n c: loose(c),\n auth,\n modelDefaults: options.modelDefaults,\n });\n if ('response' in context) return context.response;\n try {\n const record = await context.storage.get({ orgId: context.orgId, userId: context.userId });\n return c.json({ modelId: record?.modelId ?? null });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/default-model', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n const context = await resolveModelDefaultsContext({\n c: loose(c),\n auth,\n modelDefaults: options.modelDefaults,\n });\n if ('response' in context) return context.response;\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const parsed = z.object({ modelId: z.string().trim().min(1).max(256) }).safeParse(body);\n if (!parsed.success) return c.json({ error: 'Missing required field: modelId' }, 400);\n const { modelId } = parsed.data;\n try {\n await context.storage.set({ orgId: context.orgId, userId: context.userId, modelId });\n return c.json({ ok: true, modelId });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/default-model', {\n method: 'DELETE',\n requiresAuth: false,\n handler: async c => {\n const context = await resolveModelDefaultsContext({\n c: loose(c),\n auth,\n modelDefaults: options.modelDefaults,\n });\n if ('response' in context) return context.response;\n try {\n await context.storage.clear({ orgId: context.orgId, userId: context.userId });\n return c.json({ ok: true, modelId: null });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n // One settings.json for the whole deployment: with auth on, only deployment-org admins may write it.\n registerApiRoute('/web/config/thinking', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n try {\n const settings = loadSettings(options.settingsPath);\n return c.json({\n levels: THINKING_LEVEL_VALUES,\n globalDefault: settings.preferences.thinkingLevel,\n editable: (await deploymentThinkingAccess(loose(c))).ok,\n });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/thinking', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n const access = await deploymentThinkingAccess(loose(c));\n if (!access.ok) {\n return c.json(\n { error: access.error, ...(access.message ? { message: access.message } : {}) },\n access.status,\n );\n }\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const parsed = z\n .object({ globalDefault: z.custom<ThinkingLevelSetting>(isThinkingLevelSetting) })\n .strict()\n .safeParse(body);\n if (!parsed.success) {\n return c.json({ error: `Expected only globalDefault, one of: ${THINKING_LEVEL_VALUES.join(', ')}` }, 400);\n }\n const { globalDefault } = parsed.data;\n try {\n const settings = loadSettings(options.settingsPath);\n settings.preferences.thinkingLevel = globalDefault;\n saveSettings(settings, options.settingsPath);\n return c.json({ ok: true, globalDefault: settings.preferences.thinkingLevel });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n // Mirrors the TUI's /om command. All five knobs are durably stored in the\n // per-(org, user) `memory-settings` app table — never settings.json or\n // mutable session state.\n\n registerApiRoute('/web/config/om', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n const resourceId = c.req.query('resourceId');\n const scope = c.req.query('scope') || undefined;\n const factoryProjectId = c.req.query('factoryId') || undefined;\n const context = await resolveMemorySettingsContext({\n c: loose(c),\n auth,\n memorySettings: options.memorySettings,\n factoryProjectId,\n factoryProjects: options.factoryProjects,\n });\n if ('response' in context) return context.response;\n try {\n const record = await context.storage.get({ orgId: context.orgId, userId: context.userId });\n const fallback = await factoryOmFallback(factoryProjectId);\n const availableProviders = await resolveOMResponseContext(loose(c));\n const session = resourceId ? await controller.getSessionByResource?.(resourceId, scope) : undefined;\n const sessionModelId = session?.model.get();\n return c.json({\n config: readStoredOMConfig(\n record,\n sessionModelId || fallback,\n sessionModelId ? 'live-session' : 'configured-default',\n availableProviders,\n ),\n });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/om/:role/model', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n const role = c.req.param('role');\n if (role !== 'observer' && role !== 'reflector') {\n return c.json({ error: `Unknown OM role \"${role}\"` }, 400);\n }\n let body: { resourceId?: unknown; modelId?: unknown; scope?: unknown; factoryId?: unknown };\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const resourceId = typeof body.resourceId === 'string' ? body.resourceId : '';\n const scope = typeof body.scope === 'string' && body.scope ? body.scope : undefined;\n const factoryProjectId = typeof body.factoryId === 'string' && body.factoryId ? body.factoryId : undefined;\n const model = typeof body.modelId === 'string' ? body.modelId.trim() : '';\n if (!model) {\n return c.json({ error: 'Missing required field: modelId' }, 400);\n }\n // `'auto'` is selection intent, not a model ID: store null so the role\n // follows the active main model instead of pinning a model named \"auto\".\n const wantsAuto = model === 'auto';\n const context = await resolveMemorySettingsContext({\n c: loose(c),\n auth,\n memorySettings: options.memorySettings,\n factoryProjectId,\n factoryProjects: options.factoryProjects,\n });\n if ('response' in context) return context.response;\n // Resolve the response context before persisting: a provider-enumeration\n // failure must not report 500 for a write that already succeeded.\n const availableProviders = await resolveOMResponseContext(loose(c));\n try {\n await persistMemorySettings(context, {\n [role === 'observer' ? 'observerModelId' : 'reflectorModelId']: wantsAuto ? null : model,\n });\n const record = await context.storage.get({ orgId: context.orgId, userId: context.userId });\n const session = resourceId ? await controller.getSessionByResource?.(resourceId, scope) : undefined;\n const sessionModelId = session?.model.get();\n const config = readStoredOMConfig(\n record,\n sessionModelId || (await factoryOmFallback(factoryProjectId)),\n sessionModelId ? 'live-session' : 'configured-default',\n availableProviders,\n );\n return c.json({ ok: true, config });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/om/thresholds', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n let body: {\n resourceId?: unknown;\n observationThreshold?: unknown;\n reflectionThreshold?: unknown;\n scope?: unknown;\n factoryId?: unknown;\n };\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const resourceId = typeof body.resourceId === 'string' ? body.resourceId : '';\n const scope = typeof body.scope === 'string' && body.scope ? body.scope : undefined;\n const factoryProjectId = typeof body.factoryId === 'string' && body.factoryId ? body.factoryId : undefined;\n const observation =\n typeof body.observationThreshold === 'number' && body.observationThreshold > 0\n ? Math.round(body.observationThreshold)\n : undefined;\n const reflection =\n typeof body.reflectionThreshold === 'number' && body.reflectionThreshold > 0\n ? Math.round(body.reflectionThreshold)\n : undefined;\n if (observation === undefined && reflection === undefined) {\n return c.json({ error: 'Provide observationThreshold and/or reflectionThreshold (positive numbers)' }, 400);\n }\n const context = await resolveMemorySettingsContext({\n c: loose(c),\n auth,\n memorySettings: options.memorySettings,\n factoryProjectId,\n factoryProjects: options.factoryProjects,\n });\n if ('response' in context) return context.response;\n const availableProviders = await resolveOMResponseContext(loose(c));\n try {\n await persistMemorySettings(context, {\n ...(observation !== undefined ? { observationThreshold: observation } : {}),\n ...(reflection !== undefined ? { reflectionThreshold: reflection } : {}),\n });\n const record = await context.storage.get({ orgId: context.orgId, userId: context.userId });\n const session = resourceId ? await controller.getSessionByResource?.(resourceId, scope) : undefined;\n const sessionModelId = session?.model.get();\n const config = readStoredOMConfig(\n record,\n sessionModelId || (await factoryOmFallback(factoryProjectId)),\n sessionModelId ? 'live-session' : 'configured-default',\n availableProviders,\n );\n return c.json({ ok: true, config });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/om/observe-attachments', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n let body: { resourceId?: unknown; value?: unknown; scope?: unknown; factoryId?: unknown };\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const resourceId = typeof body.resourceId === 'string' ? body.resourceId : '';\n const scope = typeof body.scope === 'string' && body.scope ? body.scope : undefined;\n const factoryProjectId = typeof body.factoryId === 'string' && body.factoryId ? body.factoryId : undefined;\n const raw = body.value;\n const value: 'auto' | boolean = raw === 'auto' || raw === true || raw === false ? raw : 'auto';\n if (raw !== 'auto' && raw !== true && raw !== false) {\n return c.json({ error: \"value must be 'auto', true, or false\" }, 400);\n }\n const context = await resolveMemorySettingsContext({\n c: loose(c),\n auth,\n memorySettings: options.memorySettings,\n factoryProjectId,\n factoryProjects: options.factoryProjects,\n });\n if ('response' in context) return context.response;\n const availableProviders = await resolveOMResponseContext(loose(c));\n try {\n await persistMemorySettings(context, { observeAttachments: value });\n const record = await context.storage.get({ orgId: context.orgId, userId: context.userId });\n const session = resourceId ? await controller.getSessionByResource?.(resourceId, scope) : undefined;\n const sessionModelId = session?.model.get();\n const config = readStoredOMConfig(\n record,\n sessionModelId || (await factoryOmFallback(factoryProjectId)),\n sessionModelId ? 'live-session' : 'configured-default',\n availableProviders,\n );\n return c.json({ ok: true, config });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n ];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"config.js","names":[],"sources":["../../src/routes/config.ts"],"sourcesContent":["import { MastraCodeGateway } from '@mastra/code-sdk/agents/mastracode-gateway';\nimport type { AuthStorage } from '@mastra/code-sdk/auth/storage';\nimport { resolveAutoOMModelId } from '@mastra/code-sdk/onboarding/packs';\nimport type { ProviderAccess, ProviderAccessLevel } from '@mastra/code-sdk/onboarding/packs';\nimport { getCustomProviderId, MASTRA_GATEWAY_PROVIDER } from '@mastra/code-sdk/onboarding/settings';\nimport type { CustomProviderSetting } from '@mastra/code-sdk/onboarding/settings';\nimport { AMAZON_BEDROCK_GATEWAY_ID } from '@mastra/code-sdk/providers/amazon-bedrock-gateway';\nimport { MASTRA_GATEWAY_PREFIX } from '@mastra/code-sdk/providers/model-ids';\nimport { getModelReasoningOptions } from '@mastra/core/llm';\nimport { RequestContext } from '@mastra/core/request-context';\nimport type { ApiRoute } from '@mastra/core/server';\nimport { registerApiRoute } from '@mastra/core/server';\n\nimport type { Context } from 'hono';\nimport { z } from 'zod';\nimport { resolveFactoryModelPolicy } from '../session/credential-policy.js';\nimport { DEFAULT_OBSERVATION_THRESHOLD, DEFAULT_REFLECTION_THRESHOLD } from '../session/memory-settings-hydration.js';\nimport type {\n CredentialRecord,\n LoginSessionKind,\n ModelCredentialsStorage,\n} from '../storage/domains/credentials/base.js';\nimport type { CustomProviderRecord, CustomProvidersStorage } from '../storage/domains/custom-providers/base.js';\nimport { factoryMemorySettingsUserId } from '../storage/domains/memory-settings/base.js';\nimport type {\n MemorySettingsPatch,\n MemorySettingsRecord,\n MemorySettingsStorage,\n} from '../storage/domains/memory-settings/base.js';\nimport type { ModelDefaultsStorage } from '../storage/domains/model-defaults/base.js';\nimport type { FactoryProjectsStorage } from '../storage/domains/projects/base.js';\nimport type { SourceControlStorageHandle } from '../storage/domains/source-control/base.js';\nimport type { WorkItemsStorage } from '../storage/domains/work-items/base.js';\nimport {\n getAuthProviderId,\n listTenantCredentialsForRequest,\n resolveCredentialContext,\n tenantOrgId,\n WEB_OAUTH_FLOW_KINDS,\n} from './provider-credentials.js';\nimport { Route } from './route.js';\nimport type { RouteAuth, RouteDependencies } from './route.js';\n\n/** Widen a route-local Hono context to the plain `Context` the auth helpers take. */\nfunction loose(c: unknown): Context {\n return c as Context;\n}\n\n/**\n * Server-side configuration routes for the web app.\n *\n * The browser has no access to the credential store or the model catalog, so\n * the web settings panel asks the server — which owns both — to list providers\n * and manage API keys. This mirrors the TUI's `/api-keys` command, exposing the\n * same `AuthStorage`-backed key management over HTTP.\n *\n * Keys are never returned to the client; only their presence and source.\n */\n\n/**\n * Where a provider's active credential comes from, as seen by the caller.\n * Local mode reports `oauth`/`stored` (server-global `auth.json`); tenant mode\n * reports the scoped variants (`oauth-user`/`stored-user`/`stored-org`).\n * `deployment` (tenant mode) marks a provider the operator opted in to run on\n * the server process's own credentials (e.g. Amazon Bedrock's AWS chain).\n */\nexport type ProviderCredentialSource =\n | 'deployment'\n | 'oauth'\n | 'stored'\n | 'env'\n | 'none'\n | 'oauth-user'\n | 'oauth-org'\n | 'stored-user'\n | 'stored-org';\n\n/** A model provider with the current source of its credentials. */\nexport interface ProviderInfo {\n provider: string;\n /** Env var the provider's key is read from, if any. */\n envVar?: string;\n /** Where the active credential comes from. */\n source: ProviderCredentialSource;\n /**\n * Tenant mode: whether an org-wide API key exists for this provider, even\n * when the caller's personal credential shadows it. Lets the UI tell\n * \"shared with the org\" apart from \"only works for me\".\n */\n orgKey?: boolean;\n /**\n * Tenant mode: the caller's personal credential for this provider, if any.\n * Reported independently of `source` so the UI can manage each scope even\n * when one shadows the other.\n */\n userCredential?: 'oauth' | 'api_key';\n /** Tenant mode: the shared org credential for this provider, if any. */\n orgCredential?: 'oauth' | 'api_key';\n /** Web OAuth sign-in capability, when the provider supports it. */\n oauth?: { supported: true; modes: LoginSessionKind[] };\n}\n\n/** Minimal session surface the config routes touch. */\nexport interface OMSession {\n /** `get()` returns '' when no model is selected, so callers fall back on falsy. */\n model: { get: () => string };\n}\n\n/** Minimal controller surface this module needs (model catalog + modes + sessions). */\ninterface ModelCatalog {\n listAvailableModels: () => Promise<\n Array<{ id?: string; modelName?: string; provider: string; hasApiKey: boolean; apiKeyEnvVar?: string }>\n >;\n listModes?: () => Array<{ id: string; defaultModelId?: string }>;\n getSessionByResource?: (resourceId: string, scope?: string) => Promise<OMSession | undefined>;\n}\n\n/**\n * Build a deduplicated, sorted list of providers from the model catalog,\n * annotated with where each provider's credential currently comes from.\n * Mirrors the TUI's `/api-keys` provider list.\n *\n * When `tenantCredentials` is given (deployed mode), sources reflect the\n * *caller's* tenant rows with user > org precedence and the server-global\n * `authStorage` is ignored; otherwise the local `auth.json` view is reported.\n */\nexport async function listProviders({\n controller,\n authStorage,\n tenantCredentials,\n deploymentProviders,\n}: {\n controller: ModelCatalog;\n authStorage?: AuthStorage;\n tenantCredentials?: CredentialRecord[];\n deploymentProviders?: ReadonlySet<string>;\n}): Promise<ProviderInfo[]> {\n const models = await controller.listAvailableModels();\n const seen = new Map<string, ProviderInfo>();\n\n for (const model of models) {\n if (seen.has(model.provider)) continue;\n\n if (tenantCredentials && isDeploymentModelProvider(model.provider)) {\n // Credentials for these providers live on the server process, never in\n // tenant rows, so no account can connect them. List them only when the\n // operator opted the deployment in and the server has credentials.\n const usable =\n deploymentProviders?.has(model.provider) && models.some(m => m.provider === model.provider && m.hasApiKey);\n if (usable) seen.set(model.provider, { provider: model.provider, source: 'deployment' });\n continue;\n }\n\n const authProviderId = getAuthProviderId(model.provider);\n let source: ProviderInfo['source'] = 'none';\n let orgKey: boolean | undefined;\n let userCredential: ProviderInfo['userCredential'];\n let orgCredential: ProviderInfo['orgCredential'];\n if (tenantCredentials) {\n const userRec = tenantCredentials.find(r => r.scope === 'user' && r.provider === authProviderId);\n const orgRec = tenantCredentials.find(r => r.scope === 'org' && r.provider === authProviderId);\n // Any shared org credential (API key or org-wide OAuth) counts.\n orgKey = orgRec !== undefined;\n userCredential = userRec?.credential.type;\n orgCredential = orgRec?.credential.type;\n if (userRec?.credential.type === 'oauth') {\n source = 'oauth-user';\n } else if (userRec?.credential.type === 'api_key') {\n source = 'stored-user';\n } else if (orgRec?.credential.type === 'oauth') {\n source = 'oauth-org';\n } else if (orgRec?.credential.type === 'api_key') {\n source = 'stored-org';\n }\n } else if (authStorage?.isLoggedIn(authProviderId)) {\n source = 'oauth';\n } else if (authStorage?.hasStoredApiKey(model.provider)) {\n source = 'stored';\n } else if (model.apiKeyEnvVar && process.env[model.apiKeyEnvVar]) {\n source = 'env';\n } else if (model.hasApiKey) {\n source = 'env';\n }\n\n const flowKind = WEB_OAUTH_FLOW_KINDS[model.provider];\n seen.set(model.provider, {\n provider: model.provider,\n envVar: model.apiKeyEnvVar,\n source,\n ...(orgKey !== undefined ? { orgKey } : {}),\n ...(userCredential ? { userCredential } : {}),\n ...(orgCredential ? { orgCredential } : {}),\n ...(flowKind ? { oauth: { supported: true as const, modes: [flowKind] } } : {}),\n });\n }\n\n return Array.from(seen.values()).sort((a, b) => a.provider.localeCompare(b.provider));\n}\n\n/** A user-defined OpenAI-compatible provider, with key presence (never the key). */\nexport interface CustomProviderInfo {\n id: string;\n name: string;\n url: string;\n hasApiKey: boolean;\n models: string[];\n}\n\n/** Redact a stored custom-provider row for the client (key presence only). */\nfunction toCustomProviderInfo(record: CustomProviderRecord): CustomProviderInfo {\n return {\n id: record.providerId,\n name: record.name,\n url: record.url,\n hasApiKey: Boolean(record.apiKey),\n models: record.models,\n };\n}\n\n/** The resolved custom-providers storage scope for a request. */\ninterface CustomProvidersContext {\n storage: CustomProvidersStorage;\n orgId: string;\n userId: string;\n}\n\n/**\n * Resolve the custom-providers context for a request, or a ready-to-return\n * error response. Same posture as memory settings: tenant rows in deployed\n * mode, a sentinel `local` org in no-auth mode — never settings.json.\n */\nasync function resolveCustomProvidersContext({\n c,\n auth,\n customProviders,\n}: {\n c: Context;\n auth: RouteAuth;\n customProviders?: CustomProvidersStorage;\n}): Promise<CustomProvidersContext | { response: Response }> {\n await auth.ensureUser(c);\n const tenant = auth.tenant(c);\n if (!tenant && auth.enabled()) return { response: c.json({ error: 'unauthorized' }, 401) };\n if (customProviders) {\n try {\n await customProviders.ensureReady();\n return tenant\n ? { storage: customProviders, orgId: tenantOrgId(tenant), userId: tenant.userId }\n : { storage: customProviders, orgId: 'local', userId: 'local' };\n } catch {\n // fall through to the unavailable response\n }\n }\n return {\n response: c.json(\n {\n error: 'custom_providers_unavailable',\n message: 'Custom provider storage is unavailable — the app database is not configured or failed to start.',\n },\n 503,\n ),\n };\n}\n\n/** Validate + coerce a request body into a CustomProviderSetting. */\nfunction parseCustomProviderBody(body: unknown): CustomProviderSetting | { error: string } {\n if (!body || typeof body !== 'object') return { error: 'Invalid JSON body' };\n const b = body as Record<string, unknown>;\n const name = typeof b.name === 'string' ? b.name.trim() : '';\n if (!name) return { error: 'Missing required field: name' };\n const url = typeof b.url === 'string' ? b.url.trim() : '';\n if (!url) return { error: 'Missing required field: url' };\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n return { error: 'url must be an http(s) URL' };\n }\n } catch {\n return { error: 'url must be a valid URL' };\n }\n const apiKey = typeof b.apiKey === 'string' && b.apiKey.trim() ? b.apiKey.trim() : undefined;\n const models = Array.isArray(b.models)\n ? b.models.filter((m): m is string => typeof m === 'string' && m.trim().length > 0).map(m => m.trim())\n : [];\n return { name, url, apiKey, models };\n}\n\n/**\n * Providers whose credentials can only come from the server process (Amazon\n * Bedrock authenticates through the AWS credential chain). In tenant mode they\n * are usable only when the operator lists them in\n * `MastraFactoryConfig.deploymentModelProviders`.\n */\nexport const DEPLOYMENT_MODEL_PROVIDERS: readonly string[] = [AMAZON_BEDROCK_GATEWAY_ID];\n\nexport function isDeploymentModelProvider(provider: string): boolean {\n return DEPLOYMENT_MODEL_PROVIDERS.includes(provider);\n}\n\n/**\n * Normalize the operator's `deploymentModelProviders` list. Unsupported ids are\n * ignored with a warning rather than failing boot.\n */\nexport function resolveDeploymentModelProviders(providers: readonly string[] | undefined): ReadonlySet<string> {\n const resolved = new Set<string>();\n for (const raw of providers ?? []) {\n const provider = raw.trim();\n if (!provider) continue;\n if (isDeploymentModelProvider(provider)) {\n resolved.add(provider);\n } else {\n console.warn(\n `[factory] Ignoring deployment model provider \"${provider}\". Supported: ${DEPLOYMENT_MODEL_PROVIDERS.join(', ')}.`,\n );\n }\n }\n return resolved;\n}\n\n/**\n * Compute which providers the user can reach, mirroring the TUI's\n * `/models-pack` access derivation: OAuth/api-key from the credential store for\n * the named providers, plus any other provider that has a usable key.\n */\nexport async function buildProviderAccess({\n controller,\n authStorage,\n tenantCredentials,\n deploymentProviders,\n}: {\n controller: ModelCatalog;\n authStorage?: AuthStorage;\n tenantCredentials?: CredentialRecord[];\n deploymentProviders?: ReadonlySet<string>;\n}): Promise<ProviderAccess> {\n const models = await controller.listAvailableModels();\n const hasModelKey = (provider: string) => models.some(m => m.provider === provider && m.hasApiKey);\n const accessLevel = (provider: string): ProviderAccessLevel => {\n const authProviderId = getAuthProviderId(provider);\n if (tenantCredentials) {\n // Tenant rows never authenticate these providers; only an operator\n // opt-in plus credentials on the server process does.\n if (isDeploymentModelProvider(provider)) {\n return deploymentProviders?.has(provider) && hasModelKey(provider) ? 'apikey' : false;\n }\n const userRec = tenantCredentials.find(r => r.scope === 'user' && r.provider === authProviderId);\n const orgRec = tenantCredentials.find(r => r.scope === 'org' && r.provider === authProviderId);\n const credential = userRec?.credential ?? orgRec?.credential;\n if (credential?.type === 'oauth') return 'oauth';\n if (credential?.type === 'api_key' && credential.key.trim().length > 0) return 'apikey';\n return false;\n }\n\n const oauthCredential = authStorage?.get(authProviderId);\n if (oauthCredential?.type === 'oauth') return 'oauth';\n if (authStorage?.hasStoredApiKey(provider)) return 'apikey';\n const directCredential = authStorage?.get(provider);\n if (directCredential?.type === 'api_key' && directCredential.key.trim().length > 0) return 'apikey';\n return hasModelKey(provider) ? 'apikey' : false;\n };\n const access: ProviderAccess = {\n anthropic: accessLevel('anthropic'),\n openai: accessLevel('openai'),\n cerebras: accessLevel('cerebras'),\n google: accessLevel('google'),\n deepseek: accessLevel('deepseek'),\n 'github-copilot': accessLevel('github-copilot'),\n };\n const seen = new Set(Object.keys(access));\n for (const m of models) {\n if (!seen.has(m.provider)) {\n access[m.provider] = accessLevel(m.provider);\n seen.add(m.provider);\n }\n }\n return access;\n}\n\nfunction canUseModelProvider(access: ProviderAccess, provider: string): boolean {\n return Boolean(access[provider]);\n}\n\n/** Per-user default model context for the current request. */\nexport interface ModelDefaultsContext {\n storage: ModelDefaultsStorage;\n orgId: string;\n userId: string;\n}\n\n/** Resolve the default-model context for a request, or a ready-to-return error response. */\nasync function resolveModelDefaultsContext({\n c,\n auth,\n modelDefaults,\n}: {\n c: Context;\n auth: RouteAuth;\n modelDefaults?: ModelDefaultsStorage;\n}): Promise<ModelDefaultsContext | { response: Response }> {\n await auth.ensureUser(c);\n const tenant = auth.tenant(c);\n if (!tenant && auth.enabled()) return { response: c.json({ error: 'unauthorized' }, 401) };\n if (modelDefaults) {\n try {\n await modelDefaults.ensureReady();\n return tenant\n ? { storage: modelDefaults, orgId: tenantOrgId(tenant), userId: tenant.userId }\n : { storage: modelDefaults, orgId: 'local', userId: 'local' };\n } catch {\n // fall through to the unavailable response\n }\n }\n return {\n response: c.json(\n {\n error: 'model_defaults_unavailable',\n message: 'Default model storage is unavailable — the app database is not configured or failed to start.',\n },\n 503,\n ),\n };\n}\n\n// Mirrors the TUI `/om` command. Settings are persisted per organization and\n// user in the Factory app database, then loaded into request context for each\n// invocation without copying them into mutable session state.\n\nexport interface OMRoleConfigInfo {\n model: 'auto' | string;\n effectiveModelId: string;\n effectiveModelSource: 'explicit' | 'live-session' | 'configured-default';\n providerStatus: 'available' | 'unavailable';\n}\n\n/** Persisted intent plus the concrete models the current Factory configuration resolves. */\nexport interface OMConfigInfo {\n observer: OMRoleConfigInfo;\n reflector: OMRoleConfigInfo;\n /** @deprecated Use `observer.effectiveModelId`. */\n observerModelId: string;\n /** @deprecated Use `reflector.effectiveModelId`. */\n reflectorModelId: string;\n observationThreshold: number;\n reflectionThreshold: number;\n observeAttachments: 'auto' | boolean;\n}\n\nexport interface ProviderOMDefaultsResponse {\n ok: true;\n config: OMConfigInfo;\n}\n\nfunction modelProvider(modelId: string): string {\n // Effective IDs keep their `mastra/` route; the provider segment after it is what\n // the SDK resolver falls back to when the gateway is not configured.\n const normalized = modelId.replace(/^mastracode\\//, '').replace(/^mastra\\//, '');\n return normalized.split('/', 1)[0] ?? '';\n}\n\nfunction roleConfig(\n model: OMRoleConfigInfo['model'],\n effectiveModelId: string,\n autoModelSource: 'live-session' | 'configured-default',\n availableProviders: ReadonlySet<string>,\n): OMRoleConfigInfo {\n return {\n model,\n effectiveModelId,\n effectiveModelSource: model === 'auto' ? autoModelSource : 'explicit',\n providerStatus:\n availableProviders.has(modelProvider(effectiveModelId)) ||\n (effectiveModelId.startsWith(MASTRA_GATEWAY_PREFIX) && availableProviders.has(MASTRA_GATEWAY_PROVIDER))\n ? 'available'\n : 'unavailable',\n };\n}\n\nfunction readStoredOMConfig(\n record: MemorySettingsRecord | null,\n currentModelId: string | undefined,\n autoModelSource: 'live-session' | 'configured-default',\n availableProviders: ReadonlySet<string>,\n): OMConfigInfo {\n const autoModelId = resolveAutoOMModelId(currentModelId, providerId => availableProviders.has(providerId));\n const observerModelId = record?.observerModelId ?? autoModelId;\n const reflectorModelId = record?.reflectorModelId ?? autoModelId;\n return {\n observer: roleConfig(record?.observerModelId ?? 'auto', observerModelId, autoModelSource, availableProviders),\n reflector: roleConfig(record?.reflectorModelId ?? 'auto', reflectorModelId, autoModelSource, availableProviders),\n observerModelId,\n reflectorModelId,\n observationThreshold: record?.observationThreshold ?? DEFAULT_OBSERVATION_THRESHOLD,\n reflectionThreshold: record?.reflectionThreshold ?? DEFAULT_REFLECTION_THRESHOLD,\n observeAttachments: record?.observeAttachments ?? 'auto',\n };\n}\n\n/**\n * Where a request's OM settings live: the `memory-settings` factory storage\n * domain, one row per (org, user). Without a tenant (auth disabled), settings\n * land on a sentinel `(local, local)` row in the same table — the web surface\n * never reads or writes `settings.json` for memory settings.\n */\ninterface MemorySettingsContext {\n storage: MemorySettingsStorage;\n orgId: string;\n userId: string;\n}\n\n/**\n * Resolve the memory-settings context for a request, or a ready-to-return\n * error response. When `factoryProjectId` is provided the row addressed is the\n * factory project's shared settings (a sentinel user id in the caller's org)\n * instead of the caller's personal row — this is what factory board runs and\n * channel sessions hydrate from.\n */\nasync function resolveMemorySettingsContext({\n c,\n auth,\n memorySettings,\n factoryProjectId,\n factoryProjects,\n}: {\n c: Context;\n auth: RouteAuth;\n memorySettings?: MemorySettingsStorage;\n factoryProjectId?: string;\n factoryProjects?: FactoryProjectsStorage;\n}): Promise<MemorySettingsContext | { response: Response }> {\n await auth.ensureUser(c);\n const tenant = auth.tenant(c);\n if (!tenant && auth.enabled()) return { response: c.json({ error: 'unauthorized' }, 401) };\n // Factory-scoped rows are shared org state: the target project must exist in\n // the caller's org before its settings row can be read or written.\n if (factoryProjectId && tenant) {\n if (!factoryProjects) return { response: c.json({ error: 'factory_unavailable' }, 503) };\n try {\n await factoryProjects.ensureReady();\n const project = await factoryProjects.get({ orgId: tenantOrgId(tenant), id: factoryProjectId });\n if (!project) return { response: c.json({ error: 'factory_project_not_found' }, 404) };\n } catch {\n return { response: c.json({ error: 'factory_unavailable' }, 503) };\n }\n }\n if (memorySettings) {\n try {\n await memorySettings.ensureReady();\n const factoryUserId = factoryProjectId ? factoryMemorySettingsUserId(factoryProjectId) : undefined;\n return tenant\n ? { storage: memorySettings, orgId: tenantOrgId(tenant), userId: factoryUserId ?? tenant.userId }\n : { storage: memorySettings, orgId: 'local', userId: factoryUserId ?? 'local' };\n } catch {\n // fall through to the unavailable response\n }\n }\n return {\n response: c.json(\n {\n error: 'memory_settings_unavailable',\n message: 'Memory settings storage is unavailable — the app database is not configured or failed to start.',\n },\n 503,\n ),\n };\n}\n\n/** Persist an OM knob change to the caller's memory-settings row. */\nasync function persistMemorySettings(context: MemorySettingsContext, patch: MemorySettingsPatch): Promise<void> {\n await context.storage.patch({ orgId: context.orgId, userId: context.userId, patch });\n}\n\n/** Dependencies injected into {@link ConfigRoutes}. */\nexport interface ConfigRoutesDeps extends RouteDependencies {\n controller: ModelCatalog;\n features?: { knowledge: boolean };\n authStorage?: AuthStorage;\n /** Tenant credential domain handle; absent in local (no-DB) mode. */\n modelCredentials?: ModelCredentialsStorage;\n /** Tenant model-defaults domain handle; absent in local (no-DB) mode. */\n modelDefaults?: ModelDefaultsStorage;\n /** Source-control sessions available to config route integrations. */\n sourceControlSessions?: Pick<SourceControlStorageHandle['sessions'], 'getBySessionId'>;\n /** Thread membership used to resolve the same model policy as an invocation. */\n workItems?: WorkItemsStorage;\n /** Tenant memory-settings domain handle; absent in local (no-DB) mode. */\n memorySettings?: MemorySettingsStorage;\n /** Factory projects domain, used to derive OM fallbacks from a factory's default model. */\n factoryProjects?: FactoryProjectsStorage;\n /** Custom-providers domain handle; absent when the app database is missing. */\n customProviders?: CustomProvidersStorage;\n /** Notifies the host after tenant credentials change so caches can be dropped. */\n onCredentialsChanged?: (tenant: { orgId: string; userId?: string }) => void;\n /** Notifies the host after custom providers change so model-router caches can be dropped. */\n onCustomProvidersChanged?: (tenant: { orgId: string }) => void;\n /**\n * Tenant mode: providers the operator opted in to run on the server process's\n * own credentials (see `DEPLOYMENT_MODEL_PROVIDERS`).\n */\n deploymentProviders?: ReadonlySet<string>;\n}\n\n/**\n * The web config routes as Mastra `apiRoutes`:\n * - `GET /web/config/features` — list server-enabled product features\n * - `GET /web/config/providers` — list providers + key source\n * - `PUT /web/config/providers/:provider/key` — set/update a provider's API key\n * - `DELETE /web/config/providers/:provider/key` — remove a stored API key\n * - `GET /web/config/models` — list available models (credentialed providers)\n * - `GET /web/config/custom-providers` — list custom OpenAI-compatible providers\n * - `POST /web/config/custom-providers` — create/update a custom provider\n * - `DELETE /web/config/custom-providers/:id` — remove a custom provider\n * - `GET /web/config/om` — read OM models/thresholds/observe-attachments\n * - `PUT /web/config/om/:role/model` — switch observer/reflector model\n * - `PUT /web/config/om/thresholds` — set observation/reflection thresholds\n * - `PUT /web/config/om/observe-attachments` — set observe-attachments (auto/on/off)\n */\nexport class ConfigRoutes extends Route<ConfigRoutesDeps> {\n routes(): ApiRoute[] {\n const options = this.deps;\n const { controller, authStorage, auth, deploymentProviders } = options;\n const onCredentialsChanged = options.onCredentialsChanged ?? (() => {});\n const onCustomProvidersChanged = options.onCustomProvidersChanged ?? (() => {});\n\n const resolveOMResponseContext = async (c: Context) => {\n const tenantCredentials = await listTenantCredentialsForRequest({\n c: loose(c),\n auth,\n credentials: options.modelCredentials,\n });\n const access = await buildProviderAccess({\n controller,\n authStorage: tenantCredentials ? undefined : authStorage,\n tenantCredentials,\n deploymentProviders,\n });\n const availableProviders = new Set(\n Object.entries(access).flatMap(([providerId, configured]) => (configured ? [providerId] : [])),\n );\n // `mastra/` routes run through the Mastra gateway whenever its key is configured.\n if (MastraCodeGateway.getMastraGatewayApiKey()) availableProviders.add(MASTRA_GATEWAY_PROVIDER);\n if (options.customProviders) {\n const context = await resolveCustomProvidersContext({\n c: loose(c),\n auth,\n customProviders: options.customProviders,\n });\n if (!('response' in context)) {\n for (const provider of await context.storage.list({ orgId: context.orgId })) {\n availableProviders.add(provider.providerId);\n }\n }\n }\n return availableProviders;\n };\n\n // Without a live session, Auto previews against the factory default model\n // (resolved with this account's providers in readStoredOMConfig) — not the\n // global built-in default, whose provider may have no credential here.\n const factoryOmFallback = async (factoryProjectId: string | undefined): Promise<string | undefined> => {\n try {\n return factoryProjectId\n ? await options.factoryProjects\n ?.getById({ id: factoryProjectId })\n .then(project => project?.defaultModelId ?? undefined)\n : controller.listModes?.().find(mode => mode.defaultModelId)?.defaultModelId;\n } catch {\n return undefined;\n }\n };\n\n return [\n registerApiRoute('/web/config/features', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => c.json({ knowledge: options.features?.knowledge ?? false }),\n }),\n\n registerApiRoute('/web/config/providers', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n try {\n // Tenant mode lists the caller's rows and never exposes the\n // server-global auth.json; local mode is unchanged.\n const tenantCredentials = await listTenantCredentialsForRequest({\n c: loose(c),\n auth,\n credentials: options.modelCredentials,\n });\n // Tenant mode also reports whether the caller may write org-wide\n // keys, so the settings UI can gate the \"Everyone in org\" option.\n const tenant = auth.tenant(loose(c));\n const orgKeyAdmin = tenant ? await auth.isOrganizationAdmin(loose(c), tenantOrgId(tenant)) : undefined;\n return c.json({\n providers: await listProviders({\n controller,\n authStorage: tenantCredentials ? undefined : authStorage,\n tenantCredentials,\n deploymentProviders,\n }),\n ...(orgKeyAdmin !== undefined ? { orgKeyAdmin } : {}),\n });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/providers/:provider/key', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n const ctx = await resolveCredentialContext({ c: loose(c), auth, credentials: options.modelCredentials });\n if ('response' in ctx) return ctx.response;\n\n const provider = c.req.param('provider');\n let body: { key?: unknown; envVar?: unknown; scope?: unknown };\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const key = typeof body.key === 'string' ? body.key.trim() : '';\n if (!key) return c.json({ error: 'Missing required field: key' }, 400);\n const envVar = typeof body.envVar === 'string' ? body.envVar : undefined;\n const scope = body.scope === 'org' ? 'org' : 'user';\n try {\n if (ctx.mode === 'tenant') {\n // A stored key would never be read: these providers authenticate\n // with the server process's credentials only.\n if (isDeploymentModelProvider(provider)) {\n return c.json(\n {\n error: 'provider_configured_by_deployment',\n message: `${provider} is configured by the Factory deployment (credentials on the server), not per account.`,\n },\n 400,\n );\n }\n if (scope === 'org' && !(await auth.isOrganizationAdmin(loose(c), ctx.orgId))) {\n return c.json({ error: 'organization_admin_required' }, 403);\n }\n const tenant = scope === 'org' ? { orgId: ctx.orgId } : { orgId: ctx.orgId, userId: ctx.userId };\n // envVar is intentionally ignored: tenant credentials are resolved\n // per-request, never written into process.env.\n await ctx.storage.setCredential(tenant, getAuthProviderId(provider), { type: 'api_key', key });\n onCredentialsChanged(tenant);\n const records = await ctx.storage.listCredentials(ctx.orgId, ctx.userId);\n const providers = await listProviders({ controller, tenantCredentials: records, deploymentProviders });\n return c.json({ ok: true, provider: providers.find(p => p.provider === provider) });\n }\n if (!authStorage) return c.json({ error: 'Credential storage is not available' }, 503);\n // Local mode is single-user: scope is meaningless and ignored.\n authStorage.setStoredApiKey(provider, key, envVar);\n const providers = await listProviders({ controller, authStorage });\n return c.json({ ok: true, provider: providers.find(p => p.provider === provider) });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/providers/:provider/key', {\n method: 'DELETE',\n requiresAuth: false,\n handler: async c => {\n const ctx = await resolveCredentialContext({ c: loose(c), auth, credentials: options.modelCredentials });\n if ('response' in ctx) return ctx.response;\n\n const provider = c.req.param('provider');\n const scope = c.req.query('scope') === 'org' ? 'org' : 'user';\n try {\n if (ctx.mode === 'tenant') {\n if (scope === 'org' && !(await auth.isOrganizationAdmin(loose(c), ctx.orgId))) {\n return c.json({ error: 'organization_admin_required' }, 403);\n }\n const tenant = scope === 'org' ? { orgId: ctx.orgId } : { orgId: ctx.orgId, userId: ctx.userId };\n await ctx.storage.removeCredential(tenant, getAuthProviderId(provider));\n onCredentialsChanged(tenant);\n const records = await ctx.storage.listCredentials(ctx.orgId, ctx.userId);\n const providers = await listProviders({ controller, tenantCredentials: records, deploymentProviders });\n return c.json({ ok: true, provider: providers.find(p => p.provider === provider) });\n }\n if (!authStorage) return c.json({ error: 'Credential storage is not available' }, 503);\n authStorage.remove(`apikey:${provider}`);\n const providers = await listProviders({ controller, authStorage });\n return c.json({ ok: true, provider: providers.find(p => p.provider === provider) });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n // Mirrors the TUI's /custom-providers command, but backed by the\n // `custom-providers` domain (org rows in tenant mode, a sentinel `local`\n // org in no-auth mode) — the server never reads settings.json for these.\n\n registerApiRoute('/web/config/custom-providers', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n const ctx = await resolveCustomProvidersContext({\n c: loose(c),\n auth,\n customProviders: options.customProviders,\n });\n if ('response' in ctx) return ctx.response;\n try {\n const records = await ctx.storage.list({ orgId: ctx.orgId });\n return c.json({ providers: records.map(toCustomProviderInfo) });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/custom-providers', {\n method: 'POST',\n requiresAuth: false,\n handler: async c => {\n const ctx = await resolveCustomProvidersContext({\n c: loose(c),\n auth,\n customProviders: options.customProviders,\n });\n if ('response' in ctx) return ctx.response;\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const parsed = parseCustomProviderBody(body);\n if ('error' in parsed) return c.json({ error: parsed.error }, 400);\n // `previousId` lets a rename remove the old entry as well as any name clash.\n const previousId =\n body && typeof body === 'object' && typeof (body as Record<string, unknown>).previousId === 'string'\n ? ((body as Record<string, unknown>).previousId as string)\n : undefined;\n try {\n const record = await ctx.storage.upsert({\n orgId: ctx.orgId,\n userId: ctx.userId,\n input: {\n providerId: getCustomProviderId(parsed.name),\n name: parsed.name,\n url: parsed.url,\n apiKey: parsed.apiKey,\n models: parsed.models,\n },\n previousProviderId: previousId,\n });\n onCustomProvidersChanged({ orgId: ctx.orgId });\n return c.json({ ok: true, provider: toCustomProviderInfo(record) });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/custom-providers/:id', {\n method: 'DELETE',\n requiresAuth: false,\n handler: async c => {\n const ctx = await resolveCustomProvidersContext({\n c: loose(c),\n auth,\n customProviders: options.customProviders,\n });\n if ('response' in ctx) return ctx.response;\n const id = c.req.param('id');\n try {\n await ctx.storage.delete({ orgId: ctx.orgId, providerId: id });\n onCustomProvidersChanged({ orgId: ctx.orgId });\n return c.json({ ok: true });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n // Session-independent model catalog for settings pickers (Factory default\n // model, pack editors). Only models whose provider has a credential are\n // returned — the same filter the session-scoped hook applies client-side.\n\n registerApiRoute('/web/config/models', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n try {\n const allTenantCredentials = await listTenantCredentialsForRequest({\n c: loose(c),\n auth,\n credentials: options.modelCredentials,\n });\n const factoryProjectId = c.req.query('factoryId') || undefined;\n const tenant = auth.tenant(c);\n let tenantCredentials = allTenantCredentials;\n let sessionPolicy: { modelScope: 'factory' | 'user'; defaultModelId: string | null } | undefined;\n const resourceId = c.req.query('resourceId');\n const threadId = c.req.query('threadId');\n if (resourceId !== undefined || threadId !== undefined) {\n const address = z\n .object({ resourceId: z.string().trim().min(1), threadId: z.string().trim().min(1) })\n .safeParse({ resourceId, threadId });\n if (!address.success) return c.json({ error: 'invalid_session_context' }, 400);\n if (!tenant && auth.enabled()) return c.json({ error: 'unauthorized' }, 401);\n if (tenant) {\n if (\n !options.factoryProjects ||\n !options.sourceControlSessions ||\n !options.workItems ||\n !options.modelCredentials\n )\n return c.json({ error: 'session_model_policy_unavailable' }, 503);\n const requestContext = new RequestContext();\n requestContext.set('user', { id: tenant.userId, organizationId: tenantOrgId(tenant) });\n requestContext.set('controller', address.data);\n let policy;\n try {\n policy = await resolveFactoryModelPolicy(requestContext, {\n projects: options.factoryProjects,\n sourceControl: options.sourceControlSessions,\n workItems: options.workItems,\n });\n } catch {\n return c.json({ error: 'session_model_policy_unavailable' }, 403);\n }\n if (!policy) return c.json({ error: 'unauthorized' }, 401);\n const orgId = policy.tenant.orgId ?? tenantOrgId(tenant);\n const modelScope = policy.tenant.credentialScope ?? 'user';\n const storageScope = modelScope === 'factory' ? 'org' : 'user';\n tenantCredentials = (\n await options.modelCredentials.listCredentials(orgId, policy.tenant.userId)\n ).filter(record => record.scope === storageScope);\n let defaultModelId = policy.factoryDefaultModelId ?? null;\n if (modelScope === 'user') {\n if (!options.modelDefaults) return c.json({ error: 'model_defaults_unavailable' }, 503);\n await options.modelDefaults.ensureReady();\n defaultModelId =\n (await options.modelDefaults.get({ orgId, userId: policy.tenant.userId }))?.modelId ?? null;\n }\n sessionPolicy = { modelScope, defaultModelId };\n }\n } else if (c.req.query('scope') !== undefined) {\n // Explicit settings scopes never override a live thread's owner and policy above.\n const scope = z.enum(['org', 'user']).safeParse(c.req.query('scope'));\n if (!scope.success) return c.json({ error: 'invalid_model_scope' }, 400);\n tenantCredentials = allTenantCredentials?.filter(record => record.scope === scope.data);\n } else if (allTenantCredentials && factoryProjectId && tenant) {\n if (!options.factoryProjects) return c.json({ error: 'factory_unavailable' }, 503);\n await options.factoryProjects.ensureReady();\n const project = await options.factoryProjects.get({ orgId: tenantOrgId(tenant), id: factoryProjectId });\n if (!project) return c.json({ error: 'factory_project_not_found' }, 404);\n const credentialScope = project.modelScope === 'user' ? 'user' : 'org';\n tenantCredentials = allTenantCredentials.filter(record => record.scope === credentialScope);\n }\n const [models, access] = await Promise.all([\n controller.listAvailableModels(),\n buildProviderAccess({\n controller,\n authStorage: tenantCredentials ? undefined : authStorage,\n tenantCredentials,\n deploymentProviders,\n }),\n ]);\n const catalog = models.flatMap(({ id, provider, modelName }) =>\n typeof id === 'string' && canUseModelProvider(access, provider)\n ? [{ id, provider, modelName, hasApiKey: true, reasoningOptions: getModelReasoningOptions(id) }]\n : [],\n );\n // Append the caller's custom provider models (DB-backed, org rows in\n // tenant mode / sentinel `local` org in no-auth mode). The boot-time\n // gateway catalog only carries the local list, so tenant callers get\n // theirs here. Dedupe against ids already present.\n if (options.customProviders) {\n try {\n const ctx = await resolveCustomProvidersContext({\n c: loose(c),\n auth,\n customProviders: options.customProviders,\n });\n if (!('response' in ctx)) {\n const known = new Set(catalog.map(m => m.id));\n for (const record of await ctx.storage.list({ orgId: ctx.orgId })) {\n for (const model of record.models) {\n const id = `${record.providerId}/${model}`;\n if (known.has(id)) continue;\n known.add(id);\n catalog.push({\n id,\n provider: record.providerId,\n modelName: model,\n hasApiKey: true,\n reasoningOptions: undefined,\n });\n }\n }\n }\n } catch {\n // Fail soft: the catalog still serves the built-in models.\n }\n }\n return c.json({\n ...sessionPolicy,\n models: catalog.sort((a, b) =>\n a.provider === b.provider ? a.id.localeCompare(b.id) : a.provider.localeCompare(b.provider),\n ),\n });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/default-model', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n const context = await resolveModelDefaultsContext({\n c: loose(c),\n auth,\n modelDefaults: options.modelDefaults,\n });\n if ('response' in context) return context.response;\n try {\n const record = await context.storage.get({ orgId: context.orgId, userId: context.userId });\n return c.json({ modelId: record?.modelId ?? null });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/default-model', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n const context = await resolveModelDefaultsContext({\n c: loose(c),\n auth,\n modelDefaults: options.modelDefaults,\n });\n if ('response' in context) return context.response;\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const parsed = z.object({ modelId: z.string().trim().min(1).max(256) }).safeParse(body);\n if (!parsed.success) return c.json({ error: 'Missing required field: modelId' }, 400);\n const { modelId } = parsed.data;\n try {\n await context.storage.set({ orgId: context.orgId, userId: context.userId, modelId });\n return c.json({ ok: true, modelId });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/default-model', {\n method: 'DELETE',\n requiresAuth: false,\n handler: async c => {\n const context = await resolveModelDefaultsContext({\n c: loose(c),\n auth,\n modelDefaults: options.modelDefaults,\n });\n if ('response' in context) return context.response;\n try {\n await context.storage.clear({ orgId: context.orgId, userId: context.userId });\n return c.json({ ok: true, modelId: null });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n // Mirrors the TUI's /om command. All five knobs are durably stored in the\n // per-(org, user) `memory-settings` app table — never settings.json or\n // mutable session state.\n\n registerApiRoute('/web/config/om', {\n method: 'GET',\n requiresAuth: false,\n handler: async c => {\n const resourceId = c.req.query('resourceId');\n const scope = c.req.query('scope') || undefined;\n const factoryProjectId = c.req.query('factoryId') || undefined;\n const context = await resolveMemorySettingsContext({\n c: loose(c),\n auth,\n memorySettings: options.memorySettings,\n factoryProjectId,\n factoryProjects: options.factoryProjects,\n });\n if ('response' in context) return context.response;\n try {\n const record = await context.storage.get({ orgId: context.orgId, userId: context.userId });\n const fallback = await factoryOmFallback(factoryProjectId);\n const availableProviders = await resolveOMResponseContext(loose(c));\n const session = resourceId ? await controller.getSessionByResource?.(resourceId, scope) : undefined;\n const sessionModelId = session?.model.get();\n return c.json({\n config: readStoredOMConfig(\n record,\n sessionModelId || fallback,\n sessionModelId ? 'live-session' : 'configured-default',\n availableProviders,\n ),\n });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/om/:role/model', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n const role = c.req.param('role');\n if (role !== 'observer' && role !== 'reflector') {\n return c.json({ error: `Unknown OM role \"${role}\"` }, 400);\n }\n let body: { resourceId?: unknown; modelId?: unknown; scope?: unknown; factoryId?: unknown };\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const resourceId = typeof body.resourceId === 'string' ? body.resourceId : '';\n const scope = typeof body.scope === 'string' && body.scope ? body.scope : undefined;\n const factoryProjectId = typeof body.factoryId === 'string' && body.factoryId ? body.factoryId : undefined;\n const model = typeof body.modelId === 'string' ? body.modelId.trim() : '';\n if (!model) {\n return c.json({ error: 'Missing required field: modelId' }, 400);\n }\n // `'auto'` is selection intent, not a model ID: store null so the role\n // follows the active main model instead of pinning a model named \"auto\".\n const wantsAuto = model === 'auto';\n const context = await resolveMemorySettingsContext({\n c: loose(c),\n auth,\n memorySettings: options.memorySettings,\n factoryProjectId,\n factoryProjects: options.factoryProjects,\n });\n if ('response' in context) return context.response;\n // Resolve the response context before persisting: a provider-enumeration\n // failure must not report 500 for a write that already succeeded.\n const availableProviders = await resolveOMResponseContext(loose(c));\n try {\n await persistMemorySettings(context, {\n [role === 'observer' ? 'observerModelId' : 'reflectorModelId']: wantsAuto ? null : model,\n });\n const record = await context.storage.get({ orgId: context.orgId, userId: context.userId });\n const session = resourceId ? await controller.getSessionByResource?.(resourceId, scope) : undefined;\n const sessionModelId = session?.model.get();\n const config = readStoredOMConfig(\n record,\n sessionModelId || (await factoryOmFallback(factoryProjectId)),\n sessionModelId ? 'live-session' : 'configured-default',\n availableProviders,\n );\n return c.json({ ok: true, config });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/om/thresholds', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n let body: {\n resourceId?: unknown;\n observationThreshold?: unknown;\n reflectionThreshold?: unknown;\n scope?: unknown;\n factoryId?: unknown;\n };\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const resourceId = typeof body.resourceId === 'string' ? body.resourceId : '';\n const scope = typeof body.scope === 'string' && body.scope ? body.scope : undefined;\n const factoryProjectId = typeof body.factoryId === 'string' && body.factoryId ? body.factoryId : undefined;\n const observation =\n typeof body.observationThreshold === 'number' && body.observationThreshold > 0\n ? Math.round(body.observationThreshold)\n : undefined;\n const reflection =\n typeof body.reflectionThreshold === 'number' && body.reflectionThreshold > 0\n ? Math.round(body.reflectionThreshold)\n : undefined;\n if (observation === undefined && reflection === undefined) {\n return c.json({ error: 'Provide observationThreshold and/or reflectionThreshold (positive numbers)' }, 400);\n }\n const context = await resolveMemorySettingsContext({\n c: loose(c),\n auth,\n memorySettings: options.memorySettings,\n factoryProjectId,\n factoryProjects: options.factoryProjects,\n });\n if ('response' in context) return context.response;\n const availableProviders = await resolveOMResponseContext(loose(c));\n try {\n await persistMemorySettings(context, {\n ...(observation !== undefined ? { observationThreshold: observation } : {}),\n ...(reflection !== undefined ? { reflectionThreshold: reflection } : {}),\n });\n const record = await context.storage.get({ orgId: context.orgId, userId: context.userId });\n const session = resourceId ? await controller.getSessionByResource?.(resourceId, scope) : undefined;\n const sessionModelId = session?.model.get();\n const config = readStoredOMConfig(\n record,\n sessionModelId || (await factoryOmFallback(factoryProjectId)),\n sessionModelId ? 'live-session' : 'configured-default',\n availableProviders,\n );\n return c.json({ ok: true, config });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n\n registerApiRoute('/web/config/om/observe-attachments', {\n method: 'PUT',\n requiresAuth: false,\n handler: async c => {\n let body: { resourceId?: unknown; value?: unknown; scope?: unknown; factoryId?: unknown };\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n const resourceId = typeof body.resourceId === 'string' ? body.resourceId : '';\n const scope = typeof body.scope === 'string' && body.scope ? body.scope : undefined;\n const factoryProjectId = typeof body.factoryId === 'string' && body.factoryId ? body.factoryId : undefined;\n const raw = body.value;\n const value: 'auto' | boolean = raw === 'auto' || raw === true || raw === false ? raw : 'auto';\n if (raw !== 'auto' && raw !== true && raw !== false) {\n return c.json({ error: \"value must be 'auto', true, or false\" }, 400);\n }\n const context = await resolveMemorySettingsContext({\n c: loose(c),\n auth,\n memorySettings: options.memorySettings,\n factoryProjectId,\n factoryProjects: options.factoryProjects,\n });\n if ('response' in context) return context.response;\n const availableProviders = await resolveOMResponseContext(loose(c));\n try {\n await persistMemorySettings(context, { observeAttachments: value });\n const record = await context.storage.get({ orgId: context.orgId, userId: context.userId });\n const session = resourceId ? await controller.getSessionByResource?.(resourceId, scope) : undefined;\n const sessionModelId = session?.model.get();\n const config = readStoredOMConfig(\n record,\n sessionModelId || (await factoryOmFallback(factoryProjectId)),\n sessionModelId ? 'live-session' : 'configured-default',\n availableProviders,\n );\n return c.json({ ok: true, config });\n } catch (error) {\n return c.json({ error: error instanceof Error ? error.message : String(error) }, 500);\n }\n },\n }),\n ];\n }\n}\n"],"mappings":"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"}