@shipfox/client-agent 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/.storybook/main.ts +1 -0
  2. package/.storybook/preview.css +4 -0
  3. package/.storybook/preview.tsx +56 -0
  4. package/.turbo/turbo-build.log +2 -0
  5. package/.turbo/turbo-type$colon$emit.log +1 -0
  6. package/.turbo/turbo-type.log +1 -0
  7. package/CHANGELOG.md +93 -0
  8. package/LICENSE +21 -0
  9. package/dist/components/add-custom-provider-card.d.ts +4 -0
  10. package/dist/components/add-custom-provider-card.d.ts.map +1 -0
  11. package/dist/components/add-custom-provider-card.js +41 -0
  12. package/dist/components/add-custom-provider-card.js.map +1 -0
  13. package/dist/components/agent-workflow-example.d.ts +11 -0
  14. package/dist/components/agent-workflow-example.d.ts.map +1 -0
  15. package/dist/components/agent-workflow-example.js +38 -0
  16. package/dist/components/agent-workflow-example.js.map +1 -0
  17. package/dist/components/available-provider-card.d.ts +6 -0
  18. package/dist/components/available-provider-card.d.ts.map +1 -0
  19. package/dist/components/available-provider-card.js +41 -0
  20. package/dist/components/available-provider-card.js.map +1 -0
  21. package/dist/components/available-providers-grid.d.ts +10 -0
  22. package/dist/components/available-providers-grid.d.ts.map +1 -0
  23. package/dist/components/available-providers-grid.js +89 -0
  24. package/dist/components/available-providers-grid.js.map +1 -0
  25. package/dist/components/change-default-model-form.d.ts +9 -0
  26. package/dist/components/change-default-model-form.d.ts.map +1 -0
  27. package/dist/components/change-default-model-form.js +98 -0
  28. package/dist/components/change-default-model-form.js.map +1 -0
  29. package/dist/components/custom-model-provider-api-options.d.ts +7 -0
  30. package/dist/components/custom-model-provider-api-options.d.ts.map +1 -0
  31. package/dist/components/custom-model-provider-api-options.js +23 -0
  32. package/dist/components/custom-model-provider-api-options.js.map +1 -0
  33. package/dist/components/custom-model-provider-form.d.ts +8 -0
  34. package/dist/components/custom-model-provider-form.d.ts.map +1 -0
  35. package/dist/components/custom-model-provider-form.js +667 -0
  36. package/dist/components/custom-model-provider-form.js.map +1 -0
  37. package/dist/components/custom-model-provider-form.stories.d.ts +20 -0
  38. package/dist/components/custom-model-provider-form.stories.d.ts.map +1 -0
  39. package/dist/components/custom-model-provider-form.stories.js +104 -0
  40. package/dist/components/custom-model-provider-form.stories.js.map +1 -0
  41. package/dist/components/custom-model-provider-payload.d.ts +39 -0
  42. package/dist/components/custom-model-provider-payload.d.ts.map +1 -0
  43. package/dist/components/custom-model-provider-payload.js +203 -0
  44. package/dist/components/custom-model-provider-payload.js.map +1 -0
  45. package/dist/components/custom-model-provider-slug.d.ts +3 -0
  46. package/dist/components/custom-model-provider-slug.d.ts.map +1 -0
  47. package/dist/components/custom-model-provider-slug.js +14 -0
  48. package/dist/components/custom-model-provider-slug.js.map +1 -0
  49. package/dist/components/default-model-field.d.ts +16 -0
  50. package/dist/components/default-model-field.d.ts.map +1 -0
  51. package/dist/components/default-model-field.js +60 -0
  52. package/dist/components/default-model-field.js.map +1 -0
  53. package/dist/components/form-errors.d.ts +11 -0
  54. package/dist/components/form-errors.d.ts.map +1 -0
  55. package/dist/components/form-errors.js +101 -0
  56. package/dist/components/form-errors.js.map +1 -0
  57. package/dist/components/harness-availability.d.ts +8 -0
  58. package/dist/components/harness-availability.d.ts.map +1 -0
  59. package/dist/components/harness-availability.js +16 -0
  60. package/dist/components/harness-availability.js.map +1 -0
  61. package/dist/components/harnesses-section.d.ts +4 -0
  62. package/dist/components/harnesses-section.d.ts.map +1 -0
  63. package/dist/components/harnesses-section.js +249 -0
  64. package/dist/components/harnesses-section.js.map +1 -0
  65. package/dist/components/harnesses-section.stories.d.ts +25 -0
  66. package/dist/components/harnesses-section.stories.d.ts.map +1 -0
  67. package/dist/components/harnesses-section.stories.js +138 -0
  68. package/dist/components/harnesses-section.stories.js.map +1 -0
  69. package/dist/components/model-provider-usage-modal.d.ts +11 -0
  70. package/dist/components/model-provider-usage-modal.d.ts.map +1 -0
  71. package/dist/components/model-provider-usage-modal.js +349 -0
  72. package/dist/components/model-provider-usage-modal.js.map +1 -0
  73. package/dist/components/model-provider-usage-modal.stories.d.ts +21 -0
  74. package/dist/components/model-provider-usage-modal.stories.d.ts.map +1 -0
  75. package/dist/components/model-provider-usage-modal.stories.js +115 -0
  76. package/dist/components/model-provider-usage-modal.stories.js.map +1 -0
  77. package/dist/components/model-provider-usage-target.d.ts +14 -0
  78. package/dist/components/model-provider-usage-target.d.ts.map +1 -0
  79. package/dist/components/model-provider-usage-target.js +20 -0
  80. package/dist/components/model-provider-usage-target.js.map +1 -0
  81. package/dist/components/model-providers-section.d.ts +4 -0
  82. package/dist/components/model-providers-section.d.ts.map +1 -0
  83. package/dist/components/model-providers-section.js +668 -0
  84. package/dist/components/model-providers-section.js.map +1 -0
  85. package/dist/components/model-providers-section.stories.d.ts +32 -0
  86. package/dist/components/model-providers-section.stories.d.ts.map +1 -0
  87. package/dist/components/model-providers-section.stories.js +442 -0
  88. package/dist/components/model-providers-section.stories.js.map +1 -0
  89. package/dist/components/provider-search.d.ts +4 -0
  90. package/dist/components/provider-search.d.ts.map +1 -0
  91. package/dist/components/provider-search.js +13 -0
  92. package/dist/components/provider-search.js.map +1 -0
  93. package/dist/components/supported-model-provider-catalog-entry.d.ts +8 -0
  94. package/dist/components/supported-model-provider-catalog-entry.d.ts.map +1 -0
  95. package/dist/components/supported-model-provider-catalog-entry.js +9 -0
  96. package/dist/components/supported-model-provider-catalog-entry.js.map +1 -0
  97. package/dist/components/test-and-save-form.d.ts +10 -0
  98. package/dist/components/test-and-save-form.d.ts.map +1 -0
  99. package/dist/components/test-and-save-form.js +138 -0
  100. package/dist/components/test-and-save-form.js.map +1 -0
  101. package/dist/feature.d.ts +9 -0
  102. package/dist/feature.d.ts.map +1 -0
  103. package/dist/feature.js +13 -0
  104. package/dist/feature.js.map +1 -0
  105. package/dist/hooks/api/model-providers.d.ts +334 -0
  106. package/dist/hooks/api/model-providers.d.ts.map +1 -0
  107. package/dist/hooks/api/model-providers.js +190 -0
  108. package/dist/hooks/api/model-providers.js.map +1 -0
  109. package/dist/index.d.ts +9 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +10 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/pages/model-provider-onboarding-page.d.ts +6 -0
  114. package/dist/pages/model-provider-onboarding-page.d.ts.map +1 -0
  115. package/dist/pages/model-provider-onboarding-page.js +295 -0
  116. package/dist/pages/model-provider-onboarding-page.js.map +1 -0
  117. package/dist/pages/model-provider-onboarding-page.stories.d.ts +27 -0
  118. package/dist/pages/model-provider-onboarding-page.stories.d.ts.map +1 -0
  119. package/dist/pages/model-provider-onboarding-page.stories.js +368 -0
  120. package/dist/pages/model-provider-onboarding-page.stories.js.map +1 -0
  121. package/dist/routes/model-provider.d.ts +5 -0
  122. package/dist/routes/model-provider.d.ts.map +1 -0
  123. package/dist/routes/model-provider.js +28 -0
  124. package/dist/routes/model-provider.js.map +1 -0
  125. package/dist/state/model-provider-onboarding.d.ts +3 -0
  126. package/dist/state/model-provider-onboarding.d.ts.map +1 -0
  127. package/dist/state/model-provider-onboarding.js +28 -0
  128. package/dist/state/model-provider-onboarding.js.map +1 -0
  129. package/dist/tsconfig.test.tsbuildinfo +1 -0
  130. package/package.json +114 -0
  131. package/src/components/add-custom-provider-card.tsx +32 -0
  132. package/src/components/agent-workflow-example.test.ts +74 -0
  133. package/src/components/agent-workflow-example.ts +55 -0
  134. package/src/components/available-provider-card.tsx +39 -0
  135. package/src/components/available-providers-grid.test.tsx +55 -0
  136. package/src/components/available-providers-grid.tsx +106 -0
  137. package/src/components/change-default-model-form.tsx +104 -0
  138. package/src/components/custom-model-provider-api-options.test.ts +18 -0
  139. package/src/components/custom-model-provider-api-options.ts +12 -0
  140. package/src/components/custom-model-provider-form.stories.tsx +91 -0
  141. package/src/components/custom-model-provider-form.tsx +710 -0
  142. package/src/components/custom-model-provider-payload.test.ts +170 -0
  143. package/src/components/custom-model-provider-payload.ts +264 -0
  144. package/src/components/custom-model-provider-slug.test.ts +40 -0
  145. package/src/components/custom-model-provider-slug.ts +23 -0
  146. package/src/components/default-model-field.tsx +85 -0
  147. package/src/components/form-errors.test.ts +159 -0
  148. package/src/components/form-errors.ts +102 -0
  149. package/src/components/harness-availability.test.ts +45 -0
  150. package/src/components/harness-availability.ts +35 -0
  151. package/src/components/harnesses-section.stories.tsx +129 -0
  152. package/src/components/harnesses-section.test.tsx +188 -0
  153. package/src/components/harnesses-section.tsx +245 -0
  154. package/src/components/model-provider-usage-modal.stories.tsx +106 -0
  155. package/src/components/model-provider-usage-modal.test.tsx +210 -0
  156. package/src/components/model-provider-usage-modal.tsx +326 -0
  157. package/src/components/model-provider-usage-target.ts +36 -0
  158. package/src/components/model-providers-section.stories.tsx +345 -0
  159. package/src/components/model-providers-section.test.tsx +831 -0
  160. package/src/components/model-providers-section.tsx +645 -0
  161. package/src/components/provider-search.test.ts +45 -0
  162. package/src/components/provider-search.ts +18 -0
  163. package/src/components/supported-model-provider-catalog-entry.ts +19 -0
  164. package/src/components/test-and-save-form.tsx +166 -0
  165. package/src/feature.ts +12 -0
  166. package/src/hooks/api/model-providers.test.ts +167 -0
  167. package/src/hooks/api/model-providers.ts +281 -0
  168. package/src/index.ts +8 -0
  169. package/src/pages/model-provider-onboarding-page.stories.tsx +284 -0
  170. package/src/pages/model-provider-onboarding-page.test.tsx +368 -0
  171. package/src/pages/model-provider-onboarding-page.tsx +290 -0
  172. package/src/routes/model-provider.tsx +20 -0
  173. package/src/state/model-provider-onboarding.test.ts +55 -0
  174. package/src/state/model-provider-onboarding.ts +34 -0
  175. package/test/fixtures/model-providers.ts +111 -0
  176. package/test/setup.ts +3 -0
  177. package/tsconfig.build.json +9 -0
  178. package/tsconfig.build.tsbuildinfo +1 -0
  179. package/tsconfig.json +3 -0
  180. package/tsconfig.test.json +8 -0
  181. package/vercel.json +8 -0
  182. package/vitest.config.ts +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supported-model-provider-catalog-entry.d.ts","sourceRoot":"","sources":["../../src/components/supported-model-provider-catalog-entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,4BAA4B,EAAE,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAEnG,MAAM,MAAM,kCAAkC,GAAG,4BAA4B,GAAG;IAC9E,EAAE,EAAE,wBAAwB,CAAC;IAC7B,cAAc,EAAE,WAAW,CAAC;CAC7B,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,4BAA4B,GAAG,SAAS,GAC9C,KAAK,IAAI,kCAAkC,CAE7C;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,4BAA4B,GAAG,SAAS,GAC9C,kCAAkC,GAAG,SAAS,CAGhD"}
