@appthen/vibe-workspace 0.1.6 → 0.1.8

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 (89) hide show
  1. package/PLUGIN_DEV.md +30 -0
  2. package/dist/{DocxPreview-GruinkmZ.js → DocxPreview-CAmipQT3.js} +5 -5
  3. package/dist/{DocxPreview-GruinkmZ.js.map → DocxPreview-CAmipQT3.js.map} +1 -1
  4. package/dist/{DotBadge-Dm0es7Ho.js → DotBadge-CeeLzNu3.js} +3 -3
  5. package/dist/{DotBadge-Dm0es7Ho.js.map → DotBadge-CeeLzNu3.js.map} +1 -1
  6. package/dist/{ExtensionManifestSchema-BIuNTfeS.js → ExtensionManifestSchema-INV7dTEG.js} +3 -3
  7. package/dist/{ExtensionManifestSchema-BIuNTfeS.js.map → ExtensionManifestSchema-INV7dTEG.js.map} +1 -1
  8. package/dist/{FreeCanvas-BC24RbJp.js → FreeCanvas-DritKIPq.js} +2 -2
  9. package/dist/{FreeCanvas-BC24RbJp.js.map → FreeCanvas-DritKIPq.js.map} +1 -1
  10. package/dist/{ImagePreview-BUZPZ76T.js → ImagePreview-ByIQrPzb.js} +4 -4
  11. package/dist/{ImagePreview-BUZPZ76T.js.map → ImagePreview-ByIQrPzb.js.map} +1 -1
  12. package/dist/{PdfPreview-C431TVJo.js → PdfPreview-0vwF3tLn.js} +4 -4
  13. package/dist/{PdfPreview-C431TVJo.js.map → PdfPreview-0vwF3tLn.js.map} +1 -1
  14. package/dist/{PluginContext-J-PUm9Dt.js → PluginContext-uAiGNF8S.js} +2 -20
  15. package/dist/PluginContext-uAiGNF8S.js.map +1 -0
  16. package/dist/{Workbench-C3Gi8mtZ.js → Workbench-8uTfTtsq.js} +4267 -2776
  17. package/dist/{Workbench-C3Gi8mtZ.js.map → Workbench-8uTfTtsq.js.map} +1 -1
  18. package/dist/{activate-Cn14NQGw.js → activate-DVnxnmfA.js} +84 -80
  19. package/dist/{activate-Cn14NQGw.js.map → activate-DVnxnmfA.js.map} +1 -1
  20. package/dist/canvas-core/index.js +1 -1
  21. package/dist/coding-kit/index.js +1 -1
  22. package/dist/components/index.js +4 -4
  23. package/dist/{devWorkbench-DC7468GN.js → devWorkbench-DZ1mFC3i.js} +45 -9
  24. package/dist/devWorkbench-DZ1mFC3i.js.map +1 -0
  25. package/dist/{dialog-DK8v51ew.js → dialog-ssICQNSV.js} +2 -2
  26. package/dist/{dialog-DK8v51ew.js.map → dialog-ssICQNSV.js.map} +1 -1
  27. package/dist/{docx-preview-BdpXCqA9.js → docx-preview-lJ7EdPsl.js} +2 -2
  28. package/dist/{docx-preview-BdpXCqA9.js.map → docx-preview-lJ7EdPsl.js.map} +1 -1
  29. package/dist/extension-cli/index.js +1 -1
  30. package/dist/extension-dev/index.js +1 -1
  31. package/dist/extension-dev-workbench/index.js +4 -4
  32. package/dist/extension-schema/index.js +3 -3
  33. package/dist/{extensionRegistry-C_OUg-8s.js → extensionRegistry-D35Ld-Wa.js} +10 -7
  34. package/dist/{extensionRegistry-C_OUg-8s.js.map → extensionRegistry-D35Ld-Wa.js.map} +1 -1
  35. package/dist/index.js +17 -17
  36. package/dist/index.js.map +1 -1
  37. package/dist/{list-detail-workspace-template-BVyGyLpE.js → list-detail-workspace-template-BTrgMGPx.js} +2 -2
  38. package/dist/{list-detail-workspace-template-BVyGyLpE.js.map → list-detail-workspace-template-BTrgMGPx.js.map} +1 -1
  39. package/dist/overlay/index.js +2 -2
  40. package/dist/{pluginCapabilities-9gzDTIuB.js → pluginCapabilities-BkCT7QDO.js} +197 -20
  41. package/dist/pluginCapabilities-BkCT7QDO.js.map +1 -0
  42. package/dist/plugins/agent/PluginModule.js +2 -2
  43. package/dist/plugins/base/index.js +1 -1
  44. package/dist/{sheet-CdvS0URe.js → sheet-Bsq3CLW4.js} +6 -6
  45. package/dist/{sheet-CdvS0URe.js.map → sheet-Bsq3CLW4.js.map} +1 -1
  46. package/dist/{skeleton-99iI2m9p.js → skeleton-BSqTbX9l.js} +4 -4
  47. package/dist/{skeleton-99iI2m9p.js.map → skeleton-BSqTbX9l.js.map} +1 -1
  48. package/dist/types-BL0aIpQ1.js.map +1 -1
  49. package/dist/ui/index.js +3 -3
  50. package/dist/{useBinaryFileUrl-CcgcbIxT.js → useBinaryFileUrl-D11yvGuG.js} +3 -3
  51. package/dist/{useBinaryFileUrl-CcgcbIxT.js.map → useBinaryFileUrl-D11yvGuG.js.map} +1 -1
  52. package/dist/vibe-workspace/src/components/ExtensionBadgeMark.d.ts +10 -0
  53. package/dist/vibe-workspace/src/components/LayoutSystem.d.ts +4 -0
  54. package/dist/vibe-workspace/src/components/MonacoWrapper.d.ts +5 -1
  55. package/dist/vibe-workspace/src/components/TopBar.d.ts +2 -0
  56. package/dist/vibe-workspace/src/core/extensionBadges.d.ts +47 -0
  57. package/dist/vibe-workspace/src/core/extensionBadges.test.d.ts +1 -0
  58. package/dist/vibe-workspace/src/core/extensionViews.d.ts +6 -0
  59. package/dist/vibe-workspace/src/core/pluginCapabilities.d.ts +15 -0
  60. package/dist/vibe-workspace/src/extension-dev/workspace.d.ts +10 -0
  61. package/dist/vibe-workspace/src/hooks/useThemeLayout.d.ts +3 -0
  62. package/dist/vibe-workspace/src/index.d.ts +1 -0
  63. package/dist/vibe-workspace/src/plugins/base/types.d.ts +1 -0
  64. package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/ComponentDockBar.d.ts +6 -0
  65. package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/DynamicComponentZone.d.ts +5 -3
  66. package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/PanelSlotCard.d.ts +6 -1
  67. package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/ParticipantBar.d.ts +1 -2
  68. package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/ParticipantBarItem.d.ts +18 -15
  69. package/dist/vibe-workspace/src/plugins/conversation-network/conversationHubShell.d.ts +14 -1
  70. package/dist/vibe-workspace/src/plugins/conversation-network/services/conversationHubShellResolver.d.ts +3 -1
  71. package/dist/vibe-workspace/src/services/authRedirect.d.ts +1 -0
  72. package/dist/vibe-workspace/src/services/themeService.d.ts +81 -7
  73. package/dist/vibe-workspace/src/workbench/WorkbenchAccountMenu.d.ts +5 -0
  74. package/dist/vibe-workspace.css +36 -43
  75. package/dist/workbench/index.js +2 -2
  76. package/package.json +6 -4
  77. package/postcss.config.js +5 -0
  78. package/tailwind.config.js +150 -0
  79. package/dist/PluginContext-J-PUm9Dt.js.map +0 -1
  80. package/dist/devWorkbench-DC7468GN.js.map +0 -1
  81. package/dist/pluginCapabilities-9gzDTIuB.js.map +0 -1
  82. package/dist/vibe-workspace/src/AgentEmbedPage.d.ts +0 -1
  83. package/dist/vibe-workspace/src/plugins/work-weixin/WorkWeixinPlugin.d.ts +0 -5
  84. package/dist/vibe-workspace/src/plugins/work-weixin/apiService.d.ts +0 -8
  85. package/dist/vibe-workspace/src/plugins/work-weixin/configService.d.ts +0 -46
  86. package/dist/vibe-workspace/src/plugins/work-weixin/index.d.ts +0 -2
  87. package/dist/vibe-workspace/src/plugins/workbench-admin/WorkbenchAdminSidebar.d.ts +0 -7
  88. package/dist/vibe-workspace/src/plugins/workbench-admin/activate.d.ts +0 -2
  89. package/dist/vibe-workspace/src/plugins/workbench-admin/index.d.ts +0 -2
@@ -4,7 +4,7 @@ import { S as Search } from "./search-BmktXQFD.js";
4
4
  import { C as ConsoleInput, S as SurfacePanel } from "./panel-Brh_nRmF.js";
5
5
  import { B as Bell, A as ArrowLeft } from "./bell-D9i7ClxC.js";
