@mastra/code-sdk 0.2.0-alpha.4 → 0.2.0-alpha.9

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 (81) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/dist/agents/credential-resolver.d.ts +51 -0
  3. package/dist/agents/credential-resolver.d.ts.map +1 -0
  4. package/dist/agents/credential-resolver.js +41 -0
  5. package/dist/agents/credential-resolver.js.map +1 -0
  6. package/dist/agents/instructions.d.ts.map +1 -1
  7. package/dist/agents/instructions.js.map +1 -1
  8. package/dist/agents/mastracode-gateway.d.ts +11 -4
  9. package/dist/agents/mastracode-gateway.d.ts.map +1 -1
  10. package/dist/agents/mastracode-gateway.js +51 -30
  11. package/dist/agents/mastracode-gateway.js.map +1 -1
  12. package/dist/agents/model.d.ts +2 -0
  13. package/dist/agents/model.d.ts.map +1 -1
  14. package/dist/agents/model.js +13 -2
  15. package/dist/agents/model.js.map +1 -1
  16. package/dist/agents/workspace.d.ts +11 -1
  17. package/dist/agents/workspace.d.ts.map +1 -1
  18. package/dist/agents/workspace.js +31 -13
  19. package/dist/agents/workspace.js.map +1 -1
  20. package/dist/auth/authorization-input.d.ts +16 -0
  21. package/dist/auth/authorization-input.d.ts.map +1 -0
  22. package/dist/auth/authorization-input.js +28 -0
  23. package/dist/auth/authorization-input.js.map +1 -0
  24. package/dist/auth/device-code.d.ts +93 -0
  25. package/dist/auth/device-code.d.ts.map +1 -0
  26. package/dist/auth/device-code.js +97 -0
  27. package/dist/auth/device-code.js.map +1 -0
  28. package/dist/auth/index.d.ts +1 -0
  29. package/dist/auth/index.d.ts.map +1 -1
  30. package/dist/auth/index.js +3 -1
  31. package/dist/auth/index.js.map +1 -1
  32. package/dist/auth/providers/anthropic.d.ts +24 -1
  33. package/dist/auth/providers/anthropic.d.ts.map +1 -1
  34. package/dist/auth/providers/anthropic.js +21 -8
  35. package/dist/auth/providers/anthropic.js.map +1 -1
  36. package/dist/auth/providers/github-copilot.d.ts +54 -0
  37. package/dist/auth/providers/github-copilot.d.ts.map +1 -1
  38. package/dist/auth/providers/github-copilot.js +88 -61
  39. package/dist/auth/providers/github-copilot.js.map +1 -1
  40. package/dist/auth/providers/openai-codex.d.ts +44 -0
  41. package/dist/auth/providers/openai-codex.d.ts.map +1 -1
  42. package/dist/auth/providers/openai-codex.js +79 -69
  43. package/dist/auth/providers/openai-codex.js.map +1 -1
  44. package/dist/auth/providers/xai.d.ts +64 -0
  45. package/dist/auth/providers/xai.d.ts.map +1 -0
  46. package/dist/auth/providers/xai.js +171 -0
  47. package/dist/auth/providers/xai.js.map +1 -0
  48. package/dist/auth/storage.d.ts.map +1 -1
  49. package/dist/auth/storage.js +5 -2
  50. package/dist/auth/storage.js.map +1 -1
  51. package/dist/auth/types.d.ts +21 -0
  52. package/dist/auth/types.d.ts.map +1 -1
  53. package/dist/hooks/types.d.ts.map +1 -1
  54. package/dist/hooks/types.js.map +1 -1
  55. package/dist/index.d.ts +12 -11
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +49 -35
  58. package/dist/index.js.map +1 -1
  59. package/dist/providers/amazon-bedrock-gateway.d.ts +7 -0
  60. package/dist/providers/amazon-bedrock-gateway.d.ts.map +1 -1
  61. package/dist/providers/amazon-bedrock-gateway.js +66 -2
  62. package/dist/providers/amazon-bedrock-gateway.js.map +1 -1
  63. package/dist/providers/claude-max.d.ts +3 -1
  64. package/dist/providers/claude-max.d.ts.map +1 -1
  65. package/dist/providers/claude-max.js +1 -1
  66. package/dist/providers/claude-max.js.map +1 -1
  67. package/dist/providers/github-copilot.d.ts +3 -1
  68. package/dist/providers/github-copilot.d.ts.map +1 -1
  69. package/dist/providers/github-copilot.js +1 -1
  70. package/dist/providers/github-copilot.js.map +1 -1
  71. package/dist/providers/openai-codex.d.ts +3 -1
  72. package/dist/providers/openai-codex.d.ts.map +1 -1
  73. package/dist/providers/openai-codex.js +1 -1
  74. package/dist/providers/openai-codex.js.map +1 -1
  75. package/dist/providers/xai.d.ts +33 -0
  76. package/dist/providers/xai.d.ts.map +1 -0
  77. package/dist/providers/xai.js +63 -0
  78. package/dist/providers/xai.js.map +1 -0
  79. package/dist/tools/request-sandbox-access.d.ts.map +1 -1
  80. package/dist/tools/request-sandbox-access.js.map +1 -1
  81. package/package.json +11 -11
package/CHANGELOG.md CHANGED
@@ -1,5 +1,105 @@
1
1
  # @mastra/code-sdk
2
2
 
