@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
|
@@ -321,7 +321,8 @@ function configsForScenario(scenario) {
|
|
|
321
321
|
if (scenario === 'empty-configured' || scenario === 'configs-error') {
|
|
322
322
|
return {
|
|
323
323
|
configs: [],
|
|
324
|
-
default_provider_id: null
|
|
324
|
+
default_provider_id: null,
|
|
325
|
+
default_harness_id: null
|
|
325
326
|
};
|
|
326
327
|
}
|
|
327
328
|
if (scenario === 'all-configured') {
|
|
@@ -329,7 +330,8 @@ function configsForScenario(scenario) {
|
|
|
329
330
|
configs: CATALOG.filter((entry)=>entry.support_status === 'supported').map((entry)=>providerConfig({
|
|
330
331
|
provider_id: entry.id
|
|
331
332
|
})),
|
|
332
|
-
default_provider_id: 'anthropic'
|
|
333
|
+
default_provider_id: 'anthropic',
|
|
334
|
+
default_harness_id: null
|
|
333
335
|
};
|
|
334
336
|
}
|
|
335
337
|
if (scenario === 'custom-configured') {
|
|
@@ -340,7 +342,8 @@ function configsForScenario(scenario) {
|
|
|
340
342
|
}),
|
|
341
343
|
customProviderConfig()
|
|
342
344
|
],
|
|
343
|
-
default_provider_id: 'local-vllm'
|
|
345
|
+
default_provider_id: 'local-vllm',
|
|
346
|
+
default_harness_id: null
|
|
344
347
|
};
|
|
345
348
|
}
|
|
346
349
|
return {
|
|
@@ -349,7 +352,8 @@ function configsForScenario(scenario) {
|
|
|
349
352
|
provider_id: 'anthropic'
|
|
350
353
|
})
|
|
351
354
|
],
|
|
352
|
-
default_provider_id: 'anthropic'
|
|
355
|
+
default_provider_id: 'anthropic',
|
|
356
|
+
default_harness_id: null
|
|
353
357
|
};
|
|
354
358
|
}
|
|
355
359
|
function customProviderConfig() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/model-providers-section.stories.tsx"],"sourcesContent":["import type {\n CustomModelProviderConfigDto,\n ModelProviderCatalogEntryDto,\n ModelProviderConfigDto,\n SupportedModelProviderId,\n} from '@shipfox/api-agent-dto';\nimport {configureApiClient} from '@shipfox/client-api';\nimport {Toaster} from '@shipfox/react-ui/toast';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\nimport {useMemo} from 'react';\nimport {screen, userEvent, within} from 'storybook/test';\nimport {WorkspaceModelProvidersSection} from './model-providers-section.js';\n\nconst WORKSPACE_ID = '11111111-1111-4111-8111-111111111111';\n\ntype Scenario =\n | 'mixed'\n | 'empty-configured'\n | 'all-configured'\n | 'custom-configured'\n | 'loading'\n | 'configs-error'\n | 'catalog-error'\n | 'long-names';\n\ninterface ModelProvidersStoryProps {\n scenario: Scenario;\n}\n\nconst CATALOG: ModelProviderCatalogEntryDto[] = [\n providerEntry({\n id: 'anthropic',\n label: 'Anthropic',\n default_model: 'claude-opus-4-8',\n models: [\n {id: 'claude-opus-4-8', label: 'Claude Opus 4.8'},\n {id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5'},\n ],\n }),\n providerEntry({\n id: 'openai',\n label: 'OpenAI',\n default_model: 'gpt-5.5-pro',\n models: [\n {id: 'gpt-5.5-pro', label: 'GPT-5.5 Pro'},\n {id: 'gpt-5-mini', label: 'GPT-5 Mini'},\n ],\n }),\n providerEntry({\n id: 'xai',\n label: 'xAI',\n default_model: 'grok-code-fast-1',\n models: [{id: 'grok-code-fast-1', label: 'Grok Code Fast 1'}],\n }),\n providerEntry({\n id: 'openrouter',\n label: 'OpenRouter',\n default_model: 'openrouter/auto',\n models: [{id: 'openrouter/auto', label: 'OpenRouter Auto'}],\n }),\n providerEntry({\n id: 'google',\n label: 'Google Gemini',\n default_model: 'gemini-3-pro',\n models: [{id: 'gemini-3-pro', label: 'Gemini 3 Pro'}],\n }),\n providerEntry({\n id: 'mistral',\n label: 'Mistral AI',\n default_model: 'codestral-latest',\n models: [{id: 'codestral-latest', label: 'Codestral Latest'}],\n }),\n providerEntry({\n id: 'groq',\n label: 'Groq',\n default_model: 'llama-4-fast',\n models: [{id: 'llama-4-fast', label: 'Llama 4 Fast'}],\n }),\n providerEntry({\n id: 'deepseek',\n label: 'DeepSeek',\n default_model: 'deepseek-coder',\n models: [{id: 'deepseek-coder', label: 'DeepSeek Coder'}],\n }),\n providerEntry({\n id: 'moonshotai',\n label: 'Moonshot AI',\n default_model: 'kimi-k2',\n models: [{id: 'kimi-k2', label: 'Kimi K2'}],\n }),\n providerEntry({\n id: 'azure-openai-responses',\n label: 'Azure OpenAI Responses',\n default_model: 'gpt-5.5-pro',\n models: [{id: 'gpt-5.5-pro', label: 'GPT-5.5 Pro'}],\n }),\n providerEntry({\n id: 'amazon-bedrock',\n label: 'Amazon Bedrock',\n support_status: 'unsupported',\n credential_fields: [],\n unsupported_reason: 'AWS cloud credentials are not supported yet.',\n models: [],\n }),\n];\n\nfunction ModelProvidersStory({scenario}: ModelProvidersStoryProps) {\n configureApiClient({\n baseUrl: 'https://api.example.test',\n fetchImpl: fetchForScenario(scenario),\n });\n\n const queryClient = useMemo(\n () => new QueryClient({defaultOptions: {queries: {retry: false}}}),\n [],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <div className=\"mx-auto w-full max-w-[760px] bg-background-neutral-background p-24\">\n <WorkspaceModelProvidersSection workspaceId={WORKSPACE_ID} />\n </div>\n <Toaster />\n </QueryClientProvider>\n );\n}\n\nconst meta = {\n title: 'Agent/ProviderSettings',\n component: ModelProvidersStory,\n parameters: {layout: 'fullscreen'},\n args: {scenario: 'mixed'},\n} satisfies Meta<typeof ModelProvidersStory>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Playground: Story = {};\n\nexport const EmptyConfigured: Story = {\n args: {scenario: 'empty-configured'},\n};\n\nexport const AllConfigured: Story = {\n args: {scenario: 'all-configured'},\n};\n\nexport const CustomConfigured: Story = {\n args: {scenario: 'custom-configured'},\n};\n\nexport const Loading: Story = {\n args: {scenario: 'loading'},\n};\n\nexport const ConfigsError: Story = {\n args: {scenario: 'configs-error'},\n};\n\nexport const CatalogError: Story = {\n args: {scenario: 'catalog-error'},\n};\n\nexport const LongNames: Story = {\n args: {scenario: 'long-names'},\n};\n\nexport const FilteredAvailableProviders: Story = {\n args: {scenario: 'empty-configured'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await userEvent.type(\n await canvas.findByRole('searchbox', {name: 'Search providers'}),\n 'openrouter',\n );\n await canvas.findByRole('button', {name: 'Configure OpenRouter'});\n },\n};\n\nexport const NoMatchingAvailableProviders: Story = {\n args: {scenario: 'empty-configured'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await userEvent.type(\n await canvas.findByRole('searchbox', {name: 'Search providers'}),\n 'not-a-provider',\n );\n await canvas.findByRole('button', {name: 'Clear search'});\n },\n};\n\nexport const ConfigureModalOpen: Story = {\n args: {scenario: 'empty-configured'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await userEvent.click(await canvas.findByRole('button', {name: 'Configure Anthropic'}));\n await screen.findByLabelText('API key');\n },\n};\n\nexport const CustomProviderModalOpen: Story = {\n args: {scenario: 'empty-configured'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await userEvent.click(await canvas.findByRole('button', {name: 'Configure custom provider'}));\n await screen.findByRole('dialog', {name: 'Add custom provider'});\n },\n};\n\nexport const WorkflowExampleModalOpen: Story = {\n args: {scenario: 'mixed'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await userEvent.click(\n await canvas.findByRole('button', {name: 'Open Anthropic provider actions'}),\n );\n await userEvent.click(await screen.findByRole('menuitem', {name: 'View workflow example'}));\n await screen.findByRole('dialog', {name: 'Use Anthropic in a workflow'});\n },\n};\n\nfunction fetchForScenario(scenario: Scenario): typeof fetch {\n return (input) => {\n const url = requestUrl(input);\n if (scenario === 'loading') return new Promise<Response>(() => undefined);\n if (url.pathname.endsWith('/agent/model-provider-catalog')) {\n if (scenario === 'catalog-error') return Promise.resolve(errorResponse());\n return Promise.resolve(jsonResponse({providers: catalogForScenario(scenario)}));\n }\n if (url.pathname.endsWith('/agent/model-providers')) {\n if (scenario === 'configs-error') return Promise.resolve(errorResponse());\n return Promise.resolve(jsonResponse(configsForScenario(scenario)));\n }\n return Promise.resolve(jsonResponse({}, {status: 404}));\n };\n}\n\nfunction catalogForScenario(scenario: Scenario): ModelProviderCatalogEntryDto[] {\n if (scenario !== 'long-names') return CATALOG;\n return [\n providerEntry({\n id: 'anthropic',\n label: 'Anthropic Enterprise Production Claude Provider With Long Label',\n default_model: 'claude-opus-4-8',\n }),\n providerEntry({\n id: 'openai',\n label: 'OpenAI Platform Shared Workspace Credentials With Long Label',\n default_model: 'gpt-5.5-pro',\n models: [{id: 'gpt-5.5-pro', label: 'GPT-5.5 Pro'}],\n }),\n ];\n}\n\nfunction configsForScenario(scenario: Scenario) {\n if (scenario === 'empty-configured' || scenario === 'configs-error') {\n return {configs: [], default_provider_id: null};\n }\n if (scenario === 'all-configured') {\n return {\n configs: CATALOG.filter((entry) => entry.support_status === 'supported').map((entry) =>\n providerConfig({\n provider_id: entry.id as SupportedModelProviderId,\n }),\n ),\n default_provider_id: 'anthropic',\n };\n }\n if (scenario === 'custom-configured') {\n return {\n configs: [providerConfig({provider_id: 'anthropic'}), customProviderConfig()],\n default_provider_id: 'local-vllm',\n };\n }\n return {\n configs: [providerConfig({provider_id: 'anthropic'})],\n default_provider_id: 'anthropic',\n };\n}\n\nfunction customProviderConfig(): CustomModelProviderConfigDto {\n return {\n kind: 'custom',\n provider_id: 'local-vllm',\n display_name: 'Local vLLM',\n api: 'openai-completions',\n base_url: 'http://localhost:8000/v1',\n headers: [{name: 'x-region', value: 'us'}],\n secret_header_names: ['authorization'],\n models: [\n {id: 'llama-3.1', label: 'Llama 3.1'},\n {id: 'qwen-coder', label: 'Qwen Coder'},\n ],\n default_model: 'llama-3.1',\n created_at: '2026-05-08T00:00:00.000Z',\n updated_at: '2026-05-08T00:00:00.000Z',\n };\n}\n\nfunction providerEntry(\n overrides: Partial<ModelProviderCatalogEntryDto> = {},\n): ModelProviderCatalogEntryDto {\n return {\n id: 'anthropic',\n label: 'Anthropic',\n support_status: 'supported',\n default_model: null,\n credential_fields: [{key: 'api_key', label: 'API key', secret: true}],\n unsupported_reason: null,\n models: [{id: 'claude-opus-4-8', label: 'Claude Opus 4.8'}],\n ...overrides,\n };\n}\n\nfunction providerConfig(\n overrides: Partial<Omit<ModelProviderConfigDto, 'kind'>> = {},\n): ModelProviderConfigDto {\n return {\n kind: 'builtin',\n provider_id: 'anthropic',\n default_model: null,\n created_at: '2026-05-08T00:00:00.000Z',\n updated_at: '2026-05-08T00:00:00.000Z',\n ...overrides,\n };\n}\n\nfunction requestUrl(input: RequestInfo | URL): URL {\n if (typeof input === 'string') return new URL(input);\n if (input instanceof URL) return input;\n return new URL(input.url);\n}\n\nfunction jsonResponse(body: unknown, init: ResponseInit = {}) {\n return new Response(JSON.stringify(body), {\n status: 200,\n headers: {'content-type': 'application/json'},\n ...init,\n });\n}\n\nfunction errorResponse() {\n return jsonResponse({code: 'server-error'}, {status: 500, statusText: 'Server error'});\n}\n"],"names":["configureApiClient","Toaster","QueryClient","QueryClientProvider","useMemo","screen","userEvent","within","WorkspaceModelProvidersSection","WORKSPACE_ID","CATALOG","providerEntry","id","label","default_model","models","support_status","credential_fields","unsupported_reason","ModelProvidersStory","scenario","baseUrl","fetchImpl","fetchForScenario","queryClient","defaultOptions","queries","retry","client","div","className","workspaceId","meta","title","component","parameters","layout","args","Playground","EmptyConfigured","AllConfigured","CustomConfigured","Loading","ConfigsError","CatalogError","LongNames","FilteredAvailableProviders","play","canvasElement","canvas","type","findByRole","name","NoMatchingAvailableProviders","ConfigureModalOpen","click","findByLabelText","CustomProviderModalOpen","WorkflowExampleModalOpen","input","url","requestUrl","Promise","undefined","pathname","endsWith","resolve","errorResponse","jsonResponse","providers","catalogForScenario","configsForScenario","status","configs","default_provider_id","filter","entry","map","providerConfig","provider_id","customProviderConfig","kind","display_name","api","base_url","headers","value","secret_header_names","created_at","updated_at","overrides","key","secret","URL","body","init","Response","JSON","stringify","code","statusText"],"mappings":";AAMA,SAAQA,kBAAkB,QAAO,sBAAsB;AACvD,SAAQC,OAAO,QAAO,0BAA0B;AAEhD,SAAQC,WAAW,EAAEC,mBAAmB,QAAO,wBAAwB;AACvE,SAAQC,OAAO,QAAO,QAAQ;AAC9B,SAAQC,MAAM,EAAEC,SAAS,EAAEC,MAAM,QAAO,iBAAiB;AACzD,SAAQC,8BAA8B,QAAO,+BAA+B;AAE5E,MAAMC,eAAe;AAgBrB,MAAMC,UAA0C;IAC9CC,cAAc;QACZC,IAAI;QACJC,OAAO;QACPC,eAAe;QACfC,QAAQ;YACN;gBAACH,IAAI;gBAAmBC,OAAO;YAAiB;YAChD;gBAACD,IAAI;gBAAoBC,OAAO;YAAkB;SACnD;IACH;IACAF,cAAc;QACZC,IAAI;QACJC,OAAO;QACPC,eAAe;QACfC,QAAQ;YACN;gBAACH,IAAI;gBAAeC,OAAO;YAAa;YACxC;gBAACD,IAAI;gBAAcC,OAAO;YAAY;SACvC;IACH;IACAF,cAAc;QACZC,IAAI;QACJC,OAAO;QACPC,eAAe;QACfC,QAAQ;YAAC;gBAACH,IAAI;gBAAoBC,OAAO;YAAkB;SAAE;IAC/D;IACAF,cAAc;QACZC,IAAI;QACJC,OAAO;QACPC,eAAe;QACfC,QAAQ;YAAC;gBAACH,IAAI;gBAAmBC,OAAO;YAAiB;SAAE;IAC7D;IACAF,cAAc;QACZC,IAAI;QACJC,OAAO;QACPC,eAAe;QACfC,QAAQ;YAAC;gBAACH,IAAI;gBAAgBC,OAAO;YAAc;SAAE;IACvD;IACAF,cAAc;QACZC,IAAI;QACJC,OAAO;QACPC,eAAe;QACfC,QAAQ;YAAC;gBAACH,IAAI;gBAAoBC,OAAO;YAAkB;SAAE;IAC/D;IACAF,cAAc;QACZC,IAAI;QACJC,OAAO;QACPC,eAAe;QACfC,QAAQ;YAAC;gBAACH,IAAI;gBAAgBC,OAAO;YAAc;SAAE;IACvD;IACAF,cAAc;QACZC,IAAI;QACJC,OAAO;QACPC,eAAe;QACfC,QAAQ;YAAC;gBAACH,IAAI;gBAAkBC,OAAO;YAAgB;SAAE;IAC3D;IACAF,cAAc;QACZC,IAAI;QACJC,OAAO;QACPC,eAAe;QACfC,QAAQ;YAAC;gBAACH,IAAI;gBAAWC,OAAO;YAAS;SAAE;IAC7C;IACAF,cAAc;QACZC,IAAI;QACJC,OAAO;QACPC,eAAe;QACfC,QAAQ;YAAC;gBAACH,IAAI;gBAAeC,OAAO;YAAa;SAAE;IACrD;IACAF,cAAc;QACZC,IAAI;QACJC,OAAO;QACPG,gBAAgB;QAChBC,mBAAmB,EAAE;QACrBC,oBAAoB;QACpBH,QAAQ,EAAE;IACZ;CACD;AAED,SAASI,oBAAoB,EAACC,QAAQ,EAA2B;IAC/DpB,mBAAmB;QACjBqB,SAAS;QACTC,WAAWC,iBAAiBH;IAC9B;IAEA,MAAMI,cAAcpB,QAClB,IAAM,IAAIF,YAAY;YAACuB,gBAAgB;gBAACC,SAAS;oBAACC,OAAO;gBAAK;YAAC;QAAC,IAChE,EAAE;IAGJ,qBACE,MAACxB;QAAoByB,QAAQJ;;0BAC3B,KAACK;gBAAIC,WAAU;0BACb,cAAA,KAACtB;oBAA+BuB,aAAatB;;;0BAE/C,KAACR;;;AAGP;AAEA,MAAM+B,OAAO;IACXC,OAAO;IACPC,WAAWf;IACXgB,YAAY;QAACC,QAAQ;IAAY;IACjCC,MAAM;QAACjB,UAAU;IAAO;AAC1B;AAEA,eAAeY,KAAK;AAGpB,OAAO,MAAMM,aAAoB,CAAC,EAAE;AAEpC,OAAO,MAAMC,kBAAyB;IACpCF,MAAM;QAACjB,UAAU;IAAkB;AACrC,EAAE;AAEF,OAAO,MAAMoB,gBAAuB;IAClCH,MAAM;QAACjB,UAAU;IAAgB;AACnC,EAAE;AAEF,OAAO,MAAMqB,mBAA0B;IACrCJ,MAAM;QAACjB,UAAU;IAAmB;AACtC,EAAE;AAEF,OAAO,MAAMsB,UAAiB;IAC5BL,MAAM;QAACjB,UAAU;IAAS;AAC5B,EAAE;AAEF,OAAO,MAAMuB,eAAsB;IACjCN,MAAM;QAACjB,UAAU;IAAe;AAClC,EAAE;AAEF,OAAO,MAAMwB,eAAsB;IACjCP,MAAM;QAACjB,UAAU;IAAe;AAClC,EAAE;AAEF,OAAO,MAAMyB,YAAmB;IAC9BR,MAAM;QAACjB,UAAU;IAAY;AAC/B,EAAE;AAEF,OAAO,MAAM0B,6BAAoC;IAC/CT,MAAM;QAACjB,UAAU;IAAkB;IACnC2B,MAAM,OAAO,EAACC,aAAa,EAAC;QAC1B,MAAMC,SAAS1C,OAAOyC;QACtB,MAAM1C,UAAU4C,IAAI,CAClB,MAAMD,OAAOE,UAAU,CAAC,aAAa;YAACC,MAAM;QAAkB,IAC9D;QAEF,MAAMH,OAAOE,UAAU,CAAC,UAAU;YAACC,MAAM;QAAsB;IACjE;AACF,EAAE;AAEF,OAAO,MAAMC,+BAAsC;IACjDhB,MAAM;QAACjB,UAAU;IAAkB;IACnC2B,MAAM,OAAO,EAACC,aAAa,EAAC;QAC1B,MAAMC,SAAS1C,OAAOyC;QACtB,MAAM1C,UAAU4C,IAAI,CAClB,MAAMD,OAAOE,UAAU,CAAC,aAAa;YAACC,MAAM;QAAkB,IAC9D;QAEF,MAAMH,OAAOE,UAAU,CAAC,UAAU;YAACC,MAAM;QAAc;IACzD;AACF,EAAE;AAEF,OAAO,MAAME,qBAA4B;IACvCjB,MAAM;QAACjB,UAAU;IAAkB;IACnC2B,MAAM,OAAO,EAACC,aAAa,EAAC;QAC1B,MAAMC,SAAS1C,OAAOyC;QACtB,MAAM1C,UAAUiD,KAAK,CAAC,MAAMN,OAAOE,UAAU,CAAC,UAAU;YAACC,MAAM;QAAqB;QACpF,MAAM/C,OAAOmD,eAAe,CAAC;IAC/B;AACF,EAAE;AAEF,OAAO,MAAMC,0BAAiC;IAC5CpB,MAAM;QAACjB,UAAU;IAAkB;IACnC2B,MAAM,OAAO,EAACC,aAAa,EAAC;QAC1B,MAAMC,SAAS1C,OAAOyC;QACtB,MAAM1C,UAAUiD,KAAK,CAAC,MAAMN,OAAOE,UAAU,CAAC,UAAU;YAACC,MAAM;QAA2B;QAC1F,MAAM/C,OAAO8C,UAAU,CAAC,UAAU;YAACC,MAAM;QAAqB;IAChE;AACF,EAAE;AAEF,OAAO,MAAMM,2BAAkC;IAC7CrB,MAAM;QAACjB,UAAU;IAAO;IACxB2B,MAAM,OAAO,EAACC,aAAa,EAAC;QAC1B,MAAMC,SAAS1C,OAAOyC;QACtB,MAAM1C,UAAUiD,KAAK,CACnB,MAAMN,OAAOE,UAAU,CAAC,UAAU;YAACC,MAAM;QAAiC;QAE5E,MAAM9C,UAAUiD,KAAK,CAAC,MAAMlD,OAAO8C,UAAU,CAAC,YAAY;YAACC,MAAM;QAAuB;QACxF,MAAM/C,OAAO8C,UAAU,CAAC,UAAU;YAACC,MAAM;QAA6B;IACxE;AACF,EAAE;AAEF,SAAS7B,iBAAiBH,QAAkB;IAC1C,OAAO,CAACuC;QACN,MAAMC,MAAMC,WAAWF;QACvB,IAAIvC,aAAa,WAAW,OAAO,IAAI0C,QAAkB,IAAMC;QAC/D,IAAIH,IAAII,QAAQ,CAACC,QAAQ,CAAC,kCAAkC;YAC1D,IAAI7C,aAAa,iBAAiB,OAAO0C,QAAQI,OAAO,CAACC;YACzD,OAAOL,QAAQI,OAAO,CAACE,aAAa;gBAACC,WAAWC,mBAAmBlD;YAAS;QAC9E;QACA,IAAIwC,IAAII,QAAQ,CAACC,QAAQ,CAAC,2BAA2B;YACnD,IAAI7C,aAAa,iBAAiB,OAAO0C,QAAQI,OAAO,CAACC;YACzD,OAAOL,QAAQI,OAAO,CAACE,aAAaG,mBAAmBnD;QACzD;QACA,OAAO0C,QAAQI,OAAO,CAACE,aAAa,CAAC,GAAG;YAACI,QAAQ;QAAG;IACtD;AACF;AAEA,SAASF,mBAAmBlD,QAAkB;IAC5C,IAAIA,aAAa,cAAc,OAAOV;IACtC,OAAO;QACLC,cAAc;YACZC,IAAI;YACJC,OAAO;YACPC,eAAe;QACjB;QACAH,cAAc;YACZC,IAAI;YACJC,OAAO;YACPC,eAAe;YACfC,QAAQ;gBAAC;oBAACH,IAAI;oBAAeC,OAAO;gBAAa;aAAE;QACrD;KACD;AACH;AAEA,SAAS0D,mBAAmBnD,QAAkB;IAC5C,IAAIA,aAAa,sBAAsBA,aAAa,iBAAiB;QACnE,OAAO;YAACqD,SAAS,EAAE;YAAEC,qBAAqB;QAAI;IAChD;IACA,IAAItD,aAAa,kBAAkB;QACjC,OAAO;YACLqD,SAAS/D,QAAQiE,MAAM,CAAC,CAACC,QAAUA,MAAM5D,cAAc,KAAK,aAAa6D,GAAG,CAAC,CAACD,QAC5EE,eAAe;oBACbC,aAAaH,MAAMhE,EAAE;gBACvB;YAEF8D,qBAAqB;QACvB;IACF;IACA,IAAItD,aAAa,qBAAqB;QACpC,OAAO;YACLqD,SAAS;gBAACK,eAAe;oBAACC,aAAa;gBAAW;gBAAIC;aAAuB;YAC7EN,qBAAqB;QACvB;IACF;IACA,OAAO;QACLD,SAAS;YAACK,eAAe;gBAACC,aAAa;YAAW;SAAG;QACrDL,qBAAqB;IACvB;AACF;AAEA,SAASM;IACP,OAAO;QACLC,MAAM;QACNF,aAAa;QACbG,cAAc;QACdC,KAAK;QACLC,UAAU;QACVC,SAAS;YAAC;gBAACjC,MAAM;gBAAYkC,OAAO;YAAI;SAAE;QAC1CC,qBAAqB;YAAC;SAAgB;QACtCxE,QAAQ;YACN;gBAACH,IAAI;gBAAaC,OAAO;YAAW;YACpC;gBAACD,IAAI;gBAAcC,OAAO;YAAY;SACvC;QACDC,eAAe;QACf0E,YAAY;QACZC,YAAY;IACd;AACF;AAEA,SAAS9E,cACP+E,YAAmD,CAAC,CAAC;IAErD,OAAO;QACL9E,IAAI;QACJC,OAAO;QACPG,gBAAgB;QAChBF,eAAe;QACfG,mBAAmB;YAAC;gBAAC0E,KAAK;gBAAW9E,OAAO;gBAAW+E,QAAQ;YAAI;SAAE;QACrE1E,oBAAoB;QACpBH,QAAQ;YAAC;gBAACH,IAAI;gBAAmBC,OAAO;YAAiB;SAAE;QAC3D,GAAG6E,SAAS;IACd;AACF;AAEA,SAASZ,eACPY,YAA2D,CAAC,CAAC;IAE7D,OAAO;QACLT,MAAM;QACNF,aAAa;QACbjE,eAAe;QACf0E,YAAY;QACZC,YAAY;QACZ,GAAGC,SAAS;IACd;AACF;AAEA,SAAS7B,WAAWF,KAAwB;IAC1C,IAAI,OAAOA,UAAU,UAAU,OAAO,IAAIkC,IAAIlC;IAC9C,IAAIA,iBAAiBkC,KAAK,OAAOlC;IACjC,OAAO,IAAIkC,IAAIlC,MAAMC,GAAG;AAC1B;AAEA,SAASQ,aAAa0B,IAAa,EAAEC,OAAqB,CAAC,CAAC;IAC1D,OAAO,IAAIC,SAASC,KAAKC,SAAS,CAACJ,OAAO;QACxCtB,QAAQ;QACRa,SAAS;YAAC,gBAAgB;QAAkB;QAC5C,GAAGU,IAAI;IACT;AACF;AAEA,SAAS5B;IACP,OAAOC,aAAa;QAAC+B,MAAM;IAAc,GAAG;QAAC3B,QAAQ;QAAK4B,YAAY;IAAc;AACtF"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/model-providers-section.stories.tsx"],"sourcesContent":["import type {\n CustomModelProviderConfigDto,\n ModelProviderCatalogEntryDto,\n ModelProviderConfigDto,\n SupportedModelProviderId,\n} from '@shipfox/api-agent-dto';\nimport {configureApiClient} from '@shipfox/client-api';\nimport {Toaster} from '@shipfox/react-ui/toast';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\nimport {useMemo} from 'react';\nimport {screen, userEvent, within} from 'storybook/test';\nimport {WorkspaceModelProvidersSection} from './model-providers-section.js';\n\nconst WORKSPACE_ID = '11111111-1111-4111-8111-111111111111';\n\ntype Scenario =\n | 'mixed'\n | 'empty-configured'\n | 'all-configured'\n | 'custom-configured'\n | 'loading'\n | 'configs-error'\n | 'catalog-error'\n | 'long-names';\n\ninterface ModelProvidersStoryProps {\n scenario: Scenario;\n}\n\nconst CATALOG: ModelProviderCatalogEntryDto[] = [\n providerEntry({\n id: 'anthropic',\n label: 'Anthropic',\n default_model: 'claude-opus-4-8',\n models: [\n {id: 'claude-opus-4-8', label: 'Claude Opus 4.8'},\n {id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5'},\n ],\n }),\n providerEntry({\n id: 'openai',\n label: 'OpenAI',\n default_model: 'gpt-5.5-pro',\n models: [\n {id: 'gpt-5.5-pro', label: 'GPT-5.5 Pro'},\n {id: 'gpt-5-mini', label: 'GPT-5 Mini'},\n ],\n }),\n providerEntry({\n id: 'xai',\n label: 'xAI',\n default_model: 'grok-code-fast-1',\n models: [{id: 'grok-code-fast-1', label: 'Grok Code Fast 1'}],\n }),\n providerEntry({\n id: 'openrouter',\n label: 'OpenRouter',\n default_model: 'openrouter/auto',\n models: [{id: 'openrouter/auto', label: 'OpenRouter Auto'}],\n }),\n providerEntry({\n id: 'google',\n label: 'Google Gemini',\n default_model: 'gemini-3-pro',\n models: [{id: 'gemini-3-pro', label: 'Gemini 3 Pro'}],\n }),\n providerEntry({\n id: 'mistral',\n label: 'Mistral AI',\n default_model: 'codestral-latest',\n models: [{id: 'codestral-latest', label: 'Codestral Latest'}],\n }),\n providerEntry({\n id: 'groq',\n label: 'Groq',\n default_model: 'llama-4-fast',\n models: [{id: 'llama-4-fast', label: 'Llama 4 Fast'}],\n }),\n providerEntry({\n id: 'deepseek',\n label: 'DeepSeek',\n default_model: 'deepseek-coder',\n models: [{id: 'deepseek-coder', label: 'DeepSeek Coder'}],\n }),\n providerEntry({\n id: 'moonshotai',\n label: 'Moonshot AI',\n default_model: 'kimi-k2',\n models: [{id: 'kimi-k2', label: 'Kimi K2'}],\n }),\n providerEntry({\n id: 'azure-openai-responses',\n label: 'Azure OpenAI Responses',\n default_model: 'gpt-5.5-pro',\n models: [{id: 'gpt-5.5-pro', label: 'GPT-5.5 Pro'}],\n }),\n providerEntry({\n id: 'amazon-bedrock',\n label: 'Amazon Bedrock',\n support_status: 'unsupported',\n credential_fields: [],\n unsupported_reason: 'AWS cloud credentials are not supported yet.',\n models: [],\n }),\n];\n\nfunction ModelProvidersStory({scenario}: ModelProvidersStoryProps) {\n configureApiClient({\n baseUrl: 'https://api.example.test',\n fetchImpl: fetchForScenario(scenario),\n });\n\n const queryClient = useMemo(\n () => new QueryClient({defaultOptions: {queries: {retry: false}}}),\n [],\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <div className=\"mx-auto w-full max-w-[760px] bg-background-neutral-background p-24\">\n <WorkspaceModelProvidersSection workspaceId={WORKSPACE_ID} />\n </div>\n <Toaster />\n </QueryClientProvider>\n );\n}\n\nconst meta = {\n title: 'Agent/ProviderSettings',\n component: ModelProvidersStory,\n parameters: {layout: 'fullscreen'},\n args: {scenario: 'mixed'},\n} satisfies Meta<typeof ModelProvidersStory>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Playground: Story = {};\n\nexport const EmptyConfigured: Story = {\n args: {scenario: 'empty-configured'},\n};\n\nexport const AllConfigured: Story = {\n args: {scenario: 'all-configured'},\n};\n\nexport const CustomConfigured: Story = {\n args: {scenario: 'custom-configured'},\n};\n\nexport const Loading: Story = {\n args: {scenario: 'loading'},\n};\n\nexport const ConfigsError: Story = {\n args: {scenario: 'configs-error'},\n};\n\nexport const CatalogError: Story = {\n args: {scenario: 'catalog-error'},\n};\n\nexport const LongNames: Story = {\n args: {scenario: 'long-names'},\n};\n\nexport const FilteredAvailableProviders: Story = {\n args: {scenario: 'empty-configured'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await userEvent.type(\n await canvas.findByRole('searchbox', {name: 'Search providers'}),\n 'openrouter',\n );\n await canvas.findByRole('button', {name: 'Configure OpenRouter'});\n },\n};\n\nexport const NoMatchingAvailableProviders: Story = {\n args: {scenario: 'empty-configured'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await userEvent.type(\n await canvas.findByRole('searchbox', {name: 'Search providers'}),\n 'not-a-provider',\n );\n await canvas.findByRole('button', {name: 'Clear search'});\n },\n};\n\nexport const ConfigureModalOpen: Story = {\n args: {scenario: 'empty-configured'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await userEvent.click(await canvas.findByRole('button', {name: 'Configure Anthropic'}));\n await screen.findByLabelText('API key');\n },\n};\n\nexport const CustomProviderModalOpen: Story = {\n args: {scenario: 'empty-configured'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await userEvent.click(await canvas.findByRole('button', {name: 'Configure custom provider'}));\n await screen.findByRole('dialog', {name: 'Add custom provider'});\n },\n};\n\nexport const WorkflowExampleModalOpen: Story = {\n args: {scenario: 'mixed'},\n play: async ({canvasElement}) => {\n const canvas = within(canvasElement);\n await userEvent.click(\n await canvas.findByRole('button', {name: 'Open Anthropic provider actions'}),\n );\n await userEvent.click(await screen.findByRole('menuitem', {name: 'View workflow example'}));\n await screen.findByRole('dialog', {name: 'Use Anthropic in a workflow'});\n },\n};\n\nfunction fetchForScenario(scenario: Scenario): typeof fetch {\n return (input) => {\n const url = requestUrl(input);\n if (scenario === 'loading') return new Promise<Response>(() => undefined);\n if (url.pathname.endsWith('/agent/model-provider-catalog')) {\n if (scenario === 'catalog-error') return Promise.resolve(errorResponse());\n return Promise.resolve(jsonResponse({providers: catalogForScenario(scenario)}));\n }\n if (url.pathname.endsWith('/agent/model-providers')) {\n if (scenario === 'configs-error') return Promise.resolve(errorResponse());\n return Promise.resolve(jsonResponse(configsForScenario(scenario)));\n }\n return Promise.resolve(jsonResponse({}, {status: 404}));\n };\n}\n\nfunction catalogForScenario(scenario: Scenario): ModelProviderCatalogEntryDto[] {\n if (scenario !== 'long-names') return CATALOG;\n return [\n providerEntry({\n id: 'anthropic',\n label: 'Anthropic Enterprise Production Claude Provider With Long Label',\n default_model: 'claude-opus-4-8',\n }),\n providerEntry({\n id: 'openai',\n label: 'OpenAI Platform Shared Workspace Credentials With Long Label',\n default_model: 'gpt-5.5-pro',\n models: [{id: 'gpt-5.5-pro', label: 'GPT-5.5 Pro'}],\n }),\n ];\n}\n\nfunction configsForScenario(scenario: Scenario) {\n if (scenario === 'empty-configured' || scenario === 'configs-error') {\n return {configs: [], default_provider_id: null, default_harness_id: null};\n }\n if (scenario === 'all-configured') {\n return {\n configs: CATALOG.filter((entry) => entry.support_status === 'supported').map((entry) =>\n providerConfig({\n provider_id: entry.id as SupportedModelProviderId,\n }),\n ),\n default_provider_id: 'anthropic',\n default_harness_id: null,\n };\n }\n if (scenario === 'custom-configured') {\n return {\n configs: [providerConfig({provider_id: 'anthropic'}), customProviderConfig()],\n default_provider_id: 'local-vllm',\n default_harness_id: null,\n };\n }\n return {\n configs: [providerConfig({provider_id: 'anthropic'})],\n default_provider_id: 'anthropic',\n default_harness_id: null,\n };\n}\n\nfunction customProviderConfig(): CustomModelProviderConfigDto {\n return {\n kind: 'custom',\n provider_id: 'local-vllm',\n display_name: 'Local vLLM',\n api: 'openai-completions',\n base_url: 'http://localhost:8000/v1',\n headers: [{name: 'x-region', value: 'us'}],\n secret_header_names: ['authorization'],\n models: [\n {id: 'llama-3.1', label: 'Llama 3.1'},\n {id: 'qwen-coder', label: 'Qwen Coder'},\n ],\n default_model: 'llama-3.1',\n created_at: '2026-05-08T00:00:00.000Z',\n updated_at: '2026-05-08T00:00:00.000Z',\n };\n}\n\nfunction providerEntry(\n overrides: Partial<ModelProviderCatalogEntryDto> = {},\n): ModelProviderCatalogEntryDto {\n return {\n id: 'anthropic',\n label: 'Anthropic',\n support_status: 'supported',\n default_model: null,\n credential_fields: [{key: 'api_key', label: 'API key', secret: true}],\n unsupported_reason: null,\n models: [{id: 'claude-opus-4-8', label: 'Claude Opus 4.8'}],\n ...overrides,\n };\n}\n\nfunction providerConfig(\n overrides: Partial<Omit<ModelProviderConfigDto, 'kind'>> = {},\n): ModelProviderConfigDto {\n return {\n kind: 'builtin',\n provider_id: 'anthropic',\n default_model: null,\n created_at: '2026-05-08T00:00:00.000Z',\n updated_at: '2026-05-08T00:00:00.000Z',\n ...overrides,\n };\n}\n\nfunction requestUrl(input: RequestInfo | URL): URL {\n if (typeof input === 'string') return new URL(input);\n if (input instanceof URL) return input;\n return new URL(input.url);\n}\n\nfunction jsonResponse(body: unknown, init: ResponseInit = {}) {\n return new Response(JSON.stringify(body), {\n status: 200,\n headers: {'content-type': 'application/json'},\n ...init,\n });\n}\n\nfunction errorResponse() {\n return jsonResponse({code: 'server-error'}, {status: 500, statusText: 'Server error'});\n}\n"],"names":["configureApiClient","Toaster","QueryClient","QueryClientProvider","useMemo","screen","userEvent","within","WorkspaceModelProvidersSection","WORKSPACE_ID","CATALOG","providerEntry","id","label","default_model","models","support_status","credential_fields","unsupported_reason","ModelProvidersStory","scenario","baseUrl","fetchImpl","fetchForScenario","queryClient","defaultOptions","queries","retry","client","div","className","workspaceId","meta","title","component","parameters","layout","args","Playground","EmptyConfigured","AllConfigured","CustomConfigured","Loading","ConfigsError","CatalogError","LongNames","FilteredAvailableProviders","play","canvasElement","canvas","type","findByRole","name","NoMatchingAvailableProviders","ConfigureModalOpen","click","findByLabelText","CustomProviderModalOpen","WorkflowExampleModalOpen","input","url","requestUrl","Promise","undefined","pathname","endsWith","resolve","errorResponse","jsonResponse","providers","catalogForScenario","configsForScenario","status","configs","default_provider_id","default_harness_id","filter","entry","map","providerConfig","provider_id","customProviderConfig","kind","display_name","api","base_url","headers","value","secret_header_names","created_at","updated_at","overrides","key","secret","URL","body","init","Response","JSON","stringify","code","statusText"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { BuiltinProviderConfig, SupportedProvider } from '#core/models.js';
|
|
2
2
|
export declare const MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID = "model-provider-test-and-save-form";
|
|
3
3
|
export declare function ModelProviderTestAndSaveForm({ workspaceId, entry, existingConfig, onSaved, setAsDefaultOnSave, }: {
|
|
4
4
|
workspaceId: string;
|
|
5
|
-
entry:
|
|
6
|
-
existingConfig?:
|
|
5
|
+
entry: SupportedProvider;
|
|
6
|
+
existingConfig?: BuiltinProviderConfig | undefined;
|
|
7
7
|
onSaved: (savedDefaultModel: string | null) => void;
|
|
8
8
|
setAsDefaultOnSave?: boolean | undefined;
|
|
9
9
|
}): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-and-save-form.d.ts","sourceRoot":"","sources":["../../src/components/test-and-save-form.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"test-and-save-form.d.ts","sourceRoot":"","sources":["../../src/components/test-and-save-form.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,qBAAqB,EAAE,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAU9E,eAAO,MAAM,oCAAoC,sCAAsC,CAAC;AAExF,wBAAgB,4BAA4B,CAAC,EAC3C,WAAW,EACX,KAAK,EACL,cAAc,EACd,OAAO,EACP,kBAA0B,GAC3B,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,iBAAiB,CAAC;IACzB,cAAc,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACnD,OAAO,EAAE,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACpD,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1C,+BAwHA"}
|
|
@@ -17,7 +17,7 @@ export function ModelProviderTestAndSaveForm({ workspaceId, entry, existingConfi
|
|
|
17
17
|
defaultValues: defaultFormValues(entry, existingConfig),
|
|
18
18
|
onSubmit: async ({ value })=>{
|
|
19
19
|
setFormError(undefined);
|
|
20
|
-
const credentials = Object.fromEntries(entry.
|
|
20
|
+
const credentials = Object.fromEntries(entry.credentialFields.map((credentialField)=>[
|
|
21
21
|
credentialField.key,
|
|
22
22
|
value[credentialField.key]?.trim() ?? ''
|
|
23
23
|
]));
|
|
@@ -27,13 +27,13 @@ export function ModelProviderTestAndSaveForm({ workspaceId, entry, existingConfi
|
|
|
27
27
|
await upsertConfig.mutateAsync({
|
|
28
28
|
workspaceId,
|
|
29
29
|
providerId: entry.id,
|
|
30
|
-
|
|
30
|
+
command: {
|
|
31
31
|
...defaultModel !== undefined ? {
|
|
32
|
-
|
|
32
|
+
defaultModel
|
|
33
33
|
} : {},
|
|
34
34
|
credentials,
|
|
35
35
|
...setAsDefaultOnSave ? {
|
|
36
|
-
|
|
36
|
+
setAsDefault: true
|
|
37
37
|
} : {}
|
|
38
38
|
}
|
|
39
39
|
});
|
|
@@ -73,7 +73,7 @@ export function ModelProviderTestAndSaveForm({ workspaceId, entry, existingConfi
|
|
|
73
73
|
onBlur: field.handleBlur
|
|
74
74
|
})
|
|
75
75
|
}) : null,
|
|
76
|
-
entry.
|
|
76
|
+
entry.credentialFields.map((credentialField)=>/*#__PURE__*/ _jsx(form.Field, {
|
|
77
77
|
name: credentialField.key,
|
|
78
78
|
validators: {
|
|
79
79
|
onBlur: ({ value })=>value.trim() ? undefined : `${credentialField.label} is required.`,
|
|
@@ -127,8 +127,8 @@ export function ModelProviderTestAndSaveForm({ workspaceId, entry, existingConfi
|
|
|
127
127
|
}
|
|
128
128
|
function defaultFormValues(entry, existingConfig) {
|
|
129
129
|
return {
|
|
130
|
-
default_model: defaultModelFormValue(existingConfig?.
|
|
131
|
-
...Object.fromEntries(entry.
|
|
130
|
+
default_model: defaultModelFormValue(existingConfig?.defaultModel),
|
|
131
|
+
...Object.fromEntries(entry.credentialFields.map((field)=>[
|
|
132
132
|
field.key,
|
|
133
133
|
''
|
|
134
134
|
]))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/test-and-save-form.tsx"],"sourcesContent":["import type {\n ModelProviderCatalogEntryDto,\n ModelProviderConfigDto,\n SupportedModelProviderId,\n} from '@shipfox/api-agent-dto';\nimport {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 {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: ModelProviderCatalogEntryDto;\n existingConfig?: ModelProviderConfigDto | 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.credential_fields.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 as SupportedModelProviderId,\n body: {\n ...(defaultModel !== undefined ? {default_model: defaultModel} : {}),\n credentials,\n ...(setAsDefaultOnSave ? {set_as_default: 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.credential_fields.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: ModelProviderCatalogEntryDto,\n existingConfig: ModelProviderConfigDto | undefined,\n): Record<string, string> {\n return {\n default_model: defaultModelFormValue(existingConfig?.default_model),\n ...Object.fromEntries(entry.credential_fields.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","credential_fields","map","credentialField","key","trim","selectedModel","default_model","defaultModel","mutateAsync","providerId","id","body","set_as_default","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-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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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { HarnessDescriptor, HarnessId, ProviderConfig } from './models.js';
|
|
2
|
+
export declare const DEFAULT_HARNESS: HarnessId;
|
|
3
|
+
export declare function listHarnesses(): readonly HarnessDescriptor[];
|
|
4
|
+
export declare function getHarness(id: HarnessId): HarnessDescriptor;
|
|
5
|
+
export declare function harnessSupportsProvider(harnessId: HarnessId, providerId: string): boolean;
|
|
6
|
+
export declare function configSupportsHarness(config: ProviderConfig, harness: HarnessDescriptor): boolean;
|
|
7
|
+
export declare function compatibleHarnessIds({ isCustom, providerId, }: {
|
|
8
|
+
isCustom: boolean;
|
|
9
|
+
providerId: string;
|
|
10
|
+
}): HarnessId[];
|
|
11
|
+
//# sourceMappingURL=harness-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-policy.d.ts","sourceRoot":"","sources":["../../src/core/harness-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAE,SAAS,EAAE,cAAc,EAAC,MAAM,aAAa,CAAC;AAE9E,eAAO,MAAM,eAAe,EAAE,SAAgB,CAAC;AAiD/C,wBAAgB,aAAa,IAAI,SAAS,iBAAiB,EAAE,CAE5D;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,SAAS,GAAG,iBAAiB,CAI3D;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAIjG;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,SAAS,EAAE,CAKd"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export const DEFAULT_HARNESS = 'pi';
|
|
2
|
+
const harnesses = [
|
|
3
|
+
{
|
|
4
|
+
id: 'pi',
|
|
5
|
+
label: 'pi',
|
|
6
|
+
description: 'Works with 30+ model providers',
|
|
7
|
+
supportedProviderIds: [
|
|
8
|
+
'anthropic',
|
|
9
|
+
'ant-ling',
|
|
10
|
+
'azure-openai-responses',
|
|
11
|
+
'openai',
|
|
12
|
+
'deepseek',
|
|
13
|
+
'nvidia',
|
|
14
|
+
'google',
|
|
15
|
+
'mistral',
|
|
16
|
+
'groq',
|
|
17
|
+
'cerebras',
|
|
18
|
+
'cloudflare-ai-gateway',
|
|
19
|
+
'cloudflare-workers-ai',
|
|
20
|
+
'xai',
|
|
21
|
+
'openrouter',
|
|
22
|
+
'vercel-ai-gateway',
|
|
23
|
+
'zai',
|
|
24
|
+
'zai-coding-cn',
|
|
25
|
+
'opencode',
|
|
26
|
+
'opencode-go',
|
|
27
|
+
'huggingface',
|
|
28
|
+
'fireworks',
|
|
29
|
+
'together',
|
|
30
|
+
'kimi-coding',
|
|
31
|
+
'minimax',
|
|
32
|
+
'minimax-cn',
|
|
33
|
+
'moonshotai',
|
|
34
|
+
'moonshotai-cn',
|
|
35
|
+
'xiaomi',
|
|
36
|
+
'xiaomi-token-plan-cn',
|
|
37
|
+
'xiaomi-token-plan-ams',
|
|
38
|
+
'xiaomi-token-plan-sgp'
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 'claude',
|
|
43
|
+
label: 'Claude',
|
|
44
|
+
description: 'Runs on your Anthropic API key',
|
|
45
|
+
supportedProviderIds: [
|
|
46
|
+
'anthropic'
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
];
|
|
50
|
+
export function listHarnesses() {
|
|
51
|
+
return harnesses;
|
|
52
|
+
}
|
|
53
|
+
export function getHarness(id) {
|
|
54
|
+
const harness = harnesses.find((item)=>item.id === id);
|
|
55
|
+
if (harness === undefined) throw new Error(`Unknown harness: ${id}`);
|
|
56
|
+
return harness;
|
|
57
|
+
}
|
|
58
|
+
export function harnessSupportsProvider(harnessId, providerId) {
|
|
59
|
+
return getHarness(harnessId).supportedProviderIds.includes(providerId);
|
|
60
|
+
}
|
|
61
|
+
export function configSupportsHarness(config, harness) {
|
|
62
|
+
return config.kind === 'custom' ? harness.id === DEFAULT_HARNESS : harness.supportedProviderIds.includes(config.providerId);
|
|
63
|
+
}
|
|
64
|
+
export function compatibleHarnessIds({ isCustom, providerId }) {
|
|
65
|
+
if (isCustom) return [
|
|
66
|
+
DEFAULT_HARNESS
|
|
67
|
+
];
|
|
68
|
+
return harnesses.filter((harness)=>harness.supportedProviderIds.includes(providerId)).map((harness)=>harness.id);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=harness-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/harness-policy.ts"],"sourcesContent":["import type {HarnessDescriptor, HarnessId, ProviderConfig} from './models.js';\n\nexport const DEFAULT_HARNESS: HarnessId = 'pi';\n\nconst harnesses: readonly HarnessDescriptor[] = [\n {\n id: 'pi',\n label: 'pi',\n description: 'Works with 30+ model providers',\n supportedProviderIds: [\n 'anthropic',\n 'ant-ling',\n 'azure-openai-responses',\n 'openai',\n 'deepseek',\n 'nvidia',\n 'google',\n 'mistral',\n 'groq',\n 'cerebras',\n 'cloudflare-ai-gateway',\n 'cloudflare-workers-ai',\n 'xai',\n 'openrouter',\n 'vercel-ai-gateway',\n 'zai',\n 'zai-coding-cn',\n 'opencode',\n 'opencode-go',\n 'huggingface',\n 'fireworks',\n 'together',\n 'kimi-coding',\n 'minimax',\n 'minimax-cn',\n 'moonshotai',\n 'moonshotai-cn',\n 'xiaomi',\n 'xiaomi-token-plan-cn',\n 'xiaomi-token-plan-ams',\n 'xiaomi-token-plan-sgp',\n ],\n },\n {\n id: 'claude',\n label: 'Claude',\n description: 'Runs on your Anthropic API key',\n supportedProviderIds: ['anthropic'],\n },\n];\n\nexport function listHarnesses(): readonly HarnessDescriptor[] {\n return harnesses;\n}\n\nexport function getHarness(id: HarnessId): HarnessDescriptor {\n const harness = harnesses.find((item) => item.id === id);\n if (harness === undefined) throw new Error(`Unknown harness: ${id}`);\n return harness;\n}\n\nexport function harnessSupportsProvider(harnessId: HarnessId, providerId: string): boolean {\n return getHarness(harnessId).supportedProviderIds.includes(providerId);\n}\n\nexport function configSupportsHarness(config: ProviderConfig, harness: HarnessDescriptor): boolean {\n return config.kind === 'custom'\n ? harness.id === DEFAULT_HARNESS\n : harness.supportedProviderIds.includes(config.providerId);\n}\n\nexport function compatibleHarnessIds({\n isCustom,\n providerId,\n}: {\n isCustom: boolean;\n providerId: string;\n}): HarnessId[] {\n if (isCustom) return [DEFAULT_HARNESS];\n return harnesses\n .filter((harness) => harness.supportedProviderIds.includes(providerId))\n .map((harness) => harness.id);\n}\n"],"names":["DEFAULT_HARNESS","harnesses","id","label","description","supportedProviderIds","listHarnesses","getHarness","harness","find","item","undefined","Error","harnessSupportsProvider","harnessId","providerId","includes","configSupportsHarness","config","kind","compatibleHarnessIds","isCustom","filter","map"],"mappings":"AAEA,OAAO,MAAMA,kBAA6B,KAAK;AAE/C,MAAMC,YAA0C;IAC9C;QACEC,IAAI;QACJC,OAAO;QACPC,aAAa;QACbC,sBAAsB;YACpB;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD;IACH;IACA;QACEH,IAAI;QACJC,OAAO;QACPC,aAAa;QACbC,sBAAsB;YAAC;SAAY;IACrC;CACD;AAED,OAAO,SAASC;IACd,OAAOL;AACT;AAEA,OAAO,SAASM,WAAWL,EAAa;IACtC,MAAMM,UAAUP,UAAUQ,IAAI,CAAC,CAACC,OAASA,KAAKR,EAAE,KAAKA;IACrD,IAAIM,YAAYG,WAAW,MAAM,IAAIC,MAAM,CAAC,iBAAiB,EAAEV,IAAI;IACnE,OAAOM;AACT;AAEA,OAAO,SAASK,wBAAwBC,SAAoB,EAAEC,UAAkB;IAC9E,OAAOR,WAAWO,WAAWT,oBAAoB,CAACW,QAAQ,CAACD;AAC7D;AAEA,OAAO,SAASE,sBAAsBC,MAAsB,EAAEV,OAA0B;IACtF,OAAOU,OAAOC,IAAI,KAAK,WACnBX,QAAQN,EAAE,KAAKF,kBACfQ,QAAQH,oBAAoB,CAACW,QAAQ,CAACE,OAAOH,UAAU;AAC7D;AAEA,OAAO,SAASK,qBAAqB,EACnCC,QAAQ,EACRN,UAAU,EAIX;IACC,IAAIM,UAAU,OAAO;QAACrB;KAAgB;IACtC,OAAOC,UACJqB,MAAM,CAAC,CAACd,UAAYA,QAAQH,oBAAoB,CAACW,QAAQ,CAACD,aAC1DQ,GAAG,CAAC,CAACf,UAAYA,QAAQN,EAAE;AAChC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { BuiltinProviderConfig, CustomProviderConfig, SupportedProvider } from './models.js';
|
|
2
|
+
export type ManagementModal = {
|
|
3
|
+
readonly kind: 'closed';
|
|
4
|
+
} | {
|
|
5
|
+
readonly kind: 'configure-builtin';
|
|
6
|
+
readonly provider: SupportedProvider;
|
|
7
|
+
} | {
|
|
8
|
+
readonly kind: 'edit-builtin';
|
|
9
|
+
readonly provider: SupportedProvider;
|
|
10
|
+
readonly config: BuiltinProviderConfig;
|
|
11
|
+
} | {
|
|
12
|
+
readonly kind: 'change-default-model';
|
|
13
|
+
readonly provider: SupportedProvider;
|
|
14
|
+
readonly config: BuiltinProviderConfig;
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: 'create-custom';
|
|
17
|
+
} | {
|
|
18
|
+
readonly kind: 'edit-custom';
|
|
19
|
+
readonly config: CustomProviderConfig;
|
|
20
|
+
} | {
|
|
21
|
+
readonly kind: 'show-usage';
|
|
22
|
+
readonly providerId: string;
|
|
23
|
+
readonly initialModel: string | null;
|
|
24
|
+
readonly restoreFocusToConfiguredProviders?: boolean | undefined;
|
|
25
|
+
};
|
|
26
|
+
export type ManagementModalAction = {
|
|
27
|
+
readonly type: 'close';
|
|
28
|
+
} | {
|
|
29
|
+
readonly type: 'configure-builtin';
|
|
30
|
+
readonly provider: SupportedProvider;
|
|
31
|
+
} | {
|
|
32
|
+
readonly type: 'edit-builtin';
|
|
33
|
+
readonly provider: SupportedProvider;
|
|
34
|
+
readonly config: BuiltinProviderConfig;
|
|
35
|
+
} | {
|
|
36
|
+
readonly type: 'change-default-model';
|
|
37
|
+
readonly provider: SupportedProvider;
|
|
38
|
+
readonly config: BuiltinProviderConfig;
|
|
39
|
+
} | {
|
|
40
|
+
readonly type: 'create-custom';
|
|
41
|
+
} | {
|
|
42
|
+
readonly type: 'edit-custom';
|
|
43
|
+
readonly config: CustomProviderConfig;
|
|
44
|
+
} | {
|
|
45
|
+
readonly type: 'show-usage';
|
|
46
|
+
readonly providerId: string;
|
|
47
|
+
readonly initialModel: string | null;
|
|
48
|
+
readonly restoreFocusToConfiguredProviders?: boolean | undefined;
|
|
49
|
+
};
|
|
50
|
+
export declare function managementModalReducer(_state: ManagementModal, action: ManagementModalAction): ManagementModal;
|
|
51
|
+
//# sourceMappingURL=model-provider-management-reducer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-provider-management-reducer.d.ts","sourceRoot":"","sources":["../../src/core/model-provider-management-reducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAC,MAAM,aAAa,CAAC;AAEhG,MAAM,MAAM,eAAe,GACvB;IAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAC,GACzB;IAAC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAC,GAC1E;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;CACxC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;CACxC,GACD;IAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CAAC,GAChC;IAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAA;CAAC,GACrE;IACE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClE,CAAC;AAEN,MAAM,MAAM,qBAAqB,GAC7B;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GACxB;IAAC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAC,GAC1E;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;CACxC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;CACxC,GACD;IAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CAAC,GAChC;IAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAA;CAAC,GACrE;IACE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClE,CAAC;AAEN,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,qBAAqB,GAC5B,eAAe,CAsBjB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export function managementModalReducer(_state, action) {
|
|
2
|
+
switch(action.type){
|
|
3
|
+
case 'close':
|
|
4
|
+
return {
|
|
5
|
+
kind: 'closed'
|
|
6
|
+
};
|
|
7
|
+
case 'configure-builtin':
|
|
8
|
+
return {
|
|
9
|
+
kind: 'configure-builtin',
|
|
10
|
+
provider: action.provider
|
|
11
|
+
};
|
|
12
|
+
case 'edit-builtin':
|
|
13
|
+
return {
|
|
14
|
+
kind: 'edit-builtin',
|
|
15
|
+
provider: action.provider,
|
|
16
|
+
config: action.config
|
|
17
|
+
};
|
|
18
|
+
case 'change-default-model':
|
|
19
|
+
return {
|
|
20
|
+
kind: 'change-default-model',
|
|
21
|
+
provider: action.provider,
|
|
22
|
+
config: action.config
|
|
23
|
+
};
|
|
24
|
+
case 'create-custom':
|
|
25
|
+
return {
|
|
26
|
+
kind: 'create-custom'
|
|
27
|
+
};
|
|
28
|
+
case 'edit-custom':
|
|
29
|
+
return {
|
|
30
|
+
kind: 'edit-custom',
|
|
31
|
+
config: action.config
|
|
32
|
+
};
|
|
33
|
+
case 'show-usage':
|
|
34
|
+
return {
|
|
35
|
+
kind: 'show-usage',
|
|
36
|
+
providerId: action.providerId,
|
|
37
|
+
initialModel: action.initialModel,
|
|
38
|
+
restoreFocusToConfiguredProviders: action.restoreFocusToConfiguredProviders ?? false
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=model-provider-management-reducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/model-provider-management-reducer.ts"],"sourcesContent":["import type {BuiltinProviderConfig, CustomProviderConfig, SupportedProvider} from './models.js';\n\nexport type ManagementModal =\n | {readonly kind: 'closed'}\n | {readonly kind: 'configure-builtin'; readonly provider: SupportedProvider}\n | {\n readonly kind: 'edit-builtin';\n readonly provider: SupportedProvider;\n readonly config: BuiltinProviderConfig;\n }\n | {\n readonly kind: 'change-default-model';\n readonly provider: SupportedProvider;\n readonly config: BuiltinProviderConfig;\n }\n | {readonly kind: 'create-custom'}\n | {readonly kind: 'edit-custom'; readonly config: CustomProviderConfig}\n | {\n readonly kind: 'show-usage';\n readonly providerId: string;\n readonly initialModel: string | null;\n readonly restoreFocusToConfiguredProviders?: boolean | undefined;\n };\n\nexport type ManagementModalAction =\n | {readonly type: 'close'}\n | {readonly type: 'configure-builtin'; readonly provider: SupportedProvider}\n | {\n readonly type: 'edit-builtin';\n readonly provider: SupportedProvider;\n readonly config: BuiltinProviderConfig;\n }\n | {\n readonly type: 'change-default-model';\n readonly provider: SupportedProvider;\n readonly config: BuiltinProviderConfig;\n }\n | {readonly type: 'create-custom'}\n | {readonly type: 'edit-custom'; readonly config: CustomProviderConfig}\n | {\n readonly type: 'show-usage';\n readonly providerId: string;\n readonly initialModel: string | null;\n readonly restoreFocusToConfiguredProviders?: boolean | undefined;\n };\n\nexport function managementModalReducer(\n _state: ManagementModal,\n action: ManagementModalAction,\n): ManagementModal {\n switch (action.type) {\n case 'close':\n return {kind: 'closed'};\n case 'configure-builtin':\n return {kind: 'configure-builtin', provider: action.provider};\n case 'edit-builtin':\n return {kind: 'edit-builtin', provider: action.provider, config: action.config};\n case 'change-default-model':\n return {kind: 'change-default-model', provider: action.provider, config: action.config};\n case 'create-custom':\n return {kind: 'create-custom'};\n case 'edit-custom':\n return {kind: 'edit-custom', config: action.config};\n case 'show-usage':\n return {\n kind: 'show-usage',\n providerId: action.providerId,\n initialModel: action.initialModel,\n restoreFocusToConfiguredProviders: action.restoreFocusToConfiguredProviders ?? false,\n };\n }\n}\n"],"names":["managementModalReducer","_state","action","type","kind","provider","config","providerId","initialModel","restoreFocusToConfiguredProviders"],"mappings":"AA8CA,OAAO,SAASA,uBACdC,MAAuB,EACvBC,MAA6B;IAE7B,OAAQA,OAAOC,IAAI;QACjB,KAAK;YACH,OAAO;gBAACC,MAAM;YAAQ;QACxB,KAAK;YACH,OAAO;gBAACA,MAAM;gBAAqBC,UAAUH,OAAOG,QAAQ;YAAA;QAC9D,KAAK;YACH,OAAO;gBAACD,MAAM;gBAAgBC,UAAUH,OAAOG,QAAQ;gBAAEC,QAAQJ,OAAOI,MAAM;YAAA;QAChF,KAAK;YACH,OAAO;gBAACF,MAAM;gBAAwBC,UAAUH,OAAOG,QAAQ;gBAAEC,QAAQJ,OAAOI,MAAM;YAAA;QACxF,KAAK;YACH,OAAO;gBAACF,MAAM;YAAe;QAC/B,KAAK;YACH,OAAO;gBAACA,MAAM;gBAAeE,QAAQJ,OAAOI,MAAM;YAAA;QACpD,KAAK;YACH,OAAO;gBACLF,MAAM;gBACNG,YAAYL,OAAOK,UAAU;gBAC7BC,cAAcN,OAAOM,YAAY;gBACjCC,mCAAmCP,OAAOO,iCAAiC,IAAI;YACjF;IACJ;AACF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export type HarnessId = 'pi' | 'claude';
|
|
2
|
+
export type ProviderApi = 'openai-completions' | 'openai-responses' | 'anthropic-messages' | 'google-generative-ai';
|
|
3
|
+
export interface HarnessDescriptor {
|
|
4
|
+
readonly id: HarnessId;
|
|
5
|
+
readonly label: string;
|
|
6
|
+
readonly description: string;
|
|
7
|
+
readonly supportedProviderIds: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
export interface AgentModel {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly label: string;
|
|
12
|
+
readonly contextWindow?: number | undefined;
|
|
13
|
+
readonly maxOutputTokens?: number | undefined;
|
|
14
|
+
readonly inputImage?: boolean | undefined;
|
|
15
|
+
readonly reasoning?: boolean | undefined;
|
|
16
|
+
}
|
|
17
|
+
export interface CredentialField {
|
|
18
|
+
readonly key: string;
|
|
19
|
+
readonly label: string;
|
|
20
|
+
readonly secret: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface SupportedProvider {
|
|
23
|
+
readonly kind: 'supported';
|
|
24
|
+
readonly id: string;
|
|
25
|
+
readonly label: string;
|
|
26
|
+
readonly defaultModel: string | null;
|
|
27
|
+
readonly credentialFields: readonly CredentialField[];
|
|
28
|
+
readonly models: readonly AgentModel[];
|
|
29
|
+
}
|
|
30
|
+
export interface UnsupportedProvider {
|
|
31
|
+
readonly kind: 'unsupported';
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly label: string;
|
|
34
|
+
readonly unsupportedReason: string;
|
|
35
|
+
}
|
|
36
|
+
export type ProviderCatalogEntry = SupportedProvider | UnsupportedProvider;
|
|
37
|
+
export interface BuiltinProviderConfig {
|
|
38
|
+
readonly kind: 'builtin';
|
|
39
|
+
readonly providerId: string;
|
|
40
|
+
readonly defaultModel: string | null;
|
|
41
|
+
readonly createdAt: string;
|
|
42
|
+
readonly updatedAt: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ProviderHeader {
|
|
45
|
+
readonly name: string;
|
|
46
|
+
readonly value: string;
|
|
47
|
+
}
|
|
48
|
+
export interface CustomProviderConfig {
|
|
49
|
+
readonly kind: 'custom';
|
|
50
|
+
readonly providerId: string;
|
|
51
|
+
readonly displayName: string;
|
|
52
|
+
readonly api: ProviderApi;
|
|
53
|
+
readonly baseUrl: string;
|
|
54
|
+
readonly headers: readonly ProviderHeader[];
|
|
55
|
+
readonly secretHeaderNames: readonly string[];
|
|
56
|
+
readonly models: readonly AgentModel[];
|
|
57
|
+
readonly defaultModel: string | null;
|
|
58
|
+
readonly createdAt: string;
|
|
59
|
+
readonly updatedAt: string;
|
|
60
|
+
}
|
|
61
|
+
export type ProviderConfig = BuiltinProviderConfig | CustomProviderConfig;
|
|
62
|
+
export interface ProviderCatalog {
|
|
63
|
+
readonly providers: readonly ProviderCatalogEntry[];
|
|
64
|
+
}
|
|
65
|
+
export interface ProviderConfiguration {
|
|
66
|
+
readonly configs: readonly ProviderConfig[];
|
|
67
|
+
readonly defaultHarnessId: HarnessId | null;
|
|
68
|
+
readonly defaultProviderId: string | null;
|
|
69
|
+
}
|
|
70
|
+
export interface DefaultModelProviderSelection {
|
|
71
|
+
readonly defaultProviderId: string | null;
|
|
72
|
+
}
|
|
73
|
+
export interface DefaultHarnessSelection {
|
|
74
|
+
readonly defaultHarnessId: HarnessId;
|
|
75
|
+
}
|
|
76
|
+
export interface ProviderCredentialsCommand {
|
|
77
|
+
defaultModel?: string | null | undefined;
|
|
78
|
+
credentials: Record<string, string>;
|
|
79
|
+
setAsDefault?: boolean | undefined;
|
|
80
|
+
}
|
|
81
|
+
export interface CustomProviderHeaderCommand {
|
|
82
|
+
name: string;
|
|
83
|
+
value?: string | undefined;
|
|
84
|
+
secret: boolean;
|
|
85
|
+
keep?: boolean | undefined;
|
|
86
|
+
}
|
|
87
|
+
export interface CustomProviderModelCommand {
|
|
88
|
+
id: string;
|
|
89
|
+
label: string;
|
|
90
|
+
contextWindow?: number | undefined;
|
|
91
|
+
maxOutputTokens?: number | undefined;
|
|
92
|
+
inputImage?: boolean | undefined;
|
|
93
|
+
reasoning?: boolean | undefined;
|
|
94
|
+
}
|
|
95
|
+
export interface CreateCustomProviderCommand {
|
|
96
|
+
slug: string;
|
|
97
|
+
displayName: string;
|
|
98
|
+
api: ProviderApi;
|
|
99
|
+
baseUrl: string;
|
|
100
|
+
apiKey?: string | undefined;
|
|
101
|
+
headers?: CustomProviderHeaderCommand[] | undefined;
|
|
102
|
+
models: CustomProviderModelCommand[];
|
|
103
|
+
defaultModel?: string | null | undefined;
|
|
104
|
+
}
|
|
105
|
+
export interface UpdateCustomProviderCommand {
|
|
106
|
+
displayName?: string | undefined;
|
|
107
|
+
api?: ProviderApi | undefined;
|
|
108
|
+
baseUrl?: string | undefined;
|
|
109
|
+
apiKey?: string | undefined;
|
|
110
|
+
headers?: CustomProviderHeaderCommand[] | undefined;
|
|
111
|
+
models?: CustomProviderModelCommand[] | undefined;
|
|
112
|
+
defaultModel?: string | null | undefined;
|
|
113
|
+
}
|
|
114
|
+
export interface DiscoverProviderModelsCommand {
|
|
115
|
+
api?: ProviderApi | undefined;
|
|
116
|
+
baseUrl?: string | undefined;
|
|
117
|
+
apiKey?: string | undefined;
|
|
118
|
+
headers?: CustomProviderHeaderCommand[] | undefined;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/core/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/models.ts"],"sourcesContent":["export type HarnessId = 'pi' | 'claude';\nexport type ProviderApi =\n | 'openai-completions'\n | 'openai-responses'\n | 'anthropic-messages'\n | 'google-generative-ai';\n\nexport interface HarnessDescriptor {\n readonly id: HarnessId;\n readonly label: string;\n readonly description: string;\n readonly supportedProviderIds: readonly string[];\n}\n\nexport interface AgentModel {\n readonly id: string;\n readonly label: string;\n readonly contextWindow?: number | undefined;\n readonly maxOutputTokens?: number | undefined;\n readonly inputImage?: boolean | undefined;\n readonly reasoning?: boolean | undefined;\n}\n\nexport interface CredentialField {\n readonly key: string;\n readonly label: string;\n readonly secret: boolean;\n}\n\nexport interface SupportedProvider {\n readonly kind: 'supported';\n readonly id: string;\n readonly label: string;\n readonly defaultModel: string | null;\n readonly credentialFields: readonly CredentialField[];\n readonly models: readonly AgentModel[];\n}\n\nexport interface UnsupportedProvider {\n readonly kind: 'unsupported';\n readonly id: string;\n readonly label: string;\n readonly unsupportedReason: string;\n}\n\nexport type ProviderCatalogEntry = SupportedProvider | UnsupportedProvider;\n\nexport interface BuiltinProviderConfig {\n readonly kind: 'builtin';\n readonly providerId: string;\n readonly defaultModel: string | null;\n readonly createdAt: string;\n readonly updatedAt: string;\n}\n\nexport interface ProviderHeader {\n readonly name: string;\n readonly value: string;\n}\n\nexport interface CustomProviderConfig {\n readonly kind: 'custom';\n readonly providerId: string;\n readonly displayName: string;\n readonly api: ProviderApi;\n readonly baseUrl: string;\n readonly headers: readonly ProviderHeader[];\n readonly secretHeaderNames: readonly string[];\n readonly models: readonly AgentModel[];\n readonly defaultModel: string | null;\n readonly createdAt: string;\n readonly updatedAt: string;\n}\n\nexport type ProviderConfig = BuiltinProviderConfig | CustomProviderConfig;\n\nexport interface ProviderCatalog {\n readonly providers: readonly ProviderCatalogEntry[];\n}\n\nexport interface ProviderConfiguration {\n readonly configs: readonly ProviderConfig[];\n readonly defaultHarnessId: HarnessId | null;\n readonly defaultProviderId: string | null;\n}\n\nexport interface DefaultModelProviderSelection {\n readonly defaultProviderId: string | null;\n}\n\nexport interface DefaultHarnessSelection {\n readonly defaultHarnessId: HarnessId;\n}\n\nexport interface ProviderCredentialsCommand {\n defaultModel?: string | null | undefined;\n credentials: Record<string, string>;\n setAsDefault?: boolean | undefined;\n}\n\nexport interface CustomProviderHeaderCommand {\n name: string;\n value?: string | undefined;\n secret: boolean;\n keep?: boolean | undefined;\n}\n\nexport interface CustomProviderModelCommand {\n id: string;\n label: string;\n contextWindow?: number | undefined;\n maxOutputTokens?: number | undefined;\n inputImage?: boolean | undefined;\n reasoning?: boolean | undefined;\n}\n\nexport interface CreateCustomProviderCommand {\n slug: string;\n displayName: string;\n api: ProviderApi;\n baseUrl: string;\n apiKey?: string | undefined;\n headers?: CustomProviderHeaderCommand[] | undefined;\n models: CustomProviderModelCommand[];\n defaultModel?: string | null | undefined;\n}\n\nexport interface UpdateCustomProviderCommand {\n displayName?: string | undefined;\n api?: ProviderApi | undefined;\n baseUrl?: string | undefined;\n apiKey?: string | undefined;\n headers?: CustomProviderHeaderCommand[] | undefined;\n models?: CustomProviderModelCommand[] | undefined;\n defaultModel?: string | null | undefined;\n}\n\nexport interface DiscoverProviderModelsCommand {\n api?: ProviderApi | undefined;\n baseUrl?: string | undefined;\n apiKey?: string | undefined;\n headers?: CustomProviderHeaderCommand[] | undefined;\n}\n"],"names":[],"mappings":"AAyIA,WAKC"}
|