@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
package/dist/workbench/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A, V, a, W, b, c, r, u } from "../Workbench-
|
|
2
|
-
import { b as b2, a as a2, d, g, e, f, p } from "../PluginContext-
|
|
1
|
+
import { A, V, a, W, b, c, r, u } from "../Workbench-8uTfTtsq.js";
|
|
2
|
+
import { b as b2, a as a2, d, g, e, f, p } from "../PluginContext-uAiGNF8S.js";
|
|
3
3
|
export {
|
|
4
4
|
A as ASSISTANT_FILE,
|
|
5
5
|
V as VIBE_CODING_SCENE_CONFIG,
|
package/package.json
CHANGED
package/postcss.config.js
CHANGED
package/tailwind.config.js
CHANGED
|
@@ -21,6 +21,10 @@ export default {
|
|
|
21
21
|
},
|
|
22
22
|
},
|
|
23
23
|
extend: {
|
|
24
|
+
fontFamily: {
|
|
25
|
+
sans: ['Inter', 'system-ui', 'sans-serif'],
|
|
26
|
+
mono: ['JetBrains Mono', 'monospace'],
|
|
27
|
+
},
|
|
24
28
|
borderColor: {
|
|
25
29
|
DEFAULT: "var(--border)",
|
|
26
30
|
vscode: "var(--vscode-panel-border)",
|
|
@@ -115,9 +119,12 @@ export default {
|
|
|
115
119
|
},
|
|
116
120
|
},
|
|
117
121
|
borderRadius: {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
122
|
+
'xs': '2px',
|
|
123
|
+
'sm': '4px',
|
|
124
|
+
'md': '6px',
|
|
125
|
+
'lg': '8px',
|
|
126
|
+
'xl': '10px',
|
|
127
|
+
'2xl': '14px',
|
|
121
128
|
},
|
|
122
129
|
ringOffsetColor: {
|
|
123
130
|
DEFAULT: "var(--background)",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PluginContext-J-PUm9Dt.js","sources":["../src/types.ts","../src/workbench/workbenchRoute.ts","../src/workbench/workbenchLinkService.ts","../src/core/extensionViews.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","export interface OpenEditorViewInput {\n viewId: string;\n title: string;\n props?: Record<string, unknown>;\n /** Stable logical tab identity. The same viewId + key reuses one tab. */\n key?: string;\n split?: 'row' | 'col';\n}\n\nexport interface ExtensionViews {\n /** @internal Host-only compatibility API. External extensions must use openEditor. */\n openMain(viewId: string, props?: Record<string, unknown>): void;\n openEditor(input: OpenEditorViewInput): string;\n}\n\ninterface WorkspaceEditorServiceLike {\n createViewFile(\n viewId: string,\n title: string,\n props: Record<string, unknown>,\n key?: string,\n ): { id: string };\n}\n\ninterface ExtensionEventBusLike {\n emit(channel: string, event: string, data?: unknown): void;\n}\n\nexport function createExtensionViews(\n eventBus?: ExtensionEventBusLike,\n workspaceEditorService?: WorkspaceEditorServiceLike,\n): ExtensionViews {\n return {\n openMain(viewId, props) {\n eventBus?.emit('workbench', 'mainView.open', { viewId, props });\n },\n\n openEditor({ viewId, title, props = {}, key, split }) {\n if (!workspaceEditorService) {\n throw new Error('workspaceEditorService is not available in this runtime');\n }\n\n const file = workspaceEditorService.createViewFile(viewId, title, props, key);\n eventBus?.emit('workbench', 'layout.forceOpen', {\n fileId: file.id,\n split,\n });\n return file.id;\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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pluginCapabilities-9gzDTIuB.js","sources":["../src/core/ui-resource/types.ts","../src/core/ui-resource/UIResourceRegistry.ts","../src/components/mcp-apps/ComponentLifecycleManager.ts","../src/core/bridge/types.ts","../src/core/bridge/UnifiedBridgeProtocol.ts","../src/core/mcp/FrontendMCPServer.ts","../src/core/runtimeActor.ts","../src/core/frontendToolRegistry.ts","../src/core/pluginCapabilities.ts"],"sourcesContent":["/**\n * MCP Apps UI 资源类型定义\n * 参考: https://modelcontextprotocol.io/extensions/apps/overview\n */\n\n/**\n * UI 资源 MIME 类型\n */\nexport enum UIMimeType {\n // HTML MCP App (iframe 渲染)\n HTML_MCP_APP = 'text/html;profile=mcp-app',\n // HTML Content\n HTML = 'text/html',\n\n // Appthen Application\n APPLICATION = 'application/x-appthen-app',\n\n // 原生 React 组件 (JSON 格式)\n REACT_COMPONENT = 'application/vnd.mcp.react+json',\n\n // Vue 组件\n VUE_COMPONENT = 'application/vnd.mcp.vue+json',\n\n // 自定义组件\n CUSTOM_COMPONENT = 'application/vnd.mcp.custom+json',\n}\n\n/**\n * UI 资源类型\n */\nexport enum UIResourceType {\n COMPONENT = 'component',\n APPLICATION = 'application',\n TEMPLATE = 'template',\n WIDGET = 'widget',\n}\n\n/**\n * CSP (内容安全策略) 配置\n */\nexport interface UIResourceCSP {\n /** 允许连接的域名 */\n connectDomains?: string[];\n /** 允许加载资源的域名 */\n resourceDomains?: string[];\n /** 允许嵌入的 iframe 域名 */\n frameDomains?: string[];\n}\n\n/**\n * UI 权限配置\n */\nexport interface UIResourcePermissions {\n /** 相机权限 */\n camera?: Record<string, unknown>;\n /** 麦克风权限 */\n microphone?: Record<string, unknown>;\n /** 地理位置权限 */\n geolocation?: Record<string, unknown>;\n /** 剪贴板写入权限 */\n clipboardWrite?: Record<string, unknown>;\n}\n\n/**\n * UI 资源元数据\n */\nexport interface UIResourceMetadata {\n /** 资源 URL */\n url?: string;\n /** 沙箱配置 */\n sandbox?: string | boolean;\n\n /** Agent 可理解的描述 */\n agentDescription?: string;\n\n /** 组件能力列表 */\n capabilities?: string[];\n\n /** 交互方式 */\n interactions?: {\n /** 用户可执行的操作 */\n userActions?: string[];\n /** Agent 可执行的操作 */\n agentActions?: string[];\n };\n\n /** MCP Apps 标准配置 */\n ui?: {\n /** CSP 配置 */\n csp?: UIResourceCSP;\n /** 权限配置 */\n permissions?: UIResourcePermissions;\n /** 是否显示边框 */\n prefersBorder?: boolean;\n };\n\n /** 组件级配置 */\n component?: {\n /** 组件类型 */\n type: 'react' | 'vue' | 'custom';\n /** 组件名称 */\n componentName: string;\n /** Props Schema */\n propsSchema?: Record<string, unknown>;\n };\n\n /** 应用级配置 */\n application?: {\n /** 应用类型 */\n type: 'standalone' | 'embedded';\n /** 项目 ID */\n projectId?: string;\n /** 入口路径 */\n entryPath?: string;\n /** 路由配置 */\n routes?: Record<string, string> | string[];\n /** 入口文件 */\n entry: string;\n /** 路由路径 */\n routePath?: string;\n /** 图标 */\n icon?: string;\n };\n\n /** 显示配置 */\n display?: {\n /** 显示类型 */\n type?: 'inline' | 'modal' | 'sidebar' | 'panel';\n /** 默认尺寸 */\n defaultSize?: {\n width?: number | string;\n height?: number | string;\n };\n /** 是否可调整大小 */\n resizable?: boolean;\n };\n}\n\n/**\n * UI 资源注册信息\n */\nexport interface UIResourceRegistration {\n /** 资源 URI (ui://component/stock-chart) */\n uri: string;\n\n /** 资源名称 */\n name: string;\n\n /** 资源描述 */\n description?: string;\n\n /** MIME 类型 */\n mimeType: UIMimeType | string;\n\n /** 元数据 */\n metadata: UIResourceMetadata;\n\n /** 内容 (HTML 或组件代码) */\n content?: string | any;\n\n /** 版本 */\n version?: string;\n\n /** 作者 */\n author?: string;\n\n /** 依赖 */\n dependencies?: Record<string, string>;\n\n /** 标签 */\n tags?: string[];\n\n /** 分类 */\n category?: string;\n}\n\n/**\n * UI 资源查询过滤器\n */\nexport interface UIResourceFilter {\n /** 按 MIME 类型过滤 */\n mimeType?: string | string[];\n\n /** 按标签过滤 */\n tags?: string[];\n\n /** 按分类过滤 */\n category?: string;\n\n /** 按能力过滤 */\n capability?: string;\n\n /** 搜索关键词 */\n search?: string;\n\n /** 按资源类型过滤 */\n resourceType?: UIResourceType;\n}\n\n/**\n * UI 资源注册选项\n */\nexport interface UIResourceRegisterOptions {\n /** 是否覆盖已存在的资源 */\n overwrite?: boolean;\n\n /** 是否验证资源 */\n validate?: boolean;\n\n /** 注册成功回调 */\n onRegistered?: (resource: UIResourceRegistration) => void;\n}\n\n/**\n * 组件状态信息\n */\nexport interface ComponentState {\n /** 组件 ID */\n componentId: string;\n\n /** 状态数据 */\n state: Record<string, unknown>;\n\n /** 最后更新时间 */\n lastUpdated: number;\n\n /** 状态版本 */\n version: number;\n}\n\n/**\n * Meta Prompt 生成选项\n */\nexport interface MetaPromptOptions {\n /** 是否包含示例 */\n includeExamples?: boolean;\n\n /** 格式化选项 */\n format?: 'markdown' | 'json' | 'plain';\n\n /** 语言 */\n language?: 'zh' | 'en';\n\n /** 最大长度 */\n maxLength?: number;\n}\n","/**\n * UI 资源注册表\n *\n * 负责管理 appthen-workspace 中所有 UI 资源的注册、查询和元数据生成。\n * 兼容 MCP Apps ui:// 协议标准。\n *\n * @see https://modelcontextprotocol.io/extensions/apps/overview\n */\n\nimport type {\n UIResourceRegistration,\n UIResourceFilter,\n UIResourceRegisterOptions,\n ComponentState,\n MetaPromptOptions,\n UIResourceType,\n} from './types';\nimport { UIMimeType } from './types';\n\n/**\n * UI 资源注册表类\n */\nexport class UIResourceRegistry {\n /** 资源存储 Map */\n private resources: Map<string, UIResourceRegistration>;\n\n /** 组件状态存储 Map */\n private componentStates: Map<string, ComponentState>;\n\n /** URI 到组件 ID 的映射 */\n private uriToComponentId: Map<string, string>;\n\n /** 事件监听器 */\n private eventListeners: Map<string, Set<Function>>;\n\n constructor() {\n this.resources = new Map();\n this.componentStates = new Map();\n this.uriToComponentId = new Map();\n this.eventListeners = new Map();\n }\n\n /**\n * 注册 UI 资源\n * @param resource 资源信息\n * @param options 注册选项\n * @returns 是否注册成功\n */\n register(\n resource: UIResourceRegistration,\n options: UIResourceRegisterOptions = {},\n ): boolean {\n const { overwrite = false, validate = true } = options;\n\n // 验证资源\n if (validate && !this.validateResource(resource)) {\n console.warn(`[UIResourceRegistry] Invalid resource: ${resource.uri}`);\n return false;\n }\n\n // 检查是否已存在\n if (this.resources.has(resource.uri) && !overwrite) {\n console.warn(`[UIResourceRegistry] Resource already exists: ${resource.uri}`);\n return false;\n }\n\n // 注册资源\n this.resources.set(resource.uri, resource);\n\n // 触发注册事件\n this.emit('resource:registered', resource);\n\n // 执行回调\n if (options.onRegistered) {\n options.onRegistered(resource);\n }\n\n console.log(`[UIResourceRegistry] Registered resource: ${resource.uri}`);\n return true;\n }\n\n /**\n * 批量注册 UI 资源\n * @param resources 资源列表\n * @param options 注册选项\n * @returns 成功注册的数量\n */\n registerBatch(\n resources: UIResourceRegistration[],\n options: UIResourceRegisterOptions = {},\n ): number {\n let successCount = 0;\n\n for (const resource of resources) {\n if (this.register(resource, options)) {\n successCount++;\n }\n }\n\n console.log(`[UIResourceRegistry] Batch registered: ${successCount}/${resources.length}`);\n return successCount;\n }\n\n /**\n * 注销 UI 资源\n * @param uri 资源 URI\n * @returns 是否注销成功\n */\n unregister(uri: string): boolean {\n if (!this.resources.has(uri)) {\n console.warn(`[UIResourceRegistry] Resource not found: ${uri}`);\n return false;\n }\n\n const resource = this.resources.get(uri)!;\n this.resources.delete(uri);\n\n // 触发注销事件\n this.emit('resource:unregistered', resource);\n\n console.log(`[UIResourceRegistry] Unregistered resource: ${uri}`);\n return true;\n }\n\n /**\n * 获取 UI 资源\n * @param uri 资源 URI\n * @returns 资源信息或 undefined\n */\n get(uri: string): UIResourceRegistration | undefined {\n return this.resources.get(uri);\n }\n\n /**\n * 查询 UI 资源列表\n * @param filter 过滤条件\n * @returns 资源列表\n */\n list(filter: UIResourceFilter = {}): UIResourceRegistration[] {\n let results = Array.from(this.resources.values());\n\n // 按 MIME 类型过滤\n if (filter.mimeType) {\n const mimeTypes = Array.isArray(filter.mimeType) ? filter.mimeType : [filter.mimeType];\n results = results.filter(r => mimeTypes.includes(r.mimeType as string));\n }\n\n // 按标签过滤\n if (filter.tags && filter.tags.length > 0) {\n results = results.filter(r =>\n r.tags?.some(tag => filter.tags!.includes(tag)),\n );\n }\n\n // 按分类过滤\n if (filter.category) {\n results = results.filter(r => r.category === filter.category);\n }\n\n // 按能力过滤\n if (filter.capability) {\n results = results.filter(r =>\n r.metadata.capabilities?.includes(filter.capability!),\n );\n }\n\n // 搜索关键词\n if (filter.search) {\n const searchLower = filter.search.toLowerCase();\n results = results.filter(r =>\n r.name.toLowerCase().includes(searchLower) ||\n r.description?.toLowerCase().includes(searchLower) ||\n r.uri.toLowerCase().includes(searchLower),\n );\n }\n\n return results;\n }\n\n /**\n * 获取所有资源 URI\n * @returns URI 列表\n */\n listUris(): string[] {\n return Array.from(this.resources.keys());\n }\n\n /**\n * 检查资源是否存在\n * @param uri 资源 URI\n * @returns 是否存在\n */\n has(uri: string): boolean {\n return this.resources.has(uri);\n }\n\n /**\n * 获取资源数量\n * @returns 资源总数\n */\n count(): number {\n return this.resources.size;\n }\n\n /**\n * 更新组件状态\n * @param componentId 组件 ID\n * @param state 状态数据\n */\n updateComponentState(componentId: string, state: Record<string, unknown>): void {\n const existing = this.componentStates.get(componentId);\n const version = existing ? existing.version + 1 : 1;\n\n const nextState = {\n componentId,\n state,\n lastUpdated: Date.now(),\n version,\n } satisfies ComponentState;\n this.componentStates.set(componentId, nextState);\n\n // Notify both the component subscriber and global registry observers.\n this.emit(`state:${componentId}`, nextState);\n this.emit('state:updated', { componentId, state, version });\n }\n\n /**\n * 获取组件状态\n * @param componentId 组件 ID\n * @returns 状态信息或 undefined\n */\n getComponentState(componentId: string): ComponentState | undefined {\n return this.componentStates.get(componentId);\n }\n\n /**\n * 订阅组件状态\n * @param componentId 组件 ID\n * @param callback 回调函数\n * @returns 取消订阅函数\n */\n subscribeComponentState(\n componentId: string,\n callback: (state: ComponentState) => void,\n ): () => void {\n const eventKey = `state:${componentId}`;\n\n if (!this.eventListeners.has(eventKey)) {\n this.eventListeners.set(eventKey, new Set());\n }\n\n this.eventListeners.get(eventKey)!.add(callback);\n\n // 返回取消订阅函数\n return () => {\n const listeners = this.eventListeners.get(eventKey);\n if (listeners) {\n listeners.delete(callback);\n if (listeners.size === 0) {\n this.eventListeners.delete(eventKey);\n }\n }\n };\n }\n\n /**\n * 关联 URI 到组件 ID\n * @param uri 资源 URI\n * @param componentId 组件 ID\n */\n associateComponent(uri: string, componentId: string): void {\n this.uriToComponentId.set(uri, componentId);\n }\n\n /**\n * 根据 URI 获取组件 ID\n * @param uri 资源 URI\n * @returns 组件 ID 或 undefined\n */\n getComponentId(uri: string): string | undefined {\n return this.uriToComponentId.get(uri);\n }\n\n /**\n * 生成 Meta Prompt\n * @param options 生成选项\n * @returns Meta Prompt 字符串\n */\n generateMetaPrompt(options: MetaPromptOptions = {}): string {\n const {\n includeExamples = false,\n format = 'markdown',\n language = 'zh',\n } = options;\n\n const resources = Array.from(this.resources.values());\n\n if (resources.length === 0) {\n return language === 'zh' ? '没有可用的 UI 资源。' : 'No UI resources available.';\n }\n\n if (format === 'json') {\n return this.generateJsonMetaPrompt(resources, includeExamples);\n }\n\n return this.generateMarkdownMetaPrompt(resources, includeExamples, language);\n }\n\n /**\n * 生成 Markdown 格式的 Meta Prompt\n */\n private generateMarkdownMetaPrompt(\n resources: UIResourceRegistration[],\n includeExamples: boolean,\n language: 'zh' | 'en',\n ): string {\n const title = language === 'zh' ? '# 可用的 UI 资源' : '# Available UI Resources';\n const intro = language === 'zh'\n ? '以下是当前可用的 UI 资源列表,可以在对话或应用中渲染:'\n : 'The following UI resources are available for rendering in chat or applications:';\n\n let prompt = `${title}\\n\\n${intro}\\n\\n`;\n\n // 按分类分组\n const grouped = this.groupResourcesByCategory(resources);\n\n for (const [category, categoryResources] of Object.entries(grouped)) {\n prompt += `## ${category}\\n\\n`;\n\n for (const resource of categoryResources) {\n prompt += `### ${resource.name}\\n\\n`;\n prompt += `- **URI**: \\`${resource.uri}\\`\\n`;\n\n if (resource.description) {\n prompt += `- **${language === 'zh' ? '描述' : 'Description'}**: ${resource.description}\\n`;\n }\n\n if (resource.metadata.agentDescription) {\n prompt += `- **${language === 'zh' ? 'Agent 能力' : 'Agent Capability'}**: ${resource.metadata.agentDescription}\\n`;\n }\n\n if (resource.metadata.capabilities?.length) {\n prompt += `- **${language === 'zh' ? '功能' : 'Capabilities'}**: ${resource.metadata.capabilities.join(', ')}\\n`;\n }\n\n if (resource.metadata.interactions) {\n if (resource.metadata.interactions.userActions?.length) {\n prompt += `- **${language === 'zh' ? '用户操作' : 'User Actions'}**: ${resource.metadata.interactions.userActions.join(', ')}\\n`;\n }\n if (resource.metadata.interactions.agentActions?.length) {\n prompt += `- **${language === 'zh' ? 'Agent 操作' : 'Agent Actions'}**: ${resource.metadata.interactions.agentActions.join(', ')}\\n`;\n }\n }\n\n if (includeExamples && resource.metadata.component?.componentName) {\n prompt += `- **${language === 'zh' ? '使用示例' : 'Example'}**:\\n`;\n prompt += ` \\`\\`\\`typescript\\n`;\n prompt += ` // ${language === 'zh' ? '在工具返回中引用此资源' : 'Reference this resource in tool response'}\\n`;\n prompt += ` return {\\n`;\n prompt += ` _meta: {\\n`;\n prompt += ` ui: {\\n`;\n prompt += ` resourceUri: \"${resource.uri}\"\\n`;\n prompt += ` }\\n`;\n prompt += ` },\\n`;\n prompt += ` // ... other data\\n`;\n prompt += ` };\\n`;\n prompt += ` \\`\\`\\`\\n`;\n }\n\n prompt += '\\n';\n }\n }\n\n return prompt;\n }\n\n /**\n * 生成 JSON 格式的 Meta Prompt\n */\n private generateJsonMetaPrompt(\n resources: UIResourceRegistration[],\n includeExamples: boolean,\n ): string {\n const data = resources.map(resource => ({\n uri: resource.uri,\n name: resource.name,\n description: resource.description,\n mimeType: resource.mimeType,\n capabilities: resource.metadata.capabilities,\n interactions: resource.metadata.interactions,\n ...(includeExamples && { component: resource.metadata.component }),\n }));\n\n return JSON.stringify(data, null, 2);\n }\n\n /**\n * 按分类分组资源\n */\n private groupResourcesByCategory(\n resources: UIResourceRegistration[],\n ): Record<string, UIResourceRegistration[]> {\n const grouped: Record<string, UIResourceRegistration[]> = {};\n\n for (const resource of resources) {\n const category = resource.category || 'Uncategorized';\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(resource);\n }\n\n return grouped;\n }\n\n /**\n * 验证资源\n */\n private validateResource(resource: UIResourceRegistration): boolean {\n // 验证 URI 格式\n if (!resource.uri || !resource.uri.startsWith('ui://')) {\n console.error('[UIResourceRegistry] Invalid URI format');\n return false;\n }\n\n // 验证必填字段\n if (!resource.name) {\n console.error('[UIResourceRegistry] Missing name');\n return false;\n }\n\n if (!resource.mimeType) {\n console.error('[UIResourceRegistry] Missing mimeType');\n return false;\n }\n\n // 验证 MIME 类型\n const validMimeTypes = Object.values(UIMimeType);\n if (!validMimeTypes.includes(resource.mimeType as UIMimeType)) {\n console.warn(`[UIResourceRegistry] Unknown mimeType: ${resource.mimeType}`);\n }\n\n return true;\n }\n\n /**\n * 触发事件\n */\n private emit(event: string, data: unknown): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n for (const callback of listeners) {\n try {\n callback(data);\n } catch (error) {\n console.error(`[UIResourceRegistry] Event listener error:`, error);\n }\n }\n }\n }\n\n /**\n * 监听事件\n */\n on(event: string, callback: Function): () => void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n\n this.eventListeners.get(event)!.add(callback);\n\n // 返回取消监听函数\n return () => {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.delete(callback);\n if (listeners.size === 0) {\n this.eventListeners.delete(event);\n }\n }\n };\n }\n\n /**\n * 清空所有资源\n */\n clear(): void {\n this.resources.clear();\n this.componentStates.clear();\n this.uriToComponentId.clear();\n this.emit('registry:cleared', null);\n }\n\n /**\n * 导出所有资源\n */\n export(): UIResourceRegistration[] {\n return Array.from(this.resources.values());\n }\n\n /**\n * 导入资源\n */\n import(resources: UIResourceRegistration[], overwrite = false): number {\n return this.registerBatch(resources, { overwrite });\n }\n}\n\n// 创建全局单例\nlet globalRegistry: UIResourceRegistry | null = null;\n\n/**\n * 获取全局 UI 资源注册表实例\n */\nexport function getUIResourceRegistry(): UIResourceRegistry {\n if (!globalRegistry) {\n globalRegistry = new UIResourceRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * 重置全局注册表 (主要用于测试)\n */\nexport function resetUIResourceRegistry(): void {\n if (globalRegistry) {\n globalRegistry.clear();\n }\n globalRegistry = null;\n}\n","\nimport { UIResourceRegistration } from '../../core/ui-resource';\n\nexport enum ComponentLifecycleState {\n UNINITIALIZED = 'uninitialized',\n INITIALIZING = 'initializing',\n READY = 'ready',\n ACTIVE = 'active',\n SUSPENDED = 'suspended',\n TEARDOWN = 'teardown',\n DESTROYED = 'destroyed',\n ERROR = 'error',\n}\n\nexport class ComponentLifecycleManager {\n private static instance: ComponentLifecycleManager;\n private instances: Map<string, any>;\n\n private constructor() {\n this.instances = new Map();\n }\n\n public static getInstance(): ComponentLifecycleManager {\n if (!ComponentLifecycleManager.instance) {\n ComponentLifecycleManager.instance = new ComponentLifecycleManager();\n }\n return ComponentLifecycleManager.instance;\n }\n\n async initialize(resource: UIResourceRegistration, initialData?: Record<string, unknown>): Promise<string> {\n console.log('[ComponentLifecycleManager] Initializing resource:', resource.uri, initialData);\n const componentId = 'component-' + Math.random().toString(36).substr(2, 9);\n this.instances.set(componentId, {\n resource,\n state: ComponentLifecycleState.INITIALIZING,\n data: initialData\n });\n return componentId;\n }\n\n async activate(componentId: string): Promise<void> {\n console.log('[ComponentLifecycleManager] Activating component:', componentId);\n const instance = this.instances.get(componentId);\n if (instance) {\n instance.state = ComponentLifecycleState.ACTIVE;\n }\n }\n\n sendToolInput(resourceUri: string, toolInput: any): void {\n console.log('[ComponentLifecycleManager] Sending tool input:', resourceUri, toolInput);\n }\n\n teardown(resourceUri: string): void {\n console.log('[ComponentLifecycleManager] Teardown resource:', resourceUri);\n // Find component by resourceUri and remove it\n for (const [id, instance] of this.instances.entries()) {\n if (instance.resource.uri === resourceUri) {\n this.instances.delete(id);\n break;\n }\n }\n }\n}\n\nexport const getComponentLifecycleManager = () => ComponentLifecycleManager.getInstance();\n","/**\n * 统一消息桥接协议类型定义\n *\n * 支持 AppthenBridge 和 MCP Apps (JSON-RPC 2.0) 两种消息格式\n */\n\n/**\n * 消息协议类型\n */\nexport enum BridgeProtocol {\n /** AppthenBridge 自定义协议 */\n OMNI_BRIDGE = 'appthen-bridge',\n /** MCP Apps JSON-RPC 2.0 */\n MCP_APPS = 'mcp-apps',\n /** 自动检测 */\n AUTO = 'auto',\n}\n\n/**\n * AppthenBridge 消息类型\n */\nexport enum AppthenMessageType {\n /** 方法调用 */\n CALL = 'call',\n /** 响应 */\n RESPONSE = 'response',\n /** 事件 */\n EMIT = 'emit',\n /** 日志 */\n LOG = 'log',\n /** 就绪 */\n READY = 'ready',\n /** 通知 */\n NOTIFICATION = 'notification',\n}\n\n/**\n * JSON-RPC 2.0 消息类型\n */\nexport enum JsonRpcMessageType {\n /** 请求 */\n REQUEST = 'request',\n /** 响应 */\n RESPONSE = 'response',\n /** 通知 */\n NOTIFICATION = 'notification',\n}\n\n/**\n * AppthenBridge 请求消息\n */\nexport interface AppthenBridgeRequest {\n type: AppthenMessageType.CALL;\n id: string;\n method: string;\n params?: Record<string, unknown>;\n}\n\n/**\n * AppthenBridge 响应消息\n */\nexport interface AppthenBridgeResponse {\n type: AppthenMessageType.RESPONSE;\n id: string;\n result?: unknown;\n error?: string | ErrorPayload;\n}\n\n/**\n * AppthenBridge 事件消息\n */\nexport interface AppthenBridgeEvent {\n type: AppthenMessageType.EMIT;\n event: string;\n payload: unknown;\n}\n\n/**\n * AppthenBridge 日志消息\n */\nexport interface AppthenBridgeLog {\n type: AppthenMessageType.LOG;\n level: 'log' | 'info' | 'warn' | 'error';\n payload: unknown[];\n}\n\n/**\n * AppthenBridge 就绪消息\n */\nexport interface AppthenBridgeReady {\n type: AppthenMessageType.READY;\n}\n\n/**\n * 错误负载\n */\nexport interface ErrorPayload {\n code: number;\n message: string;\n data?: unknown;\n}\n\n/**\n * JSON-RPC 2.0 请求\n */\nexport interface JsonRpcRequest {\n jsonrpc: '2.0';\n id: string | number;\n method: string;\n params?: Record<string, unknown> | unknown[];\n}\n\n/**\n * JSON-RPC 2.0 响应\n */\nexport interface JsonRpcResponse {\n jsonrpc: '2.0';\n id: string | number;\n result?: unknown;\n error?: JsonRpcError;\n}\n\n/**\n * JSON-RPC 2.0 错误\n */\nexport interface JsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n/**\n * JSON-RPC 2.0 通知\n */\nexport interface JsonRpcNotification {\n jsonrpc: '2.0';\n method: string;\n params?: Record<string, unknown> | unknown[];\n}\n\n/**\n * MCP Apps 工具调用通知 (ui/notifications/tool-input)\n */\nexport interface MCPAppsToolInput {\n jsonrpc: '2.0';\n method: 'ui/notifications/tool-input';\n params: {\n /** 工具名称 */\n name: string;\n /** 工具参数 */\n arguments?: Record<string, unknown>;\n /** UI 资源 URI */\n resourceUri?: string;\n };\n}\n\n/**\n * MCP Apps UI 初始化\n */\nexport interface MCPAppsInitialize {\n jsonrpc: '2.0';\n id: string;\n method: 'ui/initialize';\n params: {\n /** UI 资源 URI */\n resourceUri: string;\n /** 初始参数 */\n args?: Record<string, unknown>;\n };\n}\n\n/**\n * MCP Apps 资源清理\n */\nexport interface MCPAppsTeardown {\n jsonrpc: '2.0';\n id: string;\n method: 'ui/resource-teardown';\n params: {\n /** UI 资源 URI */\n resourceUri: string;\n };\n}\n\n/**\n * 统一消息类型 (所有可能的桥接消息)\n */\nexport type BridgeMessage =\n | AppthenBridgeRequest\n | AppthenBridgeResponse\n | AppthenBridgeEvent\n | AppthenBridgeLog\n | AppthenBridgeReady\n | JsonRpcRequest\n | JsonRpcResponse\n | JsonRpcNotification;\n\n/**\n * 方法处理器\n */\nexport type MethodHandler = (params: unknown) => Promise<unknown> | unknown;\n\n/**\n * 事件监听器\n */\nexport type EventListener = (payload: unknown) => void;\n\n/**\n * 消息处理器结果\n */\nexport interface MessageHandlerResult {\n /** 是否处理了消息 */\n handled: boolean;\n /** 响应数据 (如果需要响应) */\n response?: unknown;\n /** 错误 */\n error?: ErrorPayload | JsonRpcError;\n}\n\n/**\n * 消息处理器\n */\nexport type MessageHandler = (\n message: BridgeMessage,\n source: MessageSource,\n) => Promise<MessageHandlerResult> | MessageHandlerResult;\n\n/**\n * 消息来源\n */\nexport interface MessageSource {\n /** 来源窗口 */\n source: MessageEventSource | null;\n /** 来源 origin */\n origin: string;\n /** 是否是内部消息 */\n isInternal: boolean;\n}\n\n/**\n * 桥接配置\n */\nexport interface BridgeConfig {\n /** 支持的协议 */\n protocols: BridgeProtocol[];\n /** 默认超时时间 (ms) */\n timeout?: number;\n /** 是否启用调试 */\n debug?: boolean;\n /** 允许的 origins (用于安全) */\n allowedOrigins?: string[];\n /** 最大重试次数 */\n maxRetries?: number;\n}\n\n/**\n * RPC 调用选项\n */\nexport interface CallOptions {\n /** 超时时间 */\n timeout?: number;\n /** 重试次数 */\n retries?: number;\n /** 使用特定协议 */\n protocol?: BridgeProtocol;\n}\n\n/**\n * 桥接事件\n */\nexport enum BridgeEvent {\n /** 连接建立 */\n CONNECTED = 'bridge:connected',\n /** 连接断开 */\n DISCONNECTED = 'bridge:disconnected',\n /** 消息接收 */\n MESSAGE_RECEIVED = 'bridge:message:received',\n /** 消息发送 */\n MESSAGE_SENT = 'bridge:message:sent',\n /** 错误 */\n ERROR = 'bridge:error',\n /** 超时 */\n TIMEOUT = 'bridge:timeout',\n}\n","/**\n * 统一消息桥接协议\n *\n * 同时支持 AppthenBridge 和 MCP Apps (JSON-RPC 2.0) 消息格式。\n * 提供统一的消息路由、转发和错误处理机制。\n *\n * @see https://modelcontextprotocol.io/extensions/apps/overview\n * @see ./docs/OMNI_BRIDGE_PROTOCOL.md\n */\n\nimport type {\n BridgeMessage,\n BridgeConfig,\n MessageHandler,\n MessageSource,\n MethodHandler,\n EventListener,\n CallOptions,\n AppthenBridgeRequest,\n AppthenBridgeResponse,\n AppthenBridgeEvent,\n AppthenBridgeReady,\n AppthenBridgeLog,\n JsonRpcRequest,\n JsonRpcResponse,\n JsonRpcNotification,\n ErrorPayload,\n} from './types';\nimport {\n BridgeProtocol,\n AppthenMessageType,\n BridgeEvent,\n} from './types';\n\n/**\n * 统一消息桥接协议类\n */\nexport class UnifiedBridgeProtocol {\n /** 桥接配置 */\n private config: Required<BridgeConfig>;\n\n /** 待处理的请求 (id -> { resolve, reject, timestamp }) */\n private pendingRequests: Map<string, {\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n timestamp: number;\n }>;\n\n /** 方法处理器 (method -> handler) */\n private methodHandlers: Map<string, MethodHandler>;\n\n /** 事件监听器 (event -> Set<listener>) */\n private eventListeners: Map<string, Set<EventListener>>;\n\n /** 消息拦截器链 */\n private messageInterceptors: MessageHandler[];\n\n /** 桥接事件监听器 */\n private bridgeEventListeners: Map<BridgeEvent, Set<Function>>;\n\n /** 目标窗口 (iframe/parent) */\n private targetWindow: Window | null;\n\n /** 目标 origin */\n private targetOrigin: string;\n\n /** 是否已连接 */\n private isConnected: boolean;\n\n /** 请求 ID 计数器 */\n private requestIdCounter: number;\n\n /** 调试日志函数 */\n private debugLog: (...args: unknown[]) => void;\n\n constructor(config: Partial<BridgeConfig> = {}) {\n this.config = {\n protocols: config.protocols || [BridgeProtocol.OMNI_BRIDGE, BridgeProtocol.MCP_APPS],\n timeout: config.timeout || 30000,\n debug: config.debug || false,\n allowedOrigins: config.allowedOrigins || ['*'],\n maxRetries: config.maxRetries || 3,\n };\n\n this.pendingRequests = new Map();\n this.methodHandlers = new Map();\n this.eventListeners = new Map();\n this.messageInterceptors = [];\n this.bridgeEventListeners = new Map();\n this.targetWindow = null;\n this.targetOrigin = '*';\n this.isConnected = false;\n this.requestIdCounter = 0;\n\n this.debugLog = this.config.debug\n ? console.debug.bind(console, '[UnifiedBridge]')\n : () => {};\n\n this.setupMessageListener();\n }\n\n /**\n * 设置目标窗口\n * @param window 目标窗口\n * @param origin 目标 origin\n */\n setTarget(window: Window, origin: string = '*'): void {\n this.targetWindow = window;\n this.targetOrigin = origin;\n this.isConnected = true;\n this.emit(BridgeEvent.CONNECTED, { window, origin });\n }\n\n /**\n * 移除目标窗口\n */\n removeTarget(): void {\n this.targetWindow = null;\n this.isConnected = false;\n this.emit(BridgeEvent.DISCONNECTED, null);\n }\n\n /**\n * 注册方法处理器\n * @param method 方法名\n * @param handler 处理器函数\n */\n registerMethod(method: string, handler: MethodHandler): void {\n this.methodHandlers.set(method, handler);\n this.debugLog(`Method registered: ${method}`);\n }\n\n /**\n * 注销方法处理器\n * @param method 方法名\n */\n unregisterMethod(method: string): void {\n this.methodHandlers.delete(method);\n }\n\n /**\n * 注册事件监听器\n * @param event 事件名\n * @param listener 监听器函数\n */\n on(event: string, listener: EventListener): () => void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(listener);\n this.debugLog(`Event listener added: ${event}`);\n\n // 返回取消监听函数\n return () => this.off(event, listener);\n }\n\n /**\n * 注销事件监听器\n * @param event 事件名\n * @param listener 监听器函数\n */\n off(event: string, listener: EventListener): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.eventListeners.delete(event);\n }\n }\n }\n\n /**\n * 发送事件\n * @param event 事件名\n * @param payload 事件数据\n */\n emit(event: string, payload: unknown): void {\n const listeners = this.eventListeners.get(event);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(payload);\n } catch (error) {\n console.error(`[UnifiedBridge] Event listener error for ${event}:`, error);\n }\n }\n }\n }\n\n /**\n * 添加消息拦截器\n * @param interceptor 拦截器函数\n */\n addInterceptor(interceptor: MessageHandler): () => void {\n this.messageInterceptors.push(interceptor);\n return () => {\n const index = this.messageInterceptors.indexOf(interceptor);\n if (index >= 0) {\n this.messageInterceptors.splice(index, 1);\n }\n };\n }\n\n /**\n * 调用远程方法\n * @param method 方法名\n * @param params 参数\n * @param options 调用选项\n * @returns Promise<结果>\n */\n async call<T = unknown>(\n method: string,\n params: Record<string, unknown> = {},\n options: CallOptions = {},\n ): Promise<T> {\n if (!this.targetWindow || !this.isConnected) {\n throw new Error('Bridge not connected');\n }\n\n const protocol = options.protocol || this.detectProtocolForMethod(method);\n const id = this.generateRequestId();\n const timeout = options.timeout ?? this.config.timeout;\n const retries = options.retries ?? 0;\n\n return new Promise((resolve, reject) => {\n const executeWithRetry = (attempt: number) => {\n // 设置超时\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(new Error(`Call timeout: ${method} (${timeout}ms)`));\n this.emit(BridgeEvent.TIMEOUT, { method, id });\n }, timeout);\n\n // 保存请求\n this.pendingRequests.set(id, {\n resolve: (value: unknown) => {\n clearTimeout(timeoutId);\n resolve(value as T);\n },\n reject: (error: unknown) => {\n clearTimeout(timeoutId);\n reject(error);\n },\n timestamp: Date.now(),\n });\n\n // 发送消息\n try {\n if (protocol === BridgeProtocol.MCP_APPS) {\n this.sendJsonRpcRequest(id, method, params);\n } else {\n this.sendAppthenRequest(id, method, params);\n }\n this.emit(BridgeEvent.MESSAGE_SENT, { method, id, protocol });\n } catch (error) {\n clearTimeout(timeoutId);\n this.pendingRequests.delete(id);\n\n // 重试逻辑\n if (attempt < retries) {\n this.debugLog(`Retrying call: ${method} (attempt ${attempt + 1}/${retries})`);\n setTimeout(() => executeWithRetry(attempt + 1), 1000 * (attempt + 1));\n } else {\n reject(error);\n }\n }\n };\n\n executeWithRetry(0);\n });\n }\n\n /**\n * 发送通知 (不需要响应)\n * @param method 方法名\n * @param params 参数\n */\n notify(method: string, params: Record<string, unknown> = {}): void {\n if (!this.targetWindow || !this.isConnected) {\n throw new Error('Bridge not connected');\n }\n\n const protocol = this.detectProtocolForMethod(method);\n\n if (protocol === BridgeProtocol.MCP_APPS) {\n this.sendJsonRpcNotification(method, params);\n } else {\n this.sendAppthenEvent(method, params);\n }\n\n this.debugLog(`Notification sent: ${method}`);\n }\n\n /**\n * 监听桥接事件\n * @param event 桥接事件\n * @param callback 回调函数\n */\n onBridgeEvent(event: BridgeEvent, callback: Function): () => void {\n if (!this.bridgeEventListeners.has(event)) {\n this.bridgeEventListeners.set(event, new Set());\n }\n this.bridgeEventListeners.get(event)!.add(callback);\n return () => this.offBridgeEvent(event, callback);\n }\n\n /**\n * 注销桥接事件监听器\n * @param event 桥接事件\n * @param callback 回调函数\n */\n offBridgeEvent(event: BridgeEvent, callback: Function): void {\n const listeners = this.bridgeEventListeners.get(event);\n if (listeners) {\n listeners.delete(callback);\n if (listeners.size === 0) {\n this.bridgeEventListeners.delete(event);\n }\n }\n }\n\n /**\n * 清理资源\n */\n destroy(): void {\n this.removeTarget();\n this.pendingRequests.clear();\n this.methodHandlers.clear();\n this.eventListeners.clear();\n this.messageInterceptors = [];\n this.bridgeEventListeners.clear();\n\n // 移除消息监听器\n window.removeEventListener('message', this.handleMessage);\n }\n\n /**\n * 设置消息监听器\n */\n private setupMessageListener(): void {\n window.addEventListener('message', this.handleMessage.bind(this));\n }\n\n /**\n * 处理接收到的消息\n */\n private async handleMessage(event: MessageEvent): Promise<void> {\n const message = event.data as BridgeMessage;\n if (!message) return;\n\n // 安全检查\n if (!this.isOriginAllowed(event.origin)) {\n this.debugLog('Message from unallowed origin:', event.origin);\n return;\n }\n\n const source: MessageSource = {\n source: event.source,\n origin: event.origin,\n isInternal: event.source === window,\n };\n\n this.emit(BridgeEvent.MESSAGE_RECEIVED, { message, source });\n\n // 通过拦截器链处理消息\n let result = { handled: false };\n for (const interceptor of this.messageInterceptors) {\n try {\n result = await interceptor(message, source);\n if (result.handled) break;\n } catch (error) {\n console.error('[UnifiedBridge] Interceptor error:', error);\n }\n }\n\n // 如果未被拦截器处理,进行默认处理\n if (!result.handled) {\n await this.defaultHandleMessage(message, source);\n }\n }\n\n /**\n * 默认消息处理\n */\n private async defaultHandleMessage(\n message: BridgeMessage,\n source: MessageSource,\n ): Promise<void> {\n // AppthenBridge 响应\n if (this.isAppthenResponse(message)) {\n this.handleAppthenResponse(message);\n return;\n }\n\n // JSON-RPC 响应\n if (this.isJsonRpcResponse(message)) {\n this.handleJsonRpcResponse(message);\n return;\n }\n\n // AppthenBridge 请求\n if (this.isAppthenRequest(message)) {\n await this.handleMethodCall(message.id, message.method, message.params, source);\n return;\n }\n\n // JSON-RPC 请求\n if (this.isJsonRpcRequest(message)) {\n await this.handleMethodCall(message.id, message.method, message.params, source);\n return;\n }\n\n // AppthenBridge 事件\n if (this.isAppthenEvent(message)) {\n this.emit(message.event, message.payload);\n return;\n }\n\n // JSON-RPC 通知 / MCP Apps 通知\n if (this.isJsonRpcNotification(message)) {\n // MCP Apps 特定通知处理\n if (message.method === 'ui/notifications/tool-input') {\n await this.handleMCPAppsToolInput(message.params);\n } else {\n // 将 JSON-RPC 通知转换为普通事件\n this.emit(message.method, message.params);\n }\n return;\n }\n\n // AppthenBridge 日志\n if (this.isAppthenLog(message)) {\n const { level, payload } = message;\n console[level](...payload);\n return;\n }\n\n // AppthenBridge 就绪\n if (this.isAppthenReady(message)) {\n this.isConnected = true;\n this.emit(BridgeEvent.CONNECTED, source);\n return;\n }\n\n this.debugLog('Unhandled message:', message);\n }\n\n /**\n * 处理方法调用\n */\n private async handleMethodCall(\n id: string | number,\n method: string,\n params: unknown,\n _source: MessageSource,\n ): Promise<void> {\n const handler = this.methodHandlers.get(method);\n\n if (!handler) {\n this.sendError(id, -32601, `Method not found: ${method}`);\n return;\n }\n\n try {\n const result = await handler(params);\n this.sendSuccess(id, result);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.sendError(id, -32603, `Internal error: ${errorMessage}`);\n }\n }\n\n /**\n * 处理 MCP Apps 工具输入通知\n */\n private async handleMCPAppsToolInput(params: unknown): Promise<void> {\n const input = params as { name: string; arguments?: Record<string, unknown> };\n if (input.name) {\n // 将工具输入转换为方法调用\n await this.handleMethodCall('', `tools/${input.name}`, input.arguments, {\n source: null,\n origin: '',\n isInternal: true,\n });\n }\n }\n\n /**\n * 处理 AppthenBridge 响应\n */\n private handleAppthenResponse(message: AppthenBridgeResponse): void {\n const pending = this.pendingRequests.get(message.id);\n if (pending) {\n this.pendingRequests.delete(message.id);\n if (message.error) {\n pending.reject(message.error);\n } else {\n pending.resolve(message.result);\n }\n }\n }\n\n /**\n * 处理 JSON-RPC 响应\n */\n private handleJsonRpcResponse(message: JsonRpcResponse): void {\n const id = String(message.id);\n const pending = this.pendingRequests.get(id);\n if (pending) {\n this.pendingRequests.delete(id);\n if (message.error) {\n pending.reject(message.error);\n } else {\n pending.resolve(message.result);\n }\n }\n }\n\n /**\n * 发送 AppthenBridge 请求\n */\n private sendAppthenRequest(id: string, method: string, params: Record<string, unknown>): void {\n const message: AppthenBridgeRequest = {\n type: AppthenMessageType.CALL,\n id,\n method,\n params,\n };\n this.postMessage(message);\n }\n\n /**\n * 发送 JSON-RPC 请求\n */\n private sendJsonRpcRequest(id: string, method: string, params: Record<string, unknown>): void {\n const message: JsonRpcRequest = {\n jsonrpc: '2.0',\n id,\n method,\n params,\n };\n this.postMessage(message);\n }\n\n /**\n * 发送 AppthenBridge 事件\n */\n private sendAppthenEvent(event: string, payload: unknown): void {\n const message: { type: AppthenMessageType.EMIT; event: string; payload: unknown } = {\n type: AppthenMessageType.EMIT,\n event,\n payload,\n };\n this.postMessage(message);\n }\n\n /**\n * 发送 JSON-RPC 通知\n */\n private sendJsonRpcNotification(method: string, params: Record<string, unknown>): void {\n const message: JsonRpcNotification = {\n jsonrpc: '2.0',\n method,\n params,\n };\n this.postMessage(message);\n }\n\n /**\n * 发送成功响应\n */\n private sendSuccess(id: string | number, result: unknown): void {\n // 检测使用哪种协议发送响应\n const pending = this.pendingRequests.get(String(id));\n const protocol = pending ? this.detectProtocolForRequest(id) : BridgeProtocol.OMNI_BRIDGE;\n\n if (protocol === BridgeProtocol.MCP_APPS) {\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id,\n result,\n };\n this.postMessage(response);\n } else {\n const response: AppthenBridgeResponse = {\n type: AppthenMessageType.RESPONSE,\n id: String(id),\n result: result as never,\n };\n this.postMessage(response);\n }\n }\n\n /**\n * 发送错误响应\n */\n private sendError(id: string | number, code: number, message: string): void {\n const error: ErrorPayload = { code, message };\n\n // 检测使用哪种协议发送响应\n const pending = this.pendingRequests.get(String(id));\n const protocol = pending ? this.detectProtocolForRequest(id) : BridgeProtocol.OMNI_BRIDGE;\n\n if (protocol === BridgeProtocol.MCP_APPS) {\n const response: JsonRpcResponse = {\n jsonrpc: '2.0',\n id,\n error,\n };\n this.postMessage(response);\n } else {\n const response: AppthenBridgeResponse = {\n type: AppthenMessageType.RESPONSE,\n id: String(id),\n error,\n };\n this.postMessage(response);\n }\n }\n\n /**\n * 通过 postMessage 发送消息\n */\n private postMessage(message: BridgeMessage): void {\n if (!this.targetWindow) {\n throw new Error('Target window not set');\n }\n this.targetWindow.postMessage(message, this.targetOrigin);\n }\n\n /**\n * 生成请求 ID\n */\n private generateRequestId(): string {\n return `${Date.now()}-${++this.requestIdCounter}`;\n }\n\n /**\n * 检测方法应使用的协议\n */\n private detectProtocolForMethod(method: string): BridgeProtocol {\n // MCP Apps 特定方法\n if (method.startsWith('ui/') || method.startsWith('tools/')) {\n return BridgeProtocol.MCP_APPS;\n }\n // 默认使用 AppthenBridge\n return BridgeProtocol.OMNI_BRIDGE;\n }\n\n /**\n * 检测请求使用的协议\n */\n private detectProtocolForRequest(_id: string | number): BridgeProtocol {\n // 这里可以根据请求 ID 前缀等判断\n // 简化实现:默认返回 AppthenBridge\n return BridgeProtocol.OMNI_BRIDGE;\n }\n\n /**\n * 检查 origin 是否被允许\n */\n private isOriginAllowed(origin: string): boolean {\n return this.config.allowedOrigins.includes('*') ||\n this.config.allowedOrigins.includes(origin);\n }\n\n /**\n * 类型守卫:AppthenBridge 响应\n */\n private isAppthenResponse(message: BridgeMessage): message is AppthenBridgeResponse {\n return 'type' in message && message.type === AppthenMessageType.RESPONSE;\n }\n\n /**\n * 类型守卫:JSON-RPC 响应\n */\n private isJsonRpcResponse(message: BridgeMessage): message is JsonRpcResponse {\n return 'jsonrpc' in message && message.jsonrpc === '2.0' && 'id' in message;\n }\n\n /**\n * 类型守卫:AppthenBridge 请求\n */\n private isAppthenRequest(message: BridgeMessage): message is AppthenBridgeRequest {\n return 'type' in message && message.type === AppthenMessageType.CALL;\n }\n\n /**\n * 类型守卫:JSON-RPC 请求\n */\n private isJsonRpcRequest(message: BridgeMessage): message is JsonRpcRequest {\n return 'jsonrpc' in message && message.jsonrpc === '2.0' && 'method' in message && 'id' in message;\n }\n\n /**\n * 类型守卫:AppthenBridge 事件\n */\n private isAppthenEvent(message: BridgeMessage): message is AppthenBridgeEvent {\n return 'type' in message &&\n message.type === AppthenMessageType.EMIT &&\n 'event' in message &&\n 'payload' in message;\n }\n\n /**\n * 类型守卫:JSON-RPC 通知\n */\n private isJsonRpcNotification(message: BridgeMessage): message is JsonRpcNotification {\n return 'jsonrpc' in message && message.jsonrpc === '2.0' && 'method' in message && !('id' in message);\n }\n\n /**\n * 类型守卫:AppthenBridge 日志\n */\n private isAppthenLog(message: BridgeMessage): message is AppthenBridgeLog {\n return 'type' in message &&\n message.type === AppthenMessageType.LOG &&\n 'level' in message &&\n 'payload' in message;\n }\n\n /**\n * 类型守卫:AppthenBridge 就绪\n */\n private isAppthenReady(message: BridgeMessage): message is AppthenBridgeReady {\n return 'type' in message && message.type === AppthenMessageType.READY;\n }\n}\n\n// 导出单例工厂函数\nlet globalBridge: UnifiedBridgeProtocol | null = null;\n\n/**\n * 获取全局桥接实例\n */\nexport function getUnifiedBridge(config?: Partial<BridgeConfig>): UnifiedBridgeProtocol {\n if (!globalBridge) {\n globalBridge = new UnifiedBridgeProtocol(config);\n }\n return globalBridge;\n}\n\n/**\n * 重置全局桥接\n */\nexport function resetUnifiedBridge(): void {\n if (globalBridge) {\n globalBridge.destroy();\n }\n globalBridge = null;\n}\n","/**\n * 前端 MCP Server\n *\n * 提供应用级的控制工具,让 Agent 可以:\n * - 获取当前打开的应用\n * - 获取应用内组件状态\n * - 更新组件状态\n * - 打开应用\n * - 列出应用内组件\n *\n * 这是一个符合 MCP 标准的服务端实现,运行在浏览器中。\n *\n * @see https://modelcontextprotocol.io/docs\n * @see https://modelcontextprotocol.io/extensions/apps/overview\n */\n\nimport { getUIResourceRegistry } from '../ui-resource';\nimport { getComponentLifecycleManager } from '../../components/mcp-apps/ComponentLifecycleManager';\nimport { getUnifiedBridge } from '../bridge';\n\n/**\n * 应用信息\n */\ninterface ApplicationInfo {\n /** 应用 URI */\n uri: string;\n /** 应用名称 */\n name: string;\n /** 打开时间 */\n openedAt: number;\n /** 最后活动时间 */\n lastActiveAt: number;\n /** 应用状态 */\n state: Record<string, unknown>;\n}\n\n/**\n * 组件状态信息\n */\ninterface ComponentStateInfo {\n /** 组件 ID */\n componentId: string;\n /** 组件名称 */\n name: string;\n /** 状态数据 */\n state: Record<string, unknown>;\n /** 状态版本 */\n version: number;\n /** 最后更新时间 */\n lastUpdated: number;\n}\n\n/**\n * 状态监听器类型\n */\ntype StateListener = (state: Record<string, unknown>) => void;\n\n/**\n * 前端 MCP Server 类\n */\nexport class FrontendMCPServer {\n private uiRegistry = getUIResourceRegistry();\n private lifecycleManager = getComponentLifecycleManager();\n private bridge = getUnifiedBridge({ debug: false });\n\n /** 当前打开的应用 */\n private currentApp: ApplicationInfo | null = null;\n\n /** 组件状态存储 */\n private componentStates: Map<string, ComponentStateInfo>;\n\n /** 应用状态监听器 */\n private stateListeners: Map<string, Set<StateListener>>;\n\n constructor() {\n this.componentStates = new Map();\n this.stateListeners = new Map();\n this.setupToolHandlers();\n }\n\n /**\n * 注册外部工具处理器\n *\n * 允许外部插件注册自定义工具到前端 MCP Server\n */\n registerMethod(\n name: string,\n handler: (params: any) => any | Promise<any>,\n ): void {\n this.bridge.registerMethod(name, handler);\n console.log(`[FrontendMCPServer] Registered method: ${name}`);\n }\n\n unregisterMethod(name: string): void {\n this.bridge.unregisterMethod(name);\n console.log(`[FrontendMCPServer] Unregistered method: ${name}`);\n }\n\n /**\n * 设置工具处理器\n */\n private setupToolHandlers(): void {\n // frontend.get_current_application - 获取当前应用\n this.bridge.registerMethod('frontend.get_current_application', async () => {\n return this.getCurrentApplication();\n });\n\n // frontend.get_component_state - 获取组件状态\n this.bridge.registerMethod('frontend.get_component_state', async (params) => {\n const { componentId } = params as { componentId: string };\n return this.getComponentState(componentId);\n });\n\n // frontend.update_component - 更新组件状态\n this.bridge.registerMethod('frontend.update_component', async (params) => {\n const { componentId, updates } = params as {\n componentId: string;\n updates: Record<string, unknown>;\n };\n return this.updateComponent(componentId, updates);\n });\n\n // frontend.open_application - 打开应用\n this.bridge.registerMethod('frontend.open_application', async (params) => {\n const { appUri, args } = params as {\n appUri: string;\n args?: Record<string, unknown>;\n };\n return this.openApplication(appUri, args);\n });\n\n // frontend.list_components - 列出应用内组件\n this.bridge.registerMethod('frontend.list_components', async () => {\n return this.listComponents();\n });\n\n // frontend.subscribe_state - 订阅状态变更\n this.bridge.registerMethod('frontend.subscribe_state', async (params) => {\n const { componentId } = params as { componentId: string };\n return this.subscribeState(componentId);\n });\n\n // frontend.close_application - 关闭应用\n this.bridge.registerMethod('frontend.close_application', async () => {\n return this.closeApplication();\n });\n }\n\n /**\n * 获取当前应用信息\n */\n getCurrentApplication(): ApplicationInfo | null {\n if (!this.currentApp) {\n return null;\n }\n\n return {\n ...this.currentApp,\n state: this.currentApp.state,\n };\n }\n\n /**\n * 获取组件状态\n */\n getComponentState(componentId: string): ComponentStateInfo | null {\n const stateInfo = this.componentStates.get(componentId);\n if (!stateInfo) {\n return null;\n }\n\n return {\n ...stateInfo,\n state: { ...stateInfo.state },\n };\n }\n\n /**\n * 更新组件状态\n */\n async updateComponent(\n componentId: string,\n updates: Record<string, unknown>,\n ): Promise<{ success: boolean; newState?: Record<string, unknown> }> {\n const stateInfo = this.componentStates.get(componentId);\n if (!stateInfo) {\n return { success: false };\n }\n\n // 合并更新\n const newState = { ...stateInfo.state, ...updates };\n stateInfo.state = newState;\n stateInfo.version++;\n stateInfo.lastUpdated = Date.now();\n\n // 通知监听器\n const listeners = this.stateListeners.get(componentId);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(newState);\n } catch (error) {\n console.error('[FrontendMCPServer] State listener error:', error);\n }\n }\n }\n\n // 同步到 UI 资源注册表\n this.uiRegistry.updateComponentState(componentId, newState);\n\n // 发送状态变更事件\n window.dispatchEvent(new CustomEvent('mcp:stateChanged', {\n detail: { componentId, newState, version: stateInfo.version },\n }));\n\n return { success: true, newState };\n }\n\n /**\n * 打开应用\n */\n async openApplication(\n appUri: string,\n args: Record<string, unknown> = {},\n ): Promise<{ success: boolean; appId?: string }> {\n // 查找应用资源\n const resource = this.uiRegistry.get(appUri);\n if (!resource) {\n console.warn('[FrontendMCPServer] Application not found:', appUri);\n return { success: false };\n }\n\n // 初始化组件\n const componentId = await this.lifecycleManager.initialize(resource, args);\n\n // 设置为当前应用\n this.currentApp = {\n uri: appUri,\n name: resource.name,\n openedAt: Date.now(),\n lastActiveAt: Date.now(),\n state: { ...args },\n };\n\n // 初始化组件状态\n this.componentStates.set(componentId, {\n componentId,\n name: resource.name,\n state: { ...args },\n version: 0,\n lastUpdated: Date.now(),\n });\n\n // 发送应用打开事件\n window.dispatchEvent(new CustomEvent('mcp:appOpened', {\n detail: { appUri, componentId, args },\n }));\n\n console.log('[FrontendMCPServer] Application opened:', appUri);\n\n return { success: true, appId: componentId };\n }\n\n /**\n * 关闭当前应用\n */\n async closeApplication(): Promise<{ success: boolean }> {\n if (!this.currentApp) {\n return { success: false };\n }\n\n // 查找并清理组件\n for (const [componentId, stateInfo] of this.componentStates) {\n if (stateInfo.name === this.currentApp.name) {\n this.lifecycleManager.teardown(this.currentApp.uri);\n this.componentStates.delete(componentId);\n }\n }\n\n // 清理状态监听器\n this.stateListeners.clear();\n\n this.currentApp = null;\n\n // 发送应用关闭事件\n window.dispatchEvent(new CustomEvent('mcp:appClosed'));\n\n console.log('[FrontendMCPServer] Application closed');\n\n return { success: true };\n }\n\n /**\n * 列出应用内组件\n */\n listComponents(): ComponentStateInfo[] {\n const components: ComponentStateInfo[] = [];\n\n for (const [_componentId, stateInfo] of this.componentStates) {\n components.push({\n ...stateInfo,\n state: { ...stateInfo.state },\n });\n }\n\n return components;\n }\n\n /**\n * 订阅状态变更\n */\n subscribeState(\n componentId: string,\n ): { success: boolean; unsubscribe?: () => void } {\n if (!this.componentStates.has(componentId)) {\n return { success: false };\n }\n\n // 返回订阅函数(通过事件机制)\n // 实际订阅通过 CustomEvent 实现\n return { success: true };\n }\n\n /**\n * 注册组件\n */\n registerComponent(\n componentId: string,\n name: string,\n initialState: Record<string, unknown> = {},\n ): void {\n this.componentStates.set(componentId, {\n componentId,\n name,\n state: { ...initialState },\n version: 0,\n lastUpdated: Date.now(),\n });\n\n console.log('[FrontendMCPServer] Component registered:', componentId, name);\n }\n\n /**\n * 注销组件\n */\n unregisterComponent(componentId: string): void {\n this.componentStates.delete(componentId);\n this.stateListeners.delete(componentId);\n }\n\n /**\n * 批量更新状态\n */\n async batchUpdate(\n updates: Array<{ componentId: string; state: Record<string, unknown> }>,\n ): Promise<{ success: boolean; failed: string[] }> {\n const failed: string[] = [];\n\n for (const { componentId, state } of updates) {\n const result = await this.updateComponent(componentId, state);\n if (!result.success) {\n failed.push(componentId);\n }\n }\n\n return {\n success: failed.length === 0,\n failed,\n };\n }\n\n /**\n * 获取所有状态\n */\n getAllStates(): Record<string, ComponentStateInfo> {\n const states: Record<string, ComponentStateInfo> = {};\n\n for (const [componentId, stateInfo] of this.componentStates) {\n states[componentId] = {\n ...stateInfo,\n state: { ...stateInfo.state },\n };\n }\n\n return states;\n }\n\n /**\n * 导出状态快照\n */\n exportStateSnapshot(): {\n timestamp: number;\n app: ApplicationInfo | null;\n components: Record<string, ComponentStateInfo>;\n } {\n return {\n timestamp: Date.now(),\n app: this.getCurrentApplication(),\n components: this.getAllStates(),\n };\n }\n\n /**\n * 导入状态快照\n */\n async importStateSnapshot(\n snapshot: ReturnType<typeof this.exportStateSnapshot>,\n ): Promise<{ success: boolean }> {\n try {\n // 恢复应用\n if (snapshot.app) {\n await this.openApplication(snapshot.app.uri, snapshot.app.state);\n }\n\n // 恢复组件状态\n for (const [componentId, stateInfo] of Object.entries(snapshot.components)) {\n this.componentStates.set(componentId, {\n ...stateInfo,\n state: { ...stateInfo.state },\n });\n }\n\n console.log('[FrontendMCPServer] State snapshot imported');\n return { success: true };\n } catch (error) {\n console.error('[FrontendMCPServer] Failed to import snapshot:', error);\n return { success: false };\n }\n }\n\n /**\n * 清理资源\n */\n destroy(): void {\n this.closeApplication();\n this.componentStates.clear();\n this.stateListeners.clear();\n }\n}\n\n// 全局单例\nlet globalFrontendMCPServer: FrontendMCPServer | null = null;\n\n/**\n * 获取全局前端 MCP Server\n */\nexport function getFrontendMCPServer(): FrontendMCPServer {\n if (!globalFrontendMCPServer) {\n globalFrontendMCPServer = new FrontendMCPServer();\n }\n return globalFrontendMCPServer;\n}\n\n/**\n * 重置全局前端 MCP Server\n */\nexport function resetFrontendMCPServer(): void {\n if (globalFrontendMCPServer) {\n globalFrontendMCPServer.destroy();\n }\n globalFrontendMCPServer = null;\n}\n\n/**\n * 使用前端 MCP Server 的 Hook\n */\nexport function useFrontendMCPServer(): FrontendMCPServer {\n return getFrontendMCPServer();\n}\n","interface StoredUserProfile {\n id?: string | number;\n name?: string;\n avatar?: string;\n}\n\ninterface StoredUserRole {\n id: string;\n tenant_id?: string;\n team_id: string;\n type: string;\n subject_id?: string;\n}\n\nexport interface RuntimeActorContext {\n tenantId?: string;\n workbenchId?: string;\n authType?: 'user' | 'tenant_app';\n actingMode?: 'self' | 'subject';\n user?: {\n id?: string;\n legacyUserId?: number;\n name?: string;\n avatar?: string;\n };\n subject?: {\n id?: string;\n classId?: string;\n displayName?: string;\n avatar?: string;\n classLabel?: string;\n kind?: string;\n };\n membership?: {\n id?: string;\n role?: string;\n nodeId?: string;\n relation?: string;\n relations?: string[];\n organizationNodeIds?: string[];\n legacyRoleId?: number;\n };\n legacy?: {\n teamId?: number;\n userId?: number;\n roleId?: number;\n };\n actor?: unknown;\n token?: string;\n}\n\nexport interface RuntimeActorInput {\n tenantId?: string;\n workbenchId?: string;\n subjectId?: string;\n subjectClassId?: string;\n membershipId?: string;\n role?: string;\n}\n\ntype RuntimeActorListener = (actor: RuntimeActorContext | null) => void;\n\nlet currentActor: RuntimeActorContext | null = null;\nconst listeners = new Set<RuntimeActorListener>();\n\nconst DEFAULT_API_BASE_URL = 'http://127.0.0.1:1626';\n\nconst getViteApiBaseUrl = () => {\n try {\n const meta = new Function('return import.meta')() as {\n env?: { VITE_API_BASE_URL?: string; MODE?: string };\n };\n return meta.env?.VITE_API_BASE_URL ??\n (meta.env?.MODE === 'nest-public' || meta.env?.MODE === 'desktop'\n ? ''\n : DEFAULT_API_BASE_URL);\n } catch {\n return DEFAULT_API_BASE_URL;\n }\n};\n\nconst getCurrentUserFromStorage = () => {\n if (typeof window === 'undefined') return null;\n try {\n const profile = readJson<StoredUserProfile>('user_profile');\n const role = readJson<StoredUserRole>('app-user-role');\n if (!profile && !role) return null;\n return {\n id: profile?.id ? String(profile.id) : role?.id,\n tenantId: role?.tenant_id || role?.team_id,\n type: role?.type,\n name: profile?.name,\n avatar: profile?.avatar,\n };\n } catch {\n return null;\n }\n};\n\nexport const getRuntimeApiBaseUrl = () => {\n if (typeof window === 'undefined') return DEFAULT_API_BASE_URL;\n const envBase = (window as any).__APPTHEN_API_BASE_URL__;\n return envBase ?? getViteApiBaseUrl();\n};\n\nexport const getRuntimeAuthHeaders = () => {\n const token = currentActor?.token || (typeof window !== 'undefined'\n ? window.localStorage.getItem('access_token')\n : null);\n let clientHeader = 'worktop';\n const role = readJson<StoredUserRole>('app-user-role');\n if (role?.type && role.id && role.team_id) {\n clientHeader = `worktop-${role.type}-${role.id}-${role.team_id}`;\n }\n return {\n Accept: 'application/json, text/plain, */*',\n Authorization: token ? `Bearer ${token}` : '',\n Client: clientHeader,\n 'Content-Type': 'application/json',\n };\n};\n\nasync function requestRuntimeActor<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const response = await fetch(`${getRuntimeApiBaseUrl()}${endpoint}`, {\n ...options,\n headers: {\n ...getRuntimeAuthHeaders(),\n ...options.headers,\n },\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n}\n\nconst readJson = <T>(key: string): T | null => {\n if (typeof window === 'undefined') return null;\n try {\n const value = window.localStorage.getItem(key);\n return value ? (JSON.parse(value) as T) : null;\n } catch (error) {\n console.warn(`[runtimeActor] failed to parse ${key}`, error);\n return null;\n }\n};\n\nconst toNumber = (value: unknown): number | undefined => {\n if (value === undefined || value === null || value === '') return undefined;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n};\n\nexport function resolveRuntimeActor(input: RuntimeActorInput = {}): RuntimeActorContext | null {\n if (typeof window === 'undefined') return null;\n\n const profile = readJson<StoredUserProfile>('user_profile');\n const role = readJson<StoredUserRole>('app-user-role');\n const token = window.localStorage.getItem('access_token') || undefined;\n const currentUser = getCurrentUserFromStorage();\n const legacyTeamId = toNumber(role?.team_id);\n const legacyRoleId = toNumber(role?.id);\n const legacyUserId = toNumber(profile?.id || currentUser?.id);\n const tenantId = input.tenantId || role?.tenant_id || role?.team_id || currentUser?.tenantId;\n\n if (!token && !profile && !role && !tenantId && !input.workbenchId) {\n return null;\n }\n\n return {\n tenantId,\n workbenchId: input.workbenchId,\n user: {\n id: currentUser?.id || (profile?.id !== undefined ? String(profile.id) : undefined),\n legacyUserId,\n name: profile?.name || currentUser?.name,\n avatar: profile?.avatar || currentUser?.avatar,\n },\n subject: input.subjectId || role?.subject_id\n ? {\n id: input.subjectId || role?.subject_id,\n classId: input.subjectClassId,\n displayName: profile?.name || currentUser?.name,\n }\n : undefined,\n membership: {\n id: input.membershipId,\n role: input.role || currentUser?.type || role?.type,\n legacyRoleId,\n },\n legacy: {\n teamId: legacyTeamId,\n userId: legacyUserId,\n roleId: legacyRoleId,\n },\n token,\n };\n}\n\nexport function setRuntimeActor(actor: RuntimeActorContext | null) {\n currentActor = actor;\n listeners.forEach((listener) => listener(currentActor));\n}\n\nexport function refreshRuntimeActor(input: RuntimeActorInput = {}) {\n const actor = resolveRuntimeActor(input);\n setRuntimeActor(actor);\n return actor;\n}\n\nconst appendQuery = (params: URLSearchParams, key: string, value?: string) => {\n if (value) params.set(key, value);\n};\n\nexport async function refreshRuntimeActorFromServer(input: RuntimeActorInput = {}) {\n const fallbackActor = refreshRuntimeActor(input);\n const token = getRuntimeAccessToken();\n\n if (!token) {\n return fallbackActor;\n }\n\n const params = new URLSearchParams();\n appendQuery(params, 'tenantId', input.tenantId);\n appendQuery(params, 'workbenchId', input.workbenchId);\n appendQuery(params, 'subjectId', input.subjectId);\n appendQuery(params, 'subjectClassId', input.subjectClassId);\n appendQuery(params, 'membershipId', input.membershipId);\n appendQuery(params, 'role', input.role);\n\n try {\n const endpoint = `/actor-context/current${params.toString() ? `?${params.toString()}` : ''}`;\n const serverActor = await requestRuntimeActor<RuntimeActorContext>(endpoint, {\n method: 'GET',\n });\n\n const nextActor: RuntimeActorContext = {\n ...(fallbackActor || {}),\n ...serverActor,\n user: {\n ...(fallbackActor?.user || {}),\n ...(serverActor.user || {}),\n },\n subject: serverActor.subject || fallbackActor?.subject,\n membership: {\n ...(fallbackActor?.membership || {}),\n ...(serverActor.membership || {}),\n },\n legacy: {\n ...(fallbackActor?.legacy || {}),\n ...(serverActor.legacy || {}),\n },\n token,\n };\n\n setRuntimeActor(nextActor);\n return nextActor;\n } catch (error) {\n console.warn('[runtimeActor] failed to refresh actor from server, using local fallback', error);\n return fallbackActor;\n }\n}\n\nexport function getRuntimeActor() {\n return currentActor;\n}\n\nexport function getRuntimeTenantId() {\n return currentActor?.tenantId || null;\n}\n\nexport function getRuntimeUserId() {\n const value = currentActor?.user?.id ||\n currentActor?.subject?.id ||\n currentActor?.legacy?.userId;\n return value === undefined || value === null ? null : String(value);\n}\n\n/**\n * 返回当前登录用户在 subject_directory 中的“真实主体 id”(如 subject_2055147511)。\n * 优先取 actor.subject.id(由 /actor-context/current 下发),缺失时回退到非纯数字的 user.id。\n * 绝不会返回纯数字 legacy 用户主键(如 \"100698\")—— 那种 id 在 subject_directory 中\n * 没有真实主体,曾被误当作 subjectId 写入会话参与者表。\n * 会话创建/打开/单聊/频道等 conversation-runtime 操作应使用本函数而非 getRuntimeUserId()。\n */\nexport function getRuntimeSubjectId() {\n const subjectId = currentActor?.subject?.id;\n if (subjectId) return String(subjectId);\n const userId = currentActor?.user?.id;\n if (userId && !/^\\d+$/.test(String(userId))) return String(userId);\n return null;\n}\n\nexport function getRuntimeUserName() {\n return currentActor?.user?.name ||\n currentActor?.subject?.displayName ||\n (getRuntimeUserId() ? `User ${getRuntimeUserId()}` : null);\n}\n\nexport function subscribeRuntimeActor(listener: RuntimeActorListener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function getRuntimeAccessToken() {\n return currentActor?.token || (typeof window !== 'undefined' ? window.localStorage.getItem('access_token') : null);\n}\n","/**\n * Browser-side executable tools exposed to Agent / MCP runtimes.\n */\n\nexport interface ClientToolContext {\n setPreviewUrl: (url: string | null) => void;\n navigate: (path: string) => void;\n toast: (message: string) => void;\n fileSystem?: any;\n globalEventBus?: any;\n}\n\nexport type ClientToolHandler = (\n input: any,\n context: ClientToolContext,\n) => Promise<any> | any | void;\n\nexport interface ClientToolDefinition {\n name: string;\n description?: string;\n parameters?: any;\n handler: ClientToolHandler;\n}\n\nexport class ClientToolRegistry {\n private tools: Map<string, ClientToolHandler> = new Map();\n private definitions: Map<string, ClientToolDefinition> = new Map();\n\n register(nameOrDef: string | ClientToolDefinition, handler?: ClientToolHandler) {\n if (typeof nameOrDef === 'string') {\n if (!handler) throw new Error('Handler is required when registering by name');\n this.tools.set(nameOrDef, handler);\n this.definitions.set(nameOrDef, {\n name: nameOrDef,\n description: 'Client tool',\n handler,\n });\n } else {\n this.tools.set(nameOrDef.name, nameOrDef.handler);\n this.definitions.set(nameOrDef.name, nameOrDef);\n }\n }\n\n unregister(name: string): boolean {\n const removedTool = this.tools.delete(name);\n const removedDefinition = this.definitions.delete(name);\n return removedTool || removedDefinition;\n }\n\n get(name: string): ClientToolHandler | undefined {\n return this.tools.get(name);\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n getTools(): Array<ClientToolDefinition & { handler: ClientToolHandler }> {\n return Array.from(this.tools.entries()).map(([name, handler]) => {\n const def = this.definitions.get(name);\n return {\n name,\n description: def?.description,\n parameters: def?.parameters,\n handler,\n };\n });\n }\n\n merge(other: ClientToolRegistry): ClientToolRegistry {\n const newRegistry = new ClientToolRegistry();\n this.getTools().forEach((tool) => newRegistry.register(tool));\n other.getTools().forEach((tool) => newRegistry.register(tool));\n return newRegistry;\n }\n}\n\nexport const globalClientToolRegistry = new ClientToolRegistry();\n","import React from 'react';\nimport type { ExtensionRegistry, MainViewDefinition, EditorProviderSelector } from './extensionRegistry';\nimport { getUIResourceRegistry, type UIResourceRegistration } from './ui-resource';\nimport { getFrontendMCPServer } from './mcp';\nimport {\n getRuntimeApiBaseUrl,\n getRuntimeAuthHeaders,\n type RuntimeActorContext,\n} from './runtimeActor';\nimport { globalClientToolRegistry } from './frontendToolRegistry';\nimport type { IEnhancedExtensionManifest } from './ExtensionManifestSchema';\nimport { extractFrontendToolsFromManifest } from './ExtensionManifestSchema';\nimport {\n canAccessExtensionCapability,\n mergeExtensionAccessPolicy,\n type ExtensionAccessPolicy,\n} from './extensionAccessPolicy';\n\nexport interface ExtensionCapabilityRegistrationOptions {\n accessPolicy?: ExtensionAccessPolicy;\n routeKey?: string;\n}\n\nexport interface ExtensionCapabilitiesOptions {\n accessPolicy?: ExtensionAccessPolicy;\n extensionId?: string;\n}\n\nexport interface FrontendToolRegistration {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n appOnly?: boolean;\n source?: string;\n accessPolicy?: ExtensionAccessPolicy;\n handler: (\n input: unknown,\n ctx: { actor: RuntimeActorContext | null },\n ) => unknown | Promise<unknown>;\n}\n\nexport interface FrontendToolDeclaration {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n appOnly?: boolean;\n source?: string;\n handlerRef?: string;\n accessPolicy?: ExtensionAccessPolicy;\n}\n\nexport interface FrontendToolHandlerRegistration {\n ref: string;\n source?: string;\n handler: (\n input: unknown,\n ctx: { actor: RuntimeActorContext | null },\n ) => unknown | Promise<unknown>;\n}\n\nexport interface ExtensionCapabilities {\n registerSidebarView(input: {\n id: string;\n title?: string;\n component: React.ComponentType<any>;\n accessPolicy?: ExtensionAccessPolicy;\n routeKey?: string;\n }): () => void;\n registerEditorView(input: {\n id: string;\n title?: string;\n component: React.ComponentType<any>;\n accessPolicy?: ExtensionAccessPolicy;\n routeKey?: string;\n }): () => void;\n registerEditorProvider(input: {\n /** 兼容形态:单后缀。与 selector 二选一 */\n fileExtension?: string;\n /** 对象选择器(多后缀/文件名模式/MIME/优先级) */\n selector?: EditorProviderSelector;\n component: React.ComponentType<any>;\n accessPolicy?: ExtensionAccessPolicy;\n }): () => void;\n /** @internal Host-only compatibility API. External extensions must register an EditorView. */\n registerMainView(input: MainViewDefinition & ExtensionCapabilityRegistrationOptions): () => void;\n registerUIResource(resource: UIResourceRegistration & ExtensionCapabilityRegistrationOptions): () => void;\n registerFrontendTool(tool: FrontendToolRegistration): () => void;\n registerFrontendToolHandler(handler: FrontendToolHandlerRegistration): () => void;\n registerContribution(\n point: string,\n id: string,\n data: unknown,\n options?: ExtensionCapabilityRegistrationOptions,\n ): () => void;\n}\n\nconst frontendTools = new Map<string, FrontendToolRegistration>();\nconst frontendToolDeclarations = new Map<string, FrontendToolDeclaration>();\nconst frontendToolHandlers = new Map<string, FrontendToolHandlerRegistration>();\nconst manifestToolDisposers = new Map<string, () => void>();\n\ntype FrontendToolAuditStatus = 'success' | 'error' | 'denied';\n\nexport function getRegisteredFrontendTools() {\n return Array.from(frontendTools.values()).map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n appOnly: tool.appOnly,\n source: tool.source,\n }));\n}\n\nexport function getDeclaredFrontendTools() {\n return Array.from(frontendToolDeclarations.values());\n}\n\nexport function getRegisteredFrontendToolHandlers() {\n return Array.from(frontendToolHandlers.values()).map((handler) => ({\n ref: handler.ref,\n source: handler.source,\n }));\n}\n\nexport function getFrontendToolHandler(name: string) {\n return frontendTools.get(name)?.handler;\n}\n\nexport function resetFrontendToolRegistriesForTest() {\n manifestToolDisposers.forEach((dispose) => dispose());\n manifestToolDisposers.clear();\n frontendTools.clear();\n frontendToolDeclarations.clear();\n frontendToolHandlers.clear();\n}\n\nexport function registerFrontendToolDeclaration(tool: FrontendToolDeclaration) {\n frontendToolDeclarations.set(tool.name, tool);\n bindFrontendToolDeclaration(tool);\n return () => {\n manifestToolDisposers.get(tool.name)?.();\n manifestToolDisposers.delete(tool.name);\n frontendToolDeclarations.delete(tool.name);\n };\n}\n\nexport function registerFrontendToolDeclarationsFromManifest(\n manifest: IEnhancedExtensionManifest,\n source: string,\n getActor: () => RuntimeActorContext | null = () => null,\n options: ExtensionCapabilitiesOptions = {},\n) {\n const disposers = extractFrontendToolsFromManifest(manifest).map((tool) => {\n const declaration = {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n appOnly: tool.appOnly,\n source,\n handlerRef: tool.handler,\n accessPolicy: (tool as any).accessPolicy,\n };\n\n frontendToolDeclarations.set(declaration.name, declaration);\n bindFrontendToolDeclaration(declaration, getActor, options);\n\n return () => {\n manifestToolDisposers.get(declaration.name)?.();\n manifestToolDisposers.delete(declaration.name);\n frontendToolDeclarations.delete(declaration.name);\n };\n });\n\n return () => {\n disposers.forEach((dispose) => dispose());\n };\n}\n\nfunction getHandlerKey(ref: string, source?: string) {\n return `${source || '*'}:${ref}`;\n}\n\nfunction findFrontendToolHandler(ref?: string, source?: string) {\n if (!ref) return undefined;\n return frontendToolHandlers.get(getHandlerKey(ref, source)) ||\n frontendToolHandlers.get(getHandlerKey(ref));\n}\n\nfunction registerExecutableFrontendTool(\n tool: FrontendToolRegistration,\n getActor: () => RuntimeActorContext | null,\n options: ExtensionCapabilitiesOptions = {},\n) {\n const accessPolicy = mergeExtensionAccessPolicy(options.accessPolicy, tool.accessPolicy);\n const guardedHandler = async (input: unknown, ctx?: { actor?: RuntimeActorContext | null }) => {\n const startedAt = Date.now();\n const actor = ctx?.actor === undefined ? getActor() : ctx.actor;\n let auditStatus: FrontendToolAuditStatus = 'success';\n try {\n const decision = canAccessExtensionCapability(accessPolicy, actor);\n if (!decision.allowed) {\n auditStatus = 'denied';\n throw new Error(`Frontend tool access denied: ${decision.reason || 'access_denied'}`);\n }\n const result = await tool.handler(input, { actor });\n void recordFrontendToolExecutionEvent({\n tool,\n actor,\n status: auditStatus,\n durationMs: Date.now() - startedAt,\n });\n return result;\n } catch (error) {\n void recordFrontendToolExecutionEvent({\n tool,\n actor,\n status: auditStatus === 'denied' ? 'denied' : 'error',\n durationMs: Date.now() - startedAt,\n error,\n });\n throw error;\n }\n };\n\n frontendTools.set(tool.name, {\n ...tool,\n handler: guardedHandler,\n });\n const frontendServer = getFrontendMCPServer();\n frontendServer.registerMethod(tool.name, async (input) =>\n guardedHandler(input),\n );\n globalClientToolRegistry.register({\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n handler: async (input) => guardedHandler(input),\n });\n\n return () => {\n frontendTools.delete(tool.name);\n frontendServer.unregisterMethod(tool.name);\n globalClientToolRegistry.unregister(tool.name);\n };\n}\n\nfunction normalizeToolSourceAppId(source?: string) {\n if (!source) return undefined;\n return source.startsWith('manifest:') ? source.slice('manifest:'.length) : source;\n}\n\nasync function recordFrontendToolExecutionEvent(input: {\n tool: FrontendToolRegistration;\n actor: RuntimeActorContext | null;\n status: FrontendToolAuditStatus;\n durationMs: number;\n error?: unknown;\n}) {\n const tenantId = input.actor?.tenantId;\n if (!tenantId) {\n return;\n }\n const headers = getRuntimeAuthHeaders();\n if (!headers.Authorization) {\n return;\n }\n\n const errorMessage = input.error instanceof Error\n ? input.error.message\n : input.error\n ? String(input.error)\n : undefined;\n\n try {\n await fetch(\n `${getRuntimeApiBaseUrl()}/marketplace/tenants/${encodeURIComponent(tenantId)}/extensions/tool-events`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify({\n workbenchId: input.actor?.workbenchId,\n appId: normalizeToolSourceAppId(input.tool.source),\n source: input.tool.source,\n toolName: input.tool.name,\n status: input.status,\n subjectId: input.actor?.subject?.id,\n durationMs: input.durationMs,\n error: errorMessage,\n metadata: {\n appOnly: input.tool.appOnly,\n },\n }),\n },\n );\n } catch (error) {\n console.warn('[pluginCapabilities] failed to record frontend tool event', error);\n }\n}\n\nfunction bindFrontendToolDeclaration(\n declaration: FrontendToolDeclaration,\n getActor: () => RuntimeActorContext | null = () => null,\n options: ExtensionCapabilitiesOptions = {},\n) {\n if (manifestToolDisposers.has(declaration.name)) {\n return;\n }\n\n const handler = findFrontendToolHandler(declaration.handlerRef, declaration.source);\n if (!handler) {\n return;\n }\n\n const dispose = registerExecutableFrontendTool({\n name: declaration.name,\n description: declaration.description,\n inputSchema: declaration.inputSchema,\n appOnly: declaration.appOnly,\n source: declaration.source,\n accessPolicy: declaration.accessPolicy,\n handler: handler.handler,\n }, getActor, options);\n manifestToolDisposers.set(declaration.name, dispose);\n}\n\nfunction bindDeclarationsForHandler(\n handler: FrontendToolHandlerRegistration,\n getActor: () => RuntimeActorContext | null,\n options: ExtensionCapabilitiesOptions = {},\n) {\n frontendToolDeclarations.forEach((declaration) => {\n if (declaration.handlerRef !== handler.ref) {\n return;\n }\n if (declaration.source && handler.source && declaration.source !== handler.source) {\n return;\n }\n bindFrontendToolDeclaration(declaration, getActor, options);\n });\n}\n\nexport function createExtensionCapabilities(\n extensionRegistry: ExtensionRegistry,\n getActor: () => RuntimeActorContext | null,\n options: ExtensionCapabilitiesOptions = {},\n): ExtensionCapabilities {\n const resolvePolicy = (policy?: ExtensionAccessPolicy) =>\n mergeExtensionAccessPolicy(options.accessPolicy, policy);\n\n const canRegister = (policy?: ExtensionAccessPolicy) =>\n canAccessExtensionCapability(resolvePolicy(policy), getActor()).allowed;\n\n const withAccessGuard = <P extends object>(\n component: React.ComponentType<P>,\n policy?: ExtensionAccessPolicy,\n ): React.FC<P> => {\n const GuardedComponent: React.FC<P> = (props) => {\n const decision = canAccessExtensionCapability(resolvePolicy(policy), getActor());\n if (!decision.allowed) return null;\n return React.createElement(component, props);\n };\n GuardedComponent.displayName = `AccessGuard(${component.displayName || component.name || 'ExtensionView'})`;\n return GuardedComponent;\n };\n\n return {\n registerSidebarView({ id, component, accessPolicy, routeKey }) {\n const SidebarComponent = withAccessGuard(component, accessPolicy);\n extensionRegistry.registerSidebarView(\n id,\n (props: any) => React.createElement(SidebarComponent, props),\n { extensionId: options.extensionId, routeKey },\n );\n return () => {\n extensionRegistry.unregisterSidebarView(id);\n };\n },\n\n registerEditorView({ id, component, accessPolicy, routeKey }) {\n extensionRegistry.registerEditorView(\n id,\n withAccessGuard(component, accessPolicy),\n { extensionId: options.extensionId, routeKey },\n );\n return () => {\n extensionRegistry.unregisterEditorView(id);\n };\n },\n\n registerEditorProvider({ fileExtension, selector, component, accessPolicy }) {\n const guarded = withAccessGuard(component, accessPolicy) as any;\n // 选择器形态:透传完整 selector;dispose 时用同一 selector 精确注销\n if (selector) {\n extensionRegistry.registerEditorProvider(selector, guarded);\n return () => {\n extensionRegistry.unregisterEditorProvider(selector);\n };\n }\n if (!fileExtension) {\n console.warn('[pluginCapabilities] registerEditorProvider ignored: needs fileExtension or selector');\n return () => undefined;\n }\n extensionRegistry.registerEditorProvider(fileExtension, guarded);\n return () => {\n extensionRegistry.unregisterEditorProvider(fileExtension);\n };\n },\n\n registerMainView(input) {\n const { accessPolicy, routeKey, ...view } = input;\n extensionRegistry.registerMainView({\n ...view,\n extensionId: options.extensionId,\n routeKey,\n component: withAccessGuard(view.component, accessPolicy),\n });\n return () => {\n extensionRegistry.unregisterMainView(input.id);\n };\n },\n\n registerUIResource(resource) {\n if (!canRegister(resource.accessPolicy)) {\n return () => undefined;\n }\n const registry = getUIResourceRegistry();\n registry.register(resource, { overwrite: true });\n return () => {\n registry.unregister(resource.uri);\n };\n },\n\n registerFrontendTool(tool) {\n return registerExecutableFrontendTool(tool, getActor, options);\n },\n\n registerFrontendToolHandler(handler) {\n const key = getHandlerKey(handler.ref, handler.source);\n frontendToolHandlers.set(key, handler);\n bindDeclarationsForHandler(handler, getActor, options);\n\n return () => {\n frontendToolHandlers.delete(key);\n frontendToolDeclarations.forEach((declaration) => {\n if (declaration.handlerRef === handler.ref) {\n manifestToolDisposers.get(declaration.name)?.();\n manifestToolDisposers.delete(declaration.name);\n }\n });\n };\n },\n\n registerContribution(point, id, data, registrationOptions) {\n if (!canRegister(registrationOptions?.accessPolicy)) {\n return () => undefined;\n }\n extensionRegistry.registerContribution(point, id, data);\n return () => {\n extensionRegistry.unregisterContribution(point, id);\n };\n },\n };\n}\n"],"names":["UIMimeType","listeners","BridgeProtocol","AppthenMessageType","BridgeEvent","window","React"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default function AgentEmbedPage(): import("react").JSX.Element;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { WorkWeixinConfig, WorkWeixinReadiness } from './configService';
|
|
2
|
-
interface WorkWeixinConfigPayload {
|
|
3
|
-
config: WorkWeixinConfig;
|
|
4
|
-
readiness: WorkWeixinReadiness;
|
|
5
|
-
}
|
|
6
|
-
export declare function fetchWorkWeixinConfig(): Promise<WorkWeixinConfigPayload>;
|
|
7
|
-
export declare function saveWorkWeixinRemoteConfig(config: WorkWeixinConfig): Promise<WorkWeixinConfigPayload>;
|
|
8
|
-
export {};
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
export type MappingStatus = 'ready' | 'planning' | 'pending';
|
|
2
|
-
export interface WorkWeixinChannelMapping {
|
|
3
|
-
key: 'crm' | 'im' | 'agent';
|
|
4
|
-
title: string;
|
|
5
|
-
target: string;
|
|
6
|
-
summary: string;
|
|
7
|
-
enabled: boolean;
|
|
8
|
-
}
|
|
9
|
-
export interface WorkWeixinConfig {
|
|
10
|
-
workspaceName: string;
|
|
11
|
-
corpName: string;
|
|
12
|
-
corpId: string;
|
|
13
|
-
applicationName: string;
|
|
14
|
-
agentId: string;
|
|
15
|
-
callbackUrl: string;
|
|
16
|
-
trustedDomain: string;
|
|
17
|
-
deliveryMode: 'app_message' | 'customer_contact' | 'group_robot';
|
|
18
|
-
syncContacts: boolean;
|
|
19
|
-
syncCustomerContacts: boolean;
|
|
20
|
-
enableCRMMapping: boolean;
|
|
21
|
-
enableIMMapping: boolean;
|
|
22
|
-
enableAgentChatMapping: boolean;
|
|
23
|
-
notes: string;
|
|
24
|
-
updatedAt: string | null;
|
|
25
|
-
}
|
|
26
|
-
export interface WorkWeixinReadiness {
|
|
27
|
-
checklist: Array<{
|
|
28
|
-
key: string;
|
|
29
|
-
label: string;
|
|
30
|
-
ready: boolean;
|
|
31
|
-
}>;
|
|
32
|
-
completed: number;
|
|
33
|
-
total: number;
|
|
34
|
-
score: number;
|
|
35
|
-
level: string;
|
|
36
|
-
mappings: Array<WorkWeixinChannelMapping & {
|
|
37
|
-
status: MappingStatus;
|
|
38
|
-
}>;
|
|
39
|
-
}
|
|
40
|
-
export declare const DEFAULT_WORK_WEIXIN_CONFIG: WorkWeixinConfig;
|
|
41
|
-
export declare function loadWorkWeixinConfig(): WorkWeixinConfig;
|
|
42
|
-
export declare function saveWorkWeixinConfig(config: WorkWeixinConfig): void;
|
|
43
|
-
export declare function buildMappings(config: WorkWeixinConfig): Array<WorkWeixinChannelMapping & {
|
|
44
|
-
status: MappingStatus;
|
|
45
|
-
}>;
|
|
46
|
-
export declare function getReadiness(config: WorkWeixinConfig): WorkWeixinReadiness;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { default as React } from '../../../../node_modules/.pnpm/react@18.3.1/node_modules/react';
|
|
2
|
-
import { RuntimeActorContext } from '../../core/runtimeActor';
|
|
3
|
-
import { PluginContext } from '../../core/PluginContext';
|
|
4
|
-
export declare function WorkbenchAdminSidebar({ actor, runtime, }: {
|
|
5
|
-
actor?: RuntimeActorContext | null;
|
|
6
|
-
runtime?: PluginContext['runtime'];
|
|
7
|
-
}): React.JSX.Element;
|