@shipfox/client-agent 14.0.1 → 15.0.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 (55) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +11 -0
  3. package/dist/components/add-custom-provider-card.js +3 -3
  4. package/dist/components/add-custom-provider-card.js.map +1 -1
  5. package/dist/components/available-provider-card.js +3 -3
  6. package/dist/components/available-provider-card.js.map +1 -1
  7. package/dist/components/available-providers-grid.d.ts +1 -1
  8. package/dist/components/available-providers-grid.d.ts.map +1 -1
  9. package/dist/components/available-providers-grid.js +2 -2
  10. package/dist/components/available-providers-grid.js.map +1 -1
  11. package/dist/components/change-default-model-form.js +3 -3
  12. package/dist/components/change-default-model-form.js.map +1 -1
  13. package/dist/components/custom-model-provider-form.js +18 -19
  14. package/dist/components/custom-model-provider-form.js.map +1 -1
  15. package/dist/components/custom-model-provider-form.stories.d.ts.map +1 -1
  16. package/dist/components/default-model-field.js +1 -1
  17. package/dist/components/default-model-field.js.map +1 -1
  18. package/dist/components/harnesses-section.js +7 -7
  19. package/dist/components/harnesses-section.js.map +1 -1
  20. package/dist/components/harnesses-section.stories.d.ts.map +1 -1
  21. package/dist/components/model-provider-usage-modal.js +8 -8
  22. package/dist/components/model-provider-usage-modal.js.map +1 -1
  23. package/dist/components/model-provider-usage-modal.stories.d.ts.map +1 -1
  24. package/dist/components/model-providers-section.js +20 -20
  25. package/dist/components/model-providers-section.js.map +1 -1
  26. package/dist/components/model-providers-section.stories.d.ts.map +1 -1
  27. package/dist/components/test-and-save-form.js +3 -3
  28. package/dist/components/test-and-save-form.js.map +1 -1
  29. package/dist/feature.d.ts +8 -8
  30. package/dist/feature.d.ts.map +1 -1
  31. package/dist/hooks/api/model-providers.d.ts +1 -1
  32. package/dist/hooks/api/model-providers.d.ts.map +1 -1
  33. package/dist/pages/model-provider-onboarding-page.d.ts.map +1 -1
  34. package/dist/pages/model-provider-onboarding-page.js +51 -43
  35. package/dist/pages/model-provider-onboarding-page.js.map +1 -1
  36. package/dist/pages/model-provider-onboarding-page.stories.d.ts.map +1 -1
  37. package/dist/routes/agents-settings.d.ts.map +1 -1
  38. package/dist/routes/agents-settings.js +1 -1
  39. package/dist/routes/agents-settings.js.map +1 -1
  40. package/dist/routes/model-provider.d.ts.map +1 -1
  41. package/dist/tsconfig.test.tsbuildinfo +1 -1
  42. package/package.json +3 -3
  43. package/src/components/add-custom-provider-card.tsx +3 -3
  44. package/src/components/available-provider-card.tsx +3 -3
  45. package/src/components/available-providers-grid.tsx +2 -2
  46. package/src/components/change-default-model-form.tsx +3 -3
  47. package/src/components/custom-model-provider-form.tsx +23 -20
  48. package/src/components/default-model-field.tsx +1 -1
  49. package/src/components/harnesses-section.tsx +7 -7
  50. package/src/components/model-provider-usage-modal.tsx +8 -8
  51. package/src/components/model-providers-section.tsx +20 -20
  52. package/src/components/test-and-save-form.tsx +3 -3
  53. package/src/pages/model-provider-onboarding-page.tsx +38 -34
  54. package/src/routes/agents-settings.tsx +1 -1
  55. package/tsconfig.build.tsbuildinfo +1 -1
