@shipfox/client-agent 14.0.1 → 16.0.0
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +21 -0
- package/dist/components/add-custom-provider-card.js +3 -3
- package/dist/components/add-custom-provider-card.js.map +1 -1
- package/dist/components/available-provider-card.js +3 -3
- package/dist/components/available-provider-card.js.map +1 -1
- package/dist/components/available-providers-grid.d.ts +1 -1
- package/dist/components/available-providers-grid.d.ts.map +1 -1
- package/dist/components/available-providers-grid.js +2 -2
- package/dist/components/available-providers-grid.js.map +1 -1
- package/dist/components/change-default-model-form.js +3 -3
- package/dist/components/change-default-model-form.js.map +1 -1
- package/dist/components/custom-model-provider-form.js +18 -19
- package/dist/components/custom-model-provider-form.js.map +1 -1
- package/dist/components/custom-model-provider-form.stories.d.ts.map +1 -1
- package/dist/components/default-model-field.js +1 -1
- package/dist/components/default-model-field.js.map +1 -1
- package/dist/components/harnesses-section.js +7 -7
- package/dist/components/harnesses-section.js.map +1 -1
- package/dist/components/harnesses-section.stories.d.ts.map +1 -1
- package/dist/components/model-provider-usage-modal.js +8 -8
- package/dist/components/model-provider-usage-modal.js.map +1 -1
- package/dist/components/model-provider-usage-modal.stories.d.ts.map +1 -1
- package/dist/components/model-providers-section.js +20 -20
- package/dist/components/model-providers-section.js.map +1 -1
- package/dist/components/model-providers-section.stories.d.ts.map +1 -1
- package/dist/components/test-and-save-form.js +3 -3
- package/dist/components/test-and-save-form.js.map +1 -1
- package/dist/feature.d.ts +8 -8
- package/dist/feature.d.ts.map +1 -1
- package/dist/hooks/api/model-providers.d.ts +1 -1
- package/dist/hooks/api/model-providers.d.ts.map +1 -1
- package/dist/pages/model-provider-onboarding-page.d.ts.map +1 -1
- package/dist/pages/model-provider-onboarding-page.js +51 -43
- package/dist/pages/model-provider-onboarding-page.js.map +1 -1
- package/dist/pages/model-provider-onboarding-page.stories.d.ts.map +1 -1
- package/dist/routes/agents-settings.d.ts.map +1 -1
- package/dist/routes/agents-settings.js +1 -1
- package/dist/routes/agents-settings.js.map +1 -1
- package/dist/routes/model-provider.d.ts.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/components/add-custom-provider-card.tsx +3 -3
- package/src/components/available-provider-card.tsx +3 -3
- package/src/components/available-providers-grid.tsx +2 -2
- package/src/components/change-default-model-form.tsx +3 -3
- package/src/components/custom-model-provider-form.tsx +23 -20
- package/src/components/default-model-field.tsx +1 -1
- package/src/components/harnesses-section.tsx +7 -7
- package/src/components/model-provider-usage-modal.tsx +8 -8
- package/src/components/model-providers-section.tsx +20 -20
- package/src/components/test-and-save-form.tsx +3 -3
- package/src/pages/model-provider-onboarding-page.tsx +38 -34
- package/src/routes/agents-settings.tsx +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -73,16 +73,16 @@ export function WorkspaceModelProvidersSection({ workspaceId }) {
|
|
|
73
73
|
providerById
|
|
74
74
|
]);
|
|
75
75
|
return /*#__PURE__*/ _jsxs("div", {
|
|
76
|
-
className: "flex min-w-0 flex-col gap-
|
|
76
|
+
className: "flex min-w-0 flex-col gap-region",
|
|
77
77
|
children: [
|
|
78
78
|
/*#__PURE__*/ _jsxs("section", {
|
|
79
79
|
ref: configuredProvidersRegionRef,
|
|
80
|
-
className: "flex flex-col gap-
|
|
80
|
+
className: "flex flex-col gap-group outline-none",
|
|
81
81
|
"aria-label": "Configured providers",
|
|
82
82
|
tabIndex: -1,
|
|
83
83
|
children: [
|
|
84
84
|
/*#__PURE__*/ _jsxs("div", {
|
|
85
|
-
className: "flex flex-col gap-
|
|
85
|
+
className: "flex flex-col gap-tight",
|
|
86
86
|
children: [
|
|
87
87
|
/*#__PURE__*/ _jsx(Header, {
|
|
88
88
|
variant: "h3",
|
|
@@ -99,14 +99,14 @@ export function WorkspaceModelProvidersSection({ workspaceId }) {
|
|
|
99
99
|
label: "Loading configured providers"
|
|
100
100
|
}) : null,
|
|
101
101
|
configsQuery.isError && configsQuery.data === undefined ? /*#__PURE__*/ _jsx("div", {
|
|
102
|
-
className: cn(SURFACE_CLASS, 'px-
|
|
102
|
+
className: cn(SURFACE_CLASS, 'px-row'),
|
|
103
103
|
children: /*#__PURE__*/ _jsx(QueryLoadError, {
|
|
104
104
|
query: configsQuery,
|
|
105
105
|
subject: "model provider configs"
|
|
106
106
|
})
|
|
107
107
|
}) : null,
|
|
108
108
|
configsQuery.data !== undefined && configs.length === 0 ? /*#__PURE__*/ _jsx("div", {
|
|
109
|
-
className: cn(SURFACE_CLASS, 'px-
|
|
109
|
+
className: cn(SURFACE_CLASS, 'px-row'),
|
|
110
110
|
children: /*#__PURE__*/ _jsx(EmptyState, {
|
|
111
111
|
icon: "key2Line",
|
|
112
112
|
title: "No providers configured",
|
|
@@ -171,11 +171,11 @@ export function WorkspaceModelProvidersSection({ workspaceId }) {
|
|
|
171
171
|
]
|
|
172
172
|
}),
|
|
173
173
|
/*#__PURE__*/ _jsxs("section", {
|
|
174
|
-
className: "flex flex-col gap-
|
|
174
|
+
className: "flex flex-col gap-group",
|
|
175
175
|
"aria-label": "Available providers",
|
|
176
176
|
children: [
|
|
177
177
|
/*#__PURE__*/ _jsxs("div", {
|
|
178
|
-
className: "flex flex-col gap-
|
|
178
|
+
className: "flex flex-col gap-tight",
|
|
179
179
|
children: [
|
|
180
180
|
/*#__PURE__*/ _jsx(Header, {
|
|
181
181
|
variant: "h3",
|
|
@@ -190,7 +190,7 @@ export function WorkspaceModelProvidersSection({ workspaceId }) {
|
|
|
190
190
|
}),
|
|
191
191
|
catalogQuery.isPending || configsQuery.isPending ? /*#__PURE__*/ _jsx(ModelProviderGridSkeleton, {}) : null,
|
|
192
192
|
catalogQuery.isError && catalogQuery.data === undefined ? /*#__PURE__*/ _jsx("div", {
|
|
193
|
-
className: cn(SURFACE_CLASS, 'px-
|
|
193
|
+
className: cn(SURFACE_CLASS, 'px-row'),
|
|
194
194
|
children: /*#__PURE__*/ _jsx(QueryLoadError, {
|
|
195
195
|
query: catalogQuery,
|
|
196
196
|
subject: "model provider catalog"
|
|
@@ -212,11 +212,11 @@ export function WorkspaceModelProvidersSection({ workspaceId }) {
|
|
|
212
212
|
]
|
|
213
213
|
}),
|
|
214
214
|
/*#__PURE__*/ _jsxs("section", {
|
|
215
|
-
className: "flex flex-col gap-
|
|
215
|
+
className: "flex flex-col gap-group",
|
|
216
216
|
"aria-label": "Unsupported providers",
|
|
217
217
|
children: [
|
|
218
218
|
/*#__PURE__*/ _jsxs("div", {
|
|
219
|
-
className: "flex flex-col gap-
|
|
219
|
+
className: "flex flex-col gap-tight",
|
|
220
220
|
children: [
|
|
221
221
|
/*#__PURE__*/ _jsx(Header, {
|
|
222
222
|
variant: "h3",
|
|
@@ -235,15 +235,15 @@ export function WorkspaceModelProvidersSection({ workspaceId }) {
|
|
|
235
235
|
unsupportedProviders.length > 0 ? /*#__PURE__*/ _jsx("ul", {
|
|
236
236
|
className: cn('divide-y divide-border-neutral-base', SURFACE_CLASS),
|
|
237
237
|
children: unsupportedProviders.map((entry)=>/*#__PURE__*/ _jsxs("li", {
|
|
238
|
-
className: "flex items-start gap-
|
|
238
|
+
className: "flex items-start gap-cluster px-row py-row opacity-70",
|
|
239
239
|
children: [
|
|
240
240
|
/*#__PURE__*/ _jsx(Icon, {
|
|
241
241
|
name: "forbid2Line",
|
|
242
|
-
className: "mt-
|
|
242
|
+
className: "mt-[2px] size-18 shrink-0 text-foreground-neutral-muted",
|
|
243
243
|
"aria-hidden": true
|
|
244
244
|
}),
|
|
245
245
|
/*#__PURE__*/ _jsxs("div", {
|
|
246
|
-
className: "flex min-w-0 flex-1 flex-col gap-
|
|
246
|
+
className: "flex min-w-0 flex-1 flex-col gap-tight",
|
|
247
247
|
children: [
|
|
248
248
|
/*#__PURE__*/ _jsx(Text, {
|
|
249
249
|
size: "md",
|
|
@@ -369,7 +369,7 @@ export function WorkspaceModelProvidersSection({ workspaceId }) {
|
|
|
369
369
|
}),
|
|
370
370
|
/*#__PURE__*/ _jsx(ModalHeader, {
|
|
371
371
|
children: /*#__PURE__*/ _jsxs("div", {
|
|
372
|
-
className: "flex min-w-0 flex-col gap-
|
|
372
|
+
className: "flex min-w-0 flex-col gap-tight",
|
|
373
373
|
children: [
|
|
374
374
|
/*#__PURE__*/ _jsx(Text, {
|
|
375
375
|
size: "lg",
|
|
@@ -462,13 +462,13 @@ function ConfiguredProviderRow({ workspaceId, config, entry, isDefault, onEdit,
|
|
|
462
462
|
}
|
|
463
463
|
}
|
|
464
464
|
return /*#__PURE__*/ _jsxs("li", {
|
|
465
|
-
className: "flex flex-col gap-
|
|
465
|
+
className: "flex flex-col gap-inline px-row py-row transition-colors hover:bg-background-components-hover",
|
|
466
466
|
children: [
|
|
467
467
|
/*#__PURE__*/ _jsxs("div", {
|
|
468
|
-
className: "flex items-center justify-between gap-
|
|
468
|
+
className: "flex items-center justify-between gap-cluster",
|
|
469
469
|
children: [
|
|
470
470
|
/*#__PURE__*/ _jsxs("div", {
|
|
471
|
-
className: "flex min-w-0 items-center gap-
|
|
471
|
+
className: "flex min-w-0 items-center gap-inline",
|
|
472
472
|
children: [
|
|
473
473
|
isDefault ? /*#__PURE__*/ _jsxs(_Fragment, {
|
|
474
474
|
children: [
|
|
@@ -592,7 +592,7 @@ function DeleteModelProviderDialog({ open, onOpenChange, label, errorMessage, is
|
|
|
592
592
|
title: "Delete model provider"
|
|
593
593
|
}),
|
|
594
594
|
/*#__PURE__*/ _jsxs(ModalBody, {
|
|
595
|
-
className: "gap-
|
|
595
|
+
className: "gap-group",
|
|
596
596
|
children: [
|
|
597
597
|
/*#__PURE__*/ _jsxs(Text, {
|
|
598
598
|
size: "sm",
|
|
@@ -644,13 +644,13 @@ function ModelProviderRowsSkeleton({ label }) {
|
|
|
644
644
|
1,
|
|
645
645
|
2
|
|
646
646
|
].map((row)=>/*#__PURE__*/ _jsxs("li", {
|
|
647
|
-
className: "flex items-center gap-
|
|
647
|
+
className: "flex items-center gap-cluster px-row py-row",
|
|
648
648
|
children: [
|
|
649
649
|
/*#__PURE__*/ _jsx(Skeleton, {
|
|
650
650
|
className: "size-32 shrink-0"
|
|
651
651
|
}),
|
|
652
652
|
/*#__PURE__*/ _jsxs("div", {
|
|
653
|
-
className: "flex min-w-0 flex-1 flex-col gap-
|
|
653
|
+
className: "flex min-w-0 flex-1 flex-col gap-inline",
|
|
654
654
|
children: [
|
|
655
655
|
/*#__PURE__*/ _jsx(Skeleton, {
|
|
656
656
|
className: "h-16 w-120"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/model-providers-section.tsx"],"sourcesContent":["import {QueryLoadError} from '@shipfox/client-ui';\nimport {Button, IconButton} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@shipfox/react-ui/dropdown-menu';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalTitle,\n} from '@shipfox/react-ui/modal';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Header, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {useEffect, useMemo, useReducer, useRef, useState} from 'react';\nimport {\n type ManagementModal,\n managementModalReducer,\n} from '#core/model-provider-management-reducer.js';\nimport type {\n BuiltinProviderConfig,\n CustomProviderConfig,\n ProviderCatalogEntry,\n ProviderConfig,\n SupportedProvider,\n} from '#core/models.js';\nimport {\n customProviderCardMatchesSearch,\n isSupportedProvider,\n availableProviders as selectAvailableProviders,\n} from '#core/provider-policy.js';\nimport {\n useDeleteModelProviderConfigMutation,\n useModelProviderCatalogQuery,\n useModelProviderConfigsQuery,\n useSetDefaultModelProviderMutation,\n} from '#hooks/api/model-providers.js';\nimport {AddCustomProviderCard} from './add-custom-provider-card.js';\nimport {AvailableProvidersGrid, PROVIDER_GRID_CLASS} from './available-providers-grid.js';\nimport {ChangeDefaultModelForm} from './change-default-model-form.js';\nimport {CustomModelProviderForm} from './custom-model-provider-form.js';\nimport {modelProviderConfigErrorToFormError} from './form-errors.js';\nimport {ModelProviderUsageModal} from './model-provider-usage-modal.js';\nimport {\n type ModelProviderUsageTarget,\n usageTargetFromCatalogEntry,\n usageTargetFromCustomConfig,\n} from './model-provider-usage-target.js';\nimport {ModelProviderTestAndSaveForm} from './test-and-save-form.js';\n\nconst SURFACE_CLASS =\n 'overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base';\n\ntype UsageTarget = {\n target: ModelProviderUsageTarget;\n initialModel: string | null;\n restoreFocusToConfiguredProviders: boolean;\n};\n\nconst USAGE_MODAL_OPEN_DELAY_MS = 250;\n\nexport function WorkspaceModelProvidersSection({workspaceId}: {workspaceId: string}) {\n const catalogQuery = useModelProviderCatalogQuery();\n const configsQuery = useModelProviderConfigsQuery(workspaceId);\n const [modal, dispatchModal] = useReducer(managementModalReducer, {kind: 'closed'});\n const [pendingUsageTarget, setPendingUsageTarget] = useState<UsageTarget | null>(null);\n const configuredProvidersRegionRef = useRef<HTMLElement | null>(null);\n\n const providers = catalogQuery.data?.providers ?? [];\n const configs = configsQuery.data?.configs ?? [];\n const configsLoaded = configsQuery.data !== undefined;\n const defaultProviderId = configsQuery.data?.defaultProviderId ?? null;\n const providerById = useMemo(\n () =>\n new Map<string, ProviderCatalogEntry>(providers.map((provider) => [provider.id, provider])),\n [providers],\n );\n const availableProviders = configsLoaded ? selectAvailableProviders(providers, configs) : [];\n const unsupportedProviders = providers.filter((provider) => !isSupportedProvider(provider));\n\n useEffect(() => {\n if (pendingUsageTarget === null || modal.kind !== 'closed') return undefined;\n\n const timer = window.setTimeout(() => {\n dispatchModal({\n type: 'show-usage',\n providerId: pendingUsageTarget.target.id,\n initialModel: pendingUsageTarget.initialModel,\n restoreFocusToConfiguredProviders: pendingUsageTarget.restoreFocusToConfiguredProviders,\n });\n setPendingUsageTarget(null);\n }, USAGE_MODAL_OPEN_DELAY_MS);\n\n return () => window.clearTimeout(timer);\n }, [modal.kind, pendingUsageTarget]);\n\n const usageTarget = useMemo(() => {\n if (modal.kind !== 'show-usage') return null;\n const config = configs.find((item) => item.providerId === modal.providerId);\n if (config?.kind === 'custom') return usageTargetFromCustomConfig(config);\n const entry = providerById.get(modal.providerId);\n return entry && isSupportedProvider(entry) ? usageTargetFromCatalogEntry(entry) : null;\n }, [configs, modal, providerById]);\n\n return (\n <div className=\"flex min-w-0 flex-col gap-32\">\n <section\n ref={configuredProvidersRegionRef}\n className=\"flex flex-col gap-16 outline-none\"\n aria-label=\"Configured providers\"\n tabIndex={-1}\n >\n <div className=\"flex flex-col gap-4\">\n <Header variant=\"h3\">Configured providers</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Workspace credentials available to agent steps.\n </Text>\n </div>\n\n {configsQuery.isPending ? (\n <ModelProviderRowsSkeleton label=\"Loading configured providers\" />\n ) : null}\n\n {configsQuery.isError && configsQuery.data === undefined ? (\n <div className={cn(SURFACE_CLASS, 'px-16')}>\n <QueryLoadError query={configsQuery} subject=\"model provider configs\" />\n </div>\n ) : null}\n\n {configsQuery.data !== undefined && configs.length === 0 ? (\n <div className={cn(SURFACE_CLASS, 'px-16')}>\n <EmptyState\n icon=\"key2Line\"\n title=\"No providers configured\"\n description=\"Configure a provider below to run agent steps with workspace-managed credentials.\"\n />\n </div>\n ) : null}\n\n {configs.length > 0 ? (\n <ul className={cn('divide-y divide-border-neutral-base', SURFACE_CLASS)}>\n {configs.map((config) => {\n const catalogEntry = providerById.get(config.providerId);\n const entry =\n catalogEntry && isSupportedProvider(catalogEntry) ? catalogEntry : undefined;\n const builtinConfig = isBuiltinModelProviderConfig(config) ? config : undefined;\n const customConfig = isCustomModelProviderConfig(config) ? config : undefined;\n return (\n <ConfiguredProviderRow\n key={config.providerId}\n workspaceId={workspaceId}\n config={config}\n entry={entry}\n isDefault={config.providerId === defaultProviderId}\n onEdit={() => {\n if (entry && builtinConfig) {\n dispatchModal({type: 'edit-builtin', provider: entry, config: builtinConfig});\n } else if (customConfig) {\n dispatchModal({type: 'edit-custom', config: customConfig});\n }\n }}\n onChangeDefaultModel={() => {\n if (entry && builtinConfig)\n dispatchModal({\n type: 'change-default-model',\n provider: entry,\n config: builtinConfig,\n });\n }}\n onShowUsage={() => {\n if (entry && builtinConfig) {\n setPendingUsageTarget(null);\n dispatchModal({\n type: 'show-usage',\n providerId: entry.id,\n initialModel: builtinConfig.defaultModel,\n restoreFocusToConfiguredProviders: false,\n });\n } else if (customConfig) {\n setPendingUsageTarget(null);\n dispatchModal({\n type: 'show-usage',\n providerId: customConfig.providerId,\n initialModel: customConfig.defaultModel,\n restoreFocusToConfiguredProviders: false,\n });\n }\n }}\n />\n );\n })}\n </ul>\n ) : null}\n </section>\n\n <section className=\"flex flex-col gap-16\" aria-label=\"Available providers\">\n <div className=\"flex flex-col gap-4\">\n <Header variant=\"h3\">Available providers</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Providers that can be configured for agent steps in this workspace.\n </Text>\n </div>\n\n {catalogQuery.isPending || configsQuery.isPending ? <ModelProviderGridSkeleton /> : null}\n\n {catalogQuery.isError && catalogQuery.data === undefined ? (\n <div className={cn(SURFACE_CLASS, 'px-16')}>\n <QueryLoadError query={catalogQuery} subject=\"model provider catalog\" />\n </div>\n ) : null}\n\n {configsLoaded ? (\n <AvailableProvidersGrid\n entries={availableProviders}\n onSelect={(entry) => dispatchModal({type: 'configure-builtin', provider: entry})}\n trailingCard={\n <AddCustomProviderCard onConfigure={() => dispatchModal({type: 'create-custom'})} />\n }\n trailingCardMatchesSearch={customProviderCardMatchesSearch}\n />\n ) : null}\n </section>\n\n <section className=\"flex flex-col gap-16\" aria-label=\"Unsupported providers\">\n <div className=\"flex flex-col gap-4\">\n <Header variant=\"h3\">Unsupported providers</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Providers that cannot be configured in this workspace yet.\n </Text>\n </div>\n\n {catalogQuery.isPending ? (\n <ModelProviderRowsSkeleton label=\"Loading unsupported providers\" />\n ) : null}\n\n {unsupportedProviders.length > 0 ? (\n <ul className={cn('divide-y divide-border-neutral-base', SURFACE_CLASS)}>\n {unsupportedProviders.map((entry) => (\n <li key={entry.id} className=\"flex items-start gap-12 px-16 py-12 opacity-70\">\n <Icon\n name=\"forbid2Line\"\n className=\"mt-2 size-18 shrink-0 text-foreground-neutral-muted\"\n aria-hidden\n />\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <Text size=\"md\" bold className=\"truncate\">\n {entry.label}\n </Text>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {entry.unsupportedReason}\n </Text>\n </div>\n </li>\n ))}\n </ul>\n ) : null}\n </section>\n\n <Modal\n open={modal.kind === 'configure-builtin' || modal.kind === 'edit-builtin'}\n onOpenChange={(open) => (open ? undefined : dispatchModal({type: 'close'}))}\n >\n <ModalContent aria-describedby={undefined}>\n <ModalTitle className=\"sr-only\">{modelProviderFormTitle(modal)}</ModalTitle>\n <ModalHeader>\n <Text\n size=\"lg\"\n aria-hidden=\"true\"\n className=\"overflow-ellipsis overflow-hidden whitespace-nowrap\"\n >\n {modelProviderFormTitle(modal)}\n </Text>\n </ModalHeader>\n {modal.kind === 'configure-builtin' || modal.kind === 'edit-builtin' ? (\n <ModelProviderTestAndSaveForm\n workspaceId={workspaceId}\n entry={modal.provider}\n existingConfig={modal.kind === 'edit-builtin' ? modal.config : undefined}\n onSaved={(savedDefaultModel) => {\n toast.success(`${modal.provider.label} saved`);\n if (modal.kind === 'configure-builtin' && configs.length === 0) {\n setPendingUsageTarget({\n target: usageTargetFromCatalogEntry(modal.provider),\n initialModel: savedDefaultModel,\n restoreFocusToConfiguredProviders: true,\n });\n }\n dispatchModal({type: 'close'});\n }}\n />\n ) : null}\n </ModalContent>\n </Modal>\n\n <Modal\n open={modal.kind === 'change-default-model'}\n onOpenChange={(open) => (open ? undefined : dispatchModal({type: 'close'}))}\n >\n <ModalContent aria-describedby={undefined}>\n <ModalTitle className=\"sr-only\">Change default model</ModalTitle>\n <ModalHeader>\n <Text\n size=\"lg\"\n aria-hidden=\"true\"\n className=\"overflow-ellipsis overflow-hidden whitespace-nowrap\"\n >\n Change default model for{' '}\n {modal.kind === 'change-default-model' ? modal.provider.label : ''}\n </Text>\n </ModalHeader>\n {modal.kind === 'change-default-model' ? (\n <ChangeDefaultModelForm\n workspaceId={workspaceId}\n entry={modal.provider}\n config={modal.config}\n onSaved={() => {\n toast.success(`${modal.provider.label} default model saved`);\n dispatchModal({type: 'close'});\n }}\n />\n ) : null}\n </ModalContent>\n </Modal>\n\n <ModelProviderUsageModal\n target={usageTarget}\n initialModel={modal.kind === 'show-usage' ? modal.initialModel : null}\n workspaceDefaultHarnessId={configsQuery.data?.defaultHarnessId ?? null}\n open={modal.kind === 'show-usage'}\n closeFocusTarget={\n modal.kind === 'show-usage' && modal.restoreFocusToConfiguredProviders\n ? configuredProvidersRegionRef.current\n : null\n }\n onOpenChange={(open) => {\n if (!open) dispatchModal({type: 'close'});\n }}\n />\n\n <Modal\n open={modal.kind === 'create-custom' || modal.kind === 'edit-custom'}\n onOpenChange={(open) => (open ? undefined : dispatchModal({type: 'close'}))}\n >\n <ModalContent\n aria-describedby={undefined}\n className=\"max-h-[calc(100vh-32px)] max-w-[760px]\"\n >\n <ModalTitle className=\"sr-only\">{customModelProviderFormTitle(modal)}</ModalTitle>\n <ModalHeader>\n <div className=\"flex min-w-0 flex-col gap-2\">\n <Text size=\"lg\" aria-hidden=\"true\" className=\"truncate\">\n {customModelProviderFormTitle(modal)}\n </Text>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Connect an OpenAI-, Anthropic-, or Gemini-compatible endpoint.\n </Text>\n </div>\n </ModalHeader>\n {modal.kind === 'create-custom' || modal.kind === 'edit-custom' ? (\n <CustomModelProviderForm\n workspaceId={workspaceId}\n existingConfig={modal.kind === 'edit-custom' ? modal.config : undefined}\n onSaved={() => {\n toast.success(\n modal.kind === 'edit-custom'\n ? `${modal.config.displayName} saved`\n : 'Custom provider saved',\n );\n dispatchModal({type: 'close'});\n }}\n />\n ) : null}\n </ModalContent>\n </Modal>\n </div>\n );\n}\n\nfunction modelProviderFormTitle(modal: ManagementModal): string {\n if (modal.kind === 'edit-builtin') return `Edit credentials for ${modal.provider.label}`;\n if (modal.kind === 'configure-builtin') return `Configure ${modal.provider.label}`;\n return '';\n}\n\nfunction customModelProviderFormTitle(modal: ManagementModal): string {\n if (modal.kind === 'edit-custom') return `Edit ${modal.config.displayName}`;\n return 'Add custom provider';\n}\n\nfunction isBuiltinModelProviderConfig(config: ProviderConfig): config is BuiltinProviderConfig {\n return config.kind === 'builtin';\n}\n\nfunction isCustomModelProviderConfig(config: ProviderConfig): config is CustomProviderConfig {\n return config.kind === 'custom';\n}\n\nfunction ConfiguredProviderRow({\n workspaceId,\n config,\n entry,\n isDefault,\n onEdit,\n onChangeDefaultModel,\n onShowUsage,\n}: {\n workspaceId: string;\n config: ProviderConfig;\n entry: SupportedProvider | undefined;\n isDefault: boolean;\n onEdit: () => void;\n onChangeDefaultModel: () => void;\n onShowUsage: () => void;\n}) {\n const setDefault = useSetDefaultModelProviderMutation();\n const deleteConfig = useDeleteModelProviderConfigMutation();\n const [defaultError, setDefaultError] = useState<string | undefined>();\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteError, setDeleteError] = useState<string | undefined>();\n const customConfig = isCustomModelProviderConfig(config) ? config : undefined;\n const label = customConfig?.displayName ?? entry?.label ?? config.providerId;\n const canUse = entry !== undefined || customConfig !== undefined;\n const canEdit = entry !== undefined || customConfig !== undefined;\n const isBuiltinConfig = isBuiltinModelProviderConfig(config);\n\n async function handleSetDefault() {\n setDefaultError(undefined);\n try {\n await setDefault.mutateAsync({\n workspaceId,\n providerId: config.providerId,\n });\n toast.success(`${label} is now the default provider`);\n } catch (error) {\n const mapped = modelProviderConfigErrorToFormError(error);\n setDefaultError(mapped.message);\n }\n }\n\n async function handleDelete() {\n setDeleteError(undefined);\n try {\n await deleteConfig.mutateAsync({workspaceId, providerId: config.providerId});\n toast.success(`${label} deleted`);\n setDeleteOpen(false);\n } catch (error) {\n const mapped = modelProviderConfigErrorToFormError(error);\n setDeleteError(mapped.message);\n }\n }\n\n function handleDeleteOpenChange(nextOpen: boolean) {\n setDeleteOpen(nextOpen);\n if (nextOpen) {\n setDeleteError(undefined);\n deleteConfig.reset();\n }\n }\n\n return (\n <li className=\"flex flex-col gap-10 px-16 py-12 transition-colors hover:bg-background-components-hover\">\n <div className=\"flex items-center justify-between gap-12\">\n <div className=\"flex min-w-0 items-center gap-8\">\n {isDefault ? (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex size-16 shrink-0 items-center justify-center\">\n <Icon\n name=\"starLine\"\n className=\"size-16 text-foreground-neutral-muted\"\n aria-hidden\n />\n </span>\n </TooltipTrigger>\n <TooltipContent>Default provider</TooltipContent>\n </Tooltip>\n <span className=\"sr-only\">Default provider</span>\n </>\n ) : null}\n <Text size=\"md\" bold className=\"truncate\">\n {label}\n </Text>\n </div>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <IconButton\n size=\"sm\"\n variant=\"transparent\"\n icon=\"more2Line\"\n aria-label={`Open ${label} provider actions`}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {!isDefault ? (\n <DropdownMenuItem\n icon=\"starLine\"\n disabled={setDefault.isPending || (!entry && !customConfig)}\n onSelect={() => {\n void handleSetDefault();\n }}\n >\n Set as default\n </DropdownMenuItem>\n ) : null}\n {isBuiltinConfig ? (\n <DropdownMenuItem\n icon=\"settings3Line\"\n disabled={!entry}\n onSelect={onChangeDefaultModel}\n >\n Change default model\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem icon=\"bookOpenLine\" disabled={!canUse} onSelect={onShowUsage}>\n View workflow example\n </DropdownMenuItem>\n <DropdownMenuItem icon=\"editLine\" disabled={!canEdit} onSelect={onEdit}>\n {customConfig ? 'Edit' : 'Edit credentials'}\n </DropdownMenuItem>\n <DropdownMenuItem\n icon=\"deleteBinLine\"\n onSelect={() => {\n setDeleteOpen(true);\n }}\n >\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n {defaultError ? (\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">{defaultError}</Text>\n </Callout>\n ) : null}\n <DeleteModelProviderDialog\n open={deleteOpen}\n onOpenChange={handleDeleteOpenChange}\n label={label}\n errorMessage={deleteError}\n isLoading={deleteConfig.isPending}\n onDelete={handleDelete}\n />\n </li>\n );\n}\n\nfunction DeleteModelProviderDialog({\n open,\n onOpenChange,\n label,\n errorMessage,\n isLoading,\n onDelete,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n label: string;\n errorMessage: string | undefined;\n isLoading: boolean;\n onDelete: () => void;\n}) {\n return (\n <Modal open={open} onOpenChange={onOpenChange}>\n <ModalContent aria-describedby={undefined} className=\"max-w-[420px]\">\n <ModalTitle className=\"sr-only\">Delete model provider</ModalTitle>\n <ModalHeader title=\"Delete model provider\" />\n <ModalBody className=\"gap-16\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Delete {label} credentials from this workspace? Agent jobs cannot use this provider\n until it is configured again.\n </Text>\n {errorMessage ? (\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">{errorMessage}</Text>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button size=\"sm\" variant=\"secondary\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button size=\"sm\" variant=\"danger\" isLoading={isLoading} onClick={onDelete}>\n Delete\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n\nfunction ModelProviderRowsSkeleton({label}: {label: string}) {\n return (\n <ul\n role=\"status\"\n aria-label={label}\n className={cn('divide-y divide-border-neutral-base', SURFACE_CLASS)}\n >\n {[0, 1, 2].map((row) => (\n <li key={row} className=\"flex items-center gap-12 px-16 py-12\">\n <Skeleton className=\"size-32 shrink-0\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-6\">\n <Skeleton className=\"h-16 w-120\" />\n <Skeleton className=\"h-14 w-180\" />\n </div>\n <Skeleton className=\"h-28 w-96 shrink-0\" />\n </li>\n ))}\n </ul>\n );\n}\n\nfunction ModelProviderGridSkeleton() {\n return (\n <div role=\"status\" aria-label=\"Loading available providers\" className={PROVIDER_GRID_CLASS}>\n {[0, 1, 2, 3].map((card) => (\n <Skeleton key={card} className=\"h-136 w-full\" />\n ))}\n </div>\n );\n}\n"],"names":["QueryLoadError","Button","IconButton","Callout","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","EmptyState","Icon","Modal","ModalBody","ModalContent","ModalFooter","ModalHeader","ModalTitle","Skeleton","toast","Tooltip","TooltipContent","TooltipTrigger","Header","Text","cn","useEffect","useMemo","useReducer","useRef","useState","managementModalReducer","customProviderCardMatchesSearch","isSupportedProvider","availableProviders","selectAvailableProviders","useDeleteModelProviderConfigMutation","useModelProviderCatalogQuery","useModelProviderConfigsQuery","useSetDefaultModelProviderMutation","AddCustomProviderCard","AvailableProvidersGrid","PROVIDER_GRID_CLASS","ChangeDefaultModelForm","CustomModelProviderForm","modelProviderConfigErrorToFormError","ModelProviderUsageModal","usageTargetFromCatalogEntry","usageTargetFromCustomConfig","ModelProviderTestAndSaveForm","SURFACE_CLASS","USAGE_MODAL_OPEN_DELAY_MS","WorkspaceModelProvidersSection","workspaceId","catalogQuery","configsQuery","modal","dispatchModal","kind","pendingUsageTarget","setPendingUsageTarget","configuredProvidersRegionRef","providers","data","configs","configsLoaded","undefined","defaultProviderId","providerById","Map","map","provider","id","unsupportedProviders","filter","timer","window","setTimeout","type","providerId","target","initialModel","restoreFocusToConfiguredProviders","clearTimeout","usageTarget","config","find","item","entry","get","div","className","section","ref","aria-label","tabIndex","variant","size","isPending","ModelProviderRowsSkeleton","label","isError","query","subject","length","icon","title","description","ul","catalogEntry","builtinConfig","isBuiltinModelProviderConfig","customConfig","isCustomModelProviderConfig","ConfiguredProviderRow","isDefault","onEdit","onChangeDefaultModel","onShowUsage","defaultModel","ModelProviderGridSkeleton","entries","onSelect","trailingCard","onConfigure","trailingCardMatchesSearch","li","name","aria-hidden","bold","unsupportedReason","open","onOpenChange","aria-describedby","modelProviderFormTitle","existingConfig","onSaved","savedDefaultModel","success","workspaceDefaultHarnessId","defaultHarnessId","closeFocusTarget","current","customModelProviderFormTitle","displayName","setDefault","deleteConfig","defaultError","setDefaultError","deleteOpen","setDeleteOpen","deleteError","setDeleteError","canUse","canEdit","isBuiltinConfig","handleSetDefault","mutateAsync","error","mapped","message","handleDelete","handleDeleteOpenChange","nextOpen","reset","asChild","span","align","disabled","role","DeleteModelProviderDialog","errorMessage","isLoading","onDelete","onClick","row","card"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/model-providers-section.tsx"],"sourcesContent":["import {QueryLoadError} from '@shipfox/client-ui';\nimport {Button, IconButton} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@shipfox/react-ui/dropdown-menu';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {\n Modal,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalTitle,\n} from '@shipfox/react-ui/modal';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Tooltip, TooltipContent, TooltipTrigger} from '@shipfox/react-ui/tooltip';\nimport {Header, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {useEffect, useMemo, useReducer, useRef, useState} from 'react';\nimport {\n type ManagementModal,\n managementModalReducer,\n} from '#core/model-provider-management-reducer.js';\nimport type {\n BuiltinProviderConfig,\n CustomProviderConfig,\n ProviderCatalogEntry,\n ProviderConfig,\n SupportedProvider,\n} from '#core/models.js';\nimport {\n customProviderCardMatchesSearch,\n isSupportedProvider,\n availableProviders as selectAvailableProviders,\n} from '#core/provider-policy.js';\nimport {\n useDeleteModelProviderConfigMutation,\n useModelProviderCatalogQuery,\n useModelProviderConfigsQuery,\n useSetDefaultModelProviderMutation,\n} from '#hooks/api/model-providers.js';\nimport {AddCustomProviderCard} from './add-custom-provider-card.js';\nimport {AvailableProvidersGrid, PROVIDER_GRID_CLASS} from './available-providers-grid.js';\nimport {ChangeDefaultModelForm} from './change-default-model-form.js';\nimport {CustomModelProviderForm} from './custom-model-provider-form.js';\nimport {modelProviderConfigErrorToFormError} from './form-errors.js';\nimport {ModelProviderUsageModal} from './model-provider-usage-modal.js';\nimport {\n type ModelProviderUsageTarget,\n usageTargetFromCatalogEntry,\n usageTargetFromCustomConfig,\n} from './model-provider-usage-target.js';\nimport {ModelProviderTestAndSaveForm} from './test-and-save-form.js';\n\nconst SURFACE_CLASS =\n 'overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base';\n\ntype UsageTarget = {\n target: ModelProviderUsageTarget;\n initialModel: string | null;\n restoreFocusToConfiguredProviders: boolean;\n};\n\nconst USAGE_MODAL_OPEN_DELAY_MS = 250;\n\nexport function WorkspaceModelProvidersSection({workspaceId}: {workspaceId: string}) {\n const catalogQuery = useModelProviderCatalogQuery();\n const configsQuery = useModelProviderConfigsQuery(workspaceId);\n const [modal, dispatchModal] = useReducer(managementModalReducer, {kind: 'closed'});\n const [pendingUsageTarget, setPendingUsageTarget] = useState<UsageTarget | null>(null);\n const configuredProvidersRegionRef = useRef<HTMLElement | null>(null);\n\n const providers = catalogQuery.data?.providers ?? [];\n const configs = configsQuery.data?.configs ?? [];\n const configsLoaded = configsQuery.data !== undefined;\n const defaultProviderId = configsQuery.data?.defaultProviderId ?? null;\n const providerById = useMemo(\n () =>\n new Map<string, ProviderCatalogEntry>(providers.map((provider) => [provider.id, provider])),\n [providers],\n );\n const availableProviders = configsLoaded ? selectAvailableProviders(providers, configs) : [];\n const unsupportedProviders = providers.filter((provider) => !isSupportedProvider(provider));\n\n useEffect(() => {\n if (pendingUsageTarget === null || modal.kind !== 'closed') return undefined;\n\n const timer = window.setTimeout(() => {\n dispatchModal({\n type: 'show-usage',\n providerId: pendingUsageTarget.target.id,\n initialModel: pendingUsageTarget.initialModel,\n restoreFocusToConfiguredProviders: pendingUsageTarget.restoreFocusToConfiguredProviders,\n });\n setPendingUsageTarget(null);\n }, USAGE_MODAL_OPEN_DELAY_MS);\n\n return () => window.clearTimeout(timer);\n }, [modal.kind, pendingUsageTarget]);\n\n const usageTarget = useMemo(() => {\n if (modal.kind !== 'show-usage') return null;\n const config = configs.find((item) => item.providerId === modal.providerId);\n if (config?.kind === 'custom') return usageTargetFromCustomConfig(config);\n const entry = providerById.get(modal.providerId);\n return entry && isSupportedProvider(entry) ? usageTargetFromCatalogEntry(entry) : null;\n }, [configs, modal, providerById]);\n\n return (\n <div className=\"flex min-w-0 flex-col gap-region\">\n <section\n ref={configuredProvidersRegionRef}\n className=\"flex flex-col gap-group outline-none\"\n aria-label=\"Configured providers\"\n tabIndex={-1}\n >\n <div className=\"flex flex-col gap-tight\">\n <Header variant=\"h3\">Configured providers</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Workspace credentials available to agent steps.\n </Text>\n </div>\n\n {configsQuery.isPending ? (\n <ModelProviderRowsSkeleton label=\"Loading configured providers\" />\n ) : null}\n\n {configsQuery.isError && configsQuery.data === undefined ? (\n <div className={cn(SURFACE_CLASS, 'px-row')}>\n <QueryLoadError query={configsQuery} subject=\"model provider configs\" />\n </div>\n ) : null}\n\n {configsQuery.data !== undefined && configs.length === 0 ? (\n <div className={cn(SURFACE_CLASS, 'px-row')}>\n <EmptyState\n icon=\"key2Line\"\n title=\"No providers configured\"\n description=\"Configure a provider below to run agent steps with workspace-managed credentials.\"\n />\n </div>\n ) : null}\n\n {configs.length > 0 ? (\n <ul className={cn('divide-y divide-border-neutral-base', SURFACE_CLASS)}>\n {configs.map((config) => {\n const catalogEntry = providerById.get(config.providerId);\n const entry =\n catalogEntry && isSupportedProvider(catalogEntry) ? catalogEntry : undefined;\n const builtinConfig = isBuiltinModelProviderConfig(config) ? config : undefined;\n const customConfig = isCustomModelProviderConfig(config) ? config : undefined;\n return (\n <ConfiguredProviderRow\n key={config.providerId}\n workspaceId={workspaceId}\n config={config}\n entry={entry}\n isDefault={config.providerId === defaultProviderId}\n onEdit={() => {\n if (entry && builtinConfig) {\n dispatchModal({type: 'edit-builtin', provider: entry, config: builtinConfig});\n } else if (customConfig) {\n dispatchModal({type: 'edit-custom', config: customConfig});\n }\n }}\n onChangeDefaultModel={() => {\n if (entry && builtinConfig)\n dispatchModal({\n type: 'change-default-model',\n provider: entry,\n config: builtinConfig,\n });\n }}\n onShowUsage={() => {\n if (entry && builtinConfig) {\n setPendingUsageTarget(null);\n dispatchModal({\n type: 'show-usage',\n providerId: entry.id,\n initialModel: builtinConfig.defaultModel,\n restoreFocusToConfiguredProviders: false,\n });\n } else if (customConfig) {\n setPendingUsageTarget(null);\n dispatchModal({\n type: 'show-usage',\n providerId: customConfig.providerId,\n initialModel: customConfig.defaultModel,\n restoreFocusToConfiguredProviders: false,\n });\n }\n }}\n />\n );\n })}\n </ul>\n ) : null}\n </section>\n\n <section className=\"flex flex-col gap-group\" aria-label=\"Available providers\">\n <div className=\"flex flex-col gap-tight\">\n <Header variant=\"h3\">Available providers</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Providers that can be configured for agent steps in this workspace.\n </Text>\n </div>\n\n {catalogQuery.isPending || configsQuery.isPending ? <ModelProviderGridSkeleton /> : null}\n\n {catalogQuery.isError && catalogQuery.data === undefined ? (\n <div className={cn(SURFACE_CLASS, 'px-row')}>\n <QueryLoadError query={catalogQuery} subject=\"model provider catalog\" />\n </div>\n ) : null}\n\n {configsLoaded ? (\n <AvailableProvidersGrid\n entries={availableProviders}\n onSelect={(entry) => dispatchModal({type: 'configure-builtin', provider: entry})}\n trailingCard={\n <AddCustomProviderCard onConfigure={() => dispatchModal({type: 'create-custom'})} />\n }\n trailingCardMatchesSearch={customProviderCardMatchesSearch}\n />\n ) : null}\n </section>\n\n <section className=\"flex flex-col gap-group\" aria-label=\"Unsupported providers\">\n <div className=\"flex flex-col gap-tight\">\n <Header variant=\"h3\">Unsupported providers</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Providers that cannot be configured in this workspace yet.\n </Text>\n </div>\n\n {catalogQuery.isPending ? (\n <ModelProviderRowsSkeleton label=\"Loading unsupported providers\" />\n ) : null}\n\n {unsupportedProviders.length > 0 ? (\n <ul className={cn('divide-y divide-border-neutral-base', SURFACE_CLASS)}>\n {unsupportedProviders.map((entry) => (\n <li key={entry.id} className=\"flex items-start gap-cluster px-row py-row opacity-70\">\n <Icon\n name=\"forbid2Line\"\n className=\"mt-[2px] size-18 shrink-0 text-foreground-neutral-muted\"\n aria-hidden\n />\n <div className=\"flex min-w-0 flex-1 flex-col gap-tight\">\n <Text size=\"md\" bold className=\"truncate\">\n {entry.label}\n </Text>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {entry.unsupportedReason}\n </Text>\n </div>\n </li>\n ))}\n </ul>\n ) : null}\n </section>\n\n <Modal\n open={modal.kind === 'configure-builtin' || modal.kind === 'edit-builtin'}\n onOpenChange={(open) => (open ? undefined : dispatchModal({type: 'close'}))}\n >\n <ModalContent aria-describedby={undefined}>\n <ModalTitle className=\"sr-only\">{modelProviderFormTitle(modal)}</ModalTitle>\n <ModalHeader>\n <Text\n size=\"lg\"\n aria-hidden=\"true\"\n className=\"overflow-ellipsis overflow-hidden whitespace-nowrap\"\n >\n {modelProviderFormTitle(modal)}\n </Text>\n </ModalHeader>\n {modal.kind === 'configure-builtin' || modal.kind === 'edit-builtin' ? (\n <ModelProviderTestAndSaveForm\n workspaceId={workspaceId}\n entry={modal.provider}\n existingConfig={modal.kind === 'edit-builtin' ? modal.config : undefined}\n onSaved={(savedDefaultModel) => {\n toast.success(`${modal.provider.label} saved`);\n if (modal.kind === 'configure-builtin' && configs.length === 0) {\n setPendingUsageTarget({\n target: usageTargetFromCatalogEntry(modal.provider),\n initialModel: savedDefaultModel,\n restoreFocusToConfiguredProviders: true,\n });\n }\n dispatchModal({type: 'close'});\n }}\n />\n ) : null}\n </ModalContent>\n </Modal>\n\n <Modal\n open={modal.kind === 'change-default-model'}\n onOpenChange={(open) => (open ? undefined : dispatchModal({type: 'close'}))}\n >\n <ModalContent aria-describedby={undefined}>\n <ModalTitle className=\"sr-only\">Change default model</ModalTitle>\n <ModalHeader>\n <Text\n size=\"lg\"\n aria-hidden=\"true\"\n className=\"overflow-ellipsis overflow-hidden whitespace-nowrap\"\n >\n Change default model for{' '}\n {modal.kind === 'change-default-model' ? modal.provider.label : ''}\n </Text>\n </ModalHeader>\n {modal.kind === 'change-default-model' ? (\n <ChangeDefaultModelForm\n workspaceId={workspaceId}\n entry={modal.provider}\n config={modal.config}\n onSaved={() => {\n toast.success(`${modal.provider.label} default model saved`);\n dispatchModal({type: 'close'});\n }}\n />\n ) : null}\n </ModalContent>\n </Modal>\n\n <ModelProviderUsageModal\n target={usageTarget}\n initialModel={modal.kind === 'show-usage' ? modal.initialModel : null}\n workspaceDefaultHarnessId={configsQuery.data?.defaultHarnessId ?? null}\n open={modal.kind === 'show-usage'}\n closeFocusTarget={\n modal.kind === 'show-usage' && modal.restoreFocusToConfiguredProviders\n ? configuredProvidersRegionRef.current\n : null\n }\n onOpenChange={(open) => {\n if (!open) dispatchModal({type: 'close'});\n }}\n />\n\n <Modal\n open={modal.kind === 'create-custom' || modal.kind === 'edit-custom'}\n onOpenChange={(open) => (open ? undefined : dispatchModal({type: 'close'}))}\n >\n <ModalContent\n aria-describedby={undefined}\n className=\"max-h-[calc(100vh-32px)] max-w-[760px]\"\n >\n <ModalTitle className=\"sr-only\">{customModelProviderFormTitle(modal)}</ModalTitle>\n <ModalHeader>\n <div className=\"flex min-w-0 flex-col gap-tight\">\n <Text size=\"lg\" aria-hidden=\"true\" className=\"truncate\">\n {customModelProviderFormTitle(modal)}\n </Text>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Connect an OpenAI-, Anthropic-, or Gemini-compatible endpoint.\n </Text>\n </div>\n </ModalHeader>\n {modal.kind === 'create-custom' || modal.kind === 'edit-custom' ? (\n <CustomModelProviderForm\n workspaceId={workspaceId}\n existingConfig={modal.kind === 'edit-custom' ? modal.config : undefined}\n onSaved={() => {\n toast.success(\n modal.kind === 'edit-custom'\n ? `${modal.config.displayName} saved`\n : 'Custom provider saved',\n );\n dispatchModal({type: 'close'});\n }}\n />\n ) : null}\n </ModalContent>\n </Modal>\n </div>\n );\n}\n\nfunction modelProviderFormTitle(modal: ManagementModal): string {\n if (modal.kind === 'edit-builtin') return `Edit credentials for ${modal.provider.label}`;\n if (modal.kind === 'configure-builtin') return `Configure ${modal.provider.label}`;\n return '';\n}\n\nfunction customModelProviderFormTitle(modal: ManagementModal): string {\n if (modal.kind === 'edit-custom') return `Edit ${modal.config.displayName}`;\n return 'Add custom provider';\n}\n\nfunction isBuiltinModelProviderConfig(config: ProviderConfig): config is BuiltinProviderConfig {\n return config.kind === 'builtin';\n}\n\nfunction isCustomModelProviderConfig(config: ProviderConfig): config is CustomProviderConfig {\n return config.kind === 'custom';\n}\n\nfunction ConfiguredProviderRow({\n workspaceId,\n config,\n entry,\n isDefault,\n onEdit,\n onChangeDefaultModel,\n onShowUsage,\n}: {\n workspaceId: string;\n config: ProviderConfig;\n entry: SupportedProvider | undefined;\n isDefault: boolean;\n onEdit: () => void;\n onChangeDefaultModel: () => void;\n onShowUsage: () => void;\n}) {\n const setDefault = useSetDefaultModelProviderMutation();\n const deleteConfig = useDeleteModelProviderConfigMutation();\n const [defaultError, setDefaultError] = useState<string | undefined>();\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteError, setDeleteError] = useState<string | undefined>();\n const customConfig = isCustomModelProviderConfig(config) ? config : undefined;\n const label = customConfig?.displayName ?? entry?.label ?? config.providerId;\n const canUse = entry !== undefined || customConfig !== undefined;\n const canEdit = entry !== undefined || customConfig !== undefined;\n const isBuiltinConfig = isBuiltinModelProviderConfig(config);\n\n async function handleSetDefault() {\n setDefaultError(undefined);\n try {\n await setDefault.mutateAsync({\n workspaceId,\n providerId: config.providerId,\n });\n toast.success(`${label} is now the default provider`);\n } catch (error) {\n const mapped = modelProviderConfigErrorToFormError(error);\n setDefaultError(mapped.message);\n }\n }\n\n async function handleDelete() {\n setDeleteError(undefined);\n try {\n await deleteConfig.mutateAsync({workspaceId, providerId: config.providerId});\n toast.success(`${label} deleted`);\n setDeleteOpen(false);\n } catch (error) {\n const mapped = modelProviderConfigErrorToFormError(error);\n setDeleteError(mapped.message);\n }\n }\n\n function handleDeleteOpenChange(nextOpen: boolean) {\n setDeleteOpen(nextOpen);\n if (nextOpen) {\n setDeleteError(undefined);\n deleteConfig.reset();\n }\n }\n\n return (\n <li className=\"flex flex-col gap-inline px-row py-row transition-colors hover:bg-background-components-hover\">\n <div className=\"flex items-center justify-between gap-cluster\">\n <div className=\"flex min-w-0 items-center gap-inline\">\n {isDefault ? (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex size-16 shrink-0 items-center justify-center\">\n <Icon\n name=\"starLine\"\n className=\"size-16 text-foreground-neutral-muted\"\n aria-hidden\n />\n </span>\n </TooltipTrigger>\n <TooltipContent>Default provider</TooltipContent>\n </Tooltip>\n <span className=\"sr-only\">Default provider</span>\n </>\n ) : null}\n <Text size=\"md\" bold className=\"truncate\">\n {label}\n </Text>\n </div>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <IconButton\n size=\"sm\"\n variant=\"transparent\"\n icon=\"more2Line\"\n aria-label={`Open ${label} provider actions`}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {!isDefault ? (\n <DropdownMenuItem\n icon=\"starLine\"\n disabled={setDefault.isPending || (!entry && !customConfig)}\n onSelect={() => {\n void handleSetDefault();\n }}\n >\n Set as default\n </DropdownMenuItem>\n ) : null}\n {isBuiltinConfig ? (\n <DropdownMenuItem\n icon=\"settings3Line\"\n disabled={!entry}\n onSelect={onChangeDefaultModel}\n >\n Change default model\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem icon=\"bookOpenLine\" disabled={!canUse} onSelect={onShowUsage}>\n View workflow example\n </DropdownMenuItem>\n <DropdownMenuItem icon=\"editLine\" disabled={!canEdit} onSelect={onEdit}>\n {customConfig ? 'Edit' : 'Edit credentials'}\n </DropdownMenuItem>\n <DropdownMenuItem\n icon=\"deleteBinLine\"\n onSelect={() => {\n setDeleteOpen(true);\n }}\n >\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n {defaultError ? (\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">{defaultError}</Text>\n </Callout>\n ) : null}\n <DeleteModelProviderDialog\n open={deleteOpen}\n onOpenChange={handleDeleteOpenChange}\n label={label}\n errorMessage={deleteError}\n isLoading={deleteConfig.isPending}\n onDelete={handleDelete}\n />\n </li>\n );\n}\n\nfunction DeleteModelProviderDialog({\n open,\n onOpenChange,\n label,\n errorMessage,\n isLoading,\n onDelete,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n label: string;\n errorMessage: string | undefined;\n isLoading: boolean;\n onDelete: () => void;\n}) {\n return (\n <Modal open={open} onOpenChange={onOpenChange}>\n <ModalContent aria-describedby={undefined} className=\"max-w-[420px]\">\n <ModalTitle className=\"sr-only\">Delete model provider</ModalTitle>\n <ModalHeader title=\"Delete model provider\" />\n <ModalBody className=\"gap-group\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Delete {label} credentials from this workspace? Agent jobs cannot use this provider\n until it is configured again.\n </Text>\n {errorMessage ? (\n <Callout role=\"alert\" type=\"error\">\n <Text size=\"sm\">{errorMessage}</Text>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button size=\"sm\" variant=\"secondary\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button size=\"sm\" variant=\"danger\" isLoading={isLoading} onClick={onDelete}>\n Delete\n </Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n\nfunction ModelProviderRowsSkeleton({label}: {label: string}) {\n return (\n <ul\n role=\"status\"\n aria-label={label}\n className={cn('divide-y divide-border-neutral-base', SURFACE_CLASS)}\n >\n {[0, 1, 2].map((row) => (\n <li key={row} className=\"flex items-center gap-cluster px-row py-row\">\n <Skeleton className=\"size-32 shrink-0\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-inline\">\n <Skeleton className=\"h-16 w-120\" />\n <Skeleton className=\"h-14 w-180\" />\n </div>\n <Skeleton className=\"h-28 w-96 shrink-0\" />\n </li>\n ))}\n </ul>\n );\n}\n\nfunction ModelProviderGridSkeleton() {\n return (\n <div role=\"status\" aria-label=\"Loading available providers\" className={PROVIDER_GRID_CLASS}>\n {[0, 1, 2, 3].map((card) => (\n <Skeleton key={card} className=\"h-136 w-full\" />\n ))}\n </div>\n );\n}\n"],"names":["QueryLoadError","Button","IconButton","Callout","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","EmptyState","Icon","Modal","ModalBody","ModalContent","ModalFooter","ModalHeader","ModalTitle","Skeleton","toast","Tooltip","TooltipContent","TooltipTrigger","Header","Text","cn","useEffect","useMemo","useReducer","useRef","useState","managementModalReducer","customProviderCardMatchesSearch","isSupportedProvider","availableProviders","selectAvailableProviders","useDeleteModelProviderConfigMutation","useModelProviderCatalogQuery","useModelProviderConfigsQuery","useSetDefaultModelProviderMutation","AddCustomProviderCard","AvailableProvidersGrid","PROVIDER_GRID_CLASS","ChangeDefaultModelForm","CustomModelProviderForm","modelProviderConfigErrorToFormError","ModelProviderUsageModal","usageTargetFromCatalogEntry","usageTargetFromCustomConfig","ModelProviderTestAndSaveForm","SURFACE_CLASS","USAGE_MODAL_OPEN_DELAY_MS","WorkspaceModelProvidersSection","workspaceId","catalogQuery","configsQuery","modal","dispatchModal","kind","pendingUsageTarget","setPendingUsageTarget","configuredProvidersRegionRef","providers","data","configs","configsLoaded","undefined","defaultProviderId","providerById","Map","map","provider","id","unsupportedProviders","filter","timer","window","setTimeout","type","providerId","target","initialModel","restoreFocusToConfiguredProviders","clearTimeout","usageTarget","config","find","item","entry","get","div","className","section","ref","aria-label","tabIndex","variant","size","isPending","ModelProviderRowsSkeleton","label","isError","query","subject","length","icon","title","description","ul","catalogEntry","builtinConfig","isBuiltinModelProviderConfig","customConfig","isCustomModelProviderConfig","ConfiguredProviderRow","isDefault","onEdit","onChangeDefaultModel","onShowUsage","defaultModel","ModelProviderGridSkeleton","entries","onSelect","trailingCard","onConfigure","trailingCardMatchesSearch","li","name","aria-hidden","bold","unsupportedReason","open","onOpenChange","aria-describedby","modelProviderFormTitle","existingConfig","onSaved","savedDefaultModel","success","workspaceDefaultHarnessId","defaultHarnessId","closeFocusTarget","current","customModelProviderFormTitle","displayName","setDefault","deleteConfig","defaultError","setDefaultError","deleteOpen","setDeleteOpen","deleteError","setDeleteError","canUse","canEdit","isBuiltinConfig","handleSetDefault","mutateAsync","error","mapped","message","handleDelete","handleDeleteOpenChange","nextOpen","reset","asChild","span","align","disabled","role","DeleteModelProviderDialog","errorMessage","isLoading","onDelete","onClick","row","card"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-providers-section.stories.d.ts","sourceRoot":"","sources":["../../src/components/model-providers-section.stories.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAO,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAQrD,KAAK,QAAQ,GACT,OAAO,GACP,kBAAkB,GAClB,gBAAgB,GAChB,mBAAmB,GACnB,SAAS,GACT,eAAe,GACf,eAAe,GACf,YAAY,CAAC;AAEjB,UAAU,wBAAwB;IAChC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AA+ED,iBAAS,mBAAmB,CAAC,EAAC,QAAQ,EAAC,EAAE,wBAAwB,+BAmBhE;AAED,QAAA,MAAM,IAAI
|
|
1
|
+
{"version":3,"file":"model-providers-section.stories.d.ts","sourceRoot":"","sources":["../../src/components/model-providers-section.stories.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAO,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAQrD,KAAK,QAAQ,GACT,OAAO,GACP,kBAAkB,GAClB,gBAAgB,GAChB,mBAAmB,GACnB,SAAS,GACT,eAAe,GACf,eAAe,GACf,YAAY,CAAC;AAEjB,UAAU,wBAAwB;IAChC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AA+ED,iBAAS,mBAAmB,CAAC,EAAC,QAAQ,EAAC,EAAE,wBAAwB,+BAmBhE;AAED,QAAA,MAAM,IAAI;;;;QAGK,MAAM;;;;;CAEuB,CAAC;eAE9B,IAAI;AACnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAAU,CAAC;AAEpC,eAAO,MAAM,eAAe,EAAE,KAE7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,KAUxC,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,KAU1C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,KAOrC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,KAUtC,CAAC"}
|
|
@@ -47,11 +47,11 @@ export function ModelProviderTestAndSaveForm({ workspaceId, entry, existingConfi
|
|
|
47
47
|
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
48
48
|
children: [
|
|
49
49
|
/*#__PURE__*/ _jsxs(ModalBody, {
|
|
50
|
-
className: "gap-
|
|
50
|
+
className: "gap-group",
|
|
51
51
|
children: [
|
|
52
52
|
/*#__PURE__*/ _jsxs("form", {
|
|
53
53
|
id: MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID,
|
|
54
|
-
className: "flex w-full flex-col gap-
|
|
54
|
+
className: "flex w-full flex-col gap-cluster",
|
|
55
55
|
noValidate: true,
|
|
56
56
|
onSubmit: (event)=>{
|
|
57
57
|
event.preventDefault();
|
|
@@ -98,7 +98,7 @@ export function ModelProviderTestAndSaveForm({ workspaceId, entry, existingConfi
|
|
|
98
98
|
role: "alert",
|
|
99
99
|
type: "error",
|
|
100
100
|
children: /*#__PURE__*/ _jsxs("div", {
|
|
101
|
-
className: "flex flex-col gap-
|
|
101
|
+
className: "flex flex-col gap-inline",
|
|
102
102
|
children: [
|
|
103
103
|
/*#__PURE__*/ _jsx(Text, {
|
|
104
104
|
size: "sm",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/test-and-save-form.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {ModalBody, ModalFooter} from '@shipfox/react-ui/modal';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useState} from 'react';\nimport type {BuiltinProviderConfig, SupportedProvider} from '#core/models.js';\nimport {useUpsertModelProviderConfigMutation} from '#hooks/api/model-providers.js';\nimport {\n DefaultModelField,\n defaultModelFormValue,\n LATEST_MODEL_VALUE,\n selectedModelForCredentialsPayload,\n} from './default-model-field.js';\nimport {modelProviderConfigErrorToFormError} from './form-errors.js';\n\nexport const MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID = 'model-provider-test-and-save-form';\n\nexport function ModelProviderTestAndSaveForm({\n workspaceId,\n entry,\n existingConfig,\n onSaved,\n setAsDefaultOnSave = false,\n}: {\n workspaceId: string;\n entry: SupportedProvider;\n existingConfig?: BuiltinProviderConfig | undefined;\n onSaved: (savedDefaultModel: string | null) => void;\n setAsDefaultOnSave?: boolean | undefined;\n}) {\n const upsertConfig = useUpsertModelProviderConfigMutation();\n const [formError, setFormError] = useState<string | undefined>();\n const form = useForm({\n defaultValues: defaultFormValues(entry, existingConfig),\n onSubmit: async ({value}) => {\n setFormError(undefined);\n const credentials = Object.fromEntries(\n entry.credentialFields.map((credentialField) => [\n credentialField.key,\n value[credentialField.key]?.trim() ?? '',\n ]),\n );\n const selectedModel = value.default_model ?? LATEST_MODEL_VALUE;\n const defaultModel =\n existingConfig === undefined\n ? selectedModelForCredentialsPayload(selectedModel)\n : undefined;\n\n try {\n await upsertConfig.mutateAsync({\n workspaceId,\n providerId: entry.id,\n command: {\n ...(defaultModel !== undefined ? {defaultModel} : {}),\n credentials,\n ...(setAsDefaultOnSave ? {setAsDefault: true} : {}),\n },\n });\n onSaved(selectedModelForCredentialsPayload(selectedModel));\n } catch (error) {\n const mapped = modelProviderConfigErrorToFormError(error);\n setFormError(mapped.message);\n }\n },\n });\n\n return (\n <>\n <ModalBody className=\"gap-
|
|
1
|
+
{"version":3,"sources":["../../src/components/test-and-save-form.tsx"],"sourcesContent":["import {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {ModalBody, ModalFooter} from '@shipfox/react-ui/modal';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useState} from 'react';\nimport type {BuiltinProviderConfig, SupportedProvider} from '#core/models.js';\nimport {useUpsertModelProviderConfigMutation} from '#hooks/api/model-providers.js';\nimport {\n DefaultModelField,\n defaultModelFormValue,\n LATEST_MODEL_VALUE,\n selectedModelForCredentialsPayload,\n} from './default-model-field.js';\nimport {modelProviderConfigErrorToFormError} from './form-errors.js';\n\nexport const MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID = 'model-provider-test-and-save-form';\n\nexport function ModelProviderTestAndSaveForm({\n workspaceId,\n entry,\n existingConfig,\n onSaved,\n setAsDefaultOnSave = false,\n}: {\n workspaceId: string;\n entry: SupportedProvider;\n existingConfig?: BuiltinProviderConfig | undefined;\n onSaved: (savedDefaultModel: string | null) => void;\n setAsDefaultOnSave?: boolean | undefined;\n}) {\n const upsertConfig = useUpsertModelProviderConfigMutation();\n const [formError, setFormError] = useState<string | undefined>();\n const form = useForm({\n defaultValues: defaultFormValues(entry, existingConfig),\n onSubmit: async ({value}) => {\n setFormError(undefined);\n const credentials = Object.fromEntries(\n entry.credentialFields.map((credentialField) => [\n credentialField.key,\n value[credentialField.key]?.trim() ?? '',\n ]),\n );\n const selectedModel = value.default_model ?? LATEST_MODEL_VALUE;\n const defaultModel =\n existingConfig === undefined\n ? selectedModelForCredentialsPayload(selectedModel)\n : undefined;\n\n try {\n await upsertConfig.mutateAsync({\n workspaceId,\n providerId: entry.id,\n command: {\n ...(defaultModel !== undefined ? {defaultModel} : {}),\n credentials,\n ...(setAsDefaultOnSave ? {setAsDefault: true} : {}),\n },\n });\n onSaved(selectedModelForCredentialsPayload(selectedModel));\n } catch (error) {\n const mapped = modelProviderConfigErrorToFormError(error);\n setFormError(mapped.message);\n }\n },\n });\n\n return (\n <>\n <ModalBody className=\"gap-group\">\n <form\n id={MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID}\n className=\"flex w-full flex-col gap-cluster\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n {existingConfig === undefined ? (\n <form.Field\n name=\"default_model\"\n validators={{\n onBlur: ({value}) => (value.trim() ? undefined : 'Default model is required.'),\n onSubmit: ({value}) => (value.trim() ? undefined : 'Default model is required.'),\n }}\n >\n {(field) => (\n <DefaultModelField\n entry={entry}\n value={field.state.value}\n error={fieldError(field)}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n )}\n </form.Field>\n ) : null}\n {entry.credentialFields.map((credentialField) => (\n <form.Field\n key={credentialField.key}\n name={credentialField.key}\n validators={{\n onBlur: ({value}) =>\n value.trim() ? undefined : `${credentialField.label} is required.`,\n onSubmit: ({value}) =>\n value.trim() ? undefined : `${credentialField.label} is required.`,\n }}\n >\n {(field) => (\n <FormField\n label={credentialField.label}\n id={`model-provider-${entry.id}-${credentialField.key}`}\n error={fieldError(field)}\n >\n <FormFieldInput\n type={credentialField.secret ? 'password' : 'text'}\n autoComplete=\"off\"\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n ))}\n </form>\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-inline\">\n <Text size=\"sm\" bold>\n Could not save provider\n </Text>\n <Text size=\"sm\">{formError}</Text>\n </div>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button\n type=\"submit\"\n form={MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID}\n isLoading={upsertConfig.isPending}\n >\n Test & save\n </Button>\n </ModalFooter>\n </>\n );\n}\n\nfunction defaultFormValues(\n entry: SupportedProvider,\n existingConfig: BuiltinProviderConfig | undefined,\n): Record<string, string> {\n return {\n default_model: defaultModelFormValue(existingConfig?.defaultModel),\n ...Object.fromEntries(entry.credentialFields.map((field) => [field.key, ''])),\n };\n}\n"],"names":["Button","Callout","FormField","FormFieldInput","fieldError","ModalBody","ModalFooter","Text","useForm","useState","useUpsertModelProviderConfigMutation","DefaultModelField","defaultModelFormValue","LATEST_MODEL_VALUE","selectedModelForCredentialsPayload","modelProviderConfigErrorToFormError","MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID","ModelProviderTestAndSaveForm","workspaceId","entry","existingConfig","onSaved","setAsDefaultOnSave","upsertConfig","formError","setFormError","form","defaultValues","defaultFormValues","onSubmit","value","undefined","credentials","Object","fromEntries","credentialFields","map","credentialField","key","trim","selectedModel","default_model","defaultModel","mutateAsync","providerId","id","command","setAsDefault","error","mapped","message","className","noValidate","event","preventDefault","stopPropagation","handleSubmit","Field","name","validators","onBlur","field","state","onChange","handleChange","target","handleBlur","label","type","secret","autoComplete","role","div","size","bold","isLoading","isPending"],"mappings":"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"}
|
package/dist/feature.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export declare const agentSettingsSections: readonly [{
|
|
2
|
-
readonly id:
|
|
3
|
-
readonly pathSegment:
|
|
4
|
-
readonly label:
|
|
5
|
-
readonly icon:
|
|
2
|
+
readonly id: 'settings.agents';
|
|
3
|
+
readonly pathSegment: 'agents';
|
|
4
|
+
readonly label: 'Agents';
|
|
5
|
+
readonly icon: 'robot2Line';
|
|
6
6
|
readonly order: 400;
|
|
7
7
|
}];
|
|
8
8
|
export declare const agentFeature: {
|
|
@@ -17,10 +17,10 @@ export declare const agentFeature: {
|
|
|
17
17
|
readonly impl: "@shipfox/client-agent/routes/agents-settings";
|
|
18
18
|
}];
|
|
19
19
|
readonly settingsSections: readonly [{
|
|
20
|
-
readonly id:
|
|
21
|
-
readonly pathSegment:
|
|
22
|
-
readonly label:
|
|
23
|
-
readonly icon:
|
|
20
|
+
readonly id: 'settings.agents';
|
|
21
|
+
readonly pathSegment: 'agents';
|
|
22
|
+
readonly label: 'Agents';
|
|
23
|
+
readonly icon: 'robot2Line';
|
|
24
24
|
readonly order: 400;
|
|
25
25
|
}];
|
|
26
26
|
};
|
package/dist/feature.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.d.ts","sourceRoot":"","sources":["../src/feature.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"feature.d.ts","sourceRoot":"","sources":["../src/feature.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB;iBAE1B,iBAAiB;0BACR,QAAQ;oBACd,QAAQ;mBACT,YAAY;oBACX,GAAG;EAEsC,CAAC;AAErD,eAAO,MAAM,YAAY;;;;;;;;;;;;qBARjB,iBAAiB;8BACR,QAAQ;wBACd,QAAQ;uBACT,YAAY;wBACX,GAAG;;CAmBZ,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { type ModelProviderRef } from '@shipfox/api-agent-dto';
|
|
|
2
2
|
import { type FetchQueryOptions } from '@tanstack/react-query';
|
|
3
3
|
import type { AgentModel, CreateCustomProviderCommand, DefaultHarnessSelection, DefaultModelProviderSelection, DiscoverProviderModelsCommand, HarnessId, ProviderCatalog, ProviderConfig, ProviderConfiguration, ProviderCredentialsCommand, UpdateCustomProviderCommand } from '#core/models.js';
|
|
4
4
|
export declare const modelProviderQueryKeys: {
|
|
5
|
-
all: readonly [
|
|
5
|
+
all: readonly ['model-providers'];
|
|
6
6
|
catalog: () => readonly ["model-providers", "catalog"];
|
|
7
7
|
configs: (workspaceId: string) => readonly ["model-providers", "configs", string];
|
|
8
8
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-providers.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/model-providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gBAAgB,EAKtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,KAAK,iBAAiB,EAKvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,UAAU,EACV,2BAA2B,EAC3B,uBAAuB,EACvB,6BAA6B,EAC7B,6BAA6B,EAC7B,SAAS,EACT,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC5B,MAAM,iBAAiB,CAAC;AAmBzB,eAAO,MAAM,sBAAsB
|
|
1
|
+
{"version":3,"file":"model-providers.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/model-providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-provider-onboarding-page.d.ts","sourceRoot":"","sources":["../../src/pages/model-provider-onboarding-page.tsx"],"names":[],"mappings":"AA2BA,wBAAgB,2BAA2B,CAAC,EAC1C,WAAW,EACX,MAAM,EACN,YAAY,GACb,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,+
|
|
1
|
+
{"version":3,"file":"model-provider-onboarding-page.d.ts","sourceRoot":"","sources":["../../src/pages/model-provider-onboarding-page.tsx"],"names":[],"mappings":"AA2BA,wBAAgB,2BAA2B,CAAC,EAC1C,WAAW,EACX,MAAM,EACN,YAAY,GACb,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,+BAmLA"}
|