@xopcai/xopc 0.0.77 → 0.0.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{agents-DN3vr8pb.js → agents-Bh_9-1KB.js} +2 -2
  4. package/dist/gateway/static/root/assets/{agents-DN3vr8pb.js.map → agents-Bh_9-1KB.js.map} +1 -1
  5. package/dist/gateway/static/root/assets/{apps-page-BUn41aPi.js → apps-page-CB5anZpc.js} +2 -2
  6. package/dist/gateway/static/root/assets/{apps-page-BUn41aPi.js.map → apps-page-CB5anZpc.js.map} +1 -1
  7. package/dist/gateway/static/root/assets/{channels-settings-CYMmWDtP.js → channels-settings-Bt1sprhC.js} +2 -2
  8. package/dist/gateway/static/root/assets/{channels-settings-CYMmWDtP.js.map → channels-settings-Bt1sprhC.js.map} +1 -1
  9. package/dist/gateway/static/root/assets/{channels-status-swr-sJj4ueTp.js → channels-status-swr-Crgak3fg.js} +2 -2
  10. package/dist/gateway/static/root/assets/{channels-status-swr-sJj4ueTp.js.map → channels-status-swr-Crgak3fg.js.map} +1 -1
  11. package/dist/gateway/static/root/assets/{cron-api-CLxnaHdq.js → cron-api-CzJGvQQ7.js} +2 -2
  12. package/dist/gateway/static/root/assets/{cron-api-CLxnaHdq.js.map → cron-api-CzJGvQQ7.js.map} +1 -1
  13. package/dist/gateway/static/root/assets/{cron-page-BAQ8xSnJ.js → cron-page-BoNRJNVV.js} +2 -2
  14. package/dist/gateway/static/root/assets/{cron-page-BAQ8xSnJ.js.map → cron-page-BoNRJNVV.js.map} +1 -1
  15. package/dist/gateway/static/root/assets/{dist-BfJYxiK5.js → dist-a-eaOUvs.js} +2 -2
  16. package/dist/gateway/static/root/assets/{dist-BfJYxiK5.js.map → dist-a-eaOUvs.js.map} +1 -1
  17. package/dist/gateway/static/root/assets/{extension-debug-page-bgvVs-Sy.js → extension-debug-page-D-O1XjAa.js} +2 -2
  18. package/dist/gateway/static/root/assets/{extension-debug-page-bgvVs-Sy.js.map → extension-debug-page-D-O1XjAa.js.map} +1 -1
  19. package/dist/gateway/static/root/assets/{extension-page-SG4TVv-u.js → extension-page-B2VpqBTH.js} +2 -2
  20. package/dist/gateway/static/root/assets/{extension-page-SG4TVv-u.js.map → extension-page-B2VpqBTH.js.map} +1 -1
  21. package/dist/gateway/static/root/assets/{extension-settings-page-CJZRTsjF.js → extension-settings-page-CmBcQfeO.js} +2 -2
  22. package/dist/gateway/static/root/assets/{extension-settings-page-CJZRTsjF.js.map → extension-settings-page-CmBcQfeO.js.map} +1 -1
  23. package/dist/gateway/static/root/assets/{fetch-K_0JRCXU.js → fetch-EGO9T3MN.js} +3 -3
  24. package/dist/gateway/static/root/assets/{fetch-K_0JRCXU.js.map → fetch-EGO9T3MN.js.map} +1 -1
  25. package/dist/gateway/static/root/assets/{field-primitives-Z76hyBYS.js → field-primitives-Bh7G1y4D.js} +2 -2
  26. package/dist/gateway/static/root/assets/{field-primitives-Z76hyBYS.js.map → field-primitives-Bh7G1y4D.js.map} +1 -1
  27. package/dist/gateway/static/root/assets/{heartbeat-config-api-BqfDabSI.js → heartbeat-config-api-DxpIEZNs.js} +2 -2
  28. package/dist/gateway/static/root/assets/{heartbeat-config-api-BqfDabSI.js.map → heartbeat-config-api-DxpIEZNs.js.map} +1 -1
  29. package/dist/gateway/static/root/assets/{index-ChiUhJAs.js → index-Dxy9ZCtC.js} +5 -5
  30. package/dist/gateway/static/root/assets/{index-ChiUhJAs.js.map → index-Dxy9ZCtC.js.map} +1 -1
  31. package/dist/gateway/static/root/assets/{logs-page-DrIMhDE2.js → logs-page-Dw58E2GE.js} +2 -2
  32. package/dist/gateway/static/root/assets/{logs-page-DrIMhDE2.js.map → logs-page-Dw58E2GE.js.map} +1 -1
  33. package/dist/gateway/static/root/assets/{sessions-page-B-RGO3N0.js → sessions-page-CPkhCy57.js} +2 -2
  34. package/dist/gateway/static/root/assets/{sessions-page-B-RGO3N0.js.map → sessions-page-CPkhCy57.js.map} +1 -1
  35. package/dist/gateway/static/root/assets/{settings-form-section-Csvl1iL6.js → settings-form-section-DLZDVMEf.js} +2 -2
  36. package/dist/gateway/static/root/assets/{settings-form-section-Csvl1iL6.js.map → settings-form-section-DLZDVMEf.js.map} +1 -1
  37. package/dist/gateway/static/root/assets/settings-page-CVPCa0PE.js +4 -0
  38. package/dist/gateway/static/root/assets/settings-page-CVPCa0PE.js.map +1 -0
  39. package/dist/gateway/static/root/assets/{skills-page-dHwx2vh0.js → skills-page-DueZ9Qfg.js} +2 -2
  40. package/dist/gateway/static/root/assets/{skills-page-dHwx2vh0.js.map → skills-page-DueZ9Qfg.js.map} +1 -1
  41. package/dist/gateway/static/root/assets/{theme-store-Bl5A2Fd_.js → theme-store-CWPq9gW1.js} +2 -2
  42. package/dist/gateway/static/root/assets/{theme-store-Bl5A2Fd_.js.map → theme-store-CWPq9gW1.js.map} +1 -1
  43. package/dist/gateway/static/root/assets/{utils-COYrNFF7.js → utils-Cnix55r9.js} +2 -2
  44. package/dist/gateway/static/root/assets/{utils-COYrNFF7.js.map → utils-Cnix55r9.js.map} +1 -1
  45. package/dist/gateway/static/root/assets/{voice-api-key-field-5WZZaxH3.js → voice-api-key-field-BR3Ut06g.js} +2 -2
  46. package/dist/gateway/static/root/assets/{voice-api-key-field-5WZZaxH3.js.map → voice-api-key-field-BR3Ut06g.js.map} +1 -1
  47. package/dist/gateway/static/root/index.html +3 -3
  48. package/dist/package.js +1 -1
  49. package/dist/src/browser/providers/browser-ext-install.js +23 -4
  50. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  51. package/dist/src/cli/commands/tunnel.js +4 -5
  52. package/dist/src/cli/commands/tunnel.js.map +1 -1
  53. package/dist/src/config/index.js +2 -2
  54. package/dist/src/config/rules.js +0 -5
  55. package/dist/src/config/rules.js.map +1 -1
  56. package/dist/src/config/schema.d.ts +0 -27
  57. package/dist/src/config/schema.js +4 -18
  58. package/dist/src/config/schema.js.map +1 -1
  59. package/dist/src/gateway/auth-rate-limit.d.ts +2 -0
  60. package/dist/src/gateway/auth-rate-limit.js +9 -3
  61. package/dist/src/gateway/auth-rate-limit.js.map +1 -1
  62. package/dist/src/gateway/hono/app.js +19 -13
  63. package/dist/src/gateway/hono/app.js.map +1 -1
  64. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
  65. package/dist/src/gateway/hono/lib/config-payload.js +1 -2
  66. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  67. package/dist/src/gateway/hono/routes/tunnel.js +32 -30
  68. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  69. package/dist/src/gateway/host.d.ts +24 -0
  70. package/dist/src/gateway/host.js +33 -1
  71. package/dist/src/gateway/host.js.map +1 -1
  72. package/dist/src/gateway/index.d.ts +1 -1
  73. package/dist/src/gateway/index.js +2 -2
  74. package/dist/src/gateway/runtime-config.js +1 -8
  75. package/dist/src/gateway/runtime-config.js.map +1 -1
  76. package/dist/src/gateway/security/audit.js +4 -4
  77. package/dist/src/gateway/security/audit.js.map +1 -1
  78. package/dist/src/gateway/server.js +2 -3
  79. package/dist/src/gateway/server.js.map +1 -1
  80. package/dist/src/gateway/service/types.d.ts +2 -0
  81. package/dist/src/gateway/service.d.ts +2 -0
  82. package/dist/src/gateway/service.js +7 -2
  83. package/dist/src/gateway/service.js.map +1 -1
  84. package/dist/src/tunnel/frp-subdomain-host.d.ts +2 -0
  85. package/dist/src/tunnel/frp-subdomain-host.js +15 -0
  86. package/dist/src/tunnel/frp-subdomain-host.js.map +1 -0
  87. package/dist/src/tunnel/gateway-lifecycle.d.ts +0 -4
  88. package/dist/src/tunnel/gateway-lifecycle.js +9 -11
  89. package/dist/src/tunnel/gateway-lifecycle.js.map +1 -1
  90. package/dist/src/tunnel/index.d.ts +2 -4
  91. package/dist/src/tunnel/index.js +2 -4
  92. package/dist/src/tunnel/pair-url.js +7 -1
  93. package/dist/src/tunnel/pair-url.js.map +1 -1
  94. package/dist/src/tunnel/pairing.d.ts +13 -0
  95. package/dist/src/tunnel/pairing.js +48 -1
  96. package/dist/src/tunnel/pairing.js.map +1 -1
  97. package/dist/src/tunnel/tunnel-config.js +2 -16
  98. package/dist/src/tunnel/tunnel-config.js.map +1 -1
  99. package/dist/src/tunnel/tunnel-service.d.ts +1 -10
  100. package/dist/src/tunnel/tunnel-service.js +7 -60
  101. package/dist/src/tunnel/tunnel-service.js.map +1 -1
  102. package/dist/src/tunnel/tunnel-types.d.ts +3 -18
  103. package/dist/src/tunnel/well-known.d.ts +5 -0
  104. package/dist/src/tunnel/well-known.js +2 -1
  105. package/dist/src/tunnel/well-known.js.map +1 -1
  106. package/package.json +2 -2
  107. package/dist/gateway/static/root/assets/settings-page-nxAc0ta1.js +0 -4
  108. package/dist/gateway/static/root/assets/settings-page-nxAc0ta1.js.map +0 -1
  109. package/dist/src/tunnel/acme-cert-store.d.ts +0 -34
  110. package/dist/src/tunnel/acme-cert-store.js +0 -184
  111. package/dist/src/tunnel/acme-cert-store.js.map +0 -1
  112. package/dist/src/tunnel/acme-client.d.ts +0 -50
  113. package/dist/src/tunnel/acme-client.js +0 -473
  114. package/dist/src/tunnel/acme-client.js.map +0 -1
  115. package/dist/src/tunnel/acme-crypto.d.ts +0 -25
  116. package/dist/src/tunnel/acme-crypto.js +0 -58
  117. package/dist/src/tunnel/acme-crypto.js.map +0 -1
  118. package/dist/src/tunnel/acme-csr.d.ts +0 -5
  119. package/dist/src/tunnel/acme-csr.js +0 -48
  120. package/dist/src/tunnel/acme-csr.js.map +0 -1
  121. package/dist/src/tunnel/tls-server.d.ts +0 -14
  122. package/dist/src/tunnel/tls-server.js +0 -126
  123. package/dist/src/tunnel/tls-server.js.map +0 -1
  124. package/dist/src/tunnel/tunnel-e2e-config.d.ts +0 -11
  125. package/dist/src/tunnel/tunnel-e2e-config.js +0 -29
  126. package/dist/src/tunnel/tunnel-e2e-config.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"mappings":"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OAASxS,EAAG,CACVyc,GAAa,QAASzc,aAAa4W,MAAQ5W,EAAEoT,QAAUrU,EAAGigB,YAAY,CACxE,QAAU,CACRnG,GAAwB,IAAI,CAC9B,CAlB4B,CAmB9B,EACA,CACEvL,GACA2O,GACAnJ,EACA2J,GACA1d,EAAG+f,eACH/f,EAAGqhB,4BACHrhB,EAAGigB,YAAY,CAEnB,EAEM/L,GACJuF,IAAiB,MACbzZ,EAAG+U,UACH0E,IAAiB,SACfzZ,EAAGiV,aACHwE,IAAiB,YACfzZ,EAAGkV,gBACHlV,EAAGgV,YAEP,CAAEsM,aAAaC,EAAY,EAGjC,MAAO,CACLvhB,KACAsT,WACAxP,WACAnE,WACA4T,MAAOgK,GACPnO,YACAvP,cACAC,iBACA0T,iBACAzT,UACA0T,cACAgG,eACA/F,mBACAzP,wBACAC,4BACAuL,eACAvP,iBACAwP,cACAzP,kBACA0P,aACAC,gBACA7G,eACAC,kBACAC,YACAC,gBACAoF,qBACAqL,kBACAzM,aACAC,gBACAC,eACAC,kBACAC,eACAC,kBACAC,kBACAC,qBACAC,wBACAC,2BACAC,4BACAC,+BACAC,iBACAC,eACAC,kBACA6F,cACAC,iBACArC,cACAC,iBACAL,aACAC,WACAF,aACA/C,wBACA7J,wBACAD,oBACAgN,oBACAC,uBACAP,gBACAE,qBACAD,uBACA6C,uBACAC,2BACAC,uBACAN,mBACAC,gBACA3F,iBACAC,qBACAC,iBACAC,qBACArK,mBACAC,qBACAG,2BACA+P,eACAC,gBAzEsBmN,GAASE,WAAW,YAyE1CrN,EACA/P,iBACAxE,iBACA0E,mBACAqN,yBACAlD,iBACAwB,mBACAD,qBACAH,mBACAC,oBACAC,eACA1L,eACA8E,aACAqF,mBACAD,yBACF,CACF,CClzBA,SAAOkT,IAAA,KAAA/hB,WAAA,GACL2T,EAAWyE,GAAc,EAAErY,EACM,OADNC,EAAA,KAAA2T,EACM5T,EAAAC,EAAA,IAA1BD,GAAA,SAAC,GAAD,CAAoB4T,IAAE,GAAI3T,EAAA,GAAA2T,EAAA3T,EAAA,GAAAD,GAA1BA,CAA0B","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","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","sourceLabel","openSkillDetail","onUseSkillInChat","usingSkillInChatName","map","_temp","empty","noSearchResults","marketplaceCategoriesAria","interaction","focusRingPanel","marketplaceCategoryAll","cat","selected","row","directoryId","closest","e_0","key","preventDefault","_temp2","_temp3","source","previewUseInChatBusy","previewUseInChat","description","undefined","managed","col","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","enabled","disableModelInvocation","SkillsPageConfirmDialog","confirmOpen","setConfirmOpen","confirmId","setConfirmId","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","detailDirectoryId","detailManaged","detailExternalUrl","installingMarketName","togglingSkillName","isSkillInstalledByName","onMarketInstall","onSkillToggle","detailCloseAria","detailModalBanner","detailModalBannerStore","marketplaceOpenExternal","marketplaceOpenExternalAria","delete","detailModalDisable","detailModalEnable","marketplaceInstall","marketplaceReinstall","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","marketPage","setMarketPage","openMarketplaceDetail","c","items","marketplaceEmpty","installed","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","marketBrowseProvider","setMarketBrowseProvider","registeredProviders","filterLabel","inSettingsShell","needToken","message","title","tagline","skillsNavAria","tabMarketplace","tabBuiltin","tabUser","t29","t30","t31","filterAll","filterExtra","filterGlobal","filterWorkspace","transition","t32","marketplaceBrowseSwitchAria","marketplaceSortDownloads","marketplaceSortNewest","displayName","t33","t34","t35","t36","t37","t38","t39","t40","t41","t42","t43","SkillsPageHeaderRegistration","setPageHeader","usePageHeaderStore","clearPageHeader","skillsHeaderEnd","startExtra","main","end","useLayoutEffect","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","manualLoading","setManualLoading","setError","setUploading","initialSearch","initialTabRaw","initialSourceRaw","initialTab","has","initialSourceFilter","setActionFeedback","sourceFilter","setTogglingSkillName","enabledOverride","setEnabledOverride","setDetailLoading","setInstallingMarketName","setUsingSkillInChatName","providersRefreshKey","setProvidersRefreshKey","marketplaceDetailProviderRef","trackedUrlProviderRef","trackedProvidersCurrentRef","trackedMarketFilterKeyRef","trackedMarketProviderRef","catalogResource","useAsyncResource","getSkills","then","data","errorData","catalogLoading","setData","setCatalogData","providersResource","providers","current","getMarketplaceProviders","info","getMarketplaceProvider","useEffect","onConfigReload","window","addEventListener","removeEventListener","searchParamsKey","toString","trackedSearchParamsKeyRef","nextQ","nextTabRaw","nextSourceRaw","nextTab","nextSource","prev","nextMcat","trackedHasTokenRef","marketFilterKey","mpSkillsResource","getMarketplaceSkills","q","pageSize","sort","category","mpCategoriesResource","getMarketplaceCategories","marketplaceLoadFailed","marketplaceCategoriesFailed","some","load","opts","silent","loadFailed","catalogFetchError","displayError","URLSearchParams","set","showFeedback","durationMs","setTimeout","getSkillMarkdown","detailLoadFailed","packageId","listTitle","browse","pkg","getMarketplacePackageDetail","skillDocPreview","readme","marketplaceNoReadme","next","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\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_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 { Button } from '@/components/ui/button';\nimport { SkillCardIcon } from '@/features/skills/skill-card-icon';\nimport { SkillCatalogCardSkeleton } 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 | 'sourceLabel'\n | 'openSkillDetail'\n | 'onUseSkillInChat'\n | 'usingSkillInChatName'\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 sourceLabel,\n openSkillDetail,\n onUseSkillInChat,\n usingSkillInChatName,\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 <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"h-8 shrink-0 whitespace-nowrap px-2.5 text-xs font-medium\"\n disabled={usingSkillInChatName === row.name}\n onClick={() =>\n void onUseSkillInChat({ name: row.name, source: 'catalog' })\n }\n >\n {usingSkillInChatName === row.name\n ? sk.previewUseInChatBusy\n : sk.previewUseInChat}\n </Button>\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 */\nfunction 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 */\nfunction 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 { ExternalLink, Info, Trash2, 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 | 'detailDirectoryId'\n | 'detailManaged'\n | 'detailExternalUrl'\n | 'usingSkillInChatName'\n | 'installingMarketName'\n | 'togglingSkillName'\n | 'isSkillInstalledByName'\n | 'onUseSkillInChat'\n | 'onMarketInstall'\n | 'onSkillToggle'\n | 'setConfirmId'\n | 'setConfirmOpen'\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 detailDirectoryId,\n detailManaged,\n detailExternalUrl,\n usingSkillInChatName,\n installingMarketName,\n togglingSkillName,\n isSkillInstalledByName,\n onUseSkillInChat,\n onMarketInstall,\n onSkillToggle,\n setConfirmId,\n setConfirmOpen,\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 items-center justify-between gap-2 border-t border-edge px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n {detailSource === 'store' && detailExternalUrl ? (\n <a\n href={detailExternalUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'inline-flex h-9 items-center gap-1.5 rounded-lg border border-edge bg-surface-panel px-3 text-sm font-medium 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-4\" strokeWidth={1.75} aria-hidden />\n <span>{sk.marketplaceOpenExternal}</span>\n </a>\n ) : null}\n {detailSource === 'catalog' && detailManaged && detailDirectoryId ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"gap-1.5 text-red-600 hover:bg-red-50 hover:text-red-700 dark:text-red-400 dark:hover:bg-red-950/40 dark:hover:text-red-300\"\n onClick={() => {\n setConfirmId(detailDirectoryId);\n setConfirmOpen(true);\n }}\n >\n <Trash2 className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {sk.delete}\n </Button>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\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 </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, 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 } 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 | 'marketPage'\n | 'setMarketPage'\n | 'isSkillInstalledByName'\n | 'openMarketplaceDetail'\n | 'onUseSkillInChat'\n | 'usingSkillInChatName'\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 marketPage,\n setMarketPage,\n isSkillInstalledByName,\n openMarketplaceDetail,\n onUseSkillInChat,\n usingSkillInChatName,\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 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('button')) return;\n void openMarketplaceDetail(row.id, row.name);\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 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\n role=\"group\"\n className=\"flex shrink-0 items-center gap-1\"\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={mpLoading || usingSkillInChatName === row.id}\n onClick={() =>\n void onUseSkillInChat({ name: row.id, source: 'store' })\n }\n >\n {usingSkillInChatName === row.id\n ? sk.previewUseInChatBusy\n : sk.previewUseInChat}\n </Button>\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 actionFeedback,\n mainTab,\n setMainTab,\n setSourceFilter,\n builtinTabStats,\n userTabStats,\n marketSort,\n setMarketSort,\n marketBrowseProvider,\n setMarketBrowseProvider,\n registeredProviders,\n filterLabel,\n inSettingsShell,\n } = vm;\n\n if (!hasToken) {\n return (\n <>\n <SkillsPageHeaderRegistration vm={vm} />\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\n return (\n <>\n <SkillsPageHeaderRegistration vm={vm} />\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 <SkillsPageHeaderEnd\n loading={vm.loading}\n onReloadClick={vm.onReloadClick}\n searchQuery={vm.searchQuery}\n setSearchQuery={vm.setSearchQuery}\n mainTab={vm.mainTab}\n sk={vm.sk}\n setPendingFile={vm.setPendingFile}\n setInstallOpen={vm.setInstallOpen}\n />\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}\n\nfunction SkillsPageHeaderRegistration({ vm }: { vm: SkillsPageVm }) {\n const {\n sk,\n hasToken,\n loading,\n onReloadClick,\n searchQuery,\n setSearchQuery,\n mainTab,\n setPendingFile,\n setInstallOpen,\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 return null;\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 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 {\n marketplacePublicSkillUrl,\n normalizeCatalogEntry,\n} from '@/features/skills/skills-page.utils';\nimport { messages } from '@/i18n/messages';\nimport { useAsyncResource } from '@/lib/use-async-resource';\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 [manualLoading, setManualLoading] = 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 [installingMarketName, setInstallingMarketName] = useState<string | null>(null);\n const [usingSkillInChatName, setUsingSkillInChatName] = useState<string | null>(null);\n const [marketCategoryId, setMarketCategoryId] = useState('');\n const [marketBrowseProvider, setMarketBrowseProvider] = useState<string | null>(null);\n const [providersRefreshKey, setProvidersRefreshKey] = useState(0);\n const marketplaceDetailProviderRef = useRef<string | null>(null);\n const trackedUrlProviderRef = useRef<string | null>(urlMarketProvider);\n const trackedProvidersCurrentRef = useRef<string | null>(null);\n const trackedMarketFilterKeyRef = useRef('');\n const trackedMarketProviderRef = useRef<string | null>(null);\n\n const catalogResource = useAsyncResource(\n () =>\n getSkills(language !== 'en' ? language : undefined).then((data) =>\n data.catalog.map(normalizeCatalogEntry),\n ),\n [hasToken, language],\n { enabled: hasToken, initial: [] as SkillCatalogEntry[], errorData: [] },\n );\n const { data: catalog, loading: catalogLoading, setData: setCatalogData } = catalogResource;\n\n const providersResource = useAsyncResource(\n async () => {\n try {\n const { providers, current } = await getMarketplaceProviders();\n return {\n providers: providers.map((p) => ({ id: p.id, displayName: p.displayName })),\n current,\n };\n } catch {\n try {\n const info = await getMarketplaceProvider();\n return { providers: [] as MarketplaceProviderInfo[], current: info.provider };\n } catch {\n return { providers: [] as MarketplaceProviderInfo[], current: 'skillhub' };\n }\n }\n },\n [hasToken, providersRefreshKey],\n {\n enabled: hasToken,\n initial: { providers: [] as MarketplaceProviderInfo[], current: null as string | null },\n },\n );\n\n const loading = manualLoading || catalogLoading;\n const registeredProviders = providersResource.data.providers;\n\n useEffect(() => {\n const onConfigReload = () => setProvidersRefreshKey((k) => k + 1);\n window.addEventListener('config-reload', onConfigReload);\n return () => window.removeEventListener('config-reload', onConfigReload);\n }, []);\n\n // Sync URL → local state during render so the URL→state→URL effect chain doesn't add a render.\n const searchParamsKey = searchParams.toString();\n const trackedSearchParamsKeyRef = useRef(searchParamsKey);\n if (trackedSearchParamsKeyRef.current !== searchParamsKey) {\n trackedSearchParamsKeyRef.current = searchParamsKey;\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 }\n\n const trackedHasTokenRef = useRef(hasToken);\n if (!hasToken && trackedHasTokenRef.current) {\n setMarketBrowseProvider(null);\n marketplaceDetailProviderRef.current = null;\n }\n trackedHasTokenRef.current = hasToken;\n\n if (hasToken && urlMarketProvider && trackedUrlProviderRef.current !== urlMarketProvider) {\n trackedUrlProviderRef.current = urlMarketProvider;\n setMarketBrowseProvider(urlMarketProvider);\n }\n if (\n hasToken &&\n urlMarketProvider == null &&\n providersResource.data.current &&\n providersResource.data.current !== trackedProvidersCurrentRef.current\n ) {\n trackedProvidersCurrentRef.current = providersResource.data.current;\n setMarketBrowseProvider((prev) => prev ?? providersResource.data.current);\n }\n\n const marketFilterKey = `${searchQuery}|${marketSort}|${mainTab}|${marketCategoryId}|${marketBrowseProvider ?? ''}`;\n if (trackedMarketFilterKeyRef.current !== marketFilterKey) {\n trackedMarketFilterKeyRef.current = marketFilterKey;\n setMarketPage(1);\n }\n\n if (\n mainTab === 'marketplace' &&\n marketBrowseProvider &&\n trackedMarketProviderRef.current != null &&\n trackedMarketProviderRef.current !== marketBrowseProvider\n ) {\n setMarketCategoryId('');\n }\n trackedMarketProviderRef.current = marketBrowseProvider;\n\n const mpSkillsResource = useAsyncResource(\n () =>\n 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 [hasToken, mainTab, marketCategoryId, marketPage, marketSort, searchQuery, marketBrowseProvider],\n {\n enabled: hasToken && mainTab === 'marketplace' && Boolean(marketBrowseProvider),\n initial: null as {\n items: MarketplacePackageItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider?: string;\n } | null,\n errorData: null,\n },\n );\n\n const mpCategoriesResource = useAsyncResource(\n () => getMarketplaceCategories({ provider: marketBrowseProvider! }).then((r) => r.items),\n [hasToken, mainTab, marketBrowseProvider],\n {\n enabled: hasToken && mainTab === 'marketplace' && Boolean(marketBrowseProvider),\n initial: [] as MarketplaceCategoryItem[],\n errorData: [],\n },\n );\n\n const mpPayload = mainTab === 'marketplace' ? mpSkillsResource.data : null;\n const mpLoading = mainTab === 'marketplace' ? mpSkillsResource.loading : false;\n const mpError =\n mpSkillsResource.error instanceof Error\n ? mpSkillsResource.error.message\n : mpSkillsResource.error\n ? sk.marketplaceLoadFailed\n : null;\n const mpCategories = mainTab === 'marketplace' ? mpCategoriesResource.data : [];\n const mpCategoriesLoading = mainTab === 'marketplace' ? mpCategoriesResource.loading : false;\n const mpCategoriesError =\n mpCategoriesResource.error instanceof Error\n ? mpCategoriesResource.error.message\n : mpCategoriesResource.error\n ? sk.marketplaceCategoriesFailed\n : null;\n\n if (\n marketCategoryId.trim() &&\n mpCategories.length > 0 &&\n !mpCategories.some((c) => c.id === marketCategoryId)\n ) {\n setMarketCategoryId('');\n }\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 setManualLoading(true);\n }\n setError(null);\n try {\n const data = await getSkills(language !== 'en' ? language : undefined);\n setCatalogData(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 setManualLoading(false);\n }\n }\n },\n [language, setCatalogData, sk.loadFailed],\n );\n\n const catalogFetchError =\n !manualLoading && catalogResource.error\n ? catalogResource.error instanceof Error\n ? catalogResource.error.message\n : sk.loadFailed\n : null;\n const displayError = error ?? catalogFetchError;\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 setManualLoading(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 setManualLoading(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 const detailDirectoryId = detailFromCatalog?.directoryId ?? null;\n const detailManaged = detailFromCatalog?.managed ?? false;\n const detailExternalUrl = useMemo(() => {\n if (detailSource !== 'store' || !detailTitle) return null;\n const provider = marketplaceDetailProviderRef.current ?? marketBrowseProvider;\n return marketplacePublicSkillUrl(provider, detailTitle);\n }, [detailSource, detailTitle, marketBrowseProvider]);\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(\n async (opts?: { name?: string; source?: 'catalog' | 'store' }) => {\n const name = (opts?.name ?? detailTitle).trim();\n if (!name) return;\n const source = opts?.source ?? detailSource;\n setActionFeedback(null);\n const needsMarketInstall = source === 'store' && !isSkillInstalledByName(name);\n 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 [\n detailTitle,\n detailSource,\n isSkillInstalledByName,\n load,\n navigate,\n showFeedback,\n sk.uploadFailed,\n marketBrowseProvider,\n ],\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: displayError,\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 detailDirectoryId,\n detailManaged,\n detailExternalUrl,\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-dHwx2vh0.js"}