@@ -79,13 +79,13 @@ export function ModelProviderOnboardingPage({ workspaceId, onSkip, onConfigured
79
79
  const selectedHarnessDescriptor = onboarding.step === 'choose-harness' ? null : listHarnesses().find((harness)=>harness.id === onboarding.harnessId);
80
80
  const headingId = onboarding.step === 'choose-harness' ? 'model-provider-harness-step' : 'model-provider-provider-step';
81
81
  return /*#__PURE__*/ _jsxs("div", {
82
- className: "mx-auto flex w-full max-w-[640px] flex-col gap-20",
82
+ className: "mx-auto flex w-full max-w-[640px] flex-col gap-section",
83
83
  children: [
84
84
  /*#__PURE__*/ _jsxs("header", {
85
- className: "flex flex-col gap-12",
85
+ className: "flex flex-col gap-cluster",
86
86
  children: [
87
87
  /*#__PURE__*/ _jsxs("div", {
88
- className: "flex items-start justify-between gap-16 max-[520px]:flex-col max-[520px]:gap-8",
88
+ className: "flex items-start justify-between gap-group max-[520px]:flex-col max-[520px]:gap-inline",
89
89
  children: [
90
90
  /*#__PURE__*/ _jsx(Header, {
91
91
  id: headingId,
@@ -112,7 +112,7 @@ export function ModelProviderOnboardingPage({ workspaceId, onSkip, onConfigured
112
112
  }),
113
113
  /*#__PURE__*/ _jsx("section", {
114
114
  "aria-labelledby": headingId,
115
- className: "flex flex-col gap-16",
115
+ className: "flex flex-col gap-group",
116
116
  children: onboarding.step === 'choose-harness' ? /*#__PURE__*/ _jsx(HarnessPicker, {
117
117
  onSelect: (harnessId)=>dispatch({
118
118
  type: 'harness-selected',
@@ -165,43 +165,51 @@ export function ModelProviderOnboardingPage({ workspaceId, onSkip, onConfigured
165
165
  children: onboarding.step === 'configure-provider' || onboarding.step === 'saving-default-harness' ? `Configure ${onboarding.provider.label}` : ''
166
166
  })
167
167
  }),
168
- onboarding.step === 'saving-default-harness' ? /*#__PURE__*/ _jsx("div", {
169
- role: "status",
170
- className: "px-20 pb-8",
171
- children: /*#__PURE__*/ _jsx(Text, {
172
- size: "sm",
173
- className: "text-foreground-neutral-muted",
174
- children: "Saving harness default..."
175
- })
176
- }) : null,
177
- onboarding.step === 'saving-default-harness' && onboarding.error ? /*#__PURE__*/ _jsx("div", {
178
- className: "px-20 pb-8",
179
- children: /*#__PURE__*/ _jsx(Callout, {
180
- role: "alert",
181
- type: "error",
182
- children: /*#__PURE__*/ _jsxs("div", {
183
- className: "flex flex-col gap-8",
184
- children: [
185
- /*#__PURE__*/ _jsx(Text, {
186
- size: "sm",
187
- bold: true,
188
- children: "Could not save default harness"
189
- }),
190
- /*#__PURE__*/ _jsx(Text, {
191
- size: "sm",
192
- children: onboarding.error
168
+ onboarding.step === 'configure-provider' || onboarding.step === 'saving-default-harness' ? /*#__PURE__*/ _jsxs("div", {
169
+ className: "flex min-h-0 flex-1 flex-col gap-inline",
170
+ children: [
171
+ onboarding.step === 'saving-default-harness' ? /*#__PURE__*/ _jsx("div", {
172
+ role: "status",
173
+ className: "px-row",
174
+ children: /*#__PURE__*/ _jsx(Text, {
175
+ size: "sm",
176
+ className: "text-foreground-neutral-muted",
177
+ children: "Saving harness default..."
178
+ })
179
+ }) : null,
180
+ onboarding.step === 'saving-default-harness' && onboarding.error ? /*#__PURE__*/ _jsx("div", {
181
+ className: "px-row",
182
+ children: /*#__PURE__*/ _jsx(Callout, {
183
+ role: "alert",
184
+ type: "error",
185
+ children: /*#__PURE__*/ _jsxs("div", {
186
+ className: "flex flex-col gap-inline",
187
+ children: [
188
+ /*#__PURE__*/ _jsx(Text, {
189
+ size: "sm",
190
+ bold: true,
191
+ children: "Could not save default harness"
192
+ }),
193
+ /*#__PURE__*/ _jsx(Text, {
194
+ size: "sm",
195
+ children: onboarding.error
196
+ })
197
+ ]
193
198
  })
194
- ]
199
+ })
200
+ }) : null,
201
+ /*#__PURE__*/ _jsx("div", {
202
+ className: "flex min-h-0 flex-1 flex-col",
203
+ children: /*#__PURE__*/ _jsx(ModelProviderTestAndSaveForm, {
204
+ workspaceId: workspaceId,
205
+ entry: onboarding.provider,
206
+ setAsDefaultOnSave: true,
207
+ onSaved: ()=>{
208
+ void handleProviderSaved();
209
+ }
210
+ })
195
211
  })
196
- })
197
- }) : null,
198
- onboarding.step === 'configure-provider' || onboarding.step === 'saving-default-harness' ? /*#__PURE__*/ _jsx(ModelProviderTestAndSaveForm, {
199
- workspaceId: workspaceId,
200
- entry: onboarding.provider,
201
- setAsDefaultOnSave: true,
202
- onSaved: ()=>{
203
- void handleProviderSaved();
204
- }
212
+ ]
205
213
  }) : null
206
214
  ]
207
215
  })
@@ -223,14 +231,14 @@ function HarnessCard({ harness, onChoose }) {
223
231
  return /*#__PURE__*/ _jsx("li", {
224
232
  children: /*#__PURE__*/ _jsx("button", {
225
233
  type: "button",
226
- className: cn('group block w-full cursor-pointer p-16 text-left outline-none transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus', SURFACE_CLASS),
234
+ className: cn('group block w-full cursor-pointer p-panel-compact text-left outline-none transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus', SURFACE_CLASS),
227
235
  "aria-label": `Choose ${harness.label}`,
228
236
  onClick: onChoose,
229
237
  children: /*#__PURE__*/ _jsxs("div", {
230
- className: "flex min-w-0 items-center justify-between gap-12",
238
+ className: "flex min-w-0 items-center justify-between gap-cluster",
231
239
  children: [
232
240
  /*#__PURE__*/ _jsxs("div", {
233
- className: "flex min-w-0 flex-col gap-4",
241
+ className: "flex min-w-0 flex-col gap-tight",
234
242
  children: [
235
243
  /*#__PURE__*/ _jsx(Text, {
236
244
  size: "md",
@@ -246,7 +254,7 @@ function HarnessCard({ harness, onChoose }) {
246
254
  ]
247
255
  }),
248
256
  /*#__PURE__*/ _jsxs("div", {
249
- className: "flex shrink-0 items-center gap-4 text-foreground-neutral-muted transition-colors group-hover:text-foreground-highlight-interactive",
257
+ className: "flex shrink-0 items-center gap-tight text-foreground-neutral-muted transition-colors group-hover:text-foreground-highlight-interactive",
250
258
  children: [
251
259
  /*#__PURE__*/ _jsx(Text, {
252
260
  size: "sm",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/pages/model-provider-onboarding-page.tsx"],"sourcesContent":["import {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Modal, ModalContent, ModalHeader, ModalTitle} from '@shipfox/react-ui/modal';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Header, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {useEffect, useMemo, useReducer} from 'react';\nimport {AvailableProvidersGrid, PROVIDER_GRID_CLASS} from '#components/available-providers-grid.js';\nimport {modelProviderConfigErrorToFormError} from '#components/form-errors.js';\nimport {ModelProviderTestAndSaveForm} from '#components/test-and-save-form.js';\nimport {DEFAULT_HARNESS, harnessSupportsProvider, listHarnesses} from '#core/harness-policy.js';\nimport type {HarnessDescriptor, HarnessId, SupportedProvider} from '#core/models.js';\nimport {initialOnboardingState, onboardingReducer} from '#core/onboarding-reducer.js';\nimport {isSupportedProvider} from '#core/provider-policy.js';\nimport {\n useModelProviderCatalogQuery,\n useSetDefaultHarnessMutation,\n} from '#hooks/api/model-providers.js';\nimport {dismissModelProviderOnboarding} from '#state/model-provider-onboarding.js';\n\nconst SURFACE_CLASS =\n 'overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base';\n\nexport function ModelProviderOnboardingPage({\n workspaceId,\n onSkip,\n onConfigured,\n}: {\n workspaceId: string;\n onSkip: () => void;\n onConfigured: () => void;\n}) {\n const catalogQuery = useModelProviderCatalogQuery();\n const setDefaultHarness = useSetDefaultHarnessMutation();\n const [onboarding, dispatch] = useReducer(onboardingReducer, initialOnboardingState);\n const supportedProviders = catalogQuery.data?.providers.filter(isSupportedProvider) ?? [];\n const filteredProviders = useMemo(() => {\n if (onboarding.step === 'choose-harness') return [];\n return supportedProviders.filter((provider) =>\n harnessSupportsProvider(onboarding.harnessId, provider.id),\n );\n }, [onboarding, supportedProviders]);\n\n useEffect(() => {\n document\n .getElementById(\n onboarding.step === 'choose-harness'\n ? 'model-provider-harness-step'\n : 'model-provider-provider-step',\n )\n ?.focus();\n }, [onboarding.step]);\n\n function handleSkip() {\n try {\n dismissModelProviderOnboarding(workspaceId);\n } catch {\n // Skip is best-effort persistence; access to the product must not depend on storage.\n }\n onSkip();\n }\n\n async function handleProviderSaved() {\n if (onboarding.step !== 'configure-provider' && onboarding.step !== 'saving-default-harness')\n return;\n\n const provider = onboarding.provider;\n if (onboarding.step === 'configure-provider') dispatch({type: 'provider-saved'});\n if (onboarding.harnessId === DEFAULT_HARNESS) {\n toast.success(`${provider.label} saved`);\n dispatch({type: 'default-harness-saved'});\n onConfigured();\n return;\n }\n\n try {\n await setDefaultHarness.mutateAsync({\n workspaceId,\n harnessId: onboarding.harnessId,\n });\n toast.success(`${provider.label} saved`);\n dispatch({type: 'default-harness-saved'});\n onConfigured();\n } catch (error) {\n const mapped = modelProviderConfigErrorToFormError(error);\n dispatch({\n type: 'default-harness-failed',\n message: mapped.message || 'Could not save default harness. Try again.',\n });\n }\n }\n\n const selectedHarnessDescriptor =\n onboarding.step === 'choose-harness'\n ? null\n : listHarnesses().find((harness) => harness.id === onboarding.harnessId);\n const headingId =\n onboarding.step === 'choose-harness'\n ? 'model-provider-harness-step'\n : 'model-provider-provider-step';\n\n return (\n <div className=\"mx-auto flex w-full max-w-[640px] flex-col gap-20\">\n <header className=\"flex flex-col gap-12\">\n <div className=\"flex items-start justify-between gap-16 max-[520px]:flex-col max-[520px]:gap-8\">\n <Header id={headingId} variant=\"h1\" tabIndex={-1} className=\"outline-none\">\n {selectedHarnessDescriptor\n ? `Configure ${selectedHarnessDescriptor.label}`\n : 'Choose agent harness'}\n </Header>\n <Button type=\"button\" variant=\"secondary\" onClick={handleSkip} className=\"shrink-0\">\n Skip for now\n </Button>\n </div>\n <Text size=\"md\" className=\"text-foreground-neutral-muted\">\n {selectedHarnessDescriptor\n ? `${selectedHarnessDescriptor.label} needs a compatible model provider. Add your own API key, or go back to choose a different harness.`\n : 'A harness runs agent steps. Choose the engine you want first, then connect a compatible model provider.'}\n </Text>\n </header>\n\n <section aria-labelledby={headingId} className=\"flex flex-col gap-16\">\n {onboarding.step === 'choose-harness' ? (\n <HarnessPicker\n onSelect={(harnessId) => dispatch({type: 'harness-selected', harnessId})}\n />\n ) : (\n <>\n <div>\n <Button type=\"button\" variant=\"transparent\" onClick={() => dispatch({type: 'back'})}>\n Back\n </Button>\n </div>\n <ModelProviderPicker\n key={onboarding.harnessId}\n catalogQuery={catalogQuery}\n supportedProviders={filteredProviders}\n onSelect={(entry) => {\n dispatch({type: 'provider-selected', provider: entry});\n }}\n />\n </>\n )}\n </section>\n\n <Modal\n open={\n onboarding.step === 'configure-provider' || onboarding.step === 'saving-default-harness'\n }\n onOpenChange={(open) => {\n if (!open && onboarding.step === 'configure-provider') dispatch({type: 'back'});\n }}\n >\n <ModalContent aria-describedby={undefined}>\n <ModalTitle className=\"sr-only\">\n {onboarding.step === 'configure-provider' ||\n onboarding.step === 'saving-default-harness'\n ? `Configure ${onboarding.provider.label}`\n : ''}\n </ModalTitle>\n <ModalHeader>\n <Text\n size=\"lg\"\n aria-hidden=\"true\"\n className=\"overflow-ellipsis overflow-hidden whitespace-nowrap\"\n >\n {onboarding.step === 'configure-provider' ||\n onboarding.step === 'saving-default-harness'\n ? `Configure ${onboarding.provider.label}`\n : ''}\n </Text>\n </ModalHeader>\n {onboarding.step === 'saving-default-harness' ? (\n <div role=\"status\" className=\"px-20 pb-8\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Saving harness default...\n </Text>\n </div>\n ) : null}\n {onboarding.step === 'saving-default-harness' && onboarding.error ? (\n <div className=\"px-20 pb-8\">\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-8\">\n <Text size=\"sm\" bold>\n Could not save default harness\n </Text>\n <Text size=\"sm\">{onboarding.error}</Text>\n </div>\n </Callout>\n </div>\n ) : null}\n {onboarding.step === 'configure-provider' ||\n onboarding.step === 'saving-default-harness' ? (\n <ModelProviderTestAndSaveForm\n workspaceId={workspaceId}\n entry={onboarding.provider}\n setAsDefaultOnSave\n onSaved={() => {\n void handleProviderSaved();\n }}\n />\n ) : null}\n </ModalContent>\n </Modal>\n </div>\n );\n}\n\nfunction HarnessPicker({onSelect}: {onSelect: (harness: HarnessId) => void}) {\n return (\n <ul className={PROVIDER_GRID_CLASS} aria-label=\"Agent harnesses\">\n {listHarnesses().map((harness) => (\n <HarnessCard key={harness.id} harness={harness} onChoose={() => onSelect(harness.id)} />\n ))}\n </ul>\n );\n}\n\nfunction HarnessCard({harness, onChoose}: {harness: HarnessDescriptor; onChoose: () => void}) {\n return (\n <li>\n <button\n type=\"button\"\n className={cn(\n 'group block w-full cursor-pointer p-16 text-left outline-none transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus',\n SURFACE_CLASS,\n )}\n aria-label={`Choose ${harness.label}`}\n onClick={onChoose}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-12\">\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Text size=\"md\" bold className=\"min-w-0 truncate\">\n {harness.label}\n </Text>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {harness.description}\n </Text>\n </div>\n <div className=\"flex shrink-0 items-center gap-4 text-foreground-neutral-muted transition-colors group-hover:text-foreground-highlight-interactive\">\n <Text size=\"sm\">Choose</Text>\n <Icon name=\"chevronRight\" className=\"size-16\" />\n </div>\n </div>\n </button>\n </li>\n );\n}\n\nfunction ModelProviderPicker({\n catalogQuery,\n supportedProviders,\n onSelect,\n}: {\n catalogQuery: ReturnType<typeof useModelProviderCatalogQuery>;\n supportedProviders: SupportedProvider[];\n onSelect: (entry: SupportedProvider) => void;\n}) {\n if (catalogQuery.isPending) {\n return (\n <div role=\"status\" aria-busy=\"true\" aria-label=\"Loading model providers\">\n <ModelProviderGridSkeleton />\n </div>\n );\n }\n\n if (catalogQuery.isError && catalogQuery.data === undefined) {\n return <QueryLoadError query={catalogQuery} subject=\"model provider catalog\" />;\n }\n\n if (catalogQuery.data !== undefined && supportedProviders.length === 0) {\n return (\n <EmptyState\n icon=\"componentLine\"\n title=\"No providers available to configure\"\n description=\"Skip for now and add one later from workspace settings.\"\n />\n );\n }\n\n return <AvailableProvidersGrid entries={supportedProviders} onSelect={onSelect} />;\n}\n\nfunction ModelProviderGridSkeleton() {\n return (\n <div className={PROVIDER_GRID_CLASS}>\n {[0, 1, 2, 3].map((card) => (\n <Skeleton key={card} className=\"h-136 w-full\" />\n ))}\n </div>\n );\n}\n"],"names":["QueryLoadError","Button","Callout","EmptyState","Icon","Modal","ModalContent","ModalHeader","ModalTitle","Skeleton","toast","Header","Text","cn","useEffect","useMemo","useReducer","AvailableProvidersGrid","PROVIDER_GRID_CLASS","modelProviderConfigErrorToFormError","ModelProviderTestAndSaveForm","DEFAULT_HARNESS","harnessSupportsProvider","listHarnesses","initialOnboardingState","onboardingReducer","isSupportedProvider","useModelProviderCatalogQuery","useSetDefaultHarnessMutation","dismissModelProviderOnboarding","SURFACE_CLASS","ModelProviderOnboardingPage","workspaceId","onSkip","onConfigured","catalogQuery","setDefaultHarness","onboarding","dispatch","supportedProviders","data","providers","filter","filteredProviders","step","provider","harnessId","id","document","getElementById","focus","handleSkip","handleProviderSaved","type","success","label","mutateAsync","error","mapped","message","selectedHarnessDescriptor","find","harness","headingId","div","className","header","variant","tabIndex","onClick","size","section","aria-labelledby","HarnessPicker","onSelect","ModelProviderPicker","entry","open","onOpenChange","aria-describedby","undefined","aria-hidden","role","bold","setAsDefaultOnSave","onSaved","ul","aria-label","map","HarnessCard","onChoose","li","button","description","name","isPending","aria-busy","ModelProviderGridSkeleton","isError","query","subject","length","icon","title","entries","card"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/pages/model-provider-onboarding-page.tsx"],"sourcesContent":["import {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon} from '@shipfox/react-ui/icon';\nimport {Modal, ModalContent, ModalHeader, ModalTitle} from '@shipfox/react-ui/modal';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Header, Text} from '@shipfox/react-ui/typography';\nimport {cn} from '@shipfox/react-ui/utils';\nimport {useEffect, useMemo, useReducer} from 'react';\nimport {AvailableProvidersGrid, PROVIDER_GRID_CLASS} from '#components/available-providers-grid.js';\nimport {modelProviderConfigErrorToFormError} from '#components/form-errors.js';\nimport {ModelProviderTestAndSaveForm} from '#components/test-and-save-form.js';\nimport {DEFAULT_HARNESS, harnessSupportsProvider, listHarnesses} from '#core/harness-policy.js';\nimport type {HarnessDescriptor, HarnessId, SupportedProvider} from '#core/models.js';\nimport {initialOnboardingState, onboardingReducer} from '#core/onboarding-reducer.js';\nimport {isSupportedProvider} from '#core/provider-policy.js';\nimport {\n useModelProviderCatalogQuery,\n useSetDefaultHarnessMutation,\n} from '#hooks/api/model-providers.js';\nimport {dismissModelProviderOnboarding} from '#state/model-provider-onboarding.js';\n\nconst SURFACE_CLASS =\n 'overflow-hidden rounded-8 border border-border-neutral-base bg-background-neutral-base';\n\nexport function ModelProviderOnboardingPage({\n workspaceId,\n onSkip,\n onConfigured,\n}: {\n workspaceId: string;\n onSkip: () => void;\n onConfigured: () => void;\n}) {\n const catalogQuery = useModelProviderCatalogQuery();\n const setDefaultHarness = useSetDefaultHarnessMutation();\n const [onboarding, dispatch] = useReducer(onboardingReducer, initialOnboardingState);\n const supportedProviders = catalogQuery.data?.providers.filter(isSupportedProvider) ?? [];\n const filteredProviders = useMemo(() => {\n if (onboarding.step === 'choose-harness') return [];\n return supportedProviders.filter((provider) =>\n harnessSupportsProvider(onboarding.harnessId, provider.id),\n );\n }, [onboarding, supportedProviders]);\n\n useEffect(() => {\n document\n .getElementById(\n onboarding.step === 'choose-harness'\n ? 'model-provider-harness-step'\n : 'model-provider-provider-step',\n )\n ?.focus();\n }, [onboarding.step]);\n\n function handleSkip() {\n try {\n dismissModelProviderOnboarding(workspaceId);\n } catch {\n // Skip is best-effort persistence; access to the product must not depend on storage.\n }\n onSkip();\n }\n\n async function handleProviderSaved() {\n if (onboarding.step !== 'configure-provider' && onboarding.step !== 'saving-default-harness')\n return;\n\n const provider = onboarding.provider;\n if (onboarding.step === 'configure-provider') dispatch({type: 'provider-saved'});\n if (onboarding.harnessId === DEFAULT_HARNESS) {\n toast.success(`${provider.label} saved`);\n dispatch({type: 'default-harness-saved'});\n onConfigured();\n return;\n }\n\n try {\n await setDefaultHarness.mutateAsync({\n workspaceId,\n harnessId: onboarding.harnessId,\n });\n toast.success(`${provider.label} saved`);\n dispatch({type: 'default-harness-saved'});\n onConfigured();\n } catch (error) {\n const mapped = modelProviderConfigErrorToFormError(error);\n dispatch({\n type: 'default-harness-failed',\n message: mapped.message || 'Could not save default harness. Try again.',\n });\n }\n }\n\n const selectedHarnessDescriptor =\n onboarding.step === 'choose-harness'\n ? null\n : listHarnesses().find((harness) => harness.id === onboarding.harnessId);\n const headingId =\n onboarding.step === 'choose-harness'\n ? 'model-provider-harness-step'\n : 'model-provider-provider-step';\n\n return (\n <div className=\"mx-auto flex w-full max-w-[640px] flex-col gap-section\">\n <header className=\"flex flex-col gap-cluster\">\n <div className=\"flex items-start justify-between gap-group max-[520px]:flex-col max-[520px]:gap-inline\">\n <Header id={headingId} variant=\"h1\" tabIndex={-1} className=\"outline-none\">\n {selectedHarnessDescriptor\n ? `Configure ${selectedHarnessDescriptor.label}`\n : 'Choose agent harness'}\n </Header>\n <Button type=\"button\" variant=\"secondary\" onClick={handleSkip} className=\"shrink-0\">\n Skip for now\n </Button>\n </div>\n <Text size=\"md\" className=\"text-foreground-neutral-muted\">\n {selectedHarnessDescriptor\n ? `${selectedHarnessDescriptor.label} needs a compatible model provider. Add your own API key, or go back to choose a different harness.`\n : 'A harness runs agent steps. Choose the engine you want first, then connect a compatible model provider.'}\n </Text>\n </header>\n\n <section aria-labelledby={headingId} className=\"flex flex-col gap-group\">\n {onboarding.step === 'choose-harness' ? (\n <HarnessPicker\n onSelect={(harnessId) => dispatch({type: 'harness-selected', harnessId})}\n />\n ) : (\n <>\n <div>\n <Button type=\"button\" variant=\"transparent\" onClick={() => dispatch({type: 'back'})}>\n Back\n </Button>\n </div>\n <ModelProviderPicker\n key={onboarding.harnessId}\n catalogQuery={catalogQuery}\n supportedProviders={filteredProviders}\n onSelect={(entry) => {\n dispatch({type: 'provider-selected', provider: entry});\n }}\n />\n </>\n )}\n </section>\n\n <Modal\n open={\n onboarding.step === 'configure-provider' || onboarding.step === 'saving-default-harness'\n }\n onOpenChange={(open) => {\n if (!open && onboarding.step === 'configure-provider') dispatch({type: 'back'});\n }}\n >\n <ModalContent aria-describedby={undefined}>\n <ModalTitle className=\"sr-only\">\n {onboarding.step === 'configure-provider' ||\n onboarding.step === 'saving-default-harness'\n ? `Configure ${onboarding.provider.label}`\n : ''}\n </ModalTitle>\n <ModalHeader>\n <Text\n size=\"lg\"\n aria-hidden=\"true\"\n className=\"overflow-ellipsis overflow-hidden whitespace-nowrap\"\n >\n {onboarding.step === 'configure-provider' ||\n onboarding.step === 'saving-default-harness'\n ? `Configure ${onboarding.provider.label}`\n : ''}\n </Text>\n </ModalHeader>\n {onboarding.step === 'configure-provider' ||\n onboarding.step === 'saving-default-harness' ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-inline\">\n {onboarding.step === 'saving-default-harness' ? (\n <div role=\"status\" className=\"px-row\">\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Saving harness default...\n </Text>\n </div>\n ) : null}\n {onboarding.step === 'saving-default-harness' && onboarding.error ? (\n <div className=\"px-row\">\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-inline\">\n <Text size=\"sm\" bold>\n Could not save default harness\n </Text>\n <Text size=\"sm\">{onboarding.error}</Text>\n </div>\n </Callout>\n </div>\n ) : null}\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <ModelProviderTestAndSaveForm\n workspaceId={workspaceId}\n entry={onboarding.provider}\n setAsDefaultOnSave\n onSaved={() => {\n void handleProviderSaved();\n }}\n />\n </div>\n </div>\n ) : null}\n </ModalContent>\n </Modal>\n </div>\n );\n}\n\nfunction HarnessPicker({onSelect}: {onSelect: (harness: HarnessId) => void}) {\n return (\n <ul className={PROVIDER_GRID_CLASS} aria-label=\"Agent harnesses\">\n {listHarnesses().map((harness) => (\n <HarnessCard key={harness.id} harness={harness} onChoose={() => onSelect(harness.id)} />\n ))}\n </ul>\n );\n}\n\nfunction HarnessCard({harness, onChoose}: {harness: HarnessDescriptor; onChoose: () => void}) {\n return (\n <li>\n <button\n type=\"button\"\n className={cn(\n 'group block w-full cursor-pointer p-panel-compact text-left outline-none transition-colors hover:bg-background-components-hover focus-visible:shadow-button-neutral-focus',\n SURFACE_CLASS,\n )}\n aria-label={`Choose ${harness.label}`}\n onClick={onChoose}\n >\n <div className=\"flex min-w-0 items-center justify-between gap-cluster\">\n <div className=\"flex min-w-0 flex-col gap-tight\">\n <Text size=\"md\" bold className=\"min-w-0 truncate\">\n {harness.label}\n </Text>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n {harness.description}\n </Text>\n </div>\n <div className=\"flex shrink-0 items-center gap-tight text-foreground-neutral-muted transition-colors group-hover:text-foreground-highlight-interactive\">\n <Text size=\"sm\">Choose</Text>\n <Icon name=\"chevronRight\" className=\"size-16\" />\n </div>\n </div>\n </button>\n </li>\n );\n}\n\nfunction ModelProviderPicker({\n catalogQuery,\n supportedProviders,\n onSelect,\n}: {\n catalogQuery: ReturnType<typeof useModelProviderCatalogQuery>;\n supportedProviders: SupportedProvider[];\n onSelect: (entry: SupportedProvider) => void;\n}) {\n if (catalogQuery.isPending) {\n return (\n <div role=\"status\" aria-busy=\"true\" aria-label=\"Loading model providers\">\n <ModelProviderGridSkeleton />\n </div>\n );\n }\n\n if (catalogQuery.isError && catalogQuery.data === undefined) {\n return <QueryLoadError query={catalogQuery} subject=\"model provider catalog\" />;\n }\n\n if (catalogQuery.data !== undefined && supportedProviders.length === 0) {\n return (\n <EmptyState\n icon=\"componentLine\"\n title=\"No providers available to configure\"\n description=\"Skip for now and add one later from workspace settings.\"\n />\n );\n }\n\n return <AvailableProvidersGrid entries={supportedProviders} onSelect={onSelect} />;\n}\n\nfunction ModelProviderGridSkeleton() {\n return (\n <div className={PROVIDER_GRID_CLASS}>\n {[0, 1, 2, 3].map((card) => (\n <Skeleton key={card} className=\"h-136 w-full\" />\n ))}\n </div>\n );\n}\n"],"names":["QueryLoadError","Button","Callout","EmptyState","Icon","Modal","ModalContent","ModalHeader","ModalTitle","Skeleton","toast","Header","Text","cn","useEffect","useMemo","useReducer","AvailableProvidersGrid","PROVIDER_GRID_CLASS","modelProviderConfigErrorToFormError","ModelProviderTestAndSaveForm","DEFAULT_HARNESS","harnessSupportsProvider","listHarnesses","initialOnboardingState","onboardingReducer","isSupportedProvider","useModelProviderCatalogQuery","useSetDefaultHarnessMutation","dismissModelProviderOnboarding","SURFACE_CLASS","ModelProviderOnboardingPage","workspaceId","onSkip","onConfigured","catalogQuery","setDefaultHarness","onboarding","dispatch","supportedProviders","data","providers","filter","filteredProviders","step","provider","harnessId","id","document","getElementById","focus","handleSkip","handleProviderSaved","type","success","label","mutateAsync","error","mapped","message","selectedHarnessDescriptor","find","harness","headingId","div","className","header","variant","tabIndex","onClick","size","section","aria-labelledby","HarnessPicker","onSelect","ModelProviderPicker","entry","open","onOpenChange","aria-describedby","undefined","aria-hidden","role","bold","setAsDefaultOnSave","onSaved","ul","aria-label","map","HarnessCard","onChoose","li","button","description","name","isPending","aria-busy","ModelProviderGridSkeleton","isError","query","subject","length","icon","title","entries","card"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"model-provider-onboarding-page.stories.d.ts","sourceRoot":"","sources":["../../src/pages/model-provider-onboarding-page.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAO,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAQrD,KAAK,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,cAAc,GAAG,YAAY,CAAC;AAE1F,UAAU,iCAAiC;IACzC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AA+ED,iBAAS,4BAA4B,CAAC,EAAC,QAAQ,EAAC,EAAE,iCAAiC,+BAuBlF;AAED,QAAA,MAAM,IAAI;;;;;;;;;CAK2C,CAAC;AAEtD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAAU,CAAC;AAEpC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAMlC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAW/B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,KAWjC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAQhC,CAAC"}
1
+ {"version":3,"file":"model-provider-onboarding-page.stories.d.ts","sourceRoot":"","sources":["../../src/pages/model-provider-onboarding-page.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAO,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAQrD,KAAK,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,cAAc,GAAG,YAAY,CAAC;AAE1F,UAAU,iCAAiC;IACzC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AA+ED,iBAAS,4BAA4B,CAAC,EAAC,QAAQ,EAAC,EAAE,iCAAiC,+BAuBlF;AAED,QAAA,MAAM,IAAI;;;;QAGK,MAAM;;;;;CAEgC,CAAC;eAEvC,IAAI;AACnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,UAAU,EAAE,KAAU,CAAC;AAEpC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAMlC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAW/B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,KAWjC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAQhC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"agents-settings.d.ts","sourceRoot":"","sources":["../../src/routes/agents-settings.tsx"],"names":[],"mappings":";;;AAGA,wBAUG"}
1
+ {"version":3,"file":"agents-settings.d.ts","sourceRoot":"","sources":["../../src/routes/agents-settings.tsx"],"names":[],"mappings":""}
@@ -5,7 +5,7 @@ export default defineRoute({
5
5
  component: ()=>{
6
6
  const workspace = useActiveWorkspace();
7
7
  return /*#__PURE__*/ _jsxs("div", {
8
- className: "flex flex-col gap-32",
8
+ className: "flex flex-col gap-region",
9
9
  children: [
10
10
  /*#__PURE__*/ _jsx(WorkspaceHarnessesSection, {
11
11
  workspaceId: workspace.id
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/routes/agents-settings.tsx"],"sourcesContent":["import {defineRoute, useActiveWorkspace} from '@shipfox/client-shell/runtime';\nimport {WorkspaceHarnessesSection, WorkspaceModelProvidersSection} from '#index.js';\n\nexport default defineRoute({\n component: () => {\n const workspace = useActiveWorkspace();\n return (\n <div className=\"flex flex-col gap-32\">\n <WorkspaceHarnessesSection workspaceId={workspace.id} />\n <WorkspaceModelProvidersSection workspaceId={workspace.id} />\n </div>\n );\n },\n});\n"],"names":["defineRoute","useActiveWorkspace","WorkspaceHarnessesSection","WorkspaceModelProvidersSection","component","workspace","div","className","workspaceId","id"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,yBAAyB,EAAEC,8BAA8B,QAAO,YAAY;AAEpF,eAAeH,YAAY;IACzBI,WAAW;QACT,MAAMC,YAAYJ;QAClB,qBACE,MAACK;YAAIC,WAAU;;8BACb,KAACL;oBAA0BM,aAAaH,UAAUI,EAAE;;8BACpD,KAACN;oBAA+BK,aAAaH,UAAUI,EAAE;;;;IAG/D;AACF,GAAG"}
1
+ {"version":3,"sources":["../../src/routes/agents-settings.tsx"],"sourcesContent":["import {defineRoute, useActiveWorkspace} from '@shipfox/client-shell/runtime';\nimport {WorkspaceHarnessesSection, WorkspaceModelProvidersSection} from '#index.js';\n\nexport default defineRoute({\n component: () => {\n const workspace = useActiveWorkspace();\n return (\n <div className=\"flex flex-col gap-region\">\n <WorkspaceHarnessesSection workspaceId={workspace.id} />\n <WorkspaceModelProvidersSection workspaceId={workspace.id} />\n </div>\n );\n },\n});\n"],"names":["defineRoute","useActiveWorkspace","WorkspaceHarnessesSection","WorkspaceModelProvidersSection","component","workspace","div","className","workspaceId","id"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,kBAAkB,QAAO,gCAAgC;AAC9E,SAAQC,yBAAyB,EAAEC,8BAA8B,QAAO,YAAY;AAEpF,eAAeH,YAAY;IACzBI,WAAW;QACT,MAAMC,YAAYJ;QAClB,qBACE,MAACK;YAAIC,WAAU;;8BACb,KAACL;oBAA0BM,aAAaH,UAAUI,EAAE;;8BACpD,KAACN;oBAA+BK,aAAaH,UAAUI,EAAE;;;;IAG/D;AACF,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"model-provider.d.ts","sourceRoot":"","sources":["../../src/routes/model-provider.tsx"],"names":[],"mappings":";;;AAKA,wBAgBG"}
1
+ {"version":3,"file":"model-provider.d.ts","sourceRoot":"","sources":["../../src/routes/model-provider.tsx"],"names":[],"mappings":""}