@mastra/playground-ui 5.1.21-alpha.0 → 5.1.21-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.
Files changed (44) hide show
  1. package/dist/index.cjs.js +379 -83
  2. package/dist/index.cjs.js.map +1 -1
  3. package/dist/index.es.js +378 -82
  4. package/dist/index.es.js.map +1 -1
  5. package/dist/src/components/ui/elements/buttons/button.d.ts +12 -0
  6. package/dist/src/components/ui/elements/buttons/button.stories.d.ts +13 -0
  7. package/dist/src/components/ui/elements/buttons/index.d.ts +1 -0
  8. package/dist/src/components/ui/elements/entry-list/entry-list-cell.d.ts +3 -0
  9. package/dist/src/components/ui/elements/entry-list/entry-list-item.d.ts +8 -0
  10. package/dist/src/components/ui/elements/entry-list/entry-list-page-header.d.ts +8 -0
  11. package/dist/src/components/ui/elements/entry-list/entry-list-toolbar.d.ts +6 -0
  12. package/dist/src/components/ui/elements/entry-list/entry-list.d.ts +15 -0
  13. package/dist/src/components/ui/elements/entry-list/index.d.ts +6 -0
  14. package/dist/src/components/ui/elements/entry-list/shared.d.ts +6 -0
  15. package/dist/src/components/ui/elements/form-fields/form-actions.d.ts +12 -0
  16. package/dist/src/components/ui/elements/form-fields/index.d.ts +7 -0
  17. package/dist/src/components/ui/elements/form-fields/input-field.d.ts +14 -0
  18. package/dist/src/components/ui/elements/form-fields/input-field.stories.d.ts +15 -0
  19. package/dist/src/components/ui/elements/form-fields/radio-group-field.d.ts +21 -0
  20. package/dist/src/components/ui/elements/form-fields/search-field.d.ts +2 -0
  21. package/dist/src/components/ui/elements/form-fields/select-field.d.ts +19 -0
  22. package/dist/src/components/ui/elements/form-fields/select-field.stories.d.ts +13 -0
  23. package/dist/src/components/ui/elements/form-fields/slider-field.d.ts +15 -0
  24. package/dist/src/components/ui/elements/form-fields/textarea-field.d.ts +11 -0
  25. package/dist/src/components/ui/elements/headers/entity-main-header.d.ts +11 -0
  26. package/dist/src/components/ui/elements/headers/index.d.ts +1 -0
  27. package/dist/src/components/ui/elements/index.d.ts +2 -0
  28. package/dist/src/components/ui/elements/key-value-list/index.d.ts +1 -0
  29. package/dist/src/components/ui/elements/key-value-list/key-value-list.d.ts +24 -0
  30. package/dist/src/components/ui/elements/key-value-list/key-value-list.stories.d.ts +12 -0
  31. package/dist/src/components/ui/elements/select/index.d.ts +1 -0
  32. package/dist/src/components/ui/elements/select/select.d.ts +10 -0
  33. package/dist/src/components/ui/elements/side-dialog/index.d.ts +5 -0
  34. package/dist/src/components/ui/elements/side-dialog/side-dialog-content.d.ts +21 -0
  35. package/dist/src/components/ui/elements/side-dialog/side-dialog-footer.d.ts +10 -0
  36. package/dist/src/components/ui/elements/side-dialog/side-dialog-header.d.ts +5 -0
  37. package/dist/src/components/ui/elements/side-dialog/side-dialog-top.d.ts +7 -0
  38. package/dist/src/components/ui/elements/side-dialog/side-dialog.d.ts +10 -0
  39. package/dist/src/components/ui/elements/tabs/index.d.ts +1 -0
  40. package/dist/src/components/ui/elements/tabs/tabs.d.ts +40 -0
  41. package/dist/src/domains/agents/components/agent-metadata/agent-metadata-model-switcher.d.ts +11 -0
  42. package/dist/src/domains/agents/components/agent-metadata/agent-metadata.d.ts +4 -1
  43. package/dist/src/domains/agents/components/agent-metadata/models.d.ts +5 -0
  44. package/package.json +12 -5