@@ -0,0 +1,9 @@
1
+ export function isSupportedCatalogEntry(entry) {
2
+ return entry?.support_status === 'supported';
3
+ }
4
+ export function toSupportedCatalogEntry(entry) {
5
+ if (!isSupportedCatalogEntry(entry)) return undefined;
6
+ return entry;
7
+ }
8
+
9
+ //# sourceMappingURL=supported-model-provider-catalog-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/supported-model-provider-catalog-entry.ts"],"sourcesContent":["import type {ModelProviderCatalogEntryDto, SupportedModelProviderId} from '@shipfox/api-agent-dto';\n\nexport type SupportedModelProviderCatalogEntry = ModelProviderCatalogEntryDto & {\n id: SupportedModelProviderId;\n support_status: 'supported';\n};\n\nexport function isSupportedCatalogEntry(\n entry: ModelProviderCatalogEntryDto | undefined,\n): entry is SupportedModelProviderCatalogEntry {\n return entry?.support_status === 'supported';\n}\n\nexport function toSupportedCatalogEntry(\n entry: ModelProviderCatalogEntryDto | undefined,\n): SupportedModelProviderCatalogEntry | undefined {\n if (!isSupportedCatalogEntry(entry)) return undefined;\n return entry;\n}\n"],"names":["isSupportedCatalogEntry","entry","support_status","toSupportedCatalogEntry","undefined"],"mappings":"AAOA,OAAO,SAASA,wBACdC,KAA+C;IAE/C,OAAOA,OAAOC,mBAAmB;AACnC;AAEA,OAAO,SAASC,wBACdF,KAA+C;IAE/C,IAAI,CAACD,wBAAwBC,QAAQ,OAAOG;IAC5C,OAAOH;AACT"}
@@ -0,0 +1,10 @@
1
+ import type { ModelProviderCatalogEntryDto, ModelProviderConfigDto } from '@shipfox/api-agent-dto';
2
+ export declare const MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID = "model-provider-test-and-save-form";
3
+ export declare function ModelProviderTestAndSaveForm({ workspaceId, entry, existingConfig, onSaved, setAsDefaultOnSave, }: {
4
+ workspaceId: string;
5
+ entry: ModelProviderCatalogEntryDto;
6
+ existingConfig?: ModelProviderConfigDto | undefined;
7
+ onSaved: (savedDefaultModel: string | null) => void;
8
+ setAsDefaultOnSave?: boolean | undefined;
9
+ }): import("react").JSX.Element;
10
+ //# sourceMappingURL=test-and-save-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-and-save-form.d.ts","sourceRoot":"","sources":["../../src/components/test-and-save-form.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,sBAAsB,EAEvB,MAAM,wBAAwB,CAAC;AAiBhC,eAAO,MAAM,oCAAoC,sCAAsC,CAAC;AAExF,wBAAgB,4BAA4B,CAAC,EAC3C,WAAW,EACX,KAAK,EACL,cAAc,EACd,OAAO,EACP,kBAA0B,GAC3B,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,4BAA4B,CAAC;IACpC,cAAc,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IACpD,OAAO,EAAE,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACpD,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1C,+BAwHA"}
@@ -0,0 +1,138 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Button } from '@shipfox/react-ui/button';
3
+ import { Callout } from '@shipfox/react-ui/callout';
4
+ import { FormField, FormFieldInput, fieldError } from '@shipfox/react-ui/form-field';
5
+ import { ModalBody, ModalFooter } from '@shipfox/react-ui/modal';
6
+ import { Text } from '@shipfox/react-ui/typography';
7
+ import { useForm } from '@tanstack/react-form';
8
+ import { useState } from 'react';
9
+ import { useUpsertModelProviderConfigMutation } from '#hooks/api/model-providers.js';
10
+ import { DefaultModelField, defaultModelFormValue, LATEST_MODEL_VALUE, selectedModelForCredentialsPayload } from './default-model-field.js';
11
+ import { modelProviderConfigErrorToFormError } from './form-errors.js';
12
+ export const MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID = 'model-provider-test-and-save-form';
13
+ export function ModelProviderTestAndSaveForm({ workspaceId, entry, existingConfig, onSaved, setAsDefaultOnSave = false }) {
14
+ const upsertConfig = useUpsertModelProviderConfigMutation();
15
+ const [formError, setFormError] = useState();
16
+ const form = useForm({
17
+ defaultValues: defaultFormValues(entry, existingConfig),
18
+ onSubmit: async ({ value })=>{
19
+ setFormError(undefined);
20
+ const credentials = Object.fromEntries(entry.credential_fields.map((credentialField)=>[
21
+ credentialField.key,
22
+ value[credentialField.key]?.trim() ?? ''
23
+ ]));
24
+ const selectedModel = value.default_model ?? LATEST_MODEL_VALUE;
25
+ const defaultModel = existingConfig === undefined ? selectedModelForCredentialsPayload(selectedModel) : undefined;
26
+ try {
27
+ await upsertConfig.mutateAsync({
28
+ workspaceId,
29
+ providerId: entry.id,
30
+ body: {
31
+ ...defaultModel !== undefined ? {
32
+ default_model: defaultModel
33
+ } : {},
34
+ credentials,
35
+ ...setAsDefaultOnSave ? {
36
+ set_as_default: true
37
+ } : {}
38
+ }
39
+ });
40
+ onSaved(selectedModelForCredentialsPayload(selectedModel));
41
+ } catch (error) {
42
+ const mapped = modelProviderConfigErrorToFormError(error);
43
+ setFormError(mapped.message);
44
+ }
45
+ }
46
+ });
47
+ return /*#__PURE__*/ _jsxs(_Fragment, {
48
+ children: [
49
+ /*#__PURE__*/ _jsxs(ModalBody, {
50
+ className: "gap-16",
51
+ children: [
52
+ /*#__PURE__*/ _jsxs("form", {
53
+ id: MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID,
54
+ className: "flex w-full flex-col gap-14",
55
+ noValidate: true,
56
+ onSubmit: (event)=>{
57
+ event.preventDefault();
58
+ event.stopPropagation();
59
+ void form.handleSubmit();
60
+ },
61
+ children: [
62
+ existingConfig === undefined ? /*#__PURE__*/ _jsx(form.Field, {
63
+ name: "default_model",
64
+ validators: {
65
+ onBlur: ({ value })=>value.trim() ? undefined : 'Default model is required.',
66
+ onSubmit: ({ value })=>value.trim() ? undefined : 'Default model is required.'
67
+ },
68
+ children: (field)=>/*#__PURE__*/ _jsx(DefaultModelField, {
69
+ entry: entry,
70
+ value: field.state.value,
71
+ error: fieldError(field),
72
+ onChange: (event)=>field.handleChange(event.target.value),
73
+ onBlur: field.handleBlur
74
+ })
75
+ }) : null,
76
+ entry.credential_fields.map((credentialField)=>/*#__PURE__*/ _jsx(form.Field, {
77
+ name: credentialField.key,
78
+ validators: {
79
+ onBlur: ({ value })=>value.trim() ? undefined : `${credentialField.label} is required.`,
80
+ onSubmit: ({ value })=>value.trim() ? undefined : `${credentialField.label} is required.`
81
+ },
82
+ children: (field)=>/*#__PURE__*/ _jsx(FormField, {
83
+ label: credentialField.label,
84
+ id: `model-provider-${entry.id}-${credentialField.key}`,
85
+ error: fieldError(field),
86
+ children: /*#__PURE__*/ _jsx(FormFieldInput, {
87
+ type: credentialField.secret ? 'password' : 'text',
88
+ autoComplete: "off",
89
+ value: field.state.value,
90
+ onChange: (event)=>field.handleChange(event.target.value),
91
+ onBlur: field.handleBlur
92
+ })
93
+ })
94
+ }, credentialField.key))
95
+ ]
96
+ }),
97
+ formError ? /*#__PURE__*/ _jsx(Callout, {
98
+ role: "alert",
99
+ type: "error",
100
+ children: /*#__PURE__*/ _jsxs("div", {
101
+ className: "flex flex-col gap-8",
102
+ children: [
103
+ /*#__PURE__*/ _jsx(Text, {
104
+ size: "sm",
105
+ bold: true,
106
+ children: "Could not save provider"
107
+ }),
108
+ /*#__PURE__*/ _jsx(Text, {
109
+ size: "sm",
110
+ children: formError
111
+ })
112
+ ]
113
+ })
114
+ }) : null
115
+ ]
116
+ }),
117
+ /*#__PURE__*/ _jsx(ModalFooter, {
118
+ children: /*#__PURE__*/ _jsx(Button, {
119
+ type: "submit",
120
+ form: MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID,
121
+ isLoading: upsertConfig.isPending,
122
+ children: "Test & save"
123
+ })
124
+ })
125
+ ]
126
+ });
127
+ }
128
+ function defaultFormValues(entry, existingConfig) {
129
+ return {
130
+ default_model: defaultModelFormValue(existingConfig?.default_model),
131
+ ...Object.fromEntries(entry.credential_fields.map((field)=>[
132
+ field.key,
133
+ ''
134
+ ]))
135
+ };
136
+ }
137
+
138
+ //# sourceMappingURL=test-and-save-form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/test-and-save-form.tsx"],"sourcesContent":["import type {\n ModelProviderCatalogEntryDto,\n ModelProviderConfigDto,\n SupportedModelProviderId,\n} from '@shipfox/api-agent-dto';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {FormField, FormFieldInput, fieldError} from '@shipfox/react-ui/form-field';\nimport {ModalBody, ModalFooter} from '@shipfox/react-ui/modal';\nimport {Text} from '@shipfox/react-ui/typography';\nimport {useForm} from '@tanstack/react-form';\nimport {useState} from 'react';\nimport {useUpsertModelProviderConfigMutation} from '#hooks/api/model-providers.js';\nimport {\n DefaultModelField,\n defaultModelFormValue,\n LATEST_MODEL_VALUE,\n selectedModelForCredentialsPayload,\n} from './default-model-field.js';\nimport {modelProviderConfigErrorToFormError} from './form-errors.js';\n\nexport const MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID = 'model-provider-test-and-save-form';\n\nexport function ModelProviderTestAndSaveForm({\n workspaceId,\n entry,\n existingConfig,\n onSaved,\n setAsDefaultOnSave = false,\n}: {\n workspaceId: string;\n entry: ModelProviderCatalogEntryDto;\n existingConfig?: ModelProviderConfigDto | undefined;\n onSaved: (savedDefaultModel: string | null) => void;\n setAsDefaultOnSave?: boolean | undefined;\n}) {\n const upsertConfig = useUpsertModelProviderConfigMutation();\n const [formError, setFormError] = useState<string | undefined>();\n const form = useForm({\n defaultValues: defaultFormValues(entry, existingConfig),\n onSubmit: async ({value}) => {\n setFormError(undefined);\n const credentials = Object.fromEntries(\n entry.credential_fields.map((credentialField) => [\n credentialField.key,\n value[credentialField.key]?.trim() ?? '',\n ]),\n );\n const selectedModel = value.default_model ?? LATEST_MODEL_VALUE;\n const defaultModel =\n existingConfig === undefined\n ? selectedModelForCredentialsPayload(selectedModel)\n : undefined;\n\n try {\n await upsertConfig.mutateAsync({\n workspaceId,\n providerId: entry.id as SupportedModelProviderId,\n body: {\n ...(defaultModel !== undefined ? {default_model: defaultModel} : {}),\n credentials,\n ...(setAsDefaultOnSave ? {set_as_default: true} : {}),\n },\n });\n onSaved(selectedModelForCredentialsPayload(selectedModel));\n } catch (error) {\n const mapped = modelProviderConfigErrorToFormError(error);\n setFormError(mapped.message);\n }\n },\n });\n\n return (\n <>\n <ModalBody className=\"gap-16\">\n <form\n id={MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID}\n className=\"flex w-full flex-col gap-14\"\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n event.stopPropagation();\n void form.handleSubmit();\n }}\n >\n {existingConfig === undefined ? (\n <form.Field\n name=\"default_model\"\n validators={{\n onBlur: ({value}) => (value.trim() ? undefined : 'Default model is required.'),\n onSubmit: ({value}) => (value.trim() ? undefined : 'Default model is required.'),\n }}\n >\n {(field) => (\n <DefaultModelField\n entry={entry}\n value={field.state.value}\n error={fieldError(field)}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n )}\n </form.Field>\n ) : null}\n {entry.credential_fields.map((credentialField) => (\n <form.Field\n key={credentialField.key}\n name={credentialField.key}\n validators={{\n onBlur: ({value}) =>\n value.trim() ? undefined : `${credentialField.label} is required.`,\n onSubmit: ({value}) =>\n value.trim() ? undefined : `${credentialField.label} is required.`,\n }}\n >\n {(field) => (\n <FormField\n label={credentialField.label}\n id={`model-provider-${entry.id}-${credentialField.key}`}\n error={fieldError(field)}\n >\n <FormFieldInput\n type={credentialField.secret ? 'password' : 'text'}\n autoComplete=\"off\"\n value={field.state.value}\n onChange={(event) => field.handleChange(event.target.value)}\n onBlur={field.handleBlur}\n />\n </FormField>\n )}\n </form.Field>\n ))}\n </form>\n {formError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-8\">\n <Text size=\"sm\" bold>\n Could not save provider\n </Text>\n <Text size=\"sm\">{formError}</Text>\n </div>\n </Callout>\n ) : null}\n </ModalBody>\n <ModalFooter>\n <Button\n type=\"submit\"\n form={MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID}\n isLoading={upsertConfig.isPending}\n >\n Test & save\n </Button>\n </ModalFooter>\n </>\n );\n}\n\nfunction defaultFormValues(\n entry: ModelProviderCatalogEntryDto,\n existingConfig: ModelProviderConfigDto | undefined,\n): Record<string, string> {\n return {\n default_model: defaultModelFormValue(existingConfig?.default_model),\n ...Object.fromEntries(entry.credential_fields.map((field) => [field.key, ''])),\n };\n}\n"],"names":["Button","Callout","FormField","FormFieldInput","fieldError","ModalBody","ModalFooter","Text","useForm","useState","useUpsertModelProviderConfigMutation","DefaultModelField","defaultModelFormValue","LATEST_MODEL_VALUE","selectedModelForCredentialsPayload","modelProviderConfigErrorToFormError","MODEL_PROVIDER_TEST_AND_SAVE_FORM_ID","ModelProviderTestAndSaveForm","workspaceId","entry","existingConfig","onSaved","setAsDefaultOnSave","upsertConfig","formError","setFormError","form","defaultValues","defaultFormValues","onSubmit","value","undefined","credentials","Object","fromEntries","credential_fields","map","credentialField","key","trim","selectedModel","default_model","defaultModel","mutateAsync","providerId","id","body","set_as_default","error","mapped","message","className","noValidate","event","preventDefault","stopPropagation","handleSubmit","Field","name","validators","onBlur","field","state","onChange","handleChange","target","handleBlur","label","type","secret","autoComplete","role","div","size","bold","isLoading","isPending"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const agentFeature: {
2
+ readonly id: "shipfox.agent";
3
+ readonly routes: readonly [{
4
+ readonly path: "/workspaces/$wid/model-provider";
5
+ readonly parent: "workspaceLayout";
6
+ readonly impl: "@shipfox/client-agent/routes/model-provider";
7
+ }];
8
+ };
9
+ //# sourceMappingURL=feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature.d.ts","sourceRoot":"","sources":["../src/feature.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;;;;;;;CASvB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { defineClientFeature } from '@shipfox/client-shell';
2
+ export const agentFeature = defineClientFeature({
3
+ id: 'shipfox.agent',
4
+ routes: [
5
+ {
6
+ path: '/workspaces/$wid/model-provider',
7
+ parent: 'workspaceLayout',
8
+ impl: '@shipfox/client-agent/routes/model-provider'
9
+ }
10
+ ]
11
+ });
12
+
13
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/feature.ts"],"sourcesContent":["import {defineClientFeature} from '@shipfox/client-shell';\n\nexport const agentFeature = defineClientFeature({\n id: 'shipfox.agent',\n routes: [\n {\n path: '/workspaces/$wid/model-provider',\n parent: 'workspaceLayout',\n impl: '@shipfox/client-agent/routes/model-provider',\n },\n ],\n});\n"],"names":["defineClientFeature","agentFeature","id","routes","path","parent","impl"],"mappings":"AAAA,SAAQA,mBAAmB,QAAO,wBAAwB;AAE1D,OAAO,MAAMC,eAAeD,oBAAoB;IAC9CE,IAAI;IACJC,QAAQ;QACN;YACEC,MAAM;YACNC,QAAQ;YACRC,MAAM;QACR;KACD;AACH,GAAG"}
@@ -0,0 +1,334 @@
1
+ import type { CreateCustomModelProviderBodyDto, DiscoverCustomModelProviderModelsBodyDto, DiscoverCustomModelProviderModelsBySlugBodyDto, ModelProviderRef, SetDefaultHarnessBodyDto, SetDefaultModelProviderBodyDto, SupportedModelProviderId, UpdateCustomModelProviderBodyDto, UpdateModelProviderConfigBodyDto, UpdateModelProviderDefaultModelBodyDto } from '@shipfox/api-agent-dto';
2
+ export declare const modelProviderQueryKeys: {
3
+ all: readonly ["model-providers"];
4
+ catalog: () => readonly ["model-providers", "catalog"];
5
+ configs: (workspaceId: string) => readonly ["model-providers", "configs", string];
6
+ };
7
+ export declare function getModelProviderCatalog({ signal }?: {
8
+ signal?: AbortSignal;
9
+ }): Promise<{
10
+ providers: {
11
+ id: "anthropic" | "ant-ling" | "azure-openai-responses" | "openai" | "deepseek" | "nvidia" | "google" | "mistral" | "groq" | "cerebras" | "cloudflare-ai-gateway" | "cloudflare-workers-ai" | "xai" | "openrouter" | "vercel-ai-gateway" | "zai" | "zai-coding-cn" | "opencode" | "opencode-go" | "huggingface" | "fireworks" | "together" | "kimi-coding" | "minimax" | "minimax-cn" | "moonshotai" | "moonshotai-cn" | "xiaomi" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-sgp" | "amazon-bedrock" | "google-vertex" | "openai-codex" | "github-copilot";
12
+ label: string;
13
+ support_status: "supported" | "unsupported";
14
+ default_model: string | null;
15
+ credential_fields: {
16
+ key: string;
17
+ label: string;
18
+ secret: boolean;
19
+ }[];
20
+ unsupported_reason: string | null;
21
+ models: {
22
+ id: string;
23
+ label: string;
24
+ }[];
25
+ }[];
26
+ }>;
27
+ export declare function listModelProviderConfigs({ workspaceId, signal, }: {
28
+ workspaceId: string;
29
+ signal?: AbortSignal;
30
+ }): Promise<{
31
+ configs: ({
32
+ kind: "builtin";
33
+ provider_id: string;
34
+ default_model: string | null;
35
+ created_at: string;
36
+ updated_at: string;
37
+ } | {
38
+ api: "openai-completions" | "openai-responses" | "anthropic-messages" | "google-generative-ai";
39
+ base_url: string;
40
+ headers: {
41
+ name: string;
42
+ value: string;
43
+ }[];
44
+ secret_header_names: string[];
45
+ models: {
46
+ id: string;
47
+ label: string;
48
+ context_window?: number | undefined;
49
+ max_output_tokens?: number | undefined;
50
+ input_image?: boolean | undefined;
51
+ reasoning?: boolean | undefined;
52
+ }[];
53
+ kind: "custom";
54
+ provider_id: string;
55
+ display_name: string;
56
+ default_model: string | null;
57
+ created_at: string;
58
+ updated_at: string;
59
+ })[];
60
+ default_provider_id: string | null;
61
+ default_harness_id: "pi" | "claude" | null;
62
+ }>;
63
+ export declare function upsertModelProviderConfig({ workspaceId, providerId, body, }: {
64
+ workspaceId: string;
65
+ providerId: SupportedModelProviderId;
66
+ body: UpdateModelProviderConfigBodyDto;
67
+ }): Promise<{
68
+ kind: "builtin";
69
+ provider_id: string;
70
+ default_model: string | null;
71
+ created_at: string;
72
+ updated_at: string;
73
+ }>;
74
+ export declare function createCustomModelProviderConfig({ workspaceId, body, }: {
75
+ workspaceId: string;
76
+ body: CreateCustomModelProviderBodyDto;
77
+ }): Promise<{
78
+ api: "openai-completions" | "openai-responses" | "anthropic-messages" | "google-generative-ai";
79
+ base_url: string;
80
+ headers: {
81
+ name: string;
82
+ value: string;
83
+ }[];
84
+ secret_header_names: string[];
85
+ models: {
86
+ id: string;
87
+ label: string;
88
+ context_window?: number | undefined;
89
+ max_output_tokens?: number | undefined;
90
+ input_image?: boolean | undefined;
91
+ reasoning?: boolean | undefined;
92
+ }[];
93
+ kind: "custom";
94
+ provider_id: string;
95
+ display_name: string;
96
+ default_model: string | null;
97
+ created_at: string;
98
+ updated_at: string;
99
+ }>;
100
+ export declare function updateCustomModelProviderConfig({ workspaceId, providerId, body, }: {
101
+ workspaceId: string;
102
+ providerId: ModelProviderRef;
103
+ body: UpdateCustomModelProviderBodyDto;
104
+ }): Promise<{
105
+ api: "openai-completions" | "openai-responses" | "anthropic-messages" | "google-generative-ai";
106
+ base_url: string;
107
+ headers: {
108
+ name: string;
109
+ value: string;
110
+ }[];
111
+ secret_header_names: string[];
112
+ models: {
113
+ id: string;
114
+ label: string;
115
+ context_window?: number | undefined;
116
+ max_output_tokens?: number | undefined;
117
+ input_image?: boolean | undefined;
118
+ reasoning?: boolean | undefined;
119
+ }[];
120
+ kind: "custom";
121
+ provider_id: string;
122
+ display_name: string;
123
+ default_model: string | null;
124
+ created_at: string;
125
+ updated_at: string;
126
+ }>;
127
+ export declare function discoverCustomModelProviderModels({ workspaceId, body, }: {
128
+ workspaceId: string;
129
+ body: DiscoverCustomModelProviderModelsBodyDto;
130
+ }): Promise<{
131
+ models: {
132
+ id: string;
133
+ label: string;
134
+ }[];
135
+ }>;
136
+ export declare function discoverCustomModelProviderModelsBySlug({ workspaceId, providerId, body, }: {
137
+ workspaceId: string;
138
+ providerId: ModelProviderRef;
139
+ body: DiscoverCustomModelProviderModelsBySlugBodyDto;
140
+ }): Promise<{
141
+ models: {
142
+ id: string;
143
+ label: string;
144
+ }[];
145
+ }>;
146
+ export declare function deleteModelProviderConfig({ workspaceId, providerId, }: {
147
+ workspaceId: string;
148
+ providerId: ModelProviderRef;
149
+ }): Promise<void>;
150
+ export declare function updateModelProviderDefaultModel({ workspaceId, providerId, body, }: {
151
+ workspaceId: string;
152
+ providerId: SupportedModelProviderId;
153
+ body: UpdateModelProviderDefaultModelBodyDto;
154
+ }): Promise<{
155
+ kind: "builtin";
156
+ provider_id: string;
157
+ default_model: string | null;
158
+ created_at: string;
159
+ updated_at: string;
160
+ }>;
161
+ export declare function setDefaultModelProvider({ workspaceId, body, }: {
162
+ workspaceId: string;
163
+ body: SetDefaultModelProviderBodyDto;
164
+ }): Promise<{
165
+ default_provider_id: string | null;
166
+ }>;
167
+ export declare function setDefaultHarness({ workspaceId, body, }: {
168
+ workspaceId: string;
169
+ body: SetDefaultHarnessBodyDto;
170
+ }): Promise<{
171
+ default_harness_id: "pi" | "claude";
172
+ }>;
173
+ export declare function useModelProviderCatalogQuery(): import("@tanstack/react-query").UseQueryResult<NoInfer<{
174
+ providers: {
175
+ id: "anthropic" | "ant-ling" | "azure-openai-responses" | "openai" | "deepseek" | "nvidia" | "google" | "mistral" | "groq" | "cerebras" | "cloudflare-ai-gateway" | "cloudflare-workers-ai" | "xai" | "openrouter" | "vercel-ai-gateway" | "zai" | "zai-coding-cn" | "opencode" | "opencode-go" | "huggingface" | "fireworks" | "together" | "kimi-coding" | "minimax" | "minimax-cn" | "moonshotai" | "moonshotai-cn" | "xiaomi" | "xiaomi-token-plan-cn" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-sgp" | "amazon-bedrock" | "google-vertex" | "openai-codex" | "github-copilot";
176
+ label: string;
177
+ support_status: "supported" | "unsupported";
178
+ default_model: string | null;
179
+ credential_fields: {
180
+ key: string;
181
+ label: string;
182
+ secret: boolean;
183
+ }[];
184
+ unsupported_reason: string | null;
185
+ models: {
186
+ id: string;
187
+ label: string;
188
+ }[];
189
+ }[];
190
+ }>, Error>;
191
+ export declare function useModelProviderConfigsQuery(workspaceId: string | undefined): import("@tanstack/react-query").UseQueryResult<NoInfer<{
192
+ configs: ({
193
+ kind: "builtin";
194
+ provider_id: string;
195
+ default_model: string | null;
196
+ created_at: string;
197
+ updated_at: string;
198
+ } | {
199
+ api: "openai-completions" | "openai-responses" | "anthropic-messages" | "google-generative-ai";
200
+ base_url: string;
201
+ headers: {
202
+ name: string;
203
+ value: string;
204
+ }[];
205
+ secret_header_names: string[];
206
+ models: {
207
+ id: string;
208
+ label: string;
209
+ context_window?: number | undefined;
210
+ max_output_tokens?: number | undefined;
211
+ input_image?: boolean | undefined;
212
+ reasoning?: boolean | undefined;
213
+ }[];
214
+ kind: "custom";
215
+ provider_id: string;
216
+ display_name: string;
217
+ default_model: string | null;
218
+ created_at: string;
219
+ updated_at: string;
220
+ })[];
221
+ default_provider_id: string | null;
222
+ default_harness_id: "pi" | "claude" | null;
223
+ }>, Error>;
224
+ export declare function useUpsertModelProviderConfigMutation(): import("@tanstack/react-query").UseMutationResult<{
225
+ kind: "builtin";
226
+ provider_id: string;
227
+ default_model: string | null;
228
+ created_at: string;
229
+ updated_at: string;
230
+ }, Error, {
231
+ workspaceId: string;
232
+ providerId: SupportedModelProviderId;
233
+ body: UpdateModelProviderConfigBodyDto;
234
+ }, unknown>;
235
+ export declare function useCreateCustomModelProviderMutation(): import("@tanstack/react-query").UseMutationResult<{
236
+ api: "openai-completions" | "openai-responses" | "anthropic-messages" | "google-generative-ai";
237
+ base_url: string;
238
+ headers: {
239
+ name: string;
240
+ value: string;
241
+ }[];
242
+ secret_header_names: string[];
243
+ models: {
244
+ id: string;
245
+ label: string;
246
+ context_window?: number | undefined;
247
+ max_output_tokens?: number | undefined;
248
+ input_image?: boolean | undefined;
249
+ reasoning?: boolean | undefined;
250
+ }[];
251
+ kind: "custom";
252
+ provider_id: string;
253
+ display_name: string;
254
+ default_model: string | null;
255
+ created_at: string;
256
+ updated_at: string;
257
+ }, Error, {
258
+ workspaceId: string;
259
+ body: CreateCustomModelProviderBodyDto;
260
+ }, unknown>;
261
+ export declare function useUpdateCustomModelProviderMutation(): import("@tanstack/react-query").UseMutationResult<{
262
+ api: "openai-completions" | "openai-responses" | "anthropic-messages" | "google-generative-ai";
263
+ base_url: string;
264
+ headers: {
265
+ name: string;
266
+ value: string;
267
+ }[];
268
+ secret_header_names: string[];
269
+ models: {
270
+ id: string;
271
+ label: string;
272
+ context_window?: number | undefined;
273
+ max_output_tokens?: number | undefined;
274
+ input_image?: boolean | undefined;
275
+ reasoning?: boolean | undefined;
276
+ }[];
277
+ kind: "custom";
278
+ provider_id: string;
279
+ display_name: string;
280
+ default_model: string | null;
281
+ created_at: string;
282
+ updated_at: string;
283
+ }, Error, {
284
+ workspaceId: string;
285
+ providerId: ModelProviderRef;
286
+ body: UpdateCustomModelProviderBodyDto;
287
+ }, unknown>;
288
+ export declare function useDiscoverCustomModelProviderModelsMutation(): import("@tanstack/react-query").UseMutationResult<{
289
+ models: {
290
+ id: string;
291
+ label: string;
292
+ }[];
293
+ }, Error, {
294
+ workspaceId: string;
295
+ body: DiscoverCustomModelProviderModelsBodyDto;
296
+ }, unknown>;
297
+ export declare function useDiscoverCustomModelProviderModelsBySlugMutation(): import("@tanstack/react-query").UseMutationResult<{
298
+ models: {
299
+ id: string;
300
+ label: string;
301
+ }[];
302
+ }, Error, {
303
+ workspaceId: string;
304
+ providerId: ModelProviderRef;
305
+ body: DiscoverCustomModelProviderModelsBySlugBodyDto;
306
+ }, unknown>;
307
+ export declare function useDeleteModelProviderConfigMutation(): import("@tanstack/react-query").UseMutationResult<void, Error, {
308
+ workspaceId: string;
309
+ providerId: ModelProviderRef;
310
+ }, unknown>;
311
+ export declare function useUpdateModelProviderDefaultModelMutation(): import("@tanstack/react-query").UseMutationResult<{
312
+ kind: "builtin";
313
+ provider_id: string;
314
+ default_model: string | null;
315
+ created_at: string;
316
+ updated_at: string;
317
+ }, Error, {
318
+ workspaceId: string;
319
+ providerId: SupportedModelProviderId;
320
+ body: UpdateModelProviderDefaultModelBodyDto;
321
+ }, unknown>;
322
+ export declare function useSetDefaultModelProviderMutation(): import("@tanstack/react-query").UseMutationResult<{
323
+ default_provider_id: string | null;
324
+ }, Error, {
325
+ workspaceId: string;
326
+ body: SetDefaultModelProviderBodyDto;
327
+ }, unknown>;
328
+ export declare function useSetDefaultHarnessMutation(): import("@tanstack/react-query").UseMutationResult<{
329
+ default_harness_id: "pi" | "claude";
330
+ }, Error, {
331
+ workspaceId: string;
332
+ body: SetDefaultHarnessBodyDto;
333
+ }, unknown>;
334
+ //# sourceMappingURL=model-providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-providers.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/model-providers.ts"],"names":[],"mappings":"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"}