@sparkelf/dsh-dataops-managed 0.3.22 → 0.3.24

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/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["listeners","asStatus","asStatus","readJson","refusalReason","useState","styles","Switch","Button","useSyncExternalStore","styles","StateDot","Switch","useState","useId","useCallback","SettingsValueField","Button","useSyncExternalStore","useState","styles","Modal","useState","styles","IconSkillOutlineRegular","Button","IconDownloadOutlineRegular","IconTrashOutlineRegular","Modal","useCallback","IconRefreshOutlineRegular","IconShareOutlineRegular","css","POLL_MS","useState","useCallback","Modal","Button","useState","useCallback","styles","Button","IconRefreshOutlineRegular","Modal","useMemo","Fragment","useRef","useState","useState","useCallback","useMemo","styles","Button","Modal"],"sources":["../src/client/brand-store.ts","../src/client/model-sync-client.ts","../src/client/workspace-limits-client.ts","../src/client/tool-timeout-client.ts","../src/client/review-demo.ts","../src/client/review-client.ts","../src/client/ReviewSettingsCard.tsx","../src/client/ManagedDataOpsSection.tsx","../src/client/review-types.ts","../src/client/skill-plaza-client.ts","../src/client/review-notification-store.ts","../src/client/NotificationBell.tsx","../src/client/SkillPlazaSection.tsx","../src/client/WanxiangBrand.tsx","../src/client/install-branding.tsx","../src/client/ReloginPrompt.tsx","../src/client/settings-gate.ts","../src/client/combobox.ts","../src/client/PermissionCenterSection.tsx","../src/client/PermissionCenterIcon.tsx","../src/client/workspace-upgrade-client.ts","../src/client/WorkspaceUpgradePrompt.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/** Persisted client preference for the managed DataOps shell identity. */\nexport interface WanxiangBrandPreference {\n enabled: boolean\n}\n\n/** Stable local preference key shared by Settings and brand-slot registration. */\nexport const WANXIANG_BRAND_PREFERENCE_KEY = 'dsh.dataops.wanxiangBrand'\n\nfunction initialPreference(): WanxiangBrandPreference {\n if (typeof localStorage === 'undefined') return { enabled: true }\n try {\n const value = JSON.parse(localStorage.getItem(WANXIANG_BRAND_PREFERENCE_KEY) ?? 'null') as unknown\n return typeof value === 'object' && value !== null && 'enabled' in value\n && typeof (value as { enabled?: unknown }).enabled === 'boolean'\n ? { enabled: (value as { enabled: boolean }).enabled }\n : { enabled: true }\n } catch {\n return { enabled: true }\n }\n}\n\nlet preference = initialPreference()\nconst listeners = new Set<() => void>()\n\n/** Observable preference compatible with React's useSyncExternalStore. */\nexport const wanxiangBrandPreference = {\n getSnapshot: (): WanxiangBrandPreference => preference,\n subscribe: (listener: () => void): (() => void) => {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n },\n}\n\n/** Toggle the Wanxiang shell identity from the DataOps Settings section. */\nexport function setWanxiangBrandEnabled(enabled: boolean): void {\n if (preference.enabled === enabled) return\n preference = { enabled }\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(WANXIANG_BRAND_PREFERENCE_KEY, JSON.stringify(preference))\n } catch {\n // Storage failure must not block an in-memory preference change.\n }\n }\n for (const listener of listeners) listener()\n}\n","/** Same-origin model-sync calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for model sharing. */\nexport const MODEL_SYNC_PATH = '/integrations/dataops/model-sync'\n\n/** One model this workspace holds, and whether it is offered to other users. */\nexport interface ModelSyncModel {\n /** Model id as the settings document stores it. */\n id: string\n /** Whether other users may use it. */\n shared: boolean\n}\n\n/** Model sharing as this workspace currently stands. */\nexport interface ModelSyncStatus {\n /** Whether this workspace follows a publisher. */\n followState: 'following' | 'detached'\n /** Whether an administrator currently shares models. */\n publisherSharing: boolean\n /** How many models this workspace adopts from the publisher. */\n adoptedCount: number\n /** Model ids kept private. */\n privateModelIds: string[]\n /** Publication time, when one is sharing. */\n publishedAt: string | null\n /** Whether the current user may change what this workspace shares. */\n canPublish: boolean\n /** Models this workspace holds. */\n models: ModelSyncModel[]\n /**\n * Settings namespaces this deployment distributes.\n *\n * Present with the models in one response, so the two rows describe the same publication.\n */\n sections: DistributedSection[]\n}\n\n/** One settings namespace the deployment distributes. */\nexport interface DistributedSection {\n /** DSH settings namespace, such as `permission`. */\n ns: string\n /** Whether this workspace still takes the publisher's values for it. */\n followState: 'following' | 'detached'\n /** Whether adoption has applied values for it. */\n applied: boolean\n /** Whether a plugin here owns the namespace, so stopping would affect this workspace. */\n mounted: boolean\n}\n\n/** Narrow a response body to the status shape, rejecting anything else. */\nfunction asStatus(value: unknown): ModelSyncStatus | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const record = value as Record<string, unknown>\n if (record.followState !== 'following' && record.followState !== 'detached') return null\n return {\n followState: record.followState,\n publisherSharing: record.publisherSharing === true,\n adoptedCount: typeof record.adoptedCount === 'number' ? record.adoptedCount : 0,\n privateModelIds: Array.isArray(record.privateModelIds)\n ? record.privateModelIds.filter((id): id is string => typeof id === 'string')\n : [],\n publishedAt: typeof record.publishedAt === 'string' ? record.publishedAt : null,\n canPublish: record.canPublish === true,\n models: Array.isArray(record.models)\n ? record.models.flatMap((entry) => {\n if (typeof entry !== 'object' || entry === null) return []\n const model = entry as Record<string, unknown>\n return typeof model.id === 'string' ? [{ id: model.id, shared: model.shared === true }] : []\n })\n : [],\n sections: Array.isArray(record.sections)\n ? record.sections.flatMap((entry): DistributedSection[] => {\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) return []\n const section = entry as Record<string, unknown>\n if (typeof section.ns !== 'string' || section.ns === '') return []\n return [{\n ns: section.ns,\n followState: section.followState === 'detached' ? 'detached' : 'following',\n applied: section.applied === true,\n mounted: section.mounted === true,\n }]\n })\n : [],\n }\n}\n\n/**\n * Read the current model sharing state.\n * @returns The status, or null when this workspace is not connected to DataOps.\n */\nexport async function fetchModelSyncStatus(): Promise<ModelSyncStatus | null> {\n const response = await fetch(MODEL_SYNC_PATH, { headers: { accept: 'application/json' } })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('model sync status failed with HTTP ' + String(response.status))\n return asStatus(await response.json())\n}\n\n/**\n * Change what this workspace shares.\n * @param body - Action and its parameters.\n * @returns The status after the change, or null when the plugin is not active.\n */\nexport async function postModelSyncAction(body: Record<string, unknown>): Promise<ModelSyncStatus | null> {\n const response = await fetch(MODEL_SYNC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(body),\n })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('model sync action failed with HTTP ' + String(response.status))\n return asStatus(await response.json())\n}\n","/** Same-origin workspace-limits calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for workspace limits. */\nexport const WORKSPACE_LIMITS_PATH = '/integrations/dataops/workspace-limits'\n\n/** The two byte ceilings, as the panel edits them. */\nexport interface WorkspaceLimits {\n /** Largest file a sidebar download or agent read may carry. */\n fileReadMaxBytes: number\n /** Largest file an upload may carry. */\n uploadMaxBytes: number\n}\n\n/** Limits as this workspace currently holds them. */\nexport interface WorkspaceLimitsStatus {\n limits: WorkspaceLimits\n canWrite: boolean\n readOnlyReason: string | null\n}\n\n/** Narrow a response body to the status, rejecting anything else. */\nfunction asStatus(value: unknown): WorkspaceLimitsStatus | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const record = value as Record<string, unknown>\n const limits = record.limits as Record<string, unknown> | undefined\n if (typeof limits !== 'object' || limits === null) return null\n const fileReadMaxBytes = limits.fileReadMaxBytes\n const uploadMaxBytes = limits.uploadMaxBytes\n if (typeof fileReadMaxBytes !== 'number' || typeof uploadMaxBytes !== 'number') return null\n return {\n limits: { fileReadMaxBytes, uploadMaxBytes },\n canWrite: record.canWrite === true,\n readOnlyReason: typeof record.readOnlyReason === 'string' ? record.readOnlyReason : null,\n }\n}\n\nfunction readJson(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null\n}\n\n/**\n * A write DataOps refused, carrying the reason it gave.\n *\n * The message is written for the person who set the value, so the panel shows it as-is rather\n * than replacing it with a generic failure notice.\n */\nexport class WorkspaceLimitsRejection extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WorkspaceLimitsRejection'\n }\n}\n\n/** Read the reason from a refused response, falling back to the status line. */\nasync function refusalReason(response: Response, fallback: string): Promise<string> {\n try {\n const body = readJson(await response.json())\n const error = body?.error\n if (typeof error === 'string' && error.trim() !== '') return error\n } catch {\n // A body that is absent or not JSON leaves the fallback as the only explanation available.\n }\n return `${fallback} with HTTP ${String(response.status)}`\n}\n\n/**\n * Read the workspace limits the panel shows.\n * @returns The status, or null when the workspace is not connected to DataOps.\n */\nexport async function fetchWorkspaceLimits(): Promise<WorkspaceLimitsStatus | null> {\n const response = await fetch(WORKSPACE_LIMITS_PATH, { credentials: 'same-origin' })\n if (response.status === 503) return null\n if (!response.ok) throw new Error(`Workspace limits read failed with HTTP ${String(response.status)}`)\n return asStatus(await response.json())\n}\n\n/**\n * Store new workspace limits.\n * @param limits - The ceilings to store.\n * @returns The stored status.\n */\nexport async function saveWorkspaceLimits(limits: WorkspaceLimits): Promise<WorkspaceLimitsStatus | null> {\n const response = await fetch(WORKSPACE_LIMITS_PATH, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(limits),\n })\n if (response.status === 503) return null\n // A refusal names a value the user chose, so the card keeps that draft and shows the reason.\n if (response.status === 400) {\n throw new WorkspaceLimitsRejection(await refusalReason(response, 'Workspace limits write refused'))\n }\n if (!response.ok) throw new Error(await refusalReason(response, 'Workspace limits write failed'))\n const body = readJson(await response.json())\n return body === null ? null : asStatus(body)\n}","/** Same-origin tool-call timeout calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for the tool-call timeout. */\nexport const TOOL_TIMEOUT_PATH = '/integrations/dataops/tool-timeout'\n\n/** The two ends a timeout may take, in seconds, matching what the Host enforces. */\nexport const TOOL_TIMEOUT_MIN_SECONDS = 1\nexport const TOOL_TIMEOUT_MAX_SECONDS = 3600\n\n/** The timeout as this workspace currently holds it. */\nexport interface ToolTimeout {\n /** How long one tool call may run before it is abandoned. */\n toolCallTimeoutMs: number\n}\n\n/** Narrow a response body to the timeout, rejecting anything else. */\nfunction asTimeout(value: unknown): ToolTimeout | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const ms = (value as Record<string, unknown>).toolCallTimeoutMs\n return typeof ms === 'number' && Number.isSafeInteger(ms) && ms > 0 ? { toolCallTimeoutMs: ms } : null\n}\n\n/** Read the reason from a refused response, falling back to the status line. */\nasync function refusalReason(response: Response, fallback: string): Promise<string> {\n try {\n const body = await response.json() as unknown\n if (typeof body === 'object' && body !== null && !Array.isArray(body)) {\n const error = (body as Record<string, unknown>).error\n if (typeof error === 'string' && error.trim() !== '') return error\n }\n } catch {\n // A body that is absent or not JSON leaves the fallback as the only explanation available.\n }\n return fallback + ' with HTTP ' + String(response.status)\n}\n\n/**\n * Read the tool-call timeout the panel shows.\n * @returns The timeout, or null when the workspace is not connected.\n */\nexport async function fetchToolTimeout(): Promise<ToolTimeout | null> {\n const response = await fetch(TOOL_TIMEOUT_PATH, { credentials: 'same-origin' })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('Tool timeout read failed with HTTP ' + String(response.status))\n return asTimeout(await response.json())\n}\n\n/**\n * Store a new tool-call timeout.\n * @param milliseconds - How long one tool call may run.\n * @returns The stored timeout, or null when the workspace is not connected.\n */\nexport async function saveToolTimeout(milliseconds: number): Promise<ToolTimeout | null> {\n const response = await fetch(TOOL_TIMEOUT_PATH, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ toolCallTimeoutMs: milliseconds }),\n })\n if (response.status === 503) return null\n // A refusal names a value the user chose, so the card keeps that draft and shows the reason.\n if (response.status === 400) throw new Error(await refusalReason(response, 'Tool timeout write refused'))\n if (!response.ok) throw new Error(await refusalReason(response, 'Tool timeout write failed'))\n return asTimeout(await response.json())\n}\n","/**\n * Labeled fixtures for reviewing the new surfaces before the backend contract is deployed.\n *\n * They are only reachable through `?dataopsReviewDemo=1`; production never merges them into a\n * listing. Keeping them in one module means the plaza, the audit dialog and the permission\n * centre tell the same story instead of each inventing a different sample.\n */\n\nimport type { PlazaSkill } from './skill-plaza-client.ts'\nimport type { RbacOverview } from './review-client.ts'\n\n/** A pending skill with an AI report, an approved global skill, and a rejected private one. */\nexport function demoPlazaSkills(): PlazaSkill[] {\n return [\n {\n id: 9101,\n name: 'SQL 取数助手',\n description: '把自然语言问题改写成只读 SQL,并解释每个过滤条件。',\n instruction: '你是数据分析助手。只生成只读 SELECT,不要写 UPDATE/DELETE。',\n tags: ['数据', 'SQL'],\n sharedByMe: false,\n updatedAt: '2026-10-23T04:40:00.000Z',\n reviewStatus: 'pending',\n visibility: 'department',\n departmentCode: 'dept-rd',\n departmentName: '研发部',\n departmentPath: [{ code: 'dept-root', name: '万相' }, { code: 'dept-rd', name: '研发部' }],\n ownerName: '林工',\n riskReport: {\n score: 62,\n severity: 'medium',\n summary: '指令包含数据库读取,需确认连接凭据的最小权限。',\n findings: [\n { category: 'credential_access', severity: 'medium', evidence: '提示词要求读取 DATABASE_URL 以连接数据库。', recommendation: '改为由平台注入只读连接,不要在提示词中出现凭据。' },\n { category: 'destructive_action', severity: 'low', evidence: '明确禁止写操作,但未限制 DDL。', recommendation: '补充「禁止 CREATE/ALTER/DROP」。' },\n ],\n scannedAt: '2026-10-23T04:41:00.000Z',\n },\n reviewNote: null,\n submittedAt: '2026-10-23T04:40:00.000Z',\n },\n {\n id: 9102,\n name: '经营日报生成',\n description: '按日汇总营收、订单与退款,输出 Markdown 日报。',\n instruction: '读取昨日指标,生成经营日报。',\n tags: ['经营', '日报'],\n sharedByMe: true,\n updatedAt: '2026-10-21T02:00:00.000Z',\n reviewStatus: 'approved',\n visibility: 'global',\n departmentCode: null,\n ownerName: 'admin',\n riskReport: null,\n },\n {\n id: 9103,\n name: '私域名单清洗',\n description: '按内部规则去重并标记高价值客户。',\n instruction: '清洗名单并输出 CSV。',\n tags: ['客户'],\n sharedByMe: false,\n updatedAt: '2026-10-20T06:00:00.000Z',\n reviewStatus: 'rejected',\n visibility: 'private',\n departmentCode: 'dept-rd',\n departmentName: '研发部',\n ownerName: '周工',\n reviewNote: '包含真实手机号样例,请脱敏后重新提交。',\n },\n ]\n}\n\n/** Four roles, the permission catalog, three members, two departments, and three resources. */\nexport function demoRbacOverview(): RbacOverview {\n return {\n matrix: {\n permissions: [\n { key: 'skill.review', name: '审核技能', group: '技能广场' },\n { key: 'workflow.review', name: '审核工作流', group: '工作流广场' },\n { key: 'rbac.manage', name: '管理权限', group: '系统' },\n { key: 'kb.write', name: '写入知识库', group: '知识库' },\n ],\n roles: [\n { code: 'SUPER_ADMIN', name: '超级管理员', systemKey: 'SUPER_ADMIN', dataScope: 'ALL', permissions: ['skill.review', 'workflow.review', 'rbac.manage', 'kb.write'] },\n { code: 'ADMIN', name: '管理员', systemKey: 'ADMIN', dataScope: 'ALL', permissions: ['skill.review', 'workflow.review', 'kb.write'] },\n { code: 'DEPT_ADMIN', name: '部门管理员', systemKey: 'DEPT_ADMIN', dataScope: 'DEPARTMENT_TREE', permissions: ['skill.review', 'workflow.review'] },\n { code: 'APP_USER', name: '应用人员', systemKey: 'APP_USER', dataScope: 'SELF', permissions: [] },\n ],\n },\n members: [\n { userId: 'u1', username: 'admin', displayName: '超级管理员', roleCodes: ['SUPER_ADMIN'], departmentCode: 'dept-root', departmentPath: [{ code: 'dept-root', name: '万相' }] },\n { userId: 'u2', username: 'lin', displayName: '林工', roleCodes: ['DEPT_ADMIN'], departmentCode: 'dept-rd', departmentPath: [{ code: 'dept-root', name: '万相' }, { code: 'dept-rd', name: '研发部' }] },\n { userId: 'u3', username: 'zhou', displayName: '周工', roleCodes: ['APP_USER'], departmentCode: 'dept-rd', departmentPath: [{ code: 'dept-root', name: '万相' }, { code: 'dept-rd', name: '研发部' }] },\n ],\n departments: [\n { code: 'dept-root', name: '万相', path: [{ code: 'dept-root', name: '万相' }], memberCount: 3, deptAdmins: [] },\n { code: 'dept-rd', name: '研发部', parentCode: 'dept-root', path: [{ code: 'dept-root', name: '万相' }, { code: 'dept-rd', name: '研发部' }], memberCount: 2, deptAdmins: [{ userId: 'u2', username: 'lin', displayName: '林工' }] },\n ],\n resources: [\n { kind: 'skill', id: 9101, name: 'SQL 取数助手', ownerName: '林工', departmentCode: 'dept-rd', visibility: 'department', reviewStatus: 'pending' },\n { kind: 'skill', id: 9102, name: '经营日报生成', ownerName: 'admin', departmentCode: null, visibility: 'global', reviewStatus: 'approved' },\n { kind: 'workflow', id: 'wf-1', name: '每日经营日报', ownerName: 'admin', departmentCode: null, visibility: 'global', reviewStatus: 'approved' },\n ],\n }\n}","/**\n * Browser calls for review, notifications, the permission centre, and review settings.\n *\n * Every request goes through this plugin's same-origin bridge, which holds the DataOps JWT.\n * A 503/404 means the Host or DataOps has not shipped that endpoint yet; callers render their\n * \"waiting for the backend\" state instead of treating an unfinished feature as a failure.\n */\n\nimport type {\n PortalRole,\n ReviewContext,\n ReviewNotification,\n RiskReport,\n ReviewStatus,\n ResourceVisibility,\n} from './review-types.ts'\n\n/** Caller identity and review capability. */\nexport const REVIEW_CONTEXT_PATH = '/integrations/dataops/review-context'\n/** Notification list and read receipts. */\nexport const NOTIFICATIONS_PATH = '/integrations/dataops/review-notifications'\n/** AI scan and the human decision. */\nexport const REVIEW_ACTION_PATH = '/integrations/dataops/review'\n/** Role matrix, members, departments, and resource scopes. */\nexport const RBAC_PATH = '/integrations/dataops/rbac'\n/** The three plaza-review switches in the DataOps settings panel. */\nexport const REVIEW_SETTINGS_PATH = '/integrations/dataops/review-settings'\n/** Department CRUD bridge (task-67). */\nexport const DEPARTMENTS_PATH = '/integrations/dataops/departments'\n\n/** One permission point in the role matrix. */\nexport interface PermissionPoint {\n key: string\n name: string\n group: string\n /** Backend scope metadata for the DSH capability catalogue (task-70). */\n scope?: 'department' | 'global' | string\n /** Chinese presentation note (task-76). */\n description?: string\n}\n\n/** One role row in the matrix. */\nexport interface RoleMatrixRow {\n code: string\n name: string\n systemKey?: string\n dataScope: 'ALL' | 'DEPARTMENT' | 'SELF' | 'CUSTOM_DEPARTMENTS' | 'DEPARTMENT_TREE'\n permissions: readonly string[]\n}\n\n/** One member and their role assignment. */\nexport interface MemberRow {\n userId: string\n username: string\n displayName: string\n roleCodes: readonly string[]\n departmentCode?: string\n departmentPath?: readonly { code: string; name: string }[]\n dataScope?: string\n}\n\n/** One department in the tree. */\nexport interface DepartmentRow {\n code: string\n name: string\n parentCode?: string\n path?: readonly { code: string; name: string }[]\n memberCount?: number\n deptAdmins?: readonly { userId: string; username: string; displayName: string }[]\n description?: string\n owner?: string\n enabled?: boolean\n updatedAt?: string\n}\n\n/** One skill/workflow resource and its visibility scope. */\nexport interface ResourceScopeRow {\n kind: 'skill' | 'workflow'\n id: string | number\n name: string\n ownerId?: string\n ownerName?: string\n departmentCode?: string | null\n visibility: ResourceVisibility\n reviewStatus?: ReviewStatus\n updatedAt?: string\n}\n\n/** Everything the permission centre renders in one read. */\nexport interface RbacOverview {\n matrix: { roles: readonly RoleMatrixRow[]; permissions: readonly PermissionPoint[] }\n members: readonly MemberRow[]\n departments: readonly DepartmentRow[]\n resources: readonly ResourceScopeRow[]\n}\n\n/** One plaza review switch. */\nexport interface ReviewSettings {\n skillPlaza: boolean\n workflowPlaza: boolean\n knowledgeBase: boolean\n}\n\n/** The product defaults, used until DataOps returns its own value. */\nexport const DEFAULT_REVIEW_SETTINGS: ReviewSettings = {\n skillPlaza: true,\n workflowPlaza: true,\n knowledgeBase: true,\n}\n\n/**\n * Whether the page was opened with the demo fixture.\n *\n * The fixture exists so the review dialog and the permission matrix can be reviewed before the\n * backend contract is deployed; every fixture row is labelled and the mode is never the default.\n */\nexport function reviewDemoMode(): boolean {\n if (typeof window === 'undefined') return false\n try {\n return new URLSearchParams(window.location.search).get('dataopsReviewDemo') === '1'\n || window.localStorage.getItem('dataopsReviewDemo') === '1'\n } catch {\n return false\n }\n}\n\n/** Read JSON, mapping \"not active\" and \"backend not ready\" answers to null. */\nasync function readJson<T>(path: string, init: RequestInit = {}): Promise<T | null> {\n const response = await fetch(path, {\n ...init,\n headers: {\n accept: 'application/json',\n ...(init.body === undefined ? {} : { 'content-type': 'application/json' }),\n ...init.headers,\n },\n })\n if (response.status === 503 || response.status === 404 || response.status === 501) return null\n if (!response.ok) throw new Error('DataOps review request failed with HTTP ' + String(response.status))\n return await response.json() as T\n}\n\n/** The backend's review-context row. */\ninterface ReviewContextResponse {\n userId?: string\n username?: string\n displayName?: string\n roleCodes?: string[]\n primaryRole?: string\n roles?: { code?: string; name?: string; systemKey?: string }[]\n departmentCode?: string | null\n departmentPath?: { code: string; name: string }[]\n dataScope?: { all?: boolean; self?: boolean; departmentCodes?: string[] }\n review?: { canReview?: boolean; canReviewGlobal?: boolean; canManagePermissions?: boolean; departments?: string[] }\n settings?: ReviewSettings\n}\n\n/** Read the caller's role and review capability. */\nexport async function fetchReviewContext(): Promise<ReviewContext | null> {\n if (reviewDemoMode()) {\n return {\n role: 'ADMIN', departmentCode: 'dept-rd', departmentPath: ['万相', '研发部'],\n canReview: true, canManagePermissions: true,\n }\n }\n const body = await readJson<ReviewContextResponse>(REVIEW_CONTEXT_PATH)\n if (body === null) return null\n const codes = Array.isArray(body.roleCodes) ? body.roleCodes : []\n // DataOps role codes are display labels (\"超级管理员\"); the stable key is `roles[].systemKey`.\n const primaryKey = body.roles?.find(role => role.code === body.primaryRole)?.systemKey\n ?? body.roles?.find(role => role.code !== undefined && codes.includes(role.code))?.systemKey\n const role: PortalRole = primaryKey === 'SUPER_ADMIN' || codes.includes('超级管理员')\n ? 'SUPER_ADMIN'\n : primaryKey === 'ADMIN' || codes.includes('管理员')\n ? 'ADMIN'\n : primaryKey === 'DEPT_ADMIN' || codes.includes('部门管理员')\n ? 'DEPT_ADMIN'\n : 'APP_USER'\n return {\n userId: body.userId,\n role,\n departmentCode: body.departmentCode ?? undefined,\n departmentPath: body.departmentPath?.map(entry => entry.name),\n canReview: body.review?.canReview === true || role === 'SUPER_ADMIN' || role === 'ADMIN' || role === 'DEPT_ADMIN',\n canManagePermissions: body.review?.canManagePermissions === true || role === 'SUPER_ADMIN' || role === 'ADMIN',\n }\n}\n\n/** Read the current user's notifications. */\nexport async function fetchNotifications(): Promise<{ items: readonly ReviewNotification[]; unread: number } | null> {\n const body = await readJson<{ items?: ReviewNotification[]; unread?: number }>(NOTIFICATIONS_PATH)\n if (body === null || !Array.isArray(body.items)) return null\n return {\n items: body.items,\n unread: typeof body.unread === 'number' ? body.unread : body.items.filter(item => !item.read).length,\n }\n}\n\n/** Mark some notifications, or every one, as read. */\nexport async function markNotificationsRead(ids: 'all' | readonly string[]): Promise<boolean> {\n const response = await fetch(NOTIFICATIONS_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(ids === 'all' ? { all: true } : { ids }),\n })\n return response.ok && response.status !== 503\n}\n\n/** Run the AI review for one or more resources. */\nexport async function scanReview(kind: 'skill' | 'workflow', ids: readonly (string | number)[]): Promise<RiskReport | null> {\n const body = await readJson<{ reports?: RiskReport[] }>(REVIEW_ACTION_PATH, {\n method: 'POST',\n body: JSON.stringify({ action: 'scan', skills: kind === 'skill' ? ids : [], workflows: kind === 'workflow' ? ids : [] }),\n })\n const report = body?.reports?.[0]\n return report !== undefined && Array.isArray(report.findings) ? report : null\n}\n\n/** Record the administrator's decision. The backend enforces the authorization flag too. */\nexport async function decideReview(\n kind: 'skill' | 'workflow',\n ids: readonly (string | number)[],\n decision: 'approve' | 'reject',\n note: string,\n): Promise<boolean> {\n const response = await fetch(REVIEW_ACTION_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({\n action: 'decide',\n skills: kind === 'skill' ? ids : [],\n workflows: kind === 'workflow' ? ids : [],\n decision,\n note,\n authorization: { confirmed: true, reason: 'permission-center' },\n }),\n })\n return response.ok && response.status !== 503\n}\n\n/** Read the permission centre. */\nexport async function fetchRbacOverview(): Promise<RbacOverview | null> {\n if (reviewDemoMode()) {\n const { demoRbacOverview } = await import('./review-demo.ts')\n return demoRbacOverview()\n }\n const [matrix, members, departments, resources] = await Promise.all([\n readJson<{ roles?: RoleMatrixRow[]; permissions?: PermissionPoint[] }>(RBAC_PATH + '?section=matrix&scope=dsh'),\n readJson<{ items?: MemberRow[] }>(RBAC_PATH + '?section=members'),\n readJson<{ items?: DepartmentRow[] }>(RBAC_PATH + '?section=departments'),\n readJson<{ items?: ResourceScopeRow[] }>(RBAC_PATH + '?section=resources'),\n ])\n if (matrix === null || members === null || departments === null || resources === null) return null\n return {\n matrix: { roles: matrix.roles ?? [], permissions: matrix.permissions ?? [] },\n members: members.items ?? [],\n departments: departments.items ?? [],\n resources: resources.items ?? [],\n }\n}\n\n/** What a permission-centre write returned, including the backend's readable refusal. */\nexport interface RbacSaveResult {\n ok: boolean\n reason?: string\n}\n\n/** Persist one permission-centre section. */\nexport async function saveRbacSection(section: 'roles' | 'members' | 'departments' | 'resources', value: unknown): Promise<RbacSaveResult> {\n if (reviewDemoMode()) return { ok: true }\n const response = await fetch(RBAC_PATH, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ section, value }),\n })\n if (response.ok && response.status !== 503) return { ok: true }\n try {\n const body = await response.json() as { message?: unknown; details?: { reason?: unknown } }\n const reason = body.details?.reason ?? body.message\n return { ok: false, ...(typeof reason === 'string' ? { reason } : {}) }\n } catch {\n return { ok: false }\n }\n}\n\n/** Read the three plaza-review switches. */\nexport async function fetchReviewSettings(): Promise<ReviewSettings | null> {\n if (reviewDemoMode()) return DEFAULT_REVIEW_SETTINGS\n return await readJson<ReviewSettings>(REVIEW_SETTINGS_PATH)\n}\n\n/** Persist the three plaza-review switches. */\nexport async function saveReviewSettings(settings: ReviewSettings): Promise<boolean> {\n if (reviewDemoMode()) return true\n const response = await fetch(REVIEW_SETTINGS_PATH, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(settings),\n })\n return response.ok && response.status !== 503\n}\n/** Create one department through the same-origin bridge. */\nexport async function createDepartment(input: {\n code: string\n name: string\n parentCode?: string | null\n description?: string\n owner?: string\n enabled?: boolean\n}): Promise<RbacSaveResult> {\n const response = await fetch(DEPARTMENTS_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(input),\n })\n return await resultOf(response)\n}\n\n/** Update one department; the Host fills `updatedAt` from the current row when omitted. */\nexport async function updateDepartment(input: {\n code: string\n name?: string\n parentCode?: string | null\n description?: string\n owner?: string\n enabled?: boolean\n updatedAt?: string\n}): Promise<RbacSaveResult> {\n const response = await fetch(DEPARTMENTS_PATH, {\n method: 'PATCH',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(input),\n })\n return await resultOf(response)\n}\n\n/** Delete one department after the confirmation dialog. */\nexport async function deleteDepartment(code: string): Promise<RbacSaveResult> {\n const response = await fetch(DEPARTMENTS_PATH, {\n method: 'DELETE',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ code }),\n })\n return await resultOf(response)\n}\n\n/** Map one bridge response to `{ok, reason}` so callers can show the backend text. */\nasync function resultOf(response: Response): Promise<RbacSaveResult> {\n if (response.ok && response.status !== 503) return { ok: true }\n try {\n const body = await response.json() as { message?: unknown; details?: { reason?: unknown } }\n const reason = body.details?.reason ?? body.message\n return { ok: false, ...(typeof reason === 'string' ? { reason } : {}) }\n } catch {\n return { ok: false }\n }\n}\n","import { useEffect, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Button, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { en } from './locales.ts'\nimport { DEFAULT_REVIEW_SETTINGS, fetchReviewSettings, saveReviewSettings } from './review-client.ts'\nimport type { ReviewSettings } from './review-client.ts'\nimport styles from './ManagedDataOpsSection.module.css'\n\n/**\n * The three plaza-review switches.\n *\n * The card is independent of the review queue so the settings page owns the switches while the\n * plaza owns the rows. Defaults are on; a 503 keeps the switches usable and says the API is\n * waiting rather than pretending the save happened.\n */\nexport function ReviewSettingsCard({ t }: { t: (key: keyof typeof en) => string }): ReactNode {\n const [settings, setSettings] = useState<ReviewSettings>(DEFAULT_REVIEW_SETTINGS)\n const [saved, setSaved] = useState<ReviewSettings>(DEFAULT_REVIEW_SETTINGS)\n const [loading, setLoading] = useState(true)\n const [unavailable, setUnavailable] = useState(false)\n const [busy, setBusy] = useState(false)\n const [message, setMessage] = useState<string | null>(null)\n\n useEffect(() => {\n let live = true\n void fetchReviewSettings().then((value) => {\n if (!live) return\n if (value === null) setUnavailable(true)\n else { setSettings(value); setSaved(value) }\n }).catch(() => { if (live) setUnavailable(true) }).finally(() => { if (live) setLoading(false) })\n return () => { live = false }\n }, [])\n\n const changed = settings.skillPlaza !== saved.skillPlaza\n || settings.workflowPlaza !== saved.workflowPlaza\n || settings.knowledgeBase !== saved.knowledgeBase\n\n const save = async (): Promise<void> => {\n setBusy(true)\n setMessage(null)\n try {\n const ok = await saveReviewSettings(settings)\n if (ok) {\n setSaved(settings)\n setMessage(t('reviewSettingsSaved'))\n } else {\n setMessage(t('reviewSettingsWaiting'))\n }\n } catch {\n setMessage(t('reviewSettingsFailed'))\n } finally {\n setBusy(false)\n }\n }\n\n const rows: { key: 'skillPlaza' | 'workflowPlaza' | 'knowledgeBase'; label: string }[] = [\n { key: 'skillPlaza', label: t('reviewSettingsSkill') },\n { key: 'workflowPlaza', label: t('reviewSettingsWorkflow') },\n { key: 'knowledgeBase', label: t('reviewSettingsKb') },\n ]\n\n return (\n <section className={styles.card} data-review-settings-card=\"\">\n <h3 className={styles.heading}>{t('reviewSettingsTitle')}</h3>\n <p className={styles.reviewHint}>{t('reviewSettingsHint')}</p>\n {loading ? <div className={styles.status}><span>{'…'}</span></div> : (\n <div className={styles.reviewRows}>\n {rows.map(row => (\n <div key={row.key} className={styles.reviewRow}>\n <span className={styles.label}>{row.label}</span>\n <Switch\n checked={settings[row.key]}\n label={row.label}\n onChange={(next) => { setSettings(current => ({ ...current, [row.key]: next })) }}\n />\n </div>\n ))}\n </div>\n )}\n {unavailable ? <p className={styles.reviewHint} role=\"status\">{t('reviewSettingsWaiting')}</p> : null}\n {message === null ? null : <p className={styles.reviewHint} role=\"status\">{message}</p>}\n <div className={styles.reviewActions}>\n <Button variant=\"primary\" size=\"sm\" disabled={!changed || busy || loading} onClick={() => { void save() }}>\n {busy ? t('limitsSaving') : t('reviewSettingsSave')}\n </Button>\n </div>\n </section>\n )\n}\n","import { useCallback, useEffect, useId, useState, useSyncExternalStore } from 'react'\nimport { Button, SettingsValueField, StateDot, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { en } from './locales.ts'\nimport { setWanxiangBrandEnabled, wanxiangBrandPreference } from './brand-store.ts'\nimport { fetchModelSyncStatus, postModelSyncAction } from './model-sync-client.ts'\nimport type { ModelSyncStatus } from './model-sync-client.ts'\nimport {\n WorkspaceLimitsRejection,\n fetchWorkspaceLimits,\n saveWorkspaceLimits,\n} from './workspace-limits-client.ts'\nimport type { WorkspaceLimits, WorkspaceLimitsStatus } from './workspace-limits-client.ts'\nimport {\n TOOL_TIMEOUT_MAX_SECONDS,\n TOOL_TIMEOUT_MIN_SECONDS,\n fetchToolTimeout,\n saveToolTimeout,\n} from './tool-timeout-client.ts'\nimport { ReviewSettingsCard } from './ReviewSettingsCard.tsx'\nimport styles from './ManagedDataOpsSection.module.css'\n\n/** Values injected by the DSH Settings slot. */\nexport interface ManagedDataOpsSectionInjected {\n /** Translate one managed DataOps Settings message key. */\n t: (key: keyof typeof en) => string\n}\n\n/** Props accepted by the managed DataOps Settings section. */\nexport type ManagedDataOpsSectionProps = Partial<InjectFace<ManagedDataOpsSectionInjected>>\n\n/** The panel's unit, so a stored byte count survives a round trip through the input. */\nconst BYTES_PER_MIB = 1024 * 1024\n\n/** Render a byte ceiling as the whole MiB the input shows. */\nfunction toMib(bytes: number): string {\n return String(Math.round((bytes / BYTES_PER_MIB) * 100) / 100)\n}\n\n/** Parse a MiB draft into a byte ceiling, or null when it is not a positive count. */\nfunction toBytes(text: string): number | null {\n if (text.trim() === '') return null\n const mib = Number(text)\n if (!Number.isFinite(mib) || mib <= 0) return null\n const bytes = Math.round(mib * BYTES_PER_MIB)\n return Number.isSafeInteger(bytes) && bytes > 0 ? bytes : null\n}\n\n/** Format a stored publication time for the row, or nothing when it never published. */\nfunction publishedText(publishedAt: string): string | null {\n const at = new Date(publishedAt)\n return Number.isNaN(at.getTime()) ? null : at.toLocaleString()\n}\n\n/**\n * The DataOps settings this workspace owns: its connection state, its branding, its file ceilings,\n * and the default configuration it publishes to other workspaces.\n * @param props - Settings slot injection values.\n * @returns The localized managed DataOps section, or nothing before injection.\n */\nexport function ManagedDataOpsSection(props: ManagedDataOpsSectionProps) {\n const { t } = props\n const branding = useSyncExternalStore(\n wanxiangBrandPreference.subscribe,\n wanxiangBrandPreference.getSnapshot,\n wanxiangBrandPreference.getSnapshot,\n )\n if (t === undefined) return null\n\n return (\n <section className={styles.section}>\n <h2 className={styles.title}>{t('title')}</h2>\n <div className={styles.status}>\n <StateDot state=\"done\" />\n <span>{t('managed')}</span>\n </div>\n <BrandingRow t={t} enabled={branding.enabled} />\n <LimitsCard t={t} />\n <TimeoutCard t={t} />\n <ReviewSettingsCard t={t} />\n <DefaultsCard t={t} />\n </section>\n )\n}\n\n/** The branding toggle as one settings row. */\nfunction BrandingRow({ t, enabled }: { t: (key: keyof typeof en) => string; enabled: boolean }) {\n return (\n <div className={styles.card}>\n <div className={styles.row}>\n <span className={styles.label}>{t('brandingTitle')}</span>\n <Switch\n checked={enabled}\n label={t('brandingToggle')}\n onChange={(next) => { setWanxiangBrandEnabled(next) }}\n />\n </div>\n </div>\n )\n}\n\n/** What either card knows about its remote document. */\ntype LoadState<T> =\n | { kind: 'loading' }\n | { kind: 'unavailable' }\n | { kind: 'ready'; status: T }\n | { kind: 'failed' }\n\n/** The one row a card renders while it cannot offer its controls. */\nfunction UnavailableCard({ title, t, state }: {\n title: string\n t: (key: keyof typeof en) => string\n state: 'unavailable' | 'failed'\n}) {\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{title}</h3>\n <div className={styles.status} role={state === 'failed' ? 'alert' : undefined}>\n <StateDot state={state === 'failed' ? 'error' : 'idle'} />\n <span>{state === 'failed' ? t('loadFailed') : t('unavailable')}</span>\n </div>\n </section>\n )\n}\n\n/**\n * The file ceilings DataOps enforces on this workspace.\n *\n * The values live in DataOps and are read through the plugin, which holds the JWT; the panel only\n * ever holds what the administrator is allowed to see.\n * @param props - Translate function from the section.\n * @returns The limits card.\n */\nfunction LimitsCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<WorkspaceLimitsStatus>>({ kind: 'loading' })\n const [fileReadMib, setFileReadMib] = useState('')\n const [uploadMib, setUploadMib] = useState('')\n /** The ceilings the draft started from, so Save stays off until one of them changes. */\n const [saved, setSaved] = useState('')\n /** Why DataOps refused the last save, kept beside the draft it refused. */\n const [refusal, setRefusal] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const fileReadId = useId()\n const uploadId = useId()\n\n const apply = useCallback((status: WorkspaceLimitsStatus) => {\n setState({ kind: 'ready', status })\n const file = toMib(status.limits.fileReadMaxBytes)\n const upload = toMib(status.limits.uploadMaxBytes)\n setFileReadMib(file)\n setUploadMib(upload)\n setSaved(file + '|' + upload)\n setRefusal(null)\n }, [])\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchWorkspaceLimits()\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status)\n } catch {\n setState({ kind: 'failed' })\n }\n }, [apply])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const fileReadBytes = toBytes(fileReadMib)\n const uploadBytes = toBytes(uploadMib)\n const writable = state.kind === 'ready' && state.status.canWrite\n const dirty = fileReadMib + '|' + uploadMib !== saved\n const ready = fileReadBytes !== null && uploadBytes !== null && dirty\n\n /** Edit one ceiling, dropping a refusal that no longer describes what is in the field. */\n const edit = useCallback((set: (text: string) => void) => (text: string) => {\n set(text)\n setRefusal(null)\n }, [])\n\n const submit = useCallback(async () => {\n if (fileReadBytes === null || uploadBytes === null) return\n setBusy(true)\n setRefusal(null)\n try {\n const limits: WorkspaceLimits = { fileReadMaxBytes: fileReadBytes, uploadMaxBytes: uploadBytes }\n const status = await saveWorkspaceLimits(limits)\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status)\n } catch (error) {\n // A refused value keeps the fields and the draft, so the user can correct it in place.\n // Anything else left the card unable to describe its own state, so it reports the read.\n if (error instanceof WorkspaceLimitsRejection) setRefusal(error.message)\n else setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [fileReadBytes, uploadBytes, apply])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('limitsTitle')} t={t} state={state.kind} />\n }\n\n const disabled = busy || !writable\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{t('limitsTitle')}</h3>\n <div className={styles.fields}>\n <div>\n <SettingsValueField\n id={fileReadId}\n label={t('limitsFileReadLabel')}\n text={fileReadMib}\n numeric\n invalid={fileReadBytes === null}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('limitsInvalid')}\n disabled={disabled}\n onEdit={edit(setFileReadMib)}\n onReset={() => undefined}\n />\n </div>\n <div>\n <SettingsValueField\n id={uploadId}\n label={t('limitsUploadLabel')}\n text={uploadMib}\n numeric\n invalid={uploadBytes === null}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('limitsInvalid')}\n disabled={disabled}\n onEdit={edit(setUploadMib)}\n onReset={() => undefined}\n />\n </div>\n </div>\n <div className={styles.actions}>\n {refusal === null\n ? null\n : (\n <span className={styles.refusal} role=\"alert\">\n <StateDot state=\"error\" />\n <span>{refusal}</span>\n </span>\n )}\n <Button variant=\"primary\" size=\"sm\" disabled={disabled || !ready} onClick={() => { void submit() }}>\n {busy ? t('limitsSaving') : t('limitsSave')}\n </Button>\n </div>\n </section>\n )\n}\n\n/**\n * How long one tool call may run before it is abandoned.\n *\n * The value lives in this plugin's own configuration, so it is per workspace and survives a\n * restart. It is edited in seconds because that is the unit an operator reasons in; the plugin\n * stores milliseconds and converts on the way through.\n * @param props - Translate function from the section.\n * @returns The tool-call timeout card.\n */\nfunction TimeoutCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<number>>({ kind: 'loading' })\n const [seconds, setSeconds] = useState('')\n /** The value the draft started from, so Save stays off until it changes. */\n const [saved, setSaved] = useState('')\n const [refusal, setRefusal] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const id = useId()\n\n const apply = useCallback((milliseconds: number) => {\n setState({ kind: 'ready', status: milliseconds })\n const text = String(Math.round(milliseconds / 1000))\n setSeconds(text)\n setSaved(text)\n setRefusal(null)\n }, [])\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchToolTimeout()\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status.toolCallTimeoutMs)\n } catch {\n setState({ kind: 'failed' })\n }\n }, [apply])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const parsed = Number(seconds)\n const valid = seconds.trim() !== '' && Number.isFinite(parsed)\n && parsed >= TOOL_TIMEOUT_MIN_SECONDS && parsed <= TOOL_TIMEOUT_MAX_SECONDS\n const dirty = seconds !== saved\n const disabled = busy\n\n const submit = useCallback(async () => {\n if (!valid) return\n setBusy(true)\n setRefusal(null)\n try {\n const status = await saveToolTimeout(Math.round(parsed * 1000))\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status.toolCallTimeoutMs)\n } catch (error) {\n // A refused value keeps the field and the draft, so the user can correct it in place.\n if (error instanceof Error) setRefusal(error.message)\n else setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [valid, parsed, apply])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('timeoutTitle')} t={t} state={state.kind} />\n }\n\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{t('timeoutTitle')}</h3>\n <div className={styles.fields}>\n <div>\n <SettingsValueField\n id={id}\n label={t('timeoutLabel')}\n text={seconds}\n numeric\n invalid={!valid}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('timeoutInvalid')}\n disabled={disabled}\n onEdit={(text) => { setSeconds(text); setRefusal(null) }}\n onReset={() => undefined}\n />\n </div>\n </div>\n <div className={styles.actions}>\n {refusal === null\n ? null\n : (\n <span className={styles.refusal} role=\"alert\">\n <StateDot state=\"error\" />\n <span>{refusal}</span>\n </span>\n )}\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={disabled || !valid || !dirty}\n onClick={() => { void submit() }}\n >\n {busy ? t('limitsSaving') : t('limitsSave')}\n </Button>\n </div>\n </section>\n )\n}\n\n/**\n * Publish this workspace's configuration as the default other users start from.\n\n * One action rather than a set of controls: the configuration is whatever this workspace already\n * holds, and the button copies it to DataOps.\n * @param props - Translate function from the section.\n * @returns The default-configuration card.\n */\nfunction DefaultsCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<ModelSyncStatus>>({ kind: 'loading' })\n const [busy, setBusy] = useState(false)\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchModelSyncStatus()\n setState(status === null ? { kind: 'unavailable' } : { kind: 'ready', status })\n } catch {\n setState({ kind: 'failed' })\n }\n }, [])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const publish = useCallback(async () => {\n setBusy(true)\n try {\n const status = await postModelSyncAction({ action: 'publish-defaults' })\n if (status === null) setState({ kind: 'unavailable' })\n else setState({ kind: 'ready', status })\n } catch {\n setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('defaultsTitle')} t={t} state={state.kind} />\n }\n\n const published = state.status.publishedAt === null\n ? null\n : publishedText(state.status.publishedAt)\n\n // A viewer DataOps does not authorize to publish sees the state without the action, because the\n // permission rule lives in DataOps and the browser must not restate it.\n return (\n <section className={styles.card}>\n <div className={styles.row}>\n <div className={styles.copy}>\n <span className={styles.label}>{t('defaultsTitle')}</span>\n <span className={styles.meta}>\n {published === null\n ? t('defaultsNeverPublished')\n : t('defaultsPublishedAt') + ' · ' + published}\n </span>\n </div>\n {state.status.canPublish\n ? (\n <Button variant=\"outline\" size=\"sm\" disabled={busy} onClick={() => { void publish() }}>\n {busy ? t('defaultsPublishing') : t('defaultsPublish')}\n </Button>\n )\n : <span className={styles.meta}>{t('defaultsNotAdmin')}</span>}\n </div>\n </section>\n )\n}\n","/**\n * Shared vocabulary for the review, permission and notification surfaces.\n *\n * The backend contract is landing in parallel; every field that a legacy row cannot carry\n * yet is optional here and normalized to the product default (approved/global) rather than\n * guessed per component. Keeping the rules in one place is what lets the skill plaza, the\n * permission centre and the notification bell agree on what \"pending\" means.\n */\n\n/** Review state of a shared skill or workflow. */\nexport type ReviewStatus = 'pending' | 'approved' | 'rejected'\n\n/** Who may see a shared resource outside its owner. */\nexport type ResourceVisibility = 'global' | 'department' | 'private'\n\n/** The skill-plaza filter tabs, in display order. */\nexport type ReviewTab = 'approved' | 'pending' | 'all'\n\n/** The four DataOps roles the permission centre knows. */\nexport type PortalRole = 'SUPER_ADMIN' | 'ADMIN' | 'DEPT_ADMIN' | 'APP_USER'\n\n/** One node of a department ancestry path. */\nexport interface DepartmentPathEntry {\n code: string\n name: string\n}\n\n/** A department as a card tag needs it: code, label, and the ancestry for the tooltip. */\nexport interface DepartmentSummary {\n code: string\n name: string\n /** Root-first path, in either the legacy string form or the backend object form. */\n path?: readonly (string | DepartmentPathEntry)[]\n}\n\n/** One AI risk finding. */\nexport interface RiskFinding {\n category: string\n severity: 'low' | 'medium' | 'high'\n evidence?: string\n recommendation?: string\n}\n\n/** The AI report attached to a pending resource. */\nexport interface RiskReport {\n score?: number\n /** Overall severity, which is wider than a single finding's severity. */\n severity?: 'low' | 'medium' | 'high' | 'critical'\n summary?: string\n findings: readonly RiskFinding[]\n scannedAt?: string\n}\n\n/** The caller's review permissions, as the Host reports them. */\nexport interface ReviewContext {\n userId?: string\n role: PortalRole\n departmentCode?: string\n departmentPath?: readonly string[]\n canReview: boolean\n canManagePermissions: boolean\n}\n\n/** One notification row. */\nexport interface ReviewNotification {\n id: string\n type: string\n title: string\n body?: string\n resourceKind?: string\n resourceId?: string | number\n read: boolean\n createdAt: string\n}\n\n/** A reviewable row as the cards read it. */\nexport interface ReviewableSummary {\n reviewStatus?: ReviewStatus\n visibility?: ResourceVisibility\n departmentCode?: string | null\n departmentName?: string\n departmentPath?: readonly (string | DepartmentPathEntry)[]\n riskReport?: RiskReport | null\n reviewNote?: string | null\n submittedAt?: string\n}\n\n/** Treat a missing status as approved: rows written before the review state existed were live. */\nexport function normalizeReviewStatus(value: unknown): ReviewStatus {\n return value === 'pending' || value === 'rejected' || value === 'approved' ? value : 'approved'\n}\n\n/** Treat a missing visibility as global: a shared row with no scope was visible to everyone. */\nexport function normalizeVisibility(value: unknown): ResourceVisibility {\n return value === 'department' || value === 'private' ? value : 'global'\n}\n\n/** Whether the caller may see and act on the review queue. */\nexport function canReview(context: ReviewContext | null | undefined): boolean {\n if (context === null || context === undefined) return false\n return context.canReview || context.role === 'SUPER_ADMIN' || context.role === 'ADMIN' || context.role === 'DEPT_ADMIN'\n}\n\n/** Whether the caller may open the permission centre's write controls. */\nexport function canManagePermissions(context: ReviewContext | null | undefined): boolean {\n if (context === null || context === undefined) return false\n return context.canManagePermissions || context.role === 'SUPER_ADMIN' || context.role === 'ADMIN'\n}\n\n/**\n * The tabs this caller may see.\n *\n * A department administrator sees the queue too, but the Host narrows it to their subtree;\n * an ordinary user gets only the approved list, and no tab strip at all when there is one tab.\n */\nexport function reviewTabsFor(context: ReviewContext | null | undefined): readonly ReviewTab[] {\n if (!canReview(context)) return ['approved']\n return ['approved', 'pending', 'all']\n}\n\n/** Filter rows by the selected review tab. */\nexport function filterByReview<T extends ReviewableSummary>(rows: readonly T[], tab: ReviewTab): readonly T[] {\n if (tab === 'all') return rows\n return rows.filter(row => normalizeReviewStatus(row.reviewStatus) === tab)\n}\n\n/** Counts for the tab labels. */\nexport function reviewCounts(rows: readonly ReviewableSummary[]): Record<ReviewTab, number> {\n const counts: Record<ReviewTab, number> = { approved: 0, pending: 0, all: rows.length }\n for (const row of rows) {\n const status = normalizeReviewStatus(row.reviewStatus)\n if (status === 'pending') counts.pending += 1\n else if (status === 'rejected') counts.all += 0\n else counts.approved += 1\n }\n return counts\n}\n\n/** The status badge shown on a local skill card. */\nexport function reviewStatusLabel(status: ReviewStatus): string {\n switch (status) {\n case 'pending': return '待审核'\n case 'rejected': return '已驳回'\n default: return '已上架'\n }\n}\n\n/**\n * The visibility tag in a card's top-right corner.\n *\n * A department tag names the department and keeps the full path in the tooltip; a global tag\n * is one word because it is the default and should not compete with the skill name.\n */\n/** Read a department path from either the legacy string form or the backend object form. */\nexport function departmentPathNames(path: ReviewableSummary['departmentPath']): string[] {\n if (path === undefined) return []\n return path.map(entry => typeof entry === 'string' ? entry : entry.name)\n}\n\nexport function visibilityTag(row: ReviewableSummary): { label: string; detail: string } {\n const visibility = normalizeVisibility(row.visibility)\n if (visibility === 'private') return { label: '私有', detail: '仅自己可见' }\n if (visibility === 'global') return { label: '全局', detail: '所有已登录用户可见' }\n const path = departmentPathNames(row.departmentPath)\n const name = row.departmentName ?? path.at(-1) ?? row.departmentCode ?? '部门'\n return { label: name + '部门专属', detail: path.length === 0 ? name : path.join(' / ') }\n}\n\n/** Unread count for a bell badge. */\nexport function unreadCount(items: readonly ReviewNotification[]): number {\n return items.reduce((total, item) => total + (item.read ? 0 : 1), 0)\n}\n\n/** Newest first. Read state never reorders rows, so marking one read cannot move it to another page. */\nexport function sortNotifications(items: readonly ReviewNotification[]): readonly ReviewNotification[] {\n return [...items].sort((left, right) => right.createdAt.localeCompare(left.createdAt))\n}\n\n/** The tab a notification should open, when its resource has one. */\nexport function notificationTab(item: ReviewNotification): ReviewTab | undefined {\n if (item.type === 'submitted' || item.type === 'review_pending' || item.type === 'ai_report_ready' || item.type === 'ai_report') return 'pending'\n if (item.type === 'approved' || item.type === 'published' || item.type === 'shared') return 'approved'\n return undefined\n}","/** Same-origin skill plaza calls from the DataOps skill center section. */\n\nimport type { ReviewStatus, ResourceVisibility } from './review-types.ts'\nimport { normalizeReviewStatus, normalizeVisibility } from './review-types.ts'\n\n/** Route the plugin's Host half serves for the plaza. */\nexport const SKILL_PLAZA_PATH = '/integrations/dataops/skill-plaza'\n\n/** One plaza entry as the section reads it. */\nexport interface PlazaSkill {\n id: number\n name: string\n description?: string\n instruction: string\n tags: string[]\n sharedByMe: boolean\n updatedAt: string\n reviewStatus: ReviewStatus\n visibility: ResourceVisibility\n departmentCode?: string | null\n departmentName?: string\n departmentPath?: readonly { code: string; name: string }[]\n ownerName?: string\n riskReport?: import('./review-types.ts').RiskReport | null\n reviewNote?: string | null\n submittedAt?: string\n}\n\n/** The plaza listing and the tags in use. */\nexport interface PlazaListing {\n skills: PlazaSkill[]\n tags: string[]\n counts?: { pending: number; approved: number; rejected: number; total: number }\n}\n\n/** Narrow an unknown value to a plaza entry. */\nfunction asSkill(value: unknown): PlazaSkill | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const row = value as Record<string, unknown>\n if (typeof row.id !== 'number' || typeof row.name !== 'string') return null\n return {\n id: row.id,\n name: row.name,\n description: typeof row.description === 'string' ? row.description : undefined,\n instruction: typeof row.instruction === 'string' ? row.instruction : '',\n tags: Array.isArray(row.tags) ? row.tags.filter((tag): tag is string => typeof tag === 'string') : [],\n sharedByMe: row.sharedByMe === true,\n updatedAt: typeof row.updatedAt === 'string' ? row.updatedAt : '',\n reviewStatus: normalizeReviewStatus(row.reviewStatus),\n visibility: normalizeVisibility(row.visibility),\n departmentCode: typeof row.departmentCode === 'string' ? row.departmentCode : null,\n departmentName: typeof row.departmentName === 'string' ? row.departmentName : undefined,\n departmentPath: Array.isArray(row.departmentPath)\n ? row.departmentPath.flatMap(entry => (\n typeof entry === 'object' && entry !== null && typeof (entry as { name?: unknown }).name === 'string'\n ? [{ code: String((entry as { code?: unknown }).code ?? ''), name: String((entry as { name: string }).name) }]\n : []\n ))\n : undefined,\n ownerName: typeof row.ownerName === 'string' ? row.ownerName : undefined,\n riskReport: typeof row.riskReport === 'object' && row.riskReport !== null ? row.riskReport as PlazaSkill['riskReport'] : null,\n reviewNote: typeof row.reviewNote === 'string' ? row.reviewNote : null,\n submittedAt: typeof row.submittedAt === 'string' ? row.submittedAt : undefined,\n }\n}\n\n/** Narrow an unknown value to the listing. */\nfunction asListing(value: unknown): PlazaListing | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const row = value as Record<string, unknown>\n const source = Array.isArray(row.skills) ? row.skills : Array.isArray(row.items) ? row.items : []\n const skills = source.flatMap((entry) => asSkill(entry) ?? [])\n const tags = Array.isArray(row.tags) ? row.tags.filter((tag): tag is string => typeof tag === 'string') : []\n const rawCounts = typeof row.counts === 'object' && row.counts !== null ? row.counts as Record<string, unknown> : {}\n const counts = Object.keys(rawCounts).length === 0 ? undefined : {\n pending: Number(rawCounts.pending ?? 0),\n approved: Number(rawCounts.approved ?? 0),\n rejected: Number(rawCounts.rejected ?? 0),\n total: Number(rawCounts.total ?? skills.length),\n }\n return { skills, tags, counts }\n}\n\n/**\n * Read the plaza.\n * @param filter - Optional tag and text filters.\n * @returns The listing, or null when this workspace is not connected to DataOps.\n */\nexport async function fetchPlaza(filter: { tag?: string; query?: string; status?: string; scope?: string } = {}): Promise<PlazaListing | null> {\n const params = new URLSearchParams()\n if (filter.tag !== undefined && filter.tag !== '') params.set('tag', filter.tag)\n if (filter.query !== undefined && filter.query !== '') params.set('q', filter.query)\n if (filter.status !== undefined) params.set('status', filter.status)\n if (filter.scope !== undefined) params.set('scope', filter.scope)\n const suffix = params.size === 0 ? '' : '?' + params.toString()\n const response = await fetch(SKILL_PLAZA_PATH + suffix, { headers: { accept: 'application/json' } })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('skill plaza read failed with HTTP ' + String(response.status))\n return asListing(await response.json())\n}\n\n/**\n * Change the plaza.\n * @param body - Action and its parameters.\n * @returns The parsed reply, or null when the plugin is not active.\n */\nexport async function postPlazaAction(body: Record<string, unknown>): Promise<unknown> {\n const response = await fetch(SKILL_PLAZA_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(body),\n })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('skill plaza action failed with HTTP ' + String(response.status))\n return await response.json()\n}\n","/**\n * One process-wide notification store shared by every bell.\n *\n * The skill plaza and the workflow plaza are separate React trees, but they show the same\n * inbox; keeping the read state in one store is what stops a badge in one place from staying\n * unread after the other opened the row.\n */\n\nimport { useEffect } from 'react'\nimport { fetchNotifications, markNotificationsRead, reviewDemoMode } from './review-client.ts'\nimport type { ReviewNotification } from './review-types.ts'\nimport { sortNotifications, unreadCount } from './review-types.ts'\n\ninterface NotificationState {\n status: 'idle' | 'loading' | 'ready' | 'unavailable'\n items: readonly ReviewNotification[]\n unread: number\n}\n\nconst DEMO_ITEMS: readonly ReviewNotification[] = [\n {\n id: 'demo-1', type: 'review_pending', title: '技能「SQL 取数助手」等待审核',\n body: '来自研发部 · 提交于 10 分钟前', resourceKind: 'skill', resourceId: 101, read: false,\n createdAt: '2026-10-23T04:50:00.000Z',\n },\n {\n id: 'demo-2', type: 'ai_report', title: 'AI 风险报告已生成',\n body: '风险等级:中 · 2 条建议', resourceKind: 'skill', resourceId: 101, read: false,\n createdAt: '2026-10-23T04:49:00.000Z',\n },\n {\n id: 'demo-3', type: 'approved', title: '工作流「每日经营日报」已通过',\n body: '审核人:admin', resourceKind: 'workflow', resourceId: 'wf-1', read: true,\n createdAt: '2026-10-22T09:10:00.000Z',\n },\n]\n\nlet state: NotificationState = { status: 'idle', items: [], unread: 0 }\nconst listeners = new Set<() => void>()\n\nfunction publish(next: NotificationState): void {\n state = next\n for (const listener of listeners) listener()\n}\n\n/** Current snapshot for `useSyncExternalStore`. */\nexport function notificationSnapshot(): NotificationState {\n return state\n}\n\n/** Subscribe to store changes. */\nexport function subscribeNotifications(listener: () => void): () => void {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n}\n\n/** Load the inbox once; a second caller joins the first request. */\nlet inflight: Promise<void> | undefined\nexport function loadNotifications(): Promise<void> {\n if (inflight !== undefined) return inflight\n publish({ ...state, status: 'loading' })\n inflight = (async () => {\n try {\n if (reviewDemoMode()) {\n publish({ status: 'ready', items: sortNotifications(DEMO_ITEMS), unread: unreadCount(DEMO_ITEMS) })\n return\n }\n const result = await fetchNotifications()\n if (result === null) {\n publish({ status: 'unavailable', items: [], unread: 0 })\n return\n }\n publish({ status: 'ready', items: sortNotifications(result.items), unread: unreadCount(result.items) })\n } catch {\n publish({ status: 'unavailable', items: [], unread: 0 })\n } finally {\n inflight = undefined\n }\n })()\n return inflight\n}\n\n/** Mark one row or the whole inbox read, optimistically. */\nexport async function markRead(ids: 'all' | readonly string[]): Promise<void> {\n const items = ids === 'all' ? state.items.map(item => ({ ...item, read: true })) : state.items.map(item => (\n ids.includes(item.id) ? { ...item, read: true } : item\n ))\n publish({ ...state, items, unread: unreadCount(items) })\n try {\n const ok = await markNotificationsRead(ids)\n if (!ok) await loadNotifications()\n } catch {\n await loadNotifications()\n }\n}\n\n/** Load the inbox when a bell first mounts. */\nexport function useNotifications(): NotificationState {\n useEffect(() => { void loadNotifications() }, [])\n // The component calls `useSyncExternalStore` itself; this hook only owns the first load.\n return state\n}","import { useEffect, useSyncExternalStore, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { ReviewNotification } from './review-types.ts'\nimport { sortNotifications, unreadCount } from './review-types.ts'\nimport {\n loadNotifications,\n markRead,\n notificationSnapshot,\n subscribeNotifications,\n} from './review-notification-store.ts'\nimport { reviewDemoMode } from './review-client.ts'\nimport styles from './NotificationBell.module.css'\n\n/** Colour tone and glyph for one notification type, matching the automation-task rows. */\nfunction notificationTone(type: string): 'success' | 'danger' | 'warn' | 'info' {\n if (type === 'approved' || type === 'published' || type === 'success') return 'success'\n if (type === 'rejected') return 'danger'\n if (type === 'unpublished') return 'warn'\n return 'info'\n}\n\nfunction NotificationIcon({ tone }: { tone: 'success' | 'danger' | 'warn' | 'info' }): ReactNode {\n if (tone === 'success') {\n return <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"8\" r=\"6.2\" stroke=\"currentColor\" strokeWidth=\"1.3\" /><path d=\"m5.3 8.1 1.8 1.8 3.6-3.8\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" /></svg>\n }\n if (tone === 'danger') {\n return <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M8 2.3 14 13H2L8 2.3Z\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\" /><path d=\"M8 6v3.1\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" /><circle cx=\"8\" cy=\"11.2\" r=\".7\" fill=\"currentColor\" /></svg>\n }\n if (tone === 'warn') {\n return <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"8\" r=\"6.2\" stroke=\"currentColor\" strokeWidth=\"1.3\" /><path d=\"M8 4.8v3.6\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" /><circle cx=\"8\" cy=\"11.1\" r=\".7\" fill=\"currentColor\" /></svg>\n }\n return <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M4 2.5h5l3 3v8H4v-11Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" /><path d=\"M9 2.5v3h3M6 8h4M6 10.5h3\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" /></svg>\n}\n\n/** Props accepted by a bell. */\nexport interface NotificationBellProps {\n /** Accessible label; the two plaza headings differ so screen readers can tell them apart. */\n label: string\n /** Called after a row is read, so the plaza can jump to the matching tab or card. */\n onOpen?: (item: ReviewNotification) => void\n}\n\n/**\n * A bell with an unread badge and the shared inbox.\n *\n * The bell is a button rather than a menu so keyboard focus and Escape follow the dialog\n * conventions the rest of the page already uses. Rows mark themselves read when opened;\n * \"全部已读\" is the one bulk action.\n */\nexport function NotificationBell({ label, onOpen }: NotificationBellProps): ReactNode {\n const state = useSyncExternalStore(subscribeNotifications, notificationSnapshot, notificationSnapshot)\n const [open, setOpen] = useState(false)\n const [page, setPage] = useState(0)\n const items = sortNotifications(state.items)\n const unread = unreadCount(items)\n const pages = Math.max(1, Math.ceil(items.length / 20))\n const visible = items.slice(page * 20, page * 20 + 20)\n\n useEffect(() => {\n // Marking rows read changes no ordering; only a shrinking inbox can invalidate the page.\n if (page >= pages) setPage(pages - 1)\n }, [page, pages])\n\n // Load once on mount so the badge states the real unread count before the reader clicks.\n useEffect(() => { void loadNotifications() }, [])\n\n const openOne = (item: ReviewNotification): void => {\n void markRead([item.id])\n setOpen(false)\n onOpen?.(item)\n }\n\n return (\n <>\n <button\n type=\"button\"\n className={styles.bell}\n aria-label={unread === 0 ? label : label + ',' + String(unread) + ' 条未读'}\n title={label}\n data-notification-bell=\"\"\n data-unread={unread}\n onClick={() => {\n setOpen(true)\n setPage(0)\n void loadNotifications()\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M8 2.2a4.1 4.1 0 0 0-4.1 4.1v2.3L2.7 10.8a.6.6 0 0 0 .5.9h9.6a.6.6 0 0 0 .5-.9L12.1 8.6V6.3A4.1 4.1 0 0 0 8 2.2Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n <path d=\"M6.4 13.2a1.7 1.7 0 0 0 3.2 0\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n {unread === 0 ? null : <span className={styles.badge}>{unread > 99 ? '99+' : unread}</span>}\n </button>\n <Modal\n open={open}\n onClose={() => { setOpen(false) }}\n title={label}\n closeLabel=\"关闭\"\n className={styles.dialog as string}\n footer={(\n <div className={styles.actions}>\n <button type=\"button\" className={styles.linkButton} onClick={() => { void markRead('all') }}>\n 全部已读\n </button>\n <button type=\"button\" className={styles.button} onClick={() => { setOpen(false) }}>关闭</button>\n </div>\n )}\n >\n {reviewDemoMode() ? <p className={styles.demo}>演示数据 · 后端契约到达后自动切换</p> : null}\n {state.status === 'unavailable' ? (\n <p className={styles.empty}>通知服务待后端联调(task-35);上线后这里会显示审核、上架与 AI 报告事件。</p>\n ) : null}\n {state.status !== 'unavailable' && items.length === 0 ? <p className={styles.empty}>暂无通知。</p> : null}\n {items.length === 0 ? null : (\n <ul className={styles.list}>\n {visible.map(item => (\n <li key={item.id}>\n <button\n type=\"button\"\n className={styles.row}\n onClick={() => { openOne(item) }}\n >\n <span className={styles.rowIcon} data-tone={notificationTone(item.type)} aria-hidden=\"true\"><NotificationIcon tone={notificationTone(item.type)} /></span>\n <span className={styles.rowBody}>\n <span className={styles.rowTitle}>{item.title}</span>\n {item.body === undefined ? null : <span className={styles.rowText}>{item.body}</span>}\n </span>\n <span className={styles.rowMeta}>\n <span className={styles.rowTime}>{item.createdAt.slice(0, 16).replace('T', ' ')}</span>\n {item.read ? null : <span className={styles.dot} aria-hidden=\"true\" />}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n {items.length === 0 ? null : (\n <div className={styles.pager}>\n <button type=\"button\" disabled={page === 0} onClick={() => { setPage(current => Math.max(0, current - 1)) }}>上一页</button>\n <span>第 {page + 1} / {pages} 页 · 共 {items.length} 条</span>\n <button type=\"button\" disabled={page >= pages - 1} onClick={() => { setPage(current => Math.min(pages - 1, current + 1)) }}>下一页</button>\n </div>\n )}\n </Modal>\n </>\n )\n}\n\n/** The automation page's seat: the same inbox under the workflow plaza's heading. */\nexport function WorkflowPlazaBell(): ReactNode {\n return <NotificationBell label=\"自动化任务通知\" />\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n Button,\n IconDownloadOutlineRegular,\n IconRefreshOutlineRegular,\n IconShareOutlineRegular,\n IconSkillOutlineRegular,\n IconTrashOutlineRegular,\n Modal,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { en } from './locales.ts'\nimport { fetchPlaza, postPlazaAction, type PlazaListing, type PlazaSkill } from './skill-plaza-client.ts'\nimport { decideReview, fetchReviewContext, reviewDemoMode, scanReview } from './review-client.ts'\nimport type { ReviewContext, ReviewTab, RiskReport } from './review-types.ts'\nimport {\n canReview,\n filterByReview,\n notificationTab,\n normalizeReviewStatus,\n reviewCounts,\n reviewTabsFor,\n visibilityTag,\n} from './review-types.ts'\nimport { demoPlazaSkills } from './review-demo.ts'\nimport { NotificationBell } from './NotificationBell.tsx'\nimport styles from './SkillPlazaSection.module.css'\n\n/** Values the skill center passes to a contributed section. */\nexport interface SkillPlazaSectionInjected {\n /** Translate one DataOps plaza message key. */\n t: (key: keyof typeof en) => string\n /**\n * The page's current search text.\n *\n * The page draws one search field for every skill it shows, and this section is part of that\n * page. Filtering here with the same text keeps the visible result consistent with the field;\n * drawing a second field would offer the same control twice and filter only half the page.\n */\n query: string\n}\n\n/** Props accepted by the plaza section. */\nexport type SkillPlazaSectionProps = Partial<InjectFace<SkillPlazaSectionInjected>>\n\n/** What the section currently knows. */\ntype PlazaState =\n | { kind: 'loading' }\n | { kind: 'unavailable' }\n | { kind: 'ready'; listing: PlazaListing }\n | { kind: 'failed' }\n\n/** Tab counts from the same visible rows the cards render. */\nfunction countsOf(skills: readonly PlazaSkill[]): NonNullable<PlazaListing['counts']> {\n const counted = reviewCounts(skills)\n return {\n approved: counted.approved,\n pending: counted.pending,\n rejected: skills.filter(row => row.reviewStatus === 'rejected').length,\n total: counted.all,\n }\n}\n\n/** One skill as a card in the plaza grid. */\nfunction PlazaCard({ skill, busy, canAudit, onInstall, onUnshare, onReview, t }: {\n skill: PlazaSkill\n busy: boolean\n canAudit: boolean\n onInstall: () => void\n onUnshare: () => void\n onReview: () => void\n t: (key: keyof typeof en) => string\n}): ReactNode {\n const [open, setOpen] = useState(false)\n const status = normalizeReviewStatus(skill.reviewStatus)\n const tag = visibilityTag(skill)\n return (\n <li className={styles.card} data-review-status={status}>\n <div className={styles.cardTop}>\n <span className={styles.cardIcon}><IconSkillOutlineRegular size={16} /></span>\n <div className={styles.cardTitle}>{skill.name}</div>\n <span className={styles.tagTop} title={tag.detail}>{tag.label}</span>\n </div>\n <div className={styles.cardMarks}>\n {skill.sharedByMe ? <span className={styles.sharedTag}>{t('plazaSharedTag')}</span> : null}\n {status === 'pending' ? <span className={styles.pendingTag}>{t('plazaTabPending')}</span> : null}\n {status === 'rejected' ? <span className={styles.rejectedTag}>{t('plazaReject')}</span> : null}\n {skill.tags.map(item => <span className={styles.mark} key={item}>{item}</span>)}\n </div>\n <div className={styles.cardDesc}>{skill.description ?? ''}</div>\n {status === 'rejected' && skill.reviewNote !== null && skill.reviewNote !== undefined ? (\n <p className={styles.reviewNote}>{skill.reviewNote}</p>\n ) : null}\n <div className={styles.cardEnd}>\n {canAudit && status === 'pending' ? (\n <Button variant=\"outline\" size=\"sm\" className={styles.reviewButton} onClick={onReview}>\n {t('plazaReview')}\n </Button>\n ) : null}\n <Button variant=\"outline\" size=\"sm\" icon={<IconDownloadOutlineRegular size={16} />} disabled={busy} onClick={onInstall}>\n {t('plazaInstall')}\n </Button>\n {skill.sharedByMe ? (\n <Button variant=\"ghost\" size=\"sm\" icon={<IconTrashOutlineRegular size={16} />} disabled={busy} onClick={onUnshare}>\n {t('plazaUnshare')}\n </Button>\n ) : null}\n <Button variant=\"outline\" size=\"sm\" className={styles.detailButton} onClick={() => { setOpen(true) }}>\n {t('plazaShowDetail')}\n </Button>\n </div>\n <Modal\n open={open}\n onClose={() => { setOpen(false) }}\n title={skill.name}\n closeLabel={t('plazaClose')}\n className={styles.dialog as string}\n footer={<Button variant=\"outline\" onClick={() => { setOpen(false) }}>{t('plazaClose')}</Button>}\n >\n <dl className={styles.detail}>\n <div className={styles.detailRow}><dt className={styles.detailLabel}>{t('plazaDetailUpdated')}</dt><dd className={styles.detailValue}>{skill.updatedAt}</dd></div>\n <div className={styles.detailRow}><dt className={styles.detailLabel}>{t('plazaDetailBody')}</dt><dd className={styles.detailValue}>{skill.instruction}</dd></div>\n </dl>\n </Modal>\n </li>\n )\n}\n\n/** The AI report block inside the audit dialog. */\nfunction RiskReportView({ report, busy, failed, onScan, t }: {\n report: RiskReport | null\n busy: boolean\n failed: boolean\n onScan: () => void\n t: (key: keyof typeof en) => string\n}): ReactNode {\n return (\n <section className={styles.risk}>\n <div className={styles.riskHead}>\n <strong>{t('plazaRiskTitle')}</strong>\n <Button variant=\"outline\" size=\"sm\" disabled={busy} onClick={onScan}>\n {busy ? t('plazaRiskScanning') : t('plazaRiskScan')}\n </Button>\n </div>\n {failed ? <p className={styles.riskFailed}>{t('plazaRiskFailed')}</p> : null}\n {report === null ? (busy ? null : <p className={styles.riskEmpty}>{t('plazaRiskNone')}</p>) : (\n <>\n <div className={styles.riskSummary}>\n {report.score === undefined ? null : <span className={styles.riskScore}>{t('plazaRiskScore')} {report.score}</span>}\n {report.severity === undefined ? null : <span className={styles.severity} data-severity={report.severity}>{report.severity}</span>}\n {report.summary === undefined ? null : <span>{report.summary}</span>}\n </div>\n <ul className={styles.findings}>\n {report.findings.map((finding, index) => (\n <li key={String(index)} className={styles.finding}>\n <span className={styles.severity} data-severity={finding.severity}>{finding.severity}</span>\n <strong>{finding.category}</strong>\n {finding.evidence === undefined ? null : <span className={styles.findingText}>{finding.evidence}</span>}\n {finding.recommendation === undefined ? null : <span className={styles.findingHint}>{finding.recommendation}</span>}\n </li>\n ))}\n </ul>\n </>\n )}\n </section>\n )\n}\n\n/**\n * Browse, share, and install skills other users published.\n *\n * Review is a permissioned overlay on the same plaza: the tab strip and the audit dialog only\n * appear when the Host says the caller may review, and the Host additionally narrows the pending\n * list to the caller's department subtree.\n */\nexport function SkillPlazaSection(props: SkillPlazaSectionProps): ReactNode {\n const { t } = props\n const [state, setState] = useState<PlazaState>({ kind: 'loading' })\n const [context, setContext] = useState<ReviewContext | null | undefined>(undefined)\n const [tab, setTab] = useState<ReviewTab>('approved')\n const [tag, setTag] = useState('')\n const [busy, setBusy] = useState(false)\n const [notice, setNotice] = useState<string | null>(null)\n const [audit, setAudit] = useState<PlazaSkill | null>(null)\n const [risk, setRisk] = useState<RiskReport | null>(null)\n const [riskBusy, setRiskBusy] = useState(false)\n const [riskFailed, setRiskFailed] = useState(false)\n const [reviewNote, setReviewNote] = useState('')\n const [reviewBusy, setReviewBusy] = useState(false)\n const [reviewError, setReviewError] = useState<string | null>(null)\n const query = props.query ?? ''\n const allowed = canReview(context)\n\n useEffect(() => {\n let live = true\n void fetchReviewContext().then((next) => { if (live) setContext(next) }).catch(() => { if (live) setContext(null) })\n return () => { live = false }\n }, [])\n\n const load = useCallback(async (filter: { tab: ReviewTab; tag: string; query: string }) => {\n try {\n // The demo fixture is complete on its own: mixing it with a live list would still call a\n // backend whose review endpoints have not shipped, which is exactly what the fixture exists\n // to review without.\n if (reviewDemoMode()) {\n const demo = demoPlazaSkills()\n setState({\n kind: 'ready',\n listing: {\n skills: [...filterByReview(demo, filter.tab)],\n tags: ['性能', '数据', '数据库', '质量', '经营', '日报', '客户'],\n counts: countsOf(demo),\n },\n })\n return\n }\n // One visible snapshot per query/tag. The tab is a client-side filter, so the count on\n // each tab is always the number of cards that tab will actually show.\n const listing = await fetchPlaza({ tag: filter.tag, query: filter.query, status: allowed ? 'all' : 'approved' })\n if (listing === null) {\n setState({ kind: 'unavailable' })\n return\n }\n const visible = allowed ? listing.skills : listing.skills.filter(row => normalizeReviewStatus(row.reviewStatus) === 'approved')\n setState({ kind: 'ready', listing: { ...listing, skills: [...filterByReview(visible, filter.tab)], counts: countsOf(visible) } })\n } catch {\n setState({ kind: 'failed' })\n }\n }, [allowed])\n\n useEffect(() => { void load({ tab, tag, query }) }, [load, tab, tag, query])\n\n const refresh = useCallback(async (nextTab = tab, nextTag = tag) => {\n await load({ tab: nextTab, tag: nextTag, query })\n }, [load, tab, tag, query])\n\n const act = useCallback(async (body: Record<string, unknown>, message: string) => {\n setBusy(true)\n setNotice(null)\n try {\n await postPlazaAction(body)\n setNotice(message)\n await refresh()\n } catch {\n setNotice(t === undefined ? null : t('plazaActionFailed'))\n } finally {\n setBusy(false)\n }\n }, [refresh, t])\n\n const runScan = async (skill: PlazaSkill): Promise<void> => {\n setRiskBusy(true)\n setRiskFailed(false)\n try {\n const report = await scanReview('skill', [skill.id])\n if (report === null) setRiskFailed(true)\n else setRisk(report)\n } catch {\n setRiskFailed(true)\n } finally {\n setRiskBusy(false)\n }\n }\n\n const openAudit = (skill: PlazaSkill): void => {\n setAudit(skill)\n setRisk(skill.riskReport ?? null)\n setRiskFailed(false)\n setReviewNote('')\n setReviewError(null)\n if (skill.riskReport === null || skill.riskReport === undefined) void runScan(skill)\n }\n\n const submitReview = async (decision: 'approve' | 'reject'): Promise<void> => {\n if (audit === null || reviewBusy) return\n if (decision === 'reject' && reviewNote.trim() === '') {\n setReviewError(t === undefined ? null : t('plazaReviewNote'))\n return\n }\n setReviewBusy(true)\n setReviewError(null)\n try {\n const ok = await decideReview('skill', [audit.id], decision, reviewNote.trim())\n if (!ok) {\n setReviewError(t === undefined ? null : t('plazaReviewFailed'))\n return\n }\n setAudit(null)\n setNotice(t === undefined ? null : t('plazaReviewDone'))\n await refresh('pending')\n } catch {\n setReviewError(t === undefined ? null : t('plazaReviewFailed'))\n } finally {\n setReviewBusy(false)\n }\n }\n\n if (t === undefined) return null\n if (state.kind === 'loading') return null\n\n const head = (count: number | null): ReactNode => (\n <div className={styles.head}>\n <div className={styles.headRow}>\n <h2 className={styles.title}>\n {t('plazaTitle')}\n {count === null ? null : <span className={styles.titleCount}>{count}</span>}\n </h2>\n {reviewDemoMode() ? <span className={styles.demoTag}>{t('plazaDemo')}</span> : null}\n <NotificationBell\n label={t('plazaTitle') + '通知'}\n onOpen={(item) => {\n const next = notificationTab(item)\n if (next !== undefined) setTab(next)\n }}\n />\n </div>\n </div>\n )\n\n if (state.kind === 'unavailable') {\n return <section className={styles.section}>{head(null)}<p className={styles.status}>{t('plazaUnavailable')}</p></section>\n }\n if (state.kind === 'failed') {\n return (\n <section className={styles.section}>\n {head(null)}\n <div className={styles.empty} role=\"alert\">\n <span className={styles.emptyIcon}><IconSkillOutlineRegular size={28} /></span>\n <p className={styles.emptyText}>{t('plazaLoadFailed')}</p>\n <Button variant=\"outline\" size=\"sm\" icon={<IconRefreshOutlineRegular size={16} />} onClick={() => { void refresh() }}>{t('plazaRetry')}</Button>\n </div>\n </section>\n )\n }\n\n const { listing } = state\n const counts: Record<ReviewTab, number> = listing.counts === undefined\n ? reviewCounts(listing.skills)\n : { approved: listing.counts.approved, pending: listing.counts.pending, all: listing.counts.total }\n const tabs = reviewTabsFor(context)\n const tabLabel = (item: ReviewTab): string => item === 'approved' ? t('plazaTabApproved') : item === 'pending' ? t('plazaTabPending') : t('plazaTabAll')\n\n return (\n <section className={styles.section}>\n {head(counts[tab])}\n {tabs.length > 1 ? (\n <div className={styles.tabs} role=\"tablist\" aria-label={t('plazaTitle')}>\n {tabs.map(item => (\n <button\n key={item}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === item}\n className={tab === item ? styles.tab + ' ' + styles.tabActive : styles.tab}\n onClick={() => { setTab(item); void load({ tab: item, tag, query }) }}\n >\n {tabLabel(item)}\n <span className={styles.tabCount}>{counts[item]}</span>\n </button>\n ))}\n </div>\n ) : null}\n\n {listing.tags.length === 0 ? null : (\n <div className={styles.tagBar}>\n <button type=\"button\" className={tag === '' ? styles.chip + ' ' + styles.chipOn : styles.chip} onClick={() => { setTag(''); void refresh(tab, '') }}>{t('plazaAllTags')}</button>\n {listing.tags.map(item => (\n <button key={item} type=\"button\" className={tag === item ? styles.chip + ' ' + styles.chipOn : styles.chip} onClick={() => { setTag(item); void refresh(tab, item) }}>{item}</button>\n ))}\n </div>\n )}\n\n {notice === null ? null : <p className={styles.notice}>{notice}</p>}\n\n {listing.skills.length === 0 ? (\n <div className={styles.empty}>\n <span className={styles.emptyIcon}><IconShareOutlineRegular size={28} /></span>\n <p className={styles.emptyText}>{tab === 'pending' ? t('plazaPendingEmpty') : t('plazaEmpty')}</p>\n </div>\n ) : null}\n\n <ul className={styles.cards}>\n {listing.skills.map(skill => (\n <PlazaCard\n key={skill.id}\n skill={skill}\n busy={busy}\n canAudit={allowed}\n t={t}\n onInstall={() => { void act({ action: 'install', id: skill.id }, t('plazaInstalled')) }}\n onUnshare={() => { void act({ action: 'unshare', id: skill.id }, t('plazaUnshared')) }}\n onReview={() => { openAudit(skill) }}\n />\n ))}\n </ul>\n\n <Modal\n open={audit !== null}\n onClose={() => { if (!reviewBusy) setAudit(null) }}\n title={t('plazaAuditTitle')}\n closeLabel={t('plazaClose')}\n className={styles.auditDialog as string}\n footer={(\n <div className={styles.auditFooter}>\n <Button variant=\"outline\" disabled={reviewBusy} onClick={() => { setAudit(null) }}>{t('plazaClose')}</Button>\n <Button variant=\"outline\" disabled={reviewBusy} onClick={() => { void submitReview('reject') }}>{t('plazaReject')}</Button>\n <Button variant=\"primary\" disabled={reviewBusy} onClick={() => { void submitReview('approve') }}>{t('plazaApprove')}</Button>\n </div>\n )}\n >\n {audit === null ? null : (\n <div className={styles.audit}>\n <dl className={styles.detail}>\n <div className={styles.detailRow}><dt className={styles.detailLabel}>{t('plazaAuditSource')}</dt><dd className={styles.detailValue}>{audit.ownerName ?? '—'} · {visibilityTag(audit).detail}</dd></div>\n <div className={styles.detailRow}><dt className={styles.detailLabel}>{t('plazaAuditVisibility')}</dt><dd className={styles.detailValue}>{visibilityTag(audit).label}</dd></div>\n <div className={styles.detailRow}><dt className={styles.detailLabel}>{t('plazaShowDetail')}</dt><dd className={styles.detailValue}>{audit.description ?? '—'}</dd></div>\n </dl>\n <RiskReportView report={risk} busy={riskBusy} failed={riskFailed} onScan={() => { void runScan(audit) }} t={t} />\n <label className={styles.noteField}>\n <span>{t('plazaReviewNote')}</span>\n <textarea value={reviewNote} placeholder={t('plazaReviewNotePlaceholder')} onChange={(event) => { setReviewNote(event.target.value) }} />\n </label>\n {reviewError === null ? null : <p className={styles.reviewError} role=\"alert\">{reviewError}</p>}\n </div>\n )}\n </Modal>\n </section>\n )\n}\n\n/** Re-exported so the registration site reads the route from one place. */\nexport { SKILL_PLAZA_PATH } from './skill-plaza-client.ts'","import type { CSSProperties } from 'react'\nimport css from './WanxiangBrand.module.css'\n\n/** User-visible platform name shared by the header wordmark and its accessible name. */\nconst BRAND_NAME = '万相AI中台'\nconst HARNESS_PATHS = [\n {\n \"d\": \"M132.848 8.93205H134.08V16.137H132.848V8.93205ZM136.5 8.93205H137.732V16.137H136.5V8.93205ZM133.365 13.024V11.99H137.193V13.024H133.365Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M140.397 14.432L140.672 13.453H143.202L143.532 14.432H140.397ZM140.287 16.137H139.055L141.277 8.93205H142.201L142.146 9.74605L140.947 13.915H140.969L140.287 16.137ZM145.039 16.137H143.741L143.07 13.948L143.081 13.937L141.871 9.74605L141.926 8.93205H142.817L145.039 16.137Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M146.846 8.93205H149.068C149.852 8.93205 150.443 9.11538 150.839 9.48205C151.235 9.84138 151.433 10.3327 151.433 10.956C151.433 11.22 151.396 11.4657 151.323 11.693C151.249 11.9204 151.125 12.1257 150.949 12.309C150.773 12.4924 150.531 12.65 150.223 12.782C149.922 12.9067 149.541 13.0057 149.079 13.079V13.321H146.846V12.639L148.023 12.485C148.631 12.4044 149.09 12.298 149.398 12.166C149.706 12.034 149.915 11.8764 150.025 11.693C150.135 11.5024 150.19 11.2934 150.19 11.066C150.19 10.6994 150.083 10.417 149.871 10.219C149.658 10.021 149.324 9.92205 148.87 9.92205H146.846V8.93205ZM146.395 8.93205H147.627V16.137H146.395V8.93205ZM151.917 16.093V16.137H150.366L149.024 14.322C148.87 14.1094 148.73 13.9407 148.606 13.816C148.481 13.684 148.345 13.5887 148.199 13.53C148.052 13.464 147.872 13.42 147.66 13.398C147.447 13.3687 147.176 13.3504 146.846 13.343V13.145H149.079C149.233 13.211 149.368 13.2844 149.486 13.365C149.61 13.4457 149.735 13.5447 149.86 13.662C149.992 13.7794 150.138 13.937 150.3 14.135L151.917 16.093Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M153.58 9.57005L153.591 8.93205H154.46L157.584 15.51V16.137H156.704L153.58 9.57005ZM158.024 16.137H156.968L156.88 8.93205H158.024V16.137ZM154.24 16.137H153.096V8.93205H154.152L154.24 16.137Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M159.963 8.93205H161.206V16.137H159.963V8.93205ZM160.095 9.96605V8.93205H164.858V9.96605H160.095ZM160.095 16.137V15.103H164.902V16.137H160.095ZM160.095 13.013V11.99H164.374V13.013H160.095Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M169.052 15.257C169.543 15.257 169.895 15.1654 170.108 14.982C170.328 14.7987 170.438 14.5457 170.438 14.223C170.438 14.047 170.405 13.8967 170.339 13.772C170.273 13.6474 170.152 13.5337 169.976 13.431C169.807 13.321 169.558 13.2147 169.228 13.112L168.491 12.881C167.846 12.6757 167.38 12.4044 167.094 12.067C166.808 11.7297 166.665 11.3007 166.665 10.78C166.665 10.428 166.76 10.1017 166.951 9.80105C167.142 9.50038 167.428 9.25838 167.809 9.07505C168.19 8.89172 168.663 8.80005 169.228 8.80005C169.631 8.80005 169.998 8.82938 170.328 8.88805C170.665 8.93938 171.039 9.01638 171.45 9.11905L171.274 10.175C170.834 10.0504 170.442 9.96238 170.097 9.91105C169.76 9.85238 169.463 9.82305 169.206 9.82305C168.737 9.82305 168.403 9.90738 168.205 10.076C168.007 10.2374 167.908 10.439 167.908 10.681C167.908 10.857 167.941 11.0147 168.007 11.154C168.073 11.286 168.19 11.407 168.359 11.517C168.535 11.627 168.784 11.7334 169.107 11.836L169.866 12.078C170.526 12.276 170.995 12.5327 171.274 12.848C171.553 13.156 171.692 13.585 171.692 14.135C171.692 14.5604 171.589 14.9344 171.384 15.257C171.179 15.5797 170.878 15.8327 170.482 16.016C170.093 16.1994 169.609 16.291 169.03 16.291C168.627 16.291 168.212 16.247 167.787 16.159C167.362 16.071 166.9 15.9427 166.401 15.774L166.665 14.718C167.156 14.894 167.6 15.0297 167.996 15.125C168.399 15.213 168.751 15.257 169.052 15.257Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M175.809 15.257C176.3 15.257 176.652 15.1654 176.865 14.982C177.085 14.7987 177.195 14.5457 177.195 14.223C177.195 14.047 177.162 13.8967 177.096 13.772C177.03 13.6474 176.909 13.5337 176.733 13.431C176.564 13.321 176.315 13.2147 175.985 13.112L175.248 12.881C174.603 12.6757 174.137 12.4044 173.851 12.067C173.565 11.7297 173.422 11.3007 173.422 10.78C173.422 10.428 173.517 10.1017 173.708 9.80105C173.899 9.50038 174.185 9.25838 174.566 9.07505C174.947 8.89172 175.42 8.80005 175.985 8.80005C176.388 8.80005 176.755 8.82938 177.085 8.88805C177.422 8.93938 177.796 9.01638 178.207 9.11905L178.031 10.175C177.591 10.0504 177.199 9.96238 176.854 9.91105C176.517 9.85238 176.22 9.82305 175.963 9.82305C175.494 9.82305 175.16 9.90738 174.962 10.076C174.764 10.2374 174.665 10.439 174.665 10.681C174.665 10.857 174.698 11.0147 174.764 11.154C174.83 11.286 174.947 11.407 175.116 11.517C175.292 11.627 175.541 11.7334 175.864 11.836L176.623 12.078C177.283 12.276 177.752 12.5327 178.031 12.848C178.31 13.156 178.449 13.585 178.449 14.135C178.449 14.5604 178.346 14.9344 178.141 15.257C177.936 15.5797 177.635 15.8327 177.239 16.016C176.85 16.1994 176.366 16.291 175.787 16.291C175.384 16.291 174.969 16.247 174.544 16.159C174.119 16.071 173.657 15.9427 173.158 15.774L173.422 14.718C173.913 14.894 174.357 15.0297 174.753 15.125C175.156 15.213 175.508 15.257 175.809 15.257Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n }\n] as const\n\ninterface MarkProps {\n size: number\n className?: string | undefined\n}\n\nfunction classes(...values: Array<string | undefined>): string {\n return values.filter(Boolean).join(' ')\n}\n\nfunction Cube({ transform, className }: { transform: string; className: string }) {\n return (\n <g transform={transform}>\n <g className={className} stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinejoin=\"round\">\n <path d=\"M12 0 24 7 12 14 0 7 12 0Z\" fill=\"none\" />\n <path d=\"M0 7 12 14v16L0 23V7Z\" fill=\"currentColor\" />\n <path d=\"M12 14 24 7v16L12 30V14Z\" fill=\"currentColor\" fillOpacity=\".18\" />\n </g>\n </g>\n )\n}\n\n/** Four linked data units; its ink follows the host surface through currentColor. */\nexport function WanxiangMark({ size, className, animated = false }: MarkProps & { animated?: boolean }) {\n return (\n <svg\n width={size}\n height={(size * 58) / 54}\n className={classes(css.mark, animated ? css.animatedMark : undefined, className)}\n viewBox=\"0 0 54 58\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <Cube className={css.unitTop} transform=\"translate(15 0)\" />\n <Cube className={css.unitLeft} transform=\"translate(0 16)\" />\n <Cube className={css.unitRight} transform=\"translate(30 16)\" />\n <Cube className={css.unitCore} transform=\"translate(15 27)\" />\n </svg>\n )\n}\n\n/**\n * Platform wordmark rendered as text.\n *\n * It used to be glyph artwork for the previous platform name, which cannot express the new\n * name without redrawing every path. Text keeps the visible header, the accessible name, and\n * the browser title on one string, and inherits the host's CJK font stack through `font-family`.\n */\nexport function WanxiangWordmark({ height, accessible = false, className }: {\n height: number\n accessible?: boolean\n className?: string | undefined\n}) {\n return (\n <span\n className={classes(css.wordmark, className)}\n style={{ fontSize: height }}\n {...(accessible ? { role: 'img' as const, 'aria-label': BRAND_NAME } : {})}\n >\n {BRAND_NAME}\n </span>\n )\n}\n\n/** Exact HARNESS badge artwork extracted from the current DSH BrandWordmark. */\nexport function HarnessBadge({ height = 14 }: { height?: number }) {\n const style = { '--dsw-alias-label-primary-inverted': 'var(--dsw-alias-bg-base)' } as CSSProperties\n return (\n <svg\n width={(height * 53) / 15.5}\n height={height}\n className={css.harness}\n viewBox=\"129 5 53 15.5\"\n style={style}\n aria-hidden=\"true\"\n >\n <rect x=\"129.348\" y=\"5.5\" width=\"52\" height=\"14\" rx=\"2\" fill=\"currentColor\" />\n {HARNESS_PATHS.map((path, index) => <path key={index} d={path.d} fill={path.fill} />)}\n </svg>\n )\n}\n\n/** Expanded-sidebar brand name plus the unchanged official HARNESS badge. */\nexport function WanxiangSidebarName() {\n return <span className={css.sidebarName}><WanxiangWordmark height={16} /><HarnessBadge height={14} /></span>\n}\n\n/** Welcome-page logo with four-unit hover motion. */\nexport function WanxiangHeroMark({ size, className }: MarkProps) {\n return <WanxiangMark size={size} className={className} animated />\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport { wanxiangBrandPreference } from './brand-store.ts'\nimport {\n WanxiangHeroMark,\n WanxiangMark,\n WanxiangSidebarName,\n} from './WanxiangBrand.tsx'\n\nconst BRAND_TITLE = '万相AI中台 Harness'\nconst SLOT_PRIORITY = -100\nconst FAVICON_ID = 'dataops-wanxiang-favicon'\nconst FAVICON_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 54 58\"><style>:root{color:#1b1b1d}@media(prefers-color-scheme:dark){:root{color:#f7f7f8}}</style><g transform=\"translate(15 0)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(0 16)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(30 16)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(15 27)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g></svg>`\n\n\nfunction registerWanxiangSlots(ctx: ClientContext): () => void {\n return ctx.slots.inject('sidebar.brand.mark', () =>\n ctx.slots.inject('sidebar.brand.name', () =>\n ctx.slots.inject('conversation.hero.brand.mark', function* () {\n yield ctx.slots.register({\n name: 'sidebar.brand.mark',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangMark)\n yield ctx.slots.register({\n name: 'sidebar.brand.name',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangSidebarName)\n yield ctx.slots.register({\n name: 'conversation.hero.brand.mark',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangHeroMark)\n })))\n}\n\nfunction installFavicon(): HTMLLinkElement {\n const existing = document.getElementById(FAVICON_ID)\n if (existing instanceof HTMLLinkElement) return existing\n const link = document.createElement('link')\n link.id = FAVICON_ID\n link.rel = 'icon'\n link.type = 'image/svg+xml'\n link.href = `data:image/svg+xml,${encodeURIComponent(FAVICON_SVG)}`\n document.head.append(link)\n return link\n}\n\n/** Keep shell slots, browser title, and favicon on the same persisted preference. */\nexport function installWanxiangBranding(ctx: ClientContext): void {\n const originalTitle = document.title\n let disposeSlots: (() => void) | undefined\n let favicon: HTMLLinkElement | undefined\n let titleObserver: MutationObserver | undefined\n\n const stopTitleObserver = (): void => {\n titleObserver?.disconnect()\n titleObserver = undefined\n }\n const keepBrandTitle = (): void => {\n if (document.title !== BRAND_TITLE) document.title = BRAND_TITLE\n if (titleObserver !== undefined) return\n titleObserver = new MutationObserver(() => {\n if (wanxiangBrandPreference.getSnapshot().enabled && document.title !== BRAND_TITLE) {\n document.title = BRAND_TITLE\n }\n })\n titleObserver.observe(document.head, { childList: true, subtree: true, characterData: true })\n }\n\n const synchronize = (): void => {\n const enabled = wanxiangBrandPreference.getSnapshot().enabled\n if (enabled) {\n disposeSlots ??= registerWanxiangSlots(ctx)\n favicon ??= installFavicon()\n keepBrandTitle()\n document.documentElement.dataset.dataopsBrand = 'wanxiang'\n return\n }\n disposeSlots?.()\n disposeSlots = undefined\n favicon?.remove()\n favicon = undefined\n stopTitleObserver()\n document.title = originalTitle\n delete document.documentElement.dataset.dataopsBrand\n }\n\n ctx.effect(() => {\n synchronize()\n const unsubscribe = wanxiangBrandPreference.subscribe(synchronize)\n return () => {\n unsubscribe()\n disposeSlots?.()\n favicon?.remove()\n stopTitleObserver()\n document.title = originalTitle\n delete document.documentElement.dataset.dataopsBrand\n }\n }, 'dataops-managed: Wanxiang shell branding')\n}\n","/**\n * The \"sign in again\" prompt shown when this workspace's DataOps session has ended.\n *\n * The failure it reports used to be invisible. Every DataOps call handles a 401 by degrading to\n * an empty result, which is right for one panel but wrong for the operator: settings, shared\n * models and the skill plaza all render as \"nothing here\" while the real cause is that nobody is\n * signed in any more. This prompt names that state once, with the one action that clears it.\n *\n * It reports and nothing more. It does not retry, expire, or re-authenticate — the portal owns\n * the login form and is the only thing that can issue a session. Its action navigates the parent\n * portal when the frame's ancestor origin is known, and opens the portal separately when the\n * browser blocks top-level navigation from the frame.\n *\n * @module ReloginPrompt\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { AuthState } from '../auth-state.ts'\n\n/** How often to re-read the observed auth state. */\nconst POLL_MS = 15_000\n\n/** What the Host route answers. */\ninterface AuthStateReply {\n readonly state?: unknown\n}\n\n/**\n * Read the observed credential state from the Host.\n *\n * A failed read says nothing about the credential: this route is served by the same process that\n * serves the page, so an unreachable route means the Web server is busy or restarting, not that\n * anyone was signed out. Returning `undefined` keeps a transient error from raising a sign-in\n * prompt, which would be a lie the operator cannot act on.\n *\n * @returns the reported state, or `undefined` when it could not be read.\n */\nconst readAuthState = async (): Promise<AuthState | undefined> => {\n try {\n const response = await fetch(new URL('/integrations/dataops/auth-state', window.location.origin), {\n credentials: 'same-origin',\n })\n if (!response.ok) return undefined\n const body = await response.json() as AuthStateReply\n const state = body.state\n return state === 'expired' || state === 'valid' || state === 'unknown' ? state : undefined\n } catch {\n return undefined\n }\n}\n\n/** The copy this prompt needs, bound by its host surface. */\nexport interface ReloginPromptProps {\n /** Resolve one of the prompt's own strings. */\n readonly t: (key: 'reloginTitle' | 'reloginBody' | 'reloginAction' | 'reloginDismiss') => string\n}\n\n/**\n * Watch for an ended DataOps session and say so.\n *\n * @param props.t - localized copy resolver.\n * @returns the dialog while the session is known to have ended, otherwise `null`.\n */\nexport function ReloginPrompt(props: ReloginPromptProps) {\n const { t } = props\n const [expired, setExpired] = useState(false)\n // Dismissal is per-outage, not permanent: the state stays `expired`, so without this the dialog\n // would reopen on the next poll and trap the operator behind a modal they cannot leave.\n // A session that comes back resets the flag, so the next outage prompts again.\n const [dismissed, setDismissed] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n const tick = async (): Promise<void> => {\n const state = await readAuthState()\n if (cancelled || state === undefined) return\n setExpired(state === 'expired')\n if (state !== 'expired') setDismissed(false)\n }\n void tick()\n const timer = setInterval(() => { void tick() }, POLL_MS)\n return () => {\n cancelled = true\n clearInterval(timer)\n }\n }, [])\n\n const dismiss = useCallback((): void => { setDismissed(true) }, [])\n\n if (!expired || dismissed) return null\n return (\n <Modal\n open\n onClose={dismiss}\n title={t('reloginTitle')}\n closeLabel={t('reloginDismiss')}\n description={t('reloginBody')}\n footer={(\n <>\n <Button onClick={dismiss}>{t('reloginDismiss')}</Button>\n {/* The portal is the only issuer of a new session. Navigate its origin directly;\n cross-origin frames may refuse top-level navigation, so open it separately. */}\n <Button variant=\"primary\" onClick={() => {\n const portalOrigin = window.location.ancestorOrigins?.[0]\n ?? (document.referrer === '' ? undefined : new URL(document.referrer).origin)\n if (portalOrigin === undefined || portalOrigin === window.location.origin) {\n window.location.reload()\n return\n }\n const portalUrl = `${portalOrigin}/`\n try {\n if (window.top !== null && window.top !== window) {\n window.top.location.href = portalUrl\n return\n }\n } catch {\n // Cross-origin top navigation can be blocked; opening the portal is the fallback.\n }\n window.open(portalUrl, '_blank', 'noopener')\n }}>\n {t('reloginAction')}\n </Button>\n </>\n )}\n />\n )\n}\n","// @ts-nocheck\n/**\n * Whether the managed DataOps settings section may be registered at all.\n *\n * Registration is the gate, not a CSS class: an ordinary user's profile should not contain a\n * section whose controls they may not use. The identity record is presentation-only and arrives\n * from the portal after the iframe loads, so the registration follows it instead of reading it\n * once at startup. Authorization still lives in DataOps; this only keeps a forbidden panel out of\n * the interface.\n */\n\n/** The two DataOps role labels allowed to see the managed settings panel. */\nconst MANAGED_SETTINGS_ROLES: ReadonlySet<string> = new Set(['超级管理员', '管理员'])\n\n/** The shared identity record the DataOps account plugin publishes on `window`. */\ninterface DataOpsUserWindow extends Window {\n __DATAOPS_USER__?: { name?: unknown } | null\n __DATAOPS_ACCOUNT_STORE__?: { listeners?: Set<() => void> }\n}\n\n/** The account launcher's visible label, which is painted before the window record settles. */\nfunction domAccountName(): string | null {\n if (typeof document === 'undefined') return null\n // The launcher's label is one short span. Reading `querySelector` is not enough: the same\n // attribute can sit on a full-page wrapper whose text is the entire application, which would\n // never equal a role label. Prefer the shortest non-empty candidate.\n const texts = [...document.querySelectorAll('[data-dataops-account-name]')]\n .map(element => element.textContent?.trim() ?? '')\n .filter(text => text !== '' && text.length <= 30)\n .sort((left, right) => left.length - right.length)\n return texts[0] ?? null\n}\n\n/** Read the current role label without trusting any other field. */\nexport function currentManagedSettingsRole(): string | null {\n if (typeof window === 'undefined') return null\n // The launcher's label is the first identity signal on screen; the window record follows.\n const domName = domAccountName()\n if (domName !== null) return domName\n const name = (window as DataOpsUserWindow).__DATAOPS_USER__?.name\n return typeof name === 'string' && name.trim() !== '' ? name.trim() : null\n}\n\n/** Whether the current identity may see the managed DataOps settings section. */\nexport function canSeeManagedSettings(): boolean {\n const role = currentManagedSettingsRole()\n return role !== null && MANAGED_SETTINGS_ROLES.has(role)\n}\n\n/**\n * Observe identity changes.\n *\n * The account plugin keeps one store on `window`; subscribing to its listener set catches the\n * in-page update even before the portal's DOM event. The event is kept as a second signal because\n * a future portal may publish the event without touching the store this plugin reads.\n */\nexport function subscribeManagedSettingsVisibility(listener: () => void): () => void {\n if (typeof window === 'undefined') return () => {}\n const store = (window as DataOpsUserWindow).__DATAOPS_ACCOUNT_STORE__\n store?.listeners?.add(listener)\n window.addEventListener('dataops-account:changed', listener)\n\n /**\n * The first identity can arrive before this module subscribes (or replace the account store\n * object), which is why the sidebar used to show only the sections whose gate happened to run\n * later. The launcher's label is a DOM fact either way, so watch it as the fallback signal.\n */\n let observed = domAccountName()\n const observer = typeof MutationObserver === 'undefined' || typeof document === 'undefined'\n ? undefined\n : new MutationObserver(() => {\n const next = domAccountName()\n if (next === observed) return\n observed = next\n listener()\n })\n observer?.observe(document.documentElement, {\n subtree: true,\n childList: true,\n characterData: true,\n attributes: true,\n attributeFilter: ['data-dataops-account-name'],\n })\n // Reconcile once after the current frame, when the first paint (and its label) is complete.\n if (observed !== null) queueMicrotask(listener)\n\n return () => {\n store?.listeners?.delete(listener)\n window.removeEventListener('dataops-account:changed', listener)\n observer?.disconnect()\n }\n}\n","/** Pure helpers shared by the permission-centre combobox and resource details. */\n\n/** One selectable option. */\nexport interface ComboboxOption {\n readonly value: string\n readonly label: string\n readonly hint?: string\n}\n\n/**\n * Filter options by display label or code hint, case-insensitively.\n * @param options - all options.\n * @param query - typed search text.\n */\nexport function filterComboboxOptions(options: readonly ComboboxOption[], query: string): ComboboxOption[] {\n const needle = query.trim().toLowerCase()\n if (needle === '') return [...options]\n return options.filter(option => option.label.toLowerCase().includes(needle)\n || (option.hint ?? '').toLowerCase().includes(needle))\n}\n\n/** Keep an active index inside a possibly empty result list. */\nexport function clampActiveIndex(index: number, length: number): number {\n if (length <= 0) return 0\n return Math.max(0, Math.min(length - 1, index))\n}\n\n/** Owner cell face: a real display name, or a dash; never the raw id. */\nexport function ownerDisplay(ownerName: string | undefined | null): string {\n const name = ownerName?.trim()\n return name === undefined || name === '' ? '—' : name\n}\n","import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Button, IconRefreshOutlineRegular, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { en } from './locales.ts'\nimport {\n createDepartment,\n deleteDepartment,\n fetchRbacOverview,\n fetchReviewContext,\n reviewDemoMode,\n saveRbacSection,\n updateDepartment,\n type DepartmentRow,\n type MemberRow,\n type RbacOverview,\n type ResourceScopeRow,\n type RoleMatrixRow,\n} from './review-client.ts'\nimport type { PortalRole, ReviewContext } from './review-types.ts'\nimport { canManagePermissions } from './review-types.ts'\nimport { canSeeManagedSettings, currentManagedSettingsRole } from './settings-gate.ts'\nimport { demoRbacOverview } from './review-demo.ts'\nimport styles from './PermissionCenterSection.module.css'\nimport { clampActiveIndex, filterComboboxOptions, ownerDisplay, type ComboboxOption } from './combobox.ts'\n\n/** The four tabs of the permission centre. */\ntype PermissionTab = 'roles' | 'members' | 'departments' | 'resources'\n\n/** Props accepted by the page. */\nexport interface PermissionCenterSectionProps {\n t?: (key: keyof typeof en) => string\n}\n\n/** How many rows one page of the members/resources tables shows. */\nconst PAGE_SIZE = 10\n\n/**\n * The permission centre.\n *\n * Every write goes through `saveRbacSection`; the backend enforces the same role/scope rules\n * the disabled controls represent. The page keeps target-aware state explicitly (actor role,\n * actor department) so an ADMIN cannot edit a SUPER_ADMIN row and a DEPT_ADMIN cannot reach\n * another department, even if a list payload is wider than expected.\n */\nexport function PermissionCenterSection({ t }: PermissionCenterSectionProps): ReactNode {\n const [context, setContext] = useState<ReviewContext | null | undefined>(undefined)\n const [overview, setOverview] = useState<RbacOverview | null | undefined>(undefined)\n const [tab, setTab] = useState<PermissionTab>('roles')\n const [notice, setNotice] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const [deptDialog, setDeptDialog] = useState<DepartmentRow | null>(null)\n const [deptSearch, setDeptSearch] = useState('')\n const [deptSelected, setDeptSelected] = useState<string[]>([])\n const [deptSaving, setDeptSaving] = useState(false)\n const [deptError, setDeptError] = useState<string | null>(null)\n const [deptForm, setDeptForm] = useState<{ mode: 'create' | 'edit'; parentCode?: string | null; department?: DepartmentRow } | null>(null)\n const demo = reviewDemoMode()\n\n const load = useCallback(async () => {\n const nextContext = await fetchReviewContext()\n setContext(nextContext)\n if (nextContext === null && !demo) { setOverview(null); return }\n try {\n setOverview(demo ? demoRbacOverview() : await fetchRbacOverview())\n } catch {\n setOverview(null)\n }\n }, [demo])\n\n useEffect(() => { void load() }, [load])\n\n if (t === undefined) return null\n if (context === undefined || overview === undefined) return null\n\n // The launcher label is authoritative for the two administrator roles. A null review context\n // means the review API has not shipped yet, not that the caller is unauthorised: show the page\n // skeleton with the waiting note instead of a false \"no access\" screen.\n const knownAdmin = canSeeManagedSettings()\n const denied = context !== null\n ? (context.role !== 'SUPER_ADMIN' && context.role !== 'ADMIN' && context.role !== 'DEPT_ADMIN' && !knownAdmin)\n : !knownAdmin\n if (denied) return <section className={styles.page}><p className={styles.empty}>{t('permNoAccess')}</p></section>\n\n const roleName = context === null ? (currentManagedSettingsRole() ?? '—') : roleLabel(context.role)\n const departmentName = context?.departmentPath?.join(' / ') ?? '—'\n const actorRole: PortalRole = context?.role ?? (knownAdmin ? 'ADMIN' : 'APP_USER')\n const writable = context === null ? knownAdmin : (canManagePermissions(context) || demo)\n const superAdmin = context === null ? knownAdmin : context.role === 'SUPER_ADMIN' || demo\n const canAssignDepartment = writable && (superAdmin || actorRole === 'ADMIN')\n const labels: { key: PermissionTab; label: string }[] = [\n { key: 'roles', label: t('permTabRoles') },\n { key: 'members', label: t('permTabMembers') },\n { key: 'departments', label: t('permTabDepartments') },\n { key: 'resources', label: t('permTabResources') },\n ]\n\n const save = async (section: PermissionTab, value: unknown): Promise<{ ok: boolean; reason?: string }> => {\n setBusy(true)\n setNotice(null)\n try {\n const result = await saveRbacSection(section, value)\n setNotice(result.ok ? t('permSaved') : (result.reason ?? t('permWaiting')))\n if (result.ok) await load()\n return result\n } catch {\n setNotice(t('permSaveFailed'))\n return { ok: false, reason: t('permSaveFailed') }\n } finally {\n setBusy(false)\n }\n }\n\n const saveRoleChanges = async (changes: readonly { roleCode: string; permissionKeys: string[] }[]): Promise<{ ok: boolean; reason?: string }> => {\n setBusy(true)\n setNotice(null)\n try {\n for (const change of changes) {\n const result = await saveRbacSection('roles', { roleCode: change.roleCode, permissionKeys: change.permissionKeys })\n if (!result.ok) {\n setNotice(result.reason ?? t('permSaveFailed'))\n await load()\n return result\n }\n }\n setNotice(t('permSaved'))\n await load()\n return { ok: true }\n } catch {\n setNotice(t('permSaveFailed'))\n return { ok: false, reason: t('permSaveFailed') }\n } finally {\n setBusy(false)\n }\n }\n\n const openDepartment = (department: DepartmentRow): void => {\n setDeptDialog(department)\n setDeptSelected(department.deptAdmins?.map(admin => admin.userId) ?? [])\n setDeptSearch('')\n setDeptError(null)\n }\n\n const assignDepartment = async (userIds: string[]): Promise<void> => {\n if (deptDialog === null || deptSaving) return\n setDeptSaving(true)\n setDeptError(null)\n try {\n const result = await saveRbacSection('departments', { code: deptDialog.code, userIds })\n if (!result.ok) {\n setDeptError(result.reason ?? '保存失败:后端拒绝或无权限(403)。')\n return\n }\n setDeptDialog(null)\n setNotice('部门管理员已更新。')\n await load()\n } catch {\n setDeptError('保存失败:后端拒绝或无权限(403)。')\n } finally {\n setDeptSaving(false)\n }\n }\n\n const removeDepartment = async (department: DepartmentRow): Promise<void> => {\n const children = overview?.departments.filter(row => row.parentCode === department.code).length ?? 0\n const members = department.memberCount ?? 0\n if (!window.confirm('确认删除部门「' + department.name + '」?\\n成员 ' + String(members) + ' 人,子部门 ' + String(children) + ' 个;删除后不可恢复。')) return\n const result = await deleteDepartment(department.code)\n if (!result.ok) {\n setNotice(result.reason ?? '删除失败:后端拒绝或无权限(403)。')\n return\n }\n setNotice('部门已删除。')\n await load()\n }\n\n const candidates = deptDialog === null || overview === null ? [] : overview.members.filter(member => {\n const pathCodes = member.departmentPath?.map(entry => entry.code) ?? []\n return member.departmentCode === deptDialog.code || pathCodes.includes(deptDialog.code)\n }).filter(member => {\n const needle = deptSearch.trim().toLowerCase()\n return needle === '' || member.displayName.toLowerCase().includes(needle) || member.username.toLowerCase().includes(needle)\n })\n\n return (\n <section className={styles.page} data-permission-center=\"\">\n <header className={styles.head}>\n <div>\n <h1 className={styles.title}>{t('permTitle')}</h1>\n <p className={styles.subtitle}>\n {roleName} · {departmentName}\n {demo ? <span className={styles.demo}>{t('permDemo')}</span> : null}\n </p>\n </div>\n <Button variant=\"outline\" size=\"sm\" icon={<IconRefreshOutlineRegular size={16} />} onClick={() => { void load() }}>刷新</Button>\n </header>\n\n <div className={styles.tabs} role=\"tablist\" aria-label={t('permTitle')}>\n {labels.map(item => (\n <button\n key={item.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === item.key}\n className={tab === item.key ? styles.tab + ' ' + styles.tabActive : styles.tab}\n onClick={() => { setTab(item.key) }}\n >\n {item.label}\n </button>\n ))}\n </div>\n\n {notice === null ? null : <p className={styles.notice}>{notice}</p>}\n {overview === null ? <p className={styles.waiting}>{t('permWaiting')}</p> : (\n <>\n {tab === 'roles' ? <RoleMatrix roles={overview.matrix.roles} permissions={overview.matrix.permissions} writable={writable} actorRole={actorRole} busy={busy} t={t} onSaveAll={saveRoleChanges} /> : null}\n {tab === 'members' ? <Members members={overview.members} writable={writable} actorRole={actorRole} actorUserId={context?.userId} actorDepartmentCode={context?.departmentCode} busy={busy} t={t} onSave={(userId, roleCodes) => { void save('members', { userId, roleCodes }) }} /> : null}\n {tab === 'departments' ? <Departments departments={overview.departments} writable={writable} canAssign={canAssignDepartment} canWrite={writable && (superAdmin || actorRole === 'ADMIN')} t={t} onAssign={openDepartment} onAdd={(parentCode) => { setDeptForm({ mode: 'create', parentCode }) }} onEdit={(department) => { setDeptForm({ mode: 'edit', department }) }} onDelete={(department) => { void removeDepartment(department) }} /> : null}\n {tab === 'resources' ? <Resources resources={overview.resources} departments={overview.departments} writable={writable} actorRole={actorRole} actorDepartmentCode={context?.departmentCode} busy={busy} t={t} onSave={(row, visibility, departmentCode) => save('resources', { kind: row.kind, id: row.id, visibility, departmentCode })} /> : null}\n </>\n )}\n\n <Modal\n open={deptDialog !== null}\n onClose={() => { if (!deptSaving) setDeptDialog(null) }}\n title={deptDialog === null ? '分配部门管理员' : '分配管理员 · ' + deptDialog.name}\n closeLabel=\"取消\"\n className={styles.dialog as string}\n footer={(\n <div className={styles.dialogFooter}>\n <Button variant=\"outline\" disabled={deptSaving} onClick={() => { if (deptDialog !== null) void assignDepartment([]) }}>清空</Button>\n <Button variant=\"outline\" disabled={deptSaving} onClick={() => { setDeptDialog(null) }}>取消</Button>\n <Button variant=\"primary\" disabled={deptSaving} onClick={() => { void assignDepartment(deptSelected) }}>保存</Button>\n </div>\n )}\n >\n {deptDialog === null ? null : (\n <div className={styles.dialogBody}>\n <p className={styles.dialogHint}>当前管理员:{deptDialog.deptAdmins?.length === 0 || deptDialog.deptAdmins === undefined ? '未设置' : deptDialog.deptAdmins.map(admin => admin.displayName).join('、')}</p>\n <input className={styles.search} value={deptSearch} placeholder=\"搜索本部门成员…\" onChange={(event) => { setDeptSearch(event.target.value) }} />\n <ul className={styles.candidates}>\n {candidates.length === 0 ? <li className={styles.muted}>没有可选成员(后端可能只允许本部门/未分配用户)。</li> : candidates.map(member => (\n <li key={member.userId}>\n <label className={styles.candidate}>\n <input\n type=\"checkbox\"\n checked={deptSelected.includes(member.userId)}\n onChange={(event) => {\n setDeptSelected(current => event.target.checked\n ? [...current, member.userId]\n : current.filter(id => id !== member.userId))\n }}\n />\n <span>{member.displayName}</span>\n <span className={styles.muted}>@{member.username} · {member.departmentPath?.map(entry => entry.name).join(' / ') ?? '—'}</span>\n </label>\n </li>\n ))}\n </ul>\n {deptError === null ? null : <p className={styles.error} role=\"alert\">{deptError}</p>}\n </div>\n )}\n </Modal>\n\n <DepartmentFormDialog\n state={deptForm}\n departments={overview?.departments ?? []}\n t={t}\n onClose={() => { setDeptForm(null) }}\n onSaved={async () => { setDeptForm(null); setNotice('部门已保存。'); await load() }}\n />\n </section>\n )\n}\n\nfunction RoleMatrix({ roles, permissions, writable, actorRole, busy, t, onSaveAll }: {\n roles: readonly RoleMatrixRow[]\n permissions: readonly { key: string; name: string; group: string; scope?: string; description?: string }[]\n writable: boolean\n actorRole: PortalRole\n busy: boolean\n t: (key: keyof typeof en) => string\n onSaveAll: (changes: readonly { roleCode: string; permissionKeys: string[] }[]) => Promise<{ ok: boolean; reason?: string }>\n}): ReactNode {\n const visibleRoles = useMemo(() => roles\n .filter(role => role.systemKey === 'SUPER_ADMIN' || role.systemKey === 'ADMIN' || role.systemKey === 'DEPT_ADMIN' || role.systemKey === 'APP_USER'\n || role.code === '超级管理员' || role.code === '管理员' || role.code === '部门管理员' || role.code === '应用人员' || role.code === '普通用户')\n .map(role => (role.systemKey === 'APP_USER' || role.code === '应用人员' || role.code === '普通用户') ? { ...role, name: '普通用户' } : role), [roles])\n const groups = useMemo(() => {\n const hasSkill = permissions.some(point => point.group === 'skill' || point.group === '技能中心')\n const keyOf = (group: string): 'kb' | 'skill' | 'workflow' | 'automation' | null => {\n const raw = group.trim().toLowerCase()\n if (raw === 'kb' || raw === 'knowledge' || group === '知识库') return 'kb'\n if (raw === 'skill' || group === '技能中心') return 'skill'\n if (raw === 'workflow' || group === '工作流广场') return 'workflow'\n if (raw === 'automation' || group === '自动化任务') return 'automation'\n // Compatibility while task-70's catalogue is rolling out: legacy `ai` stands in for\n // the skill group only when no dedicated `skill` group is present.\n if (raw === 'ai' && !hasSkill) return 'skill'\n return null\n }\n const defs: { key: 'kb' | 'skill' | 'workflow' | 'automation'; label: string }[] = [\n { key: 'kb', label: '知识库' },\n { key: 'skill', label: '技能中心' },\n { key: 'workflow', label: '工作流广场' },\n { key: 'automation', label: '自动化任务' },\n ]\n return defs.map(def => ({ ...def, points: permissions.filter(point => keyOf(point.group) === def.key) })).filter(group => group.points.length > 0)\n }, [permissions])\n const visiblePermissions = useMemo(() => groups.flatMap(group => group.points), [groups])\n const [draft, setDraft] = useState<Record<string, Set<string>>>(() => Object.fromEntries(visibleRoles.map(role => [role.code, new Set(role.permissions)])))\n const [dirty, setDirty] = useState<Set<string>>(() => new Set())\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [copiedKey, setCopiedKey] = useState<string | null>(null)\n\n const copyKey = async (key: string): Promise<void> => {\n try { await navigator.clipboard.writeText(key) } catch { /* Clipboard may be unavailable in an iframe. */ }\n setCopiedKey(key)\n window.setTimeout(() => { setCopiedKey(current => current === key ? null : current) }, 1600)\n }\n\n useEffect(() => {\n setDraft(Object.fromEntries(visibleRoles.map(role => [role.code, new Set(role.permissions)])))\n setDirty(new Set())\n }, [visibleRoles])\n\n const isSuperRole = (code: string): boolean => code === 'SUPER_ADMIN' || code === '超级管理员'\n const isDepartmentRole = (code: string): boolean => code === 'DEPT_ADMIN' || code === '部门管理员'\n const isAppRole = (code: string): boolean => code === 'APP_USER' || code === '应用人员' || code === '普通用户'\n const globalScope = (point: { key: string; scope?: string }): boolean => point.scope === 'global' || point.scope === 'GLOBAL'\n || point.key === 'skill:review:global' || point.key === 'workflow:review:global'\n const locked = (roleCode: string, point: { key: string; scope?: string }): boolean => {\n if (!writable || actorRole !== 'SUPER_ADMIN') return true\n // Global points are only assignable to the two administrator roles; SUPER_ADMIN remains\n // editable for the actor who already holds it, while DEPT_ADMIN/APP_USER are read-only.\n return globalScope(point) && (isDepartmentRole(roleCode) || isAppRole(roleCode))\n }\n\n return (\n <div className={styles.panel}>\n <h2 className={styles.sectionTitle}>{t('permRoleMatrix')}</h2>\n <div className={styles.matrixScroll}>\n <table className={styles.matrix}>\n <thead>\n <tr>\n <th>{t('permPermissionModule')}</th>\n <th>{t('permPermissionPoint')}</th>\n {visibleRoles.map(role => <th key={role.code}>{role.name}</th>)}\n </tr>\n </thead>\n <tbody>\n {groups.map(group => (\n <Fragment key={group.key}>\n {group.points.map((point, pointIndex) => {\n const global = globalScope(point)\n return (\n <tr key={point.key}>\n {pointIndex === 0 ? (\n <th scope=\"rowgroup\" rowSpan={group.points.length} className={styles.matrixModule}>{group.label}</th>\n ) : null}\n <th scope=\"row\" className={styles.matrixPermission}>\n <button type=\"button\" className={styles.permCopy} title={point.key} onClick={() => { void copyKey(point.key) }}>\n <span>{point.name}</span>\n <span className={styles.scopeBadge} data-scope={global ? 'global' : 'department'}>{global ? '全局' : '部门级'}</span>\n {copiedKey === point.key ? <span className={styles.copied}>已复制</span> : null}\n </button>\n {point.description === undefined ? null : <span className={styles.permDescription}>{point.description}</span>}\n </th>\n {visibleRoles.map(role => (\n <td key={role.code}>\n <label className={styles.permission}>\n <input\n type=\"checkbox\"\n checked={draft[role.code]?.has(point.key) === true}\n disabled={locked(role.code, point) || busy}\n onChange={(event) => {\n setDraft(current => {\n const next = new Set(current[role.code] ?? [])\n if (event.target.checked) next.add(point.key)\n else next.delete(point.key)\n return { ...current, [role.code]: next }\n })\n setDirty(current => new Set(current).add(role.code))\n }}\n />\n {global && (isDepartmentRole(role.code) || isAppRole(role.code))\n ? <span className={styles.onlyAdmin}>仅管理员</span>\n : null}\n </label>\n </td>\n ))}\n </tr>\n )\n })}\n </Fragment>\n ))}\n </tbody>\n </table>\n </div>\n <div className={styles.panelFoot}>\n {error === null ? null : <span className={styles.error}>{error}</span>}\n {actorRole !== 'SUPER_ADMIN' ? <span className={styles.readOnly}>{t('permSuperAdminOnly')}</span> : null}\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={dirty.size === 0 || busy || saving}\n onClick={() => {\n setSaving(true)\n setError(null)\n const changes = visibleRoles.filter(role => dirty.has(role.code)).map(role => ({ roleCode: role.code, permissionKeys: [...(draft[role.code] ?? [])] }))\n void onSaveAll(changes).then(result => {\n if (result.ok) { setDirty(new Set()); setError(null) }\n else setError(result.reason ?? t('permSaveFailed'))\n }).finally(() => { setSaving(false) })\n }}\n >\n {t('permSave')}{dirty.size === 0 ? '' : ' (' + String(dirty.size) + ')'}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction Members({ members, writable, actorRole, actorUserId, actorDepartmentCode, busy, t, onSave }: {\n members: readonly MemberRow[]\n writable: boolean\n actorRole: PortalRole\n actorUserId?: string\n actorDepartmentCode?: string\n busy: boolean\n t: (key: keyof typeof en) => string\n onSave: (userId: string, roleCodes: string[]) => void\n}): ReactNode {\n const [page, setPage] = useState(0)\n const protectedMember = (member: MemberRow): boolean => member.roleCodes.some(code => {\n if (code === 'SUPER_ADMIN' || code === '超级管理员' || code === 'ADMIN' || code === '管理员') return true\n // A department administrator may not touch another department administrator.\n return actorRole === 'DEPT_ADMIN' && (code === 'DEPT_ADMIN' || code === '部门管理员')\n })\n const superCount = members.filter(member => member.roleCodes.some(code => code === 'SUPER_ADMIN' || code === '超级管理员')).length\n const inScope = (member: MemberRow): boolean => actorRole === 'SUPER_ADMIN' || actorRole === 'ADMIN'\n || member.departmentCode === actorDepartmentCode\n || member.departmentPath?.some(entry => entry.code === actorDepartmentCode) === true\n const pages = Math.max(1, Math.ceil(members.length / PAGE_SIZE))\n const visible = members.slice(page * PAGE_SIZE, page * PAGE_SIZE + PAGE_SIZE)\n return (\n <div className={styles.panel}>\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <thead><tr><th>{t('permMember')}</th><th>{t('permDepartment')}</th><th>{t('permRole')}</th></tr></thead>\n <tbody>\n {visible.map(member => {\n const isProtected = protectedMember(member)\n const scoped = inScope(member)\n const isSelf = actorUserId !== undefined && member.userId === actorUserId\n const lastSuper = superCount <= 1 && member.roleCodes.some(code => code === 'SUPER_ADMIN' || code === '超级管理员')\n const locked = !writable || !scoped || isSelf || lastSuper || (actorRole !== 'SUPER_ADMIN' && isProtected)\n return (\n <tr key={member.userId} data-locked={locked}>\n <td><strong>{member.displayName}</strong><span className={styles.muted}> @{member.username}</span>{isProtected && actorRole !== 'SUPER_ADMIN' ? <span className={styles.protected}>受保护</span> : null}{isSelf ? <span className={styles.protected}>本人</span> : null}{lastSuper ? <span className={styles.protected}>最后一个超管</span> : null}{!scoped ? <span className={styles.protected}>越界</span> : null}</td>\n <td>{member.departmentPath?.map(entry => entry.name).join(' / ') ?? '—'}</td>\n <td>\n <select\n value={member.roleCodes[0] ?? 'APP_USER'}\n disabled={locked || busy}\n onChange={(event) => {\n if (window.confirm('确认修改该成员的角色?')) onSave(member.userId, [event.target.value])\n }}\n >\n {(actorRole === 'SUPER_ADMIN'\n ? ['超级管理员', '管理员', '部门管理员', '运营人员', '应用人员']\n : ['部门管理员', '运营人员', '应用人员']).map(role => <option key={role} value={role}>{role}</option>)}\n </select>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n <Pager page={page} pages={pages} onChange={setPage} />\n </div>\n )\n}\n\nfunction Departments({ departments, writable, canAssign, canWrite, t, onAssign, onAdd, onEdit, onDelete }: {\n departments: readonly DepartmentRow[]\n writable: boolean\n canAssign: boolean\n canWrite: boolean\n t: (key: keyof typeof en) => string\n onAssign: (department: DepartmentRow) => void\n onAdd: (parentCode: string | null) => void\n onEdit: (department: DepartmentRow) => void\n onDelete: (department: DepartmentRow) => void\n}): ReactNode {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set(departments.map(department => department.code)))\n const byParent = useMemo(() => {\n const map = new Map<string | null, DepartmentRow[]>()\n const codes = new Set(departments.map(department => department.code))\n for (const department of departments) {\n const parent = department.parentCode !== undefined && department.parentCode !== null && codes.has(department.parentCode) ? department.parentCode : null\n map.set(parent, [...(map.get(parent) ?? []), department])\n }\n for (const list of map.values()) list.sort((left, right) => left.name.localeCompare(right.name, 'zh-CN') || left.code.localeCompare(right.code))\n return map\n }, [departments])\n\n const node = (department: DepartmentRow, depth: number): ReactNode => {\n const children = byParent.get(department.code) ?? []\n const open = expanded.has(department.code)\n return (\n <li key={department.code} className={styles.treeNode}>\n <div className={styles.treeRow} style={{ paddingLeft: String(8 + depth * 18) + 'px' }}>\n {children.length === 0 ? <span className={styles.treeSpacer} /> : (\n <button\n type=\"button\"\n className={styles.treeToggle}\n aria-label={open ? '折叠' : '展开'}\n onClick={() => {\n setExpanded(current => {\n const next = new Set(current)\n if (next.has(department.code)) next.delete(department.code)\n else next.add(department.code)\n return next\n })\n }}\n >{open ? '▾' : '▸'}</button>\n )}\n <strong className={styles.treeName}>{department.name}</strong>\n <span className={styles.muted}>{department.code} · {department.memberCount ?? 0} 人</span>\n <span className={styles.deptAdmins}>\n {department.deptAdmins?.length === 0 || department.deptAdmins === undefined ? null\n : department.deptAdmins.map(admin => <span key={admin.userId} className={styles.adminTag}>{admin.displayName}</span>)}\n </span>\n <span className={styles.treeActions}>\n {canAssign ? <Button variant=\"ghost\" size=\"sm\" disabled={!writable} onClick={() => { onAssign(department) }}>分配管理员</Button> : null}\n {canWrite ? <Button variant=\"ghost\" size=\"sm\" onClick={() => { onAdd(department.code) }}>+ 子部门</Button> : null}\n {canWrite ? <Button variant=\"ghost\" size=\"sm\" onClick={() => { onEdit(department) }}>编辑</Button> : null}\n {canWrite ? <Button variant=\"ghost\" size=\"sm\" onClick={() => { onDelete(department) }}>删除</Button> : null}\n </span>\n </div>\n {children.length > 0 && open ? <ul className={styles.treeChildren}>{children.map(child => node(child, depth + 1))}</ul> : null}\n </li>\n )\n }\n\n return (\n <div className={styles.panel}>\n <div className={styles.panelHead}>\n <h2 className={styles.sectionTitle}>{t('permTabDepartments')}</h2>\n {canWrite ? <Button variant=\"outline\" size=\"sm\" onClick={() => { onAdd(null) }}>新增部门</Button> : null}\n </div>\n <ul className={styles.treeRoot}>\n {(byParent.get(null) ?? []).map(department => node(department, 0))}\n </ul>\n {departments.length === 0 ? <p className={styles.muted}>暂无部门。</p> : null}\n </div>\n )\n}\n\n/** Create/edit dialog for one department. */\nfunction DepartmentFormDialog({ state, departments, t, onClose, onSaved }: {\n state: { mode: 'create' | 'edit'; parentCode?: string | null; department?: DepartmentRow } | null\n departments: readonly DepartmentRow[]\n t: (key: keyof typeof en) => string\n onClose: () => void\n onSaved: () => Promise<void>\n}): ReactNode {\n const [code, setCode] = useState('')\n const [name, setName] = useState('')\n const [parentCode, setParentCode] = useState('')\n const [description, setDescription] = useState('')\n const [owner, setOwner] = useState('')\n const [enabled, setEnabled] = useState(true)\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (state === null) return\n setCode(state.department?.code ?? '')\n setName(state.department?.name ?? '')\n setParentCode(state.parentCode ?? state.department?.parentCode ?? '')\n setDescription(state.department?.description ?? '')\n setOwner(state.department?.owner ?? '')\n setEnabled(state.department?.enabled !== false)\n setError(null)\n }, [state])\n\n if (state === null) return null\n const editing = state.mode === 'edit'\n const blocked = new Set<string>()\n if (editing && state.department !== undefined) {\n blocked.add(state.department.code)\n let changed = true\n while (changed) {\n changed = false\n for (const department of departments) {\n if (department.parentCode !== undefined && department.parentCode !== null && blocked.has(department.parentCode) && !blocked.has(department.code)) {\n blocked.add(department.code)\n changed = true\n }\n }\n }\n }\n\n const submit = async (): Promise<void> => {\n if (saving) return\n setSaving(true)\n setError(null)\n try {\n const result = editing && state.department !== undefined\n ? await updateDepartment({ code: state.department.code, name, parentCode: parentCode === '' ? null : parentCode, description, owner, enabled, updatedAt: state.department.updatedAt })\n : await createDepartment({ code: code.trim(), name: name.trim(), parentCode: parentCode === '' ? null : parentCode, description, owner, enabled })\n if (!result.ok) {\n setError(result.reason ?? '保存失败:后端拒绝或无权限(403)。')\n return\n }\n await onSaved()\n } catch {\n setError('保存失败:网络或后端异常。')\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <Modal\n open\n onClose={() => { if (!saving) onClose() }}\n title={editing ? '编辑部门' : '新增部门'}\n closeLabel=\"取消\"\n className={styles.dialog as string}\n footer={(\n <div className={styles.dialogFooter}>\n <Button variant=\"outline\" disabled={saving} onClick={onClose}>取消</Button>\n <Button variant=\"primary\" disabled={saving} onClick={() => { void submit() }}>保存</Button>\n </div>\n )}\n >\n <div className={styles.dialogBody}>\n <label className={styles.field}><span>部门编码</span><input value={code} disabled={editing} placeholder=\"例如 marketing\" onChange={event => { setCode(event.target.value) }} /></label>\n <label className={styles.field}><span>部门名称</span><input value={name} placeholder=\"例如 市场部\" onChange={event => { setName(event.target.value) }} /></label>\n <label className={styles.field}><span>上级部门</span>\n <SearchCombobox\n t={t}\n value={parentCode}\n ariaLabel=\"上级部门\"\n placeholder={t('permNone')}\n options={[{ value: '', label: t('permNone') }, ...departments.filter(department => !blocked.has(department.code)).map(department => ({ value: department.code, label: department.name, hint: department.code }))]}\n onChange={setParentCode}\n />\n </label>\n <label className={styles.field}><span>描述</span><input value={description} onChange={event => { setDescription(event.target.value) }} /></label>\n <label className={styles.field}><span>负责人</span><input value={owner} onChange={event => { setOwner(event.target.value) }} /></label>\n <label className={styles.candidate}><input type=\"checkbox\" checked={enabled} onChange={event => { setEnabled(event.target.checked) }} /><span>启用</span></label>\n {error === null ? null : <p className={styles.error} role=\"alert\">{error}</p>}\n </div>\n </Modal>\n )\n}\n\nfunction Resources({ resources, departments, writable, actorRole, actorDepartmentCode, busy, t, onSave }: {\n resources: readonly ResourceScopeRow[]\n departments: readonly DepartmentRow[]\n writable: boolean\n actorRole: PortalRole\n actorDepartmentCode?: string\n busy: boolean\n t: (key: keyof typeof en) => string\n onSave: (row: ResourceScopeRow, visibility: ResourceScopeRow['visibility'], departmentCode: string | null) => Promise<{ ok: boolean; reason?: string }>\n}): ReactNode {\n const [page, setPage] = useState(0)\n const [draft, setDraft] = useState<Record<string, { visibility: ResourceScopeRow['visibility']; departmentCode: string | null }>>({})\n const [error, setError] = useState<string | null>(null)\n const [detail, setDetail] = useState<ResourceScopeRow | null>(null)\n const pages = Math.max(1, Math.ceil(resources.length / PAGE_SIZE))\n const visible = resources.slice(page * PAGE_SIZE, page * PAGE_SIZE + PAGE_SIZE)\n const departmentOptions = actorRole === 'DEPT_ADMIN'\n ? departments.filter(department => department.code === actorDepartmentCode\n || department.path?.some(entry => entry.code === actorDepartmentCode) === true)\n : departments\n const keyOf = (row: ResourceScopeRow): string => row.kind + ':' + String(row.id)\n const valueOf = (row: ResourceScopeRow) => draft[keyOf(row)] ?? { visibility: row.visibility, departmentCode: row.departmentCode ?? null }\n const visibilityLabel = (visibility: ResourceScopeRow['visibility']): string => visibility === 'global'\n ? t('permGlobal')\n : visibility === 'department' ? t('permDepartmentScope') : t('permPrivate')\n const statusLabel = (status: ResourceScopeRow['reviewStatus']): string => status === 'pending'\n ? t('permStatusPending')\n : status === 'approved' ? t('permStatusApproved') : status === 'rejected' ? t('permStatusRejected') : '—'\n const departmentName = (code: string | null | undefined): string => code === null || code === undefined\n ? '—' : departments.find(department => department.code === code)?.name ?? code\n return (\n <div className={styles.panel}>\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <thead>\n <tr>\n <th>{t('permType')}</th>\n <th>{t('permName')}</th>\n <th>{t('permOwner')}</th>\n <th>{t('permScope')}</th>\n <th>{t('permDepartment')}</th>\n <th>{t('permOperations')}</th>\n </tr>\n </thead>\n <tbody>\n {visible.map(row => {\n const key = keyOf(row)\n const value = valueOf(row)\n const visibilityOptions = actorRole === 'DEPT_ADMIN' ? ['department', 'private'] : ['global', 'department', 'private']\n return (\n <tr key={key}>\n <td>{row.kind === 'skill' ? t('permResourceSkill') : t('permResourceWorkflow')}</td>\n <td><strong>{row.name}</strong></td>\n <td>{ownerDisplay(row.ownerName)}</td>\n <td>\n <SearchCombobox\n t={t}\n value={value.visibility}\n ariaLabel={t('permScope')}\n placeholder={t('permSelect')}\n disabled={!writable || busy}\n options={visibilityOptions.map(option => ({ value: option, label: visibilityLabel(option as ResourceScopeRow['visibility']) }))}\n onChange={(next) => {\n const visibility = next as ResourceScopeRow['visibility']\n setDraft(current => ({ ...current, [key]: { visibility, departmentCode: visibility === 'department' ? (current[key]?.departmentCode ?? row.departmentCode ?? actorDepartmentCode ?? null) : null } }))\n }}\n />\n </td>\n <td>\n <SearchCombobox\n t={t}\n value={value.departmentCode ?? ''}\n ariaLabel={t('permDepartment')}\n placeholder={t('permNone')}\n disabled={!writable || busy || value.visibility !== 'department' || actorRole === 'DEPT_ADMIN'}\n options={[{ value: '', label: t('permNone') }, ...departmentOptions.map(department => ({ value: department.code, label: department.name, hint: department.code }))]}\n onChange={(next) => { setDraft(current => ({ ...current, [key]: { ...valueOf(row), departmentCode: next === '' ? null : next } })) }}\n />\n </td>\n <td>\n <div className={styles.rowActions}>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => { setDetail(row) }}>{t('permViewDetails')}</Button>\n <Button variant=\"outline\" size=\"sm\" disabled={!writable || busy} onClick={() => {\n setError(null)\n if (window.confirm(t('permSave') + '?')) {\n void onSave(row, value.visibility, value.departmentCode).then(result => { if (!result.ok) setError(result.reason ?? t('permSaveFailed')) })\n }\n }}>{t('permSave')}</Button>\n </div>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n <Pager page={page} pages={pages} onChange={setPage} />\n {error === null ? null : <p className={styles.error} role=\"alert\">{error}</p>}\n\n <Modal\n open={detail !== null}\n onClose={() => { setDetail(null) }}\n title={t('permDetailTitle')}\n closeLabel={t('permClose')}\n className={styles.dialog as string}\n footer={<div className={styles.dialogFooter}><Button variant=\"outline\" onClick={() => { setDetail(null) }}>{t('permClose')}</Button></div>}\n >\n {detail === null ? null : (\n <dl className={styles.detailGrid}>\n <dt>{t('permDetailType')}</dt><dd>{detail.kind === 'skill' ? t('permResourceSkill') : t('permResourceWorkflow')}</dd>\n <dt>{t('permDetailName')}</dt><dd>{detail.name}</dd>\n <dt>{t('permDetailOwner')}</dt><dd>{ownerDisplay(detail.ownerName)}</dd>\n <dt>{t('permDetailScope')}</dt><dd>{visibilityLabel(detail.visibility)}</dd>\n <dt>{t('permDetailDepartment')}</dt><dd>{departmentName(detail.departmentCode)}</dd>\n <dt>{t('permDetailStatus')}</dt><dd>{statusLabel(detail.reviewStatus)}</dd>\n <dt>{t('permDetailUpdated')}</dt><dd>{detail.updatedAt === undefined ? '—' : new Date(detail.updatedAt).toLocaleString()}</dd>\n </dl>\n )}\n </Modal>\n </div>\n )\n}\n\n/** Accessible searchable combobox used for visibility and department pickers. */\nfunction SearchCombobox({ t, value, options, onChange, placeholder, ariaLabel, disabled = false }: {\n t: (key: keyof typeof en) => string\n value: string\n options: readonly { value: string; label: string; hint?: string }[]\n onChange: (value: string) => void\n placeholder: string\n ariaLabel: string\n disabled?: boolean\n}): ReactNode {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [active, setActive] = useState(0)\n const rootRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const selected = options.find(option => option.value === value)\n const filtered = useMemo(() => filterComboboxOptions(options, query), [options, query])\n\n useEffect(() => {\n if (!open) return\n const close = (event: MouseEvent): void => {\n if (rootRef.current !== null && !rootRef.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', close)\n inputRef.current?.focus()\n return () => { document.removeEventListener('mousedown', close) }\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const index = filtered.findIndex(option => option.value === value)\n setActive(index >= 0 ? index : 0)\n }, [open, filtered, value])\n\n const choose = (next: string): void => {\n onChange(next)\n setOpen(false)\n setQuery('')\n }\n\n return (\n <div className={styles.combobox} ref={rootRef}>\n <button\n type=\"button\"\n className={styles.comboboxTrigger}\n aria-label={ariaLabel}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n disabled={disabled}\n onClick={() => { setOpen(current => !current) }}\n >\n <span className={selected === undefined ? styles.comboboxPlaceholder : undefined}>{selected?.label ?? placeholder}</span>\n <span aria-hidden=\"true\">⌄</span>\n </button>\n {open ? (\n <div className={styles.comboboxMenu}>\n <input\n ref={inputRef}\n className={styles.comboboxSearch}\n value={query}\n placeholder={t('permSearch')}\n aria-label={t('permSearch')}\n onChange={event => { setQuery(event.target.value); setActive(0) }}\n onKeyDown={event => {\n if (event.key === 'Escape') { setOpen(false); return }\n if (event.key === 'ArrowDown') { event.preventDefault(); setActive(current => clampActiveIndex(current + 1, filtered.length)) }\n if (event.key === 'ArrowUp') { event.preventDefault(); setActive(current => clampActiveIndex(current - 1, filtered.length)) }\n if (event.key === 'Enter') {\n event.preventDefault()\n const option = filtered[active]\n if (option !== undefined) choose(option.value)\n }\n }}\n />\n <ul className={styles.comboboxList} role=\"listbox\" aria-label={ariaLabel}>\n {filtered.length === 0 ? <li className={styles.comboboxEmpty}>{t('permNoMatches')}</li> : filtered.map((option, index) => (\n <li key={option.value} role=\"option\" aria-selected={option.value === value}>\n <button\n type=\"button\"\n className={index === active ? styles.comboboxOption + ' ' + styles.comboboxOptionActive : styles.comboboxOption}\n onMouseEnter={() => { setActive(index) }}\n onClick={() => { choose(option.value) }}\n >\n <span className={styles.comboboxCheck}>{option.value === value ? '✓' : ''}</span>\n <span>{option.label}</span>\n {option.hint === undefined ? null : <span className={styles.comboboxHint}>{option.hint}</span>}\n </button>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n )\n}\n\nfunction Pager({ page, pages, onChange }: { page: number; pages: number; onChange: (page: number) => void }): ReactNode {\n if (pages <= 1) return null\n return (\n <div className={styles.pager}>\n <Button variant=\"outline\" size=\"sm\" disabled={page === 0} onClick={() => { onChange(page - 1) }}>上一页</Button>\n <span className={styles.muted}>{page + 1} / {pages}</span>\n <Button variant=\"outline\" size=\"sm\" disabled={page >= pages - 1} onClick={() => { onChange(page + 1) }}>下一页</Button>\n </div>\n )\n}\n\n/** The four role labels, so the header does not show a backend code. */\nfunction roleLabel(role: PortalRole): string {\n switch (role) {\n case 'SUPER_ADMIN': return '超级管理员'\n case 'ADMIN': return '管理员'\n case 'DEPT_ADMIN': return '部门管理员'\n default: return '应用人员'\n }\n}\n","import { useEffect, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { fetchReviewContext, reviewDemoMode } from './review-client.ts'\nimport { canSeeManagedSettings } from './settings-gate.ts'\n\n/**\n * The sidebar glyph for the permission centre.\n *\n * The entry is hidden for a caller the Host reports as an ordinary user. This is a navigation\n * affordance, not the authorization decision: every permission-centre endpoint re-checks the\n * caller, and the page itself refuses to render without a management role.\n */\nexport function PermissionCenterIcon(): ReactNode {\n // The launcher label is enough for the two administrator roles, so the shield paints without\n // waiting for the review API; the department-administrator case still asks the Host.\n const [allowed, setAllowed] = useState<boolean | undefined>(() => canSeeManagedSettings() ? true : undefined)\n useEffect(() => {\n let live = true\n if (reviewDemoMode() || canSeeManagedSettings()) { setAllowed(true); return () => { live = false } }\n void fetchReviewContext().then((context) => {\n if (!live) return\n setAllowed(context !== null && context.role !== 'APP_USER')\n }).catch(() => { if (live) setAllowed(false) })\n return () => { live = false }\n }, [])\n if (allowed !== true) return null\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9 2.2 14.5 4v4.4c0 3.1-2.1 5.6-5.5 7.4-3.4-1.8-5.5-4.3-5.5-7.4V4L9 2.2Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n <path d=\"m6.7 8.8 1.6 1.6 3-3.1\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n","/** Same-origin calls for the workspace image upgrade banner. */\n\n/** Route the plugin's Host half serves for upgrade detection and start. */\nexport const WORKSPACE_UPGRADE_PATH = '/integrations/dataops/workspace-upgrade'\n\n/** A DSH session that will receive \"继续\" after the restart. */\nexport interface WorkspaceUpgradeSession {\n sessionId: string\n title?: string\n cwd?: string\n}\n\n/** The status the DSH page reads before offering an upgrade. */\nexport interface WorkspaceUpgradeStatus {\n imageStatus: 'CURRENT' | 'UPDATE_AVAILABLE' | 'NOT_RUNNING' | 'UNKNOWN'\n configuredImage: string\n activeSessions: WorkspaceUpgradeSession[]\n}\n\n/** Narrow an unknown response into the status contract. */\nfunction asStatus(value: unknown): WorkspaceUpgradeStatus | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const record = value as Record<string, unknown>\n const imageStatus = record.imageStatus\n if (imageStatus !== 'CURRENT' && imageStatus !== 'UPDATE_AVAILABLE' && imageStatus !== 'NOT_RUNNING' && imageStatus !== 'UNKNOWN') return null\n const sessions = Array.isArray(record.activeSessions)\n ? record.activeSessions.flatMap((entry) => {\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) return []\n const session = entry as Record<string, unknown>\n if (typeof session.sessionId !== 'string' || session.sessionId.trim() === '') return []\n return [{\n sessionId: session.sessionId.trim(),\n ...(typeof session.title === 'string' && session.title.trim() !== '' ? { title: session.title.trim() } : {}),\n ...(typeof session.cwd === 'string' && session.cwd.trim() !== '' ? { cwd: session.cwd.trim() } : {}),\n }]\n })\n : []\n return {\n imageStatus,\n configuredImage: typeof record.configuredImage === 'string' ? record.configuredImage : '',\n activeSessions: sessions,\n }\n}\n\n/**\n * Read the workspace upgrade preview.\n * @returns the status, or null when the Host route is not ready or not connected.\n */\nexport async function fetchWorkspaceUpgrade(): Promise<WorkspaceUpgradeStatus | null> {\n const response = await fetch(WORKSPACE_UPGRADE_PATH, {\n credentials: 'same-origin',\n headers: { accept: 'application/json' },\n })\n if (response.status === 503 || response.status === 401) return null\n if (!response.ok) throw new Error(`workspace upgrade preview failed with HTTP ${String(response.status)}`)\n return asStatus(await response.json())\n}\n\n/**\n * Ask the Host to snapshot sessions and recreate the workspace container.\n * @returns the accepted hand-off summary.\n */\nexport async function requestWorkspaceUpgrade(): Promise<{ accepted: boolean; upgradeId: string; sessions: number }> {\n const response = await fetch(WORKSPACE_UPGRADE_PATH, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ force: true }),\n })\n const body = await response.json().catch(() => null) as Record<string, unknown> | null\n if (!response.ok) {\n const message = typeof body?.error === 'string' ? body.error : `workspace upgrade failed with HTTP ${String(response.status)}`\n throw new Error(message)\n }\n return {\n accepted: body?.accepted === true,\n upgradeId: typeof body?.upgradeId === 'string' ? body.upgradeId : '',\n sessions: typeof body?.sessions === 'number' ? body.sessions : 0,\n }\n}\n","/**\n * Workspace image upgrade banner and confirmation dialog.\n *\n * The banner is deliberately quiet: it tells the user a newer workspace image exists and\n * leaves the current session usable. Only the explicit upgrade action opens the dialog\n * that can interrupt running sessions.\n *\n * @module WorkspaceUpgradePrompt\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { en } from './locales.ts'\nimport {\n fetchWorkspaceUpgrade,\n requestWorkspaceUpgrade,\n type WorkspaceUpgradeStatus,\n} from './workspace-upgrade-client.ts'\nimport styles from './WorkspaceUpgradePrompt.module.css'\n\n/** The copy resolver bound by the client plugin. */\nexport interface WorkspaceUpgradePromptProps {\n /** Resolve one managed DataOps message key. */\n readonly t: (key: keyof typeof en) => string\n}\n\n/** How often to re-read the image status while the page is open. */\nconst POLL_MS = 30_000\n\n/** Wait before a reload so the restarted workspace has a chance to come back. */\nconst RELOAD_DELAY_MS = 12_000\n\n/**\n * Render the banner and its upgrade dialog.\n * @param props.t - localized copy resolver.\n * @returns the banner while an image update is available, otherwise null.\n */\nexport function WorkspaceUpgradePrompt(props: WorkspaceUpgradePromptProps) {\n const { t } = props\n const [status, setStatus] = useState<WorkspaceUpgradeStatus | null>(null)\n const [dismissed, setDismissed] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n const [busy, setBusy] = useState(false)\n const [notice, setNotice] = useState('')\n const [error, setError] = useState('')\n\n const refresh = useCallback(async (): Promise<void> => {\n try {\n const next = await fetchWorkspaceUpgrade()\n if (next !== null) setStatus(next)\n } catch {\n // A transient read failure must not turn into a false upgrade banner.\n }\n }, [])\n\n useEffect(() => {\n let cancelled = false\n const tick = async (): Promise<void> => {\n if (cancelled) return\n await refresh()\n }\n void tick()\n const timer = setInterval(() => { void tick() }, POLL_MS)\n return () => {\n cancelled = true\n clearInterval(timer)\n }\n }, [refresh])\n\n const available = status?.imageStatus === 'UPDATE_AVAILABLE'\n const sessionCount = status?.activeSessions.length ?? 0\n const warning = useMemo(\n () => t('upgradeSessionsWarning').replace('{count}', String(sessionCount)),\n [sessionCount, t],\n )\n\n const openDialog = useCallback((): void => {\n setError('')\n setDialogOpen(true)\n }, [])\n\n const closeDialog = useCallback((): void => {\n if (busy) return\n setDialogOpen(false)\n }, [busy])\n\n const upgrade = useCallback(async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await requestWorkspaceUpgrade()\n setDialogOpen(false)\n setNotice(t('upgradeStarted'))\n setDismissed(true)\n window.setTimeout(() => { window.location.reload() }, RELOAD_DELAY_MS)\n } catch (cause) {\n // A connection drop is the normal shape of this request when the Host is\n // restarted before it can answer; the hand-off file is already on disk, so\n // report the upgrade as started rather than claiming it failed.\n if (cause instanceof TypeError) {\n setDialogOpen(false)\n setNotice(t('upgradeStarted'))\n setDismissed(true)\n window.setTimeout(() => { window.location.reload() }, RELOAD_DELAY_MS)\n return\n }\n setError(cause instanceof Error ? cause.message : t('upgradeFailed'))\n } finally {\n setBusy(false)\n }\n }, [t])\n\n if (notice !== '') {\n return (\n <div className={styles.banner} role=\"status\" aria-live=\"polite\">\n <span className={styles.title}>{notice}</span>\n </div>\n )\n }\n if (!available || dismissed) return null\n\n return (\n <>\n <div className={styles.banner} role=\"status\" aria-live=\"polite\">\n <div className={styles.copy}>\n <strong className={styles.title}>{t('upgradeAvailableTitle')}</strong>\n <span className={styles.body}>{t('upgradeAvailableBody')}</span>\n </div>\n <div className={styles.actions}>\n <Button variant=\"primary\" size=\"sm\" onClick={openDialog}>{t('upgradeAction')}</Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => { setDismissed(true) }}>{t('upgradeLater')}</Button>\n </div>\n </div>\n\n <Modal\n open={dialogOpen}\n onClose={closeDialog}\n title={t('upgradeDialogTitle')}\n description={t('upgradeDialogBody')}\n closeLabel={t('upgradeCancel')}\n footer={(\n <>\n <Button variant=\"ghost\" onClick={closeDialog} disabled={busy}>{t('upgradeCancel')}</Button>\n <Button variant=\"primary\" onClick={() => { void upgrade() }} disabled={busy}>\n {busy ? t('upgradeBusy') : sessionCount === 0 ? t('upgradeAction') : t('upgradeConfirm')}\n </Button>\n </>\n )}\n >\n <div className={styles.dialogBody}>\n <p className={styles.dialogText}>{sessionCount === 0 ? t('upgradeNoSessions') : warning}</p>\n {sessionCount > 0 ? (\n <ul className={styles.sessionList}>\n {status?.activeSessions.map(session => (\n <li key={session.sessionId} className={styles.sessionRow}>\n <span className={styles.sessionTitle}>{session.title ?? session.sessionId}</span>\n {session.cwd ? <span className={styles.sessionPath}>{session.cwd}</span> : null}\n </li>\n ))}\n </ul>\n ) : null}\n {error !== '' ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n </div>\n </Modal>\n </>\n )\n}\n","/** English managed DataOps Settings copy. */\nexport const en = {\n nav: '万相AI中台',\n title: '万相AI中台',\n managed: 'Connected to 万相AI中台',\n unavailable: '万相AI中台 is not connected.',\n loadFailed: 'Loading failed. Try again.',\n brandingTitle: 'Wanxiang branding',\n brandingToggle: 'Wanxiang branding',\n limitsTitle: 'File size limits',\n limitsFileReadLabel: 'Largest file to read (MiB)',\n limitsUploadLabel: 'Largest file to upload (MiB)',\n limitsInvalid: 'Enter a size in MiB.',\n limitsSave: 'Save',\n limitsSaving: 'Saving…',\n timeoutTitle: '万相AI中台 query timeout',\n timeoutLabel: 'Longest single query (seconds)',\n timeoutInvalid: 'Enter 1 to 3600 seconds.',\n defaultsTitle: 'Default configuration',\n defaultsPublish: 'Publish',\n defaultsPublishing: 'Publishing…',\n defaultsPublishedAt: 'Last published',\n defaultsNeverPublished: 'Not published yet',\n defaultsNotAdmin: 'Administrators only',\n plazaTitle: 'Skill plaza',\n plazaAllTags: 'All tags',\n plazaMine: 'Shared by me',\n plazaShowDetail: 'Details',\n plazaClose: 'Close',\n plazaDetailUpdated: 'Updated',\n plazaDetailBody: 'Skill body',\n plazaInstall: 'Install',\n plazaInstalled: 'Installed. It is now in your skill list.',\n plazaUnshare: 'Stop sharing',\n plazaUnshared: 'Removed from the plaza. Users who installed it keep their copy.',\n plazaEmpty: 'No skills have been shared yet.',\n plazaUnavailable: 'The skill plaza is available once this workspace is connected to 万相AI中台.',\n plazaLoadFailed: 'The skill plaza could not be loaded. Try again.',\n plazaActionFailed: 'The action could not be completed. Try again.',\n plazaRetry: 'Try again',\n plazaRefresh: 'Refresh',\n plazaTabApproved: 'Approved',\n plazaTabPending: 'Pending',\n plazaTabAll: 'All',\n plazaSharedTag: 'Shared',\n plazaReview: 'Review',\n plazaPendingEmpty: 'No skills are waiting for review.',\n plazaAuditTitle: 'Review skill',\n plazaAuditSource: 'Source',\n plazaAuditVisibility: 'Visibility',\n plazaRiskTitle: 'AI risk report',\n plazaRiskScan: 'Run AI scan',\n plazaRiskScanning: 'Scanning…',\n plazaRiskNone: 'No AI risk report yet.',\n plazaRiskScore: 'Risk score',\n plazaRiskFindings: 'Findings',\n plazaRiskFailed: 'The AI scan failed; review manually.',\n plazaApprove: 'Approve',\n plazaReject: 'Reject',\n plazaReviewNote: 'Review note (required to reject)',\n plazaReviewNotePlaceholder: 'Explain the reason or what to change…',\n plazaReviewDone: 'Review saved.',\n plazaReviewFailed: 'The review could not be saved. Try again.',\n plazaDemo: 'Demo data',\n plazaGlobal: 'Global',\n plazaPrivate: 'Private',\n plazaDeptSuffix: ' department',\n reviewSettingsTitle: 'Review settings',\n reviewSettingsSkill: 'Skill plaza review',\n reviewSettingsWorkflow: 'Workflow plaza review',\n reviewSettingsKb: 'Knowledge base review',\n reviewSettingsHint: 'When on, submitted content stays private until an administrator approves it.',\n reviewSettingsSave: 'Save',\n reviewSettingsSaved: 'Review settings saved.',\n reviewSettingsFailed: 'Could not save. Try again.',\n reviewSettingsWaiting: 'Review settings API is waiting for the backend (task-39).',\n permNav: 'Permissions',\n permTitle: 'Permission centre',\n permTabRoles: 'Role permissions',\n permTabMembers: 'Member roles',\n permTabDepartments: 'Departments',\n permTabResources: 'Resource scope',\n permRoleMatrix: 'Role permission matrix',\n permPermissionModule: 'Module',\n permPermissionPoint: 'Permission',\n permReadOnly: 'Read only',\n permSave: 'Save',\n permSaved: 'Saved.',\n permSaveFailed: 'Could not save. Try again.',\n permSuperAdminOnly: 'Only a super administrator can change this.',\n permMember: 'Member',\n permDepartment: 'Department',\n permRole: 'Role',\n permDeptAdmin: 'Department administrator',\n permScope: 'Visibility',\n permGlobal: 'Global',\n permDepartmentScope: 'Department',\n permPrivate: 'Private',\n permNoAccess: 'You do not have access to the permission centre.',\n permWaiting: 'The permission-centre API is waiting for the backend (task-37).',\n permResourceSkill: 'Skill',\n permResourceWorkflow: 'Workflow',\n permResourceKb: 'Knowledge base',\n permType: 'Type',\n permName: 'Name',\n permOwner: 'Owner',\n permOperations: 'Actions',\n permViewDetails: 'View details',\n permDetailTitle: 'Resource details',\n permDetailType: 'Type',\n permDetailName: 'Name',\n permDetailOwner: 'Owner',\n permDetailScope: 'Visibility',\n permDetailDepartment: 'Department',\n permDetailStatus: 'Review status',\n permDetailUpdated: 'Updated',\n permNone: 'None',\n permSearch: 'Search…',\n permNoMatches: 'No matches',\n permClose: 'Close',\n permSelect: 'Select…',\n permStatusPending: 'Pending review',\n permStatusApproved: 'Approved',\n permStatusRejected: 'Rejected',\n permDemo: 'Demo data',\n reloginTitle: 'Sign in to 万相AI中台 again',\n reloginBody: 'Please sign in again.',\n reloginAction: 'Sign in again',\n reloginDismiss: 'Later',\n upgradeAvailableTitle: 'A new workspace version is available',\n upgradeAvailableBody: 'Restart the workspace to apply it.',\n upgradeAction: 'Upgrade',\n upgradeLater: 'Later',\n upgradeDialogTitle: 'Upgrade workspace',\n upgradeDialogBody: 'The workspace will restart and briefly disconnect. Your files and sessions are kept.',\n upgradeNoSessions: 'No sessions are running. The workspace will restart now.',\n upgradeSessionsWarning: '{count} running session(s) will be interrupted. After the upgrade, each one is resumed and sent “继续”.',\n upgradeCancel: 'Cancel',\n upgradeConfirm: 'Stop tasks and upgrade',\n upgradeBusy: 'Upgrading workspace…',\n upgradeStarted: 'Upgrade started. Reload this page when the workspace reconnects.',\n upgradeFailed: 'The workspace upgrade could not be started. Try again.',\n upgradeRetry: 'Retry',\n} as const\n\n/** Stable key set shared by every managed DataOps locale. */\nexport type ManagedDataOpsKey = keyof typeof en\n\n/** Chinese managed DataOps Settings copy. */\nexport const zh: Record<ManagedDataOpsKey, string> = {\n nav: '万相AI中台',\n title: '万相AI中台',\n managed: '已连接 万相AI中台',\n unavailable: '未连接 万相AI中台。',\n loadFailed: '加载失败,请重试。',\n brandingTitle: '应用万相品牌',\n brandingToggle: '应用万相品牌',\n limitsTitle: '文件大小限制',\n limitsFileReadLabel: '最大读取文件(MiB)',\n limitsUploadLabel: '最大上传文件(MiB)',\n limitsInvalid: '请输入以 MiB 为单位的大小。',\n limitsSave: '保存',\n timeoutTitle: '万相AI中台查询超时',\n timeoutLabel: '单次查询上限(秒)',\n timeoutInvalid: '请输入 1 到 3600 秒。',\n limitsSaving: '保存中…',\n defaultsTitle: '默认配置',\n defaultsPublish: '发布',\n defaultsPublishing: '发布中…',\n defaultsPublishedAt: '上次发布',\n defaultsNeverPublished: '尚未发布',\n defaultsNotAdmin: '仅管理员可发布',\n plazaTitle: '技能广场',\n plazaAllTags: '全部标签',\n plazaMine: '我共享的',\n plazaShowDetail: '详情',\n plazaClose: '关闭',\n plazaDetailUpdated: '更新时间',\n plazaDetailBody: '技能内容',\n plazaInstall: '装载',\n plazaInstalled: '已装载,可在技能列表中使用。',\n plazaUnshare: '取消共享',\n plazaUnshared: '已从广场移除;已装载的用户保留其副本。',\n plazaEmpty: '还没有人共享技能。',\n plazaUnavailable: '工作区接入万相AI中台后即可使用技能广场。',\n plazaLoadFailed: '技能广场加载失败,请重试。',\n plazaActionFailed: '操作未完成,请重试。',\n plazaRetry: '重试',\n plazaRefresh: '刷新',\n plazaTabApproved: '已审核',\n plazaTabPending: '未审核',\n plazaTabAll: '全部',\n plazaSharedTag: '已共享',\n plazaReview: '审核',\n plazaPendingEmpty: '没有待审核的技能。',\n plazaAuditTitle: '审核技能',\n plazaAuditSource: '来源',\n plazaAuditVisibility: '可见范围',\n plazaRiskTitle: 'AI 风险报告',\n plazaRiskScan: '生成风险报告',\n plazaRiskScanning: '分析中…',\n plazaRiskNone: '尚未生成 AI 风险报告。',\n plazaRiskScore: '风险分',\n plazaRiskFindings: '发现',\n plazaRiskFailed: '风险报告生成失败,可人工审核。',\n plazaApprove: '通过',\n plazaReject: '驳回',\n plazaReviewNote: '审核意见(驳回必填)',\n plazaReviewNotePlaceholder: '说明原因或修改建议…',\n plazaReviewDone: '审核结果已保存。',\n plazaReviewFailed: '审核未完成,请重试。',\n plazaDemo: '演示数据',\n plazaGlobal: '全局',\n plazaPrivate: '私有',\n plazaDeptSuffix: '部门专属',\n reviewSettingsTitle: '审核设置',\n reviewSettingsSkill: '技能广场审核',\n reviewSettingsWorkflow: '工作流广场审核',\n reviewSettingsKb: '知识库审核',\n reviewSettingsHint: '开启后,提交内容需管理员审核通过才公开展示。',\n reviewSettingsSave: '保存',\n reviewSettingsSaved: '审核设置已保存。',\n reviewSettingsFailed: '保存失败,请重试。',\n reviewSettingsWaiting: '审核设置 API 待后端联调(task-39)。',\n permNav: '权限',\n permTitle: '权限中心',\n permTabRoles: '角色权限',\n permTabMembers: '成员角色',\n permTabDepartments: '部门',\n permTabResources: '资源范围',\n permRoleMatrix: '角色权限矩阵',\n permPermissionModule: '模块',\n permPermissionPoint: '权限点',\n permReadOnly: '只读',\n permSave: '保存',\n permSaved: '已保存。',\n permSaveFailed: '保存失败,请重试。',\n permSuperAdminOnly: '仅超级管理员可修改。',\n permMember: '成员',\n permDepartment: '部门',\n permRole: '角色',\n permDeptAdmin: '部门管理员',\n permScope: '可见范围',\n permGlobal: '全局',\n permDepartmentScope: '部门专属',\n permPrivate: '私有',\n permNoAccess: '无权限访问权限中心。',\n permWaiting: '权限中心 API 待后端联调(task-37)。',\n permResourceSkill: '技能',\n permResourceWorkflow: '工作流',\n permResourceKb: '知识库',\n permType: '类型',\n permName: '名称',\n permOwner: '所有者',\n permOperations: '操作',\n permViewDetails: '查看详情',\n permDetailTitle: '资源详情',\n permDetailType: '类型',\n permDetailName: '名称',\n permDetailOwner: '所有者',\n permDetailScope: '可见范围',\n permDetailDepartment: '部门',\n permDetailStatus: '审核状态',\n permDetailUpdated: '更新时间',\n permNone: '无',\n permSearch: '搜索…',\n permNoMatches: '无匹配项',\n permClose: '关闭',\n permSelect: '请选择…',\n permStatusPending: '待审核',\n permStatusApproved: '已审核',\n permStatusRejected: '已拒绝',\n permDemo: '演示数据',\n reloginTitle: '请重新登录万相AI中台',\n reloginBody: '请重新登录',\n reloginAction: '重新登录',\n reloginDismiss: '稍后再说',\n upgradeAvailableTitle: '工作区有新版本可用',\n upgradeAvailableBody: '重启工作区后生效。',\n upgradeAction: '立即升级',\n upgradeLater: '稍后',\n upgradeDialogTitle: '升级工作区',\n upgradeDialogBody: '工作区会重启并短暂断开。文件和历史会话会保留。',\n upgradeNoSessions: '当前没有运行中的会话,工作区将立即重启。',\n upgradeSessionsWarning: '有 {count} 个正在运行的会话会被中断。升级完成后会自动恢复这些会话并发送“继续”。',\n upgradeCancel: '取消',\n upgradeConfirm: '停止任务并升级',\n upgradeBusy: '正在升级工作区…',\n upgradeStarted: '升级已开始。工作区重新连接后请刷新页面。',\n upgradeFailed: '工作区升级启动失败,请重试。',\n upgradeRetry: '重试',\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the skill center's slot declaration so this plugin can contribute to it.\nimport type {} from '@sparkelf/dsh-client-ui-skill-center/client'\nimport { ManagedDataOpsSection } from './ManagedDataOpsSection.tsx'\nimport { SkillPlazaSection } from './SkillPlazaSection.tsx'\nimport { installWanxiangBranding } from './install-branding.tsx'\nimport { ReloginPrompt, type ReloginPromptProps } from './ReloginPrompt.tsx'\nimport { PermissionCenterSection } from './PermissionCenterSection.tsx'\nimport { PermissionCenterIcon } from './PermissionCenterIcon.tsx'\nimport { WorkspaceUpgradePrompt } from './WorkspaceUpgradePrompt.tsx'\nimport { WorkflowPlazaBell } from './NotificationBell.tsx'\nimport { canSeeManagedSettings, subscribeManagedSettingsVisibility } from './settings-gate.ts'\nimport { REVIEW_CONTEXT_PATH, reviewDemoMode } from './review-client.ts'\nimport type { ManagedDataOpsSectionInjected } from './ManagedDataOpsSection.tsx'\nimport { en, zh, type ManagedDataOpsKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface SlotMap {\n /** Header actions declared by the knowledge-base workflow plaza. */\n 'workflow-plaza.actions': {\n kind: 'single'\n scope: 'root'\n owner: Record<string, never>\n hookContext: unknown\n }\n }\n\n interface LocaleNamespaceMap {\n 'settings.dataops-managed': ManagedDataOpsKey\n }\n}\n\nconst NS = 'settings.dataops-managed'\nconst AUTH_UPDATED_MESSAGE = 'dataops-auth-updated'\nconst MANAGED_AUTH_PATH = '/integrations/dataops/managed-auth'\n\n/** Sidebar entry and main page id for the permission centre. */\nconst PERMISSION_PANEL_ID = 'dataops-permissions'\n\n/** Required client services for the managed DataOps Settings section. */\nexport const inject = ['slots', 'locale']\n\n/**\n * Bind the four strings the sign-in prompt needs.\n *\n * Narrowed to exactly those keys rather than reusing the settings-section resolver: the prompt\n * asks its own small copy, and a wider type would let a typo pass as a valid key.\n *\n * @param ctx - client context carrying the registered namespace.\n * @returns a resolver for the prompt's own keys.\n */\nconst bindReloginCopy = (ctx: ClientContext): ReloginPromptProps['t'] => {\n const translate = ctx.locale.bind(NS) as (key: string) => string\n return (key) => translate(key)\n}\n\n/**\n * Register the managed DataOps surfaces and the sign-in prompt.\n *\n * The prompt rides a sidebar seat because the client needs *some* always-mounted surface for a\n * dialog that is about the whole workspace rather than one panel. The seat is a container: the\n * dialog itself portals to `document.body`, so this contributes no visible element to the\n * sidebar at rest and cannot disturb the regions that already live there.\n *\n * @param ctx - DSH client context with locale, slots and the sidebar foot.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dataops-managed: settings copy')\n installWanxiangBranding(ctx)\n const t = ctx.locale.bind(NS) as ManagedDataOpsSectionInjected['t']\n\n /**\n * Register the settings section only for the two administrator role labels.\n *\n * The identity record arrives after the iframe loads and can change when the portal account is\n * switched, so the registration is reconciled whenever the shared account store publishes. An\n * ordinary user's profile therefore has no section, no configuration form, and no publish\n * control at all — not a hidden one.\n */\n ctx.effect(() => {\n let disposeSection: (() => void) | undefined\n const reconcile = (): void => {\n const allowed = canSeeManagedSettings()\n if (allowed && disposeSection === undefined) {\n disposeSection = ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'dataops',\n order: 25,\n label: () => t('nav'),\n inject: () => ({ t }),\n }, ManagedDataOpsSection))\n } else if (!allowed && disposeSection !== undefined) {\n disposeSection()\n disposeSection = undefined\n }\n }\n reconcile()\n const unsubscribe = subscribeManagedSettingsVisibility(reconcile)\n return () => {\n unsubscribe()\n disposeSection?.()\n disposeSection = undefined\n }\n }, 'dataops-managed: settings section role gate')\n\n /**\n * The re-authentication prompt, mounted where it is always alive.\n *\n * A dialog needs a component that stays mounted whether or not the operator has the settings\n * panel open, and the sidebar foot is the one seat this plugin already owns. The component\n * renders nothing until DataOps reports the session has ended, so at rest it adds no element.\n */\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action',\n id: 'dataops-relogin',\n order: 90,\n inject: () => ({ t: bindReloginCopy(ctx) }),\n }, ReloginPrompt))\n /**\n * The workspace image upgrade notice. It lives in the shell overlay so it can sit\n * above the page without taking a sidebar or conversation seat; the component renders\n * nothing until DataOps reports a newer image.\n */\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({\n name: 'shell.overlay',\n id: 'dataops-workspace-upgrade',\n order: 20,\n inject: () => ({ t }),\n }, WorkspaceUpgradePrompt as never))\n\n /**\n * The permission centre, a sidebar entry plus the page it opens.\n *\n * The entry's glyph hides itself for an ordinary user; the page and every backend endpoint\n * re-check the caller, so hiding is navigation, not authorization.\n */\n ctx.effect(() => ctx.slots.inject('main', () => ctx.slots.register({\n name: 'main',\n key: PERMISSION_PANEL_ID as never,\n }, (() => PermissionCenterSection({ t })) as never)), 'dataops-managed: permission centre page')\n\n ctx.effect(() => {\n let disposeEntry: (() => void) | undefined\n let live = true\n const allowed = async (): Promise<boolean> => {\n if (typeof window !== 'undefined' && reviewDemoMode()) return true\n // The two managed-settings roles are already known from the launcher label; a department\n // administrator is only known from the review context, so ask the Host in that case.\n if (canSeeManagedSettings()) return true\n try {\n const response = await fetch(REVIEW_CONTEXT_PATH)\n if (!response.ok) return false\n const body = await response.json() as { primaryRole?: string; review?: { canReview?: boolean } }\n return body.primaryRole === 'DEPT_ADMIN' || body.review?.canReview === true\n } catch {\n return false\n }\n }\n const sync = async (): Promise<void> => {\n const next = await allowed()\n if (!live) return\n if (next && disposeEntry === undefined) {\n disposeEntry = ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({\n name: 'sidebar.panellist',\n id: PERMISSION_PANEL_ID,\n order: 20,\n label: () => t('permNav'),\n locale: NS,\n }, PermissionCenterIcon as never))\n } else if (!next && disposeEntry !== undefined) {\n disposeEntry()\n disposeEntry = undefined\n }\n }\n void sync()\n const off = subscribeManagedSettingsVisibility(() => { void sync() })\n return () => {\n live = false\n off()\n disposeEntry?.()\n disposeEntry = undefined\n }\n }, 'dataops-managed: permission centre entry gate')\n\n /**\n * The skill plaza, contributed to the skill center page.\n *\n * The skill center declares the slot and renders whatever it holds; a profile without this\n * plugin leaves it empty, which is what keeps the plaza out of a deployment that never\n * installed DataOps.\n */\n ctx.slots.inject('skill-center.section', () => ctx.slots.register({\n name: 'skill-center.section',\n id: 'dataops-plaza',\n order: 10,\n inject: () => ({ t }),\n }, SkillPlazaSection))\n\n /**\n * The workflow plaza's header seat, declared by the knowledge-base plugin. It renders a slot\n * rather than importing this plugin; the bell therefore joins only when both are installed.\n */\n ctx.slots.inject('workflow-plaza.actions', () => ctx.slots.register({\n name: 'workflow-plaza.actions',\n }, WorkflowPlazaBell as never))\n\n const synchronizeJwt = async (): Promise<void> => {\n const response = await fetch(new URL(MANAGED_AUTH_PATH, window.location.origin), {\n method: 'POST',\n credentials: 'same-origin',\n })\n if (!response.ok) throw new Error(`DataOps managed JWT synchronization failed with HTTP ${String(response.status)}`)\n }\n const onMessage = (event: MessageEvent<unknown>): void => {\n if (event.source !== window.parent\n || (event.data as { type?: unknown } | null)?.type !== AUTH_UPDATED_MESSAGE) return\n void synchronizeJwt().catch(error => console.error('dataops-managed.jwt_sync_failed', error))\n }\n ctx.effect(() => {\n window.addEventListener('message', onMessage)\n void synchronizeJwt().catch(error => console.error('dataops-managed.jwt_sync_failed', error))\n return () => window.removeEventListener('message', onMessage)\n }, 'dataops-managed: JWT synchronization')\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["listeners","asStatus","asStatus","readJson","refusalReason","useState","styles","Switch","Button","useSyncExternalStore","styles","StateDot","Switch","useState","useId","useCallback","SettingsValueField","Button","useSyncExternalStore","useState","styles","Modal","useState","styles","IconSkillOutlineRegular","Button","IconDownloadOutlineRegular","IconTrashOutlineRegular","Modal","useCallback","IconRefreshOutlineRegular","IconShareOutlineRegular","css","POLL_MS","useState","useCallback","Modal","Button","useState","useCallback","styles","Button","IconRefreshOutlineRegular","Modal","useMemo","Fragment","useRef","useState","useState","useCallback","useMemo","styles","Button","Modal"],"sources":["../src/client/brand-store.ts","../src/client/model-sync-client.ts","../src/client/workspace-limits-client.ts","../src/client/tool-timeout-client.ts","../src/client/review-demo.ts","../src/client/review-client.ts","../src/client/ReviewSettingsCard.tsx","../src/client/ManagedDataOpsSection.tsx","../src/client/review-types.ts","../src/client/skill-plaza-client.ts","../src/client/review-notification-store.ts","../src/client/NotificationBell.tsx","../src/client/SkillPlazaSection.tsx","../src/client/WanxiangBrand.tsx","../src/client/install-branding.tsx","../src/client/ReloginPrompt.tsx","../src/client/settings-gate.ts","../src/client/combobox.ts","../src/client/PermissionCenterSection.tsx","../src/client/PermissionCenterIcon.tsx","../src/client/workspace-upgrade-client.ts","../src/client/WorkspaceUpgradePrompt.tsx","../src/client/locales.ts","../src/client/index.ts"],"sourcesContent":["/** Persisted client preference for the managed DataOps shell identity. */\nexport interface WanxiangBrandPreference {\n enabled: boolean\n}\n\n/** Stable local preference key shared by Settings and brand-slot registration. */\nexport const WANXIANG_BRAND_PREFERENCE_KEY = 'dsh.dataops.wanxiangBrand'\n\nfunction initialPreference(): WanxiangBrandPreference {\n if (typeof localStorage === 'undefined') return { enabled: true }\n try {\n const value = JSON.parse(localStorage.getItem(WANXIANG_BRAND_PREFERENCE_KEY) ?? 'null') as unknown\n return typeof value === 'object' && value !== null && 'enabled' in value\n && typeof (value as { enabled?: unknown }).enabled === 'boolean'\n ? { enabled: (value as { enabled: boolean }).enabled }\n : { enabled: true }\n } catch {\n return { enabled: true }\n }\n}\n\nlet preference = initialPreference()\nconst listeners = new Set<() => void>()\n\n/** Observable preference compatible with React's useSyncExternalStore. */\nexport const wanxiangBrandPreference = {\n getSnapshot: (): WanxiangBrandPreference => preference,\n subscribe: (listener: () => void): (() => void) => {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n },\n}\n\n/** Toggle the Wanxiang shell identity from the DataOps Settings section. */\nexport function setWanxiangBrandEnabled(enabled: boolean): void {\n if (preference.enabled === enabled) return\n preference = { enabled }\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(WANXIANG_BRAND_PREFERENCE_KEY, JSON.stringify(preference))\n } catch {\n // Storage failure must not block an in-memory preference change.\n }\n }\n for (const listener of listeners) listener()\n}\n","/** Same-origin model-sync calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for model sharing. */\nexport const MODEL_SYNC_PATH = '/integrations/dataops/model-sync'\n\n/** One model this workspace holds, and whether it is offered to other users. */\nexport interface ModelSyncModel {\n /** Model id as the settings document stores it. */\n id: string\n /** Whether other users may use it. */\n shared: boolean\n}\n\n/** Model sharing as this workspace currently stands. */\nexport interface ModelSyncStatus {\n /** Whether this workspace follows a publisher. */\n followState: 'following' | 'detached'\n /** Whether an administrator currently shares models. */\n publisherSharing: boolean\n /** How many models this workspace adopts from the publisher. */\n adoptedCount: number\n /** Model ids kept private. */\n privateModelIds: string[]\n /** Publication time, when one is sharing. */\n publishedAt: string | null\n /** Whether the current user may change what this workspace shares. */\n canPublish: boolean\n /** Models this workspace holds. */\n models: ModelSyncModel[]\n /**\n * Settings namespaces this deployment distributes.\n *\n * Present with the models in one response, so the two rows describe the same publication.\n */\n sections: DistributedSection[]\n}\n\n/** One settings namespace the deployment distributes. */\nexport interface DistributedSection {\n /** DSH settings namespace, such as `permission`. */\n ns: string\n /** Whether this workspace still takes the publisher's values for it. */\n followState: 'following' | 'detached'\n /** Whether adoption has applied values for it. */\n applied: boolean\n /** Whether a plugin here owns the namespace, so stopping would affect this workspace. */\n mounted: boolean\n}\n\n/** Narrow a response body to the status shape, rejecting anything else. */\nfunction asStatus(value: unknown): ModelSyncStatus | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const record = value as Record<string, unknown>\n if (record.followState !== 'following' && record.followState !== 'detached') return null\n return {\n followState: record.followState,\n publisherSharing: record.publisherSharing === true,\n adoptedCount: typeof record.adoptedCount === 'number' ? record.adoptedCount : 0,\n privateModelIds: Array.isArray(record.privateModelIds)\n ? record.privateModelIds.filter((id): id is string => typeof id === 'string')\n : [],\n publishedAt: typeof record.publishedAt === 'string' ? record.publishedAt : null,\n canPublish: record.canPublish === true,\n models: Array.isArray(record.models)\n ? record.models.flatMap((entry) => {\n if (typeof entry !== 'object' || entry === null) return []\n const model = entry as Record<string, unknown>\n return typeof model.id === 'string' ? [{ id: model.id, shared: model.shared === true }] : []\n })\n : [],\n sections: Array.isArray(record.sections)\n ? record.sections.flatMap((entry): DistributedSection[] => {\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) return []\n const section = entry as Record<string, unknown>\n if (typeof section.ns !== 'string' || section.ns === '') return []\n return [{\n ns: section.ns,\n followState: section.followState === 'detached' ? 'detached' : 'following',\n applied: section.applied === true,\n mounted: section.mounted === true,\n }]\n })\n : [],\n }\n}\n\n/**\n * Read the current model sharing state.\n * @returns The status, or null when this workspace is not connected to DataOps.\n */\nexport async function fetchModelSyncStatus(): Promise<ModelSyncStatus | null> {\n const response = await fetch(MODEL_SYNC_PATH, { headers: { accept: 'application/json' } })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('model sync status failed with HTTP ' + String(response.status))\n return asStatus(await response.json())\n}\n\n/**\n * Change what this workspace shares.\n * @param body - Action and its parameters.\n * @returns The status after the change, or null when the plugin is not active.\n */\nexport async function postModelSyncAction(body: Record<string, unknown>): Promise<ModelSyncStatus | null> {\n const response = await fetch(MODEL_SYNC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(body),\n })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('model sync action failed with HTTP ' + String(response.status))\n return asStatus(await response.json())\n}\n","/** Same-origin workspace-limits calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for workspace limits. */\nexport const WORKSPACE_LIMITS_PATH = '/integrations/dataops/workspace-limits'\n\n/** The two byte ceilings, as the panel edits them. */\nexport interface WorkspaceLimits {\n /** Largest file a sidebar download or agent read may carry. */\n fileReadMaxBytes: number\n /** Largest file an upload may carry. */\n uploadMaxBytes: number\n}\n\n/** Limits as this workspace currently holds them. */\nexport interface WorkspaceLimitsStatus {\n limits: WorkspaceLimits\n canWrite: boolean\n readOnlyReason: string | null\n}\n\n/** Narrow a response body to the status, rejecting anything else. */\nfunction asStatus(value: unknown): WorkspaceLimitsStatus | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const record = value as Record<string, unknown>\n const limits = record.limits as Record<string, unknown> | undefined\n if (typeof limits !== 'object' || limits === null) return null\n const fileReadMaxBytes = limits.fileReadMaxBytes\n const uploadMaxBytes = limits.uploadMaxBytes\n if (typeof fileReadMaxBytes !== 'number' || typeof uploadMaxBytes !== 'number') return null\n return {\n limits: { fileReadMaxBytes, uploadMaxBytes },\n canWrite: record.canWrite === true,\n readOnlyReason: typeof record.readOnlyReason === 'string' ? record.readOnlyReason : null,\n }\n}\n\nfunction readJson(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null\n}\n\n/**\n * A write DataOps refused, carrying the reason it gave.\n *\n * The message is written for the person who set the value, so the panel shows it as-is rather\n * than replacing it with a generic failure notice.\n */\nexport class WorkspaceLimitsRejection extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'WorkspaceLimitsRejection'\n }\n}\n\n/** Read the reason from a refused response, falling back to the status line. */\nasync function refusalReason(response: Response, fallback: string): Promise<string> {\n try {\n const body = readJson(await response.json())\n const error = body?.error\n if (typeof error === 'string' && error.trim() !== '') return error\n } catch {\n // A body that is absent or not JSON leaves the fallback as the only explanation available.\n }\n return `${fallback} with HTTP ${String(response.status)}`\n}\n\n/**\n * Read the workspace limits the panel shows.\n * @returns The status, or null when the workspace is not connected to DataOps.\n */\nexport async function fetchWorkspaceLimits(): Promise<WorkspaceLimitsStatus | null> {\n const response = await fetch(WORKSPACE_LIMITS_PATH, { credentials: 'same-origin' })\n if (response.status === 503) return null\n if (!response.ok) throw new Error(`Workspace limits read failed with HTTP ${String(response.status)}`)\n return asStatus(await response.json())\n}\n\n/**\n * Store new workspace limits.\n * @param limits - The ceilings to store.\n * @returns The stored status.\n */\nexport async function saveWorkspaceLimits(limits: WorkspaceLimits): Promise<WorkspaceLimitsStatus | null> {\n const response = await fetch(WORKSPACE_LIMITS_PATH, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(limits),\n })\n if (response.status === 503) return null\n // A refusal names a value the user chose, so the card keeps that draft and shows the reason.\n if (response.status === 400) {\n throw new WorkspaceLimitsRejection(await refusalReason(response, 'Workspace limits write refused'))\n }\n if (!response.ok) throw new Error(await refusalReason(response, 'Workspace limits write failed'))\n const body = readJson(await response.json())\n return body === null ? null : asStatus(body)\n}","/** Same-origin tool-call timeout calls from the DataOps settings surface. */\n\n/** Route the plugin's Host half serves for the tool-call timeout. */\nexport const TOOL_TIMEOUT_PATH = '/integrations/dataops/tool-timeout'\n\n/** The two ends a timeout may take, in seconds, matching what the Host enforces. */\nexport const TOOL_TIMEOUT_MIN_SECONDS = 1\nexport const TOOL_TIMEOUT_MAX_SECONDS = 3600\n\n/** The timeout as this workspace currently holds it. */\nexport interface ToolTimeout {\n /** How long one tool call may run before it is abandoned. */\n toolCallTimeoutMs: number\n}\n\n/** Narrow a response body to the timeout, rejecting anything else. */\nfunction asTimeout(value: unknown): ToolTimeout | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const ms = (value as Record<string, unknown>).toolCallTimeoutMs\n return typeof ms === 'number' && Number.isSafeInteger(ms) && ms > 0 ? { toolCallTimeoutMs: ms } : null\n}\n\n/** Read the reason from a refused response, falling back to the status line. */\nasync function refusalReason(response: Response, fallback: string): Promise<string> {\n try {\n const body = await response.json() as unknown\n if (typeof body === 'object' && body !== null && !Array.isArray(body)) {\n const error = (body as Record<string, unknown>).error\n if (typeof error === 'string' && error.trim() !== '') return error\n }\n } catch {\n // A body that is absent or not JSON leaves the fallback as the only explanation available.\n }\n return fallback + ' with HTTP ' + String(response.status)\n}\n\n/**\n * Read the tool-call timeout the panel shows.\n * @returns The timeout, or null when the workspace is not connected.\n */\nexport async function fetchToolTimeout(): Promise<ToolTimeout | null> {\n const response = await fetch(TOOL_TIMEOUT_PATH, { credentials: 'same-origin' })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('Tool timeout read failed with HTTP ' + String(response.status))\n return asTimeout(await response.json())\n}\n\n/**\n * Store a new tool-call timeout.\n * @param milliseconds - How long one tool call may run.\n * @returns The stored timeout, or null when the workspace is not connected.\n */\nexport async function saveToolTimeout(milliseconds: number): Promise<ToolTimeout | null> {\n const response = await fetch(TOOL_TIMEOUT_PATH, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ toolCallTimeoutMs: milliseconds }),\n })\n if (response.status === 503) return null\n // A refusal names a value the user chose, so the card keeps that draft and shows the reason.\n if (response.status === 400) throw new Error(await refusalReason(response, 'Tool timeout write refused'))\n if (!response.ok) throw new Error(await refusalReason(response, 'Tool timeout write failed'))\n return asTimeout(await response.json())\n}\n","/**\n * Labeled fixtures for reviewing the new surfaces before the backend contract is deployed.\n *\n * They are only reachable through `?dataopsReviewDemo=1`; production never merges them into a\n * listing. Keeping them in one module means the plaza, the audit dialog and the permission\n * centre tell the same story instead of each inventing a different sample.\n */\n\nimport type { PlazaSkill } from './skill-plaza-client.ts'\nimport type { RbacOverview } from './review-client.ts'\n\n/** A pending skill with an AI report, an approved global skill, and a rejected private one. */\nexport function demoPlazaSkills(): PlazaSkill[] {\n return [\n {\n id: 9101,\n name: 'SQL 取数助手',\n description: '把自然语言问题改写成只读 SQL,并解释每个过滤条件。',\n instruction: '你是数据分析助手。只生成只读 SELECT,不要写 UPDATE/DELETE。',\n tags: ['数据', 'SQL'],\n sharedByMe: false,\n updatedAt: '2026-10-23T04:40:00.000Z',\n reviewStatus: 'pending',\n visibility: 'department',\n departmentCode: 'dept-rd',\n departmentName: '研发部',\n departmentPath: [{ code: 'dept-root', name: '万相' }, { code: 'dept-rd', name: '研发部' }],\n ownerName: '林工',\n riskReport: {\n score: 62,\n severity: 'medium',\n summary: '指令包含数据库读取,需确认连接凭据的最小权限。',\n findings: [\n { category: 'credential_access', severity: 'medium', evidence: '提示词要求读取 DATABASE_URL 以连接数据库。', recommendation: '改为由平台注入只读连接,不要在提示词中出现凭据。' },\n { category: 'destructive_action', severity: 'low', evidence: '明确禁止写操作,但未限制 DDL。', recommendation: '补充「禁止 CREATE/ALTER/DROP」。' },\n ],\n scannedAt: '2026-10-23T04:41:00.000Z',\n },\n reviewNote: null,\n submittedAt: '2026-10-23T04:40:00.000Z',\n },\n {\n id: 9102,\n name: '经营日报生成',\n description: '按日汇总营收、订单与退款,输出 Markdown 日报。',\n instruction: '读取昨日指标,生成经营日报。',\n tags: ['经营', '日报'],\n sharedByMe: true,\n updatedAt: '2026-10-21T02:00:00.000Z',\n reviewStatus: 'approved',\n visibility: 'global',\n departmentCode: null,\n ownerName: 'admin',\n riskReport: null,\n },\n {\n id: 9103,\n name: '私域名单清洗',\n description: '按内部规则去重并标记高价值客户。',\n instruction: '清洗名单并输出 CSV。',\n tags: ['客户'],\n sharedByMe: false,\n updatedAt: '2026-10-20T06:00:00.000Z',\n reviewStatus: 'rejected',\n visibility: 'private',\n departmentCode: 'dept-rd',\n departmentName: '研发部',\n ownerName: '周工',\n reviewNote: '包含真实手机号样例,请脱敏后重新提交。',\n },\n ]\n}\n\n/** Four roles, the permission catalog, three members, two departments, and three resources. */\nexport function demoRbacOverview(): RbacOverview {\n return {\n matrix: {\n permissions: [\n { key: 'skill.review', name: '审核技能', group: '技能广场' },\n { key: 'workflow.review', name: '审核工作流', group: '工作流广场' },\n { key: 'rbac.manage', name: '管理权限', group: '系统' },\n { key: 'kb.write', name: '写入知识库', group: '知识库' },\n ],\n roles: [\n { code: 'SUPER_ADMIN', name: '超级管理员', systemKey: 'SUPER_ADMIN', dataScope: 'ALL', permissions: ['skill.review', 'workflow.review', 'rbac.manage', 'kb.write'] },\n { code: 'ADMIN', name: '管理员', systemKey: 'ADMIN', dataScope: 'ALL', permissions: ['skill.review', 'workflow.review', 'kb.write'] },\n { code: 'DEPT_ADMIN', name: '部门管理员', systemKey: 'DEPT_ADMIN', dataScope: 'DEPARTMENT_TREE', permissions: ['skill.review', 'workflow.review'] },\n { code: 'APP_USER', name: '应用人员', systemKey: 'APP_USER', dataScope: 'SELF', permissions: [] },\n ],\n },\n members: [\n { userId: 'u1', username: 'admin', displayName: '超级管理员', roleCodes: ['SUPER_ADMIN'], departmentCode: 'dept-root', departmentPath: [{ code: 'dept-root', name: '万相' }] },\n { userId: 'u2', username: 'lin', displayName: '林工', roleCodes: ['DEPT_ADMIN'], departmentCode: 'dept-rd', departmentPath: [{ code: 'dept-root', name: '万相' }, { code: 'dept-rd', name: '研发部' }] },\n { userId: 'u3', username: 'zhou', displayName: '周工', roleCodes: ['APP_USER'], departmentCode: 'dept-rd', departmentPath: [{ code: 'dept-root', name: '万相' }, { code: 'dept-rd', name: '研发部' }] },\n ],\n departments: [\n { code: 'dept-root', name: '万相', path: [{ code: 'dept-root', name: '万相' }], memberCount: 3, deptAdmins: [] },\n { code: 'dept-rd', name: '研发部', parentCode: 'dept-root', path: [{ code: 'dept-root', name: '万相' }, { code: 'dept-rd', name: '研发部' }], memberCount: 2, deptAdmins: [{ userId: 'u2', username: 'lin', displayName: '林工' }] },\n ],\n resources: [\n { kind: 'skill', id: 9101, name: 'SQL 取数助手', ownerName: '林工', departmentCode: 'dept-rd', visibility: 'department', reviewStatus: 'pending' },\n { kind: 'skill', id: 9102, name: '经营日报生成', ownerName: 'admin', departmentCode: null, visibility: 'global', reviewStatus: 'approved' },\n { kind: 'workflow', id: 'wf-1', name: '每日经营日报', ownerName: 'admin', departmentCode: null, visibility: 'global', reviewStatus: 'approved' },\n ],\n }\n}","/**\n * Browser calls for review, notifications, the permission centre, and review settings.\n *\n * Every request goes through this plugin's same-origin bridge, which holds the DataOps JWT.\n * A 503/404 means the Host or DataOps has not shipped that endpoint yet; callers render their\n * \"waiting for the backend\" state instead of treating an unfinished feature as a failure.\n */\n\nimport type {\n PortalRole,\n ReviewContext,\n ReviewNotification,\n RiskReport,\n ReviewStatus,\n ResourceVisibility,\n} from './review-types.ts'\n\n/** Caller identity and review capability. */\nexport const REVIEW_CONTEXT_PATH = '/integrations/dataops/review-context'\n/** Notification list and read receipts. */\nexport const NOTIFICATIONS_PATH = '/integrations/dataops/review-notifications'\n/** AI scan and the human decision. */\nexport const REVIEW_ACTION_PATH = '/integrations/dataops/review'\n/** Role matrix, members, departments, and resource scopes. */\nexport const RBAC_PATH = '/integrations/dataops/rbac'\n/** The three plaza-review switches in the DataOps settings panel. */\nexport const REVIEW_SETTINGS_PATH = '/integrations/dataops/review-settings'\n/** Department CRUD bridge (task-67). */\nexport const DEPARTMENTS_PATH = '/integrations/dataops/departments'\n\n/** One permission point in the role matrix. */\nexport interface PermissionPoint {\n key: string\n name: string\n group: string\n /** Backend scope metadata for the DSH capability catalogue (task-70). */\n scope?: 'department' | 'global' | string\n /** Chinese presentation note (task-76). */\n description?: string\n}\n\n/** One role row in the matrix. */\nexport interface RoleMatrixRow {\n code: string\n name: string\n systemKey?: string\n dataScope: 'ALL' | 'DEPARTMENT' | 'SELF' | 'CUSTOM_DEPARTMENTS' | 'DEPARTMENT_TREE'\n permissions: readonly string[]\n}\n\n/** One member and their role assignment. */\nexport interface MemberRow {\n userId: string\n username: string\n displayName: string\n roleCodes: readonly string[]\n departmentCode?: string\n departmentPath?: readonly { code: string; name: string }[]\n dataScope?: string\n}\n\n/** One department in the tree. */\nexport interface DepartmentRow {\n code: string\n name: string\n parentCode?: string\n path?: readonly { code: string; name: string }[]\n memberCount?: number\n deptAdmins?: readonly { userId: string; username: string; displayName: string }[]\n description?: string\n owner?: string\n enabled?: boolean\n updatedAt?: string\n}\n\n/** One skill/workflow resource and its visibility scope. */\nexport interface ResourceScopeRow {\n kind: 'skill' | 'workflow'\n id: string | number\n name: string\n ownerId?: string\n ownerName?: string\n departmentCode?: string | null\n visibility: ResourceVisibility\n reviewStatus?: ReviewStatus\n updatedAt?: string\n}\n\n/** Everything the permission centre renders in one read. */\nexport interface RbacOverview {\n matrix: { roles: readonly RoleMatrixRow[]; permissions: readonly PermissionPoint[] }\n members: readonly MemberRow[]\n departments: readonly DepartmentRow[]\n resources: readonly ResourceScopeRow[]\n}\n\n/** One plaza review switch. */\nexport interface ReviewSettings {\n skillPlaza: boolean\n workflowPlaza: boolean\n knowledgeBase: boolean\n}\n\n/** The product defaults, used until DataOps returns its own value. */\nexport const DEFAULT_REVIEW_SETTINGS: ReviewSettings = {\n skillPlaza: true,\n workflowPlaza: true,\n knowledgeBase: true,\n}\n\n/**\n * Whether the page was opened with the demo fixture.\n *\n * The fixture exists so the review dialog and the permission matrix can be reviewed before the\n * backend contract is deployed; every fixture row is labelled and the mode is never the default.\n */\nexport function reviewDemoMode(): boolean {\n if (typeof window === 'undefined') return false\n try {\n return new URLSearchParams(window.location.search).get('dataopsReviewDemo') === '1'\n || window.localStorage.getItem('dataopsReviewDemo') === '1'\n } catch {\n return false\n }\n}\n\n/** Read JSON, mapping \"not active\" and \"backend not ready\" answers to null. */\nasync function readJson<T>(path: string, init: RequestInit = {}): Promise<T | null> {\n const response = await fetch(path, {\n ...init,\n headers: {\n accept: 'application/json',\n ...(init.body === undefined ? {} : { 'content-type': 'application/json' }),\n ...init.headers,\n },\n })\n if (response.status === 503 || response.status === 404 || response.status === 501) return null\n if (!response.ok) throw new Error('DataOps review request failed with HTTP ' + String(response.status))\n return await response.json() as T\n}\n\n/** The backend's review-context row. */\ninterface ReviewContextResponse {\n userId?: string\n username?: string\n displayName?: string\n roleCodes?: string[]\n primaryRole?: string\n roles?: { code?: string; name?: string; systemKey?: string }[]\n departmentCode?: string | null\n departmentPath?: { code: string; name: string }[]\n dataScope?: { all?: boolean; self?: boolean; departmentCodes?: string[] }\n review?: { canReview?: boolean; canReviewGlobal?: boolean; canManagePermissions?: boolean; departments?: string[] }\n settings?: ReviewSettings\n}\n\n/** Read the caller's role and review capability. */\nexport async function fetchReviewContext(): Promise<ReviewContext | null> {\n if (reviewDemoMode()) {\n return {\n role: 'ADMIN', departmentCode: 'dept-rd', departmentPath: ['万相', '研发部'],\n canReview: true, canManagePermissions: true,\n }\n }\n const body = await readJson<ReviewContextResponse>(REVIEW_CONTEXT_PATH)\n if (body === null) return null\n const codes = Array.isArray(body.roleCodes) ? body.roleCodes : []\n // DataOps role codes are display labels (\"超级管理员\"); the stable key is `roles[].systemKey`.\n const primaryKey = body.roles?.find(role => role.code === body.primaryRole)?.systemKey\n ?? body.roles?.find(role => role.code !== undefined && codes.includes(role.code))?.systemKey\n const role: PortalRole = primaryKey === 'SUPER_ADMIN' || codes.includes('超级管理员')\n ? 'SUPER_ADMIN'\n : primaryKey === 'ADMIN' || codes.includes('管理员')\n ? 'ADMIN'\n : primaryKey === 'DEPT_ADMIN' || codes.includes('部门管理员')\n ? 'DEPT_ADMIN'\n : 'APP_USER'\n return {\n userId: body.userId,\n role,\n departmentCode: body.departmentCode ?? undefined,\n departmentPath: body.departmentPath?.map(entry => entry.name),\n canReview: body.review?.canReview === true || role === 'SUPER_ADMIN' || role === 'ADMIN' || role === 'DEPT_ADMIN',\n canManagePermissions: body.review?.canManagePermissions === true || role === 'SUPER_ADMIN' || role === 'ADMIN',\n }\n}\n\n/** Read the current user's notifications. */\nexport async function fetchNotifications(): Promise<{ items: readonly ReviewNotification[]; unread: number } | null> {\n const body = await readJson<{ items?: ReviewNotification[]; unread?: number }>(NOTIFICATIONS_PATH)\n if (body === null || !Array.isArray(body.items)) return null\n return {\n items: body.items,\n unread: typeof body.unread === 'number' ? body.unread : body.items.filter(item => !item.read).length,\n }\n}\n\n/** Mark some notifications, or every one, as read. */\nexport async function markNotificationsRead(ids: 'all' | readonly string[]): Promise<boolean> {\n const response = await fetch(NOTIFICATIONS_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(ids === 'all' ? { all: true } : { ids }),\n })\n return response.ok && response.status !== 503\n}\n\n/** Run the AI review for one or more resources. */\nexport async function scanReview(kind: 'skill' | 'workflow', ids: readonly (string | number)[]): Promise<RiskReport | null> {\n const body = await readJson<{ reports?: RiskReport[] }>(REVIEW_ACTION_PATH, {\n method: 'POST',\n body: JSON.stringify({ action: 'scan', skills: kind === 'skill' ? ids : [], workflows: kind === 'workflow' ? ids : [] }),\n })\n const report = body?.reports?.[0]\n return report !== undefined && Array.isArray(report.findings) ? report : null\n}\n\n/** Record the administrator's decision. The backend enforces the authorization flag too. */\nexport async function decideReview(\n kind: 'skill' | 'workflow',\n ids: readonly (string | number)[],\n decision: 'approve' | 'reject',\n note: string,\n): Promise<boolean> {\n const response = await fetch(REVIEW_ACTION_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({\n action: 'decide',\n skills: kind === 'skill' ? ids : [],\n workflows: kind === 'workflow' ? ids : [],\n decision,\n note,\n authorization: { confirmed: true, reason: 'permission-center' },\n }),\n })\n return response.ok && response.status !== 503\n}\n\n/** Read the permission centre. */\nexport async function fetchRbacOverview(): Promise<RbacOverview | null> {\n if (reviewDemoMode()) {\n const { demoRbacOverview } = await import('./review-demo.ts')\n return demoRbacOverview()\n }\n const [matrix, members, departments, resources] = await Promise.all([\n readJson<{ roles?: RoleMatrixRow[]; permissions?: PermissionPoint[] }>(RBAC_PATH + '?section=matrix&scope=dsh'),\n readJson<{ items?: MemberRow[] }>(RBAC_PATH + '?section=members'),\n readJson<{ items?: DepartmentRow[] }>(RBAC_PATH + '?section=departments'),\n readJson<{ items?: ResourceScopeRow[] }>(RBAC_PATH + '?section=resources'),\n ])\n if (matrix === null || members === null || departments === null || resources === null) return null\n return {\n matrix: { roles: matrix.roles ?? [], permissions: matrix.permissions ?? [] },\n members: members.items ?? [],\n departments: departments.items ?? [],\n resources: resources.items ?? [],\n }\n}\n\n/** What a permission-centre write returned, including the backend's readable refusal. */\nexport interface RbacSaveResult {\n ok: boolean\n reason?: string\n}\n\n/** Persist one permission-centre section. */\nexport async function saveRbacSection(section: 'roles' | 'members' | 'departments' | 'resources', value: unknown): Promise<RbacSaveResult> {\n if (reviewDemoMode()) return { ok: true }\n const response = await fetch(RBAC_PATH, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ section, value }),\n })\n if (response.ok && response.status !== 503) return { ok: true }\n try {\n const body = await response.json() as { message?: unknown; details?: { reason?: unknown } }\n const reason = body.details?.reason ?? body.message\n return { ok: false, ...(typeof reason === 'string' ? { reason } : {}) }\n } catch {\n return { ok: false }\n }\n}\n\n/** Read the three plaza-review switches. */\nexport async function fetchReviewSettings(): Promise<ReviewSettings | null> {\n if (reviewDemoMode()) return DEFAULT_REVIEW_SETTINGS\n return await readJson<ReviewSettings>(REVIEW_SETTINGS_PATH)\n}\n\n/** Persist the three plaza-review switches. */\nexport async function saveReviewSettings(settings: ReviewSettings): Promise<boolean> {\n if (reviewDemoMode()) return true\n const response = await fetch(REVIEW_SETTINGS_PATH, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(settings),\n })\n return response.ok && response.status !== 503\n}\n/** Create one department through the same-origin bridge. */\nexport async function createDepartment(input: {\n code: string\n name: string\n parentCode?: string | null\n description?: string\n owner?: string\n enabled?: boolean\n}): Promise<RbacSaveResult> {\n const response = await fetch(DEPARTMENTS_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(input),\n })\n return await resultOf(response)\n}\n\n/** Update one department; the Host fills `updatedAt` from the current row when omitted. */\nexport async function updateDepartment(input: {\n code: string\n name?: string\n parentCode?: string | null\n description?: string\n owner?: string\n enabled?: boolean\n updatedAt?: string\n}): Promise<RbacSaveResult> {\n const response = await fetch(DEPARTMENTS_PATH, {\n method: 'PATCH',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(input),\n })\n return await resultOf(response)\n}\n\n/** Delete one department after the confirmation dialog. */\nexport async function deleteDepartment(code: string): Promise<RbacSaveResult> {\n const response = await fetch(DEPARTMENTS_PATH, {\n method: 'DELETE',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ code }),\n })\n return await resultOf(response)\n}\n\n/** Map one bridge response to `{ok, reason}` so callers can show the backend text. */\nasync function resultOf(response: Response): Promise<RbacSaveResult> {\n if (response.ok && response.status !== 503) return { ok: true }\n try {\n const body = await response.json() as { message?: unknown; details?: { reason?: unknown } }\n const reason = body.details?.reason ?? body.message\n return { ok: false, ...(typeof reason === 'string' ? { reason } : {}) }\n } catch {\n return { ok: false }\n }\n}\n","import { useEffect, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Button, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { en } from './locales.ts'\nimport { DEFAULT_REVIEW_SETTINGS, fetchReviewSettings, saveReviewSettings } from './review-client.ts'\nimport type { ReviewSettings } from './review-client.ts'\nimport styles from './ManagedDataOpsSection.module.css'\n\n/**\n * The three plaza-review switches.\n *\n * The card is independent of the review queue so the settings page owns the switches while the\n * plaza owns the rows. Defaults are on; a 503 keeps the switches usable and says the API is\n * waiting rather than pretending the save happened.\n */\nexport function ReviewSettingsCard({ t }: { t: (key: keyof typeof en) => string }): ReactNode {\n const [settings, setSettings] = useState<ReviewSettings>(DEFAULT_REVIEW_SETTINGS)\n const [saved, setSaved] = useState<ReviewSettings>(DEFAULT_REVIEW_SETTINGS)\n const [loading, setLoading] = useState(true)\n const [unavailable, setUnavailable] = useState(false)\n const [busy, setBusy] = useState(false)\n const [message, setMessage] = useState<string | null>(null)\n\n useEffect(() => {\n let live = true\n void fetchReviewSettings().then((value) => {\n if (!live) return\n if (value === null) setUnavailable(true)\n else { setSettings(value); setSaved(value) }\n }).catch(() => { if (live) setUnavailable(true) }).finally(() => { if (live) setLoading(false) })\n return () => { live = false }\n }, [])\n\n const changed = settings.skillPlaza !== saved.skillPlaza\n || settings.workflowPlaza !== saved.workflowPlaza\n || settings.knowledgeBase !== saved.knowledgeBase\n\n const save = async (): Promise<void> => {\n setBusy(true)\n setMessage(null)\n try {\n const ok = await saveReviewSettings(settings)\n if (ok) {\n setSaved(settings)\n setMessage(t('reviewSettingsSaved'))\n } else {\n setMessage(t('reviewSettingsWaiting'))\n }\n } catch {\n setMessage(t('reviewSettingsFailed'))\n } finally {\n setBusy(false)\n }\n }\n\n const rows: { key: 'skillPlaza' | 'workflowPlaza' | 'knowledgeBase'; label: string }[] = [\n { key: 'skillPlaza', label: t('reviewSettingsSkill') },\n { key: 'workflowPlaza', label: t('reviewSettingsWorkflow') },\n { key: 'knowledgeBase', label: t('reviewSettingsKb') },\n ]\n\n return (\n <section className={styles.card} data-review-settings-card=\"\">\n <h3 className={styles.heading}>{t('reviewSettingsTitle')}</h3>\n <p className={styles.reviewHint}>{t('reviewSettingsHint')}</p>\n {loading ? <div className={styles.status}><span>{'…'}</span></div> : (\n <div className={styles.reviewRows}>\n {rows.map(row => (\n <div key={row.key} className={styles.reviewRow}>\n <span className={styles.label}>{row.label}</span>\n <Switch\n checked={settings[row.key]}\n label={row.label}\n onChange={(next) => { setSettings(current => ({ ...current, [row.key]: next })) }}\n />\n </div>\n ))}\n </div>\n )}\n {unavailable ? <p className={styles.reviewHint} role=\"status\">{t('reviewSettingsWaiting')}</p> : null}\n {message === null ? null : <p className={styles.reviewHint} role=\"status\">{message}</p>}\n <div className={styles.reviewActions}>\n <Button variant=\"primary\" size=\"sm\" disabled={!changed || busy || loading} onClick={() => { void save() }}>\n {busy ? t('limitsSaving') : t('reviewSettingsSave')}\n </Button>\n </div>\n </section>\n )\n}\n","import { useCallback, useEffect, useId, useState, useSyncExternalStore } from 'react'\nimport { Button, SettingsValueField, StateDot, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { en } from './locales.ts'\nimport { setWanxiangBrandEnabled, wanxiangBrandPreference } from './brand-store.ts'\nimport { fetchModelSyncStatus, postModelSyncAction } from './model-sync-client.ts'\nimport type { ModelSyncStatus } from './model-sync-client.ts'\nimport {\n WorkspaceLimitsRejection,\n fetchWorkspaceLimits,\n saveWorkspaceLimits,\n} from './workspace-limits-client.ts'\nimport type { WorkspaceLimits, WorkspaceLimitsStatus } from './workspace-limits-client.ts'\nimport {\n TOOL_TIMEOUT_MAX_SECONDS,\n TOOL_TIMEOUT_MIN_SECONDS,\n fetchToolTimeout,\n saveToolTimeout,\n} from './tool-timeout-client.ts'\nimport { ReviewSettingsCard } from './ReviewSettingsCard.tsx'\nimport styles from './ManagedDataOpsSection.module.css'\n\n/** Values injected by the DSH Settings slot. */\nexport interface ManagedDataOpsSectionInjected {\n /** Translate one managed DataOps Settings message key. */\n t: (key: keyof typeof en) => string\n}\n\n/** Props accepted by the managed DataOps Settings section. */\nexport type ManagedDataOpsSectionProps = Partial<InjectFace<ManagedDataOpsSectionInjected>>\n\n/** The panel's unit, so a stored byte count survives a round trip through the input. */\nconst BYTES_PER_MIB = 1024 * 1024\n\n/** Render a byte ceiling as the whole MiB the input shows. */\nfunction toMib(bytes: number): string {\n return String(Math.round((bytes / BYTES_PER_MIB) * 100) / 100)\n}\n\n/** Parse a MiB draft into a byte ceiling, or null when it is not a positive count. */\nfunction toBytes(text: string): number | null {\n if (text.trim() === '') return null\n const mib = Number(text)\n if (!Number.isFinite(mib) || mib <= 0) return null\n const bytes = Math.round(mib * BYTES_PER_MIB)\n return Number.isSafeInteger(bytes) && bytes > 0 ? bytes : null\n}\n\n/** Format a stored publication time for the row, or nothing when it never published. */\nfunction publishedText(publishedAt: string): string | null {\n const at = new Date(publishedAt)\n return Number.isNaN(at.getTime()) ? null : at.toLocaleString()\n}\n\n/**\n * The DataOps settings this workspace owns: its connection state, its branding, its file ceilings,\n * and the default configuration it publishes to other workspaces.\n * @param props - Settings slot injection values.\n * @returns The localized managed DataOps section, or nothing before injection.\n */\nexport function ManagedDataOpsSection(props: ManagedDataOpsSectionProps) {\n const { t } = props\n const branding = useSyncExternalStore(\n wanxiangBrandPreference.subscribe,\n wanxiangBrandPreference.getSnapshot,\n wanxiangBrandPreference.getSnapshot,\n )\n if (t === undefined) return null\n\n return (\n <section className={styles.section}>\n <h2 className={styles.title}>{t('title')}</h2>\n <div className={styles.status}>\n <StateDot state=\"done\" />\n <span>{t('managed')}</span>\n </div>\n <BrandingRow t={t} enabled={branding.enabled} />\n <LimitsCard t={t} />\n <TimeoutCard t={t} />\n <ReviewSettingsCard t={t} />\n <DefaultsCard t={t} />\n </section>\n )\n}\n\n/** The branding toggle as one settings row. */\nfunction BrandingRow({ t, enabled }: { t: (key: keyof typeof en) => string; enabled: boolean }) {\n return (\n <div className={styles.card}>\n <div className={styles.row}>\n <span className={styles.label}>{t('brandingTitle')}</span>\n <Switch\n checked={enabled}\n label={t('brandingToggle')}\n onChange={(next) => { setWanxiangBrandEnabled(next) }}\n />\n </div>\n </div>\n )\n}\n\n/** What either card knows about its remote document. */\ntype LoadState<T> =\n | { kind: 'loading' }\n | { kind: 'unavailable' }\n | { kind: 'ready'; status: T }\n | { kind: 'failed' }\n\n/** The one row a card renders while it cannot offer its controls. */\nfunction UnavailableCard({ title, t, state }: {\n title: string\n t: (key: keyof typeof en) => string\n state: 'unavailable' | 'failed'\n}) {\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{title}</h3>\n <div className={styles.status} role={state === 'failed' ? 'alert' : undefined}>\n <StateDot state={state === 'failed' ? 'error' : 'idle'} />\n <span>{state === 'failed' ? t('loadFailed') : t('unavailable')}</span>\n </div>\n </section>\n )\n}\n\n/**\n * The file ceilings DataOps enforces on this workspace.\n *\n * The values live in DataOps and are read through the plugin, which holds the JWT; the panel only\n * ever holds what the administrator is allowed to see.\n * @param props - Translate function from the section.\n * @returns The limits card.\n */\nfunction LimitsCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<WorkspaceLimitsStatus>>({ kind: 'loading' })\n const [fileReadMib, setFileReadMib] = useState('')\n const [uploadMib, setUploadMib] = useState('')\n /** The ceilings the draft started from, so Save stays off until one of them changes. */\n const [saved, setSaved] = useState('')\n /** Why DataOps refused the last save, kept beside the draft it refused. */\n const [refusal, setRefusal] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const fileReadId = useId()\n const uploadId = useId()\n\n const apply = useCallback((status: WorkspaceLimitsStatus) => {\n setState({ kind: 'ready', status })\n const file = toMib(status.limits.fileReadMaxBytes)\n const upload = toMib(status.limits.uploadMaxBytes)\n setFileReadMib(file)\n setUploadMib(upload)\n setSaved(file + '|' + upload)\n setRefusal(null)\n }, [])\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchWorkspaceLimits()\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status)\n } catch {\n setState({ kind: 'failed' })\n }\n }, [apply])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const fileReadBytes = toBytes(fileReadMib)\n const uploadBytes = toBytes(uploadMib)\n const writable = state.kind === 'ready' && state.status.canWrite\n const dirty = fileReadMib + '|' + uploadMib !== saved\n const ready = fileReadBytes !== null && uploadBytes !== null && dirty\n\n /** Edit one ceiling, dropping a refusal that no longer describes what is in the field. */\n const edit = useCallback((set: (text: string) => void) => (text: string) => {\n set(text)\n setRefusal(null)\n }, [])\n\n const submit = useCallback(async () => {\n if (fileReadBytes === null || uploadBytes === null) return\n setBusy(true)\n setRefusal(null)\n try {\n const limits: WorkspaceLimits = { fileReadMaxBytes: fileReadBytes, uploadMaxBytes: uploadBytes }\n const status = await saveWorkspaceLimits(limits)\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status)\n } catch (error) {\n // A refused value keeps the fields and the draft, so the user can correct it in place.\n // Anything else left the card unable to describe its own state, so it reports the read.\n if (error instanceof WorkspaceLimitsRejection) setRefusal(error.message)\n else setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [fileReadBytes, uploadBytes, apply])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('limitsTitle')} t={t} state={state.kind} />\n }\n\n const disabled = busy || !writable\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{t('limitsTitle')}</h3>\n <div className={styles.fields}>\n <div>\n <SettingsValueField\n id={fileReadId}\n label={t('limitsFileReadLabel')}\n text={fileReadMib}\n numeric\n invalid={fileReadBytes === null}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('limitsInvalid')}\n disabled={disabled}\n onEdit={edit(setFileReadMib)}\n onReset={() => undefined}\n />\n </div>\n <div>\n <SettingsValueField\n id={uploadId}\n label={t('limitsUploadLabel')}\n text={uploadMib}\n numeric\n invalid={uploadBytes === null}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('limitsInvalid')}\n disabled={disabled}\n onEdit={edit(setUploadMib)}\n onReset={() => undefined}\n />\n </div>\n </div>\n <div className={styles.actions}>\n {refusal === null\n ? null\n : (\n <span className={styles.refusal} role=\"alert\">\n <StateDot state=\"error\" />\n <span>{refusal}</span>\n </span>\n )}\n <Button variant=\"primary\" size=\"sm\" disabled={disabled || !ready} onClick={() => { void submit() }}>\n {busy ? t('limitsSaving') : t('limitsSave')}\n </Button>\n </div>\n </section>\n )\n}\n\n/**\n * How long one tool call may run before it is abandoned.\n *\n * The value lives in this plugin's own configuration, so it is per workspace and survives a\n * restart. It is edited in seconds because that is the unit an operator reasons in; the plugin\n * stores milliseconds and converts on the way through.\n * @param props - Translate function from the section.\n * @returns The tool-call timeout card.\n */\nfunction TimeoutCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<number>>({ kind: 'loading' })\n const [seconds, setSeconds] = useState('')\n /** The value the draft started from, so Save stays off until it changes. */\n const [saved, setSaved] = useState('')\n const [refusal, setRefusal] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const id = useId()\n\n const apply = useCallback((milliseconds: number) => {\n setState({ kind: 'ready', status: milliseconds })\n const text = String(Math.round(milliseconds / 1000))\n setSeconds(text)\n setSaved(text)\n setRefusal(null)\n }, [])\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchToolTimeout()\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status.toolCallTimeoutMs)\n } catch {\n setState({ kind: 'failed' })\n }\n }, [apply])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const parsed = Number(seconds)\n const valid = seconds.trim() !== '' && Number.isFinite(parsed)\n && parsed >= TOOL_TIMEOUT_MIN_SECONDS && parsed <= TOOL_TIMEOUT_MAX_SECONDS\n const dirty = seconds !== saved\n const disabled = busy\n\n const submit = useCallback(async () => {\n if (!valid) return\n setBusy(true)\n setRefusal(null)\n try {\n const status = await saveToolTimeout(Math.round(parsed * 1000))\n if (status === null) setState({ kind: 'unavailable' })\n else apply(status.toolCallTimeoutMs)\n } catch (error) {\n // A refused value keeps the field and the draft, so the user can correct it in place.\n if (error instanceof Error) setRefusal(error.message)\n else setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [valid, parsed, apply])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('timeoutTitle')} t={t} state={state.kind} />\n }\n\n return (\n <section className={styles.card}>\n <h3 className={styles.heading}>{t('timeoutTitle')}</h3>\n <div className={styles.fields}>\n <div>\n <SettingsValueField\n id={id}\n label={t('timeoutLabel')}\n text={seconds}\n numeric\n invalid={!valid}\n overridden={false}\n overriddenLabel=\"\"\n resetLabel=\"\"\n invalidLabel={t('timeoutInvalid')}\n disabled={disabled}\n onEdit={(text) => { setSeconds(text); setRefusal(null) }}\n onReset={() => undefined}\n />\n </div>\n </div>\n <div className={styles.actions}>\n {refusal === null\n ? null\n : (\n <span className={styles.refusal} role=\"alert\">\n <StateDot state=\"error\" />\n <span>{refusal}</span>\n </span>\n )}\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={disabled || !valid || !dirty}\n onClick={() => { void submit() }}\n >\n {busy ? t('limitsSaving') : t('limitsSave')}\n </Button>\n </div>\n </section>\n )\n}\n\n/**\n * Publish this workspace's configuration as the default other users start from.\n\n * One action rather than a set of controls: the configuration is whatever this workspace already\n * holds, and the button copies it to DataOps.\n * @param props - Translate function from the section.\n * @returns The default-configuration card.\n */\nfunction DefaultsCard({ t }: { t: (key: keyof typeof en) => string }) {\n const [state, setState] = useState<LoadState<ModelSyncStatus>>({ kind: 'loading' })\n const [busy, setBusy] = useState(false)\n\n const refresh = useCallback(async () => {\n try {\n const status = await fetchModelSyncStatus()\n setState(status === null ? { kind: 'unavailable' } : { kind: 'ready', status })\n } catch {\n setState({ kind: 'failed' })\n }\n }, [])\n\n useEffect(() => { void refresh() }, [refresh])\n\n const publish = useCallback(async () => {\n setBusy(true)\n try {\n const status = await postModelSyncAction({ action: 'publish-defaults' })\n if (status === null) setState({ kind: 'unavailable' })\n else setState({ kind: 'ready', status })\n } catch {\n setState({ kind: 'failed' })\n } finally {\n setBusy(false)\n }\n }, [])\n\n if (state.kind === 'loading') return null\n if (state.kind !== 'ready') {\n return <UnavailableCard title={t('defaultsTitle')} t={t} state={state.kind} />\n }\n\n const published = state.status.publishedAt === null\n ? null\n : publishedText(state.status.publishedAt)\n\n // A viewer DataOps does not authorize to publish sees the state without the action, because the\n // permission rule lives in DataOps and the browser must not restate it.\n return (\n <section className={styles.card}>\n <div className={styles.row}>\n <div className={styles.copy}>\n <span className={styles.label}>{t('defaultsTitle')}</span>\n <span className={styles.meta}>\n {published === null\n ? t('defaultsNeverPublished')\n : t('defaultsPublishedAt') + ' · ' + published}\n </span>\n </div>\n {state.status.canPublish\n ? (\n <Button variant=\"outline\" size=\"sm\" disabled={busy} onClick={() => { void publish() }}>\n {busy ? t('defaultsPublishing') : t('defaultsPublish')}\n </Button>\n )\n : <span className={styles.meta}>{t('defaultsNotAdmin')}</span>}\n </div>\n </section>\n )\n}\n","/**\n * Shared vocabulary for the review, permission and notification surfaces.\n *\n * The backend contract is landing in parallel; every field that a legacy row cannot carry\n * yet is optional here and normalized to the product default (approved/global) rather than\n * guessed per component. Keeping the rules in one place is what lets the skill plaza, the\n * permission centre and the notification bell agree on what \"pending\" means.\n */\n\n/** Review state of a shared skill or workflow. */\nexport type ReviewStatus = 'pending' | 'approved' | 'rejected'\n\n/** Who may see a shared resource outside its owner. */\nexport type ResourceVisibility = 'global' | 'department' | 'private'\n\n/** The skill-plaza filter tabs, in display order. */\nexport type ReviewTab = 'approved' | 'pending' | 'all'\n\n/** The four DataOps roles the permission centre knows. */\nexport type PortalRole = 'SUPER_ADMIN' | 'ADMIN' | 'DEPT_ADMIN' | 'APP_USER'\n\n/** One node of a department ancestry path. */\nexport interface DepartmentPathEntry {\n code: string\n name: string\n}\n\n/** A department as a card tag needs it: code, label, and the ancestry for the tooltip. */\nexport interface DepartmentSummary {\n code: string\n name: string\n /** Root-first path, in either the legacy string form or the backend object form. */\n path?: readonly (string | DepartmentPathEntry)[]\n}\n\n/** One AI risk finding. */\nexport interface RiskFinding {\n category: string\n severity: 'low' | 'medium' | 'high'\n evidence?: string\n recommendation?: string\n}\n\n/** The AI report attached to a pending resource. */\nexport interface RiskReport {\n score?: number\n /** Overall severity, which is wider than a single finding's severity. */\n severity?: 'low' | 'medium' | 'high' | 'critical'\n summary?: string\n findings: readonly RiskFinding[]\n scannedAt?: string\n}\n\n/** The caller's review permissions, as the Host reports them. */\nexport interface ReviewContext {\n userId?: string\n role: PortalRole\n departmentCode?: string\n departmentPath?: readonly string[]\n canReview: boolean\n canManagePermissions: boolean\n}\n\n/** One notification row. */\nexport interface ReviewNotification {\n id: string\n type: string\n title: string\n body?: string\n resourceKind?: string\n resourceId?: string | number\n read: boolean\n createdAt: string\n}\n\n/** A reviewable row as the cards read it. */\nexport interface ReviewableSummary {\n reviewStatus?: ReviewStatus\n visibility?: ResourceVisibility\n departmentCode?: string | null\n departmentName?: string\n departmentPath?: readonly (string | DepartmentPathEntry)[]\n riskReport?: RiskReport | null\n reviewNote?: string | null\n submittedAt?: string\n}\n\n/** Treat a missing status as approved: rows written before the review state existed were live. */\nexport function normalizeReviewStatus(value: unknown): ReviewStatus {\n return value === 'pending' || value === 'rejected' || value === 'approved' ? value : 'approved'\n}\n\n/** Treat a missing visibility as global: a shared row with no scope was visible to everyone. */\nexport function normalizeVisibility(value: unknown): ResourceVisibility {\n return value === 'department' || value === 'private' ? value : 'global'\n}\n\n/** Whether the caller may see and act on the review queue. */\nexport function canReview(context: ReviewContext | null | undefined): boolean {\n if (context === null || context === undefined) return false\n return context.canReview || context.role === 'SUPER_ADMIN' || context.role === 'ADMIN' || context.role === 'DEPT_ADMIN'\n}\n\n/** Whether the caller may open the permission centre's write controls. */\nexport function canManagePermissions(context: ReviewContext | null | undefined): boolean {\n if (context === null || context === undefined) return false\n return context.canManagePermissions || context.role === 'SUPER_ADMIN' || context.role === 'ADMIN'\n}\n\n/**\n * The tabs this caller may see.\n *\n * A department administrator sees the queue too, but the Host narrows it to their subtree;\n * an ordinary user gets only the approved list, and no tab strip at all when there is one tab.\n */\nexport function reviewTabsFor(context: ReviewContext | null | undefined): readonly ReviewTab[] {\n if (!canReview(context)) return ['approved']\n return ['approved', 'pending', 'all']\n}\n\n/** Filter rows by the selected review tab. */\nexport function filterByReview<T extends ReviewableSummary>(rows: readonly T[], tab: ReviewTab): readonly T[] {\n if (tab === 'all') return rows\n return rows.filter(row => normalizeReviewStatus(row.reviewStatus) === tab)\n}\n\n/** Counts for the tab labels. */\nexport function reviewCounts(rows: readonly ReviewableSummary[]): Record<ReviewTab, number> {\n const counts: Record<ReviewTab, number> = { approved: 0, pending: 0, all: rows.length }\n for (const row of rows) {\n const status = normalizeReviewStatus(row.reviewStatus)\n if (status === 'pending') counts.pending += 1\n else if (status === 'rejected') counts.all += 0\n else counts.approved += 1\n }\n return counts\n}\n\n/** The status badge shown on a local skill card. */\nexport function reviewStatusLabel(status: ReviewStatus): string {\n switch (status) {\n case 'pending': return '待审核'\n case 'rejected': return '已驳回'\n default: return '已上架'\n }\n}\n\n/**\n * The visibility tag in a card's top-right corner.\n *\n * A department tag names the department and keeps the full path in the tooltip; a global tag\n * is one word because it is the default and should not compete with the skill name.\n */\n/** Read a department path from either the legacy string form or the backend object form. */\nexport function departmentPathNames(path: ReviewableSummary['departmentPath']): string[] {\n if (path === undefined) return []\n return path.map(entry => typeof entry === 'string' ? entry : entry.name)\n}\n\nexport function visibilityTag(row: ReviewableSummary): { label: string; detail: string } {\n const visibility = normalizeVisibility(row.visibility)\n if (visibility === 'private') return { label: '私有', detail: '仅自己可见' }\n if (visibility === 'global') return { label: '全局', detail: '所有已登录用户可见' }\n const path = departmentPathNames(row.departmentPath)\n const name = row.departmentName ?? path.at(-1) ?? row.departmentCode ?? '部门'\n return { label: name + '部门专属', detail: path.length === 0 ? name : path.join(' / ') }\n}\n\n/** Unread count for a bell badge. */\nexport function unreadCount(items: readonly ReviewNotification[]): number {\n return items.reduce((total, item) => total + (item.read ? 0 : 1), 0)\n}\n\n/** Newest first. Read state never reorders rows, so marking one read cannot move it to another page. */\nexport function sortNotifications(items: readonly ReviewNotification[]): readonly ReviewNotification[] {\n return [...items].sort((left, right) => right.createdAt.localeCompare(left.createdAt))\n}\n\n/** The tab a notification should open, when its resource has one. */\nexport function notificationTab(item: ReviewNotification): ReviewTab | undefined {\n if (item.type === 'submitted' || item.type === 'review_pending' || item.type === 'ai_report_ready' || item.type === 'ai_report') return 'pending'\n if (item.type === 'approved' || item.type === 'published' || item.type === 'shared') return 'approved'\n return undefined\n}","/** Same-origin skill plaza calls from the DataOps skill center section. */\n\nimport type { ReviewStatus, ResourceVisibility } from './review-types.ts'\nimport { normalizeReviewStatus, normalizeVisibility } from './review-types.ts'\n\n/** Route the plugin's Host half serves for the plaza. */\nexport const SKILL_PLAZA_PATH = '/integrations/dataops/skill-plaza'\n\n/** One plaza entry as the section reads it. */\nexport interface PlazaSkill {\n id: number\n name: string\n description?: string\n instruction: string\n tags: string[]\n sharedByMe: boolean\n updatedAt: string\n reviewStatus: ReviewStatus\n visibility: ResourceVisibility\n departmentCode?: string | null\n departmentName?: string\n departmentPath?: readonly { code: string; name: string }[]\n ownerName?: string\n riskReport?: import('./review-types.ts').RiskReport | null\n reviewNote?: string | null\n submittedAt?: string\n}\n\n/** The plaza listing and the tags in use. */\nexport interface PlazaListing {\n skills: PlazaSkill[]\n tags: string[]\n counts?: { pending: number; approved: number; rejected: number; total: number }\n}\n\n/** Narrow an unknown value to a plaza entry. */\nfunction asSkill(value: unknown): PlazaSkill | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const row = value as Record<string, unknown>\n if (typeof row.id !== 'number' || typeof row.name !== 'string') return null\n return {\n id: row.id,\n name: row.name,\n description: typeof row.description === 'string' ? row.description : undefined,\n instruction: typeof row.instruction === 'string' ? row.instruction : '',\n tags: Array.isArray(row.tags) ? row.tags.filter((tag): tag is string => typeof tag === 'string') : [],\n sharedByMe: row.sharedByMe === true,\n updatedAt: typeof row.updatedAt === 'string' ? row.updatedAt : '',\n reviewStatus: normalizeReviewStatus(row.reviewStatus),\n visibility: normalizeVisibility(row.visibility),\n departmentCode: typeof row.departmentCode === 'string' ? row.departmentCode : null,\n departmentName: typeof row.departmentName === 'string' ? row.departmentName : undefined,\n departmentPath: Array.isArray(row.departmentPath)\n ? row.departmentPath.flatMap(entry => (\n typeof entry === 'object' && entry !== null && typeof (entry as { name?: unknown }).name === 'string'\n ? [{ code: String((entry as { code?: unknown }).code ?? ''), name: String((entry as { name: string }).name) }]\n : []\n ))\n : undefined,\n ownerName: typeof row.ownerName === 'string' ? row.ownerName : undefined,\n riskReport: typeof row.riskReport === 'object' && row.riskReport !== null ? row.riskReport as PlazaSkill['riskReport'] : null,\n reviewNote: typeof row.reviewNote === 'string' ? row.reviewNote : null,\n submittedAt: typeof row.submittedAt === 'string' ? row.submittedAt : undefined,\n }\n}\n\n/** Narrow an unknown value to the listing. */\nfunction asListing(value: unknown): PlazaListing | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const row = value as Record<string, unknown>\n const source = Array.isArray(row.skills) ? row.skills : Array.isArray(row.items) ? row.items : []\n const skills = source.flatMap((entry) => asSkill(entry) ?? [])\n const tags = Array.isArray(row.tags) ? row.tags.filter((tag): tag is string => typeof tag === 'string') : []\n const rawCounts = typeof row.counts === 'object' && row.counts !== null ? row.counts as Record<string, unknown> : {}\n const counts = Object.keys(rawCounts).length === 0 ? undefined : {\n pending: Number(rawCounts.pending ?? 0),\n approved: Number(rawCounts.approved ?? 0),\n rejected: Number(rawCounts.rejected ?? 0),\n total: Number(rawCounts.total ?? skills.length),\n }\n return { skills, tags, counts }\n}\n\n/**\n * Read the plaza.\n * @param filter - Optional tag and text filters.\n * @returns The listing, or null when this workspace is not connected to DataOps.\n */\nexport async function fetchPlaza(filter: { tag?: string; query?: string; status?: string; scope?: string } = {}): Promise<PlazaListing | null> {\n const params = new URLSearchParams()\n if (filter.tag !== undefined && filter.tag !== '') params.set('tag', filter.tag)\n if (filter.query !== undefined && filter.query !== '') params.set('q', filter.query)\n if (filter.status !== undefined) params.set('status', filter.status)\n if (filter.scope !== undefined) params.set('scope', filter.scope)\n const suffix = params.size === 0 ? '' : '?' + params.toString()\n const response = await fetch(SKILL_PLAZA_PATH + suffix, { headers: { accept: 'application/json' } })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('skill plaza read failed with HTTP ' + String(response.status))\n return asListing(await response.json())\n}\n\n/**\n * Change the plaza.\n * @param body - Action and its parameters.\n * @returns The parsed reply, or null when the plugin is not active.\n */\nexport async function postPlazaAction(body: Record<string, unknown>): Promise<unknown> {\n const response = await fetch(SKILL_PLAZA_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(body),\n })\n if (response.status === 503) return null\n if (!response.ok) throw new Error('skill plaza action failed with HTTP ' + String(response.status))\n return await response.json()\n}\n","/**\n * One process-wide notification store shared by every bell.\n *\n * The skill plaza and the workflow plaza are separate React trees, but they show the same\n * inbox; keeping the read state in one store is what stops a badge in one place from staying\n * unread after the other opened the row.\n */\n\nimport { useEffect } from 'react'\nimport { fetchNotifications, markNotificationsRead, reviewDemoMode } from './review-client.ts'\nimport type { ReviewNotification } from './review-types.ts'\nimport { sortNotifications, unreadCount } from './review-types.ts'\n\ninterface NotificationState {\n status: 'idle' | 'loading' | 'ready' | 'unavailable'\n items: readonly ReviewNotification[]\n unread: number\n}\n\nconst DEMO_ITEMS: readonly ReviewNotification[] = [\n {\n id: 'demo-1', type: 'review_pending', title: '技能「SQL 取数助手」等待审核',\n body: '来自研发部 · 提交于 10 分钟前', resourceKind: 'skill', resourceId: 101, read: false,\n createdAt: '2026-10-23T04:50:00.000Z',\n },\n {\n id: 'demo-2', type: 'ai_report', title: 'AI 风险报告已生成',\n body: '风险等级:中 · 2 条建议', resourceKind: 'skill', resourceId: 101, read: false,\n createdAt: '2026-10-23T04:49:00.000Z',\n },\n {\n id: 'demo-3', type: 'approved', title: '工作流「每日经营日报」已通过',\n body: '审核人:admin', resourceKind: 'workflow', resourceId: 'wf-1', read: true,\n createdAt: '2026-10-22T09:10:00.000Z',\n },\n]\n\nlet state: NotificationState = { status: 'idle', items: [], unread: 0 }\nconst listeners = new Set<() => void>()\n\nfunction publish(next: NotificationState): void {\n state = next\n for (const listener of listeners) listener()\n}\n\n/** Current snapshot for `useSyncExternalStore`. */\nexport function notificationSnapshot(): NotificationState {\n return state\n}\n\n/** Subscribe to store changes. */\nexport function subscribeNotifications(listener: () => void): () => void {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n}\n\n/** Load the inbox once; a second caller joins the first request. */\nlet inflight: Promise<void> | undefined\nexport function loadNotifications(): Promise<void> {\n if (inflight !== undefined) return inflight\n publish({ ...state, status: 'loading' })\n inflight = (async () => {\n try {\n if (reviewDemoMode()) {\n publish({ status: 'ready', items: sortNotifications(DEMO_ITEMS), unread: unreadCount(DEMO_ITEMS) })\n return\n }\n const result = await fetchNotifications()\n if (result === null) {\n publish({ status: 'unavailable', items: [], unread: 0 })\n return\n }\n publish({ status: 'ready', items: sortNotifications(result.items), unread: unreadCount(result.items) })\n } catch {\n publish({ status: 'unavailable', items: [], unread: 0 })\n } finally {\n inflight = undefined\n }\n })()\n return inflight\n}\n\n/** Mark one row or the whole inbox read, optimistically. */\nexport async function markRead(ids: 'all' | readonly string[]): Promise<void> {\n const items = ids === 'all' ? state.items.map(item => ({ ...item, read: true })) : state.items.map(item => (\n ids.includes(item.id) ? { ...item, read: true } : item\n ))\n publish({ ...state, items, unread: unreadCount(items) })\n try {\n const ok = await markNotificationsRead(ids)\n if (!ok) await loadNotifications()\n } catch {\n await loadNotifications()\n }\n}\n\n/** Load the inbox when a bell first mounts. */\nexport function useNotifications(): NotificationState {\n useEffect(() => { void loadNotifications() }, [])\n // The component calls `useSyncExternalStore` itself; this hook only owns the first load.\n return state\n}","import { useEffect, useSyncExternalStore, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { ReviewNotification } from './review-types.ts'\nimport { sortNotifications, unreadCount } from './review-types.ts'\nimport {\n loadNotifications,\n markRead,\n notificationSnapshot,\n subscribeNotifications,\n} from './review-notification-store.ts'\nimport { reviewDemoMode } from './review-client.ts'\nimport styles from './NotificationBell.module.css'\n\n/** Colour tone and glyph for one notification type, matching the automation-task rows. */\nfunction notificationTone(type: string): 'success' | 'danger' | 'warn' | 'info' {\n if (type === 'approved' || type === 'published' || type === 'success') return 'success'\n if (type === 'rejected') return 'danger'\n if (type === 'unpublished') return 'warn'\n return 'info'\n}\n\nfunction NotificationIcon({ tone }: { tone: 'success' | 'danger' | 'warn' | 'info' }): ReactNode {\n if (tone === 'success') {\n return <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"8\" r=\"6.2\" stroke=\"currentColor\" strokeWidth=\"1.3\" /><path d=\"m5.3 8.1 1.8 1.8 3.6-3.8\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" /></svg>\n }\n if (tone === 'danger') {\n return <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M8 2.3 14 13H2L8 2.3Z\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\" /><path d=\"M8 6v3.1\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" /><circle cx=\"8\" cy=\"11.2\" r=\".7\" fill=\"currentColor\" /></svg>\n }\n if (tone === 'warn') {\n return <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"8\" r=\"6.2\" stroke=\"currentColor\" strokeWidth=\"1.3\" /><path d=\"M8 4.8v3.6\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinecap=\"round\" /><circle cx=\"8\" cy=\"11.1\" r=\".7\" fill=\"currentColor\" /></svg>\n }\n return <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M4 2.5h5l3 3v8H4v-11Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" /><path d=\"M9 2.5v3h3M6 8h4M6 10.5h3\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" /></svg>\n}\n\n/** Props accepted by a bell. */\nexport interface NotificationBellProps {\n /** Accessible label; the two plaza headings differ so screen readers can tell them apart. */\n label: string\n /** Called after a row is read, so the plaza can jump to the matching tab or card. */\n onOpen?: (item: ReviewNotification) => void\n}\n\n/**\n * A bell with an unread badge and the shared inbox.\n *\n * The bell is a button rather than a menu so keyboard focus and Escape follow the dialog\n * conventions the rest of the page already uses. Rows mark themselves read when opened;\n * \"全部已读\" is the one bulk action.\n */\nexport function NotificationBell({ label, onOpen }: NotificationBellProps): ReactNode {\n const state = useSyncExternalStore(subscribeNotifications, notificationSnapshot, notificationSnapshot)\n const [open, setOpen] = useState(false)\n const [page, setPage] = useState(0)\n const items = sortNotifications(state.items)\n const unread = unreadCount(items)\n const pages = Math.max(1, Math.ceil(items.length / 20))\n const visible = items.slice(page * 20, page * 20 + 20)\n\n useEffect(() => {\n // Marking rows read changes no ordering; only a shrinking inbox can invalidate the page.\n if (page >= pages) setPage(pages - 1)\n }, [page, pages])\n\n // Load once on mount so the badge states the real unread count before the reader clicks.\n useEffect(() => { void loadNotifications() }, [])\n\n const openOne = (item: ReviewNotification): void => {\n void markRead([item.id])\n setOpen(false)\n onOpen?.(item)\n }\n\n return (\n <>\n <button\n type=\"button\"\n className={styles.bell}\n aria-label={unread === 0 ? label : label + ',' + String(unread) + ' 条未读'}\n title={label}\n data-notification-bell=\"\"\n data-unread={unread}\n onClick={() => {\n setOpen(true)\n setPage(0)\n void loadNotifications()\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M8 2.2a4.1 4.1 0 0 0-4.1 4.1v2.3L2.7 10.8a.6.6 0 0 0 .5.9h9.6a.6.6 0 0 0 .5-.9L12.1 8.6V6.3A4.1 4.1 0 0 0 8 2.2Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n <path d=\"M6.4 13.2a1.7 1.7 0 0 0 3.2 0\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n {unread === 0 ? null : <span className={styles.badge}>{unread > 99 ? '99+' : unread}</span>}\n </button>\n <Modal\n open={open}\n onClose={() => { setOpen(false) }}\n title={label}\n closeLabel=\"关闭\"\n className={styles.dialog as string}\n footer={(\n <div className={styles.actions}>\n <button type=\"button\" className={styles.linkButton} onClick={() => { void markRead('all') }}>\n 全部已读\n </button>\n <button type=\"button\" className={styles.button} onClick={() => { setOpen(false) }}>关闭</button>\n </div>\n )}\n >\n {reviewDemoMode() ? <p className={styles.demo}>演示数据 · 后端契约到达后自动切换</p> : null}\n {state.status === 'unavailable' ? (\n <p className={styles.empty}>通知服务待后端联调(task-35);上线后这里会显示审核、上架与 AI 报告事件。</p>\n ) : null}\n {state.status !== 'unavailable' && items.length === 0 ? <p className={styles.empty}>暂无通知。</p> : null}\n {items.length === 0 ? null : (\n <ul className={styles.list}>\n {visible.map(item => (\n <li key={item.id}>\n <button\n type=\"button\"\n className={styles.row}\n onClick={() => { openOne(item) }}\n >\n <span className={styles.rowIcon} data-tone={notificationTone(item.type)} aria-hidden=\"true\"><NotificationIcon tone={notificationTone(item.type)} /></span>\n <span className={styles.rowBody}>\n <span className={styles.rowTitle}>{item.title}</span>\n {item.body === undefined ? null : <span className={styles.rowText}>{item.body}</span>}\n </span>\n <span className={styles.rowMeta}>\n <span className={styles.rowTime}>{item.createdAt.slice(0, 16).replace('T', ' ')}</span>\n {item.read ? null : <span className={styles.dot} aria-hidden=\"true\" />}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n {items.length === 0 ? null : (\n <div className={styles.pager}>\n <button type=\"button\" disabled={page === 0} onClick={() => { setPage(current => Math.max(0, current - 1)) }}>上一页</button>\n <span>第 {page + 1} / {pages} 页 · 共 {items.length} 条</span>\n <button type=\"button\" disabled={page >= pages - 1} onClick={() => { setPage(current => Math.min(pages - 1, current + 1)) }}>下一页</button>\n </div>\n )}\n </Modal>\n </>\n )\n}\n\n/** The automation page's seat: the same inbox under the workflow plaza's heading. */\nexport function WorkflowPlazaBell(): ReactNode {\n return <NotificationBell label=\"自动化任务通知\" />\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n Button,\n IconDownloadOutlineRegular,\n IconRefreshOutlineRegular,\n IconShareOutlineRegular,\n IconSkillOutlineRegular,\n IconTrashOutlineRegular,\n Modal,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { en } from './locales.ts'\nimport { fetchPlaza, postPlazaAction, type PlazaListing, type PlazaSkill } from './skill-plaza-client.ts'\nimport { decideReview, fetchReviewContext, reviewDemoMode, scanReview } from './review-client.ts'\nimport type { ReviewContext, ReviewTab, RiskReport } from './review-types.ts'\nimport {\n canReview,\n filterByReview,\n notificationTab,\n normalizeReviewStatus,\n normalizeVisibility,\n reviewCounts,\n reviewTabsFor,\n visibilityTag,\n} from './review-types.ts'\nimport { demoPlazaSkills } from './review-demo.ts'\nimport { NotificationBell } from './NotificationBell.tsx'\nimport styles from './SkillPlazaSection.module.css'\n\n/** Values the skill center passes to a contributed section. */\nexport interface SkillPlazaSectionInjected {\n /** Translate one DataOps plaza message key. */\n t: (key: keyof typeof en) => string\n /**\n * The page's current search text.\n *\n * The page draws one search field for every skill it shows, and this section is part of that\n * page. Filtering here with the same text keeps the visible result consistent with the field;\n * drawing a second field would offer the same control twice and filter only half the page.\n */\n query: string\n}\n\n/** Props accepted by the plaza section. */\nexport type SkillPlazaSectionProps = Partial<InjectFace<SkillPlazaSectionInjected>>\n\n/** What the section currently knows. */\ntype PlazaState =\n | { kind: 'loading' }\n | { kind: 'unavailable' }\n | { kind: 'ready'; listing: PlazaListing }\n | { kind: 'failed' }\n\n/** Tab counts from the same visible rows the cards render. */\nfunction countsOf(skills: readonly PlazaSkill[]): NonNullable<PlazaListing['counts']> {\n const counted = reviewCounts(skills)\n return {\n approved: counted.approved,\n pending: counted.pending,\n rejected: skills.filter(row => row.reviewStatus === 'rejected').length,\n total: counted.all,\n }\n}\n\n/** A plaza tab: the review states plus the department filter. */\ntype PlazaTab = ReviewTab | 'department'\n\n/** One department option derived from the rows the plaza can show. */\nexport interface PlazaDepartmentOption {\n /** Value the select submits: the department code when the row carries one. */\n code: string\n /** Label shown in the select; never empty. */\n name: string\n}\n\n/**\n * The department a plaza row belongs to.\n *\n * The backend normally sends `departmentCode`; a legacy row may carry only a name or path, so the\n * fallbacks keep those rows selectable instead of dropping them into an empty key.\n * @param skill - one plaza row.\n * @returns the code, the name, or the deepest path name; empty when the row says nothing.\n */\nexport function departmentKeyOf(skill: PlazaSkill): string {\n return skill.departmentCode ?? skill.departmentName ?? skill.departmentPath?.at(-1)?.name ?? ''\n}\n\n/**\n * The department choices present in the visible rows.\n *\n * The label falls back from the row's own name to the deepest path name and finally to the code,\n * so a department the backend can no longer name still renders as a readable option.\n * @param skills - every row the current query returned.\n * @returns distinct departments, sorted by label.\n */\nexport function departmentOptionsOf(skills: readonly PlazaSkill[]): PlazaDepartmentOption[] {\n const options = new Map<string, string>()\n for (const skill of skills) {\n if (normalizeVisibility(skill.visibility) !== 'department') continue\n const code = departmentKeyOf(skill)\n if (code === '' || options.has(code)) continue\n options.set(code, skill.departmentName ?? skill.departmentPath?.at(-1)?.name ?? code)\n }\n return [...options].map(([code, name]) => ({ code, name })).sort((left, right) => left.name.localeCompare(right.name, 'zh-Hans-CN'))\n}\n\n/**\n * The rows the department tab shows.\n * @param skills - every row the current query returned.\n * @param code - selected department key, or an empty string for all of them.\n * @returns the department-shared rows, narrowed to `code` when it is set.\n */\nexport function filterByDepartment(skills: readonly PlazaSkill[], code: string): PlazaSkill[] {\n const shared = skills.filter(skill => normalizeVisibility(skill.visibility) === 'department')\n return code === '' ? shared : shared.filter(skill => departmentKeyOf(skill) === code)\n}\n\n/** One skill as a card in the plaza grid. */\nfunction PlazaCard({ skill, busy, canAudit, onInstall, onUnshare, onReview, t }: {\n skill: PlazaSkill\n busy: boolean\n canAudit: boolean\n onInstall: () => void\n onUnshare: () => void\n onReview: () => void\n t: (key: keyof typeof en) => string\n}): ReactNode {\n const [open, setOpen] = useState(false)\n const status = normalizeReviewStatus(skill.reviewStatus)\n const tag = visibilityTag(skill)\n return (\n <li className={styles.card} data-review-status={status}>\n <div className={styles.cardTop}>\n <span className={styles.cardIcon}><IconSkillOutlineRegular size={16} /></span>\n <div className={styles.cardTitle}>{skill.name}</div>\n <span className={styles.tagTop} title={tag.detail}>{tag.label}</span>\n </div>\n <div className={styles.cardMarks}>\n {skill.sharedByMe ? <span className={styles.sharedTag}>{t('plazaSharedTag')}</span> : null}\n {status === 'pending' ? <span className={styles.pendingTag}>{t('plazaTabPending')}</span> : null}\n {status === 'rejected' ? <span className={styles.rejectedTag}>{t('plazaReject')}</span> : null}\n {skill.tags.map(item => <span className={styles.mark} key={item}>{item}</span>)}\n </div>\n <div className={styles.cardDesc}>{skill.description ?? ''}</div>\n {status === 'rejected' && skill.reviewNote !== null && skill.reviewNote !== undefined ? (\n <p className={styles.reviewNote}>{skill.reviewNote}</p>\n ) : null}\n <div className={styles.cardEnd}>\n {canAudit && status === 'pending' ? (\n <Button variant=\"outline\" size=\"sm\" className={styles.reviewButton} onClick={onReview}>\n {t('plazaReview')}\n </Button>\n ) : null}\n <Button variant=\"outline\" size=\"sm\" icon={<IconDownloadOutlineRegular size={16} />} disabled={busy} onClick={onInstall}>\n {t('plazaInstall')}\n </Button>\n {skill.sharedByMe ? (\n <Button variant=\"ghost\" size=\"sm\" icon={<IconTrashOutlineRegular size={16} />} disabled={busy} onClick={onUnshare}>\n {t('plazaUnshare')}\n </Button>\n ) : null}\n <Button variant=\"outline\" size=\"sm\" className={styles.detailButton} onClick={() => { setOpen(true) }}>\n {t('plazaShowDetail')}\n </Button>\n </div>\n <Modal\n open={open}\n onClose={() => { setOpen(false) }}\n title={skill.name}\n closeLabel={t('plazaClose')}\n className={styles.dialog as string}\n footer={<Button variant=\"outline\" onClick={() => { setOpen(false) }}>{t('plazaClose')}</Button>}\n >\n <dl className={styles.detail}>\n <div className={styles.detailRow}><dt className={styles.detailLabel}>{t('plazaDetailUpdated')}</dt><dd className={styles.detailValue}>{skill.updatedAt}</dd></div>\n <div className={styles.detailRow}><dt className={styles.detailLabel}>{t('plazaDetailBody')}</dt><dd className={styles.detailValue}>{skill.instruction}</dd></div>\n </dl>\n </Modal>\n </li>\n )\n}\n\n/** The AI report block inside the audit dialog. */\nfunction RiskReportView({ report, busy, failed, onScan, t }: {\n report: RiskReport | null\n busy: boolean\n failed: boolean\n onScan: () => void\n t: (key: keyof typeof en) => string\n}): ReactNode {\n return (\n <section className={styles.risk}>\n <div className={styles.riskHead}>\n <strong>{t('plazaRiskTitle')}</strong>\n <Button variant=\"outline\" size=\"sm\" disabled={busy} onClick={onScan}>\n {busy ? t('plazaRiskScanning') : t('plazaRiskScan')}\n </Button>\n </div>\n {failed ? <p className={styles.riskFailed}>{t('plazaRiskFailed')}</p> : null}\n {report === null ? (busy ? null : <p className={styles.riskEmpty}>{t('plazaRiskNone')}</p>) : (\n <>\n <div className={styles.riskSummary}>\n {report.score === undefined ? null : <span className={styles.riskScore}>{t('plazaRiskScore')} {report.score}</span>}\n {report.severity === undefined ? null : <span className={styles.severity} data-severity={report.severity}>{report.severity}</span>}\n {report.summary === undefined ? null : <span>{report.summary}</span>}\n </div>\n <ul className={styles.findings}>\n {report.findings.map((finding, index) => (\n <li key={String(index)} className={styles.finding}>\n <span className={styles.severity} data-severity={finding.severity}>{finding.severity}</span>\n <strong>{finding.category}</strong>\n {finding.evidence === undefined ? null : <span className={styles.findingText}>{finding.evidence}</span>}\n {finding.recommendation === undefined ? null : <span className={styles.findingHint}>{finding.recommendation}</span>}\n </li>\n ))}\n </ul>\n </>\n )}\n </section>\n )\n}\n\n/**\n * Browse, share, and install skills other users published.\n *\n * Review is a permissioned overlay on the same plaza: the tab strip and the audit dialog only\n * appear when the Host says the caller may review, and the Host additionally narrows the pending\n * list to the caller's department subtree.\n */\nexport function SkillPlazaSection(props: SkillPlazaSectionProps): ReactNode {\n const { t } = props\n const [state, setState] = useState<PlazaState>({ kind: 'loading' })\n const [context, setContext] = useState<ReviewContext | null | undefined>(undefined)\n const [tab, setTab] = useState<PlazaTab>('approved')\n const [department, setDepartment] = useState('')\n const [busy, setBusy] = useState(false)\n const [notice, setNotice] = useState<string | null>(null)\n const [audit, setAudit] = useState<PlazaSkill | null>(null)\n const [risk, setRisk] = useState<RiskReport | null>(null)\n const [riskBusy, setRiskBusy] = useState(false)\n const [riskFailed, setRiskFailed] = useState(false)\n const [reviewNote, setReviewNote] = useState('')\n const [reviewBusy, setReviewBusy] = useState(false)\n const [reviewError, setReviewError] = useState<string | null>(null)\n const query = props.query ?? ''\n const allowed = canReview(context)\n\n useEffect(() => {\n let live = true\n void fetchReviewContext().then((next) => { if (live) setContext(next) }).catch(() => { if (live) setContext(null) })\n return () => { live = false }\n }, [])\n\n const load = useCallback(async (filter: { query: string }) => {\n try {\n // The demo fixture is complete on its own: mixing it with a live list would still call a\n // backend whose review endpoints have not shipped, which is exactly what the fixture exists\n // to review without.\n if (reviewDemoMode()) {\n const demo = demoPlazaSkills()\n setState({\n kind: 'ready',\n listing: {\n skills: [...demo],\n tags: [],\n counts: countsOf(demo),\n },\n })\n return\n }\n // One visible snapshot per query. The tab and the department are client-side filters, so the\n // count on each tab is always the number of cards that tab will actually show.\n const listing = await fetchPlaza({ query: filter.query, status: allowed ? 'all' : 'approved' })\n if (listing === null) {\n setState({ kind: 'unavailable' })\n return\n }\n const visible = allowed ? listing.skills : listing.skills.filter(row => normalizeReviewStatus(row.reviewStatus) === 'approved')\n setState({ kind: 'ready', listing: { ...listing, skills: [...visible], counts: countsOf(visible) } })\n } catch {\n setState({ kind: 'failed' })\n }\n }, [allowed])\n\n useEffect(() => { void load({ query }) }, [load, query])\n\n const refresh = useCallback(async () => {\n await load({ query })\n }, [load, query])\n\n const act = useCallback(async (body: Record<string, unknown>, message: string) => {\n setBusy(true)\n setNotice(null)\n try {\n await postPlazaAction(body)\n setNotice(message)\n await refresh()\n } catch {\n setNotice(t === undefined ? null : t('plazaActionFailed'))\n } finally {\n setBusy(false)\n }\n }, [refresh, t])\n\n const runScan = async (skill: PlazaSkill): Promise<void> => {\n setRiskBusy(true)\n setRiskFailed(false)\n try {\n const report = await scanReview('skill', [skill.id])\n if (report === null) setRiskFailed(true)\n else setRisk(report)\n } catch {\n setRiskFailed(true)\n } finally {\n setRiskBusy(false)\n }\n }\n\n const openAudit = (skill: PlazaSkill): void => {\n setAudit(skill)\n setRisk(skill.riskReport ?? null)\n setRiskFailed(false)\n setReviewNote('')\n setReviewError(null)\n if (skill.riskReport === null || skill.riskReport === undefined) void runScan(skill)\n }\n\n const submitReview = async (decision: 'approve' | 'reject'): Promise<void> => {\n if (audit === null || reviewBusy) return\n if (decision === 'reject' && reviewNote.trim() === '') {\n setReviewError(t === undefined ? null : t('plazaReviewNote'))\n return\n }\n setReviewBusy(true)\n setReviewError(null)\n try {\n const ok = await decideReview('skill', [audit.id], decision, reviewNote.trim())\n if (!ok) {\n setReviewError(t === undefined ? null : t('plazaReviewFailed'))\n return\n }\n setAudit(null)\n setNotice(t === undefined ? null : t('plazaReviewDone'))\n setTab('pending')\n await refresh()\n } catch {\n setReviewError(t === undefined ? null : t('plazaReviewFailed'))\n } finally {\n setReviewBusy(false)\n }\n }\n\n if (t === undefined) return null\n if (state.kind === 'loading') return null\n\n const head = (count: number | null): ReactNode => (\n <div className={styles.head}>\n <div className={styles.headRow}>\n <h2 className={styles.title}>\n {t('plazaTitle')}\n {count === null ? null : <span className={styles.titleCount}>{count}</span>}\n </h2>\n {reviewDemoMode() ? <span className={styles.demoTag}>{t('plazaDemo')}</span> : null}\n <NotificationBell\n label={t('plazaTitle') + '通知'}\n onOpen={(item) => {\n const next = notificationTab(item)\n if (next !== undefined) setTab(next)\n }}\n />\n </div>\n </div>\n )\n\n if (state.kind === 'unavailable') {\n return <section className={styles.section}>{head(null)}<p className={styles.status}>{t('plazaUnavailable')}</p></section>\n }\n if (state.kind === 'failed') {\n return (\n <section className={styles.section}>\n {head(null)}\n <div className={styles.empty} role=\"alert\">\n <span className={styles.emptyIcon}><IconSkillOutlineRegular size={28} /></span>\n <p className={styles.emptyText}>{t('plazaLoadFailed')}</p>\n <Button variant=\"outline\" size=\"sm\" icon={<IconRefreshOutlineRegular size={16} />} onClick={() => { void refresh() }}>{t('plazaRetry')}</Button>\n </div>\n </section>\n )\n }\n\n const { listing } = state\n const counts: Record<ReviewTab, number> = listing.counts === undefined\n ? reviewCounts(listing.skills)\n : { approved: listing.counts.approved, pending: listing.counts.pending, all: listing.counts.total }\n const reviewTabs = reviewTabsFor(context)\n const departmentOptions = departmentOptionsOf(listing.skills)\n // A department deleted or renamed away after the selection was made falls back to \"all\", so the\n // select never holds a value that is absent from its own options.\n const selectedDepartment = departmentOptions.some(option => option.code === department) ? department : ''\n const departmentSkills = filterByDepartment(listing.skills, selectedDepartment)\n const tabs: readonly PlazaTab[] = departmentOptions.length === 0 ? reviewTabs : [...reviewTabs, 'department']\n const countOfTab = (item: PlazaTab): number => item === 'department' ? departmentSkills.length : counts[item]\n const tabLabel = (item: PlazaTab): string => item === 'approved' ? t('plazaTabApproved')\n : item === 'pending' ? t('plazaTabPending')\n : item === 'all' ? t('plazaTabAll')\n : t('plazaTabDepartment')\n const visibleSkills = tab === 'department' ? departmentSkills : filterByReview(listing.skills, tab)\n\n return (\n <section className={styles.section}>\n {head(countOfTab(tab))}\n {tabs.length > 1 ? (\n <div className={styles.tabs} role=\"tablist\" aria-label={t('plazaTitle')}>\n {tabs.map(item => (\n <button\n key={item}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === item}\n className={tab === item ? styles.tab + ' ' + styles.tabActive : styles.tab}\n onClick={() => { setTab(item) }}\n >\n {tabLabel(item)}\n <span className={styles.tabCount}>{countOfTab(item)}</span>\n </button>\n ))}\n </div>\n ) : null}\n\n {tab === 'department' && departmentOptions.length > 0 ? (\n <label className={styles.departmentBar}>\n <span className={styles.departmentLabel}>{t('plazaDepartment')}</span>\n <select\n className={styles.departmentSelect}\n value={selectedDepartment}\n aria-label={t('plazaDepartment')}\n onChange={(event) => { setDepartment(event.target.value) }}\n >\n <option value=\"\">{t('plazaDepartmentAll')}</option>\n {departmentOptions.map(option => (\n <option key={option.code} value={option.code}>{option.name}</option>\n ))}\n </select>\n </label>\n ) : null}\n\n {notice === null ? null : <p className={styles.notice}>{notice}</p>}\n\n {visibleSkills.length === 0 ? (\n <div className={styles.empty}>\n <span className={styles.emptyIcon}><IconShareOutlineRegular size={28} /></span>\n <p className={styles.emptyText}>\n {tab === 'department' ? t('plazaDepartmentEmpty') : tab === 'pending' ? t('plazaPendingEmpty') : t('plazaEmpty')}\n </p>\n </div>\n ) : null}\n\n <ul className={styles.cards}>\n {visibleSkills.map(skill => (\n <PlazaCard\n key={skill.id}\n skill={skill}\n busy={busy}\n canAudit={allowed}\n t={t}\n onInstall={() => { void act({ action: 'install', id: skill.id }, t('plazaInstalled')) }}\n onUnshare={() => { void act({ action: 'unshare', id: skill.id }, t('plazaUnshared')) }}\n onReview={() => { openAudit(skill) }}\n />\n ))}\n </ul>\n\n <Modal\n open={audit !== null}\n onClose={() => { if (!reviewBusy) setAudit(null) }}\n title={t('plazaAuditTitle')}\n closeLabel={t('plazaClose')}\n className={styles.auditDialog as string}\n footer={(\n <div className={styles.auditFooter}>\n <Button variant=\"outline\" disabled={reviewBusy} onClick={() => { setAudit(null) }}>{t('plazaClose')}</Button>\n <Button variant=\"outline\" disabled={reviewBusy} onClick={() => { void submitReview('reject') }}>{t('plazaReject')}</Button>\n <Button variant=\"primary\" disabled={reviewBusy} onClick={() => { void submitReview('approve') }}>{t('plazaApprove')}</Button>\n </div>\n )}\n >\n {audit === null ? null : (\n <div className={styles.audit}>\n <dl className={styles.detail}>\n <div className={styles.detailRow}><dt className={styles.detailLabel}>{t('plazaAuditSource')}</dt><dd className={styles.detailValue}>{audit.ownerName ?? '—'} · {visibilityTag(audit).detail}</dd></div>\n <div className={styles.detailRow}><dt className={styles.detailLabel}>{t('plazaAuditVisibility')}</dt><dd className={styles.detailValue}>{visibilityTag(audit).label}</dd></div>\n <div className={styles.detailRow}><dt className={styles.detailLabel}>{t('plazaShowDetail')}</dt><dd className={styles.detailValue}>{audit.description ?? '—'}</dd></div>\n </dl>\n <RiskReportView report={risk} busy={riskBusy} failed={riskFailed} onScan={() => { void runScan(audit) }} t={t} />\n <label className={styles.noteField}>\n <span>{t('plazaReviewNote')}</span>\n <textarea value={reviewNote} placeholder={t('plazaReviewNotePlaceholder')} onChange={(event) => { setReviewNote(event.target.value) }} />\n </label>\n {reviewError === null ? null : <p className={styles.reviewError} role=\"alert\">{reviewError}</p>}\n </div>\n )}\n </Modal>\n </section>\n )\n}\n\n/** Re-exported so the registration site reads the route from one place. */\nexport { SKILL_PLAZA_PATH } from './skill-plaza-client.ts'","import type { CSSProperties } from 'react'\nimport css from './WanxiangBrand.module.css'\n\n/** User-visible platform name shared by the header wordmark and its accessible name. */\nconst BRAND_NAME = '万相AI中台'\nconst HARNESS_PATHS = [\n {\n \"d\": \"M132.848 8.93205H134.08V16.137H132.848V8.93205ZM136.5 8.93205H137.732V16.137H136.5V8.93205ZM133.365 13.024V11.99H137.193V13.024H133.365Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M140.397 14.432L140.672 13.453H143.202L143.532 14.432H140.397ZM140.287 16.137H139.055L141.277 8.93205H142.201L142.146 9.74605L140.947 13.915H140.969L140.287 16.137ZM145.039 16.137H143.741L143.07 13.948L143.081 13.937L141.871 9.74605L141.926 8.93205H142.817L145.039 16.137Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M146.846 8.93205H149.068C149.852 8.93205 150.443 9.11538 150.839 9.48205C151.235 9.84138 151.433 10.3327 151.433 10.956C151.433 11.22 151.396 11.4657 151.323 11.693C151.249 11.9204 151.125 12.1257 150.949 12.309C150.773 12.4924 150.531 12.65 150.223 12.782C149.922 12.9067 149.541 13.0057 149.079 13.079V13.321H146.846V12.639L148.023 12.485C148.631 12.4044 149.09 12.298 149.398 12.166C149.706 12.034 149.915 11.8764 150.025 11.693C150.135 11.5024 150.19 11.2934 150.19 11.066C150.19 10.6994 150.083 10.417 149.871 10.219C149.658 10.021 149.324 9.92205 148.87 9.92205H146.846V8.93205ZM146.395 8.93205H147.627V16.137H146.395V8.93205ZM151.917 16.093V16.137H150.366L149.024 14.322C148.87 14.1094 148.73 13.9407 148.606 13.816C148.481 13.684 148.345 13.5887 148.199 13.53C148.052 13.464 147.872 13.42 147.66 13.398C147.447 13.3687 147.176 13.3504 146.846 13.343V13.145H149.079C149.233 13.211 149.368 13.2844 149.486 13.365C149.61 13.4457 149.735 13.5447 149.86 13.662C149.992 13.7794 150.138 13.937 150.3 14.135L151.917 16.093Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M153.58 9.57005L153.591 8.93205H154.46L157.584 15.51V16.137H156.704L153.58 9.57005ZM158.024 16.137H156.968L156.88 8.93205H158.024V16.137ZM154.24 16.137H153.096V8.93205H154.152L154.24 16.137Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M159.963 8.93205H161.206V16.137H159.963V8.93205ZM160.095 9.96605V8.93205H164.858V9.96605H160.095ZM160.095 16.137V15.103H164.902V16.137H160.095ZM160.095 13.013V11.99H164.374V13.013H160.095Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M169.052 15.257C169.543 15.257 169.895 15.1654 170.108 14.982C170.328 14.7987 170.438 14.5457 170.438 14.223C170.438 14.047 170.405 13.8967 170.339 13.772C170.273 13.6474 170.152 13.5337 169.976 13.431C169.807 13.321 169.558 13.2147 169.228 13.112L168.491 12.881C167.846 12.6757 167.38 12.4044 167.094 12.067C166.808 11.7297 166.665 11.3007 166.665 10.78C166.665 10.428 166.76 10.1017 166.951 9.80105C167.142 9.50038 167.428 9.25838 167.809 9.07505C168.19 8.89172 168.663 8.80005 169.228 8.80005C169.631 8.80005 169.998 8.82938 170.328 8.88805C170.665 8.93938 171.039 9.01638 171.45 9.11905L171.274 10.175C170.834 10.0504 170.442 9.96238 170.097 9.91105C169.76 9.85238 169.463 9.82305 169.206 9.82305C168.737 9.82305 168.403 9.90738 168.205 10.076C168.007 10.2374 167.908 10.439 167.908 10.681C167.908 10.857 167.941 11.0147 168.007 11.154C168.073 11.286 168.19 11.407 168.359 11.517C168.535 11.627 168.784 11.7334 169.107 11.836L169.866 12.078C170.526 12.276 170.995 12.5327 171.274 12.848C171.553 13.156 171.692 13.585 171.692 14.135C171.692 14.5604 171.589 14.9344 171.384 15.257C171.179 15.5797 170.878 15.8327 170.482 16.016C170.093 16.1994 169.609 16.291 169.03 16.291C168.627 16.291 168.212 16.247 167.787 16.159C167.362 16.071 166.9 15.9427 166.401 15.774L166.665 14.718C167.156 14.894 167.6 15.0297 167.996 15.125C168.399 15.213 168.751 15.257 169.052 15.257Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n },\n {\n \"d\": \"M175.809 15.257C176.3 15.257 176.652 15.1654 176.865 14.982C177.085 14.7987 177.195 14.5457 177.195 14.223C177.195 14.047 177.162 13.8967 177.096 13.772C177.03 13.6474 176.909 13.5337 176.733 13.431C176.564 13.321 176.315 13.2147 175.985 13.112L175.248 12.881C174.603 12.6757 174.137 12.4044 173.851 12.067C173.565 11.7297 173.422 11.3007 173.422 10.78C173.422 10.428 173.517 10.1017 173.708 9.80105C173.899 9.50038 174.185 9.25838 174.566 9.07505C174.947 8.89172 175.42 8.80005 175.985 8.80005C176.388 8.80005 176.755 8.82938 177.085 8.88805C177.422 8.93938 177.796 9.01638 178.207 9.11905L178.031 10.175C177.591 10.0504 177.199 9.96238 176.854 9.91105C176.517 9.85238 176.22 9.82305 175.963 9.82305C175.494 9.82305 175.16 9.90738 174.962 10.076C174.764 10.2374 174.665 10.439 174.665 10.681C174.665 10.857 174.698 11.0147 174.764 11.154C174.83 11.286 174.947 11.407 175.116 11.517C175.292 11.627 175.541 11.7334 175.864 11.836L176.623 12.078C177.283 12.276 177.752 12.5327 178.031 12.848C178.31 13.156 178.449 13.585 178.449 14.135C178.449 14.5604 178.346 14.9344 178.141 15.257C177.936 15.5797 177.635 15.8327 177.239 16.016C176.85 16.1994 176.366 16.291 175.787 16.291C175.384 16.291 174.969 16.247 174.544 16.159C174.119 16.071 173.657 15.9427 173.158 15.774L173.422 14.718C173.913 14.894 174.357 15.0297 174.753 15.125C175.156 15.213 175.508 15.257 175.809 15.257Z\",\n \"fill\": \"var(--dsw-alias-label-primary-inverted)\"\n }\n] as const\n\ninterface MarkProps {\n size: number\n className?: string | undefined\n}\n\nfunction classes(...values: Array<string | undefined>): string {\n return values.filter(Boolean).join(' ')\n}\n\nfunction Cube({ transform, className }: { transform: string; className: string }) {\n return (\n <g transform={transform}>\n <g className={className} stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinejoin=\"round\">\n <path d=\"M12 0 24 7 12 14 0 7 12 0Z\" fill=\"none\" />\n <path d=\"M0 7 12 14v16L0 23V7Z\" fill=\"currentColor\" />\n <path d=\"M12 14 24 7v16L12 30V14Z\" fill=\"currentColor\" fillOpacity=\".18\" />\n </g>\n </g>\n )\n}\n\n/** Four linked data units; its ink follows the host surface through currentColor. */\nexport function WanxiangMark({ size, className, animated = false }: MarkProps & { animated?: boolean }) {\n return (\n <svg\n width={size}\n height={(size * 58) / 54}\n className={classes(css.mark, animated ? css.animatedMark : undefined, className)}\n viewBox=\"0 0 54 58\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <Cube className={css.unitTop} transform=\"translate(15 0)\" />\n <Cube className={css.unitLeft} transform=\"translate(0 16)\" />\n <Cube className={css.unitRight} transform=\"translate(30 16)\" />\n <Cube className={css.unitCore} transform=\"translate(15 27)\" />\n </svg>\n )\n}\n\n/**\n * Platform wordmark rendered as text.\n *\n * It used to be glyph artwork for the previous platform name, which cannot express the new\n * name without redrawing every path. Text keeps the visible header, the accessible name, and\n * the browser title on one string, and inherits the host's CJK font stack through `font-family`.\n */\nexport function WanxiangWordmark({ height, accessible = false, className }: {\n height: number\n accessible?: boolean\n className?: string | undefined\n}) {\n return (\n <span\n className={classes(css.wordmark, className)}\n style={{ fontSize: height }}\n {...(accessible ? { role: 'img' as const, 'aria-label': BRAND_NAME } : {})}\n >\n {BRAND_NAME}\n </span>\n )\n}\n\n/** Exact HARNESS badge artwork extracted from the current DSH BrandWordmark. */\nexport function HarnessBadge({ height = 14 }: { height?: number }) {\n const style = { '--dsw-alias-label-primary-inverted': 'var(--dsw-alias-bg-base)' } as CSSProperties\n return (\n <svg\n width={(height * 53) / 15.5}\n height={height}\n className={css.harness}\n viewBox=\"129 5 53 15.5\"\n style={style}\n aria-hidden=\"true\"\n >\n <rect x=\"129.348\" y=\"5.5\" width=\"52\" height=\"14\" rx=\"2\" fill=\"currentColor\" />\n {HARNESS_PATHS.map((path, index) => <path key={index} d={path.d} fill={path.fill} />)}\n </svg>\n )\n}\n\n/** Expanded-sidebar brand name plus the unchanged official HARNESS badge. */\nexport function WanxiangSidebarName() {\n return <span className={css.sidebarName}><WanxiangWordmark height={16} /><HarnessBadge height={14} /></span>\n}\n\n/** Welcome-page logo with four-unit hover motion. */\nexport function WanxiangHeroMark({ size, className }: MarkProps) {\n return <WanxiangMark size={size} className={className} animated />\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport { wanxiangBrandPreference } from './brand-store.ts'\nimport {\n WanxiangHeroMark,\n WanxiangMark,\n WanxiangSidebarName,\n} from './WanxiangBrand.tsx'\n\nconst BRAND_TITLE = '万相AI中台 Harness'\nconst SLOT_PRIORITY = -100\nconst FAVICON_ID = 'dataops-wanxiang-favicon'\nconst FAVICON_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 54 58\"><style>:root{color:#1b1b1d}@media(prefers-color-scheme:dark){:root{color:#f7f7f8}}</style><g transform=\"translate(15 0)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(0 16)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(30 16)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g><g transform=\"translate(15 27)\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linejoin=\"round\"><path d=\"M12 0 24 7 12 14 0 7Z\" fill=\"none\"/><path d=\"M0 7 12 14v16L0 23Z\" fill=\"currentColor\"/><path d=\"M12 14 24 7v16L12 30Z\" fill=\"currentColor\" fill-opacity=\".18\"/></g></svg>`\n\n\nfunction registerWanxiangSlots(ctx: ClientContext): () => void {\n return ctx.slots.inject('sidebar.brand.mark', () =>\n ctx.slots.inject('sidebar.brand.name', () =>\n ctx.slots.inject('conversation.hero.brand.mark', function* () {\n yield ctx.slots.register({\n name: 'sidebar.brand.mark',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangMark)\n yield ctx.slots.register({\n name: 'sidebar.brand.name',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangSidebarName)\n yield ctx.slots.register({\n name: 'conversation.hero.brand.mark',\n priority: SLOT_PRIORITY,\n registrant: 'dataops-managed',\n }, WanxiangHeroMark)\n })))\n}\n\nfunction installFavicon(): HTMLLinkElement {\n const existing = document.getElementById(FAVICON_ID)\n if (existing instanceof HTMLLinkElement) return existing\n const link = document.createElement('link')\n link.id = FAVICON_ID\n link.rel = 'icon'\n link.type = 'image/svg+xml'\n link.href = `data:image/svg+xml,${encodeURIComponent(FAVICON_SVG)}`\n document.head.append(link)\n return link\n}\n\n/** Keep shell slots, browser title, and favicon on the same persisted preference. */\nexport function installWanxiangBranding(ctx: ClientContext): void {\n const originalTitle = document.title\n let disposeSlots: (() => void) | undefined\n let favicon: HTMLLinkElement | undefined\n let titleObserver: MutationObserver | undefined\n\n const stopTitleObserver = (): void => {\n titleObserver?.disconnect()\n titleObserver = undefined\n }\n const keepBrandTitle = (): void => {\n if (document.title !== BRAND_TITLE) document.title = BRAND_TITLE\n if (titleObserver !== undefined) return\n titleObserver = new MutationObserver(() => {\n if (wanxiangBrandPreference.getSnapshot().enabled && document.title !== BRAND_TITLE) {\n document.title = BRAND_TITLE\n }\n })\n titleObserver.observe(document.head, { childList: true, subtree: true, characterData: true })\n }\n\n const synchronize = (): void => {\n const enabled = wanxiangBrandPreference.getSnapshot().enabled\n if (enabled) {\n disposeSlots ??= registerWanxiangSlots(ctx)\n favicon ??= installFavicon()\n keepBrandTitle()\n document.documentElement.dataset.dataopsBrand = 'wanxiang'\n return\n }\n disposeSlots?.()\n disposeSlots = undefined\n favicon?.remove()\n favicon = undefined\n stopTitleObserver()\n document.title = originalTitle\n delete document.documentElement.dataset.dataopsBrand\n }\n\n ctx.effect(() => {\n synchronize()\n const unsubscribe = wanxiangBrandPreference.subscribe(synchronize)\n return () => {\n unsubscribe()\n disposeSlots?.()\n favicon?.remove()\n stopTitleObserver()\n document.title = originalTitle\n delete document.documentElement.dataset.dataopsBrand\n }\n }, 'dataops-managed: Wanxiang shell branding')\n}\n","/**\n * The \"sign in again\" prompt shown when this workspace's DataOps session has ended.\n *\n * The failure it reports used to be invisible. Every DataOps call handles a 401 by degrading to\n * an empty result, which is right for one panel but wrong for the operator: settings, shared\n * models and the skill plaza all render as \"nothing here\" while the real cause is that nobody is\n * signed in any more. This prompt names that state once, with the one action that clears it.\n *\n * It reports and nothing more. It does not retry, expire, or re-authenticate — the portal owns\n * the login form and is the only thing that can issue a session. Its action navigates the parent\n * portal when the frame's ancestor origin is known, and opens the portal separately when the\n * browser blocks top-level navigation from the frame.\n *\n * @module ReloginPrompt\n */\n\nimport { useCallback, useEffect, useState } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { AuthState } from '../auth-state.ts'\n\n/** How often to re-read the observed auth state. */\nconst POLL_MS = 15_000\n\n/** What the Host route answers. */\ninterface AuthStateReply {\n readonly state?: unknown\n}\n\n/**\n * Read the observed credential state from the Host.\n *\n * A failed read says nothing about the credential: this route is served by the same process that\n * serves the page, so an unreachable route means the Web server is busy or restarting, not that\n * anyone was signed out. Returning `undefined` keeps a transient error from raising a sign-in\n * prompt, which would be a lie the operator cannot act on.\n *\n * @returns the reported state, or `undefined` when it could not be read.\n */\nconst readAuthState = async (): Promise<AuthState | undefined> => {\n try {\n const response = await fetch(new URL('/integrations/dataops/auth-state', window.location.origin), {\n credentials: 'same-origin',\n })\n if (!response.ok) return undefined\n const body = await response.json() as AuthStateReply\n const state = body.state\n return state === 'expired' || state === 'valid' || state === 'unknown' ? state : undefined\n } catch {\n return undefined\n }\n}\n\n/** The copy this prompt needs, bound by its host surface. */\nexport interface ReloginPromptProps {\n /** Resolve one of the prompt's own strings. */\n readonly t: (key: 'reloginTitle' | 'reloginBody' | 'reloginAction' | 'reloginDismiss') => string\n}\n\n/**\n * Watch for an ended DataOps session and say so.\n *\n * @param props.t - localized copy resolver.\n * @returns the dialog while the session is known to have ended, otherwise `null`.\n */\nexport function ReloginPrompt(props: ReloginPromptProps) {\n const { t } = props\n const [expired, setExpired] = useState(false)\n // Dismissal is per-outage, not permanent: the state stays `expired`, so without this the dialog\n // would reopen on the next poll and trap the operator behind a modal they cannot leave.\n // A session that comes back resets the flag, so the next outage prompts again.\n const [dismissed, setDismissed] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n const tick = async (): Promise<void> => {\n const state = await readAuthState()\n if (cancelled || state === undefined) return\n setExpired(state === 'expired')\n if (state !== 'expired') setDismissed(false)\n }\n void tick()\n const timer = setInterval(() => { void tick() }, POLL_MS)\n return () => {\n cancelled = true\n clearInterval(timer)\n }\n }, [])\n\n const dismiss = useCallback((): void => { setDismissed(true) }, [])\n\n if (!expired || dismissed) return null\n return (\n <Modal\n open\n onClose={dismiss}\n title={t('reloginTitle')}\n closeLabel={t('reloginDismiss')}\n description={t('reloginBody')}\n footer={(\n <>\n <Button onClick={dismiss}>{t('reloginDismiss')}</Button>\n {/* The portal is the only issuer of a new session. Navigate its origin directly;\n cross-origin frames may refuse top-level navigation, so open it separately. */}\n <Button variant=\"primary\" onClick={() => {\n const portalOrigin = window.location.ancestorOrigins?.[0]\n ?? (document.referrer === '' ? undefined : new URL(document.referrer).origin)\n if (portalOrigin === undefined || portalOrigin === window.location.origin) {\n window.location.reload()\n return\n }\n const portalUrl = `${portalOrigin}/`\n try {\n if (window.top !== null && window.top !== window) {\n window.top.location.href = portalUrl\n return\n }\n } catch {\n // Cross-origin top navigation can be blocked; opening the portal is the fallback.\n }\n window.open(portalUrl, '_blank', 'noopener')\n }}>\n {t('reloginAction')}\n </Button>\n </>\n )}\n />\n )\n}\n","// @ts-nocheck\n/**\n * Whether the managed DataOps settings section may be registered at all.\n *\n * Registration is the gate, not a CSS class: an ordinary user's profile should not contain a\n * section whose controls they may not use. The identity record is presentation-only and arrives\n * from the portal after the iframe loads, so the registration follows it instead of reading it\n * once at startup. Authorization still lives in DataOps; this only keeps a forbidden panel out of\n * the interface.\n */\n\n/** The two DataOps role labels allowed to see the managed settings panel. */\nconst MANAGED_SETTINGS_ROLES: ReadonlySet<string> = new Set(['超级管理员', '管理员'])\n\n/** The shared identity record the DataOps account plugin publishes on `window`. */\ninterface DataOpsUserWindow extends Window {\n __DATAOPS_USER__?: { name?: unknown } | null\n __DATAOPS_ACCOUNT_STORE__?: { listeners?: Set<() => void> }\n}\n\n/** The account launcher's visible label, which is painted before the window record settles. */\nfunction domAccountName(): string | null {\n if (typeof document === 'undefined') return null\n // The launcher's label is one short span. Reading `querySelector` is not enough: the same\n // attribute can sit on a full-page wrapper whose text is the entire application, which would\n // never equal a role label. Prefer the shortest non-empty candidate.\n const texts = [...document.querySelectorAll('[data-dataops-account-name]')]\n .map(element => element.textContent?.trim() ?? '')\n .filter(text => text !== '' && text.length <= 30)\n .sort((left, right) => left.length - right.length)\n return texts[0] ?? null\n}\n\n/** Read the current role label without trusting any other field. */\nexport function currentManagedSettingsRole(): string | null {\n if (typeof window === 'undefined') return null\n // The launcher's label is the first identity signal on screen; the window record follows.\n const domName = domAccountName()\n if (domName !== null) return domName\n const name = (window as DataOpsUserWindow).__DATAOPS_USER__?.name\n return typeof name === 'string' && name.trim() !== '' ? name.trim() : null\n}\n\n/** Whether the current identity may see the managed DataOps settings section. */\nexport function canSeeManagedSettings(): boolean {\n const role = currentManagedSettingsRole()\n return role !== null && MANAGED_SETTINGS_ROLES.has(role)\n}\n\n/**\n * Observe identity changes.\n *\n * The account plugin keeps one store on `window`; subscribing to its listener set catches the\n * in-page update even before the portal's DOM event. The event is kept as a second signal because\n * a future portal may publish the event without touching the store this plugin reads.\n */\nexport function subscribeManagedSettingsVisibility(listener: () => void): () => void {\n if (typeof window === 'undefined') return () => {}\n const store = (window as DataOpsUserWindow).__DATAOPS_ACCOUNT_STORE__\n store?.listeners?.add(listener)\n window.addEventListener('dataops-account:changed', listener)\n\n /**\n * The first identity can arrive before this module subscribes (or replace the account store\n * object), which is why the sidebar used to show only the sections whose gate happened to run\n * later. The launcher's label is a DOM fact either way, so watch it as the fallback signal.\n */\n let observed = domAccountName()\n const observer = typeof MutationObserver === 'undefined' || typeof document === 'undefined'\n ? undefined\n : new MutationObserver(() => {\n const next = domAccountName()\n if (next === observed) return\n observed = next\n listener()\n })\n observer?.observe(document.documentElement, {\n subtree: true,\n childList: true,\n characterData: true,\n attributes: true,\n attributeFilter: ['data-dataops-account-name'],\n })\n // Reconcile once after the current frame, when the first paint (and its label) is complete.\n if (observed !== null) queueMicrotask(listener)\n\n return () => {\n store?.listeners?.delete(listener)\n window.removeEventListener('dataops-account:changed', listener)\n observer?.disconnect()\n }\n}\n","/** Pure helpers shared by the permission-centre combobox and resource details. */\n\n/** One selectable option. */\nexport interface ComboboxOption {\n readonly value: string\n readonly label: string\n readonly hint?: string\n}\n\n/**\n * Filter options by display label or code hint, case-insensitively.\n * @param options - all options.\n * @param query - typed search text.\n */\nexport function filterComboboxOptions(options: readonly ComboboxOption[], query: string): ComboboxOption[] {\n const needle = query.trim().toLowerCase()\n if (needle === '') return [...options]\n return options.filter(option => option.label.toLowerCase().includes(needle)\n || (option.hint ?? '').toLowerCase().includes(needle))\n}\n\n/** Keep an active index inside a possibly empty result list. */\nexport function clampActiveIndex(index: number, length: number): number {\n if (length <= 0) return 0\n return Math.max(0, Math.min(length - 1, index))\n}\n\n/** Owner cell face: a real display name, or a dash; never the raw id. */\nexport function ownerDisplay(ownerName: string | undefined | null): string {\n const name = ownerName?.trim()\n return name === undefined || name === '' ? '—' : name\n}\n","import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Button, IconRefreshOutlineRegular, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { en } from './locales.ts'\nimport {\n createDepartment,\n deleteDepartment,\n fetchRbacOverview,\n fetchReviewContext,\n reviewDemoMode,\n saveRbacSection,\n updateDepartment,\n type DepartmentRow,\n type MemberRow,\n type RbacOverview,\n type ResourceScopeRow,\n type RoleMatrixRow,\n} from './review-client.ts'\nimport type { PortalRole, ReviewContext } from './review-types.ts'\nimport { canManagePermissions } from './review-types.ts'\nimport { canSeeManagedSettings, currentManagedSettingsRole } from './settings-gate.ts'\nimport { demoRbacOverview } from './review-demo.ts'\nimport styles from './PermissionCenterSection.module.css'\nimport { clampActiveIndex, filterComboboxOptions, ownerDisplay, type ComboboxOption } from './combobox.ts'\n\n/** The four tabs of the permission centre. */\ntype PermissionTab = 'roles' | 'members' | 'departments' | 'resources'\n\n/** Props accepted by the page. */\nexport interface PermissionCenterSectionProps {\n t?: (key: keyof typeof en) => string\n}\n\n/** How many rows one page of the members/resources tables shows. */\nconst PAGE_SIZE = 10\n\n/**\n * The permission centre.\n *\n * Every write goes through `saveRbacSection`; the backend enforces the same role/scope rules\n * the disabled controls represent. The page keeps target-aware state explicitly (actor role,\n * actor department) so an ADMIN cannot edit a SUPER_ADMIN row and a DEPT_ADMIN cannot reach\n * another department, even if a list payload is wider than expected.\n */\nexport function PermissionCenterSection({ t }: PermissionCenterSectionProps): ReactNode {\n const [context, setContext] = useState<ReviewContext | null | undefined>(undefined)\n const [overview, setOverview] = useState<RbacOverview | null | undefined>(undefined)\n const [tab, setTab] = useState<PermissionTab>('roles')\n const [notice, setNotice] = useState<string | null>(null)\n const [busy, setBusy] = useState(false)\n const [deptDialog, setDeptDialog] = useState<DepartmentRow | null>(null)\n const [deptSearch, setDeptSearch] = useState('')\n const [deptSelected, setDeptSelected] = useState<string[]>([])\n const [deptSaving, setDeptSaving] = useState(false)\n const [deptError, setDeptError] = useState<string | null>(null)\n const [deptForm, setDeptForm] = useState<{ mode: 'create' | 'edit'; parentCode?: string | null; department?: DepartmentRow } | null>(null)\n const demo = reviewDemoMode()\n\n const load = useCallback(async () => {\n const nextContext = await fetchReviewContext()\n setContext(nextContext)\n if (nextContext === null && !demo) { setOverview(null); return }\n try {\n setOverview(demo ? demoRbacOverview() : await fetchRbacOverview())\n } catch {\n setOverview(null)\n }\n }, [demo])\n\n useEffect(() => { void load() }, [load])\n\n if (t === undefined) return null\n if (context === undefined || overview === undefined) return null\n\n // The launcher label is authoritative for the two administrator roles. A null review context\n // means the review API has not shipped yet, not that the caller is unauthorised: show the page\n // skeleton with the waiting note instead of a false \"no access\" screen.\n const knownAdmin = canSeeManagedSettings()\n const denied = context !== null\n ? (context.role !== 'SUPER_ADMIN' && context.role !== 'ADMIN' && context.role !== 'DEPT_ADMIN' && !knownAdmin)\n : !knownAdmin\n if (denied) return <section className={styles.page}><p className={styles.empty}>{t('permNoAccess')}</p></section>\n\n const roleName = context === null ? (currentManagedSettingsRole() ?? '—') : roleLabel(context.role)\n const departmentName = context?.departmentPath?.join(' / ') ?? '—'\n const actorRole: PortalRole = context?.role ?? (knownAdmin ? 'ADMIN' : 'APP_USER')\n const writable = context === null ? knownAdmin : (canManagePermissions(context) || demo)\n const superAdmin = context === null ? knownAdmin : context.role === 'SUPER_ADMIN' || demo\n const canAssignDepartment = writable && (superAdmin || actorRole === 'ADMIN')\n const labels: { key: PermissionTab; label: string }[] = [\n { key: 'roles', label: t('permTabRoles') },\n { key: 'members', label: t('permTabMembers') },\n { key: 'departments', label: t('permTabDepartments') },\n { key: 'resources', label: t('permTabResources') },\n ]\n\n const save = async (section: PermissionTab, value: unknown): Promise<{ ok: boolean; reason?: string }> => {\n setBusy(true)\n setNotice(null)\n try {\n const result = await saveRbacSection(section, value)\n setNotice(result.ok ? t('permSaved') : (result.reason ?? t('permWaiting')))\n if (result.ok) await load()\n return result\n } catch {\n setNotice(t('permSaveFailed'))\n return { ok: false, reason: t('permSaveFailed') }\n } finally {\n setBusy(false)\n }\n }\n\n const saveRoleChanges = async (changes: readonly { roleCode: string; permissionKeys: string[] }[]): Promise<{ ok: boolean; reason?: string }> => {\n setBusy(true)\n setNotice(null)\n try {\n for (const change of changes) {\n const result = await saveRbacSection('roles', { roleCode: change.roleCode, permissionKeys: change.permissionKeys })\n if (!result.ok) {\n setNotice(result.reason ?? t('permSaveFailed'))\n await load()\n return result\n }\n }\n setNotice(t('permSaved'))\n await load()\n return { ok: true }\n } catch {\n setNotice(t('permSaveFailed'))\n return { ok: false, reason: t('permSaveFailed') }\n } finally {\n setBusy(false)\n }\n }\n\n const openDepartment = (department: DepartmentRow): void => {\n setDeptDialog(department)\n setDeptSelected(department.deptAdmins?.map(admin => admin.userId) ?? [])\n setDeptSearch('')\n setDeptError(null)\n }\n\n const assignDepartment = async (userIds: string[]): Promise<void> => {\n if (deptDialog === null || deptSaving) return\n setDeptSaving(true)\n setDeptError(null)\n try {\n const result = await saveRbacSection('departments', { code: deptDialog.code, userIds })\n if (!result.ok) {\n setDeptError(result.reason ?? '保存失败:后端拒绝或无权限(403)。')\n return\n }\n setDeptDialog(null)\n setNotice('部门管理员已更新。')\n await load()\n } catch {\n setDeptError('保存失败:后端拒绝或无权限(403)。')\n } finally {\n setDeptSaving(false)\n }\n }\n\n const removeDepartment = async (department: DepartmentRow): Promise<void> => {\n const children = overview?.departments.filter(row => row.parentCode === department.code).length ?? 0\n const members = department.memberCount ?? 0\n if (!window.confirm('确认删除部门「' + department.name + '」?\\n成员 ' + String(members) + ' 人,子部门 ' + String(children) + ' 个;删除后不可恢复。')) return\n const result = await deleteDepartment(department.code)\n if (!result.ok) {\n setNotice(result.reason ?? '删除失败:后端拒绝或无权限(403)。')\n return\n }\n setNotice('部门已删除。')\n await load()\n }\n\n const candidates = deptDialog === null || overview === null ? [] : overview.members.filter(member => {\n const pathCodes = member.departmentPath?.map(entry => entry.code) ?? []\n return member.departmentCode === deptDialog.code || pathCodes.includes(deptDialog.code)\n }).filter(member => {\n const needle = deptSearch.trim().toLowerCase()\n return needle === '' || member.displayName.toLowerCase().includes(needle) || member.username.toLowerCase().includes(needle)\n })\n\n return (\n <section className={styles.page} data-permission-center=\"\">\n <header className={styles.head}>\n <div>\n <h1 className={styles.title}>{t('permTitle')}</h1>\n <p className={styles.subtitle}>\n {roleName} · {departmentName}\n {demo ? <span className={styles.demo}>{t('permDemo')}</span> : null}\n </p>\n </div>\n <Button variant=\"outline\" size=\"sm\" icon={<IconRefreshOutlineRegular size={16} />} onClick={() => { void load() }}>刷新</Button>\n </header>\n\n <div className={styles.tabs} role=\"tablist\" aria-label={t('permTitle')}>\n {labels.map(item => (\n <button\n key={item.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === item.key}\n className={tab === item.key ? styles.tab + ' ' + styles.tabActive : styles.tab}\n onClick={() => { setTab(item.key) }}\n >\n {item.label}\n </button>\n ))}\n </div>\n\n {notice === null ? null : <p className={styles.notice}>{notice}</p>}\n {overview === null ? <p className={styles.waiting}>{t('permWaiting')}</p> : (\n <>\n {tab === 'roles' ? <RoleMatrix roles={overview.matrix.roles} permissions={overview.matrix.permissions} writable={writable} actorRole={actorRole} busy={busy} t={t} onSaveAll={saveRoleChanges} /> : null}\n {tab === 'members' ? <Members members={overview.members} writable={writable} actorRole={actorRole} actorUserId={context?.userId} actorDepartmentCode={context?.departmentCode} busy={busy} t={t} onSave={(userId, roleCodes) => { void save('members', { userId, roleCodes }) }} /> : null}\n {tab === 'departments' ? <Departments departments={overview.departments} writable={writable} canAssign={canAssignDepartment} canWrite={writable && (superAdmin || actorRole === 'ADMIN')} t={t} onAssign={openDepartment} onAdd={(parentCode) => { setDeptForm({ mode: 'create', parentCode }) }} onEdit={(department) => { setDeptForm({ mode: 'edit', department }) }} onDelete={(department) => { void removeDepartment(department) }} /> : null}\n {tab === 'resources' ? <Resources resources={overview.resources} departments={overview.departments} writable={writable} actorRole={actorRole} actorDepartmentCode={context?.departmentCode} busy={busy} t={t} onSave={(row, visibility, departmentCode) => save('resources', { kind: row.kind, id: row.id, visibility, departmentCode })} /> : null}\n </>\n )}\n\n <Modal\n open={deptDialog !== null}\n onClose={() => { if (!deptSaving) setDeptDialog(null) }}\n title={deptDialog === null ? '分配部门管理员' : '分配管理员 · ' + deptDialog.name}\n closeLabel=\"取消\"\n className={styles.dialog as string}\n footer={(\n <div className={styles.dialogFooter}>\n <Button variant=\"outline\" disabled={deptSaving} onClick={() => { if (deptDialog !== null) void assignDepartment([]) }}>清空</Button>\n <Button variant=\"outline\" disabled={deptSaving} onClick={() => { setDeptDialog(null) }}>取消</Button>\n <Button variant=\"primary\" disabled={deptSaving} onClick={() => { void assignDepartment(deptSelected) }}>保存</Button>\n </div>\n )}\n >\n {deptDialog === null ? null : (\n <div className={styles.dialogBody}>\n <p className={styles.dialogHint}>当前管理员:{deptDialog.deptAdmins?.length === 0 || deptDialog.deptAdmins === undefined ? '未设置' : deptDialog.deptAdmins.map(admin => admin.displayName).join('、')}</p>\n <input className={styles.search} value={deptSearch} placeholder=\"搜索本部门成员…\" onChange={(event) => { setDeptSearch(event.target.value) }} />\n <ul className={styles.candidates}>\n {candidates.length === 0 ? <li className={styles.muted}>没有可选成员(后端可能只允许本部门/未分配用户)。</li> : candidates.map(member => (\n <li key={member.userId}>\n <label className={styles.candidate}>\n <input\n type=\"checkbox\"\n checked={deptSelected.includes(member.userId)}\n onChange={(event) => {\n setDeptSelected(current => event.target.checked\n ? [...current, member.userId]\n : current.filter(id => id !== member.userId))\n }}\n />\n <span>{member.displayName}</span>\n <span className={styles.muted}>@{member.username} · {member.departmentPath?.map(entry => entry.name).join(' / ') ?? '—'}</span>\n </label>\n </li>\n ))}\n </ul>\n {deptError === null ? null : <p className={styles.error} role=\"alert\">{deptError}</p>}\n </div>\n )}\n </Modal>\n\n <DepartmentFormDialog\n state={deptForm}\n departments={overview?.departments ?? []}\n t={t}\n onClose={() => { setDeptForm(null) }}\n onSaved={async () => { setDeptForm(null); setNotice('部门已保存。'); await load() }}\n />\n </section>\n )\n}\n\nfunction RoleMatrix({ roles, permissions, writable, actorRole, busy, t, onSaveAll }: {\n roles: readonly RoleMatrixRow[]\n permissions: readonly { key: string; name: string; group: string; scope?: string; description?: string }[]\n writable: boolean\n actorRole: PortalRole\n busy: boolean\n t: (key: keyof typeof en) => string\n onSaveAll: (changes: readonly { roleCode: string; permissionKeys: string[] }[]) => Promise<{ ok: boolean; reason?: string }>\n}): ReactNode {\n const visibleRoles = useMemo(() => roles\n .filter(role => role.systemKey === 'SUPER_ADMIN' || role.systemKey === 'ADMIN' || role.systemKey === 'DEPT_ADMIN' || role.systemKey === 'APP_USER'\n || role.code === '超级管理员' || role.code === '管理员' || role.code === '部门管理员' || role.code === '应用人员' || role.code === '普通用户')\n .map(role => (role.systemKey === 'APP_USER' || role.code === '应用人员' || role.code === '普通用户') ? { ...role, name: '普通用户' } : role), [roles])\n const groups = useMemo(() => {\n const hasSkill = permissions.some(point => point.group === 'skill' || point.group === '技能中心')\n const keyOf = (group: string): 'kb' | 'skill' | 'workflow' | 'automation' | null => {\n const raw = group.trim().toLowerCase()\n if (raw === 'kb' || raw === 'knowledge' || group === '知识库') return 'kb'\n if (raw === 'skill' || group === '技能中心') return 'skill'\n if (raw === 'workflow' || group === '工作流广场') return 'workflow'\n if (raw === 'automation' || group === '自动化任务') return 'automation'\n // Compatibility while task-70's catalogue is rolling out: legacy `ai` stands in for\n // the skill group only when no dedicated `skill` group is present.\n if (raw === 'ai' && !hasSkill) return 'skill'\n return null\n }\n const defs: { key: 'kb' | 'skill' | 'workflow' | 'automation'; label: string }[] = [\n { key: 'kb', label: '知识库' },\n { key: 'skill', label: '技能中心' },\n { key: 'workflow', label: '工作流广场' },\n { key: 'automation', label: '自动化任务' },\n ]\n return defs.map(def => ({ ...def, points: permissions.filter(point => keyOf(point.group) === def.key) })).filter(group => group.points.length > 0)\n }, [permissions])\n const visiblePermissions = useMemo(() => groups.flatMap(group => group.points), [groups])\n const [draft, setDraft] = useState<Record<string, Set<string>>>(() => Object.fromEntries(visibleRoles.map(role => [role.code, new Set(role.permissions)])))\n const [dirty, setDirty] = useState<Set<string>>(() => new Set())\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [copiedKey, setCopiedKey] = useState<string | null>(null)\n\n const copyKey = async (key: string): Promise<void> => {\n try { await navigator.clipboard.writeText(key) } catch { /* Clipboard may be unavailable in an iframe. */ }\n setCopiedKey(key)\n window.setTimeout(() => { setCopiedKey(current => current === key ? null : current) }, 1600)\n }\n\n useEffect(() => {\n setDraft(Object.fromEntries(visibleRoles.map(role => [role.code, new Set(role.permissions)])))\n setDirty(new Set())\n }, [visibleRoles])\n\n const isSuperRole = (code: string): boolean => code === 'SUPER_ADMIN' || code === '超级管理员'\n const isDepartmentRole = (code: string): boolean => code === 'DEPT_ADMIN' || code === '部门管理员'\n const isAppRole = (code: string): boolean => code === 'APP_USER' || code === '应用人员' || code === '普通用户'\n const globalScope = (point: { key: string; scope?: string }): boolean => point.scope === 'global' || point.scope === 'GLOBAL'\n || point.key === 'skill:review:global' || point.key === 'workflow:review:global'\n const locked = (roleCode: string, point: { key: string; scope?: string }): boolean => {\n if (!writable || actorRole !== 'SUPER_ADMIN') return true\n // Global points are only assignable to the two administrator roles; SUPER_ADMIN remains\n // editable for the actor who already holds it, while DEPT_ADMIN/APP_USER are read-only.\n return globalScope(point) && (isDepartmentRole(roleCode) || isAppRole(roleCode))\n }\n\n return (\n <div className={styles.panel}>\n <h2 className={styles.sectionTitle}>{t('permRoleMatrix')}</h2>\n <div className={styles.matrixScroll}>\n <table className={styles.matrix}>\n <thead>\n <tr>\n <th>{t('permPermissionModule')}</th>\n <th>{t('permPermissionPoint')}</th>\n {visibleRoles.map(role => <th key={role.code}>{role.name}</th>)}\n </tr>\n </thead>\n <tbody>\n {groups.map(group => (\n <Fragment key={group.key}>\n {group.points.map((point, pointIndex) => {\n const global = globalScope(point)\n return (\n <tr key={point.key}>\n {pointIndex === 0 ? (\n <th scope=\"rowgroup\" rowSpan={group.points.length} className={styles.matrixModule}>{group.label}</th>\n ) : null}\n <th scope=\"row\" className={styles.matrixPermission}>\n <button type=\"button\" className={styles.permCopy} title={point.key} onClick={() => { void copyKey(point.key) }}>\n <span>{point.name}</span>\n <span className={styles.scopeBadge} data-scope={global ? 'global' : 'department'}>{global ? '全局' : '部门级'}</span>\n {copiedKey === point.key ? <span className={styles.copied}>已复制</span> : null}\n </button>\n {point.description === undefined ? null : <span className={styles.permDescription}>{point.description}</span>}\n </th>\n {visibleRoles.map(role => (\n <td key={role.code}>\n <label className={styles.permission}>\n <input\n type=\"checkbox\"\n checked={draft[role.code]?.has(point.key) === true}\n disabled={locked(role.code, point) || busy}\n onChange={(event) => {\n setDraft(current => {\n const next = new Set(current[role.code] ?? [])\n if (event.target.checked) next.add(point.key)\n else next.delete(point.key)\n return { ...current, [role.code]: next }\n })\n setDirty(current => new Set(current).add(role.code))\n }}\n />\n {global && (isDepartmentRole(role.code) || isAppRole(role.code))\n ? <span className={styles.onlyAdmin}>仅管理员</span>\n : null}\n </label>\n </td>\n ))}\n </tr>\n )\n })}\n </Fragment>\n ))}\n </tbody>\n </table>\n </div>\n <div className={styles.panelFoot}>\n {error === null ? null : <span className={styles.error}>{error}</span>}\n {actorRole !== 'SUPER_ADMIN' ? <span className={styles.readOnly}>{t('permSuperAdminOnly')}</span> : null}\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={dirty.size === 0 || busy || saving}\n onClick={() => {\n setSaving(true)\n setError(null)\n const changes = visibleRoles.filter(role => dirty.has(role.code)).map(role => ({ roleCode: role.code, permissionKeys: [...(draft[role.code] ?? [])] }))\n void onSaveAll(changes).then(result => {\n if (result.ok) { setDirty(new Set()); setError(null) }\n else setError(result.reason ?? t('permSaveFailed'))\n }).finally(() => { setSaving(false) })\n }}\n >\n {t('permSave')}{dirty.size === 0 ? '' : ' (' + String(dirty.size) + ')'}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction Members({ members, writable, actorRole, actorUserId, actorDepartmentCode, busy, t, onSave }: {\n members: readonly MemberRow[]\n writable: boolean\n actorRole: PortalRole\n actorUserId?: string\n actorDepartmentCode?: string\n busy: boolean\n t: (key: keyof typeof en) => string\n onSave: (userId: string, roleCodes: string[]) => void\n}): ReactNode {\n const [page, setPage] = useState(0)\n const protectedMember = (member: MemberRow): boolean => member.roleCodes.some(code => {\n if (code === 'SUPER_ADMIN' || code === '超级管理员' || code === 'ADMIN' || code === '管理员') return true\n // A department administrator may not touch another department administrator.\n return actorRole === 'DEPT_ADMIN' && (code === 'DEPT_ADMIN' || code === '部门管理员')\n })\n const superCount = members.filter(member => member.roleCodes.some(code => code === 'SUPER_ADMIN' || code === '超级管理员')).length\n const inScope = (member: MemberRow): boolean => actorRole === 'SUPER_ADMIN' || actorRole === 'ADMIN'\n || member.departmentCode === actorDepartmentCode\n || member.departmentPath?.some(entry => entry.code === actorDepartmentCode) === true\n const pages = Math.max(1, Math.ceil(members.length / PAGE_SIZE))\n const visible = members.slice(page * PAGE_SIZE, page * PAGE_SIZE + PAGE_SIZE)\n return (\n <div className={styles.panel}>\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <thead><tr><th>{t('permMember')}</th><th>{t('permDepartment')}</th><th>{t('permRole')}</th></tr></thead>\n <tbody>\n {visible.map(member => {\n const isProtected = protectedMember(member)\n const scoped = inScope(member)\n const isSelf = actorUserId !== undefined && member.userId === actorUserId\n const lastSuper = superCount <= 1 && member.roleCodes.some(code => code === 'SUPER_ADMIN' || code === '超级管理员')\n const locked = !writable || !scoped || isSelf || lastSuper || (actorRole !== 'SUPER_ADMIN' && isProtected)\n return (\n <tr key={member.userId} data-locked={locked}>\n <td><strong>{member.displayName}</strong><span className={styles.muted}> @{member.username}</span>{isProtected && actorRole !== 'SUPER_ADMIN' ? <span className={styles.protected}>受保护</span> : null}{isSelf ? <span className={styles.protected}>本人</span> : null}{lastSuper ? <span className={styles.protected}>最后一个超管</span> : null}{!scoped ? <span className={styles.protected}>越界</span> : null}</td>\n <td>{member.departmentPath?.map(entry => entry.name).join(' / ') ?? '—'}</td>\n <td>\n <select\n value={member.roleCodes[0] ?? 'APP_USER'}\n disabled={locked || busy}\n onChange={(event) => {\n if (window.confirm('确认修改该成员的角色?')) onSave(member.userId, [event.target.value])\n }}\n >\n {(actorRole === 'SUPER_ADMIN'\n ? ['超级管理员', '管理员', '部门管理员', '运营人员', '应用人员']\n : ['部门管理员', '运营人员', '应用人员']).map(role => <option key={role} value={role}>{role}</option>)}\n </select>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n <Pager page={page} pages={pages} onChange={setPage} />\n </div>\n )\n}\n\nfunction Departments({ departments, writable, canAssign, canWrite, t, onAssign, onAdd, onEdit, onDelete }: {\n departments: readonly DepartmentRow[]\n writable: boolean\n canAssign: boolean\n canWrite: boolean\n t: (key: keyof typeof en) => string\n onAssign: (department: DepartmentRow) => void\n onAdd: (parentCode: string | null) => void\n onEdit: (department: DepartmentRow) => void\n onDelete: (department: DepartmentRow) => void\n}): ReactNode {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set(departments.map(department => department.code)))\n const byParent = useMemo(() => {\n const map = new Map<string | null, DepartmentRow[]>()\n const codes = new Set(departments.map(department => department.code))\n for (const department of departments) {\n const parent = department.parentCode !== undefined && department.parentCode !== null && codes.has(department.parentCode) ? department.parentCode : null\n map.set(parent, [...(map.get(parent) ?? []), department])\n }\n for (const list of map.values()) list.sort((left, right) => left.name.localeCompare(right.name, 'zh-CN') || left.code.localeCompare(right.code))\n return map\n }, [departments])\n\n const node = (department: DepartmentRow, depth: number): ReactNode => {\n const children = byParent.get(department.code) ?? []\n const open = expanded.has(department.code)\n return (\n <li key={department.code} className={styles.treeNode}>\n <div className={styles.treeRow} style={{ paddingLeft: String(8 + depth * 18) + 'px' }}>\n {children.length === 0 ? <span className={styles.treeSpacer} /> : (\n <button\n type=\"button\"\n className={styles.treeToggle}\n aria-label={open ? '折叠' : '展开'}\n onClick={() => {\n setExpanded(current => {\n const next = new Set(current)\n if (next.has(department.code)) next.delete(department.code)\n else next.add(department.code)\n return next\n })\n }}\n >{open ? '▾' : '▸'}</button>\n )}\n <strong className={styles.treeName}>{department.name}</strong>\n <span className={styles.muted}>{department.code} · {department.memberCount ?? 0} 人</span>\n <span className={styles.deptAdmins}>\n {department.deptAdmins?.length === 0 || department.deptAdmins === undefined ? null\n : department.deptAdmins.map(admin => <span key={admin.userId} className={styles.adminTag}>{admin.displayName}</span>)}\n </span>\n <span className={styles.treeActions}>\n {canAssign ? <Button variant=\"ghost\" size=\"sm\" disabled={!writable} onClick={() => { onAssign(department) }}>分配管理员</Button> : null}\n {canWrite ? <Button variant=\"ghost\" size=\"sm\" onClick={() => { onAdd(department.code) }}>+ 子部门</Button> : null}\n {canWrite ? <Button variant=\"ghost\" size=\"sm\" onClick={() => { onEdit(department) }}>编辑</Button> : null}\n {canWrite ? <Button variant=\"ghost\" size=\"sm\" onClick={() => { onDelete(department) }}>删除</Button> : null}\n </span>\n </div>\n {children.length > 0 && open ? <ul className={styles.treeChildren}>{children.map(child => node(child, depth + 1))}</ul> : null}\n </li>\n )\n }\n\n return (\n <div className={styles.panel}>\n <div className={styles.panelHead}>\n <h2 className={styles.sectionTitle}>{t('permTabDepartments')}</h2>\n {canWrite ? <Button variant=\"outline\" size=\"sm\" onClick={() => { onAdd(null) }}>新增部门</Button> : null}\n </div>\n <ul className={styles.treeRoot}>\n {(byParent.get(null) ?? []).map(department => node(department, 0))}\n </ul>\n {departments.length === 0 ? <p className={styles.muted}>暂无部门。</p> : null}\n </div>\n )\n}\n\n/** Create/edit dialog for one department. */\nfunction DepartmentFormDialog({ state, departments, t, onClose, onSaved }: {\n state: { mode: 'create' | 'edit'; parentCode?: string | null; department?: DepartmentRow } | null\n departments: readonly DepartmentRow[]\n t: (key: keyof typeof en) => string\n onClose: () => void\n onSaved: () => Promise<void>\n}): ReactNode {\n const [code, setCode] = useState('')\n const [name, setName] = useState('')\n const [parentCode, setParentCode] = useState('')\n const [description, setDescription] = useState('')\n const [owner, setOwner] = useState('')\n const [enabled, setEnabled] = useState(true)\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (state === null) return\n setCode(state.department?.code ?? '')\n setName(state.department?.name ?? '')\n setParentCode(state.parentCode ?? state.department?.parentCode ?? '')\n setDescription(state.department?.description ?? '')\n setOwner(state.department?.owner ?? '')\n setEnabled(state.department?.enabled !== false)\n setError(null)\n }, [state])\n\n if (state === null) return null\n const editing = state.mode === 'edit'\n const blocked = new Set<string>()\n if (editing && state.department !== undefined) {\n blocked.add(state.department.code)\n let changed = true\n while (changed) {\n changed = false\n for (const department of departments) {\n if (department.parentCode !== undefined && department.parentCode !== null && blocked.has(department.parentCode) && !blocked.has(department.code)) {\n blocked.add(department.code)\n changed = true\n }\n }\n }\n }\n\n const submit = async (): Promise<void> => {\n if (saving) return\n setSaving(true)\n setError(null)\n try {\n const result = editing && state.department !== undefined\n ? await updateDepartment({ code: state.department.code, name, parentCode: parentCode === '' ? null : parentCode, description, owner, enabled, updatedAt: state.department.updatedAt })\n : await createDepartment({ code: code.trim(), name: name.trim(), parentCode: parentCode === '' ? null : parentCode, description, owner, enabled })\n if (!result.ok) {\n setError(result.reason ?? '保存失败:后端拒绝或无权限(403)。')\n return\n }\n await onSaved()\n } catch {\n setError('保存失败:网络或后端异常。')\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <Modal\n open\n onClose={() => { if (!saving) onClose() }}\n title={editing ? '编辑部门' : '新增部门'}\n closeLabel=\"取消\"\n className={styles.dialog as string}\n footer={(\n <div className={styles.dialogFooter}>\n <Button variant=\"outline\" disabled={saving} onClick={onClose}>取消</Button>\n <Button variant=\"primary\" disabled={saving} onClick={() => { void submit() }}>保存</Button>\n </div>\n )}\n >\n <div className={styles.dialogBody}>\n <label className={styles.field}><span>部门编码</span><input value={code} disabled={editing} placeholder=\"例如 marketing\" onChange={event => { setCode(event.target.value) }} /></label>\n <label className={styles.field}><span>部门名称</span><input value={name} placeholder=\"例如 市场部\" onChange={event => { setName(event.target.value) }} /></label>\n <label className={styles.field}><span>上级部门</span>\n <SearchCombobox\n t={t}\n value={parentCode}\n ariaLabel=\"上级部门\"\n placeholder={t('permNone')}\n options={[{ value: '', label: t('permNone') }, ...departments.filter(department => !blocked.has(department.code)).map(department => ({ value: department.code, label: department.name, hint: department.code }))]}\n onChange={setParentCode}\n />\n </label>\n <label className={styles.field}><span>描述</span><input value={description} onChange={event => { setDescription(event.target.value) }} /></label>\n <label className={styles.field}><span>负责人</span><input value={owner} onChange={event => { setOwner(event.target.value) }} /></label>\n <label className={styles.candidate}><input type=\"checkbox\" checked={enabled} onChange={event => { setEnabled(event.target.checked) }} /><span>启用</span></label>\n {error === null ? null : <p className={styles.error} role=\"alert\">{error}</p>}\n </div>\n </Modal>\n )\n}\n\nfunction Resources({ resources, departments, writable, actorRole, actorDepartmentCode, busy, t, onSave }: {\n resources: readonly ResourceScopeRow[]\n departments: readonly DepartmentRow[]\n writable: boolean\n actorRole: PortalRole\n actorDepartmentCode?: string\n busy: boolean\n t: (key: keyof typeof en) => string\n onSave: (row: ResourceScopeRow, visibility: ResourceScopeRow['visibility'], departmentCode: string | null) => Promise<{ ok: boolean; reason?: string }>\n}): ReactNode {\n const [page, setPage] = useState(0)\n const [draft, setDraft] = useState<Record<string, { visibility: ResourceScopeRow['visibility']; departmentCode: string | null }>>({})\n const [error, setError] = useState<string | null>(null)\n const [detail, setDetail] = useState<ResourceScopeRow | null>(null)\n const pages = Math.max(1, Math.ceil(resources.length / PAGE_SIZE))\n const visible = resources.slice(page * PAGE_SIZE, page * PAGE_SIZE + PAGE_SIZE)\n const departmentOptions = actorRole === 'DEPT_ADMIN'\n ? departments.filter(department => department.code === actorDepartmentCode\n || department.path?.some(entry => entry.code === actorDepartmentCode) === true)\n : departments\n const keyOf = (row: ResourceScopeRow): string => row.kind + ':' + String(row.id)\n const valueOf = (row: ResourceScopeRow) => draft[keyOf(row)] ?? { visibility: row.visibility, departmentCode: row.departmentCode ?? null }\n const visibilityLabel = (visibility: ResourceScopeRow['visibility']): string => visibility === 'global'\n ? t('permGlobal')\n : visibility === 'department' ? t('permDepartmentScope') : t('permPrivate')\n const statusLabel = (status: ResourceScopeRow['reviewStatus']): string => status === 'pending'\n ? t('permStatusPending')\n : status === 'approved' ? t('permStatusApproved') : status === 'rejected' ? t('permStatusRejected') : '—'\n const departmentName = (code: string | null | undefined): string => code === null || code === undefined\n ? '—' : departments.find(department => department.code === code)?.name ?? code\n return (\n <div className={styles.panel}>\n <div className={styles.tableScroll}>\n <table className={styles.table}>\n <thead>\n <tr>\n <th>{t('permType')}</th>\n <th>{t('permName')}</th>\n <th>{t('permOwner')}</th>\n <th>{t('permScope')}</th>\n <th>{t('permDepartment')}</th>\n <th>{t('permOperations')}</th>\n </tr>\n </thead>\n <tbody>\n {visible.map(row => {\n const key = keyOf(row)\n const value = valueOf(row)\n const visibilityOptions = actorRole === 'DEPT_ADMIN' ? ['department', 'private'] : ['global', 'department', 'private']\n return (\n <tr key={key}>\n <td>{row.kind === 'skill' ? t('permResourceSkill') : t('permResourceWorkflow')}</td>\n <td><strong>{row.name}</strong></td>\n <td>{ownerDisplay(row.ownerName)}</td>\n <td>\n <SearchCombobox\n t={t}\n value={value.visibility}\n ariaLabel={t('permScope')}\n placeholder={t('permSelect')}\n disabled={!writable || busy}\n options={visibilityOptions.map(option => ({ value: option, label: visibilityLabel(option as ResourceScopeRow['visibility']) }))}\n onChange={(next) => {\n const visibility = next as ResourceScopeRow['visibility']\n setDraft(current => ({ ...current, [key]: { visibility, departmentCode: visibility === 'department' ? (current[key]?.departmentCode ?? row.departmentCode ?? actorDepartmentCode ?? null) : null } }))\n }}\n />\n </td>\n <td>\n <SearchCombobox\n t={t}\n value={value.departmentCode ?? ''}\n ariaLabel={t('permDepartment')}\n placeholder={t('permNone')}\n disabled={!writable || busy || value.visibility !== 'department' || actorRole === 'DEPT_ADMIN'}\n options={[{ value: '', label: t('permNone') }, ...departmentOptions.map(department => ({ value: department.code, label: department.name, hint: department.code }))]}\n onChange={(next) => { setDraft(current => ({ ...current, [key]: { ...valueOf(row), departmentCode: next === '' ? null : next } })) }}\n />\n </td>\n <td>\n <div className={styles.rowActions}>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => { setDetail(row) }}>{t('permViewDetails')}</Button>\n <Button variant=\"outline\" size=\"sm\" disabled={!writable || busy} onClick={() => {\n setError(null)\n if (window.confirm(t('permSave') + '?')) {\n void onSave(row, value.visibility, value.departmentCode).then(result => { if (!result.ok) setError(result.reason ?? t('permSaveFailed')) })\n }\n }}>{t('permSave')}</Button>\n </div>\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n <Pager page={page} pages={pages} onChange={setPage} />\n {error === null ? null : <p className={styles.error} role=\"alert\">{error}</p>}\n\n <Modal\n open={detail !== null}\n onClose={() => { setDetail(null) }}\n title={t('permDetailTitle')}\n closeLabel={t('permClose')}\n className={styles.dialog as string}\n footer={<div className={styles.dialogFooter}><Button variant=\"outline\" onClick={() => { setDetail(null) }}>{t('permClose')}</Button></div>}\n >\n {detail === null ? null : (\n <dl className={styles.detailGrid}>\n <dt>{t('permDetailType')}</dt><dd>{detail.kind === 'skill' ? t('permResourceSkill') : t('permResourceWorkflow')}</dd>\n <dt>{t('permDetailName')}</dt><dd>{detail.name}</dd>\n <dt>{t('permDetailOwner')}</dt><dd>{ownerDisplay(detail.ownerName)}</dd>\n <dt>{t('permDetailScope')}</dt><dd>{visibilityLabel(detail.visibility)}</dd>\n <dt>{t('permDetailDepartment')}</dt><dd>{departmentName(detail.departmentCode)}</dd>\n <dt>{t('permDetailStatus')}</dt><dd>{statusLabel(detail.reviewStatus)}</dd>\n <dt>{t('permDetailUpdated')}</dt><dd>{detail.updatedAt === undefined ? '—' : new Date(detail.updatedAt).toLocaleString()}</dd>\n </dl>\n )}\n </Modal>\n </div>\n )\n}\n\n/** Accessible searchable combobox used for visibility and department pickers. */\nfunction SearchCombobox({ t, value, options, onChange, placeholder, ariaLabel, disabled = false }: {\n t: (key: keyof typeof en) => string\n value: string\n options: readonly { value: string; label: string; hint?: string }[]\n onChange: (value: string) => void\n placeholder: string\n ariaLabel: string\n disabled?: boolean\n}): ReactNode {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [active, setActive] = useState(0)\n const rootRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const selected = options.find(option => option.value === value)\n const filtered = useMemo(() => filterComboboxOptions(options, query), [options, query])\n\n useEffect(() => {\n if (!open) return\n const close = (event: MouseEvent): void => {\n if (rootRef.current !== null && !rootRef.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', close)\n inputRef.current?.focus()\n return () => { document.removeEventListener('mousedown', close) }\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const index = filtered.findIndex(option => option.value === value)\n setActive(index >= 0 ? index : 0)\n }, [open, filtered, value])\n\n const choose = (next: string): void => {\n onChange(next)\n setOpen(false)\n setQuery('')\n }\n\n return (\n <div className={styles.combobox} ref={rootRef}>\n <button\n type=\"button\"\n className={styles.comboboxTrigger}\n aria-label={ariaLabel}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n disabled={disabled}\n onClick={() => { setOpen(current => !current) }}\n >\n <span className={selected === undefined ? styles.comboboxPlaceholder : undefined}>{selected?.label ?? placeholder}</span>\n <span aria-hidden=\"true\">⌄</span>\n </button>\n {open ? (\n <div className={styles.comboboxMenu}>\n <input\n ref={inputRef}\n className={styles.comboboxSearch}\n value={query}\n placeholder={t('permSearch')}\n aria-label={t('permSearch')}\n onChange={event => { setQuery(event.target.value); setActive(0) }}\n onKeyDown={event => {\n if (event.key === 'Escape') { setOpen(false); return }\n if (event.key === 'ArrowDown') { event.preventDefault(); setActive(current => clampActiveIndex(current + 1, filtered.length)) }\n if (event.key === 'ArrowUp') { event.preventDefault(); setActive(current => clampActiveIndex(current - 1, filtered.length)) }\n if (event.key === 'Enter') {\n event.preventDefault()\n const option = filtered[active]\n if (option !== undefined) choose(option.value)\n }\n }}\n />\n <ul className={styles.comboboxList} role=\"listbox\" aria-label={ariaLabel}>\n {filtered.length === 0 ? <li className={styles.comboboxEmpty}>{t('permNoMatches')}</li> : filtered.map((option, index) => (\n <li key={option.value} role=\"option\" aria-selected={option.value === value}>\n <button\n type=\"button\"\n className={index === active ? styles.comboboxOption + ' ' + styles.comboboxOptionActive : styles.comboboxOption}\n onMouseEnter={() => { setActive(index) }}\n onClick={() => { choose(option.value) }}\n >\n <span className={styles.comboboxCheck}>{option.value === value ? '✓' : ''}</span>\n <span>{option.label}</span>\n {option.hint === undefined ? null : <span className={styles.comboboxHint}>{option.hint}</span>}\n </button>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n )\n}\n\nfunction Pager({ page, pages, onChange }: { page: number; pages: number; onChange: (page: number) => void }): ReactNode {\n if (pages <= 1) return null\n return (\n <div className={styles.pager}>\n <Button variant=\"outline\" size=\"sm\" disabled={page === 0} onClick={() => { onChange(page - 1) }}>上一页</Button>\n <span className={styles.muted}>{page + 1} / {pages}</span>\n <Button variant=\"outline\" size=\"sm\" disabled={page >= pages - 1} onClick={() => { onChange(page + 1) }}>下一页</Button>\n </div>\n )\n}\n\n/** The four role labels, so the header does not show a backend code. */\nfunction roleLabel(role: PortalRole): string {\n switch (role) {\n case 'SUPER_ADMIN': return '超级管理员'\n case 'ADMIN': return '管理员'\n case 'DEPT_ADMIN': return '部门管理员'\n default: return '应用人员'\n }\n}\n","import { useEffect, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { fetchReviewContext, reviewDemoMode } from './review-client.ts'\nimport { canSeeManagedSettings } from './settings-gate.ts'\n\n/**\n * The sidebar glyph for the permission centre.\n *\n * The entry is hidden for a caller the Host reports as an ordinary user. This is a navigation\n * affordance, not the authorization decision: every permission-centre endpoint re-checks the\n * caller, and the page itself refuses to render without a management role.\n */\nexport function PermissionCenterIcon(): ReactNode {\n // The launcher label is enough for the two administrator roles, so the shield paints without\n // waiting for the review API; the department-administrator case still asks the Host.\n const [allowed, setAllowed] = useState<boolean | undefined>(() => canSeeManagedSettings() ? true : undefined)\n useEffect(() => {\n let live = true\n if (reviewDemoMode() || canSeeManagedSettings()) { setAllowed(true); return () => { live = false } }\n void fetchReviewContext().then((context) => {\n if (!live) return\n setAllowed(context !== null && context.role !== 'APP_USER')\n }).catch(() => { if (live) setAllowed(false) })\n return () => { live = false }\n }, [])\n if (allowed !== true) return null\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M9 2.2 14.5 4v4.4c0 3.1-2.1 5.6-5.5 7.4-3.4-1.8-5.5-4.3-5.5-7.4V4L9 2.2Z\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n <path d=\"m6.7 8.8 1.6 1.6 3-3.1\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n","/** Same-origin calls for the workspace image upgrade banner. */\n\n/** Route the plugin's Host half serves for upgrade detection and start. */\nexport const WORKSPACE_UPGRADE_PATH = '/integrations/dataops/workspace-upgrade'\n\n/** A DSH session that will receive \"继续\" after the restart. */\nexport interface WorkspaceUpgradeSession {\n sessionId: string\n title?: string\n cwd?: string\n}\n\n/** The status the DSH page reads before offering an upgrade. */\nexport interface WorkspaceUpgradeStatus {\n imageStatus: 'CURRENT' | 'UPDATE_AVAILABLE' | 'NOT_RUNNING' | 'UNKNOWN'\n configuredImage: string\n activeSessions: WorkspaceUpgradeSession[]\n}\n\n/** Narrow an unknown response into the status contract. */\nfunction asStatus(value: unknown): WorkspaceUpgradeStatus | null {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null\n const record = value as Record<string, unknown>\n const imageStatus = record.imageStatus\n if (imageStatus !== 'CURRENT' && imageStatus !== 'UPDATE_AVAILABLE' && imageStatus !== 'NOT_RUNNING' && imageStatus !== 'UNKNOWN') return null\n const sessions = Array.isArray(record.activeSessions)\n ? record.activeSessions.flatMap((entry) => {\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) return []\n const session = entry as Record<string, unknown>\n if (typeof session.sessionId !== 'string' || session.sessionId.trim() === '') return []\n return [{\n sessionId: session.sessionId.trim(),\n ...(typeof session.title === 'string' && session.title.trim() !== '' ? { title: session.title.trim() } : {}),\n ...(typeof session.cwd === 'string' && session.cwd.trim() !== '' ? { cwd: session.cwd.trim() } : {}),\n }]\n })\n : []\n return {\n imageStatus,\n configuredImage: typeof record.configuredImage === 'string' ? record.configuredImage : '',\n activeSessions: sessions,\n }\n}\n\n/**\n * Read the workspace upgrade preview.\n * @returns the status, or null when the Host route is not ready or not connected.\n */\nexport async function fetchWorkspaceUpgrade(): Promise<WorkspaceUpgradeStatus | null> {\n const response = await fetch(WORKSPACE_UPGRADE_PATH, {\n credentials: 'same-origin',\n headers: { accept: 'application/json' },\n })\n if (response.status === 503 || response.status === 401) return null\n if (!response.ok) throw new Error(`workspace upgrade preview failed with HTTP ${String(response.status)}`)\n return asStatus(await response.json())\n}\n\n/**\n * Ask the Host to snapshot sessions and recreate the workspace container.\n * @returns the accepted hand-off summary.\n */\nexport async function requestWorkspaceUpgrade(): Promise<{ accepted: boolean; upgradeId: string; sessions: number }> {\n const response = await fetch(WORKSPACE_UPGRADE_PATH, {\n method: 'POST',\n credentials: 'same-origin',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ force: true }),\n })\n const body = await response.json().catch(() => null) as Record<string, unknown> | null\n if (!response.ok) {\n const message = typeof body?.error === 'string' ? body.error : `workspace upgrade failed with HTTP ${String(response.status)}`\n throw new Error(message)\n }\n return {\n accepted: body?.accepted === true,\n upgradeId: typeof body?.upgradeId === 'string' ? body.upgradeId : '',\n sessions: typeof body?.sessions === 'number' ? body.sessions : 0,\n }\n}\n","/**\n * Workspace image upgrade banner and confirmation dialog.\n *\n * The banner is deliberately quiet: it tells the user a newer workspace image exists and\n * leaves the current session usable. Only the explicit upgrade action opens the dialog\n * that can interrupt running sessions.\n *\n * @module WorkspaceUpgradePrompt\n */\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { en } from './locales.ts'\nimport {\n fetchWorkspaceUpgrade,\n requestWorkspaceUpgrade,\n type WorkspaceUpgradeStatus,\n} from './workspace-upgrade-client.ts'\nimport styles from './WorkspaceUpgradePrompt.module.css'\n\n/** The copy resolver bound by the client plugin. */\nexport interface WorkspaceUpgradePromptProps {\n /** Resolve one managed DataOps message key. */\n readonly t: (key: keyof typeof en) => string\n}\n\n/** How often to re-read the image status while the page is open. */\nconst POLL_MS = 30_000\n\n/** Wait before a reload so the restarted workspace has a chance to come back. */\nconst RELOAD_DELAY_MS = 12_000\n\n/**\n * Render the banner and its upgrade dialog.\n * @param props.t - localized copy resolver.\n * @returns the banner while an image update is available, otherwise null.\n */\nexport function WorkspaceUpgradePrompt(props: WorkspaceUpgradePromptProps) {\n const { t } = props\n const [status, setStatus] = useState<WorkspaceUpgradeStatus | null>(null)\n const [dismissed, setDismissed] = useState(false)\n const [dialogOpen, setDialogOpen] = useState(false)\n const [busy, setBusy] = useState(false)\n const [notice, setNotice] = useState('')\n const [error, setError] = useState('')\n\n const refresh = useCallback(async (): Promise<void> => {\n try {\n const next = await fetchWorkspaceUpgrade()\n if (next !== null) setStatus(next)\n } catch {\n // A transient read failure must not turn into a false upgrade banner.\n }\n }, [])\n\n useEffect(() => {\n let cancelled = false\n const tick = async (): Promise<void> => {\n if (cancelled) return\n await refresh()\n }\n void tick()\n const timer = setInterval(() => { void tick() }, POLL_MS)\n return () => {\n cancelled = true\n clearInterval(timer)\n }\n }, [refresh])\n\n const available = status?.imageStatus === 'UPDATE_AVAILABLE'\n const sessionCount = status?.activeSessions.length ?? 0\n const warning = useMemo(\n () => t('upgradeSessionsWarning').replace('{count}', String(sessionCount)),\n [sessionCount, t],\n )\n\n const openDialog = useCallback((): void => {\n setError('')\n setDialogOpen(true)\n }, [])\n\n const closeDialog = useCallback((): void => {\n if (busy) return\n setDialogOpen(false)\n }, [busy])\n\n const upgrade = useCallback(async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await requestWorkspaceUpgrade()\n setDialogOpen(false)\n setNotice(t('upgradeStarted'))\n setDismissed(true)\n window.setTimeout(() => { window.location.reload() }, RELOAD_DELAY_MS)\n } catch (cause) {\n // A connection drop is the normal shape of this request when the Host is\n // restarted before it can answer; the hand-off file is already on disk, so\n // report the upgrade as started rather than claiming it failed.\n if (cause instanceof TypeError) {\n setDialogOpen(false)\n setNotice(t('upgradeStarted'))\n setDismissed(true)\n window.setTimeout(() => { window.location.reload() }, RELOAD_DELAY_MS)\n return\n }\n setError(cause instanceof Error ? cause.message : t('upgradeFailed'))\n } finally {\n setBusy(false)\n }\n }, [t])\n\n if (notice !== '') {\n return (\n <div className={styles.banner} role=\"status\" aria-live=\"polite\">\n <span className={styles.title}>{notice}</span>\n </div>\n )\n }\n if (!available || dismissed) return null\n\n return (\n <>\n <div className={styles.banner} role=\"status\" aria-live=\"polite\">\n <div className={styles.copy}>\n <strong className={styles.title}>{t('upgradeAvailableTitle')}</strong>\n <span className={styles.body}>{t('upgradeAvailableBody')}</span>\n </div>\n <div className={styles.actions}>\n <Button variant=\"primary\" size=\"sm\" onClick={openDialog}>{t('upgradeAction')}</Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => { setDismissed(true) }}>{t('upgradeLater')}</Button>\n </div>\n </div>\n\n <Modal\n open={dialogOpen}\n onClose={closeDialog}\n title={t('upgradeDialogTitle')}\n description={t('upgradeDialogBody')}\n closeLabel={t('upgradeCancel')}\n footer={(\n <>\n <Button variant=\"ghost\" onClick={closeDialog} disabled={busy}>{t('upgradeCancel')}</Button>\n <Button variant=\"primary\" onClick={() => { void upgrade() }} disabled={busy}>\n {busy ? t('upgradeBusy') : sessionCount === 0 ? t('upgradeAction') : t('upgradeConfirm')}\n </Button>\n </>\n )}\n >\n <div className={styles.dialogBody}>\n <p className={styles.dialogText}>{sessionCount === 0 ? t('upgradeNoSessions') : warning}</p>\n {sessionCount > 0 ? (\n <ul className={styles.sessionList}>\n {status?.activeSessions.map(session => (\n <li key={session.sessionId} className={styles.sessionRow}>\n <span className={styles.sessionTitle}>{session.title ?? session.sessionId}</span>\n {session.cwd ? <span className={styles.sessionPath}>{session.cwd}</span> : null}\n </li>\n ))}\n </ul>\n ) : null}\n {error !== '' ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n </div>\n </Modal>\n </>\n )\n}\n","/** English managed DataOps Settings copy. */\nexport const en = {\n nav: '万相AI中台',\n title: '万相AI中台',\n managed: 'Connected to 万相AI中台',\n unavailable: '万相AI中台 is not connected.',\n loadFailed: 'Loading failed. Try again.',\n brandingTitle: 'Wanxiang branding',\n brandingToggle: 'Wanxiang branding',\n limitsTitle: 'File size limits',\n limitsFileReadLabel: 'Largest file to read (MiB)',\n limitsUploadLabel: 'Largest file to upload (MiB)',\n limitsInvalid: 'Enter a size in MiB.',\n limitsSave: 'Save',\n limitsSaving: 'Saving…',\n timeoutTitle: '万相AI中台 query timeout',\n timeoutLabel: 'Longest single query (seconds)',\n timeoutInvalid: 'Enter 1 to 3600 seconds.',\n defaultsTitle: 'Default configuration',\n defaultsPublish: 'Publish',\n defaultsPublishing: 'Publishing…',\n defaultsPublishedAt: 'Last published',\n defaultsNeverPublished: 'Not published yet',\n defaultsNotAdmin: 'Administrators only',\n plazaTitle: 'Skill plaza',\n plazaMine: 'Shared by me',\n plazaShowDetail: 'Details',\n plazaClose: 'Close',\n plazaDetailUpdated: 'Updated',\n plazaDetailBody: 'Skill body',\n plazaInstall: 'Install',\n plazaInstalled: 'Installed. It is now in your skill list.',\n plazaUnshare: 'Stop sharing',\n plazaUnshared: 'Removed from the plaza. Users who installed it keep their copy.',\n plazaEmpty: 'No skills have been shared yet.',\n plazaUnavailable: 'The skill plaza is available once this workspace is connected to 万相AI中台.',\n plazaLoadFailed: 'The skill plaza could not be loaded. Try again.',\n plazaActionFailed: 'The action could not be completed. Try again.',\n plazaRetry: 'Try again',\n plazaRefresh: 'Refresh',\n plazaTabApproved: 'Approved',\n plazaTabPending: 'Pending',\n plazaTabAll: 'All',\n plazaTabDepartment: 'Department',\n plazaDepartment: 'Department',\n plazaDepartmentAll: 'All departments',\n plazaDepartmentEmpty: 'No department-shared skills yet.',\n plazaSharedTag: 'Shared',\n plazaReview: 'Review',\n plazaPendingEmpty: 'No skills are waiting for review.',\n plazaAuditTitle: 'Review skill',\n plazaAuditSource: 'Source',\n plazaAuditVisibility: 'Visibility',\n plazaRiskTitle: 'AI risk report',\n plazaRiskScan: 'Run AI scan',\n plazaRiskScanning: 'Scanning…',\n plazaRiskNone: 'No AI risk report yet.',\n plazaRiskScore: 'Risk score',\n plazaRiskFindings: 'Findings',\n plazaRiskFailed: 'The AI scan failed; review manually.',\n plazaApprove: 'Approve',\n plazaReject: 'Reject',\n plazaReviewNote: 'Review note (required to reject)',\n plazaReviewNotePlaceholder: 'Explain the reason or what to change…',\n plazaReviewDone: 'Review saved.',\n plazaReviewFailed: 'The review could not be saved. Try again.',\n plazaDemo: 'Demo data',\n plazaGlobal: 'Global',\n plazaPrivate: 'Private',\n plazaDeptSuffix: ' department',\n reviewSettingsTitle: 'Review settings',\n reviewSettingsSkill: 'Skill plaza review',\n reviewSettingsWorkflow: 'Workflow plaza review',\n reviewSettingsKb: 'Knowledge base review',\n reviewSettingsHint: 'When on, submitted content stays private until an administrator approves it.',\n reviewSettingsSave: 'Save',\n reviewSettingsSaved: 'Review settings saved.',\n reviewSettingsFailed: 'Could not save. Try again.',\n reviewSettingsWaiting: 'Review settings API is waiting for the backend (task-39).',\n permNav: 'Permissions',\n permTitle: 'Permission centre',\n permTabRoles: 'Role permissions',\n permTabMembers: 'Member roles',\n permTabDepartments: 'Departments',\n permTabResources: 'Resource scope',\n permRoleMatrix: 'Role permission matrix',\n permPermissionModule: 'Module',\n permPermissionPoint: 'Permission',\n permReadOnly: 'Read only',\n permSave: 'Save',\n permSaved: 'Saved.',\n permSaveFailed: 'Could not save. Try again.',\n permSuperAdminOnly: 'Only a super administrator can change this.',\n permMember: 'Member',\n permDepartment: 'Department',\n permRole: 'Role',\n permDeptAdmin: 'Department administrator',\n permScope: 'Visibility',\n permGlobal: 'Global',\n permDepartmentScope: 'Department',\n permPrivate: 'Private',\n permNoAccess: 'You do not have access to the permission centre.',\n permWaiting: 'The permission-centre API is waiting for the backend (task-37).',\n permResourceSkill: 'Skill',\n permResourceWorkflow: 'Workflow',\n permResourceKb: 'Knowledge base',\n permType: 'Type',\n permName: 'Name',\n permOwner: 'Owner',\n permOperations: 'Actions',\n permViewDetails: 'View details',\n permDetailTitle: 'Resource details',\n permDetailType: 'Type',\n permDetailName: 'Name',\n permDetailOwner: 'Owner',\n permDetailScope: 'Visibility',\n permDetailDepartment: 'Department',\n permDetailStatus: 'Review status',\n permDetailUpdated: 'Updated',\n permNone: 'None',\n permSearch: 'Search…',\n permNoMatches: 'No matches',\n permClose: 'Close',\n permSelect: 'Select…',\n permStatusPending: 'Pending review',\n permStatusApproved: 'Approved',\n permStatusRejected: 'Rejected',\n permDemo: 'Demo data',\n reloginTitle: 'Sign in to 万相AI中台 again',\n reloginBody: 'Please sign in again.',\n reloginAction: 'Sign in again',\n reloginDismiss: 'Later',\n upgradeAvailableTitle: 'A new workspace version is available',\n upgradeAvailableBody: 'Restart the workspace to apply it.',\n upgradeAction: 'Upgrade',\n upgradeLater: 'Later',\n upgradeDialogTitle: 'Upgrade workspace',\n upgradeDialogBody: 'The workspace will restart and briefly disconnect. Your files and sessions are kept.',\n upgradeNoSessions: 'No sessions are running. The workspace will restart now.',\n upgradeSessionsWarning: '{count} running session(s) will be interrupted. After the upgrade, each one is resumed and sent “继续”.',\n upgradeCancel: 'Cancel',\n upgradeConfirm: 'Stop tasks and upgrade',\n upgradeBusy: 'Upgrading workspace…',\n upgradeStarted: 'Upgrade started. Reload this page when the workspace reconnects.',\n upgradeFailed: 'The workspace upgrade could not be started. Try again.',\n upgradeRetry: 'Retry',\n} as const\n\n/** Stable key set shared by every managed DataOps locale. */\nexport type ManagedDataOpsKey = keyof typeof en\n\n/** Chinese managed DataOps Settings copy. */\nexport const zh: Record<ManagedDataOpsKey, string> = {\n nav: '万相AI中台',\n title: '万相AI中台',\n managed: '已连接 万相AI中台',\n unavailable: '未连接 万相AI中台。',\n loadFailed: '加载失败,请重试。',\n brandingTitle: '应用万相品牌',\n brandingToggle: '应用万相品牌',\n limitsTitle: '文件大小限制',\n limitsFileReadLabel: '最大读取文件(MiB)',\n limitsUploadLabel: '最大上传文件(MiB)',\n limitsInvalid: '请输入以 MiB 为单位的大小。',\n limitsSave: '保存',\n timeoutTitle: '万相AI中台查询超时',\n timeoutLabel: '单次查询上限(秒)',\n timeoutInvalid: '请输入 1 到 3600 秒。',\n limitsSaving: '保存中…',\n defaultsTitle: '默认配置',\n defaultsPublish: '发布',\n defaultsPublishing: '发布中…',\n defaultsPublishedAt: '上次发布',\n defaultsNeverPublished: '尚未发布',\n defaultsNotAdmin: '仅管理员可发布',\n plazaTitle: '技能广场',\n plazaMine: '我共享的',\n plazaShowDetail: '详情',\n plazaClose: '关闭',\n plazaDetailUpdated: '更新时间',\n plazaDetailBody: '技能内容',\n plazaInstall: '装载',\n plazaInstalled: '已装载,可在技能列表中使用。',\n plazaUnshare: '取消共享',\n plazaUnshared: '已从广场移除;已装载的用户保留其副本。',\n plazaEmpty: '还没有人共享技能。',\n plazaUnavailable: '工作区接入万相AI中台后即可使用技能广场。',\n plazaLoadFailed: '技能广场加载失败,请重试。',\n plazaActionFailed: '操作未完成,请重试。',\n plazaRetry: '重试',\n plazaRefresh: '刷新',\n plazaTabApproved: '已审核',\n plazaTabPending: '未审核',\n plazaTabAll: '全部',\n plazaTabDepartment: '部门',\n plazaDepartment: '部门',\n plazaDepartmentAll: '全部部门',\n plazaDepartmentEmpty: '暂无部门上架的技能。',\n plazaSharedTag: '已共享',\n plazaReview: '审核',\n plazaPendingEmpty: '没有待审核的技能。',\n plazaAuditTitle: '审核技能',\n plazaAuditSource: '来源',\n plazaAuditVisibility: '可见范围',\n plazaRiskTitle: 'AI 风险报告',\n plazaRiskScan: '生成风险报告',\n plazaRiskScanning: '分析中…',\n plazaRiskNone: '尚未生成 AI 风险报告。',\n plazaRiskScore: '风险分',\n plazaRiskFindings: '发现',\n plazaRiskFailed: '风险报告生成失败,可人工审核。',\n plazaApprove: '通过',\n plazaReject: '驳回',\n plazaReviewNote: '审核意见(驳回必填)',\n plazaReviewNotePlaceholder: '说明原因或修改建议…',\n plazaReviewDone: '审核结果已保存。',\n plazaReviewFailed: '审核未完成,请重试。',\n plazaDemo: '演示数据',\n plazaGlobal: '全局',\n plazaPrivate: '私有',\n plazaDeptSuffix: '部门专属',\n reviewSettingsTitle: '审核设置',\n reviewSettingsSkill: '技能广场审核',\n reviewSettingsWorkflow: '工作流广场审核',\n reviewSettingsKb: '知识库审核',\n reviewSettingsHint: '开启后,提交内容需管理员审核通过才公开展示。',\n reviewSettingsSave: '保存',\n reviewSettingsSaved: '审核设置已保存。',\n reviewSettingsFailed: '保存失败,请重试。',\n reviewSettingsWaiting: '审核设置 API 待后端联调(task-39)。',\n permNav: '权限',\n permTitle: '权限中心',\n permTabRoles: '角色权限',\n permTabMembers: '成员角色',\n permTabDepartments: '部门',\n permTabResources: '资源范围',\n permRoleMatrix: '角色权限矩阵',\n permPermissionModule: '模块',\n permPermissionPoint: '权限点',\n permReadOnly: '只读',\n permSave: '保存',\n permSaved: '已保存。',\n permSaveFailed: '保存失败,请重试。',\n permSuperAdminOnly: '仅超级管理员可修改。',\n permMember: '成员',\n permDepartment: '部门',\n permRole: '角色',\n permDeptAdmin: '部门管理员',\n permScope: '可见范围',\n permGlobal: '全局',\n permDepartmentScope: '部门专属',\n permPrivate: '私有',\n permNoAccess: '无权限访问权限中心。',\n permWaiting: '权限中心 API 待后端联调(task-37)。',\n permResourceSkill: '技能',\n permResourceWorkflow: '工作流',\n permResourceKb: '知识库',\n permType: '类型',\n permName: '名称',\n permOwner: '所有者',\n permOperations: '操作',\n permViewDetails: '查看详情',\n permDetailTitle: '资源详情',\n permDetailType: '类型',\n permDetailName: '名称',\n permDetailOwner: '所有者',\n permDetailScope: '可见范围',\n permDetailDepartment: '部门',\n permDetailStatus: '审核状态',\n permDetailUpdated: '更新时间',\n permNone: '无',\n permSearch: '搜索…',\n permNoMatches: '无匹配项',\n permClose: '关闭',\n permSelect: '请选择…',\n permStatusPending: '待审核',\n permStatusApproved: '已审核',\n permStatusRejected: '已拒绝',\n permDemo: '演示数据',\n reloginTitle: '请重新登录万相AI中台',\n reloginBody: '请重新登录',\n reloginAction: '重新登录',\n reloginDismiss: '稍后再说',\n upgradeAvailableTitle: '工作区有新版本可用',\n upgradeAvailableBody: '重启工作区后生效。',\n upgradeAction: '立即升级',\n upgradeLater: '稍后',\n upgradeDialogTitle: '升级工作区',\n upgradeDialogBody: '工作区会重启并短暂断开。文件和历史会话会保留。',\n upgradeNoSessions: '当前没有运行中的会话,工作区将立即重启。',\n upgradeSessionsWarning: '有 {count} 个正在运行的会话会被中断。升级完成后会自动恢复这些会话并发送“继续”。',\n upgradeCancel: '取消',\n upgradeConfirm: '停止任务并升级',\n upgradeBusy: '正在升级工作区…',\n upgradeStarted: '升级已开始。工作区重新连接后请刷新页面。',\n upgradeFailed: '工作区升级启动失败,请重试。',\n upgradeRetry: '重试',\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: pulls the skill center's slot declaration so this plugin can contribute to it.\nimport type {} from '@sparkelf/dsh-client-ui-skill-center/client'\nimport { ManagedDataOpsSection } from './ManagedDataOpsSection.tsx'\nimport { SkillPlazaSection } from './SkillPlazaSection.tsx'\nimport { installWanxiangBranding } from './install-branding.tsx'\nimport { ReloginPrompt, type ReloginPromptProps } from './ReloginPrompt.tsx'\nimport { PermissionCenterSection } from './PermissionCenterSection.tsx'\nimport { PermissionCenterIcon } from './PermissionCenterIcon.tsx'\nimport { WorkspaceUpgradePrompt } from './WorkspaceUpgradePrompt.tsx'\nimport { WorkflowPlazaBell } from './NotificationBell.tsx'\nimport { canSeeManagedSettings, subscribeManagedSettingsVisibility } from './settings-gate.ts'\nimport { REVIEW_CONTEXT_PATH, reviewDemoMode } from './review-client.ts'\nimport type { ManagedDataOpsSectionInjected } from './ManagedDataOpsSection.tsx'\nimport { en, zh, type ManagedDataOpsKey } from './locales.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface SlotMap {\n /** Header actions declared by the knowledge-base workflow plaza. */\n 'workflow-plaza.actions': {\n kind: 'single'\n scope: 'root'\n owner: Record<string, never>\n hookContext: unknown\n }\n }\n\n interface LocaleNamespaceMap {\n 'settings.dataops-managed': ManagedDataOpsKey\n }\n}\n\nconst NS = 'settings.dataops-managed'\nconst AUTH_UPDATED_MESSAGE = 'dataops-auth-updated'\nconst MANAGED_AUTH_PATH = '/integrations/dataops/managed-auth'\n\n/** Sidebar entry and main page id for the permission centre. */\nconst PERMISSION_PANEL_ID = 'dataops-permissions'\n\n/** Required client services for the managed DataOps Settings section. */\nexport const inject = ['slots', 'locale']\n\n/**\n * Bind the four strings the sign-in prompt needs.\n *\n * Narrowed to exactly those keys rather than reusing the settings-section resolver: the prompt\n * asks its own small copy, and a wider type would let a typo pass as a valid key.\n *\n * @param ctx - client context carrying the registered namespace.\n * @returns a resolver for the prompt's own keys.\n */\nconst bindReloginCopy = (ctx: ClientContext): ReloginPromptProps['t'] => {\n const translate = ctx.locale.bind(NS) as (key: string) => string\n return (key) => translate(key)\n}\n\n/**\n * Register the managed DataOps surfaces and the sign-in prompt.\n *\n * The prompt rides a sidebar seat because the client needs *some* always-mounted surface for a\n * dialog that is about the whole workspace rather than one panel. The seat is a container: the\n * dialog itself portals to `document.body`, so this contributes no visible element to the\n * sidebar at rest and cannot disturb the regions that already live there.\n *\n * @param ctx - DSH client context with locale, slots and the sidebar foot.\n */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'dataops-managed: settings copy')\n installWanxiangBranding(ctx)\n const t = ctx.locale.bind(NS) as ManagedDataOpsSectionInjected['t']\n\n /**\n * Register the settings section only for the two administrator role labels.\n *\n * The identity record arrives after the iframe loads and can change when the portal account is\n * switched, so the registration is reconciled whenever the shared account store publishes. An\n * ordinary user's profile therefore has no section, no configuration form, and no publish\n * control at all — not a hidden one.\n */\n ctx.effect(() => {\n let disposeSection: (() => void) | undefined\n const reconcile = (): void => {\n const allowed = canSeeManagedSettings()\n if (allowed && disposeSection === undefined) {\n disposeSection = ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'dataops',\n order: 25,\n label: () => t('nav'),\n inject: () => ({ t }),\n }, ManagedDataOpsSection))\n } else if (!allowed && disposeSection !== undefined) {\n disposeSection()\n disposeSection = undefined\n }\n }\n reconcile()\n const unsubscribe = subscribeManagedSettingsVisibility(reconcile)\n return () => {\n unsubscribe()\n disposeSection?.()\n disposeSection = undefined\n }\n }, 'dataops-managed: settings section role gate')\n\n /**\n * The re-authentication prompt, mounted where it is always alive.\n *\n * A dialog needs a component that stays mounted whether or not the operator has the settings\n * panel open, and the sidebar foot is the one seat this plugin already owns. The component\n * renders nothing until DataOps reports the session has ended, so at rest it adds no element.\n */\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action',\n id: 'dataops-relogin',\n order: 90,\n inject: () => ({ t: bindReloginCopy(ctx) }),\n }, ReloginPrompt))\n /**\n * The workspace image upgrade notice. It lives in the shell overlay so it can sit\n * above the page without taking a sidebar or conversation seat; the component renders\n * nothing until DataOps reports a newer image.\n */\n ctx.slots.inject('shell.overlay', () => ctx.slots.register({\n name: 'shell.overlay',\n id: 'dataops-workspace-upgrade',\n order: 20,\n inject: () => ({ t }),\n }, WorkspaceUpgradePrompt as never))\n\n /**\n * The permission centre, a sidebar entry plus the page it opens.\n *\n * The entry's glyph hides itself for an ordinary user; the page and every backend endpoint\n * re-check the caller, so hiding is navigation, not authorization.\n */\n ctx.effect(() => ctx.slots.inject('main', () => ctx.slots.register({\n name: 'main',\n key: PERMISSION_PANEL_ID as never,\n }, (() => PermissionCenterSection({ t })) as never)), 'dataops-managed: permission centre page')\n\n ctx.effect(() => {\n let disposeEntry: (() => void) | undefined\n let live = true\n const allowed = async (): Promise<boolean> => {\n if (typeof window !== 'undefined' && reviewDemoMode()) return true\n // The two managed-settings roles are already known from the launcher label; a department\n // administrator is only known from the review context, so ask the Host in that case.\n if (canSeeManagedSettings()) return true\n try {\n const response = await fetch(REVIEW_CONTEXT_PATH)\n if (!response.ok) return false\n const body = await response.json() as { primaryRole?: string; review?: { canReview?: boolean } }\n return body.primaryRole === 'DEPT_ADMIN' || body.review?.canReview === true\n } catch {\n return false\n }\n }\n const sync = async (): Promise<void> => {\n const next = await allowed()\n if (!live) return\n if (next && disposeEntry === undefined) {\n disposeEntry = ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({\n name: 'sidebar.panellist',\n id: PERMISSION_PANEL_ID,\n order: 20,\n label: () => t('permNav'),\n locale: NS,\n }, PermissionCenterIcon as never))\n } else if (!next && disposeEntry !== undefined) {\n disposeEntry()\n disposeEntry = undefined\n }\n }\n void sync()\n const off = subscribeManagedSettingsVisibility(() => { void sync() })\n return () => {\n live = false\n off()\n disposeEntry?.()\n disposeEntry = undefined\n }\n }, 'dataops-managed: permission centre entry gate')\n\n /**\n * The skill plaza, contributed to the skill center page.\n *\n * The skill center declares the slot and renders whatever it holds; a profile without this\n * plugin leaves it empty, which is what keeps the plaza out of a deployment that never\n * installed DataOps.\n */\n ctx.slots.inject('skill-center.section', () => ctx.slots.register({\n name: 'skill-center.section',\n id: 'dataops-plaza',\n order: 10,\n inject: () => ({ t }),\n }, SkillPlazaSection))\n\n /**\n * The workflow plaza's header seat, declared by the knowledge-base plugin. It renders a slot\n * rather than importing this plugin; the bell therefore joins only when both are installed.\n */\n ctx.slots.inject('workflow-plaza.actions', () => ctx.slots.register({\n name: 'workflow-plaza.actions',\n }, WorkflowPlazaBell as never))\n\n const synchronizeJwt = async (): Promise<void> => {\n const response = await fetch(new URL(MANAGED_AUTH_PATH, window.location.origin), {\n method: 'POST',\n credentials: 'same-origin',\n })\n if (!response.ok) throw new Error(`DataOps managed JWT synchronization failed with HTTP ${String(response.status)}`)\n }\n const onMessage = (event: MessageEvent<unknown>): void => {\n if (event.source !== window.parent\n || (event.data as { type?: unknown } | null)?.type !== AUTH_UPDATED_MESSAGE) return\n void synchronizeJwt().catch(error => console.error('dataops-managed.jwt_sync_failed', error))\n }\n ctx.effect(() => {\n window.addEventListener('message', onMessage)\n void synchronizeJwt().catch(error => console.error('dataops-managed.jwt_sync_failed', error))\n return () => window.removeEventListener('message', onMessage)\n }, 'dataops-managed: JWT synchronization')\n}\n"],"mappings":"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"}