1
+ {"version":3,"mappings":"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OAASxS,EAAG,CACVyc,GAAa,QAASzc,aAAa4W,MAAQ5W,EAAEoT,QAAUrU,EAAGigB,YAAY,CACxE,QAAU,CACRnG,GAAwB,IAAI,CAC9B,CAlB4B,CAmB9B,EACA,CACEvL,GACA2O,GACAnJ,EACA2J,GACA1d,EAAG+f,eACH/f,EAAGqhB,4BACHrhB,EAAGigB,YAAY,CAEnB,EAEM/L,GACJuF,IAAiB,MACbzZ,EAAG+U,UACH0E,IAAiB,SACfzZ,EAAGiV,aACHwE,IAAiB,YACfzZ,EAAGkV,gBACHlV,EAAGgV,YAEP,CAAEsM,aAAaC,EAAY,EAGjC,MAAO,CACLvhB,KACAsT,WACAxP,WACAnE,WACA4T,MAAOgK,GACPnO,YACAvP,cACAC,iBACA0T,iBACAzT,UACA0T,cACAgG,eACA/F,mBACAzP,wBACAC,4BACAuL,eACAvP,iBACAwP,cACAzP,kBACA0P,aACAC,gBACA7G,eACAC,kBACAC,YACAC,gBACAoF,qBACAqL,kBACAzM,aACAC,gBACAC,eACAC,kBACAC,eACAC,kBACAC,kBACAC,qBACAC,wBACAC,2BACAC,4BACAC,+BACAC,iBACAC,eACAC,kBACA6F,cACAC,iBACArC,cACAC,iBACAL,aACAC,WACAF,aACA/C,wBACA7J,wBACAD,oBACAgN,oBACAC,uBACAP,gBACAE,qBACAD,uBACA6C,uBACAC,2BACAC,uBACAN,mBACAC,gBACA3F,iBACAC,qBACAC,iBACAC,qBACArK,mBACAC,qBACAG,2BACA+P,eACAC,gBAzEsBmN,GAASE,WAAW,YAyE1CrN,EACA/P,iBACAxE,iBACA0E,mBACAqN,yBACAlD,iBACAwB,mBACAD,qBACAH,mBACAC,oBACAC,eACA1L,eACA8E,aACAqF,mBACAD,yBACF,CACF,CClzBA,SAAOkT,IAAA,KAAA/hB,WAAA,GACL2T,EAAWyE,GAAc,EAAErY,EACM,OADNC,EAAA,KAAA2T,EACM5T,EAAAC,EAAA,IAA1BD,GAAA,SAAC,GAAD,CAAoB4T,IAAE,GAAI3T,EAAA,GAAA2T,EAAA3T,EAAA,GAAAD,GAA1BA,CAA0B","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","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","sourceLabel","openSkillDetail","onUseSkillInChat","usingSkillInChatName","map","_temp","empty","noSearchResults","marketplaceCategoriesAria","interaction","focusRingPanel","marketplaceCategoryAll","cat","selected","row","directoryId","closest","e_0","key","preventDefault","_temp2","_temp3","source","previewUseInChatBusy","previewUseInChat","description","undefined","managed","col","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","enabled","disableModelInvocation","SkillsPageConfirmDialog","confirmOpen","setConfirmOpen","confirmId","setConfirmId","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","detailDirectoryId","detailManaged","detailExternalUrl","installingMarketName","togglingSkillName","isSkillInstalledByName","onMarketInstall","onSkillToggle","detailCloseAria","detailModalBanner","detailModalBannerStore","marketplaceOpenExternal","marketplaceOpenExternalAria","delete","detailModalDisable","detailModalEnable","marketplaceInstall","marketplaceReinstall","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","marketPage","setMarketPage","openMarketplaceDetail","c","items","marketplaceEmpty","installed","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","marketBrowseProvider","setMarketBrowseProvider","registeredProviders","filterLabel","inSettingsShell","needToken","message","title","tagline","skillsNavAria","tabMarketplace","tabBuiltin","tabUser","t29","t30","t31","filterAll","filterExtra","filterGlobal","filterWorkspace","transition","t32","marketplaceBrowseSwitchAria","marketplaceSortDownloads","marketplaceSortNewest","displayName","t33","t34","t35","t36","t37","t38","t39","t40","t41","t42","t43","SkillsPageHeaderRegistration","setPageHeader","usePageHeaderStore","clearPageHeader","skillsHeaderEnd","startExtra","main","end","useLayoutEffect","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","manualLoading","setManualLoading","setError","setUploading","initialSearch","initialTabRaw","initialSourceRaw","initialTab","has","initialSourceFilter","setActionFeedback","sourceFilter","setTogglingSkillName","enabledOverride","setEnabledOverride","setDetailLoading","setInstallingMarketName","setUsingSkillInChatName","providersRefreshKey","setProvidersRefreshKey","marketplaceDetailProviderRef","trackedUrlProviderRef","trackedProvidersCurrentRef","trackedMarketFilterKeyRef","trackedMarketProviderRef","catalogResource","useAsyncResource","getSkills","then","data","errorData","catalogLoading","setData","setCatalogData","providersResource","providers","current","getMarketplaceProviders","info","getMarketplaceProvider","useEffect","onConfigReload","window","addEventListener","removeEventListener","searchParamsKey","toString","trackedSearchParamsKeyRef","nextQ","nextTabRaw","nextSourceRaw","nextTab","nextSource","prev","nextMcat","trackedHasTokenRef","marketFilterKey","mpSkillsResource","getMarketplaceSkills","q","pageSize","sort","category","mpCategoriesResource","getMarketplaceCategories","marketplaceLoadFailed","marketplaceCategoriesFailed","some","load","opts","silent","loadFailed","catalogFetchError","displayError","URLSearchParams","set","showFeedback","durationMs","setTimeout","getSkillMarkdown","detailLoadFailed","packageId","listTitle","browse","pkg","getMarketplacePackageDetail","skillDocPreview","readme","marketplaceNoReadme","next","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\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_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 { Button } from '@/components/ui/button';\nimport { SkillCardIcon } from '@/features/skills/skill-card-icon';\nimport { SkillCatalogCardSkeleton } 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 | 'sourceLabel'\n | 'openSkillDetail'\n | 'onUseSkillInChat'\n | 'usingSkillInChatName'\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 sourceLabel,\n openSkillDetail,\n onUseSkillInChat,\n usingSkillInChatName,\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 <Button\n type=\"button\"\n variant=\"secondary\"\n className=\"h-8 shrink-0 whitespace-nowrap px-2.5 text-xs font-medium\"\n disabled={usingSkillInChatName === row.name}\n onClick={() =>\n void onUseSkillInChat({ name: row.name, source: 'catalog' })\n }\n >\n {usingSkillInChatName === row.name\n ? sk.previewUseInChatBusy\n : sk.previewUseInChat}\n </Button>\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 */\nfunction 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 */\nfunction 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 { ExternalLink, Info, Trash2, 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 | 'detailDirectoryId'\n | 'detailManaged'\n | 'detailExternalUrl'\n | 'usingSkillInChatName'\n | 'installingMarketName'\n | 'togglingSkillName'\n | 'isSkillInstalledByName'\n | 'onUseSkillInChat'\n | 'onMarketInstall'\n | 'onSkillToggle'\n | 'setConfirmId'\n | 'setConfirmOpen'\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 detailDirectoryId,\n detailManaged,\n detailExternalUrl,\n usingSkillInChatName,\n installingMarketName,\n togglingSkillName,\n isSkillInstalledByName,\n onUseSkillInChat,\n onMarketInstall,\n onSkillToggle,\n setConfirmId,\n setConfirmOpen,\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 items-center justify-between gap-2 border-t border-edge px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n {detailSource === 'store' && detailExternalUrl ? (\n <a\n href={detailExternalUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n 'inline-flex h-9 items-center gap-1.5 rounded-lg border border-edge bg-surface-panel px-3 text-sm font-medium 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-4\" strokeWidth={1.75} aria-hidden />\n <span>{sk.marketplaceOpenExternal}</span>\n </a>\n ) : null}\n {detailSource === 'catalog' && detailManaged && detailDirectoryId ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"gap-1.5 text-red-600 hover:bg-red-50 hover:text-red-700 dark:text-red-400 dark:hover:bg-red-950/40 dark:hover:text-red-300\"\n onClick={() => {\n setConfirmId(detailDirectoryId);\n setConfirmOpen(true);\n }}\n >\n <Trash2 className=\"size-4\" strokeWidth={1.75} aria-hidden />\n {sk.delete}\n </Button>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\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 </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, 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 } 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 | 'marketPage'\n | 'setMarketPage'\n | 'isSkillInstalledByName'\n | 'openMarketplaceDetail'\n | 'onUseSkillInChat'\n | 'usingSkillInChatName'\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 marketPage,\n setMarketPage,\n isSkillInstalledByName,\n openMarketplaceDetail,\n onUseSkillInChat,\n usingSkillInChatName,\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 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('button')) return;\n void openMarketplaceDetail(row.id, row.name);\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 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\n role=\"group\"\n className=\"flex shrink-0 items-center gap-1\"\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={mpLoading || usingSkillInChatName === row.id}\n onClick={() =>\n void onUseSkillInChat({ name: row.id, source: 'store' })\n }\n >\n {usingSkillInChatName === row.id\n ? sk.previewUseInChatBusy\n : sk.previewUseInChat}\n </Button>\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 actionFeedback,\n mainTab,\n setMainTab,\n setSourceFilter,\n builtinTabStats,\n userTabStats,\n marketSort,\n setMarketSort,\n marketBrowseProvider,\n setMarketBrowseProvider,\n registeredProviders,\n filterLabel,\n inSettingsShell,\n } = vm;\n\n if (!hasToken) {\n return (\n <>\n <SkillsPageHeaderRegistration vm={vm} />\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\n return (\n <>\n <SkillsPageHeaderRegistration vm={vm} />\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 <SkillsPageHeaderEnd\n loading={vm.loading}\n onReloadClick={vm.onReloadClick}\n searchQuery={vm.searchQuery}\n setSearchQuery={vm.setSearchQuery}\n mainTab={vm.mainTab}\n sk={vm.sk}\n setPendingFile={vm.setPendingFile}\n setInstallOpen={vm.setInstallOpen}\n />\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}\n\nfunction SkillsPageHeaderRegistration({ vm }: { vm: SkillsPageVm }) {\n const {\n sk,\n hasToken,\n loading,\n onReloadClick,\n searchQuery,\n setSearchQuery,\n mainTab,\n setPendingFile,\n setInstallOpen,\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 return null;\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 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 {\n marketplacePublicSkillUrl,\n normalizeCatalogEntry,\n} from '@/features/skills/skills-page.utils';\nimport { messages } from '@/i18n/messages';\nimport { useAsyncResource } from '@/lib/use-async-resource';\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 [manualLoading, setManualLoading] = 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 [installingMarketName, setInstallingMarketName] = useState<string | null>(null);\n const [usingSkillInChatName, setUsingSkillInChatName] = useState<string | null>(null);\n const [marketCategoryId, setMarketCategoryId] = useState('');\n const [marketBrowseProvider, setMarketBrowseProvider] = useState<string | null>(null);\n const [providersRefreshKey, setProvidersRefreshKey] = useState(0);\n const marketplaceDetailProviderRef = useRef<string | null>(null);\n const trackedUrlProviderRef = useRef<string | null>(urlMarketProvider);\n const trackedProvidersCurrentRef = useRef<string | null>(null);\n const trackedMarketFilterKeyRef = useRef('');\n const trackedMarketProviderRef = useRef<string | null>(null);\n\n const catalogResource = useAsyncResource(\n () =>\n getSkills(language !== 'en' ? language : undefined).then((data) =>\n data.catalog.map(normalizeCatalogEntry),\n ),\n [hasToken, language],\n { enabled: hasToken, initial: [] as SkillCatalogEntry[], errorData: [] },\n );\n const { data: catalog, loading: catalogLoading, setData: setCatalogData } = catalogResource;\n\n const providersResource = useAsyncResource(\n async () => {\n try {\n const { providers, current } = await getMarketplaceProviders();\n return {\n providers: providers.map((p) => ({ id: p.id, displayName: p.displayName })),\n current,\n };\n } catch {\n try {\n const info = await getMarketplaceProvider();\n return { providers: [] as MarketplaceProviderInfo[], current: info.provider };\n } catch {\n return { providers: [] as MarketplaceProviderInfo[], current: 'skillhub' };\n }\n }\n },\n [hasToken, providersRefreshKey],\n {\n enabled: hasToken,\n initial: { providers: [] as MarketplaceProviderInfo[], current: null as string | null },\n },\n );\n\n const loading = manualLoading || catalogLoading;\n const registeredProviders = providersResource.data.providers;\n\n useEffect(() => {\n const onConfigReload = () => setProvidersRefreshKey((k) => k + 1);\n window.addEventListener('config-reload', onConfigReload);\n return () => window.removeEventListener('config-reload', onConfigReload);\n }, []);\n\n // Sync URL → local state during render so the URL→state→URL effect chain doesn't add a render.\n const searchParamsKey = searchParams.toString();\n const trackedSearchParamsKeyRef = useRef(searchParamsKey);\n if (trackedSearchParamsKeyRef.current !== searchParamsKey) {\n trackedSearchParamsKeyRef.current = searchParamsKey;\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 }\n\n const trackedHasTokenRef = useRef(hasToken);\n if (!hasToken && trackedHasTokenRef.current) {\n setMarketBrowseProvider(null);\n marketplaceDetailProviderRef.current = null;\n }\n trackedHasTokenRef.current = hasToken;\n\n if (hasToken && urlMarketProvider && trackedUrlProviderRef.current !== urlMarketProvider) {\n trackedUrlProviderRef.current = urlMarketProvider;\n setMarketBrowseProvider(urlMarketProvider);\n }\n if (\n hasToken &&\n urlMarketProvider == null &&\n providersResource.data.current &&\n providersResource.data.current !== trackedProvidersCurrentRef.current\n ) {\n trackedProvidersCurrentRef.current = providersResource.data.current;\n setMarketBrowseProvider((prev) => prev ?? providersResource.data.current);\n }\n\n const marketFilterKey = `${searchQuery}|${marketSort}|${mainTab}|${marketCategoryId}|${marketBrowseProvider ?? ''}`;\n if (trackedMarketFilterKeyRef.current !== marketFilterKey) {\n trackedMarketFilterKeyRef.current = marketFilterKey;\n setMarketPage(1);\n }\n\n if (\n mainTab === 'marketplace' &&\n marketBrowseProvider &&\n trackedMarketProviderRef.current != null &&\n trackedMarketProviderRef.current !== marketBrowseProvider\n ) {\n setMarketCategoryId('');\n }\n trackedMarketProviderRef.current = marketBrowseProvider;\n\n const mpSkillsResource = useAsyncResource(\n () =>\n 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 [hasToken, mainTab, marketCategoryId, marketPage, marketSort, searchQuery, marketBrowseProvider],\n {\n enabled: hasToken && mainTab === 'marketplace' && Boolean(marketBrowseProvider),\n initial: null as {\n items: MarketplacePackageItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider?: string;\n } | null,\n errorData: null,\n },\n );\n\n const mpCategoriesResource = useAsyncResource(\n () => getMarketplaceCategories({ provider: marketBrowseProvider! }).then((r) => r.items),\n [hasToken, mainTab, marketBrowseProvider],\n {\n enabled: hasToken && mainTab === 'marketplace' && Boolean(marketBrowseProvider),\n initial: [] as MarketplaceCategoryItem[],\n errorData: [],\n },\n );\n\n const mpPayload = mainTab === 'marketplace' ? mpSkillsResource.data : null;\n const mpLoading = mainTab === 'marketplace' ? mpSkillsResource.loading : false;\n const mpError =\n mpSkillsResource.error instanceof Error\n ? mpSkillsResource.error.message\n : mpSkillsResource.error\n ? sk.marketplaceLoadFailed\n : null;\n const mpCategories = mainTab === 'marketplace' ? mpCategoriesResource.data : [];\n const mpCategoriesLoading = mainTab === 'marketplace' ? mpCategoriesResource.loading : false;\n const mpCategoriesError =\n mpCategoriesResource.error instanceof Error\n ? mpCategoriesResource.error.message\n : mpCategoriesResource.error\n ? sk.marketplaceCategoriesFailed\n : null;\n\n if (\n marketCategoryId.trim() &&\n mpCategories.length > 0 &&\n !mpCategories.some((c) => c.id === marketCategoryId)\n ) {\n setMarketCategoryId('');\n }\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 setManualLoading(true);\n }\n setError(null);\n try {\n const data = await getSkills(language !== 'en' ? language : undefined);\n setCatalogData(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 setManualLoading(false);\n }\n }\n },\n [language, setCatalogData, sk.loadFailed],\n );\n\n const catalogFetchError =\n !manualLoading && catalogResource.error\n ? catalogResource.error instanceof Error\n ? catalogResource.error.message\n : sk.loadFailed\n : null;\n const displayError = error ?? catalogFetchError;\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 setManualLoading(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 setManualLoading(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 const detailDirectoryId = detailFromCatalog?.directoryId ?? null;\n const detailManaged = detailFromCatalog?.managed ?? false;\n const detailExternalUrl = useMemo(() => {\n if (detailSource !== 'store' || !detailTitle) return null;\n const provider = marketplaceDetailProviderRef.current ?? marketBrowseProvider;\n return marketplacePublicSkillUrl(provider, detailTitle);\n }, [detailSource, detailTitle, marketBrowseProvider]);\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(\n async (opts?: { name?: string; source?: 'catalog' | 'store' }) => {\n const name = (opts?.name ?? detailTitle).trim();\n if (!name) return;\n const source = opts?.source ?? detailSource;\n setActionFeedback(null);\n const needsMarketInstall = source === 'store' && !isSkillInstalledByName(name);\n 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 [\n detailTitle,\n detailSource,\n isSkillInstalledByName,\n load,\n navigate,\n showFeedback,\n sk.uploadFailed,\n marketBrowseProvider,\n ],\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: displayError,\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 detailDirectoryId,\n detailManaged,\n detailExternalUrl,\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-DueZ9Qfg.js"}