package/dist/index.cjs.js CHANGED
@@ -37,6 +37,8 @@ const prettierPluginBabel = require('prettier/plugins/babel');
37
37
  const prettierPluginEstree = require('prettier/plugins/estree');
38
38
  const colors = require('./colors-DLwJ7rFA.cjs');
39
39
  const reactTable = require('@tanstack/react-table');
40
+ const SelectPrimitive = require('@radix-ui/react-select');
41
+ const PopoverPrimitive = require('@radix-ui/react-popover');
40
42
  const AlertDialogPrimitive = require('@radix-ui/react-alert-dialog');
41
43
  const uiUtils = require('@ai-sdk/ui-utils');
42
44
  const Markdown = require('react-markdown');
@@ -54,8 +56,6 @@ const z = require('zod');
54
56
  const react$3 = require('@autoform/react');
55
57
  const CheckboxPrimitive = require('@radix-ui/react-checkbox');
56
58
  const reactDayPicker = require('react-day-picker');
57
- const PopoverPrimitive = require('@radix-ui/react-popover');
58
- const SelectPrimitive = require('@radix-ui/react-select');
59
59
  const zod = require('@autoform/zod');
60
60
  const reactCodeBlock = require('react-code-block');
61
61
  const reactQuery = require('@tanstack/react-query');