6
6
  import * as React from "react";
7
- import { q as Slot, S as Sheet, b as SheetContent, e as SheetHeader, h as SheetTitle, c as SheetDescription, d as SheetFooter } from "./sheet-CdvS0URe.js";
7
+ import { q as Slot, S as Sheet, b as SheetContent, e as SheetHeader, h as SheetTitle, c as SheetDescription, d as SheetFooter } from "./sheet-Bsq3CLW4.js";
8
8
  import { c as cva } from "./index-CwWryNvI.js";
9
9
  import { a as ChevronRight } from "./chevron-right-D51vM8ri.js";
10
10
  const consoleButtonVariants = cva(
@@ -474,4 +474,4 @@ export {
474
474
  CodingProductRail as c,
475
475
  ProjectWorkspaceShell as d
476
476
  };
477
- //# sourceMappingURL=list-detail-workspace-template-BVyGyLpE.js.map
477
+ //# sourceMappingURL=list-detail-workspace-template-BTrgMGPx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-detail-workspace-template-BVyGyLpE.js","sources":["../src/coding-kit/primitives/button.tsx","../src/coding-kit/patterns/action-toolbar.tsx","../src/coding-kit/patterns/console-shell.tsx","../src/coding-kit/patterns/data-table-shell.tsx","../src/coding-kit/patterns/metric-card.tsx","../src/coding-kit/patterns/page-section.tsx","../src/coding-kit/patterns/project-workspace-shell.tsx","../src/coding-kit/templates/list-detail-workspace-template.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst consoleButtonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--ck-radius-sm)] border text-[13px] font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ck-brand-primary)]/20 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n primary:\n \"border-[var(--ck-brand-primary)] bg-[var(--ck-brand-primary)] text-[var(--ck-brand-contrast)] hover:border-[var(--ck-brand-primary-hover)] hover:bg-[var(--ck-brand-primary-hover)]\",\n secondary:\n \"border-[var(--ck-border-default)] bg-[var(--ck-bg-surface)] text-[var(--ck-text-primary)] hover:border-[var(--ck-border-strong)] hover:bg-[var(--ck-bg-hover)]\",\n ghost:\n \"border-transparent bg-transparent text-[var(--ck-text-secondary)] hover:bg-[var(--ck-bg-hover)] hover:text-[var(--ck-text-primary)]\",\n danger:\n \"border-[var(--ck-danger-text)] bg-[var(--ck-danger-text)] text-white hover:opacity-90\",\n },\n size: {\n md: \"h-8 px-3\",\n sm: \"h-7 px-2.5 text-[12px]\",\n icon: \"h-8 w-8\",\n },\n },\n defaultVariants: {\n variant: \"secondary\",\n size: \"md\",\n },\n }\n);\n\nexport interface ConsoleButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof consoleButtonVariants> {\n asChild?: boolean;\n}\n\nexport const ConsoleButton = React.forwardRef<\n HTMLButtonElement,\n ConsoleButtonProps\n>(({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n className={cn(consoleButtonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n});\n\nConsoleButton.displayName = \"ConsoleButton\";\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport function ActionToolbar({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-3 rounded-[var(--ck-radius-md)] border border-[var(--ck-border-default)] bg-[var(--ck-bg-surface-muted)] p-4 md:flex-row md:items-center md:justify-between\",\n className\n )}\n {...props}\n />\n );\n}\n","import * as React from \"react\";\nimport { Bell, Search } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { ConsoleButton } from \"../primitives\";\nimport { ConsoleInput } from \"../primitives\";\n\nexport interface ConsoleNavItem {\n key: string;\n label: string;\n icon: React.ReactNode;\n}\n\ninterface ConsoleShellProps {\n navItems: ConsoleNavItem[];\n activeKey: string;\n onActiveKeyChange?: (key: string) => void;\n title: string;\n subtitle?: string;\n topbarActions?: React.ReactNode;\n sidebarFooter?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport function ConsoleShell({\n navItems,\n activeKey,\n onActiveKeyChange,\n title,\n subtitle,\n topbarActions,\n sidebarFooter,\n children,\n}: ConsoleShellProps) {\n return (\n <div className=\"coding-kit flex min-h-screen bg-[var(--ck-bg-page)] text-[var(--ck-text-primary)]\">\n <aside className=\"hidden w-[var(--ck-sidebar-width)] shrink-0 flex-col border-r border-[var(--ck-border-default)] bg-[var(--ck-bg-sidebar)] lg:flex\">\n <div className=\"flex h-12 items-center justify-center border-b border-[var(--ck-border-default)]\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-[var(--ck-radius-sm)] bg-[var(--ck-brand-primary)] text-[11px] font-semibold text-white\">\n FX\n </div>\n </div>\n\n <nav className=\"flex-1 space-y-1 px-2 py-3\">\n {navItems.map((item) => {\n const active = item.key === activeKey;\n\n return (\n <button\n key={item.key}\n className={cn(\n \"flex w-full flex-col items-center gap-1 rounded-[var(--ck-radius-sm)] px-2 py-2 text-center text-[11px] transition-colors\",\n active\n ? \"bg-[var(--ck-bg-surface)] text-[var(--ck-brand-primary)] shadow-[var(--ck-shadow-sm)]\"\n : \"text-[var(--ck-text-secondary)] hover:bg-[var(--ck-bg-hover)] hover:text-[var(--ck-text-primary)]\"\n )}\n onClick={() => onActiveKeyChange?.(item.key)}\n type=\"button\"\n >\n <span className=\"flex h-5 w-5 items-center justify-center\">\n {item.icon}\n </span>\n <span className=\"leading-tight\">{item.label}</span>\n </button>\n );\n })}\n </nav>\n\n <div className=\"border-t border-[var(--ck-border-default)] p-2\">\n {sidebarFooter}\n </div>\n </aside>\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <header className=\"sticky top-0 z-10 flex h-[var(--ck-topbar-height)] items-center justify-between border-b border-[var(--ck-border-default)] bg-[var(--ck-bg-surface)] px-5\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-[15px] font-semibold\">{title}</div>\n {subtitle ? (\n <div className=\"truncate text-[12px] text-[var(--ck-text-muted)]\">\n {subtitle}\n </div>\n ) : null}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <div className=\"relative hidden w-[220px] md:block\">\n <Search className=\"pointer-events-none absolute left-2.5 inset-y-0 my-auto h-3.5 w-3.5 text-[var(--ck-text-muted)]\" />\n <ConsoleInput className=\"pl-8\" placeholder=\"搜索主体、Agent、扩展\" />\n </div>\n <ConsoleButton size=\"icon\" variant=\"ghost\" aria-label=\"消息提醒\">\n <Bell className=\"h-4 w-4\" />\n </ConsoleButton>\n {topbarActions}\n </div>\n </header>\n\n <main className=\"min-h-0 flex-1 overflow-y-auto p-5\">{children}</main>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { SurfacePanel } from \"../primitives\";\n\nexport interface DataColumn<T> {\n key: string;\n title: string;\n className?: string;\n render: (row: T) => React.ReactNode;\n}\n\ninterface DataTableShellProps<T> {\n columns: DataColumn<T>[];\n rows: T[];\n rowKey: (row: T) => string;\n emptyState?: React.ReactNode;\n}\n\nexport function DataTableShell<T>({\n columns,\n rows,\n rowKey,\n emptyState,\n}: DataTableShellProps<T>) {\n if (!rows.length && emptyState) {\n return <>{emptyState}</>;\n }\n\n return (\n <SurfacePanel className=\"overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full border-collapse text-left\">\n <thead>\n <tr className=\"bg-[var(--ck-bg-surface-muted)]\">\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n \"border-b border-[var(--ck-border-default)] px-4 py-3 text-[12px] font-medium text-[var(--ck-text-muted)]\",\n column.className\n )}\n >\n {column.title}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr\n key={rowKey(row)}\n className=\"border-b border-[var(--ck-border-default)] last:border-b-0 hover:bg-[var(--ck-bg-hover)]\"\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={cn(\n \"px-4 py-3 text-[13px] text-[var(--ck-text-secondary)]\",\n column.className\n )}\n >\n {column.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { SurfacePanel } from \"../primitives\";\n\ninterface MetricCardProps {\n label: string;\n value: string;\n hint?: string;\n accent?: \"brand\" | \"warning\" | \"success\";\n icon?: React.ReactNode;\n}\n\nconst accentMap = {\n brand: \"bg-[var(--ck-bg-brand-soft)] text-[var(--ck-brand-primary)]\",\n warning: \"bg-[var(--ck-warning-soft)] text-[var(--ck-warning-text)]\",\n success: \"bg-[var(--ck-success-soft)] text-[var(--ck-success-text)]\",\n} as const;\n\nexport function MetricCard({\n label,\n value,\n hint,\n accent = \"brand\",\n icon,\n}: MetricCardProps) {\n return (\n <SurfacePanel className=\"p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-[12px] text-[var(--ck-text-muted)]\">{label}</div>\n <div className=\"mt-2 text-[24px] font-semibold leading-none text-[var(--ck-text-primary)]\">\n {value}\n </div>\n {hint ? (\n <div className=\"mt-2 text-[12px] text-[var(--ck-text-secondary)]\">\n {hint}\n </div>\n ) : null}\n </div>\n {icon ? (\n <div className={`flex h-9 w-9 items-center justify-center rounded-[var(--ck-radius-sm)] ${accentMap[accent]}`}>\n {icon}\n </div>\n ) : null}\n </div>\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { SurfacePanel } from \"../primitives\";\n\ninterface PageSectionProps {\n title: string;\n description?: string;\n actions?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport function PageSection({\n title,\n description,\n actions,\n children,\n}: PageSectionProps) {\n return (\n <SurfacePanel className=\"p-5\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <div>\n <h2 className=\"text-[16px] font-semibold text-[var(--ck-text-primary)]\">\n {title}\n </h2>\n {description ? (\n <p className=\"mt-1 text-[13px] text-[var(--ck-text-secondary)]\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? <div className=\"shrink-0\">{actions}</div> : null}\n </div>\n {children}\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface CodingProductNavItem {\n label: string;\n icon: React.ComponentType<{ className?: string; strokeWidth?: string | number }>;\n active?: boolean;\n}\n\ninterface CodingProductRailProps {\n items: CodingProductNavItem[];\n userName?: string;\n editionLabel?: string;\n brandMark?: string;\n className?: string;\n}\n\nexport function CodingProductRail({\n items,\n userName,\n editionLabel = \"标准版\",\n brandMark = \"M\",\n className,\n}: CodingProductRailProps) {\n return (\n <aside\n className={cn(\n \"hidden w-[64px] shrink-0 flex-col border-r border-[var(--ck-border-subtle)] bg-[var(--ck-bg-sidebar)] lg:flex\",\n className,\n )}\n >\n <div className=\"flex flex-col items-center border-b border-[var(--ck-border-subtle)] px-2 py-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-[var(--ck-card-radius-sm)] bg-[var(--ck-rail-brand-bg)] text-[13px] font-semibold text-[var(--ck-brand-contrast)]\">\n {brandMark}\n </div>\n <div className=\"mt-1 rounded-full bg-[var(--ck-rail-brand-soft)] px-1.5 py-[1px] text-[9px] font-medium text-[var(--ck-rail-brand-text)]\">\n {editionLabel}\n </div>\n </div>\n <nav className=\"flex-1 space-y-1 overflow-auto px-2 py-3\">\n {items.map((item) => {\n const Icon = item.icon;\n return (\n <button\n key={item.label}\n type=\"button\"\n className={cn(\n \"flex w-full flex-col items-center gap-1 rounded-[var(--ck-card-radius-sm)] px-1 py-2 text-center transition-colors\",\n item.active\n ? \"bg-[var(--ck-bg-brand-soft)] text-[var(--ck-brand-primary)]\"\n : \"text-[var(--ck-text-secondary)] hover:bg-[var(--ck-surface-overlay)] hover:text-[var(--ck-text-primary)]\",\n )}\n >\n <Icon className=\"h-4 w-4\" strokeWidth={1.8} />\n <span className=\"text-[11px] leading-none\">{item.label}</span>\n </button>\n );\n })}\n </nav>\n {userName ? (\n <div className=\"border-t border-[var(--ck-border-subtle)] px-2 py-3\">\n <div className=\"flex items-center justify-center rounded-full bg-[var(--ck-rail-user-bg)] px-2 py-2 text-[11px] font-medium text-[var(--ck-brand-contrast)]\">\n {userName.slice(0, 1)}\n </div>\n </div>\n ) : null}\n </aside>\n );\n}\n\ninterface ProjectWorkspaceShellProps {\n productItems: CodingProductNavItem[];\n userName: string;\n projectSidebar?: React.ReactNode;\n systemNotice?: React.ReactNode;\n topBar?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n viewportClassName?: string;\n contentClassName?: string;\n}\n\nexport function ProjectWorkspaceShell({\n productItems,\n userName,\n projectSidebar,\n systemNotice,\n topBar,\n children,\n className,\n viewportClassName,\n contentClassName,\n}: ProjectWorkspaceShellProps) {\n return (\n <div\n className={cn(\n \"coding-kit overflow-visible rounded-[var(--ck-panel-radius)] border border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)]\",\n className,\n )}\n >\n <div className={cn(\"flex min-h-[760px] bg-[var(--ck-surface-page)]\", viewportClassName)}>\n <CodingProductRail items={productItems} userName={userName} />\n {projectSidebar}\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {systemNotice}\n {topBar}\n <div className={cn(\"min-h-0 flex-1\", contentClassName)}>{children}</div>\n </div>\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { ArrowLeft, ChevronRight } from 'lucide-react';\n\nimport {\n WorkbenchDrawer,\n WorkbenchDrawerContent,\n WorkbenchDrawerDescription,\n WorkbenchDrawerFooter,\n WorkbenchDrawerHeader,\n WorkbenchDrawerTitle,\n} from '../../overlay';\nimport { cn } from '../../lib/utils';\nimport { ConsoleButton as CodingButton } from '../primitives/button';\n\nexport interface CodingListDetailRowInfo {\n key: string;\n title: React.ReactNode;\n description?: React.ReactNode;\n meta?: React.ReactNode;\n status?: React.ReactNode;\n}\n\nexport interface CodingListDetailRowRenderContext<TRow> {\n row: TRow;\n info: CodingListDetailRowInfo;\n selected: boolean;\n select: () => void;\n}\n\nexport interface CodingListDetailDetailContext<TRow> {\n row: TRow;\n info: CodingListDetailRowInfo;\n mobile: boolean;\n}\n\nexport interface CodingListDetailWorkspaceProps<TRow> {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n rows: TRow[];\n getRowInfo: (row: TRow) => CodingListDetailRowInfo;\n renderDetail: (\n context: CodingListDetailDetailContext<TRow>,\n ) => React.ReactNode;\n renderRow?: (\n context: CodingListDetailRowRenderContext<TRow>,\n ) => React.ReactNode;\n toolbar?: React.ReactNode;\n headerActions?: React.ReactNode;\n detailActions?: React.ReactNode;\n emptyState?: React.ReactNode;\n selectedKey?: string;\n defaultSelectedKey?: string;\n onSelectedKeyChange?: (key: string) => void;\n editor?: React.ReactNode;\n editorTitle?: React.ReactNode;\n editorDescription?: React.ReactNode;\n editorFooter?: React.ReactNode;\n editorOpen?: boolean;\n onEditorOpenChange?: (open: boolean) => void;\n className?: string;\n}\n\nfunction DefaultRow<TRow>({\n context,\n}: {\n context: CodingListDetailRowRenderContext<TRow>;\n}) {\n const { info, selected, select } = context;\n\n return (\n <button\n type=\"button\"\n aria-current={selected ? 'true' : undefined}\n className={cn(\n 'flex w-full items-start gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-3 text-left transition-colors last:border-b-0 hover:bg-[var(--ck-bg-hover)]',\n selected && 'bg-[var(--ck-bg-active)]',\n )}\n onClick={select}\n >\n <ChevronRight\n className={cn(\n 'mt-0.5 h-4 w-4 shrink-0 text-[var(--ck-text-muted)] transition-transform',\n selected && 'rotate-90 text-[var(--ck-brand-primary)]',\n )}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-[13px] font-medium text-[var(--ck-text-primary)]\">\n {info.title}\n </span>\n {info.status ? (\n <span className=\"shrink-0\">{info.status}</span>\n ) : null}\n </span>\n {info.description ? (\n <span className=\"mt-1 block truncate text-[12px] text-[var(--ck-text-secondary)]\">\n {info.description}\n </span>\n ) : null}\n {info.meta ? (\n <span className=\"mt-1 block truncate text-[11px] text-[var(--ck-text-muted)]\">\n {info.meta}\n </span>\n ) : null}\n </span>\n </button>\n );\n}\n\nexport function CodingListDetailWorkspace<TRow>({\n title,\n subtitle,\n rows,\n getRowInfo,\n renderDetail,\n renderRow,\n toolbar,\n headerActions,\n detailActions,\n emptyState,\n selectedKey,\n defaultSelectedKey,\n onSelectedKeyChange,\n editor,\n editorTitle = '编辑',\n editorDescription,\n editorFooter,\n editorOpen,\n onEditorOpenChange,\n className,\n}: CodingListDetailWorkspaceProps<TRow>) {\n const rowInfos = React.useMemo(\n () => rows.map((row) => ({ row, info: getRowInfo(row) })),\n [getRowInfo, rows],\n );\n const firstKey = rowInfos[0]?.info.key || '';\n const [internalSelectedKey, setInternalSelectedKey] = React.useState(\n defaultSelectedKey || firstKey,\n );\n const [mobileDetailOpen, setMobileDetailOpen] = React.useState(false);\n const [internalEditorOpen, setInternalEditorOpen] = React.useState(false);\n const activeKey = selectedKey ?? internalSelectedKey;\n const selectedEntry =\n rowInfos.find(({ info }) => info.key === activeKey) || rowInfos[0];\n const selectedRow = selectedEntry?.row;\n const selectedInfo = selectedEntry?.info;\n const resolvedEditorOpen = editorOpen ?? internalEditorOpen;\n\n React.useEffect(() => {\n if (!selectedEntry || selectedEntry.info.key === activeKey) return;\n setInternalSelectedKey(selectedEntry.info.key);\n onSelectedKeyChange?.(selectedEntry.info.key);\n }, [activeKey, onSelectedKeyChange, selectedEntry]);\n\n const selectRow = React.useCallback(\n (key: string) => {\n setInternalSelectedKey(key);\n onSelectedKeyChange?.(key);\n setMobileDetailOpen(true);\n },\n [onSelectedKeyChange],\n );\n\n const setEditorOpen = React.useCallback(\n (open: boolean) => {\n setInternalEditorOpen(open);\n onEditorOpenChange?.(open);\n },\n [onEditorOpenChange],\n );\n\n return (\n <div\n className={cn(\n 'coding-kit flex h-full min-h-0 flex-col overflow-hidden rounded-[var(--ck-panel-radius)] border border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)] text-[var(--ck-text-primary)]',\n className,\n )}\n >\n <header className=\"flex shrink-0 items-start justify-between gap-4 border-b border-[var(--ck-border-subtle)] px-4 py-3 sm:px-5\">\n <div className=\"min-w-0\">\n <h1 className=\"truncate text-[16px] font-semibold\">{title}</h1>\n {subtitle ? (\n <p className=\"mt-1 truncate text-[12px] text-[var(--ck-text-muted)]\">\n {subtitle}\n </p>\n ) : null}\n </div>\n {headerActions ? (\n <div className=\"flex shrink-0 items-center gap-2\">{headerActions}</div>\n ) : null}\n </header>\n\n {toolbar ? (\n <div className=\"shrink-0 border-b border-[var(--ck-border-subtle)] bg-[var(--ck-bg-surface-muted)] px-4 py-2.5 sm:px-5\">\n {toolbar}\n </div>\n ) : null}\n\n <main className=\"relative min-h-0 flex-1 overflow-hidden\">\n <section\n className={cn(\n 'flex h-full min-h-0 flex-col lg:w-[min(58%,720px)]',\n mobileDetailOpen && 'hidden lg:flex',\n )}\n >\n <div className=\"flex shrink-0 items-center justify-between gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-2.5 text-[12px] text-[var(--ck-text-muted)] sm:px-5\">\n <span>{rows.length} 条记录</span>\n {selectedInfo ? <span className=\"truncate\">已选:{selectedInfo.title}</span> : null}\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {rows.length === 0 ? (\n emptyState || (\n <div className=\"px-6 py-12 text-center text-sm text-[var(--ck-text-muted)]\">\n 暂无数据\n </div>\n )\n ) : (\n rowInfos.map(({ row, info }) => {\n const context = {\n row,\n info,\n selected: info.key === selectedInfo?.key,\n select: () => selectRow(info.key),\n };\n return (\n <React.Fragment key={info.key}>\n {renderRow ? renderRow(context) : <DefaultRow context={context} />}\n </React.Fragment>\n );\n })\n )}\n </div>\n </section>\n\n {selectedRow && selectedInfo ? (\n <section\n className={cn(\n 'min-h-0 bg-[var(--ck-surface-overlay)] lg:flex lg:min-w-0 lg:flex-1 lg:border-l lg:border-[var(--ck-border-subtle)]',\n mobileDetailOpen && 'absolute inset-0 z-10 flex flex-col',\n !mobileDetailOpen && 'hidden',\n 'lg:!flex lg:!static',\n )}\n >\n <div className=\"flex shrink-0 items-start justify-between gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-3 sm:px-5\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <CodingButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 lg:hidden\"\n aria-label=\"返回列表\"\n onClick={() => setMobileDetailOpen(false)}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </CodingButton>\n <div className=\"min-w-0\">\n <div className=\"truncate text-[13px] font-medium text-[var(--ck-brand-primary)]\">\n 详情\n </div>\n <div className=\"mt-0.5 truncate text-[12px] text-[var(--ck-text-muted)]\">\n {selectedInfo.title}\n </div>\n </div>\n </div>\n {detailActions ? (\n <div className=\"flex shrink-0 items-center gap-2\">{detailActions}</div>\n ) : null}\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-4 sm:p-5\">\n {renderDetail({ row: selectedRow, info: selectedInfo, mobile: mobileDetailOpen })}\n </div>\n </section>\n ) : null}\n </main>\n\n {editor ? (\n <WorkbenchDrawer\n open={resolvedEditorOpen}\n onOpenChange={setEditorOpen}\n >\n <WorkbenchDrawerContent\n side=\"right\"\n mobileSide=\"bottom\"\n className=\"coding-kit flex max-h-[90dvh] flex-col gap-0 overflow-hidden p-0 md:w-[min(560px,calc(100vw-16px))] md:max-w-[560px]\"\n >\n <WorkbenchDrawerHeader className=\"shrink-0 border-b border-[var(--ck-border-subtle)] px-5 py-4 pr-14\">\n <WorkbenchDrawerTitle className=\"text-[16px] font-semibold text-[var(--ck-text-primary)]\">\n {editorTitle}\n </WorkbenchDrawerTitle>\n {editorDescription ? (\n <WorkbenchDrawerDescription className=\"mt-1 text-[12px] text-[var(--ck-text-muted)]\">\n {editorDescription}\n </WorkbenchDrawerDescription>\n ) : null}\n </WorkbenchDrawerHeader>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-5\">{editor}</div>\n {editorFooter ? (\n <WorkbenchDrawerFooter className=\"shrink-0 border-t border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)] px-5 py-3\">\n {editorFooter}\n </WorkbenchDrawerFooter>\n ) : null}\n </WorkbenchDrawerContent>\n </WorkbenchDrawer>\n ) : null}\n </div>\n );\n}\n"],"names":["CodingButton","WorkbenchDrawer","WorkbenchDrawerContent","WorkbenchDrawerHeader","WorkbenchDrawerTitle","WorkbenchDrawerDescription","WorkbenchDrawerFooter"],"mappings":"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"}
1
+ {"version":3,"file":"list-detail-workspace-template-BTrgMGPx.js","sources":["../src/coding-kit/primitives/button.tsx","../src/coding-kit/patterns/action-toolbar.tsx","../src/coding-kit/patterns/console-shell.tsx","../src/coding-kit/patterns/data-table-shell.tsx","../src/coding-kit/patterns/metric-card.tsx","../src/coding-kit/patterns/page-section.tsx","../src/coding-kit/patterns/project-workspace-shell.tsx","../src/coding-kit/templates/list-detail-workspace-template.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst consoleButtonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--ck-radius-sm)] border text-[13px] font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ck-brand-primary)]/20 disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n primary:\n \"border-[var(--ck-brand-primary)] bg-[var(--ck-brand-primary)] text-[var(--ck-brand-contrast)] hover:border-[var(--ck-brand-primary-hover)] hover:bg-[var(--ck-brand-primary-hover)]\",\n secondary:\n \"border-[var(--ck-border-default)] bg-[var(--ck-bg-surface)] text-[var(--ck-text-primary)] hover:border-[var(--ck-border-strong)] hover:bg-[var(--ck-bg-hover)]\",\n ghost:\n \"border-transparent bg-transparent text-[var(--ck-text-secondary)] hover:bg-[var(--ck-bg-hover)] hover:text-[var(--ck-text-primary)]\",\n danger:\n \"border-[var(--ck-danger-text)] bg-[var(--ck-danger-text)] text-white hover:opacity-90\",\n },\n size: {\n md: \"h-8 px-3\",\n sm: \"h-7 px-2.5 text-[12px]\",\n icon: \"h-8 w-8\",\n },\n },\n defaultVariants: {\n variant: \"secondary\",\n size: \"md\",\n },\n }\n);\n\nexport interface ConsoleButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof consoleButtonVariants> {\n asChild?: boolean;\n}\n\nexport const ConsoleButton = React.forwardRef<\n HTMLButtonElement,\n ConsoleButtonProps\n>(({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n className={cn(consoleButtonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n});\n\nConsoleButton.displayName = \"ConsoleButton\";\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport function ActionToolbar({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n \"flex flex-col gap-3 rounded-[var(--ck-radius-md)] border border-[var(--ck-border-default)] bg-[var(--ck-bg-surface-muted)] p-4 md:flex-row md:items-center md:justify-between\",\n className\n )}\n {...props}\n />\n );\n}\n","import * as React from \"react\";\nimport { Bell, Search } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { ConsoleButton } from \"../primitives\";\nimport { ConsoleInput } from \"../primitives\";\n\nexport interface ConsoleNavItem {\n key: string;\n label: string;\n icon: React.ReactNode;\n}\n\ninterface ConsoleShellProps {\n navItems: ConsoleNavItem[];\n activeKey: string;\n onActiveKeyChange?: (key: string) => void;\n title: string;\n subtitle?: string;\n topbarActions?: React.ReactNode;\n sidebarFooter?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport function ConsoleShell({\n navItems,\n activeKey,\n onActiveKeyChange,\n title,\n subtitle,\n topbarActions,\n sidebarFooter,\n children,\n}: ConsoleShellProps) {\n return (\n <div className=\"coding-kit flex min-h-screen bg-[var(--ck-bg-page)] text-[var(--ck-text-primary)]\">\n <aside className=\"hidden w-[var(--ck-sidebar-width)] shrink-0 flex-col border-r border-[var(--ck-border-default)] bg-[var(--ck-bg-sidebar)] lg:flex\">\n <div className=\"flex h-12 items-center justify-center border-b border-[var(--ck-border-default)]\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-[var(--ck-radius-sm)] bg-[var(--ck-brand-primary)] text-[11px] font-semibold text-white\">\n FX\n </div>\n </div>\n\n <nav className=\"flex-1 space-y-1 px-2 py-3\">\n {navItems.map((item) => {\n const active = item.key === activeKey;\n\n return (\n <button\n key={item.key}\n className={cn(\n \"flex w-full flex-col items-center gap-1 rounded-[var(--ck-radius-sm)] px-2 py-2 text-center text-[11px] transition-colors\",\n active\n ? \"bg-[var(--ck-bg-surface)] text-[var(--ck-brand-primary)] shadow-[var(--ck-shadow-sm)]\"\n : \"text-[var(--ck-text-secondary)] hover:bg-[var(--ck-bg-hover)] hover:text-[var(--ck-text-primary)]\"\n )}\n onClick={() => onActiveKeyChange?.(item.key)}\n type=\"button\"\n >\n <span className=\"flex h-5 w-5 items-center justify-center\">\n {item.icon}\n </span>\n <span className=\"leading-tight\">{item.label}</span>\n </button>\n );\n })}\n </nav>\n\n <div className=\"border-t border-[var(--ck-border-default)] p-2\">\n {sidebarFooter}\n </div>\n </aside>\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <header className=\"sticky top-0 z-10 flex h-[var(--ck-topbar-height)] items-center justify-between border-b border-[var(--ck-border-default)] bg-[var(--ck-bg-surface)] px-5\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-[15px] font-semibold\">{title}</div>\n {subtitle ? (\n <div className=\"truncate text-[12px] text-[var(--ck-text-muted)]\">\n {subtitle}\n </div>\n ) : null}\n </div>\n\n <div className=\"flex items-center gap-2\">\n <div className=\"relative hidden w-[220px] md:block\">\n <Search className=\"pointer-events-none absolute left-2.5 inset-y-0 my-auto h-3.5 w-3.5 text-[var(--ck-text-muted)]\" />\n <ConsoleInput className=\"pl-8\" placeholder=\"搜索主体、Agent、扩展\" />\n </div>\n <ConsoleButton size=\"icon\" variant=\"ghost\" aria-label=\"消息提醒\">\n <Bell className=\"h-4 w-4\" />\n </ConsoleButton>\n {topbarActions}\n </div>\n </header>\n\n <main className=\"min-h-0 flex-1 overflow-y-auto p-5\">{children}</main>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { SurfacePanel } from \"../primitives\";\n\nexport interface DataColumn<T> {\n key: string;\n title: string;\n className?: string;\n render: (row: T) => React.ReactNode;\n}\n\ninterface DataTableShellProps<T> {\n columns: DataColumn<T>[];\n rows: T[];\n rowKey: (row: T) => string;\n emptyState?: React.ReactNode;\n}\n\nexport function DataTableShell<T>({\n columns,\n rows,\n rowKey,\n emptyState,\n}: DataTableShellProps<T>) {\n if (!rows.length && emptyState) {\n return <>{emptyState}</>;\n }\n\n return (\n <SurfacePanel className=\"overflow-hidden\">\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full border-collapse text-left\">\n <thead>\n <tr className=\"bg-[var(--ck-bg-surface-muted)]\">\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n \"border-b border-[var(--ck-border-default)] px-4 py-3 text-[12px] font-medium text-[var(--ck-text-muted)]\",\n column.className\n )}\n >\n {column.title}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr\n key={rowKey(row)}\n className=\"border-b border-[var(--ck-border-default)] last:border-b-0 hover:bg-[var(--ck-bg-hover)]\"\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={cn(\n \"px-4 py-3 text-[13px] text-[var(--ck-text-secondary)]\",\n column.className\n )}\n >\n {column.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { SurfacePanel } from \"../primitives\";\n\ninterface MetricCardProps {\n label: string;\n value: string;\n hint?: string;\n accent?: \"brand\" | \"warning\" | \"success\";\n icon?: React.ReactNode;\n}\n\nconst accentMap = {\n brand: \"bg-[var(--ck-bg-brand-soft)] text-[var(--ck-brand-primary)]\",\n warning: \"bg-[var(--ck-warning-soft)] text-[var(--ck-warning-text)]\",\n success: \"bg-[var(--ck-success-soft)] text-[var(--ck-success-text)]\",\n} as const;\n\nexport function MetricCard({\n label,\n value,\n hint,\n accent = \"brand\",\n icon,\n}: MetricCardProps) {\n return (\n <SurfacePanel className=\"p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-[12px] text-[var(--ck-text-muted)]\">{label}</div>\n <div className=\"mt-2 text-[24px] font-semibold leading-none text-[var(--ck-text-primary)]\">\n {value}\n </div>\n {hint ? (\n <div className=\"mt-2 text-[12px] text-[var(--ck-text-secondary)]\">\n {hint}\n </div>\n ) : null}\n </div>\n {icon ? (\n <div className={`flex h-9 w-9 items-center justify-center rounded-[var(--ck-radius-sm)] ${accentMap[accent]}`}>\n {icon}\n </div>\n ) : null}\n </div>\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { SurfacePanel } from \"../primitives\";\n\ninterface PageSectionProps {\n title: string;\n description?: string;\n actions?: React.ReactNode;\n children: React.ReactNode;\n}\n\nexport function PageSection({\n title,\n description,\n actions,\n children,\n}: PageSectionProps) {\n return (\n <SurfacePanel className=\"p-5\">\n <div className=\"mb-4 flex items-start justify-between gap-4\">\n <div>\n <h2 className=\"text-[16px] font-semibold text-[var(--ck-text-primary)]\">\n {title}\n </h2>\n {description ? (\n <p className=\"mt-1 text-[13px] text-[var(--ck-text-secondary)]\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? <div className=\"shrink-0\">{actions}</div> : null}\n </div>\n {children}\n </SurfacePanel>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport interface CodingProductNavItem {\n label: string;\n icon: React.ComponentType<{ className?: string; strokeWidth?: string | number }>;\n active?: boolean;\n}\n\ninterface CodingProductRailProps {\n items: CodingProductNavItem[];\n userName?: string;\n editionLabel?: string;\n brandMark?: string;\n className?: string;\n}\n\nexport function CodingProductRail({\n items,\n userName,\n editionLabel = \"标准版\",\n brandMark = \"M\",\n className,\n}: CodingProductRailProps) {\n return (\n <aside\n className={cn(\n \"hidden w-[64px] shrink-0 flex-col border-r border-[var(--ck-border-subtle)] bg-[var(--ck-bg-sidebar)] lg:flex\",\n className,\n )}\n >\n <div className=\"flex flex-col items-center border-b border-[var(--ck-border-subtle)] px-2 py-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-[var(--ck-card-radius-sm)] bg-[var(--ck-rail-brand-bg)] text-[13px] font-semibold text-[var(--ck-brand-contrast)]\">\n {brandMark}\n </div>\n <div className=\"mt-1 rounded-full bg-[var(--ck-rail-brand-soft)] px-1.5 py-[1px] text-[9px] font-medium text-[var(--ck-rail-brand-text)]\">\n {editionLabel}\n </div>\n </div>\n <nav className=\"flex-1 space-y-1 overflow-auto px-2 py-3\">\n {items.map((item) => {\n const Icon = item.icon;\n return (\n <button\n key={item.label}\n type=\"button\"\n className={cn(\n \"flex w-full flex-col items-center gap-1 rounded-[var(--ck-card-radius-sm)] px-1 py-2 text-center transition-colors\",\n item.active\n ? \"bg-[var(--ck-bg-brand-soft)] text-[var(--ck-brand-primary)]\"\n : \"text-[var(--ck-text-secondary)] hover:bg-[var(--ck-surface-overlay)] hover:text-[var(--ck-text-primary)]\",\n )}\n >\n <Icon className=\"h-4 w-4\" strokeWidth={1.8} />\n <span className=\"text-[11px] leading-none\">{item.label}</span>\n </button>\n );\n })}\n </nav>\n {userName ? (\n <div className=\"border-t border-[var(--ck-border-subtle)] px-2 py-3\">\n <div className=\"flex items-center justify-center rounded-full bg-[var(--ck-rail-user-bg)] px-2 py-2 text-[11px] font-medium text-[var(--ck-brand-contrast)]\">\n {userName.slice(0, 1)}\n </div>\n </div>\n ) : null}\n </aside>\n );\n}\n\ninterface ProjectWorkspaceShellProps {\n productItems: CodingProductNavItem[];\n userName: string;\n projectSidebar?: React.ReactNode;\n systemNotice?: React.ReactNode;\n topBar?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n viewportClassName?: string;\n contentClassName?: string;\n}\n\nexport function ProjectWorkspaceShell({\n productItems,\n userName,\n projectSidebar,\n systemNotice,\n topBar,\n children,\n className,\n viewportClassName,\n contentClassName,\n}: ProjectWorkspaceShellProps) {\n return (\n <div\n className={cn(\n \"coding-kit overflow-visible rounded-[var(--ck-panel-radius)] border border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)]\",\n className,\n )}\n >\n <div className={cn(\"flex min-h-[760px] bg-[var(--ck-surface-page)]\", viewportClassName)}>\n <CodingProductRail items={productItems} userName={userName} />\n {projectSidebar}\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {systemNotice}\n {topBar}\n <div className={cn(\"min-h-0 flex-1\", contentClassName)}>{children}</div>\n </div>\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { ArrowLeft, ChevronRight } from 'lucide-react';\n\nimport {\n WorkbenchDrawer,\n WorkbenchDrawerContent,\n WorkbenchDrawerDescription,\n WorkbenchDrawerFooter,\n WorkbenchDrawerHeader,\n WorkbenchDrawerTitle,\n} from '../../overlay';\nimport { cn } from '../../lib/utils';\nimport { ConsoleButton as CodingButton } from '../primitives/button';\n\nexport interface CodingListDetailRowInfo {\n key: string;\n title: React.ReactNode;\n description?: React.ReactNode;\n meta?: React.ReactNode;\n status?: React.ReactNode;\n}\n\nexport interface CodingListDetailRowRenderContext<TRow> {\n row: TRow;\n info: CodingListDetailRowInfo;\n selected: boolean;\n select: () => void;\n}\n\nexport interface CodingListDetailDetailContext<TRow> {\n row: TRow;\n info: CodingListDetailRowInfo;\n mobile: boolean;\n}\n\nexport interface CodingListDetailWorkspaceProps<TRow> {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n rows: TRow[];\n getRowInfo: (row: TRow) => CodingListDetailRowInfo;\n renderDetail: (\n context: CodingListDetailDetailContext<TRow>,\n ) => React.ReactNode;\n renderRow?: (\n context: CodingListDetailRowRenderContext<TRow>,\n ) => React.ReactNode;\n toolbar?: React.ReactNode;\n headerActions?: React.ReactNode;\n detailActions?: React.ReactNode;\n emptyState?: React.ReactNode;\n selectedKey?: string;\n defaultSelectedKey?: string;\n onSelectedKeyChange?: (key: string) => void;\n editor?: React.ReactNode;\n editorTitle?: React.ReactNode;\n editorDescription?: React.ReactNode;\n editorFooter?: React.ReactNode;\n editorOpen?: boolean;\n onEditorOpenChange?: (open: boolean) => void;\n className?: string;\n}\n\nfunction DefaultRow<TRow>({\n context,\n}: {\n context: CodingListDetailRowRenderContext<TRow>;\n}) {\n const { info, selected, select } = context;\n\n return (\n <button\n type=\"button\"\n aria-current={selected ? 'true' : undefined}\n className={cn(\n 'flex w-full items-start gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-3 text-left transition-colors last:border-b-0 hover:bg-[var(--ck-bg-hover)]',\n selected && 'bg-[var(--ck-bg-active)]',\n )}\n onClick={select}\n >\n <ChevronRight\n className={cn(\n 'mt-0.5 h-4 w-4 shrink-0 text-[var(--ck-text-muted)] transition-transform',\n selected && 'rotate-90 text-[var(--ck-brand-primary)]',\n )}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-[13px] font-medium text-[var(--ck-text-primary)]\">\n {info.title}\n </span>\n {info.status ? (\n <span className=\"shrink-0\">{info.status}</span>\n ) : null}\n </span>\n {info.description ? (\n <span className=\"mt-1 block truncate text-[12px] text-[var(--ck-text-secondary)]\">\n {info.description}\n </span>\n ) : null}\n {info.meta ? (\n <span className=\"mt-1 block truncate text-[11px] text-[var(--ck-text-muted)]\">\n {info.meta}\n </span>\n ) : null}\n </span>\n </button>\n );\n}\n\nexport function CodingListDetailWorkspace<TRow>({\n title,\n subtitle,\n rows,\n getRowInfo,\n renderDetail,\n renderRow,\n toolbar,\n headerActions,\n detailActions,\n emptyState,\n selectedKey,\n defaultSelectedKey,\n onSelectedKeyChange,\n editor,\n editorTitle = '编辑',\n editorDescription,\n editorFooter,\n editorOpen,\n onEditorOpenChange,\n className,\n}: CodingListDetailWorkspaceProps<TRow>) {\n const rowInfos = React.useMemo(\n () => rows.map((row) => ({ row, info: getRowInfo(row) })),\n [getRowInfo, rows],\n );\n const firstKey = rowInfos[0]?.info.key || '';\n const [internalSelectedKey, setInternalSelectedKey] = React.useState(\n defaultSelectedKey || firstKey,\n );\n const [mobileDetailOpen, setMobileDetailOpen] = React.useState(false);\n const [internalEditorOpen, setInternalEditorOpen] = React.useState(false);\n const activeKey = selectedKey ?? internalSelectedKey;\n const selectedEntry =\n rowInfos.find(({ info }) => info.key === activeKey) || rowInfos[0];\n const selectedRow = selectedEntry?.row;\n const selectedInfo = selectedEntry?.info;\n const resolvedEditorOpen = editorOpen ?? internalEditorOpen;\n\n React.useEffect(() => {\n if (!selectedEntry || selectedEntry.info.key === activeKey) return;\n setInternalSelectedKey(selectedEntry.info.key);\n onSelectedKeyChange?.(selectedEntry.info.key);\n }, [activeKey, onSelectedKeyChange, selectedEntry]);\n\n const selectRow = React.useCallback(\n (key: string) => {\n setInternalSelectedKey(key);\n onSelectedKeyChange?.(key);\n setMobileDetailOpen(true);\n },\n [onSelectedKeyChange],\n );\n\n const setEditorOpen = React.useCallback(\n (open: boolean) => {\n setInternalEditorOpen(open);\n onEditorOpenChange?.(open);\n },\n [onEditorOpenChange],\n );\n\n return (\n <div\n className={cn(\n 'coding-kit flex h-full min-h-0 flex-col overflow-hidden rounded-[var(--ck-panel-radius)] border border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)] text-[var(--ck-text-primary)]',\n className,\n )}\n >\n <header className=\"flex shrink-0 items-start justify-between gap-4 border-b border-[var(--ck-border-subtle)] px-4 py-3 sm:px-5\">\n <div className=\"min-w-0\">\n <h1 className=\"truncate text-[16px] font-semibold\">{title}</h1>\n {subtitle ? (\n <p className=\"mt-1 truncate text-[12px] text-[var(--ck-text-muted)]\">\n {subtitle}\n </p>\n ) : null}\n </div>\n {headerActions ? (\n <div className=\"flex shrink-0 items-center gap-2\">{headerActions}</div>\n ) : null}\n </header>\n\n {toolbar ? (\n <div className=\"shrink-0 border-b border-[var(--ck-border-subtle)] bg-[var(--ck-bg-surface-muted)] px-4 py-2.5 sm:px-5\">\n {toolbar}\n </div>\n ) : null}\n\n <main className=\"relative min-h-0 flex-1 overflow-hidden\">\n <section\n className={cn(\n 'flex h-full min-h-0 flex-col lg:w-[min(58%,720px)]',\n mobileDetailOpen && 'hidden lg:flex',\n )}\n >\n <div className=\"flex shrink-0 items-center justify-between gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-2.5 text-[12px] text-[var(--ck-text-muted)] sm:px-5\">\n <span>{rows.length} 条记录</span>\n {selectedInfo ? <span className=\"truncate\">已选:{selectedInfo.title}</span> : null}\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto\">\n {rows.length === 0 ? (\n emptyState || (\n <div className=\"px-6 py-12 text-center text-sm text-[var(--ck-text-muted)]\">\n 暂无数据\n </div>\n )\n ) : (\n rowInfos.map(({ row, info }) => {\n const context = {\n row,\n info,\n selected: info.key === selectedInfo?.key,\n select: () => selectRow(info.key),\n };\n return (\n <React.Fragment key={info.key}>\n {renderRow ? renderRow(context) : <DefaultRow context={context} />}\n </React.Fragment>\n );\n })\n )}\n </div>\n </section>\n\n {selectedRow && selectedInfo ? (\n <section\n className={cn(\n 'min-h-0 bg-[var(--ck-surface-overlay)] lg:flex lg:min-w-0 lg:flex-1 lg:border-l lg:border-[var(--ck-border-subtle)]',\n mobileDetailOpen && 'absolute inset-0 z-10 flex flex-col',\n !mobileDetailOpen && 'hidden',\n 'lg:!flex lg:!static',\n )}\n >\n <div className=\"flex shrink-0 items-start justify-between gap-3 border-b border-[var(--ck-border-subtle)] px-4 py-3 sm:px-5\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <CodingButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0 lg:hidden\"\n aria-label=\"返回列表\"\n onClick={() => setMobileDetailOpen(false)}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </CodingButton>\n <div className=\"min-w-0\">\n <div className=\"truncate text-[13px] font-medium text-[var(--ck-brand-primary)]\">\n 详情\n </div>\n <div className=\"mt-0.5 truncate text-[12px] text-[var(--ck-text-muted)]\">\n {selectedInfo.title}\n </div>\n </div>\n </div>\n {detailActions ? (\n <div className=\"flex shrink-0 items-center gap-2\">{detailActions}</div>\n ) : null}\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-4 sm:p-5\">\n {renderDetail({ row: selectedRow, info: selectedInfo, mobile: mobileDetailOpen })}\n </div>\n </section>\n ) : null}\n </main>\n\n {editor ? (\n <WorkbenchDrawer\n open={resolvedEditorOpen}\n onOpenChange={setEditorOpen}\n >\n <WorkbenchDrawerContent\n side=\"right\"\n mobileSide=\"bottom\"\n className=\"coding-kit flex max-h-[90dvh] flex-col gap-0 overflow-hidden p-0 md:w-[min(560px,calc(100vw-16px))] md:max-w-[560px]\"\n >\n <WorkbenchDrawerHeader className=\"shrink-0 border-b border-[var(--ck-border-subtle)] px-5 py-4 pr-14\">\n <WorkbenchDrawerTitle className=\"text-[16px] font-semibold text-[var(--ck-text-primary)]\">\n {editorTitle}\n </WorkbenchDrawerTitle>\n {editorDescription ? (\n <WorkbenchDrawerDescription className=\"mt-1 text-[12px] text-[var(--ck-text-muted)]\">\n {editorDescription}\n </WorkbenchDrawerDescription>\n ) : null}\n </WorkbenchDrawerHeader>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-5\">{editor}</div>\n {editorFooter ? (\n <WorkbenchDrawerFooter className=\"shrink-0 border-t border-[var(--ck-border-subtle)] bg-[var(--ck-surface-overlay)] px-5 py-3\">\n {editorFooter}\n </WorkbenchDrawerFooter>\n ) : null}\n </WorkbenchDrawerContent>\n </WorkbenchDrawer>\n ) : null}\n </div>\n );\n}\n"],"names":["CodingButton","WorkbenchDrawer","WorkbenchDrawerContent","WorkbenchDrawerHeader","WorkbenchDrawerTitle","WorkbenchDrawerDescription","WorkbenchDrawerFooter"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { D, a, b, c, d, e, f, g, h, i } from "../dialog-DK8v51ew.js";
2
- import { S, a as a2, b as b2, c as c2, d as d2, e as e2, f as f2, g as g2, h as h2, i as i2 } from "../sheet-CdvS0URe.js";
1
+ import { D, a, b, c, d, e, f, g, h, i } from "../dialog-ssICQNSV.js";
2
+ import { S, a as a2, b as b2, c as c2, d as d2, e as e2, f as f2, g as g2, h as h2, i as i2 } from "../sheet-Bsq3CLW4.js";
3
3
  export {
4
4
  D as WorkbenchDialog,
5
5
  a as WorkbenchDialogClose,
@@ -1,6 +1,6 @@
1
- import React__default from "react";
2
- import { e as extractFrontendToolsFromManifest } from "./ExtensionManifestSchema-BIuNTfeS.js";
3
- import { canAccessExtensionCapability, mergeExtensionAccessPolicy } from "./extension-schema/index.js";
1
+ import React__default, { useCallback, useSyncExternalStore } from "react";
2
+ import { b as extractFrontendToolsFromManifest } from "./ExtensionManifestSchema-INV7dTEG.js";
3
+ import { mergeExtensionAccessPolicy, canAccessExtensionCapability } from "./extension-schema/index.js";
4
4
  var UIMimeType = /* @__PURE__ */ ((UIMimeType2) => {
5
5
  UIMimeType2["HTML_MCP_APP"] = "text/html;profile=mcp-app";
6
6
  UIMimeType2["HTML"] = "text/html";
@@ -1300,7 +1300,7 @@ function getFrontendMCPServer() {
1300
1300
  return globalFrontendMCPServer;
1301
1301
  }
1302
1302
  let currentActor = null;
1303
- const listeners = /* @__PURE__ */ new Set();
1303
+ const listeners$1 = /* @__PURE__ */ new Set();
1304
1304
  const DEFAULT_API_BASE_URL = "http://127.0.0.1:1626";
1305
1305
  const getViteApiBaseUrl = () => {
1306
1306
  var _a, _b, _c;
@@ -1417,7 +1417,7 @@ function resolveRuntimeActor(input = {}) {
1417
1417
  }
1418
1418
  function setRuntimeActor(actor) {
1419
1419
  currentActor = actor;
1420
- listeners.forEach((listener) => listener(currentActor));
1420
+ listeners$1.forEach((listener) => listener(currentActor));
1421
1421
  }
1422
1422
  function refreshRuntimeActor(input = {}) {
1423
1423
  const actor = resolveRuntimeActor(input);
@@ -1494,8 +1494,8 @@ function getRuntimeUserName() {
1494
1494
  return ((_a = currentActor == null ? void 0 : currentActor.user) == null ? void 0 : _a.name) || ((_b = currentActor == null ? void 0 : currentActor.subject) == null ? void 0 : _b.displayName) || (getRuntimeUserId() ? `User ${getRuntimeUserId()}` : null);
1495
1495
  }
1496
1496
  function subscribeRuntimeActor(listener) {
1497
- listeners.add(listener);
1498
- return () => listeners.delete(listener);
1497
+ listeners$1.add(listener);
1498
+ return () => listeners$1.delete(listener);
1499
1499
  }
1500
1500
  function getRuntimeAccessToken() {
1501
1501
  return (currentActor == null ? void 0 : currentActor.token) || (typeof window !== "undefined" ? window.localStorage.getItem("access_token") : null);
@@ -1549,10 +1549,132 @@ class ClientToolRegistry {
1549
1549
  }
1550
1550
  }
1551
1551
  const globalClientToolRegistry = new ClientToolRegistry();
1552
+ const badges = /* @__PURE__ */ new Map();
1553
+ const listeners = /* @__PURE__ */ new Set();
1554
+ const notify = () => {
1555
+ listeners.forEach((listener) => listener());
1556
+ };
1557
+ const buildStoreKey = (kind, viewId, key) => kind === "sidebar" ? `sidebar:${viewId}` : `tab:${viewId}/${key ?? ""}`;
1558
+ const getExtensionBadgeStoreKey = buildStoreKey;
1559
+ const normalizeBadge = (badge) => {
1560
+ if (!badge || typeof badge !== "object") return null;
1561
+ const normalized = {};
1562
+ if (typeof badge.count === "number" && Number.isFinite(badge.count) && badge.count > 0) {
1563
+ normalized.count = Math.floor(badge.count);
1564
+ }
1565
+ if (typeof badge.text === "string" && badge.text.trim()) {
1566
+ normalized.text = badge.text.trim();
1567
+ }
1568
+ if (badge.dot === true) {
1569
+ normalized.dot = true;
1570
+ }
1571
+ if (badge.tone) {
1572
+ normalized.tone = badge.tone;
1573
+ }
1574
+ if (normalized.count === void 0 && normalized.text === void 0 && !normalized.dot) {
1575
+ return null;
1576
+ }
1577
+ return normalized;
1578
+ };
1579
+ const serializeBadge = (badge) => JSON.stringify(badge);
1580
+ function setExtensionBadge(kind, viewId, key, badge) {
1581
+ if (!viewId) return () => void 0;
1582
+ const storeKey = buildStoreKey(kind, viewId, key);
1583
+ const normalized = normalizeBadge(badge);
1584
+ const previous = badges.get(storeKey);
1585
+ if (!normalized) {
1586
+ if (previous !== void 0) {
1587
+ badges.delete(storeKey);
1588
+ notify();
1589
+ }
1590
+ return () => void 0;
1591
+ }
1592
+ if (previous && serializeBadge(previous) === serializeBadge(normalized)) {
1593
+ return () => setExtensionBadge(kind, viewId, key, null);
1594
+ }
1595
+ badges.set(storeKey, normalized);
1596
+ notify();
1597
+ return () => setExtensionBadge(kind, viewId, key, null);
1598
+ }
1599
+ function subscribeExtensionBadges(listener) {
1600
+ listeners.add(listener);
1601
+ return () => {
1602
+ listeners.delete(listener);
1603
+ };
1604
+ }
1605
+ function parseVirtualViewFileId(fileId) {
1606
+ if (typeof fileId !== "string" || !fileId.startsWith("view://")) return null;
1607
+ const rest = fileId.slice("view://".length);
1608
+ const separatorIndex = rest.indexOf("/");
1609
+ if (separatorIndex <= 0 || separatorIndex === rest.length - 1) return null;
1610
+ const viewId = rest.slice(0, separatorIndex);
1611
+ const key = rest.slice(separatorIndex + 1);
1612
+ if (!viewId || !key) return null;
1613
+ return { viewId, key };
1614
+ }
1615
+ const formatBadgeCount = (count) => count > 99 ? "99+" : String(count);
1616
+ const EXTENSION_BADGE_TONE_COLORS = {
1617
+ default: {
1618
+ background: "var(--vscode-badge-background, #e5484d)",
1619
+ foreground: "var(--vscode-badge-foreground, #ffffff)"
1620
+ },
1621
+ danger: { background: "#e5484d", foreground: "#ffffff" },
1622
+ warning: { background: "#e0af2f", foreground: "#262115" },
1623
+ success: { background: "#2ea043", foreground: "#ffffff" },
1624
+ info: { background: "#3e5bec", foreground: "#ffffff" }
1625
+ };
1626
+ function useExtensionBadge(kind, viewId, key) {
1627
+ const storeKey = viewId ? buildStoreKey(kind, viewId, key) : null;
1628
+ const subscribe = useCallback(
1629
+ (listener) => {
1630
+ if (!storeKey) return () => void 0;
1631
+ return subscribeExtensionBadges(listener);
1632
+ },
1633
+ [storeKey]
1634
+ );
1635
+ const getSnapshot = useCallback(() => {
1636
+ if (!storeKey) return null;
1637
+ return badges.get(storeKey) ?? null;
1638
+ }, [storeKey]);
1639
+ return useSyncExternalStore(subscribe, getSnapshot);
1640
+ }
1641
+ function normalizeEditorTabKey(key) {
1642
+ return key.replace(/[^a-zA-Z0-9:_-]/g, "_");
1643
+ }
1644
+ function createExtensionViews(eventBus, workspaceEditorService) {
1645
+ return {
1646
+ openMain(viewId, props) {
1647
+ eventBus == null ? void 0 : eventBus.emit("workbench", "mainView.open", { viewId, props });
1648
+ },
1649
+ openEditor({ viewId, title, props = {}, key, split }) {
1650
+ if (!workspaceEditorService) {
1651
+ throw new Error("workspaceEditorService is not available in this runtime");
1652
+ }
1653
+ const file = workspaceEditorService.createViewFile(viewId, title, props, key);
1654
+ eventBus == null ? void 0 : eventBus.emit("workbench", "layout.forceOpen", {
1655
+ fileId: file.id,
1656
+ split
1657
+ });
1658
+ return file.id;
1659
+ }
1660
+ };
1661
+ }
1552
1662
  const frontendTools = /* @__PURE__ */ new Map();
1553
1663
  const frontendToolDeclarations = /* @__PURE__ */ new Map();
1554
1664
  const frontendToolHandlers = /* @__PURE__ */ new Map();
1555
1665
  const manifestToolDisposers = /* @__PURE__ */ new Map();
1666
+ const extensionBadgeDisposers = /* @__PURE__ */ new Map();
1667
+ function clearExtensionBadgesForOwner(extensionId) {
1668
+ const byKey = extensionBadgeDisposers.get(extensionId);
1669
+ if (!byKey) return;
1670
+ byKey.forEach((dispose) => {
1671
+ try {
1672
+ dispose();
1673
+ } catch {
1674
+ }
1675
+ });
1676
+ extensionBadgeDisposers.delete(extensionId);
1677
+ }
1556
1678
  function registerFrontendToolDeclaration(tool) {
1557
1679
  frontendToolDeclarations.set(tool.name, tool);
1558
1680
  bindFrontendToolDeclaration(tool);
@@ -1728,6 +1850,25 @@ function createExtensionCapabilities(extensionRegistry, getActor, options = {})
1728
1850
  GuardedComponent.displayName = `AccessGuard(${component.displayName || component.name || "ExtensionView"})`;
1729
1851
  return GuardedComponent;
1730
1852
  };
1853
+ const trackBadgeDispose = (storeKey, dispose) => {
1854
+ const extensionId = options.extensionId;
1855
+ if (!extensionId) return dispose;
1856
+ let byKey = extensionBadgeDisposers.get(extensionId);
1857
+ if (!byKey) {
1858
+ byKey = /* @__PURE__ */ new Map();
1859
+ extensionBadgeDisposers.set(extensionId, byKey);
1860
+ }
1861
+ byKey.set(storeKey, dispose);
1862
+ return () => {
1863
+ if (byKey.get(storeKey) === dispose) {
1864
+ byKey.delete(storeKey);
1865
+ if (byKey.size === 0) {
1866
+ extensionBadgeDisposers.delete(extensionId);
1867
+ }
1868
+ }
1869
+ dispose();
1870
+ };
1871
+ };
1731
1872
  return {
1732
1873
  registerSidebarView({ id, component, accessPolicy, routeKey }) {
1733
1874
  const SidebarComponent = withAccessGuard(component, accessPolicy);
@@ -1815,28 +1956,64 @@ function createExtensionCapabilities(extensionRegistry, getActor, options = {})
1815
1956
  return () => {
1816
1957
  extensionRegistry.unregisterContribution(point, id);
1817
1958
  };
1959
+ },
1960
+ setSidebarBadge({ viewId, badge }) {
1961
+ if (!viewId || !canRegister()) {
1962
+ return () => void 0;
1963
+ }
1964
+ const metadata = extensionRegistry.getSidebarViewMetadata(viewId);
1965
+ const owned = options.extensionId === void 0 ? Boolean(metadata) : Boolean(metadata && metadata.extensionId === options.extensionId);
1966
+ if (!owned) {
1967
+ return () => void 0;
1968
+ }
1969
+ return trackBadgeDispose(
1970
+ getExtensionBadgeStoreKey("sidebar", viewId),
1971
+ setExtensionBadge("sidebar", viewId, void 0, badge)
1972
+ );
1973
+ },
1974
+ setEditorTabBadge({ viewId, key, badge }) {
1975
+ if (!viewId || !canRegister()) {
1976
+ return () => void 0;
1977
+ }
1978
+ const metadata = extensionRegistry.getEditorViewMetadata(viewId) || extensionRegistry.getSidebarViewMetadata(viewId);
1979
+ const owned = options.extensionId === void 0 ? Boolean(metadata) : Boolean(metadata && metadata.extensionId === options.extensionId);
1980
+ if (!owned) {
1981
+ return () => void 0;
1982
+ }
1983
+ const normalizedTabKey = key ? normalizeEditorTabKey(key) : void 0;
1984
+ return trackBadgeDispose(
1985
+ getExtensionBadgeStoreKey("tab", viewId, normalizedTabKey),
1986
+ setExtensionBadge("tab", viewId, normalizedTabKey, badge)
1987
+ );
1818
1988
  }
1819
1989
  };
1820
1990
  }
1821
1991
  export {
1822
1992
  BridgeEvent as B,
1823
1993
  ClientToolRegistry as C,
1994
+ EXTENSION_BADGE_TONE_COLORS as E,
1824
1995
  UIMimeType as U,
1825
1996
  subscribeRuntimeActor as a,
1826
- getRuntimeActor as b,
1997
+ createExtensionViews as b,
1827
1998
  createExtensionCapabilities as c,
1828
- getUIResourceRegistry as d,
1829
- globalClientToolRegistry as e,
1830
- getUnifiedBridge as f,
1999
+ getRuntimeActor as d,
2000
+ getUIResourceRegistry as e,
2001
+ globalClientToolRegistry as f,
1831
2002
  getRuntimeAccessToken as g,
1832
- registerFrontendToolDeclarationsFromManifest as h,
1833
- getRuntimeUserId as i,
1834
- getRuntimeUserName as j,
1835
- getRuntimeTenantId as k,
1836
- getRuntimeSubjectId as l,
1837
- refreshRuntimeActorFromServer as m,
1838
- getComponentLifecycleManager as n,
2003
+ getUnifiedBridge as h,
2004
+ registerFrontendToolDeclarationsFromManifest as i,
2005
+ getRuntimeUserId as j,
2006
+ getRuntimeUserName as k,
2007
+ getRuntimeTenantId as l,
2008
+ getRuntimeSubjectId as m,
2009
+ normalizeEditorTabKey as n,
2010
+ clearExtensionBadgesForOwner as o,
2011
+ refreshRuntimeActorFromServer as p,
2012
+ formatBadgeCount as q,
1839
2013
  registerFrontendToolDeclaration as r,
1840
- setRuntimeActor as s
2014
+ setRuntimeActor as s,
2015
+ parseVirtualViewFileId as t,
2016
+ useExtensionBadge as u,
2017
+ getComponentLifecycleManager as v
1841
2018
  };
1842
- //# sourceMappingURL=pluginCapabilities-9gzDTIuB.js.map
2019
+ //# sourceMappingURL=pluginCapabilities-BkCT7QDO.js.map