@sparkelf/dsh-task-bus 0.1.1 → 0.1.3

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":["Tag","Button","Switch","Tag","Button","useState","useMemo","Modal","IconCloseOutlineRegular","SegmentedTabs"],"sources":["../src/client/theme.ts","../src/client/connector-state.ts","../src/client/ConnectorCard.tsx","../src/client/index.tsx"],"sourcesContent":["/** Palette aliases the Task Center draws with; the shell owns the values. */\n\nexport const colors = {\n panel: 'var(--dsw-alias-bg-layer-1, #ffffff)',\n panelAlt: 'var(--dsw-alias-bg-layer-2, #f7f8fa)',\n text: 'var(--dsw-alias-label-primary, #111827)',\n muted: 'var(--dsw-alias-label-secondary, #6b7280)',\n line: 'var(--dsw-alias-border-l1, #e5e7eb)',\n accent: 'var(--dsw-alias-brand-primary, #2563eb)',\n accentSoft: 'var(--dsw-alias-brand-primary-alpha, #eff6ff)',\n warning: 'var(--dsw-alias-state-warning, #b45309)',\n success: 'var(--dsw-alias-state-success, #047857)',\n danger: 'var(--dsw-alias-state-danger, #b91c1c)',\n}","/**\n * Client state adapter for the Task Center's one connector.\n *\n * The Host owns the authoritative enabled/capability state and the tool\n * disclosure that follows it. This module only reads that state, sends the two\n * writes the panel offers, and projects the task rows a capability filter\n * selects. It never decides permissions: a capability absent from the Host's\n * answer is one this account may not use, so it is never rendered.\n *\n * @module @sparkelf/dsh-task-bus/client/connector-state\n */\n\n/** Route the Host serves the connector state from. */\nexport const CONNECTOR_ROUTE = '/dsh-task-bus/api/connector'\n\n/** Connector id carried by DataOps approval tasks. */\nexport const CONNECTOR_ID = 'wanxiang-ai'\n\n/** Display name shared by the card and its empty state. */\nexport const CONNECTOR_NAME = '万相AI中台连接器'\n\n/** State the Host persists and the card renders. */\nexport interface ConnectorState {\n /** Whether the connector contributes task capabilities at all. */\n enabled: boolean\n /**\n * Capability id to enabled flag. Only capabilities this account may use\n * appear here; an absent id is hidden rather than shown disabled.\n */\n capabilities: Record<string, boolean>\n /** Per-capability reason it cannot run right now, when the Host reports one. */\n reasons?: Record<string, string>\n}\n\n/** One capability row as the card renders it. */\nexport interface ConnectorCapabilityView {\n id: string\n label: string\n description?: string\n enabled: boolean\n unavailableReason?: string\n}\n\n/** Copy for the capability ids the Host currently ships. */\nconst CAPABILITY_COPY: Record<string, { label: string; description: string }> = {\n 'approval.push': { label: '接收审批任务', description: '从万相AI中台接收待办理的审批任务' },\n 'approval.writeback': { label: '回写审批结果', description: '把办理结果回写到万相AI中台' },\n 'task.push': { label: '接收通用任务', description: '接收万相AI中台下发的通用任务' },\n 'task.writeback': { label: '回写任务状态', description: '把任务处理状态回写到万相AI中台' },\n 'ai.accept': { label: 'AI 受理', description: '由助手创建受理会话处理任务' },\n}\n\n/** Humanize an id the client has no display copy for. */\nfunction humanizeCapability(id: string): string {\n return id.replace(/[._-]+/gu, ' ').trim()\n}\n\n/** Parse one unknown wire value into connector state. */\nexport function parseConnectorState(value: unknown): ConnectorState {\n if (typeof value !== 'object' || value === null) return { enabled: false, capabilities: {} }\n const row = value as Record<string, unknown>\n const capabilities: Record<string, boolean> = {}\n const reasons: Record<string, string> = {}\n const raw = typeof row.capabilities === 'object' && row.capabilities !== null\n ? row.capabilities as Record<string, unknown>\n : {}\n for (const [id, entry] of Object.entries(raw)) {\n if (typeof entry === 'boolean') {\n capabilities[id] = entry\n continue\n }\n if (typeof entry !== 'object' || entry === null) continue\n const detail = entry as { enabled?: unknown; permitted?: unknown; reason?: unknown }\n // A future Host may send a per-capability object; `permitted: false` means\n // the account cannot use it, so the row stays out of the catalogue.\n if (detail.permitted === false) continue\n capabilities[id] = detail.enabled === true\n if (typeof detail.reason === 'string' && detail.reason !== '') reasons[id] = detail.reason\n }\n const rawReasons = typeof row.reasons === 'object' && row.reasons !== null\n ? row.reasons as Record<string, unknown>\n : {}\n for (const [id, reason] of Object.entries(rawReasons)) {\n if (typeof reason === 'string' && reason !== '') reasons[id] = reason\n }\n return {\n enabled: row.enabled === true,\n capabilities,\n ...Object.keys(reasons).length === 0 ? {} : { reasons },\n }\n}\n\n/**\n * Read the Host's connector state.\n * @param route - connector route; overridable for tests.\n * @returns the parsed state.\n * @throws when the Host rejects the request.\n */\nexport async function fetchConnectorState(route: string = CONNECTOR_ROUTE): Promise<ConnectorState> {\n const response = await fetch(route, { headers: { accept: 'application/json' } })\n if (!response.ok) throw new Error('连接器状态读取失败(' + String(response.status) + ')')\n return parseConnectorState(await response.json() as unknown)\n}\n\n/**\n * Write connector state through the Host.\n * @param patch - the enabled flag and optional capability changes to merge.\n * @param route - connector route; overridable for tests.\n * @returns the state the Host persisted.\n * @throws when the Host rejects the request.\n */\nexport async function saveConnectorState(\n patch: { enabled: boolean; capabilities?: Record<string, boolean> },\n route: string = CONNECTOR_ROUTE,\n): Promise<ConnectorState> {\n const response = await fetch(route, {\n method: 'POST',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify(patch),\n })\n if (!response.ok) throw new Error('连接器状态保存失败(' + String(response.status) + ')')\n return parseConnectorState(await response.json() as unknown)\n}\n\n/**\n * Project the capability rows the card renders.\n * @param state - Host state.\n * @returns one row per capability the account may use, in the Host's order.\n */\nexport function visibleCapabilities(state: ConnectorState | null): ConnectorCapabilityView[] {\n if (state === null) return []\n return Object.entries(state.capabilities).map(([id, enabled]) => {\n const copy = CAPABILITY_COPY[id]\n return {\n id,\n label: copy?.label ?? humanizeCapability(id),\n ...copy === undefined ? {} : { description: copy.description },\n enabled,\n ...state.reasons?.[id] === undefined ? {} : { unavailableReason: state.reasons[id] },\n }\n })\n}\n\n/** The subset of a Task Center row the connector projection reads. */\nexport interface ConnectorTaskLike {\n sourceType: string\n source: { type: string }\n /** Connector that produced the row, when the Host carries it. */\n connectorId?: string\n /** Capability that produced the row, when the Host carries it. */\n capabilityId?: string\n}\n\n/**\n * The connector that produced a task row. MVP DataOps approval rows predate\n * explicit ids, so their source type still identifies the built-in connector.\n * @param task - one task row.\n * @returns the connector id, or undefined for a generic Task Bus row.\n */\nexport function taskConnectorId(task: ConnectorTaskLike): string | undefined {\n if (task.connectorId !== undefined && task.connectorId !== '') return task.connectorId\n return task.sourceType === 'dataops_approval' ? CONNECTOR_ID : undefined\n}\n\n/**\n * The capability that produced a task row; an id-less DataOps approval row\n * belongs to `approval.push`.\n * @param task - one task row.\n * @returns the capability id, or undefined for a generic Task Bus row.\n */\nexport function taskCapabilityId(task: ConnectorTaskLike): string | undefined {\n if (task.capabilityId !== undefined && task.capabilityId !== '') return task.capabilityId\n return task.sourceType === 'dataops_approval' ? 'approval.push' : undefined\n}\n\n/**\n * Filter rows for the connector tab.\n * @param tasks - every loaded row.\n * @param capabilityId - `all`, or the capability whose rows should remain.\n * @returns rows produced by the built-in connector, narrowed to the capability.\n */\nexport function filterConnectorTasks<T extends ConnectorTaskLike>(\n tasks: readonly T[],\n capabilityId: string,\n): T[] {\n return tasks.filter(task => (\n taskConnectorId(task) === CONNECTOR_ID\n && (capabilityId === 'all' || taskCapabilityId(task) === capabilityId)\n ))\n}","/**\n * The Task Center's connector card: one connector, its server-owned enabled\n * state, and — while enabled — the capability rows this account may use.\n *\n * @module @sparkelf/dsh-task-bus/client/ConnectorCard\n */\nimport type { ReactNode } from 'react'\nimport { Button, Switch, Tag, type TagTone } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { colors } from './theme.ts'\nimport {\n CONNECTOR_NAME,\n visibleCapabilities,\n type ConnectorState,\n} from './connector-state.ts'\n\n/** Inputs the Task Center supplies. */\nexport interface ConnectorCardProps {\n state: ConnectorState | null\n loading: boolean\n error: string | null\n busy: boolean\n /** Rows the current capability filter selects. */\n taskCount: number\n onSetEnabled(enabled: boolean): void\n onToggleCapability(capabilityId: string, enabled: boolean): void\n onReload(): void\n}\n\n/** Status label and tone for the card header. */\nfunction statusOf(state: ConnectorState | null, loading: boolean, error: string | null): { label: string; tone: TagTone } {\n if (loading && state === null) return { label: '同步中', tone: 'neutral' }\n if (error !== null) return { label: '连接异常', tone: 'danger' }\n if (state?.enabled !== true) return { label: '未启用', tone: 'neutral' }\n return { label: '已连接', tone: 'success' }\n}\n\n/** Draw the connector glyph the card header carries. */\nfunction ConnectorGlyph(): ReactNode {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l2-2a5 5 0 0 0-7.07-7.07l-1.15 1.15\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-2 2a5 5 0 0 0 7.07 7.07l1.15-1.15\" />\n </svg>\n )\n}\n\n/**\n * Render the connector card.\n * @param props - server state, write handlers, and the current task count.\n * @returns the card.\n */\nexport function ConnectorCard({\n state, loading, error, busy, taskCount, onSetEnabled, onToggleCapability, onReload,\n}: ConnectorCardProps): ReactNode {\n const status = statusOf(state, loading, error)\n const enabled = state?.enabled === true\n const capabilities = visibleCapabilities(state)\n return (\n <article\n data-connector-card={CONNECTOR_NAME}\n data-connector-enabled={enabled}\n style={{\n width: '100%',\n minWidth: 0,\n border: '1px solid ' + colors.line,\n borderRadius: 12,\n background: colors.panelAlt,\n padding: 14,\n display: 'flex',\n flexDirection: 'column',\n gap: 10,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 9 }}>\n <span aria-hidden=\"true\" style={{ width: 32, height: 32, flex: 'none', borderRadius: 9, background: '#2563eb', color: '#fff', display: 'inline-flex', alignItems: 'center', justifyContent: 'center' }}>\n <ConnectorGlyph />\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 13, fontWeight: 700, color: colors.text }}>{CONNECTOR_NAME}</div>\n <div style={{ marginTop: 2, fontSize: 10, color: colors.muted }}>DataOps</div>\n </div>\n <Tag tone={status.tone}>{status.label}</Tag>\n </div>\n\n <div style={{ fontSize: 11, lineHeight: 1.55, color: colors.muted }}>\n 接收万相AI中台的审批任务\n </div>\n\n {loading && state === null ? (\n <div style={{ fontSize: 11, color: colors.muted }}>正在读取连接器状态…</div>\n ) : null}\n {error === null ? null : (\n <div role=\"alert\" style={{ display: 'flex', alignItems: 'center', gap: 8, fontSize: 11, color: colors.danger }}>\n <span style={{ flex: 1, minWidth: 0 }}>{error}</span>\n <Button size=\"sm\" variant=\"ghost\" disabled={loading} onClick={onReload}>重试</Button>\n </div>\n )}\n\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 10, minHeight: 28 }}>\n <span style={{ fontSize: 12, color: colors.muted }}>\n {enabled ? '已启用,任务中心只读取该连接器的任务' : '未启用,任务中心不读取外部任务'}\n </span>\n <Switch\n checked={enabled}\n disabled={busy || loading}\n label={(enabled ? '停用 ' : '启用 ') + CONNECTOR_NAME}\n onChange={(next) => { onSetEnabled(next) }}\n />\n </div>\n\n {enabled ? (\n <div data-connector-capabilities style={{ borderTop: '1px solid ' + colors.line, paddingTop: 8, display: 'grid', gap: 2 }}>\n <div style={{ fontSize: 10, color: colors.muted }}>能力</div>\n {capabilities.length === 0 ? (\n <div style={{ fontSize: 11, color: colors.muted, padding: '6px 0' }}>\n 当前账号没有可用的连接器能力,请联系管理员开通\n </div>\n ) : capabilities.map(capability => {\n const unavailable = capability.unavailableReason !== undefined\n return (\n <div\n key={capability.id}\n data-capability-id={capability.id}\n data-capability-enabled={capability.enabled}\n style={{ display: 'flex', alignItems: 'center', gap: 10, minHeight: 40, padding: '4px 0', borderTop: '1px solid ' + colors.line }}\n >\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 12, color: colors.text }}>{capability.label}</div>\n {capability.description === undefined ? null : (\n <div style={{ marginTop: 1, fontSize: 10, color: colors.muted }}>{capability.description}</div>\n )}\n {capability.unavailableReason === undefined ? null : (\n <div style={{ marginTop: 2, fontSize: 10, color: colors.warning }}>\n 暂不可用 · {capability.unavailableReason}\n </div>\n )}\n </div>\n <Switch\n checked={capability.enabled}\n disabled={busy || unavailable}\n label={(capability.enabled ? '停用 ' : '启用 ') + capability.label}\n onChange={(next) => { onToggleCapability(capability.id, next) }}\n />\n </div>\n )\n })}\n </div>\n ) : null}\n\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8, marginTop: 'auto', fontSize: 10, color: colors.muted }}>\n <span>{enabled ? '该连接器任务 ' + String(taskCount) + ' 条' : '启用后在此查看连接器任务'}</span>\n <Button size=\"sm\" variant=\"ghost\" disabled={loading} onClick={onReload}>刷新状态</Button>\n </div>\n </article>\n )\n}\n\n/**\n * The disabled connector's empty state, with the one path that can enable it.\n * @param props.onOpenSkillCenter - select the skill center's connector tab.\n * @returns the empty state.\n */\nexport function ConnectorDisabledState({ onOpenSkillCenter }: { onOpenSkillCenter(): void }): ReactNode {\n return (\n <div\n data-connector-disabled-state\n style={{ display: 'grid', justifyItems: 'center', gap: 8, padding: '36px 20px 40px', color: colors.muted, textAlign: 'center' }}\n >\n <span style={{ display: 'inline-flex', width: 36, height: 36, alignItems: 'center', justifyContent: 'center', borderRadius: 18, background: colors.panelAlt, color: colors.muted }}>\n <ConnectorGlyph />\n </span>\n <span style={{ fontSize: 13, fontWeight: 600, color: colors.text }}>连接器未启用</span>\n <span style={{ maxWidth: 380, fontSize: 12, lineHeight: 1.6 }}>\n 在技能中心的连接器页面启用「{CONNECTOR_NAME}」后,这里会显示它接收的审批任务。\n </span>\n <Button size=\"sm\" variant=\"outline\" onClick={onOpenSkillCenter}>前往技能中心启用</Button>\n </div>\n )\n}","/**\n * The Task Center surface in the frame-wide overlay.\n *\n * The button is global because a task can arrive while the reader is in any\n * session. The panel only renders cards returned by the Host bridge; it never\n * talks to DataOps directly and never derives a second approval status.\n */\nimport { useEffect, useMemo, useState, type CSSProperties } from 'react'\nimport {\n Button,\n IconCloseOutlineRegular,\n Modal,\n SegmentedTabs,\n Tag,\n type SegmentedTab,\n type TagTone,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport { colors } from './theme.ts'\nimport {\n fetchConnectorState,\n filterConnectorTasks,\n saveConnectorState,\n visibleCapabilities,\n type ConnectorState,\n} from './connector-state.ts'\nimport { ConnectorCard, ConnectorDisabledState } from './ConnectorCard.tsx'\n\nexport const inject = ['slots', 'locale', 'uiWorkspace', 'sessions', 'sidebarRight', 'layout']\n\ninterface TaskItem {\n id: string\n sourceType: 'dataops_approval' | 'task_bus'\n title: string\n code?: string\n description?: string | null\n status: string\n statusLabel: string\n priority?: string | null\n tags?: string[]\n source: {\n type: string\n id?: string | null\n label?: string | null\n workflowCode?: string | null\n deepLink?: string | null\n }\n assignee?: { type: string; id: string } | null\n creator?: { type: string; id: string } | null\n actions?: string[]\n dueAt?: string | null\n updatedAt: string\n /** Connector that produced the row, when the Host carries it. */\n connectorId?: string\n /** Capability that produced the row, when the Host carries it. */\n capabilityId?: string\n}\n\nconst ROUTE = '/dsh-task-bus/api'\n\nconst TASK_BUS_MODAL_CLASS = 'task-bus-center-modal'\nconst TASK_BUS_HISTORY_CLASS = 'task-bus-history-modal'\nconst TASK_BUS_STYLE_ID = 'task-bus-center-modal-style'\nconst TASK_BUS_MODAL_CSS = `\n.${TASK_BUS_MODAL_CLASS} {\n width: min(960px, calc(100vw - 64px)) !important;\n height: min(760px, calc(100vh - 64px)) !important;\n gap: 0 !important;\n padding: 0 !important;\n}\n@media (max-width: 700px) {\n .${TASK_BUS_MODAL_CLASS} {\n width: calc(100vw - 24px) !important;\n height: calc(100vh - 24px) !important;\n }\n}\n.${TASK_BUS_HISTORY_CLASS} {\n width: min(960px, 92vw) !important;\n max-width: calc(100vw - 32px) !important;\n height: auto !important;\n max-height: min(780px, calc(100vh - 48px)) !important;\n}\n@media (max-width: 700px) {\n .${TASK_BUS_HISTORY_CLASS} {\n width: calc(100vw - 24px) !important;\n max-width: calc(100vw - 24px) !important;\n max-height: calc(100vh - 24px) !important;\n }\n}\n`\n\nconst HISTORY_NS = 'task-bus.history'\nconst HISTORY_COPY = {\n zh: {\n title: '消息记录',\n open: '消息记录',\n close: '关闭',\n searchPlaceholder: '搜索消息或发送人…',\n searchLabel: '搜索消息记录',\n clear: '清空搜索',\n initial: '输入关键词搜索消息或发送人',\n initialHint: '可按消息正文或发送人筛选,点结果跳到原消息。',\n loading: '正在加载消息记录…',\n error: '消息记录加载失败',\n empty: '暂无消息记录',\n noResults: '没有匹配的消息',\n jump: '跳到该消息',\n me: '我',\n assistant: '助手',\n dateLocale: 'zh-CN',\n },\n en: {\n title: 'Message history',\n open: 'Message history',\n close: 'Close',\n searchPlaceholder: 'Search messages or senders…',\n searchLabel: 'Search message history',\n clear: 'Clear search',\n initial: 'Search messages or senders to begin',\n initialHint: 'Filter by message text or sender, then click a result to jump to it.',\n loading: 'Loading message history…',\n error: 'Could not load message history',\n empty: 'No message history',\n noResults: 'No matching messages',\n jump: 'Jump to message',\n me: 'Me',\n assistant: 'Assistant',\n dateLocale: 'en-US',\n },\n} as const\n\ntype HistoryCopyKey = keyof typeof HISTORY_COPY.zh\ntype HistoryTranslate = (key: HistoryCopyKey) => string\n\nconst buttonStyle: CSSProperties = {\n border: '1px solid ' + colors.line,\n background: colors.panel,\n color: colors.text,\n borderRadius: 8,\n padding: '7px 11px',\n fontSize: 12,\n cursor: 'pointer',\n}\n\n/** Capability filter chip; the active chip keeps the accent fill and stroke. */\nconst filterChipStyle = (active: boolean): CSSProperties => ({\n padding: '4px 10px',\n borderRadius: 999,\n border: '1px solid ' + (active ? colors.accent : colors.line),\n background: active ? colors.accentSoft : 'transparent',\n color: active ? colors.accent : colors.muted,\n fontSize: 11,\n lineHeight: 1.6,\n cursor: 'pointer',\n})\n\nconst statusTagTone = (status: string): TagTone => {\n if (status === 'completed') return 'success'\n if (status === 'cancelled') return 'neutral'\n if (status === 'blocked') return 'danger'\n if (status === 'pending_confirm' || status === 'returned' || status === 'pending_accept') return 'warning'\n return 'info'\n}\n\nconst relativeTime = (value: string) => {\n const time = Date.parse(value)\n if (!Number.isFinite(time)) return ''\n const minutes = Math.max(0, Math.round((Date.now() - time) / 60_000))\n if (minutes < 1) return '刚刚'\n if (minutes < 60) return String(minutes) + ' 分钟前'\n const hours = Math.round(minutes / 60)\n if (hours < 24) return String(hours) + ' 小时前'\n return String(Math.round(hours / 24)) + ' 天前'\n}\n\nconst fetchJson = async <T,>(path: string): Promise<T> => {\n const attempt = async () => {\n const response = await fetch(ROUTE + path, { headers: { accept: 'application/json' } })\n const payload = await response.json() as unknown\n return { response, payload }\n }\n let { response, payload } = await attempt()\n // The managed session handshake runs in parallel with the panel mount; a 401\n // here is usually \"the cookie is not set yet\", not an authorization failure.\n if (response.status === 401) {\n await new Promise((resolve) => setTimeout(resolve, 900))\n ;({ response, payload } = await attempt())\n }\n if (!response.ok) {\n const message = payload !== null && typeof payload === 'object' && 'error' in payload\n ? String((payload as { error: unknown }).error)\n : '任务中心请求失败(' + response.status + ')'\n throw new Error(message)\n }\n return payload as T\n}\n\n\nconst approvalHref = (raw: string | null): string | null => {\n if (raw === null) return null\n try {\n const target = new URL(raw)\n const referrer = document.referrer ? new URL(document.referrer) : null\n if (referrer !== null && referrer.origin !== target.origin) {\n return referrer.origin + target.pathname + target.search + target.hash\n }\n return target.href\n } catch {\n return raw\n }\n}\n\nconst TaskCard = ({\n task,\n busy,\n aiBusy,\n onTransition,\n onAiAccept,\n onOpen,\n}: {\n task: TaskItem\n busy: boolean\n aiBusy: boolean\n onTransition: (task: TaskItem, action: string) => void\n onAiAccept: (task: TaskItem) => void\n onOpen: (task: TaskItem) => void\n}) => {\n const isApproval = task.sourceType === 'dataops_approval'\n const deepLink = approvalHref(task.source.deepLink ?? null)\n return (\n <article\n style={{\n border: '1px solid ' + colors.line,\n borderRadius: 10,\n background: colors.panel,\n padding: '12px 13px',\n display: 'grid',\n gap: 8,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 10 }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 7, flexWrap: 'wrap', marginBottom: 4 }}>\n <Tag tone={isApproval ? 'info' : 'neutral'}>\n {isApproval ? (task.source.label ?? 'DataOps 审批') : '任务总线'}\n </Tag>\n {task.tags?.map((tag) => (\n <Tag key={tag} tone=\"quiet\">{tag}</Tag>\n ))}\n </div>\n <div style={{ fontSize: 13, fontWeight: 650, color: colors.text, lineHeight: 1.45 }}>\n {task.title}\n </div>\n {task.description ? (\n <div style={{ fontSize: 11, color: colors.muted, marginTop: 4, lineHeight: 1.5 }}>\n {task.description}\n </div>\n ) : null}\n </div>\n <span style={{ flex: 'none' }}><Tag tone={statusTagTone(task.status)}>{task.statusLabel}</Tag></span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap', fontSize: 10, color: colors.muted }}>\n <span>{isApproval ? '审批任务' : '任务'}</span>\n {task.assignee?.id ? <span>受理人:{task.assignee.id}</span> : null}\n <span style={{ marginLeft: 'auto' }}>{relativeTime(task.updatedAt)}</span>\n </div>\n <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>\n {isApproval && deepLink ? (\n <Button size=\"sm\" variant=\"primary\" onClick={() => window.open(deepLink, '_blank', 'noopener,noreferrer')}>\n 办理\n </Button>\n ) : null}\n {task.status !== 'completed' && task.status !== 'cancelled' ? (\n <Button size=\"sm\" variant=\"outline\" disabled={aiBusy || busy} onClick={() => onAiAccept(task)}>\n {aiBusy ? '受理中…' : 'AI受理'}\n </Button>\n ) : null}\n <Button size=\"sm\" variant=\"ghost\" onClick={() => onOpen(task)}>详情</Button>\n {!isApproval && task.status === 'pending_accept' ? (\n <Button size=\"sm\" variant=\"primary\" disabled={busy} onClick={() => onTransition(task, 'accept')}>受理</Button>\n ) : null}\n {!isApproval && task.status === 'in_progress' ? (\n <Button size=\"sm\" variant=\"outline\" disabled={busy} onClick={() => onTransition(task, 'submit')}>提交确认</Button>\n ) : null}\n {!isApproval && task.status === 'pending_confirm' ? (\n <Button size=\"sm\" variant=\"primary\" disabled={busy} onClick={() => onTransition(task, 'complete')}>完成</Button>\n ) : null}\n {!isApproval && task.status !== 'completed' && task.status !== 'cancelled' ? (\n <Button size=\"sm\" variant=\"ghost\" disabled={busy} onClick={() => onTransition(task, 'cancel')}>取消</Button>\n ) : null}\n </div>\n </article>\n )\n}\n\n\ninterface TaskAttachmentRecord {\n id: string\n originalName: string\n contentType: string\n sizeBytes: number\n kind: string\n}\n\ninterface FormFieldData {\n key: string\n label: string\n value: unknown\n type?: 'multiline' | 'resources'\n span?: 1 | 2\n}\n\ninterface FormSectionData {\n title: string\n fields: FormFieldData[]\n}\n\ninterface TaskDetailPayload {\n id?: number | string\n payload?: {\n form?: Record<string, unknown>\n selectedItems?: Array<Record<string, unknown>>\n resourceAccessRequest?: {\n form?: Record<string, unknown>\n selectedItems?: Array<Record<string, unknown>>\n }\n }\n form?: { sections?: FormSectionData[] }\n attachments?: TaskAttachmentRecord[]\n}\n\nconst FORM_LABELS: Record<string, string> = {\n applicationMode: '申请方式',\n requestKind: '申请类型',\n requestedPermissions: '申请权限',\n requesterDepartment: '申请人部门',\n requesterPhone: '申请人电话',\n validFrom: '授权开始时间',\n expiresAt: '授权结束时间',\n selectionSummary: '资源摘要',\n code: '应用编码',\n name: '应用名称',\n reason: '申请理由',\n description: '应用说明',\n departmentName: '归属部门',\n departmentCode: '归属部门编码',\n ownerName: '归属负责人',\n ownerPhone: '归属负责人电话',\n constructionUnit: '建设单位',\n constructionOwner: '建设单位负责人',\n constructionOwnerPhone: '建设单位负责人电话',\n operationsUnit: '运维单位',\n operationsOwner: '运维单位负责人',\n operationsOwnerPhone: '运维单位负责人电话',\n requestTime: '申请时间',\n resourceName: '资源名称',\n resourceType: '资源类型',\n accessType: '访问方式',\n accessScope: '访问范围',\n applicationName: '所属应用',\n applicationCode: '应用编码',\n environment: '环境',\n accountCount: '账号数量',\n}\n\nconst SKIP_FORM_KEYS = new Set([\n 'ownerUserId',\n 'requesterUserId',\n 'requesterDept',\n 'existingApplicationId',\n 'applicationId',\n 'taskType',\n])\n\nconst formatBytes = (bytes: number) => {\n if (!Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return bytes + ' B'\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB'\n}\n\nconst humanizeField = (key: string) => key\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .trim()\n\nconst formatFormValue = (key: string, value: unknown): string => {\n if (key === 'applicationMode') {\n if (value === 'EXISTING') return '使用已有应用'\n if (value === 'NEW') return '新建应用'\n }\n if (typeof value === 'boolean') return value ? '是' : '否'\n if (Array.isArray(value)) return value.map((item) => String(item)).join('、')\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>\n if (typeof record.name === 'string') return record.name\n return JSON.stringify(value)\n }\n return String(value)\n}\n\nconst toFormField = (key: string, value: unknown): FormFieldData => ({\n key,\n label: FORM_LABELS[key] ?? humanizeField(key),\n value,\n ...(key === 'reason' || key === 'description' || key === 'accessScope'\n ? { type: 'multiline' as const, span: 2 as const }\n : {}),\n})\n\nconst formFields = (form: Record<string, unknown> | undefined): FormFieldData[] => (\n form === undefined\n ? []\n : Object.entries(form)\n .filter(([key, value]) => !SKIP_FORM_KEYS.has(key) && value !== null && value !== undefined && value !== '')\n .map(([key, value]) => toFormField(key, value))\n)\n\nconst approvalFormSections = (detail: TaskDetailPayload | null): FormSectionData[] => {\n if (detail === null) return []\n const sections: FormSectionData[] = []\n const applicationFields = formFields(detail.payload?.form)\n if (applicationFields.length > 0) sections.push({ title: '申请信息', fields: applicationFields })\n const resourceFields = formFields(detail.payload?.resourceAccessRequest?.form)\n if (resourceFields.length > 0) sections.push({ title: '资源申请', fields: resourceFields })\n const resources = [\n ...(detail.payload?.selectedItems ?? []),\n ...(detail.payload?.resourceAccessRequest?.selectedItems ?? []),\n ]\n if (resources.length > 0) {\n sections.push({\n title: '申请资源',\n fields: [{ key: 'resources', label: '资源', value: resources, type: 'resources', span: 2 }],\n })\n }\n return sections\n}\n\nconst ResourceValue = ({ items }: { items: Array<Record<string, unknown>> }) => (\n <div style={{ display: 'grid', gap: 5 }}>\n {items.map((item, index) => {\n const label = typeof item.title === 'string' ? item.title : typeof item.name === 'string' ? item.name : `资源 ${index + 1}`\n const detail = [item.scope, item.urn, item.id].filter((value) => typeof value === 'string' || typeof value === 'number').join(' · ')\n return (\n <div key={String(item.urn ?? item.id ?? index)} style={{ display: 'flex', alignItems: 'baseline', gap: 8, minWidth: 0 }}>\n <span style={{ fontSize: 12, color: colors.text }}>{label}</span>\n {detail ? <span style={{ fontSize: 10, color: colors.muted, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{detail}</span> : null}\n </div>\n )\n })}\n </div>\n)\n\nconst FormDescriptions = ({ sections }: { sections: FormSectionData[] }) => {\n if (sections.length === 0) return null\n return (\n <div style={{ display: 'grid', gap: 10 }}>\n {sections.map((section, sectionIndex) => (\n <section key={section.title + sectionIndex} style={{ border: '1px solid ' + colors.line, borderRadius: 10, background: colors.panel, padding: 14 }}>\n <div style={{ fontSize: 12, fontWeight: 650, color: colors.text, marginBottom: 9 }}>{section.title}</div>\n <dl style={{ margin: 0, display: 'grid', gridTemplateColumns: 'repeat(2, minmax(0, 1fr))', gap: '9px 24px' }}>\n {section.fields.map((field) => (\n <div\n key={field.key}\n style={{\n display: 'grid',\n gridTemplateColumns: '94px minmax(0, 1fr)',\n alignItems: 'start',\n gap: 8,\n minWidth: 0,\n gridColumn: field.span === 2 ? '1 / -1' : undefined,\n }}\n >\n <dt style={{ fontSize: 10, lineHeight: 1.6, color: colors.muted }}>{field.label}</dt>\n <dd style={{ margin: 0, fontSize: 12, lineHeight: 1.6, color: colors.text, whiteSpace: 'pre-wrap', overflowWrap: 'anywhere' }}>\n {field.type === 'resources' && Array.isArray(field.value)\n ? <ResourceValue items={field.value as Array<Record<string, unknown>>} />\n : field.value === null || field.value === undefined || field.value === ''\n ? '—'\n : formatFormValue(field.key, field.value)}\n </dd>\n </div>\n ))}\n </dl>\n </section>\n ))}\n </div>\n )\n}\n\nconst TaskDetail = ({ task, onBack }: { task: TaskItem; onBack: () => void }) => {\n const isApproval = task.sourceType === 'dataops_approval'\n const [detail, setDetail] = useState<TaskDetailPayload | null>(null)\n const [detailLoading, setDetailLoading] = useState(true)\n const [detailError, setDetailError] = useState<string | null>(null)\n\n useEffect(() => {\n let alive = true\n setDetailLoading(true)\n setDetailError(null)\n void fetchJson<{ detail?: TaskDetailPayload }>('/items/' + encodeURIComponent(task.id))\n .then((payload) => { if (alive) setDetail(payload.detail ?? null) })\n .catch((cause) => { if (alive) setDetailError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { if (alive) setDetailLoading(false) })\n return () => { alive = false }\n }, [task.id])\n\n const sections = isApproval ? approvalFormSections(detail) : detail?.form?.sections ?? []\n const attachments = detail?.attachments ?? []\n const approvalTaskId = isApproval && typeof detail?.id === 'number' ? detail.id : null\n const attachmentHref = (attachment: TaskAttachmentRecord) => approvalTaskId === null\n ? null\n : ROUTE + '/attachment?taskId=' + encodeURIComponent(String(approvalTaskId))\n + '&attachmentId=' + encodeURIComponent(attachment.id)\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10, flex: 1, minHeight: '100%' }}>\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 10 }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 14, fontWeight: 700, color: colors.text, lineHeight: 1.45 }}>{task.title}</div>\n <div style={{ marginTop: 3, fontSize: 10, color: colors.muted }}>\n {task.source.label ?? (isApproval ? 'DataOps 审批' : '任务总线')} · {relativeTime(task.updatedAt)}\n </div>\n </div>\n <Tag tone={statusTagTone(task.status)}>{task.statusLabel}</Tag>\n </div>\n\n {detailLoading ? <div style={{ padding: 18, textAlign: 'center', color: colors.muted, fontSize: 12 }}>正在加载表单…</div> : null}\n {detailError ? <div style={{ padding: '8px 10px', borderRadius: 8, background: '#fef2f2', color: colors.danger, fontSize: 11 }}>{detailError}</div> : null}\n {!detailLoading && detailError === null && sections.length > 0 ? <FormDescriptions sections={sections} /> : null}\n {!detailLoading && detailError === null && sections.length === 0 && !isApproval && task.description ? (\n <div style={{ border: '1px solid ' + colors.line, borderRadius: 10, background: colors.panel, padding: 14, fontSize: 12, lineHeight: 1.6, color: colors.text, whiteSpace: 'pre-wrap' }}>{task.description}</div>\n ) : null}\n {!detailLoading && detailError === null && sections.length === 0 && (isApproval || !task.description) ? (\n <div style={{ padding: 18, textAlign: 'center', color: colors.muted, fontSize: 12 }}>暂无表单信息</div>\n ) : null}\n\n {isApproval || attachments.length > 0 ? (\n <section style={{ border: '1px solid ' + colors.line, borderRadius: 10, background: colors.panel, padding: 14 }}>\n <div style={{ fontSize: 12, fontWeight: 650, color: colors.text, marginBottom: 8 }}>附件</div>\n {attachments.length === 0 ? <div style={{ fontSize: 11, color: colors.muted }}>暂无附件</div> : (\n <div style={{ display: 'grid', gap: 6 }}>\n {attachments.map((attachment) => {\n const href = attachmentHref(attachment)\n return (\n <div key={attachment.id} style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0 }}>\n <span style={{ flex: 1, minWidth: 0, fontSize: 11, color: colors.text, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{attachment.originalName}</span>\n <span style={{ flex: 'none', fontSize: 10, color: colors.muted }}>{formatBytes(attachment.sizeBytes)}</span>\n {href !== null ? <Button size=\"sm\" variant=\"ghost\" onClick={() => window.open(href, '_blank', 'noopener,noreferrer')}>下载</Button> : null}\n </div>\n )\n })}\n </div>\n )}\n </section>\n ) : null}\n\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8, flexWrap: 'wrap', marginTop: 'auto', paddingTop: 2 }}>\n <Button size=\"sm\" variant=\"ghost\" onClick={onBack}>← 返回列表</Button>\n {isApproval && task.source.deepLink ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => window.open(approvalHref(task.source.deepLink ?? null) ?? '#', '_blank', 'noopener,noreferrer')}>\n 打开 DataOps 审批详情\n </Button>\n ) : null}\n </div>\n </div>\n )\n}\n\ntype TaskTab = 'all' | 'mine' | 'personal' | 'group' | 'connectors'\n\nconst TaskCenterButton = ({ openSession, openSkillCenter }: {\n openSession: (sessionId: string) => void\n openSkillCenter: () => boolean\n}) => {\n const [open, setOpen] = useState(false)\n const [tasks, setTasks] = useState<TaskItem[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [tab, setTab] = useState<TaskTab>('all')\n const [busyId, setBusyId] = useState<string | null>(null)\n const [aiBusyId, setAiBusyId] = useState<string | null>(null)\n const [creating, setCreating] = useState(false)\n const [draftTitle, setDraftTitle] = useState('')\n const [draftSource, setDraftSource] = useState('manual')\n const [createBusy, setCreateBusy] = useState(false)\n const [selected, setSelected] = useState<TaskItem | null>(null)\n const [anchor, setAnchor] = useState<{ left: number; top: number } | null>(null)\n const [connector, setConnector] = useState<ConnectorState | null>(null)\n const [connectorLoading, setConnectorLoading] = useState(true)\n const [connectorError, setConnectorError] = useState<string | null>(null)\n const [connectorBusy, setConnectorBusy] = useState(false)\n const [capabilityFilter, setCapabilityFilter] = useState('all')\n const [skillCenterError, setSkillCenterError] = useState<string | null>(null)\n const [pendingCount, setPendingCount] = useState(0)\n const connectorEnabled = connector?.enabled === true\n\n useEffect(() => {\n if (document.getElementById(TASK_BUS_STYLE_ID) !== null) return\n const style = document.createElement('style')\n style.id = TASK_BUS_STYLE_ID\n style.textContent = TASK_BUS_MODAL_CSS\n document.head.append(style)\n return () => { style.remove() }\n }, [])\n\n useEffect(() => {\n const update = () => {\n const collapsed = document.querySelector('[data-sidebar-collapsed=\"true\"]') !== null\n if (collapsed) {\n setAnchor((current) => (current === null ? current : null))\n return\n }\n const buttons = Array.from(document.querySelectorAll('button'))\n const toggle = buttons.find((button) => /收起侧边栏|Collapse sidebar/i.test((button.getAttribute('aria-label') ?? '').trim()))\n if (!toggle) {\n setAnchor((current) => (current === null ? current : null))\n return\n }\n const label = (toggle.getAttribute('aria-label') ?? '').trim()\n if (/展开侧边栏|Expand sidebar/i.test(label)) {\n setAnchor((current) => (current === null ? current : null))\n return\n }\n const rect = toggle.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) return\n const next = { left: Math.max(8, rect.left - 36), top: rect.top + (rect.height - 28) / 2 }\n setAnchor((current) => (\n current !== null && Math.abs(current.left - next.left) < 0.5 && Math.abs(current.top - next.top) < 0.5\n ? current\n : next\n ))\n }\n update()\n const timer = window.setInterval(update, 400)\n window.addEventListener('resize', update)\n return () => {\n window.clearInterval(timer)\n window.removeEventListener('resize', update)\n }\n }, [])\n\n const readConnector = async (): Promise<void> => {\n setConnectorLoading(true)\n setConnectorError(null)\n try {\n setConnector(await fetchConnectorState())\n } catch (cause) {\n setConnectorError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setConnectorLoading(false)\n }\n }\n\n useEffect(() => {\n let alive = true\n setConnectorLoading(true)\n setConnectorError(null)\n void fetchConnectorState()\n .then((next) => { if (alive) setConnector(next) })\n .catch((cause) => { if (alive) setConnectorError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { if (alive) setConnectorLoading(false) })\n return () => { alive = false }\n }, [])\n\n const load = async (silent = false) => {\n if (!connectorEnabled) {\n setTasks([])\n setLoading(false)\n setError(null)\n return\n }\n if (!silent) setLoading(true)\n setError(null)\n try {\n const overview = await fetchJson<{ items: TaskItem[] }>('/overview')\n setTasks([...overview.items].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)))\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n if (!silent) setLoading(false)\n }\n }\n\n const setConnectorEnabled = async (enabled: boolean): Promise<void> => {\n setConnectorBusy(true)\n setConnectorError(null)\n try {\n setConnector(await saveConnectorState({ enabled }))\n if (!enabled) {\n setTasks([])\n setCapabilityFilter('all')\n }\n } catch (cause) {\n setConnectorError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setConnectorBusy(false)\n }\n }\n\n const toggleCapability = async (capabilityId: string, enabled: boolean): Promise<void> => {\n if (connector === null) return\n setConnectorBusy(true)\n setConnectorError(null)\n try {\n setConnector(await saveConnectorState({\n enabled: connector.enabled,\n capabilities: { [capabilityId]: enabled },\n }))\n } catch (cause) {\n setConnectorError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setConnectorBusy(false)\n }\n }\n\n const openSkillCenterFromPanel = (): void => {\n if (openSkillCenter()) {\n setSkillCenterError(null)\n setOpen(false)\n return\n }\n setSkillCenterError('技能中心未安装,无法打开连接器页面')\n }\n\n useEffect(() => {\n if (!open) return\n if (!connectorEnabled) {\n setTab('connectors')\n setTasks([])\n setError(null)\n setLoading(false)\n return\n }\n void load()\n const timer = window.setInterval(() => { void load(true) }, 60_000)\n return () => { window.clearInterval(timer) }\n }, [open, connectorEnabled])\n\n useEffect(() => {\n if (!connectorEnabled) {\n setPendingCount(0)\n return\n }\n let alive = true\n const refresh = async () => {\n try {\n const result = await fetchJson<{ count?: number }>('/count')\n if (alive) setPendingCount(Math.max(0, Math.trunc(Number(result.count) || 0)))\n } catch {\n // The panel's overview error is the visible connection state; the badge keeps its last value.\n }\n }\n void refresh()\n const timer = window.setInterval(() => { void refresh() }, 300_000)\n return () => { alive = false; window.clearInterval(timer) }\n }, [connectorEnabled])\n\n\n const filtered = useMemo(() => {\n if (tab === 'connectors') {\n return connectorEnabled ? filterConnectorTasks(tasks, capabilityFilter) : []\n }\n if (tab === 'group') return tasks.filter((task) => task.sourceType === 'task_bus' && task.source.type.includes('group'))\n if (tab === 'mine') return tasks.filter((task) => task.status !== 'completed' && task.status !== 'cancelled')\n if (tab === 'personal') return tasks.filter((task) => task.sourceType === 'task_bus' && !task.source.type.includes('group'))\n return tasks\n }, [tasks, tab, connectorEnabled, capabilityFilter])\n\n const actionable = tasks.filter((task) => task.status !== 'completed' && task.status !== 'cancelled').length\n const tabItems: [SegmentedTab<TaskTab>, ...SegmentedTab<TaskTab>[]] = [\n { value: 'all', id: 'task-bus-tab-all', panelId: 'task-bus-panel-all', label: <span>全部 <span style={{ opacity: 0.55 }}>{tasks.length}</span></span> },\n { value: 'mine', id: 'task-bus-tab-mine', panelId: 'task-bus-panel-mine', label: <span>待我处理 <span style={{ opacity: 0.55 }}>{actionable}</span></span> },\n { value: 'personal', id: 'task-bus-tab-personal', panelId: 'task-bus-panel-personal', label: <span>个人 <span style={{ opacity: 0.55 }}>{tasks.filter((task) => task.sourceType === 'task_bus' && !task.source.type.includes('group')).length}</span></span> },\n { value: 'group', id: 'task-bus-tab-group', panelId: 'task-bus-panel-group', label: <span>群聊 <span style={{ opacity: 0.55 }}>{tasks.filter((task) => task.sourceType === 'task_bus' && task.source.type.includes('group')).length}</span></span> },\n { value: 'connectors', id: 'task-bus-tab-connectors', panelId: 'task-bus-panel-connectors', label: <span>连接器 <span style={{ opacity: 0.55 }}>{connector === null ? 0 : 1}</span></span> },\n ]\n\n const transition = async (task: TaskItem, action: string) => {\n setBusyId(task.id)\n setError(null)\n try {\n await fetch(ROUTE + '/generic/' + encodeURIComponent(task.id.slice(5)) + '/transition', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ action }),\n }).then(async (response) => {\n if (!response.ok) {\n const payload = await response.json().catch(() => null) as { error?: string } | null\n throw new Error(payload?.error ?? '任务操作失败')\n }\n })\n await load()\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setBusyId(null)\n }\n }\n\n const createTask = async () => {\n const title = draftTitle.trim()\n if (!title) return\n setCreateBusy(true)\n setError(null)\n try {\n const response = await fetch(ROUTE + '/generic', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ title, sourceType: draftSource }),\n })\n const payload = await response.json() as { error?: string }\n if (!response.ok) throw new Error(payload.error ?? '创建任务失败')\n setDraftTitle('')\n setCreating(false)\n await load()\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setCreateBusy(false)\n }\n }\n\n const aiAccept = async (task: TaskItem) => {\n setAiBusyId(task.id)\n setError(null)\n try {\n const response = await fetch(ROUTE + '/ai-accept', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: task.id }),\n })\n const payload = await response.json() as { sessionId?: string; error?: string }\n if (!response.ok || typeof payload.sessionId !== 'string') {\n throw new Error(payload.error ?? 'AI 受理会话创建失败')\n }\n openSession(payload.sessionId)\n setOpen(false)\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setAiBusyId(null)\n }\n }\n\n return (\n <>\n {anchor !== null ? (\n <button\n type=\"button\"\n aria-label=\"任务中心\"\n title=\"任务中心\"\n onClick={() => setOpen((value) => !value)}\n style={{\n position: 'fixed',\n left: anchor.left,\n top: anchor.top,\n zIndex: 45,\n width: 28,\n height: 28,\n padding: 0,\n border: 'none',\n borderRadius: 8,\n background: 'transparent',\n color: actionable > 0 ? colors.accent : colors.muted,\n cursor: 'pointer',\n pointerEvents: 'auto',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M18 8a6 6 0 0 0-12 0c0 7-3 7-3 9h18c0-2-3-2-3-9\" />\n <path d=\"M13.7 21a2 2 0 0 1-3.4 0\" />\n </svg>\n {pendingCount > 0 ? (\n <span style={{ position: 'absolute', bottom: -2, right: -2, minWidth: 14, height: 14, padding: '0 3px', boxSizing: 'border-box', borderRadius: 999, background: '#2563eb', color: '#fff', fontSize: 9, lineHeight: '14px', textAlign: 'center' }}>\n {pendingCount > 99 ? '99+' : pendingCount}\n </span>\n ) : null}\n </button>\n ) : null}\n\n <Modal open={open} onClose={() => setOpen(false)} title=\"任务中心\" headless className={TASK_BUS_MODAL_CLASS}>\n <div style={{ display: 'flex', flexDirection: 'column', width: '100%', height: '100%', minHeight: 0 }}>\n <header style={{ display: 'flex', alignItems: 'center', gap: 8, padding: '22px 24px 12px' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <h2 style={{ margin: 0, fontSize: 16, lineHeight: '24px', fontWeight: 500, color: colors.text }}>任务中心</h2>\n </div>\n <Button size=\"sm\" variant=\"outline\" disabled={!connectorEnabled} onClick={() => setCreating((value) => !value)}>新建</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => void load()}>刷新</Button>\n <Button size=\"sm\" variant=\"ghost\" aria-label=\"关闭\" title=\"关闭\" onClick={() => setOpen(false)} icon={<IconCloseOutlineRegular size={14} />} style={{ width: 28, padding: 0 }} />\n </header>\n <div style={{ padding: '0 24px 14px', borderBottom: '1px solid ' + colors.line }}>\n <SegmentedTabs items={tabItems} value={tab} onChange={setTab} label=\"任务中心分类\" />\n </div>\n {creating ? (\n <div style={{ margin: '0 24px 12px', padding: 12, border: '1px solid ' + colors.line, borderRadius: 9, display: 'grid', gap: 7 }}>\n <input\n value={draftTitle}\n onChange={(event) => setDraftTitle(event.target.value)}\n placeholder=\"任务标题,例如:整理演示材料\"\n autoFocus\n style={{ ...buttonStyle, cursor: 'text', padding: '7px 9px' }}\n />\n <div style={{ display: 'flex', gap: 6 }}>\n <select value={draftSource} onChange={(event) => setDraftSource(event.target.value)} style={{ ...buttonStyle, padding: '6px 8px' }}>\n <option value=\"manual\">手工任务</option>\n <option value=\"session\">会话任务</option>\n <option value=\"group\">群聊任务</option>\n </select>\n <Button size=\"sm\" variant=\"primary\" disabled={createBusy || draftTitle.trim() === ''} onClick={() => void createTask()}>\n {createBusy ? '创建中…' : '创建'}\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setCreating(false)}>取消</Button>\n </div>\n </div>\n ) : null}\n {error ? <div style={{ padding: '8px 10px', borderRadius: 8, background: '#fef2f2', color: colors.danger, fontSize: 11, margin: '0 24px 12px' }}>{error}</div> : null}\n <div id={'task-bus-panel-' + tab} role=\"tabpanel\" aria-labelledby={'task-bus-tab-' + tab} style={{ padding: '16px 24px 24px', display: 'flex', flexDirection: 'column', gap: 10, overflowY: 'auto', flex: 1 }}>\n {selected !== null ? (\n <TaskDetail task={selected} onBack={() => setSelected(null)} />\n ) : (\n <>\n {tab === 'connectors' ? (\n <>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))', gap: 10 }}>\n <ConnectorCard\n state={connector}\n loading={connectorLoading}\n error={connectorError}\n busy={connectorBusy}\n taskCount={filtered.length}\n onSetEnabled={(enabled) => { void setConnectorEnabled(enabled) }}\n onToggleCapability={(capabilityId, enabled) => { void toggleCapability(capabilityId, enabled) }}\n onReload={() => { void readConnector() }}\n />\n </div>\n {connectorEnabled ? (\n <div role=\"group\" aria-label=\"连接器能力筛选\" style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>\n <button type=\"button\" aria-pressed={capabilityFilter === 'all'} onClick={() => setCapabilityFilter('all')} style={filterChipStyle(capabilityFilter === 'all')}>全部</button>\n {visibleCapabilities(connector).map((capability) => (\n <button\n key={capability.id}\n type=\"button\"\n data-capability-filter={capability.id}\n aria-pressed={capabilityFilter === capability.id}\n onClick={() => setCapabilityFilter(capability.id)}\n style={filterChipStyle(capabilityFilter === capability.id)}\n >\n {capability.label}\n </button>\n ))}\n </div>\n ) : connectorLoading ? null : (\n <>\n <ConnectorDisabledState onOpenSkillCenter={openSkillCenterFromPanel} />\n {skillCenterError === null ? null : (\n <div role=\"alert\" style={{ textAlign: 'center', color: colors.danger, fontSize: 11 }}>{skillCenterError}</div>\n )}\n </>\n )}\n </>\n ) : null}\n {loading ? <div style={{ padding: 18, textAlign: 'center', color: colors.muted, fontSize: 12 }}>正在加载…</div> : null}\n {!loading && tab !== 'connectors' && filtered.length === 0 ? <div style={{ padding: 18, textAlign: 'center', color: colors.muted, fontSize: 12 }}>暂无任务</div> : null}\n {!loading && tab === 'connectors' && connectorEnabled && filtered.length === 0 ? <div style={{ padding: 18, textAlign: 'center', color: colors.muted, fontSize: 12 }}>{capabilityFilter === 'all' ? '暂无来自该连接器的任务' : '该能力下暂无任务'}</div> : null}\n {!loading && tab === 'connectors' && filtered.length > 0 ? <div style={{ fontSize: 10, color: colors.muted }}>来自该连接器的任务</div> : null}\n {!loading && filtered.map((task) => (\n <TaskCard key={task.id} task={task} busy={busyId === task.id} aiBusy={aiBusyId === task.id} onTransition={(item, action) => void transition(item, action)} onAiAccept={(item) => void aiAccept(item)} onOpen={setSelected} />\n ))}\n </>\n )}\n </div>\n </div>\n </Modal>\n </>\n )\n}\n\n\n\ninterface HistoryEntry {\n key: string\n role: 'user' | 'assistant'\n author: string\n time: number | undefined\n text: string\n jumpId?: string\n}\n\nconst HISTORY_CONTENT_TYPES = new Set(['user/message', 'assistant/message'])\n\nconst historyText = (content: unknown): string => {\n if (!Array.isArray(content)) return ''\n return content.map((block) => {\n if (block === null || typeof block !== 'object') return ''\n const record = block as Record<string, unknown>\n return record.type === 'text' && typeof record.text === 'string' ? record.text : ''\n }).filter(Boolean).join('\\n').trim()\n}\n\nconst historyRole = (event: Record<string, unknown>): 'user' | 'assistant' => {\n const data = event.data as Record<string, unknown> | undefined\n return data?.role === 'user' || event.type === 'user/message' ? 'user' : 'assistant'\n}\n\nconst historyAuthor = (event: Record<string, unknown>, role: 'user' | 'assistant', t: HistoryTranslate): string => {\n const data = event.data as Record<string, unknown> | undefined\n const source = data?.source as Record<string, unknown> | undefined\n const memberName = typeof source?.memberName === 'string' ? source.memberName.trim() : ''\n if (memberName !== '') return memberName\n return role === 'user' ? t('me') : t('assistant')\n}\n\nconst groupHistory = async (roomId: string, t: HistoryTranslate): Promise<HistoryEntry[]> => {\n const entries: HistoryEntry[] = []\n let cursor: string | null = null\n for (let page = 0; page < 20; page += 1) {\n const suffix = cursor === null ? '' : '?cursor=' + encodeURIComponent(cursor)\n const response = await fetch('/dsh-group-chat/api/rooms/' + encodeURIComponent(roomId) + '/events' + suffix)\n if (!response.ok) throw new Error(t('error'))\n const payload = await response.json() as { events?: Array<{ id?: string; event?: Record<string, unknown>; createdAt?: string }>; nextCursor?: string | null; hasMore?: boolean }\n for (const record of payload.events ?? []) {\n const event = record.event\n if (event === undefined || typeof event.type !== 'string' || !HISTORY_CONTENT_TYPES.has(event.type)) continue\n const data = event.data as Record<string, unknown> | undefined\n const role = historyRole(event)\n const text = historyText(data?.content)\n if (text === '') continue\n entries.push({ key: record.id ?? String(event.seq ?? entries.length), role, author: historyAuthor(event, role, t), time: typeof event.time === 'number' ? event.time : undefined, text, jumpId: record.id })\n }\n if (payload.hasMore !== true || payload.nextCursor === null || payload.nextCursor === undefined) break\n cursor = payload.nextCursor\n }\n return entries.sort((left, right) => (right.time ?? 0) - (left.time ?? 0))\n}\n\nconst sessionHistory = async (sessionId: string, sessions: unknown, t: HistoryTranslate): Promise<HistoryEntry[]> => {\n const service = sessions as {\n retain?: (id: string, options: { source: string }) => {\n ready?: Promise<unknown>\n binding?: {\n eventSource?: { getSnapshot(): { entries?: Array<{ type?: string; event?: Record<string, unknown> }> } }\n session?: { loadOlder?: () => Promise<void> }\n }\n release?: () => void\n }\n }\n if (service.retain === undefined) return []\n const reference = service.retain(sessionId, { source: 'gateway' })\n try {\n await reference.ready\n const binding = reference.binding\n if (binding === undefined) return []\n await binding.session?.loadOlder?.().catch(() => undefined)\n const entries = binding.eventSource?.getSnapshot().entries ?? []\n return entries\n .filter((entry): entry is { type: 'event'; event: Record<string, unknown> } => entry.type === 'event' && entry.event !== undefined)\n .filter((entry) => typeof entry.event.type === 'string' && HISTORY_CONTENT_TYPES.has(entry.event.type))\n .map((entry) => {\n const event = entry.event\n const data = event.data as Record<string, unknown> | undefined\n const role = historyRole(event)\n return {\n key: String(event.seq ?? entries.indexOf(entry)),\n role,\n author: historyAuthor(event, role, t),\n time: typeof event.time === 'number' ? event.time : undefined,\n text: historyText(data?.content),\n }\n })\n .filter((entry) => entry.text !== '')\n .sort((left, right) => (right.time ?? 0) - (left.time ?? 0))\n } finally {\n reference.release?.()\n }\n}\n\nconst HistoryGlyph = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" strokeWidth=\"1.5\">\n <path d=\"M2.4 6.8A5.6 5.6 0 1 1 2.4 9.2\" stroke=\"currentColor\" strokeLinecap=\"round\" />\n <path d=\"M2.2 3.4v3.4h3.4\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M8 5.4V8l1.9 1.2\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\n\ninterface FileAttachmentRef {\n attachmentId: string\n name: string\n bytes: number\n}\n\nconst fileAttachmentIn = (content: unknown, name: string): FileAttachmentRef | undefined => {\n if (!Array.isArray(content)) return undefined\n for (const block of content) {\n if (block === null || typeof block !== 'object') continue\n const record = block as Record<string, unknown>\n if (record.type !== 'file') continue\n const attachment = record.attachment as Record<string, unknown> | undefined\n if (attachment?.name === name && typeof attachment.attachmentId === 'string' && typeof attachment.bytes === 'number') {\n return { attachmentId: attachment.attachmentId, name, bytes: attachment.bytes }\n }\n }\n return undefined\n}\n\nconst sessionFileAttachment = async (sessionId: string, sessions: unknown, name: string): Promise<FileAttachmentRef | undefined> => {\n const service = sessions as {\n retain?: (id: string, options: { source: string }) => {\n ready?: Promise<unknown>\n binding?: {\n eventSource?: { getSnapshot(): { entries?: Array<{ type?: string; event?: Record<string, unknown> }> } }\n session?: { loadOlder?: () => Promise<void> }\n }\n release?: () => void\n }\n }\n if (service.retain === undefined) return undefined\n const reference = service.retain(sessionId, { source: 'gateway' })\n try {\n await reference.ready\n const binding = reference.binding\n if (binding === undefined) return undefined\n const find = (): FileAttachmentRef | undefined => {\n const entries = binding.eventSource?.getSnapshot().entries ?? []\n for (const entry of entries) {\n if (entry.type !== 'event' || entry.event === undefined) continue\n if (entry.event.type !== 'user/message') continue\n const data = entry.event.data as Record<string, unknown> | undefined\n const found = fileAttachmentIn(data?.content, name)\n if (found !== undefined) return found\n }\n return undefined\n }\n let found = find()\n for (let page = 0; page < 5 && found === undefined; page += 1) {\n await binding.session?.loadOlder?.().catch(() => undefined)\n found = find()\n }\n return found\n } finally {\n reference.release?.()\n }\n}\n\nconst HistoryButton = ({ sessionId, sessions, t }: { sessionId: string; sessions: unknown; t: HistoryTranslate }) => {\n const [open, setOpen] = useState(false)\n const [entries, setEntries] = useState<HistoryEntry[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n const [query, setQuery] = useState('')\n const isGroup = sessionId.startsWith('group-room-')\n\n useEffect(() => {\n if (!open) return\n let alive = true\n setLoading(true)\n setError('')\n setQuery('')\n setEntries([])\n const load = isGroup ? groupHistory(sessionId.slice('group-room-'.length), t) : sessionHistory(sessionId, sessions, t)\n void load.then((items) => { if (alive) setEntries(items) })\n .catch((cause) => { if (alive) setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { if (alive) setLoading(false) })\n return () => { alive = false }\n }, [open, isGroup, sessionId, sessions, t])\n\n const needle = query.trim().toLocaleLowerCase()\n const results = useMemo(() => {\n if (needle === '') return []\n return entries.filter((entry) =>\n entry.text.toLocaleLowerCase().includes(needle) || entry.author.toLocaleLowerCase().includes(needle))\n }, [entries, needle])\n\n const jump = (entry: HistoryEntry) => {\n setOpen(false)\n window.setTimeout(() => {\n let target: HTMLElement | null = entry.jumpId === undefined\n ? null\n : document.querySelector<HTMLElement>('[data-group-chat-message=\"' + CSS.escape(entry.jumpId) + '\"]')\n if (target === null) {\n const text = entry.text.slice(0, 80)\n target = [...document.querySelectorAll<HTMLElement>('[data-group-chat-message], [data-slot=\"conversation.user.text.node\"]')]\n .find((element) => (element.innerText ?? '').includes(text)) ?? null\n }\n if (target === null && (window as unknown as { find: (...args: unknown[]) => boolean }).find(entry.text.slice(0, 80), false, false, true, false, false, false)) {\n const selection = window.getSelection()\n const node = selection?.anchorNode\n target = node instanceof HTMLElement ? node : node?.parentElement ?? null\n }\n target?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n if (target !== null) {\n target.style.outline = '2px solid #2563eb'\n target.style.outlineOffset = '4px'\n window.setTimeout(() => { target!.style.outline = ''; target!.style.outlineOffset = '' }, 1800)\n }\n }, 80)\n }\n\n const searchInputStyle: CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n height: 36,\n padding: '0 34px 0 12px',\n borderRadius: 8,\n border: '1px solid ' + colors.line,\n background: colors.panel,\n color: colors.text,\n fontSize: 13,\n outline: 'none',\n }\n\n return (\n <>\n <button\n type=\"button\"\n aria-label={t('open')}\n title={t('open')}\n data-session-id={sessionId}\n onClick={() => setOpen(true)}\n style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 28, height: 28, border: 'none', borderRadius: 6, background: 'transparent', color: 'inherit', cursor: 'pointer' }}\n >\n <HistoryGlyph />\n </button>\n <Modal open={open} onClose={() => setOpen(false)} title={t('title')} closeLabel={t('close')} className={TASK_BUS_HISTORY_CLASS}>\n <div style={{ width: '100%', maxHeight: 'min(68vh, 620px)', overflowY: 'auto', display: 'grid', gap: 10, padding: '4px 0 8px' }}>\n <div style={{ position: 'relative', width: '100%' }}>\n <input\n type=\"text\"\n value={query}\n autoFocus\n spellCheck={false}\n placeholder={t('searchPlaceholder')}\n aria-label={t('searchLabel')}\n onChange={(event) => { setQuery(event.target.value) }}\n style={searchInputStyle}\n />\n {query !== '' ? (\n <button\n type=\"button\"\n aria-label={t('clear')}\n title={t('clear')}\n onClick={() => { setQuery('') }}\n style={{ position: 'absolute', right: 6, top: '50%', transform: 'translateY(-50%)', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 24, height: 24, border: 'none', borderRadius: 5, background: 'transparent', color: colors.muted, cursor: 'pointer' }}\n >\n <IconCloseOutlineRegular size={14} />\n </button>\n ) : null}\n </div>\n\n {loading ? <div style={{ padding: 28, textAlign: 'center', color: colors.muted, fontSize: 12 }}>{t('loading')}</div> : null}\n {!loading && error !== '' ? <div role=\"alert\" style={{ padding: 12, color: colors.danger, fontSize: 12 }}>{error}</div> : null}\n {!loading && error === '' && needle === '' ? (\n <div style={{ display: 'grid', justifyItems: 'center', gap: 8, padding: '36px 20px 40px', color: colors.muted, textAlign: 'center' }}>\n <span style={{ display: 'inline-flex', width: 36, height: 36, alignItems: 'center', justifyContent: 'center', borderRadius: 18, background: colors.panelAlt, color: colors.muted }}>\n <HistoryGlyph />\n </span>\n <span style={{ fontSize: 13, fontWeight: 600, color: colors.text }}>{t('initial')}</span>\n <span style={{ fontSize: 12, lineHeight: 1.6 }}>{t('initialHint')}</span>\n </div>\n ) : null}\n {!loading && error === '' && needle !== '' && results.length === 0 ? (\n <div style={{ padding: 28, textAlign: 'center', color: colors.muted, fontSize: 12 }}>\n {entries.length === 0 ? t('empty') : t('noResults')}\n </div>\n ) : null}\n {!loading && error === '' && needle !== '' && results.map((entry) => (\n <button\n key={entry.key}\n type=\"button\"\n onClick={() => jump(entry)}\n style={{ display: 'grid', gap: 6, width: '100%', minWidth: 0, textAlign: 'left', padding: '10px 12px', borderRadius: 8, border: '1px solid ' + colors.line, background: colors.panelAlt, color: colors.text, cursor: 'pointer' }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0, flexWrap: 'wrap', fontSize: 10, color: colors.muted }}>\n <span style={{ fontWeight: 650, color: entry.role === 'user' ? '#2563eb' : colors.text }}>{entry.author}</span>\n {entry.time === undefined ? null : <span>{new Date(entry.time).toLocaleString(t('dateLocale'))}</span>}\n <span style={{ marginLeft: 'auto' }}>{t('jump')}</span>\n </span>\n <span style={{ display: 'block', minWidth: 0, fontSize: 13, lineHeight: 1.65, whiteSpace: 'pre-wrap', overflowWrap: 'anywhere', wordBreak: 'break-word' }}>{entry.text}</span>\n </button>\n ))}\n </div>\n </Modal>\n </>\n )\n}\n\nexport const apply = (ctx: Context) => {\n const locale = (ctx as unknown as {\n locale: {\n register(namespace: string, dictionaries: { zh: typeof HISTORY_COPY.zh; en: typeof HISTORY_COPY.en }): () => void\n bind(namespace: string): (key: HistoryCopyKey) => string\n }\n }).locale\n ctx.effect(() => locale.register(HISTORY_NS, { zh: HISTORY_COPY.zh, en: HISTORY_COPY.en }), 'task-bus: history copy')\n const t = locale.bind(HISTORY_NS)\n const surface = ctx as unknown as {\n slots: {\n inject(name: string, factory: () => () => void): () => void\n register(options: Record<string, unknown>, component: (props: never) => JSX.Element | null): () => void\n }\n uiWorkspace: { openSession(sessionId: string): void }\n layout: { selectPanel(panelId: string): void }\n }\n const surfaceWithServices = surface as unknown as {\n sidebarRight?: { openResource?(address: string): void }\n get?: (name: string) => unknown\n }\n const sidebarRight = (surfaceWithServices.sidebarRight ?? surfaceWithServices.get?.('sidebarRight')) as\n { openResource?(address: string): void } | undefined\n // Native file cards are spans owned by the official Chat renderer, so delegate from the\n // document. The active Session header carries its id; group rooms have their own handler.\n ctx.effect(() => {\n const onFileClick = (event: MouseEvent): void => {\n const target = event.target\n if (!(target instanceof Element)) return\n const card = target.closest('[data-message-attachments] > *')\n if (!(card instanceof HTMLElement)) return\n const header = document.querySelector<HTMLElement>('button[aria-label=\"消息记录\"][data-session-id]')\n const sessionId = header?.getAttribute('data-session-id') ?? ''\n if (sessionId === '' || sessionId.startsWith('group-room-')) return\n const name = (card.getAttribute('title') ?? card.innerText.split('\\n')[0] ?? '').trim()\n if (name === '') return\n void (async () => {\n const attachment = await sessionFileAttachment(sessionId, (ctx as unknown as { sessions: unknown }).sessions, name)\n if (attachment === undefined) return\n const sessionState = (ctx as unknown as {\n sessions?: { list?: { getSnapshot(): { byId?: Record<string, { cwd?: string }> } } }\n }).sessions?.list?.getSnapshot()\n const cwd = sessionState?.byId?.[sessionId]?.cwd ?? ''\n const query = 'attachmentId=' + encodeURIComponent(attachment.attachmentId)\n + '&name=' + encodeURIComponent(attachment.name)\n + '&bytes=' + encodeURIComponent(String(attachment.bytes))\n + (cwd === '' ? '' : '&cwd=' + encodeURIComponent(cwd))\n const response = await fetch(ROUTE + '/attachment-materialize?' + query)\n if (!response.ok) throw new Error('附件预览准备失败')\n const materialized = await response.json() as { path?: string }\n if (typeof materialized.path !== 'string') throw new Error('附件预览路径缺失')\n const address = 'dsh-resource://file/session/' + encodeURIComponent(sessionId)\n + '/' + materialized.path.split('/').map((part) => encodeURIComponent(part)).join('/')\n const right = (ctx as unknown as { sidebarRight?: { openResource?(address: string): void } }).sidebarRight\n if (right?.openResource !== undefined) right.openResource(address)\n else window.open(new URL('/dsh-task-bus/api/attachment-materialize?' + query, window.location.origin).toString(), '_blank', 'noopener,noreferrer')\n })().catch((cause) => { console.error('[task-bus] file preview failed', cause) })\n }\n document.addEventListener('click', onFileClick, true)\n return () => { document.removeEventListener('click', onFileClick, true) }\n }, 'task-bus: native file card preview')\n // The connector state lives in the skill center; the task panel consumes it and links\n // there when the connector is off. selectPanel throws when that panel is not installed,\n // which is the one case the caller must report instead of silently doing nothing.\n const openSkillCenter = (): boolean => {\n try {\n surface.layout.selectPanel('skill-center')\n return true\n } catch {\n return false\n }\n }\n const Surface = () => (\n <TaskCenterButton\n openSession={(sessionId) => surface.uiWorkspace.openSession(sessionId)}\n openSkillCenter={openSkillCenter}\n />\n )\n ctx.effect(() => surface.slots.inject('shell.overlay', () => surface.slots.register(\n { name: 'shell.overlay', id: 'task-bus.center' },\n Surface,\n )), 'task-bus: Task Center overlay')\n\n // The native header's file-manager jump is the slot this product wants for session history.\n // Hide that one button rather than replacing the whole header seat; every other native\n // control keeps its position and behavior.\n ctx.effect(() => {\n const style = document.createElement('style')\n style.id = 'task-bus-history-replaces-file-manager'\n style.textContent = 'button[aria-label=\"用 文件管理器 打开\"] { display: none !important; }\\n[data-message-attachments] > * { cursor: pointer; }'\n document.head.appendChild(style)\n return () => { style.remove() }\n }, 'task-bus: replace file manager header button')\n\n ctx.effect(() => surface.slots.inject('conversation.session.header.utilities', () => surface.slots.register({\n name: 'conversation.session.header.utilities',\n id: 'task-bus.history',\n order: -4,\n inject: ((sessionId: string) => ({ sessionId, sessions: (ctx as unknown as { sessions: unknown }).sessions, t })) as never,\n } as never, HistoryButton as never)), 'task-bus: message history')\n}"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["Tag","Button","useState","useMemo","Modal","IconCloseOutlineRegular","SegmentedTabs"],"sources":["../src/client/theme.ts","../src/client/index.tsx"],"sourcesContent":["/** Palette aliases the Task Center draws with; the shell owns the values. */\n\nexport const colors = {\n panel: 'var(--dsw-alias-bg-layer-1, #ffffff)',\n panelAlt: 'var(--dsw-alias-bg-layer-2, #f7f8fa)',\n text: 'var(--dsw-alias-label-primary, #111827)',\n muted: 'var(--dsw-alias-label-secondary, #6b7280)',\n line: 'var(--dsw-alias-border-l1, #e5e7eb)',\n accent: 'var(--dsw-alias-brand-primary, #2563eb)',\n accentSoft: 'var(--dsw-alias-brand-primary-alpha, #eff6ff)',\n warning: 'var(--dsw-alias-state-warning, #b45309)',\n success: 'var(--dsw-alias-state-success, #047857)',\n danger: 'var(--dsw-alias-state-danger, #b91c1c)',\n}","/**\n * The Task Center surface in the frame-wide overlay.\n *\n * The button is global because a task can arrive while the reader is in any\n * session. The panel only renders cards returned by the Host bridge; it never\n * talks to DataOps directly and never derives a second approval status.\n */\nimport { useEffect, useMemo, useState, type CSSProperties } from 'react'\nimport {\n Button,\n IconCloseOutlineRegular,\n Modal,\n SegmentedTabs,\n Tag,\n type SegmentedTab,\n type TagTone,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport { colors } from './theme.ts'\n\nexport const inject = ['slots', 'locale', 'uiWorkspace', 'sessions', 'sidebarRight']\n\ninterface TaskItem {\n id: string\n sourceType: 'dataops_approval' | 'task_bus'\n title: string\n code?: string\n description?: string | null\n status: string\n statusLabel: string\n priority?: string | null\n tags?: string[]\n source: {\n type: string\n id?: string | null\n label?: string | null\n workflowCode?: string | null\n deepLink?: string | null\n }\n assignee?: { type: string; id: string } | null\n creator?: { type: string; id: string } | null\n actions?: string[]\n dueAt?: string | null\n updatedAt: string\n /** Connector that produced the row, when the Host carries it. */\n connectorId?: string\n /** Capability that produced the row, when the Host carries it. */\n capabilityId?: string\n}\n\nconst ROUTE = '/dsh-task-bus/api'\n\nconst TASK_BUS_MODAL_CLASS = 'task-bus-center-modal'\nconst TASK_BUS_HISTORY_CLASS = 'task-bus-history-modal'\nconst TASK_BUS_STYLE_ID = 'task-bus-center-modal-style'\nconst TASK_BUS_MODAL_CSS = `\n.${TASK_BUS_MODAL_CLASS} {\n width: min(960px, calc(100vw - 64px)) !important;\n height: min(760px, calc(100vh - 64px)) !important;\n gap: 0 !important;\n padding: 0 !important;\n}\n@media (max-width: 700px) {\n .${TASK_BUS_MODAL_CLASS} {\n width: calc(100vw - 24px) !important;\n height: calc(100vh - 24px) !important;\n }\n}\n.${TASK_BUS_HISTORY_CLASS} {\n width: min(960px, 92vw) !important;\n max-width: calc(100vw - 32px) !important;\n height: auto !important;\n max-height: min(780px, calc(100vh - 48px)) !important;\n}\n@media (max-width: 700px) {\n .${TASK_BUS_HISTORY_CLASS} {\n width: calc(100vw - 24px) !important;\n max-width: calc(100vw - 24px) !important;\n max-height: calc(100vh - 24px) !important;\n }\n}\n`\n\nconst HISTORY_NS = 'task-bus.history'\nconst HISTORY_COPY = {\n zh: {\n title: '消息记录',\n open: '消息记录',\n close: '关闭',\n searchPlaceholder: '搜索消息或发送人…',\n searchLabel: '搜索消息记录',\n clear: '清空搜索',\n initial: '输入关键词搜索消息或发送人',\n initialHint: '可按消息正文或发送人筛选,点结果跳到原消息。',\n loading: '正在加载消息记录…',\n error: '消息记录加载失败',\n empty: '暂无消息记录',\n noResults: '没有匹配的消息',\n jump: '跳到该消息',\n me: '我',\n assistant: '助手',\n dateLocale: 'zh-CN',\n },\n en: {\n title: 'Message history',\n open: 'Message history',\n close: 'Close',\n searchPlaceholder: 'Search messages or senders…',\n searchLabel: 'Search message history',\n clear: 'Clear search',\n initial: 'Search messages or senders to begin',\n initialHint: 'Filter by message text or sender, then click a result to jump to it.',\n loading: 'Loading message history…',\n error: 'Could not load message history',\n empty: 'No message history',\n noResults: 'No matching messages',\n jump: 'Jump to message',\n me: 'Me',\n assistant: 'Assistant',\n dateLocale: 'en-US',\n },\n} as const\n\ntype HistoryCopyKey = keyof typeof HISTORY_COPY.zh\ntype HistoryTranslate = (key: HistoryCopyKey) => string\n\nconst buttonStyle: CSSProperties = {\n border: '1px solid ' + colors.line,\n background: colors.panel,\n color: colors.text,\n borderRadius: 8,\n padding: '7px 11px',\n fontSize: 12,\n cursor: 'pointer',\n}\n\nconst statusTagTone = (status: string): TagTone => {\n if (status === 'completed') return 'success'\n if (status === 'cancelled') return 'neutral'\n if (status === 'blocked') return 'danger'\n if (status === 'pending_confirm' || status === 'returned' || status === 'pending_accept') return 'warning'\n return 'info'\n}\n\nconst relativeTime = (value: string) => {\n const time = Date.parse(value)\n if (!Number.isFinite(time)) return ''\n const minutes = Math.max(0, Math.round((Date.now() - time) / 60_000))\n if (minutes < 1) return '刚刚'\n if (minutes < 60) return String(minutes) + ' 分钟前'\n const hours = Math.round(minutes / 60)\n if (hours < 24) return String(hours) + ' 小时前'\n return String(Math.round(hours / 24)) + ' 天前'\n}\n\nconst fetchJson = async <T,>(path: string): Promise<T> => {\n const attempt = async () => {\n const response = await fetch(ROUTE + path, { headers: { accept: 'application/json' } })\n const payload = await response.json() as unknown\n return { response, payload }\n }\n let { response, payload } = await attempt()\n // The managed session handshake runs in parallel with the panel mount; a 401\n // here is usually \"the cookie is not set yet\", not an authorization failure.\n if (response.status === 401) {\n await new Promise((resolve) => setTimeout(resolve, 900))\n ;({ response, payload } = await attempt())\n }\n if (!response.ok) {\n const message = payload !== null && typeof payload === 'object' && 'error' in payload\n ? String((payload as { error: unknown }).error)\n : '任务中心请求失败(' + response.status + ')'\n throw new Error(message)\n }\n return payload as T\n}\n\n\nconst approvalHref = (raw: string | null): string | null => {\n if (raw === null) return null\n try {\n const target = new URL(raw)\n const referrer = document.referrer ? new URL(document.referrer) : null\n if (referrer !== null && referrer.origin !== target.origin) {\n return referrer.origin + target.pathname + target.search + target.hash\n }\n return target.href\n } catch {\n return raw\n }\n}\n\nconst TaskCard = ({\n task,\n busy,\n aiBusy,\n onTransition,\n onAiAccept,\n onOpen,\n}: {\n task: TaskItem\n busy: boolean\n aiBusy: boolean\n onTransition: (task: TaskItem, action: string) => void\n onAiAccept: (task: TaskItem) => void\n onOpen: (task: TaskItem) => void\n}) => {\n const isApproval = task.sourceType === 'dataops_approval'\n const deepLink = approvalHref(task.source.deepLink ?? null)\n return (\n <article\n style={{\n border: '1px solid ' + colors.line,\n borderRadius: 10,\n background: colors.panel,\n padding: '12px 13px',\n display: 'grid',\n gap: 8,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 10 }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 7, flexWrap: 'wrap', marginBottom: 4 }}>\n <Tag tone={isApproval ? 'info' : 'neutral'}>\n {isApproval ? (task.source.label ?? 'DataOps 审批') : '任务总线'}\n </Tag>\n {task.tags?.map((tag) => (\n <Tag key={tag} tone=\"quiet\">{tag}</Tag>\n ))}\n </div>\n <div style={{ fontSize: 13, fontWeight: 650, color: colors.text, lineHeight: 1.45 }}>\n {task.title}\n </div>\n {task.description ? (\n <div style={{ fontSize: 11, color: colors.muted, marginTop: 4, lineHeight: 1.5 }}>\n {task.description}\n </div>\n ) : null}\n </div>\n <span style={{ flex: 'none' }}><Tag tone={statusTagTone(task.status)}>{task.statusLabel}</Tag></span>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap', fontSize: 10, color: colors.muted }}>\n <span>{isApproval ? '审批任务' : '任务'}</span>\n {task.assignee?.id ? <span>受理人:{task.assignee.id}</span> : null}\n <span style={{ marginLeft: 'auto' }}>{relativeTime(task.updatedAt)}</span>\n </div>\n <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>\n {isApproval && deepLink ? (\n <Button size=\"sm\" variant=\"primary\" onClick={() => window.open(deepLink, '_blank', 'noopener,noreferrer')}>\n 办理\n </Button>\n ) : null}\n {task.status !== 'completed' && task.status !== 'cancelled' ? (\n <Button size=\"sm\" variant=\"outline\" disabled={aiBusy || busy} onClick={() => onAiAccept(task)}>\n {aiBusy ? '受理中…' : 'AI受理'}\n </Button>\n ) : null}\n <Button size=\"sm\" variant=\"ghost\" onClick={() => onOpen(task)}>详情</Button>\n {!isApproval && task.status === 'pending_accept' ? (\n <Button size=\"sm\" variant=\"primary\" disabled={busy} onClick={() => onTransition(task, 'accept')}>受理</Button>\n ) : null}\n {!isApproval && task.status === 'in_progress' ? (\n <Button size=\"sm\" variant=\"outline\" disabled={busy} onClick={() => onTransition(task, 'submit')}>提交确认</Button>\n ) : null}\n {!isApproval && task.status === 'pending_confirm' ? (\n <Button size=\"sm\" variant=\"primary\" disabled={busy} onClick={() => onTransition(task, 'complete')}>完成</Button>\n ) : null}\n {!isApproval && task.status !== 'completed' && task.status !== 'cancelled' ? (\n <Button size=\"sm\" variant=\"ghost\" disabled={busy} onClick={() => onTransition(task, 'cancel')}>取消</Button>\n ) : null}\n </div>\n </article>\n )\n}\n\n\ninterface TaskAttachmentRecord {\n id: string\n originalName: string\n contentType: string\n sizeBytes: number\n kind: string\n}\n\ninterface FormFieldData {\n key: string\n label: string\n value: unknown\n type?: 'multiline' | 'resources'\n span?: 1 | 2\n}\n\ninterface FormSectionData {\n title: string\n fields: FormFieldData[]\n}\n\ninterface TaskDetailPayload {\n id?: number | string\n payload?: {\n form?: Record<string, unknown>\n selectedItems?: Array<Record<string, unknown>>\n resourceAccessRequest?: {\n form?: Record<string, unknown>\n selectedItems?: Array<Record<string, unknown>>\n }\n }\n form?: { sections?: FormSectionData[] }\n attachments?: TaskAttachmentRecord[]\n}\n\nconst FORM_LABELS: Record<string, string> = {\n applicationMode: '申请方式',\n requestKind: '申请类型',\n requestedPermissions: '申请权限',\n requesterDepartment: '申请人部门',\n requesterPhone: '申请人电话',\n validFrom: '授权开始时间',\n expiresAt: '授权结束时间',\n selectionSummary: '资源摘要',\n code: '应用编码',\n name: '应用名称',\n reason: '申请理由',\n description: '应用说明',\n departmentName: '归属部门',\n departmentCode: '归属部门编码',\n ownerName: '归属负责人',\n ownerPhone: '归属负责人电话',\n constructionUnit: '建设单位',\n constructionOwner: '建设单位负责人',\n constructionOwnerPhone: '建设单位负责人电话',\n operationsUnit: '运维单位',\n operationsOwner: '运维单位负责人',\n operationsOwnerPhone: '运维单位负责人电话',\n requestTime: '申请时间',\n resourceName: '资源名称',\n resourceType: '资源类型',\n accessType: '访问方式',\n accessScope: '访问范围',\n applicationName: '所属应用',\n applicationCode: '应用编码',\n environment: '环境',\n accountCount: '账号数量',\n}\n\nconst SKIP_FORM_KEYS = new Set([\n 'ownerUserId',\n 'requesterUserId',\n 'requesterDept',\n 'existingApplicationId',\n 'applicationId',\n 'taskType',\n])\n\nconst formatBytes = (bytes: number) => {\n if (!Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return bytes + ' B'\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB'\n}\n\nconst humanizeField = (key: string) => key\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .trim()\n\nconst formatFormValue = (key: string, value: unknown): string => {\n if (key === 'applicationMode') {\n if (value === 'EXISTING') return '使用已有应用'\n if (value === 'NEW') return '新建应用'\n }\n if (typeof value === 'boolean') return value ? '是' : '否'\n if (Array.isArray(value)) return value.map((item) => String(item)).join('、')\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>\n if (typeof record.name === 'string') return record.name\n return JSON.stringify(value)\n }\n return String(value)\n}\n\nconst toFormField = (key: string, value: unknown): FormFieldData => ({\n key,\n label: FORM_LABELS[key] ?? humanizeField(key),\n value,\n ...(key === 'reason' || key === 'description' || key === 'accessScope'\n ? { type: 'multiline' as const, span: 2 as const }\n : {}),\n})\n\nconst formFields = (form: Record<string, unknown> | undefined): FormFieldData[] => (\n form === undefined\n ? []\n : Object.entries(form)\n .filter(([key, value]) => !SKIP_FORM_KEYS.has(key) && value !== null && value !== undefined && value !== '')\n .map(([key, value]) => toFormField(key, value))\n)\n\nconst approvalFormSections = (detail: TaskDetailPayload | null): FormSectionData[] => {\n if (detail === null) return []\n const sections: FormSectionData[] = []\n const applicationFields = formFields(detail.payload?.form)\n if (applicationFields.length > 0) sections.push({ title: '申请信息', fields: applicationFields })\n const resourceFields = formFields(detail.payload?.resourceAccessRequest?.form)\n if (resourceFields.length > 0) sections.push({ title: '资源申请', fields: resourceFields })\n const resources = [\n ...(detail.payload?.selectedItems ?? []),\n ...(detail.payload?.resourceAccessRequest?.selectedItems ?? []),\n ]\n if (resources.length > 0) {\n sections.push({\n title: '申请资源',\n fields: [{ key: 'resources', label: '资源', value: resources, type: 'resources', span: 2 }],\n })\n }\n return sections\n}\n\nconst ResourceValue = ({ items }: { items: Array<Record<string, unknown>> }) => (\n <div style={{ display: 'grid', gap: 5 }}>\n {items.map((item, index) => {\n const label = typeof item.title === 'string' ? item.title : typeof item.name === 'string' ? item.name : `资源 ${index + 1}`\n const detail = [item.scope, item.urn, item.id].filter((value) => typeof value === 'string' || typeof value === 'number').join(' · ')\n return (\n <div key={String(item.urn ?? item.id ?? index)} style={{ display: 'flex', alignItems: 'baseline', gap: 8, minWidth: 0 }}>\n <span style={{ fontSize: 12, color: colors.text }}>{label}</span>\n {detail ? <span style={{ fontSize: 10, color: colors.muted, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{detail}</span> : null}\n </div>\n )\n })}\n </div>\n)\n\nconst FormDescriptions = ({ sections }: { sections: FormSectionData[] }) => {\n if (sections.length === 0) return null\n return (\n <div style={{ display: 'grid', gap: 10 }}>\n {sections.map((section, sectionIndex) => (\n <section key={section.title + sectionIndex} style={{ border: '1px solid ' + colors.line, borderRadius: 10, background: colors.panel, padding: 14 }}>\n <div style={{ fontSize: 12, fontWeight: 650, color: colors.text, marginBottom: 9 }}>{section.title}</div>\n <dl style={{ margin: 0, display: 'grid', gridTemplateColumns: 'repeat(2, minmax(0, 1fr))', gap: '9px 24px' }}>\n {section.fields.map((field) => (\n <div\n key={field.key}\n style={{\n display: 'grid',\n gridTemplateColumns: '94px minmax(0, 1fr)',\n alignItems: 'start',\n gap: 8,\n minWidth: 0,\n gridColumn: field.span === 2 ? '1 / -1' : undefined,\n }}\n >\n <dt style={{ fontSize: 10, lineHeight: 1.6, color: colors.muted }}>{field.label}</dt>\n <dd style={{ margin: 0, fontSize: 12, lineHeight: 1.6, color: colors.text, whiteSpace: 'pre-wrap', overflowWrap: 'anywhere' }}>\n {field.type === 'resources' && Array.isArray(field.value)\n ? <ResourceValue items={field.value as Array<Record<string, unknown>>} />\n : field.value === null || field.value === undefined || field.value === ''\n ? '—'\n : formatFormValue(field.key, field.value)}\n </dd>\n </div>\n ))}\n </dl>\n </section>\n ))}\n </div>\n )\n}\n\nconst TaskDetail = ({ task, onBack }: { task: TaskItem; onBack: () => void }) => {\n const isApproval = task.sourceType === 'dataops_approval'\n const [detail, setDetail] = useState<TaskDetailPayload | null>(null)\n const [detailLoading, setDetailLoading] = useState(true)\n const [detailError, setDetailError] = useState<string | null>(null)\n\n useEffect(() => {\n let alive = true\n setDetailLoading(true)\n setDetailError(null)\n void fetchJson<{ detail?: TaskDetailPayload }>('/items/' + encodeURIComponent(task.id))\n .then((payload) => { if (alive) setDetail(payload.detail ?? null) })\n .catch((cause) => { if (alive) setDetailError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { if (alive) setDetailLoading(false) })\n return () => { alive = false }\n }, [task.id])\n\n const sections = isApproval ? approvalFormSections(detail) : detail?.form?.sections ?? []\n const attachments = detail?.attachments ?? []\n const approvalTaskId = isApproval && typeof detail?.id === 'number' ? detail.id : null\n const attachmentHref = (attachment: TaskAttachmentRecord) => approvalTaskId === null\n ? null\n : ROUTE + '/attachment?taskId=' + encodeURIComponent(String(approvalTaskId))\n + '&attachmentId=' + encodeURIComponent(attachment.id)\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10, flex: 1, minHeight: '100%' }}>\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 10 }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 14, fontWeight: 700, color: colors.text, lineHeight: 1.45 }}>{task.title}</div>\n <div style={{ marginTop: 3, fontSize: 10, color: colors.muted }}>\n {task.source.label ?? (isApproval ? 'DataOps 审批' : '任务总线')} · {relativeTime(task.updatedAt)}\n </div>\n </div>\n <Tag tone={statusTagTone(task.status)}>{task.statusLabel}</Tag>\n </div>\n\n {detailLoading ? <div style={{ padding: 18, textAlign: 'center', color: colors.muted, fontSize: 12 }}>正在加载表单…</div> : null}\n {detailError ? <div style={{ padding: '8px 10px', borderRadius: 8, background: '#fef2f2', color: colors.danger, fontSize: 11 }}>{detailError}</div> : null}\n {!detailLoading && detailError === null && sections.length > 0 ? <FormDescriptions sections={sections} /> : null}\n {!detailLoading && detailError === null && sections.length === 0 && !isApproval && task.description ? (\n <div style={{ border: '1px solid ' + colors.line, borderRadius: 10, background: colors.panel, padding: 14, fontSize: 12, lineHeight: 1.6, color: colors.text, whiteSpace: 'pre-wrap' }}>{task.description}</div>\n ) : null}\n {!detailLoading && detailError === null && sections.length === 0 && (isApproval || !task.description) ? (\n <div style={{ padding: 18, textAlign: 'center', color: colors.muted, fontSize: 12 }}>暂无表单信息</div>\n ) : null}\n\n {isApproval || attachments.length > 0 ? (\n <section style={{ border: '1px solid ' + colors.line, borderRadius: 10, background: colors.panel, padding: 14 }}>\n <div style={{ fontSize: 12, fontWeight: 650, color: colors.text, marginBottom: 8 }}>附件</div>\n {attachments.length === 0 ? <div style={{ fontSize: 11, color: colors.muted }}>暂无附件</div> : (\n <div style={{ display: 'grid', gap: 6 }}>\n {attachments.map((attachment) => {\n const href = attachmentHref(attachment)\n return (\n <div key={attachment.id} style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0 }}>\n <span style={{ flex: 1, minWidth: 0, fontSize: 11, color: colors.text, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{attachment.originalName}</span>\n <span style={{ flex: 'none', fontSize: 10, color: colors.muted }}>{formatBytes(attachment.sizeBytes)}</span>\n {href !== null ? <Button size=\"sm\" variant=\"ghost\" onClick={() => window.open(href, '_blank', 'noopener,noreferrer')}>下载</Button> : null}\n </div>\n )\n })}\n </div>\n )}\n </section>\n ) : null}\n\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8, flexWrap: 'wrap', marginTop: 'auto', paddingTop: 2 }}>\n <Button size=\"sm\" variant=\"ghost\" onClick={onBack}>← 返回列表</Button>\n {isApproval && task.source.deepLink ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => window.open(approvalHref(task.source.deepLink ?? null) ?? '#', '_blank', 'noopener,noreferrer')}>\n 打开 DataOps 审批详情\n </Button>\n ) : null}\n </div>\n </div>\n )\n}\n\ntype TaskTab = 'all' | 'mine' | 'personal' | 'group'\n\nconst TaskCenterButton = ({ openSession }: {\n openSession: (sessionId: string) => void\n}) => {\n const [open, setOpen] = useState(false)\n const [tasks, setTasks] = useState<TaskItem[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [tab, setTab] = useState<TaskTab>('all')\n const [busyId, setBusyId] = useState<string | null>(null)\n const [aiBusyId, setAiBusyId] = useState<string | null>(null)\n const [selected, setSelected] = useState<TaskItem | null>(null)\n const [anchor, setAnchor] = useState<{ left: number; top: number } | null>(null)\n const [pendingCount, setPendingCount] = useState(0)\n\n useEffect(() => {\n if (document.getElementById(TASK_BUS_STYLE_ID) !== null) return\n const style = document.createElement('style')\n style.id = TASK_BUS_STYLE_ID\n style.textContent = TASK_BUS_MODAL_CSS\n document.head.append(style)\n return () => { style.remove() }\n }, [])\n\n useEffect(() => {\n const update = () => {\n const collapsed = document.querySelector('[data-sidebar-collapsed=\"true\"]') !== null\n if (collapsed) {\n setAnchor((current) => (current === null ? current : null))\n return\n }\n const buttons = Array.from(document.querySelectorAll('button'))\n const toggle = buttons.find((button) => /收起侧边栏|Collapse sidebar/i.test((button.getAttribute('aria-label') ?? '').trim()))\n if (!toggle) {\n setAnchor((current) => (current === null ? current : null))\n return\n }\n const label = (toggle.getAttribute('aria-label') ?? '').trim()\n if (/展开侧边栏|Expand sidebar/i.test(label)) {\n setAnchor((current) => (current === null ? current : null))\n return\n }\n const rect = toggle.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) return\n const next = { left: Math.max(8, rect.left - 36), top: rect.top + (rect.height - 28) / 2 }\n setAnchor((current) => (\n current !== null && Math.abs(current.left - next.left) < 0.5 && Math.abs(current.top - next.top) < 0.5\n ? current\n : next\n ))\n }\n update()\n const timer = window.setInterval(update, 400)\n window.addEventListener('resize', update)\n return () => {\n window.clearInterval(timer)\n window.removeEventListener('resize', update)\n }\n }, [])\n\n const load = async (silent = false) => {\n if (!silent) setLoading(true)\n setError(null)\n try {\n const overview = await fetchJson<{ items: TaskItem[] }>('/overview')\n setTasks([...overview.items].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)))\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n if (!silent) setLoading(false)\n }\n }\n\n useEffect(() => {\n if (!open) return\n void load()\n const timer = window.setInterval(() => { void load(true) }, 60_000)\n return () => { window.clearInterval(timer) }\n }, [open])\n\n useEffect(() => {\n let alive = true\n const refresh = async () => {\n try {\n const result = await fetchJson<{ count?: number }>('/count')\n if (alive) setPendingCount(Math.max(0, Math.trunc(Number(result.count) || 0)))\n } catch {\n // The panel's overview error is the visible connection state; the badge keeps its last value.\n }\n }\n void refresh()\n const timer = window.setInterval(() => { void refresh() }, 300_000)\n return () => { alive = false; window.clearInterval(timer) }\n }, [])\n\n const filtered = useMemo(() => {\n if (tab === 'group') return tasks.filter((task) => task.sourceType === 'task_bus' && task.source.type.includes('group'))\n if (tab === 'mine') return tasks.filter((task) => task.status !== 'completed' && task.status !== 'cancelled')\n if (tab === 'personal') return tasks.filter((task) => task.sourceType === 'task_bus' && !task.source.type.includes('group'))\n return tasks\n }, [tasks, tab])\n\n const actionable = tasks.filter((task) => task.status !== 'completed' && task.status !== 'cancelled').length\n const tabItems: [SegmentedTab<TaskTab>, ...SegmentedTab<TaskTab>[]] = [\n { value: 'all', id: 'task-bus-tab-all', panelId: 'task-bus-panel-all', label: <span>全部 <span style={{ opacity: 0.55 }}>{tasks.length}</span></span> },\n { value: 'mine', id: 'task-bus-tab-mine', panelId: 'task-bus-panel-mine', label: <span>待我处理 <span style={{ opacity: 0.55 }}>{actionable}</span></span> },\n { value: 'personal', id: 'task-bus-tab-personal', panelId: 'task-bus-panel-personal', label: <span>个人 <span style={{ opacity: 0.55 }}>{tasks.filter((task) => task.sourceType === 'task_bus' && !task.source.type.includes('group')).length}</span></span> },\n { value: 'group', id: 'task-bus-tab-group', panelId: 'task-bus-panel-group', label: <span>群聊 <span style={{ opacity: 0.55 }}>{tasks.filter((task) => task.sourceType === 'task_bus' && task.source.type.includes('group')).length}</span></span> },\n ]\n\n const transition = async (task: TaskItem, action: string) => {\n setBusyId(task.id)\n setError(null)\n try {\n await fetch(ROUTE + '/generic/' + encodeURIComponent(task.id.slice(5)) + '/transition', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ action }),\n }).then(async (response) => {\n if (!response.ok) {\n const payload = await response.json().catch(() => null) as { error?: string } | null\n throw new Error(payload?.error ?? '任务操作失败')\n }\n })\n await load()\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setBusyId(null)\n }\n }\n\n const aiAccept = async (task: TaskItem) => {\n setAiBusyId(task.id)\n setError(null)\n try {\n const response = await fetch(ROUTE + '/ai-accept', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ id: task.id }),\n })\n const payload = await response.json() as { sessionId?: string; error?: string }\n if (!response.ok || typeof payload.sessionId !== 'string') {\n throw new Error(payload.error ?? 'AI 受理会话创建失败')\n }\n openSession(payload.sessionId)\n setOpen(false)\n } catch (cause) {\n setError(cause instanceof Error ? cause.message : String(cause))\n } finally {\n setAiBusyId(null)\n }\n }\n\n return (\n <>\n {anchor !== null ? (\n <button\n type=\"button\"\n aria-label=\"任务中心\"\n title=\"任务中心\"\n onClick={() => setOpen((value) => !value)}\n style={{\n position: 'fixed',\n left: anchor.left,\n top: anchor.top,\n zIndex: 45,\n width: 28,\n height: 28,\n padding: 0,\n border: 'none',\n borderRadius: 8,\n background: 'transparent',\n color: actionable > 0 ? colors.accent : colors.muted,\n cursor: 'pointer',\n pointerEvents: 'auto',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M18 8a6 6 0 0 0-12 0c0 7-3 7-3 9h18c0-2-3-2-3-9\" />\n <path d=\"M13.7 21a2 2 0 0 1-3.4 0\" />\n </svg>\n {pendingCount > 0 ? (\n <span style={{ position: 'absolute', bottom: -2, right: -2, minWidth: 14, height: 14, padding: '0 3px', boxSizing: 'border-box', borderRadius: 999, background: '#2563eb', color: '#fff', fontSize: 9, lineHeight: '14px', textAlign: 'center' }}>\n {pendingCount > 99 ? '99+' : pendingCount}\n </span>\n ) : null}\n </button>\n ) : null}\n\n <Modal open={open} onClose={() => setOpen(false)} title=\"任务中心\" headless className={TASK_BUS_MODAL_CLASS}>\n <div style={{ display: 'flex', flexDirection: 'column', width: '100%', height: '100%', minHeight: 0 }}>\n <header style={{ display: 'flex', alignItems: 'center', gap: 8, padding: '22px 24px 12px' }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <h2 style={{ margin: 0, fontSize: 16, lineHeight: '24px', fontWeight: 500, color: colors.text }}>任务中心</h2>\n </div>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => void load()}>刷新</Button>\n <Button size=\"sm\" variant=\"ghost\" aria-label=\"关闭\" title=\"关闭\" onClick={() => setOpen(false)} icon={<IconCloseOutlineRegular size={14} />} style={{ width: 28, padding: 0 }} />\n </header>\n <div style={{ padding: '0 24px 14px', borderBottom: '1px solid ' + colors.line }}>\n <SegmentedTabs items={tabItems} value={tab} onChange={setTab} label=\"任务中心分类\" />\n </div>\n {error ? <div style={{ padding: '8px 10px', borderRadius: 8, background: '#fef2f2', color: colors.danger, fontSize: 11, margin: '0 24px 12px' }}>{error}</div> : null}\n <div id={'task-bus-panel-' + tab} role=\"tabpanel\" aria-labelledby={'task-bus-tab-' + tab} style={{ padding: '16px 24px 24px', display: 'flex', flexDirection: 'column', gap: 10, overflowY: 'auto', flex: 1 }}>\n {selected !== null ? (\n <TaskDetail task={selected} onBack={() => setSelected(null)} />\n ) : (\n <>\n {loading ? <div style={{ padding: 18, textAlign: 'center', color: colors.muted, fontSize: 12 }}>正在加载…</div> : null}\n {!loading && filtered.length === 0 ? <div style={{ padding: 18, textAlign: 'center', color: colors.muted, fontSize: 12 }}>暂无任务</div> : null}\n {!loading && filtered.map((task) => (\n <TaskCard key={task.id} task={task} busy={busyId === task.id} aiBusy={aiBusyId === task.id} onTransition={(item, action) => void transition(item, action)} onAiAccept={(item) => void aiAccept(item)} onOpen={setSelected} />\n ))}\n </>\n )}\n </div>\n </div>\n </Modal>\n </>\n )\n}\n\n\n\ninterface HistoryEntry {\n key: string\n role: 'user' | 'assistant'\n author: string\n time: number | undefined\n text: string\n jumpId?: string\n}\n\nconst HISTORY_CONTENT_TYPES = new Set(['user/message', 'assistant/message'])\n\nconst historyText = (content: unknown): string => {\n if (!Array.isArray(content)) return ''\n return content.map((block) => {\n if (block === null || typeof block !== 'object') return ''\n const record = block as Record<string, unknown>\n return record.type === 'text' && typeof record.text === 'string' ? record.text : ''\n }).filter(Boolean).join('\\n').trim()\n}\n\nconst historyRole = (event: Record<string, unknown>): 'user' | 'assistant' => {\n const data = event.data as Record<string, unknown> | undefined\n return data?.role === 'user' || event.type === 'user/message' ? 'user' : 'assistant'\n}\n\nconst historyAuthor = (event: Record<string, unknown>, role: 'user' | 'assistant', t: HistoryTranslate): string => {\n const data = event.data as Record<string, unknown> | undefined\n const source = data?.source as Record<string, unknown> | undefined\n const memberName = typeof source?.memberName === 'string' ? source.memberName.trim() : ''\n if (memberName !== '') return memberName\n return role === 'user' ? t('me') : t('assistant')\n}\n\nconst groupHistory = async (roomId: string, t: HistoryTranslate): Promise<HistoryEntry[]> => {\n const entries: HistoryEntry[] = []\n let cursor: string | null = null\n for (let page = 0; page < 20; page += 1) {\n const suffix = cursor === null ? '' : '?cursor=' + encodeURIComponent(cursor)\n const response = await fetch('/dsh-group-chat/api/rooms/' + encodeURIComponent(roomId) + '/events' + suffix)\n if (!response.ok) throw new Error(t('error'))\n const payload = await response.json() as { events?: Array<{ id?: string; event?: Record<string, unknown>; createdAt?: string }>; nextCursor?: string | null; hasMore?: boolean }\n for (const record of payload.events ?? []) {\n const event = record.event\n if (event === undefined || typeof event.type !== 'string' || !HISTORY_CONTENT_TYPES.has(event.type)) continue\n const data = event.data as Record<string, unknown> | undefined\n const role = historyRole(event)\n const text = historyText(data?.content)\n if (text === '') continue\n entries.push({ key: record.id ?? String(event.seq ?? entries.length), role, author: historyAuthor(event, role, t), time: typeof event.time === 'number' ? event.time : undefined, text, jumpId: record.id })\n }\n if (payload.hasMore !== true || payload.nextCursor === null || payload.nextCursor === undefined) break\n cursor = payload.nextCursor\n }\n return entries.sort((left, right) => (right.time ?? 0) - (left.time ?? 0))\n}\n\nconst sessionHistory = async (sessionId: string, sessions: unknown, t: HistoryTranslate): Promise<HistoryEntry[]> => {\n const service = sessions as {\n retain?: (id: string, options: { source: string }) => {\n ready?: Promise<unknown>\n binding?: {\n eventSource?: { getSnapshot(): { entries?: Array<{ type?: string; event?: Record<string, unknown> }> } }\n session?: { loadOlder?: () => Promise<void> }\n }\n release?: () => void\n }\n }\n if (service.retain === undefined) return []\n const reference = service.retain(sessionId, { source: 'gateway' })\n try {\n await reference.ready\n const binding = reference.binding\n if (binding === undefined) return []\n await binding.session?.loadOlder?.().catch(() => undefined)\n const entries = binding.eventSource?.getSnapshot().entries ?? []\n return entries\n .filter((entry): entry is { type: 'event'; event: Record<string, unknown> } => entry.type === 'event' && entry.event !== undefined)\n .filter((entry) => typeof entry.event.type === 'string' && HISTORY_CONTENT_TYPES.has(entry.event.type))\n .map((entry) => {\n const event = entry.event\n const data = event.data as Record<string, unknown> | undefined\n const role = historyRole(event)\n return {\n key: String(event.seq ?? entries.indexOf(entry)),\n role,\n author: historyAuthor(event, role, t),\n time: typeof event.time === 'number' ? event.time : undefined,\n text: historyText(data?.content),\n }\n })\n .filter((entry) => entry.text !== '')\n .sort((left, right) => (right.time ?? 0) - (left.time ?? 0))\n } finally {\n reference.release?.()\n }\n}\n\n\n\ninterface FileAttachmentRef {\n attachmentId: string\n name: string\n bytes: number\n}\n\nconst fileAttachmentIn = (content: unknown, name: string): FileAttachmentRef | undefined => {\n if (!Array.isArray(content)) return undefined\n for (const block of content) {\n if (block === null || typeof block !== 'object') continue\n const record = block as Record<string, unknown>\n if (record.type !== 'file') continue\n const attachment = record.attachment as Record<string, unknown> | undefined\n if (attachment?.name === name && typeof attachment.attachmentId === 'string' && typeof attachment.bytes === 'number') {\n return { attachmentId: attachment.attachmentId, name, bytes: attachment.bytes }\n }\n }\n return undefined\n}\n\nconst sessionFileAttachment = async (sessionId: string, sessions: unknown, name: string): Promise<FileAttachmentRef | undefined> => {\n const service = sessions as {\n retain?: (id: string, options: { source: string }) => {\n ready?: Promise<unknown>\n binding?: {\n eventSource?: { getSnapshot(): { entries?: Array<{ type?: string; event?: Record<string, unknown> }> } }\n session?: { loadOlder?: () => Promise<void> }\n }\n release?: () => void\n }\n }\n if (service.retain === undefined) return undefined\n const reference = service.retain(sessionId, { source: 'gateway' })\n try {\n await reference.ready\n const binding = reference.binding\n if (binding === undefined) return undefined\n const find = (): FileAttachmentRef | undefined => {\n const entries = binding.eventSource?.getSnapshot().entries ?? []\n for (const entry of entries) {\n if (entry.type !== 'event' || entry.event === undefined) continue\n if (entry.event.type !== 'user/message') continue\n const data = entry.event.data as Record<string, unknown> | undefined\n const found = fileAttachmentIn(data?.content, name)\n if (found !== undefined) return found\n }\n return undefined\n }\n let found = find()\n for (let page = 0; page < 5 && found === undefined; page += 1) {\n await binding.session?.loadOlder?.().catch(() => undefined)\n found = find()\n }\n return found\n } finally {\n reference.release?.()\n }\n}\n\n/**\n * The design system's standard 16-unit clock glyph, drawn locally.\n *\n * The client primitives package this runtime serves (0.2.2-alpha.2) exports\n * `IconClockOutline`, `IconClockOutlineRegular`, and `IconClockOutlineMedium`,\n * not the newer `IconClockOutline16` name. A missing named export resolves to\n * `undefined`, so importing it crashed this header slot with React error #130\n * and removed the button entirely; the standard geometry is inlined instead.\n */\nconst MessageHistoryIcon = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" strokeWidth=\"1.5\">\n <circle cx=\"8\" cy=\"8\" r=\"6.375\" stroke=\"currentColor\" />\n <path d=\"M8 4.4V8.3L10.7 9.85\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\nconst HistoryButton = ({ sessionId, sessions, t }: { sessionId: string; sessions: unknown; t: HistoryTranslate }) => {\n const [open, setOpen] = useState(false)\n const [entries, setEntries] = useState<HistoryEntry[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState('')\n const [query, setQuery] = useState('')\n const isGroup = sessionId.startsWith('group-room-')\n\n useEffect(() => {\n if (!open) return\n let alive = true\n setLoading(true)\n setError('')\n setQuery('')\n setEntries([])\n const load = isGroup ? groupHistory(sessionId.slice('group-room-'.length), t) : sessionHistory(sessionId, sessions, t)\n void load.then((items) => { if (alive) setEntries(items) })\n .catch((cause) => { if (alive) setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { if (alive) setLoading(false) })\n return () => { alive = false }\n }, [open, isGroup, sessionId, sessions, t])\n\n const needle = query.trim().toLocaleLowerCase()\n const results = useMemo(() => {\n if (needle === '') return []\n return entries.filter((entry) =>\n entry.text.toLocaleLowerCase().includes(needle) || entry.author.toLocaleLowerCase().includes(needle))\n }, [entries, needle])\n\n const jump = (entry: HistoryEntry) => {\n setOpen(false)\n window.setTimeout(() => {\n let target: HTMLElement | null = entry.jumpId === undefined\n ? null\n : document.querySelector<HTMLElement>('[data-group-chat-message=\"' + CSS.escape(entry.jumpId) + '\"]')\n if (target === null) {\n const text = entry.text.slice(0, 80)\n target = [...document.querySelectorAll<HTMLElement>('[data-group-chat-message], [data-slot=\"conversation.user.text.node\"]')]\n .find((element) => (element.innerText ?? '').includes(text)) ?? null\n }\n if (target === null && (window as unknown as { find: (...args: unknown[]) => boolean }).find(entry.text.slice(0, 80), false, false, true, false, false, false)) {\n const selection = window.getSelection()\n const node = selection?.anchorNode\n target = node instanceof HTMLElement ? node : node?.parentElement ?? null\n }\n target?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n if (target !== null) {\n target.style.outline = '2px solid #2563eb'\n target.style.outlineOffset = '4px'\n window.setTimeout(() => { target!.style.outline = ''; target!.style.outlineOffset = '' }, 1800)\n }\n }, 80)\n }\n\n const searchInputStyle: CSSProperties = {\n width: '100%',\n boxSizing: 'border-box',\n height: 36,\n padding: '0 34px 0 12px',\n borderRadius: 8,\n border: '1px solid ' + colors.line,\n background: colors.panel,\n color: colors.text,\n fontSize: 13,\n outline: 'none',\n }\n\n return (\n <>\n <button\n type=\"button\"\n aria-label={t('open')}\n title={t('open')}\n data-session-id={sessionId}\n onClick={() => setOpen(true)}\n style={{ display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 28, height: 28, border: 'none', borderRadius: 6, background: 'transparent', color: 'inherit', cursor: 'pointer' }}\n >\n <MessageHistoryIcon size={16} />\n </button>\n <Modal open={open} onClose={() => setOpen(false)} title={t('title')} closeLabel={t('close')} className={TASK_BUS_HISTORY_CLASS}>\n <div style={{ width: '100%', maxHeight: 'min(68vh, 620px)', overflowY: 'auto', display: 'grid', gap: 10, padding: '4px 0 8px' }}>\n <div style={{ position: 'relative', width: '100%' }}>\n <input\n type=\"text\"\n value={query}\n autoFocus\n spellCheck={false}\n placeholder={t('searchPlaceholder')}\n aria-label={t('searchLabel')}\n onChange={(event) => { setQuery(event.target.value) }}\n style={searchInputStyle}\n />\n {query !== '' ? (\n <button\n type=\"button\"\n aria-label={t('clear')}\n title={t('clear')}\n onClick={() => { setQuery('') }}\n style={{ position: 'absolute', right: 6, top: '50%', transform: 'translateY(-50%)', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 24, height: 24, border: 'none', borderRadius: 5, background: 'transparent', color: colors.muted, cursor: 'pointer' }}\n >\n <IconCloseOutlineRegular size={14} />\n </button>\n ) : null}\n </div>\n\n {loading ? <div style={{ padding: 28, textAlign: 'center', color: colors.muted, fontSize: 12 }}>{t('loading')}</div> : null}\n {!loading && error !== '' ? <div role=\"alert\" style={{ padding: 12, color: colors.danger, fontSize: 12 }}>{error}</div> : null}\n {!loading && error === '' && needle === '' ? (\n <div style={{ display: 'grid', justifyItems: 'center', gap: 8, padding: '36px 20px 40px', color: colors.muted, textAlign: 'center' }}>\n <span style={{ display: 'inline-flex', width: 36, height: 36, alignItems: 'center', justifyContent: 'center', borderRadius: 18, background: colors.panelAlt, color: colors.muted }}>\n <MessageHistoryIcon size={16} />\n </span>\n <span style={{ fontSize: 13, fontWeight: 600, color: colors.text }}>{t('initial')}</span>\n <span style={{ fontSize: 12, lineHeight: 1.6 }}>{t('initialHint')}</span>\n </div>\n ) : null}\n {!loading && error === '' && needle !== '' && results.length === 0 ? (\n <div style={{ padding: 28, textAlign: 'center', color: colors.muted, fontSize: 12 }}>\n {entries.length === 0 ? t('empty') : t('noResults')}\n </div>\n ) : null}\n {!loading && error === '' && needle !== '' && results.map((entry) => (\n <button\n key={entry.key}\n type=\"button\"\n onClick={() => jump(entry)}\n style={{ display: 'grid', gap: 6, width: '100%', minWidth: 0, textAlign: 'left', padding: '10px 12px', borderRadius: 8, border: '1px solid ' + colors.line, background: colors.panelAlt, color: colors.text, cursor: 'pointer' }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 0, flexWrap: 'wrap', fontSize: 10, color: colors.muted }}>\n <span style={{ fontWeight: 650, color: entry.role === 'user' ? '#2563eb' : colors.text }}>{entry.author}</span>\n {entry.time === undefined ? null : <span>{new Date(entry.time).toLocaleString(t('dateLocale'))}</span>}\n <span style={{ marginLeft: 'auto' }}>{t('jump')}</span>\n </span>\n <span style={{ display: 'block', minWidth: 0, fontSize: 13, lineHeight: 1.65, whiteSpace: 'pre-wrap', overflowWrap: 'anywhere', wordBreak: 'break-word' }}>{entry.text}</span>\n </button>\n ))}\n </div>\n </Modal>\n </>\n )\n}\n\nexport const apply = (ctx: Context) => {\n const locale = (ctx as unknown as {\n locale: {\n register(namespace: string, dictionaries: { zh: typeof HISTORY_COPY.zh; en: typeof HISTORY_COPY.en }): () => void\n bind(namespace: string): (key: HistoryCopyKey) => string\n }\n }).locale\n ctx.effect(() => locale.register(HISTORY_NS, { zh: HISTORY_COPY.zh, en: HISTORY_COPY.en }), 'task-bus: history copy')\n const t = locale.bind(HISTORY_NS)\n const surface = ctx as unknown as {\n slots: {\n inject(name: string, factory: () => () => void): () => void\n register(options: Record<string, unknown>, component: (props: never) => JSX.Element | null): () => void\n }\n uiWorkspace: { openSession(sessionId: string): void }\n }\n const surfaceWithServices = surface as unknown as {\n sidebarRight?: { openResource?(address: string): void }\n get?: (name: string) => unknown\n }\n const sidebarRight = (surfaceWithServices.sidebarRight ?? surfaceWithServices.get?.('sidebarRight')) as\n { openResource?(address: string): void } | undefined\n // Native file cards are spans owned by the official Chat renderer, so delegate from the\n // document. The active Session header carries its id; group rooms have their own handler.\n ctx.effect(() => {\n const onFileClick = (event: MouseEvent): void => {\n const target = event.target\n if (!(target instanceof Element)) return\n const card = target.closest('[data-message-attachments] > *')\n if (!(card instanceof HTMLElement)) return\n const header = document.querySelector<HTMLElement>('button[aria-label=\"消息记录\"][data-session-id]')\n const sessionId = header?.getAttribute('data-session-id') ?? ''\n if (sessionId === '' || sessionId.startsWith('group-room-')) return\n const name = (card.getAttribute('title') ?? card.innerText.split('\\n')[0] ?? '').trim()\n if (name === '') return\n void (async () => {\n const attachment = await sessionFileAttachment(sessionId, (ctx as unknown as { sessions: unknown }).sessions, name)\n if (attachment === undefined) return\n const sessionState = (ctx as unknown as {\n sessions?: { list?: { getSnapshot(): { byId?: Record<string, { cwd?: string }> } } }\n }).sessions?.list?.getSnapshot()\n const cwd = sessionState?.byId?.[sessionId]?.cwd ?? ''\n const query = 'attachmentId=' + encodeURIComponent(attachment.attachmentId)\n + '&name=' + encodeURIComponent(attachment.name)\n + '&bytes=' + encodeURIComponent(String(attachment.bytes))\n + (cwd === '' ? '' : '&cwd=' + encodeURIComponent(cwd))\n const response = await fetch(ROUTE + '/attachment-materialize?' + query)\n if (!response.ok) throw new Error('附件预览准备失败')\n const materialized = await response.json() as { path?: string }\n if (typeof materialized.path !== 'string') throw new Error('附件预览路径缺失')\n const address = 'dsh-resource://file/session/' + encodeURIComponent(sessionId)\n + '/' + materialized.path.split('/').map((part) => encodeURIComponent(part)).join('/')\n const right = (ctx as unknown as { sidebarRight?: { openResource?(address: string): void } }).sidebarRight\n if (right?.openResource !== undefined) right.openResource(address)\n else window.open(new URL('/dsh-task-bus/api/attachment-materialize?' + query, window.location.origin).toString(), '_blank', 'noopener,noreferrer')\n })().catch((cause) => { console.error('[task-bus] file preview failed', cause) })\n }\n document.addEventListener('click', onFileClick, true)\n return () => { document.removeEventListener('click', onFileClick, true) }\n }, 'task-bus: native file card preview')\n const Surface = () => (\n <TaskCenterButton\n openSession={(sessionId) => surface.uiWorkspace.openSession(sessionId)}\n />\n )\n ctx.effect(() => surface.slots.inject('shell.overlay', () => surface.slots.register(\n { name: 'shell.overlay', id: 'task-bus.center' },\n Surface,\n )), 'task-bus: Task Center overlay')\n\n // The history seat replaces the host's open-in-app jump. That control is a split\n // group: `[data-open-target=\"directory\"]` wraps the primary button and an optional\n // chevron. Hiding only the primary button left the wrapper's 1px left/right border\n // as a 2px-wide, 24px-tall rule beside this button, so the entry that owns the\n // split group is hidden instead.\n //\n // The slot renders every registered entry as one direct child of the\n // `[data-slot=\"conversation.session.header.utilities\"]` wrapper; this button is a\n // sibling of that entry, so the selectors below never match its own container.\n // They are scoped to the utilities slot so the file and directory launchers\n // elsewhere in the shell keep working.\n ctx.effect(() => {\n const style = document.createElement('style')\n style.id = 'task-bus-history-replaces-file-manager'\n style.textContent = [\n '[data-slot=\"conversation.session.header.utilities\"] > *:has([data-open-target]) { display: none !important; }',\n '[data-message-attachments] > * { cursor: pointer; }',\n ].join('\\n')\n document.head.appendChild(style)\n return () => { style.remove() }\n }, 'task-bus: replace file manager header button')\n\n ctx.effect(() => surface.slots.inject('conversation.session.header.utilities', () => surface.slots.register({\n name: 'conversation.session.header.utilities',\n id: 'task-bus.history',\n order: -4,\n inject: ((sessionId: string) => ({ sessionId, sessions: (ctx as unknown as { sessions: unknown }).sessions, t })) as never,\n } as never, HistoryButton as never)), 'task-bus: message history')\n}"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sparkelf/dsh-task-bus",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "DataOps Task Center and Task Bus for the official DSH Web shell.",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",