@mastra/code-sdk 0.2.0-alpha.3 → 0.2.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +102 -0
- package/dist/agents/credential-resolver.d.ts +51 -0
- package/dist/agents/credential-resolver.d.ts.map +1 -0
- package/dist/agents/credential-resolver.js +41 -0
- package/dist/agents/credential-resolver.js.map +1 -0
- package/dist/agents/instructions.d.ts.map +1 -1
- package/dist/agents/instructions.js.map +1 -1
- package/dist/agents/mastracode-gateway.d.ts +11 -4
- package/dist/agents/mastracode-gateway.d.ts.map +1 -1
- package/dist/agents/mastracode-gateway.js +51 -30
- package/dist/agents/mastracode-gateway.js.map +1 -1
- package/dist/agents/model.d.ts +2 -0
- package/dist/agents/model.d.ts.map +1 -1
- package/dist/agents/model.js +13 -2
- package/dist/agents/model.js.map +1 -1
- package/dist/agents/workspace.d.ts +11 -1
- package/dist/agents/workspace.d.ts.map +1 -1
- package/dist/agents/workspace.js +31 -13
- package/dist/agents/workspace.js.map +1 -1
- package/dist/auth/authorization-input.d.ts +16 -0
- package/dist/auth/authorization-input.d.ts.map +1 -0
- package/dist/auth/authorization-input.js +28 -0
- package/dist/auth/authorization-input.js.map +1 -0
- package/dist/auth/device-code.d.ts +93 -0
- package/dist/auth/device-code.d.ts.map +1 -0
- package/dist/auth/device-code.js +97 -0
- package/dist/auth/device-code.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/providers/anthropic.d.ts +24 -1
- package/dist/auth/providers/anthropic.d.ts.map +1 -1
- package/dist/auth/providers/anthropic.js +21 -8
- package/dist/auth/providers/anthropic.js.map +1 -1
- package/dist/auth/providers/github-copilot.d.ts +54 -0
- package/dist/auth/providers/github-copilot.d.ts.map +1 -1
- package/dist/auth/providers/github-copilot.js +88 -61
- package/dist/auth/providers/github-copilot.js.map +1 -1
- package/dist/auth/providers/openai-codex.d.ts +44 -0
- package/dist/auth/providers/openai-codex.d.ts.map +1 -1
- package/dist/auth/providers/openai-codex.js +79 -69
- package/dist/auth/providers/openai-codex.js.map +1 -1
- package/dist/auth/providers/xai.d.ts +64 -0
- package/dist/auth/providers/xai.d.ts.map +1 -0
- package/dist/auth/providers/xai.js +171 -0
- package/dist/auth/providers/xai.js.map +1 -0
- package/dist/auth/storage.d.ts.map +1 -1
- package/dist/auth/storage.js +5 -2
- package/dist/auth/storage.js.map +1 -1
- package/dist/auth/types.d.ts +21 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/hooks/types.js.map +1 -1
- package/dist/index.d.ts +12 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -35
- package/dist/index.js.map +1 -1
- package/dist/providers/amazon-bedrock-gateway.d.ts +7 -0
- package/dist/providers/amazon-bedrock-gateway.d.ts.map +1 -1
- package/dist/providers/amazon-bedrock-gateway.js +66 -2
- package/dist/providers/amazon-bedrock-gateway.js.map +1 -1
- package/dist/providers/claude-max.d.ts +3 -1
- package/dist/providers/claude-max.d.ts.map +1 -1
- package/dist/providers/claude-max.js +1 -1
- package/dist/providers/claude-max.js.map +1 -1
- package/dist/providers/github-copilot.d.ts +3 -1
- package/dist/providers/github-copilot.d.ts.map +1 -1
- package/dist/providers/github-copilot.js +1 -1
- package/dist/providers/github-copilot.js.map +1 -1
- package/dist/providers/openai-codex.d.ts +3 -1
- package/dist/providers/openai-codex.d.ts.map +1 -1
- package/dist/providers/openai-codex.js +1 -1
- package/dist/providers/openai-codex.js.map +1 -1
- package/dist/providers/xai.d.ts +33 -0
- package/dist/providers/xai.d.ts.map +1 -0
- package/dist/providers/xai.js +63 -0
- package/dist/providers/xai.js.map +1 -0
- package/dist/tools/request-sandbox-access.d.ts.map +1 -1
- package/dist/tools/request-sandbox-access.js.map +1 -1
- package/dist/utils/update-check.d.ts +51 -2
- package/dist/utils/update-check.d.ts.map +1 -1
- package/dist/utils/update-check.js +131 -7
- package/dist/utils/update-check.js.map +1 -1
- package/package.json +12 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,107 @@
|
|
|
1
1
|
# @mastra/code-sdk
|
|
2
2
|
|
|
3
|
+
## 0.2.0-alpha.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 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)]:
|
|
8
|
+
- @mastra/core@1.52.0-alpha.8
|
|
9
|
+
- @mastra/pg@1.17.0-alpha.1
|
|
10
|
+
- @mastra/libsql@1.17.0-alpha.1
|
|
11
|
+
|
|
12
|
+
## 0.2.0-alpha.7
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- Fixed Mastra Code retries for EPIPE and closed provider connections. (#19691) ([#19692](https://github.com/mastra-ai/mastra/pull/19692))
|
|
17
|
+
|
|
18
|
+
- Fixed Amazon Bedrock prompt caching for long Mastra Code conversations. ([#19690](https://github.com/mastra-ai/mastra/pull/19690))
|
|
19
|
+
|
|
20
|
+
- 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)]:
|
|
21
|
+
- @mastra/core@1.52.0-alpha.7
|
|
22
|
+
|
|
23
|
+
## 0.2.0-alpha.6
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- 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))
|
|
28
|
+
|
|
29
|
+
- 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)]:
|
|
30
|
+
- @mastra/core@1.52.0-alpha.6
|
|
31
|
+
|
|
32
|
+
## 0.2.0-alpha.5
|
|
33
|
+
|
|
34
|
+
### Minor Changes
|
|
35
|
+
|
|
36
|
+
- 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))
|
|
37
|
+
|
|
38
|
+
**Before**
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
await createMastraCode({ storage: { backend: 'pg', connectionString } });
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**After**
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
const storage = new PostgresStore({ id: 'code-storage', connectionString });
|
|
48
|
+
const vector = new PgVector({ id: 'code-vectors', connectionString });
|
|
49
|
+
await createMastraCode({ storage, vector });
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- 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))
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
import { startAnthropicLogin } from '@mastra/code-sdk/auth/providers/anthropic';
|
|
56
|
+
|
|
57
|
+
const { url, verifier } = await startAnthropicLogin();
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
- Added access to the workspace resolved for an AgentController session. ([#19547](https://github.com/mastra-ai/mastra/pull/19547))
|
|
61
|
+
|
|
62
|
+
Use the session-owned workspace when an operation must remain isolated to that session:
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
const session = await controller.createSession({ resourceId, scope });
|
|
66
|
+
const workspace = session.getWorkspace();
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Mastra Code workspace resolvers can now accept an isolated read-only skill extension:
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
const workspace = await getDynamicWorkspace({
|
|
73
|
+
requestContext,
|
|
74
|
+
skillExtension: {
|
|
75
|
+
id: 'review-skills',
|
|
76
|
+
paths: ['/__review_skills__'],
|
|
77
|
+
createSource: fallback => new ReviewSkillSource(fallback),
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
This lets SDK consumers compose additional read-only skill roots into selected workspaces without changing the default workspace skill set.
|
|
83
|
+
|
|
84
|
+
### Patch Changes
|
|
85
|
+
|
|
86
|
+
- dependencies updates: ([#19611](https://github.com/mastra-ai/mastra/pull/19611))
|
|
87
|
+
- Updated dependency [`ai@^6.0.225` ↗︎](https://www.npmjs.com/package/ai/v/6.0.225) (from `^6.0.224`, in `dependencies`)
|
|
88
|
+
- 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)]:
|
|
89
|
+
- @mastra/core@1.52.0-alpha.5
|
|
90
|
+
- @mastra/tavily@1.1.1-alpha.0
|
|
91
|
+
- @mastra/libsql@1.16.1-alpha.0
|
|
92
|
+
- @mastra/memory@1.23.1-alpha.1
|
|
93
|
+
- @mastra/observability@1.16.2-alpha.0
|
|
94
|
+
- @mastra/mcp@1.15.0-alpha.0
|
|
95
|
+
|
|
96
|
+
## 0.2.0-alpha.4
|
|
97
|
+
|
|
98
|
+
### Patch Changes
|
|
99
|
+
|
|
100
|
+
- Added on-disk verification to the update utilities: `runUpdate` now returns the package manager's stderr, and the new `performUpdate` locates the running install, delegates the update to the tool that owns it (for example vite-plus), verifies the on-disk version when available, and reports when a readable installed version remains unchanged. ([#18792](https://github.com/mastra-ai/mastra/pull/18792))
|
|
101
|
+
|
|
102
|
+
- Updated dependencies [[`4cfdd64`](https://github.com/mastra-ai/mastra/commit/4cfdd645794feaea0c4ea711e70ecdfbef0c5b8e)]:
|
|
103
|
+
- @mastra/core@1.52.0-alpha.4
|
|
104
|
+
|
|
3
105
|
## 0.2.0-alpha.3
|
|
4
106
|
|
|
5
107
|
### 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,
|
|
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
|
|
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":"AAGA,OAAO,KAAK,EAAwB,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AACtG,OAAO,EAGL,kBAAkB,EAGnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,2BAA2B,EAC3B,cAAc,EACf,MAAM,kBAAkB,CAAC;
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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, {
|
|
333
|
+
return githubCopilotProvider(args.modelId, {
|
|
334
|
+
headers: args.headers,
|
|
335
|
+
authStorage: this.#credentials
|
|
336
|
+
});
|
|
330
337
|
}
|
|
331
338
|
if (args.providerId === "moonshotai") {
|
|
332
|
-
|
|
333
|
-
|
|
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
|
|
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 =
|
|
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, {
|
|
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, {
|
|
409
|
+
return opencodeClaudeMaxProvider(bareModelId, {
|
|
410
|
+
headers: args.headers,
|
|
411
|
+
authStorage: this.#credentials
|
|
412
|
+
});
|
|
393
413
|
}
|
|
394
414
|
#resolveOpenAIModel(args) {
|
|
395
|
-
const storedCred =
|
|
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
|
}
|