@shipfox/client-agent 4.0.0 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +59 -0
- package/dist/components/available-provider-card.d.ts +2 -2
- package/dist/components/available-provider-card.d.ts.map +1 -1
- package/dist/components/available-provider-card.js.map +1 -1
- package/dist/components/available-providers-grid.d.ts +2 -2
- package/dist/components/available-providers-grid.d.ts.map +1 -1
- package/dist/components/available-providers-grid.js +1 -1
- package/dist/components/available-providers-grid.js.map +1 -1
- package/dist/components/change-default-model-form.d.ts +3 -4
- package/dist/components/change-default-model-form.d.ts.map +1 -1
- package/dist/components/change-default-model-form.js +2 -4
- package/dist/components/change-default-model-form.js.map +1 -1
- package/dist/components/custom-model-provider-api-options.d.ts +3 -3
- package/dist/components/custom-model-provider-api-options.d.ts.map +1 -1
- package/dist/components/custom-model-provider-api-options.js.map +1 -1
- package/dist/components/custom-model-provider-form.d.ts +2 -2
- package/dist/components/custom-model-provider-form.d.ts.map +1 -1
- package/dist/components/custom-model-provider-form.js +12 -10
- 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/custom-model-provider-form.stories.js +11 -11
- package/dist/components/custom-model-provider-form.stories.js.map +1 -1
- package/dist/components/custom-model-provider-payload.d.ts +9 -9
- package/dist/components/custom-model-provider-payload.d.ts.map +1 -1
- package/dist/components/custom-model-provider-payload.js +42 -26
- package/dist/components/custom-model-provider-payload.js.map +1 -1
- package/dist/components/custom-model-provider-slug.d.ts +1 -1
- package/dist/components/custom-model-provider-slug.d.ts.map +1 -1
- package/dist/components/custom-model-provider-slug.js +3 -3
- package/dist/components/custom-model-provider-slug.js.map +1 -1
- package/dist/components/default-model-field.d.ts +2 -2
- package/dist/components/default-model-field.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/harness-availability.d.ts +4 -7
- package/dist/components/harness-availability.d.ts.map +1 -1
- package/dist/components/harness-availability.js +2 -11
- package/dist/components/harness-availability.js.map +1 -1
- package/dist/components/harnesses-section.d.ts.map +1 -1
- package/dist/components/harnesses-section.js +4 -6
- package/dist/components/harnesses-section.js.map +1 -1
- package/dist/components/model-provider-usage-modal.d.ts +2 -2
- package/dist/components/model-provider-usage-modal.d.ts.map +1 -1
- package/dist/components/model-provider-usage-modal.js +4 -4
- 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-provider-usage-modal.stories.js +14 -16
- package/dist/components/model-provider-usage-modal.stories.js.map +1 -1
- package/dist/components/model-provider-usage-target.d.ts +5 -5
- package/dist/components/model-provider-usage-target.d.ts.map +1 -1
- package/dist/components/model-provider-usage-target.js +10 -8
- package/dist/components/model-provider-usage-target.js.map +1 -1
- package/dist/components/model-providers-section.d.ts.map +1 -1
- package/dist/components/model-providers-section.js +112 -94
- package/dist/components/model-providers-section.js.map +1 -1
- package/dist/components/model-providers-section.stories.js +8 -4
- package/dist/components/model-providers-section.stories.js.map +1 -1
- package/dist/components/test-and-save-form.d.ts +3 -3
- package/dist/components/test-and-save-form.d.ts.map +1 -1
- package/dist/components/test-and-save-form.js +7 -7
- package/dist/components/test-and-save-form.js.map +1 -1
- package/dist/core/harness-policy.d.ts +11 -0
- package/dist/core/harness-policy.d.ts.map +1 -0
- package/dist/core/harness-policy.js +71 -0
- package/dist/core/harness-policy.js.map +1 -0
- package/dist/core/model-provider-management-reducer.d.ts +51 -0
- package/dist/core/model-provider-management-reducer.d.ts.map +1 -0
- package/dist/core/model-provider-management-reducer.js +43 -0
- package/dist/core/model-provider-management-reducer.js.map +1 -0
- package/dist/core/models.d.ts +120 -0
- package/dist/core/models.d.ts.map +1 -0
- package/dist/core/models.js +3 -0
- package/dist/core/models.js.map +1 -0
- package/dist/core/onboarding-reducer.d.ts +36 -0
- package/dist/core/onboarding-reducer.d.ts.map +1 -0
- package/dist/core/onboarding-reducer.js +54 -0
- package/dist/core/onboarding-reducer.js.map +1 -0
- package/dist/core/provider-policy.d.ts +9 -0
- package/dist/core/provider-policy.d.ts.map +1 -0
- package/dist/core/provider-policy.js +37 -0
- package/dist/core/provider-policy.js.map +1 -0
- package/dist/feature.d.ts +18 -0
- package/dist/feature.d.ts.map +1 -1
- package/dist/feature.js +16 -1
- package/dist/feature.js.map +1 -1
- package/dist/hooks/api/model-provider-command-mapper.d.ts +11 -0
- package/dist/hooks/api/model-provider-command-mapper.d.ts.map +1 -0
- package/dist/hooks/api/model-provider-command-mapper.js +144 -0
- package/dist/hooks/api/model-provider-command-mapper.js.map +1 -0
- package/dist/hooks/api/model-provider-mapper.d.ts +11 -0
- package/dist/hooks/api/model-provider-mapper.d.ts.map +1 -0
- package/dist/hooks/api/model-provider-mapper.js +94 -0
- package/dist/hooks/api/model-provider-mapper.js.map +1 -0
- package/dist/hooks/api/model-providers.d.ts +64 -294
- package/dist/hooks/api/model-providers.d.ts.map +1 -1
- package/dist/hooks/api/model-providers.js +65 -48
- package/dist/hooks/api/model-providers.js.map +1 -1
- package/dist/pages/model-provider-onboarding-page.d.ts.map +1 -1
- package/dist/pages/model-provider-onboarding-page.js +57 -45
- package/dist/pages/model-provider-onboarding-page.js.map +1 -1
- package/dist/routes/agents-settings.d.ts +5 -0
- package/dist/routes/agents-settings.d.ts.map +1 -0
- package/dist/routes/agents-settings.js +21 -0
- package/dist/routes/agents-settings.js.map +1 -0
- package/dist/routes/inputs.d.ts +4 -0
- package/dist/routes/inputs.d.ts.map +1 -0
- package/dist/routes/inputs.js +12 -0
- package/dist/routes/inputs.js.map +1 -0
- package/dist/routes/model-provider.d.ts.map +1 -1
- package/dist/routes/model-provider.js +4 -5
- package/dist/routes/model-provider.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +9 -10
- package/src/components/available-provider-card.tsx +2 -2
- package/src/components/available-providers-grid.tsx +3 -3
- package/src/components/change-default-model-form.tsx +5 -6
- package/src/components/custom-model-provider-api-options.ts +3 -3
- package/src/components/custom-model-provider-form.stories.tsx +13 -13
- package/src/components/custom-model-provider-form.tsx +19 -12
- package/src/components/custom-model-provider-payload.test.ts +22 -22
- package/src/components/custom-model-provider-payload.ts +69 -54
- package/src/components/custom-model-provider-slug.test.ts +1 -1
- package/src/components/custom-model-provider-slug.ts +6 -3
- package/src/components/default-model-field.tsx +5 -5
- package/src/components/harness-availability.test.ts +13 -10
- package/src/components/harness-availability.ts +4 -28
- package/src/components/harnesses-section.tsx +7 -11
- package/src/components/model-provider-usage-modal.stories.tsx +18 -23
- package/src/components/model-provider-usage-modal.test.tsx +35 -7
- package/src/components/model-provider-usage-modal.tsx +12 -16
- package/src/components/model-provider-usage-target.ts +15 -18
- package/src/components/model-providers-section.stories.tsx +4 -1
- package/src/components/model-providers-section.tsx +112 -125
- package/src/components/test-and-save-form.tsx +13 -17
- package/src/core/harness-policy.test.ts +15 -0
- package/src/core/harness-policy.ts +83 -0
- package/src/core/model-provider-management-reducer.test.ts +59 -0
- package/src/core/model-provider-management-reducer.ts +72 -0
- package/src/core/models.ts +143 -0
- package/src/core/onboarding-reducer.test.ts +44 -0
- package/src/core/onboarding-reducer.ts +64 -0
- package/src/core/provider-policy.ts +53 -0
- package/src/feature.ts +17 -1
- package/src/hooks/api/model-provider-command-mapper.ts +122 -0
- package/src/hooks/api/model-provider-mapper.test.ts +27 -0
- package/src/hooks/api/model-provider-mapper.ts +120 -0
- package/src/hooks/api/model-providers.test.ts +15 -15
- package/src/hooks/api/model-providers.ts +175 -87
- package/src/pages/model-provider-onboarding-page.tsx +62 -56
- package/src/routes/agents-settings.tsx +14 -0
- package/src/routes/inputs.test.ts +11 -0
- package/src/routes/inputs.ts +9 -0
- package/src/routes/model-provider.tsx +4 -3
- package/test/fixtures/model-providers.ts +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/vercel.json +5 -0
- package/dist/components/provider-search.d.ts +0 -4
- package/dist/components/provider-search.d.ts.map +0 -1
- package/dist/components/provider-search.js +0 -13
- package/dist/components/provider-search.js.map +0 -1
- package/dist/components/supported-model-provider-catalog-entry.d.ts +0 -8
- package/dist/components/supported-model-provider-catalog-entry.d.ts.map +0 -1
- package/dist/components/supported-model-provider-catalog-entry.js +0 -9
- package/dist/components/supported-model-provider-catalog-entry.js.map +0 -1
- package/src/components/provider-search.test.ts +0 -45
- package/src/components/provider-search.ts +0 -18
- package/src/components/supported-model-provider-catalog-entry.ts +0 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hooks/api/model-providers.ts"],"sourcesContent":["import type {\n CreateCustomModelProviderBodyDto,\n CustomModelProviderConfigDto,\n DiscoverCustomModelProviderModelsBodyDto,\n DiscoverCustomModelProviderModelsBySlugBodyDto,\n DiscoverCustomModelProviderModelsResponseDto,\n ListModelProviderConfigsResponseDto,\n ModelProviderCatalogResponseDto,\n ModelProviderConfigDto,\n ModelProviderRef,\n SetDefaultHarnessBodyDto,\n SetDefaultHarnessResponseDto,\n SetDefaultModelProviderBodyDto,\n SetDefaultModelProviderResponseDto,\n SupportedModelProviderId,\n UpdateCustomModelProviderBodyDto,\n UpdateModelProviderConfigBodyDto,\n UpdateModelProviderDefaultModelBodyDto,\n} from '@shipfox/api-agent-dto';\nimport {apiRequest} from '@shipfox/client-api';\nimport {useMutation, useQuery, useQueryClient} from '@tanstack/react-query';\n\nexport const modelProviderQueryKeys = {\n all: ['model-providers'] as const,\n catalog: () => [...modelProviderQueryKeys.all, 'catalog'] as const,\n configs: (workspaceId: string) =>\n [...modelProviderQueryKeys.all, 'configs', workspaceId] as const,\n};\n\nexport async function getModelProviderCatalog({signal}: {signal?: AbortSignal} = {}) {\n return await apiRequest<ModelProviderCatalogResponseDto>('/agent/model-provider-catalog', {\n signal,\n });\n}\n\nexport async function listModelProviderConfigs({\n workspaceId,\n signal,\n}: {\n workspaceId: string;\n signal?: AbortSignal;\n}) {\n return await apiRequest<ListModelProviderConfigsResponseDto>(\n `/workspaces/${workspaceId}/agent/model-providers`,\n {signal},\n );\n}\n\nexport async function upsertModelProviderConfig({\n workspaceId,\n providerId,\n body,\n}: {\n workspaceId: string;\n providerId: SupportedModelProviderId;\n body: UpdateModelProviderConfigBodyDto;\n}) {\n return await apiRequest<ModelProviderConfigDto>(\n `/workspaces/${workspaceId}/agent/model-providers/${providerId}`,\n {method: 'PUT', body},\n );\n}\n\nexport async function createCustomModelProviderConfig({\n workspaceId,\n body,\n}: {\n workspaceId: string;\n body: CreateCustomModelProviderBodyDto;\n}) {\n return await apiRequest<CustomModelProviderConfigDto>(\n `/workspaces/${workspaceId}/agent/custom-model-providers`,\n {method: 'POST', body},\n );\n}\n\nexport async function updateCustomModelProviderConfig({\n workspaceId,\n providerId,\n body,\n}: {\n workspaceId: string;\n providerId: ModelProviderRef;\n body: UpdateCustomModelProviderBodyDto;\n}) {\n return await apiRequest<CustomModelProviderConfigDto>(\n `/workspaces/${workspaceId}/agent/custom-model-providers/${providerId}`,\n {method: 'PUT', body},\n );\n}\n\nexport async function discoverCustomModelProviderModels({\n workspaceId,\n body,\n}: {\n workspaceId: string;\n body: DiscoverCustomModelProviderModelsBodyDto;\n}) {\n return await apiRequest<DiscoverCustomModelProviderModelsResponseDto>(\n `/workspaces/${workspaceId}/agent/custom-model-providers/discover-models`,\n {method: 'POST', body},\n );\n}\n\nexport async function discoverCustomModelProviderModelsBySlug({\n workspaceId,\n providerId,\n body,\n}: {\n workspaceId: string;\n providerId: ModelProviderRef;\n body: DiscoverCustomModelProviderModelsBySlugBodyDto;\n}) {\n return await apiRequest<DiscoverCustomModelProviderModelsResponseDto>(\n `/workspaces/${workspaceId}/agent/custom-model-providers/${providerId}/discover-models`,\n {method: 'POST', body},\n );\n}\n\nexport async function deleteModelProviderConfig({\n workspaceId,\n providerId,\n}: {\n workspaceId: string;\n providerId: ModelProviderRef;\n}) {\n return await apiRequest<void>(`/workspaces/${workspaceId}/agent/model-providers/${providerId}`, {\n method: 'DELETE',\n });\n}\n\nexport async function updateModelProviderDefaultModel({\n workspaceId,\n providerId,\n body,\n}: {\n workspaceId: string;\n providerId: SupportedModelProviderId;\n body: UpdateModelProviderDefaultModelBodyDto;\n}) {\n return await apiRequest<ModelProviderConfigDto>(\n `/workspaces/${workspaceId}/agent/model-providers/${providerId}/default-model`,\n {method: 'PUT', body},\n );\n}\n\nexport async function setDefaultModelProvider({\n workspaceId,\n body,\n}: {\n workspaceId: string;\n body: SetDefaultModelProviderBodyDto;\n}) {\n return await apiRequest<SetDefaultModelProviderResponseDto>(\n `/workspaces/${workspaceId}/agent/default-model-provider`,\n {method: 'PUT', body},\n );\n}\n\nexport async function setDefaultHarness({\n workspaceId,\n body,\n}: {\n workspaceId: string;\n body: SetDefaultHarnessBodyDto;\n}) {\n return await apiRequest<SetDefaultHarnessResponseDto>(\n `/workspaces/${workspaceId}/agent/default-harness`,\n {method: 'PUT', body},\n );\n}\n\nexport function useModelProviderCatalogQuery() {\n return useQuery({\n queryKey: modelProviderQueryKeys.catalog(),\n queryFn: ({signal}) => getModelProviderCatalog({signal}),\n staleTime: 1000 * 60 * 60,\n });\n}\n\nexport function useModelProviderConfigsQuery(workspaceId: string | undefined) {\n return useQuery({\n queryKey: workspaceId\n ? modelProviderQueryKeys.configs(workspaceId)\n : [...modelProviderQueryKeys.all, 'configs'],\n enabled: Boolean(workspaceId),\n queryFn: ({signal}) => listModelProviderConfigs({workspaceId: workspaceId ?? '', signal}),\n });\n}\n\nexport function useUpsertModelProviderConfigMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: upsertModelProviderConfig,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useCreateCustomModelProviderMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: createCustomModelProviderConfig,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useUpdateCustomModelProviderMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: updateCustomModelProviderConfig,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useDiscoverCustomModelProviderModelsMutation() {\n return useMutation({mutationFn: discoverCustomModelProviderModels});\n}\n\nexport function useDiscoverCustomModelProviderModelsBySlugMutation() {\n return useMutation({mutationFn: discoverCustomModelProviderModelsBySlug});\n}\n\nexport function useDeleteModelProviderConfigMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: deleteModelProviderConfig,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useUpdateModelProviderDefaultModelMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: updateModelProviderDefaultModel,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useSetDefaultModelProviderMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: setDefaultModelProvider,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useSetDefaultHarnessMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: setDefaultHarness,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n"],"names":["apiRequest","useMutation","useQuery","useQueryClient","modelProviderQueryKeys","all","catalog","configs","workspaceId","getModelProviderCatalog","signal","listModelProviderConfigs","upsertModelProviderConfig","providerId","body","method","createCustomModelProviderConfig","updateCustomModelProviderConfig","discoverCustomModelProviderModels","discoverCustomModelProviderModelsBySlug","deleteModelProviderConfig","updateModelProviderDefaultModel","setDefaultModelProvider","setDefaultHarness","useModelProviderCatalogQuery","queryKey","queryFn","staleTime","useModelProviderConfigsQuery","enabled","Boolean","useUpsertModelProviderConfigMutation","queryClient","mutationFn","onSuccess","_config","variables","invalidateQueries","useCreateCustomModelProviderMutation","useUpdateCustomModelProviderMutation","useDiscoverCustomModelProviderModelsMutation","useDiscoverCustomModelProviderModelsBySlugMutation","useDeleteModelProviderConfigMutation","useUpdateModelProviderDefaultModelMutation","useSetDefaultModelProviderMutation","useSetDefaultHarnessMutation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/api/model-providers.ts"],"sourcesContent":["import {\n customModelProviderConfigDtoSchema,\n discoverCustomModelProviderModelsResponseSchema,\n listModelProviderConfigsResponseSchema,\n type ModelProviderRef,\n modelProviderCatalogResponseSchema,\n modelProviderConfigDtoSchema,\n setDefaultHarnessResponseSchema,\n setDefaultModelProviderResponseSchema,\n} from '@shipfox/api-agent-dto';\nimport {checkedApiRequest, emptyResponseSchema} from '@shipfox/client-api';\nimport {\n type FetchQueryOptions,\n queryOptions,\n useMutation,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query';\nimport type {\n AgentModel,\n CreateCustomProviderCommand,\n DefaultHarnessSelection,\n DefaultModelProviderSelection,\n DiscoverProviderModelsCommand,\n HarnessId,\n ProviderCatalog,\n ProviderConfig,\n ProviderConfiguration,\n ProviderCredentialsCommand,\n UpdateCustomProviderCommand,\n} from '#core/models.js';\nimport {\n toCreateCustomProviderBody,\n toDefaultHarnessBody,\n toDefaultModelBody,\n toDefaultProviderBody,\n toDiscoverModelsBody,\n toDiscoverModelsBySlugBody,\n toProviderCredentialsBody,\n toUpdateCustomProviderBody,\n} from './model-provider-command-mapper.js';\nimport {\n toDefaultHarnessSelection,\n toDefaultModelProviderSelection,\n toProviderCatalog,\n toProviderConfig,\n toProviderConfiguration,\n} from './model-provider-mapper.js';\n\nexport const modelProviderQueryKeys = {\n all: ['model-providers'] as const,\n catalog: () => [...modelProviderQueryKeys.all, 'catalog'] as const,\n configs: (workspaceId: string) =>\n [...modelProviderQueryKeys.all, 'configs', workspaceId] as const,\n};\n\ntype ModelProviderConfigsQueryKey =\n | ReturnType<typeof modelProviderQueryKeys.configs>\n | readonly ['model-providers', 'configs'];\n\ntype ModelProviderConfigsQueryOptions = FetchQueryOptions<\n ProviderConfiguration,\n Error,\n ProviderConfiguration,\n ModelProviderConfigsQueryKey\n>;\n\ntype ModelProviderCatalogQueryOptions = FetchQueryOptions<\n ProviderCatalog,\n Error,\n ProviderCatalog,\n ReturnType<typeof modelProviderQueryKeys.catalog>\n>;\n\nexport async function getModelProviderCatalog({\n signal,\n}: {\n signal?: AbortSignal;\n} = {}): Promise<ProviderCatalog> {\n return toProviderCatalog(\n await checkedApiRequest(modelProviderCatalogResponseSchema, '/agent/model-provider-catalog', {\n signal,\n }),\n );\n}\n\nexport async function listModelProviderConfigs({\n workspaceId,\n signal,\n}: {\n workspaceId: string;\n signal?: AbortSignal;\n}): Promise<ProviderConfiguration> {\n return toProviderConfiguration(\n await checkedApiRequest(\n listModelProviderConfigsResponseSchema,\n `/workspaces/${workspaceId}/agent/model-providers`,\n {signal},\n ),\n );\n}\n\nexport function modelProviderConfigsQueryOptions(\n workspaceId: string | undefined,\n): ModelProviderConfigsQueryOptions {\n return queryOptions({\n queryKey: workspaceId\n ? modelProviderQueryKeys.configs(workspaceId)\n : ([...modelProviderQueryKeys.all, 'configs'] as const),\n enabled: Boolean(workspaceId),\n queryFn: ({signal}) => listModelProviderConfigs({workspaceId: workspaceId ?? '', signal}),\n });\n}\n\nexport async function upsertModelProviderConfig({\n workspaceId,\n providerId,\n command,\n}: {\n workspaceId: string;\n providerId: string;\n command: ProviderCredentialsCommand;\n}): Promise<ProviderConfig> {\n return toProviderConfig(\n await checkedApiRequest(\n modelProviderConfigDtoSchema,\n `/workspaces/${workspaceId}/agent/model-providers/${providerId}`,\n {method: 'PUT', body: toProviderCredentialsBody(command)},\n ),\n );\n}\n\nexport async function createCustomModelProviderConfig({\n workspaceId,\n command,\n}: {\n workspaceId: string;\n command: CreateCustomProviderCommand;\n}): Promise<ProviderConfig> {\n return toProviderConfig(\n await checkedApiRequest(\n customModelProviderConfigDtoSchema,\n `/workspaces/${workspaceId}/agent/custom-model-providers`,\n {method: 'POST', body: toCreateCustomProviderBody(command)},\n ),\n );\n}\n\nexport async function updateCustomModelProviderConfig({\n workspaceId,\n providerId,\n command,\n}: {\n workspaceId: string;\n providerId: ModelProviderRef;\n command: UpdateCustomProviderCommand;\n}): Promise<ProviderConfig> {\n return toProviderConfig(\n await checkedApiRequest(\n customModelProviderConfigDtoSchema,\n `/workspaces/${workspaceId}/agent/custom-model-providers/${providerId}`,\n {method: 'PUT', body: toUpdateCustomProviderBody(command)},\n ),\n );\n}\n\nexport async function discoverCustomModelProviderModels({\n workspaceId,\n command,\n}: {\n workspaceId: string;\n command: DiscoverProviderModelsCommand;\n}): Promise<readonly AgentModel[]> {\n const response = await checkedApiRequest(\n discoverCustomModelProviderModelsResponseSchema,\n `/workspaces/${workspaceId}/agent/custom-model-providers/discover-models`,\n {method: 'POST', body: toDiscoverModelsBody(command)},\n );\n return response.models.map((model) => ({id: model.id, label: model.label}));\n}\n\nexport async function discoverCustomModelProviderModelsBySlug({\n workspaceId,\n providerId,\n command,\n}: {\n workspaceId: string;\n providerId: ModelProviderRef;\n command: DiscoverProviderModelsCommand;\n}): Promise<readonly AgentModel[]> {\n const response = await checkedApiRequest(\n discoverCustomModelProviderModelsResponseSchema,\n `/workspaces/${workspaceId}/agent/custom-model-providers/${providerId}/discover-models`,\n {method: 'POST', body: toDiscoverModelsBySlugBody(command)},\n );\n return response.models.map((model) => ({id: model.id, label: model.label}));\n}\n\nexport async function deleteModelProviderConfig({\n workspaceId,\n providerId,\n}: {\n workspaceId: string;\n providerId: ModelProviderRef;\n}) {\n return await checkedApiRequest(\n emptyResponseSchema,\n `/workspaces/${workspaceId}/agent/model-providers/${providerId}`,\n {method: 'DELETE'},\n );\n}\n\nexport async function updateModelProviderDefaultModel({\n workspaceId,\n providerId,\n defaultModel,\n}: {\n workspaceId: string;\n providerId: string;\n defaultModel: string | null;\n}): Promise<ProviderConfig> {\n return toProviderConfig(\n await checkedApiRequest(\n modelProviderConfigDtoSchema,\n `/workspaces/${workspaceId}/agent/model-providers/${providerId}/default-model`,\n {method: 'PUT', body: toDefaultModelBody(defaultModel)},\n ),\n );\n}\n\nexport async function setDefaultModelProvider({\n workspaceId,\n providerId,\n}: {\n workspaceId: string;\n providerId: string;\n}): Promise<DefaultModelProviderSelection> {\n return toDefaultModelProviderSelection(\n await checkedApiRequest(\n setDefaultModelProviderResponseSchema,\n `/workspaces/${workspaceId}/agent/default-model-provider`,\n {method: 'PUT', body: toDefaultProviderBody(providerId)},\n ),\n );\n}\n\nexport async function setDefaultHarness({\n workspaceId,\n harnessId,\n}: {\n workspaceId: string;\n harnessId: HarnessId;\n}): Promise<DefaultHarnessSelection> {\n return toDefaultHarnessSelection(\n await checkedApiRequest(\n setDefaultHarnessResponseSchema,\n `/workspaces/${workspaceId}/agent/default-harness`,\n {method: 'PUT', body: toDefaultHarnessBody(harnessId)},\n ),\n );\n}\n\nexport function useModelProviderCatalogQuery() {\n return useQuery(modelProviderCatalogQueryOptions());\n}\n\nexport function modelProviderCatalogQueryOptions(): ModelProviderCatalogQueryOptions {\n return queryOptions({\n queryKey: modelProviderQueryKeys.catalog(),\n queryFn: ({signal}) => getModelProviderCatalog({signal}),\n staleTime: 1000 * 60 * 60,\n });\n}\n\nexport function useModelProviderConfigsQuery(workspaceId: string | undefined) {\n return useQuery(modelProviderConfigsQueryOptions(workspaceId));\n}\n\nexport function useUpsertModelProviderConfigMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: upsertModelProviderConfig,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useCreateCustomModelProviderMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: createCustomModelProviderConfig,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useUpdateCustomModelProviderMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: updateCustomModelProviderConfig,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useDiscoverCustomModelProviderModelsMutation() {\n return useMutation({mutationFn: discoverCustomModelProviderModels});\n}\n\nexport function useDiscoverCustomModelProviderModelsBySlugMutation() {\n return useMutation({mutationFn: discoverCustomModelProviderModelsBySlug});\n}\n\nexport function useDeleteModelProviderConfigMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: deleteModelProviderConfig,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useUpdateModelProviderDefaultModelMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: updateModelProviderDefaultModel,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useSetDefaultModelProviderMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: setDefaultModelProvider,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n\nexport function useSetDefaultHarnessMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: setDefaultHarness,\n onSuccess: async (_config, variables) => {\n await queryClient.invalidateQueries({\n queryKey: modelProviderQueryKeys.configs(variables.workspaceId),\n });\n },\n });\n}\n"],"names":["customModelProviderConfigDtoSchema","discoverCustomModelProviderModelsResponseSchema","listModelProviderConfigsResponseSchema","modelProviderCatalogResponseSchema","modelProviderConfigDtoSchema","setDefaultHarnessResponseSchema","setDefaultModelProviderResponseSchema","checkedApiRequest","emptyResponseSchema","queryOptions","useMutation","useQuery","useQueryClient","toCreateCustomProviderBody","toDefaultHarnessBody","toDefaultModelBody","toDefaultProviderBody","toDiscoverModelsBody","toDiscoverModelsBySlugBody","toProviderCredentialsBody","toUpdateCustomProviderBody","toDefaultHarnessSelection","toDefaultModelProviderSelection","toProviderCatalog","toProviderConfig","toProviderConfiguration","modelProviderQueryKeys","all","catalog","configs","workspaceId","getModelProviderCatalog","signal","listModelProviderConfigs","modelProviderConfigsQueryOptions","queryKey","enabled","Boolean","queryFn","upsertModelProviderConfig","providerId","command","method","body","createCustomModelProviderConfig","updateCustomModelProviderConfig","discoverCustomModelProviderModels","response","models","map","model","id","label","discoverCustomModelProviderModelsBySlug","deleteModelProviderConfig","updateModelProviderDefaultModel","defaultModel","setDefaultModelProvider","setDefaultHarness","harnessId","useModelProviderCatalogQuery","modelProviderCatalogQueryOptions","staleTime","useModelProviderConfigsQuery","useUpsertModelProviderConfigMutation","queryClient","mutationFn","onSuccess","_config","variables","invalidateQueries","useCreateCustomModelProviderMutation","useUpdateCustomModelProviderMutation","useDiscoverCustomModelProviderModelsMutation","useDiscoverCustomModelProviderModelsBySlugMutation","useDeleteModelProviderConfigMutation","useUpdateModelProviderDefaultModelMutation","useSetDefaultModelProviderMutation","useSetDefaultHarnessMutation"],"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":"
|
|
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,5 +1,4 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { DEFAULT_HARNESS, harnessSupportsProvider, listHarnessDescriptors } from '@shipfox/api-agent-dto';
|
|
3
2
|
import { QueryLoadError } from '@shipfox/client-ui';
|
|
4
3
|
import { Button } from '@shipfox/react-ui/button';
|
|
5
4
|
import { Callout } from '@shipfox/react-ui/callout';
|
|
@@ -10,32 +9,32 @@ import { Skeleton } from '@shipfox/react-ui/skeleton';
|
|
|
10
9
|
import { toast } from '@shipfox/react-ui/toast';
|
|
11
10
|
import { Header, Text } from '@shipfox/react-ui/typography';
|
|
12
11
|
import { cn } from '@shipfox/react-ui/utils';
|
|
13
|
-
import { useEffect, useMemo,
|
|
12
|
+
import { useEffect, useMemo, useReducer } from 'react';
|
|
14
13
|
import { AvailableProvidersGrid, PROVIDER_GRID_CLASS } from '#components/available-providers-grid.js';
|
|
15
14
|
import { modelProviderConfigErrorToFormError } from '#components/form-errors.js';
|
|
16
15
|
import { ModelProviderTestAndSaveForm } from '#components/test-and-save-form.js';
|
|
16
|
+
import { DEFAULT_HARNESS, harnessSupportsProvider, listHarnesses } from '#core/harness-policy.js';
|
|
17
|
+
import { initialOnboardingState, onboardingReducer } from '#core/onboarding-reducer.js';
|
|
18
|
+
import { isSupportedProvider } from '#core/provider-policy.js';
|
|
17
19
|
import { useModelProviderCatalogQuery, useSetDefaultHarnessMutation } from '#hooks/api/model-providers.js';
|
|
18
20
|
import { dismissModelProviderOnboarding } from '#state/model-provider-onboarding.js';
|
|
19
21
|
const SURFACE_CLASS = 'overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base';
|
|
20
22
|
export function ModelProviderOnboardingPage({ workspaceId, onSkip, onConfigured }) {
|
|
21
23
|
const catalogQuery = useModelProviderCatalogQuery();
|
|
22
24
|
const setDefaultHarness = useSetDefaultHarnessMutation();
|
|
23
|
-
const [
|
|
24
|
-
const
|
|
25
|
-
const [defaultHarnessError, setDefaultHarnessError] = useState();
|
|
26
|
-
const [isSettingDefaultHarness, setIsSettingDefaultHarness] = useState(false);
|
|
27
|
-
const supportedProviders = catalogQuery.data?.providers.filter((provider)=>provider.support_status === 'supported') ?? [];
|
|
25
|
+
const [onboarding, dispatch] = useReducer(onboardingReducer, initialOnboardingState);
|
|
26
|
+
const supportedProviders = catalogQuery.data?.providers.filter(isSupportedProvider) ?? [];
|
|
28
27
|
const filteredProviders = useMemo(()=>{
|
|
29
|
-
if (
|
|
30
|
-
return supportedProviders.filter((provider)=>harnessSupportsProvider(
|
|
28
|
+
if (onboarding.step === 'choose-harness') return [];
|
|
29
|
+
return supportedProviders.filter((provider)=>harnessSupportsProvider(onboarding.harnessId, provider.id));
|
|
31
30
|
}, [
|
|
32
|
-
|
|
31
|
+
onboarding,
|
|
33
32
|
supportedProviders
|
|
34
33
|
]);
|
|
35
34
|
useEffect(()=>{
|
|
36
|
-
document.getElementById(
|
|
35
|
+
document.getElementById(onboarding.step === 'choose-harness' ? 'model-provider-harness-step' : 'model-provider-provider-step')?.focus();
|
|
37
36
|
}, [
|
|
38
|
-
|
|
37
|
+
onboarding.step
|
|
39
38
|
]);
|
|
40
39
|
function handleSkip() {
|
|
41
40
|
try {
|
|
@@ -46,32 +45,39 @@ export function ModelProviderOnboardingPage({ workspaceId, onSkip, onConfigured
|
|
|
46
45
|
onSkip();
|
|
47
46
|
}
|
|
48
47
|
async function handleProviderSaved() {
|
|
49
|
-
if (
|
|
50
|
-
|
|
51
|
-
if (
|
|
52
|
-
|
|
48
|
+
if (onboarding.step !== 'configure-provider' && onboarding.step !== 'saving-default-harness') return;
|
|
49
|
+
const provider = onboarding.provider;
|
|
50
|
+
if (onboarding.step === 'configure-provider') dispatch({
|
|
51
|
+
type: 'provider-saved'
|
|
52
|
+
});
|
|
53
|
+
if (onboarding.harnessId === DEFAULT_HARNESS) {
|
|
54
|
+
toast.success(`${provider.label} saved`);
|
|
55
|
+
dispatch({
|
|
56
|
+
type: 'default-harness-saved'
|
|
57
|
+
});
|
|
53
58
|
onConfigured();
|
|
54
59
|
return;
|
|
55
60
|
}
|
|
56
|
-
setIsSettingDefaultHarness(true);
|
|
57
61
|
try {
|
|
58
62
|
await setDefaultHarness.mutateAsync({
|
|
59
63
|
workspaceId,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
harnessId: onboarding.harnessId
|
|
65
|
+
});
|
|
66
|
+
toast.success(`${provider.label} saved`);
|
|
67
|
+
dispatch({
|
|
68
|
+
type: 'default-harness-saved'
|
|
63
69
|
});
|
|
64
|
-
toast.success(`${selectedEntry.label} saved`);
|
|
65
70
|
onConfigured();
|
|
66
71
|
} catch (error) {
|
|
67
72
|
const mapped = modelProviderConfigErrorToFormError(error);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
73
|
+
dispatch({
|
|
74
|
+
type: 'default-harness-failed',
|
|
75
|
+
message: mapped.message || 'Could not save default harness. Try again.'
|
|
76
|
+
});
|
|
71
77
|
}
|
|
72
78
|
}
|
|
73
|
-
const selectedHarnessDescriptor =
|
|
74
|
-
const headingId =
|
|
79
|
+
const selectedHarnessDescriptor = onboarding.step === 'choose-harness' ? null : listHarnesses().find((harness)=>harness.id === onboarding.harnessId);
|
|
80
|
+
const headingId = onboarding.step === 'choose-harness' ? 'model-provider-harness-step' : 'model-provider-provider-step';
|
|
75
81
|
return /*#__PURE__*/ _jsxs("div", {
|
|
76
82
|
className: "mx-auto flex w-full max-w-[640px] flex-col gap-20",
|
|
77
83
|
children: [
|
|
@@ -107,15 +113,20 @@ export function ModelProviderOnboardingPage({ workspaceId, onSkip, onConfigured
|
|
|
107
113
|
/*#__PURE__*/ _jsx("section", {
|
|
108
114
|
"aria-labelledby": headingId,
|
|
109
115
|
className: "flex flex-col gap-16",
|
|
110
|
-
children:
|
|
111
|
-
onSelect:
|
|
116
|
+
children: onboarding.step === 'choose-harness' ? /*#__PURE__*/ _jsx(HarnessPicker, {
|
|
117
|
+
onSelect: (harnessId)=>dispatch({
|
|
118
|
+
type: 'harness-selected',
|
|
119
|
+
harnessId
|
|
120
|
+
})
|
|
112
121
|
}) : /*#__PURE__*/ _jsxs(_Fragment, {
|
|
113
122
|
children: [
|
|
114
123
|
/*#__PURE__*/ _jsx("div", {
|
|
115
124
|
children: /*#__PURE__*/ _jsx(Button, {
|
|
116
125
|
type: "button",
|
|
117
126
|
variant: "transparent",
|
|
118
|
-
onClick: ()=>
|
|
127
|
+
onClick: ()=>dispatch({
|
|
128
|
+
type: 'back'
|
|
129
|
+
}),
|
|
119
130
|
children: "Back"
|
|
120
131
|
})
|
|
121
132
|
}),
|
|
@@ -123,37 +134,38 @@ export function ModelProviderOnboardingPage({ workspaceId, onSkip, onConfigured
|
|
|
123
134
|
catalogQuery: catalogQuery,
|
|
124
135
|
supportedProviders: filteredProviders,
|
|
125
136
|
onSelect: (entry)=>{
|
|
126
|
-
|
|
127
|
-
|
|
137
|
+
dispatch({
|
|
138
|
+
type: 'provider-selected',
|
|
139
|
+
provider: entry
|
|
140
|
+
});
|
|
128
141
|
}
|
|
129
|
-
},
|
|
142
|
+
}, onboarding.harnessId)
|
|
130
143
|
]
|
|
131
144
|
})
|
|
132
145
|
}),
|
|
133
146
|
/*#__PURE__*/ _jsx(Modal, {
|
|
134
|
-
open:
|
|
147
|
+
open: onboarding.step === 'configure-provider' || onboarding.step === 'saving-default-harness',
|
|
135
148
|
onOpenChange: (open)=>{
|
|
136
|
-
if (!open &&
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
149
|
+
if (!open && onboarding.step === 'configure-provider') dispatch({
|
|
150
|
+
type: 'back'
|
|
151
|
+
});
|
|
140
152
|
},
|
|
141
153
|
children: /*#__PURE__*/ _jsxs(ModalContent, {
|
|
142
154
|
"aria-describedby": undefined,
|
|
143
155
|
children: [
|
|
144
156
|
/*#__PURE__*/ _jsx(ModalTitle, {
|
|
145
157
|
className: "sr-only",
|
|
146
|
-
children:
|
|
158
|
+
children: onboarding.step === 'configure-provider' || onboarding.step === 'saving-default-harness' ? `Configure ${onboarding.provider.label}` : ''
|
|
147
159
|
}),
|
|
148
160
|
/*#__PURE__*/ _jsx(ModalHeader, {
|
|
149
161
|
children: /*#__PURE__*/ _jsx(Text, {
|
|
150
162
|
size: "lg",
|
|
151
163
|
"aria-hidden": "true",
|
|
152
164
|
className: "overflow-ellipsis overflow-hidden whitespace-nowrap",
|
|
153
|
-
children:
|
|
165
|
+
children: onboarding.step === 'configure-provider' || onboarding.step === 'saving-default-harness' ? `Configure ${onboarding.provider.label}` : ''
|
|
154
166
|
})
|
|
155
167
|
}),
|
|
156
|
-
|
|
168
|
+
onboarding.step === 'saving-default-harness' ? /*#__PURE__*/ _jsx("div", {
|
|
157
169
|
role: "status",
|
|
158
170
|
className: "px-20 pb-8",
|
|
159
171
|
children: /*#__PURE__*/ _jsx(Text, {
|
|
@@ -162,7 +174,7 @@ export function ModelProviderOnboardingPage({ workspaceId, onSkip, onConfigured
|
|
|
162
174
|
children: "Saving harness default..."
|
|
163
175
|
})
|
|
164
176
|
}) : null,
|
|
165
|
-
|
|
177
|
+
onboarding.step === 'saving-default-harness' && onboarding.error ? /*#__PURE__*/ _jsx("div", {
|
|
166
178
|
className: "px-20 pb-8",
|
|
167
179
|
children: /*#__PURE__*/ _jsx(Callout, {
|
|
168
180
|
role: "alert",
|
|
@@ -177,15 +189,15 @@ export function ModelProviderOnboardingPage({ workspaceId, onSkip, onConfigured
|
|
|
177
189
|
}),
|
|
178
190
|
/*#__PURE__*/ _jsx(Text, {
|
|
179
191
|
size: "sm",
|
|
180
|
-
children:
|
|
192
|
+
children: onboarding.error
|
|
181
193
|
})
|
|
182
194
|
]
|
|
183
195
|
})
|
|
184
196
|
})
|
|
185
197
|
}) : null,
|
|
186
|
-
|
|
198
|
+
onboarding.step === 'configure-provider' || onboarding.step === 'saving-default-harness' ? /*#__PURE__*/ _jsx(ModelProviderTestAndSaveForm, {
|
|
187
199
|
workspaceId: workspaceId,
|
|
188
|
-
entry:
|
|
200
|
+
entry: onboarding.provider,
|
|
189
201
|
setAsDefaultOnSave: true,
|
|
190
202
|
onSaved: ()=>{
|
|
191
203
|
void handleProviderSaved();
|
|
@@ -201,7 +213,7 @@ function HarnessPicker({ onSelect }) {
|
|
|
201
213
|
return /*#__PURE__*/ _jsx("ul", {
|
|
202
214
|
className: PROVIDER_GRID_CLASS,
|
|
203
215
|
"aria-label": "Agent harnesses",
|
|
204
|
-
children:
|
|
216
|
+
children: listHarnesses().map((harness)=>/*#__PURE__*/ _jsx(HarnessCard, {
|
|
205
217
|
harness: harness,
|
|
206
218
|
onChoose: ()=>onSelect(harness.id)
|
|
207
219
|
}, harness.id))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pages/model-provider-onboarding-page.tsx"],"sourcesContent":["import {\n DEFAULT_HARNESS,\n type Harness,\n type HarnessDescriptor,\n harnessSupportsProvider,\n listHarnessDescriptors,\n type ModelProviderCatalogEntryDto,\n} from '@shipfox/api-agent-dto';\nimport {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Modal, ModalContent, ModalHeader, ModalTitle} from '@shipfox/react-ui/modal';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Header, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {useEffect, useMemo, useState} from 'react';\nimport {AvailableProvidersGrid, PROVIDER_GRID_CLASS} from '#components/available-providers-grid.js';\nimport {modelProviderConfigErrorToFormError} from '#components/form-errors.js';\nimport {ModelProviderTestAndSaveForm} from '#components/test-and-save-form.js';\nimport {\n useModelProviderCatalogQuery,\n useSetDefaultHarnessMutation,\n} from '#hooks/api/model-providers.js';\nimport {dismissModelProviderOnboarding} from '#state/model-provider-onboarding.js';\n\nconst SURFACE_CLASS =\n 'overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base';\n\nexport function ModelProviderOnboardingPage({\n workspaceId,\n onSkip,\n onConfigured,\n}: {\n workspaceId: string;\n onSkip: () => void;\n onConfigured: () => void;\n}) {\n const catalogQuery = useModelProviderCatalogQuery();\n const setDefaultHarness = useSetDefaultHarnessMutation();\n const [selectedHarness, setSelectedHarness] = useState<Harness | null>(null);\n const [selectedEntry, setSelectedEntry] = useState<ModelProviderCatalogEntryDto | null>(null);\n const [defaultHarnessError, setDefaultHarnessError] = useState<string | undefined>();\n const [isSettingDefaultHarness, setIsSettingDefaultHarness] = useState(false);\n const supportedProviders =\n catalogQuery.data?.providers.filter((provider) => provider.support_status === 'supported') ??\n [];\n const filteredProviders = useMemo(() => {\n if (selectedHarness === null) return [];\n return supportedProviders.filter((provider) =>\n harnessSupportsProvider(selectedHarness, provider.id),\n );\n }, [selectedHarness, supportedProviders]);\n\n useEffect(() => {\n document\n .getElementById(\n selectedHarness === null ? 'model-provider-harness-step' : 'model-provider-provider-step',\n )\n ?.focus();\n }, [selectedHarness]);\n\n function handleSkip() {\n try {\n dismissModelProviderOnboarding(workspaceId);\n } catch {\n // Skip is best-effort persistence; access to the product must not depend on storage.\n }\n onSkip();\n }\n\n async function handleProviderSaved() {\n if (selectedEntry === null || selectedHarness === null) return;\n\n setDefaultHarnessError(undefined);\n if (selectedHarness === DEFAULT_HARNESS) {\n toast.success(`${selectedEntry.label} saved`);\n onConfigured();\n return;\n }\n\n setIsSettingDefaultHarness(true);\n try {\n await setDefaultHarness.mutateAsync({\n workspaceId,\n body: {harness_id: selectedHarness},\n });\n toast.success(`${selectedEntry.label} saved`);\n onConfigured();\n } catch (error) {\n const mapped = modelProviderConfigErrorToFormError(error);\n setDefaultHarnessError(mapped.message || 'Could not save default harness. Try again.');\n } finally {\n setIsSettingDefaultHarness(false);\n }\n }\n\n const selectedHarnessDescriptor =\n selectedHarness === null\n ? null\n : listHarnessDescriptors().find((harness) => harness.id === selectedHarness);\n const headingId =\n selectedHarness === null ? 'model-provider-harness-step' : 'model-provider-provider-step';\n\n return (\n <div className=\"mx-auto flex w-full max-w-[640px] flex-col gap-20\">\n <header className=\"flex flex-col gap-12\">\n <div className=\"flex items-start justify-between gap-16 max-[520px]:flex-col max-[520px]:gap-8\">\n <Header id={headingId} variant=\"h1\" tabIndex={-1} className=\"outline-none\">\n {selectedHarnessDescriptor\n ? `Configure ${selectedHarnessDescriptor.label}`\n : 'Choose agent harness'}\n </Header>\n <Button type=\"button\" variant=\"secondary\" onClick={handleSkip} className=\"shrink-0\">\n Skip for now\n </Button>\n </div>\n <Text size=\"md\" className=\"text-foreground-neutral-muted\">\n {selectedHarnessDescriptor\n ? `${selectedHarnessDescriptor.label} needs a compatible model provider. Add your own API key, or go back to choose a different harness.`\n : 'A harness runs agent steps. Choose the engine you want first, then connect a compatible model provider.'}\n </Text>\n </header>\n\n <section aria-labelledby={headingId} className=\"flex flex-col gap-16\">\n {selectedHarness === null ? (\n <HarnessPicker onSelect={setSelectedHarness} />\n ) : (\n <>\n <div>\n <Button type=\"button\" variant=\"transparent\" onClick={() => setSelectedHarness(null)}>\n Back\n </Button>\n </div>\n <ModelProviderPicker\n key={selectedHarness}\n catalogQuery={catalogQuery}\n supportedProviders={filteredProviders}\n onSelect={(entry) => {\n setDefaultHarnessError(undefined);\n setSelectedEntry(entry);\n }}\n />\n </>\n )}\n </section>\n\n <Modal\n open={selectedEntry !== null}\n onOpenChange={(open) => {\n if (!open && !isSettingDefaultHarness) {\n setSelectedEntry(null);\n setDefaultHarnessError(undefined);\n }\n }}\n >\n <ModalContent aria-describedby={undefined}>\n <ModalTitle className=\"sr-only\">\n {selectedEntry ? `Configure ${selectedEntry.label}` : ''}\n </ModalTitle>\n <ModalHeader>\n <Text\n size=\"lg\"\n aria-hidden=\"true\"\n className=\"overflow-ellipsis overflow-hidden whitespace-nowrap\"\n >\n {selectedEntry ? `Configure ${selectedEntry.label}` : ''}\n </Text>\n </ModalHeader>\n {isSettingDefaultHarness ? (\n <div role=\"status\" className=\"px-20 pb-8\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Saving harness default...\n </Text>\n </div>\n ) : null}\n {defaultHarnessError ? (\n <div className=\"px-20 pb-8\">\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-8\">\n <Text size=\"sm\" bold>\n Could not save default harness\n </Text>\n <Text size=\"sm\">{defaultHarnessError}</Text>\n </div>\n </Callout>\n </div>\n ) : null}\n {selectedEntry ? (\n <ModelProviderTestAndSaveForm\n workspaceId={workspaceId}\n entry={selectedEntry}\n setAsDefaultOnSave\n onSaved={() => {\n void handleProviderSaved();\n }}\n />\n ) : null}\n </ModalContent>\n </Modal>\n </div>\n );\n}\n\nfunction HarnessPicker({onSelect}: {onSelect: (harness: Harness) => void}) {\n return (\n <ul className={PROVIDER_GRID_CLASS} aria-label=\"Agent harnesses\">\n {listHarnessDescriptors().map((harness) => (\n <HarnessCard key={harness.id} harness={harness} onChoose={() => onSelect(harness.id)} />\n ))}\n </ul>\n );\n}\n\nfunction HarnessCard({harness, onChoose}: {harness: HarnessDescriptor; onChoose: () => void}) {\n return (\n <li>\n <button\n type=\"button\"\n className={cn(\n 'group block w-full cursor-pointer p-16 text-left outline-none transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus',\n SURFACE_CLASS,\n )}\n aria-label={`Choose ${harness.label}`}\n onClick={onChoose}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-12\">\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Text size=\"md\" bold className=\"min-w-0 truncate\">\n {harness.label}\n </Text>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {harness.description}\n </Text>\n </div>\n <div className=\"flex shrink-0 items-center gap-4 text-foreground-neutral-muted transition-colors group-hover:text-foreground-highlight-interactive\">\n <Text size=\"sm\">Choose</Text>\n <Icon name=\"chevronRight\" className=\"size-16\" />\n </div>\n </div>\n </button>\n </li>\n );\n}\n\nfunction ModelProviderPicker({\n catalogQuery,\n supportedProviders,\n onSelect,\n}: {\n catalogQuery: ReturnType<typeof useModelProviderCatalogQuery>;\n supportedProviders: ModelProviderCatalogEntryDto[];\n onSelect: (entry: ModelProviderCatalogEntryDto) => void;\n}) {\n if (catalogQuery.isPending) {\n return (\n <div role=\"status\" aria-busy=\"true\" aria-label=\"Loading model providers\">\n <ModelProviderGridSkeleton />\n </div>\n );\n }\n\n if (catalogQuery.isError && catalogQuery.data === undefined) {\n return <QueryLoadError query={catalogQuery} subject=\"model provider catalog\" />;\n }\n\n if (catalogQuery.data !== undefined && supportedProviders.length === 0) {\n return (\n <EmptyState\n icon=\"componentLine\"\n title=\"No providers available to configure\"\n description=\"Skip for now and add one later from workspace settings.\"\n />\n );\n }\n\n return <AvailableProvidersGrid entries={supportedProviders} onSelect={onSelect} />;\n}\n\nfunction ModelProviderGridSkeleton() {\n return (\n <div 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":["DEFAULT_HARNESS","harnessSupportsProvider","listHarnessDescriptors","QueryLoadError","Button","Callout","EmptyState","Icon","Modal","ModalContent","ModalHeader","ModalTitle","Skeleton","toast","Header","Text","cn","useEffect","useMemo","useState","AvailableProvidersGrid","PROVIDER_GRID_CLASS","modelProviderConfigErrorToFormError","ModelProviderTestAndSaveForm","useModelProviderCatalogQuery","useSetDefaultHarnessMutation","dismissModelProviderOnboarding","SURFACE_CLASS","ModelProviderOnboardingPage","workspaceId","onSkip","onConfigured","catalogQuery","setDefaultHarness","selectedHarness","setSelectedHarness","selectedEntry","setSelectedEntry","defaultHarnessError","setDefaultHarnessError","isSettingDefaultHarness","setIsSettingDefaultHarness","supportedProviders","data","providers","filter","provider","support_status","filteredProviders","id","document","getElementById","focus","handleSkip","handleProviderSaved","undefined","success","label","mutateAsync","body","harness_id","error","mapped","message","selectedHarnessDescriptor","find","harness","headingId","div","className","header","variant","tabIndex","type","onClick","size","section","aria-labelledby","HarnessPicker","onSelect","ModelProviderPicker","entry","open","onOpenChange","aria-describedby","aria-hidden","role","bold","setAsDefaultOnSave","onSaved","ul","aria-label","map","HarnessCard","onChoose","li","button","description","name","isPending","aria-busy","ModelProviderGridSkeleton","isError","query","subject","length","icon","title","entries","card"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/pages/model-provider-onboarding-page.tsx"],"sourcesContent":["import {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Modal, ModalContent, ModalHeader, ModalTitle} from '@shipfox/react-ui/modal';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Header, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {useEffect, useMemo, useReducer} from 'react';\nimport {AvailableProvidersGrid, PROVIDER_GRID_CLASS} from '#components/available-providers-grid.js';\nimport {modelProviderConfigErrorToFormError} from '#components/form-errors.js';\nimport {ModelProviderTestAndSaveForm} from '#components/test-and-save-form.js';\nimport {DEFAULT_HARNESS, harnessSupportsProvider, listHarnesses} from '#core/harness-policy.js';\nimport type {HarnessDescriptor, HarnessId, SupportedProvider} from '#core/models.js';\nimport {initialOnboardingState, onboardingReducer} from '#core/onboarding-reducer.js';\nimport {isSupportedProvider} from '#core/provider-policy.js';\nimport {\n useModelProviderCatalogQuery,\n useSetDefaultHarnessMutation,\n} from '#hooks/api/model-providers.js';\nimport {dismissModelProviderOnboarding} from '#state/model-provider-onboarding.js';\n\nconst SURFACE_CLASS =\n 'overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base';\n\nexport function ModelProviderOnboardingPage({\n workspaceId,\n onSkip,\n onConfigured,\n}: {\n workspaceId: string;\n onSkip: () => void;\n onConfigured: () => void;\n}) {\n const catalogQuery = useModelProviderCatalogQuery();\n const setDefaultHarness = useSetDefaultHarnessMutation();\n const [onboarding, dispatch] = useReducer(onboardingReducer, initialOnboardingState);\n const supportedProviders = catalogQuery.data?.providers.filter(isSupportedProvider) ?? [];\n const filteredProviders = useMemo(() => {\n if (onboarding.step === 'choose-harness') return [];\n return supportedProviders.filter((provider) =>\n harnessSupportsProvider(onboarding.harnessId, provider.id),\n );\n }, [onboarding, supportedProviders]);\n\n useEffect(() => {\n document\n .getElementById(\n onboarding.step === 'choose-harness'\n ? 'model-provider-harness-step'\n : 'model-provider-provider-step',\n )\n ?.focus();\n }, [onboarding.step]);\n\n function handleSkip() {\n try {\n dismissModelProviderOnboarding(workspaceId);\n } catch {\n // Skip is best-effort persistence; access to the product must not depend on storage.\n }\n onSkip();\n }\n\n async function handleProviderSaved() {\n if (onboarding.step !== 'configure-provider' && onboarding.step !== 'saving-default-harness')\n return;\n\n const provider = onboarding.provider;\n if (onboarding.step === 'configure-provider') dispatch({type: 'provider-saved'});\n if (onboarding.harnessId === DEFAULT_HARNESS) {\n toast.success(`${provider.label} saved`);\n dispatch({type: 'default-harness-saved'});\n onConfigured();\n return;\n }\n\n try {\n await setDefaultHarness.mutateAsync({\n workspaceId,\n harnessId: onboarding.harnessId,\n });\n toast.success(`${provider.label} saved`);\n dispatch({type: 'default-harness-saved'});\n onConfigured();\n } catch (error) {\n const mapped = modelProviderConfigErrorToFormError(error);\n dispatch({\n type: 'default-harness-failed',\n message: mapped.message || 'Could not save default harness. Try again.',\n });\n }\n }\n\n const selectedHarnessDescriptor =\n onboarding.step === 'choose-harness'\n ? null\n : listHarnesses().find((harness) => harness.id === onboarding.harnessId);\n const headingId =\n onboarding.step === 'choose-harness'\n ? 'model-provider-harness-step'\n : 'model-provider-provider-step';\n\n return (\n <div className=\"mx-auto flex w-full max-w-[640px] flex-col gap-20\">\n <header className=\"flex flex-col gap-12\">\n <div className=\"flex items-start justify-between gap-16 max-[520px]:flex-col max-[520px]:gap-8\">\n <Header id={headingId} variant=\"h1\" tabIndex={-1} className=\"outline-none\">\n {selectedHarnessDescriptor\n ? `Configure ${selectedHarnessDescriptor.label}`\n : 'Choose agent harness'}\n </Header>\n <Button type=\"button\" variant=\"secondary\" onClick={handleSkip} className=\"shrink-0\">\n Skip for now\n </Button>\n </div>\n <Text size=\"md\" className=\"text-foreground-neutral-muted\">\n {selectedHarnessDescriptor\n ? `${selectedHarnessDescriptor.label} needs a compatible model provider. Add your own API key, or go back to choose a different harness.`\n : 'A harness runs agent steps. Choose the engine you want first, then connect a compatible model provider.'}\n </Text>\n </header>\n\n <section aria-labelledby={headingId} className=\"flex flex-col gap-16\">\n {onboarding.step === 'choose-harness' ? (\n <HarnessPicker\n onSelect={(harnessId) => dispatch({type: 'harness-selected', harnessId})}\n />\n ) : (\n <>\n <div>\n <Button type=\"button\" variant=\"transparent\" onClick={() => dispatch({type: 'back'})}>\n Back\n </Button>\n </div>\n <ModelProviderPicker\n key={onboarding.harnessId}\n catalogQuery={catalogQuery}\n supportedProviders={filteredProviders}\n onSelect={(entry) => {\n dispatch({type: 'provider-selected', provider: entry});\n }}\n />\n </>\n )}\n </section>\n\n <Modal\n open={\n onboarding.step === 'configure-provider' || onboarding.step === 'saving-default-harness'\n }\n onOpenChange={(open) => {\n if (!open && onboarding.step === 'configure-provider') dispatch({type: 'back'});\n }}\n >\n <ModalContent aria-describedby={undefined}>\n <ModalTitle className=\"sr-only\">\n {onboarding.step === 'configure-provider' ||\n onboarding.step === 'saving-default-harness'\n ? `Configure ${onboarding.provider.label}`\n : ''}\n </ModalTitle>\n <ModalHeader>\n <Text\n size=\"lg\"\n aria-hidden=\"true\"\n className=\"overflow-ellipsis overflow-hidden whitespace-nowrap\"\n >\n {onboarding.step === 'configure-provider' ||\n onboarding.step === 'saving-default-harness'\n ? `Configure ${onboarding.provider.label}`\n : ''}\n </Text>\n </ModalHeader>\n {onboarding.step === 'saving-default-harness' ? (\n <div role=\"status\" className=\"px-20 pb-8\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Saving harness default...\n </Text>\n </div>\n ) : null}\n {onboarding.step === 'saving-default-harness' && onboarding.error ? (\n <div className=\"px-20 pb-8\">\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-8\">\n <Text size=\"sm\" bold>\n Could not save default harness\n </Text>\n <Text size=\"sm\">{onboarding.error}</Text>\n </div>\n </Callout>\n </div>\n ) : null}\n {onboarding.step === 'configure-provider' ||\n onboarding.step === 'saving-default-harness' ? (\n <ModelProviderTestAndSaveForm\n workspaceId={workspaceId}\n entry={onboarding.provider}\n setAsDefaultOnSave\n onSaved={() => {\n void handleProviderSaved();\n }}\n />\n ) : null}\n </ModalContent>\n </Modal>\n </div>\n );\n}\n\nfunction HarnessPicker({onSelect}: {onSelect: (harness: HarnessId) => void}) {\n return (\n <ul className={PROVIDER_GRID_CLASS} aria-label=\"Agent harnesses\">\n {listHarnesses().map((harness) => (\n <HarnessCard key={harness.id} harness={harness} onChoose={() => onSelect(harness.id)} />\n ))}\n </ul>\n );\n}\n\nfunction HarnessCard({harness, onChoose}: {harness: HarnessDescriptor; onChoose: () => void}) {\n return (\n <li>\n <button\n type=\"button\"\n className={cn(\n 'group block w-full cursor-pointer p-16 text-left outline-none transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus',\n SURFACE_CLASS,\n )}\n aria-label={`Choose ${harness.label}`}\n onClick={onChoose}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-12\">\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Text size=\"md\" bold className=\"min-w-0 truncate\">\n {harness.label}\n </Text>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {harness.description}\n </Text>\n </div>\n <div className=\"flex shrink-0 items-center gap-4 text-foreground-neutral-muted transition-colors group-hover:text-foreground-highlight-interactive\">\n <Text size=\"sm\">Choose</Text>\n <Icon name=\"chevronRight\" className=\"size-16\" />\n </div>\n </div>\n </button>\n </li>\n );\n}\n\nfunction ModelProviderPicker({\n catalogQuery,\n supportedProviders,\n onSelect,\n}: {\n catalogQuery: ReturnType<typeof useModelProviderCatalogQuery>;\n supportedProviders: SupportedProvider[];\n onSelect: (entry: SupportedProvider) => void;\n}) {\n if (catalogQuery.isPending) {\n return (\n <div role=\"status\" aria-busy=\"true\" aria-label=\"Loading model providers\">\n <ModelProviderGridSkeleton />\n </div>\n );\n }\n\n if (catalogQuery.isError && catalogQuery.data === undefined) {\n return <QueryLoadError query={catalogQuery} subject=\"model provider catalog\" />;\n }\n\n if (catalogQuery.data !== undefined && supportedProviders.length === 0) {\n return (\n <EmptyState\n icon=\"componentLine\"\n title=\"No providers available to configure\"\n description=\"Skip for now and add one later from workspace settings.\"\n />\n );\n }\n\n return <AvailableProvidersGrid entries={supportedProviders} onSelect={onSelect} />;\n}\n\nfunction ModelProviderGridSkeleton() {\n return (\n <div 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","Callout","EmptyState","Icon","Modal","ModalContent","ModalHeader","ModalTitle","Skeleton","toast","Header","Text","cn","useEffect","useMemo","useReducer","AvailableProvidersGrid","PROVIDER_GRID_CLASS","modelProviderConfigErrorToFormError","ModelProviderTestAndSaveForm","DEFAULT_HARNESS","harnessSupportsProvider","listHarnesses","initialOnboardingState","onboardingReducer","isSupportedProvider","useModelProviderCatalogQuery","useSetDefaultHarnessMutation","dismissModelProviderOnboarding","SURFACE_CLASS","ModelProviderOnboardingPage","workspaceId","onSkip","onConfigured","catalogQuery","setDefaultHarness","onboarding","dispatch","supportedProviders","data","providers","filter","filteredProviders","step","provider","harnessId","id","document","getElementById","focus","handleSkip","handleProviderSaved","type","success","label","mutateAsync","error","mapped","message","selectedHarnessDescriptor","find","harness","headingId","div","className","header","variant","tabIndex","onClick","size","section","aria-labelledby","HarnessPicker","onSelect","ModelProviderPicker","entry","open","onOpenChange","aria-describedby","undefined","aria-hidden","role","bold","setAsDefaultOnSave","onSaved","ul","aria-label","map","HarnessCard","onChoose","li","button","description","name","isPending","aria-busy","ModelProviderGridSkeleton","isError","query","subject","length","icon","title","entries","card"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-settings.d.ts","sourceRoot":"","sources":["../../src/routes/agents-settings.tsx"],"names":[],"mappings":";;;AAGA,wBAUG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { defineRoute, useActiveWorkspace } from '@shipfox/client-shell/runtime';
|
|
3
|
+
import { WorkspaceHarnessesSection, WorkspaceModelProvidersSection } from '#index.js';
|
|
4
|
+
export default defineRoute({
|
|
5
|
+
component: ()=>{
|
|
6
|
+
const workspace = useActiveWorkspace();
|
|
7
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
8
|
+
className: "flex flex-col gap-32",
|
|
9
|
+
children: [
|
|
10
|
+
/*#__PURE__*/ _jsx(WorkspaceHarnessesSection, {
|
|
11
|
+
workspaceId: workspace.id
|
|
12
|
+
}),
|
|
13
|
+
/*#__PURE__*/ _jsx(WorkspaceModelProvidersSection, {
|
|
14
|
+
workspaceId: workspace.id
|
|
15
|
+
})
|
|
16
|
+
]
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=agents-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/agents-settings.tsx"],"sourcesContent":["import {defineRoute, useActiveWorkspace} from '@shipfox/client-shell/runtime';\nimport {WorkspaceHarnessesSection, WorkspaceModelProvidersSection} from '#index.js';\n\nexport default defineRoute({\n component: () => {\n const workspace = useActiveWorkspace();\n return (\n <div className=\"flex flex-col gap-32\">\n <WorkspaceHarnessesSection workspaceId={workspace.id} />\n <WorkspaceModelProvidersSection workspaceId={workspace.id} />\n </div>\n );\n },\n});\n"],"names":["defineRoute","useActiveWorkspace","WorkspaceHarnessesSection","WorkspaceModelProvidersSection","component","workspace","div","className","workspaceId","id"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,yBAAyB,EAAEC,8BAA8B,QAAO,YAAY;AAEpF,eAAeH,YAAY;IACzBI,WAAW;QACT,MAAMC,YAAYJ;QAClB,qBACE,MAACK;YAAIC,WAAU;;8BACb,KAACL;oBAA0BM,aAAaH,UAAUI,EAAE;;8BACpD,KAACN;oBAA+BK,aAAaH,UAAUI,EAAE;;;;IAG/D;AACF,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/routes/inputs.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,CAItF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function modelProviderRouteParams(input) {
|
|
2
|
+
const wid = stringParam(input.wid);
|
|
3
|
+
if (!wid) throw new Error('Model provider route is missing the workspace path parameter.');
|
|
4
|
+
return {
|
|
5
|
+
wid
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
function stringParam(value) {
|
|
9
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=inputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/inputs.ts"],"sourcesContent":["export function modelProviderRouteParams(input: Record<string, unknown>): {wid: string} {\n const wid = stringParam(input.wid);\n if (!wid) throw new Error('Model provider route is missing the workspace path parameter.');\n return {wid};\n}\n\nfunction stringParam(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n"],"names":["modelProviderRouteParams","input","wid","stringParam","Error","value","length","undefined"],"mappings":"AAAA,OAAO,SAASA,yBAAyBC,KAA8B;IACrE,MAAMC,MAAMC,YAAYF,MAAMC,GAAG;IACjC,IAAI,CAACA,KAAK,MAAM,IAAIE,MAAM;IAC1B,OAAO;QAACF;IAAG;AACb;AAEA,SAASC,YAAYE,KAAc;IACjC,OAAO,OAAOA,UAAU,YAAYA,MAAMC,MAAM,GAAG,IAAID,QAAQE;AACjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-provider.d.ts","sourceRoot":"","sources":["../../src/routes/model-provider.tsx"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"model-provider.d.ts","sourceRoot":"","sources":["../../src/routes/model-provider.tsx"],"names":[],"mappings":";;;AAKA,wBAeG"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { defineRoute } from '@shipfox/client-shell/runtime';
|
|
3
|
-
import { useNavigate
|
|
2
|
+
import { defineRoute, useRouteParams } from '@shipfox/client-shell/runtime';
|
|
3
|
+
import { useNavigate } from '@tanstack/react-router';
|
|
4
4
|
import { ModelProviderOnboardingPage } from '#pages/model-provider-onboarding-page.js';
|
|
5
|
+
import { modelProviderRouteParams } from './inputs.js';
|
|
5
6
|
export default defineRoute({
|
|
6
7
|
component: ()=>{
|
|
7
|
-
const { wid } =
|
|
8
|
-
strict: false
|
|
9
|
-
});
|
|
8
|
+
const { wid } = useRouteParams(modelProviderRouteParams);
|
|
10
9
|
const navigate = useNavigate();
|
|
11
10
|
const goToProjectCreation = ()=>{
|
|
12
11
|
void navigate({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/model-provider.tsx"],"sourcesContent":["import {defineRoute} from '@shipfox/client-shell/runtime';\nimport {useNavigate
|
|
1
|
+
{"version":3,"sources":["../../src/routes/model-provider.tsx"],"sourcesContent":["import {defineRoute, useRouteParams} from '@shipfox/client-shell/runtime';\nimport {useNavigate} from '@tanstack/react-router';\nimport {ModelProviderOnboardingPage} from '#pages/model-provider-onboarding-page.js';\nimport {modelProviderRouteParams} from './inputs.js';\n\nexport default defineRoute({\n component: () => {\n const {wid} = useRouteParams(modelProviderRouteParams);\n const navigate = useNavigate();\n const goToProjectCreation = () => {\n void navigate({to: '/workspaces/$wid/projects/new', params: {wid}, replace: true});\n };\n return (\n <ModelProviderOnboardingPage\n workspaceId={wid}\n onSkip={goToProjectCreation}\n onConfigured={goToProjectCreation}\n />\n );\n },\n});\n"],"names":["defineRoute","useRouteParams","useNavigate","ModelProviderOnboardingPage","modelProviderRouteParams","component","wid","navigate","goToProjectCreation","to","params","replace","workspaceId","onSkip","onConfigured"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,cAAc,QAAO,gCAAgC;AAC1E,SAAQC,WAAW,QAAO,yBAAyB;AACnD,SAAQC,2BAA2B,QAAO,2CAA2C;AACrF,SAAQC,wBAAwB,QAAO,cAAc;AAErD,eAAeJ,YAAY;IACzBK,WAAW;QACT,MAAM,EAACC,GAAG,EAAC,GAAGL,eAAeG;QAC7B,MAAMG,WAAWL;QACjB,MAAMM,sBAAsB;YAC1B,KAAKD,SAAS;gBAACE,IAAI;gBAAiCC,QAAQ;oBAACJ;gBAAG;gBAAGK,SAAS;YAAI;QAClF;QACA,qBACE,KAACR;YACCS,aAAaN;YACbO,QAAQL;YACRM,cAAcN;;IAGpB;AACF,GAAG"}
|