@mastra/code-sdk 1.2.0-alpha.6 → 1.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 +20 -0
- package/dist/agents/credential-resolver.d.ts +6 -0
- package/dist/agents/credential-resolver.d.ts.map +1 -1
- package/dist/agents/credential-resolver.js +14 -4
- package/dist/agents/credential-resolver.js.map +1 -1
- package/dist/onboarding/settings.d.ts +42 -5
- package/dist/onboarding/settings.d.ts.map +1 -1
- package/dist/onboarding/settings.js +68 -10
- package/dist/onboarding/settings.js.map +1 -1
- package/dist/schema.d.ts +3 -3
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -2
- package/dist/schema.js.map +1 -1
- package/package.json +10 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @mastra/code-sdk
|
|
2
2
|
|
|
3
|
+
## 1.2.0-alpha.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`7fb580a`](https://github.com/mastra-ai/mastra/commit/7fb580ac73fbcacf2ff00872a3395f73ae1b9fa5), [`333785c`](https://github.com/mastra-ai/mastra/commit/333785c93cbb01e42c60167e995457c28897ddbf), [`2eabc09`](https://github.com/mastra-ai/mastra/commit/2eabc097d86d52fbd0123da36a7c874154cc384f), [`83fa004`](https://github.com/mastra-ai/mastra/commit/83fa0044bfda8b703a83883dbd8bef204844d13f)]:
|
|
8
|
+
- @mastra/core@1.58.0-alpha.7
|
|
9
|
+
|
|
10
|
+
## 1.2.0-alpha.7
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- Persist the browser viewport as a preset name, a `{ width, height }` size, or `'window'` in settings, and drop unusable stored values back to the default rather than passing them to the browser. ([#21010](https://github.com/mastra-ai/mastra/pull/21010))
|
|
15
|
+
|
|
16
|
+
- Fixed tenant credential resolution for session-based authentication providers. Background Factory runs now resolve the authenticated user and active organization from session-wrapped request context values instead of falling back to an empty credential store. ([#21008](https://github.com/mastra-ai/mastra/pull/21008))
|
|
17
|
+
|
|
18
|
+
- Updated dependencies [[`f59032a`](https://github.com/mastra-ai/mastra/commit/f59032a73699443555a08a479e7ac578975784f2), [`f59032a`](https://github.com/mastra-ai/mastra/commit/f59032a73699443555a08a479e7ac578975784f2), [`bf936e2`](https://github.com/mastra-ai/mastra/commit/bf936e2c89b2ff0dad5695b873ddc009ba96d41e)]:
|
|
19
|
+
- @mastra/core@1.58.0-alpha.6
|
|
20
|
+
- @mastra/agent-browser@0.5.1-alpha.0
|
|
21
|
+
- @mastra/stagehand@0.3.2-alpha.1
|
|
22
|
+
|
|
3
23
|
## 1.2.0-alpha.6
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
|
@@ -39,6 +39,12 @@ export declare function hasCredentialStoreProvider(): boolean;
|
|
|
39
39
|
* Derive the calling tenant from a request context, if an authenticated web
|
|
40
40
|
* user was stashed on it. Mirrors the web layer's stable-id resolution
|
|
41
41
|
* (`workosId` falling back to the provider `id`).
|
|
42
|
+
*
|
|
43
|
+
* The value under `user` is whatever the active auth provider's
|
|
44
|
+
* `authenticateToken` returned, so its shape follows the provider: a flat user
|
|
45
|
+
* (WorkOS) or a `{ session, user }` wrapper (better-auth). Reading only the
|
|
46
|
+
* flat shape resolves no tenant at all for the wrapper, which in deployed mode
|
|
47
|
+
* fails closed to an empty credential store.
|
|
42
48
|
*/
|
|
43
49
|
export declare function resolveTenantFromRequestContext(requestContext?: RequestContext): CredentialTenant | undefined;
|
|
44
50
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-resolver.d.ts","sourceRoot":"","sources":["../../src/agents/credential-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,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;
|
|
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;AAkBD;;;;;;;;;;GAUG;AACH,wBAAgB,+BAA+B,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,gBAAgB,GAAG,SAAS,CAiB7G;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,eAAe,GAAG,SAAS,CAKnG"}
|
|
@@ -23,14 +23,24 @@ function hasCredentialStoreProvider() {
|
|
|
23
23
|
* Derive the calling tenant from a request context, if an authenticated web
|
|
24
24
|
* user was stashed on it. Mirrors the web layer's stable-id resolution
|
|
25
25
|
* (`workosId` falling back to the provider `id`).
|
|
26
|
+
*
|
|
27
|
+
* The value under `user` is whatever the active auth provider's
|
|
28
|
+
* `authenticateToken` returned, so its shape follows the provider: a flat user
|
|
29
|
+
* (WorkOS) or a `{ session, user }` wrapper (better-auth). Reading only the
|
|
30
|
+
* flat shape resolves no tenant at all for the wrapper, which in deployed mode
|
|
31
|
+
* fails closed to an empty credential store.
|
|
26
32
|
*/
|
|
27
33
|
function resolveTenantFromRequestContext(requestContext) {
|
|
28
|
-
const
|
|
29
|
-
if (!
|
|
34
|
+
const raw = requestContext?.get("user");
|
|
35
|
+
if (!raw || typeof raw !== "object") return void 0;
|
|
36
|
+
const wrapped = Boolean(raw.user && typeof raw.user === "object" && raw.session && typeof raw.session === "object");
|
|
37
|
+
const user = wrapped ? raw.user : raw;
|
|
38
|
+
const orgId = wrapped ? raw.session?.activeOrganizationId : user.organizationId;
|
|
30
39
|
const userId = user.workosId ?? user.id;
|
|
31
|
-
if (!userId) return void 0;
|
|
40
|
+
if (typeof userId !== "string" || !userId) return void 0;
|
|
41
|
+
if (orgId !== void 0 && typeof orgId !== "string") return void 0;
|
|
32
42
|
return {
|
|
33
|
-
orgId
|
|
43
|
+
orgId,
|
|
34
44
|
userId
|
|
35
45
|
};
|
|
36
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-resolver.js","names":[],"sources":["../../src/agents/credential-resolver.ts"],"sourcesContent":["/**\n * Per-tenant credential resolution seam for deployed (multi-user) servers.\n *\n * Locally, model resolution reads the server-global file-backed `AuthStorage`.\n * A deployed web host registers a {@link CredentialStoreProvider} at boot; from\n * then on `resolveModel` 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
|
|
1
|
+
{"version":3,"file":"credential-resolver.js","names":[],"sources":["../../src/agents/credential-resolver.ts"],"sourcesContent":["/**\n * Per-tenant credential resolution seam for deployed (multi-user) servers.\n *\n * Locally, model resolution reads the server-global file-backed `AuthStorage`.\n * A deployed web host registers a {@link CredentialStoreProvider} at boot; from\n * then on `resolveModel` 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 * Session-shaped `authenticateToken` results (better-auth) arrive as a wrapper\n * whose active org lives on the session half rather than on the user.\n */\ninterface RequestContextSession {\n user?: RequestContextUser;\n session?: { activeOrganizationId?: string };\n}\n\n/**\n * Derive the calling tenant from a request context, if an authenticated web\n * user was stashed on it. Mirrors the web layer's stable-id resolution\n * (`workosId` falling back to the provider `id`).\n *\n * The value under `user` is whatever the active auth provider's\n * `authenticateToken` returned, so its shape follows the provider: a flat user\n * (WorkOS) or a `{ session, user }` wrapper (better-auth). Reading only the\n * flat shape resolves no tenant at all for the wrapper, which in deployed mode\n * fails closed to an empty credential store.\n */\nexport function resolveTenantFromRequestContext(requestContext?: RequestContext): CredentialTenant | undefined {\n const raw = requestContext?.get('user') as (RequestContextUser & RequestContextSession) | undefined;\n if (!raw || typeof raw !== 'object') return undefined;\n\n // Precedence matches `toFactoryAuthUser` in `@mastra/factory`: a wrapper's org\n // comes from the session half only, never from the inner user. The two parsers\n // cannot share code across the package boundary, so they must agree by rule.\n const wrapped = Boolean(raw.user && typeof raw.user === 'object' && raw.session && typeof raw.session === 'object');\n const user = wrapped ? (raw.user as RequestContextUser) : raw;\n const orgId = wrapped ? raw.session?.activeOrganizationId : user.organizationId;\n const userId = user.workosId ?? user.id;\n // The slot holds whatever the provider returned, so the declared string\n // types are hopes, not guarantees. A non-string id must refuse the tenant\n // (fail closed), not flow onward as a mistyped key.\n if (typeof userId !== 'string' || !userId) return undefined;\n if (orgId !== undefined && typeof orgId !== 'string') return undefined;\n return { orgId, 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;CACxD,0BAA0B;CAC1B,SAAS,CAAC;CACV,MAAM,CAEN;CACA,kBAAkB,CAElB;CACA,MAAM,YAAY,CAElB;AACF;;AAGA,SAAgB,2BAA2B,UAAqD;CAC9F,0BAA0B;AAC5B;;;;;;AAOA,SAAgB,6BAAsC;CACpD,OAAO,4BAA4B,KAAA;AACrC;;;;;;;;;;;;AA6BA,SAAgB,gCAAgC,gBAA+D;CAC7G,MAAM,MAAM,gBAAgB,IAAI,MAAM;CACtC,IAAI,CAAC,OAAO,OAAO,QAAQ,UAAU,OAAO,KAAA;CAK5C,MAAM,UAAU,QAAQ,IAAI,QAAQ,OAAO,IAAI,SAAS,YAAY,IAAI,WAAW,OAAO,IAAI,YAAY,QAAQ;CAClH,MAAM,OAAO,UAAW,IAAI,OAA8B;CAC1D,MAAM,QAAQ,UAAU,IAAI,SAAS,uBAAuB,KAAK;CACjE,MAAM,SAAS,KAAK,YAAY,KAAK;CAIrC,IAAI,OAAO,WAAW,YAAY,CAAC,QAAQ,OAAO,KAAA;CAClD,IAAI,UAAU,KAAA,KAAa,OAAO,UAAU,UAAU,OAAO,KAAA;CAC7D,OAAO;EAAE;EAAO;CAAO;AACzB;;;;;;;AAQA,SAAgB,uBAAuB,gBAA8D;CACnG,IAAI,CAAC,yBAAyB,OAAO,KAAA;CACrC,MAAM,SAAS,gCAAgC,cAAc;CAC7D,IAAI,CAAC,QAAQ,OAAO;CACpB,OAAO,wBAAwB,MAAM,KAAK;AAC5C"}
|
|
@@ -83,6 +83,43 @@ export interface VoiceSettings {
|
|
|
83
83
|
}
|
|
84
84
|
/** Stagehand environment type. */
|
|
85
85
|
export type StagehandEnv = 'LOCAL' | 'BROWSERBASE';
|
|
86
|
+
/**
|
|
87
|
+
* Browser viewport: explicit dimensions, or `'window'` to follow the real
|
|
88
|
+
* browser window instead of emulating a fixed size.
|
|
89
|
+
*/
|
|
90
|
+
export type BrowserViewport = {
|
|
91
|
+
width: number;
|
|
92
|
+
height: number;
|
|
93
|
+
} | 'window';
|
|
94
|
+
/** Named viewport sizes offered by `/browser set viewport`. */
|
|
95
|
+
export declare const VIEWPORT_PRESETS: {
|
|
96
|
+
readonly desktop: {
|
|
97
|
+
readonly width: 1280;
|
|
98
|
+
readonly height: 720;
|
|
99
|
+
};
|
|
100
|
+
readonly 'desktop-hd': {
|
|
101
|
+
readonly width: 1920;
|
|
102
|
+
readonly height: 1080;
|
|
103
|
+
};
|
|
104
|
+
readonly laptop: {
|
|
105
|
+
readonly width: 1440;
|
|
106
|
+
readonly height: 900;
|
|
107
|
+
};
|
|
108
|
+
readonly tablet: {
|
|
109
|
+
readonly width: 768;
|
|
110
|
+
readonly height: 1024;
|
|
111
|
+
};
|
|
112
|
+
readonly mobile: {
|
|
113
|
+
readonly width: 390;
|
|
114
|
+
readonly height: 844;
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
export type ViewportPreset = keyof typeof VIEWPORT_PRESETS;
|
|
118
|
+
/**
|
|
119
|
+
* Parse a `WIDTHxHEIGHT` string (e.g. `1280x720`), a preset name, or `window`.
|
|
120
|
+
* Returns undefined when the input is not a usable viewport.
|
|
121
|
+
*/
|
|
122
|
+
export declare function parseViewportInput(input: string): BrowserViewport | undefined;
|
|
86
123
|
/** Stagehand-specific browser settings. */
|
|
87
124
|
export interface StagehandSettings {
|
|
88
125
|
env: StagehandEnv;
|
|
@@ -111,11 +148,11 @@ export interface BrowserSettings {
|
|
|
111
148
|
provider: BrowserProvider;
|
|
112
149
|
/** Whether to run headless (no visible browser window). */
|
|
113
150
|
headless: boolean;
|
|
114
|
-
/**
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
151
|
+
/**
|
|
152
|
+
* Browser viewport dimensions, or `'window'` to disable viewport emulation so
|
|
153
|
+
* the page follows the real browser window.
|
|
154
|
+
*/
|
|
155
|
+
viewport?: BrowserViewport;
|
|
119
156
|
/** CDP URL for connecting to an existing browser. */
|
|
120
157
|
cdpUrl?: string;
|
|
121
158
|
/** Path to a Chrome/Chromium user data directory (profile). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/onboarding/settings.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/onboarding/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,56 @@ const MASTRA_GATEWAY_DEFAULT_URL = "https://gateway-api.mastra.ai";
|
|
|
18
18
|
const MEMORY_GATEWAY_PROVIDER = MASTRA_GATEWAY_PROVIDER;
|
|
19
19
|
/** @deprecated Renamed to {@link MASTRA_GATEWAY_DEFAULT_URL}. */
|
|
20
20
|
const MEMORY_GATEWAY_DEFAULT_URL = MASTRA_GATEWAY_DEFAULT_URL;
|
|
21
|
+
/** Named viewport sizes offered by `/browser set viewport`. */
|
|
22
|
+
const VIEWPORT_PRESETS = {
|
|
23
|
+
desktop: {
|
|
24
|
+
width: 1280,
|
|
25
|
+
height: 720
|
|
26
|
+
},
|
|
27
|
+
"desktop-hd": {
|
|
28
|
+
width: 1920,
|
|
29
|
+
height: 1080
|
|
30
|
+
},
|
|
31
|
+
laptop: {
|
|
32
|
+
width: 1440,
|
|
33
|
+
height: 900
|
|
34
|
+
},
|
|
35
|
+
tablet: {
|
|
36
|
+
width: 768,
|
|
37
|
+
height: 1024
|
|
38
|
+
},
|
|
39
|
+
mobile: {
|
|
40
|
+
width: 390,
|
|
41
|
+
height: 844
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Largest viewport dimension accepted. Guards against typos that would launch a
|
|
46
|
+
* browser far larger than any display.
|
|
47
|
+
*/
|
|
48
|
+
const MAX_VIEWPORT_DIMENSION = 1e4;
|
|
49
|
+
function isValidDimension(value) {
|
|
50
|
+
return typeof value === "number" && Number.isInteger(value) && value > 0 && value <= MAX_VIEWPORT_DIMENSION;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Parse a `WIDTHxHEIGHT` string (e.g. `1280x720`), a preset name, or `window`.
|
|
54
|
+
* Returns undefined when the input is not a usable viewport.
|
|
55
|
+
*/
|
|
56
|
+
function parseViewportInput(input) {
|
|
57
|
+
const value = input.trim().toLowerCase();
|
|
58
|
+
if (!value) return void 0;
|
|
59
|
+
if (value === "window") return "window";
|
|
60
|
+
if (value in VIEWPORT_PRESETS) return { ...VIEWPORT_PRESETS[value] };
|
|
61
|
+
const match = /^(\d+)\s*[x×]\s*(\d+)$/.exec(value);
|
|
62
|
+
if (!match) return void 0;
|
|
63
|
+
const width = Number(match[1]);
|
|
64
|
+
const height = Number(match[2]);
|
|
65
|
+
if (!isValidDimension(width) || !isValidDimension(height)) return void 0;
|
|
66
|
+
return {
|
|
67
|
+
width,
|
|
68
|
+
height
|
|
69
|
+
};
|
|
70
|
+
}
|
|
21
71
|
/** Auth key prefix for observability tokens stored per-resource in auth.json */
|
|
22
72
|
const OBSERVABILITY_AUTH_PREFIX = "observability:";
|
|
23
73
|
const STORAGE_DEFAULTS = {
|
|
@@ -72,10 +122,7 @@ const DEFAULTS = {
|
|
|
72
122
|
enabled: false,
|
|
73
123
|
provider: "stagehand",
|
|
74
124
|
headless: false,
|
|
75
|
-
viewport: {
|
|
76
|
-
width: 1280,
|
|
77
|
-
height: 720
|
|
78
|
-
},
|
|
125
|
+
viewport: { ...VIEWPORT_PRESETS.desktop },
|
|
79
126
|
stagehand: { env: "LOCAL" }
|
|
80
127
|
},
|
|
81
128
|
shellPassthrough: { mode: "default" },
|
|
@@ -237,12 +284,26 @@ function parseStagehandModel(value) {
|
|
|
237
284
|
return model.slice(separator + 1).trim() ? model : void 0;
|
|
238
285
|
}
|
|
239
286
|
/**
|
|
287
|
+
* Validate a viewport read from settings.json, falling back to the default when
|
|
288
|
+
* it is missing or malformed.
|
|
289
|
+
*/
|
|
290
|
+
function parseStoredViewport(raw) {
|
|
291
|
+
if (raw === "window") return "window";
|
|
292
|
+
if (raw && typeof raw === "object") {
|
|
293
|
+
const { width, height } = raw;
|
|
294
|
+
if (isValidDimension(width) && isValidDimension(height)) return {
|
|
295
|
+
width,
|
|
296
|
+
height
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
return { ...VIEWPORT_PRESETS.desktop };
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
240
302
|
* Deep-merge and validate browser settings from JSON.
|
|
241
303
|
* Explicitly validates types to handle malformed settings.json gracefully.
|
|
242
304
|
*/
|
|
243
305
|
function parseBrowserSettings(rawBrowser) {
|
|
244
306
|
const raw = rawBrowser && typeof rawBrowser === "object" ? rawBrowser : {};
|
|
245
|
-
const rawViewport = raw.viewport && typeof raw.viewport === "object" ? raw.viewport : {};
|
|
246
307
|
const rawStagehand = raw.stagehand && typeof raw.stagehand === "object" ? raw.stagehand : {};
|
|
247
308
|
const stagehandModel = parseStagehandModel(rawStagehand.model);
|
|
248
309
|
const rawAgentBrowser = raw.agentBrowser && typeof raw.agentBrowser === "object" ? raw.agentBrowser : {};
|
|
@@ -253,10 +314,7 @@ function parseBrowserSettings(rawBrowser) {
|
|
|
253
314
|
cdpUrl: typeof raw.cdpUrl === "string" && raw.cdpUrl.trim() ? raw.cdpUrl.trim() : void 0,
|
|
254
315
|
profile: typeof raw.profile === "string" && raw.profile.trim() ? raw.profile.trim() : void 0,
|
|
255
316
|
executablePath: typeof raw.executablePath === "string" && raw.executablePath.trim() ? raw.executablePath.trim() : void 0,
|
|
256
|
-
viewport:
|
|
257
|
-
width: typeof rawViewport.width === "number" ? rawViewport.width : DEFAULTS.browser.viewport.width,
|
|
258
|
-
height: typeof rawViewport.height === "number" ? rawViewport.height : DEFAULTS.browser.viewport.height
|
|
259
|
-
},
|
|
317
|
+
viewport: parseStoredViewport(raw.viewport),
|
|
260
318
|
scope: typeof raw.scope === "string" && (raw.scope === "shared" || raw.scope === "thread") ? raw.scope : void 0,
|
|
261
319
|
stagehand: {
|
|
262
320
|
env: typeof rawStagehand.env === "string" && STAGEHAND_ENVS.has(rawStagehand.env) ? rawStagehand.env : DEFAULTS.browser.stagehand.env,
|
|
@@ -725,6 +783,6 @@ async function createBrowserFromSettings(settings) {
|
|
|
725
783
|
throw new Error(`Unsupported browser provider: ${provider}`);
|
|
726
784
|
}
|
|
727
785
|
//#endregion
|
|
728
|
-
export { MASTRA_GATEWAY_DEFAULT_URL, MASTRA_GATEWAY_PROVIDER, MEMORY_GATEWAY_DEFAULT_URL, MEMORY_GATEWAY_PROVIDER, OBSERVABILITY_AUTH_PREFIX, STORAGE_DEFAULTS, THINKING_LEVEL_VALUES, THREAD_ACTIVE_MODEL_PACK_ID_KEY, checkProfileProviderMismatch, createBrowserFromSettings, defaultVoiceEngine, getCustomProviderId, getProfileProvider, getSettingsPath, isThinkingLevelSetting, loadSettings, migrateLegacyVariedPack, parseCustomProviders, parseThreadSettings, resolveDefaultThinkingLevel, resolveModelDefaults, resolveOmModel, resolveOmRoleModel, resolveThreadActiveModelPackId, saveSettings, setProfileProvider, stripMastraCodeCustomProviderPrefix, toCustomProviderModelId };
|
|
786
|
+
export { MASTRA_GATEWAY_DEFAULT_URL, MASTRA_GATEWAY_PROVIDER, MEMORY_GATEWAY_DEFAULT_URL, MEMORY_GATEWAY_PROVIDER, OBSERVABILITY_AUTH_PREFIX, STORAGE_DEFAULTS, THINKING_LEVEL_VALUES, THREAD_ACTIVE_MODEL_PACK_ID_KEY, VIEWPORT_PRESETS, checkProfileProviderMismatch, createBrowserFromSettings, defaultVoiceEngine, getCustomProviderId, getProfileProvider, getSettingsPath, isThinkingLevelSetting, loadSettings, migrateLegacyVariedPack, parseCustomProviders, parseThreadSettings, parseViewportInput, resolveDefaultThinkingLevel, resolveModelDefaults, resolveOmModel, resolveOmRoleModel, resolveThreadActiveModelPackId, saveSettings, setProfileProvider, stripMastraCodeCustomProviderPrefix, toCustomProviderModelId };
|
|
729
787
|
|
|
730
788
|
//# sourceMappingURL=settings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","names":[],"sources":["../../src/onboarding/settings.ts"],"sourcesContent":["/**\n * Persistent global settings stored in the app data directory as settings.json.\n * This file persists onboarding state AND user preferences (model choices, yolo, etc.)\n * so they carry across threads and restarts.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { MastraBrowser } from '@mastra/core/browser';\nimport type { LSPConfig } from '@mastra/core/workspace';\nimport { AuthStorage } from '../auth/storage.js';\nimport { buildCodexStagehandFetch, createCodexMiddleware } from '../providers/openai-codex.js';\nimport { getAppDataDir } from '../utils/project.js';\nimport { DEFAULT_STT_PROVIDER, resolveSTTModel } from '../voice/stt-registry.js';\n\n/** A saved custom pack — user-defined model selections for each mode. */\nexport interface CustomPack {\n name: string;\n models: Record<string, string>;\n createdAt: string;\n}\n\n/** A saved custom provider for OpenAI-compatible endpoints. */\nexport interface CustomProviderSetting {\n name: string;\n url: string;\n apiKey?: string;\n models: string[];\n}\n\n/** Storage backend type. */\nexport type StorageBackend = 'libsql' | 'pg';\n\n/** LibSQL-specific storage settings. */\nexport interface LibSQLStorageSettings {\n url?: string;\n authToken?: string;\n}\n\n/** PostgreSQL-specific storage settings. */\nexport interface PgStorageSettings {\n connectionString?: string;\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n schemaName?: string;\n disableInit?: boolean;\n skipDefaultIndexes?: boolean;\n}\n\n/** Storage configuration persisted in global settings. */\nexport interface StorageSettings {\n /** Which backend to use. Default: 'libsql'. */\n backend: StorageBackend;\n /** LibSQL-specific config (used when backend is 'libsql'). */\n libsql: LibSQLStorageSettings;\n /** PostgreSQL-specific config (used when backend is 'pg'). */\n pg: PgStorageSettings;\n}\n\n/** Gateway provider key used in AuthStorage. */\nexport const MASTRA_GATEWAY_PROVIDER = 'mastra-gateway';\n\n/** Default gateway URL. */\nexport const MASTRA_GATEWAY_DEFAULT_URL = 'https://gateway-api.mastra.ai';\n\n/** @deprecated Renamed to {@link MASTRA_GATEWAY_PROVIDER}. */\nexport const MEMORY_GATEWAY_PROVIDER = MASTRA_GATEWAY_PROVIDER;\n\n/** @deprecated Renamed to {@link MASTRA_GATEWAY_DEFAULT_URL}. */\nexport const MEMORY_GATEWAY_DEFAULT_URL = MASTRA_GATEWAY_DEFAULT_URL;\n\n/** Valid persisted thinking level values. */\nexport type ThinkingLevelSetting = 'off' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\n/** Browser provider type. */\nexport type BrowserProvider = 'stagehand' | 'agent-browser';\n\n/** Direct TUI `!` shell passthrough mode. */\nexport type ShellPassthroughSettingsMode = 'default' | 'path' | 'login';\n\n/** Direct TUI `!` shell command language. */\nexport type ShellPassthroughSettingsFamily = 'posix' | 'cmd' | 'powershell';\n\n/** Direct TUI `!` shell passthrough configuration. */\nexport interface ShellPassthroughSettings {\n mode?: ShellPassthroughSettingsMode | string;\n executable?: string;\n family?: ShellPassthroughSettingsFamily | string;\n}\n\n/** STT engine: on-device macOS recognizer or a cloud provider. */\nexport type VoiceEngine = 'macos-native' | 'cloud';\n\n/** Voice (hold-space dictation) configuration persisted in global settings. */\nexport interface VoiceSettings {\n /** Whether hold-space voice input is enabled. */\n enabled: boolean;\n /** Which STT engine to use. Defaults to macOS native on darwin, else cloud. */\n engine: VoiceEngine;\n /** Cloud provider id (matches an STT registry entry). Cloud engine only. */\n provider: string;\n /** Cloud model id; defaults to the provider's first registry model. */\n model?: string;\n}\n\n/** Stagehand environment type. */\nexport type StagehandEnv = 'LOCAL' | 'BROWSERBASE';\n\n/** Stagehand-specific browser settings. */\nexport interface StagehandSettings {\n env: StagehandEnv;\n apiKey?: string;\n projectId?: string;\n /**\n * Model Stagehand uses for its AI operations, as `provider/model`\n * (for example `anthropic/claude-sonnet-4-5`). Stagehand resolves the\n * provider's API key from the environment (`ANTHROPIC_API_KEY`,\n * `OPENAI_API_KEY`, and so on). Defaults to Stagehand's own default.\n */\n model?: string;\n /** Whether to preserve the user data directory after the browser closes. */\n preserveUserDataDir?: boolean;\n}\n\n/** AgentBrowser-specific browser settings. */\nexport interface AgentBrowserSettings {\n /** Path to a Playwright storage state file (JSON) containing cookies and localStorage. */\n storageState?: string;\n}\n\n/** Browser configuration persisted in global settings. */\nexport interface BrowserSettings {\n /** Whether browser automation is enabled. */\n enabled: boolean;\n /** Which browser provider to use. */\n provider: BrowserProvider;\n /** Whether to run headless (no visible browser window). */\n headless: boolean;\n /** Browser viewport dimensions. */\n viewport?: { width: number; height: number };\n /** CDP URL for connecting to an existing browser. */\n cdpUrl?: string;\n /** Path to a Chrome/Chromium user data directory (profile). */\n profile?: string;\n /** Path to the browser executable to use. */\n executablePath?: string;\n /** Browser scope — 'shared' (all threads share one browser) or 'thread' (each thread gets its own). */\n scope?: 'shared' | 'thread';\n /** Stagehand-specific settings. */\n stagehand?: StagehandSettings;\n /** AgentBrowser-specific settings. */\n agentBrowser?: AgentBrowserSettings;\n}\n\nexport interface GlobalSettings {\n // Onboarding tracking\n onboarding: {\n completedAt: string | null;\n skippedAt: string | null;\n version: number;\n modePackId: string | null;\n omPackId: string | null;\n quietModePreferenceSelected: boolean;\n };\n // Global model preferences (applied to new threads)\n models: {\n /**\n * Active model pack ID. Built-in packs use their id directly (\"anthropic\",\n * \"openai\"). Custom packs use \"custom:<name>\".\n * When set, models are resolved from the pack at startup so pack updates\n * (e.g. new model versions) apply automatically.\n * Cleared when the user manually overrides via /models (falls back to modeDefaults).\n */\n activeModelPackId: string | null;\n /** Explicit per-mode overrides — used when no activeModelPackId is set. */\n modeDefaults: Record<string, string>;\n /**\n * Per-mode reasoning-effort defaults (e.g. { build: \"high\", plan: \"xhigh\" }).\n * Resolved at request time; falls back to `preferences.thinkingLevel` for\n * modes without an entry. Overridden per-session via /think or the session\n * settings panel.\n */\n modeThinkingDefaults: Record<string, ThinkingLevelSetting>;\n /**\n * Active OM pack ID (e.g. \"gemini\", \"anthropic\", \"custom\").\n * When set, the OM model is resolved from the pack at startup so pack\n * updates (e.g. new model versions) apply automatically.\n * Cleared when the user manually overrides via /om (falls back to omModelOverride).\n */\n activeOmPackId: string | null;\n /**\n * Shared OM model override — used for both observer and reflector when a\n * role-specific override is not set. Kept for back-compat with older settings\n * files and set by onboarding when the user picks a custom OM pack.\n */\n omModelOverride: string | null;\n /**\n * Explicit Observer model override — takes precedence over `omModelOverride`\n * when set. Written by `/om` when the observer model is changed independently.\n */\n observerModelOverride: string | null;\n /**\n * Explicit Reflector model override — takes precedence over `omModelOverride`\n * when set. Written by `/om` when the reflector model is changed independently.\n */\n reflectorModelOverride: string | null;\n /** Default OM observation threshold used for new threads unless overridden per-thread. */\n omObservationThreshold: number | null;\n /** Default OM reflection threshold used for new threads unless overridden per-thread. */\n omReflectionThreshold: number | null;\n /**\n * Whether observations and reflections use the terse caveman-style instruction.\n * `null` means inherit the built-in default (currently `false` — caveman is\n * opt-in via `/om` settings). Used as the default for new threads unless\n * overridden per-thread.\n */\n omCavemanObservations: boolean | null;\n /**\n * Whether Observational Memory forwards image/file attachment parts to the\n * Observer LLM. `null` ⇒ inherit built-in default ('auto'). 'auto' checks\n * model capabilities; true/false forces the setting.\n */\n omObserveAttachments: 'auto' | boolean | null;\n /** Per-agent-type subagent model overrides (e.g. { explore: \"openai/gpt-5.1-codex-mini\" }) */\n subagentModels: Record<string, string>;\n /** Default judge model for /goal. */\n goalJudgeModel: string | null;\n /** Default max attempts for /goal. */\n goalMaxTurns: number | null;\n };\n // Global behavior preferences\n preferences: {\n yolo: boolean | null;\n theme: 'auto' | 'dark' | 'light';\n /** Default reasoning effort level used for all threads/models unless overridden in-session. */\n thinkingLevel: ThinkingLevelSetting;\n /** When true, components like subagent output collapse to compact summaries on completion. */\n quietMode: boolean;\n /** Maximum quiet-mode detail preview lines for compact tool calls. Set to 0 to hide previews. */\n quietModeMaxToolPreviewLines: number;\n };\n // Storage backend configuration\n storage: StorageSettings;\n // User-created custom model packs\n customModelPacks: CustomPack[];\n // User-created custom providers with custom models\n customProviders: CustomProviderSetting[];\n // Model usage counts for ranking in the selector\n modelUseCounts: Record<string, number>;\n // Version the user dismissed the update prompt for (skip until they manually update past this)\n updateDismissedVersion: string | null;\n // Mastra gateway configuration\n memoryGateway: { baseUrl?: string };\n // LSP configuration forwarded to the workspace\n lsp?: LSPConfig;\n // Browser automation configuration\n browser: BrowserSettings;\n // Direct TUI `!` shell passthrough configuration\n shellPassthrough: ShellPassthroughSettings;\n // Hold-space voice input configuration\n voice: VoiceSettings;\n // Signal routing configuration\n signals: SignalSettings;\n // Cloud observability configuration (per-resource project IDs; tokens stored in auth.json)\n observability: ObservabilitySettings;\n}\n\nexport interface SignalSettings {\n /** Opt into local Unix socket PubSub for cross-process signal routing. */\n unixSocketPubSub: boolean;\n /** Experimental: enable GitHub PR subscription signals backed by gitcrawl. */\n experimentalGithubSignals: boolean;\n}\n\nexport interface ObservabilityResourceConfig {\n /** Cloud project ID for this resource */\n projectId: string;\n /** When this config was created */\n configuredAt: string;\n}\n\nexport interface ObservabilitySettings {\n /** Per-resource cloud project configs, keyed by resourceId */\n resources: Record<string, ObservabilityResourceConfig>;\n /** Whether to store traces locally in DuckDB. Off by default to avoid disk usage. */\n localTracing: boolean;\n}\n\n/** Auth key prefix for observability tokens stored per-resource in auth.json */\nexport const OBSERVABILITY_AUTH_PREFIX = 'observability:';\n\nexport const STORAGE_DEFAULTS: StorageSettings = {\n backend: 'libsql',\n libsql: {},\n pg: {},\n};\n\n/** Default STT engine: on-device macOS recognizer where available, else cloud. */\nexport function defaultVoiceEngine(): VoiceEngine {\n return process.platform === 'darwin' ? 'macos-native' : 'cloud';\n}\n\nconst DEFAULTS: GlobalSettings = {\n onboarding: {\n completedAt: null,\n skippedAt: null,\n version: 0,\n modePackId: null,\n omPackId: null,\n quietModePreferenceSelected: true,\n },\n models: {\n activeModelPackId: null,\n modeDefaults: {},\n modeThinkingDefaults: {},\n activeOmPackId: null,\n omModelOverride: null,\n observerModelOverride: null,\n reflectorModelOverride: null,\n omObservationThreshold: null,\n omReflectionThreshold: null,\n omCavemanObservations: null,\n omObserveAttachments: null,\n subagentModels: {},\n goalJudgeModel: null,\n goalMaxTurns: null,\n },\n preferences: {\n yolo: null,\n theme: 'auto',\n thinkingLevel: 'off',\n quietMode: false,\n quietModeMaxToolPreviewLines: 2,\n },\n storage: { ...STORAGE_DEFAULTS },\n customModelPacks: [],\n customProviders: [],\n modelUseCounts: {},\n updateDismissedVersion: null,\n memoryGateway: {},\n lsp: {},\n browser: {\n enabled: false,\n provider: 'stagehand',\n headless: false,\n viewport: { width: 1280, height: 720 },\n stagehand: { env: 'LOCAL' },\n },\n shellPassthrough: { mode: 'default' },\n voice: { enabled: false, engine: defaultVoiceEngine(), provider: DEFAULT_STT_PROVIDER },\n signals: { unixSocketPubSub: false, experimentalGithubSignals: false },\n observability: { resources: {}, localTracing: false },\n};\n\nexport const THINKING_LEVEL_VALUES: ThinkingLevelSetting[] = ['off', 'low', 'medium', 'high', 'xhigh', 'max'];\nconst QUIET_MODE_MAX_TOOL_PREVIEW_LINES_MAX = 8;\nconst loadedSignalSettings = new WeakMap<GlobalSettings, SignalSettings>();\n\nfunction cloneSignalSettings(signals: SignalSettings): SignalSettings {\n return { ...signals };\n}\n\nfunction rememberLoadedSettings(settings: GlobalSettings): GlobalSettings {\n loadedSignalSettings.set(settings, cloneSignalSettings(settings.signals));\n return settings;\n}\n\nfunction signalSettingsEqual(left: SignalSettings, right: SignalSettings): boolean {\n return (\n left.unixSocketPubSub === right.unixSocketPubSub &&\n left.experimentalGithubSignals === right.experimentalGithubSignals\n );\n}\n\nfunction parseThinkingLevel(value: unknown): ThinkingLevelSetting {\n return typeof value === 'string' && THINKING_LEVEL_VALUES.includes(value as ThinkingLevelSetting)\n ? (value as ThinkingLevelSetting)\n : DEFAULTS.preferences.thinkingLevel;\n}\n\nexport function isThinkingLevelSetting(value: unknown): value is ThinkingLevelSetting {\n return typeof value === 'string' && THINKING_LEVEL_VALUES.includes(value as ThinkingLevelSetting);\n}\n\nfunction parseModeThinkingDefaults(value: unknown): Record<string, ThinkingLevelSetting> {\n if (!value || typeof value !== 'object') return {};\n const result: Record<string, ThinkingLevelSetting> = {};\n for (const [mode, level] of Object.entries(value as Record<string, unknown>)) {\n if (isThinkingLevelSetting(level)) {\n result[mode] = level;\n }\n }\n return result;\n}\n\nfunction parseQuietModeMaxToolPreviewLines(value: unknown): number {\n const rawValue =\n typeof value === 'number' && Number.isFinite(value) ? value : DEFAULTS.preferences.quietModeMaxToolPreviewLines;\n return Math.min(QUIET_MODE_MAX_TOOL_PREVIEW_LINES_MAX, Math.max(0, Math.floor(rawValue)));\n}\n\nfunction parsePreferences(rawPreferences: unknown): GlobalSettings['preferences'] {\n const raw = rawPreferences && typeof rawPreferences === 'object' ? (rawPreferences as Record<string, unknown>) : {};\n\n return {\n ...DEFAULTS.preferences,\n ...raw,\n thinkingLevel: parseThinkingLevel(raw.thinkingLevel),\n quietModeMaxToolPreviewLines: parseQuietModeMaxToolPreviewLines(raw.quietModeMaxToolPreviewLines),\n };\n}\n\nfunction parseSignalSettings(rawSignals: unknown): SignalSettings {\n const raw = rawSignals && typeof rawSignals === 'object' ? (rawSignals as Record<string, unknown>) : {};\n return {\n unixSocketPubSub:\n typeof raw.unixSocketPubSub === 'boolean' ? raw.unixSocketPubSub : DEFAULTS.signals.unixSocketPubSub,\n experimentalGithubSignals:\n typeof raw.experimentalGithubSignals === 'boolean'\n ? raw.experimentalGithubSignals\n : DEFAULTS.signals.experimentalGithubSignals,\n };\n}\n\nfunction hasQuietModePreferenceSelected(rawOnboarding: unknown): boolean {\n return Boolean(\n rawOnboarding &&\n typeof rawOnboarding === 'object' &&\n Object.prototype.hasOwnProperty.call(rawOnboarding, 'quietModePreferenceSelected'),\n );\n}\n\nfunction applyQuietModePreferenceRollout(settings: GlobalSettings, rawOnboarding: unknown): void {\n if (hasQuietModePreferenceSelected(rawOnboarding)) return;\n settings.onboarding.quietModePreferenceSelected = settings.preferences.quietMode === true;\n}\n\nfunction getNewInstallDefaults(): GlobalSettings {\n const settings = structuredClone(DEFAULTS);\n settings.preferences.quietMode = true;\n settings.onboarding.quietModePreferenceSelected = true;\n return settings;\n}\n\nexport function getSettingsPath(): string {\n return join(getAppDataDir(), 'settings.json');\n}\n\nexport function getCustomProviderId(name: string): string {\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return slug || 'provider';\n}\n\nexport function toCustomProviderModelId(providerName: string, modelName: string): string {\n const providerId = getCustomProviderId(providerName);\n const trimmedModelName = modelName.trim();\n const providerPrefix = `${providerId}/`;\n if (trimmedModelName.startsWith(providerPrefix)) {\n return trimmedModelName;\n }\n return `${providerId}/${trimmedModelName}`;\n}\n\n/**\n * The shared gateway catalog namespaces provider keys under their owning\n * gateway id, so a custom provider's models surface in the `/models` catalog\n * as `mastracode/<providerId>/<model>` instead of the canonical\n * `<providerId>/<model>` that model resolution expects. Persisting the\n * gateway-qualified id verbatim breaks lookup later (the provider is parsed\n * as `mastracode`). Strip the prefix before saving — but only when the\n * middle segment matches one of the user's configured custom providers, so\n * legitimate `mastracode/...` gateway-routed ids are left untouched.\n */\nexport function stripMastraCodeCustomProviderPrefix(\n modelId: string,\n customProviders: Array<Pick<CustomProviderSetting, 'name'>>,\n): string {\n const gatewayPrefix = 'mastracode/';\n if (!modelId.startsWith(gatewayPrefix)) return modelId;\n\n const rest = modelId.slice(gatewayPrefix.length);\n const [providerId, ...modelParts] = rest.split('/');\n if (!providerId || modelParts.length === 0 || modelParts.some(part => part.length === 0)) return modelId;\n\n const isCustomProvider = customProviders.some(provider => getCustomProviderId(provider.name) === providerId);\n return isCustomProvider ? rest : modelId;\n}\n\nexport function parseCustomProviders(rawProviders: unknown): CustomProviderSetting[] {\n if (!Array.isArray(rawProviders)) return [];\n\n const parsedProviders: CustomProviderSetting[] = [];\n for (const rawProvider of rawProviders) {\n if (!rawProvider || typeof rawProvider !== 'object') continue;\n\n const candidate = rawProvider as Record<string, unknown>;\n const name = typeof candidate.name === 'string' ? candidate.name.trim() : '';\n const url = typeof candidate.url === 'string' ? candidate.url.trim() : '';\n if (!name || !url) continue;\n\n const providerId = getCustomProviderId(name);\n const models = Array.isArray(candidate.models)\n ? [\n ...new Set(\n candidate.models\n .filter((model): model is string => typeof model === 'string')\n .map(model => model.trim())\n .map(model => {\n const providerPrefix = `${providerId}/`;\n if (model.startsWith(providerPrefix)) {\n return model.slice(providerPrefix.length);\n }\n return model;\n }),\n ),\n ].filter(model => model.length > 0)\n : [];\n\n const apiKey =\n typeof candidate.apiKey === 'string' && candidate.apiKey.trim().length > 0 ? candidate.apiKey.trim() : undefined;\n\n parsedProviders.push({\n name,\n url,\n ...(apiKey ? { apiKey } : {}),\n models,\n });\n }\n\n return parsedProviders;\n}\n\nconst BROWSER_PROVIDERS = new Set<BrowserProvider>(['stagehand', 'agent-browser']);\nconst STAGEHAND_ENVS = new Set<StagehandEnv>(['LOCAL', 'BROWSERBASE']);\n\n/**\n * Normalize a Stagehand model id, which must be provider-qualified.\n *\n * Stagehand reads the segment before the first slash as the provider, so a\n * bare id like `gpt-4.1` is rejected as an unknown provider and a trailing\n * slash leaves an empty model name that only fails once a request is made.\n * Neither is usable, so both are dropped here rather than persisted.\n *\n * The provider name itself is checked where the command is issued, which can\n * name the supported providers in an error; this module is on the startup path\n * and only imports Stagehand lazily.\n *\n * @returns the trimmed model id, or undefined when it is unusable.\n */\nfunction parseStagehandModel(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const model = value.trim();\n const separator = model.indexOf('/');\n if (separator <= 0) return undefined;\n return model.slice(separator + 1).trim() ? model : undefined;\n}\n\n/**\n * Deep-merge and validate browser settings from JSON.\n * Explicitly validates types to handle malformed settings.json gracefully.\n */\nfunction parseBrowserSettings(rawBrowser: unknown): BrowserSettings {\n const raw = rawBrowser && typeof rawBrowser === 'object' ? (rawBrowser as Record<string, unknown>) : {};\n const rawViewport = raw.viewport && typeof raw.viewport === 'object' ? (raw.viewport as Record<string, unknown>) : {};\n const rawStagehand =\n raw.stagehand && typeof raw.stagehand === 'object' ? (raw.stagehand as Record<string, unknown>) : {};\n const stagehandModel = parseStagehandModel(rawStagehand.model);\n const rawAgentBrowser =\n raw.agentBrowser && typeof raw.agentBrowser === 'object' ? (raw.agentBrowser as Record<string, unknown>) : {};\n\n return {\n enabled: typeof raw.enabled === 'boolean' ? raw.enabled : DEFAULTS.browser.enabled,\n provider:\n typeof raw.provider === 'string' && BROWSER_PROVIDERS.has(raw.provider as BrowserProvider)\n ? (raw.provider as BrowserProvider)\n : DEFAULTS.browser.provider,\n headless: typeof raw.headless === 'boolean' ? raw.headless : DEFAULTS.browser.headless,\n cdpUrl: typeof raw.cdpUrl === 'string' && raw.cdpUrl.trim() ? raw.cdpUrl.trim() : undefined,\n profile: typeof raw.profile === 'string' && raw.profile.trim() ? raw.profile.trim() : undefined,\n executablePath:\n typeof raw.executablePath === 'string' && raw.executablePath.trim() ? raw.executablePath.trim() : undefined,\n viewport: {\n width: typeof rawViewport.width === 'number' ? rawViewport.width : DEFAULTS.browser.viewport!.width,\n height: typeof rawViewport.height === 'number' ? rawViewport.height : DEFAULTS.browser.viewport!.height,\n },\n scope: typeof raw.scope === 'string' && (raw.scope === 'shared' || raw.scope === 'thread') ? raw.scope : undefined,\n stagehand: {\n env:\n typeof rawStagehand.env === 'string' && STAGEHAND_ENVS.has(rawStagehand.env as StagehandEnv)\n ? (rawStagehand.env as StagehandEnv)\n : DEFAULTS.browser.stagehand!.env,\n ...(typeof rawStagehand.apiKey === 'string' && rawStagehand.apiKey.trim()\n ? { apiKey: rawStagehand.apiKey.trim() }\n : {}),\n ...(typeof rawStagehand.projectId === 'string' && rawStagehand.projectId.trim()\n ? { projectId: rawStagehand.projectId.trim() }\n : {}),\n ...(stagehandModel ? { model: stagehandModel } : {}),\n ...(typeof rawStagehand.preserveUserDataDir === 'boolean'\n ? { preserveUserDataDir: rawStagehand.preserveUserDataDir }\n : {}),\n },\n agentBrowser:\n typeof rawAgentBrowser.storageState === 'string' && rawAgentBrowser.storageState.trim()\n ? { storageState: rawAgentBrowser.storageState.trim() }\n : undefined,\n };\n}\n\nfunction parseShellPassthroughSettings(rawShellPassthrough: unknown): ShellPassthroughSettings {\n const raw =\n rawShellPassthrough && typeof rawShellPassthrough === 'object'\n ? (rawShellPassthrough as Record<string, unknown>)\n : {};\n const executable = typeof raw.executable === 'string' && raw.executable.trim() ? raw.executable.trim() : undefined;\n const family = typeof raw.family === 'string' && raw.family.trim() ? raw.family.trim() : undefined;\n const mode = typeof raw.mode === 'string' && raw.mode.trim() ? raw.mode.trim() : undefined;\n const defaultMode = executable ? undefined : DEFAULTS.shellPassthrough.mode;\n\n return {\n ...((mode ?? defaultMode) ? { mode: mode ?? defaultMode } : {}),\n ...(executable ? { executable } : {}),\n ...(family ? { family } : {}),\n };\n}\n\nfunction parseVoiceSettings(rawVoice: unknown): VoiceSettings {\n const raw = rawVoice && typeof rawVoice === 'object' ? (rawVoice as Record<string, unknown>) : {};\n const enabled = typeof raw.enabled === 'boolean' ? raw.enabled : DEFAULTS.voice.enabled;\n const engine: VoiceEngine =\n raw.engine === 'macos-native' || raw.engine === 'cloud' ? raw.engine : defaultVoiceEngine();\n // Validate provider/model against the registry, falling back to a usable entry\n // so old `{ enabled }`-only files and unknown values still resolve cleanly.\n const provider = typeof raw.provider === 'string' ? raw.provider : DEFAULTS.voice.provider;\n const model = typeof raw.model === 'string' ? raw.model : undefined;\n const resolved = resolveSTTModel(provider, model);\n return {\n enabled,\n engine,\n provider: resolved.provider,\n model: resolved.model,\n };\n}\n\nconst VALID_PROJECT_ID = /^[a-zA-Z0-9_-]+$/;\n\nfunction parseObservabilitySettings(raw: unknown): ObservabilitySettings {\n if (!raw || typeof raw !== 'object') return { resources: {}, localTracing: false };\n const obj = raw as Record<string, unknown>;\n const localTracing = obj.localTracing === true;\n const rawResources = obj.resources;\n if (!rawResources || typeof rawResources !== 'object') return { resources: {}, localTracing };\n const resources: Record<string, ObservabilityResourceConfig> = {};\n for (const [key, val] of Object.entries(rawResources as Record<string, unknown>)) {\n if (val && typeof val === 'object') {\n const v = val as Record<string, unknown>;\n if (typeof v.projectId === 'string' && VALID_PROJECT_ID.test(v.projectId)) {\n resources[key] = {\n projectId: v.projectId,\n configuredAt: typeof v.configuredAt === 'string' ? v.configuredAt : new Date().toISOString(),\n };\n }\n }\n }\n return { resources, localTracing };\n}\n\n/**\n * One-time migration: move model-related data from auth.json to settings.json.\n * Reads `_modelRanks`, `_modeModelId_*`, `_subagentModelId*` from auth.json,\n * merges them into settings, removes them from auth.json, and writes both files.\n * No-ops if auth.json has no _ prefixed model data.\n */\nfunction migrateFromAuth(settingsPath: string): boolean {\n const authPath = join(getAppDataDir(), 'auth.json');\n if (!existsSync(authPath)) return false;\n\n let authData: Record<string, any>;\n try {\n authData = JSON.parse(readFileSync(authPath, 'utf-8'));\n } catch {\n return false;\n }\n\n const modelKeys = Object.keys(authData).filter(k => k.startsWith('_'));\n if (modelKeys.length === 0) return false;\n\n // Load existing settings (or defaults) and merge auth data into it\n let settings: GlobalSettings;\n if (existsSync(settingsPath)) {\n try {\n const raw = JSON.parse(readFileSync(settingsPath, 'utf-8'));\n settings = {\n onboarding: { ...DEFAULTS.onboarding, ...raw.onboarding },\n models: { ...DEFAULTS.models, ...raw.models },\n preferences: parsePreferences(raw.preferences),\n storage: {\n ...STORAGE_DEFAULTS,\n ...raw.storage,\n libsql: { ...STORAGE_DEFAULTS.libsql, ...raw.storage?.libsql },\n pg: { ...STORAGE_DEFAULTS.pg, ...raw.storage?.pg },\n },\n customModelPacks: Array.isArray(raw.customModelPacks) ? raw.customModelPacks : [],\n customProviders: parseCustomProviders(raw.customProviders),\n modelUseCounts: raw.modelUseCounts && typeof raw.modelUseCounts === 'object' ? raw.modelUseCounts : {},\n updateDismissedVersion: typeof raw.updateDismissedVersion === 'string' ? raw.updateDismissedVersion : null,\n memoryGateway: raw.memoryGateway && typeof raw.memoryGateway === 'object' ? raw.memoryGateway : {},\n lsp: raw.lsp && typeof raw.lsp === 'object' ? (raw.lsp as LSPConfig) : undefined,\n browser: parseBrowserSettings(raw.browser),\n shellPassthrough: parseShellPassthroughSettings(raw.shellPassthrough),\n voice: parseVoiceSettings(raw.voice),\n signals: parseSignalSettings(raw.signals),\n observability: parseObservabilitySettings(raw.observability),\n };\n applyQuietModePreferenceRollout(settings, raw.onboarding);\n } catch {\n settings = structuredClone(DEFAULTS);\n }\n } else {\n settings = structuredClone(DEFAULTS);\n }\n\n // Migrate model use counts (only if settings doesn't already have them)\n if (authData._modelRanks && typeof authData._modelRanks === 'object') {\n settings.modelUseCounts = { ...authData._modelRanks, ...settings.modelUseCounts };\n }\n\n // Migrate per-mode model defaults (don't overwrite existing settings)\n for (const key of modelKeys) {\n const modeMatch = key.match(/^_modeModelId_(.+)$/);\n if (modeMatch?.[1] && typeof authData[key] === 'string' && !settings.models.modeDefaults[modeMatch[1]]) {\n settings.models.modeDefaults[modeMatch[1]] = authData[key];\n }\n }\n\n // Migrate subagent models (don't overwrite existing settings)\n for (const key of modelKeys) {\n if (key === '_subagentModelId' && typeof authData[key] === 'string' && !settings.models.subagentModels['default']) {\n settings.models.subagentModels['default'] = authData[key];\n }\n const saMatch = key.match(/^_subagentModelId_(.+)$/);\n if (saMatch?.[1] && typeof authData[key] === 'string' && !settings.models.subagentModels[saMatch[1]]) {\n settings.models.subagentModels[saMatch[1]] = authData[key];\n }\n }\n\n // Write migrated settings\n saveSettings(settings, settingsPath);\n\n // Clean up auth.json — remove _ prefixed keys\n for (const key of modelKeys) {\n delete authData[key];\n }\n try {\n writeFileSync(authPath, JSON.stringify(authData, null, 2), 'utf-8');\n } catch {\n // Non-fatal — settings are saved, auth cleanup can fail\n }\n\n return true;\n}\n\nconst LEGACY_VARIED_MODELS: Record<string, string> = {\n plan: 'openai/gpt-5.4',\n build: 'anthropic/claude-sonnet-4-5',\n fast: 'anthropic/claude-haiku-4-5',\n};\n\nexport function migrateLegacyVariedPack(settings: GlobalSettings): boolean {\n const legacyPackId = 'varied';\n const customPackId = 'custom:varied';\n const hasLegacyReference =\n settings.models.activeModelPackId === legacyPackId || settings.onboarding.modePackId === legacyPackId;\n\n if (!hasLegacyReference) return false;\n\n const existingIdx = settings.customModelPacks.findIndex(p => p.name === 'varied');\n if (existingIdx >= 0) {\n const existing = settings.customModelPacks[existingIdx]!;\n const modelsMatch = Object.entries(LEGACY_VARIED_MODELS).every(([k, v]) => existing.models[k] === v);\n if (!modelsMatch) {\n existing.models = { ...LEGACY_VARIED_MODELS };\n }\n } else {\n settings.customModelPacks.push({\n name: 'varied',\n models: { ...LEGACY_VARIED_MODELS },\n createdAt: new Date().toISOString(),\n });\n }\n\n if (settings.models.activeModelPackId === legacyPackId) {\n settings.models.activeModelPackId = customPackId;\n if (Object.keys(settings.models.modeDefaults).length === 0) {\n settings.models.modeDefaults = { ...LEGACY_VARIED_MODELS };\n }\n }\n\n if (settings.onboarding.modePackId === legacyPackId) {\n settings.onboarding.modePackId = customPackId;\n }\n\n return true;\n}\n\nexport function loadSettings(filePath: string = getSettingsPath()): GlobalSettings {\n // One-time migration: move model data from auth.json into settings.json\n migrateFromAuth(filePath);\n\n if (!existsSync(filePath)) return rememberLoadedSettings(getNewInstallDefaults());\n try {\n const raw = JSON.parse(readFileSync(filePath, 'utf-8'));\n // Spread raw first to preserve unknown top-level keys (forward-compatibility),\n // then overlay with parsed/typed fields so known keys are always correct.\n const settings: GlobalSettings = {\n ...raw,\n onboarding: { ...DEFAULTS.onboarding, ...raw.onboarding },\n models: {\n ...DEFAULTS.models,\n ...raw.models,\n modeThinkingDefaults: parseModeThinkingDefaults(raw.models?.modeThinkingDefaults),\n },\n preferences: parsePreferences(raw.preferences),\n storage: {\n ...STORAGE_DEFAULTS,\n ...raw.storage,\n libsql: { ...STORAGE_DEFAULTS.libsql, ...raw.storage?.libsql },\n pg: { ...STORAGE_DEFAULTS.pg, ...raw.storage?.pg },\n },\n customModelPacks: Array.isArray(raw.customModelPacks) ? raw.customModelPacks : [],\n customProviders: parseCustomProviders(raw.customProviders),\n modelUseCounts: raw.modelUseCounts && typeof raw.modelUseCounts === 'object' ? raw.modelUseCounts : {},\n updateDismissedVersion: typeof raw.updateDismissedVersion === 'string' ? raw.updateDismissedVersion : null,\n memoryGateway: raw.memoryGateway && typeof raw.memoryGateway === 'object' ? raw.memoryGateway : {},\n lsp: raw.lsp && typeof raw.lsp === 'object' ? (raw.lsp as LSPConfig) : undefined,\n browser: parseBrowserSettings(raw.browser),\n shellPassthrough: parseShellPassthroughSettings(raw.shellPassthrough),\n voice: parseVoiceSettings(raw.voice),\n signals: parseSignalSettings(raw.signals),\n observability: parseObservabilitySettings(raw.observability),\n };\n\n // Migrate legacy omModelId → omModelOverride\n let settingsChanged = false;\n if (!hasQuietModePreferenceSelected(raw.onboarding)) {\n applyQuietModePreferenceRollout(settings, raw.onboarding);\n settingsChanged = true;\n }\n if (raw.models?.omModelId && !settings.models.omModelOverride) {\n settings.models.omModelOverride = raw.models.omModelId;\n settingsChanged = true;\n }\n\n if (migrateLegacyVariedPack(settings)) {\n settingsChanged = true;\n }\n\n if (settingsChanged) {\n saveSettings(settings, filePath);\n }\n\n return rememberLoadedSettings(settings);\n } catch {\n return rememberLoadedSettings(structuredClone(DEFAULTS));\n }\n}\n\nexport const THREAD_ACTIVE_MODEL_PACK_ID_KEY = 'activeModelPackId';\n\nexport interface ThreadSettings {\n activeModelPackId: string | null;\n modeModelIds: Record<string, string>;\n}\n\nexport function parseThreadSettings(metadata: Record<string, unknown> | undefined): ThreadSettings {\n const modeModelIds: Record<string, string> = {};\n for (const [key, value] of Object.entries(metadata ?? {})) {\n const modeMatch = key.match(/^modeModelId_(.+)$/);\n if (modeMatch?.[1] && typeof value === 'string' && value.length > 0) {\n modeModelIds[modeMatch[1]] = value;\n }\n }\n\n const rawPackId = metadata?.[THREAD_ACTIVE_MODEL_PACK_ID_KEY];\n const activeModelPackId = typeof rawPackId === 'string' && rawPackId.length > 0 ? rawPackId : null;\n\n return {\n activeModelPackId,\n modeModelIds,\n };\n}\n\n/**\n * Resolve active model pack id for the current thread.\n *\n * Priority:\n * 1) explicit thread metadata activeModelPackId\n * 2) inferred from thread modeModelId_* values\n * 3) global settings.models.activeModelPackId\n */\nexport function resolveThreadActiveModelPackId(\n settings: GlobalSettings,\n builtinPacks: Array<{ id: string; models: Record<string, string> }>,\n metadata: Record<string, unknown> | undefined,\n): string | null {\n const threadSettings = parseThreadSettings(metadata);\n\n const isKnownPack = (packId: string): boolean => {\n if (packId.startsWith('custom:')) {\n const name = packId.slice('custom:'.length);\n return settings.customModelPacks.some(p => p.name === name);\n }\n return builtinPacks.some(p => p.id === packId);\n };\n\n if (threadSettings.activeModelPackId && isKnownPack(threadSettings.activeModelPackId)) {\n return threadSettings.activeModelPackId;\n }\n\n const allPacks: Array<{ id: string; models: Record<string, string> }> = [\n ...builtinPacks,\n ...settings.customModelPacks.map(p => ({ id: `custom:${p.name}`, models: p.models })),\n ];\n\n for (const pack of allPacks) {\n const packEntries = Object.entries(pack.models);\n const threadEntries = Object.keys(threadSettings.modeModelIds);\n const matches =\n packEntries.length === threadEntries.length &&\n packEntries.every(([modeId, modelId]) => threadSettings.modeModelIds[modeId] === modelId);\n if (matches) return pack.id;\n }\n\n if (settings.models.activeModelPackId && isKnownPack(settings.models.activeModelPackId)) {\n return settings.models.activeModelPackId;\n }\n\n return null;\n}\n\n/**\n * Resolve effective per-mode model defaults.\n *\n * If `activeModelPackId` is set, looks up the pack (built-in or custom) and\n * returns its models. Falls back to the explicit `modeDefaults` map.\n *\n * @param settings The loaded global settings.\n * @param builtinPacks Built-in packs for the current provider access\n * (from `getAvailableModePacks`). Pass `[]` if unavailable.\n */\nexport function resolveModelDefaults(\n settings: GlobalSettings,\n builtinPacks: Array<{ id: string; models: Record<string, string> }>,\n): Record<string, string> {\n const { activeModelPackId, modeDefaults } = settings.models;\n if (!activeModelPackId) return modeDefaults;\n\n // Custom pack: \"custom:<name>\"\n if (activeModelPackId.startsWith('custom:')) {\n const name = activeModelPackId.slice('custom:'.length);\n const pack = settings.customModelPacks.find(p => p.name === name);\n if (pack) return pack.models;\n // Custom pack was deleted — fall through to modeDefaults\n return modeDefaults;\n }\n\n // Built-in pack\n const builtin = builtinPacks.find(p => p.id === activeModelPackId);\n if (builtin) return builtin.models;\n\n // Unknown pack id — fall through\n return modeDefaults;\n}\n\n/** Where a resolved default thinking level came from. */\nexport type ThinkingLevelSource = 'mode-default' | 'global';\n\n/**\n * Resolve the default reasoning-effort level for a mode.\n *\n * Lookup order:\n * 1. `models.modeThinkingDefaults[mode]` when set for the mode.\n * 2. The global `preferences.thinkingLevel`.\n *\n * Session-level overrides (via /think or the session settings panel) take\n * precedence over both and are handled by the caller.\n */\nexport function resolveDefaultThinkingLevel(\n settings: GlobalSettings,\n mode?: string | null,\n): { level: ThinkingLevelSetting; source: ThinkingLevelSource } {\n const modeLevel = mode ? settings.models.modeThinkingDefaults[mode] : undefined;\n if (modeLevel) return { level: modeLevel, source: 'mode-default' };\n return { level: settings.preferences.thinkingLevel, source: 'global' };\n}\n\n/**\n * Resolve the effective model ID for one of the two OM roles.\n *\n * Lookup order:\n * 1. The role-specific override (`observerModelOverride` /\n * `reflectorModelOverride`) if set.\n * 2. If `activeOmPackId` points at a built-in pack, that pack's model.\n * 3. The shared `omModelOverride` fallback.\n *\n * @param settings The loaded global settings.\n * @param role Which OM role to resolve (`'observer'` or `'reflector'`).\n * @param builtinOmPacks Built-in OM packs for the current provider access\n * (from `getAvailableOmPacks`). Pass `[]` if unavailable.\n */\nexport function resolveOmRoleModel(\n settings: GlobalSettings,\n role: 'observer' | 'reflector',\n builtinOmPacks: Array<{ id: string; modelId: string }>,\n): string | null {\n const { activeOmPackId, omModelOverride, observerModelOverride, reflectorModelOverride } = settings.models;\n const roleOverride = role === 'observer' ? observerModelOverride : reflectorModelOverride;\n if (roleOverride) return roleOverride;\n\n if (!activeOmPackId) return omModelOverride;\n if (activeOmPackId === 'custom') return omModelOverride;\n\n const pack = builtinOmPacks.find(p => p.id === activeOmPackId);\n if (pack) return pack.modelId;\n\n return omModelOverride;\n}\n\n/**\n * @deprecated Use `resolveOmRoleModel(settings, 'observer' | 'reflector', ...)`.\n * Equivalent to resolving the observer role (existing callers set both observer\n * and reflector to the same value).\n */\nexport function resolveOmModel(\n settings: GlobalSettings,\n builtinOmPacks: Array<{ id: string; modelId: string }>,\n): string | null {\n return resolveOmRoleModel(settings, 'observer', builtinOmPacks);\n}\n\nfunction getSignalSettingsForSave(settings: GlobalSettings, filePath: string): SignalSettings {\n const loadedSignals = loadedSignalSettings.get(settings);\n if (!loadedSignals || !signalSettingsEqual(settings.signals, loadedSignals) || !existsSync(filePath)) {\n return settings.signals;\n }\n\n try {\n const currentRaw = JSON.parse(readFileSync(filePath, 'utf-8')) as Record<string, unknown>;\n const currentSignals = parseSignalSettings(currentRaw.signals);\n if (!signalSettingsEqual(currentSignals, loadedSignals)) {\n return currentSignals;\n }\n } catch {\n // If the current file is unreadable, fall back to the caller's settings.\n }\n\n return settings.signals;\n}\n\nexport function saveSettings(settings: GlobalSettings, filePath: string = getSettingsPath()): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n const signals = getSignalSettingsForSave(settings, filePath);\n settings.signals = signals;\n loadedSignalSettings.set(settings, cloneSignalSettings(signals));\n writeFileSync(filePath, JSON.stringify(settings, null, 2), 'utf-8');\n}\n\n/** Marker file name to track which provider last used a profile. */\nconst PROFILE_PROVIDER_MARKER = '.mastra-provider';\n\n/**\n * Check which provider last used a profile directory.\n * Returns the provider name if the marker exists, undefined otherwise.\n */\nexport function getProfileProvider(profilePath: string): BrowserProvider | undefined {\n const markerPath = join(profilePath, PROFILE_PROVIDER_MARKER);\n if (!existsSync(markerPath)) {\n return undefined;\n }\n try {\n const content = readFileSync(markerPath, 'utf-8').trim();\n if (content === 'stagehand' || content === 'agent-browser') {\n return content;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Write the provider marker to a profile directory.\n * Creates the directory if it doesn't exist.\n */\nexport function setProfileProvider(profilePath: string, provider: BrowserProvider): void {\n const markerPath = join(profilePath, PROFILE_PROVIDER_MARKER);\n if (!existsSync(profilePath)) {\n mkdirSync(profilePath, { recursive: true });\n }\n writeFileSync(markerPath, provider, 'utf-8');\n}\n\n/**\n * Check if a profile has a provider mismatch.\n * Returns the existing provider if there's a mismatch, undefined otherwise.\n */\nexport function checkProfileProviderMismatch(\n profilePath: string | undefined,\n targetProvider: BrowserProvider,\n): BrowserProvider | undefined {\n if (!profilePath) {\n return undefined;\n }\n const existingProvider = getProfileProvider(profilePath);\n if (existingProvider && existingProvider !== targetProvider) {\n return existingProvider;\n }\n return undefined;\n}\n\nfunction browserRecordingOptions() {\n return { outputDir: join(getAppDataDir(), 'browser-recordings') };\n}\n\n/**\n * Create a browser instance from settings.\n * Shared by startup (main.ts) and live reconfiguration (/browser command).\n * Returns undefined if browser is disabled.\n */\nexport async function createBrowserFromSettings(settings: BrowserSettings): Promise<MastraBrowser | undefined> {\n if (!settings.enabled) {\n return undefined;\n }\n\n const { provider, headless, viewport, cdpUrl, profile, executablePath, stagehand, agentBrowser } = settings;\n\n // Chrome only allows one process per profile directory, so force 'shared' scope\n // when a profile is set. Otherwise use the user's setting (or provider default).\n const scope = profile ? ('shared' as const) : settings.scope;\n\n // Common launch options (no CDP)\n const launchConfig = { headless, viewport, profile, executablePath, scope } as const;\n\n if (provider === 'stagehand') {\n const { StagehandBrowser } = await import('@mastra/stagehand');\n const stagehandOpts: Record<string, unknown> = {\n env: stagehand?.env ?? 'LOCAL',\n apiKey: stagehand?.apiKey ?? process.env.BROWSERBASE_API_KEY,\n projectId: stagehand?.projectId ?? process.env.BROWSERBASE_PROJECT_ID,\n preserveUserDataDir: stagehand?.preserveUserDataDir,\n recording: browserRecordingOptions(),\n };\n\n // When the user has an active OpenAI Codex (ChatGPT) subscription, route\n // Stagehand through the Codex endpoint. We use the AI SDK provider's\n // standard hooks (baseURL, headers, fetch, and middleware) instead of a\n // URL-rewriting fetch:\n // - baseURL: target Codex's Responses API directly (no URL rewriting).\n // - headers: static Codex identifiers (originator, UA, account id).\n // - fetch: a tiny refresher that injects the live OAuth bearer per call,\n // since AI SDK takes `apiKey` as a static string.\n // - middleware: createCodexMiddleware() sets `store: false`, which Codex\n // requires on every request.\n // Model is `gpt-5.4-mini`, the current ChatGPT-sign-in Codex whitelist\n // pick suited to Stagehand's vision + structured-output workload.\n //\n // An explicitly configured model wins: Codex is a fallback for users who\n // have no model of their own, not an override of one they chose. Stagehand\n // resolves the provider's API key from the environment for plain\n // `provider/model` strings, so no key plumbing is needed here.\n const authStorage = new AuthStorage();\n const cred = authStorage.get('openai-codex');\n if (stagehand?.model) {\n stagehandOpts.model = stagehand.model;\n } else if (cred?.type === 'oauth') {\n const accountId = (cred as any).accountId as string | undefined;\n stagehandOpts.model = {\n modelName: 'openai/gpt-5.4-mini',\n apiKey: 'codex-oauth',\n baseURL: 'https://chatgpt.com/backend-api/codex',\n headers: {\n originator: 'mastracode',\n 'User-Agent': 'mastracode',\n ...(accountId ? { 'ChatGPT-Account-ID': accountId } : {}),\n },\n fetch: buildCodexStagehandFetch(authStorage),\n middleware: createCodexMiddleware(),\n } as any;\n }\n\n return cdpUrl\n ? new StagehandBrowser({ ...launchConfig, cdpUrl, scope: 'shared', ...stagehandOpts })\n : new StagehandBrowser({ ...launchConfig, ...stagehandOpts });\n } else if (provider === 'agent-browser') {\n const { AgentBrowser } = await import('@mastra/agent-browser');\n const agentBrowserOpts = {\n storageState: agentBrowser?.storageState,\n recording: browserRecordingOptions(),\n };\n return cdpUrl\n ? new AgentBrowser({ ...launchConfig, cdpUrl, scope: 'shared', ...agentBrowserOpts })\n : new AgentBrowser({ ...launchConfig, ...agentBrowserOpts, scope });\n }\n\n throw new Error(`Unsupported browser provider: ${provider}`);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"settings.js","names":[],"sources":["../../src/onboarding/settings.ts"],"sourcesContent":["/**\n * Persistent global settings stored in the app data directory as settings.json.\n * This file persists onboarding state AND user preferences (model choices, yolo, etc.)\n * so they carry across threads and restarts.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { MastraBrowser } from '@mastra/core/browser';\nimport type { LSPConfig } from '@mastra/core/workspace';\nimport { AuthStorage } from '../auth/storage.js';\nimport { buildCodexStagehandFetch, createCodexMiddleware } from '../providers/openai-codex.js';\nimport { getAppDataDir } from '../utils/project.js';\nimport { DEFAULT_STT_PROVIDER, resolveSTTModel } from '../voice/stt-registry.js';\n\n/** A saved custom pack — user-defined model selections for each mode. */\nexport interface CustomPack {\n name: string;\n models: Record<string, string>;\n createdAt: string;\n}\n\n/** A saved custom provider for OpenAI-compatible endpoints. */\nexport interface CustomProviderSetting {\n name: string;\n url: string;\n apiKey?: string;\n models: string[];\n}\n\n/** Storage backend type. */\nexport type StorageBackend = 'libsql' | 'pg';\n\n/** LibSQL-specific storage settings. */\nexport interface LibSQLStorageSettings {\n url?: string;\n authToken?: string;\n}\n\n/** PostgreSQL-specific storage settings. */\nexport interface PgStorageSettings {\n connectionString?: string;\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n schemaName?: string;\n disableInit?: boolean;\n skipDefaultIndexes?: boolean;\n}\n\n/** Storage configuration persisted in global settings. */\nexport interface StorageSettings {\n /** Which backend to use. Default: 'libsql'. */\n backend: StorageBackend;\n /** LibSQL-specific config (used when backend is 'libsql'). */\n libsql: LibSQLStorageSettings;\n /** PostgreSQL-specific config (used when backend is 'pg'). */\n pg: PgStorageSettings;\n}\n\n/** Gateway provider key used in AuthStorage. */\nexport const MASTRA_GATEWAY_PROVIDER = 'mastra-gateway';\n\n/** Default gateway URL. */\nexport const MASTRA_GATEWAY_DEFAULT_URL = 'https://gateway-api.mastra.ai';\n\n/** @deprecated Renamed to {@link MASTRA_GATEWAY_PROVIDER}. */\nexport const MEMORY_GATEWAY_PROVIDER = MASTRA_GATEWAY_PROVIDER;\n\n/** @deprecated Renamed to {@link MASTRA_GATEWAY_DEFAULT_URL}. */\nexport const MEMORY_GATEWAY_DEFAULT_URL = MASTRA_GATEWAY_DEFAULT_URL;\n\n/** Valid persisted thinking level values. */\nexport type ThinkingLevelSetting = 'off' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\n/** Browser provider type. */\nexport type BrowserProvider = 'stagehand' | 'agent-browser';\n\n/** Direct TUI `!` shell passthrough mode. */\nexport type ShellPassthroughSettingsMode = 'default' | 'path' | 'login';\n\n/** Direct TUI `!` shell command language. */\nexport type ShellPassthroughSettingsFamily = 'posix' | 'cmd' | 'powershell';\n\n/** Direct TUI `!` shell passthrough configuration. */\nexport interface ShellPassthroughSettings {\n mode?: ShellPassthroughSettingsMode | string;\n executable?: string;\n family?: ShellPassthroughSettingsFamily | string;\n}\n\n/** STT engine: on-device macOS recognizer or a cloud provider. */\nexport type VoiceEngine = 'macos-native' | 'cloud';\n\n/** Voice (hold-space dictation) configuration persisted in global settings. */\nexport interface VoiceSettings {\n /** Whether hold-space voice input is enabled. */\n enabled: boolean;\n /** Which STT engine to use. Defaults to macOS native on darwin, else cloud. */\n engine: VoiceEngine;\n /** Cloud provider id (matches an STT registry entry). Cloud engine only. */\n provider: string;\n /** Cloud model id; defaults to the provider's first registry model. */\n model?: string;\n}\n\n/** Stagehand environment type. */\nexport type StagehandEnv = 'LOCAL' | 'BROWSERBASE';\n\n/**\n * Browser viewport: explicit dimensions, or `'window'` to follow the real\n * browser window instead of emulating a fixed size.\n */\nexport type BrowserViewport = { width: number; height: number } | 'window';\n\n/** Named viewport sizes offered by `/browser set viewport`. */\nexport const VIEWPORT_PRESETS = {\n desktop: { width: 1280, height: 720 },\n 'desktop-hd': { width: 1920, height: 1080 },\n laptop: { width: 1440, height: 900 },\n tablet: { width: 768, height: 1024 },\n mobile: { width: 390, height: 844 },\n} as const satisfies Record<string, { width: number; height: number }>;\n\nexport type ViewportPreset = keyof typeof VIEWPORT_PRESETS;\n\n/**\n * Largest viewport dimension accepted. Guards against typos that would launch a\n * browser far larger than any display.\n */\nconst MAX_VIEWPORT_DIMENSION = 10000;\n\nfunction isValidDimension(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value > 0 && value <= MAX_VIEWPORT_DIMENSION;\n}\n\n/**\n * Parse a `WIDTHxHEIGHT` string (e.g. `1280x720`), a preset name, or `window`.\n * Returns undefined when the input is not a usable viewport.\n */\nexport function parseViewportInput(input: string): BrowserViewport | undefined {\n const value = input.trim().toLowerCase();\n if (!value) return undefined;\n if (value === 'window') return 'window';\n if (value in VIEWPORT_PRESETS) return { ...VIEWPORT_PRESETS[value as ViewportPreset] };\n\n const match = /^(\\d+)\\s*[x×]\\s*(\\d+)$/.exec(value);\n if (!match) return undefined;\n const width = Number(match[1]);\n const height = Number(match[2]);\n if (!isValidDimension(width) || !isValidDimension(height)) return undefined;\n return { width, height };\n}\n\n/** Stagehand-specific browser settings. */\nexport interface StagehandSettings {\n env: StagehandEnv;\n apiKey?: string;\n projectId?: string;\n /**\n * Model Stagehand uses for its AI operations, as `provider/model`\n * (for example `anthropic/claude-sonnet-4-5`). Stagehand resolves the\n * provider's API key from the environment (`ANTHROPIC_API_KEY`,\n * `OPENAI_API_KEY`, and so on). Defaults to Stagehand's own default.\n */\n model?: string;\n /** Whether to preserve the user data directory after the browser closes. */\n preserveUserDataDir?: boolean;\n}\n\n/** AgentBrowser-specific browser settings. */\nexport interface AgentBrowserSettings {\n /** Path to a Playwright storage state file (JSON) containing cookies and localStorage. */\n storageState?: string;\n}\n\n/** Browser configuration persisted in global settings. */\nexport interface BrowserSettings {\n /** Whether browser automation is enabled. */\n enabled: boolean;\n /** Which browser provider to use. */\n provider: BrowserProvider;\n /** Whether to run headless (no visible browser window). */\n headless: boolean;\n /**\n * Browser viewport dimensions, or `'window'` to disable viewport emulation so\n * the page follows the real browser window.\n */\n viewport?: BrowserViewport;\n /** CDP URL for connecting to an existing browser. */\n cdpUrl?: string;\n /** Path to a Chrome/Chromium user data directory (profile). */\n profile?: string;\n /** Path to the browser executable to use. */\n executablePath?: string;\n /** Browser scope — 'shared' (all threads share one browser) or 'thread' (each thread gets its own). */\n scope?: 'shared' | 'thread';\n /** Stagehand-specific settings. */\n stagehand?: StagehandSettings;\n /** AgentBrowser-specific settings. */\n agentBrowser?: AgentBrowserSettings;\n}\n\nexport interface GlobalSettings {\n // Onboarding tracking\n onboarding: {\n completedAt: string | null;\n skippedAt: string | null;\n version: number;\n modePackId: string | null;\n omPackId: string | null;\n quietModePreferenceSelected: boolean;\n };\n // Global model preferences (applied to new threads)\n models: {\n /**\n * Active model pack ID. Built-in packs use their id directly (\"anthropic\",\n * \"openai\"). Custom packs use \"custom:<name>\".\n * When set, models are resolved from the pack at startup so pack updates\n * (e.g. new model versions) apply automatically.\n * Cleared when the user manually overrides via /models (falls back to modeDefaults).\n */\n activeModelPackId: string | null;\n /** Explicit per-mode overrides — used when no activeModelPackId is set. */\n modeDefaults: Record<string, string>;\n /**\n * Per-mode reasoning-effort defaults (e.g. { build: \"high\", plan: \"xhigh\" }).\n * Resolved at request time; falls back to `preferences.thinkingLevel` for\n * modes without an entry. Overridden per-session via /think or the session\n * settings panel.\n */\n modeThinkingDefaults: Record<string, ThinkingLevelSetting>;\n /**\n * Active OM pack ID (e.g. \"gemini\", \"anthropic\", \"custom\").\n * When set, the OM model is resolved from the pack at startup so pack\n * updates (e.g. new model versions) apply automatically.\n * Cleared when the user manually overrides via /om (falls back to omModelOverride).\n */\n activeOmPackId: string | null;\n /**\n * Shared OM model override — used for both observer and reflector when a\n * role-specific override is not set. Kept for back-compat with older settings\n * files and set by onboarding when the user picks a custom OM pack.\n */\n omModelOverride: string | null;\n /**\n * Explicit Observer model override — takes precedence over `omModelOverride`\n * when set. Written by `/om` when the observer model is changed independently.\n */\n observerModelOverride: string | null;\n /**\n * Explicit Reflector model override — takes precedence over `omModelOverride`\n * when set. Written by `/om` when the reflector model is changed independently.\n */\n reflectorModelOverride: string | null;\n /** Default OM observation threshold used for new threads unless overridden per-thread. */\n omObservationThreshold: number | null;\n /** Default OM reflection threshold used for new threads unless overridden per-thread. */\n omReflectionThreshold: number | null;\n /**\n * Whether observations and reflections use the terse caveman-style instruction.\n * `null` means inherit the built-in default (currently `false` — caveman is\n * opt-in via `/om` settings). Used as the default for new threads unless\n * overridden per-thread.\n */\n omCavemanObservations: boolean | null;\n /**\n * Whether Observational Memory forwards image/file attachment parts to the\n * Observer LLM. `null` ⇒ inherit built-in default ('auto'). 'auto' checks\n * model capabilities; true/false forces the setting.\n */\n omObserveAttachments: 'auto' | boolean | null;\n /** Per-agent-type subagent model overrides (e.g. { explore: \"openai/gpt-5.1-codex-mini\" }) */\n subagentModels: Record<string, string>;\n /** Default judge model for /goal. */\n goalJudgeModel: string | null;\n /** Default max attempts for /goal. */\n goalMaxTurns: number | null;\n };\n // Global behavior preferences\n preferences: {\n yolo: boolean | null;\n theme: 'auto' | 'dark' | 'light';\n /** Default reasoning effort level used for all threads/models unless overridden in-session. */\n thinkingLevel: ThinkingLevelSetting;\n /** When true, components like subagent output collapse to compact summaries on completion. */\n quietMode: boolean;\n /** Maximum quiet-mode detail preview lines for compact tool calls. Set to 0 to hide previews. */\n quietModeMaxToolPreviewLines: number;\n };\n // Storage backend configuration\n storage: StorageSettings;\n // User-created custom model packs\n customModelPacks: CustomPack[];\n // User-created custom providers with custom models\n customProviders: CustomProviderSetting[];\n // Model usage counts for ranking in the selector\n modelUseCounts: Record<string, number>;\n // Version the user dismissed the update prompt for (skip until they manually update past this)\n updateDismissedVersion: string | null;\n // Mastra gateway configuration\n memoryGateway: { baseUrl?: string };\n // LSP configuration forwarded to the workspace\n lsp?: LSPConfig;\n // Browser automation configuration\n browser: BrowserSettings;\n // Direct TUI `!` shell passthrough configuration\n shellPassthrough: ShellPassthroughSettings;\n // Hold-space voice input configuration\n voice: VoiceSettings;\n // Signal routing configuration\n signals: SignalSettings;\n // Cloud observability configuration (per-resource project IDs; tokens stored in auth.json)\n observability: ObservabilitySettings;\n}\n\nexport interface SignalSettings {\n /** Opt into local Unix socket PubSub for cross-process signal routing. */\n unixSocketPubSub: boolean;\n /** Experimental: enable GitHub PR subscription signals backed by gitcrawl. */\n experimentalGithubSignals: boolean;\n}\n\nexport interface ObservabilityResourceConfig {\n /** Cloud project ID for this resource */\n projectId: string;\n /** When this config was created */\n configuredAt: string;\n}\n\nexport interface ObservabilitySettings {\n /** Per-resource cloud project configs, keyed by resourceId */\n resources: Record<string, ObservabilityResourceConfig>;\n /** Whether to store traces locally in DuckDB. Off by default to avoid disk usage. */\n localTracing: boolean;\n}\n\n/** Auth key prefix for observability tokens stored per-resource in auth.json */\nexport const OBSERVABILITY_AUTH_PREFIX = 'observability:';\n\nexport const STORAGE_DEFAULTS: StorageSettings = {\n backend: 'libsql',\n libsql: {},\n pg: {},\n};\n\n/** Default STT engine: on-device macOS recognizer where available, else cloud. */\nexport function defaultVoiceEngine(): VoiceEngine {\n return process.platform === 'darwin' ? 'macos-native' : 'cloud';\n}\n\nconst DEFAULTS: GlobalSettings = {\n onboarding: {\n completedAt: null,\n skippedAt: null,\n version: 0,\n modePackId: null,\n omPackId: null,\n quietModePreferenceSelected: true,\n },\n models: {\n activeModelPackId: null,\n modeDefaults: {},\n modeThinkingDefaults: {},\n activeOmPackId: null,\n omModelOverride: null,\n observerModelOverride: null,\n reflectorModelOverride: null,\n omObservationThreshold: null,\n omReflectionThreshold: null,\n omCavemanObservations: null,\n omObserveAttachments: null,\n subagentModels: {},\n goalJudgeModel: null,\n goalMaxTurns: null,\n },\n preferences: {\n yolo: null,\n theme: 'auto',\n thinkingLevel: 'off',\n quietMode: false,\n quietModeMaxToolPreviewLines: 2,\n },\n storage: { ...STORAGE_DEFAULTS },\n customModelPacks: [],\n customProviders: [],\n modelUseCounts: {},\n updateDismissedVersion: null,\n memoryGateway: {},\n lsp: {},\n browser: {\n enabled: false,\n provider: 'stagehand',\n headless: false,\n viewport: { ...VIEWPORT_PRESETS.desktop },\n stagehand: { env: 'LOCAL' },\n },\n shellPassthrough: { mode: 'default' },\n voice: { enabled: false, engine: defaultVoiceEngine(), provider: DEFAULT_STT_PROVIDER },\n signals: { unixSocketPubSub: false, experimentalGithubSignals: false },\n observability: { resources: {}, localTracing: false },\n};\n\nexport const THINKING_LEVEL_VALUES: ThinkingLevelSetting[] = ['off', 'low', 'medium', 'high', 'xhigh', 'max'];\nconst QUIET_MODE_MAX_TOOL_PREVIEW_LINES_MAX = 8;\nconst loadedSignalSettings = new WeakMap<GlobalSettings, SignalSettings>();\n\nfunction cloneSignalSettings(signals: SignalSettings): SignalSettings {\n return { ...signals };\n}\n\nfunction rememberLoadedSettings(settings: GlobalSettings): GlobalSettings {\n loadedSignalSettings.set(settings, cloneSignalSettings(settings.signals));\n return settings;\n}\n\nfunction signalSettingsEqual(left: SignalSettings, right: SignalSettings): boolean {\n return (\n left.unixSocketPubSub === right.unixSocketPubSub &&\n left.experimentalGithubSignals === right.experimentalGithubSignals\n );\n}\n\nfunction parseThinkingLevel(value: unknown): ThinkingLevelSetting {\n return typeof value === 'string' && THINKING_LEVEL_VALUES.includes(value as ThinkingLevelSetting)\n ? (value as ThinkingLevelSetting)\n : DEFAULTS.preferences.thinkingLevel;\n}\n\nexport function isThinkingLevelSetting(value: unknown): value is ThinkingLevelSetting {\n return typeof value === 'string' && THINKING_LEVEL_VALUES.includes(value as ThinkingLevelSetting);\n}\n\nfunction parseModeThinkingDefaults(value: unknown): Record<string, ThinkingLevelSetting> {\n if (!value || typeof value !== 'object') return {};\n const result: Record<string, ThinkingLevelSetting> = {};\n for (const [mode, level] of Object.entries(value as Record<string, unknown>)) {\n if (isThinkingLevelSetting(level)) {\n result[mode] = level;\n }\n }\n return result;\n}\n\nfunction parseQuietModeMaxToolPreviewLines(value: unknown): number {\n const rawValue =\n typeof value === 'number' && Number.isFinite(value) ? value : DEFAULTS.preferences.quietModeMaxToolPreviewLines;\n return Math.min(QUIET_MODE_MAX_TOOL_PREVIEW_LINES_MAX, Math.max(0, Math.floor(rawValue)));\n}\n\nfunction parsePreferences(rawPreferences: unknown): GlobalSettings['preferences'] {\n const raw = rawPreferences && typeof rawPreferences === 'object' ? (rawPreferences as Record<string, unknown>) : {};\n\n return {\n ...DEFAULTS.preferences,\n ...raw,\n thinkingLevel: parseThinkingLevel(raw.thinkingLevel),\n quietModeMaxToolPreviewLines: parseQuietModeMaxToolPreviewLines(raw.quietModeMaxToolPreviewLines),\n };\n}\n\nfunction parseSignalSettings(rawSignals: unknown): SignalSettings {\n const raw = rawSignals && typeof rawSignals === 'object' ? (rawSignals as Record<string, unknown>) : {};\n return {\n unixSocketPubSub:\n typeof raw.unixSocketPubSub === 'boolean' ? raw.unixSocketPubSub : DEFAULTS.signals.unixSocketPubSub,\n experimentalGithubSignals:\n typeof raw.experimentalGithubSignals === 'boolean'\n ? raw.experimentalGithubSignals\n : DEFAULTS.signals.experimentalGithubSignals,\n };\n}\n\nfunction hasQuietModePreferenceSelected(rawOnboarding: unknown): boolean {\n return Boolean(\n rawOnboarding &&\n typeof rawOnboarding === 'object' &&\n Object.prototype.hasOwnProperty.call(rawOnboarding, 'quietModePreferenceSelected'),\n );\n}\n\nfunction applyQuietModePreferenceRollout(settings: GlobalSettings, rawOnboarding: unknown): void {\n if (hasQuietModePreferenceSelected(rawOnboarding)) return;\n settings.onboarding.quietModePreferenceSelected = settings.preferences.quietMode === true;\n}\n\nfunction getNewInstallDefaults(): GlobalSettings {\n const settings = structuredClone(DEFAULTS);\n settings.preferences.quietMode = true;\n settings.onboarding.quietModePreferenceSelected = true;\n return settings;\n}\n\nexport function getSettingsPath(): string {\n return join(getAppDataDir(), 'settings.json');\n}\n\nexport function getCustomProviderId(name: string): string {\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return slug || 'provider';\n}\n\nexport function toCustomProviderModelId(providerName: string, modelName: string): string {\n const providerId = getCustomProviderId(providerName);\n const trimmedModelName = modelName.trim();\n const providerPrefix = `${providerId}/`;\n if (trimmedModelName.startsWith(providerPrefix)) {\n return trimmedModelName;\n }\n return `${providerId}/${trimmedModelName}`;\n}\n\n/**\n * The shared gateway catalog namespaces provider keys under their owning\n * gateway id, so a custom provider's models surface in the `/models` catalog\n * as `mastracode/<providerId>/<model>` instead of the canonical\n * `<providerId>/<model>` that model resolution expects. Persisting the\n * gateway-qualified id verbatim breaks lookup later (the provider is parsed\n * as `mastracode`). Strip the prefix before saving — but only when the\n * middle segment matches one of the user's configured custom providers, so\n * legitimate `mastracode/...` gateway-routed ids are left untouched.\n */\nexport function stripMastraCodeCustomProviderPrefix(\n modelId: string,\n customProviders: Array<Pick<CustomProviderSetting, 'name'>>,\n): string {\n const gatewayPrefix = 'mastracode/';\n if (!modelId.startsWith(gatewayPrefix)) return modelId;\n\n const rest = modelId.slice(gatewayPrefix.length);\n const [providerId, ...modelParts] = rest.split('/');\n if (!providerId || modelParts.length === 0 || modelParts.some(part => part.length === 0)) return modelId;\n\n const isCustomProvider = customProviders.some(provider => getCustomProviderId(provider.name) === providerId);\n return isCustomProvider ? rest : modelId;\n}\n\nexport function parseCustomProviders(rawProviders: unknown): CustomProviderSetting[] {\n if (!Array.isArray(rawProviders)) return [];\n\n const parsedProviders: CustomProviderSetting[] = [];\n for (const rawProvider of rawProviders) {\n if (!rawProvider || typeof rawProvider !== 'object') continue;\n\n const candidate = rawProvider as Record<string, unknown>;\n const name = typeof candidate.name === 'string' ? candidate.name.trim() : '';\n const url = typeof candidate.url === 'string' ? candidate.url.trim() : '';\n if (!name || !url) continue;\n\n const providerId = getCustomProviderId(name);\n const models = Array.isArray(candidate.models)\n ? [\n ...new Set(\n candidate.models\n .filter((model): model is string => typeof model === 'string')\n .map(model => model.trim())\n .map(model => {\n const providerPrefix = `${providerId}/`;\n if (model.startsWith(providerPrefix)) {\n return model.slice(providerPrefix.length);\n }\n return model;\n }),\n ),\n ].filter(model => model.length > 0)\n : [];\n\n const apiKey =\n typeof candidate.apiKey === 'string' && candidate.apiKey.trim().length > 0 ? candidate.apiKey.trim() : undefined;\n\n parsedProviders.push({\n name,\n url,\n ...(apiKey ? { apiKey } : {}),\n models,\n });\n }\n\n return parsedProviders;\n}\n\nconst BROWSER_PROVIDERS = new Set<BrowserProvider>(['stagehand', 'agent-browser']);\nconst STAGEHAND_ENVS = new Set<StagehandEnv>(['LOCAL', 'BROWSERBASE']);\n\n/**\n * Normalize a Stagehand model id, which must be provider-qualified.\n *\n * Stagehand reads the segment before the first slash as the provider, so a\n * bare id like `gpt-4.1` is rejected as an unknown provider and a trailing\n * slash leaves an empty model name that only fails once a request is made.\n * Neither is usable, so both are dropped here rather than persisted.\n *\n * The provider name itself is checked where the command is issued, which can\n * name the supported providers in an error; this module is on the startup path\n * and only imports Stagehand lazily.\n *\n * @returns the trimmed model id, or undefined when it is unusable.\n */\nfunction parseStagehandModel(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const model = value.trim();\n const separator = model.indexOf('/');\n if (separator <= 0) return undefined;\n return model.slice(separator + 1).trim() ? model : undefined;\n}\n\n/**\n * Validate a viewport read from settings.json, falling back to the default when\n * it is missing or malformed.\n */\nfunction parseStoredViewport(raw: unknown): BrowserViewport {\n if (raw === 'window') return 'window';\n if (raw && typeof raw === 'object') {\n const { width, height } = raw as Record<string, unknown>;\n if (isValidDimension(width) && isValidDimension(height)) return { width, height };\n }\n return { ...VIEWPORT_PRESETS.desktop };\n}\n\n/**\n * Deep-merge and validate browser settings from JSON.\n * Explicitly validates types to handle malformed settings.json gracefully.\n */\nfunction parseBrowserSettings(rawBrowser: unknown): BrowserSettings {\n const raw = rawBrowser && typeof rawBrowser === 'object' ? (rawBrowser as Record<string, unknown>) : {};\n const rawStagehand =\n raw.stagehand && typeof raw.stagehand === 'object' ? (raw.stagehand as Record<string, unknown>) : {};\n const stagehandModel = parseStagehandModel(rawStagehand.model);\n const rawAgentBrowser =\n raw.agentBrowser && typeof raw.agentBrowser === 'object' ? (raw.agentBrowser as Record<string, unknown>) : {};\n\n return {\n enabled: typeof raw.enabled === 'boolean' ? raw.enabled : DEFAULTS.browser.enabled,\n provider:\n typeof raw.provider === 'string' && BROWSER_PROVIDERS.has(raw.provider as BrowserProvider)\n ? (raw.provider as BrowserProvider)\n : DEFAULTS.browser.provider,\n headless: typeof raw.headless === 'boolean' ? raw.headless : DEFAULTS.browser.headless,\n cdpUrl: typeof raw.cdpUrl === 'string' && raw.cdpUrl.trim() ? raw.cdpUrl.trim() : undefined,\n profile: typeof raw.profile === 'string' && raw.profile.trim() ? raw.profile.trim() : undefined,\n executablePath:\n typeof raw.executablePath === 'string' && raw.executablePath.trim() ? raw.executablePath.trim() : undefined,\n viewport: parseStoredViewport(raw.viewport),\n scope: typeof raw.scope === 'string' && (raw.scope === 'shared' || raw.scope === 'thread') ? raw.scope : undefined,\n stagehand: {\n env:\n typeof rawStagehand.env === 'string' && STAGEHAND_ENVS.has(rawStagehand.env as StagehandEnv)\n ? (rawStagehand.env as StagehandEnv)\n : DEFAULTS.browser.stagehand!.env,\n ...(typeof rawStagehand.apiKey === 'string' && rawStagehand.apiKey.trim()\n ? { apiKey: rawStagehand.apiKey.trim() }\n : {}),\n ...(typeof rawStagehand.projectId === 'string' && rawStagehand.projectId.trim()\n ? { projectId: rawStagehand.projectId.trim() }\n : {}),\n ...(stagehandModel ? { model: stagehandModel } : {}),\n ...(typeof rawStagehand.preserveUserDataDir === 'boolean'\n ? { preserveUserDataDir: rawStagehand.preserveUserDataDir }\n : {}),\n },\n agentBrowser:\n typeof rawAgentBrowser.storageState === 'string' && rawAgentBrowser.storageState.trim()\n ? { storageState: rawAgentBrowser.storageState.trim() }\n : undefined,\n };\n}\n\nfunction parseShellPassthroughSettings(rawShellPassthrough: unknown): ShellPassthroughSettings {\n const raw =\n rawShellPassthrough && typeof rawShellPassthrough === 'object'\n ? (rawShellPassthrough as Record<string, unknown>)\n : {};\n const executable = typeof raw.executable === 'string' && raw.executable.trim() ? raw.executable.trim() : undefined;\n const family = typeof raw.family === 'string' && raw.family.trim() ? raw.family.trim() : undefined;\n const mode = typeof raw.mode === 'string' && raw.mode.trim() ? raw.mode.trim() : undefined;\n const defaultMode = executable ? undefined : DEFAULTS.shellPassthrough.mode;\n\n return {\n ...((mode ?? defaultMode) ? { mode: mode ?? defaultMode } : {}),\n ...(executable ? { executable } : {}),\n ...(family ? { family } : {}),\n };\n}\n\nfunction parseVoiceSettings(rawVoice: unknown): VoiceSettings {\n const raw = rawVoice && typeof rawVoice === 'object' ? (rawVoice as Record<string, unknown>) : {};\n const enabled = typeof raw.enabled === 'boolean' ? raw.enabled : DEFAULTS.voice.enabled;\n const engine: VoiceEngine =\n raw.engine === 'macos-native' || raw.engine === 'cloud' ? raw.engine : defaultVoiceEngine();\n // Validate provider/model against the registry, falling back to a usable entry\n // so old `{ enabled }`-only files and unknown values still resolve cleanly.\n const provider = typeof raw.provider === 'string' ? raw.provider : DEFAULTS.voice.provider;\n const model = typeof raw.model === 'string' ? raw.model : undefined;\n const resolved = resolveSTTModel(provider, model);\n return {\n enabled,\n engine,\n provider: resolved.provider,\n model: resolved.model,\n };\n}\n\nconst VALID_PROJECT_ID = /^[a-zA-Z0-9_-]+$/;\n\nfunction parseObservabilitySettings(raw: unknown): ObservabilitySettings {\n if (!raw || typeof raw !== 'object') return { resources: {}, localTracing: false };\n const obj = raw as Record<string, unknown>;\n const localTracing = obj.localTracing === true;\n const rawResources = obj.resources;\n if (!rawResources || typeof rawResources !== 'object') return { resources: {}, localTracing };\n const resources: Record<string, ObservabilityResourceConfig> = {};\n for (const [key, val] of Object.entries(rawResources as Record<string, unknown>)) {\n if (val && typeof val === 'object') {\n const v = val as Record<string, unknown>;\n if (typeof v.projectId === 'string' && VALID_PROJECT_ID.test(v.projectId)) {\n resources[key] = {\n projectId: v.projectId,\n configuredAt: typeof v.configuredAt === 'string' ? v.configuredAt : new Date().toISOString(),\n };\n }\n }\n }\n return { resources, localTracing };\n}\n\n/**\n * One-time migration: move model-related data from auth.json to settings.json.\n * Reads `_modelRanks`, `_modeModelId_*`, `_subagentModelId*` from auth.json,\n * merges them into settings, removes them from auth.json, and writes both files.\n * No-ops if auth.json has no _ prefixed model data.\n */\nfunction migrateFromAuth(settingsPath: string): boolean {\n const authPath = join(getAppDataDir(), 'auth.json');\n if (!existsSync(authPath)) return false;\n\n let authData: Record<string, any>;\n try {\n authData = JSON.parse(readFileSync(authPath, 'utf-8'));\n } catch {\n return false;\n }\n\n const modelKeys = Object.keys(authData).filter(k => k.startsWith('_'));\n if (modelKeys.length === 0) return false;\n\n // Load existing settings (or defaults) and merge auth data into it\n let settings: GlobalSettings;\n if (existsSync(settingsPath)) {\n try {\n const raw = JSON.parse(readFileSync(settingsPath, 'utf-8'));\n settings = {\n onboarding: { ...DEFAULTS.onboarding, ...raw.onboarding },\n models: { ...DEFAULTS.models, ...raw.models },\n preferences: parsePreferences(raw.preferences),\n storage: {\n ...STORAGE_DEFAULTS,\n ...raw.storage,\n libsql: { ...STORAGE_DEFAULTS.libsql, ...raw.storage?.libsql },\n pg: { ...STORAGE_DEFAULTS.pg, ...raw.storage?.pg },\n },\n customModelPacks: Array.isArray(raw.customModelPacks) ? raw.customModelPacks : [],\n customProviders: parseCustomProviders(raw.customProviders),\n modelUseCounts: raw.modelUseCounts && typeof raw.modelUseCounts === 'object' ? raw.modelUseCounts : {},\n updateDismissedVersion: typeof raw.updateDismissedVersion === 'string' ? raw.updateDismissedVersion : null,\n memoryGateway: raw.memoryGateway && typeof raw.memoryGateway === 'object' ? raw.memoryGateway : {},\n lsp: raw.lsp && typeof raw.lsp === 'object' ? (raw.lsp as LSPConfig) : undefined,\n browser: parseBrowserSettings(raw.browser),\n shellPassthrough: parseShellPassthroughSettings(raw.shellPassthrough),\n voice: parseVoiceSettings(raw.voice),\n signals: parseSignalSettings(raw.signals),\n observability: parseObservabilitySettings(raw.observability),\n };\n applyQuietModePreferenceRollout(settings, raw.onboarding);\n } catch {\n settings = structuredClone(DEFAULTS);\n }\n } else {\n settings = structuredClone(DEFAULTS);\n }\n\n // Migrate model use counts (only if settings doesn't already have them)\n if (authData._modelRanks && typeof authData._modelRanks === 'object') {\n settings.modelUseCounts = { ...authData._modelRanks, ...settings.modelUseCounts };\n }\n\n // Migrate per-mode model defaults (don't overwrite existing settings)\n for (const key of modelKeys) {\n const modeMatch = key.match(/^_modeModelId_(.+)$/);\n if (modeMatch?.[1] && typeof authData[key] === 'string' && !settings.models.modeDefaults[modeMatch[1]]) {\n settings.models.modeDefaults[modeMatch[1]] = authData[key];\n }\n }\n\n // Migrate subagent models (don't overwrite existing settings)\n for (const key of modelKeys) {\n if (key === '_subagentModelId' && typeof authData[key] === 'string' && !settings.models.subagentModels['default']) {\n settings.models.subagentModels['default'] = authData[key];\n }\n const saMatch = key.match(/^_subagentModelId_(.+)$/);\n if (saMatch?.[1] && typeof authData[key] === 'string' && !settings.models.subagentModels[saMatch[1]]) {\n settings.models.subagentModels[saMatch[1]] = authData[key];\n }\n }\n\n // Write migrated settings\n saveSettings(settings, settingsPath);\n\n // Clean up auth.json — remove _ prefixed keys\n for (const key of modelKeys) {\n delete authData[key];\n }\n try {\n writeFileSync(authPath, JSON.stringify(authData, null, 2), 'utf-8');\n } catch {\n // Non-fatal — settings are saved, auth cleanup can fail\n }\n\n return true;\n}\n\nconst LEGACY_VARIED_MODELS: Record<string, string> = {\n plan: 'openai/gpt-5.4',\n build: 'anthropic/claude-sonnet-4-5',\n fast: 'anthropic/claude-haiku-4-5',\n};\n\nexport function migrateLegacyVariedPack(settings: GlobalSettings): boolean {\n const legacyPackId = 'varied';\n const customPackId = 'custom:varied';\n const hasLegacyReference =\n settings.models.activeModelPackId === legacyPackId || settings.onboarding.modePackId === legacyPackId;\n\n if (!hasLegacyReference) return false;\n\n const existingIdx = settings.customModelPacks.findIndex(p => p.name === 'varied');\n if (existingIdx >= 0) {\n const existing = settings.customModelPacks[existingIdx]!;\n const modelsMatch = Object.entries(LEGACY_VARIED_MODELS).every(([k, v]) => existing.models[k] === v);\n if (!modelsMatch) {\n existing.models = { ...LEGACY_VARIED_MODELS };\n }\n } else {\n settings.customModelPacks.push({\n name: 'varied',\n models: { ...LEGACY_VARIED_MODELS },\n createdAt: new Date().toISOString(),\n });\n }\n\n if (settings.models.activeModelPackId === legacyPackId) {\n settings.models.activeModelPackId = customPackId;\n if (Object.keys(settings.models.modeDefaults).length === 0) {\n settings.models.modeDefaults = { ...LEGACY_VARIED_MODELS };\n }\n }\n\n if (settings.onboarding.modePackId === legacyPackId) {\n settings.onboarding.modePackId = customPackId;\n }\n\n return true;\n}\n\nexport function loadSettings(filePath: string = getSettingsPath()): GlobalSettings {\n // One-time migration: move model data from auth.json into settings.json\n migrateFromAuth(filePath);\n\n if (!existsSync(filePath)) return rememberLoadedSettings(getNewInstallDefaults());\n try {\n const raw = JSON.parse(readFileSync(filePath, 'utf-8'));\n // Spread raw first to preserve unknown top-level keys (forward-compatibility),\n // then overlay with parsed/typed fields so known keys are always correct.\n const settings: GlobalSettings = {\n ...raw,\n onboarding: { ...DEFAULTS.onboarding, ...raw.onboarding },\n models: {\n ...DEFAULTS.models,\n ...raw.models,\n modeThinkingDefaults: parseModeThinkingDefaults(raw.models?.modeThinkingDefaults),\n },\n preferences: parsePreferences(raw.preferences),\n storage: {\n ...STORAGE_DEFAULTS,\n ...raw.storage,\n libsql: { ...STORAGE_DEFAULTS.libsql, ...raw.storage?.libsql },\n pg: { ...STORAGE_DEFAULTS.pg, ...raw.storage?.pg },\n },\n customModelPacks: Array.isArray(raw.customModelPacks) ? raw.customModelPacks : [],\n customProviders: parseCustomProviders(raw.customProviders),\n modelUseCounts: raw.modelUseCounts && typeof raw.modelUseCounts === 'object' ? raw.modelUseCounts : {},\n updateDismissedVersion: typeof raw.updateDismissedVersion === 'string' ? raw.updateDismissedVersion : null,\n memoryGateway: raw.memoryGateway && typeof raw.memoryGateway === 'object' ? raw.memoryGateway : {},\n lsp: raw.lsp && typeof raw.lsp === 'object' ? (raw.lsp as LSPConfig) : undefined,\n browser: parseBrowserSettings(raw.browser),\n shellPassthrough: parseShellPassthroughSettings(raw.shellPassthrough),\n voice: parseVoiceSettings(raw.voice),\n signals: parseSignalSettings(raw.signals),\n observability: parseObservabilitySettings(raw.observability),\n };\n\n // Migrate legacy omModelId → omModelOverride\n let settingsChanged = false;\n if (!hasQuietModePreferenceSelected(raw.onboarding)) {\n applyQuietModePreferenceRollout(settings, raw.onboarding);\n settingsChanged = true;\n }\n if (raw.models?.omModelId && !settings.models.omModelOverride) {\n settings.models.omModelOverride = raw.models.omModelId;\n settingsChanged = true;\n }\n\n if (migrateLegacyVariedPack(settings)) {\n settingsChanged = true;\n }\n\n if (settingsChanged) {\n saveSettings(settings, filePath);\n }\n\n return rememberLoadedSettings(settings);\n } catch {\n return rememberLoadedSettings(structuredClone(DEFAULTS));\n }\n}\n\nexport const THREAD_ACTIVE_MODEL_PACK_ID_KEY = 'activeModelPackId';\n\nexport interface ThreadSettings {\n activeModelPackId: string | null;\n modeModelIds: Record<string, string>;\n}\n\nexport function parseThreadSettings(metadata: Record<string, unknown> | undefined): ThreadSettings {\n const modeModelIds: Record<string, string> = {};\n for (const [key, value] of Object.entries(metadata ?? {})) {\n const modeMatch = key.match(/^modeModelId_(.+)$/);\n if (modeMatch?.[1] && typeof value === 'string' && value.length > 0) {\n modeModelIds[modeMatch[1]] = value;\n }\n }\n\n const rawPackId = metadata?.[THREAD_ACTIVE_MODEL_PACK_ID_KEY];\n const activeModelPackId = typeof rawPackId === 'string' && rawPackId.length > 0 ? rawPackId : null;\n\n return {\n activeModelPackId,\n modeModelIds,\n };\n}\n\n/**\n * Resolve active model pack id for the current thread.\n *\n * Priority:\n * 1) explicit thread metadata activeModelPackId\n * 2) inferred from thread modeModelId_* values\n * 3) global settings.models.activeModelPackId\n */\nexport function resolveThreadActiveModelPackId(\n settings: GlobalSettings,\n builtinPacks: Array<{ id: string; models: Record<string, string> }>,\n metadata: Record<string, unknown> | undefined,\n): string | null {\n const threadSettings = parseThreadSettings(metadata);\n\n const isKnownPack = (packId: string): boolean => {\n if (packId.startsWith('custom:')) {\n const name = packId.slice('custom:'.length);\n return settings.customModelPacks.some(p => p.name === name);\n }\n return builtinPacks.some(p => p.id === packId);\n };\n\n if (threadSettings.activeModelPackId && isKnownPack(threadSettings.activeModelPackId)) {\n return threadSettings.activeModelPackId;\n }\n\n const allPacks: Array<{ id: string; models: Record<string, string> }> = [\n ...builtinPacks,\n ...settings.customModelPacks.map(p => ({ id: `custom:${p.name}`, models: p.models })),\n ];\n\n for (const pack of allPacks) {\n const packEntries = Object.entries(pack.models);\n const threadEntries = Object.keys(threadSettings.modeModelIds);\n const matches =\n packEntries.length === threadEntries.length &&\n packEntries.every(([modeId, modelId]) => threadSettings.modeModelIds[modeId] === modelId);\n if (matches) return pack.id;\n }\n\n if (settings.models.activeModelPackId && isKnownPack(settings.models.activeModelPackId)) {\n return settings.models.activeModelPackId;\n }\n\n return null;\n}\n\n/**\n * Resolve effective per-mode model defaults.\n *\n * If `activeModelPackId` is set, looks up the pack (built-in or custom) and\n * returns its models. Falls back to the explicit `modeDefaults` map.\n *\n * @param settings The loaded global settings.\n * @param builtinPacks Built-in packs for the current provider access\n * (from `getAvailableModePacks`). Pass `[]` if unavailable.\n */\nexport function resolveModelDefaults(\n settings: GlobalSettings,\n builtinPacks: Array<{ id: string; models: Record<string, string> }>,\n): Record<string, string> {\n const { activeModelPackId, modeDefaults } = settings.models;\n if (!activeModelPackId) return modeDefaults;\n\n // Custom pack: \"custom:<name>\"\n if (activeModelPackId.startsWith('custom:')) {\n const name = activeModelPackId.slice('custom:'.length);\n const pack = settings.customModelPacks.find(p => p.name === name);\n if (pack) return pack.models;\n // Custom pack was deleted — fall through to modeDefaults\n return modeDefaults;\n }\n\n // Built-in pack\n const builtin = builtinPacks.find(p => p.id === activeModelPackId);\n if (builtin) return builtin.models;\n\n // Unknown pack id — fall through\n return modeDefaults;\n}\n\n/** Where a resolved default thinking level came from. */\nexport type ThinkingLevelSource = 'mode-default' | 'global';\n\n/**\n * Resolve the default reasoning-effort level for a mode.\n *\n * Lookup order:\n * 1. `models.modeThinkingDefaults[mode]` when set for the mode.\n * 2. The global `preferences.thinkingLevel`.\n *\n * Session-level overrides (via /think or the session settings panel) take\n * precedence over both and are handled by the caller.\n */\nexport function resolveDefaultThinkingLevel(\n settings: GlobalSettings,\n mode?: string | null,\n): { level: ThinkingLevelSetting; source: ThinkingLevelSource } {\n const modeLevel = mode ? settings.models.modeThinkingDefaults[mode] : undefined;\n if (modeLevel) return { level: modeLevel, source: 'mode-default' };\n return { level: settings.preferences.thinkingLevel, source: 'global' };\n}\n\n/**\n * Resolve the effective model ID for one of the two OM roles.\n *\n * Lookup order:\n * 1. The role-specific override (`observerModelOverride` /\n * `reflectorModelOverride`) if set.\n * 2. If `activeOmPackId` points at a built-in pack, that pack's model.\n * 3. The shared `omModelOverride` fallback.\n *\n * @param settings The loaded global settings.\n * @param role Which OM role to resolve (`'observer'` or `'reflector'`).\n * @param builtinOmPacks Built-in OM packs for the current provider access\n * (from `getAvailableOmPacks`). Pass `[]` if unavailable.\n */\nexport function resolveOmRoleModel(\n settings: GlobalSettings,\n role: 'observer' | 'reflector',\n builtinOmPacks: Array<{ id: string; modelId: string }>,\n): string | null {\n const { activeOmPackId, omModelOverride, observerModelOverride, reflectorModelOverride } = settings.models;\n const roleOverride = role === 'observer' ? observerModelOverride : reflectorModelOverride;\n if (roleOverride) return roleOverride;\n\n if (!activeOmPackId) return omModelOverride;\n if (activeOmPackId === 'custom') return omModelOverride;\n\n const pack = builtinOmPacks.find(p => p.id === activeOmPackId);\n if (pack) return pack.modelId;\n\n return omModelOverride;\n}\n\n/**\n * @deprecated Use `resolveOmRoleModel(settings, 'observer' | 'reflector', ...)`.\n * Equivalent to resolving the observer role (existing callers set both observer\n * and reflector to the same value).\n */\nexport function resolveOmModel(\n settings: GlobalSettings,\n builtinOmPacks: Array<{ id: string; modelId: string }>,\n): string | null {\n return resolveOmRoleModel(settings, 'observer', builtinOmPacks);\n}\n\nfunction getSignalSettingsForSave(settings: GlobalSettings, filePath: string): SignalSettings {\n const loadedSignals = loadedSignalSettings.get(settings);\n if (!loadedSignals || !signalSettingsEqual(settings.signals, loadedSignals) || !existsSync(filePath)) {\n return settings.signals;\n }\n\n try {\n const currentRaw = JSON.parse(readFileSync(filePath, 'utf-8')) as Record<string, unknown>;\n const currentSignals = parseSignalSettings(currentRaw.signals);\n if (!signalSettingsEqual(currentSignals, loadedSignals)) {\n return currentSignals;\n }\n } catch {\n // If the current file is unreadable, fall back to the caller's settings.\n }\n\n return settings.signals;\n}\n\nexport function saveSettings(settings: GlobalSettings, filePath: string = getSettingsPath()): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n const signals = getSignalSettingsForSave(settings, filePath);\n settings.signals = signals;\n loadedSignalSettings.set(settings, cloneSignalSettings(signals));\n writeFileSync(filePath, JSON.stringify(settings, null, 2), 'utf-8');\n}\n\n/** Marker file name to track which provider last used a profile. */\nconst PROFILE_PROVIDER_MARKER = '.mastra-provider';\n\n/**\n * Check which provider last used a profile directory.\n * Returns the provider name if the marker exists, undefined otherwise.\n */\nexport function getProfileProvider(profilePath: string): BrowserProvider | undefined {\n const markerPath = join(profilePath, PROFILE_PROVIDER_MARKER);\n if (!existsSync(markerPath)) {\n return undefined;\n }\n try {\n const content = readFileSync(markerPath, 'utf-8').trim();\n if (content === 'stagehand' || content === 'agent-browser') {\n return content;\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Write the provider marker to a profile directory.\n * Creates the directory if it doesn't exist.\n */\nexport function setProfileProvider(profilePath: string, provider: BrowserProvider): void {\n const markerPath = join(profilePath, PROFILE_PROVIDER_MARKER);\n if (!existsSync(profilePath)) {\n mkdirSync(profilePath, { recursive: true });\n }\n writeFileSync(markerPath, provider, 'utf-8');\n}\n\n/**\n * Check if a profile has a provider mismatch.\n * Returns the existing provider if there's a mismatch, undefined otherwise.\n */\nexport function checkProfileProviderMismatch(\n profilePath: string | undefined,\n targetProvider: BrowserProvider,\n): BrowserProvider | undefined {\n if (!profilePath) {\n return undefined;\n }\n const existingProvider = getProfileProvider(profilePath);\n if (existingProvider && existingProvider !== targetProvider) {\n return existingProvider;\n }\n return undefined;\n}\n\nfunction browserRecordingOptions() {\n return { outputDir: join(getAppDataDir(), 'browser-recordings') };\n}\n\n/**\n * Create a browser instance from settings.\n * Shared by startup (main.ts) and live reconfiguration (/browser command).\n * Returns undefined if browser is disabled.\n */\nexport async function createBrowserFromSettings(settings: BrowserSettings): Promise<MastraBrowser | undefined> {\n if (!settings.enabled) {\n return undefined;\n }\n\n const { provider, headless, viewport, cdpUrl, profile, executablePath, stagehand, agentBrowser } = settings;\n\n // Chrome only allows one process per profile directory, so force 'shared' scope\n // when a profile is set. Otherwise use the user's setting (or provider default).\n const scope = profile ? ('shared' as const) : settings.scope;\n\n // Common launch options (no CDP)\n const launchConfig = { headless, viewport, profile, executablePath, scope } as const;\n\n if (provider === 'stagehand') {\n const { StagehandBrowser } = await import('@mastra/stagehand');\n const stagehandOpts: Record<string, unknown> = {\n env: stagehand?.env ?? 'LOCAL',\n apiKey: stagehand?.apiKey ?? process.env.BROWSERBASE_API_KEY,\n projectId: stagehand?.projectId ?? process.env.BROWSERBASE_PROJECT_ID,\n preserveUserDataDir: stagehand?.preserveUserDataDir,\n recording: browserRecordingOptions(),\n };\n\n // When the user has an active OpenAI Codex (ChatGPT) subscription, route\n // Stagehand through the Codex endpoint. We use the AI SDK provider's\n // standard hooks (baseURL, headers, fetch, and middleware) instead of a\n // URL-rewriting fetch:\n // - baseURL: target Codex's Responses API directly (no URL rewriting).\n // - headers: static Codex identifiers (originator, UA, account id).\n // - fetch: a tiny refresher that injects the live OAuth bearer per call,\n // since AI SDK takes `apiKey` as a static string.\n // - middleware: createCodexMiddleware() sets `store: false`, which Codex\n // requires on every request.\n // Model is `gpt-5.4-mini`, the current ChatGPT-sign-in Codex whitelist\n // pick suited to Stagehand's vision + structured-output workload.\n //\n // An explicitly configured model wins: Codex is a fallback for users who\n // have no model of their own, not an override of one they chose. Stagehand\n // resolves the provider's API key from the environment for plain\n // `provider/model` strings, so no key plumbing is needed here.\n const authStorage = new AuthStorage();\n const cred = authStorage.get('openai-codex');\n if (stagehand?.model) {\n stagehandOpts.model = stagehand.model;\n } else if (cred?.type === 'oauth') {\n const accountId = (cred as any).accountId as string | undefined;\n stagehandOpts.model = {\n modelName: 'openai/gpt-5.4-mini',\n apiKey: 'codex-oauth',\n baseURL: 'https://chatgpt.com/backend-api/codex',\n headers: {\n originator: 'mastracode',\n 'User-Agent': 'mastracode',\n ...(accountId ? { 'ChatGPT-Account-ID': accountId } : {}),\n },\n fetch: buildCodexStagehandFetch(authStorage),\n middleware: createCodexMiddleware(),\n } as any;\n }\n\n return cdpUrl\n ? new StagehandBrowser({ ...launchConfig, cdpUrl, scope: 'shared', ...stagehandOpts })\n : new StagehandBrowser({ ...launchConfig, ...stagehandOpts });\n } else if (provider === 'agent-browser') {\n const { AgentBrowser } = await import('@mastra/agent-browser');\n const agentBrowserOpts = {\n storageState: agentBrowser?.storageState,\n recording: browserRecordingOptions(),\n };\n return cdpUrl\n ? new AgentBrowser({ ...launchConfig, cdpUrl, scope: 'shared', ...agentBrowserOpts })\n : new AgentBrowser({ ...launchConfig, ...agentBrowserOpts, scope });\n }\n\n throw new Error(`Unsupported browser provider: ${provider}`);\n}\n"],"mappings":"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"}
|
package/dist/schema.d.ts
CHANGED
|
@@ -88,7 +88,7 @@ export interface MastraCodeState {
|
|
|
88
88
|
viewport?: {
|
|
89
89
|
width: number;
|
|
90
90
|
height: number;
|
|
91
|
-
};
|
|
91
|
+
} | 'window';
|
|
92
92
|
cdpUrl?: string;
|
|
93
93
|
stagehand?: {
|
|
94
94
|
env: 'LOCAL' | 'BROWSERBASE';
|
|
@@ -180,10 +180,10 @@ export declare const stateSchema: z.ZodObject<{
|
|
|
180
180
|
"agent-browser": "agent-browser";
|
|
181
181
|
}>;
|
|
182
182
|
headless: z.ZodOptional<z.ZodBoolean>;
|
|
183
|
-
viewport: z.ZodOptional<z.ZodObject<{
|
|
183
|
+
viewport: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
|
|
184
184
|
width: z.ZodNumber;
|
|
185
185
|
height: z.ZodNumber;
|
|
186
|
-
}, z.core.$strip>>;
|
|
186
|
+
}, z.core.$strip>, z.ZodLiteral<"window">]>>;
|
|
187
187
|
cdpUrl: z.ZodOptional<z.ZodString>;
|
|
188
188
|
stagehand: z.ZodOptional<z.ZodObject<{
|
|
189
189
|
env: z.ZodEnum<{
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
CHANGED
|
@@ -81,10 +81,10 @@ const stateSchema = z.object({
|
|
|
81
81
|
enabled: z.boolean(),
|
|
82
82
|
provider: z.enum(["stagehand", "agent-browser"]),
|
|
83
83
|
headless: z.boolean().optional(),
|
|
84
|
-
viewport: z.object({
|
|
84
|
+
viewport: z.union([z.object({
|
|
85
85
|
width: z.number(),
|
|
86
86
|
height: z.number()
|
|
87
|
-
}).optional(),
|
|
87
|
+
}), z.literal("window")]).optional(),
|
|
88
88
|
cdpUrl: z.string().optional(),
|
|
89
89
|
stagehand: z.object({
|
|
90
90
|
env: z.enum(["LOCAL", "BROWSERBASE"]),
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../src/schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { DEFAULT_CONFIG_DIR, DEFAULT_OM_MODEL_ID } from './constants.js';\n\nexport type PermissionPolicy = 'allow' | 'ask' | 'deny';\n\nexport type MastraCodeSessionState = {\n currentModelId: string;\n modeId: string;\n};\n\nexport type MastraCodeComposedState = MastraCodeState & MastraCodeSessionState;\n\nexport interface MastraCodeState {\n [key: string]: unknown;\n [key: `subagentModelId_${string}`]: string | undefined;\n subagentModelId?: string;\n projectPath?: string;\n projectName?: string;\n /** Factory project that owns this session. */\n factoryProjectId?: string;\n /** Linked repository used by this session when source-control execution is required. */\n projectRepositoryId?: string;\n /** Persisted sandbox id for reattaching the project's cloud workspace. */\n sandboxId?: string;\n /** Path inside the sandbox the repo is cloned into. */\n sandboxWorkdir?: string;\n /** Active git worktree path inside the sandbox for the current unit of work. */\n worktreePath?: string;\n /** Active feature branch checked out in the worktree. */\n branch?: string;\n /**\n * The session's checkout contains third-party content (e.g. a PR branch\n * under review). Project-level instruction files (AGENTS.md, CLAUDE.md)\n * are attacker-writable there and must not be ingested into the system\n * prompt or injected as reminders.\n */\n untrustedCheckout?: boolean;\n /**\n * Trusted git ref (typically the PR's base branch) to serve project\n * instruction files from when the checkout is untrusted. Without it,\n * project-scope instruction files are skipped entirely.\n */\n baseRef?: string;\n /**\n * Skip the home-directory instruction files (~/.claude/AGENTS.md and\n * friends). Hosts running sessions for someone else set this so a run never\n * inherits the machine owner's personal configuration.\n */\n skipGlobalInstructions?: boolean;\n configDir: string;\n homeDir?: string;\n gitBranch?: string;\n lastCommand?: string;\n observerModelId: string;\n reflectorModelId: string;\n observationThreshold: number;\n reflectionThreshold: number;\n cavemanObservations: boolean;\n observeAttachments: 'auto' | boolean;\n omScope?: 'thread' | 'resource';\n /**\n * Session-level reasoning-effort override. When unset, the effective level is\n * resolved at request time from settings (`models.modeThinkingDefaults[mode]`\n * falling back to `preferences.thinkingLevel`).\n */\n thinkingLevel?: 'off' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n yolo: boolean;\n permissionRules: {\n categories: Record<string, PermissionPolicy>;\n tools: Record<string, PermissionPolicy>;\n };\n smartEditing: boolean;\n notifications: 'bell' | 'system' | 'both' | 'off';\n tasks: Array<{\n id?: string;\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n }>;\n sandboxAllowedPaths: string[];\n pluginSkillPaths: string[];\n pluginCommandPaths: string[];\n pluginInstructions: string[];\n activePlan: {\n title: string;\n plan: string;\n approvedAt: string;\n } | null;\n activeBrowserSettings?: {\n enabled: boolean;\n provider: 'stagehand' | 'agent-browser';\n headless?: boolean;\n viewport?: {\n width: number;\n height: number;\n };\n cdpUrl?: string;\n stagehand?: {\n env: 'LOCAL' | 'BROWSERBASE';\n apiKey?: string;\n projectId?: string;\n };\n };\n}\n\nexport const stateSchema = z.object({\n // Session-scoped selection.\n // validates state against this schema, so they MUST be declared here — Zod\n // strips unknown keys on parse, which would otherwise silently discard the\n // seeded model and leave the controller with no model selected.\n currentModelId: z.string().optional(),\n modeId: z.string().optional(),\n subagentModelId: z.string().optional(),\n projectPath: z.string().optional(),\n projectName: z.string().optional(),\n factoryProjectId: z.string().optional(),\n projectRepositoryId: z.string().optional(),\n sandboxId: z.string().optional(),\n sandboxWorkdir: z.string().optional(),\n worktreePath: z.string().optional(),\n branch: z.string().optional(),\n // Session operates on an untrusted checkout — suppress AGENTS.md ingestion.\n untrustedCheckout: z.boolean().optional(),\n // Trusted ref to serve instruction files from on untrusted checkouts.\n baseRef: z.string().optional(),\n // Skip the operator machine's home-directory instruction files.\n skipGlobalInstructions: z.boolean().optional(),\n configDir: z.string().default(DEFAULT_CONFIG_DIR),\n homeDir: z.string().optional(),\n gitBranch: z.string().optional(),\n lastCommand: z.string().optional(),\n // Observational Memory model settings\n observerModelId: z.string().default(DEFAULT_OM_MODEL_ID),\n reflectorModelId: z.string().default(DEFAULT_OM_MODEL_ID),\n // Observational Memory threshold settings\n observationThreshold: z.number().default(30_000),\n reflectionThreshold: z.number().default(40_000),\n // Whether observations and reflections use the terse caveman-style instruction.\n // Off by default — caveman style is opt-in via `/om` settings; observers and\n // reflectors fall back to their built-in (prose) behavior unless enabled.\n cavemanObservations: z.boolean().default(false),\n // Whether OM forwards image/file attachment parts to the Observer LLM.\n // 'auto' (default) checks the provider capabilities registry to decide.\n // true/false forces the setting regardless of model capabilities.\n observeAttachments: z.union([z.literal('auto'), z.boolean()]).default('auto'),\n // Observational Memory scope — 'thread' (per-conversation) or 'resource' (shared across threads)\n omScope: z.enum(['thread', 'resource']).optional(),\n // Thinking level for model reasoning effort. Optional: absent means \"no\n // session override\" — the effective level is resolved from settings\n // (per-mode defaults, then the global preference) at request time.\n thinkingLevel: z.enum(['off', 'low', 'medium', 'high', 'xhigh', 'max']).optional(),\n // YOLO mode — auto-approve all tool calls\n yolo: z.boolean().default(false),\n // Permission rules — per-category and per-tool approval policies\n permissionRules: z\n .object({\n categories: z.record(z.string(), z.enum(['allow', 'ask', 'deny'])).default({}),\n tools: z.record(z.string(), z.enum(['allow', 'ask', 'deny'])).default({}),\n })\n .default({ categories: {}, tools: {} }),\n // Smart editing mode — use AST-based analysis for code edits\n smartEditing: z.boolean().default(true),\n // Notification mode — alert when TUI needs user attention\n notifications: z.enum(['bell', 'system', 'both', 'off']).default('off'),\n // Task list (ephemeral per-thread, cleared on thread switch/creation)\n tasks: z\n .array(\n z.object({\n id: z.string().optional(),\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n }),\n )\n .default([]),\n // Sandbox allowed paths (per-thread, absolute paths allowed in addition to project root)\n sandboxAllowedPaths: z.array(z.string()).default([]),\n // Asset directories contributed by active plugins.\n pluginSkillPaths: z.array(z.string()).default([]),\n pluginCommandPaths: z.array(z.string()).default([]),\n pluginInstructions: z.array(z.string()).default([]),\n // Active plan (set when a plan is approved in Plan mode)\n activePlan: z\n .object({\n title: z.string(),\n plan: z.string(),\n approvedAt: z.string(),\n })\n .nullable()\n .default(null),\n // Active browser settings (tracks what's actually running vs. what's in the settings file)\n activeBrowserSettings: z\n .object({\n enabled: z.boolean(),\n provider: z.enum(['stagehand', 'agent-browser']),\n headless: z.boolean().optional(),\n viewport: z\n .object({\n width: z.number(),\n height: z.number(),\n })\n .optional(),\n cdpUrl: z.string().optional(),\n stagehand: z\n .object({\n env: z.enum(['LOCAL', 'BROWSERBASE']),\n apiKey: z.string().optional(),\n projectId: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../src/schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { DEFAULT_CONFIG_DIR, DEFAULT_OM_MODEL_ID } from './constants.js';\n\nexport type PermissionPolicy = 'allow' | 'ask' | 'deny';\n\nexport type MastraCodeSessionState = {\n currentModelId: string;\n modeId: string;\n};\n\nexport type MastraCodeComposedState = MastraCodeState & MastraCodeSessionState;\n\nexport interface MastraCodeState {\n [key: string]: unknown;\n [key: `subagentModelId_${string}`]: string | undefined;\n subagentModelId?: string;\n projectPath?: string;\n projectName?: string;\n /** Factory project that owns this session. */\n factoryProjectId?: string;\n /** Linked repository used by this session when source-control execution is required. */\n projectRepositoryId?: string;\n /** Persisted sandbox id for reattaching the project's cloud workspace. */\n sandboxId?: string;\n /** Path inside the sandbox the repo is cloned into. */\n sandboxWorkdir?: string;\n /** Active git worktree path inside the sandbox for the current unit of work. */\n worktreePath?: string;\n /** Active feature branch checked out in the worktree. */\n branch?: string;\n /**\n * The session's checkout contains third-party content (e.g. a PR branch\n * under review). Project-level instruction files (AGENTS.md, CLAUDE.md)\n * are attacker-writable there and must not be ingested into the system\n * prompt or injected as reminders.\n */\n untrustedCheckout?: boolean;\n /**\n * Trusted git ref (typically the PR's base branch) to serve project\n * instruction files from when the checkout is untrusted. Without it,\n * project-scope instruction files are skipped entirely.\n */\n baseRef?: string;\n /**\n * Skip the home-directory instruction files (~/.claude/AGENTS.md and\n * friends). Hosts running sessions for someone else set this so a run never\n * inherits the machine owner's personal configuration.\n */\n skipGlobalInstructions?: boolean;\n configDir: string;\n homeDir?: string;\n gitBranch?: string;\n lastCommand?: string;\n observerModelId: string;\n reflectorModelId: string;\n observationThreshold: number;\n reflectionThreshold: number;\n cavemanObservations: boolean;\n observeAttachments: 'auto' | boolean;\n omScope?: 'thread' | 'resource';\n /**\n * Session-level reasoning-effort override. When unset, the effective level is\n * resolved at request time from settings (`models.modeThinkingDefaults[mode]`\n * falling back to `preferences.thinkingLevel`).\n */\n thinkingLevel?: 'off' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n yolo: boolean;\n permissionRules: {\n categories: Record<string, PermissionPolicy>;\n tools: Record<string, PermissionPolicy>;\n };\n smartEditing: boolean;\n notifications: 'bell' | 'system' | 'both' | 'off';\n tasks: Array<{\n id?: string;\n content: string;\n status: 'pending' | 'in_progress' | 'completed';\n activeForm: string;\n }>;\n sandboxAllowedPaths: string[];\n pluginSkillPaths: string[];\n pluginCommandPaths: string[];\n pluginInstructions: string[];\n activePlan: {\n title: string;\n plan: string;\n approvedAt: string;\n } | null;\n activeBrowserSettings?: {\n enabled: boolean;\n provider: 'stagehand' | 'agent-browser';\n headless?: boolean;\n viewport?: { width: number; height: number } | 'window';\n cdpUrl?: string;\n stagehand?: {\n env: 'LOCAL' | 'BROWSERBASE';\n apiKey?: string;\n projectId?: string;\n };\n };\n}\n\nexport const stateSchema = z.object({\n // Session-scoped selection.\n // validates state against this schema, so they MUST be declared here — Zod\n // strips unknown keys on parse, which would otherwise silently discard the\n // seeded model and leave the controller with no model selected.\n currentModelId: z.string().optional(),\n modeId: z.string().optional(),\n subagentModelId: z.string().optional(),\n projectPath: z.string().optional(),\n projectName: z.string().optional(),\n factoryProjectId: z.string().optional(),\n projectRepositoryId: z.string().optional(),\n sandboxId: z.string().optional(),\n sandboxWorkdir: z.string().optional(),\n worktreePath: z.string().optional(),\n branch: z.string().optional(),\n // Session operates on an untrusted checkout — suppress AGENTS.md ingestion.\n untrustedCheckout: z.boolean().optional(),\n // Trusted ref to serve instruction files from on untrusted checkouts.\n baseRef: z.string().optional(),\n // Skip the operator machine's home-directory instruction files.\n skipGlobalInstructions: z.boolean().optional(),\n configDir: z.string().default(DEFAULT_CONFIG_DIR),\n homeDir: z.string().optional(),\n gitBranch: z.string().optional(),\n lastCommand: z.string().optional(),\n // Observational Memory model settings\n observerModelId: z.string().default(DEFAULT_OM_MODEL_ID),\n reflectorModelId: z.string().default(DEFAULT_OM_MODEL_ID),\n // Observational Memory threshold settings\n observationThreshold: z.number().default(30_000),\n reflectionThreshold: z.number().default(40_000),\n // Whether observations and reflections use the terse caveman-style instruction.\n // Off by default — caveman style is opt-in via `/om` settings; observers and\n // reflectors fall back to their built-in (prose) behavior unless enabled.\n cavemanObservations: z.boolean().default(false),\n // Whether OM forwards image/file attachment parts to the Observer LLM.\n // 'auto' (default) checks the provider capabilities registry to decide.\n // true/false forces the setting regardless of model capabilities.\n observeAttachments: z.union([z.literal('auto'), z.boolean()]).default('auto'),\n // Observational Memory scope — 'thread' (per-conversation) or 'resource' (shared across threads)\n omScope: z.enum(['thread', 'resource']).optional(),\n // Thinking level for model reasoning effort. Optional: absent means \"no\n // session override\" — the effective level is resolved from settings\n // (per-mode defaults, then the global preference) at request time.\n thinkingLevel: z.enum(['off', 'low', 'medium', 'high', 'xhigh', 'max']).optional(),\n // YOLO mode — auto-approve all tool calls\n yolo: z.boolean().default(false),\n // Permission rules — per-category and per-tool approval policies\n permissionRules: z\n .object({\n categories: z.record(z.string(), z.enum(['allow', 'ask', 'deny'])).default({}),\n tools: z.record(z.string(), z.enum(['allow', 'ask', 'deny'])).default({}),\n })\n .default({ categories: {}, tools: {} }),\n // Smart editing mode — use AST-based analysis for code edits\n smartEditing: z.boolean().default(true),\n // Notification mode — alert when TUI needs user attention\n notifications: z.enum(['bell', 'system', 'both', 'off']).default('off'),\n // Task list (ephemeral per-thread, cleared on thread switch/creation)\n tasks: z\n .array(\n z.object({\n id: z.string().optional(),\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n }),\n )\n .default([]),\n // Sandbox allowed paths (per-thread, absolute paths allowed in addition to project root)\n sandboxAllowedPaths: z.array(z.string()).default([]),\n // Asset directories contributed by active plugins.\n pluginSkillPaths: z.array(z.string()).default([]),\n pluginCommandPaths: z.array(z.string()).default([]),\n pluginInstructions: z.array(z.string()).default([]),\n // Active plan (set when a plan is approved in Plan mode)\n activePlan: z\n .object({\n title: z.string(),\n plan: z.string(),\n approvedAt: z.string(),\n })\n .nullable()\n .default(null),\n // Active browser settings (tracks what's actually running vs. what's in the settings file)\n activeBrowserSettings: z\n .object({\n enabled: z.boolean(),\n provider: z.enum(['stagehand', 'agent-browser']),\n headless: z.boolean().optional(),\n viewport: z\n .union([\n z.object({\n width: z.number(),\n height: z.number(),\n }),\n z.literal('window'),\n ])\n .optional(),\n cdpUrl: z.string().optional(),\n stagehand: z\n .object({\n env: z.enum(['LOCAL', 'BROWSERBASE']),\n apiKey: z.string().optional(),\n projectId: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n});\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/code-sdk",
|
|
3
|
-
"version": "1.2.0-alpha.
|
|
3
|
+
"version": "1.2.0-alpha.8",
|
|
4
4
|
"description": "Mastra Code SDK: the agent core behind Mastra Code (everything except the TUI) — build your own UIs and surfaces on top of it",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -56,18 +56,18 @@
|
|
|
56
56
|
"vscode-languageserver-protocol": "^3.17.5",
|
|
57
57
|
"yaml": "^2.7.1",
|
|
58
58
|
"zod": "^4.3.6",
|
|
59
|
+
"@mastra/agent-browser": "0.5.1-alpha.0",
|
|
59
60
|
"@mastra/duckdb": "1.6.1-alpha.0",
|
|
60
|
-
"@mastra/
|
|
61
|
-
"@mastra/core": "1.58.0-alpha.5",
|
|
62
|
-
"@mastra/fastembed": "1.2.0",
|
|
61
|
+
"@mastra/mcp": "1.16.0-alpha.1",
|
|
63
62
|
"@mastra/github-signals": "0.2.5-alpha.0",
|
|
63
|
+
"@mastra/fastembed": "1.2.0",
|
|
64
|
+
"@mastra/memory": "1.26.1-alpha.3",
|
|
64
65
|
"@mastra/libsql": "1.20.0-alpha.1",
|
|
65
|
-
"@mastra/
|
|
66
|
+
"@mastra/core": "1.58.0-alpha.7",
|
|
66
67
|
"@mastra/observability": "1.16.6-alpha.2",
|
|
67
|
-
"@mastra/memory": "1.26.1-alpha.3",
|
|
68
|
-
"@mastra/schema-compat": "1.3.6-alpha.2",
|
|
69
68
|
"@mastra/pg": "1.20.0-alpha.2",
|
|
70
|
-
"@mastra/
|
|
69
|
+
"@mastra/schema-compat": "1.3.6-alpha.2",
|
|
70
|
+
"@mastra/stagehand": "0.3.2-alpha.1",
|
|
71
71
|
"@mastra/tavily": "1.1.1"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
"typescript-eslint": "^8.57.0",
|
|
81
81
|
"vitest": "4.1.10",
|
|
82
82
|
"@internal/lint": "0.0.121",
|
|
83
|
-
"@internal/
|
|
84
|
-
"@internal/
|
|
83
|
+
"@internal/types-builder": "0.0.96",
|
|
84
|
+
"@internal/workspace-test-utils": "0.0.65"
|
|
85
85
|
},
|
|
86
86
|
"engines": {
|
|
87
87
|
"node": ">=22.19.0"
|