@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.
Files changed (55) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +21 -0
  3. package/dist/components/add-custom-provider-card.js +3 -3
  4. package/dist/components/add-custom-provider-card.js.map +1 -1
  5. package/dist/components/available-provider-card.js +3 -3
  6. package/dist/components/available-provider-card.js.map +1 -1
  7. package/dist/components/available-providers-grid.d.ts +1 -1
  8. package/dist/components/available-providers-grid.d.ts.map +1 -1
  9. package/dist/components/available-providers-grid.js +2 -2
  10. package/dist/components/available-providers-grid.js.map +1 -1
  11. package/dist/components/change-default-model-form.js +3 -3
  12. package/dist/components/change-default-model-form.js.map +1 -1
  13. package/dist/components/custom-model-provider-form.js +18 -19
  14. package/dist/components/custom-model-provider-form.js.map +1 -1
  15. package/dist/components/custom-model-provider-form.stories.d.ts.map +1 -1
  16. package/dist/components/default-model-field.js +1 -1
  17. package/dist/components/default-model-field.js.map +1 -1
  18. package/dist/components/harnesses-section.js +7 -7
  19. package/dist/components/harnesses-section.js.map +1 -1
  20. package/dist/components/harnesses-section.stories.d.ts.map +1 -1
  21. package/dist/components/model-provider-usage-modal.js +8 -8
  22. package/dist/components/model-provider-usage-modal.js.map +1 -1
  23. package/dist/components/model-provider-usage-modal.stories.d.ts.map +1 -1
  24. package/dist/components/model-providers-section.js +20 -20
  25. package/dist/components/model-providers-section.js.map +1 -1
  26. package/dist/components/model-providers-section.stories.d.ts.map +1 -1
  27. package/dist/components/test-and-save-form.js +3 -3
  28. package/dist/components/test-and-save-form.js.map +1 -1
  29. package/dist/feature.d.ts +8 -8
  30. package/dist/feature.d.ts.map +1 -1
  31. package/dist/hooks/api/model-providers.d.ts +1 -1
  32. package/dist/hooks/api/model-providers.d.ts.map +1 -1
  33. package/dist/pages/model-provider-onboarding-page.d.ts.map +1 -1
  34. package/dist/pages/model-provider-onboarding-page.js +51 -43
  35. package/dist/pages/model-provider-onboarding-page.js.map +1 -1
  36. package/dist/pages/model-provider-onboarding-page.stories.d.ts.map +1 -1
  37. package/dist/routes/agents-settings.d.ts.map +1 -1
  38. package/dist/routes/agents-settings.js +1 -1
  39. package/dist/routes/agents-settings.js.map +1 -1
  40. package/dist/routes/model-provider.d.ts.map +1 -1
  41. package/dist/tsconfig.test.tsbuildinfo +1 -1
  42. package/package.json +5 -5
  43. package/src/components/add-custom-provider-card.tsx +3 -3
  44. package/src/components/available-provider-card.tsx +3 -3
  45. package/src/components/available-providers-grid.tsx +2 -2
  46. package/src/components/change-default-model-form.tsx +3 -3
  47. package/src/components/custom-model-provider-form.tsx +23 -20
  48. package/src/components/default-model-field.tsx +1 -1
  49. package/src/components/harnesses-section.tsx +7 -7
  50. package/src/components/model-provider-usage-modal.tsx +8 -8
  51. package/src/components/model-providers-section.tsx +20 -20
  52. package/src/components/test-and-save-form.tsx +3 -3
  53. package/src/pages/model-provider-onboarding-page.tsx +38 -34
  54. package/src/routes/agents-settings.tsx +1 -1
  55. 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-32",
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-16 outline-none",
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-4",
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-16'),
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-16'),
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-16",
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-4",
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-16'),
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-16",
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-4",
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-12 px-16 py-12 opacity-70",
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-2 size-18 shrink-0 text-foreground-neutral-muted",
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-2",
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-2",
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-10 px-16 py-12 transition-colors hover:bg-background-components-hover",
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-12",
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-8",
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-16",
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-12 px-16 py-12",
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-6",
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;;;;;;;;;CAKkC,CAAC;AAE7C,eAAe,IAAI,CAAC;AACpB,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"}
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-16",
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-14",
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-8",
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-16\">\n <form\n id={MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID}\n className=\"flex w-full flex-col gap-14\"\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-8\">\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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"}
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: "settings.agents";
3
- readonly pathSegment: "agents";
4
- readonly label: "Agents";
5
- readonly icon: "robot2Line";
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: "settings.agents";
21
- readonly pathSegment: "agents";
22
- readonly label: "Agents";
23
- readonly icon: "robot2Line";
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
  };
@@ -1 +1 @@
1
- {"version":3,"file":"feature.d.ts","sourceRoot":"","sources":["../src/feature.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB;;;;;;EAQkB,CAAC;AAErD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;CAevB,CAAC"}
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 ["model-providers"];
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":"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"}
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,+BA+KA"}
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"}