@appthen/vibe-workspace 0.1.7 → 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-Ifd_a8Pb.js → devWorkbench-DZ1mFC3i.js} +2 -2
- package/dist/{devWorkbench-Ifd_a8Pb.js.map → devWorkbench-DZ1mFC3i.js.map} +1 -1
- 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/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 +1 -1
- package/postcss.config.js +1 -2
- package/tailwind.config.js +10 -3
- package/dist/PluginContext-J-PUm9Dt.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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from "react";
|
|
3
|
-
import { u as useBinaryFileUrl } from "./useBinaryFileUrl-
|
|
4
|
-
import { L as LoaderCircle, I as Image, Z as ZoomOut, a as ZoomIn, R as RotateCw, M as Maximize } from "./activate-
|
|
5
|
-
import { R as RefreshCw } from "./extensionRegistry-
|
|
3
|
+
import { u as useBinaryFileUrl } from "./useBinaryFileUrl-D11yvGuG.js";
|
|
4
|
+
import { L as LoaderCircle, I as Image, Z as ZoomOut, a as ZoomIn, R as RotateCw, M as Maximize } from "./activate-DVnxnmfA.js";
|
|
5
|
+
import { R as RefreshCw } from "./extensionRegistry-D35Ld-Wa.js";
|
|
6
6
|
const ImagePreview = ({ file }) => {
|
|
7
7
|
const [state, retry] = useBinaryFileUrl(file);
|
|
8
8
|
const [zoom, setZoom] = useState(1);
|
|
@@ -111,4 +111,4 @@ function formatBytes(size) {
|
|
|
111
111
|
export {
|
|
112
112
|
ImagePreview
|
|
113
113
|
};
|
|
114
|
-
//# sourceMappingURL=ImagePreview-
|
|
114
|
+
//# sourceMappingURL=ImagePreview-ByIQrPzb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImagePreview-
|
|
1
|
+
{"version":3,"file":"ImagePreview-ByIQrPzb.js","sources":["../src/plugins/binary-previews/ImagePreview.tsx"],"sourcesContent":["/**\n * 图片预览(png/jpg/gif/webp/svg/bmp/ico)。\n * 独立 lazy chunk——仅在首次打开图片文件时加载。\n */\nimport React, { useState } from 'react';\nimport {\n Loader2Icon,\n ZoomInIcon,\n ZoomOutIcon,\n RotateCwIcon,\n MaximizeIcon,\n RefreshCwIcon,\n ImageIcon,\n} from 'lucide-react';\nimport type { ICustomEditorProps } from '../../types';\nimport { useBinaryFileUrl } from './useBinaryFileUrl';\n\nexport const ImagePreview: React.FC<ICustomEditorProps> = ({ file }) => {\n const [state, retry] = useBinaryFileUrl(file);\n const [zoom, setZoom] = useState(1);\n const [rotation, setRotation] = useState(0);\n const [broken, setBroken] = useState(false);\n\n const stepZoom = (delta: number) => {\n setZoom((z) => Math.min(8, Math.max(0.1, Math.round((z + delta) * 10) / 10)));\n };\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 <ImageIcon 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 <ImageIcon size={32} className=\"text-vscode-textDark/50\" />\n <span className=\"mt-3 text-sm text-vscode-textDark\">\n 文件过大({formatBytes(state.size)}),超过预览上限,不支持预览\n </span>\n </Center>\n );\n }\n\n if (state.status === 'error' || broken) {\n return (\n <Center>\n <span className=\"text-sm text-red-400\">图片加载失败{state.status === 'error' ? `:${state.message}` : ''}</span>\n <button\n onClick={() => { setBroken(false); 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 {/* 工具条 */}\n <div className=\"flex h-10 shrink-0 items-center gap-0.5 border-b border-[#202635]/60 px-2\">\n <ToolButton title=\"缩小\" onClick={() => stepZoom(-0.1)}><ZoomOutIcon size={14} /></ToolButton>\n <ToolButton title=\"放大\" onClick={() => stepZoom(0.1)}><ZoomInIcon size={14} /></ToolButton>\n <ToolButton title=\"重置(100%)\" onClick={() => { setZoom(1); setRotation(0); }}><span className=\"text-[11px] px-0.5\">{Math.round(zoom * 100)}%</span></ToolButton>\n <ToolButton title=\"旋转 90°\" onClick={() => setRotation((r) => (r + 90) % 360)}><RotateCwIcon size={14} /></ToolButton>\n <ToolButton title=\"适应窗口\" onClick={() => setZoom(1)}><MaximizeIcon size={14} /></ToolButton>\n <span className=\"ml-2 truncate text-[11px] text-vscode-textDark/60\">{file?.name}</span>\n </div>\n {/* 画布 */}\n <div className=\"flex-1 overflow-auto\">\n <div className=\"flex min-h-full min-w-full items-center justify-center p-6\">\n <img\n src={state.url}\n alt={file?.name ?? 'image'}\n draggable={false}\n onError={() => setBroken(true)}\n style={{\n transform: `rotate(${rotation}deg) scale(${zoom})`,\n transformOrigin: 'center center',\n maxWidth: '100%',\n maxHeight: '100%',\n objectFit: 'contain',\n transition: 'transform 0.12s ease-out',\n }}\n />\n </div>\n </div>\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\nconst ToolButton: React.FC<{ title: string; onClick: () => void; children: React.ReactNode }> = ({\n title,\n onClick,\n children,\n}) => (\n <button\n onClick={onClick}\n title={title}\n className=\"rounded p-1.5 text-vscode-textDark hover:bg-[#2a2f3e] hover:text-vscode-text\"\n >\n {children}\n </button>\n);\n\nfunction formatBytes(size?: number): string {\n if (typeof size !== 'number') return '';\n if (size > 1024 * 1024) return `${(size / 1024 / 1024).toFixed(1)} MB`;\n return `${Math.max(1, Math.round(size / 1024))} KB`;\n}\n"],"names":["Loader2Icon","ImageIcon","RefreshCwIcon","ZoomOutIcon","ZoomInIcon","RotateCwIcon","MaximizeIcon"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { u as useBinaryFileUrl } from "./useBinaryFileUrl-
|
|
3
|
-
import { L as LoaderCircle, F as FileText, E as ExternalLink } from "./activate-
|
|
4
|
-
import { R as RefreshCw } from "./extensionRegistry-
|
|
2
|
+
import { u as useBinaryFileUrl } from "./useBinaryFileUrl-D11yvGuG.js";
|
|
3
|
+
import { L as LoaderCircle, F as FileText, E as ExternalLink } from "./activate-DVnxnmfA.js";
|
|
4
|
+
import { R as RefreshCw } from "./extensionRegistry-D35Ld-Wa.js";
|
|
5
5
|
const PdfPreview = ({ file }) => {
|
|
6
6
|
const [state, retry] = useBinaryFileUrl(file);
|
|
7
7
|
if (state.status === "loading") {
|
|
@@ -73,4 +73,4 @@ const Center = ({ children }) => /* @__PURE__ */ jsx("div", { className: "flex h
|
|
|
73
73
|
export {
|
|
74
74
|
PdfPreview
|
|
75
75
|
};
|
|
76
|
-
//# sourceMappingURL=PdfPreview-
|
|
76
|
+
//# sourceMappingURL=PdfPreview-0vwF3tLn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdfPreview-
|
|
1
|
+
{"version":3,"file":"PdfPreview-0vwF3tLn.js","sources":["../src/plugins/binary-previews/PdfPreview.tsx"],"sourcesContent":["/**\n * PDF 预览:浏览器原生查看器(iframe)。\n * 独立 lazy chunk;签名 URL 被存储端 X-Frame-Options 拦截时提供\"新标签页打开\"兜底。\n */\nimport React from 'react';\nimport { Loader2Icon, ExternalLinkIcon, FileTextIcon, RefreshCwIcon } from 'lucide-react';\nimport type { ICustomEditorProps } from '../../types';\nimport { useBinaryFileUrl } from './useBinaryFileUrl';\n\nexport const PdfPreview: React.FC<ICustomEditorProps> = ({ file }) => {\n const [state, retry] = useBinaryFileUrl(file);\n\n if (state.status === 'loading') {\n return (\n <div className=\"flex h-full flex-col items-center justify-center bg-vscode-bg\">\n <Loader2Icon className=\"animate-spin text-vscode-accent\" size={28} />\n <span className=\"mt-3 text-xs text-vscode-textDark\">加载 PDF 中...</span>\n </div>\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') {\n return (\n <Center>\n <span className=\"text-sm text-red-400\">PDF 加载失败:{state.message}</span>\n <button\n onClick={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 justify-between border-b border-[#202635]/60 px-3\">\n <span className=\"truncate text-[11px] text-vscode-textDark/60\">{file?.name}</span>\n <a\n href={state.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1.5 rounded p-1.5 text-xs text-vscode-textDark hover:bg-[#2a2f3e] hover:text-vscode-text\"\n title=\"在新标签页打开(iframe 被拦截时的兜底)\"\n >\n <ExternalLinkIcon size={13} /> 新标签页打开\n </a>\n </div>\n <iframe\n src={state.url}\n title={file?.name ?? 'pdf'}\n className=\"min-h-0 flex-1 border-0 bg-white\"\n />\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","ExternalLinkIcon"],"mappings":";;;;AASO,MAAM,aAA2C,CAAC,EAAE,WAAW;AACpE,QAAM,CAAC,OAAO,KAAK,IAAI,iBAAiB,IAAI;AAE5C,MAAI,MAAM,WAAW,WAAW;AAC9B,WACE,qBAAC,OAAA,EAAI,WAAU,iEACb,UAAA;AAAA,MAAA,oBAACA,cAAA,EAAY,WAAU,mCAAkC,MAAM,IAAI;AAAA,MACnE,oBAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA,cAAA,CAAW;AAAA,IAAA,GACjE;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,YAAY;AAC/B,gCACG,QAAA,EACC,UAAA;AAAA,MAAA,oBAACC,UAAA,EAAa,MAAM,IAAI,WAAU,2BAA0B;AAAA,MAC5D,oBAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA,kCAAA,CAA+B;AAAA,IAAA,GACrF;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,aAAa;AAChC,gCACG,QAAA,EACC,UAAA;AAAA,MAAA,oBAACA,UAAA,EAAa,MAAM,IAAI,WAAU,2BAA0B;AAAA,MAC5D,oBAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA,oBAAA,CAAiB;AAAA,IAAA,GACvE;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,SAAS;AAC5B,gCACG,QAAA,EACC,UAAA;AAAA,MAAA,qBAAC,QAAA,EAAK,WAAU,wBAAuB,UAAA;AAAA,QAAA;AAAA,QAAU,MAAM;AAAA,MAAA,GAAQ;AAAA,MAC/D;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UAEV,UAAA;AAAA,YAAA,oBAACC,WAAA,EAAc,MAAM,GAAA,CAAI;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAC7B,GACF;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,6CACb,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,qFACb,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,gDAAgD,UAAA,6BAAM,MAAK;AAAA,MAC3E;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAM,MAAM;AAAA,UACZ,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,WAAU;AAAA,UACV,OAAM;AAAA,UAEN,UAAA;AAAA,YAAA,oBAACC,cAAA,EAAiB,MAAM,GAAA,CAAI;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAChC,GACF;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK,MAAM;AAAA,QACX,QAAO,6BAAM,SAAQ;AAAA,QACrB,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EACZ,GACF;AAEJ;AAEA,MAAM,SAAkD,CAAC,EAAE,SAAA,MACzD,oBAAC,OAAA,EAAI,WAAU,kFACZ,UACH;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { mergeExtensionAccessPolicy } from "./extension-schema/index.js";
|
|
2
|
-
import { g as getRuntimeAccessToken, a as subscribeRuntimeActor, c as createExtensionCapabilities, b as getRuntimeActor } from "./pluginCapabilities-
|
|
2
|
+
import { g as getRuntimeAccessToken, a as subscribeRuntimeActor, c as createExtensionCapabilities, b as createExtensionViews, d as getRuntimeActor } from "./pluginCapabilities-BkCT7QDO.js";
|
|
3
3
|
var ExtensionType = /* @__PURE__ */ ((ExtensionType2) => {
|
|
4
4
|
ExtensionType2["WORKBENCH_HOME"] = "WORKBENCH_HOME";
|
|
5
5
|
ExtensionType2["CODE"] = "CODE";
|
|
@@ -216,24 +216,6 @@ function createWorkbenchLinkService(getFallbackRoute) {
|
|
|
216
216
|
}
|
|
217
217
|
};
|
|
218
218
|
}
|
|
219
|
-
function createExtensionViews(eventBus, workspaceEditorService) {
|
|
220
|
-
return {
|
|
221
|
-
openMain(viewId, props) {
|
|
222
|
-
eventBus == null ? void 0 : eventBus.emit("workbench", "mainView.open", { viewId, props });
|
|
223
|
-
},
|
|
224
|
-
openEditor({ viewId, title, props = {}, key, split }) {
|
|
225
|
-
if (!workspaceEditorService) {
|
|
226
|
-
throw new Error("workspaceEditorService is not available in this runtime");
|
|
227
|
-
}
|
|
228
|
-
const file = workspaceEditorService.createViewFile(viewId, title, props, key);
|
|
229
|
-
eventBus == null ? void 0 : eventBus.emit("workbench", "layout.forceOpen", {
|
|
230
|
-
fileId: file.id,
|
|
231
|
-
split
|
|
232
|
-
});
|
|
233
|
-
return file.id;
|
|
234
|
-
}
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
219
|
function createPluginContext(extensionRegistry, pluginId, pluginVersion, baseURL, eventBus, services, runtime, links = createWorkbenchLinkService(() => {
|
|
238
220
|
const fallbackWorkbenchId = (runtime == null ? void 0 : runtime.workbenchId) || "local-extension-dev";
|
|
239
221
|
const isSystem = fallbackWorkbenchId === "appthen-team-admin" || fallbackWorkbenchId === "appthen-builder";
|
|
@@ -296,4 +278,4 @@ export {
|
|
|
296
278
|
parseWorkbenchRoute as p,
|
|
297
279
|
resolveWorkbenchRouteExtensionId as r
|
|
298
280
|
};
|
|
299
|
-
//# sourceMappingURL=PluginContext-
|
|
281
|
+
//# sourceMappingURL=PluginContext-uAiGNF8S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginContext-uAiGNF8S.js","sources":["../src/types.ts","../src/workbench/workbenchRoute.ts","../src/workbench/workbenchLinkService.ts","../src/core/PluginContext.ts"],"sourcesContent":["\nimport React from 'react';\nimport { FileModel } from './plugins/explorer/services/fileSystem';\nimport type { CollaborationServices } from './core/realtime/collaboration';\n\nexport enum ExtensionType {\n WORKBENCH_HOME = 'WORKBENCH_HOME',\n CODE = 'CODE',\n OFFICE = 'OFFICE',\n RESEARCH = 'RESEARCH',\n MARKETPLACE = 'MARKETPLACE',\n MARKETPLACE_RESOURCES = 'MARKETPLACE_RESOURCES',\n KANBAN = 'KANBAN',\n NOTEBOOK = 'NOTEBOOK',\n FLOW = 'FLOW',\n DEBUGGER = 'DEBUGGER',\n ASSISTANT = 'ASSISTANT',\n WEBVIEW = 'WEBVIEW',\n MCP_APPS = 'MCP_APPS',\n WORKSPACE_MANAGER = 'WORKSPACE_MANAGER',\n WORK_WEIXIN = 'WORK_WEIXIN',\n SUBJECT_DIRECTORY = 'SUBJECT_DIRECTORY',\n OKR = 'OKR',\n TODO = 'TODO',\n CONVERSATION_NETWORK = 'CONVERSATION_NETWORK',\n CONVERSATION_HUB = 'CONVERSATION_HUB',\n EXTENSION_ADMIN = 'EXTENSION_ADMIN',\n WORKBENCH_ADMIN = 'WORKBENCH_ADMIN',\n GRAPH_MODELING_STUDIO = 'GRAPH_MODELING_STUDIO'\n}\n\n// --- Sandbox / Protocol Types ---\nexport interface LogEntry {\n id: string;\n level: 'log' | 'warn' | 'error' | 'info';\n content: any[];\n timestamp: number;\n source: string;\n}\n\nexport interface AppthenMessage {\n type: 'call' | 'response' | 'emit' | 'log' | 'ready';\n id?: string; // Unique ID for Promise tracking\n method?: string;\n event?: string;\n params?: any;\n payload?: any;\n result?: any;\n error?: string;\n // Add level property to fix WebViewEditor error\n level?: 'log' | 'warn' | 'error' | 'info';\n}\n\n// --- Core App Types ---\nexport interface TextEdit {\n range: { startLineNumber: number; startColumn: number; endLineNumber: number; endColumn: number; };\n text: string;\n}\nexport interface StructuralMutation { type: string; args: Record<string, any>; }\nexport interface FileMutation { fileId: string; textEdits?: TextEdit[]; structural?: StructuralMutation; }\nexport interface IMutationProvider {\n id: string;\n fileMatch: (filename: string) => boolean;\n getCapabilities: () => { name: string; description: string; parameters: any; }[];\n applyMutation: (model: FileModel, mutation: StructuralMutation) => Promise<any>;\n}\nexport interface ExtensionLayoutConfig { showInActivityBar: boolean; sidebarViewId?: string; editorMode: 'standard' | 'fullscreen'; defaultPosition?: 'left' | 'right'; shortLabel?: string; }\nexport interface IFileTreeController { expandAll: () => void; collapseAll: () => void; expandToPath: (path: string) => void; scrollToNode: (id: string) => void; selectNode: (id: string) => void; getSelectedNode: () => FileNode | null; setFilter: (query: string) => void; setLoadingState: (id: string, isLoading: boolean) => void; }\nexport interface IWorkspaceController { triggerNewFile: () => void; triggerFileUpload: () => void; }\nexport interface FileTreeConfig {\n indentSize?: number;\n renderIcon?: (node: FileNode) => React.ReactNode;\n renderMeta?: (node: FileNode) => React.ReactNode;\n readonly?: boolean;\n onToggleNode?: (node: FileNode, expanded: boolean) => void;\n /**\n * 默认展开的节点 ID 列表\n */\n defaultExpandedIds?: string[];\n}\nexport interface FileSystemStats { type: 'file' | 'directory'; size?: number; createTime?: number; modifyTime?: number; modifyBy?: number; title?: string; contentHash?: string | null; componentType?: string; isDocument?: boolean; width?: number; height?: number; portal?: boolean; screenshot?: { url: string; w: number; h: number; }; frames?: string[]; route?: any; routePath?: string; url?: string; isDirty?: boolean; isUnsaved?: boolean; }\nexport type FileType = 'folder' | 'typescript' | 'json' | 'markdown' | 'flow' | 'mongodb' | 'image' | 'pdf' | 'agent' | 'draw' | 'javascript' | 'text' | 'sql' | 'css' | 'config' | 'richtext' | 'data';\nexport type ResourceType = 'LcDocument' | 'ITypeEntity' | 'Service' | 'Config' | 'Asset' | 'Doc' | 'ResearchPaper' | 'AgentConfig' | 'Unknown';\nexport interface FileNode { id: string; name: string; type: FileType; path: string; content?: string; language?: string; children?: FileNode[]; parentId?: string; stats?: FileSystemStats; meta?: any; resourceType?: ResourceType; /**\n * 所属 runtime workspace ID。缺省 = 云端当前空间(存量语义,所有现有节点不带此字段)。\n * 判定文件来源不引入额外 origin 字段:workspaceId === undefined 即云端。\n */ workspaceId?: string; }\nexport interface ExplorerViewGroupOption { id: string; label: string; getGroupKey: (node: FileNode) => string; getGroupLabel?: (groupKey: string, nodes: FileNode[]) => string; }\nexport interface ExplorerViewRenderCardParams {\n node: FileNode;\n isActive: boolean;\n isFocused?: boolean;\n isMobile: boolean;\n onSelect: (node: FileNode) => void;\n recentActivity?: {\n kind: 'file-change' | 'type-update';\n actorLabel: string;\n badgeLabel: string;\n timestamp: number;\n };\n}\nexport interface ExplorerCustomViewRenderParams {\n files: FileNode[];\n activeId?: string | null;\n isMobile: boolean;\n onSelect: (node: FileNode) => void;\n onContextMenu: (e: React.MouseEvent, node: FileNode) => void;\n onAction?: (action: FileAction) => void;\n controller?: IWorkspaceController;\n}\nexport interface ExplorerViewExtension { id: string; label: string; kind?: 'tree' | 'collection' | 'custom'; icon?: React.ReactNode; description?: string; emptyTitle?: string; filter?: (node: FileNode) => boolean; groupOptions?: ExplorerViewGroupOption[]; sortNodes?: (a: FileNode, b: FileNode) => number; renderCard?: (params: ExplorerViewRenderCardParams) => React.ReactNode; renderView?: (params: ExplorerCustomViewRenderParams) => React.ReactNode; }\nexport interface WorkspaceViewProps { files: FileNode[]; onSelect: (node: FileNode) => void; onContextMenu: (e: React.MouseEvent, node: FileNode) => void; onAction?: (action: FileAction) => void; activeId?: string | null; cutId?: string | null; controller?: IWorkspaceController; filter?: (node: FileNode) => boolean; viewExtensions?: ExplorerViewExtension[]; }\nexport type FileActionType = 'move' | 'delete' | 'rename' | 'copy' | 'create' | 'upload' | 'chat_context' | 'cut_node' | 'copy_node' | 'paste_node';\nexport interface FileAction { type: FileActionType; payload: { sourceId?: string; targetId?: string; files?: FileList; fileType?: string; newName?: string; node?: FileNode; }; }\nexport interface MenuItem { label?: string; icon?: React.ReactNode; action?: () => void; separator?: boolean; danger?: boolean; shortcut?: string; disabled?: boolean; children?: MenuItem[]; }\nexport interface ContextMenuState { x: number; y: number; items: MenuItem[]; }\nexport interface ExplorerContext { node: FileNode; clipboard: { node: FileNode; mode: 'cut' | 'copy' } | null; dispatch: (action: FileAction) => void; }\nexport interface Message { id: string; role: 'user' | 'model'; text: string; timestamp: number; }\nexport interface Command { id: string; title: string; action: () => void; }\nexport type ExtensionRuntimeStatus = 'idle' | 'loading' | 'loaded' | 'error';\nexport interface ExtensionConfig { id: ExtensionType | string; name: string; icon: React.ReactNode; description: string; installed: boolean; commands?: Command[]; fileAssociations?: string[]; layout: ExtensionLayoutConfig; runtimeStatus?: ExtensionRuntimeStatus; runtimeError?: string; }\nexport interface EditorGroup { id: number; activeFileId: string | null; openFileIds: string[]; type?: 'main' | 'agent' | 'conversation' | 'secondary'; }\nexport type SplitDirection = 'row' | 'col';\nexport type LayoutNode = LayoutSplit | LayoutLeaf;\nexport interface LayoutSplit { type: 'split'; id: string; direction: SplitDirection; splitRatio: number; first: LayoutNode; second: LayoutNode; parent?: string; }\nexport interface LayoutLeaf { type: 'leaf'; id: string; groupId: number; }\nexport interface ICustomEditorProps {\n model: FileModel;\n file?: FileNode | null;\n collaboration?: CollaborationServices;\n}\nexport interface ITopBarItemProps { activeFile: FileNode | null; }\nexport interface IExtensionContribution { id: string; point: string; data: any; }\nexport interface DebugEvent { source: string; type: string; payload: any; timestamp: number; }\n\n// --- Flow Plugin Missing Types ---\nexport type FlowNodeState = 'idle' | 'running' | 'success' | 'error';\n\nexport interface FlowNodeContext {\n vfs: {\n readFile: (path: string) => Promise<string>;\n writeFile: (path: string, content: string) => Promise<void>;\n listAll: () => string[];\n };\n ai: {\n generate: (prompt: string) => Promise<string>;\n };\n editor: {\n openFile: (path: string) => void;\n };\n tasks: {\n execute: (nodeId: string) => Promise<any>;\n };\n}\n\nexport interface FlowNodeProps {\n id: string;\n data: any;\n selected?: boolean;\n context?: FlowNodeContext;\n}\n\n// --- Marketplace Missing Types ---\nexport type ResourceCategory = 'Template' | 'Plugin' | 'AI Agent' | 'Toolkit';\n\nexport interface MarketplaceItem {\n id: string;\n name: string;\n description: string;\n author: string;\n authorAvatar?: string;\n category: ResourceCategory;\n tags: string[];\n thumbnail: string;\n stats: { installs: string; likes: string };\n price: string;\n installed: boolean;\n type: ExtensionType | 'EXTERNAL_TEMPLATE';\n}\n","import type { Location } from 'react-router-dom';\nimport { ExtensionType } from '../types';\n\nexport const SYSTEM_WORKBENCH_ROUTE_KEYS = {\n 'appthen-team-admin': 'team-manage',\n 'appthen-builder': 'builder',\n vibecoding: 'vibecoding',\n} as const;\n\nconst SYSTEM_WORKBENCH_IDS: Map<string, string> = new Map(\n Object.entries(SYSTEM_WORKBENCH_ROUTE_KEYS).map(([id, key]) => [key, id]),\n);\n\nexport type WorkbenchRouteKind = 'tenant-system' | 'custom' | 'legacy';\n\nexport interface WorkbenchRouteTarget {\n extensionId?: string;\n viewId?: string;\n resourceId?: string;\n projectId?: string;\n spaceId?: string;\n filePath?: string;\n /** runtime workspace 文件的深链接标识(FileNode.workspaceId);云端文件缺省 */\n workspaceId?: string;\n params?: Record<string, string | number | boolean | null | undefined>;\n extensionParams?: Record<string, string | number | boolean | null | undefined>;\n}\n\nexport interface ParsedWorkbenchRoute {\n kind: WorkbenchRouteKind;\n tenantId?: string;\n workbenchRef: string;\n systemWorkbenchId?: string;\n legacyWorkbenchId?: string;\n extensionId?: string;\n viewId?: string;\n projectId?: string;\n query: URLSearchParams;\n}\n\nfunction decodeSegment(value?: string): string | undefined {\n if (!value) return undefined;\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction encodeSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\nfunction isSystemWorkbenchKey(value: string): boolean {\n return SYSTEM_WORKBENCH_IDS.has(value);\n}\n\nexport function getSystemWorkbenchRouteKey(workbenchId: string): string {\n return SYSTEM_WORKBENCH_ROUTE_KEYS[workbenchId as keyof typeof SYSTEM_WORKBENCH_ROUTE_KEYS] || workbenchId;\n}\n\nexport function getSystemWorkbenchId(routeKey: string): string | undefined {\n return SYSTEM_WORKBENCH_IDS.get(routeKey);\n}\n\nexport function getWorkbenchRouteExtensionKey(extensionId: string): string {\n return extensionId === 'code' ? 'explorer' : extensionId;\n}\n\nexport function resolveWorkbenchRouteExtensionId(extensionId?: string): string | undefined {\n if (!extensionId) return undefined;\n\n const normalized = extensionId.trim();\n const aliases: Record<string, string> = {\n code: ExtensionType.CODE,\n explorer: ExtensionType.CODE,\n subject_directory: ExtensionType.SUBJECT_DIRECTORY,\n 'subject-directory': ExtensionType.SUBJECT_DIRECTORY,\n };\n const alias = aliases[normalized.toLowerCase()];\n if (alias) return alias;\n\n const enumValue = Object.values(ExtensionType).find(\n (value) => value.toLowerCase() === normalized.toLowerCase(),\n );\n return enumValue || normalized;\n}\n\nexport function parseWorkbenchRoute(location: Pick<Location, 'pathname' | 'search'>): ParsedWorkbenchRoute | null {\n const segments = location.pathname.split('/').filter(Boolean).map(decodeSegment);\n const query = new URLSearchParams(location.search);\n\n if (segments[0] === 't' && segments[2] === 'w' && segments[1] && segments[3]) {\n const tenantId = segments[1];\n const workbenchRef = segments[3];\n const extensionId = segments[4];\n const viewId = segments[5];\n return {\n kind: 'tenant-system',\n tenantId,\n workbenchRef,\n systemWorkbenchId: getSystemWorkbenchId(workbenchRef),\n extensionId,\n viewId,\n query,\n };\n }\n\n if (segments[0] === 'w' && segments[1]) {\n return {\n kind: 'custom',\n workbenchRef: segments[1],\n extensionId: segments[2],\n viewId: segments[3],\n query,\n };\n }\n\n if (segments[0] === 'workbench-runtime' && segments[1]) {\n const legacyWorkbenchId = segments[1];\n const open = query.get('open') || undefined;\n return {\n kind: 'legacy',\n tenantId: query.get('tenantId') || undefined,\n workbenchRef: legacyWorkbenchId,\n legacyWorkbenchId,\n systemWorkbenchId: getSystemWorkbenchId(legacyWorkbenchId),\n extensionId: open,\n projectId: segments[2],\n query,\n };\n }\n\n return null;\n}\n\nexport function buildWorkbenchPath(input: {\n kind: Exclude<WorkbenchRouteKind, 'legacy'>;\n tenantId?: string;\n workbenchRef: string;\n extensionId?: string;\n viewId?: string;\n}): string {\n const extensionPath = input.extensionId ? `/${encodeSegment(input.extensionId)}` : '';\n const viewPath = input.viewId ? `/${encodeSegment(input.viewId)}` : '';\n\n if (input.kind === 'tenant-system') {\n if (!input.tenantId) {\n throw new Error('tenantId is required for a tenant system workbench route');\n }\n return `/t/${encodeSegment(input.tenantId)}/w/${encodeSegment(input.workbenchRef)}${extensionPath}${viewPath}`;\n }\n\n return `/w/${encodeSegment(input.workbenchRef)}${extensionPath}${viewPath}`;\n}\n\nfunction appendQueryValue(\n query: URLSearchParams,\n key: string,\n value: string | number | boolean | null | undefined,\n) {\n if (value === undefined || value === null || value === '') return;\n query.set(key, String(value));\n}\n\nexport function buildWorkbenchLink(\n route: Pick<ParsedWorkbenchRoute, 'kind' | 'tenantId' | 'workbenchRef'>,\n target: WorkbenchRouteTarget = {},\n): string {\n const kind = route.kind === 'tenant-system' ? 'tenant-system' : 'custom';\n const path = buildWorkbenchPath({\n kind,\n tenantId: route.tenantId,\n workbenchRef: route.workbenchRef,\n extensionId: target.extensionId,\n viewId: target.viewId,\n });\n const query = new URLSearchParams();\n\n appendQueryValue(query, 'project', target.projectId);\n appendQueryValue(query, 'space', target.spaceId);\n appendQueryValue(query, 'file', target.filePath);\n appendQueryValue(query, 'ws', target.workspaceId);\n appendQueryValue(query, 'resource', target.resourceId);\n\n Object.entries(target.params || {}).forEach(([key, value]) => {\n appendQueryValue(query, key, value);\n });\n\n const extensionId = target.extensionId;\n if (extensionId) {\n Object.entries(target.extensionParams || {}).forEach(([key, value]) => {\n appendQueryValue(query, `x.${extensionId}.${key}`, value);\n });\n }\n\n const queryString = query.toString();\n return queryString ? `${path}?${queryString}` : path;\n}\n","import {\n buildWorkbenchLink,\n getSystemWorkbenchRouteKey,\n parseWorkbenchRoute,\n type ParsedWorkbenchRoute,\n type WorkbenchRouteTarget,\n} from './workbenchRoute';\n\nexport interface WorkbenchLinkService {\n create(target?: WorkbenchRouteTarget): string;\n createAbsolute(target?: WorkbenchRouteTarget): string;\n open(target?: WorkbenchRouteTarget, options?: { replace?: boolean }): string;\n copy(target?: WorkbenchRouteTarget): Promise<string>;\n}\n\nfunction getCurrentLocation() {\n if (typeof window === 'undefined') {\n return null;\n }\n return {\n pathname: window.location.pathname,\n search: window.location.search,\n };\n}\n\nexport function createWorkbenchLinkService(\n getFallbackRoute?: () => Pick<ParsedWorkbenchRoute, 'kind' | 'tenantId' | 'workbenchRef'> | null,\n): WorkbenchLinkService {\n const create = (target: WorkbenchRouteTarget = {}) => {\n const location = getCurrentLocation();\n const route = (location ? parseWorkbenchRoute(location) : null) || getFallbackRoute?.();\n if (!route) {\n throw new Error('Cannot create a workbench link outside a canonical workbench route');\n }\n if (route.kind === 'legacy') {\n if (!route.tenantId || !['appthen-team-admin', 'appthen-builder', 'vibecoding'].includes(route.workbenchRef)) {\n throw new Error('Legacy custom workbench links require a canonical public workbench route');\n }\n return buildWorkbenchLink(\n {\n kind: 'tenant-system',\n tenantId: route.tenantId,\n workbenchRef: getSystemWorkbenchRouteKey(route.workbenchRef),\n },\n target,\n );\n }\n return buildWorkbenchLink(route, target);\n };\n const createAbsolute = (target: WorkbenchRouteTarget = {}) => {\n const path = create(target);\n return typeof window === 'undefined' ? path : new URL(path, window.location.origin).toString();\n };\n\n return {\n create,\n\n createAbsolute,\n\n open(target, options = {}) {\n const path = create(target);\n if (typeof window !== 'undefined') {\n const method = options.replace ? 'replaceState' : 'pushState';\n window.history[method]({}, '', path);\n window.dispatchEvent(new PopStateEvent('popstate'));\n }\n return path;\n },\n\n async copy(target) {\n const path = createAbsolute(target);\n if (typeof navigator === 'undefined' || !navigator.clipboard) {\n throw new Error('Clipboard API is not available');\n }\n await navigator.clipboard.writeText(path);\n return path;\n },\n };\n}\n","import type { ExtensionRegistry } from './extensionRegistry';\nimport {\n mergeExtensionAccessPolicy,\n type ExtensionAccessPolicy,\n} from './extensionAccessPolicy';\nimport type { CollaborationServices } from './realtime/collaboration';\nimport {\n createExtensionCapabilities,\n type ExtensionCapabilities,\n} from './pluginCapabilities';\nimport {\n getRuntimeAccessToken,\n getRuntimeActor,\n subscribeRuntimeActor,\n type RuntimeActorContext,\n} from './runtimeActor';\nimport { createWorkbenchLinkService, type WorkbenchLinkService } from '../workbench/workbenchLinkService';\nimport { createExtensionViews, type ExtensionViews } from './extensionViews';\n\n/**\n * 插件激活上下文\n *\n * 为插件提供注册扩展所需的所有 API 和服务\n * 支持内部插件(直接导入)和外部插件(UMD 包)\n */\nexport interface PluginContext {\n /**\n * 扩展注册表 - 用于注册各种扩展点\n *\n * 直接使用 ExtensionRegistry 类型,提供完整的类型约束和 IDE 提示\n */\n extensionRegistry: ExtensionRegistry;\n\n /**\n * 插件元数据\n */\n plugin: {\n id: string;\n version?: string;\n baseURL?: string; // 外部插件的基础 URL\n };\n\n /**\n * 全局事件总线(如果需要)\n */\n eventBus?: {\n emit(channel: string, event: string, data?: any): void;\n on(channel: string, event: string, handler: (...args: any[]) => void): void;\n off(channel: string, event: string, handler?: (...args: any[]) => void): void;\n };\n\n /**\n * 服务访问(如果需要)\n */\n services?: {\n [key: string]: any;\n collaboration?: CollaborationServices;\n };\n\n /**\n * 当前运行时身份上下文。\n *\n * 新扩展应优先使用这里读取 tenant / workbench / user / subject / membership,\n * 避免直接读取 localStorage。\n */\n auth: {\n getActor(): RuntimeActorContext | null;\n subscribeActor(listener: (actor: RuntimeActorContext | null) => void): () => void;\n getAccessToken(): string | null;\n };\n\n /**\n * 当前 Workbench Runtime 上下文。\n */\n runtime: {\n offline?: boolean;\n tenantId?: string;\n /** 编辑器项目模型使用的 legacy numeric teamId;用于兼容旧项目权限查询。 */\n teamId?: string;\n workbenchId?: string;\n accessPolicy?: ExtensionAccessPolicy;\n extensionAccessPolicies?: Record<string, ExtensionAccessPolicy>;\n route: {\n pathname: string;\n query: URLSearchParams;\n };\n };\n\n /** 当前 Workbench 的可分享深链接能力。 */\n links: WorkbenchLinkService;\n\n /** 面向扩展的主视图和编辑器页签打开能力。 */\n views: ExtensionViews;\n\n /**\n * 面向扩展开发者的稳定注册 API。\n *\n * 底层仍使用 ExtensionRegistry / UIResourceRegistry / FrontendMCPServer。\n */\n capabilities: ExtensionCapabilities;\n}\n\n/**\n * 插件激活函数类型\n *\n * @param ctx - 插件上下文,包含注册 API 和元数据\n * @returns 可选的停用函数,用于清理资源\n */\nexport type PluginActivateFunction = (ctx: PluginContext) => (() => void) | void;\n\n/**\n * 插件生命周期\n */\nexport interface PluginLifecycle {\n activate: PluginActivateFunction;\n deactivate?(): void;\n}\n\n/**\n * 创建插件上下文\n *\n * @internal\n */\nexport function createPluginContext(\n extensionRegistry: ExtensionRegistry,\n pluginId: string,\n pluginVersion?: string,\n baseURL?: string,\n eventBus?: any,\n services?: Record<string, any>,\n runtime?: Partial<PluginContext['runtime']>,\n links: WorkbenchLinkService = createWorkbenchLinkService(() => {\n const fallbackWorkbenchId = runtime?.workbenchId || 'local-extension-dev';\n const isSystem = fallbackWorkbenchId === 'appthen-team-admin' || fallbackWorkbenchId === 'appthen-builder';\n return {\n kind: isSystem ? 'tenant-system' : 'custom',\n tenantId: runtime?.tenantId,\n workbenchRef: isSystem\n ? fallbackWorkbenchId === 'appthen-team-admin' ? 'team-manage' : 'builder'\n : fallbackWorkbenchId,\n };\n }),\n extensionId?: string,\n): PluginContext {\n const getActor = () => getRuntimeActor();\n const pluginAccessPolicy = mergeExtensionAccessPolicy(\n runtime?.accessPolicy,\n runtime?.extensionAccessPolicies?.[pluginId],\n );\n\n return {\n extensionRegistry,\n plugin: {\n id: pluginId,\n version: pluginVersion,\n baseURL,\n },\n eventBus,\n services,\n auth: {\n getActor,\n subscribeActor: subscribeRuntimeActor,\n getAccessToken: getRuntimeAccessToken,\n },\n runtime: {\n offline: runtime?.offline,\n tenantId: runtime?.tenantId,\n teamId: runtime?.teamId,\n workbenchId: runtime?.workbenchId,\n accessPolicy: runtime?.accessPolicy,\n extensionAccessPolicies: runtime?.extensionAccessPolicies,\n route: runtime?.route || {\n pathname: typeof window !== 'undefined' ? window.location.pathname : '',\n query: typeof window !== 'undefined'\n ? new URLSearchParams(window.location.search)\n : new URLSearchParams(),\n },\n },\n links,\n views: createExtensionViews(eventBus, services?.workspaceEditorService),\n capabilities: createExtensionCapabilities(extensionRegistry, getActor, {\n accessPolicy: pluginAccessPolicy,\n extensionId: extensionId || pluginId,\n }),\n };\n}\n"],"names":["ExtensionType"],"mappings":"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"}
|