3
+ ## 0.2.0-alpha.9
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`0a2c22c`](https://github.com/mastra-ai/mastra/commit/0a2c22c902604439ec490319e14c17f331e0c84c), [`3a8024c`](https://github.com/mastra-ai/mastra/commit/3a8024ce615f8aa89479c0d71fe61d10bb0040be)]:
8
+ - @mastra/core@1.52.0-alpha.9
9
+
10
+ ## 0.2.0-alpha.8
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies [[`3b77e77`](https://github.com/mastra-ai/mastra/commit/3b77e7704936522e4769d29de1b5ea6901f302bd), [`6b1bf3b`](https://github.com/mastra-ai/mastra/commit/6b1bf3b9494bd51aa8f654c68c9355d6046fa2a1), [`72e437c`](https://github.com/mastra-ai/mastra/commit/72e437c515942c80b9def5b026e0bdee61b469d9), [`72e437c`](https://github.com/mastra-ai/mastra/commit/72e437c515942c80b9def5b026e0bdee61b469d9), [`72e437c`](https://github.com/mastra-ai/mastra/commit/72e437c515942c80b9def5b026e0bdee61b469d9)]:
15
+ - @mastra/core@1.52.0-alpha.8
16
+ - @mastra/pg@1.17.0-alpha.1
17
+ - @mastra/libsql@1.17.0-alpha.1
18
+
19
+ ## 0.2.0-alpha.7
20
+
21
+ ### Patch Changes
22
+
23
+ - Fixed Mastra Code retries for EPIPE and closed provider connections. (#19691) ([#19692](https://github.com/mastra-ai/mastra/pull/19692))
24
+
25
+ - Fixed Amazon Bedrock prompt caching for long Mastra Code conversations. ([#19690](https://github.com/mastra-ai/mastra/pull/19690))
26
+
27
+ - Updated dependencies [[`b7e79c3`](https://github.com/mastra-ai/mastra/commit/b7e79c3c02ac5cd415db34ba0975ceafc1464333), [`b75d749`](https://github.com/mastra-ai/mastra/commit/b75d749621ff5d17e86bcb4ee809d301fb4f7cf3), [`a8799bb`](https://github.com/mastra-ai/mastra/commit/a8799bb8e44f4a60d01e4e2acd3448ff80bf14f8)]:
28
+ - @mastra/core@1.52.0-alpha.7
29
+
30
+ ## 0.2.0-alpha.6
31
+
32
+ ### Patch Changes
33
+
34
+ - Fixed Moonshot AI API key resolution so keys saved via /api-keys (MOONSHOT_API_KEY) work when selecting moonshot models ([#19655](https://github.com/mastra-ai/mastra/pull/19655))
35
+
36
+ - Updated dependencies [[`a40adeb`](https://github.com/mastra-ai/mastra/commit/a40adeb222b961a56a58af56a106106525721b74), [`821648b`](https://github.com/mastra-ai/mastra/commit/821648bf2871ef840100c7bacbecf676010bd12a), [`11f6cd9`](https://github.com/mastra-ai/mastra/commit/11f6cd96fe42582403416608beb212cc1a2cc79e)]:
37
+ - @mastra/core@1.52.0-alpha.6
38
+
39
+ ## 0.2.0-alpha.5
40
+
41
+ ### Minor Changes
42
+
43
+ - Added support for injecting pre-built storage and vector store instances into Mastra Code. `MastraCodeConfig.storage` now accepts a `MastraCompositeStore` instance in addition to a storage config, and the new `MastraCodeConfig.vector` slot accepts a `MastraVector` instance. When an instance is provided it is used as-is — no connection test or LibSQL fallback — so hosted deployments can share a single Postgres connection pool between Mastra storage and application tables. ([#19623](https://github.com/mastra-ai/mastra/pull/19623))
44
+
45
+ **Before**
46
+
47
+ ```ts
48
+ await createMastraCode({ storage: { backend: 'pg', connectionString } });
49
+ ```
50
+
51
+ **After**
52
+
53
+ ```ts
54
+ const storage = new PostgresStore({ id: 'code-storage', connectionString });
55
+ const vector = new PgVector({ id: 'code-vectors', connectionString });
56
+ await createMastraCode({ storage, vector });
57
+ ```
58
+
59
+ - Added step-based OAuth APIs for browser-driven provider sign-in and tenant-aware credential resolution. Hosted applications can now inject a credential store so each request resolves the caller's credentials without copying stored secrets into process environment variables. ([#19638](https://github.com/mastra-ai/mastra/pull/19638))
60
+
61
+ ```ts
62
+ import { startAnthropicLogin } from '@mastra/code-sdk/auth/providers/anthropic';
63
+
64
+ const { url, verifier } = await startAnthropicLogin();
65
+ ```
66
+
67
+ - Added access to the workspace resolved for an AgentController session. ([#19547](https://github.com/mastra-ai/mastra/pull/19547))
68
+
69
+ Use the session-owned workspace when an operation must remain isolated to that session:
70
+
71
+ ```ts
72
+ const session = await controller.createSession({ resourceId, scope });
73
+ const workspace = session.getWorkspace();
74
+ ```
75
+
76
+ Mastra Code workspace resolvers can now accept an isolated read-only skill extension:
77
+
78
+ ```ts
79
+ const workspace = await getDynamicWorkspace({
80
+ requestContext,
81
+ skillExtension: {
82
+ id: 'review-skills',
83
+ paths: ['/__review_skills__'],
84
+ createSource: fallback => new ReviewSkillSource(fallback),
85
+ },
86
+ });
87
+ ```
88
+
89
+ This lets SDK consumers compose additional read-only skill roots into selected workspaces without changing the default workspace skill set.
90
+
91
+ ### Patch Changes
92
+
93
+ - dependencies updates: ([#19611](https://github.com/mastra-ai/mastra/pull/19611))
94
+ - Updated dependency [`ai@^6.0.225` ↗︎](https://www.npmjs.com/package/ai/v/6.0.225) (from `^6.0.224`, in `dependencies`)
95
+ - Updated dependencies [[`ec857fc`](https://github.com/mastra-ai/mastra/commit/ec857fc79c264b53b38e16478c789b7177f2ad59), [`e1f2fae`](https://github.com/mastra-ai/mastra/commit/e1f2faebaf048c3d4c2e2c01d293767c195d5794), [`63aa799`](https://github.com/mastra-ai/mastra/commit/63aa799c6b44eacc7806cda6846b7c5bbee06b37), [`d2ff897`](https://github.com/mastra-ai/mastra/commit/d2ff8979d3069c6101108cdb7815792b0cc1c1b3), [`73db8db`](https://github.com/mastra-ai/mastra/commit/73db8db90d69ab6153c7942749f624db0d96952d), [`89da3cd`](https://github.com/mastra-ai/mastra/commit/89da3cd80c7c9936791ff0c31e244bcc41b0dd12), [`73db8db`](https://github.com/mastra-ai/mastra/commit/73db8db90d69ab6153c7942749f624db0d96952d), [`76b7181`](https://github.com/mastra-ai/mastra/commit/76b71810366e6d90b9d3973149d1c7ba3659ffb9), [`0c0e8d7`](https://github.com/mastra-ai/mastra/commit/0c0e8d7becd4d1445c656b78d5d845f606c1ff9d), [`9f7c67a`](https://github.com/mastra-ai/mastra/commit/9f7c67abeeb52c41c51a9b5edee60b62afe7cd8d), [`0c52047`](https://github.com/mastra-ai/mastra/commit/0c520470a4547666156b2f18eb794eb8bd2676c8), [`3b65e68`](https://github.com/mastra-ai/mastra/commit/3b65e68d7f1c771c7a70eea42d83fefdd28cad88), [`ec17152`](https://github.com/mastra-ai/mastra/commit/ec17152e7514b5fad37d6ed50f90a937b4bb87a2), [`e3868e2`](https://github.com/mastra-ai/mastra/commit/e3868e22babfffd0133771669ca724501c2dd58e)]:
96
+ - @mastra/core@1.52.0-alpha.5
97
+ - @mastra/tavily@1.1.1-alpha.0
98
+ - @mastra/libsql@1.16.1-alpha.0
99
+ - @mastra/memory@1.23.1-alpha.1
100
+ - @mastra/observability@1.16.2-alpha.0
101
+ - @mastra/mcp@1.15.0-alpha.0
102
+
3
103
  ## 0.2.0-alpha.4
4
104
 
5
105
  ### Patch Changes
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Per-tenant credential resolution seam for deployed (multi-user) servers.
3
+ *
4
+ * Locally, model resolution reads the server-global file-backed `AuthStorage`.
5
+ * A deployed web host registers a {@link CredentialStoreProvider} at boot; from
6
+ * then on `resolveModel` derives the calling tenant from the request context
7
+ * (the web auth gate stashes the authenticated user under the `user` key) and
8
+ * resolves credentials through the tenant's own store — user credentials over
9
+ * org credentials over server env vars, with OAuth refresh owned by the store.
10
+ *
11
+ * When no provider is registered (TUI, local web), everything falls through to
12
+ * the existing global behavior unchanged.
13
+ */
14
+ import type { RequestContext } from '@mastra/core/request-context';
15
+ import type { CredentialStore } from '../auth/types.js';
16
+ /** The identity a credential lookup is scoped to. */
17
+ export interface CredentialTenant {
18
+ /** Org tenant; absent for personal accounts (store impls may synthesize one). */
19
+ orgId?: string;
20
+ /** Stable user id from the web auth adapter. */
21
+ userId: string;
22
+ }
23
+ /**
24
+ * Returns a tenant-scoped {@link CredentialStore}, or `undefined` to fall back
25
+ * to the global store (e.g. tenant storage temporarily unavailable). Must be
26
+ * synchronous — implementations serve from a primed snapshot and do
27
+ * authoritative async work inside `getApiKey`.
28
+ */
29
+ export type CredentialStoreProvider = (tenant: CredentialTenant) => CredentialStore | undefined;
30
+ /** Register (or clear) the tenant credential store provider. Deployed-web only. */
31
+ export declare function setCredentialStoreProvider(provider: CredentialStoreProvider | undefined): void;
32
+ /**
33
+ * Whether a tenant provider is registered. Used to disable the
34
+ * `loadStoredApiKeysIntoEnv` side-channel in deployed mode — per-tenant
35
+ * credentials must never leak into process-global env vars.
36
+ */
37
+ export declare function hasCredentialStoreProvider(): boolean;
38
+ /**
39
+ * Derive the calling tenant from a request context, if an authenticated web
40
+ * user was stashed on it. Mirrors the web layer's stable-id resolution
41
+ * (`workosId` falling back to the provider `id`).
42
+ */
43
+ export declare function resolveTenantFromRequestContext(requestContext?: RequestContext): CredentialTenant | undefined;
44
+ /**
45
+ * Resolve the credential store for a request. Local mode returns `undefined`
46
+ * and keeps the global `AuthStorage` behavior. Once deployed web registers a
47
+ * provider, missing tenant identity or unavailable tenant storage fails closed
48
+ * through an empty store that also disables process-environment fallback.
49
+ */
50
+ export declare function resolveCredentialStore(requestContext?: RequestContext): CredentialStore | undefined;
51
+ //# sourceMappingURL=credential-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-resolver.d.ts","sourceRoot":"","sources":["../../src/agents/credential-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,eAAe,GAAG,SAAS,CAAC;AAkBhG,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,uBAAuB,GAAG,SAAS,GAAG,IAAI,CAE9F;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AASD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS,CAM7G;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,eAAe,GAAG,SAAS,CAKnG"}
@@ -0,0 +1,41 @@
1
+ let credentialStoreProvider;
2
+ const unavailableTenantCredentialStore = {
3
+ allowEnvironmentFallback: false,
4
+ reload() {
5
+ },
6
+ get() {
7
+ return void 0;
8
+ },
9
+ getStoredApiKey() {
10
+ return void 0;
11
+ },
12
+ async getApiKey() {
13
+ return void 0;
14
+ }
15
+ };
16
+ function setCredentialStoreProvider(provider) {
17
+ credentialStoreProvider = provider;
18
+ }
19
+ function hasCredentialStoreProvider() {
20
+ return credentialStoreProvider !== void 0;
21
+ }
22
+ function resolveTenantFromRequestContext(requestContext) {
23
+ const user = requestContext?.get("user");
24
+ if (!user || typeof user !== "object") return void 0;
25
+ const userId = user.workosId ?? user.id;
26
+ if (!userId) return void 0;
27
+ return { orgId: user.organizationId, userId };
28
+ }
29
+ function resolveCredentialStore(requestContext) {
30
+ if (!credentialStoreProvider) return void 0;
31
+ const tenant = resolveTenantFromRequestContext(requestContext);
32
+ if (!tenant) return unavailableTenantCredentialStore;
33
+ return credentialStoreProvider(tenant) ?? unavailableTenantCredentialStore;
34
+ }
35
+ export {
36
+ hasCredentialStoreProvider,
37
+ resolveCredentialStore,
38
+ resolveTenantFromRequestContext,
39
+ setCredentialStoreProvider
40
+ };
41
+ //# sourceMappingURL=credential-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/agents/credential-resolver.ts"],"sourcesContent":["/**\n * Per-tenant credential resolution seam for deployed (multi-user) servers.\n *\n * Locally, model resolution reads the server-global file-backed `AuthStorage`.\n * A deployed web host registers a {@link CredentialStoreProvider} at boot; from\n * then on `resolveModel` derives the calling tenant from the request context\n * (the web auth gate stashes the authenticated user under the `user` key) and\n * resolves credentials through the tenant's own store — user credentials over\n * org credentials over server env vars, with OAuth refresh owned by the store.\n *\n * When no provider is registered (TUI, local web), everything falls through to\n * the existing global behavior unchanged.\n */\n\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { CredentialStore } from '../auth/types.js';\n\n/** The identity a credential lookup is scoped to. */\nexport interface CredentialTenant {\n /** Org tenant; absent for personal accounts (store impls may synthesize one). */\n orgId?: string;\n /** Stable user id from the web auth adapter. */\n userId: string;\n}\n\n/**\n * Returns a tenant-scoped {@link CredentialStore}, or `undefined` to fall back\n * to the global store (e.g. tenant storage temporarily unavailable). Must be\n * synchronous — implementations serve from a primed snapshot and do\n * authoritative async work inside `getApiKey`.\n */\nexport type CredentialStoreProvider = (tenant: CredentialTenant) => CredentialStore | undefined;\n\nlet credentialStoreProvider: CredentialStoreProvider | undefined;\n\nconst unavailableTenantCredentialStore: CredentialStore = {\n allowEnvironmentFallback: false,\n reload() {},\n get() {\n return undefined;\n },\n getStoredApiKey() {\n return undefined;\n },\n async getApiKey() {\n return undefined;\n },\n};\n\n/** Register (or clear) the tenant credential store provider. Deployed-web only. */\nexport function setCredentialStoreProvider(provider: CredentialStoreProvider | undefined): void {\n credentialStoreProvider = provider;\n}\n\n/**\n * Whether a tenant provider is registered. Used to disable the\n * `loadStoredApiKeysIntoEnv` side-channel in deployed mode — per-tenant\n * credentials must never leak into process-global env vars.\n */\nexport function hasCredentialStoreProvider(): boolean {\n return credentialStoreProvider !== undefined;\n}\n\n/** Shape the web auth gate stashes on the request context under `user`. */\ninterface RequestContextUser {\n workosId?: string;\n id?: string;\n organizationId?: string;\n}\n\n/**\n * Derive the calling tenant from a request context, if an authenticated web\n * user was stashed on it. Mirrors the web layer's stable-id resolution\n * (`workosId` falling back to the provider `id`).\n */\nexport function resolveTenantFromRequestContext(requestContext?: RequestContext): CredentialTenant | undefined {\n const user = requestContext?.get('user') as RequestContextUser | undefined;\n if (!user || typeof user !== 'object') return undefined;\n const userId = user.workosId ?? user.id;\n if (!userId) return undefined;\n return { orgId: user.organizationId, userId };\n}\n\n/**\n * Resolve the credential store for a request. Local mode returns `undefined`\n * and keeps the global `AuthStorage` behavior. Once deployed web registers a\n * provider, missing tenant identity or unavailable tenant storage fails closed\n * through an empty store that also disables process-environment fallback.\n */\nexport function resolveCredentialStore(requestContext?: RequestContext): CredentialStore | undefined {\n if (!credentialStoreProvider) return undefined;\n const tenant = resolveTenantFromRequestContext(requestContext);\n if (!tenant) return unavailableTenantCredentialStore;\n return credentialStoreProvider(tenant) ?? unavailableTenantCredentialStore;\n}\n"],"mappings":"AAiCA,IAAI;AAEJ,MAAM,mCAAoD;AAAA,EACxD,0BAA0B;AAAA,EAC1B,SAAS;AAAA,EAAC;AAAA,EACV,MAAM;AACJ,WAAO;AAAA,EACT;AAAA,EACA,kBAAkB;AAChB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AACF;AAGO,SAAS,2BAA2B,UAAqD;AAC9F,4BAA0B;AAC5B;AAOO,SAAS,6BAAsC;AACpD,SAAO,4BAA4B;AACrC;AAcO,SAAS,gCAAgC,gBAA+D;AAC7G,QAAM,OAAO,gBAAgB,IAAI,MAAM;AACvC,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,SAAS,KAAK,YAAY,KAAK;AACrC,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,EAAE,OAAO,KAAK,gBAAgB,OAAO;AAC9C;AAQO,SAAS,uBAAuB,gBAA8D;AACnG,MAAI,CAAC,wBAAyB,QAAO;AACrC,QAAM,SAAS,gCAAgC,cAAc;AAC7D,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,wBAAwB,MAAM,KAAK;AAC5C;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/agents/instructions.ts"],"names":[],"mappings":"AAOA,wBAAsB,sBAAsB,CAAC,EAAE,cAAc,EAAE,EAAE;IAAE,cAAc,EAAE;QAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAA;CAAE,mBAiCjH"}
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/agents/instructions.ts"],"names":[],"mappings":"AAOA,wBAAsB,sBAAsB,CAAC,EAAE,cAAc,EAAE,EAAE;IAAE,cAAc,EAAE;QAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAA;CAAE,mBAgCjH"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agents/instructions.ts"],"sourcesContent":["import type { AgentControllerRequestContext } from '@mastra/core/agent-controller';\nimport type { MastraCodeComposedState } from '../schema.js';\nimport { detectCommonBinariesAsync } from '../utils/binaries.js';\nimport { getCurrentGitBranchAsync } from '../utils/project.js';\nimport type { PromptContext } from './prompts/index.js';\nimport { buildFullPrompt } from './prompts/index.js';\n\nexport async function getDynamicInstructions({ requestContext }: { requestContext: { get(key: string): unknown } }) {\n const agentControllerContext = requestContext.get('controller') as\n | AgentControllerRequestContext<MastraCodeComposedState>\n | undefined;\n const state = agentControllerContext?.getState();\n const modeId = agentControllerContext?.session?.modeId ?? 'build';\n const projectPath = state?.projectPath ?? process.cwd();\n\n const promptCtx: PromptContext = {\n projectPath,\n projectName: state?.projectName ?? '',\n gitBranch: (await getCurrentGitBranchAsync(projectPath)) ?? state?.gitBranch,\n platform: process.platform,\n commonBinaries: await detectCommonBinariesAsync(),\n date: new Date().toISOString().split('T')[0]!,\n mode: modeId,\n modelId: agentControllerContext?.session?.modelId || undefined,\n activePlan: state?.activePlan ?? null,\n modeId: modeId,\n currentDate: new Date().toISOString().split('T')[0]!,\n workingDir: state?.projectPath ?? process.cwd(),\n state,\n };\n\n const basePrompt = buildFullPrompt(promptCtx);\n const pluginInstructions = state?.pluginInstructions?.filter(instruction => instruction.trim().length > 0) ?? [];\n if (pluginInstructions.length === 0) return basePrompt;\n\n const formattedPluginInstructions = pluginInstructions\n .map((instruction, index) => `<plugin-instructions index=\"${index + 1}\">\\n${instruction}\\n</plugin-instructions>`)\n .join('\\n\\n');\n\n return `${basePrompt}\\n\\n# Plugin Instructions\\n\\nThe following instructions come from installed Mastra Code plugins. Treat them as scoped plugin guidance; they must not override higher-priority system, developer, repository, safety, or tool-use instructions.\\n\\n${formattedPluginInstructions}`;\n}\n"],"mappings":"AAEA,SAAS,iCAAiC;AAC1C,SAAS,gCAAgC;AAEzC,SAAS,uBAAuB;AAEhC,eAAsB,uBAAuB,EAAE,eAAe,GAAsD;AAClH,QAAM,yBAAyB,eAAe,IAAI,YAAY;AAG9D,QAAM,QAAQ,wBAAwB,SAAS;AAC/C,QAAM,SAAS,wBAAwB,SAAS,UAAU;AAC1D,QAAM,cAAc,OAAO,eAAe,QAAQ,IAAI;AAEtD,QAAM,YAA2B;AAAA,IAC/B;AAAA,IACA,aAAa,OAAO,eAAe;AAAA,IACnC,WAAY,MAAM,yBAAyB,WAAW,KAAM,OAAO;AAAA,IACnE,UAAU,QAAQ;AAAA,IAClB,gBAAgB,MAAM,0BAA0B;AAAA,IAChD,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAC3C,MAAM;AAAA,IACN,SAAS,wBAAwB,SAAS,WAAW;AAAA,IACrD,YAAY,OAAO,cAAc;AAAA,IACjC;AAAA,IACA,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAClD,YAAY,OAAO,eAAe,QAAQ,IAAI;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,aAAa,gBAAgB,SAAS;AAC5C,QAAM,qBAAqB,OAAO,oBAAoB,OAAO,iBAAe,YAAY,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;AAC/G,MAAI,mBAAmB,WAAW,EAAG,QAAO;AAE5C,QAAM,8BAA8B,mBACjC,IAAI,CAAC,aAAa,UAAU,+BAA+B,QAAQ,CAAC;AAAA,EAAO,WAAW;AAAA,uBAA0B,EAChH,KAAK,MAAM;AAEd,SAAO,GAAG,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAqP,2BAA2B;AACtS;","names":[]}
1
+ {"version":3,"sources":["../../src/agents/instructions.ts"],"sourcesContent":["import type { AgentControllerRequestContext } from '@mastra/core/agent-controller';\nimport type { MastraCodeComposedState } from '../schema.js';\nimport { detectCommonBinariesAsync } from '../utils/binaries.js';\nimport { getCurrentGitBranchAsync } from '../utils/project.js';\nimport type { PromptContext } from './prompts/index.js';\nimport { buildFullPrompt } from './prompts/index.js';\n\nexport async function getDynamicInstructions({ requestContext }: { requestContext: { get(key: string): unknown } }) {\n const agentControllerContext = requestContext.get('controller') as\n AgentControllerRequestContext<MastraCodeComposedState> | undefined;\n const state = agentControllerContext?.getState();\n const modeId = agentControllerContext?.session?.modeId ?? 'build';\n const projectPath = state?.projectPath ?? process.cwd();\n\n const promptCtx: PromptContext = {\n projectPath,\n projectName: state?.projectName ?? '',\n gitBranch: (await getCurrentGitBranchAsync(projectPath)) ?? state?.gitBranch,\n platform: process.platform,\n commonBinaries: await detectCommonBinariesAsync(),\n date: new Date().toISOString().split('T')[0]!,\n mode: modeId,\n modelId: agentControllerContext?.session?.modelId || undefined,\n activePlan: state?.activePlan ?? null,\n modeId: modeId,\n currentDate: new Date().toISOString().split('T')[0]!,\n workingDir: state?.projectPath ?? process.cwd(),\n state,\n };\n\n const basePrompt = buildFullPrompt(promptCtx);\n const pluginInstructions = state?.pluginInstructions?.filter(instruction => instruction.trim().length > 0) ?? [];\n if (pluginInstructions.length === 0) return basePrompt;\n\n const formattedPluginInstructions = pluginInstructions\n .map((instruction, index) => `<plugin-instructions index=\"${index + 1}\">\\n${instruction}\\n</plugin-instructions>`)\n .join('\\n\\n');\n\n return `${basePrompt}\\n\\n# Plugin Instructions\\n\\nThe following instructions come from installed Mastra Code plugins. Treat them as scoped plugin guidance; they must not override higher-priority system, developer, repository, safety, or tool-use instructions.\\n\\n${formattedPluginInstructions}`;\n}\n"],"mappings":"AAEA,SAAS,iCAAiC;AAC1C,SAAS,gCAAgC;AAEzC,SAAS,uBAAuB;AAEhC,eAAsB,uBAAuB,EAAE,eAAe,GAAsD;AAClH,QAAM,yBAAyB,eAAe,IAAI,YAAY;AAE9D,QAAM,QAAQ,wBAAwB,SAAS;AAC/C,QAAM,SAAS,wBAAwB,SAAS,UAAU;AAC1D,QAAM,cAAc,OAAO,eAAe,QAAQ,IAAI;AAEtD,QAAM,YAA2B;AAAA,IAC/B;AAAA,IACA,aAAa,OAAO,eAAe;AAAA,IACnC,WAAY,MAAM,yBAAyB,WAAW,KAAM,OAAO;AAAA,IACnE,UAAU,QAAQ;AAAA,IAClB,gBAAgB,MAAM,0BAA0B;AAAA,IAChD,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAC3C,MAAM;AAAA,IACN,SAAS,wBAAwB,SAAS,WAAW;AAAA,IACrD,YAAY,OAAO,cAAc;AAAA,IACjC;AAAA,IACA,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAClD,YAAY,OAAO,eAAe,QAAQ,IAAI;AAAA,IAC9C;AAAA,EACF;AAEA,QAAM,aAAa,gBAAgB,SAAS;AAC5C,QAAM,qBAAqB,OAAO,oBAAoB,OAAO,iBAAe,YAAY,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;AAC/G,MAAI,mBAAmB,WAAW,EAAG,QAAO;AAE5C,QAAM,8BAA8B,mBACjC,IAAI,CAAC,aAAa,UAAU,+BAA+B,QAAQ,CAAC;AAAA,EAAO,WAAW;AAAA,uBAA0B,EAChH,KAAK,MAAM;AAEd,SAAO,GAAG,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAqP,2BAA2B;AACtS;","names":[]}
@@ -1,6 +1,7 @@
1
1
  import type { CustomModelCatalogProvider } from '@mastra/core/agent-controller';
2
2
  import { MastraModelGateway } from '@mastra/core/llm';
3
3
  import type { GatewayAuthRequest, GatewayAuthResult, GatewayLanguageModel, MastraModelGatewayInterface, ProviderConfig } from '@mastra/core/llm';
4
+ import type { CredentialStore } from '../auth/types.js';
4
5
  import type { ThinkingLevel } from '../providers/openai-codex.js';
5
6
  export declare const OPENAI_PREFIX = "openai/";
6
7
  export declare const MASTRA_GATEWAY_PREFIX = "mastra/";
@@ -18,6 +19,12 @@ export type MastraCodeGatewayOptions = {
18
19
  thinkingLevel?: ThinkingLevel;
19
20
  customProviders?: MastraCodeCustomProvider[];
20
21
  settingsPath?: string;
22
+ /**
23
+ * Per-tenant credential source for this gateway instance. Defaults to the
24
+ * server-global file-backed `AuthStorage`; deployed web passes the calling
25
+ * tenant's store so model calls use the caller's own credentials.
26
+ */
27
+ credentialStore?: CredentialStore;
21
28
  };
22
29
  export declare function reloadAuthStorage(): void;
23
30
  export declare function stripMastraGatewayPrefix(modelId: string): string;
@@ -26,18 +33,18 @@ export declare function remapOpenAIModelForCodexOAuth(modelId: string): string;
26
33
  * Resolve the Anthropic API key.
27
34
  * Main slot → dedicated apikey: slot → env var.
28
35
  */
29
- export declare function getAnthropicApiKey(): string | undefined;
36
+ export declare function getAnthropicApiKey(credentials?: CredentialStore): string | undefined;
30
37
  /**
31
38
  * Resolve the OpenAI API key.
32
39
  * Main slot → dedicated apikey: slot → env var.
33
40
  */
34
- export declare function getOpenAIApiKey(): string | undefined;
41
+ export declare function getOpenAIApiKey(credentials?: CredentialStore): string | undefined;
35
42
  export declare function resolveAuth(request: GatewayAuthRequest, mastraGatewayApiKey?: string): GatewayAuthResult | undefined;
36
43
  export declare class MastraCodeGateway extends MastraModelGateway {
37
44
  #private;
38
45
  readonly id = "mastracode";
39
46
  readonly name = "MastraCode Gateway";
40
- constructor({ mastraGatewayBaseUrl, mastraGatewayApiKey, routeThroughMastraGateway, thinkingLevel, customProviders, settingsPath, }: MastraCodeGatewayOptions);
47
+ constructor({ mastraGatewayBaseUrl, mastraGatewayApiKey, routeThroughMastraGateway, thinkingLevel, customProviders, settingsPath, credentialStore, }: MastraCodeGatewayOptions);
41
48
  static getMastraGatewayApiKey(): string | undefined;
42
49
  /** @deprecated Renamed to {@link MastraCodeGateway.getMastraGatewayApiKey}. */
43
50
  static getMemoryGatewayApiKey(): string | undefined;
@@ -48,7 +55,7 @@ export declare class MastraCodeGateway extends MastraModelGateway {
48
55
  * bar and `/api-keys` reflect OAuth logins instead of only checking env vars.
49
56
  */
50
57
  handlesModel(modelId: string): boolean;
51
- static resolveProviderAuth(request: GatewayAuthRequest, mastraGatewayApiKey?: string): GatewayAuthResult | undefined;
58
+ static resolveProviderAuth(request: GatewayAuthRequest, mastraGatewayApiKey?: string, credentials?: CredentialStore): GatewayAuthResult | undefined;
52
59
  static createModelCatalogProvider(gateway: MastraModelGatewayInterface): CustomModelCatalogProvider;
53
60
  createModelCatalogProvider(): CustomModelCatalogProvider;
54
61
  fetchProviders(): Promise<Record<string, ProviderConfig>>;
@@ -1 +1 @@
1
- {"version":3,"file":"mastracode-gateway.d.ts","sourceRoot":"","sources":["../../src/agents/mastracode-gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mastracode-gateway.d.ts","sourceRoot":"","sources":["../../src/agents/mastracode-gateway.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ import {
25
25
  openaiCodexProvider,
26
26
  THINKING_LEVEL_TO_REASONING_EFFORT
27
27
  } from "../providers/openai-codex.js";
28
+ import { xaiProvider } from "../providers/xai.js";
28
29
  const OPENAI_PREFIX = "openai/";
29
30
  const MASTRA_GATEWAY_PREFIX = "mastra/";
30
31
  const MASTRACODE_GATEWAY_ID = "mastracode";
@@ -61,23 +62,23 @@ function remapOpenAIModelForCodexOAuth(modelId) {
61
62
  const remappedModelId = `${OPENAI_PREFIX}${codexModelId}`;
62
63
  return modelId.startsWith(MASTRA_GATEWAY_PREFIX) ? `${MASTRA_GATEWAY_PREFIX}${remappedModelId}` : remappedModelId;
63
64
  }
64
- function getAnthropicApiKey() {
65
- const storedCred = authStorage.get("anthropic");
65
+ function getAnthropicApiKey(credentials = authStorage) {
66
+ const storedCred = credentials.get("anthropic");
66
67
  if (storedCred?.type === "api_key" && storedCred.key.trim().length > 0) {
67
68
  return storedCred.key.trim();
68
69
  }
69
- const dedicatedKey = authStorage.getStoredApiKey("anthropic")?.trim();
70
+ const dedicatedKey = credentials.getStoredApiKey("anthropic")?.trim();
70
71
  if (dedicatedKey) return dedicatedKey;
71
- return process.env.ANTHROPIC_API_KEY?.trim() || void 0;
72
+ return credentials.allowEnvironmentFallback === false ? void 0 : process.env.ANTHROPIC_API_KEY?.trim() || void 0;
72
73
  }
73
- function getOpenAIApiKey() {
74
- const storedCred = authStorage.get("openai-codex");
74
+ function getOpenAIApiKey(credentials = authStorage) {
75
+ const storedCred = credentials.get("openai-codex");
75
76
  if (storedCred?.type === "api_key" && storedCred.key.trim().length > 0) {
76
77
  return storedCred.key.trim();
77
78
  }
78
- const dedicatedKey = authStorage.getStoredApiKey("openai-codex")?.trim();
79
+ const dedicatedKey = credentials.getStoredApiKey("openai-codex")?.trim();
79
80
  if (dedicatedKey) return dedicatedKey;
80
- return process.env.OPENAI_API_KEY?.trim() || void 0;
81
+ return credentials.allowEnvironmentFallback === false ? void 0 : process.env.OPENAI_API_KEY?.trim() || void 0;
81
82
  }
82
83
  function anthropicApiKeyProvider(modelId, apiKey, headers) {
83
84
  const anthropic = createAnthropic({ apiKey, headers });
@@ -96,13 +97,13 @@ function openaiApiKeyProvider(modelId, apiKey, headers) {
96
97
  function getAuthProviderId(providerId) {
97
98
  return providerId === "openai" ? "openai-codex" : providerId;
98
99
  }
99
- function getProviderAuthKey(providerId) {
100
+ function getProviderAuthKey(providerId, credentials = authStorage) {
100
101
  const authProviderId = getAuthProviderId(providerId);
101
- const storedCred = authStorage.get(authProviderId);
102
+ const storedCred = credentials.get(authProviderId);
102
103
  if (storedCred?.type === "api_key" && storedCred.key.trim().length > 0) {
103
104
  return storedCred.key.trim();
104
105
  }
105
- return authStorage.getStoredApiKey(authProviderId)?.trim() || void 0;
106
+ return credentials.getStoredApiKey(authProviderId)?.trim() || void 0;
106
107
  }
107
108
  function resolveAuth(request, mastraGatewayApiKey) {
108
109
  return MastraCodeGateway.resolveProviderAuth(request, mastraGatewayApiKey);
@@ -176,13 +177,15 @@ class MastraCodeGateway extends MastraModelGateway {
176
177
  #thinkingLevel;
177
178
  #customProviders;
178
179
  #settingsPath;
180
+ #credentials;
179
181
  constructor({
180
182
  mastraGatewayBaseUrl,
181
183
  mastraGatewayApiKey,
182
184
  routeThroughMastraGateway,
183
185
  thinkingLevel,
184
186
  customProviders,
185
- settingsPath
187
+ settingsPath,
188
+ credentialStore
186
189
  }) {
187
190
  super();
188
191
  this.#mastraGateway = new MastraGateway({ baseUrl: mastraGatewayBaseUrl });
@@ -192,6 +195,7 @@ class MastraCodeGateway extends MastraModelGateway {
192
195
  this.#thinkingLevel = thinkingLevel;
193
196
  this.#customProviders = customProviders;
194
197
  this.#settingsPath = settingsPath;
198
+ this.#credentials = credentialStore ?? authStorage;
195
199
  }
196
200
  static getMastraGatewayApiKey() {
197
201
  return authStorage.getStoredApiKey(MASTRA_GATEWAY_PROVIDER) ?? process.env["MASTRA_GATEWAY_API_KEY"];
@@ -223,15 +227,15 @@ class MastraCodeGateway extends MastraModelGateway {
223
227
  })
224
228
  );
225
229
  }
226
- static resolveProviderAuth(request, mastraGatewayApiKey) {
230
+ static resolveProviderAuth(request, mastraGatewayApiKey, credentials = authStorage) {
227
231
  if (request.gatewayId === "mastra" && mastraGatewayApiKey) {
228
232
  return { apiKey: mastraGatewayApiKey, source: "gateway" };
229
233
  }
230
- const storedCred = authStorage.get(getAuthProviderId(request.providerId));
234
+ const storedCred = credentials.get(getAuthProviderId(request.providerId));
231
235
  if (storedCred?.type === "oauth") {
232
236
  return { bearerToken: "oauth", source: "gateway" };
233
237
  }
234
- const apiKey = getProviderAuthKey(request.providerId);
238
+ const apiKey = getProviderAuthKey(request.providerId, credentials);
235
239
  return apiKey ? { apiKey, source: "gateway" } : void 0;
236
240
  }
237
241
  static createModelCatalogProvider(gateway) {
@@ -298,7 +302,7 @@ class MastraCodeGateway extends MastraModelGateway {
298
302
  async getApiKey(modelId) {
299
303
  const providerId = stripMastraGatewayPrefix(modelId).split("/", 1)[0];
300
304
  if (this.#routeThroughMastraGateway) return this.#mastraGatewayApiKey ?? "";
301
- return providerId ? getProviderAuthKey(providerId) ?? "" : "";
305
+ return providerId ? getProviderAuthKey(providerId, this.#credentials) ?? "" : "";
302
306
  }
303
307
  resolveAuth(request) {
304
308
  if (this.#routeThroughMastraGateway && this.#mastraGatewayApiKey) {
@@ -310,7 +314,7 @@ class MastraCodeGateway extends MastraModelGateway {
310
314
  if (customProvider?.apiKey) {
311
315
  return { apiKey: customProvider.apiKey, source: "gateway" };
312
316
  }
313
- return MastraCodeGateway.resolveProviderAuth(request);
317
+ return MastraCodeGateway.resolveProviderAuth(request, void 0, this.#credentials);
314
318
  }
315
319
  resolveLanguageModel(args) {
316
320
  const customProvider = this.#getCustomProviders().find(
@@ -326,14 +330,18 @@ class MastraCodeGateway extends MastraModelGateway {
326
330
  return provider.chatModel(args.modelId);
327
331
  }
328
332
  if (args.providerId === "github-copilot") {
329
- return githubCopilotProvider(args.modelId, { headers: args.headers });
333
+ return githubCopilotProvider(args.modelId, {
334
+ headers: args.headers,
335
+ authStorage: this.#credentials
336
+ });
330
337
  }
331
338
  if (args.providerId === "moonshotai") {
332
- if (!process.env.MOONSHOT_AI_API_KEY) {
333
- throw new Error(`Need MOONSHOT_AI_API_KEY`);
339
+ const apiKey = args.apiKey?.trim() || process.env.MOONSHOT_API_KEY?.trim() || process.env.MOONSHOT_AI_API_KEY?.trim();
340
+ if (!apiKey) {
341
+ throw new Error("Need MOONSHOT_API_KEY");
334
342
  }
335
343
  return createAnthropic({
336
- apiKey: process.env.MOONSHOT_AI_API_KEY,
344
+ apiKey,
337
345
  baseURL: "https://api.moonshot.ai/anthropic/v1",
338
346
  name: "moonshotai.anthropicv1",
339
347
  headers: args.headers
@@ -346,6 +354,12 @@ class MastraCodeGateway extends MastraModelGateway {
346
354
  const openaiModel = this.#resolveOpenAIModel(args);
347
355
  if (openaiModel) return openaiModel;
348
356
  }
357
+ if (args.providerId === "xai" && this.#credentials.get("xai")?.type === "oauth") {
358
+ return xaiProvider(args.modelId, {
359
+ headers: args.headers,
360
+ authStorage: this.#credentials
361
+ });
362
+ }
349
363
  if (this.#routeThroughMastraGateway) {
350
364
  return this.#mastraGateway.resolveLanguageModel(args);
351
365
  }
@@ -356,7 +370,7 @@ class MastraCodeGateway extends MastraModelGateway {
356
370
  }
357
371
  #resolveAnthropicModel(args) {
358
372
  const bareModelId = normalizeAnthropicModelId(args.modelId);
359
- const storedCred = authStorage.get("anthropic");
373
+ const storedCred = this.#credentials.get("anthropic");
360
374
  if (this.#routeThroughMastraGateway) {
361
375
  if (storedCred?.type === "oauth") {
362
376
  const anthropic = createAnthropic({
@@ -366,7 +380,7 @@ class MastraCodeGateway extends MastraModelGateway {
366
380
  [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,
367
381
  ...args.headers
368
382
  },
369
- fetch: buildAnthropicOAuthFetch({ authStorage })
383
+ fetch: buildAnthropicOAuthFetch({ authStorage: this.#credentials })
370
384
  });
371
385
  return wrapLanguageModel({
372
386
  model: anthropic(bareModelId),
@@ -376,7 +390,10 @@ class MastraCodeGateway extends MastraModelGateway {
376
390
  return this.#mastraGateway.resolveLanguageModel({ ...args, modelId: bareModelId });
377
391
  }
378
392
  if (storedCred?.type === "oauth") {
379
- return opencodeClaudeMaxProvider(bareModelId, { headers: args.headers });
393
+ return opencodeClaudeMaxProvider(bareModelId, {
394
+ headers: args.headers,
395
+ authStorage: this.#credentials
396
+ });
380
397
  }
381
398
  if (storedCred?.type === "api_key" && storedCred.key.trim().length > 0) {
382
399
  return anthropicApiKeyProvider(
@@ -385,14 +402,17 @@ class MastraCodeGateway extends MastraModelGateway {
385
402
  args.headers
386
403
  );
387
404
  }
388
- const apiKey = getAnthropicApiKey();
405
+ const apiKey = getAnthropicApiKey(this.#credentials);
389
406
  if (apiKey) {
390
407
  return anthropicApiKeyProvider(bareModelId, apiKey, args.headers);
391
408
  }
392
- return opencodeClaudeMaxProvider(bareModelId, { headers: args.headers });
409
+ return opencodeClaudeMaxProvider(bareModelId, {
410
+ headers: args.headers,
411
+ authStorage: this.#credentials
412
+ });
393
413
  }
394
414
  #resolveOpenAIModel(args) {
395
- const storedCred = authStorage.get("openai-codex");
415
+ const storedCred = this.#credentials.get("openai-codex");
396
416
  if (this.#routeThroughMastraGateway) {
397
417
  if (storedCred?.type === "oauth") {
398
418
  const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);
@@ -408,7 +428,7 @@ class MastraCodeGateway extends MastraModelGateway {
408
428
  [GATEWAY_AUTH_HEADER]: `Bearer ${args.apiKey}`,
409
429
  ...args.headers
410
430
  },
411
- fetch: buildOpenAICodexOAuthFetch({ authStorage, rewriteUrl: false })
431
+ fetch: buildOpenAICodexOAuthFetch({ authStorage: this.#credentials, rewriteUrl: false })
412
432
  });
413
433
  return wrapLanguageModel({
414
434
  model: openai.responses(resolvedBareModelId),
@@ -421,10 +441,11 @@ class MastraCodeGateway extends MastraModelGateway {
421
441
  const resolvedModelId = remapOpenAIModelForCodexOAuth(`openai/${args.modelId}`);
422
442
  return openaiCodexProvider(resolvedModelId.substring(OPENAI_PREFIX.length), {
423
443
  thinkingLevel: this.#thinkingLevel,
424
- headers: args.headers
444
+ headers: args.headers,
445
+ authStorage: this.#credentials
425
446
  });
426
447
  }
427
- const apiKey = getOpenAIApiKey();
448
+ const apiKey = getOpenAIApiKey(this.#credentials);
428
449
  if (apiKey) {
429
450
  return openaiApiKeyProvider(args.modelId, apiKey, args.headers);
430
451
  }