@shipfox/client-agent 5.0.0 → 6.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +57 -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 +7 -0
- package/dist/feature.d.ts.map +1 -1
- package/dist/feature.js +10 -9
- 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 +60 -295
- package/dist/hooks/api/model-providers.d.ts.map +1 -1
- package/dist/hooks/api/model-providers.js +51 -37
- 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/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/state/model-provider-onboarding.d.ts.map +1 -1
- package/dist/state/model-provider-onboarding.js +9 -18
- package/dist/state/model-provider-onboarding.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 +12 -10
- 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 +146 -81
- package/src/pages/model-provider-onboarding-page.tsx +62 -56
- package/src/routes/inputs.test.ts +11 -0
- package/src/routes/inputs.ts +9 -0
- package/src/routes/model-provider.tsx +4 -3
- package/src/state/model-provider-onboarding.test.ts +4 -4
- package/src/state/model-provider-onboarding.ts +13 -23
- 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
|
@@ -68,36 +68,36 @@ export const EditStoredSecrets = {
|
|
|
68
68
|
function customConfig() {
|
|
69
69
|
return {
|
|
70
70
|
kind: 'custom',
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
providerId: 'local-vllm',
|
|
72
|
+
displayName: 'Local vLLM',
|
|
73
73
|
api: 'openai-completions',
|
|
74
|
-
|
|
74
|
+
baseUrl: 'http://localhost:8000/v1',
|
|
75
75
|
headers: [
|
|
76
76
|
{
|
|
77
77
|
name: 'x-region',
|
|
78
78
|
value: 'us'
|
|
79
79
|
}
|
|
80
80
|
],
|
|
81
|
-
|
|
81
|
+
secretHeaderNames: [
|
|
82
82
|
'authorization'
|
|
83
83
|
],
|
|
84
84
|
models: [
|
|
85
85
|
{
|
|
86
86
|
id: 'llama-3.1',
|
|
87
87
|
label: 'Llama 3.1',
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
contextWindow: 128000,
|
|
89
|
+
maxOutputTokens: 16384
|
|
90
90
|
},
|
|
91
91
|
{
|
|
92
92
|
id: 'qwen-coder',
|
|
93
93
|
label: 'Qwen Coder',
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
contextWindow: 32768,
|
|
95
|
+
maxOutputTokens: 8192
|
|
96
96
|
}
|
|
97
97
|
],
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
defaultModel: 'llama-3.1',
|
|
99
|
+
createdAt: '2026-05-08T00:00:00.000Z',
|
|
100
|
+
updatedAt: '2026-05-08T00:00:00.000Z'
|
|
101
101
|
};
|
|
102
102
|
}
|
|
103
103
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/custom-model-provider-form.stories.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../src/components/custom-model-provider-form.stories.tsx"],"sourcesContent":["import {configureApiClient} from '@shipfox/client-api';\nimport {Modal, ModalContent, ModalHeader, ModalTitle} from '@shipfox/react-ui/modal';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {QueryClient, QueryClientProvider} from '@tanstack/react-query';\nimport {useMemo, useState} from 'react';\nimport type {CustomProviderConfig} from '#core/models.js';\nimport {CustomModelProviderForm} from './custom-model-provider-form.js';\n\ninterface CustomModelProviderFormStoryProps {\n mode: 'create' | 'edit';\n}\n\nfunction CustomModelProviderFormStory({mode}: CustomModelProviderFormStoryProps) {\n const [open, setOpen] = useState(true);\n const queryClient = useMemo(\n () => new QueryClient({defaultOptions: {queries: {retry: false}}}),\n [],\n );\n configureApiClient({\n baseUrl: 'https://api.example.test',\n fetchImpl: () => Promise.resolve(new Response(JSON.stringify({models: []}))),\n });\n\n return (\n <QueryClientProvider client={queryClient}>\n <div className=\"min-h-screen bg-background-neutral-background p-24\">\n <Modal open={open} onOpenChange={setOpen}>\n <ModalContent\n className=\"max-h-[min(760px,calc(100vh-32px))]\"\n aria-describedby={undefined}\n >\n <ModalTitle className=\"sr-only\">\n {mode === 'edit' ? 'Edit custom provider' : 'Add custom provider'}\n </ModalTitle>\n <ModalHeader title={mode === 'edit' ? 'Edit custom provider' : 'Add custom provider'} />\n <CustomModelProviderForm\n workspaceId=\"11111111-1111-4111-8111-111111111111\"\n existingConfig={mode === 'edit' ? customConfig() : undefined}\n onSaved={() => setOpen(false)}\n />\n </ModalContent>\n </Modal>\n </div>\n </QueryClientProvider>\n );\n}\n\nconst meta = {\n title: 'Agent/CustomProviderForm',\n component: CustomModelProviderFormStory,\n parameters: {layout: 'fullscreen'},\n args: {mode: 'create'},\n} satisfies Meta<typeof CustomModelProviderFormStory>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Playground: Story = {};\n\nexport const EditStoredSecrets: Story = {\n args: {mode: 'edit'},\n};\n\nfunction customConfig(): CustomProviderConfig {\n return {\n kind: 'custom',\n providerId: 'local-vllm',\n displayName: 'Local vLLM',\n api: 'openai-completions',\n baseUrl: 'http://localhost:8000/v1',\n headers: [{name: 'x-region', value: 'us'}],\n secretHeaderNames: ['authorization'],\n models: [\n {\n id: 'llama-3.1',\n label: 'Llama 3.1',\n contextWindow: 128000,\n maxOutputTokens: 16384,\n },\n {\n id: 'qwen-coder',\n label: 'Qwen Coder',\n contextWindow: 32768,\n maxOutputTokens: 8192,\n },\n ],\n defaultModel: 'llama-3.1',\n createdAt: '2026-05-08T00:00:00.000Z',\n updatedAt: '2026-05-08T00:00:00.000Z',\n };\n}\n"],"names":["configureApiClient","Modal","ModalContent","ModalHeader","ModalTitle","QueryClient","QueryClientProvider","useMemo","useState","CustomModelProviderForm","CustomModelProviderFormStory","mode","open","setOpen","queryClient","defaultOptions","queries","retry","baseUrl","fetchImpl","Promise","resolve","Response","JSON","stringify","models","client","div","className","onOpenChange","aria-describedby","undefined","title","workspaceId","existingConfig","customConfig","onSaved","meta","component","parameters","layout","args","Playground","EditStoredSecrets","kind","providerId","displayName","api","headers","name","value","secretHeaderNames","id","label","contextWindow","maxOutputTokens","defaultModel","createdAt","updatedAt"],"mappings":";AAAA,SAAQA,kBAAkB,QAAO,sBAAsB;AACvD,SAAQC,KAAK,EAAEC,YAAY,EAAEC,WAAW,EAAEC,UAAU,QAAO,0BAA0B;AAErF,SAAQC,WAAW,EAAEC,mBAAmB,QAAO,wBAAwB;AACvE,SAAQC,OAAO,EAAEC,QAAQ,QAAO,QAAQ;AAExC,SAAQC,uBAAuB,QAAO,kCAAkC;AAMxE,SAASC,6BAA6B,EAACC,IAAI,EAAoC;IAC7E,MAAM,CAACC,MAAMC,QAAQ,GAAGL,SAAS;IACjC,MAAMM,cAAcP,QAClB,IAAM,IAAIF,YAAY;YAACU,gBAAgB;gBAACC,SAAS;oBAACC,OAAO;gBAAK;YAAC;QAAC,IAChE,EAAE;IAEJjB,mBAAmB;QACjBkB,SAAS;QACTC,WAAW,IAAMC,QAAQC,OAAO,CAAC,IAAIC,SAASC,KAAKC,SAAS,CAAC;gBAACC,QAAQ,EAAE;YAAA;IAC1E;IAEA,qBACE,KAACnB;QAAoBoB,QAAQZ;kBAC3B,cAAA,KAACa;YAAIC,WAAU;sBACb,cAAA,KAAC3B;gBAAMW,MAAMA;gBAAMiB,cAAchB;0BAC/B,cAAA,MAACX;oBACC0B,WAAU;oBACVE,oBAAkBC;;sCAElB,KAAC3B;4BAAWwB,WAAU;sCACnBjB,SAAS,SAAS,yBAAyB;;sCAE9C,KAACR;4BAAY6B,OAAOrB,SAAS,SAAS,yBAAyB;;sCAC/D,KAACF;4BACCwB,aAAY;4BACZC,gBAAgBvB,SAAS,SAASwB,iBAAiBJ;4BACnDK,SAAS,IAAMvB,QAAQ;;;;;;;AAOrC;AAEA,MAAMwB,OAAO;IACXL,OAAO;IACPM,WAAW5B;IACX6B,YAAY;QAACC,QAAQ;IAAY;IACjCC,MAAM;QAAC9B,MAAM;IAAQ;AACvB;AAEA,eAAe0B,KAAK;AAGpB,OAAO,MAAMK,aAAoB,CAAC,EAAE;AAEpC,OAAO,MAAMC,oBAA2B;IACtCF,MAAM;QAAC9B,MAAM;IAAM;AACrB,EAAE;AAEF,SAASwB;IACP,OAAO;QACLS,MAAM;QACNC,YAAY;QACZC,aAAa;QACbC,KAAK;QACL7B,SAAS;QACT8B,SAAS;YAAC;gBAACC,MAAM;gBAAYC,OAAO;YAAI;SAAE;QAC1CC,mBAAmB;YAAC;SAAgB;QACpC1B,QAAQ;YACN;gBACE2B,IAAI;gBACJC,OAAO;gBACPC,eAAe;gBACfC,iBAAiB;YACnB;YACA;gBACEH,IAAI;gBACJC,OAAO;gBACPC,eAAe;gBACfC,iBAAiB;YACnB;SACD;QACDC,cAAc;QACdC,WAAW;QACXC,WAAW;IACb;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CreateCustomProviderCommand, CustomProviderConfig, DiscoverProviderModelsCommand, ProviderApi, UpdateCustomProviderCommand } from '#core/models.js';
|
|
2
2
|
export interface CustomModelProviderHeaderFormValue {
|
|
3
3
|
client_id: string;
|
|
4
4
|
name: string;
|
|
@@ -19,7 +19,7 @@ export interface CustomModelProviderModelFormValue {
|
|
|
19
19
|
export interface CustomModelProviderFormValues {
|
|
20
20
|
slug: string;
|
|
21
21
|
display_name: string;
|
|
22
|
-
api:
|
|
22
|
+
api: ProviderApi;
|
|
23
23
|
base_url: string;
|
|
24
24
|
api_key: string;
|
|
25
25
|
headers: CustomModelProviderHeaderFormValue[];
|
|
@@ -27,13 +27,13 @@ export interface CustomModelProviderFormValues {
|
|
|
27
27
|
default_model: string;
|
|
28
28
|
}
|
|
29
29
|
export declare function createCustomModelProviderFormValues(): CustomModelProviderFormValues;
|
|
30
|
-
export declare function editCustomModelProviderFormValues(config:
|
|
31
|
-
export declare function buildCreateCustomModelProviderBody(values: CustomModelProviderFormValues):
|
|
32
|
-
export declare function buildUpdateCustomModelProviderBody(config:
|
|
33
|
-
export declare function customHeadersDirty(config:
|
|
34
|
-
export declare function customModelsDirty(config:
|
|
35
|
-
export declare function buildDiscoverModelsBody(values: CustomModelProviderFormValues):
|
|
36
|
-
export declare function buildDiscoverModelsBySlugBody(config:
|
|
30
|
+
export declare function editCustomModelProviderFormValues(config: CustomProviderConfig): CustomModelProviderFormValues;
|
|
31
|
+
export declare function buildCreateCustomModelProviderBody(values: CustomModelProviderFormValues): CreateCustomProviderCommand;
|
|
32
|
+
export declare function buildUpdateCustomModelProviderBody(config: CustomProviderConfig, values: CustomModelProviderFormValues): UpdateCustomProviderCommand;
|
|
33
|
+
export declare function customHeadersDirty(config: CustomProviderConfig, headers: CustomModelProviderHeaderFormValue[]): boolean;
|
|
34
|
+
export declare function customModelsDirty(config: CustomProviderConfig, models: CustomModelProviderModelFormValue[]): boolean;
|
|
35
|
+
export declare function buildDiscoverModelsBody(values: CustomModelProviderFormValues): DiscoverProviderModelsCommand;
|
|
36
|
+
export declare function buildDiscoverModelsBySlugBody(config: CustomProviderConfig, values: CustomModelProviderFormValues): DiscoverProviderModelsCommand;
|
|
37
37
|
export declare function formatBaseUrlHost(baseUrl: string): string;
|
|
38
38
|
export declare function createFormRowId(): string;
|
|
39
39
|
//# sourceMappingURL=custom-model-provider-payload.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-model-provider-payload.d.ts","sourceRoot":"","sources":["../../src/components/custom-model-provider-payload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"custom-model-provider-payload.d.ts","sourceRoot":"","sources":["../../src/components/custom-model-provider-payload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,2BAA2B,EAC3B,oBAAoB,EACpB,6BAA6B,EAC7B,WAAW,EACX,2BAA2B,EAC5B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,kCAAkC;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iCAAiC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,WAAW,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,kCAAkC,EAAE,CAAC;IAC9C,MAAM,EAAE,iCAAiC,EAAE,CAAC;IAC5C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mCAAmC,IAAI,6BAA6B,CAqBnF;AAED,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,oBAAoB,GAC3B,6BAA6B,CA4B/B;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,6BAA6B,GACpC,2BAA2B,CAW7B;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,6BAA6B,GACpC,2BAA2B,CAa7B;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,kCAAkC,EAAE,GAC5C,OAAO,CAgBT;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,iCAAiC,EAAE,GAC1C,OAAO,CAcT;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,6BAA6B,GACpC,6BAA6B,CAe/B;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,oBAAoB,EAC5B,MAAM,EAAE,6BAA6B,GACpC,6BAA6B,CAO/B;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOzD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
|
@@ -22,10 +22,10 @@ export function createCustomModelProviderFormValues() {
|
|
|
22
22
|
}
|
|
23
23
|
export function editCustomModelProviderFormValues(config) {
|
|
24
24
|
return {
|
|
25
|
-
slug: config.
|
|
26
|
-
display_name: config.
|
|
25
|
+
slug: config.providerId,
|
|
26
|
+
display_name: config.displayName,
|
|
27
27
|
api: config.api,
|
|
28
|
-
base_url: config.
|
|
28
|
+
base_url: config.baseUrl,
|
|
29
29
|
api_key: '',
|
|
30
30
|
headers: [
|
|
31
31
|
...config.headers.map((header)=>({
|
|
@@ -36,7 +36,7 @@ export function editCustomModelProviderFormValues(config) {
|
|
|
36
36
|
hasStoredValue: false,
|
|
37
37
|
storedName: header.name
|
|
38
38
|
})),
|
|
39
|
-
...config.
|
|
39
|
+
...config.secretHeaderNames.map((name)=>({
|
|
40
40
|
client_id: createFormRowId(),
|
|
41
41
|
name,
|
|
42
42
|
value: '',
|
|
@@ -46,37 +46,37 @@ export function editCustomModelProviderFormValues(config) {
|
|
|
46
46
|
}))
|
|
47
47
|
],
|
|
48
48
|
models: config.models.map(modelFormValue),
|
|
49
|
-
default_model: config.
|
|
49
|
+
default_model: config.defaultModel ?? ''
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
export function buildCreateCustomModelProviderBody(values) {
|
|
53
53
|
return {
|
|
54
54
|
slug: values.slug.trim(),
|
|
55
|
-
|
|
55
|
+
displayName: values.display_name.trim(),
|
|
56
56
|
api: values.api,
|
|
57
|
-
|
|
57
|
+
baseUrl: values.base_url.trim(),
|
|
58
58
|
...values.api_key.trim() ? {
|
|
59
|
-
|
|
59
|
+
apiKey: values.api_key.trim()
|
|
60
60
|
} : {},
|
|
61
61
|
...requestHeaders(values.headers).length > 0 ? {
|
|
62
62
|
headers: requestHeaders(values.headers)
|
|
63
63
|
} : {},
|
|
64
64
|
models: requestModels(values.models),
|
|
65
65
|
...values.default_model.trim() ? {
|
|
66
|
-
|
|
66
|
+
defaultModel: values.default_model.trim()
|
|
67
67
|
} : {}
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
70
|
export function buildUpdateCustomModelProviderBody(config, values) {
|
|
71
71
|
const body = {};
|
|
72
|
-
if (values.display_name.trim() !== config.
|
|
72
|
+
if (values.display_name.trim() !== config.displayName) body.displayName = values.display_name.trim();
|
|
73
73
|
if (values.api !== config.api) body.api = values.api;
|
|
74
|
-
if (values.base_url.trim() !== config.
|
|
75
|
-
if (values.api_key.trim()) body.
|
|
74
|
+
if (values.base_url.trim() !== config.baseUrl) body.baseUrl = values.base_url.trim();
|
|
75
|
+
if (values.api_key.trim()) body.apiKey = values.api_key.trim();
|
|
76
76
|
if (customHeadersDirty(config, values.headers)) body.headers = updateHeaders(values.headers);
|
|
77
77
|
if (customModelsDirty(config, values.models)) body.models = requestModels(values.models);
|
|
78
78
|
const nextDefault = values.default_model.trim() || null;
|
|
79
|
-
if (nextDefault !== config.
|
|
79
|
+
if (nextDefault !== config.defaultModel) body.defaultModel = nextDefault;
|
|
80
80
|
return body;
|
|
81
81
|
}
|
|
82
82
|
export function customHeadersDirty(config, headers) {
|
|
@@ -86,7 +86,7 @@ export function customHeadersDirty(config, headers) {
|
|
|
86
86
|
value: header.value,
|
|
87
87
|
secret: false
|
|
88
88
|
})),
|
|
89
|
-
...config.
|
|
89
|
+
...config.secretHeaderNames.map((name)=>({
|
|
90
90
|
name: normalizeHeaderName(name),
|
|
91
91
|
secret: true,
|
|
92
92
|
keep: true
|
|
@@ -94,19 +94,35 @@ export function customHeadersDirty(config, headers) {
|
|
|
94
94
|
]);
|
|
95
95
|
}
|
|
96
96
|
export function customModelsDirty(config, models) {
|
|
97
|
-
return JSON.stringify(requestModels(models)) !== JSON.stringify(config.models)
|
|
97
|
+
return JSON.stringify(requestModels(models)) !== JSON.stringify(config.models.map((model)=>({
|
|
98
|
+
id: model.id,
|
|
99
|
+
label: model.label,
|
|
100
|
+
...model.contextWindow === undefined ? {} : {
|
|
101
|
+
contextWindow: model.contextWindow
|
|
102
|
+
},
|
|
103
|
+
...model.maxOutputTokens === undefined ? {} : {
|
|
104
|
+
maxOutputTokens: model.maxOutputTokens
|
|
105
|
+
},
|
|
106
|
+
...model.inputImage ? {
|
|
107
|
+
inputImage: true
|
|
108
|
+
} : {},
|
|
109
|
+
...model.reasoning ? {
|
|
110
|
+
reasoning: true
|
|
111
|
+
} : {}
|
|
112
|
+
})));
|
|
98
113
|
}
|
|
99
114
|
export function buildDiscoverModelsBody(values) {
|
|
100
115
|
return {
|
|
101
116
|
api: values.api,
|
|
102
|
-
|
|
117
|
+
baseUrl: values.base_url.trim(),
|
|
103
118
|
...values.api_key.trim() ? {
|
|
104
|
-
|
|
119
|
+
apiKey: values.api_key.trim()
|
|
105
120
|
} : {},
|
|
106
121
|
...requestHeaders(values.headers).length > 0 ? {
|
|
107
122
|
headers: requestHeaders(values.headers).map(({ name, value })=>({
|
|
108
123
|
name,
|
|
109
|
-
value
|
|
124
|
+
value,
|
|
125
|
+
secret: false
|
|
110
126
|
}))
|
|
111
127
|
} : {}
|
|
112
128
|
};
|
|
@@ -114,8 +130,8 @@ export function buildDiscoverModelsBody(values) {
|
|
|
114
130
|
export function buildDiscoverModelsBySlugBody(config, values) {
|
|
115
131
|
const body = {};
|
|
116
132
|
if (values.api !== config.api) body.api = values.api;
|
|
117
|
-
if (values.base_url.trim() !== config.
|
|
118
|
-
if (values.api_key.trim()) body.
|
|
133
|
+
if (values.base_url.trim() !== config.baseUrl) body.baseUrl = values.base_url.trim();
|
|
134
|
+
if (values.api_key.trim()) body.apiKey = values.api_key.trim();
|
|
119
135
|
body.headers = updateHeaders(values.headers);
|
|
120
136
|
return body;
|
|
121
137
|
}
|
|
@@ -170,13 +186,13 @@ function requestModels(models) {
|
|
|
170
186
|
id,
|
|
171
187
|
label,
|
|
172
188
|
...model.context_window.trim() ? {
|
|
173
|
-
|
|
189
|
+
contextWindow: Number(model.context_window)
|
|
174
190
|
} : {},
|
|
175
191
|
...model.max_output_tokens.trim() ? {
|
|
176
|
-
|
|
192
|
+
maxOutputTokens: Number(model.max_output_tokens)
|
|
177
193
|
} : {},
|
|
178
194
|
...model.input_image ? {
|
|
179
|
-
|
|
195
|
+
inputImage: true
|
|
180
196
|
} : {},
|
|
181
197
|
...model.reasoning ? {
|
|
182
198
|
reasoning: true
|
|
@@ -190,9 +206,9 @@ function modelFormValue(model) {
|
|
|
190
206
|
client_id: createFormRowId(),
|
|
191
207
|
id: model.id,
|
|
192
208
|
label: model.label,
|
|
193
|
-
context_window: model.
|
|
194
|
-
max_output_tokens: model.
|
|
195
|
-
input_image: model.
|
|
209
|
+
context_window: model.contextWindow?.toString() ?? '',
|
|
210
|
+
max_output_tokens: model.maxOutputTokens?.toString() ?? '',
|
|
211
|
+
input_image: model.inputImage ?? false,
|
|
196
212
|
reasoning: model.reasoning ?? false
|
|
197
213
|
};
|
|
198
214
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/custom-model-provider-payload.ts"],"sourcesContent":["import type {\n CreateCustomModelProviderBodyDto,\n CustomAgentModelDto,\n CustomModelProviderConfigDto,\n DiscoverCustomModelProviderModelsBodyDto,\n DiscoverCustomModelProviderModelsBySlugBodyDto,\n ModelProviderApi,\n UpdateCustomModelProviderBodyDto,\n} from '@shipfox/api-agent-dto';\n\ntype CreateHeaderRequest = NonNullable<CreateCustomModelProviderBodyDto['headers']>[number];\ntype UpdateHeaderRequest = NonNullable<UpdateCustomModelProviderBodyDto['headers']>[number];\n\nexport interface CustomModelProviderHeaderFormValue {\n client_id: string;\n name: string;\n value: string;\n secret: boolean;\n hasStoredValue: boolean;\n storedName: string;\n}\n\nexport interface CustomModelProviderModelFormValue {\n client_id: string;\n id: string;\n label: string;\n context_window: string;\n max_output_tokens: string;\n input_image: boolean;\n reasoning: boolean;\n}\n\nexport interface CustomModelProviderFormValues {\n slug: string;\n display_name: string;\n api: ModelProviderApi;\n base_url: string;\n api_key: string;\n headers: CustomModelProviderHeaderFormValue[];\n models: CustomModelProviderModelFormValue[];\n default_model: string;\n}\n\nexport function createCustomModelProviderFormValues(): CustomModelProviderFormValues {\n return {\n slug: '',\n display_name: '',\n api: 'openai-completions',\n base_url: '',\n api_key: '',\n headers: [],\n models: [\n {\n client_id: createFormRowId(),\n id: '',\n label: '',\n context_window: '',\n max_output_tokens: '',\n input_image: false,\n reasoning: false,\n },\n ],\n default_model: '',\n };\n}\n\nexport function editCustomModelProviderFormValues(\n config: CustomModelProviderConfigDto,\n): CustomModelProviderFormValues {\n return {\n slug: config.provider_id,\n display_name: config.display_name,\n api: config.api,\n base_url: config.base_url,\n api_key: '',\n headers: [\n ...config.headers.map((header) => ({\n client_id: createFormRowId(),\n name: header.name,\n value: header.value,\n secret: false,\n hasStoredValue: false,\n storedName: header.name,\n })),\n ...config.secret_header_names.map((name) => ({\n client_id: createFormRowId(),\n name,\n value: '',\n secret: true,\n hasStoredValue: true,\n storedName: normalizeHeaderName(name),\n })),\n ],\n models: config.models.map(modelFormValue),\n default_model: config.default_model ?? '',\n };\n}\n\nexport function buildCreateCustomModelProviderBody(\n values: CustomModelProviderFormValues,\n): CreateCustomModelProviderBodyDto {\n return {\n slug: values.slug.trim(),\n display_name: values.display_name.trim(),\n api: values.api,\n base_url: values.base_url.trim(),\n ...(values.api_key.trim() ? {api_key: values.api_key.trim()} : {}),\n ...(requestHeaders(values.headers).length > 0 ? {headers: requestHeaders(values.headers)} : {}),\n models: requestModels(values.models),\n ...(values.default_model.trim() ? {default_model: values.default_model.trim()} : {}),\n };\n}\n\nexport function buildUpdateCustomModelProviderBody(\n config: CustomModelProviderConfigDto,\n values: CustomModelProviderFormValues,\n): UpdateCustomModelProviderBodyDto {\n const body: UpdateCustomModelProviderBodyDto = {};\n if (values.display_name.trim() !== config.display_name)\n body.display_name = values.display_name.trim();\n if (values.api !== config.api) body.api = values.api;\n if (values.base_url.trim() !== config.base_url) body.base_url = values.base_url.trim();\n if (values.api_key.trim()) body.api_key = values.api_key.trim();\n if (customHeadersDirty(config, values.headers)) body.headers = updateHeaders(values.headers);\n if (customModelsDirty(config, values.models)) body.models = requestModels(values.models);\n\n const nextDefault = values.default_model.trim() || null;\n if (nextDefault !== config.default_model) body.default_model = nextDefault;\n return body;\n}\n\nexport function customHeadersDirty(\n config: CustomModelProviderConfigDto,\n headers: CustomModelProviderHeaderFormValue[],\n): boolean {\n return (\n JSON.stringify(updateHeaders(headers)) !==\n JSON.stringify([\n ...config.headers.map((header) => ({\n name: normalizeHeaderName(header.name),\n value: header.value,\n secret: false,\n })),\n ...config.secret_header_names.map((name) => ({\n name: normalizeHeaderName(name),\n secret: true,\n keep: true,\n })),\n ])\n );\n}\n\nexport function customModelsDirty(\n config: CustomModelProviderConfigDto,\n models: CustomModelProviderModelFormValue[],\n): boolean {\n return JSON.stringify(requestModels(models)) !== JSON.stringify(config.models);\n}\n\nexport function buildDiscoverModelsBody(\n values: CustomModelProviderFormValues,\n): DiscoverCustomModelProviderModelsBodyDto {\n return {\n api: values.api,\n base_url: values.base_url.trim(),\n ...(values.api_key.trim() ? {api_key: values.api_key.trim()} : {}),\n ...(requestHeaders(values.headers).length > 0\n ? {\n headers: requestHeaders(values.headers).map(({name, value}) => ({\n name,\n value,\n })),\n }\n : {}),\n };\n}\n\nexport function buildDiscoverModelsBySlugBody(\n config: CustomModelProviderConfigDto,\n values: CustomModelProviderFormValues,\n): DiscoverCustomModelProviderModelsBySlugBodyDto {\n const body: DiscoverCustomModelProviderModelsBySlugBodyDto = {};\n if (values.api !== config.api) body.api = values.api;\n if (values.base_url.trim() !== config.base_url) body.base_url = values.base_url.trim();\n if (values.api_key.trim()) body.api_key = values.api_key.trim();\n body.headers = updateHeaders(values.headers);\n return body;\n}\n\nexport function formatBaseUrlHost(baseUrl: string): string {\n try {\n const url = new URL(baseUrl);\n return url.host;\n } catch {\n return baseUrl;\n }\n}\n\nexport function createFormRowId(): string {\n return crypto.randomUUID();\n}\n\nfunction updateHeaders(headers: CustomModelProviderHeaderFormValue[]): UpdateHeaderRequest[] {\n const result: UpdateHeaderRequest[] = [];\n for (const header of headers) {\n const name = normalizeHeaderName(header.name);\n if (!name) continue;\n if (\n header.secret &&\n header.hasStoredValue &&\n header.value.trim() === '' &&\n name === header.storedName\n ) {\n result.push({name, secret: true, keep: true});\n continue;\n }\n result.push({name, value: header.value.trim(), secret: header.secret});\n }\n return result;\n}\n\nfunction requestHeaders(headers: CustomModelProviderHeaderFormValue[]): CreateHeaderRequest[] {\n return updateHeaders(headers).flatMap((header) =>\n 'value' in header && header.value\n ? [{name: header.name, value: header.value, secret: header.secret}]\n : [],\n );\n}\n\nfunction requestModels(models: CustomModelProviderModelFormValue[]): CustomAgentModelDto[] {\n return models.flatMap((model) => {\n const id = model.id.trim();\n const label = model.label.trim();\n if (!id || !label) return [];\n return [\n {\n id,\n label,\n ...(model.context_window.trim() ? {context_window: Number(model.context_window)} : {}),\n ...(model.max_output_tokens.trim()\n ? {max_output_tokens: Number(model.max_output_tokens)}\n : {}),\n ...(model.input_image ? {input_image: true} : {}),\n ...(model.reasoning ? {reasoning: true} : {}),\n },\n ];\n });\n}\n\nfunction modelFormValue(model: CustomAgentModelDto): CustomModelProviderModelFormValue {\n return {\n client_id: createFormRowId(),\n id: model.id,\n label: model.label,\n context_window: model.context_window?.toString() ?? '',\n max_output_tokens: model.max_output_tokens?.toString() ?? '',\n input_image: model.input_image ?? false,\n reasoning: model.reasoning ?? false,\n };\n}\n\nfunction normalizeHeaderName(name: string): string {\n return name.trim().toLowerCase();\n}\n"],"names":["createCustomModelProviderFormValues","slug","display_name","api","base_url","api_key","headers","models","client_id","createFormRowId","id","label","context_window","max_output_tokens","input_image","reasoning","default_model","editCustomModelProviderFormValues","config","provider_id","map","header","name","value","secret","hasStoredValue","storedName","secret_header_names","normalizeHeaderName","modelFormValue","buildCreateCustomModelProviderBody","values","trim","requestHeaders","length","requestModels","buildUpdateCustomModelProviderBody","body","customHeadersDirty","updateHeaders","customModelsDirty","nextDefault","JSON","stringify","keep","buildDiscoverModelsBody","buildDiscoverModelsBySlugBody","formatBaseUrlHost","baseUrl","url","URL","host","crypto","randomUUID","result","push","flatMap","model","Number","toString","toLowerCase"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/custom-model-provider-payload.ts"],"sourcesContent":["import type {\n AgentModel,\n CreateCustomProviderCommand,\n CustomProviderConfig,\n DiscoverProviderModelsCommand,\n ProviderApi,\n UpdateCustomProviderCommand,\n} from '#core/models.js';\n\nexport interface CustomModelProviderHeaderFormValue {\n client_id: string;\n name: string;\n value: string;\n secret: boolean;\n hasStoredValue: boolean;\n storedName: string;\n}\n\nexport interface CustomModelProviderModelFormValue {\n client_id: string;\n id: string;\n label: string;\n context_window: string;\n max_output_tokens: string;\n input_image: boolean;\n reasoning: boolean;\n}\n\nexport interface CustomModelProviderFormValues {\n slug: string;\n display_name: string;\n api: ProviderApi;\n base_url: string;\n api_key: string;\n headers: CustomModelProviderHeaderFormValue[];\n models: CustomModelProviderModelFormValue[];\n default_model: string;\n}\n\nexport function createCustomModelProviderFormValues(): CustomModelProviderFormValues {\n return {\n slug: '',\n display_name: '',\n api: 'openai-completions',\n base_url: '',\n api_key: '',\n headers: [],\n models: [\n {\n client_id: createFormRowId(),\n id: '',\n label: '',\n context_window: '',\n max_output_tokens: '',\n input_image: false,\n reasoning: false,\n },\n ],\n default_model: '',\n };\n}\n\nexport function editCustomModelProviderFormValues(\n config: CustomProviderConfig,\n): CustomModelProviderFormValues {\n return {\n slug: config.providerId,\n display_name: config.displayName,\n api: config.api,\n base_url: config.baseUrl,\n api_key: '',\n headers: [\n ...config.headers.map((header) => ({\n client_id: createFormRowId(),\n name: header.name,\n value: header.value,\n secret: false,\n hasStoredValue: false,\n storedName: header.name,\n })),\n ...config.secretHeaderNames.map((name) => ({\n client_id: createFormRowId(),\n name,\n value: '',\n secret: true,\n hasStoredValue: true,\n storedName: normalizeHeaderName(name),\n })),\n ],\n models: config.models.map(modelFormValue),\n default_model: config.defaultModel ?? '',\n };\n}\n\nexport function buildCreateCustomModelProviderBody(\n values: CustomModelProviderFormValues,\n): CreateCustomProviderCommand {\n return {\n slug: values.slug.trim(),\n displayName: values.display_name.trim(),\n api: values.api,\n baseUrl: values.base_url.trim(),\n ...(values.api_key.trim() ? {apiKey: values.api_key.trim()} : {}),\n ...(requestHeaders(values.headers).length > 0 ? {headers: requestHeaders(values.headers)} : {}),\n models: requestModels(values.models),\n ...(values.default_model.trim() ? {defaultModel: values.default_model.trim()} : {}),\n };\n}\n\nexport function buildUpdateCustomModelProviderBody(\n config: CustomProviderConfig,\n values: CustomModelProviderFormValues,\n): UpdateCustomProviderCommand {\n const body: UpdateCustomProviderCommand = {};\n if (values.display_name.trim() !== config.displayName)\n body.displayName = values.display_name.trim();\n if (values.api !== config.api) body.api = values.api;\n if (values.base_url.trim() !== config.baseUrl) body.baseUrl = values.base_url.trim();\n if (values.api_key.trim()) body.apiKey = values.api_key.trim();\n if (customHeadersDirty(config, values.headers)) body.headers = updateHeaders(values.headers);\n if (customModelsDirty(config, values.models)) body.models = requestModels(values.models);\n\n const nextDefault = values.default_model.trim() || null;\n if (nextDefault !== config.defaultModel) body.defaultModel = nextDefault;\n return body;\n}\n\nexport function customHeadersDirty(\n config: CustomProviderConfig,\n headers: CustomModelProviderHeaderFormValue[],\n): boolean {\n return (\n JSON.stringify(updateHeaders(headers)) !==\n JSON.stringify([\n ...config.headers.map((header) => ({\n name: normalizeHeaderName(header.name),\n value: header.value,\n secret: false,\n })),\n ...config.secretHeaderNames.map((name) => ({\n name: normalizeHeaderName(name),\n secret: true,\n keep: true,\n })),\n ])\n );\n}\n\nexport function customModelsDirty(\n config: CustomProviderConfig,\n models: CustomModelProviderModelFormValue[],\n): boolean {\n return (\n JSON.stringify(requestModels(models)) !==\n JSON.stringify(\n config.models.map((model) => ({\n id: model.id,\n label: model.label,\n ...(model.contextWindow === undefined ? {} : {contextWindow: model.contextWindow}),\n ...(model.maxOutputTokens === undefined ? {} : {maxOutputTokens: model.maxOutputTokens}),\n ...(model.inputImage ? {inputImage: true} : {}),\n ...(model.reasoning ? {reasoning: true} : {}),\n })),\n )\n );\n}\n\nexport function buildDiscoverModelsBody(\n values: CustomModelProviderFormValues,\n): DiscoverProviderModelsCommand {\n return {\n api: values.api,\n baseUrl: values.base_url.trim(),\n ...(values.api_key.trim() ? {apiKey: values.api_key.trim()} : {}),\n ...(requestHeaders(values.headers).length > 0\n ? {\n headers: requestHeaders(values.headers).map(({name, value}) => ({\n name,\n value,\n secret: false,\n })),\n }\n : {}),\n };\n}\n\nexport function buildDiscoverModelsBySlugBody(\n config: CustomProviderConfig,\n values: CustomModelProviderFormValues,\n): DiscoverProviderModelsCommand {\n const body: DiscoverProviderModelsCommand = {};\n if (values.api !== config.api) body.api = values.api;\n if (values.base_url.trim() !== config.baseUrl) body.baseUrl = values.base_url.trim();\n if (values.api_key.trim()) body.apiKey = values.api_key.trim();\n body.headers = updateHeaders(values.headers);\n return body;\n}\n\nexport function formatBaseUrlHost(baseUrl: string): string {\n try {\n const url = new URL(baseUrl);\n return url.host;\n } catch {\n return baseUrl;\n }\n}\n\nexport function createFormRowId(): string {\n return crypto.randomUUID();\n}\n\nfunction updateHeaders(\n headers: CustomModelProviderHeaderFormValue[],\n): NonNullable<UpdateCustomProviderCommand['headers']> {\n const result: NonNullable<UpdateCustomProviderCommand['headers']> = [];\n for (const header of headers) {\n const name = normalizeHeaderName(header.name);\n if (!name) continue;\n if (\n header.secret &&\n header.hasStoredValue &&\n header.value.trim() === '' &&\n name === header.storedName\n ) {\n result.push({name, secret: true, keep: true});\n continue;\n }\n result.push({name, value: header.value.trim(), secret: header.secret});\n }\n return result;\n}\n\nfunction requestHeaders(\n headers: CustomModelProviderHeaderFormValue[],\n): NonNullable<CreateCustomProviderCommand['headers']> {\n return updateHeaders(headers).flatMap((header) =>\n 'value' in header && header.value\n ? [{name: header.name, value: header.value, secret: header.secret}]\n : [],\n );\n}\n\nfunction requestModels(\n models: CustomModelProviderModelFormValue[],\n): CreateCustomProviderCommand['models'] {\n return models.flatMap((model) => {\n const id = model.id.trim();\n const label = model.label.trim();\n if (!id || !label) return [];\n return [\n {\n id,\n label,\n ...(model.context_window.trim() ? {contextWindow: Number(model.context_window)} : {}),\n ...(model.max_output_tokens.trim()\n ? {maxOutputTokens: Number(model.max_output_tokens)}\n : {}),\n ...(model.input_image ? {inputImage: true} : {}),\n ...(model.reasoning ? {reasoning: true} : {}),\n },\n ];\n });\n}\n\nfunction modelFormValue(model: AgentModel): CustomModelProviderModelFormValue {\n return {\n client_id: createFormRowId(),\n id: model.id,\n label: model.label,\n context_window: model.contextWindow?.toString() ?? '',\n max_output_tokens: model.maxOutputTokens?.toString() ?? '',\n input_image: model.inputImage ?? false,\n reasoning: model.reasoning ?? false,\n };\n}\n\nfunction normalizeHeaderName(name: string): string {\n return name.trim().toLowerCase();\n}\n"],"names":["createCustomModelProviderFormValues","slug","display_name","api","base_url","api_key","headers","models","client_id","createFormRowId","id","label","context_window","max_output_tokens","input_image","reasoning","default_model","editCustomModelProviderFormValues","config","providerId","displayName","baseUrl","map","header","name","value","secret","hasStoredValue","storedName","secretHeaderNames","normalizeHeaderName","modelFormValue","defaultModel","buildCreateCustomModelProviderBody","values","trim","apiKey","requestHeaders","length","requestModels","buildUpdateCustomModelProviderBody","body","customHeadersDirty","updateHeaders","customModelsDirty","nextDefault","JSON","stringify","keep","model","contextWindow","undefined","maxOutputTokens","inputImage","buildDiscoverModelsBody","buildDiscoverModelsBySlugBody","formatBaseUrlHost","url","URL","host","crypto","randomUUID","result","push","flatMap","Number","toString","toLowerCase"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export declare function deriveCustomModelProviderSlug(displayName: string): string;
|
|
2
|
-
export declare function customModelProviderSlugError(slug: string): string | undefined;
|
|
2
|
+
export declare function customModelProviderSlugError(slug: string, reservedProviderIds?: readonly string[]): string | undefined;
|
|
3
3
|
//# sourceMappingURL=custom-model-provider-slug.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-model-provider-slug.d.ts","sourceRoot":"","sources":["../../src/components/custom-model-provider-slug.ts"],"names":[],"mappings":"AAMA,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CASzE;AAED,wBAAgB,4BAA4B,
|
|
1
|
+
{"version":3,"file":"custom-model-provider-slug.d.ts","sourceRoot":"","sources":["../../src/components/custom-model-provider-slug.ts"],"names":[],"mappings":"AAMA,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CASzE;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,mBAAmB,GAAE,SAAS,MAAM,EAAO,GAC1C,MAAM,GAAG,SAAS,CAKpB"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MODEL_PROVIDER_SLUG_PATTERN } from '@shipfox/api-agent-dto';
|
|
2
2
|
const MAX_SLUG_LENGTH = 40;
|
|
3
3
|
const SLUG_FORMAT_ERROR = 'Use 3-40 lowercase letters, digits, and dashes; start and end with a letter or digit.';
|
|
4
4
|
export function deriveCustomModelProviderSlug(displayName) {
|
|
5
5
|
return displayName.normalize('NFKD').replace(/\p{Diacritic}/gu, '').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, MAX_SLUG_LENGTH).replace(/-+$/g, '');
|
|
6
6
|
}
|
|
7
|
-
export function customModelProviderSlugError(slug) {
|
|
7
|
+
export function customModelProviderSlugError(slug, reservedProviderIds = []) {
|
|
8
8
|
const trimmed = slug.trim();
|
|
9
9
|
if (!MODEL_PROVIDER_SLUG_PATTERN.test(trimmed)) return SLUG_FORMAT_ERROR;
|
|
10
|
-
if (
|
|
10
|
+
if (reservedProviderIds.includes(trimmed)) return 'This id is reserved for a built-in provider.';
|
|
11
11
|
return undefined;
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/custom-model-provider-slug.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../src/components/custom-model-provider-slug.ts"],"sourcesContent":["import {MODEL_PROVIDER_SLUG_PATTERN} from '@shipfox/api-agent-dto';\n\nconst MAX_SLUG_LENGTH = 40;\nconst SLUG_FORMAT_ERROR =\n 'Use 3-40 lowercase letters, digits, and dashes; start and end with a letter or digit.';\n\nexport function deriveCustomModelProviderSlug(displayName: string): string {\n return displayName\n .normalize('NFKD')\n .replace(/\\p{Diacritic}/gu, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, MAX_SLUG_LENGTH)\n .replace(/-+$/g, '');\n}\n\nexport function customModelProviderSlugError(\n slug: string,\n reservedProviderIds: readonly string[] = [],\n): string | undefined {\n const trimmed = slug.trim();\n if (!MODEL_PROVIDER_SLUG_PATTERN.test(trimmed)) return SLUG_FORMAT_ERROR;\n if (reservedProviderIds.includes(trimmed)) return 'This id is reserved for a built-in provider.';\n return undefined;\n}\n"],"names":["MODEL_PROVIDER_SLUG_PATTERN","MAX_SLUG_LENGTH","SLUG_FORMAT_ERROR","deriveCustomModelProviderSlug","displayName","normalize","replace","toLowerCase","slice","customModelProviderSlugError","slug","reservedProviderIds","trimmed","trim","test","includes","undefined"],"mappings":"AAAA,SAAQA,2BAA2B,QAAO,yBAAyB;AAEnE,MAAMC,kBAAkB;AACxB,MAAMC,oBACJ;AAEF,OAAO,SAASC,8BAA8BC,WAAmB;IAC/D,OAAOA,YACJC,SAAS,CAAC,QACVC,OAAO,CAAC,mBAAmB,IAC3BC,WAAW,GACXD,OAAO,CAAC,eAAe,KACvBA,OAAO,CAAC,YAAY,IACpBE,KAAK,CAAC,GAAGP,iBACTK,OAAO,CAAC,QAAQ;AACrB;AAEA,OAAO,SAASG,6BACdC,IAAY,EACZC,sBAAyC,EAAE;IAE3C,MAAMC,UAAUF,KAAKG,IAAI;IACzB,IAAI,CAACb,4BAA4Bc,IAAI,CAACF,UAAU,OAAOV;IACvD,IAAIS,oBAAoBI,QAAQ,CAACH,UAAU,OAAO;IAClD,OAAOI;AACT"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { ModelProviderCatalogEntryDto } from '@shipfox/api-agent-dto';
|
|
2
1
|
import type { ComponentProps, ReactNode } from 'react';
|
|
2
|
+
import type { SupportedProvider } from '#core/models.js';
|
|
3
3
|
export declare const LATEST_MODEL_VALUE = "__latest__";
|
|
4
4
|
export declare function DefaultModelField({ entry, value, error, children, onChange, onBlur, }: {
|
|
5
|
-
entry:
|
|
5
|
+
entry: SupportedProvider;
|
|
6
6
|
value: string;
|
|
7
7
|
error: string | undefined;
|
|
8
8
|
children?: ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-model-field.d.ts","sourceRoot":"","sources":["../../src/components/default-model-field.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"default-model-field.d.ts","sourceRoot":"","sources":["../../src/components/default-model-field.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,cAAc,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AACrD,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAEvD,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAE/C,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,GACP,EAAE;IACD,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC;CAC5C,+BAmBA;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAErF;AAED,wBAAgB,kCAAkC,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvF;AAED,wBAAgB,4BAA4B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEjF;AAkBD,wBAAgB,eAAe,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,+BAc9E"}
|
|
@@ -38,7 +38,7 @@ export function selectedModelForModelPayload(selectedModel) {
|
|
|
38
38
|
return selectedModel === LATEST_MODEL_VALUE ? null : selectedModel.trim();
|
|
39
39
|
}
|
|
40
40
|
function defaultModelLabel(entry) {
|
|
41
|
-
const defaultModel = entry.
|
|
41
|
+
const defaultModel = entry.defaultModel ?? entry.models[0]?.id ?? '';
|
|
42
42
|
return entry.models.find((model)=>model.id === defaultModel)?.label ?? defaultModel;
|
|
43
43
|
}
|
|
44
44
|
function defaultModelDescription(entry, selectedModel) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/default-model-field.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../src/components/default-model-field.tsx"],"sourcesContent":["import {FormField, useFormField} from '@shipfox/react-ui/form-field';\nimport {cn} from '@shipfox/react-ui/utils';\nimport type {ComponentProps, ReactNode} from 'react';\nimport type {SupportedProvider} from '#core/models.js';\n\nexport const LATEST_MODEL_VALUE = '__latest__';\n\nexport function DefaultModelField({\n entry,\n value,\n error,\n children,\n onChange,\n onBlur,\n}: {\n entry: SupportedProvider;\n value: string;\n error: string | undefined;\n children?: ReactNode;\n onChange: ComponentProps<'select'>['onChange'];\n onBlur: ComponentProps<'select'>['onBlur'];\n}) {\n return (\n <FormField\n label=\"Default model\"\n id={`model-provider-${entry.id}-default-model`}\n error={error}\n description={defaultModelDescription(entry, value)}\n >\n <FormFieldSelect value={value} onChange={onChange} onBlur={onBlur}>\n <option value={LATEST_MODEL_VALUE}>Latest</option>\n {entry.models.map((model) => (\n <option key={model.id} value={model.id}>\n {model.label}\n </option>\n ))}\n </FormFieldSelect>\n {children}\n </FormField>\n );\n}\n\nexport function defaultModelFormValue(defaultModel: string | null | undefined): string {\n return defaultModel ?? LATEST_MODEL_VALUE;\n}\n\nexport function selectedModelForCredentialsPayload(selectedModel: string): string | null {\n return selectedModel === LATEST_MODEL_VALUE ? null : selectedModel.trim();\n}\n\nexport function selectedModelForModelPayload(selectedModel: string): string | null {\n return selectedModel === LATEST_MODEL_VALUE ? null : selectedModel.trim();\n}\n\nfunction defaultModelLabel(entry: SupportedProvider): string {\n const defaultModel = entry.defaultModel ?? entry.models[0]?.id ?? '';\n return entry.models.find((model) => model.id === defaultModel)?.label ?? defaultModel;\n}\n\nfunction defaultModelDescription(\n entry: SupportedProvider,\n selectedModel: string | undefined,\n): string | undefined {\n if (selectedModel === LATEST_MODEL_VALUE) {\n return `Latest follows the provider catalog default. Currently resolves to ${defaultModelLabel(entry)}.`;\n }\n if (!selectedModel) return undefined;\n return selectedModel;\n}\n\nexport function FormFieldSelect({className, ...props}: ComponentProps<'select'>) {\n const wiring = useFormField();\n return (\n <select\n className={cn(\n 'w-full min-w-0 rounded-6 bg-background-field-base px-8 py-6 text-sm leading-20 text-foreground-neutral-base shadow-button-neutral outline-none transition-[color,box-shadow]',\n 'hover:bg-background-field-hover focus-visible:shadow-border-interactive-with-active disabled:cursor-not-allowed disabled:bg-background-neutral-disabled disabled:text-foreground-neutral-disabled',\n 'aria-invalid:shadow-border-error',\n className,\n )}\n {...props}\n {...wiring}\n />\n );\n}\n"],"names":["FormField","useFormField","cn","LATEST_MODEL_VALUE","DefaultModelField","entry","value","error","children","onChange","onBlur","label","id","description","defaultModelDescription","FormFieldSelect","option","models","map","model","defaultModelFormValue","defaultModel","selectedModelForCredentialsPayload","selectedModel","trim","selectedModelForModelPayload","defaultModelLabel","find","undefined","className","props","wiring","select"],"mappings":";AAAA,SAAQA,SAAS,EAAEC,YAAY,QAAO,+BAA+B;AACrE,SAAQC,EAAE,QAAO,0BAA0B;AAI3C,OAAO,MAAMC,qBAAqB,aAAa;AAE/C,OAAO,SAASC,kBAAkB,EAChCC,KAAK,EACLC,KAAK,EACLC,KAAK,EACLC,QAAQ,EACRC,QAAQ,EACRC,MAAM,EAQP;IACC,qBACE,MAACV;QACCW,OAAM;QACNC,IAAI,CAAC,eAAe,EAAEP,MAAMO,EAAE,CAAC,cAAc,CAAC;QAC9CL,OAAOA;QACPM,aAAaC,wBAAwBT,OAAOC;;0BAE5C,MAACS;gBAAgBT,OAAOA;gBAAOG,UAAUA;gBAAUC,QAAQA;;kCACzD,KAACM;wBAAOV,OAAOH;kCAAoB;;oBAClCE,MAAMY,MAAM,CAACC,GAAG,CAAC,CAACC,sBACjB,KAACH;4BAAsBV,OAAOa,MAAMP,EAAE;sCACnCO,MAAMR,KAAK;2BADDQ,MAAMP,EAAE;;;YAKxBJ;;;AAGP;AAEA,OAAO,SAASY,sBAAsBC,YAAuC;IAC3E,OAAOA,gBAAgBlB;AACzB;AAEA,OAAO,SAASmB,mCAAmCC,aAAqB;IACtE,OAAOA,kBAAkBpB,qBAAqB,OAAOoB,cAAcC,IAAI;AACzE;AAEA,OAAO,SAASC,6BAA6BF,aAAqB;IAChE,OAAOA,kBAAkBpB,qBAAqB,OAAOoB,cAAcC,IAAI;AACzE;AAEA,SAASE,kBAAkBrB,KAAwB;IACjD,MAAMgB,eAAehB,MAAMgB,YAAY,IAAIhB,MAAMY,MAAM,CAAC,EAAE,EAAEL,MAAM;IAClE,OAAOP,MAAMY,MAAM,CAACU,IAAI,CAAC,CAACR,QAAUA,MAAMP,EAAE,KAAKS,eAAeV,SAASU;AAC3E;AAEA,SAASP,wBACPT,KAAwB,EACxBkB,aAAiC;IAEjC,IAAIA,kBAAkBpB,oBAAoB;QACxC,OAAO,CAAC,mEAAmE,EAAEuB,kBAAkBrB,OAAO,CAAC,CAAC;IAC1G;IACA,IAAI,CAACkB,eAAe,OAAOK;IAC3B,OAAOL;AACT;AAEA,OAAO,SAASR,gBAAgB,EAACc,SAAS,EAAE,GAAGC,OAAgC;IAC7E,MAAMC,SAAS9B;IACf,qBACE,KAAC+B;QACCH,WAAW3B,GACT,gLACA,qMACA,oCACA2B;QAED,GAAGC,KAAK;QACR,GAAGC,MAAM;;AAGhB"}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export declare function isHarnessAvailable(descriptor: HarnessDescriptor, configs:
|
|
4
|
-
export
|
|
5
|
-
isCustom: boolean;
|
|
6
|
-
providerId: string;
|
|
7
|
-
}): Harness[];
|
|
1
|
+
import { compatibleHarnessIds } from '#core/harness-policy.js';
|
|
2
|
+
import type { HarnessDescriptor, ProviderConfig } from '#core/models.js';
|
|
3
|
+
export declare function isHarnessAvailable(descriptor: HarnessDescriptor, configs: readonly ProviderConfig[]): boolean;
|
|
4
|
+
export { compatibleHarnessIds };
|
|
8
5
|
//# sourceMappingURL=harness-availability.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness-availability.d.ts","sourceRoot":"","sources":["../../src/components/harness-availability.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"harness-availability.d.ts","sourceRoot":"","sources":["../../src/components/harness-availability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAwB,MAAM,yBAAyB,CAAC;AACpF,OAAO,KAAK,EAAC,iBAAiB,EAAE,cAAc,EAAC,MAAM,iBAAiB,CAAC;AAEvE,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,SAAS,cAAc,EAAE,GACjC,OAAO,CAET;AAED,OAAO,EAAC,oBAAoB,EAAC,CAAC"}
|
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export function configSupportsHarness(config, descriptor) {
|
|
3
|
-
if (config.kind === 'custom') return descriptor.id === DEFAULT_HARNESS;
|
|
4
|
-
return descriptor.supportedProviderIds.includes(config.provider_id);
|
|
5
|
-
}
|
|
1
|
+
import { compatibleHarnessIds, configSupportsHarness } from '#core/harness-policy.js';
|
|
6
2
|
export function isHarnessAvailable(descriptor, configs) {
|
|
7
3
|
return configs.some((config)=>configSupportsHarness(config, descriptor));
|
|
8
4
|
}
|
|
9
|
-
export
|
|
10
|
-
if (isCustom) return [
|
|
11
|
-
DEFAULT_HARNESS
|
|
12
|
-
];
|
|
13
|
-
return listHarnessDescriptors().filter((descriptor)=>descriptor.supportedProviderIds.includes(providerId)).map((descriptor)=>descriptor.id);
|
|
14
|
-
}
|
|
5
|
+
export { compatibleHarnessIds };
|
|
15
6
|
|
|
16
7
|
//# sourceMappingURL=harness-availability.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/harness-availability.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../src/components/harness-availability.ts"],"sourcesContent":["import {compatibleHarnessIds, configSupportsHarness} from '#core/harness-policy.js';\nimport type {HarnessDescriptor, ProviderConfig} from '#core/models.js';\n\nexport function isHarnessAvailable(\n descriptor: HarnessDescriptor,\n configs: readonly ProviderConfig[],\n): boolean {\n return configs.some((config) => configSupportsHarness(config, descriptor));\n}\n\nexport {compatibleHarnessIds};\n"],"names":["compatibleHarnessIds","configSupportsHarness","isHarnessAvailable","descriptor","configs","some","config"],"mappings":"AAAA,SAAQA,oBAAoB,EAAEC,qBAAqB,QAAO,0BAA0B;AAGpF,OAAO,SAASC,mBACdC,UAA6B,EAC7BC,OAAkC;IAElC,OAAOA,QAAQC,IAAI,CAAC,CAACC,SAAWL,sBAAsBK,QAAQH;AAChE;AAEA,SAAQH,oBAAoB,GAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnesses-section.d.ts","sourceRoot":"","sources":["../../src/components/harnesses-section.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"harnesses-section.d.ts","sourceRoot":"","sources":["../../src/components/harnesses-section.tsx"],"names":[],"mappings":"AA4BA,wBAAgB,yBAAyB,CAAC,EAAC,WAAW,EAAC,EAAE;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,+BA+F7E"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { DEFAULT_HARNESS, listHarnessDescriptors } from '@shipfox/api-agent-dto';
|
|
3
2
|
import { QueryLoadError } from '@shipfox/client-ui';
|
|
4
3
|
import { IconButton } from '@shipfox/react-ui/button';
|
|
5
4
|
import { Callout } from '@shipfox/react-ui/callout';
|
|
@@ -11,6 +10,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from '@shipfox/react-ui/toolt
|
|
|
11
10
|
import { Header, Text } from '@shipfox/react-ui/typography';
|
|
12
11
|
import { cn } from '@shipfox/react-ui/utils';
|
|
13
12
|
import { useRef, useState } from 'react';
|
|
13
|
+
import { DEFAULT_HARNESS, listHarnesses } from '#core/harness-policy.js';
|
|
14
14
|
import { useModelProviderConfigsQuery, useSetDefaultHarnessMutation } from '#hooks/api/model-providers.js';
|
|
15
15
|
import { modelProviderConfigErrorToFormError } from './form-errors.js';
|
|
16
16
|
import { isHarnessAvailable } from './harness-availability.js';
|
|
@@ -24,7 +24,7 @@ export function WorkspaceHarnessesSection({ workspaceId }) {
|
|
|
24
24
|
const [pendingDefaultHarness, setPendingDefaultHarness] = useState(null);
|
|
25
25
|
const [defaultError, setDefaultError] = useState();
|
|
26
26
|
const configs = configsQuery.data?.configs ?? [];
|
|
27
|
-
const defaultHarnessId = configsQuery.data?.
|
|
27
|
+
const defaultHarnessId = configsQuery.data?.defaultHarnessId ?? DEFAULT_HARNESS;
|
|
28
28
|
activeWorkspaceIdRef.current = workspaceId;
|
|
29
29
|
function isActiveDefaultRequest(request) {
|
|
30
30
|
const activeRequest = activeDefaultRequestRef.current;
|
|
@@ -46,9 +46,7 @@ export function WorkspaceHarnessesSection({ workspaceId }) {
|
|
|
46
46
|
try {
|
|
47
47
|
await setDefaultHarness.mutateAsync({
|
|
48
48
|
workspaceId,
|
|
49
|
-
|
|
50
|
-
harness_id: harness.id
|
|
51
|
-
}
|
|
49
|
+
harnessId: harness.id
|
|
52
50
|
});
|
|
53
51
|
if (!isActiveDefaultRequest(request)) return;
|
|
54
52
|
toast.success(`${harness.label} is now the default harness`);
|
|
@@ -95,7 +93,7 @@ export function WorkspaceHarnessesSection({ workspaceId }) {
|
|
|
95
93
|
}) : null,
|
|
96
94
|
configsQuery.data !== undefined ? /*#__PURE__*/ _jsx("ul", {
|
|
97
95
|
className: cn('divide-y divide-border-neutral-base', SURFACE_CLASS),
|
|
98
|
-
children:
|
|
96
|
+
children: listHarnesses().map((harness)=>/*#__PURE__*/ _jsx(HarnessRow, {
|
|
99
97
|
harness: harness,
|
|
100
98
|
isDefault: harness.id === defaultHarnessId,
|
|
101
99
|
isAvailable: isHarnessAvailable(harness, configs),
|