@@ -34,7 +34,6 @@ import type { OpenDesignHostProjectImportSuccess } from '@open-design/host';
3434import { useAnalytics } from '../analytics/provider' ;
3535import {
3636 trackHomeNavClick ,
37- trackHomeToolbarClick ,
3837 trackOnboardingClick ,
3938 trackOnboardingCompleteResult ,
4039 trackOnboardingRuntimeScanResult ,
@@ -180,13 +179,7 @@ import {
180179 recordOptimisticProjectOwnership ,
181180 type OptimisticProjectOwnershipWitnesses ,
182181} from '../collab/optimistic-project-ownership' ;
183- import {
184- getModelCapabilityTag ,
185- getModelCostTier ,
186- MODEL_CAPABILITY_TAG_LABEL_KEYS ,
187- MODEL_COST_TIER_LABEL_KEYS ,
188- type ModelCapabilityTag ,
189- } from './modelCapabilityTags' ;
182+ import type { ModelCapabilityTag } from './modelCapabilityTags' ;
190183import { LanguageMenu } from './LanguageMenu' ;
191184import { IntegrationsView , type IntegrationTab } from './IntegrationsView' ;
192185import { InlineModelSwitcher } from './InlineModelSwitcher' ;
@@ -196,7 +189,6 @@ import { ExtensionsMarketplace } from './PluginsView';
196189import type { CreateInput , CreateTab , ImportClaudeDesignOutcome } from './NewProjectPanel' ;
197190import type { PluginLoopSubmit } from './PluginLoopHome' ;
198191import {
199- createProject ,
200192 duplicatePluginAsProject ,
201193 patchProject ,
202194 ProjectCreateError ,
@@ -243,7 +235,6 @@ import {
243235 RAIL_OPEN_STORAGE_KEY ,
244236 readStoredRailOpen ,
245237} from './entryRailBridge' ;
246- import { enterpriseUrl } from './enterpriseUrl' ;
247238import { resolveByokModelPreference } from './byok/validation' ;
248239import onboardingSourceStyles from './OnboardingModelSource.module.css' ;
249240
@@ -287,13 +278,6 @@ type OnboardingAgentTestState =
287278const ONBOARDING_BYOK_AUTO_FETCH_DELAY_MS = 300 ;
288279const ONBOARDING_BYOK_AUTO_TEST_DELAY_MS = 500 ;
289280
290- const ONBOARDING_AMR_MODEL_OPTIONS : NonNullable < AgentInfo [ 'models' ] > = [
291- { id : 'claude-opus-4.8' , label : 'Claude Opus 4.8' } ,
292- { id : 'deepseek-v4-flash' , label : 'DeepSeek V4 Flash' } ,
293- { id : 'gemini-2.5-flash' , label : 'Gemini 2.5 Flash' } ,
294- { id : 'glm-5.1' , label : 'GLM 5.1' } ,
295- ] ;
296-
297281type EntryCreateProjectInput = Omit < CreateInput , 'metadata' > & {
298282 metadata ?: CreateInput [ 'metadata' ] ;
299283 pendingPrompt ?: string ;
@@ -587,7 +571,6 @@ export function EntryShell({
587571 onSkillsChanged,
588572 onRefreshAgents,
589573 onCreateProject,
590- onCreatePluginShareProject,
591574 onImportClaudeDesign,
592575 onImportFolder,
593576 onImportFolderResponse,
@@ -3788,105 +3771,6 @@ function OnboardingCliSetupPanel({
37883771 ) ;
37893772}
37903773
3791- function OnboardingAmrModelSelect ( {
3792- models,
3793- modelsSource,
3794- selectedModel,
3795- onSelectModel,
3796- } : {
3797- models : NonNullable < AgentInfo [ 'models' ] > ;
3798- modelsSource : AgentInfo [ 'modelsSource' ] ;
3799- selectedModel : string ;
3800- onSelectModel : ( model : string ) => void ;
3801- } ) {
3802- const t = useT ( ) ;
3803- const modelSource = modelsSource ?? 'fallback' ;
3804- const displayModels = models . map ( ( model ) => {
3805- const capability = onboardingModelCapabilityLabel ( t , model ) ;
3806- const cost = onboardingModelCostLabel ( t , model ) ;
3807- return {
3808- value : model . id ,
3809- label : formatOnboardingAmrModelLabel ( model ) ,
3810- tag : capability ?. label ,
3811- tagKind : capability ?. kind ,
3812- meta : cost ?. label ,
3813- } ;
3814- } ) ;
3815- const modelSourceLabel = t ( 'settings.onboardingAmrModelSourceLabel' ) ;
3816- return (
3817- < div
3818- className = "onboarding-view__model-picker"
3819- onClick = { ( event ) => event . stopPropagation ( ) }
3820- >
3821- < OnboardingDropdown
3822- label = { `${ t ( 'settings.modelPicker' ) } · ${ modelSourceLabel } ` }
3823- placeholder = { t ( 'settings.modelSourceFallback' ) }
3824- value = { selectedModel }
3825- options = { displayModels }
3826- onChange = { onSelectModel }
3827- searchable
3828- searchPlaceholder = { t ( 'newproj.modelSearch' ) }
3829- sourceTone = { modelSource }
3830- />
3831- </ div >
3832- ) ;
3833- }
3834-
3835- function formatOnboardingAmrModelLabel (
3836- model : NonNullable < AgentInfo [ 'models' ] > [ number ] ,
3837- ) : string {
3838- const label = model . label ?. trim ( ) ;
3839- if ( label && label !== model . id && ! / ^ [ a - z 0 - 9 . _ - ] + $ / . test ( label ) ) {
3840- return label ;
3841- }
3842- return model . id
3843- . split ( '-' )
3844- . filter ( Boolean )
3845- . map ( formatModelToken )
3846- . join ( ' ' ) ;
3847- }
3848-
3849- function formatModelToken ( token : string ) : string {
3850- const lower = token . toLowerCase ( ) ;
3851- const known : Record < string , string > = {
3852- claude : 'Claude' ,
3853- opus : 'Opus' ,
3854- sonnet : 'Sonnet' ,
3855- haiku : 'Haiku' ,
3856- deepseek : 'DeepSeek' ,
3857- gemini : 'Gemini' ,
3858- glm : 'GLM' ,
3859- gpt : 'GPT' ,
3860- oss : 'OSS' ,
3861- kimi : 'Kimi' ,
3862- minimax : 'MiniMax' ,
3863- mimo : 'MiMo' ,
3864- qwen3 : 'Qwen3' ,
3865- seed : 'Seed' ,
3866- } ;
3867- if ( known [ lower ] ) return known [ lower ] ;
3868- if ( / ^ v \d / i. test ( token ) ) return token . toUpperCase ( ) ;
3869- if ( / ^ \d + b $ / i. test ( token ) || / ^ a \d + b $ / i. test ( token ) ) return token . toUpperCase ( ) ;
3870- if ( / ^ \d + ( \. \d + ) * $ / . test ( token ) ) return token ;
3871- return token . charAt ( 0 ) . toUpperCase ( ) + token . slice ( 1 ) ;
3872- }
3873-
3874- function onboardingModelCapabilityLabel (
3875- t : ReturnType < typeof useT > ,
3876- model : Pick < NonNullable < AgentInfo [ 'models' ] > [ number ] , 'id' | 'metadata' > ,
3877- ) : { label : string ; kind : ModelCapabilityTag } | undefined {
3878- const tag = getModelCapabilityTag ( model ) ;
3879- return tag ? { label : t ( MODEL_CAPABILITY_TAG_LABEL_KEYS [ tag ] ) , kind : tag } : undefined ;
3880- }
3881-
3882- function onboardingModelCostLabel (
3883- t : ReturnType < typeof useT > ,
3884- model : Pick < NonNullable < AgentInfo [ 'models' ] > [ number ] , 'id' | 'metadata' > ,
3885- ) : { label : string } | undefined {
3886- const tier = getModelCostTier ( model ) ;
3887- return tier ? { label : t ( MODEL_COST_TIER_LABEL_KEYS [ tier ] ) } : undefined ;
3888- }
3889-
38903774function OnboardingByokSetupPanel ( {
38913775 apiProtocol,
38923776 apiKey,
@@ -4549,209 +4433,3 @@ export function OnboardingDropdown(props: OnboardingDropdownProps) {
45494433 </ div >
45504434 ) ;
45514435}
4552-
4553- // Placeholder for the AMR cloud card shown while AMR availability is still
4554- // being probed (the cold-start detection stream / one-shot re-probe). It
4555- // mirrors the real card's footprint exactly — same featured/amr grid, same
4556- // 246px min-height — so resolving to the real card causes no layout jump.
4557- // The AMR brand (icon + name) is known up-front and rendered solid; only the
4558- // version meta, benefit list, and model picker — the parts that depend on the
4559- // probe result — shimmer. Non-interactive and announced via role="status".
4560- function OnboardingAmrCloudSkeleton ( ) {
4561- const t = useT ( ) ;
4562- return (
4563- < div className = "onboarding-view__amr-cloud-card" >
4564- < div
4565- className = "onboarding-view__card onboarding-view__card--featured onboarding-view__card--amr onboarding-view__card--benefit-aside onboarding-view__card--skeleton"
4566- role = "status"
4567- aria-busy = "true"
4568- aria-label = { t ( 'common.loading' ) }
4569- >
4570- < span className = "onboarding-view__identity" >
4571- < span className = "onboarding-view__icon onboarding-view__icon--asset" >
4572- < AgentIcon id = "amr" size = { 52 } className = "onboarding-view__agent-logo" />
4573- </ span >
4574- < span className = "onboarding-view__card-copy" >
4575- < span className = "onboarding-view__card-top" >
4576- < strong > { t ( 'settings.amrCloud' ) } </ strong >
4577- </ span >
4578- < span className = "onboarding-view__skeleton-line onboarding-view__skeleton-line--meta" />
4579- </ span >
4580- </ span >
4581- < span className = "onboarding-view__benefit-aside" aria-hidden = "true" >
4582- < span className = "onboarding-view__benefit-stack onboarding-view__benefit-stack--skeleton" >
4583- < span className = "onboarding-view__skeleton-line onboarding-view__skeleton-line--benefit" />
4584- < span className = "onboarding-view__skeleton-line onboarding-view__skeleton-line--benefit" />
4585- < span className = "onboarding-view__skeleton-line onboarding-view__skeleton-line--benefit" />
4586- < span className = "onboarding-view__skeleton-line onboarding-view__skeleton-line--benefit" />
4587- </ span >
4588- </ span >
4589- < span className = "onboarding-view__card-model" aria-hidden = "true" >
4590- < span className = "onboarding-view__skeleton-model" >
4591- < span className = "onboarding-view__skeleton-model-label" />
4592- < span className = "onboarding-view__skeleton-model-bar" />
4593- </ span >
4594- </ span >
4595- </ div >
4596- </ div >
4597- ) ;
4598- }
4599-
4600- function OnboardingChoiceCard ( {
4601- icon,
4602- agentIconId,
4603- title,
4604- body,
4605- benefits,
4606- upcomingLabel,
4607- upcomingBenefits,
4608- benefitPlacement = 'copy' ,
4609- metaLabel,
4610- modelSlot,
4611- actionLabel,
4612- selected,
4613- badge,
4614- statusSlot,
4615- featured,
4616- variant,
4617- onClick,
4618- } : {
4619- icon : 'orbit' | 'hammer' | 'sliders' | 'github' | 'upload' | 'sparkles' ;
4620- agentIconId ?: string ;
4621- title : string ;
4622- body : string ;
4623- benefits ?: string [ ] ;
4624- upcomingLabel ?: string ;
4625- upcomingBenefits ?: string [ ] ;
4626- benefitPlacement ?: 'copy' | 'aside' ;
4627- metaLabel ?: string ;
4628- modelSlot ?: ReactNode ;
4629- actionLabel ?: string ;
4630- selected : boolean ;
4631- badge ?: string ;
4632- statusSlot ?: ReactNode ;
4633- featured ?: boolean ;
4634- variant ?: 'amr' ;
4635- onClick : ( ) => void ;
4636- } ) {
4637- function handleKeyDown ( event : ReactKeyboardEvent < HTMLDivElement > ) {
4638- if ( event . target !== event . currentTarget ) return ;
4639- if ( event . key !== 'Enter' && event . key !== ' ' ) return ;
4640- event . preventDefault ( ) ;
4641- onClick ( ) ;
4642- }
4643-
4644- const hasBenefits =
4645- ( benefits && benefits . length > 0 ) ||
4646- ( upcomingBenefits && upcomingBenefits . length > 0 ) ;
4647- const benefitStack = hasBenefits ? (
4648- < span className = "onboarding-view__benefit-stack" >
4649- { benefits && benefits . length > 0 ? (
4650- < span className = "onboarding-view__benefits" >
4651- { benefits . map ( ( item , index ) => (
4652- < span
4653- key = { item }
4654- className = { `onboarding-view__benefit${
4655- index >= 2 ? ' onboarding-view__benefit--hero' : ''
4656- } `}
4657- >
4658- { item }
4659- </ span >
4660- ) ) }
4661- </ span >
4662- ) : null }
4663- { upcomingBenefits && upcomingBenefits . length > 0 ? (
4664- < span className = "onboarding-view__upcoming-benefits" >
4665- { upcomingLabel ? (
4666- < span className = "onboarding-view__upcoming-label" > { upcomingLabel } </ span >
4667- ) : null }
4668- { upcomingBenefits . map ( ( item ) => (
4669- < span key = { item } className = "onboarding-view__benefit onboarding-view__benefit--upcoming" >
4670- { item }
4671- </ span >
4672- ) ) }
4673- </ span >
4674- ) : null }
4675- </ span >
4676- ) : null ;
4677- const modelUnderLogo = variant === 'amr' && modelSlot ;
4678- const iconNode = (
4679- < span
4680- className = {
4681- 'onboarding-view__icon' +
4682- ( agentIconId ? ' onboarding-view__icon--asset' : '' )
4683- }
4684- >
4685- { agentIconId ? (
4686- < AgentIcon
4687- id = { agentIconId }
4688- size = { featured ? 52 : 40 }
4689- className = "onboarding-view__agent-logo"
4690- />
4691- ) : (
4692- < Icon name = { icon } size = { 18 } />
4693- ) }
4694- </ span >
4695- ) ;
4696- const copyNode = (
4697- < span className = "onboarding-view__card-copy" >
4698- < span className = "onboarding-view__card-top" >
4699- < strong > { title } </ strong >
4700- { badge ? < span className = "onboarding-view__badge" > { badge } </ span > : null }
4701- </ span >
4702- { metaLabel ? < span className = "onboarding-view__card-meta" > { metaLabel } </ span > : null }
4703- { modelUnderLogo ? null : modelSlot }
4704- { benefitPlacement === 'copy' && benefitStack ? (
4705- benefitStack
4706- ) : ! modelSlot ? (
4707- < small > { body } </ small >
4708- ) : null }
4709- </ span >
4710- ) ;
4711-
4712- return (
4713- < div
4714- role = "button"
4715- tabIndex = { 0 }
4716- className = { `onboarding-view__card${ selected ? ' is-selected' : '' } ${
4717- featured ? ' onboarding-view__card--featured' : ''
4718- } ${ variant ? ` onboarding-view__card--${ variant } ` : '' } ${
4719- benefitPlacement === 'aside' ? ' onboarding-view__card--benefit-aside' : ''
4720- } `}
4721- onClick = { onClick }
4722- onKeyDown = { handleKeyDown }
4723- aria-pressed = { selected }
4724- >
4725- { variant === 'amr' ? (
4726- < span className = "onboarding-view__identity" >
4727- { iconNode }
4728- { copyNode }
4729- </ span >
4730- ) : (
4731- < >
4732- { iconNode }
4733- { copyNode }
4734- </ >
4735- ) }
4736- { modelUnderLogo ? (
4737- < span className = "onboarding-view__card-model" >
4738- { modelSlot }
4739- </ span >
4740- ) : null }
4741- { benefitPlacement === 'aside' && benefitStack ? (
4742- < span className = "onboarding-view__benefit-aside" > { benefitStack } </ span >
4743- ) : null }
4744- { statusSlot ? (
4745- < span className = "onboarding-view__card-status" >
4746- { statusSlot }
4747- </ span >
4748- ) : null }
4749- { actionLabel ? < span className = "onboarding-view__card-action" > { actionLabel } </ span > : null }
4750- { selected ? (
4751- < span className = "onboarding-view__check" >
4752- < Icon name = "check" size = { 14 } />
4753- </ span >
4754- ) : null }
4755- </ div >
4756- ) ;
4757- }
0 commit comments