@xopcai/xopc 0.0.66 → 0.0.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agents-JiJR38n1.js → agents-CmhOU0fB.js} +2 -2
- package/dist/gateway/static/root/assets/{agents-JiJR38n1.js.map → agents-CmhOU0fB.js.map} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-aBDyr7Im.js → apps-page-CzS9A_6L.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-aBDyr7Im.js.map → apps-page-CzS9A_6L.js.map} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-DXxfgG4N.js → channels-settings-Bn0YSztA.js} +2 -2
- package/dist/gateway/static/root/assets/{channels-settings-DXxfgG4N.js.map → channels-settings-Bn0YSztA.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-dreaming-jobs-3--QJSP5.js → cron-dreaming-jobs-bAYsiHdF.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-dreaming-jobs-3--QJSP5.js.map → cron-dreaming-jobs-bAYsiHdF.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-CCn-JwBy.js → cron-page-CKqDtScu.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-page-CCn-JwBy.js.map → cron-page-CKqDtScu.js.map} +1 -1
- package/dist/gateway/static/root/assets/{dist-BS-cwfHQ.js → dist-CUMhnSuX.js} +2 -2
- package/dist/gateway/static/root/assets/{dist-BS-cwfHQ.js.map → dist-CUMhnSuX.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-M8JS4Jid.js → extension-debug-page-BDls5xp3.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-M8JS4Jid.js.map → extension-debug-page-BDls5xp3.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-C8gjVE_t.js → extension-page-BSfv53OO.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-C8gjVE_t.js.map → extension-page-BSfv53OO.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DeY2M2di.js → extension-settings-page-B0nkVsLi.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-DeY2M2di.js.map → extension-settings-page-B0nkVsLi.js.map} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DWmeyjyR.js → heartbeat-config-api-P5zdbIBw.js} +2 -2
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DWmeyjyR.js.map → heartbeat-config-api-P5zdbIBw.js.map} +1 -1
- package/dist/gateway/static/root/assets/{index-Cc57jhuG.js → index-DAglRwh4.js} +5 -5
- package/dist/gateway/static/root/assets/{index-Cc57jhuG.js.map → index-DAglRwh4.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-DHj3Cf9B.css +1 -0
- package/dist/gateway/static/root/assets/{logs-page-kIsSDMqb.js → logs-page-CfGDv4k7.js} +2 -2
- package/dist/gateway/static/root/assets/{logs-page-kIsSDMqb.js.map → logs-page-CfGDv4k7.js.map} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-Da9gjMh7.js → sessions-page-DoGE8N-O.js} +2 -2
- package/dist/gateway/static/root/assets/{sessions-page-Da9gjMh7.js.map → sessions-page-DoGE8N-O.js.map} +1 -1
- package/dist/gateway/static/root/assets/settings-page-C5VrwDoO.js +3 -0
- package/dist/gateway/static/root/assets/settings-page-C5VrwDoO.js.map +1 -0
- package/dist/gateway/static/root/assets/{skills-page-B_msZcLx.js → skills-page-ADUi69Fa.js} +2 -2
- package/dist/gateway/static/root/assets/{skills-page-B_msZcLx.js.map → skills-page-ADUi69Fa.js.map} +1 -1
- package/dist/gateway/static/root/assets/{use-image-provider-credentials-Bs8xl2E3.js → use-image-provider-credentials-C4x4dNv2.js} +2 -2
- package/dist/gateway/static/root/assets/{use-image-provider-credentials-Bs8xl2E3.js.map → use-image-provider-credentials-C4x4dNv2.js.map} +1 -1
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/package.js +1 -1
- package/dist/src/cli/commands/tunnel.js +69 -8
- package/dist/src/cli/commands/tunnel.js.map +1 -1
- package/dist/src/config/schema.d.ts +2 -0
- package/dist/src/config/schema.js +2 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +2 -5
- package/dist/src/gateway/hono/lib/config-payload.js +3 -5
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js +12 -10
- package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
- package/dist/src/tunnel/acme-client.d.ts +11 -0
- package/dist/src/tunnel/acme-client.js +54 -10
- package/dist/src/tunnel/acme-client.js.map +1 -1
- package/dist/src/tunnel/env.d.ts +14 -3
- package/dist/src/tunnel/env.js +34 -5
- package/dist/src/tunnel/env.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.d.ts +6 -1
- package/dist/src/tunnel/frpc-binary.js +66 -40
- package/dist/src/tunnel/frpc-binary.js.map +1 -1
- package/dist/src/tunnel/frpc-extract.d.ts +10 -0
- package/dist/src/tunnel/frpc-extract.js +129 -0
- package/dist/src/tunnel/frpc-extract.js.map +1 -0
- package/dist/src/tunnel/gateway-lifecycle.d.ts +3 -1
- package/dist/src/tunnel/gateway-lifecycle.js +6 -4
- package/dist/src/tunnel/gateway-lifecycle.js.map +1 -1
- package/dist/src/tunnel/index.d.ts +3 -1
- package/dist/src/tunnel/index.js +2 -2
- package/dist/src/tunnel/tls-server.js +5 -0
- package/dist/src/tunnel/tls-server.js.map +1 -1
- package/dist/src/tunnel/tunnel-config.js +11 -1
- package/dist/src/tunnel/tunnel-config.js.map +1 -1
- package/dist/src/tunnel/tunnel-e2e-config.d.ts +4 -1
- package/dist/src/tunnel/tunnel-e2e-config.js +10 -3
- package/dist/src/tunnel/tunnel-e2e-config.js.map +1 -1
- package/dist/src/tunnel/tunnel-service.d.ts +4 -0
- package/dist/src/tunnel/tunnel-service.js +66 -5
- package/dist/src/tunnel/tunnel-service.js.map +1 -1
- package/dist/src/tunnel/tunnel-types.d.ts +16 -0
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/index-B5gp15_q.css +0 -1
- package/dist/gateway/static/root/assets/settings-page-B0spIRVS.js +0 -3
- package/dist/gateway/static/root/assets/settings-page-B0spIRVS.js.map +0 -1
package/dist/gateway/static/root/assets/{skills-page-B_msZcLx.js.map → skills-page-ADUi69Fa.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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AmU,QACAzE,YACAxP,cACAC,iBACAiU,kBACAhU,UACAiU,aACA+F,eACA9F,kBACA7P,yBACAC,2BACAqL,eACAxP,iBACAyP,eACA1P,iBACA2P,aACAC,gBACAxG,cACAzE,iBACA0E,aACAzE,gBACA2J,qBACAhK,kBACA8I,aACAC,iBACAC,gBACAC,mBACAC,eACAC,kBACAC,kBACAC,qBACAC,wBACAC,2BACAC,4BACAC,+BACAC,iBACAC,eACAC,kBACAgG,aACAC,iBACA1C,cACAC,iBACAN,aACAC,WACAF,aACA9C,wBACAD,wBACAI,oBACA8C,oBACAC,uBACAP,gBACAE,qBACAD,uBACAO,uBACA4C,2BACAC,uBACAL,mBACAC,gBACA9F,iBACAnK,mBACAC,qBACAG,2BACAkQ,eACAC,gBAtEsBqM,GAASE,WAAW,aAsE1CvM,CACAlQ,iBACA3E,iBACA+E,mBACAkN,yBACApN,iBACAyL,mBACAD,qBACAH,mBACAC,oBACAC,eACAtL,eACA6E,aACAoF,mBACAF,0BACD,CC1yBH,SAAOwS,IAAA,KAAAvhB,UAAA,GACLkU,EAAWwE,IAAe,CAAC3Y,EACM,OADNC,EAAA,KAAAkU,EACMnU,EAAAC,EAAA,IAA1BD,GAAA,SAAC,GAAD,CAAoBmU,KAAM,EAAAlU,EAAA,GAAAkU,EAAAlU,EAAA,GAAAD,GAA1BA","names":["SkillsPageHeaderEnd","t0","$","loading","onReloadClick","searchQuery","setSearchQuery","mainTab","sk","setPendingFile","setInstallOpen","t1","reloadRuntime","t2","reloadDiskAria","t3","t4","t5","cn","t6","t7","t8","Symbol","for","t9","e","target","value","t10","marketplaceSearchPackages","searchPlaceholder","t11","t12","t13","t14","installCta","t15","SKILL_INITIAL_PALETTE","light","dark","hashSkillNameKey","name","h","i","length","Math","imul","charCodeAt","abs","skillInitialLetter","t","trim","m","match","toLocaleUpperCase","SkillCardIcon","className","initial","pair","SkillEnableSwitch","checked","onChange","skelBar","MarketplaceSkillCardSkeleton","SkillCatalogCardSkeleton","MAIN_TAB_SET","Set","SOURCE_FILTER_SET","MARKETPLACE_PROVIDER_PARAM","SKILL_LIST_SKELETON_KEYS","BUILTIN_SKILL_CATEGORY_ORDER","SkillsPageCatalogContent","p","catalog","filteredCatalog","builtinCategories","builtinCategoryFilter","setBuiltinCategoryFilter","categoryFilteredCatalog","categoryLabel","enabledOverride","onSkillToggle","sourceLabel","openSkillDetail","setConfirmOpen","setConfirmId","map","_temp","empty","noSearchResults","marketplaceCategoriesAria","interaction","focusRingPanel","marketplaceCategoryAll","cat","selected","row","directoryId","closest","e_0","key","preventDefault","_temp2","_temp3","enabled","next","managed","col","actions","delete","description","undefined","source","yes","hub","ref","updatedAt","hubRemote","kind","hubKindGit","hubKindArchive","slice","path","e_2","stopPropagation","e_1","k","SKILLHUB_PUBLIC_ORIGIN","CLAWHUB_PUBLIC_ORIGIN","skillHubPublicSkillPageUrl","canonicalSlug","id","encodeURIComponent","clawHubPublicSkillPageUrl","marketplacePublicSkillUrl","provider","slug","interpolate","template","params","replace","_","String","installSpecSummary","spec","parts","label","push","package","formula","module","url","join","normalizeCatalogEntry","r","disableModelInvocation","SkillsPageConfirmDialog","confirmOpen","confirmId","runDelete","open","deleteTitle","deleteMessage","cancel","deleteConfirm","MetaRow","children","SkillCatalogStructuredPreview","preview","meta","metadata","gate","toolConditions","hasToolGating","requiresTools","requiresToolsets","fallbackForTools","fallbackForToolsets","req","requires","hasRequires","bins","env","anyBins","T0","emoji","homepage","install","os","requiredEnvVarNames","detailEnvVarsLabel","detailHomepageLabel","detailInstallLabel","detailNotInjectedNote","detailPlatformsLabel","detailRequiresAnyBins","detailRequiresBins","detailRequiresEnv","detailRequiresLabel","detailSummaryHeading","detailToolGatingLabel","detailToolsFallbackList","detailToolsRequiresList","detailToolsetsFallbackList","detailToolsetsRequiresList","installs","filter","envNames","t16","t17","t18","t19","t20","t21","detailInstructionsHeading","bodyMarkdown","detailNoInstructionsBody","n","s","SKELETON_LINE_WIDTHS","width","SkillsPageDetailDialog","detailOpen","setDetailOpen","detailSource","setDetailSource","detailTitle","setDetailTitle","detailMarkdown","setDetailMarkdown","detailCatalogPreview","setDetailCatalogPreview","detailMarketplacePreview","setDetailMarketplacePreview","detailLoading","detailError","setDetailError","detailEnabled","usingSkillInChatName","installingMarketName","togglingSkillName","isSkillInstalledByName","onUseSkillInChat","onMarketInstall","detailCloseAria","detailModalBanner","detailModalBannerStore","detailModalDisable","detailModalEnable","marketplaceInstall","marketplaceReinstall","previewUseInChat","previewUseInChatBusy","uploading","useDetailProvider","ok","entry","SkillsPageInstallDialog","installOpen","pendingFile","dropActive","setDropActive","onModalDragOver","onModalDragLeave","onModalDrop","onFileInputChange","onInstallSubmit","installModalTitle","installClose","installModalDropHint","installModalReqTitle","installModalReq1","installModalReq2","t22","t23","t24","t25","installAction","t26","t27","t28","SkillsPageMarketplaceContent","mpCategories","mpCategoriesLoading","mpCategoriesError","mpPayload","mpLoading","mpError","marketCategoryId","setMarketCategoryId","marketBrowseProvider","marketPage","setMarketPage","openMarketplaceDetail","c","items","marketplaceEmpty","installed","busy","externalPageUrl","el","marketplaceOpenExternalAria","marketplaceOpenExternal","marketplaceAuthor","author","username","marketplaceDownloads","downloads","stars","marketplaceInstalled","latestVersion","marketplaceVersion","marketplaceSource","Boolean","marketplacePageStatus","page","totalPages","total","marketplacePagePrev","pg","max","marketplacePageNext","min","SkillsPageView","vm","hasToken","error","actionFeedback","setMainTab","setSourceFilter","builtinTabStats","userTabStats","marketSort","setMarketSort","setMarketBrowseProvider","registeredProviders","filterLabel","inSettingsShell","setPageHeader","usePageHeaderStore","clearPageHeader","skillsHeaderEnd","startExtra","main","end","useLayoutEffect","needToken","message","title","tagline","skillsNavAria","tabMarketplace","tabBuiltin","t29","tabUser","t30","t31","t32","t33","filterAll","filterExtra","filterGlobal","filterWorkspace","transition","t34","marketplaceBrowseSwitchAria","marketplaceSortDownloads","marketplaceSortNewest","displayName","t35","t36","t37","t38","t39","t40","t41","t42","t43","t44","s_0","fileToZipUpload","file","lower","toLowerCase","endsWith","JSZip","default","zip","arrayBuffer","blob","generateAsync","type","compression","base","File","Error","useSkillsPage","language","useLocaleStore","messages","skills","useGatewayStore","st","token","navigate","useNavigate","searchParams","setSearchParams","useSearchParams","urlMarketProvider","get","mprovRaw","setCatalog","setLoading","setError","setUploading","initialSearch","initialTabRaw","initialSourceRaw","initialTab","has","initialSourceFilter","setActionFeedback","sourceFilter","setTogglingSkillName","setEnabledOverride","setDetailLoading","setMpLoading","setMpError","setMpPayload","setInstallingMarketName","setUsingSkillInChatName","setMpCategories","setMpCategoriesError","setMpCategoriesLoading","marketplaceDetailProviderRef","prevMarketBrowseProviderRef","setRegisteredProviders","load","opts","silent","data","getSkills","loadFailed","useEffect","current","cancelled","getMarketplaceProviders","then","providers","prev","catch","getMarketplaceProvider","info","nextQ","nextTabRaw","nextSourceRaw","nextTab","nextSource","nextMcat","getMarketplaceSkills","q","pageSize","sort","category","payload","marketplaceLoadFailed","finally","getMarketplaceCategories","marketplaceCategoriesFailed","some","URLSearchParams","set","toString","showFeedback","durationMs","window","setTimeout","getSkillMarkdown","detailLoadFailed","packageId","listTitle","browse","pkg","getMarketplacePackageDetail","skillDocPreview","readme","marketplaceNoReadme","patchSkillEnabled","rest","skillToggleFailed","reloadSkills","reloadFailed","rows","detailFromCatalog","find","includes","seen","ordered","add","a","b","ai","indexOf","bi","localeCompare","runUpload","upload","invalidFile","uploadSkillZip","overwrite","installSuccess","err","uploadFailed","files","dataTransfer","types","dropEffect","root","currentTarget","to","relatedTarget","contains","builtin","workspace","global","extra","deleteSkill","deleteFailed","needsMarketInstall","mp","installMarketplaceSkill","confirm","marketplaceReinstallConfirm","pathname","useLocation","startsWith","SkillsPage"],"ignoreList":[],"sources":["../../../../../web/src/features/skills/skills-page-header-end.tsx","../../../../../web/src/features/skills/skill-card-icon.tsx","../../../../../web/src/features/skills/skills-page-primitives.tsx","../../../../../web/src/features/skills/skills-page.constants.ts","../../../../../web/src/features/skills/skills-page-catalog-content.tsx","../../../../../web/src/features/skills/skills-page.utils.ts","../../../../../web/src/features/skills/skills-page-confirm-dialog.tsx","../../../../../web/src/features/skills/skill-catalog-structured-preview.tsx","../../../../../web/src/features/skills/skills-page-detail-dialog.tsx","../../../../../web/src/features/skills/skills-page-install-dialog.tsx","../../../../../web/src/features/skills/skills-page-marketplace-content.tsx","../../../../../web/src/features/skills/skills-page-view.tsx","../../../../../web/src/features/skills/skill-upload-zip.ts","../../../../../web/src/features/skills/use-skills-page.ts","../../../../../web/src/features/skills/skills-page.tsx"],"sourcesContent":["import { Plus, RefreshCw, Search } from 'lucide-react';\nimport { memo } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport type { MainTab } from '@/features/skills/skills-page.constants';\nimport type { SkillsCopy } from '@/features/skills/skill-catalog-structured-preview';\n\nexport const SkillsPageHeaderEnd = memo(function SkillsPageHeaderEnd({\n loading,\n onReloadClick,\n searchQuery,\n setSearchQuery,\n mainTab,\n sk,\n setPendingFile,\n setInstallOpen,\n}: {\n loading: boolean;\n onReloadClick: () => void;\n searchQuery: string;\n setSearchQuery: (v: string) => void;\n mainTab: MainTab;\n sk: SkillsCopy;\n setPendingFile: (f: File | null) => void;\n setInstallOpen: (v: boolean) => void;\n}) {\n return (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"size-9 shrink-0 p-0\"\n disabled={loading}\n title={sk.reloadRuntime}\n aria-label={sk.reloadDiskAria}\n onClick={() => void onReloadClick()}\n >\n <RefreshCw className={cn('size-4', loading && 'animate-spin')} strokeWidth={1.75} />\n </Button>\n <label className=\"relative flex min-h-9 min-w-0 max-w-sm cursor-text items-center rounded-pill border border-edge bg-surface-base py-1.5 pl-9 pr-3 shadow-surface dark:bg-surface-hover/40 sm:max-w-md\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-disabled\"\n strokeWidth={1.75}\n aria-hidden\n />\n <input\n type=\"search\"\n enterKeyHint=\"search\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder={mainTab === 'marketplace' ? sk.marketplaceSearchPackages : sk.searchPlaceholder}\n autoComplete=\"off\"\n spellCheck={false}\n className=\"min-w-0 flex-1 appearance-none border-0 bg-transparent py-0.5 text-sm leading-normal text-fg caret-current placeholder:text-fg-disabled focus:border-0 focus:shadow-none focus:outline-none focus:ring-0 focus-visible:outline-none\"\n />\n </label>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"shrink-0 gap-2\"\n onClick={() => {\n setPendingFile(null);\n setInstallOpen(true);\n }}\n >\n <Plus className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {sk.installCta}\n </Button>\n </div>\n );\n});\n","import { cn } from '@/lib/cn';\n\n/** Pastel tile + saturated letter (light / dark pairs), stable per skill name hash. */\nconst SKILL_INITIAL_PALETTE: { light: string; dark: string }[] = [\n { light: 'bg-sky-100 text-sky-800', dark: 'dark:bg-sky-950/55 dark:text-sky-200' },\n { light: 'bg-violet-100 text-violet-800', dark: 'dark:bg-violet-950/55 dark:text-violet-200' },\n { light: 'bg-emerald-100 text-emerald-800', dark: 'dark:bg-emerald-950/55 dark:text-emerald-200' },\n { light: 'bg-orange-100 text-orange-800', dark: 'dark:bg-orange-950/55 dark:text-orange-200' },\n { light: 'bg-rose-100 text-rose-800', dark: 'dark:bg-rose-950/55 dark:text-rose-200' },\n { light: 'bg-amber-100 text-amber-900', dark: 'dark:bg-amber-950/55 dark:text-amber-200' },\n { light: 'bg-cyan-100 text-cyan-800', dark: 'dark:bg-cyan-950/55 dark:text-cyan-200' },\n { light: 'bg-indigo-100 text-indigo-800', dark: 'dark:bg-indigo-950/55 dark:text-indigo-200' },\n { light: 'bg-fuchsia-100 text-fuchsia-800', dark: 'dark:bg-fuchsia-950/55 dark:text-fuchsia-200' },\n { light: 'bg-teal-100 text-teal-800', dark: 'dark:bg-teal-950/55 dark:text-teal-200' },\n];\n\nfunction hashSkillNameKey(name: string): number {\n let h = 0;\n for (let i = 0; i < name.length; i += 1) {\n h = (Math.imul(31, h) + name.charCodeAt(i)) | 0;\n }\n return Math.abs(h);\n}\n\n/** First letter or digit (Unicode letters included); skips leading punctuation in slugs. */\nfunction skillInitialLetter(name: string): string {\n const t = name.trim();\n if (!t) return '?';\n const m = t.match(/[\\p{L}\\p{N}]/u);\n if (m) {\n const ch = m[0];\n return ch.toLocaleUpperCase('en-US');\n }\n return t[0];\n}\n\nexport function SkillCardIcon({ name, className }: { name: string; className?: string }) {\n const initial = skillInitialLetter(name);\n const pair = SKILL_INITIAL_PALETTE[hashSkillNameKey(name) % SKILL_INITIAL_PALETTE.length];\n return (\n <div\n className={cn(\n 'flex size-11 shrink-0 items-center justify-center rounded-xl font-semibold tracking-tight shadow-surface',\n 'text-[1.05rem] ring-1 ring-inset ring-black/[0.06] dark:ring-white/[0.1]',\n 'transition-[transform,box-shadow] duration-200 ease-out group-hover:ring-black/[0.1] dark:group-hover:ring-white/[0.14]',\n 'group-hover:-translate-y-px',\n pair.light,\n pair.dark,\n className,\n )}\n aria-hidden\n >\n {initial}\n </div>\n );\n}\n","import { cn } from '@/lib/cn';\n\nexport function SkillEnableSwitch({\n checked,\n onChange,\n}: {\n checked: boolean;\n onChange: (next: boolean) => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n className={cn(\n 'relative h-6 w-10 shrink-0 overflow-hidden rounded-full border border-edge p-0.5',\n 'transition-[border-color,background-color] duration-200 ease-out',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base',\n 'active:scale-[0.97] motion-reduce:transition-none motion-reduce:active:scale-100',\n checked ? 'bg-accent' : 'bg-surface-hover',\n )}\n onClick={() => onChange(!checked)}\n >\n <span\n className={cn(\n 'pointer-events-none absolute left-0.5 top-1/2 block size-4 -translate-y-1/2 rounded-full bg-surface-panel shadow-surface ring-1 ring-edge/40 dark:ring-edge/55',\n 'transition-transform duration-200 ease-out motion-reduce:transition-none',\n checked ? 'translate-x-5' : 'translate-x-0',\n )}\n aria-hidden\n />\n </button>\n );\n}\n\nconst skelBar =\n 'animate-pulse motion-reduce:animate-none rounded-md bg-surface-hover dark:bg-surface-active/50';\n\n/** Matches marketplace skill cards (title row actions + meta). */\nexport function MarketplaceSkillCardSkeleton() {\n return (\n <div\n className=\"flex h-full min-h-[10.5rem] flex-col rounded-xl border border-edge-subtle bg-surface-base p-4 dark:border-edge-subtle\"\n aria-hidden\n >\n <div className=\"flex min-h-0 flex-1 items-start gap-3\">\n <div className={cn('size-11 shrink-0 rounded-xl', skelBar)} />\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className={cn('h-4 min-w-0 flex-1', skelBar)} />\n <div className=\"flex shrink-0 gap-1\">\n <div className={cn('size-8 shrink-0 rounded-lg', skelBar)} />\n <div className={cn('h-8 w-[4.5rem] shrink-0 rounded-lg', skelBar)} />\n </div>\n </div>\n <div className={cn('h-3 w-full', skelBar)} />\n <div className={cn('h-3 w-[92%]', skelBar)} />\n <div className=\"mt-auto space-y-1 pt-0.5\">\n <div className={cn('h-3 w-full', skelBar)} />\n <div className={cn('h-2.5 w-4/5', skelBar)} />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/** Matches built-in / user skill cards (title-row actions, same as marketplace). */\nexport function SkillCatalogCardSkeleton() {\n return <MarketplaceSkillCardSkeleton />;\n}\n","export type MainTab = 'builtin' | 'user' | 'marketplace';\nexport type SourceFilter = 'all' | 'global' | 'workspace' | 'extra';\n\nexport const MAIN_TAB_SET = new Set<MainTab>(['builtin', 'user', 'marketplace']);\nexport const SOURCE_FILTER_SET = new Set<SourceFilter>(['all', 'global', 'workspace', 'extra']);\n\n/** Hash query: which skills marketplace to browse (`store` | `skillhub`). */\nexport const MARKETPLACE_PROVIDER_PARAM = 'mprov';\n\nexport const SKILL_LIST_SKELETON_COUNT = 6;\n\n/** Stable string keys for skeleton placeholders so we don't use array index as key. */\nexport const SKILL_LIST_SKELETON_KEYS = ['s0', 's1', 's2', 's3', 's4', 's5'] as const;\n\n/** Category display order for consistent pill ordering on the built-in tab. */\nexport const BUILTIN_SKILL_CATEGORY_ORDER = [\n 'business',\n 'creative',\n 'documents',\n 'engineering',\n 'tools',\n] as const;\n","import * as DropdownMenu from '@radix-ui/react-dropdown-menu';\nimport { MoreVertical, Trash2 } from 'lucide-react';\n\nimport { SkillCardIcon } from '@/features/skills/skill-card-icon';\nimport { SkillCatalogCardSkeleton, SkillEnableSwitch } from '@/features/skills/skills-page-primitives';\nimport { SKILL_LIST_SKELETON_KEYS } from '@/features/skills/skills-page.constants';\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\n\ntype Props = Pick<\n SkillsPageVm,\n | 'sk'\n | 'mainTab'\n | 'loading'\n | 'catalog'\n | 'filteredCatalog'\n | 'builtinCategories'\n | 'builtinCategoryFilter'\n | 'setBuiltinCategoryFilter'\n | 'categoryFilteredCatalog'\n | 'categoryLabel'\n | 'enabledOverride'\n | 'onSkillToggle'\n | 'sourceLabel'\n | 'openSkillDetail'\n | 'setConfirmOpen'\n | 'setConfirmId'\n>;\n\nexport function SkillsPageCatalogContent(p: Props) {\n const {\n sk,\n mainTab,\n loading,\n catalog,\n filteredCatalog,\n builtinCategories,\n builtinCategoryFilter,\n setBuiltinCategoryFilter,\n categoryFilteredCatalog,\n categoryLabel,\n enabledOverride,\n onSkillToggle,\n sourceLabel,\n openSkillDetail,\n setConfirmOpen,\n setConfirmId,\n } = p;\n\n if (loading) {\n return (\n <div\n className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\"\n aria-busy=\"true\"\n aria-label={sk.loading}\n >\n {SKILL_LIST_SKELETON_KEYS.map((k) => (\n <SkillCatalogCardSkeleton key={k} />\n ))}\n </div>\n );\n }\n if (catalog.length === 0) {\n return (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.empty}\n </div>\n );\n }\n if (filteredCatalog.length === 0) {\n return (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.noSearchResults}\n </div>\n );\n }\n\n return (\n <>\n {builtinCategories.length > 1 ? (\n <div\n role=\"tablist\"\n aria-label={sk.marketplaceCategoriesAria}\n className=\"-mx-1 flex gap-2 overflow-x-auto px-1 pb-1 pt-0.5 [scrollbar-width:thin]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={builtinCategoryFilter === ''}\n className={cn(\n 'shrink-0 rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n builtinCategoryFilter === ''\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n onClick={() => setBuiltinCategoryFilter('')}\n >\n {sk.marketplaceCategoryAll}\n </button>\n {builtinCategories.map((cat) => {\n const selected = builtinCategoryFilter === cat;\n return (\n <button\n key={cat}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n className={cn(\n 'max-w-[14rem] shrink-0 truncate rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n selected\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n title={categoryLabel(cat)}\n onClick={() => setBuiltinCategoryFilter(cat)}\n >\n {categoryLabel(cat)}\n </button>\n );\n })}\n </div>\n ) : null}\n {categoryFilteredCatalog.length === 0 ? (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.noSearchResults}\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {categoryFilteredCatalog.map((row) => (\n <article\n key={`${row.directoryId}-${row.path}`}\n className={cn(\n 'group flex h-full flex-col rounded-xl border border-edge-subtle bg-surface-base p-4',\n 'transition-colors hover:border-accent/40 hover:bg-surface-hover',\n 'dark:border-edge-subtle',\n )}\n >\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'flex min-h-0 flex-1 cursor-pointer flex-col rounded-lg text-left outline-none',\n interaction.focusRingPanel,\n )}\n aria-labelledby={`catalog-skill-title-${row.directoryId}`}\n onClick={(e) => {\n const el = e.target as HTMLElement;\n if (el.closest('button')) return;\n void openSkillDetail(row);\n }}\n onKeyDown={(e) => {\n const el = e.target as HTMLElement;\n if (el.closest('button')) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n void openSkillDetail(row);\n }\n }}\n >\n <div className=\"flex items-start gap-3\">\n <SkillCardIcon name={row.name} />\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <h3\n id={`catalog-skill-title-${row.directoryId}`}\n className=\"min-w-0 flex-1 truncate text-[15px] font-semibold leading-snug tracking-tight text-fg\"\n >\n {row.name}\n </h3>\n <div\n role=\"group\"\n className=\"flex shrink-0 items-center gap-1\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <div className=\"inline-flex shrink-0\">\n <SkillEnableSwitch\n checked={enabledOverride[row.name] ?? row.enabled}\n onChange={(next) => void onSkillToggle(row.name, next)}\n />\n </div>\n {row.managed ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex size-8 shrink-0 items-center justify-center rounded-lg border border-edge bg-surface-panel text-fg-muted',\n 'hover:bg-surface-hover hover:text-fg dark:border-edge',\n interaction.focusRingPanel,\n )}\n aria-label={sk.col.actions}\n >\n <MoreVertical className=\"size-3.5\" strokeWidth={2} aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 min-w-[8rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge\"\n sideOffset={4}\n align=\"end\"\n >\n <DropdownMenu.Item\n className={cn(\n 'flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2 text-sm text-red-600 outline-none',\n 'hover:bg-red-50 data-[highlighted]:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40',\n )}\n onSelect={() => {\n setConfirmId(row.directoryId);\n setConfirmOpen(true);\n }}\n >\n <Trash2 className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {sk.delete}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n ) : null}\n </div>\n </div>\n <p\n className=\"line-clamp-2 text-sm leading-relaxed text-fg-muted\"\n title={row.description ? row.description : undefined}\n >\n {row.description || '—'}\n </p>\n {mainTab !== 'builtin' || row.managed ? (\n <div className=\"flex flex-wrap gap-1.5 text-[11px] text-fg-subtle\">\n {mainTab !== 'builtin' ? (\n <span className=\"rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50\">\n {sourceLabel(row.source)}\n </span>\n ) : null}\n {row.managed ? (\n <span className=\"rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50\">\n {sk.col.managed}: {sk.yes}\n </span>\n ) : null}\n {row.hub ? (\n <span\n className=\"max-w-full break-all rounded-md bg-surface-hover/60 px-2 py-0.5 font-mono text-[10px] leading-snug dark:bg-surface-active/50 line-clamp-2\"\n title={`${row.hub.source}${row.hub.ref ? `\\nref: ${row.hub.ref}` : ''}\\nupdated: ${row.hub.updatedAt}`}\n >\n {sk.hubRemote} ·{' '}\n {row.hub.kind === 'git' ? sk.hubKindGit : sk.hubKindArchive} ·{' '}\n {row.hub.source.length > 48\n ? `${row.hub.source.slice(0, 48)}…`\n : row.hub.source}\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n </article>\n ))}\n </div>\n )}\n </>\n );\n}\n","import type { SkillCatalogEntry, SkillInstallSpecApi } from '@/features/skills/skill.types';\n\nconst SKILLHUB_PUBLIC_ORIGIN = 'https://skillhub.cn';\nconst CLAWHUB_PUBLIC_ORIGIN = 'https://clawhub.ai';\n\n/**\n * Public SkillHub web URL for a marketplace row `id` (canonical slug, e.g. `self-improving-agent` or `team--skill`).\n * Site shape: `https://skillhub.cn/skills/<slug>`.\n */\nexport function skillHubPublicSkillPageUrl(canonicalSlug: string): string | null {\n const id = canonicalSlug.trim();\n if (!id) return null;\n return `${SKILLHUB_PUBLIC_ORIGIN}/skills/${encodeURIComponent(id)}`;\n}\n\n/**\n * Public ClawHub web URL for a marketplace skill slug.\n * Site shape: `https://clawhub.ai/<owner>/<slug>` — but since we don't have owner in list items,\n * we use the direct slug route which ClawHub resolves.\n */\nexport function clawHubPublicSkillPageUrl(canonicalSlug: string): string | null {\n const id = canonicalSlug.trim();\n if (!id) return null;\n return `${CLAWHUB_PUBLIC_ORIGIN}/${encodeURIComponent(id)}`;\n}\n\n/** Get the public web URL for a skill row based on the active marketplace provider. */\nexport function marketplacePublicSkillUrl(\n provider: string | null,\n slug: string,\n): string | null {\n if (provider === 'skillhub') return skillHubPublicSkillPageUrl(slug);\n if (provider === 'clawhub') return clawHubPublicSkillPageUrl(slug);\n return null;\n}\n\nexport function interpolate(template: string, params: Record<string, string | number>): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => String(params[key] ?? ''));\n}\n\nexport function installSpecSummary(spec: SkillInstallSpecApi): string {\n const parts = [spec.kind];\n if (spec.label?.trim()) parts.push(spec.label.trim());\n if (spec.package?.trim()) parts.push(spec.package.trim());\n if (spec.formula?.trim()) parts.push(spec.formula.trim());\n if (spec.module?.trim()) parts.push(spec.module.trim());\n if (spec.url?.trim()) parts.push(spec.url.trim());\n return parts.join(' · ');\n}\n\nexport function normalizeCatalogEntry(r: SkillCatalogEntry): SkillCatalogEntry {\n return {\n ...r,\n enabled: r.enabled ?? true,\n disableModelInvocation: r.disableModelInvocation ?? false,\n };\n}\n","import * as Dialog from '@radix-ui/react-dialog';\n\nimport { Button } from '@/components/ui/button';\nimport { interpolate } from '@/features/skills/skills-page.utils';\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\n\ntype Props = Pick<\n SkillsPageVm,\n 'sk' | 'confirmOpen' | 'setConfirmOpen' | 'confirmId' | 'setConfirmId' | 'runDelete'\n>;\n\nexport function SkillsPageConfirmDialog({\n sk,\n confirmOpen,\n setConfirmOpen,\n confirmId,\n setConfirmId,\n runDelete,\n}: Props) {\n return (\n <Dialog.Root\n open={confirmOpen}\n onOpenChange={(open) => {\n setConfirmOpen(open);\n if (!open) setConfirmId(null);\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim\" />\n <Dialog.Content className=\"xopc-dialog-content fixed left-1/2 top-1/2 z-[60] w-[min(100%-2rem,24rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge\">\n <Dialog.Title className=\"text-base font-semibold text-fg\">{sk.deleteTitle}</Dialog.Title>\n <p className=\"mt-2 text-sm text-fg-muted\">\n {confirmId ? interpolate(sk.deleteMessage, { id: confirmId }) : ''}\n </p>\n <div className=\"mt-4 flex justify-end gap-2\">\n <Button type=\"button\" variant=\"secondary\" onClick={() => setConfirmOpen(false)}>\n {sk.cancel}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"bg-red-600 hover:bg-red-700\"\n onClick={() => void runDelete()}\n >\n {sk.deleteConfirm}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import { type ReactNode } from 'react';\n\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport { cn } from '@/lib/cn';\nimport type { SkillMarkdownPreviewPayload } from '@/features/skills/skill.types';\nimport { installSpecSummary } from '@/features/skills/skills-page.utils';\nimport type { MessageBundle } from '@/i18n/messages';\n\nexport type SkillsCopy = MessageBundle['skills'];\n\nfunction MetaRow({ label, children }: { label: string; children: ReactNode }) {\n if (children === null || children === undefined || children === false) return null;\n return (\n <div className=\"mt-3 border-t border-edge-subtle pt-3 dark:border-edge/60\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-fg-muted\">{label}</div>\n <div className=\"mt-1.5 min-w-0 text-sm text-fg\">{children}</div>\n </div>\n );\n}\n\nexport function SkillCatalogStructuredPreview({\n preview,\n sk,\n}: {\n preview: SkillMarkdownPreviewPayload;\n sk: SkillsCopy;\n}) {\n const meta = preview.metadata;\n const gate = preview.toolConditions;\n const hasToolGating =\n !!gate &&\n (gate.requiresTools.length > 0 ||\n gate.requiresToolsets.length > 0 ||\n gate.fallbackForTools.length > 0 ||\n gate.fallbackForToolsets.length > 0);\n const req = meta.requires;\n const hasRequires =\n req &&\n ((req.bins?.length ?? 0) > 0 || (req.env?.length ?? 0) > 0 || (req.anyBins?.length ?? 0) > 0);\n const installs = meta.install?.filter((s) => s && typeof s.kind === 'string') ?? [];\n const envNames = preview.requiredEnvVarNames?.filter((n) => n.trim()) ?? [];\n\n return (\n <div className=\"space-y-6\">\n <section aria-labelledby=\"skill-detail-summary-heading\">\n <h3\n id=\"skill-detail-summary-heading\"\n className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-fg-muted\"\n >\n {sk.detailSummaryHeading}\n </h3>\n <div className=\"rounded-xl border border-edge bg-surface-base px-4 py-3 dark:bg-surface-hover/25\">\n {meta.emoji?.trim() ? (\n <p className=\"text-2xl leading-none\" aria-hidden>\n {meta.emoji.trim()}\n </p>\n ) : null}\n <p className={cn('text-sm leading-relaxed text-fg', meta.emoji?.trim() ? 'mt-2' : '')}>\n {preview.description}\n </p>\n {preview.disableModelInvocation ? (\n <p className=\"mt-3 rounded-lg border border-amber-200/80 bg-amber-50/90 px-3 py-2 text-xs leading-snug text-amber-950 dark:border-amber-900/50 dark:bg-amber-950/40 dark:text-amber-100\">\n {sk.detailNotInjectedNote}\n </p>\n ) : null}\n <MetaRow label={sk.detailHomepageLabel}>\n {meta.homepage?.trim() ? (\n <a\n href={meta.homepage.trim()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"break-all text-accent underline-offset-2 hover:underline\"\n >\n {meta.homepage.trim()}\n </a>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailPlatformsLabel}>\n {meta.os && meta.os.length > 0 ? (\n <span className=\"font-mono text-xs text-fg-muted\">{meta.os.join(', ')}</span>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailRequiresLabel}>\n {hasRequires && req ? (\n <ul className=\"list-inside list-disc space-y-1 text-sm text-fg-muted\">\n {req.bins && req.bins.length > 0 ? (\n <li>\n <span className=\"text-fg\">{sk.detailRequiresBins}: </span>\n {req.bins.join(', ')}\n </li>\n ) : null}\n {req.env && req.env.length > 0 ? (\n <li>\n <span className=\"text-fg\">{sk.detailRequiresEnv}: </span>\n <span className=\"font-mono text-xs\">{req.env.join(', ')}</span>\n </li>\n ) : null}\n {req.anyBins && req.anyBins.length > 0 ? (\n <li>\n <span className=\"text-fg\">{sk.detailRequiresAnyBins}: </span>\n {req.anyBins.join(', ')}\n </li>\n ) : null}\n </ul>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailInstallLabel}>\n {installs.length > 0 ? (\n <ul className=\"list-inside list-decimal space-y-1.5 text-sm text-fg-muted\">\n {installs.map((spec, i) => (\n <li key={spec.id || `${spec.kind}-${i}`} className=\"[overflow-wrap:anywhere]\">\n <span className=\"text-fg\">{installSpecSummary(spec)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailToolGatingLabel}>\n {hasToolGating && gate ? (\n <ul className=\"mt-1 space-y-2 text-sm text-fg-muted\">\n {gate.requiresTools.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsRequiresList}: </span>\n {gate.requiresTools.join(', ')}\n </li>\n ) : null}\n {gate.requiresToolsets.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsetsRequiresList}: </span>\n {gate.requiresToolsets.join(', ')}\n </li>\n ) : null}\n {gate.fallbackForTools.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsFallbackList}: </span>\n {gate.fallbackForTools.join(', ')}\n </li>\n ) : null}\n {gate.fallbackForToolsets.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsetsFallbackList}: </span>\n {gate.fallbackForToolsets.join(', ')}\n </li>\n ) : null}\n </ul>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailEnvVarsLabel}>\n {envNames.length > 0 ? (\n <span className=\"font-mono text-xs text-fg-muted\">{envNames.join(', ')}</span>\n ) : null}\n </MetaRow>\n </div>\n </section>\n <section aria-labelledby=\"skill-detail-instructions-heading\">\n <h3\n id=\"skill-detail-instructions-heading\"\n className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-fg-muted\"\n >\n {sk.detailInstructionsHeading}\n </h3>\n {preview.bodyMarkdown.trim() ? (\n <div className=\"markdown-content min-w-0 break-words\">\n <MarkdownView content={preview.bodyMarkdown} />\n </div>\n ) : (\n <p className=\"text-sm italic text-fg-muted\">{sk.detailNoInstructionsBody}</p>\n )}\n </section>\n </div>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { Info, X } from 'lucide-react';\n\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport { Button } from '@/components/ui/button';\nimport { SkillCardIcon } from '@/features/skills/skill-card-icon';\nimport { SkillCatalogStructuredPreview } from '@/features/skills/skill-catalog-structured-preview';\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\n\nconst SKELETON_LINE_WIDTHS = [\n { id: 's0', width: 'w-[92%]' },\n { id: 's1', width: 'w-full' },\n { id: 's2', width: 'w-4/5' },\n { id: 's3', width: 'w-[92%]' },\n { id: 's4', width: 'w-full' },\n { id: 's5', width: 'w-4/5' },\n { id: 's6', width: 'w-[92%]' },\n { id: 's7', width: 'w-full' },\n { id: 's8', width: 'w-4/5' },\n { id: 's9', width: 'w-[92%]' },\n] as const;\n\ntype Props = Pick<\n SkillsPageVm,\n | 'sk'\n | 'detailOpen'\n | 'setDetailOpen'\n | 'detailSource'\n | 'setDetailSource'\n | 'detailTitle'\n | 'setDetailTitle'\n | 'detailMarkdown'\n | 'setDetailMarkdown'\n | 'detailCatalogPreview'\n | 'setDetailCatalogPreview'\n | 'detailMarketplacePreview'\n | 'setDetailMarketplacePreview'\n | 'detailLoading'\n | 'detailError'\n | 'setDetailError'\n | 'detailEnabled'\n | 'usingSkillInChatName'\n | 'installingMarketName'\n | 'togglingSkillName'\n | 'isSkillInstalledByName'\n | 'onUseSkillInChat'\n | 'onMarketInstall'\n | 'onSkillToggle'\n>;\n\nexport function SkillsPageDetailDialog(p: Props) {\n const {\n sk,\n detailOpen,\n setDetailOpen,\n detailSource,\n setDetailSource,\n detailTitle,\n setDetailTitle,\n detailMarkdown,\n setDetailMarkdown,\n detailCatalogPreview,\n setDetailCatalogPreview,\n detailMarketplacePreview,\n setDetailMarketplacePreview,\n detailLoading,\n detailError,\n setDetailError,\n detailEnabled,\n usingSkillInChatName,\n installingMarketName,\n togglingSkillName,\n isSkillInstalledByName,\n onUseSkillInChat,\n onMarketInstall,\n onSkillToggle,\n } = p;\n\n return (\n <Dialog.Root\n open={detailOpen}\n onOpenChange={(open) => {\n setDetailOpen(open);\n if (!open) {\n setDetailSource('catalog');\n setDetailMarkdown('');\n setDetailCatalogPreview(null);\n setDetailMarketplacePreview(null);\n setDetailError(null);\n setDetailTitle('');\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim\" />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 z-[60] flex h-[min(88vh,44rem)] max-h-[min(92vh,56rem)] w-[min(100%-2rem,min(92vw,56rem))]',\n '-translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-2xl border border-edge bg-surface-panel shadow-float dark:border-edge',\n )}\n >\n <div className=\"group flex min-h-[3.25rem] shrink-0 items-center gap-3 border-b border-edge px-4 py-3\">\n <SkillCardIcon name={detailTitle || '?'} />\n <Dialog.Title className=\"min-w-0 flex-1 truncate text-base font-semibold text-fg\">\n {detailTitle || '—'}\n </Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className={cn(\n 'rounded-lg p-1.5 text-fg-muted hover:bg-surface-hover hover:text-fg',\n interaction.focusRingPanel,\n )}\n aria-label={sk.detailCloseAria}\n >\n <X className=\"size-5\" strokeWidth={1.75} aria-hidden />\n </button>\n </Dialog.Close>\n </div>\n <div className=\"flex min-h-[3.25rem] shrink-0 items-start gap-2 border-b border-blue-200/80 bg-blue-50/95 px-4 py-2.5 text-sm text-fg dark:border-blue-900/50 dark:bg-blue-950/45\">\n <Info className=\"mt-0.5 size-4 shrink-0 text-blue-600 dark:text-blue-400\" strokeWidth={1.75} aria-hidden />\n <p className=\"min-w-0 leading-relaxed\">\n {detailSource === 'store' && detailMarketplacePreview\n ? sk.detailModalBanner\n : detailSource === 'store'\n ? sk.detailModalBannerStore\n : sk.detailModalBanner}\n </p>\n </div>\n <div className=\"min-h-0 min-w-0 flex-1 overflow-auto p-4\">\n {detailLoading ? (\n <div className=\"flex h-full min-h-[14rem] flex-col gap-2.5 py-1\" aria-busy=\"true\" aria-label={sk.loading}>\n {SKELETON_LINE_WIDTHS.map((entry) => (\n <div\n key={entry.id}\n className={cn(\n 'h-4 animate-pulse rounded-md bg-surface-hover dark:bg-surface-active/50',\n entry.width,\n )}\n />\n ))}\n </div>\n ) : detailError ? (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{detailError}</p>\n ) : detailSource === 'catalog' && detailCatalogPreview ? (\n <SkillCatalogStructuredPreview preview={detailCatalogPreview} sk={sk} />\n ) : detailSource === 'store' && detailMarketplacePreview ? (\n <SkillCatalogStructuredPreview preview={detailMarketplacePreview} sk={sk} />\n ) : (\n <div className=\"markdown-content min-w-0 break-words\">\n <MarkdownView content={detailMarkdown} />\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 justify-end gap-2 border-t border-edge px-4 py-3\">\n {detailSource === 'store' ? (\n <>\n <Button type=\"button\" variant=\"ghost\" onClick={() => setDetailOpen(false)}>\n {sk.cancel}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={\n !detailTitle ||\n detailLoading ||\n usingSkillInChatName === detailTitle ||\n installingMarketName === detailTitle\n }\n onClick={() => void onUseSkillInChat()}\n >\n {usingSkillInChatName === detailTitle ? sk.previewUseInChatBusy : sk.previewUseInChat}\n </Button>\n <Button\n type=\"button\"\n variant={isSkillInstalledByName(detailTitle) ? 'secondary' : 'primary'}\n disabled={!detailTitle || installingMarketName === detailTitle}\n onClick={() => {\n if (!detailTitle) return;\n void onMarketInstall(detailTitle, { useDetailProvider: true });\n }}\n >\n {installingMarketName === detailTitle\n ? sk.uploading\n : isSkillInstalledByName(detailTitle)\n ? sk.marketplaceReinstall\n : sk.marketplaceInstall}\n </Button>\n </>\n ) : (\n <>\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={\n !detailTitle ||\n detailLoading ||\n usingSkillInChatName === detailTitle ||\n togglingSkillName === detailTitle\n }\n onClick={() => void onUseSkillInChat()}\n >\n {usingSkillInChatName === detailTitle ? sk.previewUseInChatBusy : sk.previewUseInChat}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n disabled={!detailTitle || togglingSkillName === detailTitle}\n onClick={async () => {\n if (!detailTitle) return;\n const ok = await onSkillToggle(detailTitle, !detailEnabled);\n if (ok) setDetailOpen(false);\n }}\n >\n {detailEnabled ? sk.detailModalDisable : sk.detailModalEnable}\n </Button>\n </>\n )}\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { FileArchive, X } from 'lucide-react';\n\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\n\ntype Props = Pick<\n SkillsPageVm,\n | 'sk'\n | 'installOpen'\n | 'setInstallOpen'\n | 'pendingFile'\n | 'setPendingFile'\n | 'dropActive'\n | 'setDropActive'\n | 'uploading'\n | 'onModalDragOver'\n | 'onModalDragLeave'\n | 'onModalDrop'\n | 'onFileInputChange'\n | 'onInstallSubmit'\n>;\n\nexport function SkillsPageInstallDialog(p: Props) {\n const {\n sk,\n installOpen,\n setInstallOpen,\n pendingFile,\n setPendingFile,\n dropActive,\n setDropActive,\n uploading,\n onModalDragOver,\n onModalDragLeave,\n onModalDrop,\n onFileInputChange,\n onInstallSubmit,\n } = p;\n\n return (\n <Dialog.Root\n open={installOpen}\n onOpenChange={(open) => {\n setInstallOpen(open);\n if (!open) {\n setPendingFile(null);\n setDropActive(false);\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim\" />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 z-[60] max-h-[min(100vh-2rem,44rem)] w-[min(100%-2rem,min(92vw,48rem))] -translate-x-1/2 -translate-y-1/2 overflow-y-auto',\n 'rounded-2xl border border-edge bg-surface-panel p-6 shadow-float dark:border-edge',\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <Dialog.Title className=\"text-base font-semibold text-fg\">{sk.installModalTitle}</Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className={cn(\n 'rounded-lg p-1.5 text-fg-muted hover:bg-surface-hover hover:text-fg',\n interaction.focusRingPanel,\n )}\n aria-label={sk.installClose}\n >\n <X className=\"size-5\" strokeWidth={1.75} aria-hidden />\n <span className=\"sr-only\">{sk.installClose}</span>\n </button>\n </Dialog.Close>\n </div>\n\n <label\n className={cn(\n 'mt-4 flex min-h-[11rem] cursor-pointer flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed px-6 py-12 text-center transition-colors',\n dropActive\n ? 'border-accent bg-accent-soft/60 dark:bg-blue-950/40'\n : 'border-edge bg-surface-base dark:bg-surface-hover/30',\n )}\n onDragLeave={onModalDragLeave}\n onDragOver={onModalDragOver}\n onDrop={onModalDrop}\n >\n <input\n type=\"file\"\n accept=\".zip,.md,application/zip,text/markdown\"\n className=\"sr-only\"\n aria-label={sk.installModalDropHint}\n disabled={uploading}\n onChange={onFileInputChange}\n />\n <FileArchive className=\"size-12 text-fg-subtle\" strokeWidth={1.25} aria-hidden />\n <span className=\"text-sm text-fg-muted\">{sk.installModalDropHint}</span>\n {pendingFile ? <span className=\"text-xs font-medium text-fg\">{pendingFile.name}</span> : null}\n </label>\n\n <div className=\"mt-5 space-y-2\">\n <p className=\"text-sm font-medium text-fg\">{sk.installModalReqTitle}</p>\n <ul className=\"list-inside list-disc space-y-1 text-sm text-fg-muted\">\n <li>{sk.installModalReq1}</li>\n <li>{sk.installModalReq2}</li>\n </ul>\n </div>\n\n <button\n type=\"button\"\n disabled={!pendingFile || uploading}\n className={cn(\n 'mt-6 flex w-full items-center justify-center rounded-xl py-3 text-sm font-semibold',\n 'transition-colors',\n !pendingFile || uploading\n ? 'cursor-not-allowed bg-surface-active text-fg-disabled'\n : 'bg-accent text-white hover:bg-accent-hover',\n interaction.focusRingPanel,\n )}\n onClick={() => void onInstallSubmit()}\n >\n {uploading ? sk.uploading : sk.installAction}\n </button>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import { ChevronLeft, ChevronRight, ExternalLink, Loader2, Star } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport { SkillCardIcon } from '@/features/skills/skill-card-icon';\nimport { MarketplaceSkillCardSkeleton } from '@/features/skills/skills-page-primitives';\nimport { SKILL_LIST_SKELETON_KEYS } from '@/features/skills/skills-page.constants';\nimport { interpolate, marketplacePublicSkillUrl } from '@/features/skills/skills-page.utils';\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\n\ntype Props = Pick<\n SkillsPageVm,\n | 'sk'\n | 'mpCategories'\n | 'mpCategoriesLoading'\n | 'mpCategoriesError'\n | 'mpPayload'\n | 'mpLoading'\n | 'mpError'\n | 'marketCategoryId'\n | 'setMarketCategoryId'\n | 'marketBrowseProvider'\n | 'marketPage'\n | 'setMarketPage'\n | 'installingMarketName'\n | 'isSkillInstalledByName'\n | 'onMarketInstall'\n | 'openMarketplaceDetail'\n>;\n\nexport function SkillsPageMarketplaceContent(p: Props) {\n const {\n sk,\n mpCategories,\n mpCategoriesLoading,\n mpCategoriesError,\n mpPayload,\n mpLoading,\n mpError,\n marketCategoryId,\n setMarketCategoryId,\n marketBrowseProvider,\n marketPage,\n setMarketPage,\n installingMarketName,\n isSkillInstalledByName,\n onMarketInstall,\n openMarketplaceDetail,\n } = p;\n\n return (\n <>\n <div\n className={cn(\n '-mx-1 flex min-h-[2.75rem] items-center gap-2 overflow-x-auto px-1 pb-1 pt-0.5 [scrollbar-width:thin]',\n !mpCategoriesLoading && mpCategories.length === 0 && 'min-h-0 pb-0 pt-0',\n )}\n role={mpCategories.length > 0 || mpCategoriesLoading ? 'tablist' : undefined}\n aria-label={mpCategories.length > 0 || mpCategoriesLoading ? sk.marketplaceCategoriesAria : undefined}\n >\n {mpCategories.length > 0 ? (\n <>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={marketCategoryId === ''}\n className={cn(\n 'shrink-0 rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n marketCategoryId === ''\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n onClick={() => setMarketCategoryId('')}\n >\n {sk.marketplaceCategoryAll}\n </button>\n {mpCategories.map((c) => {\n const selected = marketCategoryId === c.id;\n return (\n <button\n key={c.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n className={cn(\n 'max-w-[14rem] shrink-0 truncate rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n selected\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n title={c.label}\n onClick={() => setMarketCategoryId(c.id)}\n >\n {c.label}\n </button>\n );\n })}\n </>\n ) : mpCategoriesLoading ? (\n <div className=\"flex gap-2 px-1\" aria-hidden>\n {(['p0', 'p1', 'p2', 'p3', 'p4'] as const).map((k) => (\n <div\n key={k}\n className=\"h-8 w-[4.5rem] shrink-0 animate-pulse rounded-full bg-surface-hover motion-reduce:animate-none dark:bg-surface-active/50\"\n />\n ))}\n </div>\n ) : null}\n </div>\n {mpCategoriesError ? (\n <p className=\"text-xs text-red-600 dark:text-red-400\" role=\"alert\">\n {mpCategoriesError}\n </p>\n ) : null}\n {!mpPayload && !mpError ? (\n <div\n className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\"\n aria-busy=\"true\"\n aria-label={sk.loading}\n >\n {SKILL_LIST_SKELETON_KEYS.map((k) => (\n <MarketplaceSkillCardSkeleton key={k} />\n ))}\n </div>\n ) : mpError && !mpPayload ? (\n <div\n className=\"rounded-xl border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300\"\n role=\"alert\"\n >\n {mpError}\n </div>\n ) : mpPayload ? (\n <div className=\"relative\">\n {mpLoading ? (\n <div\n className=\"pointer-events-none absolute inset-0 z-[1] flex justify-center bg-surface-panel/40 pt-[min(28vh,7.5rem)] backdrop-blur-[1px] motion-reduce:backdrop-blur-none dark:bg-surface-base/35\"\n aria-busy=\"true\"\n aria-label={sk.loading}\n >\n <Loader2\n className=\"size-8 shrink-0 animate-spin text-accent motion-reduce:animate-none\"\n strokeWidth={2}\n aria-hidden\n />\n </div>\n ) : null}\n {mpPayload.items.length === 0 ? (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.marketplaceEmpty}\n </div>\n ) : (\n <div\n className={cn(\n 'grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3',\n mpLoading && 'pointer-events-none opacity-[0.52] motion-reduce:opacity-100',\n )}\n >\n {mpPayload.items.map((row) => {\n const installed = isSkillInstalledByName(row.id);\n const busy = installingMarketName === row.id;\n const externalPageUrl = marketplacePublicSkillUrl(marketBrowseProvider, row.id);\n return (\n <article\n key={row.id}\n className={cn(\n 'group flex h-full flex-col rounded-xl border border-edge-subtle bg-surface-base p-4',\n 'transition-colors hover:border-accent/40 hover:bg-surface-hover',\n 'dark:border-edge-subtle',\n )}\n >\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'flex min-h-0 flex-1 cursor-pointer flex-col rounded-lg text-left outline-none',\n interaction.focusRingPanel,\n )}\n aria-labelledby={`mp-skill-title-${row.id}`}\n onClick={(e) => {\n const el = e.target as HTMLElement;\n if (el.closest('a[href]') || el.closest('button')) return;\n void openMarketplaceDetail(row.id, row.name);\n }}\n onKeyDown={(e) => {\n const el = e.target as HTMLElement;\n if (el.closest('a[href]') || el.closest('button')) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n void openMarketplaceDetail(row.id, row.name);\n }\n }}\n >\n <div className=\"flex items-start gap-3\">\n <SkillCardIcon name={row.id} />\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <h3\n id={`mp-skill-title-${row.id}`}\n className=\"min-w-0 flex-1 truncate text-[15px] font-semibold leading-snug tracking-tight text-fg\"\n >\n {row.name}\n </h3>\n <div className=\"flex shrink-0 items-center gap-1\">\n {externalPageUrl ? (\n <a\n href={externalPageUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'inline-flex size-8 shrink-0 items-center justify-center rounded-lg border border-edge bg-surface-panel text-fg-muted',\n 'hover:bg-surface-hover hover:text-fg dark:border-edge',\n interaction.focusRingPanel,\n )}\n aria-label={sk.marketplaceOpenExternalAria}\n title={sk.marketplaceOpenExternal}\n >\n <ExternalLink className=\"size-3.5\" strokeWidth={2} aria-hidden />\n </a>\n ) : null}\n <div\n role=\"group\"\n className=\"inline-flex shrink-0\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"h-8 shrink-0 whitespace-nowrap px-2.5 text-xs font-medium\"\n disabled={busy || mpLoading}\n onClick={() => void onMarketInstall(row.id)}\n >\n {busy\n ? sk.uploading\n : installed\n ? sk.marketplaceReinstall\n : sk.marketplaceInstall}\n </Button>\n </div>\n </div>\n </div>\n <p\n className=\"line-clamp-2 text-sm leading-relaxed text-fg-muted\"\n title={row.description ? row.description : undefined}\n >\n {row.description || '—'}\n </p>\n <div className=\"mt-auto min-h-[2.625rem] space-y-1 text-[11px] leading-snug text-fg-muted\">\n <p\n className=\"line-clamp-1\"\n title={`${sk.marketplaceAuthor}: ${row.author.username} · ${sk.marketplaceDownloads}: ${row.downloads}${\n row.stars != null && row.stars > 0 ? ` · ★${row.stars}` : ''\n }${installed ? ` · ${sk.marketplaceInstalled}` : ''}`}\n >\n <span className=\"text-fg-subtle\">{sk.marketplaceAuthor}</span>{' '}\n <span className=\"text-fg\">{row.author.username}</span>\n <span className=\"text-fg-subtle\"> · </span>\n <span>\n {sk.marketplaceDownloads}: {row.downloads}\n </span>\n {row.stars != null && row.stars > 0 ? (\n <>\n <span className=\"text-fg-subtle\"> · </span>\n <span className=\"inline-flex items-center gap-0.5 text-fg-muted\">\n <Star\n className=\"size-3 shrink-0 text-amber-600 dark:text-amber-400\"\n strokeWidth={2}\n aria-hidden\n />\n {row.stars}\n </span>\n </>\n ) : null}\n {installed ? (\n <>\n <span className=\"text-fg-subtle\"> · </span>\n <span className=\"text-emerald-700 dark:text-emerald-400\">\n {sk.marketplaceInstalled}\n </span>\n </>\n ) : null}\n </p>\n <p\n className=\"line-clamp-1 min-h-[1.125rem] font-mono text-[10px] text-fg-subtle\"\n title={\n [\n row.latestVersion ? `${sk.marketplaceVersion}: ${row.latestVersion}` : '',\n row.sourceLabel ? `${sk.marketplaceSource}: ${row.sourceLabel}` : '',\n ]\n .filter(Boolean)\n .join(' · ') || undefined\n }\n >\n {row.latestVersion ? (\n <>\n {sk.marketplaceVersion}: {row.latestVersion}\n </>\n ) : null}\n {row.latestVersion && row.sourceLabel ? (\n <span className=\"text-fg-subtle\"> · </span>\n ) : null}\n {row.sourceLabel ? (\n <>\n {sk.marketplaceSource}: {row.sourceLabel}\n </>\n ) : null}\n </p>\n </div>\n </div>\n </div>\n </div>\n </article>\n );\n })}\n </div>\n )}\n {mpPayload.items.length > 0 ? (\n <div className=\"mt-3 flex flex-col items-center justify-between gap-3 sm:flex-row\">\n <p className=\"text-center text-xs text-fg-muted sm:text-left\">\n {interpolate(sk.marketplacePageStatus, {\n page: mpPayload.meta.page,\n totalPages: mpPayload.meta.totalPages,\n total: mpPayload.meta.total,\n })}\n </p>\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-9 gap-1 px-2\"\n disabled={mpLoading || marketPage <= 1}\n aria-label={sk.marketplacePagePrev}\n onClick={() => setMarketPage((pg) => Math.max(1, pg - 1))}\n >\n <ChevronLeft className=\"size-4\" strokeWidth={1.75} aria-hidden />\n <span className=\"sr-only sm:not-sr-only\">{sk.marketplacePagePrev}</span>\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-9 gap-1 px-2\"\n disabled={mpLoading || marketPage >= mpPayload.meta.totalPages}\n aria-label={sk.marketplacePageNext}\n onClick={() => setMarketPage((pg) => Math.min(mpPayload.meta.totalPages, pg + 1))}\n >\n <span className=\"sr-only sm:not-sr-only\">{sk.marketplacePageNext}</span>\n <ChevronRight className=\"size-4\" strokeWidth={1.75} aria-hidden />\n </Button>\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n </>\n );\n}\n","import * as DropdownMenu from '@radix-ui/react-dropdown-menu';\nimport { ChevronDown, Funnel } from 'lucide-react';\nimport { useLayoutEffect, useMemo } from 'react';\n\nimport { SkillsPageHeaderEnd } from '@/features/skills/skills-page-header-end';\nimport { SkillsPageCatalogContent } from '@/features/skills/skills-page-catalog-content';\nimport { SkillsPageConfirmDialog } from '@/features/skills/skills-page-confirm-dialog';\nimport { SkillsPageDetailDialog } from '@/features/skills/skills-page-detail-dialog';\nimport { SkillsPageInstallDialog } from '@/features/skills/skills-page-install-dialog';\nimport { SkillsPageMarketplaceContent } from '@/features/skills/skills-page-marketplace-content';\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { usePageHeaderStore } from '@/stores/page-header-store';\n\nexport function SkillsPageView({ vm }: { vm: SkillsPageVm }) {\n const {\n sk,\n hasToken,\n error,\n searchQuery,\n setSearchQuery,\n actionFeedback,\n mainTab,\n setMainTab,\n setSourceFilter,\n loading,\n onReloadClick,\n setPendingFile,\n setInstallOpen,\n builtinTabStats,\n userTabStats,\n marketSort,\n setMarketSort,\n marketBrowseProvider,\n setMarketBrowseProvider,\n registeredProviders,\n filterLabel,\n inSettingsShell,\n } = vm;\n\n const setPageHeader = usePageHeaderStore((s) => s.setPageHeader);\n const clearPageHeader = usePageHeaderStore((s) => s.clearPageHeader);\n\n const skillsHeaderEnd = useMemo(\n () => (\n <SkillsPageHeaderEnd\n loading={loading}\n onReloadClick={onReloadClick}\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n mainTab={mainTab}\n sk={sk}\n setPendingFile={setPendingFile}\n setInstallOpen={setInstallOpen}\n />\n ),\n [loading, onReloadClick, searchQuery, setSearchQuery, mainTab, sk, setPendingFile, setInstallOpen],\n );\n\n useLayoutEffect(() => {\n if (!hasToken || inSettingsShell) {\n clearPageHeader();\n return () => clearPageHeader();\n }\n setPageHeader({\n startExtra: null,\n main: null,\n end: skillsHeaderEnd,\n });\n return () => clearPageHeader();\n }, [clearPageHeader, hasToken, inSettingsShell, setPageHeader, skillsHeaderEnd]);\n\n if (!hasToken) {\n return (\n <div className=\"mx-auto w-full max-w-app-main px-4 py-16 text-center text-sm text-fg-muted sm:px-8\">\n {sk.needToken}\n </div>\n );\n }\n\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col bg-surface-panel\">\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6 sm:px-8\">\n {actionFeedback ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n 'rounded-xl border px-3 py-2 text-sm',\n actionFeedback.kind === 'success'\n ? 'border-emerald-200 bg-emerald-50 text-emerald-800 dark:border-emerald-900/40 dark:bg-emerald-950/40 dark:text-emerald-200'\n : 'border-red-200 bg-red-50 text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200',\n )}\n >\n {actionFeedback.message}\n </div>\n ) : error ? (\n <div\n className=\"rounded-xl border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300\"\n role=\"alert\"\n >\n {error}\n </div>\n ) : null}\n\n <header className=\"flex flex-col gap-4\">\n <div className=\"min-w-0\">\n <h1 className=\"text-xl font-semibold tracking-tight text-fg\">{sk.title}</h1>\n <p className=\"mt-1 max-w-2xl text-sm text-fg-muted\">{sk.tagline}</p>\n </div>\n </header>\n\n {inSettingsShell ? (\n <div className=\"flex flex-col gap-3 border-b border-edge-subtle pb-4 dark:border-edge-subtle sm:flex-row sm:flex-wrap sm:items-center sm:justify-end\">\n {skillsHeaderEnd}\n </div>\n ) : null}\n\n <section className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-3 border-b border-edge-subtle pb-3 sm:flex-row sm:items-center sm:justify-between dark:border-edge-subtle\">\n <div className=\"flex flex-wrap gap-x-1 gap-y-1\" role=\"tablist\" aria-label={sk.skillsNavAria}>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'marketplace'}\n className={cn(\n 'relative max-w-full rounded-md px-3 py-2 text-left text-sm font-medium transition-colors sm:text-center',\n mainTab === 'marketplace' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'marketplace' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('marketplace')}\n >\n {sk.tabMarketplace}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'builtin'}\n className={cn(\n 'relative rounded-md px-3 py-2 text-sm font-medium transition-colors',\n mainTab === 'builtin' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'builtin' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('builtin')}\n >\n {sk.tabBuiltin}\n <span className=\"ml-1 tabular-nums text-fg-muted\">\n ({builtinTabStats.enabled}/{builtinTabStats.total})\n </span>\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'user'}\n className={cn(\n 'relative rounded-md px-3 py-2 text-sm font-medium transition-colors',\n mainTab === 'user' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'user' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('user')}\n >\n {sk.tabUser}\n <span className=\"ml-1 tabular-nums text-fg-muted\">\n ({userTabStats.enabled}/{userTabStats.total})\n </span>\n </button>\n </div>\n <div\n className={cn(\n 'flex min-h-9 min-w-0 items-center gap-2',\n mainTab === 'user'\n ? 'flex-nowrap overflow-x-auto pb-0.5 sm:justify-end'\n : 'flex-wrap sm:justify-end',\n )}\n >\n {mainTab === 'user' ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-9 min-h-9 min-w-[9rem] shrink-0 items-center gap-1.5 rounded-lg border border-edge bg-surface-panel px-2.5 text-xs font-medium text-fg shadow-surface',\n interaction.transition,\n interaction.focusRingPanel,\n )}\n >\n <Funnel className=\"size-3.5 text-fg-muted\" strokeWidth={1.75} aria-hidden />\n <span>{filterLabel}</span>\n <ChevronDown className=\"size-3.5 text-fg-subtle\" strokeWidth={1.75} aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 min-w-[10rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge\"\n sideOffset={6}\n align=\"end\"\n >\n {(['all', 'global', 'workspace', 'extra'] as const).map((key) => (\n <DropdownMenu.Item\n key={key}\n className={cn(\n 'cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none',\n 'hover:bg-surface-hover data-[highlighted]:bg-surface-hover',\n )}\n onSelect={() => setSourceFilter(key)}\n >\n {key === 'all'\n ? sk.filterAll\n : key === 'global'\n ? sk.filterGlobal\n : key === 'workspace'\n ? sk.filterWorkspace\n : sk.filterExtra}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n ) : null}\n {mainTab === 'marketplace' ? (\n <>\n <div\n className=\"inline-flex h-9 shrink-0 rounded-lg border border-edge bg-surface-panel p-0.5 shadow-surface\"\n role=\"group\"\n aria-label={sk.marketplaceBrowseSwitchAria}\n >\n {registeredProviders.map((p) => {\n const selected = marketBrowseProvider === p.id;\n return (\n <button\n key={p.id}\n type=\"button\"\n className={cn(\n 'rounded-md px-2.5 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n selected\n ? 'bg-fg text-surface-panel dark:bg-fg dark:text-surface-base'\n : 'text-fg-muted hover:text-fg',\n )}\n aria-pressed={selected}\n onClick={() => setMarketBrowseProvider(p.id)}\n >\n {p.displayName}\n </button>\n );\n })}\n </div>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-9 min-h-9 min-w-[9rem] shrink-0 items-center gap-1.5 rounded-lg border border-edge bg-surface-panel px-2.5 text-xs font-medium text-fg shadow-surface',\n interaction.transition,\n interaction.focusRingPanel,\n )}\n >\n <Funnel className=\"size-3.5 text-fg-muted\" strokeWidth={1.75} aria-hidden />\n <span>\n {marketSort === 'newest' ? sk.marketplaceSortNewest : sk.marketplaceSortDownloads}\n </span>\n <ChevronDown className=\"size-3.5 text-fg-subtle\" strokeWidth={1.75} aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 min-w-[10rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge\"\n sideOffset={6}\n align=\"end\"\n >\n <DropdownMenu.Item\n className={cn(\n 'cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none',\n 'hover:bg-surface-hover data-[highlighted]:bg-surface-hover',\n )}\n onSelect={() => setMarketSort('downloads')}\n >\n {sk.marketplaceSortDownloads}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n className={cn(\n 'cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none',\n 'hover:bg-surface-hover data-[highlighted]:bg-surface-hover',\n )}\n onSelect={() => setMarketSort('newest')}\n >\n {sk.marketplaceSortNewest}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </>\n ) : null}\n {mainTab === 'builtin' ? <div className=\"h-9 min-w-[9rem] shrink-0\" aria-hidden /> : null}\n </div>\n </div>\n\n {mainTab === 'marketplace' ? (\n <SkillsPageMarketplaceContent {...vm} />\n ) : (\n <SkillsPageCatalogContent {...vm} />\n )}\n </section>\n </div>\n\n <SkillsPageDetailDialog {...vm} />\n <SkillsPageInstallDialog {...vm} />\n <SkillsPageConfirmDialog {...vm} />\n </div>\n );\n}\n","export async function fileToZipUpload(file: File): Promise<File> {\n const lower = file.name.toLowerCase();\n if (lower.endsWith('.zip')) return file;\n if (lower.endsWith('skill.md')) {\n const JSZip = (await import('jszip')).default;\n const zip = new JSZip();\n zip.file('SKILL.md', await file.arrayBuffer());\n const blob = await zip.generateAsync({ type: 'blob', compression: 'DEFLATE' });\n const base = file.name.replace(/\\.md$/i, '').replace(/\\s+/g, '-') || 'skill';\n return new File([blob], `${base}.zip`, { type: 'application/zip' });\n }\n throw new Error('invalid');\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type DragEvent,\n} from 'react';\nimport { useLocation, useNavigate, useSearchParams } from 'react-router-dom';\n\nimport {\n deleteSkill,\n getMarketplaceCategories,\n getMarketplacePackageDetail,\n getMarketplaceProvider,\n getMarketplaceProviders,\n getMarketplaceSkills,\n getSkillMarkdown,\n getSkills,\n installMarketplaceSkill,\n patchSkillEnabled,\n reloadSkills,\n uploadSkillZip,\n} from '@/features/skills/skill-api';\nimport type {\n MarketplaceCategoryItem,\n MarketplacePackageItem,\n MarketplaceProviderInfo,\n SkillCatalogEntry,\n SkillMarkdownPreviewPayload,\n} from '@/features/skills/skill.types';\nimport { fileToZipUpload } from '@/features/skills/skill-upload-zip';\nimport {\n BUILTIN_SKILL_CATEGORY_ORDER,\n MAIN_TAB_SET,\n MARKETPLACE_PROVIDER_PARAM,\n SOURCE_FILTER_SET,\n type MainTab,\n type SourceFilter,\n} from '@/features/skills/skills-page.constants';\nimport { normalizeCatalogEntry } from '@/features/skills/skills-page.utils';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nexport function useSkillsPage() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const sk = m.skills;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n const navigate = useNavigate();\n const [searchParams, setSearchParams] = useSearchParams();\n\n const mprovRaw = searchParams.get(MARKETPLACE_PROVIDER_PARAM);\n // Accept any non-empty provider id from URL — validity checked by the backend registry.\n const urlMarketProvider = mprovRaw?.trim() || null;\n\n const [catalog, setCatalog] = useState<SkillCatalogEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [uploading, setUploading] = useState(false);\n const initialSearch = searchParams.get('q') ?? '';\n const initialTabRaw = searchParams.get('tab');\n const initialSourceRaw = searchParams.get('source');\n const initialTab: MainTab = MAIN_TAB_SET.has(initialTabRaw as MainTab)\n ? (initialTabRaw as MainTab)\n : 'marketplace';\n const initialSourceFilter: SourceFilter = SOURCE_FILTER_SET.has(initialSourceRaw as SourceFilter)\n ? (initialSourceRaw as SourceFilter)\n : 'all';\n\n const [searchQuery, setSearchQuery] = useState(initialSearch);\n const [actionFeedback, setActionFeedback] = useState<{\n kind: 'success' | 'error';\n message: string;\n } | null>(null);\n\n const [mainTab, setMainTab] = useState<MainTab>(initialTab);\n const [sourceFilter, setSourceFilter] = useState<SourceFilter>(initialSourceFilter);\n const [builtinCategoryFilter, setBuiltinCategoryFilter] = useState('');\n\n const [installOpen, setInstallOpen] = useState(false);\n const [pendingFile, setPendingFile] = useState<File | null>(null);\n const [dropActive, setDropActive] = useState(false);\n\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [confirmId, setConfirmId] = useState<string | null>(null);\n const [togglingSkillName, setTogglingSkillName] = useState<string | null>(null);\n const [enabledOverride, setEnabledOverride] = useState<Record<string, boolean>>({});\n\n const [detailOpen, setDetailOpen] = useState(false);\n const [detailSource, setDetailSource] = useState<'catalog' | 'store'>('catalog');\n const [detailTitle, setDetailTitle] = useState('');\n const [detailMarkdown, setDetailMarkdown] = useState('');\n const [detailCatalogPreview, setDetailCatalogPreview] = useState<SkillMarkdownPreviewPayload | null>(null);\n const [detailMarketplacePreview, setDetailMarketplacePreview] = useState<SkillMarkdownPreviewPayload | null>(\n null,\n );\n const [detailLoading, setDetailLoading] = useState(false);\n const [detailError, setDetailError] = useState<string | null>(null);\n\n const [marketSort, setMarketSort] = useState<'downloads' | 'newest'>('downloads');\n const [marketPage, setMarketPage] = useState(1);\n const [mpLoading, setMpLoading] = useState(false);\n const [mpError, setMpError] = useState<string | null>(null);\n const [mpPayload, setMpPayload] = useState<{\n items: MarketplacePackageItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider?: string;\n } | null>(null);\n const [installingMarketName, setInstallingMarketName] = useState<string | null>(null);\n const [usingSkillInChatName, setUsingSkillInChatName] = useState<string | null>(null);\n const [marketCategoryId, setMarketCategoryId] = useState('');\n const [mpCategories, setMpCategories] = useState<MarketplaceCategoryItem[]>([]);\n const [mpCategoriesError, setMpCategoriesError] = useState<string | null>(null);\n const [mpCategoriesLoading, setMpCategoriesLoading] = useState(false);\n const [marketBrowseProvider, setMarketBrowseProvider] = useState<string | null>(null);\n const marketplaceDetailProviderRef = useRef<string | null>(null);\n const prevMarketBrowseProviderRef = useRef<string | null>(null);\n /** Dynamic provider list from the registry API. */\n const [registeredProviders, setRegisteredProviders] = useState<MarketplaceProviderInfo[]>([]);\n\n const load = useCallback(\n async (opts?: { silent?: boolean }): Promise<{ ok: true } | { ok: false; message: string }> => {\n const silent = opts?.silent === true;\n if (!silent) {\n setLoading(true);\n }\n setError(null);\n try {\n const data = await getSkills(language !== 'en' ? language : undefined);\n setCatalog(data.catalog.map(normalizeCatalogEntry));\n return { ok: true };\n } catch (e) {\n const message = e instanceof Error ? e.message : sk.loadFailed;\n setError(message);\n return { ok: false, message };\n } finally {\n if (!silent) {\n setLoading(false);\n }\n }\n },\n [language, sk.loadFailed],\n );\n\n useEffect(() => {\n if (!hasToken) return;\n void load();\n }, [hasToken, load]);\n\n useEffect(() => {\n if (!hasToken) {\n setMarketBrowseProvider(null);\n marketplaceDetailProviderRef.current = null;\n return;\n }\n if (urlMarketProvider) {\n setMarketBrowseProvider(urlMarketProvider);\n }\n }, [hasToken, urlMarketProvider]);\n\n useEffect(() => {\n if (!hasToken) return;\n let cancelled = false;\n void getMarketplaceProviders()\n .then(({ providers, current }) => {\n if (cancelled) return;\n setRegisteredProviders(providers.map((p) => ({ id: p.id, displayName: p.displayName })));\n if (urlMarketProvider == null) {\n setMarketBrowseProvider((prev) => (prev != null ? prev : current));\n }\n })\n .catch(() => {\n if (cancelled) return;\n // Fallback: try old single-provider endpoint\n void getMarketplaceProvider()\n .then((info) => {\n if (!cancelled && urlMarketProvider == null) {\n setMarketBrowseProvider((prev) => (prev != null ? prev : info.provider));\n }\n })\n .catch(() => {\n if (!cancelled && urlMarketProvider == null) {\n setMarketBrowseProvider((prev) => (prev != null ? prev : 'skillhub'));\n }\n });\n });\n return () => {\n cancelled = true;\n };\n }, [hasToken, urlMarketProvider]);\n\n useEffect(() => {\n const nextQ = searchParams.get('q') ?? '';\n const nextTabRaw = searchParams.get('tab');\n const nextSourceRaw = searchParams.get('source');\n const nextTab: MainTab = MAIN_TAB_SET.has(nextTabRaw as MainTab)\n ? (nextTabRaw as MainTab)\n : 'marketplace';\n const nextSource: SourceFilter = SOURCE_FILTER_SET.has(nextSourceRaw as SourceFilter)\n ? (nextSourceRaw as SourceFilter)\n : 'all';\n setSearchQuery((prev) => (prev === nextQ ? prev : nextQ));\n setMainTab((prev) => (prev === nextTab ? prev : nextTab));\n setSourceFilter((prev) => (prev === nextSource ? prev : nextSource));\n const nextMcat = searchParams.get('mcat') ?? '';\n if (nextTab === 'marketplace') {\n setMarketCategoryId((prev) => (prev === nextMcat ? prev : nextMcat));\n } else {\n setMarketCategoryId('');\n }\n }, [searchParams]);\n\n useEffect(() => {\n if (mainTab !== 'marketplace') return;\n setMarketPage(1);\n }, [searchQuery, marketSort, mainTab, marketCategoryId, marketBrowseProvider]);\n\n useEffect(() => {\n if (mainTab !== 'marketplace' || !marketBrowseProvider) {\n prevMarketBrowseProviderRef.current = marketBrowseProvider;\n return;\n }\n const prev = prevMarketBrowseProviderRef.current;\n prevMarketBrowseProviderRef.current = marketBrowseProvider;\n if (prev != null && prev !== marketBrowseProvider) {\n setMarketCategoryId('');\n }\n }, [mainTab, marketBrowseProvider]);\n\n /** Before paint: avoid one frame of empty/stale list then skeleton (useEffect runs too late). */\n useLayoutEffect(() => {\n if (!hasToken || mainTab !== 'marketplace') return;\n setMpLoading(true);\n }, [hasToken, mainTab, marketCategoryId, marketPage, marketSort, searchQuery, marketBrowseProvider]);\n\n useLayoutEffect(() => {\n if (!hasToken || mainTab !== 'marketplace') return;\n setMpCategoriesLoading(true);\n }, [hasToken, mainTab, marketBrowseProvider]);\n\n useEffect(() => {\n if (mainTab === 'marketplace') return;\n setMpCategories([]);\n setMpCategoriesError(null);\n setMpCategoriesLoading(false);\n }, [mainTab]);\n\n useEffect(() => {\n if (!hasToken || mainTab !== 'marketplace' || !marketBrowseProvider) return;\n let cancelled = false;\n setMpError(null);\n void getMarketplaceSkills({\n q: searchQuery.trim() || undefined,\n page: marketPage,\n pageSize: 20,\n sort: marketSort,\n category: marketCategoryId.trim() || undefined,\n provider: marketBrowseProvider,\n })\n .then((payload) => {\n if (!cancelled) setMpPayload(payload);\n })\n .catch((e) => {\n if (!cancelled) {\n setMpError(e instanceof Error ? e.message : sk.marketplaceLoadFailed);\n setMpPayload(null);\n }\n })\n .finally(() => {\n if (!cancelled) setMpLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [\n hasToken,\n mainTab,\n marketCategoryId,\n marketPage,\n marketSort,\n searchQuery,\n sk.marketplaceLoadFailed,\n marketBrowseProvider,\n ]);\n\n useEffect(() => {\n if (!hasToken || mainTab !== 'marketplace' || !marketBrowseProvider) return;\n let cancelled = false;\n setMpCategoriesError(null);\n void getMarketplaceCategories({ provider: marketBrowseProvider })\n .then((r) => {\n if (!cancelled) setMpCategories(r.items);\n })\n .catch((e) => {\n if (!cancelled) {\n setMpCategories([]);\n setMpCategoriesError(e instanceof Error ? e.message : sk.marketplaceCategoriesFailed);\n }\n })\n .finally(() => {\n if (!cancelled) setMpCategoriesLoading(false);\n });\n return () => {\n cancelled = true;\n setMpCategoriesLoading(false);\n };\n }, [hasToken, mainTab, sk.marketplaceCategoriesFailed, marketBrowseProvider]);\n\n useEffect(() => {\n if (!marketCategoryId.trim() || mpCategories.length === 0) return;\n if (!mpCategories.some((c) => c.id === marketCategoryId)) {\n setMarketCategoryId('');\n }\n }, [mpCategories, marketCategoryId]);\n\n useEffect(() => {\n setSearchParams(\n (prev) => {\n const params = new URLSearchParams(prev);\n const nextQ = searchQuery.trim();\n if (nextQ) params.set('q', nextQ);\n else params.delete('q');\n if (mainTab !== 'marketplace') params.set('tab', mainTab);\n else params.delete('tab');\n if (sourceFilter !== 'all') params.set('source', sourceFilter);\n else params.delete('source');\n if (mainTab === 'marketplace' && marketCategoryId.trim()) {\n params.set('mcat', marketCategoryId.trim());\n } else {\n params.delete('mcat');\n }\n if (mainTab === 'marketplace' && marketBrowseProvider) {\n params.set(MARKETPLACE_PROVIDER_PARAM, marketBrowseProvider);\n } else {\n params.delete(MARKETPLACE_PROVIDER_PARAM);\n }\n if (params.toString() === prev.toString()) {\n return prev;\n }\n return params;\n },\n { replace: true },\n );\n }, [mainTab, marketCategoryId, marketBrowseProvider, searchQuery, setSearchParams, sourceFilter]);\n\n const showFeedback = useCallback((kind: 'success' | 'error', message: string, durationMs = 5000) => {\n setActionFeedback({ kind, message });\n window.setTimeout(() => setActionFeedback(null), durationMs);\n }, []);\n\n const openSkillDetail = useCallback(\n async (row: SkillCatalogEntry) => {\n setDetailSource('catalog');\n setDetailOpen(true);\n setDetailTitle(row.name);\n setDetailMarkdown('');\n setDetailCatalogPreview(null);\n setDetailMarketplacePreview(null);\n setDetailError(null);\n setDetailLoading(true);\n try {\n const preview = await getSkillMarkdown(row.name, language !== 'en' ? language : undefined);\n setDetailCatalogPreview(preview);\n setDetailTitle(preview.name);\n } catch (e) {\n setDetailCatalogPreview(null);\n setDetailError(e instanceof Error ? e.message : sk.detailLoadFailed);\n } finally {\n setDetailLoading(false);\n }\n },\n [language, sk.detailLoadFailed],\n );\n\n const openMarketplaceDetail = useCallback(\n async (packageId: string, listTitle?: string) => {\n const browse = marketBrowseProvider;\n if (!browse) return;\n marketplaceDetailProviderRef.current = browse;\n setDetailSource('store');\n setDetailOpen(true);\n setDetailTitle(listTitle?.trim() || packageId);\n setDetailMarkdown('');\n setDetailCatalogPreview(null);\n setDetailMarketplacePreview(null);\n setDetailError(null);\n setDetailLoading(true);\n try {\n const pkg = await getMarketplacePackageDetail(packageId, { provider: browse });\n setDetailTitle(pkg.name);\n if (pkg.skillDocPreview) {\n setDetailMarketplacePreview(pkg.skillDocPreview);\n setDetailMarkdown('');\n } else {\n setDetailMarketplacePreview(null);\n const readme = pkg.readme?.trim();\n if (readme) {\n setDetailMarkdown(readme);\n } else if (pkg.description?.trim()) {\n setDetailMarkdown(`## ${pkg.name}\\n\\n${pkg.description.trim()}`);\n } else {\n setDetailMarkdown(`*${sk.marketplaceNoReadme}*`);\n }\n }\n } catch (e) {\n setDetailMarketplacePreview(null);\n setDetailError(e instanceof Error ? e.message : sk.detailLoadFailed);\n } finally {\n setDetailLoading(false);\n }\n },\n [marketBrowseProvider, sk.detailLoadFailed, sk.marketplaceNoReadme],\n );\n\n const onSkillToggle = useCallback(\n async (name: string, next: boolean): Promise<boolean> => {\n setTogglingSkillName(name);\n setEnabledOverride((prev) => ({ ...prev, [name]: next }));\n setActionFeedback(null);\n try {\n await patchSkillEnabled(name, next);\n await load({ silent: true });\n return true;\n } catch (e) {\n setEnabledOverride((prev) => {\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n const msg = e instanceof Error ? e.message : sk.skillToggleFailed;\n showFeedback('error', msg);\n return false;\n } finally {\n setTogglingSkillName(null);\n setEnabledOverride((prev) => {\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n }\n },\n [load, showFeedback, sk.skillToggleFailed],\n );\n\n const onReloadClick = useCallback(async () => {\n setActionFeedback(null);\n setLoading(true);\n setError(null);\n try {\n await reloadSkills();\n } catch (e) {\n const msg = e instanceof Error ? e.message : sk.reloadFailed;\n setError(msg);\n setLoading(false);\n return;\n }\n await load();\n }, [load, sk.reloadFailed]);\n\n const builtinTabStats = useMemo(() => {\n const rows = catalog.filter((r) => r.source === 'builtin');\n return {\n total: rows.length,\n enabled: rows.filter((r) => enabledOverride[r.name] ?? r.enabled).length,\n };\n }, [catalog, enabledOverride]);\n\n const userTabStats = useMemo(() => {\n const rows = catalog.filter((r) => r.source !== 'builtin');\n return {\n total: rows.length,\n enabled: rows.filter((r) => enabledOverride[r.name] ?? r.enabled).length,\n };\n }, [catalog, enabledOverride]);\n\n const detailFromCatalog = useMemo(\n () => (detailTitle ? catalog.find((r) => r.name === detailTitle) : undefined),\n [catalog, detailTitle],\n );\n const detailEnabled =\n detailFromCatalog == null\n ? true\n : (enabledOverride[detailTitle] ?? detailFromCatalog.enabled);\n\n const filteredCatalog = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n let rows = catalog;\n\n if (mainTab === 'builtin') {\n rows = rows.filter((r) => r.source === 'builtin');\n } else {\n rows = rows.filter((r) => r.source !== 'builtin');\n if (sourceFilter !== 'all') {\n rows = rows.filter((r) => r.source === sourceFilter);\n }\n }\n\n if (!q) return rows;\n return rows.filter((row) => {\n const blob = [\n row.name,\n row.description,\n row.directoryId,\n row.path,\n row.source,\n row.hub?.source,\n row.hub?.ref,\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n return blob.includes(q);\n });\n }, [catalog, searchQuery, mainTab, sourceFilter]);\n\n const builtinCategories = useMemo(() => {\n const seen = new Set<string>();\n const ordered: string[] = [];\n for (const entry of filteredCatalog) {\n const cat = entry.category;\n if (!cat || seen.has(cat)) continue;\n seen.add(cat);\n ordered.push(cat);\n }\n return ordered.sort((a, b) => {\n const ai = BUILTIN_SKILL_CATEGORY_ORDER.indexOf(a as (typeof BUILTIN_SKILL_CATEGORY_ORDER)[number]);\n const bi = BUILTIN_SKILL_CATEGORY_ORDER.indexOf(b as (typeof BUILTIN_SKILL_CATEGORY_ORDER)[number]);\n if (ai >= 0 && bi >= 0) return ai - bi;\n if (ai >= 0) return -1;\n if (bi >= 0) return 1;\n return a.localeCompare(b);\n });\n }, [filteredCatalog]);\n\n const categoryLabel = useCallback(\n (cat: string): string => {\n const labels = sk.categoryLabel as Record<string, string> | undefined;\n return labels?.[cat] || cat;\n },\n [sk.categoryLabel],\n );\n\n const categoryFilteredCatalog = useMemo(() => {\n if (!builtinCategoryFilter) return filteredCatalog;\n return filteredCatalog.filter((r) => r.category === builtinCategoryFilter);\n }, [filteredCatalog, builtinCategoryFilter]);\n\n const runUpload = async (file: File) => {\n setActionFeedback(null);\n setUploading(true);\n setError(null);\n try {\n let upload: File;\n try {\n upload = await fileToZipUpload(file);\n } catch {\n setError(sk.invalidFile);\n showFeedback('error', sk.invalidFile);\n return;\n }\n await uploadSkillZip(upload, { overwrite: true });\n await load();\n showFeedback('success', sk.installSuccess);\n setInstallOpen(false);\n setPendingFile(null);\n setMainTab('user');\n } catch (err) {\n setError(err instanceof Error ? err.message : sk.uploadFailed);\n showFeedback('error', err instanceof Error ? err.message : sk.uploadFailed);\n } finally {\n setUploading(false);\n }\n };\n\n const onInstallSubmit = () => {\n if (pendingFile) void runUpload(pendingFile);\n };\n\n const onFileInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (file) setPendingFile(file);\n };\n\n const onModalDragOver = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer.types.includes('Files')) {\n setDropActive(true);\n e.dataTransfer.dropEffect = 'copy';\n }\n };\n\n const onModalDragLeave = (e: DragEvent) => {\n const root = e.currentTarget as HTMLElement;\n const to = e.relatedTarget as Node | null;\n if (to && root.contains(to)) return;\n setDropActive(false);\n };\n\n const onModalDrop = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDropActive(false);\n const file = e.dataTransfer?.files?.[0];\n if (file) setPendingFile(file);\n };\n\n const sourceLabel = (source: SkillCatalogEntry['source']): string => {\n switch (source) {\n case 'builtin':\n return sk.source.builtin;\n case 'workspace':\n return sk.source.workspace;\n case 'global':\n return sk.source.global;\n case 'extra':\n return sk.source.extra;\n default:\n return source;\n }\n };\n\n const runDelete = async () => {\n const id = confirmId;\n setConfirmOpen(false);\n setConfirmId(null);\n if (!id) return;\n setActionFeedback(null);\n try {\n await deleteSkill(id);\n await load();\n } catch (e) {\n setError(e instanceof Error ? e.message : sk.deleteFailed);\n }\n };\n\n const isSkillInstalledByName = useCallback(\n (name: string) => catalog.some((r) => r.name === name),\n [catalog],\n );\n\n const onUseSkillInChat = useCallback(async () => {\n const name = detailTitle.trim();\n if (!name) return;\n setActionFeedback(null);\n const needsMarketInstall = detailSource === 'store' && !isSkillInstalledByName(name);\n if (needsMarketInstall) setUsingSkillInChatName(name);\n try {\n if (needsMarketInstall) {\n const mp = marketplaceDetailProviderRef.current ?? marketBrowseProvider;\n await installMarketplaceSkill({\n name,\n overwrite: false,\n ...(mp ? { provider: mp } : {}),\n });\n await load({ silent: true });\n }\n setDetailOpen(false);\n navigate(`/chat/new?skill=${encodeURIComponent(name)}`);\n } catch (e) {\n showFeedback('error', e instanceof Error ? e.message : sk.uploadFailed);\n } finally {\n setUsingSkillInChatName(null);\n }\n }, [\n detailTitle,\n detailSource,\n isSkillInstalledByName,\n load,\n navigate,\n showFeedback,\n sk.uploadFailed,\n marketBrowseProvider,\n ]);\n\n const onMarketInstall = useCallback(\n async (name: string, opts?: { useDetailProvider?: boolean }) => {\n const installed = isSkillInstalledByName(name);\n if (installed) {\n const ok = window.confirm(sk.marketplaceReinstallConfirm);\n if (!ok) return;\n }\n setActionFeedback(null);\n setInstallingMarketName(name);\n try {\n const p = opts?.useDetailProvider\n ? marketplaceDetailProviderRef.current ?? marketBrowseProvider\n : marketBrowseProvider;\n await installMarketplaceSkill({\n name,\n overwrite: installed,\n ...(p ? { provider: p } : {}),\n });\n await load({ silent: true });\n showFeedback('success', sk.installSuccess);\n setDetailOpen(false);\n setMainTab('user');\n } catch (e) {\n showFeedback('error', e instanceof Error ? e.message : sk.uploadFailed);\n } finally {\n setInstallingMarketName(null);\n }\n },\n [\n isSkillInstalledByName,\n load,\n marketBrowseProvider,\n showFeedback,\n sk.installSuccess,\n sk.marketplaceReinstallConfirm,\n sk.uploadFailed,\n ],\n );\n\n const filterLabel =\n sourceFilter === 'all'\n ? sk.filterAll\n : sourceFilter === 'global'\n ? sk.filterGlobal\n : sourceFilter === 'workspace'\n ? sk.filterWorkspace\n : sk.filterExtra;\n\n const { pathname } = useLocation();\n const inSettingsShell = pathname.startsWith('/settings/');\n\n return {\n sk,\n hasToken,\n catalog,\n loading,\n error,\n uploading,\n searchQuery,\n setSearchQuery,\n actionFeedback,\n mainTab,\n setMainTab,\n sourceFilter,\n setSourceFilter,\n builtinCategoryFilter,\n setBuiltinCategoryFilter,\n installOpen,\n setInstallOpen,\n pendingFile,\n setPendingFile,\n dropActive,\n setDropActive,\n confirmOpen,\n setConfirmOpen,\n confirmId,\n setConfirmId,\n togglingSkillName,\n enabledOverride,\n detailOpen,\n setDetailOpen,\n detailSource,\n setDetailSource,\n detailTitle,\n setDetailTitle,\n detailMarkdown,\n setDetailMarkdown,\n detailCatalogPreview,\n setDetailCatalogPreview,\n detailMarketplacePreview,\n setDetailMarketplacePreview,\n detailLoading,\n detailError,\n setDetailError,\n marketSort,\n setMarketSort,\n marketPage,\n setMarketPage,\n mpLoading,\n mpError,\n mpPayload,\n installingMarketName,\n usingSkillInChatName,\n onUseSkillInChat,\n marketCategoryId,\n setMarketCategoryId,\n mpCategories,\n mpCategoriesError,\n mpCategoriesLoading,\n marketBrowseProvider,\n setMarketBrowseProvider,\n registeredProviders,\n builtinTabStats,\n userTabStats,\n detailEnabled,\n filteredCatalog,\n builtinCategories,\n categoryFilteredCatalog,\n filterLabel,\n inSettingsShell,\n categoryLabel,\n onReloadClick,\n openSkillDetail,\n openMarketplaceDetail,\n onSkillToggle,\n onInstallSubmit,\n onFileInputChange,\n onModalDragOver,\n onModalDragLeave,\n onModalDrop,\n sourceLabel,\n runDelete,\n onMarketInstall,\n isSkillInstalledByName,\n };\n}\n\nexport type SkillsPageVm = ReturnType<typeof useSkillsPage>;\n","import { SkillsPageView } from '@/features/skills/skills-page-view';\nimport { useSkillsPage } from '@/features/skills/use-skills-page';\n\nexport function SkillsPage() {\n const vm = useSkillsPage();\n return <SkillsPageView vm={vm} />;\n}\n"],"file":"skills-page-B_msZcLx.js"}
|
|
1
|
+
{"version":3,"mappings":"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AmU,QACAzE,YACAxP,cACAC,iBACAiU,kBACAhU,UACAiU,aACA+F,eACA9F,kBACA7P,yBACAC,2BACAqL,eACAxP,iBACAyP,eACA1P,iBACA2P,aACAC,gBACAxG,cACAzE,iBACA0E,aACAzE,gBACA2J,qBACAhK,kBACA8I,aACAC,iBACAC,gBACAC,mBACAC,eACAC,kBACAC,kBACAC,qBACAC,wBACAC,2BACAC,4BACAC,+BACAC,iBACAC,eACAC,kBACAgG,aACAC,iBACA1C,cACAC,iBACAN,aACAC,WACAF,aACA9C,wBACAD,wBACAI,oBACA8C,oBACAC,uBACAP,gBACAE,qBACAD,uBACAO,uBACA4C,2BACAC,uBACAL,mBACAC,gBACA9F,iBACAnK,mBACAC,qBACAG,2BACAkQ,eACAC,gBAtEsBqM,GAASE,WAAW,aAsE1CvM,CACAlQ,iBACA3E,iBACA+E,mBACAkN,yBACApN,iBACAyL,mBACAD,qBACAH,mBACAC,oBACAC,eACAtL,eACA6E,aACAoF,mBACAF,0BACD,CC1yBH,SAAOwS,IAAA,KAAAvhB,UAAA,GACLkU,EAAWwE,IAAe,CAAC3Y,EACM,OADNC,EAAA,KAAAkU,EACMnU,EAAAC,EAAA,IAA1BD,GAAA,SAAC,GAAD,CAAoBmU,KAAM,EAAAlU,EAAA,GAAAkU,EAAAlU,EAAA,GAAAD,GAA1BA","names":["SkillsPageHeaderEnd","t0","$","loading","onReloadClick","searchQuery","setSearchQuery","mainTab","sk","setPendingFile","setInstallOpen","t1","reloadRuntime","t2","reloadDiskAria","t3","t4","t5","cn","t6","t7","t8","Symbol","for","t9","e","target","value","t10","marketplaceSearchPackages","searchPlaceholder","t11","t12","t13","t14","installCta","t15","SKILL_INITIAL_PALETTE","light","dark","hashSkillNameKey","name","h","i","length","Math","imul","charCodeAt","abs","skillInitialLetter","t","trim","m","match","toLocaleUpperCase","SkillCardIcon","className","initial","pair","SkillEnableSwitch","checked","onChange","skelBar","MarketplaceSkillCardSkeleton","SkillCatalogCardSkeleton","MAIN_TAB_SET","Set","SOURCE_FILTER_SET","MARKETPLACE_PROVIDER_PARAM","SKILL_LIST_SKELETON_KEYS","BUILTIN_SKILL_CATEGORY_ORDER","SkillsPageCatalogContent","p","catalog","filteredCatalog","builtinCategories","builtinCategoryFilter","setBuiltinCategoryFilter","categoryFilteredCatalog","categoryLabel","enabledOverride","onSkillToggle","sourceLabel","openSkillDetail","setConfirmOpen","setConfirmId","map","_temp","empty","noSearchResults","marketplaceCategoriesAria","interaction","focusRingPanel","marketplaceCategoryAll","cat","selected","row","directoryId","closest","e_0","key","preventDefault","_temp2","_temp3","enabled","next","managed","col","actions","delete","description","undefined","source","yes","hub","ref","updatedAt","hubRemote","kind","hubKindGit","hubKindArchive","slice","path","e_2","stopPropagation","e_1","k","SKILLHUB_PUBLIC_ORIGIN","CLAWHUB_PUBLIC_ORIGIN","skillHubPublicSkillPageUrl","canonicalSlug","id","encodeURIComponent","clawHubPublicSkillPageUrl","marketplacePublicSkillUrl","provider","slug","interpolate","template","params","replace","_","String","installSpecSummary","spec","parts","label","push","package","formula","module","url","join","normalizeCatalogEntry","r","disableModelInvocation","SkillsPageConfirmDialog","confirmOpen","confirmId","runDelete","open","deleteTitle","deleteMessage","cancel","deleteConfirm","MetaRow","children","SkillCatalogStructuredPreview","preview","meta","metadata","gate","toolConditions","hasToolGating","requiresTools","requiresToolsets","fallbackForTools","fallbackForToolsets","req","requires","hasRequires","bins","env","anyBins","T0","emoji","homepage","install","os","requiredEnvVarNames","detailEnvVarsLabel","detailHomepageLabel","detailInstallLabel","detailNotInjectedNote","detailPlatformsLabel","detailRequiresAnyBins","detailRequiresBins","detailRequiresEnv","detailRequiresLabel","detailSummaryHeading","detailToolGatingLabel","detailToolsFallbackList","detailToolsRequiresList","detailToolsetsFallbackList","detailToolsetsRequiresList","installs","filter","envNames","t16","t17","t18","t19","t20","t21","detailInstructionsHeading","bodyMarkdown","detailNoInstructionsBody","n","s","SKELETON_LINE_WIDTHS","width","SkillsPageDetailDialog","detailOpen","setDetailOpen","detailSource","setDetailSource","detailTitle","setDetailTitle","detailMarkdown","setDetailMarkdown","detailCatalogPreview","setDetailCatalogPreview","detailMarketplacePreview","setDetailMarketplacePreview","detailLoading","detailError","setDetailError","detailEnabled","usingSkillInChatName","installingMarketName","togglingSkillName","isSkillInstalledByName","onUseSkillInChat","onMarketInstall","detailCloseAria","detailModalBanner","detailModalBannerStore","detailModalDisable","detailModalEnable","marketplaceInstall","marketplaceReinstall","previewUseInChat","previewUseInChatBusy","uploading","useDetailProvider","ok","entry","SkillsPageInstallDialog","installOpen","pendingFile","dropActive","setDropActive","onModalDragOver","onModalDragLeave","onModalDrop","onFileInputChange","onInstallSubmit","installModalTitle","installClose","installModalDropHint","installModalReqTitle","installModalReq1","installModalReq2","t22","t23","t24","t25","installAction","t26","t27","t28","SkillsPageMarketplaceContent","mpCategories","mpCategoriesLoading","mpCategoriesError","mpPayload","mpLoading","mpError","marketCategoryId","setMarketCategoryId","marketBrowseProvider","marketPage","setMarketPage","openMarketplaceDetail","c","items","marketplaceEmpty","installed","busy","externalPageUrl","el","marketplaceOpenExternalAria","marketplaceOpenExternal","marketplaceAuthor","author","username","marketplaceDownloads","downloads","stars","marketplaceInstalled","latestVersion","marketplaceVersion","marketplaceSource","Boolean","marketplacePageStatus","page","totalPages","total","marketplacePagePrev","pg","max","marketplacePageNext","min","SkillsPageView","vm","hasToken","error","actionFeedback","setMainTab","setSourceFilter","builtinTabStats","userTabStats","marketSort","setMarketSort","setMarketBrowseProvider","registeredProviders","filterLabel","inSettingsShell","setPageHeader","usePageHeaderStore","clearPageHeader","skillsHeaderEnd","startExtra","main","end","useLayoutEffect","needToken","message","title","tagline","skillsNavAria","tabMarketplace","tabBuiltin","t29","tabUser","t30","t31","t32","t33","filterAll","filterExtra","filterGlobal","filterWorkspace","transition","t34","marketplaceBrowseSwitchAria","marketplaceSortDownloads","marketplaceSortNewest","displayName","t35","t36","t37","t38","t39","t40","t41","t42","t43","t44","s_0","fileToZipUpload","file","lower","toLowerCase","endsWith","JSZip","default","zip","arrayBuffer","blob","generateAsync","type","compression","base","File","Error","useSkillsPage","language","useLocaleStore","messages","skills","useGatewayStore","st","token","navigate","useNavigate","searchParams","setSearchParams","useSearchParams","urlMarketProvider","get","mprovRaw","setCatalog","setLoading","setError","setUploading","initialSearch","initialTabRaw","initialSourceRaw","initialTab","has","initialSourceFilter","setActionFeedback","sourceFilter","setTogglingSkillName","setEnabledOverride","setDetailLoading","setMpLoading","setMpError","setMpPayload","setInstallingMarketName","setUsingSkillInChatName","setMpCategories","setMpCategoriesError","setMpCategoriesLoading","marketplaceDetailProviderRef","prevMarketBrowseProviderRef","setRegisteredProviders","load","opts","silent","data","getSkills","loadFailed","useEffect","current","cancelled","getMarketplaceProviders","then","providers","prev","catch","getMarketplaceProvider","info","nextQ","nextTabRaw","nextSourceRaw","nextTab","nextSource","nextMcat","getMarketplaceSkills","q","pageSize","sort","category","payload","marketplaceLoadFailed","finally","getMarketplaceCategories","marketplaceCategoriesFailed","some","URLSearchParams","set","toString","showFeedback","durationMs","window","setTimeout","getSkillMarkdown","detailLoadFailed","packageId","listTitle","browse","pkg","getMarketplacePackageDetail","skillDocPreview","readme","marketplaceNoReadme","patchSkillEnabled","rest","skillToggleFailed","reloadSkills","reloadFailed","rows","detailFromCatalog","find","includes","seen","ordered","add","a","b","ai","indexOf","bi","localeCompare","runUpload","upload","invalidFile","uploadSkillZip","overwrite","installSuccess","err","uploadFailed","files","dataTransfer","types","dropEffect","root","currentTarget","to","relatedTarget","contains","builtin","workspace","global","extra","deleteSkill","deleteFailed","needsMarketInstall","mp","installMarketplaceSkill","confirm","marketplaceReinstallConfirm","pathname","useLocation","startsWith","SkillsPage"],"ignoreList":[],"sources":["../../../../../web/src/features/skills/skills-page-header-end.tsx","../../../../../web/src/features/skills/skill-card-icon.tsx","../../../../../web/src/features/skills/skills-page-primitives.tsx","../../../../../web/src/features/skills/skills-page.constants.ts","../../../../../web/src/features/skills/skills-page-catalog-content.tsx","../../../../../web/src/features/skills/skills-page.utils.ts","../../../../../web/src/features/skills/skills-page-confirm-dialog.tsx","../../../../../web/src/features/skills/skill-catalog-structured-preview.tsx","../../../../../web/src/features/skills/skills-page-detail-dialog.tsx","../../../../../web/src/features/skills/skills-page-install-dialog.tsx","../../../../../web/src/features/skills/skills-page-marketplace-content.tsx","../../../../../web/src/features/skills/skills-page-view.tsx","../../../../../web/src/features/skills/skill-upload-zip.ts","../../../../../web/src/features/skills/use-skills-page.ts","../../../../../web/src/features/skills/skills-page.tsx"],"sourcesContent":["import { Plus, RefreshCw, Search } from 'lucide-react';\nimport { memo } from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { cn } from '@/lib/cn';\nimport type { MainTab } from '@/features/skills/skills-page.constants';\nimport type { SkillsCopy } from '@/features/skills/skill-catalog-structured-preview';\n\nexport const SkillsPageHeaderEnd = memo(function SkillsPageHeaderEnd({\n loading,\n onReloadClick,\n searchQuery,\n setSearchQuery,\n mainTab,\n sk,\n setPendingFile,\n setInstallOpen,\n}: {\n loading: boolean;\n onReloadClick: () => void;\n searchQuery: string;\n setSearchQuery: (v: string) => void;\n mainTab: MainTab;\n sk: SkillsCopy;\n setPendingFile: (f: File | null) => void;\n setInstallOpen: (v: boolean) => void;\n}) {\n return (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"size-9 shrink-0 p-0\"\n disabled={loading}\n title={sk.reloadRuntime}\n aria-label={sk.reloadDiskAria}\n onClick={() => void onReloadClick()}\n >\n <RefreshCw className={cn('size-4', loading && 'animate-spin')} strokeWidth={1.75} />\n </Button>\n <label className=\"relative flex min-h-9 min-w-0 max-w-sm cursor-text items-center rounded-pill border border-edge bg-surface-base py-1.5 pl-9 pr-3 shadow-surface dark:bg-surface-hover/40 sm:max-w-md\">\n <Search\n className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-fg-disabled\"\n strokeWidth={1.75}\n aria-hidden\n />\n <input\n type=\"search\"\n enterKeyHint=\"search\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder={mainTab === 'marketplace' ? sk.marketplaceSearchPackages : sk.searchPlaceholder}\n autoComplete=\"off\"\n spellCheck={false}\n className=\"min-w-0 flex-1 appearance-none border-0 bg-transparent py-0.5 text-sm leading-normal text-fg caret-current placeholder:text-fg-disabled focus:border-0 focus:shadow-none focus:outline-none focus:ring-0 focus-visible:outline-none\"\n />\n </label>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"shrink-0 gap-2\"\n onClick={() => {\n setPendingFile(null);\n setInstallOpen(true);\n }}\n >\n <Plus className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {sk.installCta}\n </Button>\n </div>\n );\n});\n","import { cn } from '@/lib/cn';\n\n/** Pastel tile + saturated letter (light / dark pairs), stable per skill name hash. */\nconst SKILL_INITIAL_PALETTE: { light: string; dark: string }[] = [\n { light: 'bg-sky-100 text-sky-800', dark: 'dark:bg-sky-950/55 dark:text-sky-200' },\n { light: 'bg-violet-100 text-violet-800', dark: 'dark:bg-violet-950/55 dark:text-violet-200' },\n { light: 'bg-emerald-100 text-emerald-800', dark: 'dark:bg-emerald-950/55 dark:text-emerald-200' },\n { light: 'bg-orange-100 text-orange-800', dark: 'dark:bg-orange-950/55 dark:text-orange-200' },\n { light: 'bg-rose-100 text-rose-800', dark: 'dark:bg-rose-950/55 dark:text-rose-200' },\n { light: 'bg-amber-100 text-amber-900', dark: 'dark:bg-amber-950/55 dark:text-amber-200' },\n { light: 'bg-cyan-100 text-cyan-800', dark: 'dark:bg-cyan-950/55 dark:text-cyan-200' },\n { light: 'bg-indigo-100 text-indigo-800', dark: 'dark:bg-indigo-950/55 dark:text-indigo-200' },\n { light: 'bg-fuchsia-100 text-fuchsia-800', dark: 'dark:bg-fuchsia-950/55 dark:text-fuchsia-200' },\n { light: 'bg-teal-100 text-teal-800', dark: 'dark:bg-teal-950/55 dark:text-teal-200' },\n];\n\nfunction hashSkillNameKey(name: string): number {\n let h = 0;\n for (let i = 0; i < name.length; i += 1) {\n h = (Math.imul(31, h) + name.charCodeAt(i)) | 0;\n }\n return Math.abs(h);\n}\n\n/** First letter or digit (Unicode letters included); skips leading punctuation in slugs. */\nfunction skillInitialLetter(name: string): string {\n const t = name.trim();\n if (!t) return '?';\n const m = t.match(/[\\p{L}\\p{N}]/u);\n if (m) {\n const ch = m[0];\n return ch.toLocaleUpperCase('en-US');\n }\n return t[0];\n}\n\nexport function SkillCardIcon({ name, className }: { name: string; className?: string }) {\n const initial = skillInitialLetter(name);\n const pair = SKILL_INITIAL_PALETTE[hashSkillNameKey(name) % SKILL_INITIAL_PALETTE.length];\n return (\n <div\n className={cn(\n 'flex size-11 shrink-0 items-center justify-center rounded-xl font-semibold tracking-tight shadow-surface',\n 'text-[1.05rem] ring-1 ring-inset ring-black/[0.06] dark:ring-white/[0.1]',\n 'transition-[transform,box-shadow] duration-200 ease-out group-hover:ring-black/[0.1] dark:group-hover:ring-white/[0.14]',\n 'group-hover:-translate-y-px',\n pair.light,\n pair.dark,\n className,\n )}\n aria-hidden\n >\n {initial}\n </div>\n );\n}\n","import { cn } from '@/lib/cn';\n\nexport function SkillEnableSwitch({\n checked,\n onChange,\n}: {\n checked: boolean;\n onChange: (next: boolean) => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n className={cn(\n 'relative h-6 w-10 shrink-0 overflow-hidden rounded-full border border-edge p-0.5',\n 'transition-[border-color,background-color] duration-200 ease-out',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-2 focus-visible:ring-offset-surface-base',\n 'active:scale-[0.97] motion-reduce:transition-none motion-reduce:active:scale-100',\n checked ? 'bg-accent' : 'bg-surface-hover',\n )}\n onClick={() => onChange(!checked)}\n >\n <span\n className={cn(\n 'pointer-events-none absolute left-0.5 top-1/2 block size-4 -translate-y-1/2 rounded-full bg-surface-panel shadow-surface ring-1 ring-edge/40 dark:ring-edge/55',\n 'transition-transform duration-200 ease-out motion-reduce:transition-none',\n checked ? 'translate-x-5' : 'translate-x-0',\n )}\n aria-hidden\n />\n </button>\n );\n}\n\nconst skelBar =\n 'animate-pulse motion-reduce:animate-none rounded-md bg-surface-hover dark:bg-surface-active/50';\n\n/** Matches marketplace skill cards (title row actions + meta). */\nexport function MarketplaceSkillCardSkeleton() {\n return (\n <div\n className=\"flex h-full min-h-[10.5rem] flex-col rounded-xl border border-edge-subtle bg-surface-base p-4 dark:border-edge-subtle\"\n aria-hidden\n >\n <div className=\"flex min-h-0 flex-1 items-start gap-3\">\n <div className={cn('size-11 shrink-0 rounded-xl', skelBar)} />\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className={cn('h-4 min-w-0 flex-1', skelBar)} />\n <div className=\"flex shrink-0 gap-1\">\n <div className={cn('size-8 shrink-0 rounded-lg', skelBar)} />\n <div className={cn('h-8 w-[4.5rem] shrink-0 rounded-lg', skelBar)} />\n </div>\n </div>\n <div className={cn('h-3 w-full', skelBar)} />\n <div className={cn('h-3 w-[92%]', skelBar)} />\n <div className=\"mt-auto space-y-1 pt-0.5\">\n <div className={cn('h-3 w-full', skelBar)} />\n <div className={cn('h-2.5 w-4/5', skelBar)} />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/** Matches built-in / user skill cards (title-row actions, same as marketplace). */\nexport function SkillCatalogCardSkeleton() {\n return <MarketplaceSkillCardSkeleton />;\n}\n","export type MainTab = 'builtin' | 'user' | 'marketplace';\nexport type SourceFilter = 'all' | 'global' | 'workspace' | 'extra';\n\nexport const MAIN_TAB_SET = new Set<MainTab>(['builtin', 'user', 'marketplace']);\nexport const SOURCE_FILTER_SET = new Set<SourceFilter>(['all', 'global', 'workspace', 'extra']);\n\n/** Hash query: which skills marketplace to browse (`store` | `skillhub`). */\nexport const MARKETPLACE_PROVIDER_PARAM = 'mprov';\n\nexport const SKILL_LIST_SKELETON_COUNT = 6;\n\n/** Stable string keys for skeleton placeholders so we don't use array index as key. */\nexport const SKILL_LIST_SKELETON_KEYS = ['s0', 's1', 's2', 's3', 's4', 's5'] as const;\n\n/** Category display order for consistent pill ordering on the built-in tab. */\nexport const BUILTIN_SKILL_CATEGORY_ORDER = [\n 'business',\n 'creative',\n 'documents',\n 'engineering',\n 'tools',\n] as const;\n","import * as DropdownMenu from '@radix-ui/react-dropdown-menu';\nimport { MoreVertical, Trash2 } from 'lucide-react';\n\nimport { SkillCardIcon } from '@/features/skills/skill-card-icon';\nimport { SkillCatalogCardSkeleton, SkillEnableSwitch } from '@/features/skills/skills-page-primitives';\nimport { SKILL_LIST_SKELETON_KEYS } from '@/features/skills/skills-page.constants';\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\n\ntype Props = Pick<\n SkillsPageVm,\n | 'sk'\n | 'mainTab'\n | 'loading'\n | 'catalog'\n | 'filteredCatalog'\n | 'builtinCategories'\n | 'builtinCategoryFilter'\n | 'setBuiltinCategoryFilter'\n | 'categoryFilteredCatalog'\n | 'categoryLabel'\n | 'enabledOverride'\n | 'onSkillToggle'\n | 'sourceLabel'\n | 'openSkillDetail'\n | 'setConfirmOpen'\n | 'setConfirmId'\n>;\n\nexport function SkillsPageCatalogContent(p: Props) {\n const {\n sk,\n mainTab,\n loading,\n catalog,\n filteredCatalog,\n builtinCategories,\n builtinCategoryFilter,\n setBuiltinCategoryFilter,\n categoryFilteredCatalog,\n categoryLabel,\n enabledOverride,\n onSkillToggle,\n sourceLabel,\n openSkillDetail,\n setConfirmOpen,\n setConfirmId,\n } = p;\n\n if (loading) {\n return (\n <div\n className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\"\n aria-busy=\"true\"\n aria-label={sk.loading}\n >\n {SKILL_LIST_SKELETON_KEYS.map((k) => (\n <SkillCatalogCardSkeleton key={k} />\n ))}\n </div>\n );\n }\n if (catalog.length === 0) {\n return (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.empty}\n </div>\n );\n }\n if (filteredCatalog.length === 0) {\n return (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.noSearchResults}\n </div>\n );\n }\n\n return (\n <>\n {builtinCategories.length > 1 ? (\n <div\n role=\"tablist\"\n aria-label={sk.marketplaceCategoriesAria}\n className=\"-mx-1 flex gap-2 overflow-x-auto px-1 pb-1 pt-0.5 [scrollbar-width:thin]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={builtinCategoryFilter === ''}\n className={cn(\n 'shrink-0 rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n builtinCategoryFilter === ''\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n onClick={() => setBuiltinCategoryFilter('')}\n >\n {sk.marketplaceCategoryAll}\n </button>\n {builtinCategories.map((cat) => {\n const selected = builtinCategoryFilter === cat;\n return (\n <button\n key={cat}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n className={cn(\n 'max-w-[14rem] shrink-0 truncate rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n selected\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n title={categoryLabel(cat)}\n onClick={() => setBuiltinCategoryFilter(cat)}\n >\n {categoryLabel(cat)}\n </button>\n );\n })}\n </div>\n ) : null}\n {categoryFilteredCatalog.length === 0 ? (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.noSearchResults}\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {categoryFilteredCatalog.map((row) => (\n <article\n key={`${row.directoryId}-${row.path}`}\n className={cn(\n 'group flex h-full flex-col rounded-xl border border-edge-subtle bg-surface-base p-4',\n 'transition-colors hover:border-accent/40 hover:bg-surface-hover',\n 'dark:border-edge-subtle',\n )}\n >\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'flex min-h-0 flex-1 cursor-pointer flex-col rounded-lg text-left outline-none',\n interaction.focusRingPanel,\n )}\n aria-labelledby={`catalog-skill-title-${row.directoryId}`}\n onClick={(e) => {\n const el = e.target as HTMLElement;\n if (el.closest('button')) return;\n void openSkillDetail(row);\n }}\n onKeyDown={(e) => {\n const el = e.target as HTMLElement;\n if (el.closest('button')) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n void openSkillDetail(row);\n }\n }}\n >\n <div className=\"flex items-start gap-3\">\n <SkillCardIcon name={row.name} />\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <h3\n id={`catalog-skill-title-${row.directoryId}`}\n className=\"min-w-0 flex-1 truncate text-[15px] font-semibold leading-snug tracking-tight text-fg\"\n >\n {row.name}\n </h3>\n <div\n role=\"group\"\n className=\"flex shrink-0 items-center gap-1\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <div className=\"inline-flex shrink-0\">\n <SkillEnableSwitch\n checked={enabledOverride[row.name] ?? row.enabled}\n onChange={(next) => void onSkillToggle(row.name, next)}\n />\n </div>\n {row.managed ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex size-8 shrink-0 items-center justify-center rounded-lg border border-edge bg-surface-panel text-fg-muted',\n 'hover:bg-surface-hover hover:text-fg dark:border-edge',\n interaction.focusRingPanel,\n )}\n aria-label={sk.col.actions}\n >\n <MoreVertical className=\"size-3.5\" strokeWidth={2} aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 min-w-[8rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge\"\n sideOffset={4}\n align=\"end\"\n >\n <DropdownMenu.Item\n className={cn(\n 'flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2 text-sm text-red-600 outline-none',\n 'hover:bg-red-50 data-[highlighted]:bg-red-50 dark:text-red-400 dark:hover:bg-red-950/40',\n )}\n onSelect={() => {\n setConfirmId(row.directoryId);\n setConfirmOpen(true);\n }}\n >\n <Trash2 className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {sk.delete}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n ) : null}\n </div>\n </div>\n <p\n className=\"line-clamp-2 text-sm leading-relaxed text-fg-muted\"\n title={row.description ? row.description : undefined}\n >\n {row.description || '—'}\n </p>\n {mainTab !== 'builtin' || row.managed ? (\n <div className=\"flex flex-wrap gap-1.5 text-[11px] text-fg-subtle\">\n {mainTab !== 'builtin' ? (\n <span className=\"rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50\">\n {sourceLabel(row.source)}\n </span>\n ) : null}\n {row.managed ? (\n <span className=\"rounded-md bg-surface-hover/60 px-2 py-0.5 dark:bg-surface-active/50\">\n {sk.col.managed}: {sk.yes}\n </span>\n ) : null}\n {row.hub ? (\n <span\n className=\"max-w-full break-all rounded-md bg-surface-hover/60 px-2 py-0.5 font-mono text-[10px] leading-snug dark:bg-surface-active/50 line-clamp-2\"\n title={`${row.hub.source}${row.hub.ref ? `\\nref: ${row.hub.ref}` : ''}\\nupdated: ${row.hub.updatedAt}`}\n >\n {sk.hubRemote} ·{' '}\n {row.hub.kind === 'git' ? sk.hubKindGit : sk.hubKindArchive} ·{' '}\n {row.hub.source.length > 48\n ? `${row.hub.source.slice(0, 48)}…`\n : row.hub.source}\n </span>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n </article>\n ))}\n </div>\n )}\n </>\n );\n}\n","import type { SkillCatalogEntry, SkillInstallSpecApi } from '@/features/skills/skill.types';\n\nconst SKILLHUB_PUBLIC_ORIGIN = 'https://skillhub.cn';\nconst CLAWHUB_PUBLIC_ORIGIN = 'https://clawhub.ai';\n\n/**\n * Public SkillHub web URL for a marketplace row `id` (canonical slug, e.g. `self-improving-agent` or `team--skill`).\n * Site shape: `https://skillhub.cn/skills/<slug>`.\n */\nexport function skillHubPublicSkillPageUrl(canonicalSlug: string): string | null {\n const id = canonicalSlug.trim();\n if (!id) return null;\n return `${SKILLHUB_PUBLIC_ORIGIN}/skills/${encodeURIComponent(id)}`;\n}\n\n/**\n * Public ClawHub web URL for a marketplace skill slug.\n * Site shape: `https://clawhub.ai/<owner>/<slug>` — but since we don't have owner in list items,\n * we use the direct slug route which ClawHub resolves.\n */\nexport function clawHubPublicSkillPageUrl(canonicalSlug: string): string | null {\n const id = canonicalSlug.trim();\n if (!id) return null;\n return `${CLAWHUB_PUBLIC_ORIGIN}/${encodeURIComponent(id)}`;\n}\n\n/** Get the public web URL for a skill row based on the active marketplace provider. */\nexport function marketplacePublicSkillUrl(\n provider: string | null,\n slug: string,\n): string | null {\n if (provider === 'skillhub') return skillHubPublicSkillPageUrl(slug);\n if (provider === 'clawhub') return clawHubPublicSkillPageUrl(slug);\n return null;\n}\n\nexport function interpolate(template: string, params: Record<string, string | number>): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => String(params[key] ?? ''));\n}\n\nexport function installSpecSummary(spec: SkillInstallSpecApi): string {\n const parts = [spec.kind];\n if (spec.label?.trim()) parts.push(spec.label.trim());\n if (spec.package?.trim()) parts.push(spec.package.trim());\n if (spec.formula?.trim()) parts.push(spec.formula.trim());\n if (spec.module?.trim()) parts.push(spec.module.trim());\n if (spec.url?.trim()) parts.push(spec.url.trim());\n return parts.join(' · ');\n}\n\nexport function normalizeCatalogEntry(r: SkillCatalogEntry): SkillCatalogEntry {\n return {\n ...r,\n enabled: r.enabled ?? true,\n disableModelInvocation: r.disableModelInvocation ?? false,\n };\n}\n","import * as Dialog from '@radix-ui/react-dialog';\n\nimport { Button } from '@/components/ui/button';\nimport { interpolate } from '@/features/skills/skills-page.utils';\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\n\ntype Props = Pick<\n SkillsPageVm,\n 'sk' | 'confirmOpen' | 'setConfirmOpen' | 'confirmId' | 'setConfirmId' | 'runDelete'\n>;\n\nexport function SkillsPageConfirmDialog({\n sk,\n confirmOpen,\n setConfirmOpen,\n confirmId,\n setConfirmId,\n runDelete,\n}: Props) {\n return (\n <Dialog.Root\n open={confirmOpen}\n onOpenChange={(open) => {\n setConfirmOpen(open);\n if (!open) setConfirmId(null);\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim\" />\n <Dialog.Content className=\"xopc-dialog-content fixed left-1/2 top-1/2 z-[60] w-[min(100%-2rem,24rem)] -translate-x-1/2 -translate-y-1/2 rounded-xl border border-edge bg-surface-panel p-4 shadow-popover dark:border-edge\">\n <Dialog.Title className=\"text-base font-semibold text-fg\">{sk.deleteTitle}</Dialog.Title>\n <p className=\"mt-2 text-sm text-fg-muted\">\n {confirmId ? interpolate(sk.deleteMessage, { id: confirmId }) : ''}\n </p>\n <div className=\"mt-4 flex justify-end gap-2\">\n <Button type=\"button\" variant=\"secondary\" onClick={() => setConfirmOpen(false)}>\n {sk.cancel}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n className=\"bg-red-600 hover:bg-red-700\"\n onClick={() => void runDelete()}\n >\n {sk.deleteConfirm}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import { type ReactNode } from 'react';\n\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport { cn } from '@/lib/cn';\nimport type { SkillMarkdownPreviewPayload } from '@/features/skills/skill.types';\nimport { installSpecSummary } from '@/features/skills/skills-page.utils';\nimport type { MessageBundle } from '@/i18n/messages';\n\nexport type SkillsCopy = MessageBundle['skills'];\n\nfunction MetaRow({ label, children }: { label: string; children: ReactNode }) {\n if (children === null || children === undefined || children === false) return null;\n return (\n <div className=\"mt-3 border-t border-edge-subtle pt-3 dark:border-edge/60\">\n <div className=\"text-xs font-semibold uppercase tracking-wide text-fg-muted\">{label}</div>\n <div className=\"mt-1.5 min-w-0 text-sm text-fg\">{children}</div>\n </div>\n );\n}\n\nexport function SkillCatalogStructuredPreview({\n preview,\n sk,\n}: {\n preview: SkillMarkdownPreviewPayload;\n sk: SkillsCopy;\n}) {\n const meta = preview.metadata;\n const gate = preview.toolConditions;\n const hasToolGating =\n !!gate &&\n (gate.requiresTools.length > 0 ||\n gate.requiresToolsets.length > 0 ||\n gate.fallbackForTools.length > 0 ||\n gate.fallbackForToolsets.length > 0);\n const req = meta.requires;\n const hasRequires =\n req &&\n ((req.bins?.length ?? 0) > 0 || (req.env?.length ?? 0) > 0 || (req.anyBins?.length ?? 0) > 0);\n const installs = meta.install?.filter((s) => s && typeof s.kind === 'string') ?? [];\n const envNames = preview.requiredEnvVarNames?.filter((n) => n.trim()) ?? [];\n\n return (\n <div className=\"space-y-6\">\n <section aria-labelledby=\"skill-detail-summary-heading\">\n <h3\n id=\"skill-detail-summary-heading\"\n className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-fg-muted\"\n >\n {sk.detailSummaryHeading}\n </h3>\n <div className=\"rounded-xl border border-edge bg-surface-base px-4 py-3 dark:bg-surface-hover/25\">\n {meta.emoji?.trim() ? (\n <p className=\"text-2xl leading-none\" aria-hidden>\n {meta.emoji.trim()}\n </p>\n ) : null}\n <p className={cn('text-sm leading-relaxed text-fg', meta.emoji?.trim() ? 'mt-2' : '')}>\n {preview.description}\n </p>\n {preview.disableModelInvocation ? (\n <p className=\"mt-3 rounded-lg border border-amber-200/80 bg-amber-50/90 px-3 py-2 text-xs leading-snug text-amber-950 dark:border-amber-900/50 dark:bg-amber-950/40 dark:text-amber-100\">\n {sk.detailNotInjectedNote}\n </p>\n ) : null}\n <MetaRow label={sk.detailHomepageLabel}>\n {meta.homepage?.trim() ? (\n <a\n href={meta.homepage.trim()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"break-all text-accent underline-offset-2 hover:underline\"\n >\n {meta.homepage.trim()}\n </a>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailPlatformsLabel}>\n {meta.os && meta.os.length > 0 ? (\n <span className=\"font-mono text-xs text-fg-muted\">{meta.os.join(', ')}</span>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailRequiresLabel}>\n {hasRequires && req ? (\n <ul className=\"list-inside list-disc space-y-1 text-sm text-fg-muted\">\n {req.bins && req.bins.length > 0 ? (\n <li>\n <span className=\"text-fg\">{sk.detailRequiresBins}: </span>\n {req.bins.join(', ')}\n </li>\n ) : null}\n {req.env && req.env.length > 0 ? (\n <li>\n <span className=\"text-fg\">{sk.detailRequiresEnv}: </span>\n <span className=\"font-mono text-xs\">{req.env.join(', ')}</span>\n </li>\n ) : null}\n {req.anyBins && req.anyBins.length > 0 ? (\n <li>\n <span className=\"text-fg\">{sk.detailRequiresAnyBins}: </span>\n {req.anyBins.join(', ')}\n </li>\n ) : null}\n </ul>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailInstallLabel}>\n {installs.length > 0 ? (\n <ul className=\"list-inside list-decimal space-y-1.5 text-sm text-fg-muted\">\n {installs.map((spec, i) => (\n <li key={spec.id || `${spec.kind}-${i}`} className=\"[overflow-wrap:anywhere]\">\n <span className=\"text-fg\">{installSpecSummary(spec)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailToolGatingLabel}>\n {hasToolGating && gate ? (\n <ul className=\"mt-1 space-y-2 text-sm text-fg-muted\">\n {gate.requiresTools.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsRequiresList}: </span>\n {gate.requiresTools.join(', ')}\n </li>\n ) : null}\n {gate.requiresToolsets.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsetsRequiresList}: </span>\n {gate.requiresToolsets.join(', ')}\n </li>\n ) : null}\n {gate.fallbackForTools.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsFallbackList}: </span>\n {gate.fallbackForTools.join(', ')}\n </li>\n ) : null}\n {gate.fallbackForToolsets.length > 0 ? (\n <li>\n <span className=\"font-medium text-fg\">{sk.detailToolsetsFallbackList}: </span>\n {gate.fallbackForToolsets.join(', ')}\n </li>\n ) : null}\n </ul>\n ) : null}\n </MetaRow>\n <MetaRow label={sk.detailEnvVarsLabel}>\n {envNames.length > 0 ? (\n <span className=\"font-mono text-xs text-fg-muted\">{envNames.join(', ')}</span>\n ) : null}\n </MetaRow>\n </div>\n </section>\n <section aria-labelledby=\"skill-detail-instructions-heading\">\n <h3\n id=\"skill-detail-instructions-heading\"\n className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-fg-muted\"\n >\n {sk.detailInstructionsHeading}\n </h3>\n {preview.bodyMarkdown.trim() ? (\n <div className=\"markdown-content min-w-0 break-words\">\n <MarkdownView content={preview.bodyMarkdown} />\n </div>\n ) : (\n <p className=\"text-sm italic text-fg-muted\">{sk.detailNoInstructionsBody}</p>\n )}\n </section>\n </div>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { Info, X } from 'lucide-react';\n\nimport { MarkdownView } from '@/components/markdown/markdown-view';\nimport { Button } from '@/components/ui/button';\nimport { SkillCardIcon } from '@/features/skills/skill-card-icon';\nimport { SkillCatalogStructuredPreview } from '@/features/skills/skill-catalog-structured-preview';\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\n\nconst SKELETON_LINE_WIDTHS = [\n { id: 's0', width: 'w-[92%]' },\n { id: 's1', width: 'w-full' },\n { id: 's2', width: 'w-4/5' },\n { id: 's3', width: 'w-[92%]' },\n { id: 's4', width: 'w-full' },\n { id: 's5', width: 'w-4/5' },\n { id: 's6', width: 'w-[92%]' },\n { id: 's7', width: 'w-full' },\n { id: 's8', width: 'w-4/5' },\n { id: 's9', width: 'w-[92%]' },\n] as const;\n\ntype Props = Pick<\n SkillsPageVm,\n | 'sk'\n | 'detailOpen'\n | 'setDetailOpen'\n | 'detailSource'\n | 'setDetailSource'\n | 'detailTitle'\n | 'setDetailTitle'\n | 'detailMarkdown'\n | 'setDetailMarkdown'\n | 'detailCatalogPreview'\n | 'setDetailCatalogPreview'\n | 'detailMarketplacePreview'\n | 'setDetailMarketplacePreview'\n | 'detailLoading'\n | 'detailError'\n | 'setDetailError'\n | 'detailEnabled'\n | 'usingSkillInChatName'\n | 'installingMarketName'\n | 'togglingSkillName'\n | 'isSkillInstalledByName'\n | 'onUseSkillInChat'\n | 'onMarketInstall'\n | 'onSkillToggle'\n>;\n\nexport function SkillsPageDetailDialog(p: Props) {\n const {\n sk,\n detailOpen,\n setDetailOpen,\n detailSource,\n setDetailSource,\n detailTitle,\n setDetailTitle,\n detailMarkdown,\n setDetailMarkdown,\n detailCatalogPreview,\n setDetailCatalogPreview,\n detailMarketplacePreview,\n setDetailMarketplacePreview,\n detailLoading,\n detailError,\n setDetailError,\n detailEnabled,\n usingSkillInChatName,\n installingMarketName,\n togglingSkillName,\n isSkillInstalledByName,\n onUseSkillInChat,\n onMarketInstall,\n onSkillToggle,\n } = p;\n\n return (\n <Dialog.Root\n open={detailOpen}\n onOpenChange={(open) => {\n setDetailOpen(open);\n if (!open) {\n setDetailSource('catalog');\n setDetailMarkdown('');\n setDetailCatalogPreview(null);\n setDetailMarketplacePreview(null);\n setDetailError(null);\n setDetailTitle('');\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim\" />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 z-[60] flex h-[min(88vh,44rem)] max-h-[min(92vh,56rem)] w-[min(100%-2rem,min(92vw,56rem))]',\n '-translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-2xl border border-edge bg-surface-panel shadow-float dark:border-edge',\n )}\n >\n <div className=\"group flex min-h-[3.25rem] shrink-0 items-center gap-3 border-b border-edge px-4 py-3\">\n <SkillCardIcon name={detailTitle || '?'} />\n <Dialog.Title className=\"min-w-0 flex-1 truncate text-base font-semibold text-fg\">\n {detailTitle || '—'}\n </Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className={cn(\n 'rounded-lg p-1.5 text-fg-muted hover:bg-surface-hover hover:text-fg',\n interaction.focusRingPanel,\n )}\n aria-label={sk.detailCloseAria}\n >\n <X className=\"size-5\" strokeWidth={1.75} aria-hidden />\n </button>\n </Dialog.Close>\n </div>\n <div className=\"flex min-h-[3.25rem] shrink-0 items-start gap-2 border-b border-blue-200/80 bg-blue-50/95 px-4 py-2.5 text-sm text-fg dark:border-blue-900/50 dark:bg-blue-950/45\">\n <Info className=\"mt-0.5 size-4 shrink-0 text-blue-600 dark:text-blue-400\" strokeWidth={1.75} aria-hidden />\n <p className=\"min-w-0 leading-relaxed\">\n {detailSource === 'store' && detailMarketplacePreview\n ? sk.detailModalBanner\n : detailSource === 'store'\n ? sk.detailModalBannerStore\n : sk.detailModalBanner}\n </p>\n </div>\n <div className=\"min-h-0 min-w-0 flex-1 overflow-auto p-4\">\n {detailLoading ? (\n <div className=\"flex h-full min-h-[14rem] flex-col gap-2.5 py-1\" aria-busy=\"true\" aria-label={sk.loading}>\n {SKELETON_LINE_WIDTHS.map((entry) => (\n <div\n key={entry.id}\n className={cn(\n 'h-4 animate-pulse rounded-md bg-surface-hover dark:bg-surface-active/50',\n entry.width,\n )}\n />\n ))}\n </div>\n ) : detailError ? (\n <p className=\"text-sm text-red-600 dark:text-red-400\">{detailError}</p>\n ) : detailSource === 'catalog' && detailCatalogPreview ? (\n <SkillCatalogStructuredPreview preview={detailCatalogPreview} sk={sk} />\n ) : detailSource === 'store' && detailMarketplacePreview ? (\n <SkillCatalogStructuredPreview preview={detailMarketplacePreview} sk={sk} />\n ) : (\n <div className=\"markdown-content min-w-0 break-words\">\n <MarkdownView content={detailMarkdown} />\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 justify-end gap-2 border-t border-edge px-4 py-3\">\n {detailSource === 'store' ? (\n <>\n <Button type=\"button\" variant=\"ghost\" onClick={() => setDetailOpen(false)}>\n {sk.cancel}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={\n !detailTitle ||\n detailLoading ||\n usingSkillInChatName === detailTitle ||\n installingMarketName === detailTitle\n }\n onClick={() => void onUseSkillInChat()}\n >\n {usingSkillInChatName === detailTitle ? sk.previewUseInChatBusy : sk.previewUseInChat}\n </Button>\n <Button\n type=\"button\"\n variant={isSkillInstalledByName(detailTitle) ? 'secondary' : 'primary'}\n disabled={!detailTitle || installingMarketName === detailTitle}\n onClick={() => {\n if (!detailTitle) return;\n void onMarketInstall(detailTitle, { useDetailProvider: true });\n }}\n >\n {installingMarketName === detailTitle\n ? sk.uploading\n : isSkillInstalledByName(detailTitle)\n ? sk.marketplaceReinstall\n : sk.marketplaceInstall}\n </Button>\n </>\n ) : (\n <>\n <Button\n type=\"button\"\n variant=\"secondary\"\n disabled={\n !detailTitle ||\n detailLoading ||\n usingSkillInChatName === detailTitle ||\n togglingSkillName === detailTitle\n }\n onClick={() => void onUseSkillInChat()}\n >\n {usingSkillInChatName === detailTitle ? sk.previewUseInChatBusy : sk.previewUseInChat}\n </Button>\n <Button\n type=\"button\"\n variant=\"primary\"\n disabled={!detailTitle || togglingSkillName === detailTitle}\n onClick={async () => {\n if (!detailTitle) return;\n const ok = await onSkillToggle(detailTitle, !detailEnabled);\n if (ok) setDetailOpen(false);\n }}\n >\n {detailEnabled ? sk.detailModalDisable : sk.detailModalEnable}\n </Button>\n </>\n )}\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import * as Dialog from '@radix-ui/react-dialog';\nimport { FileArchive, X } from 'lucide-react';\n\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\n\ntype Props = Pick<\n SkillsPageVm,\n | 'sk'\n | 'installOpen'\n | 'setInstallOpen'\n | 'pendingFile'\n | 'setPendingFile'\n | 'dropActive'\n | 'setDropActive'\n | 'uploading'\n | 'onModalDragOver'\n | 'onModalDragLeave'\n | 'onModalDrop'\n | 'onFileInputChange'\n | 'onInstallSubmit'\n>;\n\nexport function SkillsPageInstallDialog(p: Props) {\n const {\n sk,\n installOpen,\n setInstallOpen,\n pendingFile,\n setPendingFile,\n dropActive,\n setDropActive,\n uploading,\n onModalDragOver,\n onModalDragLeave,\n onModalDrop,\n onFileInputChange,\n onInstallSubmit,\n } = p;\n\n return (\n <Dialog.Root\n open={installOpen}\n onOpenChange={(open) => {\n setInstallOpen(open);\n if (!open) {\n setPendingFile(null);\n setDropActive(false);\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay className=\"xopc-dialog-overlay fixed inset-0 z-[60] bg-scrim\" />\n <Dialog.Content\n className={cn(\n 'xopc-dialog-content fixed left-1/2 top-1/2 z-[60] max-h-[min(100vh-2rem,44rem)] w-[min(100%-2rem,min(92vw,48rem))] -translate-x-1/2 -translate-y-1/2 overflow-y-auto',\n 'rounded-2xl border border-edge bg-surface-panel p-6 shadow-float dark:border-edge',\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <Dialog.Title className=\"text-base font-semibold text-fg\">{sk.installModalTitle}</Dialog.Title>\n <Dialog.Close asChild>\n <button\n type=\"button\"\n className={cn(\n 'rounded-lg p-1.5 text-fg-muted hover:bg-surface-hover hover:text-fg',\n interaction.focusRingPanel,\n )}\n aria-label={sk.installClose}\n >\n <X className=\"size-5\" strokeWidth={1.75} aria-hidden />\n <span className=\"sr-only\">{sk.installClose}</span>\n </button>\n </Dialog.Close>\n </div>\n\n <label\n className={cn(\n 'mt-4 flex min-h-[11rem] cursor-pointer flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed px-6 py-12 text-center transition-colors',\n dropActive\n ? 'border-accent bg-accent-soft/60 dark:bg-blue-950/40'\n : 'border-edge bg-surface-base dark:bg-surface-hover/30',\n )}\n onDragLeave={onModalDragLeave}\n onDragOver={onModalDragOver}\n onDrop={onModalDrop}\n >\n <input\n type=\"file\"\n accept=\".zip,.md,application/zip,text/markdown\"\n className=\"sr-only\"\n aria-label={sk.installModalDropHint}\n disabled={uploading}\n onChange={onFileInputChange}\n />\n <FileArchive className=\"size-12 text-fg-subtle\" strokeWidth={1.25} aria-hidden />\n <span className=\"text-sm text-fg-muted\">{sk.installModalDropHint}</span>\n {pendingFile ? <span className=\"text-xs font-medium text-fg\">{pendingFile.name}</span> : null}\n </label>\n\n <div className=\"mt-5 space-y-2\">\n <p className=\"text-sm font-medium text-fg\">{sk.installModalReqTitle}</p>\n <ul className=\"list-inside list-disc space-y-1 text-sm text-fg-muted\">\n <li>{sk.installModalReq1}</li>\n <li>{sk.installModalReq2}</li>\n </ul>\n </div>\n\n <button\n type=\"button\"\n disabled={!pendingFile || uploading}\n className={cn(\n 'mt-6 flex w-full items-center justify-center rounded-xl py-3 text-sm font-semibold',\n 'transition-colors',\n !pendingFile || uploading\n ? 'cursor-not-allowed bg-surface-active text-fg-disabled'\n : 'bg-accent text-white hover:bg-accent-hover',\n interaction.focusRingPanel,\n )}\n onClick={() => void onInstallSubmit()}\n >\n {uploading ? sk.uploading : sk.installAction}\n </button>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n","import { ChevronLeft, ChevronRight, ExternalLink, Loader2, Star } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport { SkillCardIcon } from '@/features/skills/skill-card-icon';\nimport { MarketplaceSkillCardSkeleton } from '@/features/skills/skills-page-primitives';\nimport { SKILL_LIST_SKELETON_KEYS } from '@/features/skills/skills-page.constants';\nimport { interpolate, marketplacePublicSkillUrl } from '@/features/skills/skills-page.utils';\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\n\ntype Props = Pick<\n SkillsPageVm,\n | 'sk'\n | 'mpCategories'\n | 'mpCategoriesLoading'\n | 'mpCategoriesError'\n | 'mpPayload'\n | 'mpLoading'\n | 'mpError'\n | 'marketCategoryId'\n | 'setMarketCategoryId'\n | 'marketBrowseProvider'\n | 'marketPage'\n | 'setMarketPage'\n | 'installingMarketName'\n | 'isSkillInstalledByName'\n | 'onMarketInstall'\n | 'openMarketplaceDetail'\n>;\n\nexport function SkillsPageMarketplaceContent(p: Props) {\n const {\n sk,\n mpCategories,\n mpCategoriesLoading,\n mpCategoriesError,\n mpPayload,\n mpLoading,\n mpError,\n marketCategoryId,\n setMarketCategoryId,\n marketBrowseProvider,\n marketPage,\n setMarketPage,\n installingMarketName,\n isSkillInstalledByName,\n onMarketInstall,\n openMarketplaceDetail,\n } = p;\n\n return (\n <>\n <div\n className={cn(\n '-mx-1 flex min-h-[2.75rem] items-center gap-2 overflow-x-auto px-1 pb-1 pt-0.5 [scrollbar-width:thin]',\n !mpCategoriesLoading && mpCategories.length === 0 && 'min-h-0 pb-0 pt-0',\n )}\n role={mpCategories.length > 0 || mpCategoriesLoading ? 'tablist' : undefined}\n aria-label={mpCategories.length > 0 || mpCategoriesLoading ? sk.marketplaceCategoriesAria : undefined}\n >\n {mpCategories.length > 0 ? (\n <>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={marketCategoryId === ''}\n className={cn(\n 'shrink-0 rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n marketCategoryId === ''\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n onClick={() => setMarketCategoryId('')}\n >\n {sk.marketplaceCategoryAll}\n </button>\n {mpCategories.map((c) => {\n const selected = marketCategoryId === c.id;\n return (\n <button\n key={c.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n className={cn(\n 'max-w-[14rem] shrink-0 truncate rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n selected\n ? 'border-fg bg-fg text-surface-panel dark:border-fg dark:bg-fg dark:text-surface-base'\n : 'border-edge bg-surface-panel text-fg-muted hover:border-edge-strong hover:text-fg dark:border-edge dark:bg-surface-hover/40',\n )}\n title={c.label}\n onClick={() => setMarketCategoryId(c.id)}\n >\n {c.label}\n </button>\n );\n })}\n </>\n ) : mpCategoriesLoading ? (\n <div className=\"flex gap-2 px-1\" aria-hidden>\n {(['p0', 'p1', 'p2', 'p3', 'p4'] as const).map((k) => (\n <div\n key={k}\n className=\"h-8 w-[4.5rem] shrink-0 animate-pulse rounded-full bg-surface-hover motion-reduce:animate-none dark:bg-surface-active/50\"\n />\n ))}\n </div>\n ) : null}\n </div>\n {mpCategoriesError ? (\n <p className=\"text-xs text-red-600 dark:text-red-400\" role=\"alert\">\n {mpCategoriesError}\n </p>\n ) : null}\n {!mpPayload && !mpError ? (\n <div\n className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\"\n aria-busy=\"true\"\n aria-label={sk.loading}\n >\n {SKILL_LIST_SKELETON_KEYS.map((k) => (\n <MarketplaceSkillCardSkeleton key={k} />\n ))}\n </div>\n ) : mpError && !mpPayload ? (\n <div\n className=\"rounded-xl border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300\"\n role=\"alert\"\n >\n {mpError}\n </div>\n ) : mpPayload ? (\n <div className=\"relative\">\n {mpLoading ? (\n <div\n className=\"pointer-events-none absolute inset-0 z-[1] flex justify-center bg-surface-panel/40 pt-[min(28vh,7.5rem)] backdrop-blur-[1px] motion-reduce:backdrop-blur-none dark:bg-surface-base/35\"\n aria-busy=\"true\"\n aria-label={sk.loading}\n >\n <Loader2\n className=\"size-8 shrink-0 animate-spin text-accent motion-reduce:animate-none\"\n strokeWidth={2}\n aria-hidden\n />\n </div>\n ) : null}\n {mpPayload.items.length === 0 ? (\n <div className=\"rounded-2xl border border-dashed border-edge py-16 text-center text-sm text-fg-muted\">\n {sk.marketplaceEmpty}\n </div>\n ) : (\n <div\n className={cn(\n 'grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3',\n mpLoading && 'pointer-events-none opacity-[0.52] motion-reduce:opacity-100',\n )}\n >\n {mpPayload.items.map((row) => {\n const installed = isSkillInstalledByName(row.id);\n const busy = installingMarketName === row.id;\n const externalPageUrl = marketplacePublicSkillUrl(marketBrowseProvider, row.id);\n return (\n <article\n key={row.id}\n className={cn(\n 'group flex h-full flex-col rounded-xl border border-edge-subtle bg-surface-base p-4',\n 'transition-colors hover:border-accent/40 hover:bg-surface-hover',\n 'dark:border-edge-subtle',\n )}\n >\n <div\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'flex min-h-0 flex-1 cursor-pointer flex-col rounded-lg text-left outline-none',\n interaction.focusRingPanel,\n )}\n aria-labelledby={`mp-skill-title-${row.id}`}\n onClick={(e) => {\n const el = e.target as HTMLElement;\n if (el.closest('a[href]') || el.closest('button')) return;\n void openMarketplaceDetail(row.id, row.name);\n }}\n onKeyDown={(e) => {\n const el = e.target as HTMLElement;\n if (el.closest('a[href]') || el.closest('button')) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n void openMarketplaceDetail(row.id, row.name);\n }\n }}\n >\n <div className=\"flex items-start gap-3\">\n <SkillCardIcon name={row.id} />\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <h3\n id={`mp-skill-title-${row.id}`}\n className=\"min-w-0 flex-1 truncate text-[15px] font-semibold leading-snug tracking-tight text-fg\"\n >\n {row.name}\n </h3>\n <div className=\"flex shrink-0 items-center gap-1\">\n {externalPageUrl ? (\n <a\n href={externalPageUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'inline-flex size-8 shrink-0 items-center justify-center rounded-lg border border-edge bg-surface-panel text-fg-muted',\n 'hover:bg-surface-hover hover:text-fg dark:border-edge',\n interaction.focusRingPanel,\n )}\n aria-label={sk.marketplaceOpenExternalAria}\n title={sk.marketplaceOpenExternal}\n >\n <ExternalLink className=\"size-3.5\" strokeWidth={2} aria-hidden />\n </a>\n ) : null}\n <div\n role=\"group\"\n className=\"inline-flex shrink-0\"\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"h-8 shrink-0 whitespace-nowrap px-2.5 text-xs font-medium\"\n disabled={busy || mpLoading}\n onClick={() => void onMarketInstall(row.id)}\n >\n {busy\n ? sk.uploading\n : installed\n ? sk.marketplaceReinstall\n : sk.marketplaceInstall}\n </Button>\n </div>\n </div>\n </div>\n <p\n className=\"line-clamp-2 text-sm leading-relaxed text-fg-muted\"\n title={row.description ? row.description : undefined}\n >\n {row.description || '—'}\n </p>\n <div className=\"mt-auto min-h-[2.625rem] space-y-1 text-[11px] leading-snug text-fg-muted\">\n <p\n className=\"line-clamp-1\"\n title={`${sk.marketplaceAuthor}: ${row.author.username} · ${sk.marketplaceDownloads}: ${row.downloads}${\n row.stars != null && row.stars > 0 ? ` · ★${row.stars}` : ''\n }${installed ? ` · ${sk.marketplaceInstalled}` : ''}`}\n >\n <span className=\"text-fg-subtle\">{sk.marketplaceAuthor}</span>{' '}\n <span className=\"text-fg\">{row.author.username}</span>\n <span className=\"text-fg-subtle\"> · </span>\n <span>\n {sk.marketplaceDownloads}: {row.downloads}\n </span>\n {row.stars != null && row.stars > 0 ? (\n <>\n <span className=\"text-fg-subtle\"> · </span>\n <span className=\"inline-flex items-center gap-0.5 text-fg-muted\">\n <Star\n className=\"size-3 shrink-0 text-amber-600 dark:text-amber-400\"\n strokeWidth={2}\n aria-hidden\n />\n {row.stars}\n </span>\n </>\n ) : null}\n {installed ? (\n <>\n <span className=\"text-fg-subtle\"> · </span>\n <span className=\"text-emerald-700 dark:text-emerald-400\">\n {sk.marketplaceInstalled}\n </span>\n </>\n ) : null}\n </p>\n <p\n className=\"line-clamp-1 min-h-[1.125rem] font-mono text-[10px] text-fg-subtle\"\n title={\n [\n row.latestVersion ? `${sk.marketplaceVersion}: ${row.latestVersion}` : '',\n row.sourceLabel ? `${sk.marketplaceSource}: ${row.sourceLabel}` : '',\n ]\n .filter(Boolean)\n .join(' · ') || undefined\n }\n >\n {row.latestVersion ? (\n <>\n {sk.marketplaceVersion}: {row.latestVersion}\n </>\n ) : null}\n {row.latestVersion && row.sourceLabel ? (\n <span className=\"text-fg-subtle\"> · </span>\n ) : null}\n {row.sourceLabel ? (\n <>\n {sk.marketplaceSource}: {row.sourceLabel}\n </>\n ) : null}\n </p>\n </div>\n </div>\n </div>\n </div>\n </article>\n );\n })}\n </div>\n )}\n {mpPayload.items.length > 0 ? (\n <div className=\"mt-3 flex flex-col items-center justify-between gap-3 sm:flex-row\">\n <p className=\"text-center text-xs text-fg-muted sm:text-left\">\n {interpolate(sk.marketplacePageStatus, {\n page: mpPayload.meta.page,\n totalPages: mpPayload.meta.totalPages,\n total: mpPayload.meta.total,\n })}\n </p>\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-9 gap-1 px-2\"\n disabled={mpLoading || marketPage <= 1}\n aria-label={sk.marketplacePagePrev}\n onClick={() => setMarketPage((pg) => Math.max(1, pg - 1))}\n >\n <ChevronLeft className=\"size-4\" strokeWidth={1.75} aria-hidden />\n <span className=\"sr-only sm:not-sr-only\">{sk.marketplacePagePrev}</span>\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"h-9 gap-1 px-2\"\n disabled={mpLoading || marketPage >= mpPayload.meta.totalPages}\n aria-label={sk.marketplacePageNext}\n onClick={() => setMarketPage((pg) => Math.min(mpPayload.meta.totalPages, pg + 1))}\n >\n <span className=\"sr-only sm:not-sr-only\">{sk.marketplacePageNext}</span>\n <ChevronRight className=\"size-4\" strokeWidth={1.75} aria-hidden />\n </Button>\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n </>\n );\n}\n","import * as DropdownMenu from '@radix-ui/react-dropdown-menu';\nimport { ChevronDown, Funnel } from 'lucide-react';\nimport { useLayoutEffect, useMemo } from 'react';\n\nimport { SkillsPageHeaderEnd } from '@/features/skills/skills-page-header-end';\nimport { SkillsPageCatalogContent } from '@/features/skills/skills-page-catalog-content';\nimport { SkillsPageConfirmDialog } from '@/features/skills/skills-page-confirm-dialog';\nimport { SkillsPageDetailDialog } from '@/features/skills/skills-page-detail-dialog';\nimport { SkillsPageInstallDialog } from '@/features/skills/skills-page-install-dialog';\nimport { SkillsPageMarketplaceContent } from '@/features/skills/skills-page-marketplace-content';\nimport type { SkillsPageVm } from '@/features/skills/use-skills-page';\nimport { cn } from '@/lib/cn';\nimport { interaction } from '@/lib/interaction';\nimport { usePageHeaderStore } from '@/stores/page-header-store';\n\nexport function SkillsPageView({ vm }: { vm: SkillsPageVm }) {\n const {\n sk,\n hasToken,\n error,\n searchQuery,\n setSearchQuery,\n actionFeedback,\n mainTab,\n setMainTab,\n setSourceFilter,\n loading,\n onReloadClick,\n setPendingFile,\n setInstallOpen,\n builtinTabStats,\n userTabStats,\n marketSort,\n setMarketSort,\n marketBrowseProvider,\n setMarketBrowseProvider,\n registeredProviders,\n filterLabel,\n inSettingsShell,\n } = vm;\n\n const setPageHeader = usePageHeaderStore((s) => s.setPageHeader);\n const clearPageHeader = usePageHeaderStore((s) => s.clearPageHeader);\n\n const skillsHeaderEnd = useMemo(\n () => (\n <SkillsPageHeaderEnd\n loading={loading}\n onReloadClick={onReloadClick}\n searchQuery={searchQuery}\n setSearchQuery={setSearchQuery}\n mainTab={mainTab}\n sk={sk}\n setPendingFile={setPendingFile}\n setInstallOpen={setInstallOpen}\n />\n ),\n [loading, onReloadClick, searchQuery, setSearchQuery, mainTab, sk, setPendingFile, setInstallOpen],\n );\n\n useLayoutEffect(() => {\n if (!hasToken || inSettingsShell) {\n clearPageHeader();\n return () => clearPageHeader();\n }\n setPageHeader({\n startExtra: null,\n main: null,\n end: skillsHeaderEnd,\n });\n return () => clearPageHeader();\n }, [clearPageHeader, hasToken, inSettingsShell, setPageHeader, skillsHeaderEnd]);\n\n if (!hasToken) {\n return (\n <div className=\"mx-auto w-full max-w-app-main px-4 py-16 text-center text-sm text-fg-muted sm:px-8\">\n {sk.needToken}\n </div>\n );\n }\n\n return (\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col bg-surface-panel\">\n <div className=\"mx-auto flex w-full max-w-app-main flex-col gap-6 px-4 py-6 sm:px-8\">\n {actionFeedback ? (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n 'rounded-xl border px-3 py-2 text-sm',\n actionFeedback.kind === 'success'\n ? 'border-emerald-200 bg-emerald-50 text-emerald-800 dark:border-emerald-900/40 dark:bg-emerald-950/40 dark:text-emerald-200'\n : 'border-red-200 bg-red-50 text-red-800 dark:border-red-900/50 dark:bg-red-950/40 dark:text-red-200',\n )}\n >\n {actionFeedback.message}\n </div>\n ) : error ? (\n <div\n className=\"rounded-xl border border-edge bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-edge dark:bg-red-950/40 dark:text-red-300\"\n role=\"alert\"\n >\n {error}\n </div>\n ) : null}\n\n <header className=\"flex flex-col gap-4\">\n <div className=\"min-w-0\">\n <h1 className=\"text-xl font-semibold tracking-tight text-fg\">{sk.title}</h1>\n <p className=\"mt-1 max-w-2xl text-sm text-fg-muted\">{sk.tagline}</p>\n </div>\n </header>\n\n {inSettingsShell ? (\n <div className=\"flex flex-col gap-3 border-b border-edge-subtle pb-4 dark:border-edge-subtle sm:flex-row sm:flex-wrap sm:items-center sm:justify-end\">\n {skillsHeaderEnd}\n </div>\n ) : null}\n\n <section className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-3 border-b border-edge-subtle pb-3 sm:flex-row sm:items-center sm:justify-between dark:border-edge-subtle\">\n <div className=\"flex flex-wrap gap-x-1 gap-y-1\" role=\"tablist\" aria-label={sk.skillsNavAria}>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'marketplace'}\n className={cn(\n 'relative max-w-full rounded-md px-3 py-2 text-left text-sm font-medium transition-colors sm:text-center',\n mainTab === 'marketplace' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'marketplace' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('marketplace')}\n >\n {sk.tabMarketplace}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'builtin'}\n className={cn(\n 'relative rounded-md px-3 py-2 text-sm font-medium transition-colors',\n mainTab === 'builtin' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'builtin' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('builtin')}\n >\n {sk.tabBuiltin}\n <span className=\"ml-1 tabular-nums text-fg-muted\">\n ({builtinTabStats.enabled}/{builtinTabStats.total})\n </span>\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mainTab === 'user'}\n className={cn(\n 'relative rounded-md px-3 py-2 text-sm font-medium transition-colors',\n mainTab === 'user' ? 'text-fg' : 'text-fg-muted hover:text-fg',\n mainTab === 'user' &&\n 'after:absolute after:bottom-0 after:left-1/2 after:h-0.5 after:w-9 after:-translate-x-1/2 after:rounded-full after:bg-accent',\n )}\n onClick={() => setMainTab('user')}\n >\n {sk.tabUser}\n <span className=\"ml-1 tabular-nums text-fg-muted\">\n ({userTabStats.enabled}/{userTabStats.total})\n </span>\n </button>\n </div>\n <div\n className={cn(\n 'flex min-h-9 min-w-0 items-center gap-2',\n mainTab === 'user'\n ? 'flex-nowrap overflow-x-auto pb-0.5 sm:justify-end'\n : 'flex-wrap sm:justify-end',\n )}\n >\n {mainTab === 'user' ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-9 min-h-9 min-w-[9rem] shrink-0 items-center gap-1.5 rounded-lg border border-edge bg-surface-panel px-2.5 text-xs font-medium text-fg shadow-surface',\n interaction.transition,\n interaction.focusRingPanel,\n )}\n >\n <Funnel className=\"size-3.5 text-fg-muted\" strokeWidth={1.75} aria-hidden />\n <span>{filterLabel}</span>\n <ChevronDown className=\"size-3.5 text-fg-subtle\" strokeWidth={1.75} aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 min-w-[10rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge\"\n sideOffset={6}\n align=\"end\"\n >\n {(['all', 'global', 'workspace', 'extra'] as const).map((key) => (\n <DropdownMenu.Item\n key={key}\n className={cn(\n 'cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none',\n 'hover:bg-surface-hover data-[highlighted]:bg-surface-hover',\n )}\n onSelect={() => setSourceFilter(key)}\n >\n {key === 'all'\n ? sk.filterAll\n : key === 'global'\n ? sk.filterGlobal\n : key === 'workspace'\n ? sk.filterWorkspace\n : sk.filterExtra}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n ) : null}\n {mainTab === 'marketplace' ? (\n <>\n <div\n className=\"inline-flex h-9 shrink-0 rounded-lg border border-edge bg-surface-panel p-0.5 shadow-surface\"\n role=\"group\"\n aria-label={sk.marketplaceBrowseSwitchAria}\n >\n {registeredProviders.map((p) => {\n const selected = marketBrowseProvider === p.id;\n return (\n <button\n key={p.id}\n type=\"button\"\n className={cn(\n 'rounded-md px-2.5 py-1.5 text-xs font-medium transition-colors',\n interaction.focusRingPanel,\n selected\n ? 'bg-fg text-surface-panel dark:bg-fg dark:text-surface-base'\n : 'text-fg-muted hover:text-fg',\n )}\n aria-pressed={selected}\n onClick={() => setMarketBrowseProvider(p.id)}\n >\n {p.displayName}\n </button>\n );\n })}\n </div>\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'inline-flex h-9 min-h-9 min-w-[9rem] shrink-0 items-center gap-1.5 rounded-lg border border-edge bg-surface-panel px-2.5 text-xs font-medium text-fg shadow-surface',\n interaction.transition,\n interaction.focusRingPanel,\n )}\n >\n <Funnel className=\"size-3.5 text-fg-muted\" strokeWidth={1.75} aria-hidden />\n <span>\n {marketSort === 'newest' ? sk.marketplaceSortNewest : sk.marketplaceSortDownloads}\n </span>\n <ChevronDown className=\"size-3.5 text-fg-subtle\" strokeWidth={1.75} aria-hidden />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 min-w-[10rem] rounded-xl border border-edge bg-surface-panel p-1 shadow-popover dark:border-edge\"\n sideOffset={6}\n align=\"end\"\n >\n <DropdownMenu.Item\n className={cn(\n 'cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none',\n 'hover:bg-surface-hover data-[highlighted]:bg-surface-hover',\n )}\n onSelect={() => setMarketSort('downloads')}\n >\n {sk.marketplaceSortDownloads}\n </DropdownMenu.Item>\n <DropdownMenu.Item\n className={cn(\n 'cursor-pointer rounded-lg px-3 py-2 text-sm text-fg outline-none',\n 'hover:bg-surface-hover data-[highlighted]:bg-surface-hover',\n )}\n onSelect={() => setMarketSort('newest')}\n >\n {sk.marketplaceSortNewest}\n </DropdownMenu.Item>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </>\n ) : null}\n {mainTab === 'builtin' ? <div className=\"h-9 min-w-[9rem] shrink-0\" aria-hidden /> : null}\n </div>\n </div>\n\n {mainTab === 'marketplace' ? (\n <SkillsPageMarketplaceContent {...vm} />\n ) : (\n <SkillsPageCatalogContent {...vm} />\n )}\n </section>\n </div>\n\n <SkillsPageDetailDialog {...vm} />\n <SkillsPageInstallDialog {...vm} />\n <SkillsPageConfirmDialog {...vm} />\n </div>\n );\n}\n","export async function fileToZipUpload(file: File): Promise<File> {\n const lower = file.name.toLowerCase();\n if (lower.endsWith('.zip')) return file;\n if (lower.endsWith('skill.md')) {\n const JSZip = (await import('jszip')).default;\n const zip = new JSZip();\n zip.file('SKILL.md', await file.arrayBuffer());\n const blob = await zip.generateAsync({ type: 'blob', compression: 'DEFLATE' });\n const base = file.name.replace(/\\.md$/i, '').replace(/\\s+/g, '-') || 'skill';\n return new File([blob], `${base}.zip`, { type: 'application/zip' });\n }\n throw new Error('invalid');\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type DragEvent,\n} from 'react';\nimport { useLocation, useNavigate, useSearchParams } from 'react-router-dom';\n\nimport {\n deleteSkill,\n getMarketplaceCategories,\n getMarketplacePackageDetail,\n getMarketplaceProvider,\n getMarketplaceProviders,\n getMarketplaceSkills,\n getSkillMarkdown,\n getSkills,\n installMarketplaceSkill,\n patchSkillEnabled,\n reloadSkills,\n uploadSkillZip,\n} from '@/features/skills/skill-api';\nimport type {\n MarketplaceCategoryItem,\n MarketplacePackageItem,\n MarketplaceProviderInfo,\n SkillCatalogEntry,\n SkillMarkdownPreviewPayload,\n} from '@/features/skills/skill.types';\nimport { fileToZipUpload } from '@/features/skills/skill-upload-zip';\nimport {\n BUILTIN_SKILL_CATEGORY_ORDER,\n MAIN_TAB_SET,\n MARKETPLACE_PROVIDER_PARAM,\n SOURCE_FILTER_SET,\n type MainTab,\n type SourceFilter,\n} from '@/features/skills/skills-page.constants';\nimport { normalizeCatalogEntry } from '@/features/skills/skills-page.utils';\nimport { messages } from '@/i18n/messages';\nimport { useGatewayStore } from '@/stores/gateway-store';\nimport { useLocaleStore } from '@/stores/locale-store';\n\nexport function useSkillsPage() {\n const language = useLocaleStore((s) => s.language);\n const m = messages(language);\n const sk = m.skills;\n const token = useGatewayStore((st) => st.token);\n const hasToken = Boolean(token);\n const navigate = useNavigate();\n const [searchParams, setSearchParams] = useSearchParams();\n\n const mprovRaw = searchParams.get(MARKETPLACE_PROVIDER_PARAM);\n // Accept any non-empty provider id from URL — validity checked by the backend registry.\n const urlMarketProvider = mprovRaw?.trim() || null;\n\n const [catalog, setCatalog] = useState<SkillCatalogEntry[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [uploading, setUploading] = useState(false);\n const initialSearch = searchParams.get('q') ?? '';\n const initialTabRaw = searchParams.get('tab');\n const initialSourceRaw = searchParams.get('source');\n const initialTab: MainTab = MAIN_TAB_SET.has(initialTabRaw as MainTab)\n ? (initialTabRaw as MainTab)\n : 'marketplace';\n const initialSourceFilter: SourceFilter = SOURCE_FILTER_SET.has(initialSourceRaw as SourceFilter)\n ? (initialSourceRaw as SourceFilter)\n : 'all';\n\n const [searchQuery, setSearchQuery] = useState(initialSearch);\n const [actionFeedback, setActionFeedback] = useState<{\n kind: 'success' | 'error';\n message: string;\n } | null>(null);\n\n const [mainTab, setMainTab] = useState<MainTab>(initialTab);\n const [sourceFilter, setSourceFilter] = useState<SourceFilter>(initialSourceFilter);\n const [builtinCategoryFilter, setBuiltinCategoryFilter] = useState('');\n\n const [installOpen, setInstallOpen] = useState(false);\n const [pendingFile, setPendingFile] = useState<File | null>(null);\n const [dropActive, setDropActive] = useState(false);\n\n const [confirmOpen, setConfirmOpen] = useState(false);\n const [confirmId, setConfirmId] = useState<string | null>(null);\n const [togglingSkillName, setTogglingSkillName] = useState<string | null>(null);\n const [enabledOverride, setEnabledOverride] = useState<Record<string, boolean>>({});\n\n const [detailOpen, setDetailOpen] = useState(false);\n const [detailSource, setDetailSource] = useState<'catalog' | 'store'>('catalog');\n const [detailTitle, setDetailTitle] = useState('');\n const [detailMarkdown, setDetailMarkdown] = useState('');\n const [detailCatalogPreview, setDetailCatalogPreview] = useState<SkillMarkdownPreviewPayload | null>(null);\n const [detailMarketplacePreview, setDetailMarketplacePreview] = useState<SkillMarkdownPreviewPayload | null>(\n null,\n );\n const [detailLoading, setDetailLoading] = useState(false);\n const [detailError, setDetailError] = useState<string | null>(null);\n\n const [marketSort, setMarketSort] = useState<'downloads' | 'newest'>('downloads');\n const [marketPage, setMarketPage] = useState(1);\n const [mpLoading, setMpLoading] = useState(false);\n const [mpError, setMpError] = useState<string | null>(null);\n const [mpPayload, setMpPayload] = useState<{\n items: MarketplacePackageItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider?: string;\n } | null>(null);\n const [installingMarketName, setInstallingMarketName] = useState<string | null>(null);\n const [usingSkillInChatName, setUsingSkillInChatName] = useState<string | null>(null);\n const [marketCategoryId, setMarketCategoryId] = useState('');\n const [mpCategories, setMpCategories] = useState<MarketplaceCategoryItem[]>([]);\n const [mpCategoriesError, setMpCategoriesError] = useState<string | null>(null);\n const [mpCategoriesLoading, setMpCategoriesLoading] = useState(false);\n const [marketBrowseProvider, setMarketBrowseProvider] = useState<string | null>(null);\n const marketplaceDetailProviderRef = useRef<string | null>(null);\n const prevMarketBrowseProviderRef = useRef<string | null>(null);\n /** Dynamic provider list from the registry API. */\n const [registeredProviders, setRegisteredProviders] = useState<MarketplaceProviderInfo[]>([]);\n\n const load = useCallback(\n async (opts?: { silent?: boolean }): Promise<{ ok: true } | { ok: false; message: string }> => {\n const silent = opts?.silent === true;\n if (!silent) {\n setLoading(true);\n }\n setError(null);\n try {\n const data = await getSkills(language !== 'en' ? language : undefined);\n setCatalog(data.catalog.map(normalizeCatalogEntry));\n return { ok: true };\n } catch (e) {\n const message = e instanceof Error ? e.message : sk.loadFailed;\n setError(message);\n return { ok: false, message };\n } finally {\n if (!silent) {\n setLoading(false);\n }\n }\n },\n [language, sk.loadFailed],\n );\n\n useEffect(() => {\n if (!hasToken) return;\n void load();\n }, [hasToken, load]);\n\n useEffect(() => {\n if (!hasToken) {\n setMarketBrowseProvider(null);\n marketplaceDetailProviderRef.current = null;\n return;\n }\n if (urlMarketProvider) {\n setMarketBrowseProvider(urlMarketProvider);\n }\n }, [hasToken, urlMarketProvider]);\n\n useEffect(() => {\n if (!hasToken) return;\n let cancelled = false;\n void getMarketplaceProviders()\n .then(({ providers, current }) => {\n if (cancelled) return;\n setRegisteredProviders(providers.map((p) => ({ id: p.id, displayName: p.displayName })));\n if (urlMarketProvider == null) {\n setMarketBrowseProvider((prev) => (prev != null ? prev : current));\n }\n })\n .catch(() => {\n if (cancelled) return;\n // Fallback: try old single-provider endpoint\n void getMarketplaceProvider()\n .then((info) => {\n if (!cancelled && urlMarketProvider == null) {\n setMarketBrowseProvider((prev) => (prev != null ? prev : info.provider));\n }\n })\n .catch(() => {\n if (!cancelled && urlMarketProvider == null) {\n setMarketBrowseProvider((prev) => (prev != null ? prev : 'skillhub'));\n }\n });\n });\n return () => {\n cancelled = true;\n };\n }, [hasToken, urlMarketProvider]);\n\n useEffect(() => {\n const nextQ = searchParams.get('q') ?? '';\n const nextTabRaw = searchParams.get('tab');\n const nextSourceRaw = searchParams.get('source');\n const nextTab: MainTab = MAIN_TAB_SET.has(nextTabRaw as MainTab)\n ? (nextTabRaw as MainTab)\n : 'marketplace';\n const nextSource: SourceFilter = SOURCE_FILTER_SET.has(nextSourceRaw as SourceFilter)\n ? (nextSourceRaw as SourceFilter)\n : 'all';\n setSearchQuery((prev) => (prev === nextQ ? prev : nextQ));\n setMainTab((prev) => (prev === nextTab ? prev : nextTab));\n setSourceFilter((prev) => (prev === nextSource ? prev : nextSource));\n const nextMcat = searchParams.get('mcat') ?? '';\n if (nextTab === 'marketplace') {\n setMarketCategoryId((prev) => (prev === nextMcat ? prev : nextMcat));\n } else {\n setMarketCategoryId('');\n }\n }, [searchParams]);\n\n useEffect(() => {\n if (mainTab !== 'marketplace') return;\n setMarketPage(1);\n }, [searchQuery, marketSort, mainTab, marketCategoryId, marketBrowseProvider]);\n\n useEffect(() => {\n if (mainTab !== 'marketplace' || !marketBrowseProvider) {\n prevMarketBrowseProviderRef.current = marketBrowseProvider;\n return;\n }\n const prev = prevMarketBrowseProviderRef.current;\n prevMarketBrowseProviderRef.current = marketBrowseProvider;\n if (prev != null && prev !== marketBrowseProvider) {\n setMarketCategoryId('');\n }\n }, [mainTab, marketBrowseProvider]);\n\n /** Before paint: avoid one frame of empty/stale list then skeleton (useEffect runs too late). */\n useLayoutEffect(() => {\n if (!hasToken || mainTab !== 'marketplace') return;\n setMpLoading(true);\n }, [hasToken, mainTab, marketCategoryId, marketPage, marketSort, searchQuery, marketBrowseProvider]);\n\n useLayoutEffect(() => {\n if (!hasToken || mainTab !== 'marketplace') return;\n setMpCategoriesLoading(true);\n }, [hasToken, mainTab, marketBrowseProvider]);\n\n useEffect(() => {\n if (mainTab === 'marketplace') return;\n setMpCategories([]);\n setMpCategoriesError(null);\n setMpCategoriesLoading(false);\n }, [mainTab]);\n\n useEffect(() => {\n if (!hasToken || mainTab !== 'marketplace' || !marketBrowseProvider) return;\n let cancelled = false;\n setMpError(null);\n void getMarketplaceSkills({\n q: searchQuery.trim() || undefined,\n page: marketPage,\n pageSize: 20,\n sort: marketSort,\n category: marketCategoryId.trim() || undefined,\n provider: marketBrowseProvider,\n })\n .then((payload) => {\n if (!cancelled) setMpPayload(payload);\n })\n .catch((e) => {\n if (!cancelled) {\n setMpError(e instanceof Error ? e.message : sk.marketplaceLoadFailed);\n setMpPayload(null);\n }\n })\n .finally(() => {\n if (!cancelled) setMpLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [\n hasToken,\n mainTab,\n marketCategoryId,\n marketPage,\n marketSort,\n searchQuery,\n sk.marketplaceLoadFailed,\n marketBrowseProvider,\n ]);\n\n useEffect(() => {\n if (!hasToken || mainTab !== 'marketplace' || !marketBrowseProvider) return;\n let cancelled = false;\n setMpCategoriesError(null);\n void getMarketplaceCategories({ provider: marketBrowseProvider })\n .then((r) => {\n if (!cancelled) setMpCategories(r.items);\n })\n .catch((e) => {\n if (!cancelled) {\n setMpCategories([]);\n setMpCategoriesError(e instanceof Error ? e.message : sk.marketplaceCategoriesFailed);\n }\n })\n .finally(() => {\n if (!cancelled) setMpCategoriesLoading(false);\n });\n return () => {\n cancelled = true;\n setMpCategoriesLoading(false);\n };\n }, [hasToken, mainTab, sk.marketplaceCategoriesFailed, marketBrowseProvider]);\n\n useEffect(() => {\n if (!marketCategoryId.trim() || mpCategories.length === 0) return;\n if (!mpCategories.some((c) => c.id === marketCategoryId)) {\n setMarketCategoryId('');\n }\n }, [mpCategories, marketCategoryId]);\n\n useEffect(() => {\n setSearchParams(\n (prev) => {\n const params = new URLSearchParams(prev);\n const nextQ = searchQuery.trim();\n if (nextQ) params.set('q', nextQ);\n else params.delete('q');\n if (mainTab !== 'marketplace') params.set('tab', mainTab);\n else params.delete('tab');\n if (sourceFilter !== 'all') params.set('source', sourceFilter);\n else params.delete('source');\n if (mainTab === 'marketplace' && marketCategoryId.trim()) {\n params.set('mcat', marketCategoryId.trim());\n } else {\n params.delete('mcat');\n }\n if (mainTab === 'marketplace' && marketBrowseProvider) {\n params.set(MARKETPLACE_PROVIDER_PARAM, marketBrowseProvider);\n } else {\n params.delete(MARKETPLACE_PROVIDER_PARAM);\n }\n if (params.toString() === prev.toString()) {\n return prev;\n }\n return params;\n },\n { replace: true },\n );\n }, [mainTab, marketCategoryId, marketBrowseProvider, searchQuery, setSearchParams, sourceFilter]);\n\n const showFeedback = useCallback((kind: 'success' | 'error', message: string, durationMs = 5000) => {\n setActionFeedback({ kind, message });\n window.setTimeout(() => setActionFeedback(null), durationMs);\n }, []);\n\n const openSkillDetail = useCallback(\n async (row: SkillCatalogEntry) => {\n setDetailSource('catalog');\n setDetailOpen(true);\n setDetailTitle(row.name);\n setDetailMarkdown('');\n setDetailCatalogPreview(null);\n setDetailMarketplacePreview(null);\n setDetailError(null);\n setDetailLoading(true);\n try {\n const preview = await getSkillMarkdown(row.name, language !== 'en' ? language : undefined);\n setDetailCatalogPreview(preview);\n setDetailTitle(preview.name);\n } catch (e) {\n setDetailCatalogPreview(null);\n setDetailError(e instanceof Error ? e.message : sk.detailLoadFailed);\n } finally {\n setDetailLoading(false);\n }\n },\n [language, sk.detailLoadFailed],\n );\n\n const openMarketplaceDetail = useCallback(\n async (packageId: string, listTitle?: string) => {\n const browse = marketBrowseProvider;\n if (!browse) return;\n marketplaceDetailProviderRef.current = browse;\n setDetailSource('store');\n setDetailOpen(true);\n setDetailTitle(listTitle?.trim() || packageId);\n setDetailMarkdown('');\n setDetailCatalogPreview(null);\n setDetailMarketplacePreview(null);\n setDetailError(null);\n setDetailLoading(true);\n try {\n const pkg = await getMarketplacePackageDetail(packageId, { provider: browse });\n setDetailTitle(pkg.name);\n if (pkg.skillDocPreview) {\n setDetailMarketplacePreview(pkg.skillDocPreview);\n setDetailMarkdown('');\n } else {\n setDetailMarketplacePreview(null);\n const readme = pkg.readme?.trim();\n if (readme) {\n setDetailMarkdown(readme);\n } else if (pkg.description?.trim()) {\n setDetailMarkdown(`## ${pkg.name}\\n\\n${pkg.description.trim()}`);\n } else {\n setDetailMarkdown(`*${sk.marketplaceNoReadme}*`);\n }\n }\n } catch (e) {\n setDetailMarketplacePreview(null);\n setDetailError(e instanceof Error ? e.message : sk.detailLoadFailed);\n } finally {\n setDetailLoading(false);\n }\n },\n [marketBrowseProvider, sk.detailLoadFailed, sk.marketplaceNoReadme],\n );\n\n const onSkillToggle = useCallback(\n async (name: string, next: boolean): Promise<boolean> => {\n setTogglingSkillName(name);\n setEnabledOverride((prev) => ({ ...prev, [name]: next }));\n setActionFeedback(null);\n try {\n await patchSkillEnabled(name, next);\n await load({ silent: true });\n return true;\n } catch (e) {\n setEnabledOverride((prev) => {\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n const msg = e instanceof Error ? e.message : sk.skillToggleFailed;\n showFeedback('error', msg);\n return false;\n } finally {\n setTogglingSkillName(null);\n setEnabledOverride((prev) => {\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n }\n },\n [load, showFeedback, sk.skillToggleFailed],\n );\n\n const onReloadClick = useCallback(async () => {\n setActionFeedback(null);\n setLoading(true);\n setError(null);\n try {\n await reloadSkills();\n } catch (e) {\n const msg = e instanceof Error ? e.message : sk.reloadFailed;\n setError(msg);\n setLoading(false);\n return;\n }\n await load();\n }, [load, sk.reloadFailed]);\n\n const builtinTabStats = useMemo(() => {\n const rows = catalog.filter((r) => r.source === 'builtin');\n return {\n total: rows.length,\n enabled: rows.filter((r) => enabledOverride[r.name] ?? r.enabled).length,\n };\n }, [catalog, enabledOverride]);\n\n const userTabStats = useMemo(() => {\n const rows = catalog.filter((r) => r.source !== 'builtin');\n return {\n total: rows.length,\n enabled: rows.filter((r) => enabledOverride[r.name] ?? r.enabled).length,\n };\n }, [catalog, enabledOverride]);\n\n const detailFromCatalog = useMemo(\n () => (detailTitle ? catalog.find((r) => r.name === detailTitle) : undefined),\n [catalog, detailTitle],\n );\n const detailEnabled =\n detailFromCatalog == null\n ? true\n : (enabledOverride[detailTitle] ?? detailFromCatalog.enabled);\n\n const filteredCatalog = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n let rows = catalog;\n\n if (mainTab === 'builtin') {\n rows = rows.filter((r) => r.source === 'builtin');\n } else {\n rows = rows.filter((r) => r.source !== 'builtin');\n if (sourceFilter !== 'all') {\n rows = rows.filter((r) => r.source === sourceFilter);\n }\n }\n\n if (!q) return rows;\n return rows.filter((row) => {\n const blob = [\n row.name,\n row.description,\n row.directoryId,\n row.path,\n row.source,\n row.hub?.source,\n row.hub?.ref,\n ]\n .filter(Boolean)\n .join(' ')\n .toLowerCase();\n return blob.includes(q);\n });\n }, [catalog, searchQuery, mainTab, sourceFilter]);\n\n const builtinCategories = useMemo(() => {\n const seen = new Set<string>();\n const ordered: string[] = [];\n for (const entry of filteredCatalog) {\n const cat = entry.category;\n if (!cat || seen.has(cat)) continue;\n seen.add(cat);\n ordered.push(cat);\n }\n return ordered.sort((a, b) => {\n const ai = BUILTIN_SKILL_CATEGORY_ORDER.indexOf(a as (typeof BUILTIN_SKILL_CATEGORY_ORDER)[number]);\n const bi = BUILTIN_SKILL_CATEGORY_ORDER.indexOf(b as (typeof BUILTIN_SKILL_CATEGORY_ORDER)[number]);\n if (ai >= 0 && bi >= 0) return ai - bi;\n if (ai >= 0) return -1;\n if (bi >= 0) return 1;\n return a.localeCompare(b);\n });\n }, [filteredCatalog]);\n\n const categoryLabel = useCallback(\n (cat: string): string => {\n const labels = sk.categoryLabel as Record<string, string> | undefined;\n return labels?.[cat] || cat;\n },\n [sk.categoryLabel],\n );\n\n const categoryFilteredCatalog = useMemo(() => {\n if (!builtinCategoryFilter) return filteredCatalog;\n return filteredCatalog.filter((r) => r.category === builtinCategoryFilter);\n }, [filteredCatalog, builtinCategoryFilter]);\n\n const runUpload = async (file: File) => {\n setActionFeedback(null);\n setUploading(true);\n setError(null);\n try {\n let upload: File;\n try {\n upload = await fileToZipUpload(file);\n } catch {\n setError(sk.invalidFile);\n showFeedback('error', sk.invalidFile);\n return;\n }\n await uploadSkillZip(upload, { overwrite: true });\n await load();\n showFeedback('success', sk.installSuccess);\n setInstallOpen(false);\n setPendingFile(null);\n setMainTab('user');\n } catch (err) {\n setError(err instanceof Error ? err.message : sk.uploadFailed);\n showFeedback('error', err instanceof Error ? err.message : sk.uploadFailed);\n } finally {\n setUploading(false);\n }\n };\n\n const onInstallSubmit = () => {\n if (pendingFile) void runUpload(pendingFile);\n };\n\n const onFileInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (file) setPendingFile(file);\n };\n\n const onModalDragOver = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer.types.includes('Files')) {\n setDropActive(true);\n e.dataTransfer.dropEffect = 'copy';\n }\n };\n\n const onModalDragLeave = (e: DragEvent) => {\n const root = e.currentTarget as HTMLElement;\n const to = e.relatedTarget as Node | null;\n if (to && root.contains(to)) return;\n setDropActive(false);\n };\n\n const onModalDrop = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDropActive(false);\n const file = e.dataTransfer?.files?.[0];\n if (file) setPendingFile(file);\n };\n\n const sourceLabel = (source: SkillCatalogEntry['source']): string => {\n switch (source) {\n case 'builtin':\n return sk.source.builtin;\n case 'workspace':\n return sk.source.workspace;\n case 'global':\n return sk.source.global;\n case 'extra':\n return sk.source.extra;\n default:\n return source;\n }\n };\n\n const runDelete = async () => {\n const id = confirmId;\n setConfirmOpen(false);\n setConfirmId(null);\n if (!id) return;\n setActionFeedback(null);\n try {\n await deleteSkill(id);\n await load();\n } catch (e) {\n setError(e instanceof Error ? e.message : sk.deleteFailed);\n }\n };\n\n const isSkillInstalledByName = useCallback(\n (name: string) => catalog.some((r) => r.name === name),\n [catalog],\n );\n\n const onUseSkillInChat = useCallback(async () => {\n const name = detailTitle.trim();\n if (!name) return;\n setActionFeedback(null);\n const needsMarketInstall = detailSource === 'store' && !isSkillInstalledByName(name);\n if (needsMarketInstall) setUsingSkillInChatName(name);\n try {\n if (needsMarketInstall) {\n const mp = marketplaceDetailProviderRef.current ?? marketBrowseProvider;\n await installMarketplaceSkill({\n name,\n overwrite: false,\n ...(mp ? { provider: mp } : {}),\n });\n await load({ silent: true });\n }\n setDetailOpen(false);\n navigate(`/chat/new?skill=${encodeURIComponent(name)}`);\n } catch (e) {\n showFeedback('error', e instanceof Error ? e.message : sk.uploadFailed);\n } finally {\n setUsingSkillInChatName(null);\n }\n }, [\n detailTitle,\n detailSource,\n isSkillInstalledByName,\n load,\n navigate,\n showFeedback,\n sk.uploadFailed,\n marketBrowseProvider,\n ]);\n\n const onMarketInstall = useCallback(\n async (name: string, opts?: { useDetailProvider?: boolean }) => {\n const installed = isSkillInstalledByName(name);\n if (installed) {\n const ok = window.confirm(sk.marketplaceReinstallConfirm);\n if (!ok) return;\n }\n setActionFeedback(null);\n setInstallingMarketName(name);\n try {\n const p = opts?.useDetailProvider\n ? marketplaceDetailProviderRef.current ?? marketBrowseProvider\n : marketBrowseProvider;\n await installMarketplaceSkill({\n name,\n overwrite: installed,\n ...(p ? { provider: p } : {}),\n });\n await load({ silent: true });\n showFeedback('success', sk.installSuccess);\n setDetailOpen(false);\n setMainTab('user');\n } catch (e) {\n showFeedback('error', e instanceof Error ? e.message : sk.uploadFailed);\n } finally {\n setInstallingMarketName(null);\n }\n },\n [\n isSkillInstalledByName,\n load,\n marketBrowseProvider,\n showFeedback,\n sk.installSuccess,\n sk.marketplaceReinstallConfirm,\n sk.uploadFailed,\n ],\n );\n\n const filterLabel =\n sourceFilter === 'all'\n ? sk.filterAll\n : sourceFilter === 'global'\n ? sk.filterGlobal\n : sourceFilter === 'workspace'\n ? sk.filterWorkspace\n : sk.filterExtra;\n\n const { pathname } = useLocation();\n const inSettingsShell = pathname.startsWith('/settings/');\n\n return {\n sk,\n hasToken,\n catalog,\n loading,\n error,\n uploading,\n searchQuery,\n setSearchQuery,\n actionFeedback,\n mainTab,\n setMainTab,\n sourceFilter,\n setSourceFilter,\n builtinCategoryFilter,\n setBuiltinCategoryFilter,\n installOpen,\n setInstallOpen,\n pendingFile,\n setPendingFile,\n dropActive,\n setDropActive,\n confirmOpen,\n setConfirmOpen,\n confirmId,\n setConfirmId,\n togglingSkillName,\n enabledOverride,\n detailOpen,\n setDetailOpen,\n detailSource,\n setDetailSource,\n detailTitle,\n setDetailTitle,\n detailMarkdown,\n setDetailMarkdown,\n detailCatalogPreview,\n setDetailCatalogPreview,\n detailMarketplacePreview,\n setDetailMarketplacePreview,\n detailLoading,\n detailError,\n setDetailError,\n marketSort,\n setMarketSort,\n marketPage,\n setMarketPage,\n mpLoading,\n mpError,\n mpPayload,\n installingMarketName,\n usingSkillInChatName,\n onUseSkillInChat,\n marketCategoryId,\n setMarketCategoryId,\n mpCategories,\n mpCategoriesError,\n mpCategoriesLoading,\n marketBrowseProvider,\n setMarketBrowseProvider,\n registeredProviders,\n builtinTabStats,\n userTabStats,\n detailEnabled,\n filteredCatalog,\n builtinCategories,\n categoryFilteredCatalog,\n filterLabel,\n inSettingsShell,\n categoryLabel,\n onReloadClick,\n openSkillDetail,\n openMarketplaceDetail,\n onSkillToggle,\n onInstallSubmit,\n onFileInputChange,\n onModalDragOver,\n onModalDragLeave,\n onModalDrop,\n sourceLabel,\n runDelete,\n onMarketInstall,\n isSkillInstalledByName,\n };\n}\n\nexport type SkillsPageVm = ReturnType<typeof useSkillsPage>;\n","import { SkillsPageView } from '@/features/skills/skills-page-view';\nimport { useSkillsPage } from '@/features/skills/use-skills-page';\n\nexport function SkillsPage() {\n const vm = useSkillsPage();\n return <SkillsPageView vm={vm} />;\n}\n"],"file":"skills-page-ADUi69Fa.js"}
|