@@ -86,11 +86,11 @@ const SliderPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(SliderP
86
86
  const LabelPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(LabelPrimitive);
87
87
  const RadioGroupPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(RadioGroupPrimitive);
88
88
  const CollapsiblePrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(CollapsiblePrimitive);
89
+ const SelectPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(SelectPrimitive);
90
+ const PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(PopoverPrimitive);
89
91
  const AlertDialogPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(AlertDialogPrimitive);
90
92
  const ScrollAreaPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(ScrollAreaPrimitive);
91
93
  const CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(CheckboxPrimitive);
92
- const PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(PopoverPrimitive);
93
- const SelectPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(SelectPrimitive);
94
94
 
95
95
  const createMastraClient = (baseUrl, mastraClientHeaders = {}) => {
96
96
  return new clientJs.MastraClient({
@@ -7823,20 +7823,365 @@ const ScorerEntity = ({ scorer }) => {
7823
7823
  ] });
7824
7824
  };
7825
7825
 
7826
+ const openaiModels = [
7827
+ "o1",
7828
+ "o1-2024-12-17",
7829
+ "o3-mini",
7830
+ "o3-mini-2025-01-31",
7831
+ "o3",
7832
+ "o3-2025-04-16",
7833
+ "o4-mini",
7834
+ "o4-mini-2025-04-16",
7835
+ "codex-mini-latest",
7836
+ "computer-use-preview",
7837
+ "gpt-4.1",
7838
+ "gpt-4.1-2025-04-14",
7839
+ "gpt-4.1-mini",
7840
+ "gpt-4.1-mini-2025-04-14",
7841
+ "gpt-4.1-nano",
7842
+ "gpt-4.1-nano-2025-04-14",
7843
+ "gpt-4o",
7844
+ "gpt-4o-2024-05-13",
7845
+ "gpt-4o-2024-08-06",
7846
+ "gpt-4o-2024-11-20",
7847
+ "gpt-4o-audio-preview",
7848
+ "gpt-4o-audio-preview-2024-10-01",
7849
+ "gpt-4o-audio-preview-2024-12-17",
7850
+ "gpt-4o-search-preview",
7851
+ "gpt-4o-search-preview-2025-03-11",
7852
+ "gpt-4o-mini-search-preview",
7853
+ "gpt-4o-mini-search-preview-2025-03-11",
7854
+ "gpt-4o-mini",
7855
+ "gpt-4o-mini-2024-07-18",
7856
+ "gpt-4-turbo",
7857
+ "gpt-4-turbo-2024-04-09",
7858
+ "gpt-4-turbo-preview",
7859
+ "gpt-4-0125-preview",
7860
+ "gpt-4-1106-preview",
7861
+ "gpt-4",
7862
+ "gpt-4-0613",
7863
+ "gpt-4.5-preview",
7864
+ "gpt-4.5-preview-2025-02-27",
7865
+ "gpt-3.5-turbo-0125",
7866
+ "gpt-3.5-turbo",
7867
+ "gpt-3.5-turbo-1106",
7868
+ "chatgpt-4o-latest",
7869
+ "gpt-5",
7870
+ "gpt-5-2025-08-07",
7871
+ "gpt-5-mini",
7872
+ "gpt-5-mini-2025-08-07",
7873
+ "gpt-5-nano",
7874
+ "gpt-5-nano-2025-08-07",
7875
+ "gpt-5-chat-latest"
7876
+ ];
7877
+ const anthropicModels = [
7878
+ "claude-opus-4-20250514",
7879
+ "claude-sonnet-4-20250514",
7880
+ "claude-3-7-sonnet-20250219",
7881
+ "claude-3-5-sonnet-latest",
7882
+ "claude-3-5-sonnet-20241022",
7883
+ "claude-3-5-sonnet-20240620",
7884
+ "claude-3-5-haiku-latest",
7885
+ "claude-3-5-haiku-20241022",
7886
+ "claude-3-opus-latest",
7887
+ "claude-3-opus-20240229",
7888
+ "claude-3-sonnet-20240229",
7889
+ "claude-3-haiku-20240307"
7890
+ ];
7891
+ const googleModels = [
7892
+ "gemini-1.5-flash",
7893
+ "gemini-1.5-flash-latest",
7894
+ "gemini-1.5-flash-001",
7895
+ "gemini-1.5-flash-002",
7896
+ "gemini-1.5-flash-8b",
7897
+ "gemini-1.5-flash-8b-latest",
7898
+ "gemini-1.5-flash-8b-001",
7899
+ "gemini-1.5-pro",
7900
+ "gemini-1.5-pro-latest",
7901
+ "gemini-1.5-pro-001",
7902
+ "gemini-1.5-pro-002",
7903
+ "gemini-2.0-flash",
7904
+ "gemini-2.0-flash-001",
7905
+ "gemini-2.0-flash-live-001",
7906
+ "gemini-2.0-flash-lite",
7907
+ "gemini-2.0-pro-exp-02-05",
7908
+ "gemini-2.0-flash-thinking-exp-01-21",
7909
+ "gemini-2.0-flash-exp",
7910
+ "gemini-2.5-pro",
7911
+ "gemini-2.5-flash",
7912
+ "gemini-2.5-flash-lite",
7913
+ "gemini-2.5-pro-exp-03-25",
7914
+ "gemini-2.5-flash-preview-04-17",
7915
+ "gemini-exp-1206",
7916
+ "gemma-3-12b-it",
7917
+ "gemma-3-27b-it"
7918
+ ];
7919
+ const xAIModels = [
7920
+ "grok-4",
7921
+ "grok-4-0709",
7922
+ "grok-4-latest",
7923
+ "grok-3",
7924
+ "grok-3-latest",
7925
+ "grok-3-fast",
7926
+ "grok-3-fast-latest",
7927
+ "grok-3-mini",
7928
+ "grok-3-mini-latest",
7929
+ "grok-3-mini-fast",
7930
+ "grok-3-mini-fast-latest",
7931
+ "grok-2-vision-1212",
7932
+ "grok-2-vision",
7933
+ "grok-2-vision-latest",
7934
+ "grok-2-image-1212",
7935
+ "grok-2-image",
7936
+ "grok-2-image-latest",
7937
+ "grok-2-1212",
7938
+ "grok-2",
7939
+ "grok-2-latest",
7940
+ "grok-vision-beta",
7941
+ "grok-beta"
7942
+ ];
7943
+ const groqModels = [
7944
+ "gemma2-9b-it",
7945
+ "llama-3.1-8b-instant",
7946
+ "llama-3.3-70b-versatile",
7947
+ "meta-llama/llama-guard-4-12b",
7948
+ "openai/gpt-oss-120b",
7949
+ "openai/gpt-oss-20b",
7950
+ "deepseek-r1-distill-llama-70b",
7951
+ "meta-llama/llama-4-maverick-17b-128e-instruct",
7952
+ "meta-llama/llama-4-scout-17b-16e-instruct",
7953
+ "meta-llama/llama-prompt-guard-2-22m",
7954
+ "meta-llama/llama-prompt-guard-2-86m",
7955
+ "mistral-saba-24b",
7956
+ "moonshotai/kimi-k2-instruct",
7957
+ "qwen/qwen3-32b",
7958
+ "llama-guard-3-8b",
7959
+ "llama3-70b-8192",
7960
+ "llama3-8b-8192",
7961
+ "mixtral-8x7b-32768",
7962
+ "qwen-qwq-32b",
7963
+ "qwen-2.5-32b",
7964
+ "deepseek-r1-distill-qwen-32b"
7965
+ ];
7966
+
7967
+ const Select = SelectPrimitive__namespace.Root;
7968
+ const SelectValue = SelectPrimitive__namespace.Value;
7969
+ const SelectTrigger = React__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
7970
+ SelectPrimitive__namespace.Trigger,
7971
+ {
7972
+ ref,
7973
+ className: cn(
7974
+ "flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
7975
+ className
7976
+ ),
7977
+ ...props,
7978
+ children: [
7979
+ children,
7980
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Icon, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4 opacity-50" }) })
7981
+ ]
7982
+ }
7983
+ ));
7984
+ SelectTrigger.displayName = SelectPrimitive__namespace.Trigger.displayName;
7985
+ const SelectContent = React__namespace.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
7986
+ SelectPrimitive__namespace.Content,
7987
+ {
7988
+ ref,
7989
+ className: cn(
7990
+ "relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
7991
+ position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
7992
+ className
7993
+ ),
7994
+ position,
7995
+ ...props,
7996
+ children: /* @__PURE__ */ jsxRuntime.jsx(
7997
+ SelectPrimitive__namespace.Viewport,
7998
+ {
7999
+ className: cn(
8000
+ "p-1",
8001
+ position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"
8002
+ ),
8003
+ children
8004
+ }
8005
+ )
8006
+ }
8007
+ ) }));
8008
+ SelectContent.displayName = SelectPrimitive__namespace.Content.displayName;
8009
+ const SelectItem = React__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
8010
+ SelectPrimitive__namespace.Item,
8011
+ {
8012
+ ref,
8013
+ className: cn(
8014
+ "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-mastra-el-5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
8015
+ className
8016
+ ),
8017
+ ...props,
8018
+ children: [
8019
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute right-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemIndicator, { children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-4 w-4" }) }) }),
8020
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemText, { children })
8021
+ ]
8022
+ }
8023
+ ));
8024
+ SelectItem.displayName = SelectPrimitive__namespace.Item.displayName;
8025
+
8026
+ const Popover = PopoverPrimitive__namespace.Root;
8027
+ const PopoverTrigger = PopoverPrimitive__namespace.Trigger;
8028
+ const PopoverContent = React__namespace.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
8029
+ PopoverPrimitive__namespace.Content,
8030
+ {
8031
+ ref,
8032
+ align,
8033
+ sideOffset,
8034
+ className: cn(
8035
+ "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
8036
+ className
8037
+ ),
8038
+ ...props
8039
+ }
8040
+ ) }));
8041
+ PopoverContent.displayName = PopoverPrimitive__namespace.Content.displayName;
8042
+
8043
+ const Models = {
8044
+ openai: {
8045
+ models: openaiModels?.map((model) => ({ provider: "openai", model, icon: "openai.chat" })),
8046
+ icon: "openai.chat"
8047
+ },
8048
+ anthropic: {
8049
+ models: anthropicModels?.map((model) => ({ provider: "anthropic", model, icon: "anthropic.chat" })),
8050
+ icon: "anthropic.chat"
8051
+ },
8052
+ google: {
8053
+ models: googleModels?.map((model) => ({ provider: "google", model, icon: "GOOGLE" })),
8054
+ icon: "GOOGLE"
8055
+ },
8056
+ xAi: {
8057
+ models: xAIModels?.map((model) => ({ provider: "xai", model, icon: "X_GROK" })),
8058
+ icon: "X_GROK"
8059
+ },
8060
+ groq: {
8061
+ models: groqModels?.map((model) => ({ provider: "groq", model, icon: "GROQ" })),
8062
+ icon: "GROQ"
8063
+ }
8064
+ };
8065
+ const AgentMetadataModelSwitcher = ({
8066
+ defaultProvider,
8067
+ defaultModel,
8068
+ updateModel,
8069
+ closeEditor,
8070
+ modelProviders
8071
+ }) => {
8072
+ const [selectedModel, setSelectedModel] = React.useState(defaultModel);
8073
+ const [showSuggestions, setShowSuggestions] = React.useState(false);
8074
+ const [selectedProvider, setSelectedProvider] = React.useState(() => {
8075
+ if (defaultProvider) {
8076
+ const providerOnly = defaultProvider.split(".")[0];
8077
+ return providerOnly;
8078
+ }
8079
+ return "";
8080
+ });
8081
+ const [loading, setLoading] = React.useState(false);
8082
+ const modelsList = Object.entries(Models).filter(([provider]) => modelProviders.includes(provider));
8083
+ const allModels = modelsList.flatMap(([_, { models }]) => models);
8084
+ const providersList = modelsList.map(([provider, { icon }]) => ({ provider, icon }));
8085
+ const model = allModels.find((model2) => model2.model === selectedModel);
8086
+ const handleSave = async () => {
8087
+ setLoading(true);
8088
+ const providerToUse = model?.provider ?? selectedProvider;
8089
+ await updateModel({ provider: providerToUse, modelId: selectedModel });
8090
+ setLoading(false);
8091
+ closeEditor();
8092
+ };
8093
+ const filteredModels = allModels.filter((model2) => model2.model.includes(selectedModel));
8094
+ return /* @__PURE__ */ jsxRuntime.jsx(TooltipProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
8095
+ /* @__PURE__ */ jsxRuntime.jsxs(
8096
+ Select,
8097
+ {
8098
+ value: model?.provider ?? selectedProvider,
8099
+ onValueChange: setSelectedProvider,
8100
+ disabled: !!model?.provider,
8101
+ children: [
8102
+ /* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { className: "max-w-[150px]", children: /* @__PURE__ */ jsxRuntime.jsx(SelectValue, { placeholder: "Select provider" }) }),
8103
+ /* @__PURE__ */ jsxRuntime.jsx(SelectContent, { children: providersList.map((provider) => /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: provider.provider, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
8104
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { children: providerMapToIcon[provider.icon] }),
8105
+ provider.provider
8106
+ ] }) }, provider.provider)) })
8107
+ ]
8108
+ }
8109
+ ),
8110
+ /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open: showSuggestions, children: [
8111
+ /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
8112
+ Input,
8113
+ {
8114
+ id: "model-input",
8115
+ list: "model-suggestions",
8116
+ className: "flex-1",
8117
+ type: "text",
8118
+ value: selectedModel,
8119
+ onChange: (e) => {
8120
+ setSelectedModel(e.target.value);
8121
+ setShowSuggestions(true);
8122
+ },
8123
+ placeholder: "Enter model name or select from suggestions..."
8124
+ }
8125
+ ) }),
8126
+ filteredModels.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
8127
+ PopoverContent,
8128
+ {
8129
+ onOpenAutoFocus: (e) => e.preventDefault(),
8130
+ className: "flex flex-col gap-2 w-[var(--radix-popover-trigger-width)] max-h-[calc(var(--radix-popover-content-available-height)-50px)] overflow-y-auto",
8131
+ children: filteredModels.map((model2) => /* @__PURE__ */ jsxRuntime.jsxs(
8132
+ "div",
8133
+ {
8134
+ className: "flex items-center gap-2 cursor-pointer hover:bg-surface5 p-2",
8135
+ onClick: () => {
8136
+ setSelectedModel(model2.model);
8137
+ setShowSuggestions(false);
8138
+ },
8139
+ children: [
8140
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { children: providerMapToIcon[model2.icon] }),
8141
+ model2.model
8142
+ ]
8143
+ },
8144
+ model2.provider + model2.model
8145
+ ))
8146
+ }
8147
+ )
8148
+ ] }),
8149
+ /* @__PURE__ */ jsxRuntime.jsxs(Tooltip, { children: [
8150
+ /* @__PURE__ */ jsxRuntime.jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: handleSave, className: "text-icon3 hover:text-icon6", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { children: loading ? /* @__PURE__ */ jsxRuntime.jsx(Spinner, {}) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CircleCheck, {}) }) }) }),
8151
+ /* @__PURE__ */ jsxRuntime.jsx(TooltipContent, { children: loading ? "Saving..." : "Save new model" })
8152
+ ] })
8153
+ ] }) });
8154
+ };
8155
+
7826
8156
  const AgentMetadata = ({
7827
8157
  agent,
7828
8158
  promptSlot,
7829
8159
  hasMemoryEnabled,
7830
8160
  computeToolLink,
7831
- computeWorkflowLink
8161
+ computeWorkflowLink,
8162
+ updateModel,
8163
+ modelProviders
7832
8164
  }) => {
8165
+ const [isEditingModel, setIsEditingModel] = React.useState(false);
7833
8166
  const providerIcon = providerMapToIcon[agent.provider || "openai.chat"];
7834
8167
  const agentTools = agent.tools ?? {};
7835
8168
  const tools = Object.keys(agentTools).map((key) => agentTools[key]);
7836
8169
  const agentWorkflows = agent.workflows ?? {};
7837
8170
  const workflows = Object.keys(agentWorkflows).map((key) => agentWorkflows[key]);
7838
8171
  return /* @__PURE__ */ jsxRuntime.jsxs(AgentMetadataWrapper, { children: [
7839
- /* @__PURE__ */ jsxRuntime.jsx(AgentMetadataSection, { title: "Model", children: /* @__PURE__ */ jsxRuntime.jsx(Badge$1, { icon: providerIcon, className: "font-medium", children: agent.modelId || "N/A" }) }),
8172
+ /* @__PURE__ */ jsxRuntime.jsx(AgentMetadataSection, { title: "Model", children: isEditingModel ? /* @__PURE__ */ jsxRuntime.jsx(
8173
+ AgentMetadataModelSwitcher,
8174
+ {
8175
+ defaultProvider: agent.provider,
8176
+ defaultModel: agent.modelId,
8177
+ updateModel,
8178
+ closeEditor: () => setIsEditingModel(false),
8179
+ modelProviders
8180
+ }
8181
+ ) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
8182
+ /* @__PURE__ */ jsxRuntime.jsx(Badge$1, { icon: providerIcon, className: "font-medium", children: agent.modelId || "N/A" }),
8183
+ /* @__PURE__ */ jsxRuntime.jsx("button", { onClick: () => setIsEditingModel(true), className: "text-icon3 hover:text-icon6", children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.EditIcon, {}) }) })
8184
+ ] }) }),
7840
8185
  /* @__PURE__ */ jsxRuntime.jsx(
7841
8186
  AgentMetadataSection,
7842
8187
  {
@@ -11907,23 +12252,6 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }) {
11907
12252
  }
