@truefoundry/trueforge-ui 0.3.0-rc.1 → 0.3.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/README.md +7 -0
- package/dist/{AgentCodeSnippets-NZOFJE57.js → AgentCodeSnippets-637HQUXD.js} +7 -7
- package/dist/AgentMetricChart-4FYECRIN.js +15 -0
- package/dist/{AgentOverview-EEBHJC32.js → AgentOverview-3FJ5EE6N.js} +7 -7
- package/dist/{AgentSessionEventTimeline-26Z6IB3B.js → AgentSessionEventTimeline-VELWUYPR.js} +18 -9
- package/dist/AgentSessionEventTimeline-VELWUYPR.js.map +1 -0
- package/dist/{AgentSessionEventTimelineChart-CGCU7WBK.js → AgentSessionEventTimelineChart-CUKETHWM.js} +140 -53
- package/dist/AgentSessionEventTimelineChart-CUKETHWM.js.map +1 -0
- package/dist/{AgentSessions-3MPDZASK.js → AgentSessions-T7MOGOTZ.js} +8 -8
- package/dist/{ConnectorSettings-MXFRWWR6.js → ConnectorSettings-ESZ2RSRG.js} +18 -22
- package/dist/ConnectorSettings-ESZ2RSRG.js.map +1 -0
- package/dist/{DockLayout-LM4AFMFY.js → DockLayout-NLFNU6F2.js} +10 -10
- package/dist/{DrawerLayout-JR3O6RRB.js → DrawerLayout-PR3SMKA6.js} +12 -12
- package/dist/DrawerLayout-PR3SMKA6.js.map +1 -0
- package/dist/{ModelSettings-G7IFNC2Y.js → ModelSettings-LYW64IRR.js} +19 -25
- package/dist/ModelSettings-LYW64IRR.js.map +1 -0
- package/dist/OpenUiFenceBlock-JEPNPJ7U.js +9 -0
- package/dist/{SandboxSettings-NXAANMAX.js → SandboxSettings-DF64LHYI.js} +15 -19
- package/dist/SandboxSettings-DF64LHYI.js.map +1 -0
- package/dist/SchedulesPage-WQU4H25F.js +15 -0
- package/dist/{SettingsBuilder-L34IQ56S.js → SettingsBuilder-LSXK2VN4.js} +8 -8
- package/dist/{ShellRouteSync-CEBETGEJ.js → ShellRouteSync-B22IAV2W.js} +19 -9
- package/dist/ShellRouteSync-B22IAV2W.js.map +1 -0
- package/dist/{SidebarLayout-A2HJPPHS.js → SidebarLayout-XW6LXB7R.js} +17 -16
- package/dist/SidebarLayout-XW6LXB7R.js.map +1 -0
- package/dist/{SkillSettings-FGGMSUNO.js → SkillSettings-64VXUO6J.js} +13 -16
- package/dist/SkillSettings-64VXUO6J.js.map +1 -0
- package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js → TrueForgeUIWithRouter-3TSLV22Q.js} +9 -9
- package/dist/{WidgetLayout-6QM45OQQ.js → WidgetLayout-Q5P7PYSJ.js} +10 -10
- package/dist/{chunk-ZKNUMH2M.js → chunk-5I2COQNL.js} +2 -2
- package/dist/chunk-BWHOZFIV.js +587 -0
- package/dist/chunk-BWHOZFIV.js.map +1 -0
- package/dist/{chunk-U7KURWW3.js → chunk-FQK2XVVE.js} +66 -26
- package/dist/chunk-FQK2XVVE.js.map +1 -0
- package/dist/{chunk-M62XY4NC.js → chunk-G2TUAD65.js} +6 -6
- package/dist/{chunk-M62XY4NC.js.map → chunk-G2TUAD65.js.map} +1 -1
- package/dist/{chunk-6O6FWUDW.js → chunk-GXYAOAK5.js} +23 -42
- package/dist/chunk-GXYAOAK5.js.map +1 -0
- package/dist/{chunk-XAU7QFG3.js → chunk-H6WTY5PM.js} +60 -38
- package/dist/chunk-H6WTY5PM.js.map +1 -0
- package/dist/{chunk-FJW36PD7.js → chunk-I3AL54MA.js} +10 -10
- package/dist/{chunk-FJW36PD7.js.map → chunk-I3AL54MA.js.map} +1 -1
- package/dist/{chunk-CYHJDKFB.js → chunk-LGRHHFHN.js} +16 -11
- package/dist/{chunk-CYHJDKFB.js.map → chunk-LGRHHFHN.js.map} +1 -1
- package/dist/{chunk-2XPPBEYF.js → chunk-NHHSZB5N.js} +2 -2
- package/dist/{chunk-WVE3F724.js → chunk-SQGT43Z3.js} +3 -3
- package/dist/{chunk-MPNSO7E6.js → chunk-VJ7BZGAF.js} +2 -2
- package/dist/{chunk-DMMZSZTN.js → chunk-VUMGMGKZ.js} +13 -13
- package/dist/chunk-VUMGMGKZ.js.map +1 -0
- package/dist/{chunk-ZTMKFZQ3.js → chunk-YQO2NMJ3.js} +447 -320
- package/dist/chunk-YQO2NMJ3.js.map +1 -0
- package/dist/index.d.ts +27 -7
- package/dist/index.js +13 -11
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.js +2 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +3 -3
- package/dist/AgentMetricChart-JPU3MFQ2.js +0 -15
- package/dist/AgentSessionEventTimeline-26Z6IB3B.js.map +0 -1
- package/dist/AgentSessionEventTimelineChart-CGCU7WBK.js.map +0 -1
- package/dist/ConnectorSettings-MXFRWWR6.js.map +0 -1
- package/dist/DrawerLayout-JR3O6RRB.js.map +0 -1
- package/dist/ModelSettings-G7IFNC2Y.js.map +0 -1
- package/dist/OpenUiFenceBlock-2TV5TQ6P.js +0 -9
- package/dist/SandboxSettings-NXAANMAX.js.map +0 -1
- package/dist/SchedulesPage-KKLUDO6B.js +0 -15
- package/dist/ShellRouteSync-CEBETGEJ.js.map +0 -1
- package/dist/SidebarLayout-A2HJPPHS.js.map +0 -1
- package/dist/SkillSettings-FGGMSUNO.js.map +0 -1
- package/dist/chunk-6O6FWUDW.js.map +0 -1
- package/dist/chunk-7Z2C2K7F.js +0 -578
- package/dist/chunk-7Z2C2K7F.js.map +0 -1
- package/dist/chunk-DMMZSZTN.js.map +0 -1
- package/dist/chunk-U7KURWW3.js.map +0 -1
- package/dist/chunk-XAU7QFG3.js.map +0 -1
- package/dist/chunk-ZTMKFZQ3.js.map +0 -1
- /package/dist/{AgentCodeSnippets-NZOFJE57.js.map → AgentCodeSnippets-637HQUXD.js.map} +0 -0
- /package/dist/{AgentMetricChart-JPU3MFQ2.js.map → AgentMetricChart-4FYECRIN.js.map} +0 -0
- /package/dist/{AgentOverview-EEBHJC32.js.map → AgentOverview-3FJ5EE6N.js.map} +0 -0
- /package/dist/{AgentSessions-3MPDZASK.js.map → AgentSessions-T7MOGOTZ.js.map} +0 -0
- /package/dist/{DockLayout-LM4AFMFY.js.map → DockLayout-NLFNU6F2.js.map} +0 -0
- /package/dist/{OpenUiFenceBlock-2TV5TQ6P.js.map → OpenUiFenceBlock-JEPNPJ7U.js.map} +0 -0
- /package/dist/{SchedulesPage-KKLUDO6B.js.map → SchedulesPage-WQU4H25F.js.map} +0 -0
- /package/dist/{SettingsBuilder-L34IQ56S.js.map → SettingsBuilder-LSXK2VN4.js.map} +0 -0
- /package/dist/{TrueForgeUIWithRouter-MZVJWJMB.js.map → TrueForgeUIWithRouter-3TSLV22Q.js.map} +0 -0
- /package/dist/{WidgetLayout-6QM45OQQ.js.map → WidgetLayout-Q5P7PYSJ.js.map} +0 -0
- /package/dist/{chunk-ZKNUMH2M.js.map → chunk-5I2COQNL.js.map} +0 -0
- /package/dist/{chunk-2XPPBEYF.js.map → chunk-NHHSZB5N.js.map} +0 -0
- /package/dist/{chunk-WVE3F724.js.map → chunk-SQGT43Z3.js.map} +0 -0
- /package/dist/{chunk-MPNSO7E6.js.map → chunk-VJ7BZGAF.js.map} +0 -0
|
@@ -9,20 +9,20 @@ import {
|
|
|
9
9
|
SearchInput_default,
|
|
10
10
|
auiInputClass,
|
|
11
11
|
useToasterOptional
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-YQO2NMJ3.js";
|
|
13
|
+
import "./chunk-NHHSZB5N.js";
|
|
14
14
|
import {
|
|
15
15
|
Icon,
|
|
16
16
|
getErrorMessage
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-H6WTY5PM.js";
|
|
18
18
|
import {
|
|
19
19
|
useCatalogServer
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-FQK2XVVE.js";
|
|
21
21
|
import "./chunk-M6MHLVSO.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-VJ7BZGAF.js";
|
|
23
23
|
import {
|
|
24
24
|
cn
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-BWHOZFIV.js";
|
|
26
26
|
|
|
27
27
|
// src/containers/SettingsBuilder/ModelSettings.tsx
|
|
28
28
|
import { useCallback, useEffect as useEffect2, useMemo, useState as useState3 } from "react";
|
|
@@ -141,7 +141,7 @@ var ConfigureModelProviderForm = ({
|
|
|
141
141
|
] }),
|
|
142
142
|
/* @__PURE__ */ jsxs("div", { className: "mt-6 space-y-3", children: [
|
|
143
143
|
error ? /* @__PURE__ */ jsx("p", { className: "text-failure-bg text-sm", children: error }) : null,
|
|
144
|
-
/* @__PURE__ */ jsx(Button, { type: "submit", size: "
|
|
144
|
+
/* @__PURE__ */ jsx(Button.Primary, { type: "submit", size: "large", disabled: !isValid || busy, className: "w-full shrink-0", children: submitLabel })
|
|
145
145
|
] })
|
|
146
146
|
] }) });
|
|
147
147
|
};
|
|
@@ -593,10 +593,9 @@ var CustomModelProviderForm = ({
|
|
|
593
593
|
);
|
|
594
594
|
}) }),
|
|
595
595
|
/* @__PURE__ */ jsxs2(
|
|
596
|
-
Button,
|
|
596
|
+
Button.Secondary,
|
|
597
597
|
{
|
|
598
|
-
|
|
599
|
-
size: "sm",
|
|
598
|
+
size: "small",
|
|
600
599
|
type: "button",
|
|
601
600
|
className: "mt-4 w-fit",
|
|
602
601
|
onClick: () => setModels((current) => [...current, createEmptyModelRow()]),
|
|
@@ -610,7 +609,7 @@ var CustomModelProviderForm = ({
|
|
|
610
609
|
] }),
|
|
611
610
|
/* @__PURE__ */ jsxs2("div", { className: "shrink-0 space-y-3 border-t border-border px-5 py-4", children: [
|
|
612
611
|
error ? /* @__PURE__ */ jsx2("p", { className: "text-failure-bg text-sm", children: error }) : null,
|
|
613
|
-
/* @__PURE__ */ jsx2(Button, { type: "submit", size: "
|
|
612
|
+
/* @__PURE__ */ jsx2(Button.Primary, { type: "submit", size: "large", disabled: !visibleValid || busy, className: "w-full", children: isEditMode ? "Save changes" : "Add provider" })
|
|
614
613
|
] })
|
|
615
614
|
]
|
|
616
615
|
}
|
|
@@ -835,9 +834,8 @@ var ModelSettings = () => {
|
|
|
835
834
|
/* @__PURE__ */ jsxs3("div", { className: "flex gap-2", children: [
|
|
836
835
|
/* @__PURE__ */ jsx3("div", { className: "flex-1", children: /* @__PURE__ */ jsx3(SearchInput_default, { query, setQuery, placeholder: "Search providers and models" }) }),
|
|
837
836
|
/* @__PURE__ */ jsxs3(
|
|
838
|
-
Button,
|
|
837
|
+
Button.Secondary,
|
|
839
838
|
{
|
|
840
|
-
variant: "secondary",
|
|
841
839
|
type: "button",
|
|
842
840
|
onClick: () => {
|
|
843
841
|
setFormError(null);
|
|
@@ -886,10 +884,9 @@ var ModelSettings = () => {
|
|
|
886
884
|
"Connected"
|
|
887
885
|
] }),
|
|
888
886
|
/* @__PURE__ */ jsxs3(
|
|
889
|
-
Button,
|
|
887
|
+
Button.Secondary,
|
|
890
888
|
{
|
|
891
|
-
|
|
892
|
-
size: "sm",
|
|
889
|
+
size: "small",
|
|
893
890
|
className: "text-[0.8125rem]",
|
|
894
891
|
type: "button",
|
|
895
892
|
"aria-label": `Edit ${provider.name}`,
|
|
@@ -914,10 +911,9 @@ var ModelSettings = () => {
|
|
|
914
911
|
}
|
|
915
912
|
),
|
|
916
913
|
modelCatalog.deleteModelProvider ? /* @__PURE__ */ jsx3(
|
|
917
|
-
Button,
|
|
914
|
+
Button.Secondary,
|
|
918
915
|
{
|
|
919
|
-
|
|
920
|
-
size: "sm",
|
|
916
|
+
size: "small",
|
|
921
917
|
className: "transition-colors hover:bg-failure-bg/10 hover:text-failure-bg",
|
|
922
918
|
type: "button",
|
|
923
919
|
disabled: busy,
|
|
@@ -968,10 +964,9 @@ var ModelSettings = () => {
|
|
|
968
964
|
children: [
|
|
969
965
|
/* @__PURE__ */ jsx3("span", { className: "min-w-0 flex-1 truncate", children: model.name }),
|
|
970
966
|
/* @__PURE__ */ jsx3(
|
|
971
|
-
Button,
|
|
967
|
+
Button.Secondary,
|
|
972
968
|
{
|
|
973
|
-
|
|
974
|
-
size: "sm",
|
|
969
|
+
size: "small",
|
|
975
970
|
type: "button",
|
|
976
971
|
disabled: busy,
|
|
977
972
|
onClick: () => {
|
|
@@ -1016,9 +1011,8 @@ var ModelSettings = () => {
|
|
|
1016
1011
|
] })
|
|
1017
1012
|
] }),
|
|
1018
1013
|
/* @__PURE__ */ jsxs3(
|
|
1019
|
-
Button,
|
|
1014
|
+
Button.Secondary,
|
|
1020
1015
|
{
|
|
1021
|
-
variant: "secondary",
|
|
1022
1016
|
type: "button",
|
|
1023
1017
|
disabled: busy,
|
|
1024
1018
|
onClick: () => {
|
|
@@ -1083,4 +1077,4 @@ var ModelSettings_default = ModelSettings;
|
|
|
1083
1077
|
export {
|
|
1084
1078
|
ModelSettings_default as default
|
|
1085
1079
|
};
|
|
1086
|
-
//# sourceMappingURL=ModelSettings-
|
|
1080
|
+
//# sourceMappingURL=ModelSettings-LYW64IRR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/containers/SettingsBuilder/ModelSettings.tsx","../src/containers/SettingsBuilder/ConfigureModelProviderForm.tsx","../src/containers/SettingsBuilder/CustomModelProviderForm.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Button } from '@/atoms/primitives/Button.js';\nimport { CatalogLogo } from '@/atoms/primitives/CatalogLogo.js';\nimport SearchInput from '@/atoms/primitives/SearchInput.js';\nimport ConfigureModelProviderForm, {\n type ModelProviderKeyDraft,\n} from '@/containers/SettingsBuilder/ConfigureModelProviderForm.js';\nimport CustomModelProviderForm, {\n type CustomProviderDraft,\n} from '@/containers/SettingsBuilder/CustomModelProviderForm.js';\nimport { useToasterOptional } from '@/containers/ToasterContainer.js';\nimport { Icon } from '@/icons/Icon.js';\nimport { useCatalogServer } from '@/server/ServerContext.js';\nimport type { ModelEntry, ModelProviderBase, ModelProviderCatalogEntry } from '@/server/types.js';\nimport { getErrorMessage } from '@/utils/getErrorMessage.js';\n\nfunction catalogBaseUrl(provider: ModelProviderCatalogEntry): string {\n if ('baseUrl' in provider && typeof provider.baseUrl === 'string') {\n return provider.baseUrl;\n }\n return '';\n}\n\nconst ModelSettings = () => {\n const { modelCatalog } = useCatalogServer();\n const toaster = useToasterOptional();\n\n const [query, setQuery] = useState('');\n const [configured, setConfigured] = useState<ModelProviderBase[]>([]);\n const [catalog, setCatalog] = useState<ModelProviderCatalogEntry[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const [editingProviderId, setEditingProviderId] = useState<string | null>(null);\n const [editingCatalogType, setEditingCatalogType] = useState<string | null>(null);\n const [keyError, setKeyError] = useState<string | null>(null);\n const [customProviderOpen, setCustomProviderOpen] = useState(false);\n const [customProviderToEdit, setCustomProviderToEdit] = useState<ModelProviderBase | null>(null);\n\n const modelProviderIconMap = useMemo(() => {\n return (catalog ?? []).reduce(\n (acc, entry) => {\n acc[entry.name] = entry.logo ?? '';\n return acc;\n },\n {} as Record<string, string>,\n );\n }, [catalog]);\n\n const normalizedQuery = query.trim().toLowerCase();\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const [listed, available] = await Promise.all([\n modelCatalog.listModelProviders(),\n modelCatalog.getModelProviderCatalog(),\n ]);\n setConfigured(listed);\n setCatalog(available);\n } catch (err) {\n setError(getErrorMessage(err, 'Failed to load model providers'));\n } finally {\n setLoading(false);\n }\n }, [modelCatalog]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const configuredTypes = useMemo(() => new Set(configured.map(provider => provider.type)), [configured]);\n\n const matchingConfigured = useMemo(\n () =>\n configured.filter(\n provider =>\n provider.name?.toLowerCase().includes(normalizedQuery) ||\n provider.models.some(\n model =>\n model.name.toLowerCase().includes(normalizedQuery) || model.id.toLowerCase().includes(normalizedQuery),\n ),\n ),\n [configured, normalizedQuery],\n );\n\n const matchingAvailable = useMemo(\n () =>\n catalog.filter(\n provider =>\n provider.type !== 'custom' &&\n !configuredTypes.has(provider.type) &&\n (provider.name.toLowerCase().includes(normalizedQuery) ||\n provider.models.some(\n model =>\n model.name.toLowerCase().includes(normalizedQuery) || model.id.toLowerCase().includes(normalizedQuery),\n )),\n ),\n [catalog, configuredTypes, normalizedQuery],\n );\n\n const supportedReasoningEfforts = useMemo(() => {\n return catalog.find(provider => provider.type === 'custom')?.supportedReasoningEfforts;\n }, [catalog]);\n\n const catalogModelsByType = useMemo(() => {\n const map = new Map<string, ModelEntry[]>();\n for (const entry of catalog) {\n map.set(entry.type, entry.models);\n }\n return map;\n }, [catalog]);\n\n const closeKeyEditor = () => {\n setEditingProviderId(null);\n setEditingCatalogType(null);\n setKeyError(null);\n };\n\n const runMutation = async (fn: () => Promise<void>, onError?: (error: unknown) => void) => {\n setBusy(true);\n setError(null);\n try {\n await fn();\n await refresh();\n closeKeyEditor();\n } catch (err) {\n if (onError) {\n onError(err);\n } else if (toaster == null) {\n setError(getErrorMessage(err, 'Request failed'));\n } else {\n toaster.showError(err);\n }\n throw err;\n } finally {\n setBusy(false);\n }\n };\n\n // The key/endpoint modal owns the draft and awaits these handlers: on failure runMutation\n // re-throws so the modal stays open and shows `keyError`; on success it closes the editor.\n const handleCreateFromCatalog = async (entry: ModelProviderCatalogEntry, draft: ModelProviderKeyDraft) => {\n setKeyError(null);\n await runMutation(\n async () => {\n await modelCatalog.createModelProvider({\n type: entry.type,\n name: entry.name,\n ...(draft.baseUrl ? { baseUrl: draft.baseUrl } : {}),\n apiKey: draft.apiKey,\n models: entry.models,\n });\n },\n err => setKeyError(getErrorMessage(err, 'Request failed')),\n );\n };\n\n const handleReplaceKey = async (provider: ModelProviderBase, draft: ModelProviderKeyDraft) => {\n setKeyError(null);\n await runMutation(\n async () => {\n await modelCatalog.updateModelProvider({\n id: provider.id,\n type: provider.type,\n name: provider.name,\n ...(draft.baseUrl ? { baseUrl: draft.baseUrl } : {}),\n // Empty key means \"keep the existing one\" for hosts that support it.\n apiKey: draft.apiKey,\n models: provider.models,\n });\n },\n err => setKeyError(getErrorMessage(err, 'Request failed')),\n );\n toaster?.showSuccess({ title: `${provider.name} updated` });\n };\n\n const handleRemoveProvider = (provider: ModelProviderBase) => {\n if (!modelCatalog.deleteModelProvider) return;\n\n void runMutation(async () => {\n await modelCatalog.deleteModelProvider!({ id: provider.id });\n }).catch(() => {});\n };\n\n const handleUpdateModels = (provider: ModelProviderBase, models: ModelEntry[]) => {\n void runMutation(async () => {\n // apiKey required on update; empty means \"keep existing\" for hosts that support it.\n await modelCatalog.updateModelProvider({\n id: provider.id,\n type: provider.type,\n name: provider.name,\n ...(provider.baseUrl ? { baseUrl: provider.baseUrl } : {}),\n apiKey: '',\n models,\n });\n }).catch(() => {});\n };\n\n const handleAddCustomProvider = async (draft: CustomProviderDraft) => {\n setFormError(null);\n await runMutation(\n async () => {\n await modelCatalog.createModelProvider({\n type: 'custom',\n name: draft.name,\n baseUrl: draft.baseUrl,\n apiKey: draft.apiKey,\n models: draft.models,\n });\n },\n err => setFormError(getErrorMessage(err, 'Request failed')),\n );\n setTimeout(() => {\n toaster?.showSuccess({ title: `${draft.name} added` });\n }, 0);\n };\n\n const handleUpdateCustomProvider = async (draft: CustomProviderDraft) => {\n if (!customProviderToEdit) return;\n\n const provider = customProviderToEdit;\n setFormError(null);\n await runMutation(\n async () => {\n await modelCatalog.updateModelProvider({\n id: provider.id,\n type: provider.type,\n name: provider.name,\n baseUrl: draft.baseUrl,\n apiKey: draft.apiKey,\n models: draft.models,\n });\n },\n err => setFormError(getErrorMessage(err, 'Request failed')),\n );\n setTimeout(() => {\n toaster?.showSuccess({\n title: 'Model provider updated',\n description: `${provider.name} was updated successfully.`,\n });\n }, 0);\n };\n\n const customProviderInitialValues = customProviderToEdit\n ? {\n name: customProviderToEdit.name,\n baseUrl: customProviderToEdit.baseUrl ?? '',\n models: customProviderToEdit.models,\n }\n : undefined;\n\n // The key/endpoint editor is a single centered modal driven by which entry is being edited.\n const editingProvider =\n editingProviderId != null ? (configured.find(item => item.id === editingProviderId) ?? null) : null;\n const editingCatalogEntry =\n editingCatalogType != null ? (catalog.find(item => item.type === editingCatalogType) ?? null) : null;\n const keyModalOpen = editingProvider != null || editingCatalogEntry != null;\n\n return (\n <>\n <h3 className=\"text-xl font-semibold tracking-tight text-text-primary\">Models</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">Connect providers and choose which models are available.</p>\n\n {error ? (\n <p className=\"mt-3 rounded-md border border-failure-bg/30 bg-failure-bg/10 px-3 py-2 text-sm text-failure-bg\">\n {error}\n </p>\n ) : null}\n\n <div className=\"mt-4 flex-1 overflow-y-hidden\">\n <div className=\"flex h-full flex-col gap-3\">\n <div className=\"flex gap-2\">\n <div className=\"flex-1\">\n <SearchInput query={query} setQuery={setQuery} placeholder=\"Search providers and models\" />\n </div>\n <Button.Secondary\n type=\"button\"\n onClick={() => {\n setFormError(null);\n setCustomProviderToEdit(null);\n setCustomProviderOpen(true);\n }}\n >\n <Icon name=\"plus\" size=\"1rem\" className=\"mr-1\" />\n Add Custom Provider\n </Button.Secondary>\n </div>\n\n <div className=\"flex flex-1 flex-col gap-2 overflow-y-auto\">\n {loading ? <p className=\"py-8 text-center text-sm text-text-secondary\">Loading…</p> : null}\n\n {!loading && matchingConfigured.length > 0 ? (\n <section aria-labelledby=\"configured-providers-heading\">\n <div\n id=\"configured-providers-heading\"\n className=\"mb-2 text-[0.8125rem] font-semibold uppercase text-text-secondary\"\n >\n Configured\n </div>\n\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {matchingConfigured.map(provider => {\n const catalogModels = catalogModelsByType.get(provider.type) ?? [];\n const configuredIds = new Set(provider.models.map(model => model.id));\n const availableModels = catalogModels.filter(model => !configuredIds.has(model.id));\n const logoSrc = modelProviderIconMap[provider.name];\n\n return (\n <article key={provider.id} className=\"border-b border-border p-3 last:border-b-0\">\n <header className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <div\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n {logoSrc ? (\n <CatalogLogo src={logoSrc} alt={provider.name} className=\"size-4.5\" />\n ) : (\n <Icon name=\"cpu\" className=\"size-4.5\" />\n )}\n </div>\n <h5 className=\"truncate text-base font-medium text-text-primary\">{provider.name}</h5>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2.5 sm:justify-end\">\n <span className=\"flex items-center gap-1.5 rounded-full border border-border bg-secondary-bg/40 px-2 py-0.5 text-xs font-medium text-success-bg\">\n <span className=\"h-1.5 w-1.5 rounded-full bg-success-bg\"></span>\n Connected\n </span>\n <Button.Secondary\n size=\"small\"\n className=\"text-[0.8125rem]\"\n type=\"button\"\n aria-label={`Edit ${provider.name}`}\n title={`Edit ${provider.name}`}\n disabled={busy}\n onClick={() => {\n if (provider.type === 'custom') {\n closeKeyEditor();\n setFormError(null);\n setCustomProviderToEdit(provider);\n setCustomProviderOpen(true);\n } else {\n setKeyError(null);\n setEditingCatalogType(null);\n setEditingProviderId(provider.id);\n }\n }}\n >\n <Icon name=\"wrench\" className=\"size-3.5\" />\n Edit\n </Button.Secondary>\n {modelCatalog.deleteModelProvider ? (\n <Button.Secondary\n size=\"small\"\n className=\"transition-colors hover:bg-failure-bg/10 hover:text-failure-bg\"\n type=\"button\"\n disabled={busy}\n onClick={() => {\n handleRemoveProvider(provider);\n }}\n >\n Remove\n </Button.Secondary>\n ) : null}\n </div>\n </header>\n\n <div className=\"mt-3 overflow-hidden rounded-lg border border-border bg-secondary-bg/30\">\n {provider.models.map(model => (\n <div\n key={model.id}\n className=\"flex min-h-10 items-center gap-3 border-b border-border px-3 py-2 text-sm text-text-primary last:border-b-0\"\n >\n <span className=\"min-w-0 flex-1 truncate\">{model.name}</span>\n <button\n type=\"button\"\n aria-label={`Remove ${model.name}`}\n disabled={busy}\n className=\"inline-flex size-7 shrink-0 items-center justify-center rounded-md text-text-secondary hover:bg-ghost-button-hover hover:text-ghost-button-text focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-focus-ring disabled:opacity-50\"\n onClick={() => {\n handleUpdateModels(\n provider,\n provider.models.filter(item => item.id !== model.id),\n );\n }}\n >\n <Icon name=\"trash\" className=\"size-3.5\" />\n </button>\n </div>\n ))}\n\n {availableModels.length > 0 ? (\n <section>\n <div className=\"border-b border-border bg-secondary-bg/40 px-3 py-2 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n Available to add · {availableModels.length}\n </div>\n {availableModels.map(model => (\n <div\n key={model.id}\n className=\"flex min-h-12 items-center gap-3 border-b border-border px-3 py-2 text-sm text-text-primary last:border-b-0\"\n >\n <span className=\"min-w-0 flex-1 truncate\">{model.name}</span>\n <Button.Secondary\n size=\"small\"\n type=\"button\"\n disabled={busy}\n onClick={() => {\n handleUpdateModels(provider, [...provider.models, model]);\n }}\n >\n Add\n </Button.Secondary>\n </div>\n ))}\n </section>\n ) : null}\n </div>\n </article>\n );\n })}\n </div>\n </section>\n ) : null}\n\n {!loading && matchingAvailable.length > 0 ? (\n <section aria-labelledby=\"available-providers-heading\" className=\"mt-2\">\n <div\n id=\"available-providers-heading\"\n className=\"mb-2 text-[0.8125rem] font-semibold uppercase text-text-secondary\"\n >\n Available\n </div>\n\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {matchingAvailable.map(provider => {\n const logoSrc = modelProviderIconMap[provider.name];\n return (\n <article key={provider.type} className=\"border-b border-border p-3 last:border-b-0\">\n <header className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span\n className=\"flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n {logoSrc ? (\n <CatalogLogo src={logoSrc} alt={provider.name} className=\"size-4.5\" />\n ) : (\n <Icon name=\"cpu\" className=\"size-4.5\" />\n )}\n </span>\n <div className=\"min-w-0\">\n <h5 className=\"truncate text-base font-medium text-text-primary\">{provider.name}</h5>\n <p className=\"truncate text-sm text-text-secondary\">\n {provider.models.map(model => model.name).join(' · ')}\n </p>\n </div>\n </div>\n <Button.Secondary\n type=\"button\"\n disabled={busy}\n onClick={() => {\n setKeyError(null);\n setEditingProviderId(null);\n setEditingCatalogType(provider.type);\n }}\n >\n <Icon name=\"wrench\" className=\"size-4\" />\n Configure\n </Button.Secondary>\n </header>\n </article>\n );\n })}\n </div>\n </section>\n ) : null}\n\n {!loading && matchingConfigured.length === 0 && matchingAvailable.length === 0 ? (\n <div className=\"flex flex-1 items-center justify-center rounded-xl border border-dashed border-border p-8 text-center text-sm text-text-secondary\">\n {normalizedQuery ? `No providers match “${query.trim()}”.` : 'No model providers yet.'}\n </div>\n ) : null}\n </div>\n\n <ConfigureModelProviderForm\n open={keyModalOpen}\n onOpenChange={open => {\n if (!open) closeKeyEditor();\n }}\n onSave={draft => {\n if (editingProvider) return handleReplaceKey(editingProvider, draft);\n if (editingCatalogEntry) return handleCreateFromCatalog(editingCatalogEntry, draft);\n }}\n title={editingProvider ? 'Edit Provider Details' : 'Configure Provider Details'}\n initialBaseUrl={\n editingProvider\n ? (editingProvider.baseUrl ?? '')\n : editingCatalogEntry\n ? catalogBaseUrl(editingCatalogEntry)\n : ''\n }\n requireApiKey={editingProvider == null}\n submitLabel={editingProvider ? 'Save' : 'Create'}\n busy={busy}\n error={keyError}\n />\n\n <CustomModelProviderForm\n key={customProviderToEdit?.id ?? 'add-custom-provider'}\n open={customProviderOpen}\n onOpenChange={open => {\n setCustomProviderOpen(open);\n if (!open) {\n setFormError(null);\n setCustomProviderToEdit(null);\n }\n }}\n isEditMode={customProviderToEdit !== null}\n initialValues={customProviderInitialValues}\n onSubmit={customProviderToEdit ? handleUpdateCustomProvider : handleAddCustomProvider}\n reasoningEffortOptions={supportedReasoningEfforts}\n busy={busy}\n error={formError}\n />\n </div>\n </div>\n </>\n );\n};\n\nexport default ModelSettings;\n","'use client';\n\nimport { useEffect, useState, type FormEvent } from 'react';\n\nimport { cn } from '../../atoms/lib/cn.js';\nimport { auiInputClass } from '../../atoms/lib/inputClasses.js';\nimport { Accordion, AccordionDetails, AccordionSummary } from '../../atoms/primitives/Accordion.js';\nimport { Button } from '../../atoms/primitives/Button.js';\nimport { CenteredModal } from '../../atoms/primitives/CenteredModal.js';\nimport { Icon } from '../../icons/Icon.js';\n\nexport type ModelProviderKeyDraft = { apiKey: string; baseUrl: string };\n\ntype ConfigureModelProviderFormProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSave: (draft: ModelProviderKeyDraft) => void | Promise<void>;\n title: string;\n description?: string;\n /** Prefills the Base URL (endpoint). The API key is never autofilled. */\n initialBaseUrl?: string;\n baseUrlPlaceholder?: string;\n /** When false (editing), a blank API key keeps the existing one; a value replaces it. */\n requireApiKey?: boolean;\n submitLabel?: string;\n busy?: boolean;\n error?: string | null;\n};\n\nconst inputClassName = auiInputClass('h-11 shadow-sm');\n\nconst ConfigureModelProviderForm = ({\n open,\n onOpenChange,\n onSave,\n title,\n description,\n initialBaseUrl = '',\n baseUrlPlaceholder = 'https://api.openai.com/v1',\n requireApiKey = true,\n submitLabel = 'Save',\n busy = false,\n error,\n}: ConfigureModelProviderFormProps) => {\n const [apiKey, setApiKey] = useState('');\n const [baseUrl, setBaseUrl] = useState('');\n const [advancedOpen, setAdvancedOpen] = useState(false);\n\n const resetForm = () => {\n setApiKey('');\n setBaseUrl('');\n setAdvancedOpen(false);\n };\n\n // Prefill the endpoint when the modal opens; the API key is always blank (never echoed back).\n useEffect(() => {\n if (!open) return;\n setApiKey('');\n setBaseUrl(initialBaseUrl);\n setAdvancedOpen(false);\n }, [open, initialBaseUrl]);\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (!nextOpen) resetForm();\n onOpenChange(nextOpen);\n };\n\n const trimmedKey = apiKey.trim();\n const isValid = !requireApiKey || !!trimmedKey;\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (!isValid || busy) return;\n try {\n await onSave({ apiKey: trimmedKey, baseUrl: baseUrl.trim() });\n resetForm();\n onOpenChange(false);\n } catch {\n // Parent surfaces the error via the `error` prop; keep the modal open.\n }\n };\n\n return (\n <CenteredModal open={open} onOpenChange={handleOpenChange} title={title} description={description} contentSized>\n <form className=\"flex flex-col overflow-y-auto p-5 md:p-6\" onSubmit={handleSubmit}>\n <div className=\"space-y-4\">\n <div>\n <label htmlFor=\"model-provider-api-key\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n API key\n {!requireApiKey ? <span className=\"font-normal text-text-secondary\"> (optional)</span> : null}\n </label>\n <input\n id=\"model-provider-api-key\"\n type=\"password\"\n required={requireApiKey}\n value={apiKey}\n onChange={event => {\n setApiKey(event.target.value);\n }}\n placeholder={requireApiKey ? 'Enter API key' : 'Enter a new key'}\n autoFocus\n className={inputClassName}\n />\n {!requireApiKey ? (\n <p className=\"mt-1.5 text-xs text-text-secondary\">\n Leave blank to keep the current key; enter a new one to replace it.\n </p>\n ) : null}\n </div>\n\n <Accordion\n expanded={advancedOpen}\n onChange={(_event, next) => setAdvancedOpen(next)}\n className=\"rounded-md border border-border\"\n >\n <AccordionSummary className=\"px-3 py-2.5\">\n <span className=\"flex w-full items-center justify-between text-sm font-medium text-text-primary\">\n Advanced · custom endpoint\n <Icon\n name=\"chevron-down\"\n className={cn(\n 'size-4 shrink-0 text-text-secondary transition-transform duration-200',\n advancedOpen ? 'rotate-0' : '-rotate-90',\n )}\n />\n </span>\n </AccordionSummary>\n <AccordionDetails className=\"space-y-1.5 border-t border-border px-3 pb-3 pt-4\">\n <label htmlFor=\"model-provider-base-url\" className=\"block text-sm font-medium text-text-primary\">\n Base URL\n </label>\n <input\n id=\"model-provider-base-url\"\n type=\"url\"\n value={baseUrl}\n onChange={event => {\n setBaseUrl(event.target.value);\n }}\n placeholder={baseUrlPlaceholder}\n className={inputClassName}\n />\n <p className=\"text-xs text-text-secondary\">Leave blank unless you use a regional or proxy endpoint.</p>\n </AccordionDetails>\n </Accordion>\n </div>\n\n <div className=\"mt-6 space-y-3\">\n {error ? <p className=\"text-failure-bg text-sm\">{error}</p> : null}\n <Button.Primary type=\"submit\" size=\"large\" disabled={!isValid || busy} className=\"w-full shrink-0\">\n {submitLabel}\n </Button.Primary>\n </div>\n </form>\n </CenteredModal>\n );\n};\n\nexport default ConfigureModelProviderForm;\n","'use client';\n\nimport { useState, type ReactNode } from 'react';\n\nimport { cn } from '../../atoms/lib/cn.js';\nimport { Button } from '../../atoms/primitives/Button.js';\nimport { CenteredModal } from '../../atoms/primitives/CenteredModal.js';\nimport { Icon } from '../../icons/Icon.js';\n\nexport type CustomProviderDraft = {\n name: string;\n baseUrl: string;\n apiKey: string;\n models: Array<{\n id: string;\n name: string;\n properties?: {\n reasoningEfforts?: string[];\n contextLength?: number;\n maxOutputTokens?: number;\n };\n }>;\n};\n\nexport type CustomProviderInitialValues = Omit<CustomProviderDraft, 'apiKey'>;\n\ntype CustomModelProviderFormProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSubmit: (draft: CustomProviderDraft) => void | Promise<void>;\n isEditMode?: boolean;\n initialValues?: CustomProviderInitialValues;\n reasoningEffortOptions?: readonly string[];\n busy?: boolean;\n error?: string | null;\n};\n\ntype ModelRow = {\n name: string;\n advancedExpanded: boolean;\n reasoningEfforts?: string[];\n contextLength: string;\n maxOutputTokens: string;\n idTouched?: boolean;\n contextTouched?: boolean;\n maxTouched?: boolean;\n // Set once the user edits the model name by hand, so auto-derive from the id stops.\n nameDirty?: boolean;\n // `id` is the upstream model_id; kept last so object-shorthand stays readable.\n id: string;\n};\n\n// Shown only as greyed placeholders — never prefilled, since real limits vary per model\n// and a wrong-looking default reads as \"already correct\".\nconst PLACEHOLDER_CONTEXT_LENGTH = '128000';\nconst PLACEHOLDER_MAX_OUTPUT_TOKENS = '4096';\n\nconst createEmptyModelRow = (): ModelRow => ({\n id: '',\n name: '',\n // Expanded by default: Context length and Max output tokens are required, so they\n // shouldn't be hidden behind a collapsed section.\n advancedExpanded: true,\n contextLength: '',\n maxOutputTokens: '',\n});\n\nconst createModelRows = (initialValues?: CustomProviderInitialValues): ModelRow[] =>\n initialValues?.models.map(model => ({\n id: model.id,\n name: model.name,\n advancedExpanded: true,\n reasoningEfforts: model.properties?.reasoningEfforts,\n contextLength: model.properties?.contextLength?.toString() ?? '',\n maxOutputTokens: model.properties?.maxOutputTokens?.toString() ?? '',\n nameDirty: true,\n })) ?? [createEmptyModelRow()];\n\n// Flat, de-boxed input with enough contrast to read as editable: a slightly\n// deeper fill, a subtle hairline, and a clear focus ring.\nconst inputClassName =\n 'h-11 w-full rounded-md border border-border/70 bg-secondary-bg px-3 text-sm text-text-primary outline-none transition-colors placeholder:text-text-secondary/70 focus-visible:border-focus-ring focus-visible:ring-2 focus-visible:ring-focus-ring/50';\nconst inputErrorClassName = 'border-failure-bg focus-visible:border-failure-bg focus-visible:ring-failure-bg';\n\n/** Parse an optional positive integer; returns null when empty or invalid (so it's simply omitted). */\nfunction parsePositiveInt(raw: string): number | null {\n const trimmed = raw.trim();\n if (trimmed === '') return null;\n const n = Number(trimmed);\n return Number.isInteger(n) && n > 0 ? n : null;\n}\n\n/** Derive a NameSchema-valid slug from an upstream model id, e.g. \"llama3.1:70b\" -> \"llama-3-1-70b\". */\nfunction slugifyModelId(raw: string): string {\n return raw\n .replace(/([a-zA-Z])(\\d)/g, '$1-$2') // split letter→digit boundaries\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') // separators → single hyphen\n .replace(/^[^a-z]+/, '') // must start with a letter\n .slice(0, 64) // enforce max length first…\n .replace(/-+$/g, ''); // …then trim any separator truncation left at the end\n}\n\nconst RequiredMark = () => (\n <span className=\"ml-0.5 text-failure-bg\" aria-hidden>\n *\n </span>\n);\n\nconst FieldError = ({ children }: { children: ReactNode }) => (\n <p className=\"mt-1 text-xs text-failure-bg\">{children}</p>\n);\n\nconst FieldHelp = ({ children }: { children: ReactNode }) => (\n <p className=\"mt-1 text-xs text-text-secondary\">{children}</p>\n);\n\nconst CustomModelProviderForm = ({\n open,\n onOpenChange,\n onSubmit,\n reasoningEffortOptions,\n busy = false,\n error,\n isEditMode = false,\n initialValues,\n}: CustomModelProviderFormProps) => {\n const [name, setName] = useState(initialValues?.name ?? '');\n const [baseUrl, setBaseUrl] = useState(initialValues?.baseUrl ?? '');\n const [apiKey, setApiKey] = useState('');\n const [models, setModels] = useState<ModelRow[]>(() => createModelRows(initialValues));\n const [nameTouched, setNameTouched] = useState(false);\n const [baseUrlTouched, setBaseUrlTouched] = useState(false);\n\n const resetForm = () => {\n setName(initialValues?.name ?? '');\n setBaseUrl(initialValues?.baseUrl ?? '');\n setApiKey('');\n setModels(createModelRows(initialValues));\n setNameTouched(false);\n setBaseUrlTouched(false);\n };\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (!nextOpen) resetForm();\n onOpenChange(nextOpen);\n };\n\n const updateModel = (index: number, patch: Partial<ModelRow>) => {\n setModels(current => current.map((model, i) => (i === index ? { ...model, ...patch } : model)));\n };\n\n // On a submit attempt, reveal errors for every field that already exists. We flip\n // per-field `touched` flags rather than keeping a single global \"submitted\" flag, so\n // a model added *after* the attempt starts clean instead of showing errors for inputs\n // the user has never touched.\n const markAllTouched = () => {\n setNameTouched(true);\n setBaseUrlTouched(true);\n setModels(current =>\n current.map(model => ({\n ...model,\n idTouched: true,\n contextTouched: true,\n maxTouched: true,\n })),\n );\n };\n\n // ── Validation ── Client checks stay backend-agnostic: presence only. Name *format*\n // rules (slug pattern, length) belong to the server, which may differ per deployment;\n // violations surface via the `error` prop on submit rather than being second-guessed here.\n const trimmedName = name.trim();\n const nameError = trimmedName ? null : 'Name is required.';\n\n const trimmedBaseUrl = baseUrl.trim();\n let baseUrlError: string | null = null;\n if (!trimmedBaseUrl) {\n baseUrlError = 'Base URL is required.';\n } else {\n try {\n new URL(trimmedBaseUrl);\n } catch {\n baseUrlError = 'Enter a valid URL.';\n }\n }\n\n const modelIdError = (model: ModelRow): string | null => (model.id.trim() ? null : 'Model ID is required.');\n const modelNameError = (model: ModelRow): string | null => (model.name.trim() ? null : 'Model name is required.');\n\n // Both limits are required: the harness budgets a run as input + reserved output ≤ context window.\n const modelContextError = (model: ModelRow): string | null =>\n parsePositiveInt(model.contextLength) == null ? \"Set the model's context window.\" : null;\n const modelMaxOutputError = (model: ModelRow): string | null =>\n parsePositiveInt(model.maxOutputTokens) == null ? 'Set the max output tokens.' : null;\n\n // The Add-provider button gates on the always-visible fields. The collapsed per-model\n // limits are enforced on submit — auto-expanding and focusing the first offender.\n const visibleValid =\n !nameError && !baseUrlError && models.every(model => !modelIdError(model) && !modelNameError(model));\n\n const showNameError = nameTouched && nameError;\n const showBaseUrlError = baseUrlTouched && baseUrlError;\n\n const handleSubmit = async () => {\n markAllTouched();\n if (!visibleValid || busy) return;\n\n // A required per-model limit is missing: reveal it rather than silently blocking.\n // Expand that model's Advanced section, then scroll to and focus the first empty field.\n const incompleteIndex = models.findIndex(model => modelContextError(model) || modelMaxOutputError(model));\n if (incompleteIndex !== -1) {\n updateModel(incompleteIndex, { advancedExpanded: true });\n const target = models[incompleteIndex];\n const field = target && modelContextError(target) ? 'context-length' : 'max-output-tokens';\n setTimeout(() => {\n const el = document.getElementById(`custom-provider-model-${incompleteIndex}-${field}`);\n // scrollIntoView is unimplemented in jsdom; guard the method so tests don't throw.\n el?.scrollIntoView?.({ block: 'center', behavior: 'smooth' });\n (el as HTMLInputElement | null)?.focus();\n }, 0);\n return;\n }\n\n try {\n await onSubmit({\n name: trimmedName,\n baseUrl: trimmedBaseUrl,\n apiKey: apiKey.trim(),\n models: models.map(model => {\n const properties: NonNullable<CustomProviderDraft['models'][number]['properties']> = {};\n if (model.reasoningEfforts?.length) properties.reasoningEfforts = model.reasoningEfforts;\n const contextLength = parsePositiveInt(model.contextLength);\n if (contextLength != null) properties.contextLength = contextLength;\n const maxOutputTokens = parsePositiveInt(model.maxOutputTokens);\n if (maxOutputTokens != null) properties.maxOutputTokens = maxOutputTokens;\n return {\n id: model.id.trim(),\n name: model.name.trim(),\n ...(Object.keys(properties).length > 0 ? { properties } : {}),\n };\n }),\n });\n handleOpenChange(false);\n } catch {\n // Parent surfaces error; keep form open.\n }\n };\n\n return (\n <CenteredModal\n open={open}\n onOpenChange={handleOpenChange}\n title={isEditMode ? `Edit ${initialValues?.name ?? name}` : 'Add custom provider'}\n description={\n isEditMode\n ? 'Update the endpoint, credentials, and models for this provider.'\n : \"Connect any OpenAI-compatible endpoint, whether it's a local model, a proxy, or your own hosted service.\"\n }\n contentSized\n >\n <form\n className=\"flex min-h-0 flex-1 flex-col\"\n onSubmit={event => {\n event.preventDefault();\n void handleSubmit();\n }}\n >\n {/* Scrollable body — generous bottom padding keeps expanded Advanced clear of the pinned footer */}\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto px-5 pt-4 pb-8\">\n <div>\n <label htmlFor=\"custom-provider-name\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Name\n <RequiredMark />\n </label>\n <input\n id=\"custom-provider-name\"\n type=\"text\"\n value={name}\n onChange={event => setName(event.target.value)}\n onBlur={() => setNameTouched(true)}\n placeholder=\"local-llama\"\n autoFocus={!isEditMode}\n readOnly={isEditMode}\n aria-readonly={isEditMode}\n aria-invalid={showNameError ? true : undefined}\n className={cn(\n inputClassName,\n isEditMode && 'cursor-not-allowed bg-secondary-bg/60 text-text-secondary',\n showNameError && inputErrorClassName,\n )}\n />\n {isEditMode ? <FieldHelp>Provider names cannot be changed after creation.</FieldHelp> : null}\n {showNameError ? <FieldError>{nameError}</FieldError> : null}\n </div>\n\n <div>\n <label htmlFor=\"custom-provider-base-url\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Base URL\n <RequiredMark />\n </label>\n <input\n id=\"custom-provider-base-url\"\n type=\"text\"\n value={baseUrl}\n onChange={event => setBaseUrl(event.target.value)}\n onBlur={() => setBaseUrlTouched(true)}\n placeholder=\"http://localhost:11434/v1\"\n autoFocus={isEditMode}\n aria-invalid={showBaseUrlError ? true : undefined}\n className={cn(inputClassName, showBaseUrlError && inputErrorClassName)}\n />\n {showBaseUrlError ? (\n <FieldError>{baseUrlError}</FieldError>\n ) : !trimmedBaseUrl ? (\n <FieldHelp>OpenAI-compatible endpoint, usually ending in /v1.</FieldHelp>\n ) : null}\n </div>\n\n <div>\n <label htmlFor=\"custom-provider-api-key\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n API key\n <span className=\"font-normal text-text-secondary\"> (optional)</span>\n </label>\n <input\n id=\"custom-provider-api-key\"\n type=\"password\"\n value={apiKey}\n onChange={event => setApiKey(event.target.value)}\n placeholder=\"sk-…\"\n className={inputClassName}\n />\n <FieldHelp>\n {isEditMode\n ? 'Leave blank to keep the saved key, or enter a new key to replace it.'\n : 'Leave blank if your endpoint needs no key (e.g. a local model).'}\n </FieldHelp>\n </div>\n\n <fieldset className=\"m-0 min-w-0 border-0 p-0\">\n <legend className=\"float-left mb-2 w-full p-0 text-sm font-medium text-text-primary\">\n Models\n <RequiredMark />\n </legend>\n\n <div className=\"clear-both\">\n {models.map((model, index) => {\n const idError = modelIdError(model);\n const showIdError = model.idTouched && idError;\n const nameFieldError = modelNameError(model);\n // The Model name is auto-derived from the Model ID and is editable. Never flag an\n // auto-derived value: if the id yields no usable name, stay silent and let the user\n // type one. Only surface an error once they have hand-edited the name themselves.\n const showNameFieldError = !!nameFieldError && model.nameDirty;\n const contextError = modelContextError(model);\n const maxError = modelMaxOutputError(model);\n const showContextError = model.contextTouched && contextError;\n const showMaxError = model.maxTouched && maxError;\n return (\n <div\n key={index}\n className={cn('pb-6', index > 0 ? 'border-t border-border pt-6' : 'pt-1')}\n style={index > 0 ? { borderTopWidth: '0.5px' } : undefined}\n >\n <div className=\"grid grid-cols-[1fr_1fr_2rem] items-end gap-2\">\n <div className=\"min-w-0\">\n <label\n htmlFor={`custom-provider-model-${index}-id`}\n className=\"mb-1 block text-xs font-normal text-text-secondary\"\n >\n Model ID\n </label>\n <input\n id={`custom-provider-model-${index}-id`}\n type=\"text\"\n value={model.id}\n onChange={event => {\n const id = event.target.value;\n // Keep the model name in sync with the id until the user edits it by hand.\n updateModel(index, {\n id,\n ...(model.nameDirty ? {} : { name: slugifyModelId(id) }),\n });\n }}\n onBlur={() => updateModel(index, { idTouched: true })}\n placeholder=\"llama3.1:70b\"\n aria-invalid={showIdError ? true : undefined}\n className={cn(inputClassName, 'font-mono', showIdError && inputErrorClassName)}\n />\n </div>\n <div className=\"min-w-0\">\n <label\n htmlFor={`custom-provider-model-${index}-name`}\n className=\"mb-1 block text-xs font-normal text-text-secondary\"\n >\n Model name\n </label>\n <input\n id={`custom-provider-model-${index}-name`}\n type=\"text\"\n value={model.name}\n onChange={event => updateModel(index, { name: event.target.value, nameDirty: true })}\n placeholder=\"llama-3-1-70b\"\n aria-invalid={showNameFieldError ? true : undefined}\n className={cn(inputClassName, showNameFieldError && inputErrorClassName)}\n />\n </div>\n <button\n type=\"button\"\n aria-label={`Remove model ${index + 1}`}\n disabled={models.length === 1 || busy}\n className=\"mb-0.5 flex size-9 items-center justify-center rounded-md text-text-secondary transition-colors hover:text-text-primary disabled:opacity-40\"\n onClick={() => setModels(current => current.filter((_, i) => i !== index))}\n >\n <Icon name=\"trash\" className=\"size-4\" />\n </button>\n </div>\n {showIdError ? <FieldError>{idError}</FieldError> : null}\n {showNameFieldError ? <FieldError>{nameFieldError}</FieldError> : null}\n\n {/* Advanced (plain text toggle, no surrounding box) */}\n <div className=\"mt-2\">\n <button\n type=\"button\"\n aria-expanded={model.advancedExpanded}\n aria-controls={`custom-provider-model-${index}-advanced`}\n className=\"flex cursor-pointer items-center gap-1.5 text-sm font-medium text-text-primary\"\n onClick={() => updateModel(index, { advancedExpanded: !model.advancedExpanded })}\n >\n <Icon\n name=\"chevron-down\"\n className={cn(\n 'size-4 text-text-secondary transition-transform',\n model.advancedExpanded ? '' : '-rotate-90',\n )}\n />\n Advanced\n </button>\n\n {model.advancedExpanded ? (\n <div id={`custom-provider-model-${index}-advanced`} className=\"mt-3 space-y-4 pl-6\">\n <div>\n <label\n htmlFor={`custom-provider-model-${index}-context-length`}\n className=\"mb-1.5 block text-xs font-medium text-text-secondary\"\n >\n Context length\n <RequiredMark />\n </label>\n <input\n id={`custom-provider-model-${index}-context-length`}\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n value={model.contextLength}\n onChange={event => updateModel(index, { contextLength: event.target.value })}\n onBlur={() => updateModel(index, { contextTouched: true })}\n placeholder={PLACEHOLDER_CONTEXT_LENGTH}\n aria-invalid={showContextError ? true : undefined}\n className={cn(inputClassName, showContextError && inputErrorClassName)}\n />\n {showContextError ? (\n <FieldError>{contextError}</FieldError>\n ) : model.contextLength.trim() === '' ? (\n <FieldHelp>Model's total token window.</FieldHelp>\n ) : null}\n </div>\n\n <div>\n <label\n htmlFor={`custom-provider-model-${index}-max-output-tokens`}\n className=\"mb-1.5 block text-xs font-medium text-text-secondary\"\n >\n Max output tokens\n <RequiredMark />\n </label>\n <input\n id={`custom-provider-model-${index}-max-output-tokens`}\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n value={model.maxOutputTokens}\n onChange={event => updateModel(index, { maxOutputTokens: event.target.value })}\n onBlur={() => updateModel(index, { maxTouched: true })}\n placeholder={PLACEHOLDER_MAX_OUTPUT_TOKENS}\n aria-invalid={showMaxError ? true : undefined}\n className={cn(inputClassName, showMaxError && inputErrorClassName)}\n />\n {showMaxError ? (\n <FieldError>{maxError}</FieldError>\n ) : model.maxOutputTokens.trim() === '' ? (\n <FieldHelp>Longest reply the model allows — use its real limit.</FieldHelp>\n ) : null}\n </div>\n\n {reasoningEffortOptions && reasoningEffortOptions.length > 0 ? (\n <div>\n <label className=\"flex w-fit cursor-pointer items-center gap-2 select-none\">\n <input\n type=\"checkbox\"\n className=\"size-4 shrink-0 cursor-pointer accent-primary-button-bg disabled:cursor-not-allowed disabled:opacity-50\"\n checked={model.reasoningEfforts !== undefined}\n aria-label={`Enable reasoning effort for model ${index + 1}`}\n disabled={busy}\n onChange={event =>\n updateModel(index, {\n reasoningEfforts: event.target.checked ? [] : undefined,\n })\n }\n />\n <span className=\"text-text-secondary text-xs font-medium\">Reasoning effort</span>\n </label>\n {model.reasoningEfforts !== undefined ? (\n <div\n role=\"group\"\n aria-label={`Supported reasoning efforts for model ${index + 1}`}\n className=\"mt-2 flex flex-wrap gap-2\"\n >\n {reasoningEffortOptions.map(effort => {\n const selected = model.reasoningEfforts?.includes(effort) ?? false;\n return (\n <button\n key={effort}\n type=\"button\"\n aria-pressed={selected}\n disabled={busy}\n className={cn(\n 'rounded-full border px-3 py-1 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus-ring/40 disabled:opacity-50',\n selected\n ? 'border-primary-button-bg bg-primary-button-bg text-primary-button-text'\n : 'border-border text-text-secondary hover:bg-ghost-button-hover',\n )}\n onClick={() =>\n updateModel(index, {\n reasoningEfforts: selected\n ? model.reasoningEfforts?.filter(item => item !== effort)\n : [...(model.reasoningEfforts ?? []), effort],\n })\n }\n >\n {effort}\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n\n <Button.Secondary\n size=\"small\"\n type=\"button\"\n className=\"mt-4 w-fit\"\n onClick={() => setModels(current => [...current, createEmptyModelRow()])}\n >\n <Icon name=\"plus\" className=\"size-3.5\" />\n Add model\n </Button.Secondary>\n </fieldset>\n </div>\n\n {/* Sticky footer */}\n <div className=\"shrink-0 space-y-3 border-t border-border px-5 py-4\">\n {error ? <p className=\"text-failure-bg text-sm\">{error}</p> : null}\n <Button.Primary type=\"submit\" size=\"large\" disabled={!visibleValid || busy} className=\"w-full\">\n {isEditMode ? 'Save changes' : 'Add provider'}\n </Button.Primary>\n </div>\n </form>\n </CenteredModal>\n );\n};\n\nexport default CustomModelProviderForm;\n"],"mappings":"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","names":["useEffect","useState","useState","jsx","jsxs","inputClassName","useState","jsx","jsxs","useState","useEffect"]}
|
|
@@ -8,21 +8,21 @@ import {
|
|
|
8
8
|
Tooltip,
|
|
9
9
|
auiInputClass,
|
|
10
10
|
useToasterOptional
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-YQO2NMJ3.js";
|
|
12
|
+
import "./chunk-NHHSZB5N.js";
|
|
13
13
|
import {
|
|
14
14
|
Icon,
|
|
15
15
|
Spinner,
|
|
16
16
|
getErrorMessage
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-H6WTY5PM.js";
|
|
18
18
|
import {
|
|
19
19
|
useCatalogServer
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-FQK2XVVE.js";
|
|
21
21
|
import "./chunk-M6MHLVSO.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-VJ7BZGAF.js";
|
|
23
23
|
import {
|
|
24
24
|
cn
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-BWHOZFIV.js";
|
|
26
26
|
|
|
27
27
|
// src/containers/SettingsBuilder/SandboxSettings.tsx
|
|
28
28
|
import { useCallback, useEffect as useEffect2, useMemo, useState as useState2 } from "react";
|
|
@@ -247,7 +247,7 @@ var ConfigureSandboxForm = ({
|
|
|
247
247
|
] }),
|
|
248
248
|
/* @__PURE__ */ jsxs("div", { className: "mt-6 space-y-3", children: [
|
|
249
249
|
error ? /* @__PURE__ */ jsx("p", { className: "text-failure-bg text-sm", children: error }) : null,
|
|
250
|
-
/* @__PURE__ */ jsx(Button, { type: "submit", size: "
|
|
250
|
+
/* @__PURE__ */ jsx(Button.Primary, { type: "submit", size: "large", disabled: !isValid || busy, className: "w-full shrink-0", children: "Save" })
|
|
251
251
|
] })
|
|
252
252
|
] })
|
|
253
253
|
}
|
|
@@ -485,10 +485,9 @@ var SandboxSettings = () => {
|
|
|
485
485
|
}
|
|
486
486
|
) }) : null,
|
|
487
487
|
entry.snapshotSyncStatus.status === "failed" ? /* @__PURE__ */ jsx2(
|
|
488
|
-
Button,
|
|
488
|
+
Button.Ghost,
|
|
489
489
|
{
|
|
490
|
-
|
|
491
|
-
size: "sm",
|
|
490
|
+
size: "small",
|
|
492
491
|
type: "button",
|
|
493
492
|
disabled: busy,
|
|
494
493
|
onClick: () => {
|
|
@@ -498,10 +497,9 @@ var SandboxSettings = () => {
|
|
|
498
497
|
}
|
|
499
498
|
) : null,
|
|
500
499
|
/* @__PURE__ */ jsx2(
|
|
501
|
-
Button,
|
|
500
|
+
Button.Secondary,
|
|
502
501
|
{
|
|
503
|
-
|
|
504
|
-
size: "sm",
|
|
502
|
+
size: "small",
|
|
505
503
|
type: "button",
|
|
506
504
|
disabled: busy,
|
|
507
505
|
onClick: () => {
|
|
@@ -513,10 +511,9 @@ var SandboxSettings = () => {
|
|
|
513
511
|
}
|
|
514
512
|
),
|
|
515
513
|
sandboxCatalog.deleteSandboxProvider ? /* @__PURE__ */ jsx2(
|
|
516
|
-
Button,
|
|
514
|
+
Button.Ghost,
|
|
517
515
|
{
|
|
518
|
-
|
|
519
|
-
size: "sm",
|
|
516
|
+
size: "small",
|
|
520
517
|
className: "text-text-secondary",
|
|
521
518
|
type: "button",
|
|
522
519
|
disabled: busy,
|
|
@@ -555,9 +552,8 @@ var SandboxSettings = () => {
|
|
|
555
552
|
/* @__PURE__ */ jsx2("div", { className: "min-w-0", children: /* @__PURE__ */ jsx2("h5", { className: "truncate text-sm font-medium text-text-primary", children: entry.name }) })
|
|
556
553
|
] }),
|
|
557
554
|
/* @__PURE__ */ jsx2(
|
|
558
|
-
Button,
|
|
555
|
+
Button.Secondary,
|
|
559
556
|
{
|
|
560
|
-
variant: "secondary",
|
|
561
557
|
type: "button",
|
|
562
558
|
disabled: busy,
|
|
563
559
|
onClick: () => {
|
|
@@ -600,4 +596,4 @@ var SandboxSettings_default = SandboxSettings;
|
|
|
600
596
|
export {
|
|
601
597
|
SandboxSettings_default as default
|
|
602
598
|
};
|
|
603
|
-
//# sourceMappingURL=SandboxSettings-
|
|
599
|
+
//# sourceMappingURL=SandboxSettings-DF64LHYI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/containers/SettingsBuilder/SandboxSettings.tsx","../src/containers/SettingsBuilder/ConfigureSandboxForm.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Spinner } from '@/atoms/primitives/Spinner.js';\nimport { Button } from '../../atoms/primitives/Button.js';\nimport { Tooltip } from '../../atoms/primitives/Tooltip.js';\nimport { Icon } from '../../icons/Icon.js';\nimport { useCatalogServer } from '../../server/ServerContext.js';\nimport type {\n SandboxProviderBase,\n SandboxProviderCatalogEntry,\n SandboxProviderConfig,\n SandboxProviderListEntry,\n SandboxSnapshotSyncStatus,\n} from '../../server/types.js';\nimport { getErrorMessage } from '../../utils/getErrorMessage.js';\nimport { useToasterOptional } from '../ToasterContainer.js';\nimport ConfigureSandboxForm, { type SandboxConfigDraft } from './ConfigureSandboxForm.js';\n\nconst SNAPSHOT_STATUS_POLL_INTERVAL_MS = 10000;\n\nconst configFrom = ({\n execTimeoutMs,\n autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes,\n}: SandboxProviderConfig): SandboxProviderConfig => ({\n execTimeoutMs,\n autoStopIntervalInMinutes,\n autoArchiveIntervalInMinutes,\n autoDeleteIntervalInMinutes,\n});\n\nconst statusPresentation = (status: SandboxSnapshotSyncStatus['status']): { label: string; className: string } => {\n switch (status) {\n case 'pending':\n return {\n label: 'Syncing image...',\n className: 'text-warning-bg',\n };\n case 'ready':\n return {\n label: 'Connected',\n className: 'text-success-bg',\n };\n case 'failed':\n return {\n label: 'Sync failed',\n className: 'text-failure-bg',\n };\n default:\n return {\n label: status,\n className: 'text-text-secondary',\n };\n }\n};\n\nconst SandboxSettings = () => {\n const { sandboxCatalog } = useCatalogServer();\n const toaster = useToasterOptional();\n\n const [providers, setProviders] = useState<SandboxProviderListEntry[]>([]);\n const [catalog, setCatalog] = useState<SandboxProviderCatalogEntry[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n\n const [createEntry, setCreateEntry] = useState<SandboxProviderCatalogEntry | null>(null);\n const [updateProvider, setUpdateProvider] = useState<SandboxProviderBase | null>(null);\n\n const refresh = useCallback(\n async ({ quiet = false }: { quiet?: boolean } = {}) => {\n if (!sandboxCatalog) return;\n if (!quiet) setLoading(true);\n setError(null);\n try {\n const [listed, available] = await Promise.all([\n sandboxCatalog.listSandboxProviders(),\n sandboxCatalog.getSandboxProviderCatalog(),\n ]);\n setProviders(listed);\n setCatalog(available);\n } catch (err) {\n setError(getErrorMessage(err, 'Failed to load sandbox providers'));\n } finally {\n if (!quiet) setLoading(false);\n }\n },\n [sandboxCatalog],\n );\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const hasPendingProvider = providers.some(entry => entry.snapshotSyncStatus.status === 'pending');\n\n useEffect(() => {\n if (!sandboxCatalog || !hasPendingProvider) return;\n const activeSandboxCatalog = sandboxCatalog;\n\n let cancelled = false;\n let timeoutId: number | undefined;\n\n function schedulePoll() {\n timeoutId = window.setTimeout(() => {\n void poll();\n }, SNAPSHOT_STATUS_POLL_INTERVAL_MS);\n }\n\n async function poll() {\n try {\n const listed = await activeSandboxCatalog.listSandboxProviders();\n if (cancelled) return;\n setProviders(listed);\n setError(null);\n if (listed.some(entry => entry.snapshotSyncStatus.status === 'pending')) {\n schedulePoll();\n }\n } catch (err) {\n if (cancelled) return;\n setError(getErrorMessage(err, 'Failed to refresh sandbox providers'));\n schedulePoll();\n }\n }\n\n schedulePoll();\n return () => {\n cancelled = true;\n if (timeoutId !== undefined) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [sandboxCatalog, hasPendingProvider]);\n\n // Tenant/UI-wide: only one sandbox provider may be configured at a time.\n const hasConfiguredProvider = providers.length > 0;\n const availableEntries = useMemo(() => {\n if (hasConfiguredProvider) return [];\n const connectedCatalogIds = new Set(providers.map(provider => provider.data.catalogId));\n return catalog.filter(entry => !connectedCatalogIds.has(entry.id));\n }, [catalog, providers, hasConfiguredProvider]);\n\n const formInitialConfig = useMemo(\n () => (updateProvider ? configFrom(updateProvider) : createEntry ? configFrom(createEntry) : null),\n [updateProvider, createEntry],\n );\n\n if (!sandboxCatalog) {\n return <p className=\"text-sm text-text-secondary\">Sandbox provider catalog is not available.</p>;\n }\n\n const runMutation = async (fn: () => Promise<void>, setMutationError = setError) => {\n setBusy(true);\n setError(null);\n try {\n await fn();\n await refresh({ quiet: true });\n } catch (err) {\n setMutationError(getErrorMessage(err, 'Request failed'));\n throw err;\n } finally {\n setBusy(false);\n }\n };\n\n const handleCreate = async (draft: SandboxConfigDraft) => {\n if (!createEntry) return;\n setFormError(null);\n await runMutation(async () => {\n await sandboxCatalog.createSandboxProvider({\n catalogId: createEntry.id,\n name: createEntry.name,\n type: createEntry.type,\n ...configFrom(draft),\n apiKey: draft.apiKey,\n });\n }, setFormError);\n setCreateEntry(null);\n setTimeout(() => {\n toaster?.showSuccess({ title: `${createEntry.name} configured` });\n }, 0);\n };\n\n const handleUpdate = async (draft: SandboxConfigDraft) => {\n if (!updateProvider) return;\n setFormError(null);\n await runMutation(async () => {\n await sandboxCatalog.updateSandboxProvider({\n id: updateProvider.id,\n ...configFrom(draft),\n ...(draft.apiKey ? { apiKey: draft.apiKey } : {}),\n });\n }, setFormError);\n setUpdateProvider(null);\n setTimeout(() => {\n toaster?.showSuccess({ title: `${updateProvider.name} updated` });\n }, 0);\n };\n\n const handleRetry = (provider: SandboxProviderBase) => {\n void runMutation(async () => {\n await sandboxCatalog.updateSandboxProvider({\n id: provider.id,\n ...configFrom(provider),\n });\n }).catch(() => {});\n };\n\n const handleRemove = (provider: SandboxProviderBase) => {\n const deleteSandboxProvider = sandboxCatalog.deleteSandboxProvider;\n if (!deleteSandboxProvider) return;\n void runMutation(async () => {\n await deleteSandboxProvider({ id: provider.id });\n }).catch(() => {});\n };\n\n const formOpen = createEntry != null || updateProvider != null;\n const isUpdate = updateProvider != null;\n const formTitle = updateProvider\n ? `Update ${updateProvider.name}`\n : createEntry\n ? `Configure ${createEntry.name}`\n : 'Configure sandbox provider';\n\n return (\n <>\n <h3 className=\"text-xl font-semibold tracking-tight text-text-primary\">Sandbox providers</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Choose a provider that runs sandboxes for code, files and shell commands. Only one can be active at a time.\n </p>\n\n {error ? (\n <p className=\"mt-3 rounded-md border border-failure-bg/30 bg-failure-bg/10 px-3 py-2 text-sm text-failure-bg\">\n {error}\n </p>\n ) : null}\n\n <div className=\"mt-4 flex-1 overflow-y-auto\">\n {loading ? (\n <p className=\"text-sm text-text-secondary\">Loading sandbox providers…</p>\n ) : (\n <div className=\"space-y-6\">\n {providers.length > 0 ? (\n <section>\n <h4 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n Configured · {providers.length}\n </h4>\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {providers.map(entry => {\n const provider = entry.data;\n const status = statusPresentation(entry.snapshotSyncStatus.status);\n const statusReason = entry.snapshotSyncStatus.statusReason;\n const statusIndicator = (\n <span className={`inline-flex items-center gap-1.5 text-sm font-medium ${status.className}`}>\n {entry.snapshotSyncStatus.status === 'pending' ? (\n <Spinner size={16} aria-label=\"Syncing snapshot image\" />\n ) : entry.snapshotSyncStatus.status === 'ready' ? (\n <span className=\"size-2 rounded-full bg-success-bg\" aria-hidden />\n ) : entry.snapshotSyncStatus.status === 'failed' ? (\n <Icon name=\"triangle-exclamation\" className=\"size-4\" />\n ) : null}\n {status.label}\n </span>\n );\n return (\n <article\n key={provider.id}\n className=\"flex flex-col gap-3 border-b border-border p-3 last:border-b-0 sm:flex-row sm:items-center\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span\n className=\"flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n <Icon name=\"cube\" className=\"size-4.5\" />\n </span>\n <div className=\"min-w-0\">\n <h5 className=\"truncate text-sm font-medium text-text-primary\">{provider.name}</h5>\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2.5 sm:justify-end\">\n {statusIndicator}\n {statusReason ? (\n <Tooltip content={statusReason}>\n <button\n type=\"button\"\n aria-label=\"Snapshot sync status details\"\n className=\"inline-flex text-text-secondary transition-colors hover:text-text-primary\"\n >\n <Icon name=\"info\" className=\"size-4\" />\n </button>\n </Tooltip>\n ) : null}\n {entry.snapshotSyncStatus.status === 'failed' ? (\n <Button.Ghost\n size=\"small\"\n type=\"button\"\n disabled={busy}\n onClick={() => {\n handleRetry(provider);\n }}\n >\n Retry\n </Button.Ghost>\n ) : null}\n <Button.Secondary\n size=\"small\"\n type=\"button\"\n disabled={busy}\n onClick={() => {\n setFormError(null);\n setCreateEntry(null);\n setUpdateProvider(provider);\n }}\n >\n Update\n </Button.Secondary>\n\n {sandboxCatalog.deleteSandboxProvider ? (\n <Button.Ghost\n size=\"small\"\n className=\"text-text-secondary\"\n type=\"button\"\n disabled={busy}\n onClick={() => {\n handleRemove(provider);\n }}\n >\n Remove\n </Button.Ghost>\n ) : null}\n </div>\n </article>\n );\n })}\n </div>\n </section>\n ) : null}\n\n {!hasConfiguredProvider ? (\n <section>\n <h4 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n Available · {availableEntries.length}\n </h4>\n {availableEntries.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n {catalog.length > 0\n ? 'All catalog providers are configured.'\n : 'No sandbox providers in the catalog.'}\n </p>\n ) : (\n <div className=\"overflow-hidden rounded-xl border border-border bg-card-bg\">\n {availableEntries.map(entry => (\n <article\n key={entry.id}\n className=\"flex flex-col gap-3 border-b border-border p-3 last:border-b-0 sm:flex-row sm:items-center\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span\n className=\"flex size-9 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n <Icon name=\"cube\" className=\"size-4.5\" />\n </span>\n <div className=\"min-w-0\">\n <h5 className=\"truncate text-sm font-medium text-text-primary\">{entry.name}</h5>\n </div>\n </div>\n\n <Button.Secondary\n type=\"button\"\n disabled={busy}\n onClick={() => {\n setFormError(null);\n setUpdateProvider(null);\n setCreateEntry(entry);\n }}\n >\n Configure\n </Button.Secondary>\n </article>\n ))}\n </div>\n )}\n </section>\n ) : null}\n </div>\n )}\n </div>\n\n <ConfigureSandboxForm\n open={formOpen}\n onOpenChange={open => {\n if (!open) {\n setFormError(null);\n setCreateEntry(null);\n setUpdateProvider(null);\n }\n }}\n onSave={isUpdate ? handleUpdate : handleCreate}\n title={formTitle}\n description={\n isUpdate\n ? 'Update this sandbox provider. Leave API key blank to keep the existing key.'\n : 'Configure this sandbox provider. API key is never stored in the catalog.'\n }\n initialConfig={formInitialConfig}\n requireApiKey={!isUpdate}\n busy={busy}\n error={formError}\n />\n </>\n );\n};\n\nexport default SandboxSettings;\n","'use client';\n\nimport { useEffect, useState, type FormEvent } from 'react';\n\nimport { cn } from '../../atoms/lib/cn.js';\nimport { auiInputClass } from '../../atoms/lib/inputClasses.js';\nimport { Accordion, AccordionDetails, AccordionSummary } from '../../atoms/primitives/Accordion.js';\nimport { Button } from '../../atoms/primitives/Button.js';\nimport { CenteredModal } from '../../atoms/primitives/CenteredModal.js';\nimport { Icon } from '../../icons/Icon.js';\nimport type { SandboxProviderConfig } from '../../server/types.js';\n\nexport type SandboxConfigDraft = SandboxProviderConfig & {\n apiKey: string;\n};\n\ntype ConfigureSandboxFormProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSave: (draft: SandboxConfigDraft) => void | Promise<void>;\n title: string;\n description?: string;\n /** Prefills config fields; apiKey is never autofilled. */\n initialConfig?: SandboxProviderConfig | null;\n /** When false (updates), empty apiKey means keep the existing key. */\n requireApiKey?: boolean;\n busy?: boolean;\n error?: string | null;\n};\n\n/** Sensible defaults so the advanced fields are never blank, even without a catalog preset. */\nconst EMPTY_CONFIG: SandboxProviderConfig = {\n // Snapshot/image is release-owned now; kept only to satisfy the external SandboxProviderConfig type.\n execTimeoutMs: 300000,\n autoStopIntervalInMinutes: 15,\n autoArchiveIntervalInMinutes: 10080,\n autoDeleteIntervalInMinutes: 43200,\n};\n\nconst inputClassName = auiInputClass('h-11 shadow-sm');\n\nfunction parseNonNegInt(raw: string): number | null {\n if (raw.trim() === '') return null;\n const n = Number(raw);\n if (!Number.isFinite(n) || n < 0) return null;\n return n;\n}\n\nconst ConfigureSandboxForm = ({\n open,\n onOpenChange,\n onSave,\n title,\n description,\n initialConfig = null,\n requireApiKey = true,\n busy = false,\n error,\n}: ConfigureSandboxFormProps) => {\n const [execTimeoutMs, setExecTimeoutMs] = useState('');\n const [autoStopIntervalInMinutes, setAutoStopIntervalInMinutes] = useState('');\n const [autoArchiveIntervalInMinutes, setAutoArchiveIntervalInMinutes] = useState('');\n const [autoDeleteIntervalInMinutes, setAutoDeleteIntervalInMinutes] = useState('');\n const [apiKey, setApiKey] = useState('');\n const [advancedOpen, setAdvancedOpen] = useState(false);\n\n const resetForm = () => {\n setExecTimeoutMs('');\n setAutoStopIntervalInMinutes('');\n setAutoArchiveIntervalInMinutes('');\n setAutoDeleteIntervalInMinutes('');\n setApiKey('');\n setAdvancedOpen(false);\n };\n\n useEffect(() => {\n if (!open) return;\n const config = initialConfig ?? EMPTY_CONFIG;\n setExecTimeoutMs(String(config.execTimeoutMs));\n setAutoStopIntervalInMinutes(String(config.autoStopIntervalInMinutes));\n setAutoArchiveIntervalInMinutes(String(config.autoArchiveIntervalInMinutes));\n setAutoDeleteIntervalInMinutes(String(config.autoDeleteIntervalInMinutes));\n setApiKey('');\n setAdvancedOpen(false);\n }, [open, initialConfig]);\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (!nextOpen) resetForm();\n onOpenChange(nextOpen);\n };\n\n const execTimeout = parseNonNegInt(execTimeoutMs);\n const autoStop = parseNonNegInt(autoStopIntervalInMinutes);\n const autoArchive = parseNonNegInt(autoArchiveIntervalInMinutes);\n const autoDelete = parseNonNegInt(autoDeleteIntervalInMinutes);\n const trimmedKey = apiKey.trim();\n\n const isValid =\n (!requireApiKey || !!trimmedKey) &&\n execTimeout != null &&\n autoStop != null &&\n autoArchive != null &&\n autoDelete != null;\n\n const handleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (!isValid || busy || execTimeout == null || autoStop == null || autoArchive == null || autoDelete == null) {\n return;\n }\n\n try {\n await onSave({\n // Snapshot/image is release-owned; the field is retained only for the external type.\n execTimeoutMs: execTimeout,\n autoStopIntervalInMinutes: autoStop,\n autoArchiveIntervalInMinutes: autoArchive,\n autoDeleteIntervalInMinutes: autoDelete,\n apiKey: trimmedKey,\n });\n resetForm();\n onOpenChange(false);\n } catch {\n // Parent surfaces error; keep form open.\n }\n };\n\n return (\n <CenteredModal\n open={open}\n onOpenChange={handleOpenChange}\n title={title}\n description={description}\n contentSized\n headerIcon={\n <span\n className=\"flex size-11 shrink-0 items-center justify-center rounded-lg border border-border bg-secondary-bg text-text-primary\"\n aria-hidden\n >\n <Icon name=\"cube\" className=\"size-6\" />\n </span>\n }\n >\n <form className=\"flex flex-col overflow-y-auto p-5 md:p-6\" onSubmit={handleSubmit}>\n <div className=\"space-y-4\">\n <div>\n <label htmlFor=\"sandbox-api-key\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n API key\n {!requireApiKey ? <span className=\"font-normal text-text-secondary\"> (optional)</span> : null}\n </label>\n <input\n id=\"sandbox-api-key\"\n type=\"password\"\n required={requireApiKey}\n value={apiKey}\n onChange={event => {\n setApiKey(event.target.value);\n }}\n placeholder={requireApiKey ? 'dtn_...' : 'Leave blank to keep existing'}\n autoFocus\n className={inputClassName}\n />\n </div>\n\n <Accordion\n expanded={advancedOpen}\n onChange={(_event, next) => setAdvancedOpen(next)}\n className=\"rounded-md border border-border\"\n >\n <AccordionSummary className=\"px-3 py-2.5\">\n <span className=\"flex w-full items-center justify-between text-sm font-medium text-text-primary\">\n Advanced settings\n <Icon\n name=\"chevron-down\"\n className={cn(\n 'size-4 shrink-0 text-text-secondary transition-transform duration-200',\n advancedOpen ? 'rotate-0' : '-rotate-90',\n )}\n />\n </span>\n </AccordionSummary>\n <AccordionDetails className=\"space-y-4 border-t border-border px-3 pb-3 pt-4\">\n <div>\n <label htmlFor=\"sandbox-exec-timeout\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Exec timeout (ms)\n </label>\n <input\n id=\"sandbox-exec-timeout\"\n type=\"number\"\n min={0}\n required\n value={execTimeoutMs}\n onChange={event => {\n setExecTimeoutMs(event.target.value);\n }}\n placeholder=\"300000\"\n className={inputClassName}\n />\n </div>\n\n <div>\n <label htmlFor=\"sandbox-auto-stop\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Auto-stop interval (minutes)\n </label>\n <input\n id=\"sandbox-auto-stop\"\n type=\"number\"\n min={0}\n required\n value={autoStopIntervalInMinutes}\n onChange={event => {\n setAutoStopIntervalInMinutes(event.target.value);\n }}\n placeholder=\"15\"\n className={inputClassName}\n />\n </div>\n\n <div>\n <label htmlFor=\"sandbox-auto-archive\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Auto-archive interval (minutes)\n </label>\n <input\n id=\"sandbox-auto-archive\"\n type=\"number\"\n min={0}\n required\n value={autoArchiveIntervalInMinutes}\n onChange={event => {\n setAutoArchiveIntervalInMinutes(event.target.value);\n }}\n placeholder=\"10080\"\n className={inputClassName}\n />\n </div>\n\n <div>\n <label htmlFor=\"sandbox-auto-delete\" className=\"mb-1.5 block text-sm font-medium text-text-primary\">\n Auto-delete interval (minutes)\n </label>\n <input\n id=\"sandbox-auto-delete\"\n type=\"number\"\n min={0}\n required\n value={autoDeleteIntervalInMinutes}\n onChange={event => {\n setAutoDeleteIntervalInMinutes(event.target.value);\n }}\n placeholder=\"43200\"\n className={inputClassName}\n />\n </div>\n </AccordionDetails>\n </Accordion>\n </div>\n\n <div className=\"mt-6 space-y-3\">\n {error ? <p className=\"text-failure-bg text-sm\">{error}</p> : null}\n <Button.Primary type=\"submit\" size=\"large\" disabled={!isValid || busy} className=\"w-full shrink-0\">\n Save\n </Button.Primary>\n </div>\n </form>\n </CenteredModal>\n );\n};\n\nexport default ConfigureSandboxForm;\n"],"mappings":"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","names":["useEffect","useState","jsx","jsxs","useState","useEffect"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
SchedulesPage
|
|
4
|
+
} from "./chunk-GXYAOAK5.js";
|
|
5
|
+
import "./chunk-YQO2NMJ3.js";
|
|
6
|
+
import "./chunk-NHHSZB5N.js";
|
|
7
|
+
import "./chunk-H6WTY5PM.js";
|
|
8
|
+
import "./chunk-FQK2XVVE.js";
|
|
9
|
+
import "./chunk-M6MHLVSO.js";
|
|
10
|
+
import "./chunk-VJ7BZGAF.js";
|
|
11
|
+
import "./chunk-BWHOZFIV.js";
|
|
12
|
+
export {
|
|
13
|
+
SchedulesPage
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=SchedulesPage-WQU4H25F.js.map
|
|
@@ -6,23 +6,23 @@ import {
|
|
|
6
6
|
auiButtonClass,
|
|
7
7
|
useCompactLayout,
|
|
8
8
|
useDraftCatalog
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-H6WTY5PM.js";
|
|
10
10
|
import {
|
|
11
11
|
useOptionalCatalogServer,
|
|
12
12
|
useOptionalRefreshServerCapabilities,
|
|
13
13
|
useShellMode
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-FQK2XVVE.js";
|
|
15
15
|
import {
|
|
16
16
|
cn
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-BWHOZFIV.js";
|
|
18
18
|
|
|
19
19
|
// src/containers/SettingsBuilder/index.tsx
|
|
20
20
|
import { lazy, Suspense, useCallback, useEffect, useMemo } from "react";
|
|
21
21
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
22
|
-
var ModelSettings = lazy(() => import("./ModelSettings-
|
|
23
|
-
var ConnectorSettings = lazy(() => import("./ConnectorSettings-
|
|
24
|
-
var SkillSettings = lazy(() => import("./SkillSettings-
|
|
25
|
-
var SandboxSettings = lazy(() => import("./SandboxSettings-
|
|
22
|
+
var ModelSettings = lazy(() => import("./ModelSettings-LYW64IRR.js"));
|
|
23
|
+
var ConnectorSettings = lazy(() => import("./ConnectorSettings-ESZ2RSRG.js"));
|
|
24
|
+
var SkillSettings = lazy(() => import("./SkillSettings-64VXUO6J.js"));
|
|
25
|
+
var SandboxSettings = lazy(() => import("./SandboxSettings-DF64LHYI.js"));
|
|
26
26
|
function SettingsSectionFallback() {
|
|
27
27
|
return /* @__PURE__ */ jsxs("div", { className: "flex flex-1 items-center justify-center py-8", role: "status", "aria-live": "polite", "aria-busy": "true", children: [
|
|
28
28
|
/* @__PURE__ */ jsx(Spinner, { size: 20, className: "text-text-secondary" }),
|
|
@@ -144,4 +144,4 @@ var SettingsBuilder_default = TruefoundrySettingsBuilder;
|
|
|
144
144
|
export {
|
|
145
145
|
SettingsBuilder_default as default
|
|
146
146
|
};
|
|
147
|
-
//# sourceMappingURL=SettingsBuilder-
|
|
147
|
+
//# sourceMappingURL=SettingsBuilder-LSXK2VN4.js.map
|