Repository: mastra-ai/mastra
Pull request #4227: Persist playground agent settings across refresh
Author: login: TheIsrael1
Created: 2025-05-13T13:17:59Z | Merged: 2025-05-15T10:22:15Z

- **Persist playground agent settings across refresh**
- **changeset**

## Description

<!-- Provide a brief description of the changes in this PR -->

## Related Issue(s)

<!-- Link to the issue(s) this PR addresses, using hashtag notation: #123 -->

## Type of Change

- [ ] Bug fix (non-breaking change that fixes an issue)
- [ ] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
- [ ] Documentation update
- [ ] Code refactoring
- [ ] Performance improvement
- [ ] Test update

## Checklist

- [ ] I have performed a self-review of my own code
- [ ] I have made corresponding changes to the documentation (if applicable)
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] I have generated a changeset for this PR



Diff:
diff --git a/.changeset/fluffy-stars-marry.md b/.changeset/fluffy-stars-marry.md
new file mode 100644
index 00000000000..d43b39891fd
--- /dev/null
+++ b/.changeset/fluffy-stars-marry.md
@@ -0,0 +1,7 @@
+---
+'@mastra/playground-ui': patch
+'mastra': patch
+'create-mastra': patch
+---
+
+Persist playground agent settings across refresh
diff --git a/client-sdks/client-js/src/example.ts b/client-sdks/client-js/src/example.ts
index bd936220c63..6d693a95ec1 100644
--- a/client-sdks/client-js/src/example.ts
+++ b/client-sdks/client-js/src/example.ts
@@ -1,40 +1,39 @@
-// import { MastraClient } from './client';
+import { MastraClient } from './client';
 // import type { WorkflowRunResult } from './types';
 
 // Agent
 
-// (async () => {
-//   const client = new MastraClient({
-//     baseUrl: 'http://localhost:4111',
-//   });
+(async () => {
+  const client = new MastraClient({
+    baseUrl: 'http://localhost:4111',
+  });
 
-//   console.log('Starting agent...');
+  console.log('Starting agent...');
 
-//   try {
-//     const agent = client.getAgent('weatherAgent');
-//     const response = await agent.stream({
-//       messages: 'what is the weather in new york?',
-//     })
+  try {
+    const agent = client.getAgent('weatherAgent');
+    const response = await agent.stream({
+      messages: 'what is the weather in new york?',
+    });
 
-//     response.processDataStream({
-//       onTextPart: (text) => {
-//         process.stdout.write(text);
-//       },
-//       onFilePart: (file) => {
-//         console.log(file);
-//       },
-//       onDataPart: (data) => {
-//         console.log(data);
-//       },
-//       onErrorPart: (error) => {
-//         console.error(error);
-//       },
-//     });
-
-//   } catch (error) {
-//     console.error(error);
-//   }
-// })();
+    response.processDataStream({
+      onTextPart: text => {
+        process.stdout.write(text);
+      },
+      onFilePart: file => {
+        console.log(file);
+      },
+      onDataPart: data => {
+        console.log(data);
+      },
+      onErrorPart: error => {
+        console.error(error);
+      },
+    });
+  } catch (error) {
+    console.error(error);
+  }
+})();
 
 // Workflow
 // (async () => {
