@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.
Files changed (168) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +59 -0
  3. package/dist/components/available-provider-card.d.ts +2 -2
  4. package/dist/components/available-provider-card.d.ts.map +1 -1
  5. package/dist/components/available-provider-card.js.map +1 -1
  6. package/dist/components/available-providers-grid.d.ts +2 -2
  7. package/dist/components/available-providers-grid.d.ts.map +1 -1
  8. package/dist/components/available-providers-grid.js +1 -1
  9. package/dist/components/available-providers-grid.js.map +1 -1
  10. package/dist/components/change-default-model-form.d.ts +3 -4
  11. package/dist/components/change-default-model-form.d.ts.map +1 -1
  12. package/dist/components/change-default-model-form.js +2 -4
  13. package/dist/components/change-default-model-form.js.map +1 -1
  14. package/dist/components/custom-model-provider-api-options.d.ts +3 -3
  15. package/dist/components/custom-model-provider-api-options.d.ts.map +1 -1
  16. package/dist/components/custom-model-provider-api-options.js.map +1 -1
  17. package/dist/components/custom-model-provider-form.d.ts +2 -2
  18. package/dist/components/custom-model-provider-form.d.ts.map +1 -1
  19. package/dist/components/custom-model-provider-form.js +12 -10
  20. package/dist/components/custom-model-provider-form.js.map +1 -1
  21. package/dist/components/custom-model-provider-form.stories.d.ts.map +1 -1
  22. package/dist/components/custom-model-provider-form.stories.js +11 -11
  23. package/dist/components/custom-model-provider-form.stories.js.map +1 -1
  24. package/dist/components/custom-model-provider-payload.d.ts +9 -9
  25. package/dist/components/custom-model-provider-payload.d.ts.map +1 -1
  26. package/dist/components/custom-model-provider-payload.js +42 -26
  27. package/dist/components/custom-model-provider-payload.js.map +1 -1
  28. package/dist/components/custom-model-provider-slug.d.ts +1 -1
  29. package/dist/components/custom-model-provider-slug.d.ts.map +1 -1
  30. package/dist/components/custom-model-provider-slug.js +3 -3
  31. package/dist/components/custom-model-provider-slug.js.map +1 -1
  32. package/dist/components/default-model-field.d.ts +2 -2
  33. package/dist/components/default-model-field.d.ts.map +1 -1
  34. package/dist/components/default-model-field.js +1 -1
  35. package/dist/components/default-model-field.js.map +1 -1
  36. package/dist/components/harness-availability.d.ts +4 -7
  37. package/dist/components/harness-availability.d.ts.map +1 -1
  38. package/dist/components/harness-availability.js +2 -11
  39. package/dist/components/harness-availability.js.map +1 -1
  40. package/dist/components/harnesses-section.d.ts.map +1 -1
  41. package/dist/components/harnesses-section.js +4 -6
  42. package/dist/components/harnesses-section.js.map +1 -1
  43. package/dist/components/model-provider-usage-modal.d.ts +2 -2
  44. package/dist/components/model-provider-usage-modal.d.ts.map +1 -1
  45. package/dist/components/model-provider-usage-modal.js +4 -4
  46. package/dist/components/model-provider-usage-modal.js.map +1 -1
  47. package/dist/components/model-provider-usage-modal.stories.d.ts.map +1 -1
  48. package/dist/components/model-provider-usage-modal.stories.js +14 -16
  49. package/dist/components/model-provider-usage-modal.stories.js.map +1 -1
  50. package/dist/components/model-provider-usage-target.d.ts +5 -5
  51. package/dist/components/model-provider-usage-target.d.ts.map +1 -1
  52. package/dist/components/model-provider-usage-target.js +10 -8
  53. package/dist/components/model-provider-usage-target.js.map +1 -1
  54. package/dist/components/model-providers-section.d.ts.map +1 -1
  55. package/dist/components/model-providers-section.js +112 -94
  56. package/dist/components/model-providers-section.js.map +1 -1
  57. package/dist/components/model-providers-section.stories.js +8 -4
  58. package/dist/components/model-providers-section.stories.js.map +1 -1
  59. package/dist/components/test-and-save-form.d.ts +3 -3
  60. package/dist/components/test-and-save-form.d.ts.map +1 -1
  61. package/dist/components/test-and-save-form.js +7 -7
  62. package/dist/components/test-and-save-form.js.map +1 -1
  63. package/dist/core/harness-policy.d.ts +11 -0
  64. package/dist/core/harness-policy.d.ts.map +1 -0
  65. package/dist/core/harness-policy.js +71 -0
  66. package/dist/core/harness-policy.js.map +1 -0
  67. package/dist/core/model-provider-management-reducer.d.ts +51 -0
  68. package/dist/core/model-provider-management-reducer.d.ts.map +1 -0
  69. package/dist/core/model-provider-management-reducer.js +43 -0
  70. package/dist/core/model-provider-management-reducer.js.map +1 -0
  71. package/dist/core/models.d.ts +120 -0
  72. package/dist/core/models.d.ts.map +1 -0
  73. package/dist/core/models.js +3 -0
  74. package/dist/core/models.js.map +1 -0
  75. package/dist/core/onboarding-reducer.d.ts +36 -0
  76. package/dist/core/onboarding-reducer.d.ts.map +1 -0
  77. package/dist/core/onboarding-reducer.js +54 -0
  78. package/dist/core/onboarding-reducer.js.map +1 -0
  79. package/dist/core/provider-policy.d.ts +9 -0
  80. package/dist/core/provider-policy.d.ts.map +1 -0
  81. package/dist/core/provider-policy.js +37 -0
  82. package/dist/core/provider-policy.js.map +1 -0
  83. package/dist/feature.d.ts +18 -0
  84. package/dist/feature.d.ts.map +1 -1
  85. package/dist/feature.js +16 -1
  86. package/dist/feature.js.map +1 -1
  87. package/dist/hooks/api/model-provider-command-mapper.d.ts +11 -0
  88. package/dist/hooks/api/model-provider-command-mapper.d.ts.map +1 -0
  89. package/dist/hooks/api/model-provider-command-mapper.js +144 -0
  90. package/dist/hooks/api/model-provider-command-mapper.js.map +1 -0
  91. package/dist/hooks/api/model-provider-mapper.d.ts +11 -0
  92. package/dist/hooks/api/model-provider-mapper.d.ts.map +1 -0
  93. package/dist/hooks/api/model-provider-mapper.js +94 -0
  94. package/dist/hooks/api/model-provider-mapper.js.map +1 -0
  95. package/dist/hooks/api/model-providers.d.ts +64 -294
  96. package/dist/hooks/api/model-providers.d.ts.map +1 -1
  97. package/dist/hooks/api/model-providers.js +65 -48
  98. package/dist/hooks/api/model-providers.js.map +1 -1
  99. package/dist/pages/model-provider-onboarding-page.d.ts.map +1 -1
  100. package/dist/pages/model-provider-onboarding-page.js +57 -45
  101. package/dist/pages/model-provider-onboarding-page.js.map +1 -1
  102. package/dist/routes/agents-settings.d.ts +5 -0
  103. package/dist/routes/agents-settings.d.ts.map +1 -0
  104. package/dist/routes/agents-settings.js +21 -0
  105. package/dist/routes/agents-settings.js.map +1 -0
  106. package/dist/routes/inputs.d.ts +4 -0
  107. package/dist/routes/inputs.d.ts.map +1 -0
  108. package/dist/routes/inputs.js +12 -0
  109. package/dist/routes/inputs.js.map +1 -0
  110. package/dist/routes/model-provider.d.ts.map +1 -1
  111. package/dist/routes/model-provider.js +4 -5
  112. package/dist/routes/model-provider.js.map +1 -1
  113. package/dist/tsconfig.test.tsbuildinfo +1 -1
  114. package/package.json +9 -10
  115. package/src/components/available-provider-card.tsx +2 -2
  116. package/src/components/available-providers-grid.tsx +3 -3
  117. package/src/components/change-default-model-form.tsx +5 -6
  118. package/src/components/custom-model-provider-api-options.ts +3 -3
  119. package/src/components/custom-model-provider-form.stories.tsx +13 -13
  120. package/src/components/custom-model-provider-form.tsx +19 -12
  121. package/src/components/custom-model-provider-payload.test.ts +22 -22
  122. package/src/components/custom-model-provider-payload.ts +69 -54
  123. package/src/components/custom-model-provider-slug.test.ts +1 -1
  124. package/src/components/custom-model-provider-slug.ts +6 -3
  125. package/src/components/default-model-field.tsx +5 -5
  126. package/src/components/harness-availability.test.ts +13 -10
  127. package/src/components/harness-availability.ts +4 -28
  128. package/src/components/harnesses-section.tsx +7 -11
  129. package/src/components/model-provider-usage-modal.stories.tsx +18 -23
  130. package/src/components/model-provider-usage-modal.test.tsx +35 -7
  131. package/src/components/model-provider-usage-modal.tsx +12 -16
  132. package/src/components/model-provider-usage-target.ts +15 -18
  133. package/src/components/model-providers-section.stories.tsx +4 -1
  134. package/src/components/model-providers-section.tsx +112 -125
  135. package/src/components/test-and-save-form.tsx +13 -17
  136. package/src/core/harness-policy.test.ts +15 -0
  137. package/src/core/harness-policy.ts +83 -0
  138. package/src/core/model-provider-management-reducer.test.ts +59 -0
  139. package/src/core/model-provider-management-reducer.ts +72 -0
  140. package/src/core/models.ts +143 -0
  141. package/src/core/onboarding-reducer.test.ts +44 -0
  142. package/src/core/onboarding-reducer.ts +64 -0
  143. package/src/core/provider-policy.ts +53 -0
  144. package/src/feature.ts +17 -1
  145. package/src/hooks/api/model-provider-command-mapper.ts +122 -0
  146. package/src/hooks/api/model-provider-mapper.test.ts +27 -0
  147. package/src/hooks/api/model-provider-mapper.ts +120 -0
  148. package/src/hooks/api/model-providers.test.ts +15 -15
  149. package/src/hooks/api/model-providers.ts +175 -87
  150. package/src/pages/model-provider-onboarding-page.tsx +62 -56
  151. package/src/routes/agents-settings.tsx +14 -0
  152. package/src/routes/inputs.test.ts +11 -0
  153. package/src/routes/inputs.ts +9 -0
  154. package/src/routes/model-provider.tsx +4 -3
  155. package/test/fixtures/model-providers.ts +1 -1
  156. package/tsconfig.build.tsbuildinfo +1 -1
  157. package/vercel.json +5 -0
  158. package/dist/components/provider-search.d.ts +0 -4
  159. package/dist/components/provider-search.d.ts.map +0 -1
  160. package/dist/components/provider-search.js +0 -13
  161. package/dist/components/provider-search.js.map +0 -1
  162. package/dist/components/supported-model-provider-catalog-entry.d.ts +0 -8
  163. package/dist/components/supported-model-provider-catalog-entry.d.ts.map +0 -1
  164. package/dist/components/supported-model-provider-catalog-entry.js +0 -9
  165. package/dist/components/supported-model-provider-catalog-entry.js.map +0 -1
  166. package/src/components/provider-search.test.ts +0 -45
  167. package/src/components/provider-search.ts +0 -18
  168. 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
