@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.
- package/PLUGIN_DEV.md +30 -0
- package/dist/{DocxPreview-GruinkmZ.js → DocxPreview-CAmipQT3.js} +5 -5
- package/dist/{DocxPreview-GruinkmZ.js.map → DocxPreview-CAmipQT3.js.map} +1 -1
- package/dist/{DotBadge-Dm0es7Ho.js → DotBadge-CeeLzNu3.js} +3 -3
- package/dist/{DotBadge-Dm0es7Ho.js.map → DotBadge-CeeLzNu3.js.map} +1 -1
- package/dist/{ExtensionManifestSchema-BIuNTfeS.js → ExtensionManifestSchema-INV7dTEG.js} +3 -3
- package/dist/{ExtensionManifestSchema-BIuNTfeS.js.map → ExtensionManifestSchema-INV7dTEG.js.map} +1 -1
- package/dist/{FreeCanvas-BC24RbJp.js → FreeCanvas-DritKIPq.js} +2 -2
- package/dist/{FreeCanvas-BC24RbJp.js.map → FreeCanvas-DritKIPq.js.map} +1 -1
- package/dist/{ImagePreview-BUZPZ76T.js → ImagePreview-ByIQrPzb.js} +4 -4
- package/dist/{ImagePreview-BUZPZ76T.js.map → ImagePreview-ByIQrPzb.js.map} +1 -1
- package/dist/{PdfPreview-C431TVJo.js → PdfPreview-0vwF3tLn.js} +4 -4
- package/dist/{PdfPreview-C431TVJo.js.map → PdfPreview-0vwF3tLn.js.map} +1 -1
- package/dist/{PluginContext-J-PUm9Dt.js → PluginContext-uAiGNF8S.js} +2 -20
- package/dist/PluginContext-uAiGNF8S.js.map +1 -0
- package/dist/{Workbench-C3Gi8mtZ.js → Workbench-8uTfTtsq.js} +4267 -2776
- package/dist/{Workbench-C3Gi8mtZ.js.map → Workbench-8uTfTtsq.js.map} +1 -1
- package/dist/{activate-Cn14NQGw.js → activate-DVnxnmfA.js} +84 -80
- package/dist/{activate-Cn14NQGw.js.map → activate-DVnxnmfA.js.map} +1 -1
- package/dist/canvas-core/index.js +1 -1
- package/dist/coding-kit/index.js +1 -1
- package/dist/components/index.js +4 -4
- package/dist/{devWorkbench-DC7468GN.js → devWorkbench-DZ1mFC3i.js} +45 -9
- package/dist/devWorkbench-DZ1mFC3i.js.map +1 -0
- package/dist/{dialog-DK8v51ew.js → dialog-ssICQNSV.js} +2 -2
- package/dist/{dialog-DK8v51ew.js.map → dialog-ssICQNSV.js.map} +1 -1
- package/dist/{docx-preview-BdpXCqA9.js → docx-preview-lJ7EdPsl.js} +2 -2
- package/dist/{docx-preview-BdpXCqA9.js.map → docx-preview-lJ7EdPsl.js.map} +1 -1
- package/dist/extension-cli/index.js +1 -1
- package/dist/extension-dev/index.js +1 -1
- package/dist/extension-dev-workbench/index.js +4 -4
- package/dist/extension-schema/index.js +3 -3
- package/dist/{extensionRegistry-C_OUg-8s.js → extensionRegistry-D35Ld-Wa.js} +10 -7
- package/dist/{extensionRegistry-C_OUg-8s.js.map → extensionRegistry-D35Ld-Wa.js.map} +1 -1
- package/dist/index.js +17 -17
- package/dist/index.js.map +1 -1
- package/dist/{list-detail-workspace-template-BVyGyLpE.js → list-detail-workspace-template-BTrgMGPx.js} +2 -2
- package/dist/{list-detail-workspace-template-BVyGyLpE.js.map → list-detail-workspace-template-BTrgMGPx.js.map} +1 -1
- package/dist/overlay/index.js +2 -2
- package/dist/{pluginCapabilities-9gzDTIuB.js → pluginCapabilities-BkCT7QDO.js} +197 -20
- package/dist/pluginCapabilities-BkCT7QDO.js.map +1 -0
- package/dist/plugins/agent/PluginModule.js +2 -2
- package/dist/plugins/base/index.js +1 -1
- package/dist/{sheet-CdvS0URe.js → sheet-Bsq3CLW4.js} +6 -6
- package/dist/{sheet-CdvS0URe.js.map → sheet-Bsq3CLW4.js.map} +1 -1
- package/dist/{skeleton-99iI2m9p.js → skeleton-BSqTbX9l.js} +4 -4
- package/dist/{skeleton-99iI2m9p.js.map → skeleton-BSqTbX9l.js.map} +1 -1
- package/dist/types-BL0aIpQ1.js.map +1 -1
- package/dist/ui/index.js +3 -3
- package/dist/{useBinaryFileUrl-CcgcbIxT.js → useBinaryFileUrl-D11yvGuG.js} +3 -3
- package/dist/{useBinaryFileUrl-CcgcbIxT.js.map → useBinaryFileUrl-D11yvGuG.js.map} +1 -1
- package/dist/vibe-workspace/src/components/ExtensionBadgeMark.d.ts +10 -0
- package/dist/vibe-workspace/src/components/LayoutSystem.d.ts +4 -0
- package/dist/vibe-workspace/src/components/MonacoWrapper.d.ts +5 -1
- package/dist/vibe-workspace/src/components/TopBar.d.ts +2 -0
- package/dist/vibe-workspace/src/core/extensionBadges.d.ts +47 -0
- package/dist/vibe-workspace/src/core/extensionBadges.test.d.ts +1 -0
- package/dist/vibe-workspace/src/core/extensionViews.d.ts +6 -0
- package/dist/vibe-workspace/src/core/pluginCapabilities.d.ts +15 -0
- package/dist/vibe-workspace/src/extension-dev/workspace.d.ts +10 -0
- package/dist/vibe-workspace/src/hooks/useThemeLayout.d.ts +3 -0
- package/dist/vibe-workspace/src/index.d.ts +1 -0
- package/dist/vibe-workspace/src/plugins/base/types.d.ts +1 -0
- package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/ComponentDockBar.d.ts +6 -0
- package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/DynamicComponentZone.d.ts +5 -3
- package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/PanelSlotCard.d.ts +6 -1
- package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/ParticipantBar.d.ts +1 -2
- package/dist/vibe-workspace/src/plugins/conversation-network/components/right-panel/ParticipantBarItem.d.ts +18 -15
- package/dist/vibe-workspace/src/plugins/conversation-network/conversationHubShell.d.ts +14 -1
- package/dist/vibe-workspace/src/plugins/conversation-network/services/conversationHubShellResolver.d.ts +3 -1
- package/dist/vibe-workspace/src/services/authRedirect.d.ts +1 -0
- package/dist/vibe-workspace/src/services/themeService.d.ts +81 -7
- package/dist/vibe-workspace/src/workbench/WorkbenchAccountMenu.d.ts +5 -0
- package/dist/vibe-workspace.css +36 -43
- package/dist/workbench/index.js +2 -2
- package/package.json +6 -4
- package/postcss.config.js +5 -0
- package/tailwind.config.js +150 -0
- package/dist/PluginContext-J-PUm9Dt.js.map +0 -1
- package/dist/devWorkbench-DC7468GN.js.map +0 -1
- package/dist/pluginCapabilities-9gzDTIuB.js.map +0 -1
- package/dist/vibe-workspace/src/AgentEmbedPage.d.ts +0 -1
- package/dist/vibe-workspace/src/plugins/work-weixin/WorkWeixinPlugin.d.ts +0 -5
- package/dist/vibe-workspace/src/plugins/work-weixin/apiService.d.ts +0 -8
- package/dist/vibe-workspace/src/plugins/work-weixin/configService.d.ts +0 -46
- package/dist/vibe-workspace/src/plugins/work-weixin/index.d.ts +0 -2
- package/dist/vibe-workspace/src/plugins/workbench-admin/WorkbenchAdminSidebar.d.ts +0 -7
- package/dist/vibe-workspace/src/plugins/workbench-admin/activate.d.ts +0 -2
- package/dist/vibe-workspace/src/plugins/workbench-admin/index.d.ts +0 -2
package/PLUGIN_DEV.md
CHANGED
|
@@ -170,6 +170,34 @@ ctx.views.openEditor({
|
|
|
170
170
|
});
|
|
171
171
|
```
|
|
172
172
|
|
|
173
|
+
### 5.1 扩展 Badge
|
|
174
|
+
|
|
175
|
+
扩展可以给自己的侧边栏入口按钮和编辑器页签设置 badge(数字、短文本或圆点提示)。badge 只能挂在扩展自己注册的视图上,跨视图写入会被静默忽略:
|
|
176
|
+
|
|
177
|
+
```tsx
|
|
178
|
+
import type { ExtensionBadge } from '@appthen/vibe-workspace/plugins/base';
|
|
179
|
+
|
|
180
|
+
// 侧边栏入口(Activity Bar 按钮)显示未读数
|
|
181
|
+
ctx.capabilities.setSidebarBadge({
|
|
182
|
+
viewId: 'sidebar.acme.example',
|
|
183
|
+
badge: { count: 5 },
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// 编辑器页签显示圆点/文本提示;key 必须与 openEditor 时传的 key 一致
|
|
187
|
+
// (宿主会对 key 做统一规范化:字母数字与 :_- 以外的字符替换为 _,
|
|
188
|
+
// 因此 key 建议只使用字母数字、冒号、下划线、连字符)
|
|
189
|
+
ctx.capabilities.setEditorTabBadge({
|
|
190
|
+
viewId: 'editor.acme.example.members',
|
|
191
|
+
key: 'members',
|
|
192
|
+
badge: { dot: true, tone: 'warning' },
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// 清除:badge 传 null,或调用返回的 dispose
|
|
196
|
+
ctx.capabilities.setSidebarBadge({ viewId: 'sidebar.acme.example', badge: null });
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
`ExtensionBadge` 支持 `count`(>99 显示 `99+`,0 视为不显示)、`text`(建议 ≤4 字符)、`dot`(圆点)、`tone`(`default` 跟随主题 badge 色,另有 `danger` / `warning` / `success` / `info`)。同一入口重复设置会覆盖旧值;扩展停用后宿主负责清理其 badge。
|
|
200
|
+
|
|
173
201
|
## 6. 稳定 API
|
|
174
202
|
|
|
175
203
|
优先使用以下 API:
|
|
@@ -178,6 +206,8 @@ ctx.views.openEditor({
|
|
|
178
206
|
- `ctx.capabilities.registerEditorView`
|
|
179
207
|
- `ctx.capabilities.registerContribution`
|
|
180
208
|
- `ctx.capabilities.registerFrontendToolHandler`
|
|
209
|
+
- `ctx.capabilities.setSidebarBadge`
|
|
210
|
+
- `ctx.capabilities.setEditorTabBadge`
|
|
181
211
|
- `ctx.views.openEditor`
|
|
182
212
|
- `ctx.views.closeEditor`
|
|
183
213
|
- `ctx.links.create`
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useRef, useEffect } from "react";
|
|
3
|
-
import { u as useBinaryFileUrl } from "./useBinaryFileUrl-
|
|
4
|
-
import { L as LoaderCircle, F as FileText } from "./activate-
|
|
5
|
-
import { R as RefreshCw } from "./extensionRegistry-
|
|
3
|
+
import { u as useBinaryFileUrl } from "./useBinaryFileUrl-D11yvGuG.js";
|
|
4
|
+
import { L as LoaderCircle, F as FileText } from "./activate-DVnxnmfA.js";
|
|
5
|
+
import { R as RefreshCw } from "./extensionRegistry-D35Ld-Wa.js";
|
|
6
6
|
const DocxPreview = ({ file }) => {
|
|
7
7
|
const [state, retry] = useBinaryFileUrl(file);
|
|
8
8
|
const [docxError, setDocxError] = useState(null);
|
|
@@ -24,7 +24,7 @@ const DocxPreview = ({ file }) => {
|
|
|
24
24
|
const container = containerRef.current;
|
|
25
25
|
if (!container) return;
|
|
26
26
|
container.innerHTML = "";
|
|
27
|
-
const { renderAsync } = await import("./docx-preview-
|
|
27
|
+
const { renderAsync } = await import("./docx-preview-lJ7EdPsl.js");
|
|
28
28
|
if (cancelled || generation !== renderGenerationRef.current) return;
|
|
29
29
|
await renderAsync(buffer, container, null, {
|
|
30
30
|
inWrapper: true,
|
|
@@ -96,4 +96,4 @@ const Center = ({ children }) => /* @__PURE__ */ jsx("div", { className: "flex h
|
|
|
96
96
|
export {
|
|
97
97
|
DocxPreview
|
|
98
98
|
};
|
|
99
|
-
//# sourceMappingURL=DocxPreview-
|
|
99
|
+
//# sourceMappingURL=DocxPreview-CAmipQT3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocxPreview-
|
|
1
|
+
{"version":3,"file":"DocxPreview-CAmipQT3.js","sources":["../src/plugins/binary-previews/DocxPreview.tsx"],"sourcesContent":["/**\n * Word(.docx)预览:docx-preview 动态 import(含 jszip,独立 lazy chunk)。\n * 签名 URL fetch 需要存储端 CORS 支持;runtime blob URL 同源无此问题。\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Loader2Icon, FileTextIcon, RefreshCwIcon } from 'lucide-react';\nimport type { ICustomEditorProps } from '../../types';\nimport { useBinaryFileUrl } from './useBinaryFileUrl';\n\ntype DocxErrorKind = 'fetch' | 'render';\n\nexport const DocxPreview: React.FC<ICustomEditorProps> = ({ file }) => {\n const [state, retry] = useBinaryFileUrl(file);\n const [docxError, setDocxError] = useState<{ kind: DocxErrorKind; message: string } | null>(null);\n const [rendering, setRendering] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n // 防并发:渲染期间文件已切换时丢弃结果\n const renderGenerationRef = useRef(0);\n\n useEffect(() => {\n if (state.status !== 'ready') return;\n const generation = ++renderGenerationRef.current;\n let cancelled = false;\n\n (async () => {\n setRendering(true);\n setDocxError(null);\n try {\n const response = await fetch(state.url);\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const buffer = await response.arrayBuffer();\n if (cancelled || generation !== renderGenerationRef.current) return;\n\n const container = containerRef.current;\n if (!container) return;\n container.innerHTML = '';\n\n const { renderAsync } = await import('docx-preview');\n if (cancelled || generation !== renderGenerationRef.current) return;\n await renderAsync(buffer, container, null, {\n inWrapper: true,\n ignoreWidth: false,\n ignoreHeight: false,\n });\n } catch (e) {\n if (cancelled || generation !== renderGenerationRef.current) return;\n const message = e instanceof Error ? e.message : String(e);\n // 粗粒度区分:fetch 阶段(CORS/网络)vs 渲染阶段(文件损坏)\n setDocxError({\n kind: containerRef.current && containerRef.current.childElementCount > 0 ? 'render' : 'fetch',\n message,\n });\n } finally {\n if (!cancelled) setRendering(false);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.status === 'ready' ? state.url : null]);\n\n if (state.status === 'loading') {\n return (\n <Center>\n <Loader2Icon className=\"animate-spin text-vscode-accent\" size={28} />\n <span className=\"mt-3 text-xs text-vscode-textDark\">加载文档中...</span>\n </Center>\n );\n }\n\n if (state.status === 'no-asset') {\n return (\n <Center>\n <FileTextIcon size={32} className=\"text-vscode-textDark/50\" />\n <span className=\"mt-3 text-sm text-vscode-textDark\">该文件没有关联的二进制资产(未通过资产上传流程写入),无法预览</span>\n </Center>\n );\n }\n\n if (state.status === 'too-large') {\n return (\n <Center>\n <FileTextIcon size={32} className=\"text-vscode-textDark/50\" />\n <span className=\"mt-3 text-sm text-vscode-textDark\">文件过大,超过预览上限,不支持预览</span>\n </Center>\n );\n }\n\n if (state.status === 'error' || docxError) {\n const message = docxError\n ? docxError.kind === 'fetch'\n ? `无法获取文档内容(可能是存储端 CORS 限制):${docxError.message}`\n : `文档解析失败,文件可能已损坏或不是标准 .docx:${docxError.message}`\n : `文档加载失败:${(state as { message?: string }).message}`;\n return (\n <Center>\n <span className=\"text-sm text-red-400\">{message}</span>\n <button\n onClick={() => { setDocxError(null); retry(); }}\n className=\"mt-3 inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-xs bg-vscode-accent text-white hover:opacity-90\"\n >\n <RefreshCwIcon size={12} /> 重试\n </button>\n </Center>\n );\n }\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-vscode-bg\">\n <div className=\"flex h-10 shrink-0 items-center border-b border-[#202635]/60 px-3\">\n <span className=\"truncate text-[11px] text-vscode-textDark/60\">{file?.name}</span>\n {rendering && <Loader2Icon className=\"ml-2 animate-spin text-vscode-accent\" size={12} />}\n </div>\n <div ref={containerRef} className=\"min-h-0 flex-1 overflow-auto bg-[#ececec] px-4 py-6\" />\n </div>\n );\n};\n\nconst Center: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <div className=\"flex h-full flex-col items-center justify-center bg-vscode-bg px-6 text-center\">\n {children}\n </div>\n);\n"],"names":["Loader2Icon","FileTextIcon","RefreshCwIcon"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { Z as Select, _ as SelectTrigger, $ as SelectValue, a0 as SelectIcon, a1 as SelectPortal, a2 as SelectContent, a3 as SelectViewport, a4 as SelectItem, a5 as SelectItemIndicator, a6 as SelectItemText } from "./skeleton-
|
|
2
|
+
import { Z as Select, _ as SelectTrigger, $ as SelectValue, a0 as SelectIcon, a1 as SelectPortal, a2 as SelectContent, a3 as SelectViewport, a4 as SelectItem, a5 as SelectItemIndicator, a6 as SelectItemText } from "./skeleton-BSqTbX9l.js";
|
|
3
3
|
import { c as cn } from "./utils-D7w9BxgN.js";
|
|
4
4
|
import { C as ChevronDown } from "./chevron-right-D51vM8ri.js";
|
|
5
5
|
import { C as Check } from "./circle-D1lKxHx-.js";
|
|
@@ -57,7 +57,7 @@ const TONE_VAR = {
|
|
|
57
57
|
success: "var(--ck-success, #18794e)",
|
|
58
58
|
warning: "var(--ck-warning, #be5a00)",
|
|
59
59
|
danger: "var(--ck-danger, #c5342f)",
|
|
60
|
-
info: "var(--ck-brand-primary, #
|
|
60
|
+
info: "var(--ck-brand-primary, #3e5bec)",
|
|
61
61
|
vip: "var(--ck-vip, #b8750a)",
|
|
62
62
|
potential: "var(--ck-potential, #475569)"
|
|
63
63
|
};
|
|
@@ -96,4 +96,4 @@ export {
|
|
|
96
96
|
DotBadge as D,
|
|
97
97
|
SimpleSelect as S
|
|
98
98
|
};
|
|
99
|
-
//# sourceMappingURL=DotBadge-
|
|
99
|
+
//# sourceMappingURL=DotBadge-CeeLzNu3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DotBadge-
|
|
1
|
+
{"version":3,"file":"DotBadge-CeeLzNu3.js","sources":["../src/components/SimpleSelect.tsx","../src/components/DotBadge.tsx"],"sourcesContent":["import * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport interface SimpleSelectOption {\n value: string\n label: string\n}\n\nexport interface SimpleSelectProps {\n value: string\n onValueChange: (value: string) => void\n options: SimpleSelectOption[]\n className?: string\n size?: \"sm\" | \"xs\" | \"md\"\n \"aria-label\"?: string\n placeholder?: string\n}\n\n/**\n * 业务便利封装:以单组件 `{ value, onValueChange, options }` 形式提供下拉选择,\n * 对齐 CRM 列表页的使用范式,避免每次都写复合式 JSX。\n * 底层复用 shadcn `WorkbenchSelect`(SelectPrimitive),无障碍/键盘支持完整。\n */\nexport function SimpleSelect({\n value,\n onValueChange,\n options,\n className,\n size = \"md\",\n placeholder,\n ...rest\n}: SimpleSelectProps) {\n const sizeCls =\n size === \"sm\" ? \"h-7 text-xs\" : size === \"xs\" ? \"h-6 text-xs\" : \"h-9 text-sm\"\n return (\n <SelectPrimitive.Root value={value} onValueChange={onValueChange}>\n <SelectPrimitive.Trigger\n className={cn(\n \"inline-flex w-full items-center justify-between gap-2 rounded-md border border-input bg-background px-3 py-2 ring-offset-background transition-colors placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:min-w-0 [&>span]:truncate\",\n sizeCls,\n className,\n )}\n aria-label={rest[\"aria-label\"]}\n >\n <SelectPrimitive.Value placeholder={placeholder} />\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 shrink-0 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n position=\"popper\"\n sideOffset={4}\n className=\"relative z-[1000] max-h-72 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md\"\n >\n <SelectPrimitive.Viewport className=\"p-1\">\n {options.map((opt) => (\n <SelectPrimitive.Item\n key={opt.value}\n value={opt.value}\n className=\"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\"\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{opt.label}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n ))}\n </SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n </SelectPrimitive.Root>\n )\n}\nSimpleSelect.displayName = \"SimpleSelect\"\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nexport type DotTone =\n | \"neutral\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"info\"\n | \"vip\"\n | \"potential\"\n\nconst TONE_VAR: Record<DotTone, string> = {\n neutral: \"var(--ck-border-strong)\",\n success: \"var(--ck-success, #18794e)\",\n warning: \"var(--ck-warning, #be5a00)\",\n danger: \"var(--ck-danger, #c5342f)\",\n info: \"var(--ck-brand-primary, #3e5bec)\",\n vip: \"var(--ck-vip, #b8750a)\",\n potential: \"var(--ck-potential, #475569)\",\n}\n\nexport interface DotBadgeProps\n extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: DotTone\n}\n\n/**\n * 中性胶囊 + 语义小圆点的徽标,对齐 CRM 列表页「灰底 + 圆点」视觉范式\n * (替代 shadcn `WorkbenchBadge` 的彩色填充 variants,消除 AI 味的强色块)。\n * 圆点色由语义 token 驱动,主题切换自动跟随。\n */\nexport function DotBadge({\n tone = \"neutral\",\n className,\n children,\n style,\n ...props\n}: DotBadgeProps) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border border-[var(--ck-border-default)] bg-[var(--ck-bg-surface)] px-2.5 py-0.5 text-xs font-medium text-[var(--ck-text-primary)]\",\n className,\n )}\n style={{ ...style, [\"--dot\" as string]: TONE_VAR[tone] }}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className=\"h-1.5 w-1.5 shrink-0 rounded-full\"\n style={{ backgroundColor: \"var(--dot)\" }}\n />\n {children}\n </span>\n )\n}\nDotBadge.displayName = \"DotBadge\"\n"],"names":["SelectPrimitive.Root","SelectPrimitive.Trigger","SelectPrimitive.Value","SelectPrimitive.Icon","SelectPrimitive.Portal","SelectPrimitive.Content","SelectPrimitive.Viewport","SelectPrimitive.Item","SelectPrimitive.ItemIndicator","SelectPrimitive.ItemText"],"mappings":";;;;;AA0BO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,GAAG;AACL,GAAsB;AACpB,QAAM,UACJ,SAAS,OAAO,gBAAgB,SAAS,OAAO,gBAAgB;AAClE,SACE,qBAACA,QAAA,EAAqB,OAAc,eAClC,UAAA;AAAA,IAAA;AAAA,MAACC;AAAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAEF,cAAY,KAAK,YAAY;AAAA,QAE7B,UAAA;AAAA,UAAA,oBAACC,aAAA,EAAsB,aAA0B;AAAA,UACjD,oBAACC,YAAA,EAAqB,SAAO,MAC3B,UAAA,oBAAC,aAAA,EAAY,WAAU,8BAAA,CAA8B,EAAA,CACvD;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,oBAACC,cAAA,EACC,UAAA;AAAA,MAACC;AAAAA,MAAA;AAAA,QACC,UAAS;AAAA,QACT,YAAY;AAAA,QACZ,WAAU;AAAA,QAEV,UAAA,oBAACC,gBAAA,EAAyB,WAAU,OACjC,UAAA,QAAQ,IAAI,CAAC,QACZ;AAAA,UAACC;AAAAA,UAAA;AAAA,YAEC,OAAO,IAAI;AAAA,YACX,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,oBAAC,QAAA,EAAK,WAAU,gEACd,UAAA,oBAACC,qBAAA,EACC,UAAA,oBAAC,OAAA,EAAM,WAAU,UAAA,CAAU,EAAA,CAC7B,GACF;AAAA,cACA,oBAACC,gBAAA,EAA0B,cAAI,MAAA,CAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAThC,IAAI;AAAA,QAAA,CAWZ,EAAA,CACH;AAAA,MAAA;AAAA,IAAA,EACF,CACF;AAAA,EAAA,GACF;AAEJ;AACA,aAAa,cAAc;AClE3B,MAAM,WAAoC;AAAA,EACxC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,WAAW;AACb;AAYO,SAAS,SAAS;AAAA,EACvB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,OAAO,EAAE,GAAG,OAAO,CAAC,OAAiB,GAAG,SAAS,IAAI,EAAA;AAAA,MACpD,GAAG;AAAA,MAEJ,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiB,aAAA;AAAA,UAAa;AAAA,QAAA;AAAA,QAExC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AACA,SAAS,cAAc;"}
|
|
@@ -98,10 +98,10 @@ function extractFrontendToolsFromManifest(manifest) {
|
|
|
98
98
|
export {
|
|
99
99
|
CURRENT_EXTENSION_API_VERSION as C,
|
|
100
100
|
CURRENT_EXTENSION_MANIFEST_VERSION as a,
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
extractFrontendToolsFromManifest as b,
|
|
102
|
+
extractUIResourcesFromManifest as e,
|
|
103
103
|
hasMCPConfig as h,
|
|
104
104
|
upgradeManifest as u,
|
|
105
105
|
validateManifest as v
|
|
106
106
|
};
|
|
107
|
-
//# sourceMappingURL=ExtensionManifestSchema-
|
|
107
|
+
//# sourceMappingURL=ExtensionManifestSchema-INV7dTEG.js.map
|
package/dist/{ExtensionManifestSchema-BIuNTfeS.js.map → ExtensionManifestSchema-INV7dTEG.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExtensionManifestSchema-BIuNTfeS.js","sources":["../src/core/ExtensionManifestSchema.ts"],"sourcesContent":["/**\n * 增强的插件 Manifest Schema\n *\n * 扩展原有的插件定义,添加 MCP Apps 支持:\n * - mcp.uiResources - UI 资源注册\n * - mcp.frontendTools - 前端 MCP 工具\n * - 保持向后兼容\n *\n * @see https://modelcontextprotocol.io/extensions/apps/overview\n */\n\nimport type { UIResourceRegistration } from '../core/ui-resource';\nimport type { ExtensionAccessPolicy } from './extensionAccessPolicy';\n\nexport const CURRENT_EXTENSION_MANIFEST_VERSION = 1;\nexport const CURRENT_EXTENSION_API_VERSION = '1';\n\n/**\n * 前端 MCP 工具定义\n */\nexport interface FrontendMCPTool {\n /** 工具名称 */\n name: string;\n /** 工具描述 */\n description: string;\n /** 输入参数 Schema */\n inputSchema: Record<string, unknown>;\n /** 是否是 app-only 工具 */\n appOnly?: boolean;\n /** 处理函数引用,运行时会用它绑定 registerFrontendToolHandler(ref) */\n handler?: string;\n /** handler 的显式别名,发布系统和 manifest 都支持 */\n handlerRef?: string;\n /** 可选访问策略,和工作台 accessPolicy 叠加生效 */\n accessPolicy?: ExtensionAccessPolicy;\n}\n\n/**\n * UI 资源引用\n */\nexport interface UIResourceReference {\n /** 资源 URI */\n uri: string;\n /** 组件名称 (用于动态加载) */\n componentName?: string;\n /** 资源类型 */\n type?: 'component' | 'application' | 'widget';\n}\n\n/**\n * MCP 扩展配置\n */\nexport interface MCPExtensionConfig {\n /** UI 资源列表 */\n uiResources?: Array<UIResourceReference | UIResourceRegistration>;\n\n /** 前端 MCP 工具列表 */\n frontendTools?: FrontendMCPTool[];\n\n /** 服务端或外部 MCP 工具能力声明,不会自动注册到客户端 MCP Server */\n mcpTools?: Record<string, unknown>[];\n\n /** 组件能力声明 */\n components?: Record<string, unknown>[];\n\n /** 贡献点能力声明 */\n contributions?: Record<string, unknown>[];\n\n /** 是否启用 MCP Apps */\n enabled?: boolean;\n}\n\n/**\n * 增强的插件 Manifest\n * 向后兼容原有的 IExtensionManifest\n */\nexport interface IEnhancedExtensionManifest {\n // === 原有字段 (向后兼容) ===\n /** 插件 ID */\n id: string;\n /** 插件名称 */\n name: string;\n /** 版本号 */\n version: string;\n /** 入口文件 URL */\n main: string;\n /** Manifest contract version. Older manifests are migrated in compatibility mode. */\n manifestVersion?: number;\n /** Workbench extension API version requested by the extension. */\n apiVersion?: string;\n /** 描述 */\n description?: string;\n /** 作者 */\n author?: string;\n /** 图标 */\n icon?: string;\n /** 主页 */\n homepage?: string;\n /** 许可证 */\n license?: string;\n\n // === MCP 扩展字段 ===\n /** MCP 配置 */\n mcp?: MCPExtensionConfig;\n\n // === 可选的增强字段 ===\n /** 功能特性 */\n features?: string[];\n /** 依赖的其他插件 */\n dependencies?: string[];\n /** 关键词/标签 */\n keywords?: string[];\n /** Optional integrity metadata for published runtime resources. */\n integrity?: {\n algorithm: 'sha256';\n files?: Record<string, string>;\n };\n /** Optional extension-level access policy applied before activation. */\n accessPolicy?: ExtensionAccessPolicy;\n}\n\n/**\n * 插件元数据\n */\nexport interface ExtensionMetadata {\n /** 插件 ID */\n id: string;\n /** 名称 */\n name: string;\n /** 版本 */\n version: string;\n /** 描述 */\n description?: string;\n /** 是否已安装 */\n installed?: boolean;\n /** 安装时间 */\n installedAt?: Date;\n /** MCP Apps 是否启用 */\n mcpEnabled?: boolean;\n /** 注册的 UI 资源数量 */\n uiResourceCount?: number;\n /** 注册的工具数量 */\n toolCount?: number;\n}\n\n/**\n * 插件注册选项\n */\nexport interface ExtensionRegisterOptions {\n /** 是否验证 Schema */\n validate?: boolean;\n /** 是否自动注册 UI 资源 */\n autoRegisterUIResources?: boolean;\n /** 是否自动注册工具 */\n autoRegisterTools?: boolean;\n}\n\n/**\n * 检查 Manifest 是否包含 MCP 配置\n */\nexport function hasMCPConfig(manifest: IEnhancedExtensionManifest): boolean {\n return !!manifest.mcp && manifest.mcp.enabled !== false;\n}\n\n/**\n * 验证 Manifest Schema\n */\nexport function validateManifest(manifest: IEnhancedExtensionManifest): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n // 验证必填字段\n if (!manifest.id) errors.push('Missing required field: id');\n if (!manifest.name) errors.push('Missing required field: name');\n if (!manifest.version) errors.push('Missing required field: version');\n if (!manifest.main) errors.push('Missing required field: main');\n if (\n manifest.manifestVersion !== undefined &&\n manifest.manifestVersion !== CURRENT_EXTENSION_MANIFEST_VERSION\n ) {\n errors.push(`Unsupported manifestVersion: ${manifest.manifestVersion}`);\n }\n if (\n manifest.apiVersion !== undefined &&\n manifest.apiVersion !== CURRENT_EXTENSION_API_VERSION\n ) {\n errors.push(`Unsupported apiVersion: ${manifest.apiVersion}`);\n }\n if (manifest.integrity && manifest.integrity.algorithm !== 'sha256') {\n errors.push(`Unsupported integrity algorithm: ${manifest.integrity.algorithm}`);\n }\n if (manifest.integrity?.files) {\n Object.entries(manifest.integrity.files).forEach(([file, value]) => {\n if (!file || file.startsWith('/') || file.includes('\\\\') || file.split('/').includes('..')) {\n errors.push(`Invalid integrity file path: ${file}`);\n }\n if (!/^sha256-[A-Za-z0-9+/]+={0,2}$/.test(value)) {\n errors.push(`Invalid integrity value for file: ${file}`);\n }\n });\n }\n\n // 验证 MCP 配置\n if (manifest.mcp) {\n const { uiResources, frontendTools } = manifest.mcp;\n\n if (uiResources) {\n uiResources.forEach((resource, index) => {\n if ('uri' in resource) {\n const uri = (resource as UIResourceRegistration).uri;\n if (!uri || !uri.startsWith('ui://')) {\n errors.push(`uiResources[${index}]: Invalid URI format, must start with ui://`);\n }\n }\n });\n }\n\n if (frontendTools) {\n frontendTools.forEach((tool, index) => {\n if (!tool.name) errors.push(`frontendTools[${index}]: Missing name`);\n if (!tool.description) errors.push(`frontendTools[${index}]: Missing description`);\n if (!tool.handler && !tool.handlerRef) errors.push(`frontendTools[${index}]: Missing handler`);\n if (!tool.inputSchema) errors.push(`frontendTools[${index}]: Missing inputSchema`);\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * 将旧版 Manifest 转换为增强版\n */\nexport function upgradeManifest(manifest: any): IEnhancedExtensionManifest {\n // Preserve declared capabilities while filling the compatibility contract.\n return {\n ...manifest,\n manifestVersion: manifest.manifestVersion ?? CURRENT_EXTENSION_MANIFEST_VERSION,\n apiVersion: manifest.apiVersion ?? CURRENT_EXTENSION_API_VERSION,\n mcp: manifest.mcp ?? {\n enabled: false,\n uiResources: [],\n frontendTools: [],\n },\n };\n}\n\n/**\n * 从 Manifest 提取 UI 资源注册信息\n */\nexport function extractUIResourcesFromManifest(\n manifest: IEnhancedExtensionManifest,\n): UIResourceReference[] {\n if (!manifest.mcp?.uiResources) return [];\n\n return manifest.mcp.uiResources.map(resource => {\n if ('content' in resource) {\n const reg = resource as UIResourceRegistration;\n // Determine type based on metadata presence\n let type: 'component' | 'application' | 'widget' = 'component';\n \n if (reg.metadata?.application) {\n type = 'application';\n }\n \n // 完整的 UIResourceRegistration\n return {\n uri: reg.uri,\n type,\n };\n }\n // 简化的 UIResourceReference\n return resource as UIResourceReference;\n });\n}\n\n/**\n * 从 Manifest 提取前端工具信息\n */\nexport function extractFrontendToolsFromManifest(\n manifest: IEnhancedExtensionManifest,\n): FrontendMCPTool[] {\n if (!manifest.mcp?.frontendTools) return [];\n return manifest.mcp.frontendTools.map((tool) => ({\n ...tool,\n handler: tool.handler || tool.handlerRef,\n handlerRef: tool.handlerRef || tool.handler,\n }));\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExtensionManifestSchema-INV7dTEG.js","sources":["../src/core/ExtensionManifestSchema.ts"],"sourcesContent":["/**\n * 增强的插件 Manifest Schema\n *\n * 扩展原有的插件定义,添加 MCP Apps 支持:\n * - mcp.uiResources - UI 资源注册\n * - mcp.frontendTools - 前端 MCP 工具\n * - 保持向后兼容\n *\n * @see https://modelcontextprotocol.io/extensions/apps/overview\n */\n\nimport type { UIResourceRegistration } from '../core/ui-resource';\nimport type { ExtensionAccessPolicy } from './extensionAccessPolicy';\n\nexport const CURRENT_EXTENSION_MANIFEST_VERSION = 1;\nexport const CURRENT_EXTENSION_API_VERSION = '1';\n\n/**\n * 前端 MCP 工具定义\n */\nexport interface FrontendMCPTool {\n /** 工具名称 */\n name: string;\n /** 工具描述 */\n description: string;\n /** 输入参数 Schema */\n inputSchema: Record<string, unknown>;\n /** 是否是 app-only 工具 */\n appOnly?: boolean;\n /** 处理函数引用,运行时会用它绑定 registerFrontendToolHandler(ref) */\n handler?: string;\n /** handler 的显式别名,发布系统和 manifest 都支持 */\n handlerRef?: string;\n /** 可选访问策略,和工作台 accessPolicy 叠加生效 */\n accessPolicy?: ExtensionAccessPolicy;\n}\n\n/**\n * UI 资源引用\n */\nexport interface UIResourceReference {\n /** 资源 URI */\n uri: string;\n /** 组件名称 (用于动态加载) */\n componentName?: string;\n /** 资源类型 */\n type?: 'component' | 'application' | 'widget';\n}\n\n/**\n * MCP 扩展配置\n */\nexport interface MCPExtensionConfig {\n /** UI 资源列表 */\n uiResources?: Array<UIResourceReference | UIResourceRegistration>;\n\n /** 前端 MCP 工具列表 */\n frontendTools?: FrontendMCPTool[];\n\n /** 服务端或外部 MCP 工具能力声明,不会自动注册到客户端 MCP Server */\n mcpTools?: Record<string, unknown>[];\n\n /** 组件能力声明 */\n components?: Record<string, unknown>[];\n\n /** 贡献点能力声明 */\n contributions?: Record<string, unknown>[];\n\n /** 是否启用 MCP Apps */\n enabled?: boolean;\n}\n\n/**\n * 增强的插件 Manifest\n * 向后兼容原有的 IExtensionManifest\n */\nexport interface IEnhancedExtensionManifest {\n // === 原有字段 (向后兼容) ===\n /** 插件 ID */\n id: string;\n /** 插件名称 */\n name: string;\n /** 版本号 */\n version: string;\n /** 入口文件 URL */\n main: string;\n /** Manifest contract version. Older manifests are migrated in compatibility mode. */\n manifestVersion?: number;\n /** Workbench extension API version requested by the extension. */\n apiVersion?: string;\n /** 描述 */\n description?: string;\n /** 作者 */\n author?: string;\n /** 图标 */\n icon?: string;\n /** 主页 */\n homepage?: string;\n /** 许可证 */\n license?: string;\n\n // === MCP 扩展字段 ===\n /** MCP 配置 */\n mcp?: MCPExtensionConfig;\n\n // === 可选的增强字段 ===\n /** 功能特性 */\n features?: string[];\n /** 依赖的其他插件 */\n dependencies?: string[];\n /** 关键词/标签 */\n keywords?: string[];\n /** Optional integrity metadata for published runtime resources. */\n integrity?: {\n algorithm: 'sha256';\n files?: Record<string, string>;\n };\n /** Optional extension-level access policy applied before activation. */\n accessPolicy?: ExtensionAccessPolicy;\n}\n\n/**\n * 插件元数据\n */\nexport interface ExtensionMetadata {\n /** 插件 ID */\n id: string;\n /** 名称 */\n name: string;\n /** 版本 */\n version: string;\n /** 描述 */\n description?: string;\n /** 是否已安装 */\n installed?: boolean;\n /** 安装时间 */\n installedAt?: Date;\n /** MCP Apps 是否启用 */\n mcpEnabled?: boolean;\n /** 注册的 UI 资源数量 */\n uiResourceCount?: number;\n /** 注册的工具数量 */\n toolCount?: number;\n}\n\n/**\n * 插件注册选项\n */\nexport interface ExtensionRegisterOptions {\n /** 是否验证 Schema */\n validate?: boolean;\n /** 是否自动注册 UI 资源 */\n autoRegisterUIResources?: boolean;\n /** 是否自动注册工具 */\n autoRegisterTools?: boolean;\n}\n\n/**\n * 检查 Manifest 是否包含 MCP 配置\n */\nexport function hasMCPConfig(manifest: IEnhancedExtensionManifest): boolean {\n return !!manifest.mcp && manifest.mcp.enabled !== false;\n}\n\n/**\n * 验证 Manifest Schema\n */\nexport function validateManifest(manifest: IEnhancedExtensionManifest): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n // 验证必填字段\n if (!manifest.id) errors.push('Missing required field: id');\n if (!manifest.name) errors.push('Missing required field: name');\n if (!manifest.version) errors.push('Missing required field: version');\n if (!manifest.main) errors.push('Missing required field: main');\n if (\n manifest.manifestVersion !== undefined &&\n manifest.manifestVersion !== CURRENT_EXTENSION_MANIFEST_VERSION\n ) {\n errors.push(`Unsupported manifestVersion: ${manifest.manifestVersion}`);\n }\n if (\n manifest.apiVersion !== undefined &&\n manifest.apiVersion !== CURRENT_EXTENSION_API_VERSION\n ) {\n errors.push(`Unsupported apiVersion: ${manifest.apiVersion}`);\n }\n if (manifest.integrity && manifest.integrity.algorithm !== 'sha256') {\n errors.push(`Unsupported integrity algorithm: ${manifest.integrity.algorithm}`);\n }\n if (manifest.integrity?.files) {\n Object.entries(manifest.integrity.files).forEach(([file, value]) => {\n if (!file || file.startsWith('/') || file.includes('\\\\') || file.split('/').includes('..')) {\n errors.push(`Invalid integrity file path: ${file}`);\n }\n if (!/^sha256-[A-Za-z0-9+/]+={0,2}$/.test(value)) {\n errors.push(`Invalid integrity value for file: ${file}`);\n }\n });\n }\n\n // 验证 MCP 配置\n if (manifest.mcp) {\n const { uiResources, frontendTools } = manifest.mcp;\n\n if (uiResources) {\n uiResources.forEach((resource, index) => {\n if ('uri' in resource) {\n const uri = (resource as UIResourceRegistration).uri;\n if (!uri || !uri.startsWith('ui://')) {\n errors.push(`uiResources[${index}]: Invalid URI format, must start with ui://`);\n }\n }\n });\n }\n\n if (frontendTools) {\n frontendTools.forEach((tool, index) => {\n if (!tool.name) errors.push(`frontendTools[${index}]: Missing name`);\n if (!tool.description) errors.push(`frontendTools[${index}]: Missing description`);\n if (!tool.handler && !tool.handlerRef) errors.push(`frontendTools[${index}]: Missing handler`);\n if (!tool.inputSchema) errors.push(`frontendTools[${index}]: Missing inputSchema`);\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * 将旧版 Manifest 转换为增强版\n */\nexport function upgradeManifest(manifest: any): IEnhancedExtensionManifest {\n // Preserve declared capabilities while filling the compatibility contract.\n return {\n ...manifest,\n manifestVersion: manifest.manifestVersion ?? CURRENT_EXTENSION_MANIFEST_VERSION,\n apiVersion: manifest.apiVersion ?? CURRENT_EXTENSION_API_VERSION,\n mcp: manifest.mcp ?? {\n enabled: false,\n uiResources: [],\n frontendTools: [],\n },\n };\n}\n\n/**\n * 从 Manifest 提取 UI 资源注册信息\n */\nexport function extractUIResourcesFromManifest(\n manifest: IEnhancedExtensionManifest,\n): UIResourceReference[] {\n if (!manifest.mcp?.uiResources) return [];\n\n return manifest.mcp.uiResources.map(resource => {\n if ('content' in resource) {\n const reg = resource as UIResourceRegistration;\n // Determine type based on metadata presence\n let type: 'component' | 'application' | 'widget' = 'component';\n \n if (reg.metadata?.application) {\n type = 'application';\n }\n \n // 完整的 UIResourceRegistration\n return {\n uri: reg.uri,\n type,\n };\n }\n // 简化的 UIResourceReference\n return resource as UIResourceReference;\n });\n}\n\n/**\n * 从 Manifest 提取前端工具信息\n */\nexport function extractFrontendToolsFromManifest(\n manifest: IEnhancedExtensionManifest,\n): FrontendMCPTool[] {\n if (!manifest.mcp?.frontendTools) return [];\n return manifest.mcp.frontendTools.map((tool) => ({\n ...tool,\n handler: tool.handler || tool.handlerRef,\n handlerRef: tool.handlerRef || tool.handler,\n }));\n}\n"],"names":["_a"],"mappings":"AAcO,MAAM,qCAAqC;AAC3C,MAAM,gCAAgC;AAiJtC,SAAS,aAAa,UAA+C;AAC1E,SAAO,CAAC,CAAC,SAAS,OAAO,SAAS,IAAI,YAAY;AACpD;AAKO,SAAS,iBAAiB,UAG/B;AA5JK;AA6JL,QAAM,SAAmB,CAAA;AAGzB,MAAI,CAAC,SAAS,GAAI,QAAO,KAAK,4BAA4B;AAC1D,MAAI,CAAC,SAAS,KAAM,QAAO,KAAK,8BAA8B;AAC9D,MAAI,CAAC,SAAS,QAAS,QAAO,KAAK,iCAAiC;AACpE,MAAI,CAAC,SAAS,KAAM,QAAO,KAAK,8BAA8B;AAC9D,MACE,SAAS,oBAAoB,UAC7B,SAAS,oBAAoB,oCAC7B;AACA,WAAO,KAAK,gCAAgC,SAAS,eAAe,EAAE;AAAA,EACxE;AACA,MACE,SAAS,eAAe,UACxB,SAAS,eAAe,+BACxB;AACA,WAAO,KAAK,2BAA2B,SAAS,UAAU,EAAE;AAAA,EAC9D;AACA,MAAI,SAAS,aAAa,SAAS,UAAU,cAAc,UAAU;AACnE,WAAO,KAAK,oCAAoC,SAAS,UAAU,SAAS,EAAE;AAAA,EAChF;AACA,OAAI,cAAS,cAAT,mBAAoB,OAAO;AAC7B,WAAO,QAAQ,SAAS,UAAU,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AAClE,UAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,SAAS,IAAI,GAAG;AAC1F,eAAO,KAAK,gCAAgC,IAAI,EAAE;AAAA,MACpD;AACA,UAAI,CAAC,gCAAgC,KAAK,KAAK,GAAG;AAChD,eAAO,KAAK,qCAAqC,IAAI,EAAE;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,SAAS,KAAK;AAChB,UAAM,EAAE,aAAa,cAAA,IAAkB,SAAS;AAEhD,QAAI,aAAa;AACf,kBAAY,QAAQ,CAAC,UAAU,UAAU;AACvC,YAAI,SAAS,UAAU;AACrB,gBAAM,MAAO,SAAoC;AACjD,cAAI,CAAC,OAAO,CAAC,IAAI,WAAW,OAAO,GAAG;AACpC,mBAAO,KAAK,eAAe,KAAK,8CAA8C;AAAA,UAChF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,eAAe;AACjB,oBAAc,QAAQ,CAAC,MAAM,UAAU;AACrC,YAAI,CAAC,KAAK,aAAa,KAAK,iBAAiB,KAAK,iBAAiB;AACnE,YAAI,CAAC,KAAK,oBAAoB,KAAK,iBAAiB,KAAK,wBAAwB;AACjF,YAAI,CAAC,KAAK,WAAW,CAAC,KAAK,WAAY,QAAO,KAAK,iBAAiB,KAAK,oBAAoB;AAC7F,YAAI,CAAC,KAAK,oBAAoB,KAAK,iBAAiB,KAAK,wBAAwB;AAAA,MACnF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,EAAA;AAEJ;AAKO,SAAS,gBAAgB,UAA2C;AAEzE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,iBAAiB,SAAS,mBAAmB;AAAA,IAC7C,YAAY,SAAS,cAAc;AAAA,IACnC,KAAK,SAAS,OAAO;AAAA,MACnB,SAAS;AAAA,MACT,aAAa,CAAA;AAAA,MACb,eAAe,CAAA;AAAA,IAAC;AAAA,EAClB;AAEJ;AAKO,SAAS,+BACd,UACuB;AAnPlB;AAoPL,MAAI,GAAC,cAAS,QAAT,mBAAc,qBAAoB,CAAA;AAEvC,SAAO,SAAS,IAAI,YAAY,IAAI,CAAA,aAAY;AAtP3C,QAAAA;AAuPH,QAAI,aAAa,UAAU;AACzB,YAAM,MAAM;AAEZ,UAAI,OAA+C;AAEnD,WAAIA,MAAA,IAAI,aAAJ,gBAAAA,IAAc,aAAa;AAC7B,eAAO;AAAA,MACT;AAGA,aAAO;AAAA,QACL,KAAK,IAAI;AAAA,QACT;AAAA,MAAA;AAAA,IAEJ;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAKO,SAAS,iCACd,UACmB;AAhRd;AAiRL,MAAI,GAAC,cAAS,QAAT,mBAAc,uBAAsB,CAAA;AACzC,SAAO,SAAS,IAAI,cAAc,IAAI,CAAC,UAAU;AAAA,IAC/C,GAAG;AAAA,IACH,SAAS,KAAK,WAAW,KAAK;AAAA,IAC9B,YAAY,KAAK,cAAc,KAAK;AAAA,EAAA,EACpC;AACJ;"}
|
|
@@ -5,7 +5,7 @@ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
|
5
5
|
import * as React from "react";
|
|
6
6
|
import React__default, { memo, useState, forwardRef, createContext, useCallback, useMemo, useContext, useRef, useEffect, useLayoutEffect } from "react";
|
|
7
7
|
import { c as cn } from "./utils-D7w9BxgN.js";
|
|
8
|
-
import { g as getDefaultExportFromCjs, n as nanoid, e as extensionRegistry, R as RefreshCw, P as Plus, L as LayoutGrid } from "./extensionRegistry-
|
|
8
|
+
import { g as getDefaultExportFromCjs, n as nanoid, e as extensionRegistry, R as RefreshCw, P as Plus, L as LayoutGrid } from "./extensionRegistry-D35Ld-Wa.js";
|
|
9
9
|
import { createPortal } from "react-dom";
|
|
10
10
|
import { X } from "./x-DGVakEST.js";
|
|
11
11
|
import { S as Search } from "./search-BmktXQFD.js";
|
|
@@ -13424,4 +13424,4 @@ export {
|
|
|
13424
13424
|
applyNodeChanges as y,
|
|
13425
13425
|
applyEdgeChanges as z
|
|
13426
13426
|
};
|
|
13427
|
-
//# sourceMappingURL=FreeCanvas-
|
|
13427
|
+
//# sourceMappingURL=FreeCanvas-DritKIPq.js.map
|