diff --git a/packages/cli/src/playground/src/pages/agents/agent/index.tsx b/packages/cli/src/playground/src/pages/agents/agent/index.tsx
index bfd36344715..d6a8aca9280 100644
--- a/packages/cli/src/playground/src/pages/agents/agent/index.tsx
+++ b/packages/cli/src/playground/src/pages/agents/agent/index.tsx
@@ -41,7 +41,7 @@ function Agent() {
   }
 
   return (
-    <AgentProvider>
+    <AgentProvider agentId={agentId!}>
       <section className={cn('relative h-[calc(100%-40px)] divide-x flex w-full')}>
         {sidebar && memory?.result ? (
           <div className="h-full w-[300px] overflow-y-auto">
diff --git a/packages/playground-ui/src/domains/agents/agent/context/agent-context.tsx b/packages/playground-ui/src/domains/agents/agent/context/agent-context.tsx
index 7a0800231f1..5425d50af8c 100644
--- a/packages/playground-ui/src/domains/agents/agent/context/agent-context.tsx
+++ b/packages/playground-ui/src/domains/agents/agent/context/agent-context.tsx
@@ -1,12 +1,13 @@
-import { createContext, useState, ReactNode } from 'react';
+import { createContext, useState, ReactNode, useEffect } from 'react';
 import { ModelSettings } from '../../../../types';
+import { useAgentStore } from '@/store/agent-store';
 
 type AgentContextType = {
   modelSettings: ModelSettings;
   chatWithGenerate: boolean;
-  setModelSettings: React.Dispatch<React.SetStateAction<ModelSettings>>;
+  setModelSettings: (modelSettings: ModelSettings) => void;
   resetModelSettings: () => void;
-  setChatWithGenerate: React.Dispatch<React.SetStateAction<boolean>>;
+  setChatWithGenerate: (chatWithGenerate: boolean) => void;
 };
 
 const defaultModelSettings: ModelSettings = {
@@ -18,13 +19,29 @@ const defaultModelSettings: ModelSettings = {
 
 export const AgentContext = createContext<AgentContextType>({} as AgentContextType);
 
-export function AgentProvider({ children }: { children: ReactNode }) {
-  const [modelSettings, setModelSettings] = useState<ModelSettings>(defaultModelSettings);
-  const [chatWithGenerate, setChatWithGenerate] = useState<boolean>(false);
+export function AgentProvider({ agentId, children }: { agentId: string; children: ReactNode }) {
+  const {
+    modelSettings: modelSettingsStore,
+    setModelSettings: setModelSettingsStore,
+    chatWithGenerate: chatWithGenerateStore,
+    setChatWithGenerate: setChatWithGenerateStore,
+  } = useAgentStore();
+
+  const modelSettings = modelSettingsStore[agentId] || defaultModelSettings;
+
+  const setModelSettings = (modelSettings: ModelSettings) => {
+    setModelSettingsStore({ [agentId]: modelSettings });
+  };
+
   const resetModelSettings = () => {
     setModelSettings(defaultModelSettings);
   };
 
+  const chatWithGenerate = chatWithGenerateStore[agentId] || false;
+  const setChatWithGenerate = (chatWithGenerate: boolean) => {
+    setChatWithGenerateStore({ [agentId]: chatWithGenerate });
+  };
+
   return (
     <AgentContext.Provider
       value={{
diff --git a/packages/playground-ui/src/store/agent-store.ts b/packages/playground-ui/src/store/agent-store.ts
new file mode 100644
index 00000000000..89048d8c2d3
--- /dev/null
+++ b/packages/playground-ui/src/store/agent-store.ts
@@ -0,0 +1,26 @@
+import { create } from 'zustand';
+import { persist } from 'zustand/middleware';
+import { ModelSettings } from '../types';
+
+interface AgentStore {
+  modelSettings: Record<string, ModelSettings>;
+  setModelSettings: (modelSettings: Record<string, ModelSettings>) => void;
+  chatWithGenerate: Record<string, boolean>;
+  setChatWithGenerate: (chatWithGenerate: Record<string, boolean>) => void;
+}
+
+export const useAgentStore = create<AgentStore>()(
+  persist(
+    set => ({
+      modelSettings: {},
+      setModelSettings: modelSettings =>
+        set(state => ({ modelSettings: { ...state.modelSettings, ...modelSettings } })),
+      chatWithGenerate: {},
+      setChatWithGenerate: chatWithGenerate =>
+        set(state => ({ chatWithGenerate: { ...state.chatWithGenerate, ...chatWithGenerate } })),
+    }),
+    {
+      name: 'mastra-agent-store',
+    },
+  ),
+);


Reviews:
user: login: greptile-apps[bot]
body: 
## PR Summary

Implemented persistent storage of agent settings across page refreshes using Zustand, with per-agent configuration management in local storage.

- Added new `agent-store.ts` using Zustand's persist middleware to store agent-specific settings
- Modified `AgentContext` to require `agentId` prop and integrate with Zustand store instead of React state
- Updated `agent/index.tsx` to pass `agentId` to `AgentProvider` for agent-specific storage
- Structured store to use Record types for managing multiple agents' settings (`modelSettings` and `chatWithGenerate`)

<sub>3 file(s) reviewed, 2 comment(s)</sub>
<sub>[Edit PR Review Bot Settings](https://app.greptile.com/review/github) | [Greptile](https://greptile.com?utm_source=greptile_expert&utm_medium=github&utm_campaign=code_reviews&utm_content=mastra_4227)</sub>
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T13:18:45Z
user: login: wardpeet
body: some minor changes to setts
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T12:01:50Z
user: login: wardpeet
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T15:30:29Z

Review comments:
diff_hunk: @@ -18,13 +19,29 @@ const defaultModelSettings: ModelSettings = {
 
 export const AgentContext = createContext<AgentContextType>({} as AgentContextType);
 
-export function AgentProvider({ children }: { children: ReactNode }) {
-  const [modelSettings, setModelSettings] = useState<ModelSettings>(defaultModelSettings);
-  const [chatWithGenerate, setChatWithGenerate] = useState<boolean>(false);
+export function AgentProvider({ agentId, children }: { agentId: string; children: ReactNode }) {
+  const {
+    modelSettings: modelSettingsStore,
+    setModelSettings: setModelSettingsStore,
+    chatWithGenerate: chatWithGenerateStore,
+    setChatWithGenerate: setChatWithGenerateStore,
+  } = useAgentStore();
+
+  const modelSettings = modelSettingsStore[agentId] || defaultModelSettings;
+
+  const setModelSettings = (modelSettings: ModelSettings) => {
+    setModelSettingsStore({ [agentId]: modelSettings });
+  };
path: packages/playground-ui/src/domains/agents/agent/context/agent-context.tsx
user: login: greptile-apps[bot]
body: logic: This spreads a new object with just the current agentId, which will clear settings for other agents. Should merge with existing settings:

```suggestion
  const setModelSettings = (modelSettings: ModelSettings) => {
    setModelSettingsStore(prev => ({ ...prev, [agentId]: modelSettings }));
  };
```
created_at: 2025-05-13T13:18:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -18,13 +19,29 @@ const defaultModelSettings: ModelSettings = {
 
 export const AgentContext = createContext<AgentContextType>({} as AgentContextType);
 
-export function AgentProvider({ children }: { children: ReactNode }) {
-  const [modelSettings, setModelSettings] = useState<ModelSettings>(defaultModelSettings);
-  const [chatWithGenerate, setChatWithGenerate] = useState<boolean>(false);
+export function AgentProvider({ agentId, children }: { agentId: string; children: ReactNode }) {
+  const {
+    modelSettings: modelSettingsStore,
+    setModelSettings: setModelSettingsStore,
+    chatWithGenerate: chatWithGenerateStore,
+    setChatWithGenerate: setChatWithGenerateStore,
+  } = useAgentStore();
+
+  const modelSettings = modelSettingsStore[agentId] || defaultModelSettings;
+
+  const setModelSettings = (modelSettings: ModelSettings) => {
+    setModelSettingsStore({ [agentId]: modelSettings });
+  };
+
   const resetModelSettings = () => {
     setModelSettings(defaultModelSettings);
   };
 
+  const chatWithGenerate = chatWithGenerateStore[agentId] || false;
+  const setChatWithGenerate = (chatWithGenerate: boolean) => {
+    setChatWithGenerateStore({ [agentId]: chatWithGenerate });
+  };
path: packages/playground-ui/src/domains/agents/agent/context/agent-context.tsx
user: login: greptile-apps[bot]
body: logic: Same issue here - this will clear other agents' settings:

```suggestion
  const setChatWithGenerate = (chatWithGenerate: boolean) => {
    setChatWithGenerateStore(prev => ({ ...prev, [agentId]: chatWithGenerate }));
  };
```
created_at: 2025-05-13T13:18:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -18,13 +19,29 @@ const defaultModelSettings: ModelSettings = {
 
 export const AgentContext = createContext<AgentContextType>({} as AgentContextType);
 
-export function AgentProvider({ children }: { children: ReactNode }) {
-  const [modelSettings, setModelSettings] = useState<ModelSettings>(defaultModelSettings);
-  const [chatWithGenerate, setChatWithGenerate] = useState<boolean>(false);
+export function AgentProvider({ agentId, children }: { agentId: string; children: ReactNode }) {
+  const {
+    modelSettings: modelSettingsStore,
+    setModelSettings: setModelSettingsStore,
+    chatWithGenerate: chatWithGenerateStore,
+    setChatWithGenerate: setChatWithGenerateStore,
+  } = useAgentStore();
+
+  const modelSettings = modelSettingsStore[agentId] || defaultModelSettings;
+
+  const setModelSettings = (modelSettings: ModelSettings) => {
+    setModelSettingsStore({ ...modelSettingsStore, [agentId]: modelSettings });
+  };
path: packages/playground-ui/src/domains/agents/agent/context/agent-context.tsx
user: login: wardpeet
body: let's update the store to allow for partial state changes

```suggestion
  const setModelSettings = useCallback((modelSettings: ModelSettings) => {
    setModelSettingsStore({ [agentId]: modelSettings });
  }, [setModelSettingsStore]);
```
created_at: 2025-05-14T11:52:25Z
author_association: CONTRIBUTOR
diff_hunk: @@ -18,13 +19,29 @@ const defaultModelSettings: ModelSettings = {
 
 export const AgentContext = createContext<AgentContextType>({} as AgentContextType);
 
-export function AgentProvider({ children }: { children: ReactNode }) {
-  const [modelSettings, setModelSettings] = useState<ModelSettings>(defaultModelSettings);
-  const [chatWithGenerate, setChatWithGenerate] = useState<boolean>(false);
+export function AgentProvider({ agentId, children }: { agentId: string; children: ReactNode }) {
+  const {
+    modelSettings: modelSettingsStore,
+    setModelSettings: setModelSettingsStore,
+    chatWithGenerate: chatWithGenerateStore,
+    setChatWithGenerate: setChatWithGenerateStore,
+  } = useAgentStore();
+
+  const modelSettings = modelSettingsStore[agentId] || defaultModelSettings;
+
+  const setModelSettings = (modelSettings: ModelSettings) => {
+    setModelSettingsStore({ ...modelSettingsStore, [agentId]: modelSettings });
+  };
+
   const resetModelSettings = () => {
     setModelSettings(defaultModelSettings);
   };
 
+  const chatWithGenerate = chatWithGenerateStore[agentId] || false;
+  const setChatWithGenerate = (chatWithGenerate: boolean) => {
+    setChatWithGenerateStore({ ...chatWithGenerateStore, [agentId]: chatWithGenerate });
+  };
path: packages/playground-ui/src/domains/agents/agent/context/agent-context.tsx
user: login: wardpeet
body: ```suggestion
  const setChatWithGenerate = useCallback((chatWithGenerate: boolean) => {
    setChatWithGenerateStore({ [agentId]: chatWithGenerate });
  }, [setChatWithGenerateStore]);
```
created_at: 2025-05-14T11:53:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,24 @@
+import { create } from 'zustand';
+import { persist } from 'zustand/middleware';
+import { ModelSettings } from '../types';
+
+interface AgentStore {
+  modelSettings: Record<string, ModelSettings>;
+  setModelSettings: (modelSettings: Record<string, ModelSettings>) => void;
+  chatWithGenerate: Record<string, boolean>;
+  setChatWithGenerate: (chatWithGenerate: Record<string, boolean>) => void;
+}
+
+export const useAgentStore = create<AgentStore>()(
+  persist(
+    set => ({
+      modelSettings: {},
+      setModelSettings: modelSettings => set({ modelSettings }),
path: packages/playground-ui/src/store/agent-store.ts
user: login: wardpeet
body: ```suggestion
      setModelSettings: modelSettings => set(state => ({ modelSettings: { ...state.modelSetings, ...modelSettings })),
```
created_at: 2025-05-14T11:53:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,24 @@
+import { create } from 'zustand';
+import { persist } from 'zustand/middleware';
+import { ModelSettings } from '../types';
+
+interface AgentStore {
+  modelSettings: Record<string, ModelSettings>;
+  setModelSettings: (modelSettings: Record<string, ModelSettings>) => void;
+  chatWithGenerate: Record<string, boolean>;
+  setChatWithGenerate: (chatWithGenerate: Record<string, boolean>) => void;
+}
+
+export const useAgentStore = create<AgentStore>()(
+  persist(
+    set => ({
+      modelSettings: {},
+      setModelSettings: modelSettings => set({ modelSettings }),
+      chatWithGenerate: {},
+      setChatWithGenerate: chatWithGenerate => set({ chatWithGenerate }),
path: packages/playground-ui/src/store/agent-store.ts
user: login: wardpeet
body: ```suggestion
      setChatWithGenerate: chatWithGenerate => set(state => ({ chatWithGenerate: { ...state.chatWithGenerate, ...chatWithGenerate })),
```
created_at: 2025-05-14T11:55:56Z
author_association: CONTRIBUTOR

PR comments:
user: login: codesandbox[bot]
created_at: 2025-05-13T13:18:02Z
body: #### Review or Edit in CodeSandbox

Open the branch in <a href="https://codesandbox.io/p/github/mastra-ai/mastra/ehindero2016/mastra-3229-store-agent-options-used-in-playground-in-local-storage?mode=review&utm_source=gh_app">Web Editor</a> &bull; <a href="https://codesandbox.io/p/vscode?owner=mastra-ai&repo=mastra&branch=ehindero2016/mastra-3229-store-agent-options-used-in-playground-in-local-storage&utm_source=gh_app">VS Code</a> &bull; <a href="https://codesandbox.io/p/vscode?owner=mastra-ai&repo=mastra&branch=ehindero2016/mastra-3229-store-agent-options-used-in-playground-in-local-storage&insiders=true&utm_source=gh_app">Insiders</a><br>
Open <a href="https://codesandbox.io/p/devtool/preview/mastra-ai/mastra/ehindero2016/mastra-3229-store-agent-options-used-in-playground-in-local-storage?task=preview&port=51423&redirect=true&utm_source=gh_app">Preview</a>

<!-- open-in-codesandbox:complete -->

author_association: NONE
user: login: changeset-bot[bot]
created_at: 2025-05-13T13:18:03Z
body: ###  🦋  Changeset detected

Latest commit: 662501b472a4a2091e6dbf252f2238770a19b5d8

**The changes in this PR will be included in the next version bump.**

<details><summary>This PR includes changesets to release 3 packages</summary>

  | Name                  | Type  |
| --------------------- | ----- |
| @mastra/playground-ui | Patch |
| mastra                | Patch |
| create-mastra         | Patch |

</details>

Not sure what this means? [Click here  to learn what changesets are](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add another changeset to this PR](https://github.com/mastra-ai/mastra/new/ehindero2016/mastra-3229-store-agent-options-used-in-playground-in-local-storage?filename=.changeset/tender-eagles-scream.md&value=---%0A%22mastra%22%3A%20patch%0A%22%40mastra%2Fplayground-ui%22%3A%20patch%0A%22%40mastra%2Fclient-js%22%3A%20patch%0A%22%40mastra%2Fplayground%22%3A%20patch%0A---%0A%0APersist%20playground%20agent%20settings%20across%20refresh%0A)


author_association: NONE
user: login: vercel[bot]
created_at: 2025-05-13T13:18:05Z
body: [vc]: #dpeX9tkfasjZ7o/9LZClz2LXoi5MqDdTp90mVlSdWvo=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJhc3Npc3RhbnQtdWkiLCJyb290RGlyZWN0b3J5IjoiZXhhbXBsZXMvYXNzaXN0YW50LXVpIiwiaW5zcGVjdG9yVXJsIjoiaHR0cHM6Ly92ZXJjZWwuY29tL2tlcGxlci1hYjFiZjVhYi9hc3Npc3RhbnQtdWkvQUgxazZKUFZ0aXlVWjlHU0RjTWNUZDdYSEgxSCIsInByZXZpZXdVcmwiOiJhc3Npc3RhbnQtdWktZ2l0LWVoaW5kZXJvMjAxNi1tYXN0cmEtMzIyLTVmNWUyYi1rZXBsZXItYWIxYmY1YWIudmVyY2VsLmFwcCIsIm5leHRDb21taXRTdGF0dXMiOiJERVBMT1lFRCIsImxpdmVGZWVkYmFjayI6eyJyZXNvbHZlZCI6MCwidW5yZXNvbHZlZCI6MCwidG90YWwiOjAsImxpbmsiOiJhc3Npc3RhbnQtdWktZ2l0LWVoaW5kZXJvMjAxNi1tYXN0cmEtMzIyLTVmNWUyYi1rZXBsZXItYWIxYmY1YWIudmVyY2VsLmFwcCJ9fSx7Im5hbWUiOiJvcGVuYXBpLXNwZWMtd3JpdGVyIiwicm9vdERpcmVjdG9yeSI6ImV4YW1wbGVzL29wZW5hcGktc3BlYy13cml0ZXIiLCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20va2VwbGVyLWFiMWJmNWFiL29wZW5hcGktc3BlYy13cml0ZXIvQ3Z6ZERjNENXaGVnZG04d2dNdFNHbldVOWlUWSIsInByZXZpZXdVcmwiOiJvcGVuYXBpLXNwZWMtd3JpdGVyLWdpdC1laGluZGVybzIwMTYtbWFzLWZlZDI4OC1rZXBsZXItYWIxYmY1YWIudmVyY2VsLmFwcCIsIm5leHRDb21taXRTdGF0dXMiOiJERVBMT1lFRCIsImxpdmVGZWVkYmFjayI6eyJyZXNvbHZlZCI6MCwidW5yZXNvbHZlZCI6MCwidG90YWwiOjAsImxpbmsiOiJvcGVuYXBpLXNwZWMtd3JpdGVyLWdpdC1laGluZGVybzIwMTYtbWFzLWZlZDI4OC1rZXBsZXItYWIxYmY1YWIudmVyY2VsLmFwcCJ9fSx7Im5hbWUiOiJ0cmF2ZWwtYWkiLCJyb290RGlyZWN0b3J5IjoiZXhhbXBsZXMvdHJhdmVsLWFwcCIsImluc3BlY3RvclVybCI6Imh0dHBzOi8vdmVyY2VsLmNvbS9rZXBsZXItYWIxYmY1YWIvdHJhdmVsLWFpL3Z1bXBDVjFobVFTOVZKRUFIZnZkRUFCZVpEZWsiLCJwcmV2aWV3VXJsIjoiIiwibmV4dENvbW1pdFN0YXR1cyI6IkZBSUxFRCIsImxpdmVGZWVkYmFjayI6eyJyZXNvbHZlZCI6MCwidW5yZXNvbHZlZCI6MCwidG90YWwiOjAsImxpbmsiOiIifX0seyJuYW1lIjoibWFzdHJhLWRvY3MiLCJyb290RGlyZWN0b3J5IjoiZG9jcyIsImluc3BlY3RvclVybCI6Imh0dHBzOi8vdmVyY2VsLmNvbS9rZXBsZXItYWIxYmY1YWIvbWFzdHJhLWRvY3MvQlFHemlZYndRdGpZeWNIc2lpWGdteXVNSmNDWSIsInByZXZpZXdVcmwiOiJtYXN0cmEtZG9jcy1naXQtZWhpbmRlcm8yMDE2LW1hc3RyYS0zMjI5LWFmMTg4NS1rZXBsZXItYWIxYmY1YWIudmVyY2VsLmFwcCIsIm5leHRDb21taXRTdGF0dXMiOiJERVBMT1lFRCIsImxpdmVGZWVkYmFjayI6eyJyZXNvbHZlZCI6MCwidW5yZXNvbHZlZCI6MCwidG90YWwiOjAsImxpbmsiOiJtYXN0cmEtZG9jcy1naXQtZWhpbmRlcm8yMDE2LW1hc3RyYS0zMjI5LWFmMTg4NS1rZXBsZXItYWIxYmY1YWIudmVyY2VsLmFwcCJ9fV19
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **assistant-ui** | ✅ Ready ([Inspect](https://vercel.com/kepler-ab1bf5ab/assistant-ui/AH1k6JPVtiyUZ9GSDcMcTd7XHH1H)) | [Visit Preview](https://assistant-ui-git-ehindero2016-mastra-322-5f5e2b-kepler-ab1bf5ab.vercel.app) | 💬 [**Add feedback**](https://vercel.live/open-feedback/assistant-ui-git-ehindero2016-mastra-322-5f5e2b-kepler-ab1bf5ab.vercel.app?via=pr-comment-feedback-link) | May 14, 2025 5:39pm |
| **mastra-docs** | ✅ Ready ([Inspect](https://vercel.com/kepler-ab1bf5ab/mastra-docs/BQGziYbwQtjYycHsiiXgmyuMJcCY)) | [Visit Preview](https://mastra-docs-git-ehindero2016-mastra-3229-af1885-kepler-ab1bf5ab.vercel.app) | 💬 [**Add feedback**](https://vercel.live/open-feedback/mastra-docs-git-ehindero2016-mastra-3229-af1885-kepler-ab1bf5ab.vercel.app?via=pr-comment-feedback-link) | May 14, 2025 5:39pm |
| **openapi-spec-writer** | ✅ Ready ([Inspect](https://vercel.com/kepler-ab1bf5ab/openapi-spec-writer/CvzdDc4CWhegdm8wgMtSGnWU9iTY)) | [Visit Preview](https://openapi-spec-writer-git-ehindero2016-mas-fed288-kepler-ab1bf5ab.vercel.app) | 💬 [**Add feedback**](https://vercel.live/open-feedback/openapi-spec-writer-git-ehindero2016-mas-fed288-kepler-ab1bf5ab.vercel.app?via=pr-comment-feedback-link) | May 14, 2025 5:39pm |
| **travel-ai** | ❌ Failed ([Inspect](https://vercel.com/kepler-ab1bf5ab/travel-ai/vumpCV1hmQS9VJEAHfvdEABeZDek)) |  |  | May 14, 2025 5:39pm |





author_association: NONE