11908
12253
  Calendar.displayName = "Calendar";
11909
12254
 
11910
- const Popover = PopoverPrimitive__namespace.Root;
11911
- const PopoverTrigger = PopoverPrimitive__namespace.Trigger;
11912
- const PopoverContent = React__namespace.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
11913
- PopoverPrimitive__namespace.Content,
11914
- {
11915
- ref,
11916
- align,
11917
- sideOffset,
11918
- className: cn(
11919
- "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
11920
- className
11921
- ),
11922
- ...props
11923
- }
11924
- ) }));
11925
- PopoverContent.displayName = PopoverPrimitive__namespace.Content.displayName;
11926
-
11927
12255
  const DatePicker = ({
11928
12256
  value,
11929
12257
  setValue,
@@ -12109,65 +12437,6 @@ const DateField = ({ inputProps, field, error, id }) => {
12109
12437
  );
12110
12438
  };
12111
12439
 
12112
- const Select = SelectPrimitive__namespace.Root;
12113
- const SelectValue = SelectPrimitive__namespace.Value;
12114
- const SelectTrigger = React__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
12115
- SelectPrimitive__namespace.Trigger,
12116
- {
12117
- ref,
12118
- className: cn(
12119
- "flex h-9 w-full items-center justify-between rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
12120
- className
12121
- ),
12122
- ...props,
12123
- children: [
12124
- children,
12125
- /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Icon, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4 opacity-50" }) })
12126
- ]
12127
- }
12128
- ));
12129
- SelectTrigger.displayName = SelectPrimitive__namespace.Trigger.displayName;
12130
- const SelectContent = React__namespace.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
12131
- SelectPrimitive__namespace.Content,
12132
- {
12133
- ref,
12134
- className: cn(
12135
- "relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
12136
- position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
12137
- className
12138
- ),
12139
- position,
12140
- ...props,
12141
- children: /* @__PURE__ */ jsxRuntime.jsx(
12142
- SelectPrimitive__namespace.Viewport,
12143
- {
12144
- className: cn(
12145
- "p-1",
12146
- position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"
12147
- ),
12148
- children
12149
- }
12150
- )
12151
- }
12152
- ) }));
12153
- SelectContent.displayName = SelectPrimitive__namespace.Content.displayName;
12154
- const SelectItem = React__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
12155
- SelectPrimitive__namespace.Item,
12156
- {
12157
- ref,
12158
- className: cn(
12159
- "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-mastra-el-5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
12160
- className
12161
- ),
12162
- ...props,
12163
- children: [
12164
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute right-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemIndicator, { children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-4 w-4" }) }) }),
12165
- /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemText, { children })
12166
- ]
12167
- }
12168
- ));
12169
- SelectItem.displayName = SelectPrimitive__namespace.Item.displayName;
12170
-
12171
12440
  const SelectField = ({ field, inputProps, error, id, value }) => {
12172
12441
  const { key, ...props } = inputProps;
12173
12442
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -12385,11 +12654,38 @@ function inferFieldType(schema, fieldConfig) {
12385
12654
  return "string";
12386
12655
  }
12387
12656
 
12657
+ function extractNumberConstraints(schema) {
12658
+ const constraints = {};
12659
+ let baseSchema = getBaseSchema(schema);
12660
+ if (baseSchema._def && baseSchema._def.checks) {
12661
+ for (const check of baseSchema._def.checks) {
12662
+ if (check.kind === "min" && check.inclusive) {
12663
+ constraints.min = check.value;
12664
+ } else if (check.kind === "max" && check.inclusive) {
12665
+ constraints.max = check.value;
12666
+ } else if (check.kind === "multipleOf") {
12667
+ constraints.step = check.value;
12668
+ }
12669
+ }
12670
+ }
12671
+ return constraints;
12672
+ }
12388
12673
  function parseField(key, schema) {
12389
12674
  const baseSchema = getBaseSchema(schema);
12390
- const fieldConfig = zod.getFieldConfigInZodStack(schema);
12675
+ let fieldConfig = zod.getFieldConfigInZodStack(schema);
12391
12676
  const type = inferFieldType(baseSchema, fieldConfig);
12392
12677
  const defaultValue = zod.getDefaultValueInZodStack(schema);
12678
+ if (type === "number" && baseSchema instanceof z.z.ZodNumber) {
12679
+ const constraints = extractNumberConstraints(schema);
12680
+ if (Object.keys(constraints).length > 0) {
12681
+ if (!fieldConfig) {
12682
+ fieldConfig = {};
12683
+ }
12684
+ if (typeof fieldConfig === "object") {
12685
+ fieldConfig.inputProps = { ...fieldConfig?.inputProps, ...constraints };
12686
+ }
12687
+ }
12688
+ }
12393
12689
  const options = baseSchema._def?.values;
12394
12690
  let optionValues = [];
12395
12691
  if (options) {