@appthen/vibe-workspace 0.1.3 → 0.1.5
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/dist/{PluginContext-BTkDt_AE.js → PluginContext-CH3LG0v3.js} +2 -1
- package/dist/PluginContext-CH3LG0v3.js.map +1 -0
- package/dist/{Workbench-97d1mmiW.js → Workbench-BGO7IU10.js} +991 -513
- package/dist/{Workbench-97d1mmiW.js.map → Workbench-BGO7IU10.js.map} +1 -1
- package/dist/{activate-UAlxV7nF.js → activate-DKrF2R5j.js} +8 -6
- package/dist/{activate-UAlxV7nF.js.map → activate-DKrF2R5j.js.map} +1 -1
- package/dist/{devWorkbench-DIrIJP3G.js → devWorkbench-s_zBnSS2.js} +48 -5
- package/dist/devWorkbench-s_zBnSS2.js.map +1 -0
- package/dist/extension-cli/index.js +1 -1
- package/dist/extension-dev/index.js +1 -1
- package/dist/extension-dev-workbench/index.js +3 -3
- package/dist/index.js +5 -5
- package/dist/plugins/agent/PluginModule.js +2 -2
- package/dist/plugins/base/index.js +1 -1
- package/dist/vibe-workspace/src/extension-dev/workspace.d.ts +1 -0
- package/dist/vibe-workspace/src/plugins/workspace-agent/components/ModelProviderPanel.d.ts +7 -1
- package/dist/vibe-workspace/src/plugins/workspace-agent/components/WorkspaceAgentSettingsDialog.d.ts +9 -0
- package/dist/vibe-workspace/src/plugins/workspace-agent/components/WorkspaceRuntimeConfigPanel.d.ts +2 -0
- package/dist/vibe-workspace/src/plugins/workspace-agent/core/model-provider-service.d.ts +2 -0
- package/dist/vibe-workspace/src/plugins/workspace-agent/core/protocol.d.ts +7 -0
- package/dist/vibe-workspace/src/types.d.ts +1 -0
- package/dist/vibe-workspace/src/workbench/WorkbenchHome.d.ts +10 -0
- package/dist/vibe-workspace.css +1 -1
- package/dist/workbench/index.js +2 -2
- package/package.json +2 -1
- package/dist/PluginContext-BTkDt_AE.js.map +0 -1
- package/dist/devWorkbench-DIrIJP3G.js.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { mergeExtensionAccessPolicy } from "./extension-schema/index.js";
|
|
2
2
|
import { g as getRuntimeAccessToken, a as subscribeRuntimeActor, b as createExtensionCapabilities, d as getRuntimeActor } from "./types-BOt5rkJD.js";
|
|
3
3
|
var ExtensionType = /* @__PURE__ */ ((ExtensionType2) => {
|
|
4
|
+
ExtensionType2["WORKBENCH_HOME"] = "WORKBENCH_HOME";
|
|
4
5
|
ExtensionType2["CODE"] = "CODE";
|
|
5
6
|
ExtensionType2["OFFICE"] = "OFFICE";
|
|
6
7
|
ExtensionType2["RESEARCH"] = "RESEARCH";
|
|
@@ -293,4 +294,4 @@ export {
|
|
|
293
294
|
parseWorkbenchRoute as p,
|
|
294
295
|
resolveWorkbenchRouteExtensionId as r
|
|
295
296
|
};
|
|
296
|
-
//# sourceMappingURL=PluginContext-
|
|
297
|
+
//# sourceMappingURL=PluginContext-CH3LG0v3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginContext-CH3LG0v3.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; }\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' | '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 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, '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 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 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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"}
|