- provider_id: 'local-vllm',
72
- display_name: 'Local vLLM',
71
+ providerId: 'local-vllm',
72
+ displayName: 'Local vLLM',
73
73
  api: 'openai-completions',
74
- base_url: 'http://localhost:8000/v1',
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
- secret_header_names: [
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
- context_window: 128000,
89
- max_output_tokens: 16384
88
+ contextWindow: 128000,
89
+ maxOutputTokens: 16384
90
90
  },
91
91
  {
92
92
  id: 'qwen-coder',
93
93
  label: 'Qwen Coder',
94
- context_window: 32768,
95
- max_output_tokens: 8192
94
+ contextWindow: 32768,
95
+ maxOutputTokens: 8192
96
96
  }
97
97
  ],
98
- default_model: 'llama-3.1',
99
- created_at: '2026-05-08T00:00:00.000Z',
100
- updated_at: '2026-05-08T00:00:00.000Z'
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 type {CustomModelProviderConfigDto} from '@shipfox/api-agent-dto';\nimport {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 {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(): 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 {\n id: 'llama-3.1',\n label: 'Llama 3.1',\n context_window: 128000,\n max_output_tokens: 16384,\n },\n {\n id: 'qwen-coder',\n label: 'Qwen Coder',\n context_window: 32768,\n max_output_tokens: 8192,\n },\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"],"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","provider_id","display_name","api","base_url","headers","name","value","secret_header_names","id","label","context_window","max_output_tokens","default_model","created_at","updated_at"],"mappings":";AACA,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;AACxC,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,aAAa;QACbC,cAAc;QACdC,KAAK;QACLC,UAAU;QACVC,SAAS;YAAC;gBAACC,MAAM;gBAAYC,OAAO;YAAI;SAAE;QAC1CC,qBAAqB;YAAC;SAAgB;QACtC3B,QAAQ;YACN;gBACE4B,IAAI;gBACJC,OAAO;gBACPC,gBAAgB;gBAChBC,mBAAmB;YACrB;YACA;gBACEH,IAAI;gBACJC,OAAO;gBACPC,gBAAgB;gBAChBC,mBAAmB;YACrB;SACD;QACDC,eAAe;QACfC,YAAY;QACZC,YAAY;IACd;AACF"}
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 { CreateCustomModelProviderBodyDto, CustomModelProviderConfigDto, DiscoverCustomModelProviderModelsBodyDto, DiscoverCustomModelProviderModelsBySlugBodyDto, ModelProviderApi, UpdateCustomModelProviderBodyDto } from '@shipfox/api-agent-dto';
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: ModelProviderApi;
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: CustomModelProviderConfigDto): CustomModelProviderFormValues;
31
- export declare function buildCreateCustomModelProviderBody(values: CustomModelProviderFormValues): CreateCustomModelProviderBodyDto;
32
- export declare function buildUpdateCustomModelProviderBody(config: CustomModelProviderConfigDto, values: CustomModelProviderFormValues): UpdateCustomModelProviderBodyDto;
33
- export declare function customHeadersDirty(config: CustomModelProviderConfigDto, headers: CustomModelProviderHeaderFormValue[]): boolean;
34
- export declare function customModelsDirty(config: CustomModelProviderConfigDto, models: CustomModelProviderModelFormValue[]): boolean;
35
- export declare function buildDiscoverModelsBody(values: CustomModelProviderFormValues): DiscoverCustomModelProviderModelsBodyDto;
36
- export declare function buildDiscoverModelsBySlugBody(config: CustomModelProviderConfigDto, values: CustomModelProviderFormValues): DiscoverCustomModelProviderModelsBySlugBodyDto;
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,EACV,gCAAgC,EAEhC,4BAA4B,EAC5B,wCAAwC,EACxC,8CAA8C,EAC9C,gBAAgB,EAChB,gCAAgC,EACjC,MAAM,wBAAwB,CAAC;AAKhC,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,gBAAgB,CAAC;IACtB,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,4BAA4B,GACnC,6BAA6B,CA4B/B;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,6BAA6B,GACpC,gCAAgC,CAWlC;AAED,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,4BAA4B,EACpC,MAAM,EAAE,6BAA6B,GACpC,gCAAgC,CAalC;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,4BAA4B,EACpC,OAAO,EAAE,kCAAkC,EAAE,GAC5C,OAAO,CAgBT;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,4BAA4B,EACpC,MAAM,EAAE,iCAAiC,EAAE,GAC1C,OAAO,CAET;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,6BAA6B,GACpC,wCAAwC,CAc1C;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,4BAA4B,EACpC,MAAM,EAAE,6BAA6B,GACpC,8CAA8C,CAOhD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOzD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
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.provider_id,
26
- display_name: config.display_name,
25
+ slug: config.providerId,
26
+ display_name: config.displayName,
27
27
  api: config.api,
28
- base_url: config.base_url,
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.secret_header_names.map((name)=>({
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.default_model ?? ''
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
- display_name: values.display_name.trim(),
55
+ displayName: values.display_name.trim(),
56
56
  api: values.api,
57
- base_url: values.base_url.trim(),
57
+ baseUrl: values.base_url.trim(),
58
58
  ...values.api_key.trim() ? {
59
- api_key: values.api_key.trim()
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
- default_model: values.default_model.trim()
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.display_name) body.display_name = values.display_name.trim();
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.base_url) body.base_url = values.base_url.trim();
75
- if (values.api_key.trim()) body.api_key = values.api_key.trim();
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.default_model) body.default_model = nextDefault;
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.secret_header_names.map((name)=>({
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
- base_url: values.base_url.trim(),
117
+ baseUrl: values.base_url.trim(),
103
118
  ...values.api_key.trim() ? {
104
- api_key: values.api_key.trim()
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.base_url) body.base_url = values.base_url.trim();
118
- if (values.api_key.trim()) body.api_key = values.api_key.trim();
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
- context_window: Number(model.context_window)
189
+ contextWindow: Number(model.context_window)
174
190
  } : {},
175
191
  ...model.max_output_tokens.trim() ? {
176
- max_output_tokens: Number(model.max_output_tokens)
192
+ maxOutputTokens: Number(model.max_output_tokens)
177
193
  } : {},
178
194
  ...model.input_image ? {
179
- input_image: true
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.context_window?.toString() ?? '',
194
- max_output_tokens: model.max_output_tokens?.toString() ?? '',
195
- input_image: model.input_image ?? false,
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,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK7E"}
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 { isReservedModelProviderId, MODEL_PROVIDER_SLUG_PATTERN } from '@shipfox/api-agent-dto';
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 (isReservedModelProviderId(trimmed)) return 'This id is reserved for a built-in provider.';
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 {isReservedModelProviderId, 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(slug: string): string | undefined {\n const trimmed = slug.trim();\n if (!MODEL_PROVIDER_SLUG_PATTERN.test(trimmed)) return SLUG_FORMAT_ERROR;\n if (isReservedModelProviderId(trimmed)) return 'This id is reserved for a built-in provider.';\n return undefined;\n}\n"],"names":["isReservedModelProviderId","MODEL_PROVIDER_SLUG_PATTERN","MAX_SLUG_LENGTH","SLUG_FORMAT_ERROR","deriveCustomModelProviderSlug","displayName","normalize","replace","toLowerCase","slice","customModelProviderSlugError","slug","trimmed","trim","test","undefined"],"mappings":"AAAA,SAAQA,yBAAyB,EAAEC,2BAA2B,QAAO,yBAAyB;AAE9F,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,6BAA6BC,IAAY;IACvD,MAAMC,UAAUD,KAAKE,IAAI;IACzB,IAAI,CAACZ,4BAA4Ba,IAAI,CAACF,UAAU,OAAOT;IACvD,IAAIH,0BAA0BY,UAAU,OAAO;IAC/C,OAAOG;AACT"}
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: ModelProviderCatalogEntryDto;
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":"AAAA,OAAO,KAAK,EAAC,4BAA4B,EAAC,MAAM,wBAAwB,CAAC;AAGzE,OAAO,KAAK,EAAC,cAAc,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AAErD,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,4BAA4B,CAAC;IACpC,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"}
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.default_model ?? entry.models[0]?.id ?? '';
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 type {ModelProviderCatalogEntryDto} from '@shipfox/api-agent-dto';\nimport {FormField, useFormField} from '@shipfox/react-ui/form-field';\nimport {cn} from '@shipfox/react-ui/utils';\nimport type {ComponentProps, ReactNode} from 'react';\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: ModelProviderCatalogEntryDto;\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: ModelProviderCatalogEntryDto): string {\n const defaultModel = entry.default_model ?? entry.models[0]?.id ?? '';\n return entry.models.find((model) => model.id === defaultModel)?.label ?? defaultModel;\n}\n\nfunction defaultModelDescription(\n entry: ModelProviderCatalogEntryDto,\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","default_model","find","undefined","className","props","wiring","select"],"mappings":";AACA,SAAQA,SAAS,EAAEC,YAAY,QAAO,+BAA+B;AACrE,SAAQC,EAAE,QAAO,0BAA0B;AAG3C,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,KAAmC;IAC5D,MAAMgB,eAAehB,MAAMsB,aAAa,IAAItB,MAAMY,MAAM,CAAC,EAAE,EAAEL,MAAM;IACnE,OAAOP,MAAMY,MAAM,CAACW,IAAI,CAAC,CAACT,QAAUA,MAAMP,EAAE,KAAKS,eAAeV,SAASU;AAC3E;AAEA,SAASP,wBACPT,KAAmC,EACnCkB,aAAiC;IAEjC,IAAIA,kBAAkBpB,oBAAoB;QACxC,OAAO,CAAC,mEAAmE,EAAEuB,kBAAkBrB,OAAO,CAAC,CAAC;IAC1G;IACA,IAAI,CAACkB,eAAe,OAAOM;IAC3B,OAAON;AACT;AAEA,OAAO,SAASR,gBAAgB,EAACe,SAAS,EAAE,GAAGC,OAAgC;IAC7E,MAAMC,SAAS/B;IACf,qBACE,KAACgC;QACCH,WAAW5B,GACT,gLACA,qMACA,oCACA4B;QAED,GAAGC,KAAK;QACR,GAAGC,MAAM;;AAGhB"}
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 { type Harness, type HarnessDescriptor, type ModelProviderConfigResponseDto } from '@shipfox/api-agent-dto';
2
- export declare function configSupportsHarness(config: ModelProviderConfigResponseDto, descriptor: HarnessDescriptor): boolean;
3
- export declare function isHarnessAvailable(descriptor: HarnessDescriptor, configs: ModelProviderConfigResponseDto[]): boolean;
4
- export declare function compatibleHarnessIds({ isCustom, providerId, }: {
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,EAEL,KAAK,OAAO,EACZ,KAAK,iBAAiB,EAEtB,KAAK,8BAA8B,EACpC,MAAM,wBAAwB,CAAC;AAEhC,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,8BAA8B,EACtC,UAAU,EAAE,iBAAiB,GAC5B,OAAO,CAGT;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,8BAA8B,EAAE,GACxC,OAAO,CAET;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,EAAE,CAKZ"}
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 { DEFAULT_HARNESS, listHarnessDescriptors } from '@shipfox/api-agent-dto';
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 function compatibleHarnessIds({ isCustom, providerId }) {
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 {\n DEFAULT_HARNESS,\n type Harness,\n type HarnessDescriptor,\n listHarnessDescriptors,\n type ModelProviderConfigResponseDto,\n} from '@shipfox/api-agent-dto';\n\nexport function configSupportsHarness(\n config: ModelProviderConfigResponseDto,\n descriptor: HarnessDescriptor,\n): boolean {\n if (config.kind === 'custom') return descriptor.id === DEFAULT_HARNESS;\n return descriptor.supportedProviderIds.includes(config.provider_id);\n}\n\nexport function isHarnessAvailable(\n descriptor: HarnessDescriptor,\n configs: ModelProviderConfigResponseDto[],\n): boolean {\n return configs.some((config) => configSupportsHarness(config, descriptor));\n}\n\nexport function compatibleHarnessIds({\n isCustom,\n providerId,\n}: {\n isCustom: boolean;\n providerId: string;\n}): Harness[] {\n if (isCustom) return [DEFAULT_HARNESS];\n return listHarnessDescriptors()\n .filter((descriptor) => descriptor.supportedProviderIds.includes(providerId))\n .map((descriptor) => descriptor.id);\n}\n"],"names":["DEFAULT_HARNESS","listHarnessDescriptors","configSupportsHarness","config","descriptor","kind","id","supportedProviderIds","includes","provider_id","isHarnessAvailable","configs","some","compatibleHarnessIds","isCustom","providerId","filter","map"],"mappings":"AAAA,SACEA,eAAe,EAGfC,sBAAsB,QAEjB,yBAAyB;AAEhC,OAAO,SAASC,sBACdC,MAAsC,EACtCC,UAA6B;IAE7B,IAAID,OAAOE,IAAI,KAAK,UAAU,OAAOD,WAAWE,EAAE,KAAKN;IACvD,OAAOI,WAAWG,oBAAoB,CAACC,QAAQ,CAACL,OAAOM,WAAW;AACpE;AAEA,OAAO,SAASC,mBACdN,UAA6B,EAC7BO,OAAyC;IAEzC,OAAOA,QAAQC,IAAI,CAAC,CAACT,SAAWD,sBAAsBC,QAAQC;AAChE;AAEA,OAAO,SAASS,qBAAqB,EACnCC,QAAQ,EACRC,UAAU,EAIX;IACC,IAAID,UAAU,OAAO;QAACd;KAAgB;IACtC,OAAOC,yBACJe,MAAM,CAAC,CAACZ,aAAeA,WAAWG,oBAAoB,CAACC,QAAQ,CAACO,aAChEE,GAAG,CAAC,CAACb,aAAeA,WAAWE,EAAE;AACtC"}
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":"AAgCA,wBAAgB,yBAAyB,CAAC,EAAC,WAAW,EAAC,EAAE;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,+BA+F7E"}
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?.default_harness_id ?? DEFAULT_HARNESS;
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
- body: {
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: listHarnessDescriptors().map((harness)=>/*#__PURE__*/ _jsx(HarnessRow, {
96
+ children: listHarnesses().map((harness)=>/*#__PURE__*/ _jsx(HarnessRow, {
99
97
  harness: harness,
100
98
  isDefault: harness.id === defaultHarnessId,
101
99
  isAvailable: isHarnessAvailable(harness, configs),