@mastra/editor 0.11.1 → 0.11.2-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @mastra/editor
2
2
 
3
+ ## 0.11.2-alpha.1
4
+
5
+ ### Patch Changes
6
+
7
+ - dependencies updates: ([#17144](https://github.com/mastra-ai/mastra/pull/17144))
8
+ - Updated dependency [`@arcadeai/arcadejs@^2.4.1` ↗︎](https://www.npmjs.com/package/@arcadeai/arcadejs/v/2.4.1) (from `^2.3.0`, in `dependencies`)
9
+
10
+ - Update ai-sdk deps ([#17144](https://github.com/mastra-ai/mastra/pull/17144))
11
+
12
+ - Updated dependencies [[`575f815`](https://github.com/mastra-ai/mastra/commit/575f815c5c3567b71c0b83cbb7fa98c8253a9d9c), [`306909a`](https://github.com/mastra-ai/mastra/commit/306909a693de77d709b38706e2673c9547d24a28), [`5191af8`](https://github.com/mastra-ai/mastra/commit/5191af80c799eea25357c545fc05d91b3883531d), [`43bd3d4`](https://github.com/mastra-ai/mastra/commit/43bd3d421987463fdf35386a45199c49499ed069), [`e6fa79e`](https://github.com/mastra-ai/mastra/commit/e6fa79ec72a2ddffdd25e85270398951e9d552a4), [`904bcdf`](https://github.com/mastra-ai/mastra/commit/904bcdf7b8004aa7be823f9f70ca63580e47e470), [`7f5ee1d`](https://github.com/mastra-ai/mastra/commit/7f5ee1dca46daee8d2817f2ebe49e6335da81956), [`1e9aab5`](https://github.com/mastra-ai/mastra/commit/1e9aab50ff11e6e88fde4d7cbf512c44a9fe8d61), [`bec4678`](https://github.com/mastra-ai/mastra/commit/bec46781f31a2760b09b4aade1a87a62a40bee7b), [`bf8eb6d`](https://github.com/mastra-ai/mastra/commit/bf8eb6d0ec213a403eb9265a594ad283c44ab3dc), [`493a328`](https://github.com/mastra-ai/mastra/commit/493a328f4346a1deeb9f1e2e44c8f2a3a4d7591b), [`029a414`](https://github.com/mastra-ai/mastra/commit/029a4141719793bd3e898a39eb5a0466a55f5f3a), [`b147b29`](https://github.com/mastra-ai/mastra/commit/b147b2907f0cd1aa812efe6d6e3f58d22e66fc88), [`d371ac1`](https://github.com/mastra-ai/mastra/commit/d371ac1d9820afaaf7cfdbc380a475946a994d8f), [`cf182b7`](https://github.com/mastra-ai/mastra/commit/cf182b7fb495767946d9840ef29f19cfa906f31f), [`a049c2a`](https://github.com/mastra-ai/mastra/commit/a049c2a9dfb41d0ee2e7a28874a88cd64fd5669f), [`b147b29`](https://github.com/mastra-ai/mastra/commit/b147b2907f0cd1aa812efe6d6e3f58d22e66fc88), [`2a96528`](https://github.com/mastra-ai/mastra/commit/2a9652848dfa3c5a2426f952e9d93554c26fd90f), [`2656d9c`](https://github.com/mastra-ai/mastra/commit/2656d9c2976d4f3354253bfbbbf9b88a1b2bbf34), [`63e3fe1`](https://github.com/mastra-ai/mastra/commit/63e3fe13cc1ea96f91d7c68aea92f400faf9e4da), [`1d4ce8d`](https://github.com/mastra-ai/mastra/commit/1d4ce8daaa54511f325c1b609d31b8e54009d677), [`8c68372`](https://github.com/mastra-ai/mastra/commit/8c68372e85fe0b066ec12c58bd29ffb93e54c552)]:
13
+ - @mastra/core@1.42.0-alpha.4
14
+ - @mastra/memory@1.20.3-alpha.0
15
+ - @mastra/mcp@1.10.0-alpha.1
16
+
17
+ ## 0.11.2-alpha.0
18
+
19
+ ### Patch Changes
20
+
21
+ - Improved Agent Builder defaults so generated agent instructions stay concise while still covering the required operating checklist. Agent Builder chat requests now also use lower OpenAI reasoning effort by default. ([#17604](https://github.com/mastra-ai/mastra/pull/17604))
22
+
23
+ - Updated dependencies [[`d468acb`](https://github.com/mastra-ai/mastra/commit/d468acb07aec1bb19a2cb0ada8042b05b46746b2), [`e9be4e7`](https://github.com/mastra-ai/mastra/commit/e9be4e747ec3d8b65548bff92f9377db06105376), [`d53cfc2`](https://github.com/mastra-ai/mastra/commit/d53cfc2c7f8d78343a4aa84ec4e129ba25f3325e), [`65799d4`](https://github.com/mastra-ai/mastra/commit/65799d4d549e5ebb9c848fbe3f51ac090f64becf), [`c268c89`](https://github.com/mastra-ai/mastra/commit/c268c89f4c63a93ee474d3cffdf3ea60bf00d4f2), [`d468acb`](https://github.com/mastra-ai/mastra/commit/d468acb07aec1bb19a2cb0ada8042b05b46746b2), [`7ef9ebf`](https://github.com/mastra-ai/mastra/commit/7ef9ebf79ec3c90536643ef169c7a306f105fb9d), [`0c72f03`](https://github.com/mastra-ai/mastra/commit/0c72f032abb13254df5a7856d64be2f207b8006d), [`75adfb8`](https://github.com/mastra-ai/mastra/commit/75adfb81e3fca1fe8dc9ab382bed7b714854ba4f), [`3b45ea9`](https://github.com/mastra-ai/mastra/commit/3b45ea95015557a6cb9d70dc5252af54ab1b78ac), [`f084be1`](https://github.com/mastra-ai/mastra/commit/f084be1fcbe33ad7480913e44d6130c421c0976f)]:
24
+ - @mastra/core@1.42.0-alpha.0
25
+ - @mastra/mcp@1.9.2-alpha.0
26
+
3
27
  ## 0.11.1
4
28
 
5
29
  ### Patch Changes
package/dist/ee/index.cjs CHANGED
@@ -226,9 +226,9 @@ The form snapshot lists what's currently attached. Use it together with the avai
226
226
  - Only call \`createSkillTool\` when (a) no existing stored skill matches reusable operating instructions the produced agent needs, AND (b) that operating instruction is genuinely needed for the outcome. Do not use stored skills as a substitute for missing integrations or tools.
227
227
  - If a specific external connection is required (e.g. a sheet tool for a spreadsheet-driven outcome) and none is available, the new agent's system prompt must instruct it to refuse cleanly and explain what the user needs to connect.
228
228
 
229
- ## Step D \u2014 Synthesize the run contract
229
+ ## Step D \u2014 Synthesize concise operating instructions
230
230
 
231
- Before calling \`set-agent-instructions\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item:
231
+ Before calling \`set-agent-instructions\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item, but keep each item brief:
232
232
 
233
233
  1. **Trigger / input** \u2014 what user request, schedule, event, file, row, ticket, or message starts a run.
234
234
  2. **Owned outcome** \u2014 the exact result the produced agent is responsible for finishing.
@@ -237,6 +237,8 @@ Before calling \`set-agent-instructions\`, privately write a concrete run contra
237
237
  5. **Done criteria** \u2014 verifiable conditions that prove the job is finished, including tool confirmation or an explicit "not run" reason when verification is impossible.
238
238
  6. **Final response format** \u2014 the receipt, summary, draft, diff summary, report, or confirmation the user receives.
239
239
 
240
+ Write the final system prompt as 2\u20134 short paragraphs or compact bullet groups. Target 1,200\u20132,000 characters and stay under 2,500 characters. Do not include worked examples, FAQs, long edge-case lists, or exhaustive policies unless the user's request explicitly requires them. Prefer one clear default over several branches.
241
+
240
242
  ## Step E \u2014 Write the agent
241
243
 
242
244
  Read the per-field directives in the form snapshot. Call only the setters the snapshot tells you to call, each at most once, with the final value. Skip every field marked "already set" or "no setter". Skip any field that isn't listed at all (its feature is disabled).
@@ -246,9 +248,10 @@ Before calling \`set-agent-instructions\`, self-audit the draft. It must pass ev
246
248
  - No internal tool ids, file paths, schemas, or builder-only terms appear.
247
249
  - No generic "helpful assistant" identity remains.
248
250
  - No unsupported capabilities are promised.
249
- - Completion criteria are present, concrete, and tool-aware.
250
- - Refusal / fallback path is present for missing integrations, credentials, permissions, workspace, or sources.
251
- - Final response format is specified.
251
+ - Completion criteria are concrete.
252
+ - Missing-access fallback is included when relevant.
253
+ - Final response expectations are clear.
254
+ - The prompt is specific to the agent's outcome and under 2,500 characters.
252
255
 
253
256
  ## Step F \u2014 Confirm the agent configuration to the user
254
257
 
@@ -271,7 +274,7 @@ Bad:
271
274
 
272
275
  # Quality bar for the produced agent's system prompt
273
276
 
274
- The system prompt written into \`set-agent-instructions\` MUST include all of the following:
277
+ The system prompt written into \`set-agent-instructions\` MUST be short, concrete, and useful. It should cover all of the following, but each item should usually be one sentence or a compact bullet:
275
278
 
276
279
  1. **Role and outcome.** Define what the agent is and the concrete result it owns.
277
280
  2. **Trigger and input.** Define what starts a run and what input the agent expects.
@@ -279,10 +282,11 @@ The system prompt written into \`set-agent-instructions\` MUST include all of th
279
282
  4. **Capability awareness.** Describe only the tools, integrations, workspaces, or data sources the agent actually has, phrased in terms of what they let the agent accomplish.
280
283
  5. **Missing-capability fallback.** Explain what the agent should do when a required integration, credential, permission, workspace, or source is unavailable.
281
284
  6. **Completion criteria.** Define exactly when the task is done in observable, verifiable terms.
282
- 7. **Final response format.** Specify the exact shape of the agent's final answer, report, draft, receipt, or confirmation.
285
+ 7. **Final response format.** Specify the shape of the agent's final answer, report, draft, receipt, or confirmation.
283
286
  8. **Communication style.** Require plain language, short answers, no jargon, and structure only when useful.
284
287
  9. **Refusal rules.** State what the agent must refuse and how it should explain the refusal clearly.
285
- 10. **Worked example.** Include at least one short input \u2192 output example showing a complete successful run.
288
+
289
+ Keep this to 2\u20134 focused paragraphs or compact bullet groups. Do not include worked examples, FAQs, or exhaustive edge-case lists by default.
286
290
 
287
291
  # Hard rules
288
292
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ee/index.ts","../../src/ee/agent-builder.ts","../../src/ee/agent-builder-agent.ts"],"sourcesContent":["export { EditorAgentBuilder } from './agent-builder';\nexport { createBuilderAgent } from './agent-builder-agent';\n","import type { AgentBuilderOptions, AgentFeatures, IAgentBuilder } from '@mastra/core/agent-builder/ee';\nimport { isBuilderModelPolicyActive, isModelAllowed, resolveAgentFeatures } from '@mastra/core/agent-builder/ee';\n\n/**\n * Concrete implementation of the Agent Builder EE feature.\n * Instantiated by MastraEditor.resolveBuilder() when builder config is enabled.\n *\n * The constructor performs fail-fast validation of the admin's model policy\n * (Phase 4) so misconfiguration is caught at boot, not at first request.\n *\n * Feature toggles use **default-on semantics**: omitted keys resolve to\n * `true`. Admins opt out by setting a key to `false`. The resolved features\n * are computed once in the constructor (after validation) and returned\n * verbatim by {@link getFeatures} so all downstream consumers (server route,\n * UI hooks, policy derivation) see the same effective values.\n */\nexport class EditorAgentBuilder implements IAgentBuilder {\n private readonly options: AgentBuilderOptions;\n private readonly modelPolicyWarnings: string[] = [];\n\n /** Non-fatal warnings for browser config issues (surfaced alongside model policy warnings). */\n private readonly browserConfigWarnings: string[] = [];\n\n /**\n * Resolved (default-on normalized) features. Computed once in the\n * constructor; `undefined` only if the builder was constructed with\n * `enabled: false` (we still allocate features for the OFF path so callers\n * can introspect, but we keep the field optional to preserve the existing\n * API contract where `getFeatures()` may legitimately return `undefined`\n * if no `features` was provided AND no defaults could be applied).\n *\n * In practice this is always populated: `resolveAgentFeatures` returns a\n * fully-populated object regardless of input.\n */\n private readonly resolvedFeatures: AgentBuilderOptions['features'];\n\n constructor(options?: AgentBuilderOptions) {\n // Shallow-clone the paths the validators mutate so we never leak side\n // effects into the caller's `MastraEditorConfig.builder` object.\n // `validateBrowserConfig` writes to `features.agent.browser`; nothing\n // else is mutated, so `configuration` and `registries` stay aliased.\n const source = options ?? {};\n this.options = {\n ...source,\n features: source.features\n ? {\n ...source.features,\n agent: source.features.agent ? { ...source.features.agent } : undefined,\n }\n : undefined,\n };\n this.validateModelPolicy();\n this.validateBrowserConfig();\n // Resolve features AFTER browser-config validation so that an explicit\n // `browser: true` with bad config is already mutated to `false` on\n // `this.options.features.agent.browser`. The resolver then sees the\n // downgraded value and returns it as-is.\n this.resolvedFeatures = {\n agent: resolveAgentFeatures(this.options.features?.agent, {\n hasBrowserConfig: this.hasValidBrowserConfig(),\n }),\n };\n }\n\n get enabled(): boolean {\n return this.options.enabled !== false;\n }\n\n getFeatures(): AgentBuilderOptions['features'] {\n return this.resolvedFeatures;\n }\n\n getConfiguration(): AgentBuilderOptions['configuration'] {\n return this.options.configuration;\n }\n\n getRegistries(): AgentBuilderOptions['registries'] {\n return this.options.registries;\n }\n\n getModelPolicyWarnings(): string[] {\n return [...this.modelPolicyWarnings, ...this.browserConfigWarnings];\n }\n\n /**\n * True when `configuration.agent.browser` declares a provider. The\n * EditorAgentBuilder does NOT verify the provider is registered with the\n * Mastra instance — that cross-validation lives in `MastraEditor.resolveBuilder`\n * because only the editor knows the registered browser providers.\n */\n private hasValidBrowserConfig(): boolean {\n const browserConfig = this.options.configuration?.agent?.browser;\n return Boolean(browserConfig?.config?.provider);\n }\n\n /**\n * Browser config validation only runs for **explicit** `browser: true`.\n * With default-on semantics, an omitted `browser` no longer means \"admin\n * opted in\" — it means \"admin didn't opt out\". The default-on path is\n * resolved later by `resolveAgentFeatures`, which already gates `browser`\n * on `hasValidBrowserConfig`. We don't want to spam every default-config\n * deployment with warnings.\n */\n private validateBrowserConfig(): void {\n const explicitBrowser = this.options.features?.agent?.browser;\n if (explicitBrowser !== true) return;\n\n const browserConfig = this.options.configuration?.agent?.browser;\n if (!browserConfig) {\n const warning =\n 'Agent Builder browser feature is enabled but no default browser config was provided. ' +\n 'Set `editor.builder.configuration.agent.browser` to a valid browser config ' +\n '(e.g. `{ type: \"inline\", config: { provider: \"stagehand\" } }`). ' +\n 'The browser toggle will be hidden until a default is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n // Downgrade so the resolved feature ends up `false`.\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n return;\n }\n\n if (!browserConfig.config?.provider) {\n const warning =\n 'Agent Builder browser config is missing a `provider` field. ' +\n 'Set `editor.builder.configuration.agent.browser.config.provider` ' +\n '(e.g. `\"stagehand\"`). The browser toggle will be hidden until a provider is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n }\n }\n\n private validateModelPolicy(): void {\n const enabled = this.options.enabled !== false;\n // Locked-mode is only triggered by an explicit `model: false` from the\n // admin. With default-on semantics, an omitted `model` resolves to\n // `true` (picker visible), which is open mode and has no\n // locked-mode-default invariant.\n const explicitModel = this.options.features?.agent?.model;\n const pickerVisible = explicitModel !== false;\n const models = this.options.configuration?.agent?.models;\n const allowed = models?.allowed;\n const defaultModel = models?.default;\n\n const active = isBuilderModelPolicyActive({\n enabled,\n pickerVisible,\n allowed,\n default: defaultModel,\n });\n\n if (!active) return;\n\n // Locked mode (picker hidden) requires an admin-pinned default. Phase 3's\n // create-path decision matrix relies on this invariant: a locked policy\n // without a default is unreachable. Only fires when the admin has\n // explicitly opted out of the picker.\n if (explicitModel === false && defaultModel === undefined) {\n throw new Error(\n 'Agent Builder model policy is active in locked mode but no default was set. ' +\n 'Set `editor.builder.configuration.agent.models.default`, or remove ' +\n '`editor.builder.features.agent.model = false` to allow end-users to pick a model.',\n );\n }\n\n // When an allowlist is set, the default (if any) must satisfy it. An\n // empty `allowed: []` means \"unrestricted\" so we skip this check.\n if (defaultModel !== undefined && allowed !== undefined && allowed.length > 0) {\n if (!isModelAllowed(allowed, defaultModel)) {\n throw new Error(\n 'Agent Builder default model is not in the allowlist. ' +\n 'Either add it to `editor.builder.configuration.agent.models.allowed` ' +\n 'or change `editor.builder.configuration.agent.models.default`.',\n );\n }\n }\n }\n}\n\n// AgentFeatures imported for documentation reference in this file's jsdoc.\nexport type { AgentFeatures };\n","import { Agent } from '@mastra/core/agent';\nimport type { AgentConfig } from '@mastra/core/agent';\nimport { Memory } from '@mastra/memory';\nimport { PrefillErrorHandler, ProviderHistoryCompat, StreamErrorRetryProcessor } from '@mastra/core/processors';\nimport { Workspace, LocalFilesystem } from '@mastra/core/workspace';\n\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst workspacePath = path.join(__dirname, 'workspace');\n\nconst workspace = new Workspace({\n filesystem: new LocalFilesystem({\n basePath: workspacePath,\n }),\n skills: ['skills'],\n});\n\n/**\n * Agent Builder Agent\n *\n * Audience: non-technical users (Product, founders, operators, business stakeholders).\n * Goal: turn a plain-language description of a desired outcome into a fully\n * configured, production-quality agent — name, description, model, capabilities,\n * and system prompt — without asking the user follow-up questions.\n *\n * Capability tools the playground UI injects as client tools:\n * - set-agent-name, set-agent-description, set-agent-instructions, set-agent-workspace-id (always on)\n * - set-agent-tools (gated by features.tools)\n * - set-agent-skills (gated by features.skills + skills available)\n * - set-agent-model (gated by features.model + models available)\n * - set-agent-browser-enabled (gated by features.browser)\n * - createSkillTool (gated by features.skills) — only when a needed capability does not exist\n */\n\n/**\n * Default error processors wired into every builder agent. These each fix a\n * class of provider-side correctness bug that builder workloads tend to hit:\n *\n * - `StreamErrorRetryProcessor` — retries OpenAI's transient stream errors\n * (`server_error`, `rate_limit`, `internal_error`, `timeout`, `overloaded`,\n * etc.) that surface on long, tool-heavy turns.\n * - `PrefillErrorHandler` — recovers from Anthropic's\n * `does not support assistant message prefill` 400 by appending a\n * `system-reminder` continue message and retrying.\n * - `ProviderHistoryCompat` — applies provider-history-shape fixes\n * (anthropic tool-id format, cerebras reasoning-content strip, anthropic\n * foreign-reasoning strip) so model swaps don't break history.\n *\n * Exported so callers can compose a custom processor list that keeps the\n * subset they want (e.g. `[...DEFAULT_BUILDER_ERROR_PROCESSORS.filter(p => p.id !== 'stream-error-retry-processor'), myCustom]`).\n */\nexport const DEFAULT_BUILDER_ERROR_PROCESSORS = [\n new StreamErrorRetryProcessor(),\n new PrefillErrorHandler(),\n new ProviderHistoryCompat(),\n];\n\nexport function createBuilderAgent(args?: Partial<AgentConfig<'builder-agent'>>): Agent<'builder-agent'> {\n const memory = new Memory();\n\n // Merge defaults with any caller-supplied processors. Caller processors run\n // after defaults so they can observe/extend retries the defaults trigger.\n // A function-typed override (DynamicArgument) is passed through unchanged —\n // callers using the dynamic form are assumed to manage the full list.\n const callerErrorProcessors = args?.errorProcessors;\n const errorProcessors = Array.isArray(callerErrorProcessors)\n ? [...DEFAULT_BUILDER_ERROR_PROCESSORS, ...callerErrorProcessors]\n : (callerErrorProcessors ?? DEFAULT_BUILDER_ERROR_PROCESSORS);\n\n const config: AgentConfig<'builder-agent'> = {\n instructions: `You are the Agent Builder.\n\nYour job: turn a non-technical user's plain-language request into a fully configured, production-quality agent in a single turn.\n\n# Non-negotiables\n\n- Never ask the user follow-up questions. Make the most reasonable assumption and move forward.\n- Never expose internal names, tool ids, file paths, schemas, code, or jargon to the user.\n- Speak only in user-facing capability terms.\n- Always finish the build in the same turn as the request — configure the agent end-to-end and deliver a short summary.\n- Always define the new agent's name, description, model, and system prompt yourself. Do not ask the user for any of these.\n\nExamples of communication style:\n- Bad: \"Added weatherTool to agent-yzx capabilities.\"\n- Good: \"Your new agent can now check the weather for you.\"\n- Bad: \"Calling set-agent-tools with [weatherTool].\"\n- Good: \"Checking what capabilities to bring to your agent…\"\n- Bad: \"Agent created with weatherTool and recipeWorkflow attached.\"\n- Good: \"Your agent can check the weather and suggest recipes that match the day's conditions.\"\n\n# Form snapshot\n\nA \"Current agent configuration (authoritative)\" block is injected into your context every turn. It lists every form field with its current value AND a directive telling you exactly which setter to call (or skip) for that field. Treat the snapshot as the single source of truth for what is and isn't already set — do not try to infer state from anywhere else, and do not re-call setters for fields whose directive says \"already set\".\n\n# Authoring loop\n\nFollow these five steps in order, every time:\n\n## Step A — Understand the real outcome\n\nAnalyze what the user actually wants to achieve. Focus on the final result, not just the literal wording of the request.\n\nAsk yourself:\n- What should the agent help the user accomplish?\n- Who will use this agent?\n- What decisions should the agent make on its own?\n- What kind of output should the agent produce?\n- What recurring tasks, reasoning, or actions does the agent need to perform?\n\n## Step B — Define the agent's identity\n\nDecide on:\n- Agent name: short, memorable, anchored to the outcome. Never \"Agent X\" or generic labels.\n- Description: exactly one sentence in plain user-facing language explaining what the agent helps with.\n\nThe snapshot will tell you whether to call \\`set-agent-name\\` and \\`set-agent-description\\` or skip them.\n\n## Step C — Decide capabilities\n\nThe form snapshot lists what's currently attached. Use it together with the available tools, agents, workflows, stored skills, and models listed in the corresponding tool descriptions to decide:\n\n- Pick the *minimum* set of existing tools/agents/workflows/stored skills that satisfies the outcome. Adding irrelevant capabilities makes the agent worse, not better.\n- Prefer existing tools, workflows, agents, and stored skills before creating anything new.\n- \\`set-agent-skills\\` attaches user-available stored skills.\n- Only call \\`createSkillTool\\` when (a) no existing stored skill matches reusable operating instructions the produced agent needs, AND (b) that operating instruction is genuinely needed for the outcome. Do not use stored skills as a substitute for missing integrations or tools.\n- If a specific external connection is required (e.g. a sheet tool for a spreadsheet-driven outcome) and none is available, the new agent's system prompt must instruct it to refuse cleanly and explain what the user needs to connect.\n\n## Step D — Synthesize the run contract\n\nBefore calling \\`set-agent-instructions\\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item:\n\n1. **Trigger / input** — what user request, schedule, event, file, row, ticket, or message starts a run.\n2. **Owned outcome** — the exact result the produced agent is responsible for finishing.\n3. **Available capabilities** — only capabilities actually attached or already available from the form snapshot, described in user-facing outcome terms.\n4. **Missing-capability fallback** — what the produced agent does when a required integration, workspace, credential, or source is absent.\n5. **Done criteria** — verifiable conditions that prove the job is finished, including tool confirmation or an explicit \"not run\" reason when verification is impossible.\n6. **Final response format** — the receipt, summary, draft, diff summary, report, or confirmation the user receives.\n\n## Step E — Write the agent\n\nRead the per-field directives in the form snapshot. Call only the setters the snapshot tells you to call, each at most once, with the final value. Skip every field marked \"already set\" or \"no setter\". Skip any field that isn't listed at all (its feature is disabled).\n\nBefore calling \\`set-agent-instructions\\`, self-audit the draft. It must pass every check:\n- No placeholders remain (no \\`<...>\\`, \"TBD\", \"TODO\", \"your tool\", or generic policy gaps).\n- No internal tool ids, file paths, schemas, or builder-only terms appear.\n- No generic \"helpful assistant\" identity remains.\n- No unsupported capabilities are promised.\n- Completion criteria are present, concrete, and tool-aware.\n- Refusal / fallback path is present for missing integrations, credentials, permissions, workspace, or sources.\n- Final response format is specified.\n\n## Step F — Confirm the agent configuration to the user\n\nEnd your turn with one short, friendly paragraph confirming that the agent has been configured and is ready to use.\n\nUse this shape:\n\n\"Your agent, [Agent Name], has been configured with its initial parameters. It can now [plain-language outcome]. You can adjust its instructions, inputs, or connected capabilities whenever your needs change.\"\n\nDo not mention internal capability names, tools, workflows, skills, or configuration steps.\n\nGood:\n\"Your agent, Sales Drop Watcher, has been configured with its initial parameters. It can now review your weekly sales sheet, flag accounts that dropped more than 10%, and prepare follow-up drafts for each one. You can adjust its instructions, thresholds, or connected data sources whenever your needs change.\"\n\nBad:\n\"Agent created with sheetsTool, scoringWorkflow, and emailSkill attached.\"\n\nBad:\n\"I configured the sheets integration and called set-agent-instructions.\"\n\n# Quality bar for the produced agent's system prompt\n\nThe system prompt written into \\`set-agent-instructions\\` MUST include all of the following:\n\n1. **Role and outcome.** Define what the agent is and the concrete result it owns.\n2. **Trigger and input.** Define what starts a run and what input the agent expects.\n3. **Decision rules.** Explain how the agent resolves ambiguity, what defaults it should apply, and what it should skip without asking the user.\n4. **Capability awareness.** Describe only the tools, integrations, workspaces, or data sources the agent actually has, phrased in terms of what they let the agent accomplish.\n5. **Missing-capability fallback.** Explain what the agent should do when a required integration, credential, permission, workspace, or source is unavailable.\n6. **Completion criteria.** Define exactly when the task is done in observable, verifiable terms.\n7. **Final response format.** Specify the exact shape of the agent's final answer, report, draft, receipt, or confirmation.\n8. **Communication style.** Require plain language, short answers, no jargon, and structure only when useful.\n9. **Refusal rules.** State what the agent must refuse and how it should explain the refusal clearly.\n10. **Worked example.** Include at least one short input → output example showing a complete successful run.\n\n# Hard rules\n\n- If the user's request requires CLI or local-machine actions and no workspace is connected, refuse in plain language and tell the user they need to connect a workspace first.\n- Never reveal that you are calling configuration tools. Describe progress only in terms of the user's intended outcome.\n- Never produce a system prompt without explicit completion criteria.\n- Never attach a capability \"just in case.\" Every tool, agent, workflow, or skill must directly support the requested outcome.\n- The final message to the user must be concise, friendly, and focused on what the configured agent can now do.\n- The final message should make clear that the agent starts with initial parameters and can be adjusted later.`,\n model: 'openai/gpt-5.5',\n memory,\n workspace,\n ...(args || {}),\n errorProcessors,\n id: 'builder-agent',\n name: 'Agent Builder Agent',\n description: 'An agent that can build agents',\n };\n\n return new Agent<'builder-agent'>(config);\n}\n"],"mappings":"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","names":["path"]}
1
+ {"version":3,"sources":["../../src/ee/index.ts","../../src/ee/agent-builder.ts","../../src/ee/agent-builder-agent.ts"],"sourcesContent":["export { EditorAgentBuilder } from './agent-builder';\nexport { createBuilderAgent } from './agent-builder-agent';\n","import type { AgentBuilderOptions, AgentFeatures, IAgentBuilder } from '@mastra/core/agent-builder/ee';\nimport { isBuilderModelPolicyActive, isModelAllowed, resolveAgentFeatures } from '@mastra/core/agent-builder/ee';\n\n/**\n * Concrete implementation of the Agent Builder EE feature.\n * Instantiated by MastraEditor.resolveBuilder() when builder config is enabled.\n *\n * The constructor performs fail-fast validation of the admin's model policy\n * (Phase 4) so misconfiguration is caught at boot, not at first request.\n *\n * Feature toggles use **default-on semantics**: omitted keys resolve to\n * `true`. Admins opt out by setting a key to `false`. The resolved features\n * are computed once in the constructor (after validation) and returned\n * verbatim by {@link getFeatures} so all downstream consumers (server route,\n * UI hooks, policy derivation) see the same effective values.\n */\nexport class EditorAgentBuilder implements IAgentBuilder {\n private readonly options: AgentBuilderOptions;\n private readonly modelPolicyWarnings: string[] = [];\n\n /** Non-fatal warnings for browser config issues (surfaced alongside model policy warnings). */\n private readonly browserConfigWarnings: string[] = [];\n\n /**\n * Resolved (default-on normalized) features. Computed once in the\n * constructor; `undefined` only if the builder was constructed with\n * `enabled: false` (we still allocate features for the OFF path so callers\n * can introspect, but we keep the field optional to preserve the existing\n * API contract where `getFeatures()` may legitimately return `undefined`\n * if no `features` was provided AND no defaults could be applied).\n *\n * In practice this is always populated: `resolveAgentFeatures` returns a\n * fully-populated object regardless of input.\n */\n private readonly resolvedFeatures: AgentBuilderOptions['features'];\n\n constructor(options?: AgentBuilderOptions) {\n // Shallow-clone the paths the validators mutate so we never leak side\n // effects into the caller's `MastraEditorConfig.builder` object.\n // `validateBrowserConfig` writes to `features.agent.browser`; nothing\n // else is mutated, so `configuration` and `registries` stay aliased.\n const source = options ?? {};\n this.options = {\n ...source,\n features: source.features\n ? {\n ...source.features,\n agent: source.features.agent ? { ...source.features.agent } : undefined,\n }\n : undefined,\n };\n this.validateModelPolicy();\n this.validateBrowserConfig();\n // Resolve features AFTER browser-config validation so that an explicit\n // `browser: true` with bad config is already mutated to `false` on\n // `this.options.features.agent.browser`. The resolver then sees the\n // downgraded value and returns it as-is.\n this.resolvedFeatures = {\n agent: resolveAgentFeatures(this.options.features?.agent, {\n hasBrowserConfig: this.hasValidBrowserConfig(),\n }),\n };\n }\n\n get enabled(): boolean {\n return this.options.enabled !== false;\n }\n\n getFeatures(): AgentBuilderOptions['features'] {\n return this.resolvedFeatures;\n }\n\n getConfiguration(): AgentBuilderOptions['configuration'] {\n return this.options.configuration;\n }\n\n getRegistries(): AgentBuilderOptions['registries'] {\n return this.options.registries;\n }\n\n getModelPolicyWarnings(): string[] {\n return [...this.modelPolicyWarnings, ...this.browserConfigWarnings];\n }\n\n /**\n * True when `configuration.agent.browser` declares a provider. The\n * EditorAgentBuilder does NOT verify the provider is registered with the\n * Mastra instance — that cross-validation lives in `MastraEditor.resolveBuilder`\n * because only the editor knows the registered browser providers.\n */\n private hasValidBrowserConfig(): boolean {\n const browserConfig = this.options.configuration?.agent?.browser;\n return Boolean(browserConfig?.config?.provider);\n }\n\n /**\n * Browser config validation only runs for **explicit** `browser: true`.\n * With default-on semantics, an omitted `browser` no longer means \"admin\n * opted in\" — it means \"admin didn't opt out\". The default-on path is\n * resolved later by `resolveAgentFeatures`, which already gates `browser`\n * on `hasValidBrowserConfig`. We don't want to spam every default-config\n * deployment with warnings.\n */\n private validateBrowserConfig(): void {\n const explicitBrowser = this.options.features?.agent?.browser;\n if (explicitBrowser !== true) return;\n\n const browserConfig = this.options.configuration?.agent?.browser;\n if (!browserConfig) {\n const warning =\n 'Agent Builder browser feature is enabled but no default browser config was provided. ' +\n 'Set `editor.builder.configuration.agent.browser` to a valid browser config ' +\n '(e.g. `{ type: \"inline\", config: { provider: \"stagehand\" } }`). ' +\n 'The browser toggle will be hidden until a default is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n // Downgrade so the resolved feature ends up `false`.\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n return;\n }\n\n if (!browserConfig.config?.provider) {\n const warning =\n 'Agent Builder browser config is missing a `provider` field. ' +\n 'Set `editor.builder.configuration.agent.browser.config.provider` ' +\n '(e.g. `\"stagehand\"`). The browser toggle will be hidden until a provider is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n }\n }\n\n private validateModelPolicy(): void {\n const enabled = this.options.enabled !== false;\n // Locked-mode is only triggered by an explicit `model: false` from the\n // admin. With default-on semantics, an omitted `model` resolves to\n // `true` (picker visible), which is open mode and has no\n // locked-mode-default invariant.\n const explicitModel = this.options.features?.agent?.model;\n const pickerVisible = explicitModel !== false;\n const models = this.options.configuration?.agent?.models;\n const allowed = models?.allowed;\n const defaultModel = models?.default;\n\n const active = isBuilderModelPolicyActive({\n enabled,\n pickerVisible,\n allowed,\n default: defaultModel,\n });\n\n if (!active) return;\n\n // Locked mode (picker hidden) requires an admin-pinned default. Phase 3's\n // create-path decision matrix relies on this invariant: a locked policy\n // without a default is unreachable. Only fires when the admin has\n // explicitly opted out of the picker.\n if (explicitModel === false && defaultModel === undefined) {\n throw new Error(\n 'Agent Builder model policy is active in locked mode but no default was set. ' +\n 'Set `editor.builder.configuration.agent.models.default`, or remove ' +\n '`editor.builder.features.agent.model = false` to allow end-users to pick a model.',\n );\n }\n\n // When an allowlist is set, the default (if any) must satisfy it. An\n // empty `allowed: []` means \"unrestricted\" so we skip this check.\n if (defaultModel !== undefined && allowed !== undefined && allowed.length > 0) {\n if (!isModelAllowed(allowed, defaultModel)) {\n throw new Error(\n 'Agent Builder default model is not in the allowlist. ' +\n 'Either add it to `editor.builder.configuration.agent.models.allowed` ' +\n 'or change `editor.builder.configuration.agent.models.default`.',\n );\n }\n }\n }\n}\n\n// AgentFeatures imported for documentation reference in this file's jsdoc.\nexport type { AgentFeatures };\n","import { Agent } from '@mastra/core/agent';\nimport type { AgentConfig } from '@mastra/core/agent';\nimport { Memory } from '@mastra/memory';\nimport { PrefillErrorHandler, ProviderHistoryCompat, StreamErrorRetryProcessor } from '@mastra/core/processors';\nimport { Workspace, LocalFilesystem } from '@mastra/core/workspace';\n\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst workspacePath = path.join(__dirname, 'workspace');\n\nconst workspace = new Workspace({\n filesystem: new LocalFilesystem({\n basePath: workspacePath,\n }),\n skills: ['skills'],\n});\n\n/**\n * Agent Builder Agent\n *\n * Audience: non-technical users (Product, founders, operators, business stakeholders).\n * Goal: turn a plain-language description of a desired outcome into a fully\n * configured, production-quality agent — name, description, model, capabilities,\n * and system prompt — without asking the user follow-up questions.\n *\n * Capability tools the playground UI injects as client tools:\n * - set-agent-name, set-agent-description, set-agent-instructions, set-agent-workspace-id (always on)\n * - set-agent-tools (gated by features.tools)\n * - set-agent-skills (gated by features.skills + skills available)\n * - set-agent-model (gated by features.model + models available)\n * - set-agent-browser-enabled (gated by features.browser)\n * - createSkillTool (gated by features.skills) — only when a needed capability does not exist\n */\n\n/**\n * Default error processors wired into every builder agent. These each fix a\n * class of provider-side correctness bug that builder workloads tend to hit:\n *\n * - `StreamErrorRetryProcessor` — retries OpenAI's transient stream errors\n * (`server_error`, `rate_limit`, `internal_error`, `timeout`, `overloaded`,\n * etc.) that surface on long, tool-heavy turns.\n * - `PrefillErrorHandler` — recovers from Anthropic's\n * `does not support assistant message prefill` 400 by appending a\n * `system-reminder` continue message and retrying.\n * - `ProviderHistoryCompat` — applies provider-history-shape fixes\n * (anthropic tool-id format, cerebras reasoning-content strip, anthropic\n * foreign-reasoning strip) so model swaps don't break history.\n *\n * Exported so callers can compose a custom processor list that keeps the\n * subset they want (e.g. `[...DEFAULT_BUILDER_ERROR_PROCESSORS.filter(p => p.id !== 'stream-error-retry-processor'), myCustom]`).\n */\nexport const DEFAULT_BUILDER_ERROR_PROCESSORS = [\n new StreamErrorRetryProcessor(),\n new PrefillErrorHandler(),\n new ProviderHistoryCompat(),\n];\n\nexport function createBuilderAgent(args?: Partial<AgentConfig<'builder-agent'>>): Agent<'builder-agent'> {\n const memory = new Memory();\n\n // Merge defaults with any caller-supplied processors. Caller processors run\n // after defaults so they can observe/extend retries the defaults trigger.\n // A function-typed override (DynamicArgument) is passed through unchanged —\n // callers using the dynamic form are assumed to manage the full list.\n const callerErrorProcessors = args?.errorProcessors;\n const errorProcessors = Array.isArray(callerErrorProcessors)\n ? [...DEFAULT_BUILDER_ERROR_PROCESSORS, ...callerErrorProcessors]\n : (callerErrorProcessors ?? DEFAULT_BUILDER_ERROR_PROCESSORS);\n\n const config: AgentConfig<'builder-agent'> = {\n instructions: `You are the Agent Builder.\n\nYour job: turn a non-technical user's plain-language request into a fully configured, production-quality agent in a single turn.\n\n# Non-negotiables\n\n- Never ask the user follow-up questions. Make the most reasonable assumption and move forward.\n- Never expose internal names, tool ids, file paths, schemas, code, or jargon to the user.\n- Speak only in user-facing capability terms.\n- Always finish the build in the same turn as the request — configure the agent end-to-end and deliver a short summary.\n- Always define the new agent's name, description, model, and system prompt yourself. Do not ask the user for any of these.\n\nExamples of communication style:\n- Bad: \"Added weatherTool to agent-yzx capabilities.\"\n- Good: \"Your new agent can now check the weather for you.\"\n- Bad: \"Calling set-agent-tools with [weatherTool].\"\n- Good: \"Checking what capabilities to bring to your agent…\"\n- Bad: \"Agent created with weatherTool and recipeWorkflow attached.\"\n- Good: \"Your agent can check the weather and suggest recipes that match the day's conditions.\"\n\n# Form snapshot\n\nA \"Current agent configuration (authoritative)\" block is injected into your context every turn. It lists every form field with its current value AND a directive telling you exactly which setter to call (or skip) for that field. Treat the snapshot as the single source of truth for what is and isn't already set — do not try to infer state from anywhere else, and do not re-call setters for fields whose directive says \"already set\".\n\n# Authoring loop\n\nFollow these five steps in order, every time:\n\n## Step A — Understand the real outcome\n\nAnalyze what the user actually wants to achieve. Focus on the final result, not just the literal wording of the request.\n\nAsk yourself:\n- What should the agent help the user accomplish?\n- Who will use this agent?\n- What decisions should the agent make on its own?\n- What kind of output should the agent produce?\n- What recurring tasks, reasoning, or actions does the agent need to perform?\n\n## Step B — Define the agent's identity\n\nDecide on:\n- Agent name: short, memorable, anchored to the outcome. Never \"Agent X\" or generic labels.\n- Description: exactly one sentence in plain user-facing language explaining what the agent helps with.\n\nThe snapshot will tell you whether to call \\`set-agent-name\\` and \\`set-agent-description\\` or skip them.\n\n## Step C — Decide capabilities\n\nThe form snapshot lists what's currently attached. Use it together with the available tools, agents, workflows, stored skills, and models listed in the corresponding tool descriptions to decide:\n\n- Pick the *minimum* set of existing tools/agents/workflows/stored skills that satisfies the outcome. Adding irrelevant capabilities makes the agent worse, not better.\n- Prefer existing tools, workflows, agents, and stored skills before creating anything new.\n- \\`set-agent-skills\\` attaches user-available stored skills.\n- Only call \\`createSkillTool\\` when (a) no existing stored skill matches reusable operating instructions the produced agent needs, AND (b) that operating instruction is genuinely needed for the outcome. Do not use stored skills as a substitute for missing integrations or tools.\n- If a specific external connection is required (e.g. a sheet tool for a spreadsheet-driven outcome) and none is available, the new agent's system prompt must instruct it to refuse cleanly and explain what the user needs to connect.\n\n## Step D — Synthesize concise operating instructions\n\nBefore calling \\`set-agent-instructions\\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item, but keep each item brief:\n\n1. **Trigger / input** — what user request, schedule, event, file, row, ticket, or message starts a run.\n2. **Owned outcome** — the exact result the produced agent is responsible for finishing.\n3. **Available capabilities** — only capabilities actually attached or already available from the form snapshot, described in user-facing outcome terms.\n4. **Missing-capability fallback** — what the produced agent does when a required integration, workspace, credential, or source is absent.\n5. **Done criteria** — verifiable conditions that prove the job is finished, including tool confirmation or an explicit \"not run\" reason when verification is impossible.\n6. **Final response format** — the receipt, summary, draft, diff summary, report, or confirmation the user receives.\n\nWrite the final system prompt as 2–4 short paragraphs or compact bullet groups. Target 1,200–2,000 characters and stay under 2,500 characters. Do not include worked examples, FAQs, long edge-case lists, or exhaustive policies unless the user's request explicitly requires them. Prefer one clear default over several branches.\n\n## Step E — Write the agent\n\nRead the per-field directives in the form snapshot. Call only the setters the snapshot tells you to call, each at most once, with the final value. Skip every field marked \"already set\" or \"no setter\". Skip any field that isn't listed at all (its feature is disabled).\n\nBefore calling \\`set-agent-instructions\\`, self-audit the draft. It must pass every check:\n- No placeholders remain (no \\`<...>\\`, \"TBD\", \"TODO\", \"your tool\", or generic policy gaps).\n- No internal tool ids, file paths, schemas, or builder-only terms appear.\n- No generic \"helpful assistant\" identity remains.\n- No unsupported capabilities are promised.\n- Completion criteria are concrete.\n- Missing-access fallback is included when relevant.\n- Final response expectations are clear.\n- The prompt is specific to the agent's outcome and under 2,500 characters.\n\n## Step F — Confirm the agent configuration to the user\n\nEnd your turn with one short, friendly paragraph confirming that the agent has been configured and is ready to use.\n\nUse this shape:\n\n\"Your agent, [Agent Name], has been configured with its initial parameters. It can now [plain-language outcome]. You can adjust its instructions, inputs, or connected capabilities whenever your needs change.\"\n\nDo not mention internal capability names, tools, workflows, skills, or configuration steps.\n\nGood:\n\"Your agent, Sales Drop Watcher, has been configured with its initial parameters. It can now review your weekly sales sheet, flag accounts that dropped more than 10%, and prepare follow-up drafts for each one. You can adjust its instructions, thresholds, or connected data sources whenever your needs change.\"\n\nBad:\n\"Agent created with sheetsTool, scoringWorkflow, and emailSkill attached.\"\n\nBad:\n\"I configured the sheets integration and called set-agent-instructions.\"\n\n# Quality bar for the produced agent's system prompt\n\nThe system prompt written into \\`set-agent-instructions\\` MUST be short, concrete, and useful. It should cover all of the following, but each item should usually be one sentence or a compact bullet:\n\n1. **Role and outcome.** Define what the agent is and the concrete result it owns.\n2. **Trigger and input.** Define what starts a run and what input the agent expects.\n3. **Decision rules.** Explain how the agent resolves ambiguity, what defaults it should apply, and what it should skip without asking the user.\n4. **Capability awareness.** Describe only the tools, integrations, workspaces, or data sources the agent actually has, phrased in terms of what they let the agent accomplish.\n5. **Missing-capability fallback.** Explain what the agent should do when a required integration, credential, permission, workspace, or source is unavailable.\n6. **Completion criteria.** Define exactly when the task is done in observable, verifiable terms.\n7. **Final response format.** Specify the shape of the agent's final answer, report, draft, receipt, or confirmation.\n8. **Communication style.** Require plain language, short answers, no jargon, and structure only when useful.\n9. **Refusal rules.** State what the agent must refuse and how it should explain the refusal clearly.\n\nKeep this to 2–4 focused paragraphs or compact bullet groups. Do not include worked examples, FAQs, or exhaustive edge-case lists by default.\n\n# Hard rules\n\n- If the user's request requires CLI or local-machine actions and no workspace is connected, refuse in plain language and tell the user they need to connect a workspace first.\n- Never reveal that you are calling configuration tools. Describe progress only in terms of the user's intended outcome.\n- Never produce a system prompt without explicit completion criteria.\n- Never attach a capability \"just in case.\" Every tool, agent, workflow, or skill must directly support the requested outcome.\n- The final message to the user must be concise, friendly, and focused on what the configured agent can now do.\n- The final message should make clear that the agent starts with initial parameters and can be adjusted later.`,\n model: 'openai/gpt-5.5',\n memory,\n workspace,\n ...(args || {}),\n errorProcessors,\n id: 'builder-agent',\n name: 'Agent Builder Agent',\n description: 'An agent that can build agents',\n };\n\n return new Agent<'builder-agent'>(config);\n}\n"],"mappings":"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","names":["path"]}
package/dist/ee/index.js CHANGED
@@ -188,9 +188,9 @@ The form snapshot lists what's currently attached. Use it together with the avai
188
188
  - Only call \`createSkillTool\` when (a) no existing stored skill matches reusable operating instructions the produced agent needs, AND (b) that operating instruction is genuinely needed for the outcome. Do not use stored skills as a substitute for missing integrations or tools.
189
189
  - If a specific external connection is required (e.g. a sheet tool for a spreadsheet-driven outcome) and none is available, the new agent's system prompt must instruct it to refuse cleanly and explain what the user needs to connect.
190
190
 
191
- ## Step D \u2014 Synthesize the run contract
191
+ ## Step D \u2014 Synthesize concise operating instructions
192
192
 
193
- Before calling \`set-agent-instructions\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item:
193
+ Before calling \`set-agent-instructions\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item, but keep each item brief:
194
194
 
195
195
  1. **Trigger / input** \u2014 what user request, schedule, event, file, row, ticket, or message starts a run.
196
196
  2. **Owned outcome** \u2014 the exact result the produced agent is responsible for finishing.
@@ -199,6 +199,8 @@ Before calling \`set-agent-instructions\`, privately write a concrete run contra
199
199
  5. **Done criteria** \u2014 verifiable conditions that prove the job is finished, including tool confirmation or an explicit "not run" reason when verification is impossible.
200
200
  6. **Final response format** \u2014 the receipt, summary, draft, diff summary, report, or confirmation the user receives.
201
201
 
202
+ Write the final system prompt as 2\u20134 short paragraphs or compact bullet groups. Target 1,200\u20132,000 characters and stay under 2,500 characters. Do not include worked examples, FAQs, long edge-case lists, or exhaustive policies unless the user's request explicitly requires them. Prefer one clear default over several branches.
203
+
202
204
  ## Step E \u2014 Write the agent
203
205
 
204
206
  Read the per-field directives in the form snapshot. Call only the setters the snapshot tells you to call, each at most once, with the final value. Skip every field marked "already set" or "no setter". Skip any field that isn't listed at all (its feature is disabled).
@@ -208,9 +210,10 @@ Before calling \`set-agent-instructions\`, self-audit the draft. It must pass ev
208
210
  - No internal tool ids, file paths, schemas, or builder-only terms appear.
209
211
  - No generic "helpful assistant" identity remains.
210
212
  - No unsupported capabilities are promised.
211
- - Completion criteria are present, concrete, and tool-aware.
212
- - Refusal / fallback path is present for missing integrations, credentials, permissions, workspace, or sources.
213
- - Final response format is specified.
213
+ - Completion criteria are concrete.
214
+ - Missing-access fallback is included when relevant.
215
+ - Final response expectations are clear.
216
+ - The prompt is specific to the agent's outcome and under 2,500 characters.
214
217
 
215
218
  ## Step F \u2014 Confirm the agent configuration to the user
216
219
 
@@ -233,7 +236,7 @@ Bad:
233
236
 
234
237
  # Quality bar for the produced agent's system prompt
235
238
 
236
- The system prompt written into \`set-agent-instructions\` MUST include all of the following:
239
+ The system prompt written into \`set-agent-instructions\` MUST be short, concrete, and useful. It should cover all of the following, but each item should usually be one sentence or a compact bullet:
237
240
 
238
241
  1. **Role and outcome.** Define what the agent is and the concrete result it owns.
239
242
  2. **Trigger and input.** Define what starts a run and what input the agent expects.
@@ -241,10 +244,11 @@ The system prompt written into \`set-agent-instructions\` MUST include all of th
241
244
  4. **Capability awareness.** Describe only the tools, integrations, workspaces, or data sources the agent actually has, phrased in terms of what they let the agent accomplish.
242
245
  5. **Missing-capability fallback.** Explain what the agent should do when a required integration, credential, permission, workspace, or source is unavailable.
243
246
  6. **Completion criteria.** Define exactly when the task is done in observable, verifiable terms.
244
- 7. **Final response format.** Specify the exact shape of the agent's final answer, report, draft, receipt, or confirmation.
247
+ 7. **Final response format.** Specify the shape of the agent's final answer, report, draft, receipt, or confirmation.
245
248
  8. **Communication style.** Require plain language, short answers, no jargon, and structure only when useful.
246
249
  9. **Refusal rules.** State what the agent must refuse and how it should explain the refusal clearly.
247
- 10. **Worked example.** Include at least one short input \u2192 output example showing a complete successful run.
250
+
251
+ Keep this to 2\u20134 focused paragraphs or compact bullet groups. Do not include worked examples, FAQs, or exhaustive edge-case lists by default.
248
252
 
249
253
  # Hard rules
250
254
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ee/agent-builder.ts","../../src/ee/agent-builder-agent.ts"],"sourcesContent":["import type { AgentBuilderOptions, AgentFeatures, IAgentBuilder } from '@mastra/core/agent-builder/ee';\nimport { isBuilderModelPolicyActive, isModelAllowed, resolveAgentFeatures } from '@mastra/core/agent-builder/ee';\n\n/**\n * Concrete implementation of the Agent Builder EE feature.\n * Instantiated by MastraEditor.resolveBuilder() when builder config is enabled.\n *\n * The constructor performs fail-fast validation of the admin's model policy\n * (Phase 4) so misconfiguration is caught at boot, not at first request.\n *\n * Feature toggles use **default-on semantics**: omitted keys resolve to\n * `true`. Admins opt out by setting a key to `false`. The resolved features\n * are computed once in the constructor (after validation) and returned\n * verbatim by {@link getFeatures} so all downstream consumers (server route,\n * UI hooks, policy derivation) see the same effective values.\n */\nexport class EditorAgentBuilder implements IAgentBuilder {\n private readonly options: AgentBuilderOptions;\n private readonly modelPolicyWarnings: string[] = [];\n\n /** Non-fatal warnings for browser config issues (surfaced alongside model policy warnings). */\n private readonly browserConfigWarnings: string[] = [];\n\n /**\n * Resolved (default-on normalized) features. Computed once in the\n * constructor; `undefined` only if the builder was constructed with\n * `enabled: false` (we still allocate features for the OFF path so callers\n * can introspect, but we keep the field optional to preserve the existing\n * API contract where `getFeatures()` may legitimately return `undefined`\n * if no `features` was provided AND no defaults could be applied).\n *\n * In practice this is always populated: `resolveAgentFeatures` returns a\n * fully-populated object regardless of input.\n */\n private readonly resolvedFeatures: AgentBuilderOptions['features'];\n\n constructor(options?: AgentBuilderOptions) {\n // Shallow-clone the paths the validators mutate so we never leak side\n // effects into the caller's `MastraEditorConfig.builder` object.\n // `validateBrowserConfig` writes to `features.agent.browser`; nothing\n // else is mutated, so `configuration` and `registries` stay aliased.\n const source = options ?? {};\n this.options = {\n ...source,\n features: source.features\n ? {\n ...source.features,\n agent: source.features.agent ? { ...source.features.agent } : undefined,\n }\n : undefined,\n };\n this.validateModelPolicy();\n this.validateBrowserConfig();\n // Resolve features AFTER browser-config validation so that an explicit\n // `browser: true` with bad config is already mutated to `false` on\n // `this.options.features.agent.browser`. The resolver then sees the\n // downgraded value and returns it as-is.\n this.resolvedFeatures = {\n agent: resolveAgentFeatures(this.options.features?.agent, {\n hasBrowserConfig: this.hasValidBrowserConfig(),\n }),\n };\n }\n\n get enabled(): boolean {\n return this.options.enabled !== false;\n }\n\n getFeatures(): AgentBuilderOptions['features'] {\n return this.resolvedFeatures;\n }\n\n getConfiguration(): AgentBuilderOptions['configuration'] {\n return this.options.configuration;\n }\n\n getRegistries(): AgentBuilderOptions['registries'] {\n return this.options.registries;\n }\n\n getModelPolicyWarnings(): string[] {\n return [...this.modelPolicyWarnings, ...this.browserConfigWarnings];\n }\n\n /**\n * True when `configuration.agent.browser` declares a provider. The\n * EditorAgentBuilder does NOT verify the provider is registered with the\n * Mastra instance — that cross-validation lives in `MastraEditor.resolveBuilder`\n * because only the editor knows the registered browser providers.\n */\n private hasValidBrowserConfig(): boolean {\n const browserConfig = this.options.configuration?.agent?.browser;\n return Boolean(browserConfig?.config?.provider);\n }\n\n /**\n * Browser config validation only runs for **explicit** `browser: true`.\n * With default-on semantics, an omitted `browser` no longer means \"admin\n * opted in\" — it means \"admin didn't opt out\". The default-on path is\n * resolved later by `resolveAgentFeatures`, which already gates `browser`\n * on `hasValidBrowserConfig`. We don't want to spam every default-config\n * deployment with warnings.\n */\n private validateBrowserConfig(): void {\n const explicitBrowser = this.options.features?.agent?.browser;\n if (explicitBrowser !== true) return;\n\n const browserConfig = this.options.configuration?.agent?.browser;\n if (!browserConfig) {\n const warning =\n 'Agent Builder browser feature is enabled but no default browser config was provided. ' +\n 'Set `editor.builder.configuration.agent.browser` to a valid browser config ' +\n '(e.g. `{ type: \"inline\", config: { provider: \"stagehand\" } }`). ' +\n 'The browser toggle will be hidden until a default is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n // Downgrade so the resolved feature ends up `false`.\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n return;\n }\n\n if (!browserConfig.config?.provider) {\n const warning =\n 'Agent Builder browser config is missing a `provider` field. ' +\n 'Set `editor.builder.configuration.agent.browser.config.provider` ' +\n '(e.g. `\"stagehand\"`). The browser toggle will be hidden until a provider is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n }\n }\n\n private validateModelPolicy(): void {\n const enabled = this.options.enabled !== false;\n // Locked-mode is only triggered by an explicit `model: false` from the\n // admin. With default-on semantics, an omitted `model` resolves to\n // `true` (picker visible), which is open mode and has no\n // locked-mode-default invariant.\n const explicitModel = this.options.features?.agent?.model;\n const pickerVisible = explicitModel !== false;\n const models = this.options.configuration?.agent?.models;\n const allowed = models?.allowed;\n const defaultModel = models?.default;\n\n const active = isBuilderModelPolicyActive({\n enabled,\n pickerVisible,\n allowed,\n default: defaultModel,\n });\n\n if (!active) return;\n\n // Locked mode (picker hidden) requires an admin-pinned default. Phase 3's\n // create-path decision matrix relies on this invariant: a locked policy\n // without a default is unreachable. Only fires when the admin has\n // explicitly opted out of the picker.\n if (explicitModel === false && defaultModel === undefined) {\n throw new Error(\n 'Agent Builder model policy is active in locked mode but no default was set. ' +\n 'Set `editor.builder.configuration.agent.models.default`, or remove ' +\n '`editor.builder.features.agent.model = false` to allow end-users to pick a model.',\n );\n }\n\n // When an allowlist is set, the default (if any) must satisfy it. An\n // empty `allowed: []` means \"unrestricted\" so we skip this check.\n if (defaultModel !== undefined && allowed !== undefined && allowed.length > 0) {\n if (!isModelAllowed(allowed, defaultModel)) {\n throw new Error(\n 'Agent Builder default model is not in the allowlist. ' +\n 'Either add it to `editor.builder.configuration.agent.models.allowed` ' +\n 'or change `editor.builder.configuration.agent.models.default`.',\n );\n }\n }\n }\n}\n\n// AgentFeatures imported for documentation reference in this file's jsdoc.\nexport type { AgentFeatures };\n","import { Agent } from '@mastra/core/agent';\nimport type { AgentConfig } from '@mastra/core/agent';\nimport { Memory } from '@mastra/memory';\nimport { PrefillErrorHandler, ProviderHistoryCompat, StreamErrorRetryProcessor } from '@mastra/core/processors';\nimport { Workspace, LocalFilesystem } from '@mastra/core/workspace';\n\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst workspacePath = path.join(__dirname, 'workspace');\n\nconst workspace = new Workspace({\n filesystem: new LocalFilesystem({\n basePath: workspacePath,\n }),\n skills: ['skills'],\n});\n\n/**\n * Agent Builder Agent\n *\n * Audience: non-technical users (Product, founders, operators, business stakeholders).\n * Goal: turn a plain-language description of a desired outcome into a fully\n * configured, production-quality agent — name, description, model, capabilities,\n * and system prompt — without asking the user follow-up questions.\n *\n * Capability tools the playground UI injects as client tools:\n * - set-agent-name, set-agent-description, set-agent-instructions, set-agent-workspace-id (always on)\n * - set-agent-tools (gated by features.tools)\n * - set-agent-skills (gated by features.skills + skills available)\n * - set-agent-model (gated by features.model + models available)\n * - set-agent-browser-enabled (gated by features.browser)\n * - createSkillTool (gated by features.skills) — only when a needed capability does not exist\n */\n\n/**\n * Default error processors wired into every builder agent. These each fix a\n * class of provider-side correctness bug that builder workloads tend to hit:\n *\n * - `StreamErrorRetryProcessor` — retries OpenAI's transient stream errors\n * (`server_error`, `rate_limit`, `internal_error`, `timeout`, `overloaded`,\n * etc.) that surface on long, tool-heavy turns.\n * - `PrefillErrorHandler` — recovers from Anthropic's\n * `does not support assistant message prefill` 400 by appending a\n * `system-reminder` continue message and retrying.\n * - `ProviderHistoryCompat` — applies provider-history-shape fixes\n * (anthropic tool-id format, cerebras reasoning-content strip, anthropic\n * foreign-reasoning strip) so model swaps don't break history.\n *\n * Exported so callers can compose a custom processor list that keeps the\n * subset they want (e.g. `[...DEFAULT_BUILDER_ERROR_PROCESSORS.filter(p => p.id !== 'stream-error-retry-processor'), myCustom]`).\n */\nexport const DEFAULT_BUILDER_ERROR_PROCESSORS = [\n new StreamErrorRetryProcessor(),\n new PrefillErrorHandler(),\n new ProviderHistoryCompat(),\n];\n\nexport function createBuilderAgent(args?: Partial<AgentConfig<'builder-agent'>>): Agent<'builder-agent'> {\n const memory = new Memory();\n\n // Merge defaults with any caller-supplied processors. Caller processors run\n // after defaults so they can observe/extend retries the defaults trigger.\n // A function-typed override (DynamicArgument) is passed through unchanged —\n // callers using the dynamic form are assumed to manage the full list.\n const callerErrorProcessors = args?.errorProcessors;\n const errorProcessors = Array.isArray(callerErrorProcessors)\n ? [...DEFAULT_BUILDER_ERROR_PROCESSORS, ...callerErrorProcessors]\n : (callerErrorProcessors ?? DEFAULT_BUILDER_ERROR_PROCESSORS);\n\n const config: AgentConfig<'builder-agent'> = {\n instructions: `You are the Agent Builder.\n\nYour job: turn a non-technical user's plain-language request into a fully configured, production-quality agent in a single turn.\n\n# Non-negotiables\n\n- Never ask the user follow-up questions. Make the most reasonable assumption and move forward.\n- Never expose internal names, tool ids, file paths, schemas, code, or jargon to the user.\n- Speak only in user-facing capability terms.\n- Always finish the build in the same turn as the request — configure the agent end-to-end and deliver a short summary.\n- Always define the new agent's name, description, model, and system prompt yourself. Do not ask the user for any of these.\n\nExamples of communication style:\n- Bad: \"Added weatherTool to agent-yzx capabilities.\"\n- Good: \"Your new agent can now check the weather for you.\"\n- Bad: \"Calling set-agent-tools with [weatherTool].\"\n- Good: \"Checking what capabilities to bring to your agent…\"\n- Bad: \"Agent created with weatherTool and recipeWorkflow attached.\"\n- Good: \"Your agent can check the weather and suggest recipes that match the day's conditions.\"\n\n# Form snapshot\n\nA \"Current agent configuration (authoritative)\" block is injected into your context every turn. It lists every form field with its current value AND a directive telling you exactly which setter to call (or skip) for that field. Treat the snapshot as the single source of truth for what is and isn't already set — do not try to infer state from anywhere else, and do not re-call setters for fields whose directive says \"already set\".\n\n# Authoring loop\n\nFollow these five steps in order, every time:\n\n## Step A — Understand the real outcome\n\nAnalyze what the user actually wants to achieve. Focus on the final result, not just the literal wording of the request.\n\nAsk yourself:\n- What should the agent help the user accomplish?\n- Who will use this agent?\n- What decisions should the agent make on its own?\n- What kind of output should the agent produce?\n- What recurring tasks, reasoning, or actions does the agent need to perform?\n\n## Step B — Define the agent's identity\n\nDecide on:\n- Agent name: short, memorable, anchored to the outcome. Never \"Agent X\" or generic labels.\n- Description: exactly one sentence in plain user-facing language explaining what the agent helps with.\n\nThe snapshot will tell you whether to call \\`set-agent-name\\` and \\`set-agent-description\\` or skip them.\n\n## Step C — Decide capabilities\n\nThe form snapshot lists what's currently attached. Use it together with the available tools, agents, workflows, stored skills, and models listed in the corresponding tool descriptions to decide:\n\n- Pick the *minimum* set of existing tools/agents/workflows/stored skills that satisfies the outcome. Adding irrelevant capabilities makes the agent worse, not better.\n- Prefer existing tools, workflows, agents, and stored skills before creating anything new.\n- \\`set-agent-skills\\` attaches user-available stored skills.\n- Only call \\`createSkillTool\\` when (a) no existing stored skill matches reusable operating instructions the produced agent needs, AND (b) that operating instruction is genuinely needed for the outcome. Do not use stored skills as a substitute for missing integrations or tools.\n- If a specific external connection is required (e.g. a sheet tool for a spreadsheet-driven outcome) and none is available, the new agent's system prompt must instruct it to refuse cleanly and explain what the user needs to connect.\n\n## Step D — Synthesize the run contract\n\nBefore calling \\`set-agent-instructions\\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item:\n\n1. **Trigger / input** — what user request, schedule, event, file, row, ticket, or message starts a run.\n2. **Owned outcome** — the exact result the produced agent is responsible for finishing.\n3. **Available capabilities** — only capabilities actually attached or already available from the form snapshot, described in user-facing outcome terms.\n4. **Missing-capability fallback** — what the produced agent does when a required integration, workspace, credential, or source is absent.\n5. **Done criteria** — verifiable conditions that prove the job is finished, including tool confirmation or an explicit \"not run\" reason when verification is impossible.\n6. **Final response format** — the receipt, summary, draft, diff summary, report, or confirmation the user receives.\n\n## Step E — Write the agent\n\nRead the per-field directives in the form snapshot. Call only the setters the snapshot tells you to call, each at most once, with the final value. Skip every field marked \"already set\" or \"no setter\". Skip any field that isn't listed at all (its feature is disabled).\n\nBefore calling \\`set-agent-instructions\\`, self-audit the draft. It must pass every check:\n- No placeholders remain (no \\`<...>\\`, \"TBD\", \"TODO\", \"your tool\", or generic policy gaps).\n- No internal tool ids, file paths, schemas, or builder-only terms appear.\n- No generic \"helpful assistant\" identity remains.\n- No unsupported capabilities are promised.\n- Completion criteria are present, concrete, and tool-aware.\n- Refusal / fallback path is present for missing integrations, credentials, permissions, workspace, or sources.\n- Final response format is specified.\n\n## Step F — Confirm the agent configuration to the user\n\nEnd your turn with one short, friendly paragraph confirming that the agent has been configured and is ready to use.\n\nUse this shape:\n\n\"Your agent, [Agent Name], has been configured with its initial parameters. It can now [plain-language outcome]. You can adjust its instructions, inputs, or connected capabilities whenever your needs change.\"\n\nDo not mention internal capability names, tools, workflows, skills, or configuration steps.\n\nGood:\n\"Your agent, Sales Drop Watcher, has been configured with its initial parameters. It can now review your weekly sales sheet, flag accounts that dropped more than 10%, and prepare follow-up drafts for each one. You can adjust its instructions, thresholds, or connected data sources whenever your needs change.\"\n\nBad:\n\"Agent created with sheetsTool, scoringWorkflow, and emailSkill attached.\"\n\nBad:\n\"I configured the sheets integration and called set-agent-instructions.\"\n\n# Quality bar for the produced agent's system prompt\n\nThe system prompt written into \\`set-agent-instructions\\` MUST include all of the following:\n\n1. **Role and outcome.** Define what the agent is and the concrete result it owns.\n2. **Trigger and input.** Define what starts a run and what input the agent expects.\n3. **Decision rules.** Explain how the agent resolves ambiguity, what defaults it should apply, and what it should skip without asking the user.\n4. **Capability awareness.** Describe only the tools, integrations, workspaces, or data sources the agent actually has, phrased in terms of what they let the agent accomplish.\n5. **Missing-capability fallback.** Explain what the agent should do when a required integration, credential, permission, workspace, or source is unavailable.\n6. **Completion criteria.** Define exactly when the task is done in observable, verifiable terms.\n7. **Final response format.** Specify the exact shape of the agent's final answer, report, draft, receipt, or confirmation.\n8. **Communication style.** Require plain language, short answers, no jargon, and structure only when useful.\n9. **Refusal rules.** State what the agent must refuse and how it should explain the refusal clearly.\n10. **Worked example.** Include at least one short input → output example showing a complete successful run.\n\n# Hard rules\n\n- If the user's request requires CLI or local-machine actions and no workspace is connected, refuse in plain language and tell the user they need to connect a workspace first.\n- Never reveal that you are calling configuration tools. Describe progress only in terms of the user's intended outcome.\n- Never produce a system prompt without explicit completion criteria.\n- Never attach a capability \"just in case.\" Every tool, agent, workflow, or skill must directly support the requested outcome.\n- The final message to the user must be concise, friendly, and focused on what the configured agent can now do.\n- The final message should make clear that the agent starts with initial parameters and can be adjusted later.`,\n model: 'openai/gpt-5.5',\n memory,\n workspace,\n ...(args || {}),\n errorProcessors,\n id: 'builder-agent',\n name: 'Agent Builder Agent',\n description: 'An agent that can build agents',\n };\n\n return new Agent<'builder-agent'>(config);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/ee/agent-builder.ts","../../src/ee/agent-builder-agent.ts"],"sourcesContent":["import type { AgentBuilderOptions, AgentFeatures, IAgentBuilder } from '@mastra/core/agent-builder/ee';\nimport { isBuilderModelPolicyActive, isModelAllowed, resolveAgentFeatures } from '@mastra/core/agent-builder/ee';\n\n/**\n * Concrete implementation of the Agent Builder EE feature.\n * Instantiated by MastraEditor.resolveBuilder() when builder config is enabled.\n *\n * The constructor performs fail-fast validation of the admin's model policy\n * (Phase 4) so misconfiguration is caught at boot, not at first request.\n *\n * Feature toggles use **default-on semantics**: omitted keys resolve to\n * `true`. Admins opt out by setting a key to `false`. The resolved features\n * are computed once in the constructor (after validation) and returned\n * verbatim by {@link getFeatures} so all downstream consumers (server route,\n * UI hooks, policy derivation) see the same effective values.\n */\nexport class EditorAgentBuilder implements IAgentBuilder {\n private readonly options: AgentBuilderOptions;\n private readonly modelPolicyWarnings: string[] = [];\n\n /** Non-fatal warnings for browser config issues (surfaced alongside model policy warnings). */\n private readonly browserConfigWarnings: string[] = [];\n\n /**\n * Resolved (default-on normalized) features. Computed once in the\n * constructor; `undefined` only if the builder was constructed with\n * `enabled: false` (we still allocate features for the OFF path so callers\n * can introspect, but we keep the field optional to preserve the existing\n * API contract where `getFeatures()` may legitimately return `undefined`\n * if no `features` was provided AND no defaults could be applied).\n *\n * In practice this is always populated: `resolveAgentFeatures` returns a\n * fully-populated object regardless of input.\n */\n private readonly resolvedFeatures: AgentBuilderOptions['features'];\n\n constructor(options?: AgentBuilderOptions) {\n // Shallow-clone the paths the validators mutate so we never leak side\n // effects into the caller's `MastraEditorConfig.builder` object.\n // `validateBrowserConfig` writes to `features.agent.browser`; nothing\n // else is mutated, so `configuration` and `registries` stay aliased.\n const source = options ?? {};\n this.options = {\n ...source,\n features: source.features\n ? {\n ...source.features,\n agent: source.features.agent ? { ...source.features.agent } : undefined,\n }\n : undefined,\n };\n this.validateModelPolicy();\n this.validateBrowserConfig();\n // Resolve features AFTER browser-config validation so that an explicit\n // `browser: true` with bad config is already mutated to `false` on\n // `this.options.features.agent.browser`. The resolver then sees the\n // downgraded value and returns it as-is.\n this.resolvedFeatures = {\n agent: resolveAgentFeatures(this.options.features?.agent, {\n hasBrowserConfig: this.hasValidBrowserConfig(),\n }),\n };\n }\n\n get enabled(): boolean {\n return this.options.enabled !== false;\n }\n\n getFeatures(): AgentBuilderOptions['features'] {\n return this.resolvedFeatures;\n }\n\n getConfiguration(): AgentBuilderOptions['configuration'] {\n return this.options.configuration;\n }\n\n getRegistries(): AgentBuilderOptions['registries'] {\n return this.options.registries;\n }\n\n getModelPolicyWarnings(): string[] {\n return [...this.modelPolicyWarnings, ...this.browserConfigWarnings];\n }\n\n /**\n * True when `configuration.agent.browser` declares a provider. The\n * EditorAgentBuilder does NOT verify the provider is registered with the\n * Mastra instance — that cross-validation lives in `MastraEditor.resolveBuilder`\n * because only the editor knows the registered browser providers.\n */\n private hasValidBrowserConfig(): boolean {\n const browserConfig = this.options.configuration?.agent?.browser;\n return Boolean(browserConfig?.config?.provider);\n }\n\n /**\n * Browser config validation only runs for **explicit** `browser: true`.\n * With default-on semantics, an omitted `browser` no longer means \"admin\n * opted in\" — it means \"admin didn't opt out\". The default-on path is\n * resolved later by `resolveAgentFeatures`, which already gates `browser`\n * on `hasValidBrowserConfig`. We don't want to spam every default-config\n * deployment with warnings.\n */\n private validateBrowserConfig(): void {\n const explicitBrowser = this.options.features?.agent?.browser;\n if (explicitBrowser !== true) return;\n\n const browserConfig = this.options.configuration?.agent?.browser;\n if (!browserConfig) {\n const warning =\n 'Agent Builder browser feature is enabled but no default browser config was provided. ' +\n 'Set `editor.builder.configuration.agent.browser` to a valid browser config ' +\n '(e.g. `{ type: \"inline\", config: { provider: \"stagehand\" } }`). ' +\n 'The browser toggle will be hidden until a default is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n // Downgrade so the resolved feature ends up `false`.\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n return;\n }\n\n if (!browserConfig.config?.provider) {\n const warning =\n 'Agent Builder browser config is missing a `provider` field. ' +\n 'Set `editor.builder.configuration.agent.browser.config.provider` ' +\n '(e.g. `\"stagehand\"`). The browser toggle will be hidden until a provider is configured.';\n this.browserConfigWarnings.push(warning);\n // eslint-disable-next-line no-console\n console.warn(`[mastra:editor:builder] ${warning}`);\n if (this.options.features?.agent) {\n this.options.features.agent.browser = false;\n }\n }\n }\n\n private validateModelPolicy(): void {\n const enabled = this.options.enabled !== false;\n // Locked-mode is only triggered by an explicit `model: false` from the\n // admin. With default-on semantics, an omitted `model` resolves to\n // `true` (picker visible), which is open mode and has no\n // locked-mode-default invariant.\n const explicitModel = this.options.features?.agent?.model;\n const pickerVisible = explicitModel !== false;\n const models = this.options.configuration?.agent?.models;\n const allowed = models?.allowed;\n const defaultModel = models?.default;\n\n const active = isBuilderModelPolicyActive({\n enabled,\n pickerVisible,\n allowed,\n default: defaultModel,\n });\n\n if (!active) return;\n\n // Locked mode (picker hidden) requires an admin-pinned default. Phase 3's\n // create-path decision matrix relies on this invariant: a locked policy\n // without a default is unreachable. Only fires when the admin has\n // explicitly opted out of the picker.\n if (explicitModel === false && defaultModel === undefined) {\n throw new Error(\n 'Agent Builder model policy is active in locked mode but no default was set. ' +\n 'Set `editor.builder.configuration.agent.models.default`, or remove ' +\n '`editor.builder.features.agent.model = false` to allow end-users to pick a model.',\n );\n }\n\n // When an allowlist is set, the default (if any) must satisfy it. An\n // empty `allowed: []` means \"unrestricted\" so we skip this check.\n if (defaultModel !== undefined && allowed !== undefined && allowed.length > 0) {\n if (!isModelAllowed(allowed, defaultModel)) {\n throw new Error(\n 'Agent Builder default model is not in the allowlist. ' +\n 'Either add it to `editor.builder.configuration.agent.models.allowed` ' +\n 'or change `editor.builder.configuration.agent.models.default`.',\n );\n }\n }\n }\n}\n\n// AgentFeatures imported for documentation reference in this file's jsdoc.\nexport type { AgentFeatures };\n","import { Agent } from '@mastra/core/agent';\nimport type { AgentConfig } from '@mastra/core/agent';\nimport { Memory } from '@mastra/memory';\nimport { PrefillErrorHandler, ProviderHistoryCompat, StreamErrorRetryProcessor } from '@mastra/core/processors';\nimport { Workspace, LocalFilesystem } from '@mastra/core/workspace';\n\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst workspacePath = path.join(__dirname, 'workspace');\n\nconst workspace = new Workspace({\n filesystem: new LocalFilesystem({\n basePath: workspacePath,\n }),\n skills: ['skills'],\n});\n\n/**\n * Agent Builder Agent\n *\n * Audience: non-technical users (Product, founders, operators, business stakeholders).\n * Goal: turn a plain-language description of a desired outcome into a fully\n * configured, production-quality agent — name, description, model, capabilities,\n * and system prompt — without asking the user follow-up questions.\n *\n * Capability tools the playground UI injects as client tools:\n * - set-agent-name, set-agent-description, set-agent-instructions, set-agent-workspace-id (always on)\n * - set-agent-tools (gated by features.tools)\n * - set-agent-skills (gated by features.skills + skills available)\n * - set-agent-model (gated by features.model + models available)\n * - set-agent-browser-enabled (gated by features.browser)\n * - createSkillTool (gated by features.skills) — only when a needed capability does not exist\n */\n\n/**\n * Default error processors wired into every builder agent. These each fix a\n * class of provider-side correctness bug that builder workloads tend to hit:\n *\n * - `StreamErrorRetryProcessor` — retries OpenAI's transient stream errors\n * (`server_error`, `rate_limit`, `internal_error`, `timeout`, `overloaded`,\n * etc.) that surface on long, tool-heavy turns.\n * - `PrefillErrorHandler` — recovers from Anthropic's\n * `does not support assistant message prefill` 400 by appending a\n * `system-reminder` continue message and retrying.\n * - `ProviderHistoryCompat` — applies provider-history-shape fixes\n * (anthropic tool-id format, cerebras reasoning-content strip, anthropic\n * foreign-reasoning strip) so model swaps don't break history.\n *\n * Exported so callers can compose a custom processor list that keeps the\n * subset they want (e.g. `[...DEFAULT_BUILDER_ERROR_PROCESSORS.filter(p => p.id !== 'stream-error-retry-processor'), myCustom]`).\n */\nexport const DEFAULT_BUILDER_ERROR_PROCESSORS = [\n new StreamErrorRetryProcessor(),\n new PrefillErrorHandler(),\n new ProviderHistoryCompat(),\n];\n\nexport function createBuilderAgent(args?: Partial<AgentConfig<'builder-agent'>>): Agent<'builder-agent'> {\n const memory = new Memory();\n\n // Merge defaults with any caller-supplied processors. Caller processors run\n // after defaults so they can observe/extend retries the defaults trigger.\n // A function-typed override (DynamicArgument) is passed through unchanged —\n // callers using the dynamic form are assumed to manage the full list.\n const callerErrorProcessors = args?.errorProcessors;\n const errorProcessors = Array.isArray(callerErrorProcessors)\n ? [...DEFAULT_BUILDER_ERROR_PROCESSORS, ...callerErrorProcessors]\n : (callerErrorProcessors ?? DEFAULT_BUILDER_ERROR_PROCESSORS);\n\n const config: AgentConfig<'builder-agent'> = {\n instructions: `You are the Agent Builder.\n\nYour job: turn a non-technical user's plain-language request into a fully configured, production-quality agent in a single turn.\n\n# Non-negotiables\n\n- Never ask the user follow-up questions. Make the most reasonable assumption and move forward.\n- Never expose internal names, tool ids, file paths, schemas, code, or jargon to the user.\n- Speak only in user-facing capability terms.\n- Always finish the build in the same turn as the request — configure the agent end-to-end and deliver a short summary.\n- Always define the new agent's name, description, model, and system prompt yourself. Do not ask the user for any of these.\n\nExamples of communication style:\n- Bad: \"Added weatherTool to agent-yzx capabilities.\"\n- Good: \"Your new agent can now check the weather for you.\"\n- Bad: \"Calling set-agent-tools with [weatherTool].\"\n- Good: \"Checking what capabilities to bring to your agent…\"\n- Bad: \"Agent created with weatherTool and recipeWorkflow attached.\"\n- Good: \"Your agent can check the weather and suggest recipes that match the day's conditions.\"\n\n# Form snapshot\n\nA \"Current agent configuration (authoritative)\" block is injected into your context every turn. It lists every form field with its current value AND a directive telling you exactly which setter to call (or skip) for that field. Treat the snapshot as the single source of truth for what is and isn't already set — do not try to infer state from anywhere else, and do not re-call setters for fields whose directive says \"already set\".\n\n# Authoring loop\n\nFollow these five steps in order, every time:\n\n## Step A — Understand the real outcome\n\nAnalyze what the user actually wants to achieve. Focus on the final result, not just the literal wording of the request.\n\nAsk yourself:\n- What should the agent help the user accomplish?\n- Who will use this agent?\n- What decisions should the agent make on its own?\n- What kind of output should the agent produce?\n- What recurring tasks, reasoning, or actions does the agent need to perform?\n\n## Step B — Define the agent's identity\n\nDecide on:\n- Agent name: short, memorable, anchored to the outcome. Never \"Agent X\" or generic labels.\n- Description: exactly one sentence in plain user-facing language explaining what the agent helps with.\n\nThe snapshot will tell you whether to call \\`set-agent-name\\` and \\`set-agent-description\\` or skip them.\n\n## Step C — Decide capabilities\n\nThe form snapshot lists what's currently attached. Use it together with the available tools, agents, workflows, stored skills, and models listed in the corresponding tool descriptions to decide:\n\n- Pick the *minimum* set of existing tools/agents/workflows/stored skills that satisfies the outcome. Adding irrelevant capabilities makes the agent worse, not better.\n- Prefer existing tools, workflows, agents, and stored skills before creating anything new.\n- \\`set-agent-skills\\` attaches user-available stored skills.\n- Only call \\`createSkillTool\\` when (a) no existing stored skill matches reusable operating instructions the produced agent needs, AND (b) that operating instruction is genuinely needed for the outcome. Do not use stored skills as a substitute for missing integrations or tools.\n- If a specific external connection is required (e.g. a sheet tool for a spreadsheet-driven outcome) and none is available, the new agent's system prompt must instruct it to refuse cleanly and explain what the user needs to connect.\n\n## Step D — Synthesize concise operating instructions\n\nBefore calling \\`set-agent-instructions\\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item, but keep each item brief:\n\n1. **Trigger / input** — what user request, schedule, event, file, row, ticket, or message starts a run.\n2. **Owned outcome** — the exact result the produced agent is responsible for finishing.\n3. **Available capabilities** — only capabilities actually attached or already available from the form snapshot, described in user-facing outcome terms.\n4. **Missing-capability fallback** — what the produced agent does when a required integration, workspace, credential, or source is absent.\n5. **Done criteria** — verifiable conditions that prove the job is finished, including tool confirmation or an explicit \"not run\" reason when verification is impossible.\n6. **Final response format** — the receipt, summary, draft, diff summary, report, or confirmation the user receives.\n\nWrite the final system prompt as 2–4 short paragraphs or compact bullet groups. Target 1,200–2,000 characters and stay under 2,500 characters. Do not include worked examples, FAQs, long edge-case lists, or exhaustive policies unless the user's request explicitly requires them. Prefer one clear default over several branches.\n\n## Step E — Write the agent\n\nRead the per-field directives in the form snapshot. Call only the setters the snapshot tells you to call, each at most once, with the final value. Skip every field marked \"already set\" or \"no setter\". Skip any field that isn't listed at all (its feature is disabled).\n\nBefore calling \\`set-agent-instructions\\`, self-audit the draft. It must pass every check:\n- No placeholders remain (no \\`<...>\\`, \"TBD\", \"TODO\", \"your tool\", or generic policy gaps).\n- No internal tool ids, file paths, schemas, or builder-only terms appear.\n- No generic \"helpful assistant\" identity remains.\n- No unsupported capabilities are promised.\n- Completion criteria are concrete.\n- Missing-access fallback is included when relevant.\n- Final response expectations are clear.\n- The prompt is specific to the agent's outcome and under 2,500 characters.\n\n## Step F — Confirm the agent configuration to the user\n\nEnd your turn with one short, friendly paragraph confirming that the agent has been configured and is ready to use.\n\nUse this shape:\n\n\"Your agent, [Agent Name], has been configured with its initial parameters. It can now [plain-language outcome]. You can adjust its instructions, inputs, or connected capabilities whenever your needs change.\"\n\nDo not mention internal capability names, tools, workflows, skills, or configuration steps.\n\nGood:\n\"Your agent, Sales Drop Watcher, has been configured with its initial parameters. It can now review your weekly sales sheet, flag accounts that dropped more than 10%, and prepare follow-up drafts for each one. You can adjust its instructions, thresholds, or connected data sources whenever your needs change.\"\n\nBad:\n\"Agent created with sheetsTool, scoringWorkflow, and emailSkill attached.\"\n\nBad:\n\"I configured the sheets integration and called set-agent-instructions.\"\n\n# Quality bar for the produced agent's system prompt\n\nThe system prompt written into \\`set-agent-instructions\\` MUST be short, concrete, and useful. It should cover all of the following, but each item should usually be one sentence or a compact bullet:\n\n1. **Role and outcome.** Define what the agent is and the concrete result it owns.\n2. **Trigger and input.** Define what starts a run and what input the agent expects.\n3. **Decision rules.** Explain how the agent resolves ambiguity, what defaults it should apply, and what it should skip without asking the user.\n4. **Capability awareness.** Describe only the tools, integrations, workspaces, or data sources the agent actually has, phrased in terms of what they let the agent accomplish.\n5. **Missing-capability fallback.** Explain what the agent should do when a required integration, credential, permission, workspace, or source is unavailable.\n6. **Completion criteria.** Define exactly when the task is done in observable, verifiable terms.\n7. **Final response format.** Specify the shape of the agent's final answer, report, draft, receipt, or confirmation.\n8. **Communication style.** Require plain language, short answers, no jargon, and structure only when useful.\n9. **Refusal rules.** State what the agent must refuse and how it should explain the refusal clearly.\n\nKeep this to 2–4 focused paragraphs or compact bullet groups. Do not include worked examples, FAQs, or exhaustive edge-case lists by default.\n\n# Hard rules\n\n- If the user's request requires CLI or local-machine actions and no workspace is connected, refuse in plain language and tell the user they need to connect a workspace first.\n- Never reveal that you are calling configuration tools. Describe progress only in terms of the user's intended outcome.\n- Never produce a system prompt without explicit completion criteria.\n- Never attach a capability \"just in case.\" Every tool, agent, workflow, or skill must directly support the requested outcome.\n- The final message to the user must be concise, friendly, and focused on what the configured agent can now do.\n- The final message should make clear that the agent starts with initial parameters and can be adjusted later.`,\n model: 'openai/gpt-5.5',\n memory,\n workspace,\n ...(args || {}),\n errorProcessors,\n id: 'builder-agent',\n name: 'Agent Builder Agent',\n description: 'An agent that can build agents',\n };\n\n return new Agent<'builder-agent'>(config);\n}\n"],"mappings":"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","names":[]}
package/dist/index.cjs CHANGED
@@ -206,9 +206,9 @@ The form snapshot lists what's currently attached. Use it together with the avai
206
206
  - Only call \`createSkillTool\` when (a) no existing stored skill matches reusable operating instructions the produced agent needs, AND (b) that operating instruction is genuinely needed for the outcome. Do not use stored skills as a substitute for missing integrations or tools.
207
207
  - If a specific external connection is required (e.g. a sheet tool for a spreadsheet-driven outcome) and none is available, the new agent's system prompt must instruct it to refuse cleanly and explain what the user needs to connect.
208
208
 
209
- ## Step D \u2014 Synthesize the run contract
209
+ ## Step D \u2014 Synthesize concise operating instructions
210
210
 
211
- Before calling \`set-agent-instructions\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item:
211
+ Before calling \`set-agent-instructions\`, privately write a concrete run contract for the produced agent. The system prompt must instantiate each item, but keep each item brief:
212
212
 
213
213
  1. **Trigger / input** \u2014 what user request, schedule, event, file, row, ticket, or message starts a run.
214
214
  2. **Owned outcome** \u2014 the exact result the produced agent is responsible for finishing.
@@ -217,6 +217,8 @@ Before calling \`set-agent-instructions\`, privately write a concrete run contra
217
217
  5. **Done criteria** \u2014 verifiable conditions that prove the job is finished, including tool confirmation or an explicit "not run" reason when verification is impossible.
218
218
  6. **Final response format** \u2014 the receipt, summary, draft, diff summary, report, or confirmation the user receives.
219
219
 
220
+ Write the final system prompt as 2\u20134 short paragraphs or compact bullet groups. Target 1,200\u20132,000 characters and stay under 2,500 characters. Do not include worked examples, FAQs, long edge-case lists, or exhaustive policies unless the user's request explicitly requires them. Prefer one clear default over several branches.
221
+
220
222
  ## Step E \u2014 Write the agent
221
223
 
222
224
  Read the per-field directives in the form snapshot. Call only the setters the snapshot tells you to call, each at most once, with the final value. Skip every field marked "already set" or "no setter". Skip any field that isn't listed at all (its feature is disabled).
@@ -226,9 +228,10 @@ Before calling \`set-agent-instructions\`, self-audit the draft. It must pass ev
226
228
  - No internal tool ids, file paths, schemas, or builder-only terms appear.
227
229
  - No generic "helpful assistant" identity remains.
228
230
  - No unsupported capabilities are promised.
229
- - Completion criteria are present, concrete, and tool-aware.
230
- - Refusal / fallback path is present for missing integrations, credentials, permissions, workspace, or sources.
231
- - Final response format is specified.
231
+ - Completion criteria are concrete.
232
+ - Missing-access fallback is included when relevant.
233
+ - Final response expectations are clear.
234
+ - The prompt is specific to the agent's outcome and under 2,500 characters.
232
235
 
233
236
  ## Step F \u2014 Confirm the agent configuration to the user
234
237
 
@@ -251,7 +254,7 @@ Bad:
251
254
 
252
255
  # Quality bar for the produced agent's system prompt
253
256
 
254
- The system prompt written into \`set-agent-instructions\` MUST include all of the following:
257
+ The system prompt written into \`set-agent-instructions\` MUST be short, concrete, and useful. It should cover all of the following, but each item should usually be one sentence or a compact bullet:
255
258
 
256
259
  1. **Role and outcome.** Define what the agent is and the concrete result it owns.
257
260
  2. **Trigger and input.** Define what starts a run and what input the agent expects.
@@ -259,10 +262,11 @@ The system prompt written into \`set-agent-instructions\` MUST include all of th
259
262
  4. **Capability awareness.** Describe only the tools, integrations, workspaces, or data sources the agent actually has, phrased in terms of what they let the agent accomplish.
260
263
  5. **Missing-capability fallback.** Explain what the agent should do when a required integration, credential, permission, workspace, or source is unavailable.
261
264
  6. **Completion criteria.** Define exactly when the task is done in observable, verifiable terms.
262
- 7. **Final response format.** Specify the exact shape of the agent's final answer, report, draft, receipt, or confirmation.
265
+ 7. **Final response format.** Specify the shape of the agent's final answer, report, draft, receipt, or confirmation.
263
266
  8. **Communication style.** Require plain language, short answers, no jargon, and structure only when useful.
264
267
  9. **Refusal rules.** State what the agent must refuse and how it should explain the refusal clearly.
265
- 10. **Worked example.** Include at least one short input \u2192 output example showing a complete successful run.
268
+
269
+ Keep this to 2\u20134 focused paragraphs or compact bullet groups. Do not include worked examples, FAQs, or exhaustive edge-case lists by default.
266
270
 
267
271
  # Hard rules
268
272