@lemoncat7/dsh-partner 1.5.1 → 1.5.2
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.d.ts.map +1 -1
- package/lib/client.js +324 -42
- package/lib/client.js.map +3 -3
- package/package.json +1 -1
package/lib/client.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/client.tsx", "../src/workspace-ownership.ts", "../node_modules/qrcode.react/lib/esm/index.js", "../src/client.css", "../src/ui/workspace-ui.css", "../src/client-api.ts", "../src/sidebar-anchor.ts", "../src/time-format.ts", "../src/glass-surface.tsx", "../src/ui/skills-panel.tsx", "../src/ui/workspace-components.tsx", "../src/ui/task-board-panel.tsx", "../src/ui/schedule-panel.tsx", "../src/ui/companion-access-panel.tsx", "../src/ui/partner-components.tsx", "../src/ui/companion-create.tsx", "../src/client-controller.tsx"],
|
|
4
|
-
"sourcesContent": ["import { useCallback, useEffect, useId, useMemo, useRef, useState, type FormEvent } from 'react'\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { PropsRuntime } 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-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-theme/client'\nimport { observePluginWorkspace } from './workspace-ownership.js'\nimport {\n IconAgentPresetOutline16, IconCheckOutline14, IconChevronDownOutline14, IconChevronLeftOutline14,\n IconDataOutline16, IconEditOutline16, IconLinkOutline16, IconPlusOutline16,\n IconRefreshOutline16, IconTrashOutline16, IconUserOutline16, IconBrowseOutline16, IconListPenOutline16, IconPlayOutline16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { QRCodeSVG } from 'qrcode.react'\nimport baseCssText from './client.css'\nimport workspaceCssText from './ui/workspace-ui.css'\nimport { api, loadPartner, type AutomationView, type Capability, type ChannelView, type CompanionView, type ConcernActivityView, type ConcernObservationView, type ConcernSourceView, type ConcernView, type DailyReflectionView, type LoginView, type MemoryGraphView, type MemoryRelationView, type MemoryView, type ModelCatalogView, type PartnerSnapshot, type UserProfileSnapshotView } from './client-api.js'\nimport { useWorkspaceTopAnchor } from './sidebar-anchor.js'\nimport { futureTime } from './time-format.js'\nimport { GlassSurface } from './glass-surface.js'\nimport { CompanionSkillSettings, SkillsPanel } from './ui/skills-panel.js'\nimport { TaskBoardPanel } from './ui/task-board-panel.js'\nimport { SchedulePanel } from './ui/schedule-panel.js'\nimport { CompanionAccessPanel } from './ui/companion-access-panel.js'\nimport { Avatar, ChannelStatus as Status, ContentState as State, FormField as Field, SectionHeading as Section, TabButton, WeixinGlyph, relativeTime } from './ui/partner-components.js'\nimport { errorMessage as message } from './ui/workspace-components.js'\nimport { CompanionCreateDialog, type NewCompanionDraft } from './ui/companion-create.js'\nimport { createPartnerController, type PartnerController as Controller } from './client-controller.js'\n\nconst PLUGIN_ID = '@lemoncat7/dsh-partner'\nconst STYLE_ID = `${PLUGIN_ID}/client`\nconst cssText = `${baseCssText}\\n${workspaceCssText}`\ntype SidebarProps = PropsRuntime<'sidebar.footer.action'>\ntype ConversationProps = PropsRuntime<'conversation'>\ntype CompanionTab = 'home' | 'identity' | 'capabilities' | 'weixin' | 'memory'\ntype WorkspacePage = 'skills' | 'board' | 'schedules'\ntype View = CompanionTab | WorkspacePage\n\nconst WORKSPACE_PAGES = new Set<View>(['skills', 'board', 'schedules'])\n\nexport const inject = ['slots', 'layout', 'sessions']\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(installStyles, 'dsh-partner: styles')\n const controller = createPartnerController(ctx, PLUGIN_ID, (props, current) => <PartnerWorkspace {...props} controller={current} />)\n ctx.effect(() => observePluginWorkspace(PLUGIN_ID, controller.close), 'dsh-partner: exclusive workspace')\n ctx.effect(() => () => controller.close(), 'dsh-partner: workspace lifecycle')\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action', id: 'partner', order: -120,\n }, props => <PartnerSidebar {...props} controller={controller} collapse={() => ctx.layout.toggleSidebar()} />))\n}\n\nfunction PartnerSidebar(props: SidebarProps & { controller: Controller; collapse(): void }): JSX.Element {\n const ref = useRef<HTMLElement>(null)\n useWorkspaceTopAnchor(ref)\n const [open, setOpen] = useState(true)\n const [snapshot, setSnapshot] = useState<PartnerSnapshot>()\n const [, update] = useState(0)\n useEffect(() => props.controller.subscribe(() => update(value => value + 1)), [props.controller])\n useEffect(() => { void loadPartner().then(setSnapshot).catch(() => {}) }, [props.controller.isOpen()])\n const launch = (id?: string): void => {\n props.controller.open(id)\n if (props.wide && window.matchMedia('(max-width: 820px)').matches) props.collapse()\n }\n if (!props.wide) return <section ref={ref} className=\"dsh-partner-sidebar is-rail\"><button type=\"button\" className={`dsh-partner-rail${props.controller.isOpen() ? ' is-active' : ''}`} title=\"\u4F19\u4F34\" onClick={() => props.controller.toggle()}><IconAgentPresetOutline16 size={18} /></button></section>\n return <section ref={ref} className=\"dsh-partner-sidebar\">\n <div className=\"dsh-partner-sidebar-heading\">\n <button type=\"button\" className=\"dsh-partner-sidebar-title\" aria-expanded={open} onClick={() => setOpen(value => !value)}><span data-open={open}><IconChevronDownOutline14 size={14} /></span>\u4F19\u4F34</button>\n </div>\n <div className={`dsh-partner-sidebar-list${open ? ' is-open' : ''}`} aria-hidden={!open}>\n <div className=\"dsh-partner-sidebar-list-inner\">\n <button type=\"button\" tabIndex={open ? 0 : -1} className={`dsh-partner-sidebar-row${props.controller.isOpen() ? ' is-active' : ''}`} onClick={() => launch()}>\n <span className=\"dsh-partner-sidebar-symbol\"><IconAgentPresetOutline16 size={16} /></span><span><strong>\u4F19\u4F34\u9762\u677F</strong><small>{snapshot ? `${snapshot.companions.length} \u4F4D\u4F19\u4F34 \u00B7 ${snapshot.channels.filter(item => item.runtimeStatus === 'running').length} \u4E2A\u5FAE\u4FE1\u5728\u7EBF` : '\u8EAB\u4EFD\u3001\u80FD\u529B\u4E0E\u6E20\u9053'}</small></span><i className={snapshot?.channels.some(item => item.runtimeStatus === 'running') ? 'is-online' : ''} />\n </button>\n </div>\n </div>\n </section>\n}\n\nfunction PartnerWorkspace({ controller }: ConversationProps & { controller: Controller }): JSX.Element {\n const [snapshot, setSnapshot] = useState<PartnerSnapshot>()\n const [selectedId, setSelectedId] = useState(controller.selected())\n const [view, setView] = useState<View>('home')\n const [error, setError] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [creatingCompanion, setCreatingCompanion] = useState(false)\n const refresh = useCallback(async () => {\n try {\n const next = await loadPartner()\n setSnapshot(next)\n setSelectedId(current => next.companions.some(item => item.id === current) ? current : next.companions[0]?.id)\n setError(undefined)\n } catch (reason) { setError(message(reason)) } finally { setLoading(false) }\n }, [])\n useEffect(() => { void refresh() }, [refresh])\n useEffect(() => controller.subscribe(() => { const next = controller.selected(); if (next) setSelectedId(next) }), [controller])\n const selected = snapshot?.companions.find(item => item.id === selectedId)\n const create = async (draft: NewCompanionDraft): Promise<void> => {\n try {\n const companion = await api<CompanionView>('/companions', { method: 'POST', body: JSON.stringify({ companion: {\n ...draft, capabilities: [],\n } }) })\n await refresh(); setSelectedId(companion.id); setView('identity'); setCreatingCompanion(false)\n } catch (reason) { setError(message(reason)); throw reason }\n }\n const openSession = async (routeId: string, sessionId: string): Promise<void> => {\n try { setError(undefined); await controller.openSession(routeId, sessionId) }\n catch (reason) { setError(message(reason)) }\n }\n const startSession = async (companionId: string): Promise<void> => {\n try { setError(undefined); await controller.startSession(companionId) }\n catch (reason) { setError(message(reason)) }\n }\n const renewSession = async (routeId: string): Promise<void> => {\n try { setError(undefined); await controller.renewSession(routeId) }\n catch (reason) { setError(message(reason)) }\n }\n const workspacePage = WORKSPACE_PAGES.has(view)\n const openCompanion = (id: string): void => { setSelectedId(id); setView('home') }\n return <main className=\"dsh-partner-workspace\">\n {creatingCompanion && <CompanionCreateDialog close={() => setCreatingCompanion(false)} create={create} />}\n <header className=\"dsh-partner-topbar\"><div><button type=\"button\" data-xiaohei-workspace-close onClick={controller.close} aria-label=\"\u8FD4\u56DE\u4F1A\u8BDD\" title=\"\u8FD4\u56DE\u4F1A\u8BDD\"><IconChevronLeftOutline14 size={15} /></button><IconAgentPresetOutline16 size={18} /><span><strong>\u4F19\u4F34</strong><small>\u957F\u671F\u8EAB\u4EFD\u4E0E\u5FAE\u4FE1\u6E20\u9053</small></span></div><nav className=\"dsh-partner-mobile-workspace-nav\" aria-label=\"\u4F19\u4F34\u5DE5\u4F5C\u533A\u5FEB\u6377\u5165\u53E3\"><button type=\"button\" className={view === 'skills' ? 'is-active' : ''} aria-label=\"Skill \u5E02\u573A\" onClick={() => setView('skills')}><IconBrowseOutline16 size={16} /><span>Skill</span></button><button type=\"button\" className={view === 'board' ? 'is-active' : ''} aria-label=\"\u4EFB\u52A1\u770B\u677F\" onClick={() => setView('board')}><IconListPenOutline16 size={16} /><span>\u770B\u677F</span></button><button type=\"button\" className={view === 'schedules' ? 'is-active' : ''} aria-label=\"\u5B9A\u65F6\u4EFB\u52A1\" onClick={() => setView('schedules')}><IconPlayOutline16 size={16} /><span>\u5B9A\u65F6</span></button></nav></header>\n <div className=\"dsh-partner-grid\">\n <aside className=\"dsh-partner-roster\">\n <div className=\"dsh-partner-roster-title\"><span><small>COMPANIONS</small><strong>\u4F19\u4F34\u540D\u518C</strong></span><button type=\"button\" onClick={() => setCreatingCompanion(true)} aria-label=\"\u65B0\u5EFA\u4F19\u4F34\"><IconPlusOutline16 size={16} /></button></div>\n <div className=\"dsh-partner-roster-list\">{snapshot?.companions.map(companion => {\n const channel = snapshot.channels.find(item => item.companionId === companion.id)\n return <button type=\"button\" key={companion.id} className={!workspacePage && selectedId === companion.id ? 'is-active' : ''} onClick={() => openCompanion(companion.id)}>\n <Avatar name={companion.name} /><span><strong>{companion.name}</strong><small>{companion.role}</small></span><i className={channel?.runtimeStatus === 'running' ? 'is-online' : ''} title={channel ? channel.runtimeStatus : '\u672A\u8FDE\u63A5\u6E20\u9053'} />\n </button>\n })}</div>\n <nav className=\"dsh-partner-workspace-nav\" aria-label=\"\u4F19\u4F34\u5DE5\u4F5C\u533A\">\n <button type=\"button\" className={view === 'skills' ? 'is-active' : ''} aria-current={view === 'skills' ? 'page' : undefined} onClick={() => setView('skills')}><span><IconBrowseOutline16 size={16} /></span><strong>Skill \u5E02\u573A</strong><small>\u5B89\u88C5\u4E0E\u7BA1\u7406\u80FD\u529B</small></button>\n <button type=\"button\" className={view === 'board' ? 'is-active' : ''} aria-current={view === 'board' ? 'page' : undefined} onClick={() => setView('board')}><span><IconListPenOutline16 size={16} /></span><strong>\u4EFB\u52A1\u770B\u677F</strong><small>\u534F\u4F5C\u3001\u59D4\u6D3E\u4E0E\u9A8C\u6536</small></button>\n <button type=\"button\" className={view === 'schedules' ? 'is-active' : ''} aria-current={view === 'schedules' ? 'page' : undefined} onClick={() => setView('schedules')}><span><IconPlayOutline16 size={16} /></span><strong>\u5B9A\u65F6\u4EFB\u52A1</strong><small>\u9009\u62E9\u4F19\u4F34\u5468\u671F\u6267\u884C</small></button>\n </nav>\n <div className=\"dsh-partner-roster-note\"><IconLinkOutline16 size={16} /><span><strong>\u8EAB\u4EFD\u4E0E\u6E20\u9053\u5206\u79BB</strong><small>\u5FAE\u4FE1\u53EA\u8D1F\u8D23\u6536\u53D1\uFF0C\u6743\u9650\u4ECD\u7531 DSH \u5DE5\u5177\u51B3\u5B9A\u3002</small></span></div>\n </aside>\n <section className={`dsh-partner-stage${workspacePage ? ' is-workspace-page' : ''}`}>\n {loading ? <State title=\"\u6B63\u5728\u8BFB\u53D6\u4F19\u4F34\u2026\" /> : workspacePage ? <div className=\"dsh-partner-stage-scroll is-workspace-page\">\n {view === 'skills' && <SkillsPanel />}\n {view === 'board' && <TaskBoardPanel />}\n {view === 'schedules' && <SchedulePanel companions={snapshot?.companions ?? []} />}\n </div> : selected === undefined ? <State title=\"\u521B\u5EFA\u7B2C\u4E00\u4E2A\u4F19\u4F34\" detail=\"\u4F19\u4F34\u4F1A\u4FDD\u5B58\u72EC\u7ACB\u8EAB\u4EFD\u3001\u80FD\u529B\u548C\u5FAE\u4FE1\u4F1A\u8BDD\u3002\" action={<button onClick={() => setCreatingCompanion(true)}>\u65B0\u5EFA\u4F19\u4F34</button>} /> : <>\n <div className=\"dsh-partner-identity\"><Avatar name={selected.name} /><span><small>ACTIVE COMPANION</small><h1>{selected.name}</h1><p>{selected.description || selected.role}</p></span><Status channel={snapshot?.channels.find(item => item.companionId === selected.id)} /></div>\n <nav className=\"dsh-partner-tabs\" aria-label=\"\u4F19\u4F34\u914D\u7F6E\">\n <TabButton active={view === 'home'} onClick={() => setView('home')} icon={<IconAgentPresetOutline16 size={16} />}>\u603B\u89C8</TabButton>\n <TabButton active={view === 'identity'} onClick={() => setView('identity')} icon={<IconEditOutline16 size={16} />}>\u8EAB\u4EFD</TabButton>\n <TabButton active={view === 'capabilities'} onClick={() => setView('capabilities')} icon={<IconAgentPresetOutline16 size={16} />}>\u80FD\u529B</TabButton>\n <TabButton active={view === 'weixin'} onClick={() => setView('weixin')} icon={<WeixinGlyph />}>\u5FAE\u4FE1</TabButton>\n <TabButton active={view === 'memory'} onClick={() => setView('memory')} icon={<IconDataOutline16 size={16} />}>\u8BB0\u5FC6</TabButton>\n </nav>\n <div className=\"dsh-partner-stage-scroll\">\n {view === 'home' && <HomePanel companion={selected} snapshot={snapshot!} navigate={setView} openSession={openSession} startSession={startSession} renewSession={renewSession} />}\n {view === 'identity' && <IdentityEditor companion={selected} count={snapshot?.companions.length ?? 1} onChanged={refresh} />}\n {view === 'capabilities' && <CapabilityEditor companion={selected} presets={snapshot?.presets ?? []} onChanged={refresh} />}\n {view === 'weixin' && <WeixinPanel companion={selected} snapshot={snapshot!} onChanged={refresh} />}\n {view === 'memory' && <MemoryPanel companion={selected} snapshot={snapshot!} openSession={openSession} startSession={startSession} renewSession={renewSession} onChanged={refresh} />}\n </div>\n </>}\n {error && <p className=\"dsh-partner-error\" role=\"alert\">{error}</p>}\n </section>\n </div>\n </main>\n}\n\nfunction HomePanel({ companion, snapshot, navigate, openSession, startSession, renewSession }: { companion: CompanionView; snapshot: PartnerSnapshot; navigate(tab: CompanionTab): void; openSession(routeId: string, sessionId: string): Promise<void>; startSession(companionId: string): Promise<void>; renewSession(routeId: string): Promise<void> }): JSX.Element {\n const channel = snapshot.channels.find(item => item.companionId === companion.id)\n const sessions = snapshot.sessions.filter(item => item.companionId === companion.id)\n const localSession = sessions.find(item => item.kind === 'local')\n const pending = channel ? snapshot.pairings.filter(item => item.channelId === channel.id && item.status === 'pending').length : 0\n const approved = channel ? snapshot.pairings.filter(item => item.channelId === channel.id && item.status === 'approved').length : 0\n const capabilities = companion.capabilities.map(item => ({ knowledge: '\u77E5\u8BC6\u5E93', skills: 'Skill', ssh: 'SSH', git: 'Git', companions: '\u521B\u5EFA\u4F19\u4F34', schedules: '\u5B9A\u65F6\u4EFB\u52A1', access: '\u4F19\u4F34\u6388\u6743' })[item])\n const online = channel?.runtimeStatus === 'running'\n return <div className=\"dsh-partner-home\">\n <header className=\"dsh-partner-home-heading\">\n <span><small>\u5DE5\u4F5C\u53F0</small><h2>{online ? `${companion.name} \u6B63\u5728\u5FAE\u4FE1\u5F85\u547D` : `${companion.name} \u5DF2\u51C6\u5907\u5C31\u7EEA`}</h2></span>\n <p>{online ? '\u6D88\u606F\u3001\u6388\u6743\u4E0E\u4E0A\u4E0B\u6587\u8FB9\u754C\u90FD\u5728\u8FD9\u91CC\u6C47\u603B\u3002' : '\u4F19\u4F34\u8EAB\u4EFD\u3001\u4F1A\u8BDD\u4E0E\u80FD\u529B\u5DF2\u7ECF\u51C6\u5907\u5B8C\u6210\u3002'}</p>\n </header>\n\n <section className={`dsh-partner-home-channel${online ? ' is-online' : ''}`}>\n <div className=\"dsh-partner-home-route\" aria-hidden=\"true\">\n <Avatar name={companion.name} />\n <span className=\"dsh-partner-route-line\"><i /></span>\n <span className=\"dsh-partner-route-weixin\"><WeixinGlyph large /></span>\n </div>\n <div className=\"dsh-partner-home-channel-copy\">\n <span className=\"dsh-partner-home-kicker\"><i />\u4E3B\u8981\u6E20\u9053 \u00B7 \u5FAE\u4FE1</span>\n <h3>{!channel ? '\u7B49\u5F85\u626B\u7801\u8FDE\u63A5' : online ? '\u8FDE\u63A5\u6B63\u5E38\uFF0C\u6B63\u5728\u63A5\u6536\u6D88\u606F' : channel.runtimeStatus === 'error' ? '\u6E20\u9053\u8FDE\u63A5\u9700\u8981\u5904\u7406' : '\u6E20\u9053\u5F53\u524D\u5DF2\u505C\u7528'}</h3>\n <p>{!channel ? '\u901A\u8FC7\u5FAE\u4FE1 iLink Bot \u63A5\u5165\u3002\u51ED\u636E\u53EA\u8FDB\u5165 DSH \u51ED\u636E\u5E93\uFF0C\u8054\u7CFB\u4EBA\u9996\u6B21\u53D1\u6D88\u606F\u4ECD\u9700\u4F60\u7684\u6279\u51C6\u3002' : online ? '\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u62E5\u6709\u72EC\u7ACB DSH \u4F1A\u8BDD\uFF0C\u4F19\u4F34\u8EAB\u4EFD\u4E00\u81F4\uFF0C\u4F46\u4E0A\u4E0B\u6587\u4E0D\u4F1A\u4E92\u76F8\u6DF7\u5408\u3002' : channel.lastError || '\u6E20\u9053\u914D\u7F6E\u4ECD\u7136\u4FDD\u7559\uFF0C\u53EF\u4EE5\u968F\u65F6\u91CD\u65B0\u542F\u7528\u3002'}</p>\n <div className=\"dsh-partner-home-channel-actions\">\n <button type=\"button\" className=\"is-primary\" onClick={() => navigate('weixin')}>{!channel ? '\u8FDE\u63A5\u5FAE\u4FE1' : pending > 0 ? `\u5904\u7406 ${pending} \u4E2A\u8BF7\u6C42` : '\u7BA1\u7406\u6E20\u9053'}</button>\n <span>{!channel ? '\u626B\u7801\u5B8C\u6210\uFF0C\u65E0\u9700\u7C98\u8D34 Token' : `${approved} \u4F4D\u8054\u7CFB\u4EBA \u00B7 ${sessions.length} \u4E2A\u72EC\u7ACB\u4F1A\u8BDD`}</span>\n </div>\n </div>\n </section>\n\n <div className=\"dsh-partner-home-details\">\n <section className=\"dsh-partner-home-profile\">\n <header><span><IconUserOutline16 size={16} /></span><div><small>\u4F19\u4F34\u5E95\u7A3F</small><strong>{companion.role}</strong></div><button type=\"button\" onClick={() => navigate('identity')}>\u7F16\u8F91</button></header>\n <blockquote>{companion.instructions || companion.description || '\u5C1A\u672A\u8BBE\u7F6E\u957F\u671F\u884C\u4E3A\u51C6\u5219\u3002'}</blockquote>\n </section>\n <section className=\"dsh-partner-home-runtime\">\n <header><span><IconAgentPresetOutline16 size={16} /></span><div><small>\u8FD0\u884C\u80FD\u529B</small><strong>{companion.presetId || 'DSH \u9ED8\u8BA4 Preset'}</strong></div><button type=\"button\" onClick={() => navigate('capabilities')}>\u8C03\u6574</button></header>\n <div className=\"dsh-partner-home-capability-list\">{capabilities.length ? capabilities.map(item => <em key={item}>{item}</em>) : <small>\u5C1A\u672A\u58F0\u660E\u80FD\u529B\u8303\u56F4</small>}</div>\n </section>\n <section className=\"dsh-partner-home-continuity\">\n <header><span><IconDataOutline16 size={16} /></span><div><small>\u4F19\u4F34\u5BF9\u8BDD</small><strong>{localSession?.archived ? '\u4F1A\u8BDD\u5DF2\u5F52\u6863' : '\u4F19\u4F34\u4F1A\u8BDD\u5DF2\u5EFA\u7ACB'}</strong></div><button type=\"button\" onClick={() => localSession === undefined ? void startSession(companion.id) : localSession.archived ? void renewSession(localSession.id) : void openSession(localSession.id, localSession.sessionId)}>{localSession === undefined ? '\u5F00\u59CB\u5BF9\u8BDD' : localSession.archived ? '\u5F00\u59CB\u65B0\u4F1A\u8BDD' : '\u6253\u5F00\u4F1A\u8BDD'}</button></header>\n <p>{localSession ? `\u6700\u8FD1\u6D3B\u52A8\u4E8E ${relativeTime(localSession.lastMessageAt)}\uFF1B\u53E6\u6709 ${sessions.filter(item => item.kind === 'channel').length} \u4E2A\u6E20\u9053\u4F1A\u8BDD\u3002` : '\u4F19\u4F34\u4F1A\u8BDD\u6B63\u5728\u521D\u59CB\u5316\uFF0C\u7A0D\u540E\u5373\u53EF\u6253\u5F00\u3002'}</p>\n </section>\n </div>\n </div>\n}\n\nfunction IdentityEditor({ companion, count, onChanged }: { companion: CompanionView; count: number; onChanged(): Promise<void> }): JSX.Element {\n const [form, setForm] = useState(() => companionDraft(companion))\n const [saving, setSaving] = useState(false)\n const [saved, setSaved] = useState(false)\n const [error, setError] = useState<string>()\n const [confirmingRemove, setConfirmingRemove] = useState(false)\n useEffect(() => { setForm(companionDraft(companion)); setSaved(false) }, [companion.id, companion.updatedAt])\n const submit = async (event: FormEvent): Promise<void> => {\n event.preventDefault(); setSaving(true); setError(undefined)\n try { await api(`/companions/${companion.id}`, { method: 'PUT', body: JSON.stringify({ companion: form }) }); setSaved(true); await onChanged() }\n catch (reason) { setError(message(reason)) } finally { setSaving(false) }\n }\n const remove = async (): Promise<void> => {\n try { await api(`/companions/${companion.id}`, { method: 'DELETE' }); await onChanged() } catch (reason) { setError(message(reason)) }\n }\n return <form className=\"dsh-partner-form is-identity\" onSubmit={event => { void submit(event) }}>\n <Section eyebrow=\"IDENTITY\" title=\"\u5DE5\u4F5C\u8EAB\u4EFD\" detail=\"\u5B83\u4E0D\u662F\u4E00\u6B21\u5BF9\u8BDD\u7684\u63D0\u793A\u8BCD\uFF0C\u800C\u662F\u8FD9\u4E2A\u4F19\u4F34\u5728\u684C\u9762\u548C\u5FAE\u4FE1\u4E2D\u7684\u957F\u671F\u884C\u4E3A\u57FA\u7EBF\u3002\" />\n <div className=\"dsh-partner-fields two\"><Field label=\"\u540D\u5B57\"><input required maxLength={60} value={form.name} onChange={event => setForm({ ...form, name: event.target.value })} /></Field><Field label=\"\u89D2\u8272\"><input required maxLength={120} value={form.role} onChange={event => setForm({ ...form, role: event.target.value })} /></Field></div>\n <Field label=\"\u4E00\u53E5\u8BDD\u5B9A\u4F4D\" hint=\"\u7528\u4E8E\u540D\u518C\u8BC6\u522B\uFF0C\u4E0D\u4F1A\u66FF\u4EE3\u5B8C\u6574\u884C\u4E3A\u51C6\u5219\u3002\"><textarea rows={2} maxLength={500} value={form.description} onChange={event => setForm({ ...form, description: event.target.value })} /></Field>\n <Field label=\"\u957F\u671F\u884C\u4E3A\u51C6\u5219\" hint=\"\u5EFA\u8BAE\u5199\u804C\u8D23\u3001\u8868\u8FBE\u65B9\u5F0F\u4E0E\u8FB9\u754C\uFF1B\u6E20\u9053\u3001\u5DE5\u5177\u548C\u6388\u6743\u7531\u7CFB\u7EDF\u5355\u72EC\u63A7\u5236\u3002\"><textarea rows={9} maxLength={12000} value={form.instructions} onChange={event => setForm({ ...form, instructions: event.target.value })} /></Field>\n {error && <p className=\"dsh-partner-inline-error\">{error}</p>}\n <div className=\"dsh-partner-form-actions\"><span>{saved && <><IconCheckOutline14 size={14} />\u5DF2\u4FDD\u5B58\uFF0C\u540E\u7EED\u5FAE\u4FE1\u6D88\u606F\u5C06\u4F7F\u7528\u65B0\u8EAB\u4EFD</>}</span><button disabled={saving}>{saving ? '\u6B63\u5728\u4FDD\u5B58\u2026' : '\u4FDD\u5B58\u8EAB\u4EFD'}</button></div>\n <div className=\"dsh-partner-identity-danger\" data-confirming={confirmingRemove}><span><strong>{confirmingRemove ? `\u786E\u8BA4\u5220\u9664\u300C${companion.name}\u300D\uFF1F` : '\u5220\u9664\u4F19\u4F34'}</strong><small>{confirmingRemove ? '\u8BE5\u4F19\u4F34\u7684\u672C\u5730\u914D\u7F6E\u4F1A\u88AB\u79FB\u9664\uFF1B\u5DF2\u6709\u6E20\u9053\u5FC5\u987B\u5148\u89E3\u7ED1\u3002' : '\u5FC5\u987B\u5148\u79FB\u9664\u5DF2\u7ED1\u5B9A\u5FAE\u4FE1\u6E20\u9053\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u628A\u8054\u7CFB\u4EBA\u8F6C\u4EA4\u7ED9\u5176\u4ED6\u4F19\u4F34\u3002'}</small></span><div>{confirmingRemove && <button type=\"button\" className=\"is-secondary\" onClick={() => setConfirmingRemove(false)}>\u53D6\u6D88</button>}<button type=\"button\" className={confirmingRemove ? 'is-danger' : ''} disabled={count <= 1} onClick={() => confirmingRemove ? void remove() : setConfirmingRemove(true)}><IconTrashOutline16 size={16} />{confirmingRemove ? '\u786E\u8BA4\u5220\u9664' : '\u5220\u9664'}</button></div></div>\n </form>\n}\n\nfunction CapabilityEditor({ companion, presets, onChanged }: { companion: CompanionView; presets: PartnerSnapshot['presets']; onChanged(): Promise<void> }): JSX.Element {\n const [form, setForm] = useState(() => companionDraft(companion))\n const [modelCatalog, setModelCatalog] = useState<ModelCatalogView>()\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string>()\n useEffect(() => setForm(companionDraft(companion)), [companion.id, companion.updatedAt])\n useEffect(() => { void api<ModelCatalogView>('/models').then(setModelCatalog).catch(reason => setError(message(reason))) }, [])\n const toggle = (capability: Capability): void => setForm(current => ({ ...current, capabilities: current.capabilities.includes(capability) ? current.capabilities.filter(item => item !== capability) : [...current.capabilities, capability] }))\n const save = async (): Promise<void> => {\n setSaving(true); setError(undefined)\n try { await api(`/companions/${companion.id}`, { method: 'PUT', body: JSON.stringify({ companion: form }) }); await onChanged() }\n catch (reason) { setError(message(reason)) } finally { setSaving(false) }\n }\n const groups: Array<{ id: string; eyebrow: string; title: string; detail: string; choices: Array<{ id: Capability; title: string; detail: string }> }> = [\n { id: 'tools', eyebrow: 'TOOLS', title: '\u5DE5\u4F5C\u5DE5\u5177', detail: '\u8FDE\u63A5\u5F53\u524D\u4F19\u4F34\u80FD\u591F\u4F7F\u7528\u7684\u4E13\u4E1A\u5DE5\u5177\u3002', choices: [\n { id: 'knowledge', title: '\u77E5\u8BC6\u5E93', detail: '\u5728\u5DF2\u6302\u8F7D\u8303\u56F4\u5185\u68C0\u7D22\u4E0E\u56DE\u5199\u77E5\u8BC6\u3002' },\n { id: 'skills', title: 'Skill', detail: '\u4F7F\u7528\u5355\u72EC\u542F\u7528\u7684 Skill \u4E0E\u5DE5\u4F5C\u6D41\u7A0B\u3002' },\n { id: 'ssh', title: 'SSH', detail: '\u5728 SSH \u63D2\u4EF6\u6388\u6743\u8FB9\u754C\u5185\u64CD\u4F5C\u4E3B\u673A\u3002' },\n { id: 'git', title: 'Git', detail: '\u9884\u7559 Git \u80FD\u529B\uFF0C\u9700\u5BF9\u5E94\u63D2\u4EF6\u5B9E\u9645\u5B89\u88C5\u3002' },\n ] },\n { id: 'coordination', eyebrow: 'COORDINATION', title: '\u534F\u4F5C\u4E0E\u81EA\u52A8\u5316', detail: '\u63A7\u5236\u4F19\u4F34\u5EFA\u7ACB\u5173\u7CFB\u548C\u81EA\u4E3B\u5B89\u6392\u5DE5\u4F5C\u7684\u6743\u9650\u3002', choices: [\n { id: 'companions', title: '\u521B\u5EFA\u4F19\u4F34', detail: '\u6309\u660E\u786E\u9700\u6C42\u521B\u5EFA\u9ED8\u8BA4\u65E0\u6743\u9650\u7684\u65B0\u4F19\u4F34\u3002' },\n { id: 'access', title: '\u4F19\u4F34\u6388\u6743', detail: '\u6309\u660E\u786E\u8981\u6C42\u914D\u7F6E\u4F19\u4F34\u4E4B\u95F4\u7684\u5355\u5411\u8BBF\u95EE\u5173\u7CFB\u3002' },\n { id: 'schedules', title: '\u5B9A\u65F6\u4EFB\u52A1', detail: '\u521B\u5EFA\u5E76\u7BA1\u7406\u7531\u81EA\u5DF1\u6267\u884C\u7684\u5468\u671F\u4EFB\u52A1\u3002' },\n ] },\n ]\n const selectedProvider = form.provider || modelCatalog?.defaultSelection.provider || ''\n const modelOptions = modelCatalog?.providers.find(item => item.id === selectedProvider)?.models ?? []\n const currentModelMissing = Boolean(form.model) && !modelOptions.some(item => item.id === form.model)\n return <div className=\"dsh-partner-form is-capabilities\"><Section eyebrow=\"COMPOSITION\" title=\"\u80FD\u529B\u7EC4\u5408\" detail=\"\u4F19\u4F34\u58F0\u660E\u610F\u56FE\u8303\u56F4\uFF1B\u771F\u6B63\u53EF\u8C03\u7528\u7684\u5DE5\u5177\u4ECD\u6765\u81EA\u6240\u9009 Agent Preset\uFF0C\u5E76\u7EE7\u7EED\u6267\u884C\u5404\u63D2\u4EF6\u6743\u9650\u3002\" />\n <div className=\"dsh-partner-runtime-fields\"><Field label=\"Agent Preset\" hint=\"\u5DE5\u5177\u3001Skill \u4E0E\u7CFB\u7EDF\u63D0\u793A\"><select value={form.presetId} onChange={event => setForm({ ...form, presetId: event.target.value })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 Preset</option>{presets.filter(item => !item.broken).map(item => <option value={item.id} key={item.id}>{item.name}</option>)}</select></Field><Field label=\"\u6A21\u578B\u63D0\u4F9B\u65B9\" hint=\"\u6765\u81EA\u5F53\u524D\u5BA2\u6237\u7AEF\"><select value={form.provider} onChange={event => setForm({ ...form, provider: event.target.value, model: '' })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 \u00B7 {modelCatalog?.defaultSelection.provider || '\u6B63\u5728\u8BFB\u53D6'}</option>{modelCatalog?.providers.map(provider => <option value={provider.id} key={provider.id}>{provider.name || provider.id}</option>)}</select></Field><Field label=\"\u6A21\u578B\" hint=\"\u968F\u63D0\u4F9B\u65B9\u8054\u52A8\"><select value={form.model} onChange={event => setForm({ ...form, model: event.target.value })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 \u00B7 {modelCatalog?.defaultSelection.model || '\u6B63\u5728\u8BFB\u53D6'}</option>{currentModelMissing && <option value={form.model}>\u5F53\u524D\u914D\u7F6E \u00B7 {form.model}</option>}{modelOptions.map(model => <option value={model.id} key={model.id}>{model.name || model.id}</option>)}</select></Field></div>\n <div className=\"dsh-partner-capability-groups\">{groups.map(group => {\n const enabled = group.choices.filter(choice => form.capabilities.includes(choice.id)).length\n return <section className=\"dsh-partner-capability-group\" key={group.id} aria-labelledby={`partner-capability-${group.id}`}><header><span><small>{group.eyebrow}</small><strong id={`partner-capability-${group.id}`}>{group.title}</strong><p>{group.detail}</p></span><em>{enabled} / {group.choices.length} \u5DF2\u542F\u7528</em></header><div className=\"dsh-partner-capabilities\">{group.choices.map(choice => {\n const active = form.capabilities.includes(choice.id)\n return <button type=\"button\" key={choice.id} className={active ? 'is-active' : ''} aria-pressed={active} onClick={() => toggle(choice.id)}><span>{active && <IconCheckOutline14 size={14} />}</span><strong>{choice.title}</strong><small>{choice.detail}</small></button>\n })}</div></section>\n })}</div>\n {form.capabilities.includes('skills') && companion.capabilities.includes('skills') && <CompanionSkillSettings companionId={companion.id} />}\n {form.capabilities.includes('skills') && !companion.capabilities.includes('skills') && <p className=\"dsh-partner-inline-note\">\u5148\u5E94\u7528\u80FD\u529B\u7EC4\u5408\uFF0C\u518D\u4E3A\u5F53\u524D\u4F19\u4F34\u9009\u62E9\u5177\u4F53 Skill\u3002</p>}\n <CompanionAccessPanel companionId={companion.id} />\n {error && <p className=\"dsh-partner-inline-error\">{error}</p>}<div className=\"dsh-partner-form-actions\"><span /><button type=\"button\" disabled={saving} onClick={() => { void save() }}>{saving ? '\u6B63\u5728\u5E94\u7528\u2026' : '\u5E94\u7528\u80FD\u529B\u7EC4\u5408'}</button></div>\n </div>\n}\n\nfunction WeixinPanel({ companion, snapshot, onChanged }: { companion: CompanionView; snapshot: PartnerSnapshot; onChanged(): Promise<void> }): JSX.Element {\n const channel = snapshot.channels.find(item => item.companionId === companion.id)\n const [login, setLogin] = useState<LoginView>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n useEffect(() => {\n if (!login || login.phase === 'confirmed' || login.phase === 'expired' || login.phase === 'error') return\n const timer = window.setInterval(() => {\n void api<{ login: LoginView; channel?: ChannelView }>(`/weixin/login/${login.id}`).then(async result => {\n setLogin(result.login)\n if (result.channel) { setLogin(undefined); await onChanged() }\n }).catch(reason => setError(message(reason)))\n }, 2_000)\n return () => clearInterval(timer)\n }, [login?.id, login?.phase, onChanged])\n const begin = async (): Promise<void> => {\n setBusy(true); setError(undefined)\n try { setLogin(await api('/weixin/login', { method: 'POST', body: JSON.stringify({ companionId: companion.id }) })) }\n catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const toggle = async (): Promise<void> => {\n if (!channel) return\n setBusy(true); setError(undefined)\n try { await api(`/channels/${channel.id}/enabled`, { method: 'POST', body: JSON.stringify({ enabled: !channel.enabled }) }); await onChanged() }\n catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const pairings = channel ? snapshot.pairings.filter(item => item.channelId === channel.id) : []\n const actPairing = async (id: string, status: 'approved' | 'blocked'): Promise<void> => {\n try { await api(`/pairings/${id}/status`, { method: 'POST', body: JSON.stringify({ status }) }); await onChanged() } catch (reason) { setError(message(reason)) }\n }\n return <div className=\"dsh-partner-form is-channel\"><Section eyebrow=\"PRIMARY CHANNEL\" title=\"\u5FAE\u4FE1\u6E20\u9053\" detail=\"\u4F7F\u7528\u5FAE\u4FE1 iLink Bot \u626B\u7801\u63A5\u5165\u3002\u6BCF\u4E2A\u673A\u5668\u4EBA\u53EA\u7ED1\u5B9A\u4E00\u4E2A\u4F19\u4F34\uFF0C\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u4FDD\u6301\u72EC\u7ACB DSH \u4F1A\u8BDD\u3002\" />\n {!channel && !login && <GlassSurface as=\"div\" interactive className=\"dsh-partner-weixin-connect\" borderRadius={15} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-weixin-mark\"><WeixinGlyph large /></div><span><strong>\u628A {companion.name} \u5E26\u5230\u5FAE\u4FE1</strong><p>\u626B\u7801\u540E\uFF0C\u673A\u5668\u4EBA\u51ED\u636E\u76F4\u63A5\u4FDD\u5B58\u8FDB DSH \u51ED\u636E\u5E93\uFF0C\u4E0D\u4F1A\u663E\u793A\u5728\u6D4F\u89C8\u5668\u6216\u666E\u901A\u914D\u7F6E\u6587\u4EF6\u4E2D\u3002</p><ul><li>\u79C1\u804A\u9996\u6B21\u8054\u7CFB\u5FC5\u987B\u5BA1\u6279</li><li>\u8054\u7CFB\u4EBA\u4E4B\u95F4\u4E0A\u4E0B\u6587\u5B8C\u5168\u9694\u79BB</li><li>\u5DE5\u5177\u6743\u9650\u4E0D\u4F1A\u56E0\u5FAE\u4FE1\u8EAB\u4EFD\u81EA\u52A8\u6269\u5927</li></ul></span><button type=\"button\" disabled={busy} onClick={() => { void begin() }}>{busy ? '\u6B63\u5728\u7533\u8BF7\u4E8C\u7EF4\u7801\u2026' : '\u626B\u7801\u8FDE\u63A5\u5FAE\u4FE1'}</button></GlassSurface>}\n {login && <GlassSurface as=\"div\" interactive className=\"dsh-partner-qr\" borderRadius={16} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-qr-code\">{login.qrContent && <QRCodeSVG value={login.qrContent} size={176} level=\"M\" />}</div><span><small>WECHAT ILINK BOT</small><strong>{login.phase === 'scanned' ? '\u5DF2\u626B\u7801\uFF0C\u8BF7\u5728\u5FAE\u4FE1\u786E\u8BA4' : login.phase === 'expired' ? '\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F' : login.phase === 'error' ? '\u8FDE\u63A5\u5931\u8D25' : '\u4F7F\u7528\u5FAE\u4FE1\u626B\u7801'}</strong><p>{login.error || (login.phase === 'scanned' ? '\u786E\u8BA4\u540E\u4F1A\u81EA\u52A8\u542F\u52A8\u6E20\u9053\uFF0C\u4E0D\u9700\u8981\u590D\u5236 Token\u3002' : '\u4E8C\u7EF4\u7801\u7EA6 5 \u5206\u949F\u6709\u6548\u3002\u6B64\u9875\u9762\u53EF\u4EE5\u5B89\u5168\u5730\u4FDD\u6301\u6253\u5F00\u3002')}</p>{(login.phase === 'expired' || login.phase === 'error') && <button type=\"button\" onClick={() => { setLogin(undefined); void begin() }}><IconRefreshOutline16 size={16} />\u91CD\u65B0\u751F\u6210</button>}</span></GlassSurface>}\n {channel && <>\n <GlassSurface as=\"div\" interactive className=\"dsh-partner-channel-card\" borderRadius={14} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-weixin-mark\"><WeixinGlyph large /></div><span><small>WECHAT CHANNEL</small><strong>{channel.name}</strong><p>{channel.accountId}</p></span><Status channel={channel} /><button type=\"button\" className=\"dsh-partner-switch\" data-on={channel.enabled} disabled={busy} aria-label={channel.enabled ? '\u505C\u7528\u5FAE\u4FE1\u6E20\u9053' : '\u542F\u7528\u5FAE\u4FE1\u6E20\u9053'} onClick={() => { void toggle() }}><i /></button></GlassSurface>\n {channel.lastError && <p className=\"dsh-partner-inline-error\">{channel.lastError}</p>}\n <div className=\"dsh-partner-pairing-heading\"><span><small>ACCESS</small><strong>\u79C1\u804A\u914D\u5BF9</strong></span><em>{pairings.filter(item => item.status === 'pending').length} \u4E2A\u5F85\u5904\u7406</em></div>\n <div className=\"dsh-partner-pairings\">{pairings.length === 0 ? <State title=\"\u8FD8\u6CA1\u6709\u8054\u7CFB\u4EBA\" detail=\"\u6709\u4EBA\u9996\u6B21\u5411\u673A\u5668\u4EBA\u53D1\u6D88\u606F\u540E\uFF0C\u914D\u5BF9\u8BF7\u6C42\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002\" compact /> : pairings.map(pairing => <article key={pairing.id}><span className={`is-${pairing.status}`}><IconUserOutline16 size={16} /></span><div><strong>{pairing.displayName}</strong><small>{pairing.status === 'pending' ? '\u7B49\u5F85\u5BA1\u6279' : pairing.status === 'approved' ? '\u5DF2\u6388\u6743\u72EC\u7ACB\u4F1A\u8BDD' : '\u5DF2\u963B\u6B62'} \u00B7 {new Date(pairing.updatedAt).toLocaleString()}</small></div>{pairing.status === 'pending' && <><button onClick={() => { void actPairing(pairing.id, 'blocked') }}>\u62D2\u7EDD</button><button className=\"is-primary\" onClick={() => { void actPairing(pairing.id, 'approved') }}>\u6279\u51C6</button></>}{pairing.status === 'approved' && <button onClick={() => { void actPairing(pairing.id, 'blocked') }}>\u64A4\u9500</button>}{pairing.status === 'blocked' && <button onClick={() => { void actPairing(pairing.id, 'approved') }}>\u91CD\u65B0\u6279\u51C6</button>}</article>)}</div>\n </>}\n {error && <p className=\"dsh-partner-inline-error\">{error}</p>}\n </div>\n}\n\nfunction MemoryPanel({ companion, snapshot, openSession, startSession, renewSession, onChanged }: { companion: CompanionView; snapshot: PartnerSnapshot; openSession(routeId: string, sessionId: string): Promise<void>; startSession(companionId: string): Promise<void>; renewSession(routeId: string): Promise<void>; onChanged(): Promise<void> }): JSX.Element {\n const sessions = snapshot.sessions.filter(item => item.companionId === companion.id).sort((left, right) => Number(right.kind === 'local') - Number(left.kind === 'local') || right.lastMessageAt - left.lastMessageAt)\n const localSession = sessions.find(item => item.kind === 'local')\n const channelSessionCount = sessions.filter(item => item.kind === 'channel').length\n const heartbeat = snapshot.heartbeatStates.find(item => item.companionId === companion.id)\n const [automation, setAutomation] = useState<AutomationView>(() => structuredClone(companion.automation))\n const [memories, setMemories] = useState<MemoryView[]>([])\n const [reflections, setReflections] = useState<DailyReflectionView[]>([])\n const [profiles, setProfiles] = useState<UserProfileSnapshotView[]>([])\n const [concernActivity, setConcernActivity] = useState<ConcernActivityView>({ concerns: [], observations: [] })\n const [newConcern, setNewConcern] = useState('')\n const [memoryRevision, setMemoryRevision] = useState(0)\n const [editing, setEditing] = useState<MemoryView>()\n const [busy, setBusy] = useState(false)\n const [notice, setNotice] = useState<string>()\n const [error, setError] = useState<string>()\n const [modelCatalog, setModelCatalog] = useState<ModelCatalogView>()\n const loadMemory = useCallback(async () => {\n const [result, activity] = await Promise.all([api<{ memories: MemoryView[]; reflections: DailyReflectionView[]; profiles: UserProfileSnapshotView[] }>(`/companions/${companion.id}/memory`), api<ConcernActivityView>(`/companions/${companion.id}/concerns`)])\n setMemories(result.memories); setReflections(result.reflections); setProfiles(result.profiles); setConcernActivity(activity); setMemoryRevision(value => value + 1)\n }, [companion.id])\n useEffect(() => { setAutomation(structuredClone(companion.automation)); void loadMemory().catch(reason => setError(message(reason))) }, [companion.id, companion.updatedAt, loadMemory])\n useEffect(() => { void api<ModelCatalogView>('/models').then(setModelCatalog).catch(reason => setError(message(reason))) }, [])\n const inheritedProvider = companion.provider || modelCatalog?.defaultSelection.provider || ''\n const selectedProvider = automation.memory.provider || inheritedProvider\n const modelOptions = modelCatalog?.providers.find(item => item.id === selectedProvider)?.models ?? []\n const save = async (): Promise<void> => {\n setBusy(true); setError(undefined); setNotice(undefined)\n try {\n await api(`/companions/${companion.id}/automation`, { method: 'PUT', body: JSON.stringify({ automation }) })\n setNotice('\u8BB0\u5FC6\u4E0E\u5FC3\u8DF3\u8BBE\u7F6E\u5DF2\u4FDD\u5B58')\n await onChanged()\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const trigger = async (concernId?: string): Promise<void> => {\n setBusy(true); setError(undefined); setNotice(undefined)\n try {\n const result = await api<{ checked: boolean; sent: boolean; reason?: string }>(`/companions/${companion.id}/heartbeat/trigger`, {\n method: 'POST', body: JSON.stringify(concernId ? { concernId } : {}),\n })\n setNotice(result.sent ? '\u5FC3\u8DF3\u5DF2\u5B8C\u6210\u5E76\u53D1\u9001\u5FAE\u4FE1\u63D0\u9192' : result.reason ?? '\u5FC3\u8DF3\u68C0\u67E5\u5B8C\u6210')\n await Promise.all([onChanged(), loadMemory()])\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const review = async (): Promise<void> => {\n setBusy(true); setError(undefined); setNotice(undefined)\n try {\n const result = await api<{ reviewed: number; failed: number; reason?: string }>(`/companions/${companion.id}/memory/review`, { method: 'POST' })\n setNotice(result.reason ?? `\u7EC8\u5BA1\u5B8C\u6210 ${result.reviewed} \u7BC7${result.failed ? `\uFF0C\u5931\u8D25 ${result.failed} \u7BC7` : ''}`); await loadMemory()\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const saveMemory = async (): Promise<void> => {\n if (!editing) return\n setBusy(true); setError(undefined)\n try {\n await api(`/companions/${companion.id}/memory/${editing.id}`, { method: 'PUT', body: JSON.stringify({ subject: editing.subject, content: editing.content }) })\n setEditing(undefined); setNotice('\u8BB0\u5FC6\u5DF2\u4FEE\u6B63'); await loadMemory()\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const deleteMemory = async (item: MemoryView): Promise<void> => {\n setBusy(true); setError(undefined)\n try { await api(`/companions/${companion.id}/memory/${item.id}`, { method: 'DELETE' }); if (editing?.id === item.id) setEditing(undefined); await loadMemory() }\n catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const addConcern = async (): Promise<void> => {\n const subject = newConcern.trim()\n if (!subject) return\n setBusy(true); setError(undefined); setNotice(undefined)\n try {\n await api(`/companions/${companion.id}/concerns`, { method: 'POST', body: JSON.stringify({ subject }) })\n setNewConcern(''); setNotice('\u4F19\u4F34\u4F1A\u7EE7\u7EED\u7559\u610F\u8FD9\u4EF6\u4E8B')\n await loadMemory()\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const actConcern = async (item: ConcernView, action: 'watch' | 'ignore' | 'prioritize' | 'resolve'): Promise<void> => {\n setBusy(true); setError(undefined); setNotice(undefined)\n try {\n await api(`/companions/${companion.id}/concerns/${encodeURIComponent(item.id)}/action`, { method: 'POST', body: JSON.stringify({ action }) })\n setNotice(action === 'ignore' ? '\u4F19\u4F34\u4E0D\u518D\u5173\u6CE8\u8FD9\u4EF6\u4E8B' : action === 'resolve' ? '\u5DF2\u6807\u8BB0\u4E3A\u89E3\u51B3' : action === 'prioritize' ? '\u5DF2\u63D0\u9AD8\u5173\u6CE8' : '\u4F1A\u7EE7\u7EED\u7559\u610F')\n await loadMemory()\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n return <div className=\"dsh-partner-form is-memory\"><Section eyebrow=\"CONTINUITY\" title=\"\u4F1A\u8BDD\u8BB0\u5FC6\" detail=\"\u4F19\u4F34\u53EF\u4EE5\u76F4\u63A5\u5728 DSH \u4E2D\u5EFA\u7ACB\u672C\u5730\u5BF9\u8BDD\uFF1B\u5FAE\u4FE1\u53EA\u662F\u53EF\u9009\u6E20\u9053\u3002\u4E0D\u540C\u8054\u7CFB\u4EBA\u4ECD\u4FDD\u6301\u72EC\u7ACB\u4E0A\u4E0B\u6587\uFF0C\u77E5\u8BC6\u5E93\u7EE7\u7EED\u7531\u77E5\u8BC6\u5E93\u63D2\u4EF6\u7BA1\u7406\u3002\" />\n <div className=\"dsh-partner-metrics\"><article><small>\u4F19\u4F34\u4F1A\u8BDD</small><strong>{sessions.length}</strong><p>{localSession ? `1 \u4E2A\u672C\u5730 \u00B7 ${channelSessionCount} \u4E2A\u6E20\u9053` : `${channelSessionCount} \u4E2A\u6E20\u9053`}</p></article><article><small>\u957F\u671F\u8BB0\u5FC6</small><strong>{memories.filter(item => item.status === 'active').length}</strong><p>{reflections.length} \u7BC7\u6BCF\u65E5\u56DE\u987E</p></article><article><small>\u6700\u8FD1\u5FC3\u8DF3</small><strong>{heartbeat?.lastCheckedAt ? relativeTime(heartbeat.lastCheckedAt) : '\u5C1A\u672A'}</strong><p>{heartbeat?.lastError ? '\u4E0A\u6B21\u6267\u884C\u5F02\u5E38' : `\u4ECA\u65E5\u53D1\u9001 ${heartbeat?.sentCount ?? 0} \u6B21`}</p></article></div>\n\n <div className=\"dsh-partner-automation-grid\"><section className=\"dsh-partner-automation\">\n <header><span><strong>\u5B66\u4E60\u4E0E\u957F\u671F\u8BB0\u5FC6</strong><small>\u6309\u8054\u7CFB\u4EBA\u5F52\u6863\u5B8C\u6574\u5BF9\u8BDD\uFF0C\u63D0\u70BC\u6BCF\u65E5\u56DE\u987E\u548C\u7ED3\u6784\u5316\u8BB0\u5FC6\uFF0C\u5E76\u5728\u76F8\u5173\u8BDD\u9898\u51FA\u73B0\u65F6\u53EC\u56DE\u3002</small></span><button type=\"button\" className=\"dsh-partner-switch\" data-on={automation.memory.enabled} aria-label=\"\u542F\u7528\u4F19\u4F34\u5B66\u4E60\" onClick={() => setAutomation(current => ({ ...current, memory: { ...current.memory, enabled: !current.memory.enabled } }))}><i /></button></header>\n <div className=\"dsh-partner-automation-fields is-memory-model\"><Field label=\"\u4FDD\u7559\u671F\u9650\"><select value={automation.memory.retentionDays} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, retentionDays: Number(event.target.value) } }))}><option value={0}>\u6C38\u4E45\u4FDD\u7559</option><option value={30}>30 \u5929</option><option value={90}>90 \u5929</option><option value={180}>180 \u5929</option><option value={365}>1 \u5E74</option><option value={1095}>3 \u5E74</option></select></Field><Field label=\"\u63D0\u70BC Provider\" hint=\"\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34\"><select value={automation.memory.provider ?? ''} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, provider: event.target.value, model: '' } }))}><option value=\"\">\u8DDF\u968F\u4F19\u4F34 \u00B7 {inheritedProvider || 'DSH \u9ED8\u8BA4'}</option>{modelCatalog?.providers.map(provider => <option value={provider.id} key={provider.id}>{provider.name || provider.id}</option>)}</select></Field><Field label=\"\u63D0\u70BC\u6A21\u578B\" hint=\"\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34\"><select value={automation.memory.model ?? ''} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, model: event.target.value } }))}><option value=\"\">\u8DDF\u968F\u4F19\u4F34 \u00B7 {companion.model || modelCatalog?.defaultSelection.model || 'DSH \u9ED8\u8BA4'}</option>{modelOptions.map(model => <option value={model.id} key={model.id}>{model.name || model.id}</option>)}</select></Field></div>\n <div className=\"dsh-partner-review-policy\"><button type=\"button\" className=\"dsh-partner-switch\" data-on={automation.memory.dailyReviewEnabled} aria-label=\"\u542F\u7528\u6BCF\u65E5\u7EC8\u5BA1\" onClick={() => setAutomation(current => ({ ...current, memory: { ...current.memory, dailyReviewEnabled: !current.memory.dailyReviewEnabled } }))}><i /></button><span><strong>\u6BCF\u65E5\u7EC8\u5BA1</strong><small>\u6B21\u65E5\u81EA\u52A8\u5408\u5E76\u91CD\u590D\u3001\u7EA0\u6B63\u504F\u5DEE\u5E76\u5EFA\u7ACB\u8BB0\u5FC6\u5173\u7CFB</small></span><label><select aria-label=\"\u6BCF\u65E5\u7EC8\u5BA1\u65F6\u95F4\" value={automation.memory.dailyReviewHour} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, dailyReviewHour: Number(event.target.value) } }))}>{Array.from({ length: 24 }, (_, hour) => <option value={hour} key={hour}>{String(hour).padStart(2, '0')}:00</option>)}</select></label><button type=\"button\" disabled={busy || reflections.length === 0} onClick={() => { void review() }}>\u7ACB\u5373\u7EC8\u5BA1</button></div>\n </section>\n\n <section className=\"dsh-partner-automation\">\n <header><span><strong>\u6301\u7EED\u611F\u77E5</strong><small>\u4F19\u4F34\u53EA\u89C2\u5BDF\u5C1A\u672A\u95ED\u73AF\u7684\u4E8B\u60C5\u662F\u5426\u51FA\u73B0\u65B0\u53D8\u5316\uFF0C\u5E76\u7531\u514B\u5236\u7684\u6253\u6270\u7B56\u7565\u51B3\u5B9A\u4F55\u65F6\u544A\u8BC9\u4F60\u3002</small></span><button type=\"button\" className=\"dsh-partner-switch\" data-on={automation.heartbeat.enabled} aria-label=\"\u542F\u7528\u4F19\u4F34\u5FC3\u8DF3\" onClick={() => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, enabled: !current.heartbeat.enabled } }))}><i /></button></header>\n <div className=\"dsh-partner-automation-fields is-heartbeat\">\n <Field label=\"\u68C0\u67E5\u95F4\u9694\"><select value={automation.heartbeat.intervalMinutes} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, intervalMinutes: Number(event.target.value) } }))}><option value={30}>30 \u5206\u949F</option><option value={60}>1 \u5C0F\u65F6</option><option value={180}>3 \u5C0F\u65F6</option><option value={360}>6 \u5C0F\u65F6</option><option value={720}>12 \u5C0F\u65F6</option><option value={1440}>24 \u5C0F\u65F6</option></select></Field>\n <Field label=\"\u514D\u6253\u6270\u5F00\u59CB\"><input type=\"number\" min={0} max={23} value={automation.heartbeat.quietStartHour} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, quietStartHour: Number(event.target.value) } }))} /></Field>\n <Field label=\"\u514D\u6253\u6270\u7ED3\u675F\"><input type=\"number\" min={0} max={23} value={automation.heartbeat.quietEndHour} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, quietEndHour: Number(event.target.value) } }))} /></Field>\n <Field label=\"\u6BCF\u65E5\u4E0A\u9650\"><select value={automation.heartbeat.dailyLimit} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, dailyLimit: Number(event.target.value) } }))}><option value={0}>\u4E0D\u9650</option><option value={1}>1 \u6B21</option><option value={2}>2 \u6B21</option><option value={3}>3 \u6B21</option><option value={5}>5 \u6B21</option><option value={8}>8 \u6B21</option></select></Field>\n </div>\n <ConcernBoard companionId={companion.id} activity={concernActivity} value={newConcern} busy={busy} onValue={setNewConcern} onAdd={() => { void addConcern() }} onCheck={item => { void trigger(item.id) }} onAct={(item, action) => { void actConcern(item, action) }} />\n {heartbeat?.lastError && <p className=\"dsh-partner-inline-error\">{heartbeat.lastError}</p>}\n <div className=\"dsh-partner-automation-actions\"><button type=\"button\" disabled={busy || sessions.length === 0} onClick={() => { void trigger() }}>\u68C0\u67E5\u5230\u671F\u9879</button><button type=\"button\" className=\"is-primary\" disabled={busy} onClick={() => { void save() }}>{busy ? '\u6B63\u5728\u5904\u7406\u2026' : '\u4FDD\u5B58\u8BBE\u7F6E'}</button></div>\n </section></div>\n\n {notice && <p className=\"dsh-partner-inline-notice\"><IconCheckOutline14 size={14} />{notice}</p>}\n {error && <p className=\"dsh-partner-inline-error\">{error}</p>}\n\n <MemoryLibrary companionId={companion.id} revision={memoryRevision} profiles={profiles} memories={memories} reflections={reflections} editing={editing} busy={busy} setEditing={setEditing} save={() => { void saveMemory() }} remove={item => { void deleteMemory(item) }} />\n\n <div className=\"dsh-partner-section-heading\"><span><small>SESSIONS</small><strong>\u4F19\u4F34\u4F1A\u8BDD</strong></span>{localSession === undefined && <button type=\"button\" onClick={() => { void startSession(companion.id) }}><IconPlusOutline16 size={14} />\u5F00\u59CB\u672C\u5730\u5BF9\u8BDD</button>}</div>\n <div className=\"dsh-partner-session-list\">{sessions.map(item => <article key={item.id} data-archived={item.archived} data-kind={item.kind}><span><IconDataOutline16 size={16} /></span><div><strong>{item.kind === 'local' ? '\u672C\u5730\u4F19\u4F34\u4F1A\u8BDD' : `\u5FAE\u4FE1\u8054\u7CFB\u4EBA \u00B7 ${item.userId.slice(-6)}`}</strong><small>{item.archived ? '\u5DF2\u5F52\u6863 \u00B7 \u957F\u671F\u8BB0\u5FC6\u4FDD\u7559' : `${item.sessionId} \u00B7 ${new Date(item.lastMessageAt).toLocaleString()}`}</small></div><button type=\"button\" className={item.archived ? 'is-primary' : undefined} onClick={() => { if (item.archived) void renewSession(item.id); else void openSession(item.id, item.sessionId) }}>{item.archived ? '\u5F00\u59CB\u65B0\u4F1A\u8BDD' : '\u6253\u5F00\u4F1A\u8BDD'}</button></article>)}{sessions.length === 0 && <State title=\"\u8FD8\u6CA1\u6709\u4F19\u4F34\u4F1A\u8BDD\" detail=\"\u65E0\u9700\u8FDE\u63A5\u5FAE\u4FE1\uFF0C\u76F4\u63A5\u5F00\u59CB\u672C\u5730\u5BF9\u8BDD\uFF1B\u4EE5\u540E\u8FDE\u63A5\u7684\u5FAE\u4FE1\u8054\u7CFB\u4EBA\u4F1A\u7EE7\u7EED\u4F7F\u7528\u5404\u81EA\u72EC\u7ACB\u7684\u6E20\u9053\u4F1A\u8BDD\u3002\" action={<button type=\"button\" onClick={() => { void startSession(companion.id) }}>\u5F00\u59CB\u5BF9\u8BDD</button>} compact />}</div>\n </div>\n}\n\nfunction ConcernBoard({ companionId, activity, value, busy, onValue, onAdd, onCheck, onAct }: {\n companionId: string; activity: ConcernActivityView; value: string; busy: boolean; onValue(value: string): void; onAdd(): void\n onCheck(item: ConcernView): void\n onAct(item: ConcernView, action: 'watch' | 'ignore' | 'prioritize' | 'resolve'): void\n}): JSX.Element {\n const visible = activity.concerns.filter(item => item.state !== 'archived')\n const active = visible.filter(item => item.state !== 'resolved')\n const resolved = visible.filter(item => item.state === 'resolved')\n const latest = new Map([...activity.observations].reverse().map(item => [item.concernId, item]))\n const [composing, setComposing] = useState(false)\n const [expandedId, setExpandedId] = useState<string>()\n const [visibleCount, setVisibleCount] = useState(5)\n const [mention, setMention] = useState<{ start: number; end: number; query: string }>()\n const [sources, setSources] = useState<ConcernSourceView[]>([])\n const [sourcesLoading, setSourcesLoading] = useState(false)\n const [sourceError, setSourceError] = useState<string>()\n const [activeSource, setActiveSource] = useState(0)\n const inputRef = useRef<HTMLInputElement>(null)\n const listboxId = useId()\n const shown = active.slice(0, visibleCount)\n const suggestionsOpen = composing && mention !== undefined\n useEffect(() => {\n if (!suggestionsOpen || mention === undefined) {\n setSources([]); setSourcesLoading(false); setSourceError(undefined); return\n }\n const controller = new AbortController()\n const timer = window.setTimeout(() => {\n setSourcesLoading(true); setSourceError(undefined)\n const params = new URLSearchParams({ q: mention.query })\n void api<{ items: ConcernSourceView[] }>(`/companions/${encodeURIComponent(companionId)}/concern-sources?${params}`).then(result => {\n if (!controller.signal.aborted) { setSources(result.items); setActiveSource(0) }\n }).catch(reason => {\n if (!controller.signal.aborted) { setSources([]); setSourceError(message(reason)) }\n }).finally(() => { if (!controller.signal.aborted) setSourcesLoading(false) })\n }, 150)\n return () => { window.clearTimeout(timer); controller.abort() }\n }, [companionId, mention?.query, suggestionsOpen])\n const submit = (event: FormEvent): void => { event.preventDefault(); onAdd(); setComposing(false); setMention(undefined) }\n const chooseSource = (source: ConcernSourceView): void => {\n if (mention === undefined) return\n const next = `${value.slice(0, mention.start)}${source.token} ${value.slice(mention.end)}`\n const cursor = mention.start + source.token.length + 1\n onValue(next); setMention(undefined); setSources([])\n window.requestAnimationFrame(() => { inputRef.current?.focus(); inputRef.current?.setSelectionRange(cursor, cursor) })\n }\n return <section className=\"dsh-partner-concern-board\" aria-labelledby=\"partner-concerns-title\">\n <header><span><strong id=\"partner-concerns-title\">\u4F19\u4F34\u5728\u610F\u7684\u4E8B <b>{active.length}</b></strong><p>\u5C1A\u672A\u95ED\u73AF\u3001\u503C\u5F97\u7EE7\u7EED\u7559\u610F\u7684\u4E8B\u60C5</p></span><button type=\"button\" aria-expanded={composing} onClick={() => setComposing(current => !current)}><IconPlusOutline16 size={14} />\u4EA4\u4EE3\u4E00\u4EF6\u4E8B</button></header>\n {composing && <form className=\"dsh-partner-concern-compose\" onSubmit={submit}><label><span>\u9700\u8981\u7559\u610F\u7684\u4E8B</span><div className=\"dsh-partner-concern-input-wrap\"><input\n ref={inputRef} autoFocus value={value} maxLength={300} placeholder=\"\u8F93\u5165 @ \u9009\u62E9\u6587\u4EF6\u6216\u77E5\u8BC6\u6587\u6863\"\n role=\"combobox\" aria-autocomplete=\"list\" aria-expanded={suggestionsOpen} aria-controls={suggestionsOpen ? listboxId : undefined}\n aria-activedescendant={suggestionsOpen && sources[activeSource] ? `${listboxId}-option-${activeSource}` : undefined}\n onChange={event => { onValue(event.target.value); setMention(activeMention(event.target.value, event.target.selectionStart ?? event.target.value.length)) }}\n onClick={event => setMention(activeMention(event.currentTarget.value, event.currentTarget.selectionStart ?? event.currentTarget.value.length))}\n onKeyDown={event => {\n if (!suggestionsOpen) return\n if (event.key === 'ArrowDown') { event.preventDefault(); setActiveSource(index => sources.length === 0 ? 0 : (index + 1) % sources.length) }\n else if (event.key === 'ArrowUp') { event.preventDefault(); setActiveSource(index => sources.length === 0 ? 0 : (index - 1 + sources.length) % sources.length) }\n else if (event.key === 'Enter' && sources[activeSource]) { event.preventDefault(); chooseSource(sources[activeSource]) }\n else if (event.key === 'Escape') { event.preventDefault(); setMention(undefined) }\n }}\n />{suggestionsOpen && <div id={listboxId} className=\"dsh-partner-concern-sources\" role=\"listbox\" aria-label=\"\u53EF\u5F15\u7528\u7684\u6587\u4EF6\u4E0E\u77E5\u8BC6\u6587\u6863\">\n {sourcesLoading ? <p role=\"status\">\u6B63\u5728\u67E5\u627E\u53EF\u5F15\u7528\u5185\u5BB9\u2026</p> : sourceError ? <p role=\"status\">\u5019\u9009\u52A0\u8F7D\u5931\u8D25\uFF1A{sourceError}</p> : sources.length === 0 ? <p role=\"status\">\u6CA1\u6709\u627E\u5230\u5339\u914D\u7684\u6587\u4EF6\u6216\u5DF2\u6302\u8F7D\u77E5\u8BC6\u6587\u6863</p> : <>\n {sources.map((source, index) => <button\n type=\"button\" role=\"option\" id={`${listboxId}-option-${index}`} key={`${source.kind}:${source.token}`}\n aria-selected={index === activeSource} data-kind={source.kind} onMouseDown={event => event.preventDefault()}\n onMouseEnter={() => setActiveSource(index)} onClick={() => chooseSource(source)}\n ><span>{source.kind === 'file' ? <IconDataOutline16 size={15} /> : <IconLinkOutline16 size={15} />}</span><strong>{source.label}</strong><small>{source.detail}</small></button>)}\n </>}\n </div>}</div><small className=\"dsh-partner-concern-compose-hint\">\u8F93\u5165 <b>@</b> \u4F1A\u5217\u51FA\u5F53\u524D\u4F1A\u8BDD\u6587\u4EF6\u548C\u5DF2\u6302\u8F7D\u7684\u77E5\u8BC6\u6587\u6863\uFF0C\u4E5F\u53EF\u4EE5\u7EE7\u7EED\u8F93\u5165\u5173\u952E\u8BCD\u7B5B\u9009\u3002</small></label><div><button type=\"button\" onClick={() => { setComposing(false); setMention(undefined); onValue('') }}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !value.trim()}>\u8BA9\u4F19\u4F34\u8BB0\u7740</button></div></form>}\n <div className=\"dsh-partner-concern-list\" role=\"list\">\n {active.length === 0 ? <p className=\"dsh-partner-concern-empty\">\u6700\u8FD1\u6CA1\u6709\u672A\u95ED\u73AF\u7684\u4E8B\u3002\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u5BF9\u4F19\u4F34\u8BF4\u201C\u8FD9\u4E2A\u5E2E\u6211\u7559\u610F\u201D\u3002</p> : shown.map(item => {\n const observation = latest.get(item.id)\n const expanded = expandedId === item.id\n const status = observation ? concernObservationStatus(observation) : item.state === 'active' ? '\u6B63\u5728\u7559\u610F' : '\u6682\u65F6\u8BB0\u7740'\n return <article key={item.id} role=\"listitem\" data-state={item.state} data-expanded={expanded}>\n <button type=\"button\" className=\"dsh-partner-concern-row\" aria-expanded={expanded} onClick={() => setExpandedId(current => current === item.id ? undefined : item.id)}>\n <span className=\"dsh-partner-concern-state\"><i />{status}</span><span className=\"dsh-partner-concern-copy\"><strong>{item.subject}</strong><small>{observation ? observation.event : item.reason}</small></span><span className=\"dsh-partner-concern-time\" title={`\u8BA1\u5212\u4E8E ${new Date(item.nextCheckAt).toLocaleString()} \u518D\u6B21\u7559\u610F`}><small>\u4E0B\u6B21\u7559\u610F</small><strong>{futureTime(item.nextCheckAt)}</strong></span><IconChevronDownOutline14 size={14} />\n </button>\n {expanded && <div className=\"dsh-partner-concern-detail\"><p>{item.reason}</p>{observation && <><blockquote>{observation.event}</blockquote><div className=\"dsh-partner-concern-decision\" data-decision={observation.decision}><strong>{concernObservationStatus(observation)}</strong><span>{observation.decisionReason || concernObservationExplanation(observation)}</span><small>\u6253\u6270\u5206\u6570 {Math.round(observation.interruptScore * 100)}{observation.notificationRuleEffect !== 'auto' && observation.notificationRuleReason ? ` \u00B7 \u77E5\u8BC6\u89C4\u5219\uFF1A${observation.notificationRuleReason}` : ''}</small></div></>}{item.resources.length > 0 && <div className=\"dsh-partner-concern-resources\">{item.resources.map(resource => <span key={`${resource.kind}:${resource.locator}`}>{resource.kind === 'file' ? '\u6587\u4EF6' : '\u77E5\u8BC6'} \u00B7 {resource.label}</span>)}</div>}<small>{item.origin === 'explicit' ? '\u4F60\u660E\u786E\u4EA4\u4EE3' : '\u4F19\u4F34\u4ECE\u5BF9\u8BDD\u4E2D\u6CE8\u610F\u5230'} \u00B7 {watchKindLabel(item.watchKind)}</small><div className=\"dsh-partner-concern-actions\" aria-label={`${item.subject} \u7684\u64CD\u4F5C`}><button type=\"button\" disabled={busy} onClick={() => onCheck(item)}>\u7ACB\u5373\u68C0\u67E5\u8FD9\u6761</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'watch')}>\u7EE7\u7EED\u7559\u610F</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'prioritize')}>\u63D0\u9AD8\u5173\u6CE8</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'resolve')}>\u5DF2\u7ECF\u89E3\u51B3</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={() => onAct(item, 'ignore')}>\u522B\u7BA1\u8FD9\u4E2A</button></div></div>}\n </article>\n })}\n </div>\n {(active.length > shown.length || visibleCount > 5) && <div className=\"dsh-partner-concern-more\">{active.length > shown.length ? <button type=\"button\" onClick={() => setVisibleCount(count => Math.min(active.length, count + 20))}>\u518D\u663E\u793A {Math.min(20, active.length - shown.length)} \u6761</button> : <button type=\"button\" onClick={() => setVisibleCount(5)}>\u6536\u8D77\u5217\u8868</button>}</div>}\n {resolved.length > 0 && <details className=\"dsh-partner-concern-resolved\"><summary>\u5DF2\u7ECF\u89E3\u51B3 <b>{resolved.length}</b></summary><div>{resolved.slice(0, 30).map(item => <article key={item.id}><span><IconCheckOutline14 size={13} /></span><strong>{item.subject}</strong><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'watch')}>\u91CD\u65B0\u7559\u610F</button></article>)}</div></details>}\n </section>\n}\n\nfunction activeMention(value: string, cursor: number): { start: number; end: number; query: string } | undefined {\n const prefix = value.slice(0, cursor)\n const start = prefix.lastIndexOf('@')\n if (start < 0 || (start > 0 && !/\\s/u.test(prefix[start - 1] ?? ''))) return undefined\n const fragment = prefix.slice(start + 1)\n if (fragment.startsWith('\u77E5\u8BC6\u5E93[')) {\n if (fragment.includes(']')) return undefined\n return { start, end: cursor, query: fragment.slice(4) }\n }\n if (fragment.startsWith('\"')) {\n if (fragment.slice(1).includes('\"')) return undefined\n return { start, end: cursor, query: fragment.slice(1) }\n }\n if (/\\s/u.test(fragment)) return undefined\n return { start, end: cursor, query: fragment }\n}\n\nfunction watchKindLabel(value: ConcernView['watchKind']): string {\n return value === 'knowledge' ? '\u77E5\u8BC6\u5E93\u53D8\u5316' : value === 'workspace' ? '\u9879\u76EE\u53D8\u5316' : value === 'web' ? '\u5916\u90E8\u53D8\u5316' : '\u6309\u4E8B\u60C5\u5224\u65AD\u6765\u6E90'\n}\n\ntype MemoryLibraryMode = 'profile' | 'memory' | 'reflection' | 'graph'\nconst MEMORY_KINDS: Array<MemoryView['kind'] | 'all'> = ['all', 'preference', 'task', 'event', 'relationship', 'emotion']\n\nfunction MemoryLibrary({ companionId, revision, profiles, memories, reflections, editing, busy, setEditing, save, remove }: {\n companionId: string; revision: number; profiles: UserProfileSnapshotView[]; memories: MemoryView[]; reflections: DailyReflectionView[]; editing: MemoryView | undefined; busy: boolean\n setEditing(value?: MemoryView): void; save(): void; remove(item: MemoryView): void\n}): JSX.Element {\n const activeMemories = useMemo(() => memories.filter(item => item.status === 'active' && item.kind !== 'profile'), [memories])\n const profileMemories = useMemo(() => memories.filter(item => item.status === 'active' && item.kind === 'profile'), [memories])\n const [mode, setMode] = useState<MemoryLibraryMode>('profile')\n const [kind, setKind] = useState<MemoryView['kind'] | 'all'>('all')\n const [query, setQuery] = useState('')\n const [selectedMemoryId, setSelectedMemoryId] = useState<string>()\n const [selectedDate, setSelectedDate] = useState<string>()\n const [graph, setGraph] = useState<MemoryGraphView>()\n const [graphLoading, setGraphLoading] = useState(false)\n const [graphError, setGraphError] = useState<string>()\n const [graphRequest, setGraphRequest] = useState(0)\n useEffect(() => {\n setGraph(undefined); setGraphError(undefined); setGraphLoading(false)\n }, [companionId, revision])\n useEffect(() => {\n if (mode !== 'graph' || graph !== undefined) return\n const controller = new AbortController()\n setGraphLoading(true); setGraphError(undefined)\n void api<MemoryGraphView>(`/companions/${companionId}/memory/graph`, { signal: controller.signal })\n .then(result => { if (!controller.signal.aborted) setGraph(result) })\n .catch(reason => { if (!controller.signal.aborted) setGraphError(message(reason)) })\n .finally(() => { if (!controller.signal.aborted) setGraphLoading(false) })\n return () => controller.abort()\n }, [companionId, graph, graphRequest, mode, revision])\n const normalized = query.trim().toLocaleLowerCase()\n const filteredMemories = useMemo(() => activeMemories.filter(item =>\n (kind === 'all' || item.kind === kind) && (!normalized || `${item.subject} ${item.content}`.toLocaleLowerCase().includes(normalized)),\n ), [activeMemories, kind, normalized])\n const filteredReflections = useMemo(() => reflections.filter(item => !normalized ||\n `${item.date} ${item.summary} ${item.events.join(' ')} ${item.openTasks.join(' ')} ${item.learnings.join(' ')}`.toLocaleLowerCase().includes(normalized),\n ), [reflections, normalized])\n const selectedMemory = filteredMemories.find(item => item.id === selectedMemoryId) ?? filteredMemories[0]\n const selectedReflection = filteredReflections.find(item => item.date === selectedDate) ?? filteredReflections[0]\n\n return <section className=\"dsh-partner-memory-library\">\n <header className=\"dsh-partner-library-header\"><span><small>MEMORY LIBRARY</small><strong>\u4F19\u4F34\u8BB0\u5FC6\u5E93</strong><p>\u67E5\u770B\u4F19\u4F34\u5982\u4F55\u4ECE\u957F\u671F\u5BF9\u8BDD\u4E2D\u8BA4\u8BC6\u4F60\uFF0C\u4EE5\u53CA\u8FD9\u4E9B\u7406\u89E3\u600E\u6837\u968F\u8BC1\u636E\u53D8\u5316\u3002</p></span><nav aria-label=\"\u8BB0\u5FC6\u5185\u5BB9\"><button type=\"button\" className={mode === 'profile' ? 'is-active' : ''} onClick={() => setMode('profile')}>\u4EBA\u7269\u753B\u50CF <b>{profiles.length}</b></button><button type=\"button\" className={mode === 'memory' ? 'is-active' : ''} onClick={() => setMode('memory')}>\u8BDD\u9898\u8BB0\u5FC6 <b>{activeMemories.length}</b></button><button type=\"button\" className={mode === 'reflection' ? 'is-active' : ''} onClick={() => setMode('reflection')}>\u6BCF\u65E5\u56DE\u987E <b>{reflections.length}</b></button><button type=\"button\" className={mode === 'graph' ? 'is-active' : ''} onClick={() => setMode('graph')}>\u5173\u7CFB\u56FE\u8C31 <b>{graph?.relations.length ?? '\u2014'}</b></button></nav></header>\n {mode !== 'profile' && <div className=\"dsh-partner-library-tools\"><label><span className=\"sr-only\">\u641C\u7D22\u8BB0\u5FC6</span><input value={query} onChange={event => setQuery(event.target.value)} placeholder={mode === 'memory' ? '\u641C\u7D22\u4E3B\u9898\u6216\u8BB0\u5FC6\u5185\u5BB9' : '\u641C\u7D22\u65E5\u671F\u3001\u603B\u7ED3\u6216\u5F85\u529E'} /></label>{mode === 'memory' && <div className=\"dsh-partner-memory-kinds\">{MEMORY_KINDS.map(value => <button type=\"button\" key={value} className={kind === value ? 'is-active' : ''} onClick={() => setKind(value)}>{value === 'all' ? '\u5168\u90E8' : memoryKind(value)}</button>)}</div>}</div>}\n {mode === 'profile' ? <ProfileLibrary profiles={profiles} memories={profileMemories} editing={editing} busy={busy} setEditing={setEditing} save={save} remove={remove} /> : mode === 'memory' ? <div className=\"dsh-partner-library-browser\">\n <div className=\"dsh-partner-library-list\" role=\"list\">{filteredMemories.length === 0 ? <State title={activeMemories.length === 0 ? '\u8FD8\u6CA1\u6709\u957F\u671F\u8BB0\u5FC6' : '\u6CA1\u6709\u5339\u914D\u7684\u8BB0\u5FC6'} detail={activeMemories.length === 0 ? '\u4F19\u4F34\u5B8C\u6210\u5BF9\u8BDD\u540E\u4F1A\u81EA\u52A8\u63D0\u70BC\u503C\u5F97\u957F\u671F\u4FDD\u7559\u7684\u4FE1\u606F\u3002' : '\u6362\u4E2A\u5173\u952E\u8BCD\u6216\u7C7B\u578B\u8BD5\u8BD5\u3002'} compact /> : filteredMemories.map(item => <button type=\"button\" role=\"listitem\" key={item.id} className={selectedMemory?.id === item.id ? 'is-active' : ''} onClick={() => { setSelectedMemoryId(item.id); setEditing(undefined) }}><span data-kind={item.kind}>{memoryKind(item.kind)}</span><strong>{item.subject}</strong><p>{item.content}</p><small>{relativeTime(item.updatedAt)}</small></button>)}</div>\n <div className=\"dsh-partner-library-detail\">{selectedMemory ? <MemoryCard item={selectedMemory} editing={editing?.id === selectedMemory.id ? editing : undefined} busy={busy} setEditing={setEditing} save={save} remove={() => remove(selectedMemory)} /> : <State title=\"\u9009\u62E9\u4E00\u6761\u8BB0\u5FC6\" detail=\"\u8BB0\u5FC6\u8BE6\u60C5\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" compact />}</div>\n </div> : mode === 'reflection' ? <div className=\"dsh-partner-library-browser\">\n <div className=\"dsh-partner-library-list is-diary\" role=\"list\">{filteredReflections.length === 0 ? <State title={reflections.length === 0 ? '\u8FD8\u6CA1\u6709\u6BCF\u65E5\u56DE\u987E' : '\u6CA1\u6709\u5339\u914D\u7684\u56DE\u987E'} detail={reflections.length === 0 ? '\u6BCF\u65E5\u56DE\u987E\u4F1A\u5728\u6BCF\u8F6E\u5B8C\u6574\u5BF9\u8BDD\u540E\u6301\u7EED\u66F4\u65B0\u3002' : '\u6362\u4E2A\u5173\u952E\u8BCD\u6216\u65E5\u671F\u8BD5\u8BD5\u3002'} compact /> : filteredReflections.map(entry => <button type=\"button\" role=\"listitem\" key={entry.date} className={selectedReflection?.date === entry.date ? 'is-active' : ''} onClick={() => setSelectedDate(entry.date)}><time>{entry.date}</time><strong>{entry.turnCount} \u8F6E\u4EA4\u6D41</strong><p>{entry.summary}</p><small>{entry.openTasks.length} \u9879\u5F85\u8DDF\u8FDB \u00B7 {entry.learnings.length} \u9879\u7406\u89E3</small></button>)}</div>\n <div className=\"dsh-partner-library-detail\">{selectedReflection ? <DailyReflectionDetail entry={selectedReflection} /> : <State title=\"\u9009\u62E9\u4E00\u5929\" detail=\"\u5F53\u5929\u7684\u603B\u7ED3\u4E0E\u5F85\u529E\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" compact />}</div>\n </div> : graphError ? <State title=\"\u5173\u7CFB\u56FE\u8C31\u52A0\u8F7D\u5931\u8D25\" detail={graphError} action={<button type=\"button\" onClick={() => setGraphRequest(value => value + 1)}>\u91CD\u65B0\u52A0\u8F7D</button>} /> : graphLoading || graph === undefined ? <State title=\"\u6B63\u5728\u52A0\u8F7D\u5173\u7CFB\u56FE\u8C31\" detail=\"\u53EA\u5728\u9700\u8981\u67E5\u770B\u5173\u7CFB\u65F6\u8BFB\u53D6\u5BA1\u8BA1\u6570\u636E\u3002\" /> : <MemoryGraph graph={graph} profiles={profiles} query={normalized} inspect={item => { setEditing(undefined); if (item.kind === 'profile') setMode('profile'); else { setSelectedMemoryId(item.id); setMode('memory') } }} />}\n </section>\n}\n\nfunction ProfileLibrary({ profiles, memories, editing, busy, setEditing, save, remove }: {\n profiles: UserProfileSnapshotView[]; memories: MemoryView[]; editing: MemoryView | undefined; busy: boolean\n setEditing(value?: MemoryView): void; save(): void; remove(item: MemoryView): void\n}): JSX.Element {\n const [selectedScopeId, setSelectedScopeId] = useState<string>()\n const selected = profiles.find(item => item.scopeId === selectedScopeId) ?? profiles[0]\n if (!selected) return <State title=\"\u8FD8\u6CA1\u6709\u8054\u7CFB\u4EBA\u753B\u50CF\" detail=\"\u8054\u7CFB\u4EBA\u5F00\u59CB\u548C\u4F19\u4F34\u4EA4\u6D41\u540E\uFF0C\u8FD9\u91CC\u4F1A\u9010\u6B65\u5C55\u793A\u4F19\u4F34\u4ECE\u660E\u786E\u5BF9\u8BDD\u4E2D\u5F62\u6210\u7684\u957F\u671F\u7406\u89E3\u3002\" />\n const activeIds = new Set(selected.entries.map(item => item.id))\n const pending = memories.filter(item => item.scopeId === selected.scopeId && !activeIds.has(item.id))\n return <div className=\"dsh-partner-profile-browser\">\n <div className=\"dsh-partner-profile-people\" role=\"list\" aria-label=\"\u8054\u7CFB\u4EBA\u753B\u50CF\">\n {profiles.map(profile => <button type=\"button\" role=\"listitem\" key={profile.scopeId} className={profile.scopeId === selected.scopeId ? 'is-active' : ''} onClick={() => { setSelectedScopeId(profile.scopeId); setEditing(undefined) }}>\n <span><IconUserOutline16 size={16} /></span><div><strong>{profile.label}</strong><small>{profile.entries.length > 0 ? `${profile.entries.length} \u9879\u7A33\u5B9A\u7406\u89E3` : '\u8FD8\u5728\u8BA4\u8BC6\u4E2D'}</small></div><i aria-hidden=\"true\" />\n </button>)}\n </div>\n <div className=\"dsh-partner-profile-stage\">\n <header className=\"dsh-partner-profile-heading\"><span><small>PARTNER UNDERSTANDING</small><strong>\u4F19\u4F34\u773C\u4E2D\u7684 {selected.label}</strong><p>\u8FD9\u4E9B\u5185\u5BB9\u6765\u81EA\u4F60\u5728\u5BF9\u8BDD\u4E2D\u7684\u660E\u786E\u8868\u8FBE\u3002\u4F19\u4F34\u4F1A\u7528\u5B83\u4FDD\u6301\u7406\u89E3\u8FDE\u7EED\uFF0C\u4F46\u4E0D\u4F1A\u628A\u753B\u50CF\u5F53\u6210\u6807\u7B7E\u53CD\u590D\u590D\u8FF0\u3002</p></span><div data-ready={selected.entries.length > 0}><i />{selected.entries.length > 0 ? '\u4E0A\u4E0B\u6587\u57FA\u7EBF\u5DF2\u5C31\u7EEA' : '\u7B49\u5F85\u53EF\u9760\u8BC1\u636E'}</div></header>\n {selected.entries.length > 0 ? <>\n <div className=\"dsh-partner-profile-meta\"><span><small>\u753B\u50CF\u7248\u672C</small><strong>{selected.version}</strong></span><span><small>\u5BF9\u8BDD\u4F9D\u636E</small><strong>{selected.evidenceCount} \u5904</strong></span><span><small>\u7528\u6237\u786E\u8BA4</small><strong>{selected.lockedCount} \u9879</strong></span><span><small>\u6700\u8FD1\u4F9D\u636E</small><strong>{selected.updatedAt ? relativeTime(selected.updatedAt) : '\u5C1A\u672A'}</strong></span></div>\n <div className=\"dsh-partner-profile-entries\">{selected.entries.map(item => <MemoryCard key={item.id} item={item} editing={editing?.id === item.id ? editing : undefined} busy={busy} setEditing={setEditing} save={save} remove={() => remove(item)} />)}</div>\n </> : <State title=\"\u4F19\u4F34\u8FD8\u5728\u8BA4\u8BC6\u4F60\" detail=\"\u53EA\u6709\u660E\u786E\u3001\u7A33\u5B9A\u5E76\u8FBE\u5230\u53EF\u9760\u6807\u51C6\u7684\u957F\u671F\u4FE1\u606F\u624D\u4F1A\u8FDB\u5165\u753B\u50CF\uFF1B\u666E\u901A\u504F\u597D\u3001\u4E34\u65F6\u4EFB\u52A1\u548C\u4E00\u6B21\u6027\u60C5\u7EEA\u4E0D\u4F1A\u653E\u5728\u8FD9\u91CC\u3002\" compact />}\n {pending.length > 0 && <details className=\"dsh-partner-profile-pending\"><summary>\u5F85\u786E\u8BA4\u7684\u7406\u89E3 <b>{pending.length}</b></summary><div>{pending.map(item => <MemoryCard key={item.id} item={item} editing={editing?.id === item.id ? editing : undefined} busy={busy} setEditing={setEditing} save={save} remove={() => remove(item)} />)}</div></details>}\n </div>\n </div>\n}\n\ntype RelationFilter = MemoryRelationView['kind'] | 'all'\nconst RELATION_FILTERS: RelationFilter[] = ['all', 'conflicts_with', 'depends_on', 'supports', 'follows', 'about']\n\nfunction MemoryGraph({ graph, profiles, query, inspect }: { graph: MemoryGraphView; profiles: UserProfileSnapshotView[]; query: string; inspect(item: MemoryView): void }): JSX.Element {\n const byId = new Map(graph.memories.map(item => [item.id, item]))\n const scopeIds = [...new Set(graph.relations.map(item => item.scopeId))]\n const [requestedScopeId, setRequestedScopeId] = useState<string>()\n const scopeId = scopeIds.includes(requestedScopeId ?? '') ? requestedScopeId! : scopeIds[0]\n const [filter, setFilter] = useState<RelationFilter>('all')\n const scoped = graph.relations.filter(item => item.scopeId === scopeId)\n const visible = scoped.filter(item => {\n if (filter !== 'all' && item.kind !== filter) return false\n const source = byId.get(item.sourceMemoryId); const target = byId.get(item.targetMemoryId)\n return !query || `${source?.subject ?? ''} ${source?.content ?? ''} ${target?.subject ?? ''} ${target?.content ?? ''} ${item.label}`.toLocaleLowerCase().includes(query)\n }).sort((left, right) => Number(right.kind === 'conflicts_with') - Number(left.kind === 'conflicts_with') || right.confidence - left.confidence)\n const [selectedRelationId, setSelectedRelationId] = useState<string>()\n const selected = visible.find(item => item.id === selectedRelationId) ?? visible[0]\n const source = selected ? byId.get(selected.sourceMemoryId) : undefined\n const target = selected ? byId.get(selected.targetMemoryId) : undefined\n const label = profiles.find(item => item.scopeId === scopeId)?.label ?? (scopeId ? `\u8054\u7CFB\u4EBA ${scopeId.slice(-6)}` : '\u5F53\u524D\u8054\u7CFB\u4EBA')\n const conflictCount = scoped.filter(item => item.kind === 'conflicts_with').length\n if (graph.relations.length === 0) return <State title=\"\u8FD8\u6CA1\u6709\u53EF\u9760\u5173\u7CFB\" detail=\"\u6BCF\u65E5\u7EC8\u5BA1\u53EA\u4F1A\u4FDD\u5B58\u6709\u660E\u786E\u8BC1\u636E\u7684\u8BB0\u5FC6\u8054\u7CFB\uFF0C\u4E0D\u4F1A\u4E3A\u4E86\u586B\u6EE1\u56FE\u8C31\u800C\u731C\u6D4B\u3002\" />\n return <div className=\"dsh-partner-graph-audit\">\n <header className=\"dsh-partner-graph-toolbar\"><span><small>\u5173\u7CFB\u5BA1\u8BA1</small><strong>{label} \u7684\u7406\u89E3\u5173\u7CFB</strong><p>{scoped.length} \u6761\u53EF\u9760\u8054\u7CFB{conflictCount > 0 ? `\uFF0C\u5176\u4E2D ${conflictCount} \u6761\u9700\u8981\u786E\u8BA4` : '\uFF0C\u6682\u65E0\u5F85\u786E\u8BA4\u51B2\u7A81'}</p></span>{scopeIds.length > 1 && <label><span>\u8054\u7CFB\u4EBA</span><select value={scopeId} onChange={event => { setRequestedScopeId(event.target.value); setSelectedRelationId(undefined) }}>{scopeIds.map(value => <option value={value} key={value}>{profiles.find(item => item.scopeId === value)?.label ?? `\u8054\u7CFB\u4EBA ${value.slice(-6)}`}</option>)}</select></label>}</header>\n <nav className=\"dsh-partner-graph-filters\" aria-label=\"\u5173\u7CFB\u7C7B\u578B\">{RELATION_FILTERS.map(value => { const count = value === 'all' ? scoped.length : scoped.filter(item => item.kind === value).length; return <button type=\"button\" key={value} className={filter === value ? 'is-active' : ''} aria-pressed={filter === value} onClick={() => { setFilter(value); setSelectedRelationId(undefined) }}>{value === 'all' ? '\u5168\u90E8' : relationLabel(value)} <b>{count}</b></button> })}</nav>\n <div className=\"dsh-partner-graph-browser\"><div className=\"dsh-partner-graph-index\" role=\"list\">{visible.length === 0 ? <State title=\"\u6CA1\u6709\u5339\u914D\u7684\u5173\u7CFB\" detail=\"\u8C03\u6574\u5173\u7CFB\u7C7B\u578B\u6216\u641C\u7D22\u5173\u952E\u8BCD\u540E\u518D\u8BD5\u3002\" compact /> : visible.map(item => { const from = byId.get(item.sourceMemoryId); const to = byId.get(item.targetMemoryId); return <button type=\"button\" role=\"listitem\" key={item.id} data-kind={item.kind} className={selected?.id === item.id ? 'is-active' : ''} onClick={() => setSelectedRelationId(item.id)}><span>{relationLabel(item.kind)}</span><strong>{from?.subject ?? '\u5DF2\u5220\u9664\u8BB0\u5FC6'} <i aria-hidden=\"true\">\u2192</i> {to?.subject ?? '\u5DF2\u5220\u9664\u8BB0\u5FC6'}</strong><p>{item.label}</p><small>{Math.round(item.confidence * 100)}% \u53EF\u4FE1</small></button> })}</div>\n <div className=\"dsh-partner-graph-stage\">{selected && source && target ? <article data-kind={selected.kind}><header><span>{relationLabel(selected.kind)}</span><strong>{source.subject} <i aria-hidden=\"true\">\u2192</i> {target.subject}</strong><p>{selected.label}</p><small>{relationGuidance(selected.kind)}</small></header><div className=\"dsh-partner-graph-pair\"><GraphMemory item={source} side=\"\u8D77\u70B9\" inspect={inspect} /><div aria-hidden=\"true\"><i /><span>{relationLabel(selected.kind)}</span><i /></div><GraphMemory item={target} side=\"\u5173\u8054\u9879\" inspect={inspect} /></div><footer><small>\u6700\u8FD1\u7EC8\u5BA1\u4E8E {new Date(selected.updatedAt).toLocaleString()}</small><strong>\u5173\u7CFB\u7F6E\u4FE1\u5EA6 {Math.round(selected.confidence * 100)}%</strong></footer></article> : <State title=\"\u9009\u62E9\u4E00\u6761\u5173\u7CFB\" detail=\"\u5173\u7CFB\u4E24\u7AEF\u7684\u8BB0\u5FC6\u4E0E\u4F7F\u7528\u65B9\u5F0F\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" compact />}</div>\n </div>\n </div>\n}\n\nfunction GraphMemory({ item, side, inspect }: { item: MemoryView; side: string; inspect(item: MemoryView): void }): JSX.Element {\n return <section><header><small>{side} \u00B7 {memoryKind(item.kind)}</small><strong>{item.subject}</strong></header><p>{item.content}</p><button type=\"button\" onClick={() => inspect(item)}>\u67E5\u770B\u5E76\u4FEE\u6B63</button></section>\n}\n\nfunction relationLabel(kind: MemoryRelationView['kind']): string { return ({ supports: '\u652F\u6301', depends_on: '\u4F9D\u8D56', about: '\u5173\u4E8E', conflicts_with: '\u51B2\u7A81', follows: '\u540E\u7EED' })[kind] }\nfunction relationGuidance(kind: MemoryRelationView['kind']): string {\n return ({\n supports: '\u56DE\u7B54\u6D89\u53CA\u76EE\u6807\u8BB0\u5FC6\u65F6\uFF0C\u53EF\u628A\u8D77\u70B9\u4F5C\u4E3A\u660E\u786E\u652F\u6301\u4F9D\u636E\uFF0C\u4F46\u4E0D\u80FD\u636E\u6B64\u8865\u5199\u65B0\u4E8B\u5B9E\u3002',\n depends_on: '\u5904\u7406\u8D77\u70B9\u4E8B\u9879\u65F6\uFF0C\u5E94\u540C\u65F6\u68C0\u67E5\u5173\u8054\u9879\u662F\u5426\u6210\u7ACB\u6216\u5DF2\u7ECF\u5B8C\u6210\u3002',\n about: '\u4E24\u6761\u8BB0\u5FC6\u5C5E\u4E8E\u540C\u4E00\u4E0A\u4E0B\u6587\uFF0C\u53EC\u56DE\u5176\u4E2D\u4E00\u6761\u65F6\u53EF\u4EE5\u8865\u5145\u53E6\u4E00\u6761\u5E2E\u52A9\u7406\u89E3\u3002',\n conflicts_with: '\u4E24\u6761\u7406\u89E3\u6682\u65F6\u4E0D\u80FD\u540C\u65F6\u4F5C\u4E3A\u4E8B\u5B9E\uFF1B\u4F19\u4F34\u5E94\u5728\u76F8\u5173\u8BDD\u9898\u51FA\u73B0\u65F6\u6307\u51FA\u5DEE\u5F02\u5E76\u8BF7\u6C42\u786E\u8BA4\u3002',\n follows: '\u5B83\u4EEC\u5B58\u5728\u660E\u786E\u5148\u540E\u5173\u7CFB\uFF0C\u540E\u7EED\u5224\u65AD\u9700\u8981\u4FDD\u7559\u8FD9\u4E2A\u987A\u5E8F\u3002',\n })[kind]\n}\n\nfunction DailyReflectionDetail({ entry }: { entry: DailyReflectionView }): JSX.Element {\n return <article className=\"dsh-partner-diary-detail\"><header><time>{entry.date}</time><strong>{entry.turnCount} \u8F6E\u4EA4\u6D41\u540E\u7684\u7406\u89E3</strong><small>\u66F4\u65B0\u4E8E {new Date(entry.updatedAt).toLocaleString()}</small></header><p>{entry.summary}</p><ReflectionGroup title=\"\u5F85\u8DDF\u8FDB\" items={entry.openTasks} /><ReflectionGroup title=\"\u5F53\u5929\u4E8B\u4EF6\" items={entry.events} /><ReflectionGroup title=\"\u65B0\u7406\u89E3\" items={entry.learnings} /><ReflectionGroup title=\"\u5DF2\u5B8C\u6210\" items={entry.completedTasks} /></article>\n}\n\nfunction ReflectionGroup({ title, items }: { title: string; items: string[] }): JSX.Element | null {\n if (items.length === 0) return null\n return <section><strong>{title}</strong><ul>{items.map(item => <li key={item}>{item}</li>)}</ul></section>\n}\n\nfunction MemoryCard({ item, editing, busy, setEditing, save, remove }: { item: MemoryView; editing: MemoryView | undefined; busy: boolean; setEditing(value?: MemoryView): void; save(): void; remove(): void }): JSX.Element {\n const [confirmingRemove, setConfirmingRemove] = useState(false)\n return <article data-kind={item.kind}>{editing ? <div className=\"dsh-partner-memory-editor\">\n <input aria-label=\"\u8BB0\u5FC6\u4E3B\u9898\" value={editing.subject} onChange={event => setEditing({ ...editing, subject: event.target.value })} />\n <textarea aria-label=\"\u8BB0\u5FC6\u5185\u5BB9\" value={editing.content} onChange={event => setEditing({ ...editing, content: event.target.value })} />\n <footer><button type=\"button\" onClick={() => setEditing(undefined)}>\u53D6\u6D88</button><button type=\"button\" className=\"is-primary\" disabled={busy || !editing.subject.trim() || !editing.content.trim()} onClick={save}>\u4FDD\u5B58\u4FEE\u6B63</button></footer>\n </div> : <>\n <header><span>{memoryKind(item.kind)}</span><div>{confirmingRemove ? <><button type=\"button\" onClick={() => setConfirmingRemove(false)}>\u53D6\u6D88</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={remove}>\u786E\u8BA4\u5220\u9664</button></> : <><button type=\"button\" onClick={() => setEditing({ ...item })}>\u7F16\u8F91</button><button type=\"button\" onClick={() => setConfirmingRemove(true)}>\u5220\u9664</button></>}</div></header>\n <strong>{item.subject}</strong><p>{item.content}</p>\n <footer><progress max={1} value={item.confidence} aria-label={`\u7F6E\u4FE1\u5EA6 ${Math.round(item.confidence * 100)}%`} /><small>{item.locked ? '\u624B\u52A8\u786E\u8BA4' : `${Math.round(item.confidence * 100)}% \u53EF\u4FE1`} \u00B7 {relativeTime(item.updatedAt)}</small></footer>\n {item.evidence.length > 0 && <details className=\"dsh-partner-memory-evidence\"><summary>\u67E5\u770B\u5BF9\u8BDD\u4F9D\u636E <b>{item.evidence.length}</b></summary><div>{[...item.evidence].reverse().map(evidence => <blockquote key={`${evidence.turnId}:${evidence.at}`}><p>{evidence.excerpt}</p><time>{new Date(evidence.at).toLocaleString()}</time></blockquote>)}</div></details>}\n </>}</article>\n}\n\nfunction companionDraft(companion: CompanionView): { name: string; role: string; description: string; instructions: string; presetId: string; provider: string; model: string; capabilities: Capability[] } { return { name: companion.name, role: companion.role, description: companion.description, instructions: companion.instructions, presetId: companion.presetId ?? '', provider: companion.provider ?? '', model: companion.model ?? '', capabilities: [...companion.capabilities] } }\nfunction concernObservationStatus(item: ConcernObservationView): string {\n if (item.decision === 'notify') return item.mentionedAt === undefined ? '\u5F85\u63D0\u9192' : '\u5DF2\u63D0\u9192'\n if (item.decision === 'feed') return '\u4F19\u4F34\u52A8\u6001'\n if (item.decision === 'defer') return item.mentionedAt === undefined ? '\u5F85\u987A\u5E26\u63D0' : '\u5DF2\u987A\u5E26\u63D0'\n return '\u9759\u9ED8\u8BB0\u4E0B'\n}\nfunction concernObservationExplanation(item: ConcernObservationView): string {\n if (item.decision === 'notify') return item.mentionedAt === undefined ? '\u8FBE\u5230\u4E3B\u52A8\u63D0\u9192\u6761\u4EF6\uFF0C\u7B49\u5F85\u6E20\u9053\u6295\u9012' : '\u5DF2\u7ECF\u901A\u8FC7\u6279\u51C6\u7684\u6E20\u9053\u4E3B\u52A8\u63D0\u9192'\n if (item.decision === 'feed') return '\u53EA\u663E\u793A\u5728\u4F19\u4F34\u52A8\u6001\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u8F6C\u6210\u4E3B\u52A8\u63D0\u9192'\n if (item.decision === 'defer') return item.mentionedAt === undefined ? '\u4E0B\u6B21\u51FA\u73B0\u76F8\u5173\u5BF9\u8BDD\u65F6\u987A\u5E26\u63D0\u53CA' : '\u5DF2\u7ECF\u5728\u76F8\u5173\u5BF9\u8BDD\u4E2D\u987A\u5E26\u63D0\u53CA'\n return '\u4EC5\u4FDD\u7559\u4E3A\u89C2\u5BDF\u8BB0\u5F55\uFF0C\u4E0D\u6253\u6270\u4F60'\n}\nfunction memoryKind(value: MemoryView['kind']): string { return ({ profile: '\u753B\u50CF', preference: '\u504F\u597D', task: '\u4EFB\u52A1', event: '\u4E8B\u4EF6', relationship: '\u5173\u7CFB', emotion: '\u60C5\u7EEA\u4FE1\u53F7' })[value] }\nfunction installStyles(): () => void { let style = document.getElementById(STYLE_ID) as HTMLStyleElement | null; if (!style) { style = document.createElement('style'); style.id = STYLE_ID; style.textContent = cssText; document.head.append(style) } return () => style?.remove() }\n", "const WORKSPACE_ACTIVATE_EVENT = '@lemoncat7/dsh-plugin-ui/workspace-activate'\n\ninterface WorkspaceActivateDetail {\n pluginId: string\n}\n\n/** Claim the conversation workspace while remaining compatible with installed plugin versions. */\nexport function activatePluginWorkspace(pluginId: string): void {\n window.dispatchEvent(new CustomEvent<WorkspaceActivateDetail>(WORKSPACE_ACTIVATE_EVENT, {\n detail: { pluginId },\n }))\n}\n\n/** Close this workspace when another plugin claims the conversation area. */\nexport function observePluginWorkspace(pluginId: string, close: () => void): () => void {\n const onActivate = (event: Event): void => {\n const detail = (event as CustomEvent<WorkspaceActivateDetail>).detail\n if (detail?.pluginId !== pluginId) close()\n }\n window.addEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n return () => window.removeEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n}\n", "var __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\n\n// src/index.tsx\nimport React from \"react\";\n\n// src/third-party/qrcodegen/index.ts\n/**\n * @license QR Code generator library (TypeScript)\n * Copyright (c) Project Nayuki.\n * SPDX-License-Identifier: MIT\n */\nvar qrcodegen;\n((qrcodegen2) => {\n const _QrCode = class _QrCode {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code with the given version number,\n // error correction level, data codeword bytes, and mask number.\n // This is a low-level API that most users should not use directly.\n // A mid-level API is the encodeSegments() function.\n constructor(version, errorCorrectionLevel, dataCodewords, msk) {\n this.version = version;\n this.errorCorrectionLevel = errorCorrectionLevel;\n // The modules of this QR Code (false = light, true = dark).\n // Immutable after constructor finishes. Accessed through getModule().\n this.modules = [];\n // Indicates function modules that are not subjected to masking. Discarded when constructor finishes.\n this.isFunction = [];\n if (version < _QrCode.MIN_VERSION || version > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version value out of range\");\n if (msk < -1 || msk > 7)\n throw new RangeError(\"Mask value out of range\");\n this.size = version * 4 + 17;\n let row = [];\n for (let i = 0; i < this.size; i++)\n row.push(false);\n for (let i = 0; i < this.size; i++) {\n this.modules.push(row.slice());\n this.isFunction.push(row.slice());\n }\n this.drawFunctionPatterns();\n const allCodewords = this.addEccAndInterleave(dataCodewords);\n this.drawCodewords(allCodewords);\n if (msk == -1) {\n let minPenalty = 1e9;\n for (let i = 0; i < 8; i++) {\n this.applyMask(i);\n this.drawFormatBits(i);\n const penalty = this.getPenaltyScore();\n if (penalty < minPenalty) {\n msk = i;\n minPenalty = penalty;\n }\n this.applyMask(i);\n }\n }\n assert(0 <= msk && msk <= 7);\n this.mask = msk;\n this.applyMask(msk);\n this.drawFormatBits(msk);\n this.isFunction = [];\n }\n /*-- Static factory functions (high level) --*/\n // Returns a QR Code representing the given Unicode text string at the given error correction level.\n // As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer\n // Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible\n // QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the\n // ecl argument if it can be done without increasing the version.\n static encodeText(text, ecl) {\n const segs = qrcodegen2.QrSegment.makeSegments(text);\n return _QrCode.encodeSegments(segs, ecl);\n }\n // Returns a QR Code representing the given binary data at the given error correction level.\n // This function always encodes using the binary segment mode, not any text mode. The maximum number of\n // bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.\n // The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.\n static encodeBinary(data, ecl) {\n const seg = qrcodegen2.QrSegment.makeBytes(data);\n return _QrCode.encodeSegments([seg], ecl);\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a QR Code representing the given segments with the given encoding parameters.\n // The smallest possible QR Code version within the given range is automatically\n // chosen for the output. Iff boostEcl is true, then the ECC level of the result\n // may be higher than the ecl argument if it can be done without increasing the\n // version. The mask number is either between 0 to 7 (inclusive) to force that\n // mask, or -1 to automatically choose an appropriate mask (which may be slow).\n // This function allows the user to create a custom sequence of segments that switches\n // between modes (such as alphanumeric and byte) to encode text in less space.\n // This is a mid-level API; the high-level API is encodeText() and encodeBinary().\n static encodeSegments(segs, ecl, minVersion = 1, maxVersion = 40, mask = -1, boostEcl = true) {\n if (!(_QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= _QrCode.MAX_VERSION) || mask < -1 || mask > 7)\n throw new RangeError(\"Invalid value\");\n let version;\n let dataUsedBits;\n for (version = minVersion; ; version++) {\n const dataCapacityBits2 = _QrCode.getNumDataCodewords(version, ecl) * 8;\n const usedBits = QrSegment.getTotalBits(segs, version);\n if (usedBits <= dataCapacityBits2) {\n dataUsedBits = usedBits;\n break;\n }\n if (version >= maxVersion)\n throw new RangeError(\"Data too long\");\n }\n for (const newEcl of [_QrCode.Ecc.MEDIUM, _QrCode.Ecc.QUARTILE, _QrCode.Ecc.HIGH]) {\n if (boostEcl && dataUsedBits <= _QrCode.getNumDataCodewords(version, newEcl) * 8)\n ecl = newEcl;\n }\n let bb = [];\n for (const seg of segs) {\n appendBits(seg.mode.modeBits, 4, bb);\n appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);\n for (const b of seg.getData())\n bb.push(b);\n }\n assert(bb.length == dataUsedBits);\n const dataCapacityBits = _QrCode.getNumDataCodewords(version, ecl) * 8;\n assert(bb.length <= dataCapacityBits);\n appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);\n appendBits(0, (8 - bb.length % 8) % 8, bb);\n assert(bb.length % 8 == 0);\n for (let padByte = 236; bb.length < dataCapacityBits; padByte ^= 236 ^ 17)\n appendBits(padByte, 8, bb);\n let dataCodewords = [];\n while (dataCodewords.length * 8 < bb.length)\n dataCodewords.push(0);\n bb.forEach((b, i) => dataCodewords[i >>> 3] |= b << 7 - (i & 7));\n return new _QrCode(version, ecl, dataCodewords, mask);\n }\n /*-- Accessor methods --*/\n // Returns the color of the module (pixel) at the given coordinates, which is false\n // for light or true for dark. The top left corner has the coordinates (x=0, y=0).\n // If the given coordinates are out of bounds, then false (light) is returned.\n getModule(x, y) {\n return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];\n }\n // Modified to expose modules for easy access\n getModules() {\n return this.modules;\n }\n /*-- Private helper methods for constructor: Drawing function modules --*/\n // Reads this object's version field, and draws and marks all function modules.\n drawFunctionPatterns() {\n for (let i = 0; i < this.size; i++) {\n this.setFunctionModule(6, i, i % 2 == 0);\n this.setFunctionModule(i, 6, i % 2 == 0);\n }\n this.drawFinderPattern(3, 3);\n this.drawFinderPattern(this.size - 4, 3);\n this.drawFinderPattern(3, this.size - 4);\n const alignPatPos = this.getAlignmentPatternPositions();\n const numAlign = alignPatPos.length;\n for (let i = 0; i < numAlign; i++) {\n for (let j = 0; j < numAlign; j++) {\n if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))\n this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);\n }\n }\n this.drawFormatBits(0);\n this.drawVersion();\n }\n // Draws two copies of the format bits (with its own error correction code)\n // based on the given mask and this object's error correction level field.\n drawFormatBits(mask) {\n const data = this.errorCorrectionLevel.formatBits << 3 | mask;\n let rem = data;\n for (let i = 0; i < 10; i++)\n rem = rem << 1 ^ (rem >>> 9) * 1335;\n const bits = (data << 10 | rem) ^ 21522;\n assert(bits >>> 15 == 0);\n for (let i = 0; i <= 5; i++)\n this.setFunctionModule(8, i, getBit(bits, i));\n this.setFunctionModule(8, 7, getBit(bits, 6));\n this.setFunctionModule(8, 8, getBit(bits, 7));\n this.setFunctionModule(7, 8, getBit(bits, 8));\n for (let i = 9; i < 15; i++)\n this.setFunctionModule(14 - i, 8, getBit(bits, i));\n for (let i = 0; i < 8; i++)\n this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));\n for (let i = 8; i < 15; i++)\n this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));\n this.setFunctionModule(8, this.size - 8, true);\n }\n // Draws two copies of the version bits (with its own error correction code),\n // based on this object's version field, iff 7 <= version <= 40.\n drawVersion() {\n if (this.version < 7)\n return;\n let rem = this.version;\n for (let i = 0; i < 12; i++)\n rem = rem << 1 ^ (rem >>> 11) * 7973;\n const bits = this.version << 12 | rem;\n assert(bits >>> 18 == 0);\n for (let i = 0; i < 18; i++) {\n const color = getBit(bits, i);\n const a = this.size - 11 + i % 3;\n const b = Math.floor(i / 3);\n this.setFunctionModule(a, b, color);\n this.setFunctionModule(b, a, color);\n }\n }\n // Draws a 9*9 finder pattern including the border separator,\n // with the center module at (x, y). Modules can be out of bounds.\n drawFinderPattern(x, y) {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n const xx = x + dx;\n const yy = y + dy;\n if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)\n this.setFunctionModule(xx, yy, dist != 2 && dist != 4);\n }\n }\n }\n // Draws a 5*5 alignment pattern, with the center module\n // at (x, y). All modules must be in bounds.\n drawAlignmentPattern(x, y) {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++)\n this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);\n }\n }\n // Sets the color of a module and marks it as a function module.\n // Only used by the constructor. Coordinates must be in bounds.\n setFunctionModule(x, y, isDark) {\n this.modules[y][x] = isDark;\n this.isFunction[y][x] = true;\n }\n /*-- Private helper methods for constructor: Codewords and masking --*/\n // Returns a new byte string representing the given data with the appropriate error correction\n // codewords appended to it, based on this object's version and error correction level.\n addEccAndInterleave(data) {\n const ver = this.version;\n const ecl = this.errorCorrectionLevel;\n if (data.length != _QrCode.getNumDataCodewords(ver, ecl))\n throw new RangeError(\"Invalid argument\");\n const numBlocks = _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n const blockEccLen = _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];\n const rawCodewords = Math.floor(_QrCode.getNumRawDataModules(ver) / 8);\n const numShortBlocks = numBlocks - rawCodewords % numBlocks;\n const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n let blocks = [];\n const rsDiv = _QrCode.reedSolomonComputeDivisor(blockEccLen);\n for (let i = 0, k = 0; i < numBlocks; i++) {\n let dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));\n k += dat.length;\n const ecc = _QrCode.reedSolomonComputeRemainder(dat, rsDiv);\n if (i < numShortBlocks)\n dat.push(0);\n blocks.push(dat.concat(ecc));\n }\n let result = [];\n for (let i = 0; i < blocks[0].length; i++) {\n blocks.forEach((block, j) => {\n if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)\n result.push(block[i]);\n });\n }\n assert(result.length == rawCodewords);\n return result;\n }\n // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire\n // data area of this QR Code. Function modules need to be marked off before this is called.\n drawCodewords(data) {\n if (data.length != Math.floor(_QrCode.getNumRawDataModules(this.version) / 8))\n throw new RangeError(\"Invalid argument\");\n let i = 0;\n for (let right = this.size - 1; right >= 1; right -= 2) {\n if (right == 6)\n right = 5;\n for (let vert = 0; vert < this.size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const upward = (right + 1 & 2) == 0;\n const y = upward ? this.size - 1 - vert : vert;\n if (!this.isFunction[y][x] && i < data.length * 8) {\n this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));\n i++;\n }\n }\n }\n }\n assert(i == data.length * 8);\n }\n // XORs the codeword modules in this QR Code with the given mask pattern.\n // The function modules must be marked and the codeword bits must be drawn\n // before masking. Due to the arithmetic of XOR, calling applyMask() with\n // the same mask value a second time will undo the mask. A final well-formed\n // QR Code needs exactly one (not zero, two, etc.) mask applied.\n applyMask(mask) {\n if (mask < 0 || mask > 7)\n throw new RangeError(\"Mask value out of range\");\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n let invert;\n switch (mask) {\n case 0:\n invert = (x + y) % 2 == 0;\n break;\n case 1:\n invert = y % 2 == 0;\n break;\n case 2:\n invert = x % 3 == 0;\n break;\n case 3:\n invert = (x + y) % 3 == 0;\n break;\n case 4:\n invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;\n break;\n case 5:\n invert = x * y % 2 + x * y % 3 == 0;\n break;\n case 6:\n invert = (x * y % 2 + x * y % 3) % 2 == 0;\n break;\n case 7:\n invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\n break;\n default:\n throw new Error(\"Unreachable\");\n }\n if (!this.isFunction[y][x] && invert)\n this.modules[y][x] = !this.modules[y][x];\n }\n }\n }\n // Calculates and returns the penalty score based on state of this QR Code's current modules.\n // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.\n getPenaltyScore() {\n let result = 0;\n for (let y = 0; y < this.size; y++) {\n let runColor = false;\n let runX = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let x = 0; x < this.size; x++) {\n if (this.modules[y][x] == runColor) {\n runX++;\n if (runX == 5)\n result += _QrCode.PENALTY_N1;\n else if (runX > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runX, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runX = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let x = 0; x < this.size; x++) {\n let runColor = false;\n let runY = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let y = 0; y < this.size; y++) {\n if (this.modules[y][x] == runColor) {\n runY++;\n if (runY == 5)\n result += _QrCode.PENALTY_N1;\n else if (runY > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runY, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runY = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let y = 0; y < this.size - 1; y++) {\n for (let x = 0; x < this.size - 1; x++) {\n const color = this.modules[y][x];\n if (color == this.modules[y][x + 1] && color == this.modules[y + 1][x] && color == this.modules[y + 1][x + 1])\n result += _QrCode.PENALTY_N2;\n }\n }\n let dark = 0;\n for (const row of this.modules)\n dark = row.reduce((sum, color) => sum + (color ? 1 : 0), dark);\n const total = this.size * this.size;\n const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;\n assert(0 <= k && k <= 9);\n result += k * _QrCode.PENALTY_N4;\n assert(0 <= result && result <= 2568888);\n return result;\n }\n /*-- Private helper functions --*/\n // Returns an ascending list of positions of alignment patterns for this version number.\n // Each position is in the range [0,177), and are used on both the x and y axes.\n // This could be implemented as lookup table of 40 variable-length lists of integers.\n getAlignmentPatternPositions() {\n if (this.version == 1)\n return [];\n else {\n const numAlign = Math.floor(this.version / 7) + 2;\n const step = this.version == 32 ? 26 : Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n let result = [6];\n for (let pos = this.size - 7; result.length < numAlign; pos -= step)\n result.splice(1, 0, pos);\n return result;\n }\n }\n // Returns the number of data bits that can be stored in a QR Code of the given version number, after\n // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.\n // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.\n static getNumRawDataModules(ver) {\n if (ver < _QrCode.MIN_VERSION || ver > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version number out of range\");\n let result = (16 * ver + 128) * ver + 64;\n if (ver >= 2) {\n const numAlign = Math.floor(ver / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (ver >= 7)\n result -= 36;\n }\n assert(208 <= result && result <= 29648);\n return result;\n }\n // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any\n // QR Code of the given version number and error correction level, with remainder bits discarded.\n // This stateless pure function could be implemented as a (40*4)-cell lookup table.\n static getNumDataCodewords(ver, ecl) {\n return Math.floor(_QrCode.getNumRawDataModules(ver) / 8) - _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n }\n // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be\n // implemented as a lookup table over all possible parameter values, instead of as an algorithm.\n static reedSolomonComputeDivisor(degree) {\n if (degree < 1 || degree > 255)\n throw new RangeError(\"Degree out of range\");\n let result = [];\n for (let i = 0; i < degree - 1; i++)\n result.push(0);\n result.push(1);\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = _QrCode.reedSolomonMultiply(result[j], root);\n if (j + 1 < result.length)\n result[j] ^= result[j + 1];\n }\n root = _QrCode.reedSolomonMultiply(root, 2);\n }\n return result;\n }\n // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.\n static reedSolomonComputeRemainder(data, divisor) {\n let result = divisor.map((_) => 0);\n for (const b of data) {\n const factor = b ^ result.shift();\n result.push(0);\n divisor.forEach((coef, i) => result[i] ^= _QrCode.reedSolomonMultiply(coef, factor));\n }\n return result;\n }\n // Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result\n // are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.\n static reedSolomonMultiply(x, y) {\n if (x >>> 8 != 0 || y >>> 8 != 0)\n throw new RangeError(\"Byte out of range\");\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = z << 1 ^ (z >>> 7) * 285;\n z ^= (y >>> i & 1) * x;\n }\n assert(z >>> 8 == 0);\n return z;\n }\n // Can only be called immediately after a light run is added, and\n // returns either 0, 1, or 2. A helper function for getPenaltyScore().\n finderPenaltyCountPatterns(runHistory) {\n const n = runHistory[1];\n assert(n <= this.size * 3);\n const core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;\n return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);\n }\n // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().\n finderPenaltyTerminateAndCount(currentRunColor, currentRunLength, runHistory) {\n if (currentRunColor) {\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n currentRunLength = 0;\n }\n currentRunLength += this.size;\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n return this.finderPenaltyCountPatterns(runHistory);\n }\n // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().\n finderPenaltyAddHistory(currentRunLength, runHistory) {\n if (runHistory[0] == 0)\n currentRunLength += this.size;\n runHistory.pop();\n runHistory.unshift(currentRunLength);\n }\n };\n /*-- Constants and tables --*/\n // The minimum version number supported in the QR Code Model 2 standard.\n _QrCode.MIN_VERSION = 1;\n // The maximum version number supported in the QR Code Model 2 standard.\n _QrCode.MAX_VERSION = 40;\n // For use in getPenaltyScore(), when evaluating which mask is best.\n _QrCode.PENALTY_N1 = 3;\n _QrCode.PENALTY_N2 = 3;\n _QrCode.PENALTY_N3 = 40;\n _QrCode.PENALTY_N4 = 10;\n _QrCode.ECC_CODEWORDS_PER_BLOCK = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Low\n [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n // Medium\n [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Quartile\n [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]\n // High\n ];\n _QrCode.NUM_ERROR_CORRECTION_BLOCKS = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n // Low\n [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n // Medium\n [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n // Quartile\n [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]\n // High\n ];\n let QrCode = _QrCode;\n qrcodegen2.QrCode = _QrCode;\n function appendBits(val, len, bb) {\n if (len < 0 || len > 31 || val >>> len != 0)\n throw new RangeError(\"Value out of range\");\n for (let i = len - 1; i >= 0; i--)\n bb.push(val >>> i & 1);\n }\n function getBit(x, i) {\n return (x >>> i & 1) != 0;\n }\n function assert(cond) {\n if (!cond)\n throw new Error(\"Assertion error\");\n }\n const _QrSegment = class _QrSegment {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code segment with the given attributes and data.\n // The character count (numChars) must agree with the mode and the bit buffer length,\n // but the constraint isn't checked. The given bit buffer is cloned and stored.\n constructor(mode, numChars, bitData) {\n this.mode = mode;\n this.numChars = numChars;\n this.bitData = bitData;\n if (numChars < 0)\n throw new RangeError(\"Invalid argument\");\n this.bitData = bitData.slice();\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a segment representing the given binary data encoded in\n // byte mode. All input byte arrays are acceptable. Any text string\n // can be converted to UTF-8 bytes and encoded as a byte mode segment.\n static makeBytes(data) {\n let bb = [];\n for (const b of data)\n appendBits(b, 8, bb);\n return new _QrSegment(_QrSegment.Mode.BYTE, data.length, bb);\n }\n // Returns a segment representing the given string of decimal digits encoded in numeric mode.\n static makeNumeric(digits) {\n if (!_QrSegment.isNumeric(digits))\n throw new RangeError(\"String contains non-numeric characters\");\n let bb = [];\n for (let i = 0; i < digits.length; ) {\n const n = Math.min(digits.length - i, 3);\n appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb);\n i += n;\n }\n return new _QrSegment(_QrSegment.Mode.NUMERIC, digits.length, bb);\n }\n // Returns a segment representing the given text string encoded in alphanumeric mode.\n // The characters allowed are: 0 to 9, A to Z (uppercase only), space,\n // dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static makeAlphanumeric(text) {\n if (!_QrSegment.isAlphanumeric(text))\n throw new RangeError(\"String contains unencodable characters in alphanumeric mode\");\n let bb = [];\n let i;\n for (i = 0; i + 2 <= text.length; i += 2) {\n let temp = _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;\n temp += _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));\n appendBits(temp, 11, bb);\n }\n if (i < text.length)\n appendBits(_QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);\n return new _QrSegment(_QrSegment.Mode.ALPHANUMERIC, text.length, bb);\n }\n // Returns a new mutable list of zero or more segments to represent the given Unicode text string.\n // The result may use various segment modes and switch modes to optimize the length of the bit stream.\n static makeSegments(text) {\n if (text == \"\")\n return [];\n else if (_QrSegment.isNumeric(text))\n return [_QrSegment.makeNumeric(text)];\n else if (_QrSegment.isAlphanumeric(text))\n return [_QrSegment.makeAlphanumeric(text)];\n else\n return [_QrSegment.makeBytes(_QrSegment.toUtf8ByteArray(text))];\n }\n // Returns a segment representing an Extended Channel Interpretation\n // (ECI) designator with the given assignment value.\n static makeEci(assignVal) {\n let bb = [];\n if (assignVal < 0)\n throw new RangeError(\"ECI assignment value out of range\");\n else if (assignVal < 1 << 7)\n appendBits(assignVal, 8, bb);\n else if (assignVal < 1 << 14) {\n appendBits(2, 2, bb);\n appendBits(assignVal, 14, bb);\n } else if (assignVal < 1e6) {\n appendBits(6, 3, bb);\n appendBits(assignVal, 21, bb);\n } else\n throw new RangeError(\"ECI assignment value out of range\");\n return new _QrSegment(_QrSegment.Mode.ECI, 0, bb);\n }\n // Tests whether the given string can be encoded as a segment in numeric mode.\n // A string is encodable iff each character is in the range 0 to 9.\n static isNumeric(text) {\n return _QrSegment.NUMERIC_REGEX.test(text);\n }\n // Tests whether the given string can be encoded as a segment in alphanumeric mode.\n // A string is encodable iff each character is in the following set: 0 to 9, A to Z\n // (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static isAlphanumeric(text) {\n return _QrSegment.ALPHANUMERIC_REGEX.test(text);\n }\n /*-- Methods --*/\n // Returns a new copy of the data bits of this segment.\n getData() {\n return this.bitData.slice();\n }\n // (Package-private) Calculates and returns the number of bits needed to encode the given segments at\n // the given version. The result is infinity if a segment has too many characters to fit its length field.\n static getTotalBits(segs, version) {\n let result = 0;\n for (const seg of segs) {\n const ccbits = seg.mode.numCharCountBits(version);\n if (seg.numChars >= 1 << ccbits)\n return Infinity;\n result += 4 + ccbits + seg.bitData.length;\n }\n return result;\n }\n // Returns a new array of bytes representing the given string encoded in UTF-8.\n static toUtf8ByteArray(str) {\n str = encodeURI(str);\n let result = [];\n for (let i = 0; i < str.length; i++) {\n if (str.charAt(i) != \"%\")\n result.push(str.charCodeAt(i));\n else {\n result.push(parseInt(str.substring(i + 1, i + 3), 16));\n i += 2;\n }\n }\n return result;\n }\n };\n /*-- Constants --*/\n // Describes precisely all strings that are encodable in numeric mode.\n _QrSegment.NUMERIC_REGEX = /^[0-9]*$/;\n // Describes precisely all strings that are encodable in alphanumeric mode.\n _QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\\/:-]*$/;\n // The set of all legal characters in alphanumeric mode,\n // where each character value maps to the index in the string.\n _QrSegment.ALPHANUMERIC_CHARSET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:\";\n let QrSegment = _QrSegment;\n qrcodegen2.QrSegment = _QrSegment;\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrCode;\n ((QrCode2) => {\n const _Ecc = class _Ecc {\n // The QR Code can tolerate about 30% erroneous codewords\n /*-- Constructor and fields --*/\n constructor(ordinal, formatBits) {\n this.ordinal = ordinal;\n this.formatBits = formatBits;\n }\n };\n /*-- Constants --*/\n _Ecc.LOW = new _Ecc(0, 1);\n // The QR Code can tolerate about 7% erroneous codewords\n _Ecc.MEDIUM = new _Ecc(1, 0);\n // The QR Code can tolerate about 15% erroneous codewords\n _Ecc.QUARTILE = new _Ecc(2, 3);\n // The QR Code can tolerate about 25% erroneous codewords\n _Ecc.HIGH = new _Ecc(3, 2);\n let Ecc = _Ecc;\n QrCode2.Ecc = _Ecc;\n })(QrCode = qrcodegen2.QrCode || (qrcodegen2.QrCode = {}));\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrSegment;\n ((QrSegment2) => {\n const _Mode = class _Mode {\n /*-- Constructor and fields --*/\n constructor(modeBits, numBitsCharCount) {\n this.modeBits = modeBits;\n this.numBitsCharCount = numBitsCharCount;\n }\n /*-- Method --*/\n // (Package-private) Returns the bit width of the character count field for a segment in\n // this mode in a QR Code at the given version number. The result is in the range [0, 16].\n numCharCountBits(ver) {\n return this.numBitsCharCount[Math.floor((ver + 7) / 17)];\n }\n };\n /*-- Constants --*/\n _Mode.NUMERIC = new _Mode(1, [10, 12, 14]);\n _Mode.ALPHANUMERIC = new _Mode(2, [9, 11, 13]);\n _Mode.BYTE = new _Mode(4, [8, 16, 16]);\n _Mode.KANJI = new _Mode(8, [8, 10, 12]);\n _Mode.ECI = new _Mode(7, [0, 0, 0]);\n let Mode = _Mode;\n QrSegment2.Mode = _Mode;\n })(QrSegment = qrcodegen2.QrSegment || (qrcodegen2.QrSegment = {}));\n})(qrcodegen || (qrcodegen = {}));\nvar qrcodegen_default = qrcodegen;\n\n// src/index.tsx\n/**\n * @license qrcode.react\n * Copyright (c) Paul O'Shannessy\n * SPDX-License-Identifier: ISC\n */\nvar ERROR_LEVEL_MAP = {\n L: qrcodegen_default.QrCode.Ecc.LOW,\n M: qrcodegen_default.QrCode.Ecc.MEDIUM,\n Q: qrcodegen_default.QrCode.Ecc.QUARTILE,\n H: qrcodegen_default.QrCode.Ecc.HIGH\n};\nvar DEFAULT_SIZE = 128;\nvar DEFAULT_LEVEL = \"L\";\nvar DEFAULT_BGCOLOR = \"#FFFFFF\";\nvar DEFAULT_FGCOLOR = \"#000000\";\nvar DEFAULT_INCLUDEMARGIN = false;\nvar DEFAULT_MINVERSION = 1;\nvar SPEC_MARGIN_SIZE = 4;\nvar DEFAULT_MARGIN_SIZE = 0;\nvar DEFAULT_IMG_SCALE = 0.1;\nfunction generatePath(modules, margin = 0) {\n const ops = [];\n modules.forEach(function(row, y) {\n let start = null;\n row.forEach(function(cell, x) {\n if (!cell && start !== null) {\n ops.push(\n `M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`\n );\n start = null;\n return;\n }\n if (x === row.length - 1) {\n if (!cell) {\n return;\n }\n if (start === null) {\n ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);\n } else {\n ops.push(\n `M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`\n );\n }\n return;\n }\n if (cell && start === null) {\n start = x;\n }\n });\n });\n return ops.join(\"\");\n}\nfunction excavateModules(modules, excavation) {\n return modules.slice().map((row, y) => {\n if (y < excavation.y || y >= excavation.y + excavation.h) {\n return row;\n }\n return row.map((cell, x) => {\n if (x < excavation.x || x >= excavation.x + excavation.w) {\n return cell;\n }\n return false;\n });\n });\n}\nfunction getImageSettings(cells, size, margin, imageSettings) {\n if (imageSettings == null) {\n return null;\n }\n const numCells = cells.length + margin * 2;\n const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);\n const scale = numCells / size;\n const w = (imageSettings.width || defaultSize) * scale;\n const h = (imageSettings.height || defaultSize) * scale;\n const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;\n const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;\n const opacity = imageSettings.opacity == null ? 1 : imageSettings.opacity;\n let excavation = null;\n if (imageSettings.excavate) {\n let floorX = Math.floor(x);\n let floorY = Math.floor(y);\n let ceilW = Math.ceil(w + x - floorX);\n let ceilH = Math.ceil(h + y - floorY);\n excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };\n }\n const crossOrigin = imageSettings.crossOrigin;\n return { x, y, h, w, excavation, opacity, crossOrigin };\n}\nfunction getMarginSize(includeMargin, marginSize) {\n if (marginSize != null) {\n return Math.max(Math.floor(marginSize), 0);\n }\n return includeMargin ? SPEC_MARGIN_SIZE : DEFAULT_MARGIN_SIZE;\n}\nfunction useQRCode({\n value,\n level,\n minVersion,\n includeMargin,\n marginSize,\n imageSettings,\n size,\n boostLevel\n}) {\n let qrcode = React.useMemo(() => {\n const values = Array.isArray(value) ? value : [value];\n const segments = values.reduce((accum, v) => {\n accum.push(...qrcodegen_default.QrSegment.makeSegments(v));\n return accum;\n }, []);\n return qrcodegen_default.QrCode.encodeSegments(\n segments,\n ERROR_LEVEL_MAP[level],\n minVersion,\n void 0,\n void 0,\n boostLevel\n );\n }, [value, level, minVersion, boostLevel]);\n const { cells, margin, numCells, calculatedImageSettings } = React.useMemo(() => {\n let cells2 = qrcode.getModules();\n const margin2 = getMarginSize(includeMargin, marginSize);\n const numCells2 = cells2.length + margin2 * 2;\n const calculatedImageSettings2 = getImageSettings(\n cells2,\n size,\n margin2,\n imageSettings\n );\n return {\n cells: cells2,\n margin: margin2,\n numCells: numCells2,\n calculatedImageSettings: calculatedImageSettings2\n };\n }, [qrcode, size, imageSettings, includeMargin, marginSize]);\n return {\n qrcode,\n margin,\n cells,\n numCells,\n calculatedImageSettings\n };\n}\nvar SUPPORTS_PATH2D = function() {\n try {\n new Path2D().addPath(new Path2D());\n } catch (e) {\n return false;\n }\n return true;\n}();\nvar QRCodeCanvas = React.forwardRef(\n function QRCodeCanvas2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n marginSize,\n imageSettings\n } = _a, extraProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const _b = extraProps, { style } = _b, otherProps = __objRest(_b, [\"style\"]);\n const imgSrc = imageSettings == null ? void 0 : imageSettings.src;\n const _canvas = React.useRef(null);\n const _image = React.useRef(null);\n const setCanvasRef = React.useCallback(\n (node) => {\n _canvas.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef]\n );\n const [isImgLoaded, setIsImageLoaded] = React.useState(false);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n React.useEffect(() => {\n if (_canvas.current != null) {\n const canvas = _canvas.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n let cellsToDraw = cells;\n const image = _image.current;\n const haveImageToRender = calculatedImageSettings != null && image !== null && image.complete && image.naturalHeight !== 0 && image.naturalWidth !== 0;\n if (haveImageToRender) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n }\n const pixelRatio = window.devicePixelRatio || 1;\n canvas.height = canvas.width = size * pixelRatio;\n const scale = size / numCells * pixelRatio;\n ctx.scale(scale, scale);\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, numCells, numCells);\n ctx.fillStyle = fgColor;\n if (SUPPORTS_PATH2D) {\n ctx.fill(new Path2D(generatePath(cellsToDraw, margin)));\n } else {\n cells.forEach(function(row, rdx) {\n row.forEach(function(cell, cdx) {\n if (cell) {\n ctx.fillRect(cdx + margin, rdx + margin, 1, 1);\n }\n });\n });\n }\n if (calculatedImageSettings) {\n ctx.globalAlpha = calculatedImageSettings.opacity;\n }\n if (haveImageToRender) {\n ctx.drawImage(\n image,\n calculatedImageSettings.x + margin,\n calculatedImageSettings.y + margin,\n calculatedImageSettings.w,\n calculatedImageSettings.h\n );\n }\n }\n });\n React.useEffect(() => {\n setIsImageLoaded(false);\n }, [imgSrc]);\n const canvasStyle = __spreadValues({ height: size, width: size }, style);\n let img = null;\n if (imgSrc != null) {\n img = /* @__PURE__ */ React.createElement(\n \"img\",\n {\n src: imgSrc,\n key: imgSrc,\n style: { display: \"none\" },\n onLoad: () => {\n setIsImageLoaded(true);\n },\n ref: _image,\n crossOrigin: calculatedImageSettings == null ? void 0 : calculatedImageSettings.crossOrigin\n }\n );\n }\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\n \"canvas\",\n __spreadValues({\n style: canvasStyle,\n height: size,\n width: size,\n ref: setCanvasRef,\n role: \"img\"\n }, otherProps)\n ), img);\n }\n);\nQRCodeCanvas.displayName = \"QRCodeCanvas\";\nvar QRCodeSVG = React.forwardRef(\n function QRCodeSVG2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n title,\n marginSize,\n imageSettings\n } = _a, otherProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"title\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n let cellsToDraw = cells;\n let image = null;\n if (imageSettings != null && calculatedImageSettings != null) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n image = /* @__PURE__ */ React.createElement(\n \"image\",\n {\n href: imageSettings.src,\n height: calculatedImageSettings.h,\n width: calculatedImageSettings.w,\n x: calculatedImageSettings.x + margin,\n y: calculatedImageSettings.y + margin,\n preserveAspectRatio: \"none\",\n opacity: calculatedImageSettings.opacity,\n crossOrigin: calculatedImageSettings.crossOrigin\n }\n );\n }\n const fgPath = generatePath(cellsToDraw, margin);\n return /* @__PURE__ */ React.createElement(\n \"svg\",\n __spreadValues({\n height: size,\n width: size,\n viewBox: `0 0 ${numCells} ${numCells}`,\n ref: forwardedRef,\n role: \"img\"\n }, otherProps),\n !!title && /* @__PURE__ */ React.createElement(\"title\", null, title),\n /* @__PURE__ */ React.createElement(\n \"path\",\n {\n fill: bgColor,\n d: `M0,0 h${numCells}v${numCells}H0z`,\n shapeRendering: \"crispEdges\"\n }\n ),\n /* @__PURE__ */ React.createElement(\"path\", { fill: fgColor, d: fgPath, shapeRendering: \"crispEdges\" }),\n image\n );\n }\n);\nQRCodeSVG.displayName = \"QRCodeSVG\";\nexport {\n QRCodeCanvas,\n QRCodeSVG\n};\n", ".dsh-partner-sidebar,\n.dsh-partner-workspace {\n color-scheme: light;\n --partner-canvas: var(--partner-solid-canvas);\n --partner-surface: rgba(246, 247, 250, .17);\n --partner-pane: rgba(255, 255, 255, .16);\n --partner-raised: rgba(255, 255, 255, .38);\n --partner-control: rgba(255, 255, 255, .27);\n --partner-card-surface: rgba(255, 255, 255, .16);\n --partner-card-highlight: rgba(255, 255, 255, .58);\n --partner-solid-canvas: #ebebeb;\n --partner-solid-panel: #f4f4f4;\n --partner-solid-raised: #fafafa;\n --partner-solid-control: #ffffff;\n --partner-dialog-veil: transparent;\n --partner-card-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 rgba(60, 60, 67, .08),\n 0 9px 24px rgba(31, 31, 35, .075),\n 0 2px 6px rgba(31, 31, 35, .04);\n --partner-text: #1d1d1f;\n --partner-text-secondary: #515154;\n --partner-text-tertiary: #747478;\n --partner-accent: #6e6e73;\n --partner-accent-strong: #2c2c2e;\n --partner-on-accent: #ffffff;\n --partner-success: #248a3d;\n --partner-weixin: #248a52;\n --partner-warning: #c93400;\n --partner-danger: #d70015;\n --partner-border: rgba(60, 60, 67, .14);\n --partner-separator: rgba(60, 60, 67, .11);\n --partner-hover: rgba(118, 118, 128, .09);\n --partner-selected: rgba(60, 60, 67, .085);\n --partner-focus-ring: rgba(60, 60, 67, .46);\n --partner-glass-clear: rgba(255, 255, 255, .11);\n --partner-glass-regular: rgba(255, 255, 255, .24);\n --partner-glass-thick: rgba(255, 255, 255, .42);\n --partner-glass-highlight: rgba(255, 255, 255, .7);\n --partner-glass-rim-shadow: rgba(60, 60, 67, .11);\n --partner-glass-filter: saturate(1.22) contrast(1.03) blur(32px);\n --partner-frosted-filter: blur(18px) saturate(.84) contrast(1.025);\n --partner-shadow-sm: 0 1px 2px rgba(0, 0, 0, .055);\n --partner-shadow-md: 0 10px 28px rgba(31, 31, 35, .085);\n --partner-shadow-lg: 0 24px 64px rgba(31, 31, 35, .14);\n --partner-glass-shadow:\n inset 0 1px 0 var(--partner-glass-highlight),\n inset 0 -1px 0 var(--partner-glass-rim-shadow),\n var(--partner-shadow-sm);\n --partner-ease-out: cubic-bezier(.22, 1, .36, 1);\n --partner-font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, \"SF Pro Text\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n --partner-font-caption: 12px;\n --partner-font-body: 13px;\n --partner-font-label: 14px;\n --partner-font-title: 18px;\n --partner-font-heading: 22px;\n --partner-font-display: clamp(24px, 2.2vw, 28px);\n color: var(--partner-text);\n font-family: var(--partner-font-family);\n font-size: var(--partner-font-body);\n line-height: 1.5;\n}\n\nbody[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace) {\n color-scheme: dark;\n --partner-canvas: var(--partner-solid-canvas);\n --partner-surface: rgba(8, 10, 12, .19);\n --partner-pane: rgba(8, 10, 12, .18);\n --partner-raised: rgba(8, 10, 12, .42);\n --partner-control: rgba(8, 10, 12, .3);\n --partner-card-surface: rgba(7, 9, 11, .22);\n --partner-card-highlight: rgba(255, 255, 255, .11);\n --partner-solid-canvas: #1c1c1e;\n --partner-solid-panel: #2c2c2e;\n --partner-solid-raised: #323235;\n --partner-solid-control: #3a3a3c;\n --partner-dialog-veil: transparent;\n --partner-card-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 rgba(0, 0, 0, .28),\n 0 12px 30px rgba(0, 0, 0, .28),\n 0 2px 7px rgba(0, 0, 0, .2);\n --partner-text: #f5f5f7;\n --partner-text-secondary: #d1d1d6;\n --partner-text-tertiary: #98989d;\n --partner-accent: #aeaeb2;\n --partner-accent-strong: #f5f5f7;\n --partner-on-accent: #1d1d1f;\n --partner-success: #30d158;\n --partner-weixin: #30c96b;\n --partner-warning: #ff9f0a;\n --partner-danger: #ff453a;\n --partner-border: rgba(255, 255, 255, .105);\n --partner-separator: rgba(255, 255, 255, .08);\n --partner-hover: rgba(255, 255, 255, .075);\n --partner-selected: rgba(255, 255, 255, .09);\n --partner-focus-ring: rgba(255, 255, 255, .52);\n --partner-glass-clear: rgba(0, 0, 0, .1);\n --partner-glass-regular: rgba(0, 0, 0, .16);\n --partner-glass-thick: rgba(0, 0, 0, .26);\n --partner-glass-highlight: rgba(255, 255, 255, .16);\n --partner-glass-rim-shadow: rgba(0, 0, 0, .3);\n --partner-shadow-sm: 0 1px 2px rgba(0, 0, 0, .28);\n --partner-shadow-md: 0 12px 32px rgba(0, 0, 0, .34);\n --partner-shadow-lg: 0 28px 72px rgba(0, 0, 0, .48);\n}\n\n.dsh-partner-sidebar,\n.dsh-partner-sidebar *,\n.dsh-partner-workspace,\n.dsh-partner-workspace * { box-sizing: border-box; }\n\n.dsh-partner-sidebar :where(button, input, textarea, select),\n.dsh-partner-workspace :where(button, input, textarea, select) {\n margin: 0;\n border-radius: 0;\n appearance: none;\n color: inherit;\n font-family: var(--partner-font-family);\n font-size: inherit;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n}\n\n.dsh-partner-sidebar :where(button, input, textarea, select):focus,\n.dsh-partner-workspace :where(button, input, textarea, select):focus { outline: none; }\n\n.dsh-partner-sidebar :where(button, input, textarea, select):focus-visible,\n.dsh-partner-workspace :where(button, input, textarea, select):focus-visible {\n outline: 2px solid var(--partner-focus-ring);\n outline-offset: 2px;\n}\n\n.dsh-partner-sidebar :where(button, input, textarea, select):disabled,\n.dsh-partner-workspace :where(button, input, textarea, select):disabled {\n opacity: .45;\n cursor: default;\n}\n\n.dsh-partner-workspace select {\n padding-right: 32px;\n background-image:\n linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position:\n calc(100% - 15px) calc(50% - 1px),\n calc(100% - 11px) calc(50% - 1px);\n background-repeat: no-repeat;\n background-size: 4px 4px, 4px 4px;\n}\n\n.dsh-partner-workspace input[type=\"number\"] { appearance: textfield; }\n.dsh-partner-workspace input[type=\"number\"]::-webkit-inner-spin-button,\n.dsh-partner-workspace input[type=\"number\"]::-webkit-outer-spin-button { margin: 0; appearance: none; }\n\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds) {\n scrollbar-width: thin;\n scrollbar-color: color-mix(in srgb, var(--partner-text) 20%, transparent) transparent;\n}\n\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar { width: 6px; height: 6px; }\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar-track { background: transparent; }\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar-thumb {\n border: 1px solid transparent;\n border-radius: 999px;\n background: color-mix(in srgb, var(--partner-text) 20%, transparent);\n background-clip: padding-box;\n}\n\n/* Skills, board and schedule modules share the partner workspace scale. */\n.dsh-partner-feature-page { display: grid; width: min(100%, 1180px); align-content: start; gap: 18px; margin: 0 auto; padding: 26px clamp(22px, 4vw, 52px) 52px; font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-feature-page.is-board { width: min(100%, 1180px); }\n.dsh-partner-feature-hero { display: flex; min-height: 86px; align-items: end; justify-content: space-between; gap: 24px; padding: 0 2px 16px 14px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-feature-hero > span { position: relative; display: grid; min-width: 0; gap: 4px; }\n.dsh-partner-feature-hero > span::before { position: absolute; top: 3px; bottom: 2px; left: -14px; width: 2px; border-radius: 2px; background: linear-gradient(var(--partner-text-secondary), transparent 92%); content: ''; }\n.dsh-partner-feature-hero small,\n.dsh-partner-capability-detail > header small { color: var(--partner-accent); font: 700 var(--partner-font-caption)/1.3 var(--partner-font-family); letter-spacing: .1em; }\n.dsh-partner-feature-hero h2 { margin: 0; color: var(--partner-text); font: 650 var(--partner-font-display)/1.18 var(--partner-font-family); letter-spacing: -.035em; }\n.dsh-partner-feature-hero p { max-width: 680px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-feature-hero > div { display: flex; align-items: end; gap: 8px; }\n.dsh-partner-feature-hero button,\n.dsh-partner-feature-block > header button,\n.dsh-partner-market-grid button,\n.dsh-partner-board button,\n.dsh-partner-schedule-list button,\n.dsh-partner-feature-form button,\n.dsh-partner-task-form button,\n.dsh-partner-schedule-form button { display: inline-flex; min-height: 36px; align-items: center; justify-content: center; gap: 6px; padding: 0 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease, transform .15s var(--partner-ease-out); }\n.dsh-partner-feature-page button:not(:disabled):hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-feature-page button:not(:disabled):active { transform: translateY(1px); }\n.dsh-partner-feature-block,\n.dsh-partner-capability-detail { display: grid; gap: 14px; padding: 18px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-capability-detail { margin: 0 0 18px; }\n.dsh-partner-feature-block > header,\n.dsh-partner-capability-detail > header { display: flex; min-height: 36px; align-items: center; justify-content: space-between; gap: 16px; }\n.dsh-partner-feature-block > header > span,\n.dsh-partner-capability-detail > header > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-feature-block > header > div { display: flex; align-items: center; justify-content: flex-end; gap: 8px; }\n.dsh-partner-capability-actions { display: flex; align-items: center; justify-content: flex-end; gap: 10px; }\n.dsh-partner-capability-actions > button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; gap: 6px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-capability-actions > button:hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-feature-block > header strong,\n.dsh-partner-capability-detail > header strong { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-feature-block > header small,\n.dsh-partner-capability-detail > header em { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-feature-empty { margin: 0; padding: 24px 16px; border: 1px dashed var(--partner-border); border-radius: 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); line-height: 1.55; text-align: center; }\n.dsh-partner-inline-warning { margin: 0; padding: 9px 11px; border-radius: 9px; color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 8%, transparent); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-error { margin: 0; padding: 10px 12px; border: 1px solid color-mix(in srgb, var(--partner-danger) 22%, transparent); border-radius: 10px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-raised)); font-size: var(--partner-font-body); line-height: 1.5; overflow-wrap: anywhere; }\n.dsh-partner-skill-installed { display: grid; gap: 8px; }\n.dsh-partner-skill-installed.is-binding { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-market-toolbar { display: grid; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 14px; background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-market-sources { display: flex; gap: 5px; overflow-x: auto; padding: 7px; border-top: 1px solid var(--partner-separator); background: color-mix(in srgb, var(--partner-control) 74%, transparent); scrollbar-width: thin; }\n.dsh-partner-market-sources > button { display: inline-flex; min-height: 34px; flex: 0 0 auto; align-items: center; gap: 7px; padding: 0 10px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-market-sources > button:hover { color: var(--partner-text-secondary); background: var(--partner-hover); }\n.dsh-partner-market-sources > button:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: -2px; }\n.dsh-partner-market-sources > button.is-active { border-color: var(--partner-separator); color: var(--partner-text); background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), 0 1px 3px color-mix(in srgb, #000 7%, transparent); }\n.dsh-partner-market-sources small { display: grid; min-width: 20px; height: 20px; place-items: center; padding: 0 5px; border-radius: 7px; color: var(--partner-text-tertiary); background: var(--partner-selected); font-size: var(--partner-font-caption); }\n.dsh-partner-skill-installed > article { display: grid; min-height: 72px; grid-template-columns: 36px minmax(0, 1fr) auto 32px; align-items: center; gap: 11px; padding: 11px 12px; border: 1px solid var(--partner-separator); border-radius: 12px; background: var(--partner-raised); }\n.dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 32px; }\n.dsh-partner-skill-installed.is-binding > article { min-height: 122px; grid-template-columns: 36px minmax(0, 1fr) auto; align-content: start; align-items: start; padding: 13px; }\n.dsh-partner-skill-installed.is-binding .dsh-partner-skill-mark { margin-top: 1px; }\n.dsh-partner-skill-installed.is-binding article > span:nth-child(2) { gap: 5px; }\n.dsh-partner-skill-installed.is-binding p { display: -webkit-box; line-height: 1.5; white-space: normal; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-skill-mark { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 11px; color: var(--partner-text-secondary); background: var(--partner-selected); }\n.dsh-partner-skill-installed article > span:nth-child(2) { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-skill-installed strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-skill-installed p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-skill-installed .dsh-partner-skill-action-error { grid-column: 2 / -1; overflow: visible; padding: 8px 10px; border-radius: 8px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, transparent); font-size: var(--partner-font-caption); line-height: 1.45; text-overflow: clip; white-space: normal; overflow-wrap: anywhere; }\n.dsh-partner-skill-installed small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-switch { position: relative; width: 38px; height: 22px; min-height: 22px !important; padding: 0 !important; border-radius: 999px !important; background: color-mix(in srgb, var(--partner-text) 9%, transparent) !important; box-shadow: none !important; }\n.dsh-partner-feature-switch i { position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: 50%; background: var(--partner-raised); box-shadow: 0 1px 3px color-mix(in srgb, #000 16%, transparent); transition: transform .18s var(--partner-ease-out); }\n.dsh-partner-feature-switch[data-on=\"true\"] { border-color: var(--partner-accent-strong) !important; background: var(--partner-accent-strong) !important; }\n.dsh-partner-feature-switch[data-on=\"true\"] i { transform: translateX(16px); }\n.dsh-partner-skill-binding-action,\n.dsh-partner-skill-picker button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-skill-binding-action:hover,\n.dsh-partner-skill-picker button:hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-skill-binding-action:disabled,\n.dsh-partner-skill-picker button:disabled { cursor: wait; opacity: .56; }\n.dsh-partner-skill-disclosure { justify-self: center; min-height: 34px; padding: 0 12px; border-color: transparent; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font-size: var(--partner-font-body); }\n.dsh-partner-skill-disclosure:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-skill-picker { display: grid; gap: 10px; padding: 12px; border: 1px solid var(--partner-border); border-radius: 13px; background: color-mix(in srgb, var(--partner-control) 72%, transparent); animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-skill-search { display: grid; min-height: 56px; grid-template-columns: 36px minmax(0, 1fr) auto auto; align-items: center; gap: 10px; padding: 9px 13px; color: var(--partner-text-tertiary); background: transparent; transition: background .15s ease, border-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-skill-search:focus-within { background: color-mix(in srgb, var(--partner-selected) 28%, transparent); box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--partner-focus-ring) 62%, transparent); }\n.dsh-partner-skill-search-icon { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-skill-search input { min-width: 0; height: 36px; padding: 0; border: 0; border-radius: 0; outline: 0; appearance: none; color: var(--partner-text); background: transparent; box-shadow: none; font: 500 var(--partner-font-label)/1.4 var(--partner-font-family); }\n.dsh-partner-skill-search input::placeholder { color: var(--partner-text-tertiary); opacity: 1; }\n.dsh-partner-skill-search input::-webkit-search-cancel-button { display: none; appearance: none; }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear { display: grid; width: 30px; min-height: 30px; place-items: center; padding: 0; border: 0; border-radius: 8px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; cursor: pointer; }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: -2px; }\n.dsh-partner-skill-search-count { min-width: 56px; padding-left: 11px; border-left: 1px solid var(--partner-separator); color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 580; line-height: 20px; text-align: right; white-space: nowrap; }\n.dsh-partner-skill-search.is-compact { min-height: 42px; grid-template-columns: 30px minmax(0, 1fr) auto auto; gap: 8px; padding: 5px 8px; border: 1px solid var(--partner-border); border-radius: 11px; background: var(--partner-raised); }\n.dsh-partner-skill-search.is-compact:focus-within { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 15%, transparent); }\n.dsh-partner-skill-search.is-compact .dsh-partner-skill-search-icon { width: 30px; height: 30px; border-radius: 8px; }\n.dsh-partner-skill-search.is-compact input { height: 30px; font-size: var(--partner-font-body); }\n.dsh-partner-skill-search.is-compact .dsh-partner-skill-search-count { min-width: 48px; padding-left: 8px; }\n.dsh-partner-skill-picker-list { display: grid; max-height: 360px; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }\n.dsh-partner-skill-picker-list > article { display: grid; min-height: 112px; grid-template-rows: minmax(0, 1fr) auto; gap: 10px; padding: 11px; border: 1px solid var(--partner-separator); border-radius: 11px; background: var(--partner-raised); }\n.dsh-partner-skill-picker-list article > span { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-skill-picker-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-skill-picker-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-skill-picker-list button { justify-self: end; }\n.dsh-partner-skill-picker-list small,\n.dsh-partner-skill-picker-limit { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-skill-picker-empty { margin: 0; padding: 20px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); text-align: center; }\n.dsh-partner-access-note { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-access-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }\n.dsh-partner-access-list > button { display: grid; min-width: 0; min-height: 92px; grid-template-columns: 36px minmax(0, 1fr) 22px; align-items: start; gap: 11px; padding: 12px; border: 1px solid var(--partner-separator); border-radius: 12px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1.5 var(--partner-font-family); text-align: left; cursor: pointer; transition: border-color .15s ease, background .15s ease, transform .15s var(--partner-ease-out); }\n.dsh-partner-access-list > button:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-access-list > button.is-active { border-color: color-mix(in srgb, var(--partner-accent) 55%, var(--partner-border)); background: color-mix(in srgb, var(--partner-selected) 74%, var(--partner-raised)); }\n.dsh-partner-access-avatar { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 12px; color: var(--partner-text); background: var(--partner-selected); font-size: var(--partner-font-caption); font-weight: 650; }\n.dsh-partner-access-copy { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-access-copy > strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-access-copy > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-access-copy > p { margin: 3px 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.5; }\n.dsh-partner-access-copy > span { display: flex; flex-wrap: wrap; gap: 5px; }\n.dsh-partner-access-copy em { padding: 2px 7px; border: 1px solid var(--partner-separator); border-radius: 999px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: var(--partner-font-caption); font-style: normal; line-height: 1.4; }\n.dsh-partner-access-check { display: grid; width: 22px; height: 22px; place-items: center; border: 1px solid var(--partner-border); border-radius: 7px; color: transparent; background: var(--partner-control); }\n.dsh-partner-access-list > button.is-active .dsh-partner-access-check { border-color: var(--partner-accent-strong); color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-feature-block .is-icon,\n.dsh-partner-board .is-icon,\n.dsh-partner-schedule-list .is-icon { width: 32px; min-height: 32px; padding: 0; border-color: transparent; background: transparent; box-shadow: none; }\n.dsh-partner-market-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 10px; }\n.dsh-partner-market-grid > article { display: flex; min-height: 164px; flex-direction: column; justify-content: space-between; gap: 14px; padding: 15px; border: 1px solid var(--partner-separator); border-radius: 13px; background: var(--partner-raised); transition: border-color .16s ease, transform .18s var(--partner-ease-out); }\n.dsh-partner-market-grid > article:hover { transform: translateY(-1px); border-color: color-mix(in srgb, var(--partner-text) 22%, var(--partner-border)); }\n.dsh-partner-market-grid article > span { display: grid; gap: 6px; }\n.dsh-partner-market-grid article > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-market-grid strong { font-size: var(--partner-font-label); }\n.dsh-partner-market-grid p { display: -webkit-box; overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; -webkit-box-orient: vertical; -webkit-line-clamp: 3; }\n.dsh-partner-market-grid .dsh-partner-market-card-error { display: block; overflow: visible; padding: 8px 10px; border-radius: 8px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, transparent); font-size: var(--partner-font-caption); line-height: 1.45; overflow-wrap: anywhere; -webkit-line-clamp: unset; }\n.dsh-partner-market-grid footer { display: flex; align-items: center; justify-content: space-between; gap: 10px; }\n.dsh-partner-market-grid footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-form,\n.dsh-partner-task-form,\n.dsh-partner-schedule-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; padding: 18px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label { display: grid; min-width: 0; gap: 8px; color: var(--partner-text-secondary); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select) { width: 100%; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease, background .15s ease; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select):focus { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), inset 0 1px 0 var(--partner-glass-highlight); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) textarea { resize: vertical; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) .is-wide { grid-column: 1 / -1; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer { display: flex; grid-column: 1 / -1; justify-content: flex-end; gap: 8px; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > p { grid-column: 1 / -1; margin: 0; padding: 9px 11px; border-radius: 9px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 6%, transparent); font-size: var(--partner-font-body); }\n.dsh-partner-feature-form > p.is-success { color: var(--partner-success); background: color-mix(in srgb, var(--partner-success) 7%, transparent); }\n.dsh-partner-board-live { display: inline-flex; min-height: 36px; align-items: center; gap: 7px; padding: 0 10px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-board-live > i { width: 7px; height: 7px; border-radius: 50%; background: var(--partner-success); box-shadow: 0 0 0 4px color-mix(in srgb, var(--partner-success) 10%, transparent); }\n.dsh-partner-board-tools { display: grid; grid-template-columns: minmax(220px, 1fr) minmax(140px, 180px) auto; align-items: center; gap: 8px; }\n.dsh-partner-board-search { position: relative; display: flex; min-width: 0; align-items: center; }\n.dsh-partner-board-search > span:not(.sr-only) { position: absolute; z-index: 1; left: 11px; display: grid; place-items: center; color: var(--partner-text-tertiary); pointer-events: none; }\n.dsh-partner-board-search > input,\n.dsh-partner-board-assignee > select { width: 100%; min-height: 38px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text); background-color: var(--partner-control); font: var(--partner-font-body)/1.4 var(--partner-font-family); transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease; }\n.dsh-partner-board-search > input { padding: 8px 38px 8px 34px; }\n.dsh-partner-board-search > input::placeholder { color: var(--partner-text-tertiary); }\n.dsh-partner-board-search > input:hover,\n.dsh-partner-board-assignee > select:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background-color: var(--partner-hover); }\n.dsh-partner-board-search > input:focus-visible,\n.dsh-partner-board-assignee > select:focus-visible { outline: 0; border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent); }\n.dsh-partner-board-search > button { position: absolute; z-index: 1; right: 4px; display: grid; width: 30px; min-height: 30px; place-items: center; padding: 0; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; }\n.dsh-partner-board-search > button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-board-assignee > select { min-width: 0; padding: 8px 30px 8px 10px; }\n.dsh-partner-board-tools > small { justify-self: end; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; white-space: nowrap; }\n.dsh-partner-board-statuses { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; padding-bottom: 2px; }\n.dsh-partner-board-statuses > button { display: inline-flex; min-height: 32px; align-items: center; gap: 7px; padding: 0 9px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font: var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; transition: border-color 140ms ease, color 140ms ease, background-color 140ms ease; }\n.dsh-partner-board-statuses > button:hover { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-board-statuses > button.is-active { border-color: color-mix(in srgb, var(--partner-text) 18%, var(--partner-border)); color: var(--partner-text); background: var(--partner-selected); }\n.dsh-partner-board-statuses b { min-width: 18px; color: inherit; font-size: inherit; font-variant-numeric: tabular-nums; font-weight: 650; text-align: center; }\n.dsh-partner-board { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr)); align-items: start; gap: 10px; min-width: 0; }\n.dsh-partner-board[data-focused=\"true\"] { grid-template-columns: minmax(0, 1fr); }\n.dsh-partner-board > section { display: grid; height: clamp(220px, 27vh, 280px); min-width: 0; grid-template-rows: auto minmax(0, 1fr); align-content: start; gap: 9px; padding: 11px 9px 9px 11px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); }\n.dsh-partner-board > section[data-empty=\"true\"] { height: 132px; }\n.dsh-partner-board[data-focused=\"true\"] > section { height: clamp(340px, 54vh, 560px); }\n.dsh-partner-board[data-focused=\"true\"] > section[data-empty=\"true\"] { height: 240px; }\n.dsh-partner-board > section > header { display: flex; min-height: 36px; align-items: center; justify-content: space-between; padding: 0 3px; }\n.dsh-partner-board > section > header strong { font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-board > section > header b { display: grid; min-width: 22px; height: 22px; place-items: center; padding: 0 5px; border-radius: 7px; color: var(--partner-text-tertiary); background: var(--partner-selected); font-size: var(--partner-font-caption); }\n.dsh-partner-board-column-list { display: grid; min-height: 0; grid-auto-rows: max-content; align-content: start; gap: 7px; overflow-y: auto; padding: 1px 3px 6px 0; overscroll-behavior: contain; scrollbar-gutter: stable; scrollbar-width: thin; }\n.dsh-partner-board > section > p { align-self: center; margin: 0 0 22px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); text-align: center; }\n.dsh-partner-task-card { position: relative; display: grid; min-height: 82px; overflow: hidden; border: 1px solid var(--partner-separator); border-radius: 11px; background: var(--partner-raised); box-shadow: var(--partner-shadow-sm); transition: border-color .16s ease, box-shadow .18s ease, transform .16s var(--partner-ease-out); }\n.dsh-partner-task-card:hover { border-color: color-mix(in srgb, var(--partner-text) 22%, var(--partner-border)); box-shadow: var(--partner-shadow-md); transform: translateY(-1px); }\n.dsh-partner-task-card:focus-within { border-color: var(--partner-focus-ring); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), var(--partner-shadow-md); }\n.dsh-partner-task-card[data-blocked=\"true\"] { border-left-color: color-mix(in srgb, var(--partner-warning) 55%, var(--partner-border)); }\n.dsh-partner-task-summary { display: grid !important; min-height: 82px !important; grid-template-columns: minmax(0, 1fr) 16px; align-items: center !important; gap: 8px !important; padding: 10px 10px 10px 11px !important; border: 0 !important; border-radius: 0 !important; appearance: none; color: var(--partner-text) !important; background: transparent !important; box-shadow: none !important; font-family: var(--partner-font-family); text-align: left; cursor: pointer; }\n.dsh-partner-task-summary:hover { background: var(--partner-hover) !important; }\n.dsh-partner-task-summary:focus-visible { outline: 0; }\n.dsh-partner-task-summary > span { display: grid; min-width: 0; gap: 4px; }\n.dsh-partner-task-card-title { display: flex; min-width: 0; align-items: flex-start; justify-content: space-between; gap: 8px; }\n.dsh-partner-task-card-title > strong { display: -webkit-box; min-width: 0; overflow: hidden; color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 620; line-height: 1.38; overflow-wrap: anywhere; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-task-card-title > em { flex: none; margin-top: 1px; padding: 2px 5px; border: 1px solid var(--partner-separator); border-radius: 6px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: 10px; font-style: normal; font-weight: 620; line-height: 1.25; }\n.dsh-partner-task-card[data-priority=\"high\"] .dsh-partner-task-card-title > em { border-color: color-mix(in srgb, var(--partner-warning) 35%, var(--partner-separator)); color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 7%, var(--partner-control)); }\n.dsh-partner-task-card[data-priority=\"urgent\"] .dsh-partner-task-card-title > em { border-color: color-mix(in srgb, var(--partner-danger) 34%, var(--partner-separator)); color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-control)); }\n.dsh-partner-task-card-owner { overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-relations { display: flex; min-width: 0; align-items: center; flex-wrap: wrap; gap: 4px; }\n.dsh-partner-task-relations > small { padding: 2px 6px; border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-selected); font-size: 10px; font-variant-numeric: tabular-nums; line-height: 1.3; }\n.dsh-partner-task-relations > small[data-blocked=\"true\"] { color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 8%, var(--partner-selected)); }\n.dsh-partner-task-summary > svg { color: var(--partner-text-tertiary); transition: transform .16s var(--partner-ease-out), color .16s ease; }\n.dsh-partner-task-summary:hover > svg { color: var(--partner-text); transform: translateX(2px); }\n.dsh-partner-task-detail { display: grid; gap: 13px; }\n.dsh-partner-task-description { display: grid; gap: 6px; padding: 12px; border: 1px solid var(--partner-separator); border-radius: 10px; background: color-mix(in srgb, var(--partner-raised) 78%, transparent); }\n.dsh-partner-task-description strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-description p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; white-space: pre-wrap; overflow-wrap: anywhere; }\n.dsh-partner-task-fields { display: grid; gap: 7px; }\n.dsh-partner-task-fields label { display: grid; grid-template-columns: 58px minmax(0, 1fr); align-items: center; gap: 8px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-detail select { width: 100%; height: 34px; padding: 0 28px 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background-color: var(--partner-control); font: var(--partner-font-body)/1 var(--partner-font-family); }\n.dsh-partner-task-detail select:focus { border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 14%, transparent); }\n.dsh-partner-task-execution { display: grid; min-height: 48px; grid-template-columns: 9px minmax(0, 1fr); align-items: start; gap: 10px; padding: 10px 11px; border: 1px solid color-mix(in srgb, var(--partner-accent) 24%, var(--partner-separator)); border-radius: 9px; background: color-mix(in srgb, var(--partner-accent) 5%, var(--partner-raised)); }\n.dsh-partner-task-execution > i { width: 7px; height: 7px; margin-top: 5px; border-radius: 50%; background: var(--partner-success); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-success) 12%, transparent); }\n.dsh-partner-task-execution[data-state=\"queued\"] > i { background: var(--partner-warning); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-warning) 12%, transparent); }\n.dsh-partner-task-execution > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-task-execution strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-execution small { overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-dependency { display: grid; gap: 7px; padding: 10px; border: 1px solid var(--partner-separator); border-radius: 9px; background: color-mix(in srgb, var(--partner-control) 64%, transparent); }\n.dsh-partner-task-dependency > header { display: grid; gap: 2px; }\n.dsh-partner-task-dependency > header strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-dependency > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.4; }\n.dsh-partner-task-dependency > div { display: grid; gap: 5px; }\n.dsh-partner-task-dependency > div > span { display: grid; min-height: 30px; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: 6px; }\n.dsh-partner-task-dependency > div i { display: grid; width: 16px; height: 16px; place-items: center; border: 1px solid var(--partner-border); border-radius: 5px; color: var(--partner-on-accent); background: var(--partner-control); font-style: normal; }\n.dsh-partner-task-dependency > div span[data-done=\"true\"] i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-dependency > div b { overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); font-weight: 560; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-dependency > div button { min-height: 26px; padding: 0 7px; border-color: transparent; background: transparent; box-shadow: none; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-result { display: grid; gap: 6px; padding: 10px; border: 1px solid var(--partner-separator); border-radius: 9px; background: color-mix(in srgb, var(--partner-raised) 78%, transparent); }\n.dsh-partner-task-result strong,\n.dsh-partner-task-activity > strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-result p { max-height: 220px; margin: 0; overflow-y: auto; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; }\n.dsh-partner-task-activity { display: grid; gap: 6px; }\n.dsh-partner-task-activity ol { display: grid; gap: 5px; margin: 0; padding: 0; list-style: none; }\n.dsh-partner-task-activity li { display: grid; gap: 2px; padding-left: 8px; border-left: 2px solid var(--partner-separator); color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-activity time { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-reject,\n.dsh-partner-task-delete-confirm { display: grid; gap: 9px; padding: 10px; border: 1px solid var(--partner-border); border-radius: 9px; background: var(--partner-control); }\n.dsh-partner-task-reject label { display: grid; gap: 6px; color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-task-reject textarea { width: 100%; min-height: 76px; resize: vertical; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-task-reject textarea:focus { border-color: var(--partner-focus-ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 15%, transparent); }\n.dsh-partner-task-reject > div,\n.dsh-partner-task-delete-confirm > div { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; }\n.dsh-partner-task-reject button,\n.dsh-partner-task-delete-confirm button { min-height: 32px; padding-inline: 10px; font-size: var(--partner-font-caption); }\n.dsh-partner-task-delete-confirm { border-color: color-mix(in srgb, var(--partner-danger) 28%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 6%, var(--partner-control)); }\n.dsh-partner-task-delete-confirm > span { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; }\n.dsh-partner-task-delete-confirm .is-danger { color: var(--partner-on-accent); border-color: var(--partner-danger); background: var(--partner-danger); }\n.dsh-partner-task-actions { display: grid; gap: 8px; padding-top: 9px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-task-actions > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-actions > span { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 5px; }\n.dsh-partner-task-actions button { min-height: 32px; padding-inline: 9px; font-size: var(--partner-font-caption); }\n.dsh-partner-task-actions button.is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-form,\n.dsh-partner-schedule-form { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-task-form .is-wide,\n.dsh-partner-schedule-form .is-wide { grid-column: 1 / -1; }\n.dsh-partner-task-form-dependencies { display: grid; gap: 8px; }\n.dsh-partner-task-form-dependencies > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-task-form-dependencies > span > small { margin-left: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 500; }\n.dsh-partner-task-form-dependencies > div { display: grid; max-height: 180px; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; overflow-y: auto; padding: 6px; border: 1px solid var(--partner-border); border-radius: 10px; background: var(--partner-control); }\n.dsh-partner-task-form-dependencies label { display: grid; min-height: 36px; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: 7px; padding: 0 7px; border-radius: 7px; color: var(--partner-text-secondary); cursor: pointer; }\n.dsh-partner-task-form-dependencies label:hover { background: var(--partner-hover); }\n.dsh-partner-task-form-dependencies input { position: absolute; width: 1px !important; min-height: 1px !important; opacity: 0; pointer-events: none; }\n.dsh-partner-task-form-dependencies label > i { display: grid; width: 18px; height: 18px; place-items: center; border: 1px solid var(--partner-border); border-radius: 5px; background: var(--partner-raised); }\n.dsh-partner-task-form-dependencies input:checked + i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-form-dependencies input:checked + i::after { width: 7px; height: 4px; border-bottom: 2px solid var(--partner-on-accent); border-left: 2px solid var(--partner-on-accent); content: ''; transform: rotate(-45deg) translateY(-1px); }\n.dsh-partner-task-form-dependencies input:focus-visible + i { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-task-form-dependencies label > span { overflow: hidden; font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-form-dependencies label > small,\n.dsh-partner-task-form-dependencies > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-form-dependencies > p { margin: 0; padding: 12px; border: 1px dashed var(--partner-border); border-radius: 10px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: var(--partner-font-body); text-align: center; }\n.dsh-partner-schedule-time { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }\n.dsh-partner-schedule-time > label { display: grid; min-width: 0; gap: 8px; }\n.dsh-partner-schedule-time > label > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-schedule-list { display: grid; gap: 8px; }\n.dsh-partner-schedule-list > article { display: grid; min-height: 76px; grid-template-columns: minmax(0, 1fr) auto auto 32px; align-items: center; gap: 11px; padding: 12px 13px; border: 1px solid var(--partner-separator); border-radius: 12px; background: var(--partner-raised); }\n.dsh-partner-schedule-list article > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-schedule-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-schedule-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-schedule-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-run-list { display: grid; gap: 3px; }\n.dsh-partner-run-list > article { display: grid; grid-template-columns: 10px minmax(0, 1fr); align-items: start; gap: 10px; padding: 10px 6px; border-bottom: 1px solid var(--partner-separator); }\n.dsh-partner-run-list article > i { width: 7px; height: 7px; margin-top: 7px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-run-list article[data-status=\"completed\"] > i { background: var(--partner-success); }\n.dsh-partner-run-list article[data-status=\"failed\"] > i,\n.dsh-partner-run-list article[data-status=\"timed-out\"] > i { background: var(--partner-danger); }\n.dsh-partner-run-list article > span { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-run-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-run-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-run-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-check { display: flex !important; min-height: 38px; align-items: center; align-self: end; gap: 8px !important; cursor: pointer; }\n.dsh-partner-check input { position: absolute; width: 1px !important; min-height: 1px !important; opacity: 0; pointer-events: none; }\n.dsh-partner-check i { display: grid; width: 20px; height: 20px; place-items: center; border: 1px solid var(--partner-border); border-radius: 6px; background: var(--partner-control); }\n.dsh-partner-check input:checked + i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-check input:checked + i::after { width: 8px; height: 4px; border-bottom: 2px solid var(--partner-on-accent); border-left: 2px solid var(--partner-on-accent); content: ''; transform: rotate(-45deg) translateY(-1px); }\n.dsh-partner-check input:focus-visible + i { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n\n@media (max-width: 820px) {\n .dsh-partner-feature-hero { align-items: start; flex-direction: column; gap: 12px; }\n .dsh-partner-feature-hero > div { width: 100%; flex-wrap: wrap; }\n .dsh-partner-board-tools { grid-template-columns: minmax(0, 1fr) minmax(130px, 168px); }\n .dsh-partner-board-tools > small { grid-column: 1 / -1; justify-self: start; }\n .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form { grid-template-columns: 1fr 1fr; }\n .dsh-partner-schedule-list > article { grid-template-columns: minmax(0, 1fr) auto 30px; }\n .dsh-partner-schedule-list > article > button:not(.is-icon):not(.dsh-partner-feature-switch) { grid-column: 1 / -1; }\n}\n\n@media (max-width: 560px) {\n .dsh-partner-feature-page { padding: 20px 14px 36px; }\n .dsh-partner-feature-block, .dsh-partner-capability-detail { padding: 14px; }\n .dsh-partner-capability-detail > header { align-items: flex-start; flex-direction: column; }\n .dsh-partner-capability-actions { width: 100%; justify-content: space-between; }\n .dsh-partner-access-list { grid-template-columns: 1fr; }\n .dsh-partner-skill-installed > article { grid-template-columns: 36px minmax(0, 1fr) auto; }\n .dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 32px; }\n .dsh-partner-skill-installed.is-binding,\n .dsh-partner-skill-picker-list { grid-template-columns: 1fr; }\n .dsh-partner-skill-installed > article > .is-icon { grid-column: 3; }\n .dsh-partner-feature-block > header { align-items: flex-start; flex-direction: column; }\n .dsh-partner-feature-block > header > div { width: 100%; flex-wrap: wrap; justify-content: flex-start; }\n .dsh-partner-board-tools { grid-template-columns: 1fr; }\n .dsh-partner-board-assignee, .dsh-partner-board-tools > small { grid-column: 1; }\n .dsh-partner-board-assignee > select { min-height: 42px; }\n .dsh-partner-board-statuses { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); }\n .dsh-partner-board-statuses > button { min-width: 0; justify-content: center; padding-inline: 6px; }\n .dsh-partner-board > section, .dsh-partner-board[data-focused=\"true\"] > section { height: min(430px, 58vh); }\n .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form { grid-template-columns: 1fr; padding: 14px; }\n :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label { grid-column: 1 !important; }\n .dsh-partner-task-form-dependencies > div { grid-template-columns: 1fr; }\n}\n\n.dsh-partner-sidebar { box-sizing: border-box; flex: none; margin: 0 8px 8px 2px; padding: 4px 0 7px; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 62%, transparent); }\n.dsh-partner-sidebar.is-rail { width: 36px; margin: 0 0 8px; padding: 0; border: 0; }\n.dsh-partner-sidebar-heading { display: flex; align-items: stretch; height: 32px; padding: 0 4px 0 5px; }\n.dsh-partner-sidebar-title { display: flex; min-width: 0; min-height: 32px; flex: 1 1 auto; align-items: center; justify-content: flex-start; gap: 5px; padding: 0 5px; border: 0; border-radius: 7px; appearance: none; color: var(--partner-text-secondary); background: transparent; font: 600 var(--partner-font-body)/1 var(--partner-font-family); text-align: left; cursor: pointer; }\n.dsh-partner-sidebar-title > span { display: grid; place-items: center; transition: transform .16s ease; }\n.dsh-partner-sidebar-title > span[data-open=\"false\"] { transform: rotate(-90deg); }\n.dsh-partner-sidebar-title:hover,\n.dsh-partner-rail:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-sidebar-list { display: grid; grid-template-rows: 0fr; opacity: 0; transition: grid-template-rows 220ms var(--partner-ease-out), opacity 150ms ease; }\n.dsh-partner-sidebar-list.is-open { grid-template-rows: 1fr; opacity: 1; }\n.dsh-partner-sidebar-list-inner { display: grid; min-height: 0; gap: 2px; overflow: hidden; padding: 2px 1px 0; }\n.dsh-partner-sidebar-row { position: relative; isolation: isolate; display: grid; grid-template-columns: 26px minmax(0, 1fr) 7px; align-items: center; gap: 8px; width: 100%; min-height: 40px; padding: 4px 7px; overflow: hidden; border: 1px solid transparent; border-radius: 10px; color: inherit; background: transparent; text-align: left; cursor: pointer; transition: color 140ms ease, background-color 140ms ease, box-shadow 180ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-sidebar-row:hover { background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-sidebar-row.is-active { border-color: transparent; background: var(--partner-selected); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-sidebar-row > span:nth-child(2) { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-sidebar-row strong,\n.dsh-partner-sidebar-row small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-sidebar-row strong { font-size: var(--partner-font-label); font-weight: 520; }\n.dsh-partner-sidebar-row small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-sidebar-row > i,\n.dsh-partner-roster-list button > i { width: 6px; height: 6px; border: 1px solid var(--partner-text-tertiary); border-radius: 50%; }\n.dsh-partner-sidebar-row > i.is-online,\n.dsh-partner-roster-list button > i.is-online { border-color: var(--partner-success); background: var(--partner-success); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-success) 12%, transparent); }\n.dsh-partner-sidebar-symbol { display: grid !important; place-items: center; width: 25px; height: 25px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-sidebar-empty { margin: 5px 9px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); }\n.dsh-partner-rail { display: grid; place-items: center; width: 36px; height: 36px; padding: 0; border: 0; border-radius: 10px; color: var(--partner-text); background: transparent; cursor: pointer; }\n.dsh-partner-rail.is-active { background: var(--partner-hover); }\n\n.dsh-partner-avatar { display: grid; place-items: center; flex: none; width: 36px; height: 36px; border: 1px solid var(--partner-border); border-radius: 12px; color: var(--partner-text); background: linear-gradient(145deg, var(--partner-glass-thick), var(--partner-control)); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); font-size: var(--partner-font-label); font-weight: 650; }\n.dsh-partner-avatar.is-small { width: 25px; height: 25px; border-radius: 8px; font-size: var(--partner-font-caption); }\n\n.dsh-partner-workspace { position: relative; isolation: isolate; display: grid; grid-template-rows: auto minmax(0, 1fr); width: 100%; height: 100%; min-width: 0; overflow: hidden; background: var(--partner-canvas); }\n.dsh-partner-glass-surface { position: relative; isolation: isolate; transition: opacity 180ms ease-out, border-color 180ms ease, box-shadow 220ms var(--partner-ease-out), transform 220ms var(--partner-ease-out); }\n.dsh-partner-glass-surface.is-svg { -webkit-backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); }\n.dsh-partner-glass-surface.is-fallback { -webkit-backdrop-filter: var(--partner-glass-filter); backdrop-filter: var(--partner-glass-filter); }\n.dsh-partner-glass-filter { position: absolute; z-index: -1; inset: 0; width: 100%; height: 100%; opacity: 0; pointer-events: none; }\n.dsh-partner-glass-surface.is-interactive::after {\n position: absolute;\n z-index: 2;\n inset: 1px;\n border-radius: inherit;\n background: linear-gradient(112deg, transparent 20%, color-mix(in srgb, var(--partner-glass-highlight) 86%, transparent) 48%, transparent 76%);\n -webkit-mask-image: radial-gradient(circle 180px at var(--partner-glare-x) var(--partner-glare-y), #000 0, rgba(0, 0, 0, .72) 38%, transparent 74%);\n mask-image: radial-gradient(circle 180px at var(--partner-glare-x) var(--partner-glare-y), #000 0, rgba(0, 0, 0, .72) 38%, transparent 74%);\n opacity: 0;\n pointer-events: none;\n transition: opacity 180ms ease-out;\n content: \"\";\n}\n.dsh-partner-glass-surface.is-interactive > :not(.dsh-partner-glass-filter) { position: relative; z-index: 1; }\n@media (hover: hover) {\n .dsh-partner-glass-surface.is-interactive:hover {\n border-color: color-mix(in srgb, var(--partner-border) 70%, var(--partner-text-tertiary));\n box-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 var(--partner-glass-rim-shadow),\n 0 14px 32px color-mix(in srgb, var(--partner-text) 9%, transparent);\n transform: translateY(-1px);\n }\n .dsh-partner-glass-surface.is-interactive:hover::after { opacity: .72; }\n}\n.dsh-partner-topbar { position: relative; z-index: 3; display: flex; align-items: center; justify-content: space-between; min-height: 52px; margin: 8px 10px 0; padding: 7px 14px; border: 1px solid var(--partner-border); border-radius: 14px 14px 11px 11px; background: linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-highlight) 20%, transparent), transparent 58%), var(--partner-pane); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: var(--partner-glass-shadow); }\n.dsh-partner-topbar > div { display: flex; align-items: center; gap: 10px; }\n.dsh-partner-topbar > div > span:last-child { display: grid; gap: 2px; }\n.dsh-partner-topbar strong { font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-topbar small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-topbar [data-xiaohei-workspace-close] {\n display: grid;\n place-items: center;\n flex: none;\n width: 30px;\n height: 30px;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 9px;\n color: var(--partner-text-secondary);\n background: transparent;\n line-height: 1;\n cursor: pointer;\n transition: color 140ms ease, background 140ms ease, border-color 140ms ease, transform 140ms ease;\n}\n.dsh-partner-topbar [data-xiaohei-workspace-close]:hover {\n border-color: var(--partner-border);\n color: var(--partner-text);\n background: var(--partner-hover);\n}\n.dsh-partner-topbar [data-xiaohei-workspace-close]:active { transform: scale(.96); }\n.dsh-partner-topbar [data-xiaohei-workspace-close] > svg { display: block; pointer-events: none; }\n.dsh-partner-mobile-workspace-nav { display: none; }\n.dsh-partner-grid { display: grid; grid-template-columns: 214px minmax(520px, 1fr); min-width: 0; min-height: 0; padding: 8px 10px 10px; gap: 8px; }\n\n.dsh-partner-roster { position: relative; display: flex; min-width: 0; min-height: 0; flex-direction: column; padding: 17px 10px 13px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 15px; background: linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-highlight) 20%, transparent), transparent 56%), var(--partner-pane); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: var(--partner-glass-shadow); }\n.dsh-partner-roster-title { display: flex; align-items: flex-start; justify-content: space-between; padding: 0 5px 13px; }\n.dsh-partner-roster-title > span { display: grid; gap: 5px; }\n.dsh-partner-roster-title small,\n.dsh-partner-section > small,\n.dsh-partner-identity small,\n.dsh-partner-channel-card small,\n.dsh-partner-pairing-heading small,\n.dsh-partner-qr small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .12em; }\n.dsh-partner-roster-title strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-roster-title button { display: grid; place-items: center; width: 30px; height: 30px; padding: 0; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); cursor: pointer; transition: color 140ms ease, background-color 140ms ease, transform 160ms var(--partner-ease-out), box-shadow 180ms ease; }\n.dsh-partner-roster-title button:hover { color: var(--partner-text); border-color: var(--partner-border); background: var(--partner-glass-thick); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); transform: translateY(-1px); }\n.dsh-partner-roster-list { display: grid; width: 100%; min-width: 0; min-height: 72px; flex: 1 1 auto; align-content: start; gap: 3px; overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; }\n.dsh-partner-roster-list button { display: grid; grid-template-columns: 36px minmax(0, 1fr) 7px; align-items: center; gap: 9px; width: 100%; min-height: 58px; padding: 9px 8px; border: 1px solid transparent; border-radius: 12px; color: inherit; background: transparent; text-align: left; cursor: pointer; transition: transform .17s cubic-bezier(.2,.8,.2,1), background .15s ease, border-color .15s ease; }\n.dsh-partner-roster-list button:hover { background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-roster-list button.is-active { transform: translateX(2px); border-color: transparent; background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-text-secondary), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-roster-list button > span:nth-child(2) { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-roster-list strong,\n.dsh-partner-roster-list small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-roster-list strong { font-size: var(--partner-font-label); font-weight: 580; }\n.dsh-partner-roster-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-workspace-nav { display: grid; gap: 3px; margin-top: 12px; padding: 12px 0 0; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-workspace-nav button { display: grid; grid-template-columns: 30px minmax(0, 1fr); grid-template-rows: auto auto; align-items: center; column-gap: 9px; width: 100%; min-height: 52px; padding: 7px 8px; border: 1px solid transparent; border-radius: 11px; color: var(--partner-text-secondary); background: transparent; text-align: left; cursor: pointer; transition: color 150ms ease, background-color 150ms ease, border-color 150ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-workspace-nav button:hover { color: var(--partner-text); background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-workspace-nav button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-workspace-nav button > span { display: grid; grid-row: 1 / span 2; place-items: center; width: 29px; height: 29px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); }\n.dsh-partner-workspace-nav button.is-active > span { color: var(--partner-accent-strong); background: var(--partner-raised); }\n.dsh-partner-workspace-nav strong { align-self: end; overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-workspace-nav small { align-self: start; overflow: hidden; color: var(--partner-text-tertiary); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-roster-note { display: flex; align-items: flex-start; gap: 9px; margin-top: 0; padding: 12px 8px 2px; color: var(--partner-text-tertiary); }\n.dsh-partner-roster-note > svg { flex: none; margin-top: 1px; color: var(--partner-accent); }\n.dsh-partner-roster-note > span { display: grid; gap: 4px; }\n.dsh-partner-roster-note strong { color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-weight: 580; }\n.dsh-partner-roster-note small { font-size: var(--partner-font-caption); line-height: 1.5; }\n\n.dsh-partner-stage { position: relative; display: grid; grid-template-rows: auto auto minmax(0, 1fr); min-width: 0; min-height: 0; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 15px; background: linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-highlight) 16%, transparent), transparent 52%), var(--partner-surface); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-glass-highlight) 72%, transparent), inset 0 -1px 0 var(--partner-glass-rim-shadow), var(--partner-shadow-sm); }\n.dsh-partner-stage.is-workspace-page { grid-template-rows: minmax(0, 1fr); }\n.dsh-partner-identity { display: flex; align-items: center; gap: 12px; min-height: 86px; padding: 18px clamp(20px, 4vw, 46px) 13px; }\n.dsh-partner-identity > span:nth-child(2) { display: grid; min-width: 0; flex: 1; gap: 3px; }\n.dsh-partner-identity h1 { margin: 0; font-size: var(--partner-font-heading); line-height: 1.15; font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-identity p { margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-status { display: inline-flex; align-items: center; flex: none; gap: 6px; padding: 5px 8px; border: 1px solid var(--partner-border); border-radius: 999px; color: var(--partner-text-secondary); background: color-mix(in srgb, var(--partner-raised) 76%, transparent); font-size: var(--partner-font-caption); }\n.dsh-partner-status > i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-status.is-running > i { background: var(--partner-success); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-success) 13%, transparent); }\n.dsh-partner-status.is-starting > i { background: var(--partner-warning); }\n.dsh-partner-status.is-error > i { background: var(--partner-danger); }\n.dsh-partner-tabs { display: flex; align-items: center; gap: 3px; margin: 0 clamp(20px, 4vw, 46px); border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-tabs button { position: relative; display: inline-flex; align-items: center; gap: 6px; min-height: 37px; padding: 0 10px; border: 0; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-body); cursor: pointer; }\n.dsh-partner-tabs button::after { content: \"\"; position: absolute; right: 9px; bottom: -1px; left: 9px; height: 2px; border-radius: 99px; background: var(--partner-text); opacity: 0; transform: scaleX(.45); transition: opacity 150ms ease, transform 210ms var(--partner-ease-out); }\n.dsh-partner-tabs button:hover { color: var(--partner-text); }\n.dsh-partner-tabs button.is-active { color: var(--partner-accent-strong); }\n.dsh-partner-tabs button.is-active::after { opacity: 1; transform: scaleX(1); }\n.dsh-partner-stage-scroll { min-width: 0; min-height: 0; overflow: auto; padding: 26px clamp(22px, 4vw, 52px) 52px; overscroll-behavior: contain; }\n.dsh-partner-stage-scroll.is-workspace-page { padding: 0; }\n.dsh-partner-stage-scroll > * { animation: dsh-partner-content-enter 260ms var(--partner-ease-out) both; }\n\n.dsh-partner-home { width: min(100%, 1160px); margin: 0 auto; }\n.dsh-partner-home-heading { display: flex; align-items: end; justify-content: space-between; gap: 28px; margin: 0 2px 22px; }\n.dsh-partner-home-heading > span { display: grid; gap: 6px; }\n.dsh-partner-home-heading small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .08em; }\n.dsh-partner-home-heading h2 { margin: 0; font-size: var(--partner-font-display); line-height: 1.18; font-weight: 660; letter-spacing: -.035em; }\n.dsh-partner-home-heading p { max-width: 320px; margin: 0 0 2px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; text-align: right; }\n.dsh-partner-home-channel { display: grid; grid-template-columns: minmax(230px, .8fr) minmax(330px, 1.2fr); align-items: center; min-height: 238px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 20px; background: linear-gradient(118deg, color-mix(in srgb, var(--partner-glass-highlight) 18%, transparent), transparent 56%), var(--partner-pane); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); }\n.dsh-partner-home-route { position: relative; display: flex; align-items: center; justify-content: center; min-height: 100%; padding: 28px; background: radial-gradient(circle at 42% 50%, color-mix(in srgb, var(--partner-glass-highlight) 44%, transparent), transparent 58%); }\n.dsh-partner-home-route > .dsh-partner-avatar { position: relative; z-index: 1; width: 58px; height: 58px; border-radius: 18px; background: var(--partner-raised); box-shadow: 0 9px 28px color-mix(in srgb, var(--partner-accent-strong) 10%, transparent); font-size: var(--partner-font-title); }\n.dsh-partner-route-line { position: relative; width: clamp(58px, 7vw, 94px); height: 1px; margin: 0 10px; overflow: hidden; background: repeating-linear-gradient(90deg, color-mix(in srgb, var(--partner-accent) 25%, transparent) 0 4px, transparent 4px 9px); }\n.dsh-partner-route-line > i { position: absolute; left: 0; top: -2px; width: 5px; height: 5px; border-radius: 50%; background: var(--partner-accent); opacity: 0; transform: translateX(0); }\n.dsh-partner-home-channel.is-online .dsh-partner-route-line > i { animation: dsh-partner-route-pulse 2.4s ease-in-out infinite; }\n.dsh-partner-route-weixin { position: relative; z-index: 1; display: grid; place-items: center; width: 58px; height: 58px; border: 1px solid color-mix(in srgb, var(--partner-weixin) 18%, var(--partner-border)); border-radius: 18px; color: var(--partner-weixin); background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); }\n.dsh-partner-home-channel-copy { position: relative; z-index: 1; display: grid; justify-items: start; gap: 8px; padding: 32px 36px 32px 12px; }\n.dsh-partner-home-kicker { display: inline-flex; align-items: center; gap: 7px; color: var(--partner-accent-strong); font-size: var(--partner-font-caption); font-weight: 680; letter-spacing: .06em; }\n.dsh-partner-home-kicker > i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-home-channel.is-online .dsh-partner-home-kicker > i { background: var(--partner-success); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-success) 11%, transparent); }\n.dsh-partner-home-channel-copy h3 { margin: 1px 0 0; font-size: var(--partner-font-title); line-height: 1.28; font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-home-channel-copy p { max-width: 510px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-home-channel-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; margin-top: 7px; }\n.dsh-partner-home-channel-actions button { min-height: 36px; padding: 0 16px; border: 1px solid color-mix(in srgb, var(--partner-accent-strong) 78%, var(--partner-glass-highlight)); border-radius: 10px; color: var(--partner-on-accent); background: var(--partner-accent-strong); box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-glass-highlight) 45%, transparent), var(--partner-shadow-sm); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: transform 160ms var(--partner-ease-out), background-color 160ms ease, box-shadow 180ms ease; }\n.dsh-partner-home-channel-actions button:hover { background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); transform: translateY(-1px); }\n.dsh-partner-home-channel-actions button:active { transform: translateY(0) scale(.98); }\n.dsh-partner-home-channel-actions span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-home-details { display: grid; grid-template-columns: minmax(0, 1.18fr) minmax(260px, .82fr); gap: 12px; margin-top: 18px; }\n.dsh-partner-home-details > section {\n position: relative;\n min-width: 0;\n padding: 19px 18px 21px;\n overflow: hidden;\n border: 1px solid var(--partner-border);\n border-radius: 15px;\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-thick) 88%, transparent), var(--partner-glass-clear)),\n var(--partner-glass-regular);\n box-shadow:\n inset 0 1px 0 var(--partner-glass-highlight),\n inset 0 -1px 0 var(--partner-glass-rim-shadow),\n 0 8px 22px rgba(31, 31, 35, .075),\n 0 2px 5px rgba(31, 31, 35, .045);\n}\n.dsh-partner-home-details > section::after {\n position: absolute;\n top: 0;\n right: 16px;\n left: 16px;\n height: 1px;\n background: linear-gradient(90deg, transparent, var(--partner-glass-highlight), transparent);\n opacity: .72;\n pointer-events: none;\n content: \"\";\n}\n.dsh-partner-home-profile { grid-row: span 2; }\n.dsh-partner-home-details header { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto; align-items: center; gap: 10px; }\n.dsh-partner-home-details header > span { display: grid; place-items: center; width: 32px; height: 32px; border-radius: 10px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-home-details header > div { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-home-details header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-home-details header strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-home-details header button { padding: 5px 7px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-home-details header button:hover { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 6%, transparent); }\n.dsh-partner-home-profile blockquote { display: -webkit-box; margin: 17px 2px 0 44px; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.7; -webkit-box-orient: vertical; -webkit-line-clamp: 5; }\n.dsh-partner-home-capability-list { display: flex; flex-wrap: wrap; gap: 6px; margin: 14px 0 0 44px; }\n.dsh-partner-home-capability-list em { padding: 5px 8px; border-radius: 7px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-home-capability-list small,\n.dsh-partner-home-continuity > p { margin: 13px 0 0 44px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n@keyframes dsh-partner-route-pulse { 0% { opacity: 0; transform: translateX(0); } 18% { opacity: .8; } 82% { opacity: .8; } 100% { opacity: 0; transform: translateX(clamp(58px, 7vw, 94px)); } }\n\n.dsh-partner-form { width: min(100%, 1120px); margin: 0 auto; }\n.dsh-partner-form.is-identity { width: min(100%, 980px); }\n.dsh-partner-form.is-capabilities,\n.dsh-partner-form.is-channel,\n.dsh-partner-form.is-memory { width: min(100%, 1180px); }\n.dsh-partner-form.is-memory { container: partner-memory / inline-size; }\n.dsh-partner-section { position: relative; margin-bottom: 27px; padding-left: 14px; }\n.dsh-partner-section::before { position: absolute; top: 3px; bottom: 2px; left: 0; width: 2px; border-radius: 2px; background: linear-gradient(var(--partner-text-secondary), transparent 92%); content: ''; }\n.dsh-partner-section h2 { margin: 5px 0 7px; font-size: var(--partner-font-display); font-weight: 650; letter-spacing: -.035em; }\n.dsh-partner-section p { max-width: 640px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-fields { display: grid; gap: 14px; }\n.dsh-partner-fields.two { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-runtime-fields { display: grid; grid-template-columns: minmax(190px, 1.15fr) minmax(160px, .85fr) minmax(190px, 1.15fr); gap: 14px; }\n.dsh-partner-runtime-fields > .dsh-partner-field { margin-bottom: 18px; }\n.dsh-partner-field { display: grid; min-width: 0; gap: 8px; margin-bottom: 16px; }\n.dsh-partner-field > span { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }\n.dsh-partner-field strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-field small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.35; text-align: right; }\n.dsh-partner-field input,\n.dsh-partner-field textarea,\n.dsh-partner-field select { box-sizing: border-box; width: 100%; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; outline: none; color: var(--partner-text); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease, background .15s ease; }\n.dsh-partner-field textarea { resize: vertical; }\n.dsh-partner-field input:focus,\n.dsh-partner-field textarea:focus,\n.dsh-partner-field select:focus { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-form-actions { display: flex; align-items: center; justify-content: space-between; min-height: 40px; padding-top: 5px; }\n.dsh-partner-form-actions > span { display: inline-flex; align-items: center; gap: 5px; color: var(--partner-accent-strong); font-size: var(--partner-font-body); }\n.dsh-partner-form-actions > button,\n.dsh-partner-state > button,\n.dsh-partner-weixin-connect > button { min-height: 34px; padding: 0 15px; border: 1px solid color-mix(in srgb, var(--partner-accent) 60%, transparent); border-radius: 10px; color: var(--partner-on-accent); background: var(--partner-accent-strong); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-form-actions > button:hover,\n.dsh-partner-state > button:hover,\n.dsh-partner-weixin-connect > button:hover { background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); }\n.dsh-partner-form-actions > button:disabled,\n.dsh-partner-weixin-connect > button:disabled { opacity: .55; cursor: default; }\n.dsh-partner-identity-danger { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-top: 34px; padding-top: 17px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-identity-danger > span { display: grid; gap: 4px; }\n.dsh-partner-identity-danger strong { font-size: var(--partner-font-body); font-weight: 600; }\n.dsh-partner-identity-danger small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-identity-danger button { display: inline-flex; align-items: center; gap: 6px; min-height: 30px; padding: 0 10px; border: 1px solid color-mix(in srgb, var(--partner-danger) 24%, transparent); border-radius: 8px; color: var(--partner-danger); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-identity-danger button:disabled { opacity: .4; cursor: default; }\n.dsh-partner-inline-error,\n.dsh-partner-error { padding: 9px 11px; border: 1px solid color-mix(in srgb, var(--partner-danger) 20%, transparent); border-radius: 9px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 6%, transparent); font-size: var(--partner-font-body); }\n.dsh-partner-error { position: absolute; right: 18px; bottom: 14px; left: 18px; margin: 0; }\n\n.dsh-partner-capability-groups { display: grid; gap: 13px; margin: 3px 0 22px; }\n.dsh-partner-capability-group { padding: 14px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-pane) 84%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-capability-group > header { display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; padding: 1px 2px 12px; }\n.dsh-partner-capability-group > header > span { display: grid; gap: 3px; min-width: 0; }\n.dsh-partner-capability-group > header small { color: var(--partner-accent-strong); font-size: var(--partner-font-micro); font-weight: 650; letter-spacing: .12em; }\n.dsh-partner-capability-group > header strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-capability-group > header p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; }\n.dsh-partner-capability-group > header em { flex: none; padding: 5px 8px; border-radius: 7px; color: var(--partner-text-secondary); background: var(--partner-selected); font-size: var(--partner-font-caption); font-style: normal; font-variant-numeric: tabular-nums; }\n.dsh-partner-capabilities { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 8px; margin: 0; }\n.dsh-partner-capabilities button { position: relative; display: grid; grid-template-columns: 22px minmax(0, 1fr); gap: 3px 9px; min-height: 72px; padding: 12px; border: 1px solid var(--partner-border); border-radius: 11px; appearance: none; color: inherit; background: color-mix(in srgb, var(--partner-raised) 70%, transparent); font-family: var(--partner-font-family); text-align: left; cursor: pointer; transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-capabilities button:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: color-mix(in srgb, var(--partner-raised) 90%, var(--partner-selected)); }\n.dsh-partner-capabilities button:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-capabilities button.is-active { border-color: color-mix(in srgb, var(--partner-accent) 30%, transparent); background: color-mix(in srgb, var(--partner-accent) 7%, var(--partner-raised)); }\n.dsh-partner-capabilities button > span { display: grid; place-items: center; grid-row: 1 / span 2; width: 19px; height: 19px; margin-top: 1px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-on-accent); }\n.dsh-partner-capabilities button.is-active > span { border-color: var(--partner-accent); background: var(--partner-accent); }\n.dsh-partner-capabilities strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-capabilities small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }\n\n.dsh-partner-weixin-connect { display: grid; grid-template-columns: 54px minmax(0, 1fr) auto; align-items: center; gap: 17px; padding: 19px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-weixin-connect > span { display: grid; gap: 4px; }\n.dsh-partner-weixin-connect strong { font-size: var(--partner-font-label); }\n.dsh-partner-weixin-connect p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; }\n.dsh-partner-weixin-connect ul { display: flex; flex-wrap: wrap; gap: 6px 15px; margin: 7px 0 0; padding: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); list-style: none; }\n.dsh-partner-weixin-connect li::before { content: \"\u00B7\"; margin-right: 4px; color: var(--partner-accent); }\n.dsh-partner-weixin-mark { display: grid; place-items: center; width: 52px; height: 52px; border: 1px solid color-mix(in srgb, var(--partner-weixin) 18%, var(--partner-border)); border-radius: 16px; color: var(--partner-weixin); background: color-mix(in srgb, var(--partner-weixin) 7%, var(--partner-raised)); }\n.dsh-partner-weixin-glyph { position: relative; display: inline-block; width: 16px; height: 14px; }\n.dsh-partner-weixin-glyph::before,\n.dsh-partner-weixin-glyph::after { content: \"\"; position: absolute; border: 1.5px solid currentColor; border-radius: 48%; }\n.dsh-partner-weixin-glyph::before { left: 0; top: 0; width: 10px; height: 8px; }\n.dsh-partner-weixin-glyph::after { right: 0; bottom: 0; width: 9px; height: 7px; background: inherit; }\n.dsh-partner-weixin-glyph i,\n.dsh-partner-weixin-glyph b { position: absolute; z-index: 1; top: 4px; width: 1.5px; height: 1.5px; border-radius: 50%; background: currentColor; }\n.dsh-partner-weixin-glyph i { left: 3px; }\n.dsh-partner-weixin-glyph b { left: 7px; }\n.dsh-partner-weixin-glyph.is-large { transform: scale(1.55); }\n.dsh-partner-qr { display: grid; grid-template-columns: 206px minmax(0, 1fr); align-items: center; gap: 27px; padding: 22px; border: 1px solid var(--partner-border); border-radius: 16px; background: color-mix(in srgb, var(--partner-raised) 74%, transparent); }\n.dsh-partner-qr-code { display: grid; place-items: center; width: 196px; height: 196px; border-radius: 14px; background: #fff; box-shadow: 0 9px 28px color-mix(in srgb, #000 7%, transparent); }\n.dsh-partner-qr > span { display: grid; justify-items: start; gap: 7px; }\n.dsh-partner-qr strong { font-size: var(--partner-font-title); }\n.dsh-partner-qr p { max-width: 300px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-qr button { display: inline-flex; align-items: center; gap: 6px; min-height: 32px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: inherit; background: var(--partner-raised); cursor: pointer; }\n.dsh-partner-channel-card { display: grid; grid-template-columns: 52px minmax(0, 1fr) auto auto; align-items: center; gap: 14px; padding: 15px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-channel-card > span:nth-child(2) { display: grid; gap: 3px; }\n.dsh-partner-channel-card strong { font-size: var(--partner-font-label); }\n.dsh-partner-channel-card p { margin: 0; color: var(--partner-text-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; }\n.dsh-partner-switch { position: relative; width: 38px; height: 22px; padding: 0; border: 1px solid var(--partner-border); border-radius: 999px; background: color-mix(in srgb, var(--partner-text) 9%, transparent); cursor: pointer; transition: background .16s ease; }\n.dsh-partner-switch i { position: absolute; left: 3px; top: 3px; width: 14px; height: 14px; border-radius: 50%; background: var(--partner-raised); box-shadow: 0 1px 3px color-mix(in srgb, #000 16%, transparent); transition: transform .18s cubic-bezier(.2,.8,.2,1); }\n.dsh-partner-switch[data-on=\"true\"] { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-switch[data-on=\"true\"] i { transform: translateX(16px); }\n.dsh-partner-pairing-heading { display: flex; align-items: end; justify-content: space-between; margin: 25px 1px 10px; }\n.dsh-partner-pairing-heading > span { display: grid; gap: 4px; }\n.dsh-partner-pairing-heading strong { font-size: var(--partner-font-label); }\n.dsh-partner-pairing-heading em { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-pairings { display: grid; gap: 5px; }\n.dsh-partner-pairings article { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto auto; align-items: center; gap: 9px; min-height: 52px; padding: 8px 9px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-pairings article > span { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: var(--partner-text-tertiary); background: var(--partner-hover); }\n.dsh-partner-pairings article > span.is-approved { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-pairings article > div { display: grid; gap: 3px; }\n.dsh-partner-pairings strong { font-size: var(--partner-font-body); }\n.dsh-partner-pairings small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-pairings button { min-height: 29px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-pairings button.is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n\n.dsh-partner-metrics { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }\n.dsh-partner-metrics article { padding: 14px; border: 1px solid var(--partner-border); border-radius: 12px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); }\n.dsh-partner-metrics small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-metrics strong { display: block; margin: 8px 0 4px; font-size: var(--partner-font-title); font-weight: 640; }\n.dsh-partner-metrics p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-session-list { display: grid; gap: 4px; margin-top: 20px; }\n.dsh-partner-session-list article { display: flex; align-items: center; gap: 10px; min-height: 48px; padding: 7px 5px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-session-list article > span { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: var(--partner-accent); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-session-list article > div { display: grid; min-width: 0; flex: 1; gap: 3px; }\n.dsh-partner-session-list strong { font-size: var(--partner-font-body); }\n.dsh-partner-session-list small { overflow: hidden; color: var(--partner-text-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-session-list button { flex: none; min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-session-list button:hover { color: var(--partner-accent-strong); border-color: color-mix(in srgb, var(--partner-accent) 24%, var(--partner-border)); }\n.dsh-partner-automation { display: grid; min-width: 0; max-width: 100%; gap: 14px; margin-top: 16px; padding: 16px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-automation-grid { display: grid; min-width: 0; grid-template-columns: minmax(480px, .95fr) minmax(430px, 1.05fr); align-items: stretch; gap: 12px; margin-top: 17px; }\n.dsh-partner-automation-grid .dsh-partner-automation { align-content: start; margin-top: 0; }\n.dsh-partner-automation-grid .dsh-partner-automation:last-child .dsh-partner-automation-actions { margin-top: auto; }\n.dsh-partner-review-policy { display: grid; grid-template-columns: auto minmax(0, 1fr) 90px auto; align-items: center; gap: 10px; padding-top: 12px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-review-policy > span { display: grid; gap: 2px; }\n.dsh-partner-review-policy > span strong { font-size: var(--partner-font-body); }\n.dsh-partner-review-policy > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.4; }\n.dsh-partner-review-policy select { width: 100%; height: 32px; padding: 0 26px 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; background-color: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-review-policy > button:last-child { height: 32px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-automation > header { display: flex; align-items: center; justify-content: space-between; gap: 16px; }\n.dsh-partner-automation > header > span { display: grid; gap: 4px; }\n.dsh-partner-automation > header strong { font-size: var(--partner-font-body); }\n.dsh-partner-automation > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-automation-fields { display: grid; min-width: 0; grid-template-columns: minmax(120px, 180px); gap: 10px; }\n.dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(110px, .7fr) minmax(130px, 1fr) minmax(150px, 1.25fr); }\n.dsh-partner-automation-fields.is-heartbeat { grid-template-columns: repeat(4, minmax(100px, 1fr)); }\n.dsh-partner-concern-board { position: relative; display: grid; min-width: 0; max-width: 100%; overflow: visible; border: 1px solid var(--partner-border); border-radius: 11px; background: color-mix(in srgb, var(--partner-raised) 42%, transparent); }\n.dsh-partner-concern-board > header { display: flex; min-height: 46px; align-items: center; justify-content: space-between; gap: 14px; padding: 7px 10px 7px 12px; }\n.dsh-partner-concern-board > header > span { display: flex; min-width: 0; align-items: baseline; gap: 8px; }\n.dsh-partner-concern-board > header strong { display: flex; align-items: center; gap: 6px; font-size: var(--partner-font-body); font-weight: 640; white-space: nowrap; }\n.dsh-partner-concern-board > header strong b { display: grid; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; place-items: center; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, transparent); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-concern-board > header p { min-width: 0; margin: 0; overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-board > header > button { display: inline-flex; flex: none; height: 30px; align-items: center; gap: 5px; padding: 0 9px; border: 1px solid transparent; border-radius: 8px; color: var(--partner-text-secondary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-board > header > button:hover,\n.dsh-partner-concern-board > header > button[aria-expanded=\"true\"] { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-concern-compose { display: grid; gap: 8px; padding: 10px 12px 11px; border-top: 1px solid var(--partner-border); background: color-mix(in srgb, var(--partner-control) 60%, transparent); animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-concern-compose label { display: grid; gap: 6px; }\n.dsh-partner-concern-compose label > span { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); font-weight: 600; }\n.dsh-partner-concern-compose input { width: 100%; height: 36px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-concern-compose input:focus-visible { border-color: color-mix(in srgb, var(--partner-accent) 55%, var(--partner-border)); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-concern-input-wrap { position: relative; min-width: 0; }\n.dsh-partner-concern-compose-hint { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 400; line-height: 1.45; }\n.dsh-partner-concern-compose-hint b { color: var(--partner-accent-strong); font-weight: 700; }\n.dsh-partner-concern-sources {\n position: absolute;\n z-index: 40;\n top: calc(100% + 6px);\n right: 0;\n left: 0;\n display: grid;\n max-height: 264px;\n overflow-y: auto;\n padding: 5px;\n border: 1px solid color-mix(in srgb, var(--partner-border) 88%, var(--partner-text) 12%);\n border-radius: 10px;\n background: var(--partner-raised);\n box-shadow: 0 14px 34px color-mix(in srgb, var(--partner-text) 15%, transparent);\n scrollbar-width: thin;\n}\n.dsh-partner-concern-sources > p { margin: 0; padding: 14px 12px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.45; }\n.dsh-partner-concern-sources > button {\n display: grid;\n min-height: 46px;\n grid-template-columns: 28px minmax(0, 1fr);\n grid-template-rows: auto auto;\n align-items: center;\n column-gap: 8px;\n padding: 6px 8px;\n border: 1px solid transparent;\n border-radius: 8px;\n color: var(--partner-text);\n background: transparent;\n text-align: left;\n cursor: pointer;\n}\n.dsh-partner-concern-sources > button > span { display: grid; grid-row: 1 / 3; width: 28px; height: 28px; place-items: center; border-radius: 8px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, var(--partner-control)); }\n.dsh-partner-concern-sources > button > strong { min-width: 0; overflow: hidden; font-size: var(--partner-font-body); font-weight: 610; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-sources > button > small { min-width: 0; overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 400; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-sources > button:hover,\n.dsh-partner-concern-sources > button[aria-selected=\"true\"] { border-color: color-mix(in srgb, var(--partner-accent) 22%, var(--partner-border)); background: color-mix(in srgb, var(--partner-accent) 8%, var(--partner-raised)); }\n.dsh-partner-concern-compose > div { display: flex; justify-content: flex-end; gap: 6px; }\n.dsh-partner-concern-compose button { min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-raised); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-compose button.is-primary { border-color: transparent; color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-concern-list { display: grid; min-height: 0; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-list > article { min-width: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 72%, transparent); background: transparent; transition: background .15s ease; }\n.dsh-partner-concern-list > article:last-child { border-bottom: 0; }\n.dsh-partner-concern-list > article:hover,\n.dsh-partner-concern-list > article[data-expanded=\"true\"] { background: color-mix(in srgb, var(--partner-accent) 4.5%, transparent); }\n.dsh-partner-concern-row { display: grid; width: 100%; min-height: 49px; grid-template-columns: 76px minmax(0, 1fr) auto 14px; align-items: center; gap: 9px; padding: 6px 11px 6px 12px; border: 0; color: inherit; background: transparent; text-align: left; cursor: pointer; }\n.dsh-partner-concern-state { display: flex; align-items: center; gap: 7px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); white-space: nowrap; }\n.dsh-partner-concern-state i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-concern-copy { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-concern-copy strong,\n.dsh-partner-concern-copy small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-copy strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-concern-copy small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-time { display: grid; justify-items: end; gap: 2px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; line-height: 1.1; white-space: nowrap; }\n.dsh-partner-concern-time small { font: inherit; }\n.dsh-partner-concern-time strong { color: var(--partner-text-secondary); font: 590 var(--partner-font-caption)/1.1 var(--partner-font-family); }\n.dsh-partner-concern-row > svg { color: var(--partner-text-tertiary); transition: transform .16s ease, color .16s ease; }\n.dsh-partner-concern-list > article[data-expanded=\"true\"] .dsh-partner-concern-row > svg { color: var(--partner-accent); transform: rotate(180deg); }\n.dsh-partner-concern-detail { display: grid; gap: 7px; padding: 0 34px 11px 97px; animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-concern-detail p,\n.dsh-partner-concern-detail blockquote { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-concern-detail blockquote { padding-left: 9px; border-left: 2px solid color-mix(in srgb, var(--partner-accent) 40%, transparent); }\n.dsh-partner-concern-detail > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-decision { display: grid; min-width: 0; grid-template-columns: auto minmax(0, 1fr); align-items: baseline; gap: 3px 8px; padding: 7px 9px; border: 1px solid var(--partner-border); border-radius: 8px; background: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-decision strong { color: var(--partner-accent-strong); font-weight: 620; white-space: nowrap; }\n.dsh-partner-concern-decision span { min-width: 0; color: var(--partner-text-secondary); line-height: 1.45; }\n.dsh-partner-concern-decision small { grid-column: 1 / -1; color: var(--partner-text-tertiary); line-height: 1.45; overflow-wrap: anywhere; }\n.dsh-partner-concern-resources { display: flex; flex-wrap: wrap; gap: 5px; }\n.dsh-partner-concern-resources span { max-width: 100%; overflow: hidden; padding: 4px 7px; border-radius: 6px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-actions { display: flex; flex-wrap: wrap; gap: 5px; padding-top: 2px; }\n.dsh-partner-concern-actions button,\n.dsh-partner-concern-resolved button { min-height: 28px; padding: 0 8px; border: 1px solid var(--partner-border); border-radius: 7px; color: var(--partner-text-secondary); background: var(--partner-control); font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-actions button:hover,\n.dsh-partner-concern-resolved button:hover { color: var(--partner-accent-strong); border-color: color-mix(in srgb, var(--partner-accent) 32%, var(--partner-border)); background: color-mix(in srgb, var(--partner-accent) 7%, var(--partner-control)); }\n.dsh-partner-concern-actions button.is-danger:hover { color: var(--partner-danger); border-color: color-mix(in srgb, var(--partner-danger) 35%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-control)); }\n.dsh-partner-concern-more { display: flex; justify-content: center; padding: 5px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-more button { min-height: 26px; padding: 0 9px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-more button:hover { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-concern-empty { margin: 0; padding: 13px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }\n.dsh-partner-concern-resolved { border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-resolved summary { min-height: 34px; padding: 9px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); cursor: pointer; list-style: none; }\n.dsh-partner-concern-resolved summary::-webkit-details-marker { display: none; }\n.dsh-partner-concern-resolved summary::before { display: inline-block; margin-right: 7px; content: '\\203A'; transition: transform .15s ease; }\n.dsh-partner-concern-resolved[open] summary::before { transform: rotate(90deg); }\n.dsh-partner-concern-resolved summary b { margin-left: 4px; color: var(--partner-accent); font-variant-numeric: tabular-nums; }\n.dsh-partner-concern-resolved > div { display: grid; max-height: 170px; overflow-y: auto; border-top: 1px solid color-mix(in srgb, var(--partner-border) 72%, transparent); }\n.dsh-partner-concern-resolved article { display: grid; min-height: 38px; grid-template-columns: 22px minmax(0, 1fr) auto; align-items: center; gap: 7px; padding: 4px 10px; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 60%, transparent); }\n.dsh-partner-concern-resolved article > span { display: grid; width: 20px; height: 20px; border-radius: 7px; place-items: center; color: var(--partner-accent); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-concern-resolved article strong { overflow: hidden; font-size: var(--partner-font-caption); font-weight: 560; text-overflow: ellipsis; white-space: nowrap; }\n@keyframes dsh-partner-reveal { from { opacity: 0; transform: translateY(-3px); } to { opacity: 1; transform: translateY(0); } }\n.dsh-partner-automation-actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 12px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-automation-actions button, .dsh-partner-section-heading button { min-height: 32px; padding: 0 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-automation-actions button.is-primary { color: var(--partner-raised); border-color: transparent; background: var(--partner-accent-strong); }\n.dsh-partner-automation-actions button:disabled, .dsh-partner-section-heading button:disabled { opacity: .45; cursor: default; }\n.dsh-partner-inline-notice { display: flex; align-items: center; gap: 6px; margin: 12px 0 0; color: var(--partner-accent-strong); font-size: var(--partner-font-caption); }\n.dsh-partner-section-heading { display: flex; align-items: end; justify-content: space-between; gap: 12px; margin-top: 24px; padding-bottom: 8px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-section-heading span { display: grid; gap: 3px; }\n.dsh-partner-section-heading small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); letter-spacing: .12em; }\n.dsh-partner-section-heading strong { font-size: var(--partner-font-body); }\n.dsh-partner-memory-library { margin-top: 28px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 17px; background: color-mix(in srgb, var(--partner-raised) 58%, transparent); box-shadow: 0 22px 64px color-mix(in srgb, var(--partner-accent-strong) 5%, transparent), inset 0 1px color-mix(in srgb, white 6%, transparent); }\n.dsh-partner-library-header { display: flex; align-items: end; justify-content: space-between; gap: 24px; padding: 19px 20px 0; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-library-header > span { display: grid; gap: 4px; padding-bottom: 15px; }\n.dsh-partner-library-header > span small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .12em; }\n.dsh-partner-library-header > span strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.02em; }\n.dsh-partner-library-header > span p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-library-header nav { display: flex; align-self: stretch; gap: 4px; }\n.dsh-partner-library-header nav button { position: relative; padding: 0 8px; border: 0; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-library-header nav button::after { position: absolute; right: 7px; bottom: -1px; left: 7px; height: 2px; border-radius: 2px; background: var(--partner-accent); opacity: 0; content: ''; }\n.dsh-partner-library-header nav button.is-active { color: var(--partner-text); }\n.dsh-partner-library-header nav button.is-active::after { opacity: 1; }\n.dsh-partner-library-header nav b { margin-left: 4px; color: var(--partner-accent); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-library-tools { display: flex; align-items: center; gap: 12px; min-height: 53px; padding: 9px 12px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-library-tools > label { flex: 0 1 230px; }\n.dsh-partner-library-tools input { width: 100%; height: 34px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-library-tools input::placeholder { color: var(--partner-text-tertiary); }\n.dsh-partner-memory-kinds { display: flex; min-width: 0; gap: 3px; overflow-x: auto; }\n.dsh-partner-memory-kinds button { flex: none; height: 28px; padding: 0 8px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-memory-kinds button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-memory-kinds button.is-active { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 10%, transparent); }\n.dsh-partner-library-browser { display: grid; grid-template-columns: minmax(270px, 31%) minmax(0, 1fr); height: clamp(430px, 58vh, 640px); min-height: 0; overflow: hidden; }\n.dsh-partner-library-list { min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-library-list > button { display: grid; width: 100%; gap: 5px; padding: 12px 14px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; }\n.dsh-partner-library-list > button:hover { background: color-mix(in srgb, var(--partner-accent) 4%, transparent); }\n.dsh-partner-library-list > button.is-active { background: color-mix(in srgb, var(--partner-accent) 8%, transparent); box-shadow: inset 2px 0 var(--partner-accent); }\n.dsh-partner-library-list > button > span { width: max-content; color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-library-list > button > strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 610; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-library-list > button > p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-library-list > button > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-library-list.is-diary time { color: var(--partner-accent); font: 600 var(--partner-font-caption)/1.2 var(--partner-font-family); font-variant-numeric: tabular-nums; }\n.dsh-partner-library-detail { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; padding: 24px clamp(20px, 3vw, 34px) 40px; background: radial-gradient(circle at 92% 4%, color-mix(in srgb, var(--partner-accent) 6%, transparent), transparent 34%); scrollbar-gutter: stable; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) { display: grid; align-content: start; gap: 13px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header,\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header span { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .08em; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header > div { display: flex; gap: 10px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header button { min-width: 28px; min-height: 28px; padding: 0 6px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header button:hover { color: var(--partner-accent); }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > p { max-width: 64ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }\n.dsh-partner-library-detail progress { width: min(100px, 45%); height: 3px; overflow: hidden; border: 0; border-radius: 2px; appearance: none; background: var(--partner-border); }\n.dsh-partner-library-detail progress::-webkit-progress-bar { background: transparent; }\n.dsh-partner-library-detail progress::-webkit-progress-value { background: var(--partner-accent); }\n.dsh-partner-library-detail progress::-moz-progress-bar { background: var(--partner-accent); }\n.dsh-partner-library-detail footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-browser { display: grid; grid-template-columns: minmax(220px, 25%) minmax(0, 1fr); height: clamp(450px, 61vh, 660px); min-height: 0; overflow: hidden; }\n.dsh-partner-profile-people { min-height: 0; overflow-x: hidden; overflow-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-profile-people > button { display: grid; grid-template-columns: 32px minmax(0, 1fr) 7px; align-items: center; gap: 10px; width: 100%; min-height: 58px; padding: 9px 13px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; transition: background-color 150ms ease, box-shadow 180ms var(--partner-ease-out); }\n.dsh-partner-profile-people > button:hover { background: var(--partner-hover); }\n.dsh-partner-profile-people > button.is-active { background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent-strong); }\n.dsh-partner-profile-people > button > span { display: grid; place-items: center; width: 32px; height: 32px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-profile-people > button > div { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-profile-people strong, .dsh-partner-profile-people small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-profile-people strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-profile-people small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-people > button > i { width: 6px; height: 6px; border: 1px solid var(--partner-text-tertiary); border-radius: 50%; }\n.dsh-partner-profile-people > button.is-active > i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-profile-stage { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; padding: 25px clamp(20px, 3vw, 36px) 42px; scrollbar-gutter: stable; }\n.dsh-partner-profile-heading { display: flex; align-items: start; justify-content: space-between; gap: 24px; padding-bottom: 21px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-profile-heading > span { display: grid; max-width: 66ch; gap: 5px; }\n.dsh-partner-profile-heading > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .1em; }\n.dsh-partner-profile-heading > span strong { font-size: var(--partner-font-title); font-weight: 660; letter-spacing: -.025em; }\n.dsh-partner-profile-heading > span p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-profile-heading > div { display: flex; flex: none; align-items: center; gap: 6px; min-height: 28px; padding: 0 9px; border: 1px solid var(--partner-border); border-radius: 999px; color: var(--partner-text-tertiary); background: var(--partner-glass-clear); font-size: var(--partner-font-caption); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-profile-heading > div > i { width: 6px; height: 6px; border: 1px solid currentColor; border-radius: 50%; }\n.dsh-partner-profile-heading > div[data-ready=\"true\"] { color: var(--partner-text-secondary); }\n.dsh-partner-profile-heading > div[data-ready=\"true\"] > i { background: currentColor; }\n.dsh-partner-profile-meta { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 17px 0 8px; padding: 13px 0; border-block: 1px solid var(--partner-separator); }\n.dsh-partner-profile-meta > span { display: grid; min-width: 0; gap: 3px; padding: 0 14px; border-left: 1px solid var(--partner-separator); }\n.dsh-partner-profile-meta > span:first-child { padding-left: 0; border-left: 0; }\n.dsh-partner-profile-meta small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-meta strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-profile-entries { display: grid; }\n.dsh-partner-profile-entries > article, .dsh-partner-profile-pending > div > article { display: grid; gap: 11px; padding: 18px 0; border-bottom: 1px solid var(--partner-separator); }\n.dsh-partner-profile-entries > article > header, .dsh-partner-profile-entries > article > footer,\n.dsh-partner-profile-pending > div > article > header, .dsh-partner-profile-pending > div > article > footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n.dsh-partner-profile-entries article > header > span, .dsh-partner-profile-pending article > header > span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .07em; }\n.dsh-partner-profile-entries article > header > div, .dsh-partner-profile-pending article > header > div { display: flex; gap: 11px; }\n.dsh-partner-profile-entries article > header button, .dsh-partner-profile-pending article > header button { min-width: 28px; min-height: 28px; padding: 0 6px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-profile-entries article > header button:hover, .dsh-partner-profile-pending article > header button:hover { color: var(--partner-text); }\n.dsh-partner-profile-entries article > strong, .dsh-partner-profile-pending article > strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-profile-entries article > p, .dsh-partner-profile-pending article > p { max-width: 68ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; text-wrap: pretty; }\n.dsh-partner-profile-entries progress, .dsh-partner-profile-pending progress { width: min(100px, 45%); height: 3px; overflow: hidden; border: 0; border-radius: 2px; appearance: none; background: var(--partner-border); }\n.dsh-partner-profile-entries progress::-webkit-progress-bar, .dsh-partner-profile-pending progress::-webkit-progress-bar { background: transparent; }\n.dsh-partner-profile-entries progress::-webkit-progress-value, .dsh-partner-profile-pending progress::-webkit-progress-value { background: var(--partner-accent); }\n.dsh-partner-profile-entries progress::-moz-progress-bar, .dsh-partner-profile-pending progress::-moz-progress-bar { background: var(--partner-accent); }\n.dsh-partner-profile-entries footer small, .dsh-partner-profile-pending footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-pending { margin-top: 18px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-profile-pending > summary { display: flex; min-height: 40px; align-items: center; gap: 6px; padding: 8px 0 2px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-weight: 610; list-style: none; cursor: pointer; }\n.dsh-partner-profile-pending > summary::-webkit-details-marker, .dsh-partner-memory-evidence > summary::-webkit-details-marker { display: none; }\n.dsh-partner-profile-pending > summary::before, .dsh-partner-memory-evidence > summary::before { display: inline-block; color: var(--partner-text-tertiary); font-size: 10px; content: '\u203A'; transform: rotate(0); transition: transform 160ms var(--partner-ease-out); }\n.dsh-partner-profile-pending[open] > summary::before, .dsh-partner-memory-evidence[open] > summary::before { transform: rotate(90deg); }\n.dsh-partner-profile-pending > summary b { margin-left: 4px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-memory-evidence { margin-top: 2px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-memory-evidence > summary { display: flex; min-height: 34px; align-items: center; gap: 5px; padding-top: 6px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); list-style: none; cursor: pointer; }\n.dsh-partner-memory-evidence > summary b { margin-left: 3px; font-weight: 620; }\n.dsh-partner-memory-evidence > div { display: grid; gap: 7px; padding-top: 9px; }\n.dsh-partner-memory-evidence blockquote { margin: 0; padding: 9px 11px; border-left: 2px solid var(--partner-border); color: var(--partner-text-secondary); background: color-mix(in srgb, var(--partner-control) 50%, transparent); }\n.dsh-partner-memory-evidence blockquote p { margin: 0; font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-memory-evidence blockquote time { display: block; margin-top: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-memory-editor { display: grid; gap: 9px; }\n.dsh-partner-memory-editor input, .dsh-partner-memory-editor textarea { box-sizing: border-box; width: 100%; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); outline: none; background: var(--partner-control); font: 500 var(--partner-font-caption)/1.5 var(--partner-font-family); }\n.dsh-partner-memory-editor input { min-height: 32px; padding: 0 10px; }\n.dsh-partner-memory-editor textarea { min-height: 76px; padding: 8px 10px; resize: vertical; }\n.dsh-partner-memory-editor input:focus, .dsh-partner-memory-editor textarea:focus { border-color: color-mix(in srgb, var(--partner-accent) 48%, var(--partner-border)); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-memory-editor footer { display: flex; justify-content: flex-end; gap: 7px; }\n.dsh-partner-memory-editor button { min-height: 28px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-memory-editor button.is-primary { border-color: transparent; color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-diary-detail { display: grid; align-content: start; gap: 20px; }\n.dsh-partner-diary-detail > header { display: grid; gap: 5px; padding-bottom: 16px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-diary-detail > header time { color: var(--partner-accent); font: 600 var(--partner-font-caption)/1 var(--partner-font-family); font-variant-numeric: tabular-nums; }\n.dsh-partner-diary-detail > header strong { font-size: var(--partner-font-title); letter-spacing: -.02em; }\n.dsh-partner-diary-detail > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-diary-detail > p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }\n.dsh-partner-diary-detail > section { display: grid; gap: 8px; }\n.dsh-partner-diary-detail > section > strong { color: var(--partner-accent-strong); font-size: var(--partner-font-caption); }\n.dsh-partner-diary-detail ul { display: grid; gap: 6px; margin: 0; padding: 0; list-style: none; }\n.dsh-partner-diary-detail li { position: relative; padding-left: 12px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-diary-detail li::before { position: absolute; top: .62em; left: 1px; width: 3px; height: 3px; border-radius: 50%; background: var(--partner-accent); content: ''; }\n.dsh-partner-graph-audit { min-height: 0; }\n.dsh-partner-graph-toolbar { display: flex; min-height: 78px; align-items: center; justify-content: space-between; gap: 20px; padding: 13px 18px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-graph-toolbar > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-graph-toolbar > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .1em; }\n.dsh-partner-graph-toolbar > span strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 650; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-graph-toolbar > span p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-toolbar > label { display: grid; flex: 0 1 220px; gap: 4px; }\n.dsh-partner-graph-toolbar > label > span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-toolbar select { width: 100%; height: 34px; padding: 0 30px 0 10px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background-color: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-filters { display: flex; min-width: 0; gap: 4px; min-height: 45px; align-items: center; padding: 7px 12px; overflow-x: auto; border-bottom: 1px solid var(--partner-border); scrollbar-width: none; }\n.dsh-partner-graph-filters::-webkit-scrollbar { display: none; }\n.dsh-partner-graph-filters button { flex: none; min-height: 30px; padding: 0 9px; border: 1px solid transparent; border-radius: 8px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; transition: color 140ms ease, background-color 140ms ease, border-color 140ms ease; }\n.dsh-partner-graph-filters button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-graph-filters button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-graph-filters b { margin-left: 3px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-graph-browser { display: grid; grid-template-columns: minmax(270px, 33%) minmax(0, 1fr); height: clamp(430px, 56vh, 620px); min-height: 0; overflow: hidden; }\n.dsh-partner-graph-index { min-height: 0; overflow-x: hidden; overflow-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-graph-index > button { display: grid; width: 100%; gap: 5px; padding: 12px 14px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; transition: background-color 150ms ease, box-shadow 180ms var(--partner-ease-out); }\n.dsh-partner-graph-index > button:hover { background: var(--partner-hover); }\n.dsh-partner-graph-index > button.is-active { background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent-strong); }\n.dsh-partner-graph-index > button > span { width: max-content; padding: 3px 6px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); font-size: var(--partner-font-caption); font-weight: 630; }\n.dsh-partner-graph-index > button[data-kind=\"conflicts_with\"] > span { color: var(--partner-danger); border-color: color-mix(in srgb, var(--partner-danger) 26%, var(--partner-border)); }\n.dsh-partner-graph-index strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-graph-index strong i { color: var(--partner-text-tertiary); font-style: normal; }\n.dsh-partner-graph-index p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-graph-index small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-stage { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; padding: 24px clamp(20px, 3vw, 36px) 40px; scrollbar-gutter: stable; }\n.dsh-partner-graph-stage > article { display: grid; gap: 20px; animation: dsh-partner-content-enter 220ms var(--partner-ease-out) both; }\n.dsh-partner-graph-stage > article > header { display: grid; gap: 6px; padding-bottom: 18px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-graph-stage > article > header > span { width: max-content; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-graph-stage > article[data-kind=\"conflicts_with\"] > header > span { color: var(--partner-danger); }\n.dsh-partner-graph-stage > article > header > strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-graph-stage > article > header > strong i { color: var(--partner-text-tertiary); font-style: normal; font-weight: 450; }\n.dsh-partner-graph-stage > article > header > p { max-width: 68ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-graph-stage > article > header > small { max-width: 72ch; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-graph-pair { display: grid; grid-template-columns: minmax(0, 1fr) 64px minmax(0, 1fr); align-items: stretch; }\n.dsh-partner-graph-pair > section { display: grid; align-content: start; gap: 9px; min-height: 170px; padding: 15px; border: 1px solid var(--partner-border); border-radius: 13px; }\n.dsh-partner-graph-pair > section > header { display: grid; gap: 3px; }\n.dsh-partner-graph-pair > section small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-pair > section strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-graph-pair > section p { margin: 0 0 8px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; overflow-wrap: anywhere; }\n.dsh-partner-graph-pair > section button { width: max-content; min-height: 30px; margin-top: auto; padding: 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-graph-pair > section button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-graph-pair > div { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-pair > div i { height: 1px; background: var(--partner-border); }\n.dsh-partner-graph-pair > div span { padding: 0 5px; white-space: nowrap; }\n.dsh-partner-graph-stage > article > footer { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; padding-top: 2px; }\n.dsh-partner-graph-stage > article > footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-stage > article > footer > strong { color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-variant-numeric: tabular-nums; }\n.dsh-partner-state { display: grid; place-items: center; align-content: center; min-height: 280px; padding: 30px; color: var(--partner-text-tertiary); text-align: center; }\n.dsh-partner-state > svg { margin-bottom: 10px; color: var(--partner-accent); }\n.dsh-partner-state strong { color: var(--partner-text-secondary); font-size: var(--partner-font-label); }\n.dsh-partner-state p { max-width: 330px; margin: 7px 0 14px; font-size: var(--partner-font-body); line-height: 1.55; }\n.dsh-partner-state.is-compact { min-height: 130px; }\n\n/* One material contract for every card surface in the partner workspace.\n Individual components own layout and state; this layer owns glass, edge\n refraction and elevation so visual treatment cannot drift between tabs. */\n:is(\n .dsh-partner-home-details > section,\n .dsh-partner-capabilities button,\n .dsh-partner-weixin-connect,\n .dsh-partner-qr,\n .dsh-partner-channel-card,\n .dsh-partner-metrics article,\n .dsh-partner-automation,\n .dsh-partner-concern-board,\n .dsh-partner-memory-library,\n .dsh-partner-graph-pair > section\n) {\n border-color: var(--partner-border);\n background:\n linear-gradient(118deg, color-mix(in srgb, var(--partner-card-highlight) 18%, transparent), transparent 56%),\n var(--partner-card-surface);\n box-shadow: var(--partner-card-shadow);\n}\n\n/* Editable controls share one compact translucent material. Keeping this\n separate from cards preserves hierarchy while preventing theme defaults or\n platform form colors from leaking into the workspace. */\n:is(\n .dsh-partner-field input,\n .dsh-partner-field textarea,\n .dsh-partner-field select,\n .dsh-partner-review-policy select,\n .dsh-partner-concern-compose input,\n .dsh-partner-library-tools input,\n .dsh-partner-memory-editor input,\n .dsh-partner-memory-editor textarea,\n .dsh-partner-graph-toolbar select\n) {\n background-color: var(--partner-control);\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 54%, transparent),\n inset 0 -1px 0 var(--partner-glass-rim-shadow);\n}\n\n:is(\n .dsh-partner-field input,\n .dsh-partner-field textarea,\n .dsh-partner-field select,\n .dsh-partner-review-policy select,\n .dsh-partner-concern-compose input,\n .dsh-partner-library-tools input,\n .dsh-partner-memory-editor input,\n .dsh-partner-memory-editor textarea,\n .dsh-partner-graph-toolbar select\n):focus {\n border-color: var(--partner-focus-ring);\n background-color: var(--partner-raised);\n box-shadow:\n 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent),\n inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 66%, transparent);\n}\n\n.dsh-partner-concern-decision {\n background: color-mix(in srgb, var(--partner-card-surface) 76%, transparent);\n box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 68%, transparent);\n}\n\n.dsh-partner-capabilities button.is-active {\n border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border));\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--partner-card-highlight) 46%, transparent), transparent 58%),\n color-mix(in srgb, var(--partner-card-surface) 90%, var(--partner-card-highlight) 10%);\n box-shadow: var(--partner-card-shadow), inset 2px 0 var(--partner-text-secondary);\n}\n\n/* Shared motion and material contract. Business components keep their own\n layout while interactive surfaces receive one consistent physical response. */\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n) {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n)::after {\n position: absolute;\n z-index: -1;\n top: -75%;\n bottom: -75%;\n left: -70%;\n width: 48%;\n border-radius: 45%;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .24), transparent);\n opacity: 0;\n transform: skewX(-18deg) translate3d(0, 0, 0);\n pointer-events: none;\n transition: opacity 140ms ease, transform 680ms var(--partner-ease-out);\n content: \"\";\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n):hover:not(:disabled)::after {\n opacity: 1;\n transform: skewX(-18deg) translate3d(360%, 0, 0);\n}\n\n:is(\n .dsh-partner-roster-title button,\n .dsh-partner-home-details header button,\n .dsh-partner-qr button,\n .dsh-partner-pairings button,\n .dsh-partner-session-list button,\n .dsh-partner-review-policy > button:last-child,\n .dsh-partner-automation-actions button,\n .dsh-partner-section-heading button,\n .dsh-partner-concern-actions button,\n .dsh-partner-concern-resolved button,\n .dsh-partner-memory-editor button,\n .dsh-partner-graph-pair > section button\n) {\n transition:\n color 140ms ease,\n border-color 140ms ease,\n background-color 140ms ease,\n box-shadow 180ms ease,\n transform 160ms var(--partner-ease-out);\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button,\n .dsh-partner-session-list button,\n .dsh-partner-review-policy > button:last-child,\n .dsh-partner-automation-actions button,\n .dsh-partner-section-heading button,\n .dsh-partner-concern-actions button,\n .dsh-partner-concern-resolved button,\n .dsh-partner-memory-editor button,\n .dsh-partner-graph-pair > section button\n):active:not(:disabled) {\n transform: scale(.97);\n}\n\n:is(.dsh-partner-library-list > button, .dsh-partner-graph-index > button):hover {\n border-color: var(--partner-border);\n background: var(--partner-hover);\n}\n\n.dsh-partner-home-details > section,\n.dsh-partner-metrics > article,\n.dsh-partner-automation-grid > section {\n animation: dsh-partner-item-enter 300ms var(--partner-ease-out) both;\n}\n.dsh-partner-home-details > section:nth-child(2),\n.dsh-partner-metrics > article:nth-child(2),\n.dsh-partner-automation-grid > section:nth-child(2) { animation-delay: 36ms; }\n.dsh-partner-home-details > section:nth-child(3),\n.dsh-partner-metrics > article:nth-child(3) { animation-delay: 72ms; }\n\n@keyframes dsh-partner-content-enter {\n from { opacity: 0; transform: translate3d(0, 6px, 0); }\n to { opacity: 1; transform: translate3d(0, 0, 0); }\n}\n@keyframes dsh-partner-item-enter {\n from { opacity: 0; transform: translate3d(0, 8px, 0) scale(.99); }\n to { opacity: 1; transform: translate3d(0, 0, 0) scale(1); }\n}\n\n@media (prefers-reduced-transparency: reduce) {\n :is(.dsh-partner-sidebar, .dsh-partner-workspace) {\n --partner-canvas: var(--partner-solid-canvas);\n --partner-surface: var(--partner-solid-panel);\n --partner-pane: var(--partner-solid-panel);\n --partner-raised: var(--partner-solid-raised);\n --partner-control: var(--partner-solid-control);\n --partner-card-surface: var(--partner-solid-raised);\n }\n .dsh-partner-topbar,\n .dsh-partner-roster,\n .dsh-partner-stage,\n .dsh-partner-home-channel,\n .dsh-partner-home-details > section,\n .dsh-partner-capabilities button,\n .dsh-partner-weixin-connect,\n .dsh-partner-qr,\n .dsh-partner-channel-card,\n .dsh-partner-metrics article,\n .dsh-partner-automation,\n .dsh-partner-concern-board,\n .dsh-partner-memory-library,\n .dsh-partner-graph-pair > section { -webkit-backdrop-filter: none; backdrop-filter: none; }\n .dsh-partner-glass-surface { -webkit-backdrop-filter: none; backdrop-filter: none; }\n}\n\n@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {\n :is(.dsh-partner-sidebar, .dsh-partner-workspace) {\n --partner-canvas: var(--partner-solid-canvas);\n --partner-surface: var(--partner-solid-panel);\n --partner-pane: var(--partner-solid-panel);\n --partner-raised: var(--partner-solid-raised);\n --partner-control: var(--partner-solid-control);\n --partner-card-surface: var(--partner-solid-raised);\n }\n}\n\n@container partner-memory (max-width: 980px) {\n .dsh-partner-automation-grid { grid-template-columns: minmax(0, 1fr); }\n}\n\n@container partner-memory (max-width: 640px) {\n .dsh-partner-automation-fields.is-heartbeat { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(0, 1fr); }\n .dsh-partner-review-policy { grid-template-columns: auto minmax(0, 1fr); }\n .dsh-partner-review-policy > label,\n .dsh-partner-review-policy > button:last-child { grid-column: span 1; }\n .dsh-partner-concern-board > header p { display: none; }\n .dsh-partner-concern-row { grid-template-columns: minmax(0, 1fr) auto 14px; gap: 7px; }\n .dsh-partner-concern-state { grid-column: 1; }\n .dsh-partner-concern-copy { grid-row: 2; grid-column: 1 / -1; padding-left: 13px; }\n .dsh-partner-concern-time { grid-row: 1; grid-column: 2; }\n .dsh-partner-concern-row > svg { grid-row: 1; grid-column: 3; }\n .dsh-partner-concern-detail { padding: 0 12px 11px 25px; }\n .dsh-partner-concern-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n}\n\n@media (max-width: 1080px) {\n .dsh-partner-grid { grid-template-columns: 190px minmax(400px, 1fr); }\n .dsh-partner-home-channel { grid-template-columns: minmax(190px, .7fr) minmax(300px, 1.3fr); }\n .dsh-partner-home-channel-copy { padding-right: 26px; }\n}\n@media (max-width: 760px) {\n .dsh-partner-access-list { grid-template-columns: 1fr; }\n .dsh-partner-runtime-fields { grid-template-columns: 1fr; }\n .dsh-partner-topbar { align-items: stretch; flex-direction: column; gap: 7px; padding: 7px 9px; }\n .dsh-partner-mobile-workspace-nav { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 4px; }\n .dsh-partner-mobile-workspace-nav button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; gap: 5px; padding: 0 8px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; font: 580 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n .dsh-partner-mobile-workspace-nav button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); }\n .dsh-partner-grid { grid-template-columns: 1fr; }\n .dsh-partner-roster { display: none; }\n .dsh-partner-identity { padding-inline: 16px; }\n .dsh-partner-tabs { margin-inline: 12px; overflow-x: auto; }\n .dsh-partner-tabs button { flex: none; }\n .dsh-partner-stage-scroll { padding: 19px 16px 38px; }\n .dsh-partner-stage-scroll.is-workspace-page { padding: 0; }\n .dsh-partner-fields.two,\n .dsh-partner-capabilities,\n .dsh-partner-metrics { grid-template-columns: 1fr; }\n .dsh-partner-capability-group { padding: 11px; }\n .dsh-partner-capability-group > header { display: grid; gap: 8px; }\n .dsh-partner-capability-group > header em { justify-self: start; }\n .dsh-partner-home-heading { display: grid; gap: 8px; }\n .dsh-partner-home-heading p { text-align: left; }\n .dsh-partner-home-channel { grid-template-columns: 1fr; }\n .dsh-partner-home-route { min-height: 128px; padding-bottom: 10px; }\n .dsh-partner-home-channel-copy { padding: 12px 22px 24px; }\n .dsh-partner-home-details { grid-template-columns: 1fr; }\n .dsh-partner-home-profile { grid-row: auto; }\n .dsh-partner-weixin-connect { grid-template-columns: 52px 1fr; }\n .dsh-partner-weixin-connect > button { grid-column: 1 / -1; }\n .dsh-partner-qr { grid-template-columns: 1fr; justify-items: center; text-align: center; }\n .dsh-partner-qr > span { justify-items: center; }\n .dsh-partner-channel-card { grid-template-columns: 45px minmax(0, 1fr) auto; }\n .dsh-partner-channel-card > .dsh-partner-status { display: none; }\n .dsh-partner-library-header { display: grid; gap: 0; }\n .dsh-partner-library-header nav { min-height: 38px; }\n .dsh-partner-library-tools { display: grid; }\n .dsh-partner-library-tools > label { width: 100%; }\n .dsh-partner-library-browser { grid-template-columns: 1fr; height: auto; overflow: visible; }\n .dsh-partner-library-list { max-height: 300px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-library-detail { min-height: 280px; }\n .dsh-partner-profile-browser { grid-template-columns: 1fr; height: auto; overflow: visible; }\n .dsh-partner-profile-people { max-height: 240px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-profile-stage { min-height: 330px; }\n .dsh-partner-profile-heading { display: grid; }\n .dsh-partner-profile-heading > div { width: max-content; }\n .dsh-partner-profile-meta { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-profile-meta > span:nth-child(3) { padding-left: 0; border-left: 0; }\n .dsh-partner-graph-toolbar { display: grid; min-height: 0; gap: 12px; }\n .dsh-partner-graph-toolbar > label { width: 100%; }\n .dsh-partner-graph-browser { grid-template-columns: 1fr; height: auto; }\n .dsh-partner-graph-index { max-height: 280px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-graph-stage { min-height: 320px; }\n .dsh-partner-graph-pair { grid-template-columns: 1fr; gap: 9px; }\n .dsh-partner-graph-pair > div { min-height: 20px; grid-template-columns: 1fr auto 1fr; }\n .dsh-partner-graph-stage > article > footer { display: grid; gap: 4px; }\n}\n@media (prefers-reduced-motion: reduce) {\n .dsh-partner-workspace *,\n .dsh-partner-sidebar * { scroll-behavior: auto !important; transition-duration: .01ms !important; animation-duration: .01ms !important; }\n}\n", ".dsh-partner-feature-hero-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 8px; }\n.dsh-partner-feature-page { gap: 20px; }\n.dsh-partner-feature-hero { min-height: 92px; padding-bottom: 18px; }\n.dsh-partner-feature-hero p { max-width: 62ch; text-wrap: pretty; }\n.dsh-partner-feature-block { gap: 16px; padding: 20px; border-radius: 18px; box-shadow: inset 0 1px 0 var(--partner-card-highlight), 0 5px 16px color-mix(in srgb, var(--partner-text) 4%, transparent); }\n.dsh-partner-feature-block > header { min-height: 40px; }\n.dsh-partner-feature-block > header strong { font-size: var(--partner-font-label); letter-spacing: -.01em; }\n.dsh-partner-feature-block > header small { margin-top: 1px; }\n\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select) { outline: 0; }\n.dsh-partner-workspace select:not([multiple]) {\n appearance: none;\n padding-right: 32px;\n border-color: var(--partner-border);\n border-radius: 9px;\n color: var(--partner-text);\n background-color: var(--partner-control);\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 15px) calc(50% - 1px), calc(100% - 11px) calc(50% - 1px);\n background-repeat: no-repeat;\n background-size: 4px 4px, 4px 4px;\n box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 54%, transparent), inset 0 -1px 0 var(--partner-glass-rim-shadow);\n font-family: var(--partner-font-family);\n font-size: var(--partner-font-body);\n font-weight: 520;\n cursor: pointer;\n transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease;\n}\n.dsh-partner-workspace select:not([multiple]):hover:not(:disabled) { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background-color: var(--partner-hover); }\n.dsh-partner-workspace select:not([multiple]):focus-visible { border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent), inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 66%, transparent); }\n.dsh-partner-workspace select:not([multiple]):disabled { cursor: not-allowed; }\n.dsh-partner-workspace select option { color: var(--partner-text); background: var(--partner-solid-control); font: inherit; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer { align-items: center; margin-top: 4px; padding-top: 16px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-form-footer-spacer { flex: 1; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer .is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer .is-primary:hover { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > .dsh-partner-workspace-notice { grid-column: 1 / -1; margin: 0; }\n.dsh-partner-feature-page button:disabled { cursor: not-allowed; opacity: .48; }\n.dsh-partner-identity-danger > div { display: flex; align-items: center; justify-content: flex-end; gap: 7px; }\n.dsh-partner-identity-danger[data-confirming=\"true\"] { margin-inline: -12px; padding: 16px 12px 0; border-top-color: color-mix(in srgb, var(--partner-danger) 30%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 4%, transparent); }\n.dsh-partner-identity-danger button.is-secondary { border-color: var(--partner-border); color: var(--partner-text-secondary); background: var(--partner-control); }\n.dsh-partner-identity-danger button.is-danger { color: var(--partner-on-accent); border-color: var(--partner-danger); background: var(--partner-danger); }\n.dsh-partner-profile-entries article > header button.is-danger { color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 8%, transparent); }\n\n.dsh-partner-skill-installed > article,\n.dsh-partner-market-grid > article,\n.dsh-partner-schedule-list > article { transition: border-color 150ms ease, background-color 150ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-skill-installed > article:hover,\n.dsh-partner-schedule-list > article:hover { border-color: color-mix(in srgb, var(--partner-text) 20%, var(--partner-border)); background: color-mix(in srgb, var(--partner-hover) 60%, var(--partner-raised)); transform: translate3d(0, -1px, 0); }\n.dsh-partner-schedule-meta { display: flex !important; align-items: center; flex-wrap: wrap; gap: 5px 10px !important; margin-top: 2px; }\n.dsh-partner-schedule-meta > em { position: relative; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; font-variant-numeric: tabular-nums; }\n.dsh-partner-schedule-meta > em + em::before { position: absolute; top: 50%; left: -6px; width: 2px; height: 2px; border-radius: 50%; background: var(--partner-text-tertiary); content: \"\"; }\n.dsh-partner-run-list > article { border-radius: 9px; transition: background-color 140ms ease; }\n.dsh-partner-run-list > article:hover { background: var(--partner-hover); }\n.dsh-partner-board > section { border-radius: 16px; }\n.dsh-partner-task-card { box-shadow: none; }\n.dsh-partner-task-card[data-expanded=\"true\"] { box-shadow: 0 6px 18px color-mix(in srgb, var(--partner-text) 6%, transparent); }\n\n@media (hover: hover) {\n .dsh-partner-skill-installed .is-icon,\n .dsh-partner-schedule-list .is-icon { opacity: .34; transition: opacity 140ms ease, color 140ms ease, background-color 140ms ease; }\n .dsh-partner-skill-installed > article:hover .is-icon,\n .dsh-partner-schedule-list > article:hover .is-icon,\n .dsh-partner-skill-installed .is-icon:focus-visible,\n .dsh-partner-schedule-list .is-icon:focus-visible { opacity: 1; }\n}\n\n.dsh-partner-workspace-dialog-layer { position: absolute; z-index: 12; inset: 0; display: flex; align-items: center; justify-content: center; padding: clamp(16px, 3vw, 32px); background: var(--partner-dialog-veil); }\n.dsh-partner-workspace-dialog { position: relative; inset: auto; display: grid; grid-template-rows: auto minmax(0, 1fr); width: min(560px, 100%); max-width: none; height: auto; max-height: min(680px, 100%); margin: 0; padding: 0; overflow: hidden; border: 1px solid color-mix(in srgb, var(--partner-text) 18%, var(--partner-border)); border-radius: 16px; color: var(--partner-text); background: var(--partner-solid-panel); box-shadow: 0 22px 58px color-mix(in srgb, #000 18%, transparent), 0 4px 14px color-mix(in srgb, #000 8%, transparent), inset 0 1px 0 var(--partner-card-highlight); animation: dsh-partner-dialog-enter 200ms var(--partner-ease-out) both; }\n.dsh-partner-workspace-dialog.is-wide { width: min(680px, 100%); max-height: min(720px, 100%); }\n.dsh-partner-workspace-dialog > header { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 20px; padding: 22px 22px 18px; border-bottom: 1px solid var(--partner-separator); background: var(--partner-solid-raised); }\n.dsh-partner-workspace-dialog > header > span { display: grid; gap: 5px; min-width: 0; }\n.dsh-partner-workspace-dialog > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 680; letter-spacing: .09em; }\n.dsh-partner-workspace-dialog > header strong { font-size: var(--partner-font-title); line-height: 1.25; font-weight: 660; letter-spacing: -.025em; text-wrap: balance; }\n.dsh-partner-workspace-dialog > header p { max-width: 58ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; text-wrap: pretty; }\n.dsh-partner-workspace-dialog > header button { display: grid; place-items: center; width: 32px; min-height: 32px; padding: 0; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; cursor: pointer; transition: color 140ms ease, border-color 140ms ease, background-color 140ms ease, transform 140ms var(--partner-ease-out); }\n.dsh-partner-workspace-dialog > header button:hover { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-workspace-dialog > header button:active { transform: scale(.94); }\n.dsh-partner-workspace-dialog-body { min-width: 0; min-height: 0; overflow: auto; padding: 20px 22px 24px; overscroll-behavior: contain; scrollbar-gutter: stable; }\n.dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) { margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }\n.dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child { position: sticky; z-index: 2; bottom: -24px; margin: 4px -22px -24px; padding: 14px 22px; border-top: 1px solid var(--partner-separator); background: var(--partner-solid-raised); box-shadow: 0 -10px 24px color-mix(in srgb, #000 5%, transparent); }\n\n.dsh-partner-workspace-notice { display: grid; grid-template-columns: 7px minmax(0, 1fr); align-items: start; gap: 10px; margin: 0 0 14px; padding: 11px 13px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-body); line-height: 1.5; }\n.dsh-partner-workspace-notice > i { width: 7px; height: 7px; margin-top: .42em; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-workspace-notice.is-error { border-color: color-mix(in srgb, var(--partner-danger) 30%, var(--partner-border)); color: var(--partner-danger); }\n.dsh-partner-workspace-notice.is-error > i { background: var(--partner-danger); }\n.dsh-partner-workspace-notice.is-warning > i { background: var(--partner-warning); }\n.dsh-partner-workspace-notice.is-success > i { background: var(--partner-success); }\n\n.dsh-partner-collection-empty { display: grid; justify-items: center; padding: 38px 24px 42px; color: var(--partner-text-secondary); text-align: center; }\n.dsh-partner-collection-empty > span { display: grid; place-items: center; width: 42px; height: 42px; margin-bottom: 12px; border: 1px solid var(--partner-border); border-radius: 13px; color: var(--partner-text-tertiary); background: var(--partner-control); }\n.dsh-partner-collection-empty > strong { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-collection-empty > p { max-width: 46ch; margin: 6px 0 14px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); line-height: 1.55; text-wrap: pretty; }\n.dsh-partner-collection-empty > button { margin-top: 14px; }\n\n.dsh-partner-collection-skeleton { display: grid; gap: 8px; padding: 6px 0; }\n.dsh-partner-collection-skeleton > i { display: block; height: 68px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 12px; background: linear-gradient(100deg, var(--partner-control) 20%, var(--partner-hover) 38%, var(--partner-control) 56%); background-size: 220% 100%; animation: dsh-partner-skeleton 1.4s ease-in-out infinite; }\n\n.dsh-partner-count-label { display: inline-flex; align-items: baseline; gap: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-count-label > b { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 650; }\n\n@keyframes dsh-partner-dialog-enter { from { opacity: 0; transform: translate3d(0, 10px, 0) scale(.985); } to { opacity: 1; transform: translate3d(0, 0, 0) scale(1); } }\n@keyframes dsh-partner-skeleton { 0% { background-position: 120% 0; } 100% { background-position: -120% 0; } }\n\n@media (max-width: 760px) {\n .dsh-partner-workspace-dialog-layer { align-items: stretch; padding: 0; }\n .dsh-partner-workspace-dialog, .dsh-partner-workspace-dialog.is-wide { width: 100%; height: 100%; max-height: none; border-width: 0; border-radius: 0; }\n .dsh-partner-workspace-dialog > header { padding: 18px 18px 15px; }\n .dsh-partner-workspace-dialog-body { padding: 18px 18px 26px; }\n .dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child { bottom: -26px; margin: 4px -18px -26px; padding: 13px 18px max(13px, env(safe-area-inset-bottom)); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-partner-workspace-dialog, .dsh-partner-collection-skeleton > i { animation: none; }\n}\n", "export const PARTNER_API = '/partner-local/v1'\n\nexport type Capability = 'knowledge' | 'skills' | 'ssh' | 'git' | 'companions' | 'schedules' | 'access'\nexport interface AutomationView {\n memory: { enabled: boolean; retentionDays: number; provider?: string; model?: string; dailyReviewEnabled: boolean; dailyReviewHour: number }\n heartbeat: { enabled: boolean; intervalMinutes: number; quietStartHour: number; quietEndHour: number; dailyLimit: number }\n}\nexport interface CompanionView {\n id: string; name: string; role: string; description: string; instructions: string\n presetId?: string; provider?: string; model?: string; capabilities: Capability[]\n createdAt: number; updatedAt: number\n automation: AutomationView\n}\nexport interface ChannelView {\n id: string; companionId: string; accountId: string; name: string; enabled: boolean\n createdAt: number; updatedAt: number; runtimeStatus: 'stopped' | 'starting' | 'running' | 'error'\n lastError?: string; credentialConfigured: boolean\n}\nexport interface PairingView {\n id: string; channelId: string; userId: string; displayName: string\n status: 'pending' | 'approved' | 'blocked'; createdAt: number; updatedAt: number\n}\nexport interface ChannelSessionView {\n id: string; kind: 'local' | 'channel'; channelId: string; userId: string; companionId: string; sessionId: string; cwd?: string; lastMessageAt: number; archived: boolean\n}\nexport interface HeartbeatStateView {\n companionId: string; lastCheckedAt?: number; lastSentAt?: number; nextCheckAt: number\n sentDay: string; sentCount: number; consecutiveFailures: number; lastError?: string\n}\nexport type MemoryKindView = 'profile' | 'preference' | 'task' | 'event' | 'relationship' | 'emotion'\nexport interface MemoryEvidenceView { turnId: string; at: number; excerpt: string }\nexport interface MemoryView { id: string; scopeId: string; kind: MemoryKindView; subject: string; content: string; status: 'active' | 'completed' | 'superseded' | 'expired'; confidence: number; importance: number; updatedAt: number; locked?: boolean; evidence: MemoryEvidenceView[] }\nexport interface UserProfileSnapshotView { scopeId: string; label: string; version: string; updatedAt?: number; entries: MemoryView[]; evidenceCount: number; lockedCount: number }\nexport interface MemoryRelationView { id: string; scopeId: string; sourceMemoryId: string; targetMemoryId: string; kind: 'supports' | 'depends_on' | 'about' | 'conflicts_with' | 'follows'; label: string; confidence: number; updatedAt: number }\nexport interface MemoryGraphView { memories: MemoryView[]; relations: MemoryRelationView[] }\nexport interface DailyReflectionView { date: string; summary: string; events: string[]; openTasks: string[]; completedTasks: string[]; learnings: string[]; updatedAt: number; turnCount: number }\nexport interface ConcernView {\n id: string; subject: string; reason: string; origin: 'explicit' | 'implicit'; state: 'active' | 'watching' | 'snoozed' | 'resolved' | 'archived'\n priority: number; confidence: number; score: number; watchKind: 'auto' | 'knowledge' | 'workspace' | 'web'; updatedAt: number; nextCheckAt: number; lastCheckedAt?: number\n resources: Array<{ kind: 'file' | 'knowledge'; locator: string; label: string }>\n}\nexport interface ConcernObservationView {\n id: string; concernId: string; event: string; evidence: string; source: string; interruptScore: number\n decision: 'drop' | 'remember' | 'defer' | 'feed' | 'notify'; notificationRuleEffect: 'auto' | 'notify' | 'suppress'\n notificationRuleReason: string; decisionReason: string; createdAt: number; mentionedAt?: number\n}\nexport interface ConcernActivityView { concerns: ConcernView[]; observations: ConcernObservationView[] }\nexport interface ConcernSourceView { kind: 'file' | 'knowledge'; label: string; detail: string; token: string }\nexport interface PresetView { id: string; name: string; broken?: string }\nexport interface ModelCatalogView { providers: Array<{ id: string; name: string; models: Array<{ id: string; name: string }> }>; defaultSelection: { provider: string; model: string } }\nexport interface PartnerSnapshot {\n companions: CompanionView[]; channels: ChannelView[]; pairings: PairingView[]; sessions: ChannelSessionView[]; heartbeatStates: HeartbeatStateView[]; presets: PresetView[]\n}\nexport interface LoginView {\n id: string; companionId: string; phase: 'waiting' | 'scanned' | 'confirmed' | 'expired' | 'error'\n qrContent?: string; accountId?: string; baseUrl?: string; error?: string; expiresAt: number\n}\n\nexport interface SkillView {\n id: string; name: string; displayName: string; description: string; version: string\n source: 'builtin' | 'market' | 'local'; sourceId?: string; executionContext: 'inline' | 'fork'; trusted: boolean; updatedAt: number\n}\nexport interface SkillBindingView { companionId: string; skillId: string; enabled: boolean }\nexport interface SkillMarketSourceView { id: string; name: string; kind: 'dsh-index' | 'clawhub' | 'loophub' | 'skillhub'; indexUrl: string; enabled: boolean; trusted: boolean; builtin?: boolean }\nexport interface MarketSkillView { id: string; name: string; description: string; version: string; tags: string[]; sourceId: string }\nexport interface SkillCatalogView { installed: SkillView[]; bindings: SkillBindingView[]; sources: SkillMarketSourceView[] }\nexport interface SkillMarketView { sources: SkillMarketSourceView[]; entries: MarketSkillView[]; errors: Array<{ sourceId: string; error: string }> }\nexport interface SkillMarketNetworkView { proxyUrl?: string }\nexport interface SkillMarketNetworkTestView { ok: true; latencyMs: number; sourceCount: number; entryCount: number }\n\nexport type BoardTaskStatusView = 'backlog' | 'ready' | 'doing' | 'review' | 'done' | 'blocked'\nexport interface BoardTaskView {\n id: string; title: string; description: string; status: BoardTaskStatusView; priority: 'low' | 'normal' | 'high' | 'urgent'\n assigneeCompanionId?: string; reviewerCompanionId?: string; createdBy: 'user' | 'companion' | 'schedule'; revision: number; createdAt: number; updatedAt: number; completedAt?: number\n skillIds: string[]; dependencyTaskIds: string[]; resultAbstract?: string; resultSummary?: string; reviewHandoff?: string; reviewSummary?: string; dueAt?: number\n}\nexport interface TaskActivityView { id: string; taskId: string; actor: 'user' | 'companion' | 'schedule' | 'system'; actorCompanionId?: string; kind: string; message: string; at: number }\nexport interface TaskBoardView { tasks: BoardTaskView[]; activities: TaskActivityView[] }\nexport interface PartnerDirectoryEntryView { id: string; name: string; role: string; description: string; capabilities: string[]; enabledSkills: Array<{ id: string; name: string }>; availability: 'available' | 'busy' | 'offline' }\nexport interface PartnerDelegationView {\n id: string; kind?: 'task' | 'review'; taskId: string; toCompanionId: string; status: 'queued' | 'running' | 'completed' | 'failed' | 'canceled'\n attempts?: number; nextAttemptAt?: number; lastAttemptAt?: number; error?: string; createdAt: number\n}\nexport interface CompanionAccessView { targetIds: string[]; companions: PartnerDirectoryEntryView[] }\n\nexport interface ScheduledTaskView {\n id: string; companionId: string; title: string; prompt: string\n schedule: { kind: 'interval'; minutes: number } | { kind: 'daily'; hour: number; minute: number }\n enabled: boolean; destroySessionAfterRun: boolean; overlapPolicy: 'skip' | 'queue'; timeoutMinutes: number\n nextRunAt: number; lastRunAt?: number; lastRunStatus?: 'completed' | 'failed' | 'skipped'; createdAt: number; updatedAt: number\n}\nexport interface ExecutionRunView { id: string; kind: 'schedule' | 'delegation' | 'review' | 'skill'; ownerCompanionId: string; sessionId: string; sourceId: string; status: string; destroyAfterRun: boolean; startedAt: number; completedAt?: number; outputSummary?: string; error?: string }\n\nexport async function api<T>(path = '', init: RequestInit = {}): Promise<T> {\n const method = init.method ?? 'GET'\n const response = await fetch(`${PARTNER_API}${path}`, {\n ...init,\n headers: {\n Accept: 'application/json',\n ...(method === 'GET' ? {} : { 'Content-Type': 'application/json', 'X-DSH-Partner-Request': '1' }),\n ...init.headers,\n },\n })\n if (response.status === 204) return undefined as T\n const body = await response.json().catch(() => ({})) as Record<string, unknown>\n if (!response.ok) throw new Error(typeof body.error === 'string' ? body.error : `HTTP ${response.status}`)\n return body as T\n}\n\nexport function loadPartner(): Promise<PartnerSnapshot> { return api() }\n", "import { useEffect, type RefObject } from 'react'\n\nexport function useWorkspaceTopAnchor(ref: RefObject<HTMLElement>): void {\n useEffect(() => {\n const element = ref.current\n const originalParent = element?.parentElement\n if (!element || !originalParent) return\n let moved = false\n let observer: MutationObserver | undefined\n const place = (): boolean => {\n let ancestor: HTMLElement | null = element.parentElement\n while (ancestor && ancestor !== document.body) {\n const candidate = ancestor.previousElementSibling\n if (candidate instanceof HTMLElement) {\n const style = getComputedStyle(candidate)\n if (style.display === 'flex' && style.flexDirection === 'column' && Number.parseFloat(style.flexGrow) > 0) {\n candidate.insertBefore(element, candidate.firstChild)\n moved = true\n return true\n }\n }\n ancestor = ancestor.parentElement\n }\n return false\n }\n if (!place()) {\n observer = new MutationObserver(() => { if (place()) observer?.disconnect() })\n observer.observe(document.body, { childList: true, subtree: true })\n }\n return () => {\n observer?.disconnect()\n if (moved && originalParent.isConnected) originalParent.append(element)\n }\n }, [ref])\n}\n", "export function futureTime(value: number, now = Date.now()): string {\n const minutes = Math.ceil((value - now) / 60_000)\n if (minutes <= 0) return '\u5373\u5C06\u68C0\u67E5'\n if (minutes < 60) return `${minutes} \u5206\u949F\u540E`\n const hours = Math.ceil(minutes / 60)\n if (hours < 24) return `${hours} \u5C0F\u65F6\u540E`\n const days = Math.ceil(hours / 24)\n if (days <= 7) return `${days} \u5929\u540E`\n const date = new Date(value)\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n const hour = String(date.getHours()).padStart(2, '0')\n const minute = String(date.getMinutes()).padStart(2, '0')\n return `${month}/${day} ${hour}:${minute}`\n}\n", "import {\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\ntype GlassElement = 'header' | 'aside' | 'section' | 'article' | 'div' | 'button'\n\ninterface GlassSurfaceProps extends Omit<HTMLAttributes<HTMLElement>, 'children' | 'className'> {\n as: GlassElement\n children: ReactNode\n className: string\n borderRadius: number\n borderWidth?: number\n brightness?: number\n blur?: number\n distortionScale?: number\n interactive?: boolean\n opacity?: number\n saturation?: number\n type?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n}\n\ninterface GlassStyle extends CSSProperties {\n '--partner-glass-filter-id': string\n '--partner-glass-saturation': number\n '--partner-glare-x': string\n '--partner-glare-y': string\n}\n\nfunction supportsSvgBackdropFilter(filterId: string): boolean {\n if (typeof window === 'undefined' || typeof document === 'undefined') return false\n if (window.matchMedia('(prefers-reduced-transparency: reduce)').matches) return false\n const userAgent = navigator.userAgent\n if (/Firefox/i.test(userAgent) || (/Safari/i.test(userAgent) && !/(Chrome|Chromium|CriOS)/i.test(userAgent))) return false\n const probe = document.createElement('div')\n probe.style.backdropFilter = `url(#${filterId})`\n return probe.style.backdropFilter !== ''\n}\n\nfunction displacementMap(\n width: number,\n height: number,\n radius: number,\n borderWidth: number,\n brightness: number,\n opacity: number,\n blur: number,\n redGradientId: string,\n blueGradientId: string,\n): string {\n const edge = Math.max(1, Math.min(width, height) * borderWidth * .5)\n const innerWidth = Math.max(1, width - edge * 2)\n const innerHeight = Math.max(1, height - edge * 2)\n const svg = `<svg viewBox=\"0 0 ${width} ${height}\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <linearGradient id=\"${redGradientId}\" x1=\"100%\" y1=\"0%\" x2=\"0%\" y2=\"0%\"><stop offset=\"0%\" stop-color=\"#0000\"/><stop offset=\"100%\" stop-color=\"red\"/></linearGradient>\n <linearGradient id=\"${blueGradientId}\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"><stop offset=\"0%\" stop-color=\"#0000\"/><stop offset=\"100%\" stop-color=\"blue\"/></linearGradient>\n </defs>\n <rect width=\"${width}\" height=\"${height}\" fill=\"black\"/>\n <rect width=\"${width}\" height=\"${height}\" rx=\"${radius}\" fill=\"url(#${redGradientId})\"/>\n <rect width=\"${width}\" height=\"${height}\" rx=\"${radius}\" fill=\"url(#${blueGradientId})\" style=\"mix-blend-mode:difference\"/>\n <rect x=\"${edge}\" y=\"${edge}\" width=\"${innerWidth}\" height=\"${innerHeight}\" rx=\"${radius}\" fill=\"hsl(0 0% ${brightness}% / ${opacity})\" style=\"filter:blur(${blur}px)\"/>\n </svg>`\n return `data:image/svg+xml,${encodeURIComponent(svg)}`\n}\n\nexport function GlassSurface({\n as: Element,\n children,\n className,\n borderRadius,\n borderWidth = .07,\n brightness = 50,\n blur = 11,\n distortionScale = -26,\n interactive = false,\n opacity = .93,\n saturation = 1.16,\n ...elementProps\n}: GlassSurfaceProps): JSX.Element {\n const uniqueId = useId().replace(/:/g, '-')\n const filterId = `partner-glass-filter-${uniqueId}`\n const redGradientId = `partner-glass-red-${uniqueId}`\n const blueGradientId = `partner-glass-blue-${uniqueId}`\n const containerRef = useRef<HTMLElement>(null)\n const imageRef = useRef<SVGFEImageElement>(null)\n const redRef = useRef<SVGFEDisplacementMapElement>(null)\n const greenRef = useRef<SVGFEDisplacementMapElement>(null)\n const blueRef = useRef<SVGFEDisplacementMapElement>(null)\n const glareFrameRef = useRef(0)\n const glarePointerRef = useRef<{ clientX: number; clientY: number }>()\n const [svgSupported, setSvgSupported] = useState(false)\n\n useEffect(() => {\n setSvgSupported(supportsSvgBackdropFilter(filterId))\n }, [filterId])\n\n useEffect(() => {\n if (!svgSupported) return\n const element = containerRef.current\n const image = imageRef.current\n if (element === null || image === null) return\n let frame = 0\n let previousWidth = 0\n let previousHeight = 0\n const update = (): void => {\n frame = 0\n const rect = element.getBoundingClientRect()\n const width = Math.max(1, Math.round(rect.width))\n const height = Math.max(1, Math.round(rect.height))\n if (width === previousWidth && height === previousHeight) return\n previousWidth = width\n previousHeight = height\n image.setAttribute('href', displacementMap(\n width,\n height,\n Math.min(borderRadius, Math.min(width, height) / 2),\n borderWidth,\n brightness,\n opacity,\n blur,\n redGradientId,\n blueGradientId,\n ))\n }\n const schedule = (): void => {\n if (frame === 0) frame = requestAnimationFrame(update)\n }\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(schedule)\n observer?.observe(element)\n schedule()\n return () => {\n if (frame !== 0) cancelAnimationFrame(frame)\n observer?.disconnect()\n }\n }, [blueGradientId, blur, borderRadius, borderWidth, brightness, opacity, redGradientId, svgSupported])\n\n useEffect(() => {\n if (!svgSupported) return\n const channels = [redRef.current, greenRef.current, blueRef.current]\n const offsets = [0, 5, 10]\n channels.forEach((channel, index) => channel?.setAttribute('scale', String(distortionScale + (offsets[index] ?? 0))))\n }, [distortionScale, svgSupported])\n\n useEffect(() => () => {\n if (glareFrameRef.current !== 0) cancelAnimationFrame(glareFrameRef.current)\n }, [])\n\n const renderGlare = (): void => {\n glareFrameRef.current = 0\n const element = containerRef.current\n if (element === null) return\n const pointer = glarePointerRef.current\n if (pointer === undefined) {\n element.style.setProperty('--partner-glare-x', '50%')\n element.style.setProperty('--partner-glare-y', '50%')\n return\n }\n const rect = element.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) return\n const x = Math.max(0, Math.min(100, (pointer.clientX - rect.left) / rect.width * 100))\n const y = Math.max(0, Math.min(100, (pointer.clientY - rect.top) / rect.height * 100))\n element.style.setProperty('--partner-glare-x', `${x}%`)\n element.style.setProperty('--partner-glare-y', `${y}%`)\n }\n const scheduleGlare = (): void => {\n if (glareFrameRef.current === 0) glareFrameRef.current = requestAnimationFrame(renderGlare)\n }\n const moveGlare = (clientX: number, clientY: number): void => {\n if (!interactive) return\n glarePointerRef.current = { clientX, clientY }\n scheduleGlare()\n }\n const resetGlare = (): void => {\n if (!interactive) return\n glarePointerRef.current = undefined\n scheduleGlare()\n }\n\n const style: GlassStyle = {\n '--partner-glass-filter-id': `url(#${filterId})`,\n '--partner-glass-saturation': saturation,\n '--partner-glare-x': '50%',\n '--partner-glare-y': '50%',\n }\n\n return <Element\n {...elementProps}\n ref={containerRef as never}\n className={`dsh-partner-glass-surface ${svgSupported ? 'is-svg' : 'is-fallback'}${interactive ? ' is-interactive' : ''} ${className}`}\n style={style}\n onPointerMove={interactive ? event => moveGlare(event.clientX, event.clientY) : undefined}\n onPointerLeave={interactive ? resetGlare : undefined}\n >\n {svgSupported && <svg className=\"dsh-partner-glass-filter\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\">\n <defs>\n <filter id={filterId} colorInterpolationFilters=\"sRGB\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\">\n <feImage ref={imageRef} x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\" result=\"map\" />\n <feDisplacementMap ref={redRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-red\" />\n <feColorMatrix in=\"displaced-red\" type=\"matrix\" values=\"1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0\" result=\"red\" />\n <feDisplacementMap ref={greenRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-green\" />\n <feColorMatrix in=\"displaced-green\" type=\"matrix\" values=\"0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0\" result=\"green\" />\n <feDisplacementMap ref={blueRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-blue\" />\n <feColorMatrix in=\"displaced-blue\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0\" result=\"blue\" />\n <feBlend in=\"red\" in2=\"green\" mode=\"screen\" result=\"red-green\" />\n <feBlend in=\"red-green\" in2=\"blue\" mode=\"screen\" result=\"output\" />\n <feGaussianBlur in=\"output\" stdDeviation=\".45\" />\n </filter>\n </defs>\n </svg>}\n {children}\n </Element>\n}\n", "import { useCallback, useEffect, useMemo, useState, type FormEvent } from 'react'\nimport { IconCheckOutline16, IconCloseOutline16, IconPlusOutline16, IconRefreshOutline16, IconSearchOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type MarketSkillView, type SkillCatalogView, type SkillMarketNetworkTestView, type SkillMarketNetworkView, type SkillMarketView } from '../client-api.js'\nimport { CollectionEmpty, CollectionSkeleton, WorkspaceBlock, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport function SkillsPanel(): JSX.Element {\n const [catalog, setCatalog] = useState<SkillCatalogView>({ installed: [], bindings: [], sources: [] })\n const [market, setMarket] = useState<SkillMarketView>({ sources: [], entries: [], errors: [] })\n const [query, setQuery] = useState('')\n const [activeSource, setActiveSource] = useState('market-clawhub')\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const [actionError, setActionError] = useState<{ kind: 'install' | 'uninstall'; id: string; message: string }>()\n const [addingSource, setAddingSource] = useState(false)\n const [creatingSkill, setCreatingSkill] = useState(false)\n const [editingNetwork, setEditingNetwork] = useState(false)\n const [showAllInstalled, setShowAllInstalled] = useState(false)\n const [network, setNetwork] = useState<SkillMarketNetworkView>({})\n const load = useCallback(async (refresh = false) => {\n try {\n const [nextCatalog, nextMarket, nextNetwork] = await Promise.all([\n api<SkillCatalogView>('/skills'), api<SkillMarketView>(`/skills/market${refresh ? '?refresh=1' : ''}`), api<SkillMarketNetworkView>('/skill-markets/network'),\n ])\n setCatalog(nextCatalog); setMarket(nextMarket); setNetwork(nextNetwork); setError(undefined)\n } catch (reason) { setError(errorMessage(reason)) } finally { setLoading(false) }\n }, [])\n useEffect(() => { void load() }, [load])\n const installed = new Map(catalog.installed.map(item => [item.id, item]))\n const visibleInstalled = showAllInstalled ? catalog.installed : catalog.installed.slice(0, 4)\n const visible = useMemo(() => {\n const normalized = query.trim().toLocaleLowerCase()\n return market.entries.filter(item => (item.sourceId === activeSource) && (!normalized || `${item.name} ${item.description} ${item.tags.join(' ')}`.toLocaleLowerCase().includes(normalized)))\n }, [activeSource, market.entries, query])\n const sources = [{ id: 'builtin', name: '\u5185\u7F6E\u7CBE\u9009' }, ...market.sources.map(source => ({ id: source.id, name: source.name }))]\n const sourceCounts = useMemo(() => market.entries.reduce((counts, entry) => {\n counts.set(entry.sourceId, (counts.get(entry.sourceId) ?? 0) + 1)\n return counts\n }, new Map<string, number>()), [market.entries])\n const install = async (entry: MarketSkillView): Promise<void> => {\n setBusy(entry.id); setActionError(undefined)\n try {\n await api('/skills/market/install', { method: 'POST', body: JSON.stringify({ sourceId: entry.sourceId, entryId: entry.id }) })\n await load()\n } catch (reason) { setActionError({ kind: 'install', id: entry.id, message: errorMessage(reason) }) } finally { setBusy(undefined) }\n }\n const uninstall = async (id: string): Promise<void> => {\n setBusy(id); setActionError(undefined)\n try { await api(`/skills/${encodeURIComponent(id)}`, { method: 'DELETE' }); await load() }\n catch (reason) { setActionError({ kind: 'uninstall', id, message: errorMessage(reason) }) } finally { setBusy(undefined) }\n }\n return <div className=\"dsh-partner-feature-page\">\n <WorkspaceHero eyebrow=\"Capability catalog\" title=\"Skill \u5E02\u573A\" detail=\"\u96C6\u4E2D\u5B89\u88C5\u548C\u7EF4\u62A4\u5DE5\u4F5C\u80FD\u529B\uFF1B\u5B89\u88C5\u540E\uFF0C\u518D\u4E3A\u9700\u8981\u5B83\u7684\u4F19\u4F34\u5355\u72EC\u542F\u7528\u3002\" actions={<button type=\"button\" disabled={loading} onClick={() => { void load(true) }}><IconRefreshOutline16 size={15} />{loading ? '\u540C\u6B65\u4E2D\u2026' : '\u5237\u65B0\u5E02\u573A'}</button>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {creatingSkill && <WorkspaceDialog title=\"\u65B0\u5EFA Skill\" detail=\"\u521B\u5EFA\u4E00\u4E2A\u53EF\u590D\u7528\u7684\u5DE5\u4F5C\u6D41\u7A0B\uFF0C\u5E76\u660E\u786E\u6267\u884C\u4E0A\u4E0B\u6587\u3001\u5DE5\u5177\u8FB9\u754C\u548C\u9A8C\u6536\u6307\u4EE4\u3002\" close={() => setCreatingSkill(false)} width=\"wide\"><NewSkillForm existingIds={catalog.installed.map(skill => skill.id)} close={() => setCreatingSkill(false)} changed={load} /></WorkspaceDialog>}\n {editingNetwork && <WorkspaceDialog title=\"\u5E02\u573A\u7F51\u7EDC\u8BBE\u7F6E\" detail=\"\u914D\u7F6E Skill \u7D22\u5F15\u548C\u5B89\u88C5\u5305\u4E0B\u8F7D\u5171\u7528\u7684 HTTP \u4EE3\u7406\uFF0C\u5E76\u5728\u4FDD\u5B58\u524D\u6D4B\u8BD5\u8FDE\u901A\u6027\u3002\" close={() => setEditingNetwork(false)}><NetworkSettingsForm value={network} close={() => setEditingNetwork(false)} changed={async next => { setNetwork(next); await load(true) }} /></WorkspaceDialog>}\n {addingSource && <WorkspaceDialog title=\"\u6DFB\u52A0\u5E02\u573A\u6765\u6E90\" detail=\"\u63A5\u5165\u56E2\u961F\u6216\u4E2A\u4EBA\u7EF4\u62A4\u7684 Skill \u7D22\u5F15\u3002\u81EA\u5B9A\u4E49\u6765\u6E90\u9ED8\u8BA4\u6309\u4E0D\u53EF\u4FE1\u6765\u6E90\u9694\u79BB\u6267\u884C\u3002\" close={() => setAddingSource(false)}><MarketSourceForm close={() => setAddingSource(false)} changed={() => load(true)} /></WorkspaceDialog>}\n <WorkspaceBlock title=\"\u5DF2\u5B89\u88C5\" detail={`${catalog.installed.length} \u4E2A\u53EF\u4F9B\u4F19\u4F34\u4F7F\u7528`} actions={<button type=\"button\" onClick={() => setCreatingSkill(true)}><IconPlusOutline16 size={14} />\u65B0\u5EFA Skill</button>}>\n {loading ? <CollectionSkeleton rows={2} /> : catalog.installed.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u5B89\u88C5 Skill\" detail=\"\u53EF\u4EE5\u521B\u5EFA\u81EA\u5DF1\u7684 Skill\uFF0C\u6216\u4ECE\u4E0B\u65B9\u5E02\u573A\u9009\u62E9\u3002\" action={<button type=\"button\" onClick={() => setCreatingSkill(true)}><IconPlusOutline16 size={14} />\u65B0\u5EFA\u7B2C\u4E00\u4E2A Skill</button>} /> : <><div className=\"dsh-partner-skill-installed is-market\">{visibleInstalled.map(skill => <article key={skill.id}>\n <span className=\"dsh-partner-skill-mark\"><IconCheckOutline16 size={16} /></span><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.version} \u00B7 {skill.executionContext === 'fork' ? '\u4E34\u65F6\u4F1A\u8BDD' : '\u5F53\u524D\u4F1A\u8BDD'} \u00B7 {skill.source}</small></span>\n <button type=\"button\" className=\"is-icon\" disabled={busy === skill.id} aria-label={`\u5378\u8F7D ${skill.displayName}`} onClick={() => { void uninstall(skill.id) }}><IconTrashOutline16 size={15} /></button>\n {actionError?.kind === 'uninstall' && actionError.id === skill.id && <p className=\"dsh-partner-skill-action-error\" role=\"alert\">\u5378\u8F7D\u5931\u8D25\uFF1A{actionError.message}</p>}\n </article>)}</div>{catalog.installed.length > 4 && <button type=\"button\" className=\"dsh-partner-skill-disclosure\" aria-expanded={showAllInstalled} onClick={() => setShowAllInstalled(value => !value)}>{showAllInstalled ? '\u6536\u8D77\u5DF2\u5B89\u88C5 Skill' : `\u67E5\u770B\u5168\u90E8 ${catalog.installed.length} \u4E2A\u5DF2\u5B89\u88C5 Skill`}</button>}</>}\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u5E02\u573A\u76EE\u5F55\" detail=\"\u5185\u7F6E ClawHub\u3001LoopHub\u3001SkillHub\uFF0C\u4E0E nomifun \u5F53\u524D Skill \u699C\u5355\u4E00\u81F4\" actions={<><button type=\"button\" onClick={() => setEditingNetwork(true)}>\u4EE3\u7406\u8BBE\u7F6E{network.proxyUrl ? ' \u00B7 \u5DF2\u542F\u7528' : ''}</button><button type=\"button\" onClick={() => setAddingSource(true)}><IconPlusOutline16 size={14} />\u81EA\u5B9A\u4E49\u6E90</button></>}>\n <div className=\"dsh-partner-market-toolbar\">\n <SkillSearch value={query} change={setQuery} count={visible.length} label=\"\u641C\u7D22 Skill \u5E02\u573A\" placeholder=\"\u641C\u7D22\u540D\u79F0\u3001\u8BF4\u660E\u6216\u6807\u7B7E\" loading={loading} />\n <nav className=\"dsh-partner-market-sources\" aria-label=\"Skill \u5E02\u573A\u6765\u6E90\">{sources.map(source => <button type=\"button\" key={source.id} className={activeSource === source.id ? 'is-active' : ''} aria-pressed={activeSource === source.id} onClick={() => setActiveSource(source.id)}><span>{source.name}</span><small>{sourceCounts.get(source.id) ?? 0}</small></button>)}</nav>\n </div>\n {market.errors.some(item => item.sourceId === activeSource) && <p className=\"dsh-partner-inline-warning\">{market.errors.filter(item => item.sourceId === activeSource).map(item => item.error).join('\uFF1B')}</p>}\n {loading ? <CollectionSkeleton rows={4} /> : <div className=\"dsh-partner-market-grid\">{visible.map(entry => {\n const current = installed.get(entry.id)\n const cardError = actionError?.kind === 'install' && actionError.id === entry.id ? actionError.message : undefined\n const errorId = cardError ? `dsh-partner-skill-error-${entry.id}` : undefined\n return <article key={`${entry.sourceId}:${entry.id}`}><span><small>{entry.tags.slice(0, 3).join(' \u00B7 ') || 'SKILL'}</small><strong>{entry.name}</strong><p>{entry.description}</p></span>{cardError && <p id={errorId} className=\"dsh-partner-market-card-error\" role=\"alert\">\u5B89\u88C5\u5931\u8D25\uFF1A{cardError}</p>}<footer><small>v{entry.version}</small>{current ? <button type=\"button\" disabled><IconCheckOutline16 size={14} />\u5DF2\u5B89\u88C5</button> : <button type=\"button\" disabled={busy === entry.id} aria-describedby={errorId} onClick={() => { void install(entry) }}>{busy === entry.id ? '\u5B89\u88C5\u4E2D\u2026' : cardError ? '\u91CD\u8BD5\u5B89\u88C5' : '\u5B89\u88C5'}</button>}</footer></article>\n })}</div>}\n {!loading && visible.length === 0 && <CollectionEmpty title={query ? '\u6CA1\u6709\u5339\u914D\u7684 Skill' : '\u5F53\u524D\u6765\u6E90\u6682\u65F6\u4E0D\u53EF\u7528'} detail={query ? '\u6362\u4E00\u4E2A\u5173\u952E\u8BCD\uFF0C\u6216\u5207\u6362\u5E02\u573A\u6765\u6E90\u3002' : '\u5237\u65B0\u5E02\u573A\uFF0C\u6216\u68C0\u67E5\u4EE3\u7406\u4E0E\u6765\u6E90\u914D\u7F6E\u3002'} />}\n </WorkspaceBlock>\n </div>\n}\n\nexport function CompanionSkillSettings({ companionId }: { companionId: string }): JSX.Element {\n const [catalog, setCatalog] = useState<SkillCatalogView>({ installed: [], bindings: [], sources: [] })\n const [busy, setBusy] = useState<string>()\n const [error, setError] = useState<string>()\n const [selecting, setSelecting] = useState(false)\n const [showAll, setShowAll] = useState(false)\n const [query, setQuery] = useState('')\n const load = useCallback(async () => {\n try { setCatalog(await api<SkillCatalogView>('/skills')); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) }\n }, [])\n useEffect(() => { void load() }, [load, companionId])\n useEffect(() => { setSelecting(false); setShowAll(false); setQuery(''); setError(undefined) }, [companionId])\n const enabled = useMemo(() => new Set(catalog.bindings.filter(item => item.companionId === companionId && item.enabled).map(item => item.skillId)), [catalog.bindings, companionId])\n const enabledSkills = useMemo(() => catalog.installed.filter(skill => enabled.has(skill.id)), [catalog.installed, enabled])\n const availableSkills = useMemo(() => {\n const normalized = query.trim().toLocaleLowerCase()\n return catalog.installed.filter(skill => !enabled.has(skill.id) && (!normalized || `${skill.displayName} ${skill.description} ${skill.id}`.toLocaleLowerCase().includes(normalized)))\n }, [catalog.installed, enabled, query])\n const visibleEnabledSkills = showAll ? enabledSkills : enabledSkills.slice(0, 4)\n const visibleAvailableSkills = availableSkills.slice(0, 80)\n const setBinding = async (skillId: string, nextEnabled: boolean): Promise<void> => {\n setBusy(skillId)\n setError(undefined)\n try {\n await api(`/companions/${encodeURIComponent(companionId)}/skills/${encodeURIComponent(skillId)}`, { method: 'PUT', body: JSON.stringify({ enabled: nextEnabled }) })\n await load()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <section className=\"dsh-partner-capability-detail\" aria-labelledby=\"dsh-partner-skill-capability-title\">\n <header><span><small>PARTNER SKILLS</small><strong id=\"dsh-partner-skill-capability-title\">\u5F53\u524D\u4F19\u4F34\u7684 Skill</strong></span><div className=\"dsh-partner-capability-actions\"><em>{enabledSkills.length} \u4E2A\u542F\u7528</em>{catalog.installed.length > 0 && <button type=\"button\" aria-expanded={selecting} onClick={() => setSelecting(value => !value)}><IconPlusOutline16 size={14} />\u6DFB\u52A0 Skill</button>}</div></header>\n {selecting && <div className=\"dsh-partner-skill-picker\" aria-label=\"\u6DFB\u52A0 Skill\">\n <SkillSearch value={query} change={setQuery} count={availableSkills.length} label=\"\u641C\u7D22\u53EF\u6DFB\u52A0\u7684 Skill\" placeholder=\"\u641C\u7D22\u540D\u79F0\u3001\u8BF4\u660E\u6216\u6807\u8BC6\" autoFocus compact />\n <div className=\"dsh-partner-skill-picker-list\">{visibleAvailableSkills.map(skill => <article key={skill.id}><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.executionContext === 'fork' ? '\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u6267\u884C' : '\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD\u6267\u884C'}</small></span><button type=\"button\" disabled={busy === skill.id} onClick={() => { void setBinding(skill.id, true) }}>{busy === skill.id ? '\u6DFB\u52A0\u4E2D\u2026' : '\u6DFB\u52A0'}</button></article>)}{availableSkills.length === 0 && <p className=\"dsh-partner-skill-picker-empty\">{query ? '\u6CA1\u6709\u5339\u914D\u7684\u672A\u542F\u7528 Skill\u3002' : '\u6240\u6709\u5DF2\u5B89\u88C5 Skill \u90FD\u5DF2\u542F\u7528\u3002'}</p>}</div>\n {availableSkills.length > visibleAvailableSkills.length && <small className=\"dsh-partner-skill-picker-limit\">\u8FD8\u6709 {availableSkills.length - visibleAvailableSkills.length} \u4E2A\u7ED3\u679C\uFF0C\u8BF7\u8F93\u5165\u5173\u952E\u8BCD\u7EE7\u7EED\u7B5B\u9009\u3002</small>}\n </div>}\n {catalog.installed.length === 0 ? <p className=\"dsh-partner-feature-empty\">\u5C1A\u672A\u5B89\u88C5 Skill\uFF0C\u8BF7\u5148\u4ECE\u5DE6\u4FA7\u7684 Skill \u5E02\u573A\u5B89\u88C5\u3002</p> : enabledSkills.length === 0 ? <p className=\"dsh-partner-feature-empty\">\u5F53\u524D\u4F19\u4F34\u8FD8\u6CA1\u6709\u542F\u7528 Skill\u3002\u70B9\u51FB\u201C\u6DFB\u52A0 Skill\u201D\u9009\u62E9\u9700\u8981\u7684\u80FD\u529B\u3002</p> : <>\n <div className=\"dsh-partner-skill-installed is-binding\">{visibleEnabledSkills.map(skill => <article key={skill.id}>\n <span className=\"dsh-partner-skill-mark\"><IconCheckOutline16 size={16} /></span><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.executionContext === 'fork' ? '\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u6267\u884C' : '\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD\u6267\u884C'}</small></span>\n <button type=\"button\" className=\"dsh-partner-skill-binding-action\" disabled={busy === skill.id} aria-label={`\u4ECE\u5F53\u524D\u4F19\u4F34\u505C\u7528 ${skill.displayName}`} onClick={() => { void setBinding(skill.id, false) }}>{busy === skill.id ? '\u5904\u7406\u4E2D\u2026' : '\u505C\u7528'}</button>\n </article>)}</div>\n {enabledSkills.length > 4 && <button type=\"button\" className=\"dsh-partner-skill-disclosure\" aria-expanded={showAll} onClick={() => setShowAll(value => !value)}>{showAll ? '\u6536\u8D77 Skill' : `\u67E5\u770B\u5168\u90E8 ${enabledSkills.length} \u4E2A Skill`}</button>}\n </>}\n {error && <p className=\"dsh-partner-inline-error\" role=\"alert\">{error}</p>}\n </section>\n}\n\nfunction SkillSearch({ value, change, count, label, placeholder, loading = false, autoFocus = false, compact = false }: {\n value: string\n change(value: string): void\n count: number\n label: string\n placeholder: string\n loading?: boolean\n autoFocus?: boolean\n compact?: boolean\n}): JSX.Element {\n return <div className={`dsh-partner-skill-search${compact ? ' is-compact' : ''}`} role=\"search\" aria-label={label}>\n <span className=\"dsh-partner-skill-search-icon\" aria-hidden=\"true\"><IconSearchOutline16 size={16} /></span>\n <input\n type=\"search\"\n value={value}\n autoFocus={autoFocus}\n aria-label={label}\n placeholder={placeholder}\n onChange={event => change(event.target.value)}\n onKeyDown={event => { if (event.key === 'Escape' && value) { event.preventDefault(); change('') } }}\n />\n {value && <button type=\"button\" className=\"dsh-partner-skill-search-clear\" aria-label=\"\u6E05\u7A7A\u641C\u7D22\" title=\"\u6E05\u7A7A\u641C\u7D22\" onClick={() => change('')}><IconCloseOutline16 size={14} /></button>}\n <span className=\"dsh-partner-skill-search-count\" aria-live=\"polite\">{loading ? '\u540C\u6B65\u4E2D' : `${count} \u9879`}</span>\n </div>\n}\n\nfunction NewSkillForm({ existingIds, close, changed }: { existingIds: string[]; close(): void; changed(): Promise<void> | void }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n const id = String(data.get('id') ?? '').trim().toLocaleLowerCase()\n if (existingIds.includes(id)) { setError('\u8FD9\u4E2A Skill \u6807\u8BC6\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u6362\u4E00\u4E2A\u6807\u8BC6\u3002'); return }\n setBusy(true); setError(undefined)\n try {\n const document = skillDocument({\n id,\n displayName: String(data.get('displayName') ?? ''),\n description: String(data.get('description') ?? ''),\n context: String(data.get('context') ?? 'fork'),\n allowedTools: String(data.get('allowedTools') ?? ''),\n instructions: String(data.get('instructions') ?? ''),\n })\n await api('/skills/local', { method: 'POST', body: JSON.stringify({ id, document }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-skill-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>Skill \u540D\u79F0</span><input name=\"displayName\" required maxLength={120} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u53D1\u5E03\u8BF4\u660E\u6574\u7406\" /></label><label><span>Skill \u6807\u8BC6</span><input name=\"id\" required maxLength={80} pattern=\"[A-Za-z0-9][A-Za-z0-9._-]{0,79}\" placeholder=\"release-notes\" /></label><label className=\"is-wide\"><span>\u4E00\u53E5\u8BDD\u8BF4\u660E</span><input name=\"description\" required maxLength={600} placeholder=\"\u8BF4\u660E\u4EC0\u4E48\u65F6\u5019\u4F7F\u7528\uFF0C\u4EE5\u53CA\u8981\u89E3\u51B3\u4EC0\u4E48\u95EE\u9898\" /></label><label><span>\u6267\u884C\u65B9\u5F0F</span><select name=\"context\" defaultValue=\"fork\"><option value=\"fork\">\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD</option><option value=\"inline\">\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD</option></select></label><label><span>\u5141\u8BB8\u7684\u5DE5\u5177</span><input name=\"allowedTools\" maxLength={1000} placeholder=\"\u591A\u4E2A\u5DE5\u5177\u7528\u9017\u53F7\u5206\u9694\uFF0C\u53EF\u7559\u7A7A\" /></label><label className=\"is-wide\"><span>Skill \u6307\u4EE4</span><textarea name=\"instructions\" required maxLength={500000} rows={8} placeholder=\"\u5199\u6E05\u5DE5\u4F5C\u6B65\u9AA4\u3001\u8FB9\u754C\u3001\u8F93\u51FA\u683C\u5F0F\u548C\u9A8C\u6536\u6761\u4EF6\" /></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA Skill'}</button></footer></form>\n}\n\nfunction NetworkSettingsForm({ value, close, changed }: { value: SkillMarketNetworkView; close(): void; changed(value: SkillMarketNetworkView): Promise<void> | void }): JSX.Element {\n const [proxyUrl, setProxyUrl] = useState(value.proxyUrl ?? '')\n const [busy, setBusy] = useState<'save' | 'test'>()\n const [status, setStatus] = useState<string>()\n const [error, setError] = useState<string>()\n const test = async (): Promise<void> => {\n setBusy('test'); setError(undefined); setStatus(undefined)\n try {\n const result = await api<SkillMarketNetworkTestView>('/skill-markets/network', { method: 'POST', body: JSON.stringify({ proxyUrl: proxyUrl.trim() }) })\n setStatus(`\u8FDE\u63A5\u6B63\u5E38 \u00B7 ${result.sourceCount} \u4E2A\u6765\u6E90 \u00B7 ${result.entryCount} \u4E2A Skill \u00B7 ${result.latencyMs} ms`)\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const save = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); setBusy('save'); setError(undefined)\n try {\n const next = await api<SkillMarketNetworkView>('/skill-markets/network', { method: 'PUT', body: JSON.stringify({ proxyUrl: proxyUrl.trim() }) })\n await changed(next); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-network-form\" aria-busy={busy !== undefined} onSubmit={event => { void save(event) }}><label className=\"is-wide\"><span>HTTP \u4EE3\u7406</span><input type=\"url\" autoFocus value={proxyUrl} onChange={event => setProxyUrl(event.target.value)} placeholder=\"http://host.docker.internal:7893\" /><small>\u7559\u7A7A\u4E3A\u76F4\u8FDE\uFF1B\u5E02\u573A\u5217\u8868\u548C\u5B89\u88C5\u5305\u4E0B\u8F7D\u5171\u7528\u8FD9\u4E2A\u4EE3\u7406\u3002</small></label>{status && <WorkspaceNotice kind=\"success\">{status}</WorkspaceNotice>}{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy !== undefined} onClick={() => { void test() }}>{busy === 'test' ? '\u6D4B\u8BD5\u4E2D\u2026' : '\u6D4B\u8BD5\u8FDE\u63A5'}</button><span className=\"dsh-partner-form-footer-spacer\" /><button type=\"button\" disabled={busy !== undefined} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy !== undefined}>{busy === 'save' ? '\u4FDD\u5B58\u4E2D\u2026' : '\u4FDD\u5B58\u8BBE\u7F6E'}</button></footer></form>\n}\n\nfunction MarketSourceForm({ close, changed }: { close(): void; changed(): Promise<void> | void }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await api('/skill-markets', { method: 'POST', body: JSON.stringify({ name: data.get('name'), indexUrl: data.get('indexUrl'), enabled: true, trusted: false }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-market-source-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u6765\u6E90\u540D\u79F0</span><input name=\"name\" required maxLength={100} autoFocus placeholder=\"\u56E2\u961F Skill \u5E02\u573A\" /></label><label><span>\u7D22\u5F15 URL</span><input name=\"indexUrl\" required type=\"url\" placeholder=\"https://example.com/skills.json\" /></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}>{busy ? '\u6DFB\u52A0\u4E2D\u2026' : '\u6DFB\u52A0\u6765\u6E90'}</button></footer></form>\n}\nfunction skillDocument(value: { id: string; displayName: string; description: string; context: string; allowedTools: string; instructions: string }): string {\n const requestedTools = value.allowedTools.split(/[,\uFF0C\\s]+/).map(item => item.trim()).filter(Boolean)\n const invalidTool = requestedTools.find(item => !/^[a-zA-Z0-9._:-]+$/.test(item))\n if (invalidTool) throw new Error(`\u5DE5\u5177\u540D\u79F0\u683C\u5F0F\u4E0D\u6B63\u786E\uFF1A${invalidTool}`)\n const tools = [...new Set(requestedTools)].slice(0, 64)\n return `---\\nname: ${value.id}\\ndisplay-name: ${skillScalar(value.displayName)}\\ndescription: ${skillScalar(value.description)}\\nversion: 1.0.0\\ncontext: ${value.context === 'inline' ? 'inline' : 'fork'}\\nallowed-tools: [${tools.join(', ')}]\\n---\\n# ${value.displayName.replace(/[\\r\\n#]+/g, ' ').trim()}\\n\\n${value.instructions.trim()}\\n`\n}\nfunction skillScalar(value: string): string { return `\"${value.replace(/[\\r\\n]+/g, ' ').replace(/\"/g, \"'\").trim()}\"` }\n", "import { useEffect, useId, useRef, type KeyboardEvent, type ReactNode } from 'react'\nimport { IconAgentPresetOutline16, IconCloseOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\n\nexport function WorkspaceHero({ eyebrow, title, detail, actions }: { eyebrow: string; title: string; detail: string; actions?: ReactNode }): JSX.Element {\n return <header className=\"dsh-partner-feature-hero\">\n <span><small>{eyebrow}</small><h2>{title}</h2><p>{detail}</p></span>\n {actions && <div className=\"dsh-partner-feature-hero-actions\">{actions}</div>}\n </header>\n}\n\nexport function WorkspaceBlock({ title, detail, actions, children, className = '' }: { title: string; detail?: string; actions?: ReactNode; children: ReactNode; className?: string }): JSX.Element {\n return <section className={`dsh-partner-feature-block${className ? ` ${className}` : ''}`}>\n <header><span><strong>{title}</strong>{detail && <small>{detail}</small>}</span>{actions && <div>{actions}</div>}</header>\n {children}\n </section>\n}\n\nexport function WorkspaceDialog({ eyebrow = 'CREATE & CONFIGURE', title, detail, close, children, width = 'regular' }: { eyebrow?: string; title: string; detail: string; close(): void; children: ReactNode; width?: 'regular' | 'wide' }): JSX.Element {\n const titleId = useId()\n const detailId = useId()\n const panelRef = useRef<HTMLDialogElement>(null)\n useEffect(() => {\n const previous = document.activeElement instanceof HTMLElement ? document.activeElement : undefined\n const frame = requestAnimationFrame(() => {\n const panel = panelRef.current\n const target = panel?.querySelector<HTMLElement>('[autofocus]') ?? panel?.querySelector<HTMLElement>('input, textarea, select, button')\n target?.focus()\n })\n return () => { cancelAnimationFrame(frame); previous?.focus() }\n }, [])\n const keyDown = (event: KeyboardEvent<HTMLElement>): void => {\n if (event.key === 'Escape') { event.preventDefault(); close(); return }\n if (event.key !== 'Tab') return\n const focusable = [...(panelRef.current?.querySelectorAll<HTMLElement>('button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])') ?? [])]\n if (focusable.length === 0) return\n const first = focusable[0]; const last = focusable.at(-1)\n if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last?.focus() }\n else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first?.focus() }\n }\n return <div className=\"dsh-partner-workspace-dialog-layer\" onPointerDown={event => { if (event.target === event.currentTarget) close() }}>\n <dialog ref={panelRef} className={`dsh-partner-workspace-dialog is-${width}`} open aria-modal=\"true\" aria-labelledby={titleId} aria-describedby={detailId} onKeyDown={keyDown}>\n <header><span><small>{eyebrow}</small><strong id={titleId}>{title}</strong><p id={detailId}>{detail}</p></span><button type=\"button\" onClick={close} aria-label=\"\u5173\u95ED\"><IconCloseOutline16 size={16} /></button></header>\n <div className=\"dsh-partner-workspace-dialog-body\">{children}</div>\n </dialog>\n </div>\n}\n\nexport function WorkspaceNotice({ children, kind = 'error' }: { children: ReactNode; kind?: 'error' | 'warning' | 'success' }): JSX.Element {\n return <p className={`dsh-partner-workspace-notice is-${kind}`} role={kind === 'error' ? 'alert' : 'status'}><i />{children}</p>\n}\n\nexport function CollectionEmpty({ title, detail, action }: { title: string; detail?: string; action?: ReactNode }): JSX.Element {\n return <div className=\"dsh-partner-collection-empty\"><span><IconAgentPresetOutline16 size={18} /></span><strong>{title}</strong>{detail && <p>{detail}</p>}{action}</div>\n}\n\nexport function CollectionSkeleton({ rows = 3 }: { rows?: number }): JSX.Element {\n return <div className=\"dsh-partner-collection-skeleton\" aria-label=\"\u6B63\u5728\u52A0\u8F7D\" aria-busy=\"true\">{Array.from({ length: rows }, (_, index) => <i key={index} />)}</div>\n}\n\nexport function CountLabel({ value, label }: { value: number; label: string }): JSX.Element {\n return <span className=\"dsh-partner-count-label\"><b>{value}</b>{label}</span>\n}\n\nexport function errorMessage(value: unknown): string { return value instanceof Error ? value.message : String(value) }\n", "import { useCallback, useDeferredValue, useEffect, useMemo, useRef, useState, type FormEvent } from 'react'\nimport { IconCheckOutline16, IconChevronRightOutline14, IconCloseOutline16, IconPlusOutline16, IconSearchOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type BoardTaskStatusView, type BoardTaskView, type PartnerDelegationView, type PartnerDirectoryEntryView, type TaskActivityView, type TaskBoardView } from '../client-api.js'\nimport { CollectionSkeleton, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nconst COLUMNS: Array<{ id: BoardTaskStatusView; label: string }> = [\n { id: 'backlog', label: '\u6536\u96C6\u7BB1' }, { id: 'ready', label: '\u5F85\u5F00\u59CB' }, { id: 'doing', label: '\u8FDB\u884C\u4E2D' },\n { id: 'review', label: '\u5F85\u9A8C\u6536' }, { id: 'blocked', label: '\u53D7\u963B' }, { id: 'done', label: '\u5DF2\u5B8C\u6210' },\n]\nconst LIVE_REFRESH_MS = 4_000\ntype BoardStatusFilter = BoardTaskStatusView | 'all'\n\nexport function TaskBoardPanel(): JSX.Element {\n const [board, setBoard] = useState<TaskBoardView>({ tasks: [], activities: [] })\n const [directory, setDirectory] = useState<PartnerDirectoryEntryView[]>([])\n const [delegations, setDelegations] = useState<PartnerDelegationView[]>([])\n const [creating, setCreating] = useState(false)\n const [selectedTaskId, setSelectedTaskId] = useState<string>()\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const [syncedAt, setSyncedAt] = useState<number>()\n const [query, setQuery] = useState('')\n const [statusFilter, setStatusFilter] = useState<BoardStatusFilter>('all')\n const [assigneeFilter, setAssigneeFilter] = useState('all')\n const deferredQuery = useDeferredValue(query.trim().toLocaleLowerCase())\n const tasksById = useMemo(() => new Map(board.tasks.map(item => [item.id, item])), [board.tasks])\n const directoryById = useMemo(() => new Map(directory.map(item => [item.id, item])), [directory])\n const activeDelegationByTaskId = useMemo(() => {\n const result = new Map<string, PartnerDelegationView>()\n for (const delegation of delegations) {\n if ((delegation.status === 'queued' || delegation.status === 'running') && !result.has(delegation.taskId)) result.set(delegation.taskId, delegation)\n }\n return result\n }, [delegations])\n const selectedTask = selectedTaskId ? tasksById.get(selectedTaskId) : undefined\n const dependentsById = useMemo(() => {\n const result = new Map<string, number>()\n for (const task of board.tasks) for (const dependencyId of task.dependencyTaskIds) result.set(dependencyId, (result.get(dependencyId) ?? 0) + 1)\n return result\n }, [board.tasks])\n const scopedTasks = useMemo(() => board.tasks.filter(task => {\n if (assigneeFilter !== 'all' && (task.assigneeCompanionId ?? 'unassigned') !== assigneeFilter) return false\n if (!deferredQuery) return true\n const dependencies = task.dependencyTaskIds.map(id => tasksById.get(id)?.title ?? '')\n return [task.title, task.description, task.resultAbstract, task.resultSummary, directoryById.get(task.assigneeCompanionId ?? '')?.name, ...dependencies]\n .some(value => value?.toLocaleLowerCase().includes(deferredQuery))\n }), [assigneeFilter, board.tasks, deferredQuery, directoryById, tasksById])\n const statusCounts = useMemo(() => {\n const result = new Map<BoardTaskStatusView, number>(COLUMNS.map(column => [column.id, 0]))\n for (const task of scopedTasks) result.set(task.status, (result.get(task.status) ?? 0) + 1)\n return result\n }, [scopedTasks])\n const visibleColumns = statusFilter === 'all' ? COLUMNS : COLUMNS.filter(column => column.id === statusFilter)\n const tasksByStatus = useMemo(() => {\n const priorityRank: Record<BoardTaskView['priority'], number> = { urgent: 3, high: 2, normal: 1, low: 0 }\n const result = new Map<BoardTaskStatusView, BoardTaskView[]>(COLUMNS.map(column => [column.id, []]))\n for (const task of scopedTasks) {\n if (statusFilter !== 'all' && task.status !== statusFilter) continue\n result.get(task.status)?.push(task)\n }\n for (const tasks of result.values()) tasks.sort((left, right) => priorityRank[right.priority] - priorityRank[left.priority] || right.updatedAt - left.updatedAt)\n return result\n }, [scopedTasks, statusFilter])\n const visibleTaskCount = statusFilter === 'all' ? scopedTasks.length : (statusCounts.get(statusFilter) ?? 0)\n const loadingRef = useRef(false)\n const load = useCallback(async () => {\n if (loadingRef.current) return\n loadingRef.current = true\n try {\n const [next, collaboration] = await Promise.all([api<TaskBoardView>('/tasks'), api<{ companions: PartnerDirectoryEntryView[]; delegations: PartnerDelegationView[] }>('/collaboration')])\n setBoard(next); setDirectory(collaboration.companions); setDelegations(collaboration.delegations); setSyncedAt(Date.now()); setError(undefined)\n } catch (reason) { setError(errorMessage(reason)) } finally { loadingRef.current = false; setLoading(false) }\n }, [])\n useEffect(() => {\n void load()\n const timer = window.setInterval(() => { if (document.visibilityState === 'visible') void load() }, LIVE_REFRESH_MS)\n const visible = (): void => { if (document.visibilityState === 'visible') void load() }\n document.addEventListener('visibilitychange', visible)\n return () => { window.clearInterval(timer); document.removeEventListener('visibilitychange', visible) }\n }, [load])\n const update = async (task: BoardTaskView, change: Record<string, unknown>): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}`, { method: 'PUT', body: JSON.stringify({ expectedRevision: task.revision, ...change }) }); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const delegate = async (task: BoardTaskView): Promise<void> => {\n if (!task.assigneeCompanionId) return\n setBusy(task.id); setError(undefined)\n try {\n await api(`/tasks/${task.id}/delegate`, { method: 'POST', body: JSON.stringify({ to: task.assigneeCompanionId, request: task.description || `\u5B8C\u6210\u4EFB\u52A1\uFF1A${task.title}` }) })\n await load()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const review = async (task: BoardTaskView): Promise<void> => {\n if (!task.reviewerCompanionId) return\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/review`, { method: 'POST', body: JSON.stringify({ to: task.reviewerCompanionId }) }); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const accept = async (task: BoardTaskView): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/accept`, { method: 'POST' }); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const reject = async (task: BoardTaskView, reason: string): Promise<void> => {\n if (!reason) return\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/reject`, { method: 'POST', body: JSON.stringify({ reason }) }); await load() }\n catch (cause) { setError(errorMessage(cause)) } finally { setBusy(undefined) }\n }\n const remove = async (task: BoardTaskView): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}`, { method: 'DELETE' }); if (selectedTaskId === task.id) setSelectedTaskId(undefined); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <div className=\"dsh-partner-feature-page is-board\">\n <WorkspaceHero eyebrow=\"Shared workspace\" title=\"\u4F19\u4F34\u4EFB\u52A1\u770B\u677F\" detail=\"\u627F\u63A5\u591A\u6B65\u3001\u4F9D\u8D56\u548C\u8DE8\u4F19\u4F34\u5DE5\u4F5C\u3002\u524D\u7F6E\u4EFB\u52A1\u5B8C\u6210\u540E\u624D\u80FD\u6267\u884C\uFF0C\u7ED3\u679C\u9A8C\u6536\u901A\u8FC7\u540E\u624D\u4F1A\u89E3\u9501\u540E\u7EED\u4EFB\u52A1\u3002\" actions={<><span className=\"dsh-partner-board-live\" title={syncedAt ? `\u6700\u8FD1\u540C\u6B65 ${new Date(syncedAt).toLocaleTimeString()}` : '\u6B63\u5728\u8FDE\u63A5'}><i />\u5B9E\u65F6\u540C\u6B65</span><button type=\"button\" onClick={() => setCreating(true)}><IconPlusOutline16 size={15} />\u65B0\u4EFB\u52A1</button></>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {creating && <WorkspaceDialog title=\"\u65B0\u5EFA\u4EFB\u52A1\" detail=\"\u5199\u6E05\u76EE\u6807\u3001\u8D1F\u8D23\u4EBA\u548C\u9A8C\u6536\u8FB9\u754C\uFF1B\u53EA\u6709\u771F\u6B63\u5B58\u5728\u524D\u7F6E\u5173\u7CFB\u65F6\u624D\u6DFB\u52A0\u4F9D\u8D56\u3002\" close={() => setCreating(false)} width=\"wide\"><TaskForm companions={directory} tasks={board.tasks} close={() => setCreating(false)} changed={load} /></WorkspaceDialog>}\n {selectedTask && <WorkspaceDialog eyebrow=\"TASK DETAIL\" title={selectedTask.title} detail={taskDialogSummary(selectedTask, directory)} close={() => setSelectedTaskId(undefined)} width=\"wide\"><TaskDetail\n key={selectedTask.id} task={selectedTask} tasks={board.tasks} activities={board.activities.filter(item => item.taskId === selectedTask.id)} directory={directory}\n execution={activeDelegationByTaskId.get(selectedTask.id)}\n busy={busy === selectedTask.id} update={change => { void update(selectedTask, change) }} delegate={() => { void delegate(selectedTask) }} review={() => { void review(selectedTask) }}\n accept={() => { void accept(selectedTask) }} reject={reason => { void reject(selectedTask, reason) }} remove={() => { void remove(selectedTask) }}\n /></WorkspaceDialog>}\n {loading ? <CollectionSkeleton rows={6} /> : <>\n <div className=\"dsh-partner-board-tools\">\n <label className=\"dsh-partner-board-search\"><span className=\"sr-only\">\u641C\u7D22\u4EFB\u52A1</span><span aria-hidden=\"true\"><IconSearchOutline16 size={16} /></span><input value={query} onChange={event => setQuery(event.target.value)} placeholder=\"\u641C\u7D22\u4EFB\u52A1\u3001\u8D1F\u8D23\u4EBA\u6216\u524D\u7F6E\u4EFB\u52A1\" />{query && <button type=\"button\" onClick={() => setQuery('')} aria-label=\"\u6E05\u9664\u4EFB\u52A1\u641C\u7D22\"><IconCloseOutline16 size={14} /></button>}</label>\n <label className=\"dsh-partner-board-assignee\"><span className=\"sr-only\">\u6309\u8D1F\u8D23\u4EBA\u7B5B\u9009</span><select value={assigneeFilter} onChange={event => setAssigneeFilter(event.target.value)}><option value=\"all\">\u5168\u90E8\u4F19\u4F34</option><option value=\"unassigned\">\u672A\u6307\u6D3E</option>{directory.map(item => <option value={item.id} key={item.id}>@{item.name}</option>)}</select></label>\n <small aria-live=\"polite\">\u663E\u793A {visibleTaskCount} / {board.tasks.length}</small>\n </div>\n <nav className=\"dsh-partner-board-statuses\" aria-label=\"\u6309\u4EFB\u52A1\u72B6\u6001\u7B5B\u9009\"><button type=\"button\" className={statusFilter === 'all' ? 'is-active' : ''} aria-pressed={statusFilter === 'all'} onClick={() => setStatusFilter('all')}><span>\u5168\u90E8</span><b>{scopedTasks.length}</b></button>{COLUMNS.map(column => <button type=\"button\" key={column.id} className={statusFilter === column.id ? 'is-active' : ''} aria-pressed={statusFilter === column.id} onClick={() => setStatusFilter(column.id)}><span>{column.label}</span><b>{statusCounts.get(column.id) ?? 0}</b></button>)}</nav>\n <div className=\"dsh-partner-board\" data-focused={statusFilter !== 'all'} aria-label=\"\u4EFB\u52A1\u770B\u677F\">{visibleColumns.map(column => {\n const tasks = tasksByStatus.get(column.id) ?? []\n const columnTitleId = `dsh-partner-board-${column.id}`\n return <section key={column.id} data-status={column.id} data-empty={tasks.length === 0} aria-labelledby={columnTitleId}><header><strong id={columnTitleId}>{column.label}</strong><b>{tasks.length}</b></header>{tasks.length > 0 ? <div className=\"dsh-partner-board-column-list\">{tasks.map(task => <TaskCard\n key={task.id} task={task} tasksById={tasksById} directoryById={directoryById} dependentCount={dependentsById.get(task.id) ?? 0}\n execution={activeDelegationByTaskId.get(task.id)}\n open={() => setSelectedTaskId(task.id)}\n />)}</div> : <p>{query || assigneeFilter !== 'all' ? '\u6CA1\u6709\u5339\u914D\u4EFB\u52A1' : '\u6682\u65E0\u4EFB\u52A1'}</p>}</section>\n })}</div></>}\n </div>\n}\n\nfunction TaskCard({ task, tasksById, directoryById, dependentCount, execution, open }: {\n task: BoardTaskView; tasksById: ReadonlyMap<string, BoardTaskView>; directoryById: ReadonlyMap<string, PartnerDirectoryEntryView>; dependentCount: number; execution: PartnerDelegationView | undefined; open(): void\n}): JSX.Element {\n const dependencies = task.dependencyTaskIds.map(id => tasksById.get(id)).filter((item): item is BoardTaskView => item !== undefined)\n const blockers = dependencies.filter(item => item.status !== 'done')\n const completedDependencies = dependencies.length - blockers.length\n const assignee = directoryById.get(task.assigneeCompanionId ?? '')\n const executionState = execution ? delegationState(execution) : undefined\n return <article className=\"dsh-partner-task-card\" data-blocked={blockers.length > 0} data-priority={task.priority}>\n <button type=\"button\" className=\"dsh-partner-task-summary\" aria-haspopup=\"dialog\" onClick={open}><span><span className=\"dsh-partner-task-card-title\"><strong title={task.title}>{task.title}</strong><em>{priorityLabel(task.priority)}</em></span><small className=\"dsh-partner-task-card-owner\">{assignee ? `@${assignee.name}` : '\u672A\u6307\u6D3E'}{task.resultSummary ? ' \u00B7 \u5DF2\u6709\u7ED3\u679C' : ''}{executionState ? ` \u00B7 ${executionState.label}` : ''}</small>{(dependencies.length > 0 || dependentCount > 0) && <span className=\"dsh-partner-task-relations\">{dependencies.length > 0 && <small data-blocked={blockers.length > 0}>\u524D\u7F6E {completedDependencies}/{dependencies.length}</small>}{dependentCount > 0 && <small>\u5B8C\u6210\u540E\u89E3\u9501 {dependentCount}</small>}</span>}</span><IconChevronRightOutline14 size={14} /></button>\n </article>\n}\n\nfunction TaskDetail({ task, tasks, activities, directory, execution, busy, update, delegate, review, accept, reject, remove }: {\n task: BoardTaskView; tasks: BoardTaskView[]; activities: TaskActivityView[]; directory: PartnerDirectoryEntryView[]; execution: PartnerDelegationView | undefined; busy: boolean\n update(change: Record<string, unknown>): void; delegate(): void; review(): void; accept(): void; reject(reason: string): void; remove(): void\n}): JSX.Element {\n const [rejecting, setRejecting] = useState(false)\n const [rejectReason, setRejectReason] = useState('')\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const byId = useMemo(() => new Map(tasks.map(item => [item.id, item])), [tasks])\n const dependencies = task.dependencyTaskIds.map(id => byId.get(id)).filter((item): item is BoardTaskView => item !== undefined)\n const blockers = dependencies.filter(item => item.status !== 'done')\n const assignee = directory.find(item => item.id === task.assigneeCompanionId)\n const reviewer = directory.find(item => item.id === task.reviewerCompanionId)\n const dependencyCandidates = tasks.filter(item => item.id !== task.id && !task.dependencyTaskIds.includes(item.id) && !dependsOn(item.id, task.id, byId))\n const canExecute = Boolean(task.assigneeCompanionId) && blockers.length === 0 && !['doing', 'review', 'done'].includes(task.status)\n const recentActivities = [...activities].sort((left, right) => right.at - left.at).slice(0, 6)\n const executionState = execution ? delegationState(execution) : undefined\n return <div className=\"dsh-partner-task-detail\">\n <section className=\"dsh-partner-task-description\"><strong>\u4EFB\u52A1\u8BF4\u660E</strong><p>{task.description || '\u6CA1\u6709\u8865\u5145\u8BF4\u660E'}</p></section>\n <div className=\"dsh-partner-task-fields\"><label><span>\u72B6\u6001</span><select value={task.status} disabled={busy} onChange={event => update({ status: event.target.value })}>{COLUMNS.map(item => <option key={item.id} value={item.id} disabled={(item.id === 'doing' || item.id === 'review' || item.id === 'done') && blockers.length > 0 || item.id === 'done' && task.status !== 'review' && task.status !== 'done'}>{item.label}</option>)}</select></label><label><span>\u8D1F\u8D23\u4EBA</span><select value={task.assigneeCompanionId ?? ''} disabled={busy || task.status === 'doing'} onChange={event => update({ assigneeCompanionId: event.target.value })}><option value=\"\">\u672A\u6307\u6D3E</option>{directory.map(item => <option key={item.id} value={item.id}>@{item.name} \u00B7 {item.availability === 'busy' ? '\u5FD9\u788C' : '\u53EF\u7528'}</option>)}</select></label><label><span>\u9A8C\u6536\u4F19\u4F34</span><select value={task.reviewerCompanionId ?? ''} disabled={busy} onChange={event => update({ reviewerCompanionId: event.target.value })}><option value=\"\">\u7559\u7A7A \u00B7 \u4EBA\u5DE5\u9A8C\u6536</option>{directory.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label></div>\n {executionState && <section className=\"dsh-partner-task-execution\" data-state={execution?.status}><i /><span><strong>{executionState.title}</strong><small>{executionState.detail}</small></span></section>}\n <section className=\"dsh-partner-task-dependency\"><header><strong>\u524D\u7F6E\u4EFB\u52A1</strong><small>{blockers.length ? `${blockers.length} \u9879\u672A\u5B8C\u6210\uFF0C\u5F53\u524D\u4EFB\u52A1\u4E0D\u80FD\u542F\u52A8` : dependencies.length ? '\u5DF2\u5168\u90E8\u5B8C\u6210\uFF0C\u53EF\u4EE5\u542F\u52A8' : '\u6CA1\u6709\u524D\u7F6E\u4F9D\u8D56'}</small></header>{dependencies.length > 0 && <div>{dependencies.map(item => <span key={item.id} data-done={item.status === 'done'}><i>{item.status === 'done' ? <IconCheckOutline16 size={12} /> : ''}</i><b>{item.title}</b><button type=\"button\" disabled={busy || ['doing', 'review', 'done'].includes(task.status)} aria-label={`\u79FB\u9664\u524D\u7F6E\u4EFB\u52A1 ${item.title}`} onClick={() => update({ dependencyTaskIds: task.dependencyTaskIds.filter(id => id !== item.id) })}>\u79FB\u9664</button></span>)}</div>}{dependencyCandidates.length > 0 && <label><span className=\"sr-only\">\u589E\u52A0\u524D\u7F6E\u4EFB\u52A1</span><select defaultValue=\"\" disabled={busy || ['doing', 'review', 'done'].includes(task.status)} onChange={event => { const id = event.currentTarget.value; if (id) update({ dependencyTaskIds: [...task.dependencyTaskIds, id] }); event.currentTarget.value = '' }}><option value=\"\">\u589E\u52A0\u524D\u7F6E\u4EFB\u52A1\u2026</option>{dependencyCandidates.map(item => <option value={item.id} key={item.id}>{item.title} \u00B7 {statusLabel(item.status)}</option>)}</select></label>}</section>\n {task.resultSummary && <ResultBlock label=\"\u6267\u884C\u7ED3\u679C\" value={task.resultSummary} />}\n {task.reviewSummary && <ResultBlock label={`\u6838\u9A8C\u610F\u89C1${reviewer ? ` \u00B7 @${reviewer.name}` : ''}`} value={task.reviewSummary} />}\n {recentActivities.length > 0 && <section className=\"dsh-partner-task-activity\"><strong>\u6700\u8FD1\u6D3B\u52A8</strong><ol>{recentActivities.map(item => <li key={item.id}><span>{item.message}</span><time>{new Date(item.at).toLocaleString()}</time></li>)}</ol></section>}\n {rejecting && <form className=\"dsh-partner-task-reject\" onSubmit={event => { event.preventDefault(); const reason = rejectReason.trim(); if (!reason) return; reject(reason); setRejecting(false); setRejectReason('') }}><label><span>\u6253\u56DE\u539F\u56E0</span><textarea autoFocus value={rejectReason} onChange={event => setRejectReason(event.target.value)} rows={3} maxLength={1200} placeholder=\"\u8BF4\u660E\u9700\u8981\u91CD\u505A\u6216\u8865\u5145\u7684\u5185\u5BB9\" /></label><div><button type=\"button\" onClick={() => { setRejecting(false); setRejectReason('') }}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !rejectReason.trim()}>\u786E\u8BA4\u6253\u56DE</button></div></form>}\n {confirmingDelete && <div className=\"dsh-partner-task-delete-confirm\" role=\"alert\"><span>\u5220\u9664\u540E\uFF0C\u4F9D\u8D56\u5B83\u7684\u4EFB\u52A1\u4F1A\u89E3\u9664\u8FD9\u6761\u524D\u7F6E\u5173\u7CFB\u3002</span><div><button type=\"button\" onClick={() => setConfirmingDelete(false)}>\u53D6\u6D88</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={remove}>\u786E\u8BA4\u5220\u9664</button></div></div>}\n <footer className=\"dsh-partner-task-actions\"><small>r{task.revision} \u00B7 {new Date(task.updatedAt).toLocaleString()}</small><span>{task.status === 'review' ? <>{task.reviewerCompanionId && <button type=\"button\" disabled={busy} onClick={review}>{busy ? '\u6838\u9A8C\u4E2D\u2026' : `\u4EA4\u7ED9 @${reviewer?.name ?? '\u4F19\u4F34'} \u6838\u9A8C`}</button>}<button type=\"button\" disabled={busy} onClick={() => setRejecting(true)}>\u6253\u56DE\u91CD\u505A</button><button type=\"button\" className=\"is-primary\" disabled={busy} onClick={accept}>\u9A8C\u6536\u901A\u8FC7</button></> : <button type=\"button\" disabled={busy || !canExecute} title={blockers.length ? '\u524D\u7F6E\u4EFB\u52A1\u5C1A\u672A\u5B8C\u6210' : !task.assigneeCompanionId ? '\u8BF7\u5148\u9009\u62E9\u8D1F\u8D23\u4EBA' : undefined} onClick={delegate}>{busy ? '\u6267\u884C\u4E2D\u2026' : task.status === 'doing' ? '\u6B63\u5728\u6267\u884C' : task.status === 'done' ? '\u5DF2\u7ECF\u5B8C\u6210' : `\u4EA4\u7ED9 @${assignee?.name ?? '\u4F19\u4F34'}`}</button>}<button type=\"button\" className=\"is-icon\" aria-label={`\u5220\u9664 ${task.title}`} aria-expanded={confirmingDelete} disabled={busy} onClick={() => setConfirmingDelete(true)}><IconTrashOutline16 size={14} /></button></span></footer>\n </div>\n}\n\nfunction ResultBlock({ label, value }: { label: string; value: string }): JSX.Element {\n return <section className=\"dsh-partner-task-result\"><strong>{label}</strong><p>{value}</p></section>\n}\n\nfunction TaskForm({ companions, tasks, close, changed }: { companions: PartnerDirectoryEntryView[]; tasks: BoardTaskView[]; close(): void; changed(): Promise<void> }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const dependencyOptions = tasks.filter(item => item.status !== 'done')\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await api('/tasks', { method: 'POST', body: JSON.stringify({\n title: data.get('title'), description: data.get('description'), priority: data.get('priority'), status: 'backlog',\n assigneeCompanionId: data.get('assignee') || undefined, reviewerCompanionId: data.get('reviewer') || undefined,\n dependencyTaskIds: data.getAll('dependencyTaskId'),\n }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-task-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u4EFB\u52A1\u540D\u79F0</span><input name=\"title\" maxLength={200} required autoFocus placeholder=\"\u4E00\u53E5\u8BDD\u8BF4\u660E\u4EA4\u4ED8\u76EE\u6807\" /></label><label><span>\u8D1F\u8D23\u4EBA</span><select name=\"assignee\" defaultValue=\"\"><option value=\"\">\u672A\u6307\u6D3E</option>{companions.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label><label className=\"is-wide\"><span>\u4EFB\u52A1\u8BF4\u660E</span><textarea name=\"description\" maxLength={8000} rows={5} placeholder=\"\u8865\u5145\u80CC\u666F\u3001\u4EA4\u4ED8\u7269\u548C\u5B8C\u6210\u6761\u4EF6\" /></label><label><span>\u4F18\u5148\u7EA7</span><select name=\"priority\" defaultValue=\"normal\"><option value=\"low\">\u4F4E</option><option value=\"normal\">\u666E\u901A</option><option value=\"high\">\u9AD8</option><option value=\"urgent\">\u7D27\u6025</option></select></label><label><span>\u9A8C\u6536\u4F19\u4F34</span><select name=\"reviewer\" defaultValue=\"\"><option value=\"\">\u7559\u7A7A \u00B7 \u4EBA\u5DE5\u9A8C\u6536</option>{companions.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label><div className=\"dsh-partner-task-form-dependencies is-wide\"><span>\u4F9D\u8D56\u4EFB\u52A1 <small>\u53EF\u9009</small></span>{dependencyOptions.length > 0 ? <div>{dependencyOptions.map(item => <label key={item.id}><input type=\"checkbox\" name=\"dependencyTaskId\" value={item.id} /><i /><span>{item.title}</span><small>{statusLabel(item.status)}</small></label>)}</div> : <p>\u5F53\u524D\u6CA1\u6709\u53EF\u9009\u7684\u672A\u5B8C\u6210\u4EFB\u52A1</p>}<small>\u53EF\u4EE5\u9009\u62E9\u591A\u4E2A\uFF1B\u7559\u7A7A\u8868\u793A\u8BE5\u4EFB\u52A1\u4E0D\u4F9D\u8D56\u5176\u4ED6\u4EFB\u52A1\u3002</small></div>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u4EFB\u52A1'}</button></footer></form>\n}\n\nfunction dependsOn(candidateId: string, targetId: string, tasks: Map<string, BoardTaskView>, visited = new Set<string>()): boolean {\n if (candidateId === targetId) return true\n if (visited.has(candidateId)) return false\n visited.add(candidateId)\n return (tasks.get(candidateId)?.dependencyTaskIds ?? []).some(id => dependsOn(id, targetId, tasks, visited))\n}\nfunction statusLabel(value: BoardTaskStatusView): string { return COLUMNS.find(item => item.id === value)?.label ?? value }\nfunction taskDialogSummary(task: BoardTaskView, directory: PartnerDirectoryEntryView[]): string {\n const assignee = directory.find(item => item.id === task.assigneeCompanionId)\n return `${statusLabel(task.status)} \u00B7 ${assignee ? `\u8D1F\u8D23\u4EBA @${assignee.name}` : '\u5C1A\u672A\u6307\u6D3E\u8D1F\u8D23\u4EBA'} \u00B7 ${priorityLabel(task.priority)}`\n}\nfunction priorityLabel(value: BoardTaskView['priority']): string { return ({ low: '\u4F4E\u4F18\u5148\u7EA7', normal: '\u666E\u901A\u4F18\u5148\u7EA7', high: '\u9AD8\u4F18\u5148\u7EA7', urgent: '\u7D27\u6025' })[value] }\nfunction delegationState(value: PartnerDelegationView): { label: string; title: string; detail: string } {\n const review = value.kind === 'review'\n if (value.status === 'queued') {\n const at = value.nextAttemptAt ? new Date(value.nextAttemptAt).toLocaleString() : '\u7A0D\u540E'\n return { label: '\u7B49\u5F85\u81EA\u52A8\u6062\u590D', title: review ? '\u9A8C\u6536\u5C06\u5728\u8FDE\u63A5\u6062\u590D\u540E\u7EE7\u7EED' : '\u4EFB\u52A1\u5C06\u5728\u8FDE\u63A5\u6062\u590D\u540E\u7EE7\u7EED', detail: `${at} \u81EA\u52A8\u91CD\u8BD5${value.error ? ` \u00B7 ${value.error}` : ''}` }\n }\n const recovered = (value.attempts ?? 1) > 1\n return {\n label: recovered ? `\u7B2C ${value.attempts} \u6B21\u6062\u590D\u4E2D` : review ? '\u4F19\u4F34\u9A8C\u6536\u4E2D' : '\u4F19\u4F34\u6267\u884C\u4E2D',\n title: recovered ? (review ? '\u6B63\u5728\u6062\u590D\u4F19\u4F34\u9A8C\u6536' : '\u6B63\u5728\u6062\u590D\u4F19\u4F34\u4EFB\u52A1') : review ? '\u4F19\u4F34\u6B63\u5728\u6838\u9A8C\u7ED3\u679C' : '\u4F19\u4F34\u6B63\u5728\u6267\u884C\u4EFB\u52A1',\n detail: recovered ? '\u4F1A\u5148\u68C0\u67E5\u5DF2\u6709\u4EA7\u51FA\uFF0C\u907F\u514D\u91CD\u590D\u5199\u5165\u6216\u91CD\u590D\u53D1\u5E03\u3002' : '\u6267\u884C\u72B6\u6001\u4F1A\u81EA\u52A8\u540C\u6B65\uFF0C\u65E0\u9700\u624B\u52A8\u5237\u65B0\u3002',\n }\n}\n", "import { useCallback, useEffect, useState, type FormEvent } from 'react'\nimport { IconPlayOutline16, IconPlusOutline16, IconRefreshOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type CompanionView, type ExecutionRunView, type ScheduledTaskView } from '../client-api.js'\nimport { CollectionEmpty, CollectionSkeleton, WorkspaceBlock, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport function SchedulePanel({ companions }: { companions: CompanionView[] }): JSX.Element {\n const [schedules, setSchedules] = useState<ScheduledTaskView[]>([])\n const [runs, setRuns] = useState<ExecutionRunView[]>([])\n const [creating, setCreating] = useState(false)\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const load = useCallback(async () => {\n try { const value = await api<{ schedules: ScheduledTaskView[]; runs: ExecutionRunView[] }>('/schedules'); setSchedules(value.schedules); setRuns(value.runs.filter(item => item.kind === 'schedule').slice(-50).reverse()); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) } finally { setLoading(false) }\n }, [])\n useEffect(() => { void load() }, [load])\n const update = async (entry: ScheduledTaskView, value: Record<string, unknown>): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}`, { method: 'PUT', body: JSON.stringify(value) }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n const run = async (entry: ScheduledTaskView): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}/trigger`, { method: 'POST' }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n const remove = async (entry: ScheduledTaskView): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}`, { method: 'DELETE' }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n return <div className=\"dsh-partner-feature-page\">\n <WorkspaceHero eyebrow=\"Ephemeral automation\" title=\"\u4F19\u4F34\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u7531\u6307\u5B9A\u4F19\u4F34\u5728\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u4E2D\u6267\u884C\uFF1B\u9ED8\u8BA4\u5B8C\u6210\u5373\u9500\u6BC1\uFF0C\u907F\u514D\u957F\u671F\u4F1A\u8BDD\u88AB\u540E\u53F0\u4EFB\u52A1\u6C61\u67D3\u3002\" actions={<><button type=\"button\" disabled={loading} onClick={() => { void load() }}><IconRefreshOutline16 size={15} />\u5237\u65B0</button><button type=\"button\" disabled={companions.length === 0} onClick={() => setCreating(true)}><IconPlusOutline16 size={15} />\u65B0\u8BA1\u5212</button></>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {creating && <WorkspaceDialog title=\"\u65B0\u5EFA\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u9009\u62E9\u6267\u884C\u4F19\u4F34\u3001\u8FD0\u884C\u9891\u7387\u548C\u4F1A\u8BDD\u4FDD\u7559\u7B56\u7565\u3002\u8BA1\u5212\u521B\u5EFA\u540E\u53EF\u4EE5\u968F\u65F6\u505C\u7528\u6216\u7ACB\u5373\u6267\u884C\u3002\" close={() => setCreating(false)} width=\"wide\"><ScheduleForm companions={companions} close={() => setCreating(false)} changed={load} /></WorkspaceDialog>}\n <WorkspaceBlock title=\"\u6267\u884C\u8BA1\u5212\" detail={`${schedules.filter(item => item.enabled).length} \u4E2A\u542F\u7528`}>\n {loading ? <CollectionSkeleton rows={3} /> : schedules.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u521B\u5EFA\u8BA1\u5212\u540E\uFF0C\u4F19\u4F34\u4F1A\u6309\u8BBE\u5B9A\u5728\u72EC\u7ACB\u4F1A\u8BDD\u4E2D\u6267\u884C\u3002\" action={<button type=\"button\" disabled={companions.length === 0} onClick={() => setCreating(true)}><IconPlusOutline16 size={14} />\u521B\u5EFA\u7B2C\u4E00\u4E2A\u8BA1\u5212</button>} /> : <div className=\"dsh-partner-schedule-list\">{schedules.map(entry => <article key={entry.id}><span><strong>{entry.title}</strong><p>{entry.prompt}</p><span className=\"dsh-partner-schedule-meta\"><em>@{companionName(companions, entry.companionId)}</em><em>{scheduleLabel(entry)}</em><em>\u4E0B\u6B21 {new Date(entry.nextRunAt).toLocaleString()}</em><em>{entry.destroySessionAfterRun ? '\u6267\u884C\u540E\u9500\u6BC1' : '\u4FDD\u7559\u4F1A\u8BDD'}</em></span></span><button type=\"button\" className=\"dsh-partner-feature-switch\" data-on={entry.enabled} aria-pressed={entry.enabled} disabled={busy === entry.id} onClick={() => { void update(entry, { enabled: !entry.enabled }) }}><i /></button><button type=\"button\" disabled={busy === entry.id} onClick={() => { void run(entry) }}><IconPlayOutline16 size={14} />{busy === entry.id ? '\u6267\u884C\u4E2D\u2026' : '\u7ACB\u5373\u6267\u884C'}</button><button type=\"button\" className=\"is-icon\" disabled={busy === entry.id} onClick={() => { void remove(entry) }} aria-label={`\u5220\u9664 ${entry.title}`}><IconTrashOutline16 size={14} /></button></article>)}</div>}\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u6700\u8FD1\u8FD0\u884C\" detail=\"\u4FDD\u7559\u6700\u8FD1\u7684\u72B6\u6001\u4E0E\u7ED3\u679C\u6458\u8981\"><div className=\"dsh-partner-run-list\">{runs.map(run => <article key={run.id} data-status={run.status}><i /><span><strong>{schedules.find(item => item.id === run.sourceId)?.title ?? '\u5DF2\u5220\u9664\u8BA1\u5212'} \u00B7 @{companionName(companions, run.ownerCompanionId)}</strong><p>{run.error || run.outputSummary || '\u7B49\u5F85\u7ED3\u679C'}</p><small>{new Date(run.startedAt).toLocaleString()} \u00B7 {run.status} \u00B7 {run.destroyAfterRun ? '\u4F1A\u8BDD\u5DF2\u9500\u6BC1' : '\u4F1A\u8BDD\u4FDD\u7559'}</small></span></article>)}</div>{!loading && runs.length === 0 && <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u6267\u884C\u8BB0\u5F55\" detail=\"\u8BA1\u5212\u7B2C\u4E00\u6B21\u6267\u884C\u540E\uFF0C\u7ED3\u679C\u548C\u8017\u65F6\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" />}</WorkspaceBlock>\n </div>\n}\n\nfunction ScheduleForm({ companions, close, changed }: { companions: CompanionView[]; close(): void; changed(): Promise<void> }): JSX.Element {\n const [kind, setKind] = useState<'interval' | 'daily'>('interval')\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n const schedule = kind === 'interval' ? { kind, minutes: Number(data.get('minutes')) } : { kind, hour: Number(data.get('hour')), minute: Number(data.get('minute')) }\n setBusy(true); setError(undefined)\n try {\n await api('/schedules', { method: 'POST', body: JSON.stringify({ companionId: data.get('companionId'), title: data.get('title'), prompt: data.get('prompt'), schedule, enabled: true, destroySessionAfterRun: data.get('retain') !== 'on', overlapPolicy: data.get('overlapPolicy'), timeoutMinutes: Number(data.get('timeoutMinutes')) }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-schedule-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u8BA1\u5212\u540D\u79F0</span><input name=\"title\" required maxLength={160} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u6BCF\u65E5\u6574\u7406\u9879\u76EE\u53D8\u5316\" /></label><label><span>\u6267\u884C\u4F19\u4F34</span><select name=\"companionId\" required defaultValue={companions[0]?.id ?? ''}><option value=\"\" disabled>\u9009\u62E9\u4F19\u4F34</option>{companions.map(companion => <option key={companion.id} value={companion.id}>@{companion.name} \u00B7 {companion.role}</option>)}</select></label><label className=\"is-wide\"><span>\u6267\u884C\u5185\u5BB9</span><textarea name=\"prompt\" required maxLength={12000} rows={5} placeholder=\"\u660E\u786E\u8BF4\u660E\u8981\u68C0\u67E5\u3001\u6574\u7406\u6216\u5B8C\u6210\u4EC0\u4E48\uFF0C\u4EE5\u53CA\u5E0C\u671B\u8FD4\u56DE\u4EC0\u4E48\u7ED3\u679C\" /></label><label><span>\u9891\u7387</span><select value={kind} onChange={event => setKind(event.target.value as 'interval' | 'daily')}><option value=\"interval\">\u6BCF\u9694\u4E00\u6BB5\u65F6\u95F4</option><option value=\"daily\">\u6BCF\u5929\u56FA\u5B9A\u65F6\u95F4</option></select></label>{kind === 'interval' ? <label><span>\u95F4\u9694\u5206\u949F</span><input name=\"minutes\" type=\"number\" min={5} max={43200} defaultValue={60} /></label> : <div className=\"dsh-partner-schedule-time\"><label><span>\u5C0F\u65F6</span><input name=\"hour\" type=\"number\" min={0} max={23} defaultValue={9} /></label><label><span>\u5206\u949F</span><input name=\"minute\" type=\"number\" min={0} max={59} defaultValue={0} /></label></div>}<label><span>\u91CD\u53E0\u7B56\u7565</span><select name=\"overlapPolicy\" defaultValue=\"skip\"><option value=\"skip\">\u8DF3\u8FC7\u91CD\u53E0</option><option value=\"queue\">\u6392\u961F\u6267\u884C</option></select></label><label><span>\u8D85\u65F6\u5206\u949F</span><input name=\"timeoutMinutes\" type=\"number\" min={1} max={120} defaultValue={10} /></label><label className=\"dsh-partner-check is-wide\"><input name=\"retain\" type=\"checkbox\" /><i /><span>\u6267\u884C\u540E\u4FDD\u7559\u4E34\u65F6\u4F1A\u8BDD</span></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u8BA1\u5212'}</button></footer></form>\n}\nfunction scheduleLabel(entry: ScheduledTaskView): string { return entry.schedule.kind === 'interval' ? `\u6BCF ${entry.schedule.minutes} \u5206\u949F` : `\u6BCF\u5929 ${String(entry.schedule.hour).padStart(2, '0')}:${String(entry.schedule.minute).padStart(2, '0')}` }\nfunction companionName(companions: CompanionView[], id: string): string { return companions.find(item => item.id === id)?.name ?? '\u5DF2\u5220\u9664\u4F19\u4F34' }\n", "import { useCallback, useEffect, useState } from 'react'\nimport { IconCheckOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type CompanionAccessView } from '../client-api.js'\nimport { CollectionEmpty, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nconst CAPABILITY_LABELS: Record<string, string> = { knowledge: '\u77E5\u8BC6\u5E93', skills: 'Skill', ssh: 'SSH', git: 'Git', companions: '\u521B\u5EFA\u4F19\u4F34', schedules: '\u5B9A\u65F6\u4EFB\u52A1', access: '\u4F19\u4F34\u6388\u6743' }\n\nexport function CompanionAccessPanel({ companionId }: { companionId: string }): JSX.Element {\n const [access, setAccess] = useState<CompanionAccessView>({ targetIds: [], companions: [] })\n const [busy, setBusy] = useState<string>()\n const [error, setError] = useState<string>()\n const load = useCallback(async () => {\n try { setAccess(await api<CompanionAccessView>(`/companions/${encodeURIComponent(companionId)}/access`)); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) }\n }, [companionId])\n useEffect(() => { void load() }, [load])\n\n const toggle = async (targetId: string): Promise<void> => {\n const previous = access.targetIds\n const targetIds = previous.includes(targetId) ? previous.filter(id => id !== targetId) : [...previous, targetId]\n setBusy(targetId); setAccess(current => ({ ...current, targetIds })); setError(undefined)\n try {\n const result = await api<{ targetIds: string[] }>(`/companions/${encodeURIComponent(companionId)}/access`, { method: 'PUT', body: JSON.stringify({ targetIds }) })\n setAccess(current => ({ ...current, targetIds: result.targetIds }))\n } catch (reason) { setAccess(current => ({ ...current, targetIds: previous })); setError(errorMessage(reason)) }\n finally { setBusy(undefined) }\n }\n\n return <section className=\"dsh-partner-capability-detail dsh-partner-access\" aria-labelledby=\"dsh-partner-access-title\">\n <header><span><small>DIRECTED ACCESS</small><strong id=\"dsh-partner-access-title\">\u53EF\u8BBF\u95EE\u7684\u4F19\u4F34</strong></span><em>{access.targetIds.length} \u4F4D\u5DF2\u6388\u6743</em></header>\n <p className=\"dsh-partner-access-note\">\u52FE\u9009\u540E\uFF0C\u5F53\u524D\u4F19\u4F34\u80FD\u4E86\u89E3\u5BF9\u65B9\u7684\u516C\u5F00\u80FD\u529B\uFF0C\u5E76\u5728\u4EFB\u52A1\u770B\u677F\u4E2D `@` \u5BF9\u65B9\u6267\u884C\u4EFB\u52A1\u3002\u6388\u6743\u53EA\u6CBF\u5F53\u524D\u65B9\u5411\u751F\u6548\uFF0C\u4E0D\u4F1A\u53CD\u5411\u6388\u6743\uFF0C\u4E5F\u4E0D\u4F1A\u5171\u4EAB\u4F1A\u8BDD\u3001\u8BB0\u5FC6\u3001\u6E20\u9053\u6216\u51ED\u636E\u3002</p>\n {access.companions.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u53EF\u6388\u6743\u7684\u4F19\u4F34\" detail=\"\u521B\u5EFA\u7B2C\u4E8C\u4F4D\u4F19\u4F34\u540E\uFF0C\u53EF\u4EE5\u5728\u8FD9\u91CC\u5EFA\u7ACB\u5355\u5411\u534F\u4F5C\u6388\u6743\u3002\" /> : <div className=\"dsh-partner-access-list\">{access.companions.map(companion => {\n const selected = access.targetIds.includes(companion.id)\n const abilities = companion.capabilities.map(capability => CAPABILITY_LABELS[capability] ?? capability)\n return <button type=\"button\" key={companion.id} className={selected ? 'is-active' : ''} aria-pressed={selected} disabled={busy === companion.id} onClick={() => { void toggle(companion.id) }}>\n <span className=\"dsh-partner-access-avatar\" aria-hidden=\"true\">{initials(companion.name)}</span>\n <span className=\"dsh-partner-access-copy\"><strong>@{companion.name}</strong><small>{companion.role}</small><p>{companion.description || '\u672A\u586B\u5199\u4F19\u4F34\u8BF4\u660E'}</p><span>{[...abilities, ...companion.enabledSkills.map(skill => skill.name)].map(item => <em key={item}>{item}</em>)}</span></span>\n <span className=\"dsh-partner-access-check\" aria-hidden=\"true\">{selected && <IconCheckOutline16 size={15} />}</span>\n </button>\n })}</div>}\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n </section>\n}\n\nfunction initials(name: string): string { return [...name.trim()].slice(0, 2).join('').toUpperCase() || 'AI' }\n", "import type { ReactNode } from 'react'\nimport { IconAgentPresetOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { ChannelView } from '../client-api.js'\n\nexport function ChannelStatus({ channel }: { channel: ChannelView | undefined }): JSX.Element {\n const status = channel?.runtimeStatus ?? 'unbound'\n return <span className={`dsh-partner-status is-${status}`}><i />{channel ? channelStatusLabel(channel.runtimeStatus) : '\u672A\u8FDE\u63A5'}</span>\n}\n\nexport function Avatar({ name, small = false }: { name: string; small?: boolean }): JSX.Element {\n return <span className={`dsh-partner-avatar${small ? ' is-small' : ''}`} aria-hidden=\"true\">{[...name][0] ?? '\u4F34'}</span>\n}\n\nexport function WeixinGlyph({ large = false }: { large?: boolean }): JSX.Element {\n return <span className={`dsh-partner-weixin-glyph${large ? ' is-large' : ''}`} aria-hidden=\"true\"><i /><b /></span>\n}\n\nexport function TabButton({ active, onClick, icon, children }: { active: boolean; onClick(): void; icon: ReactNode; children: ReactNode }): JSX.Element {\n return <button type=\"button\" className={active ? 'is-active' : ''} aria-current={active ? 'page' : undefined} onClick={onClick}>{icon}<span>{children}</span></button>\n}\n\nexport function FormField({ label, hint, children }: { label: string; hint?: string; children: ReactNode }): JSX.Element {\n return <label className=\"dsh-partner-field\"><span><strong>{label}</strong>{hint && <small>{hint}</small>}</span>{children}</label>\n}\n\nexport function SectionHeading({ eyebrow, title, detail }: { eyebrow: string; title: string; detail: string }): JSX.Element {\n return <header className=\"dsh-partner-section\"><small>{eyebrow}</small><h2>{title}</h2><p>{detail}</p></header>\n}\n\nexport function ContentState({ title, detail, action, compact = false }: { title: string; detail?: string; action?: ReactNode; compact?: boolean }): JSX.Element {\n return <div className={`dsh-partner-state${compact ? ' is-compact' : ''}`}><IconAgentPresetOutline16 size={20} /><strong>{title}</strong>{detail && <p>{detail}</p>}{action}</div>\n}\n\nexport function relativeTime(value: number): string {\n const minutes = Math.floor((Date.now() - value) / 60_000)\n return minutes < 1 ? '\u521A\u521A' : minutes < 60 ? `${minutes} \u5206\u949F\u524D` : minutes < 1440 ? `${Math.floor(minutes / 60)} \u5C0F\u65F6\u524D` : `${Math.floor(minutes / 1440)} \u5929\u524D`\n}\n\nfunction channelStatusLabel(status: ChannelView['runtimeStatus']): string {\n return status === 'running' ? '\u5FAE\u4FE1\u5728\u7EBF' : status === 'starting' ? '\u8FDE\u63A5\u4E2D' : status === 'error' ? '\u8FDE\u63A5\u5F02\u5E38' : '\u5DF2\u505C\u7528'\n}\n", "import { useState, type FormEvent } from 'react'\nimport { IconPlusOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { WorkspaceDialog, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport interface NewCompanionDraft {\n name: string\n role: string\n description: string\n instructions: string\n}\n\nexport function CompanionCreateDialog({ close, create }: { close(): void; create(value: NewCompanionDraft): Promise<void> }): JSX.Element {\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault()\n const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await create({\n name: String(data.get('name') ?? '').trim(),\n role: String(data.get('role') ?? '').trim(),\n description: String(data.get('description') ?? '').trim(),\n instructions: String(data.get('instructions') ?? '').trim(),\n })\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <WorkspaceDialog title=\"\u65B0\u5EFA\u4F19\u4F34\" detail=\"\u5148\u5EFA\u7ACB\u6E05\u6670\u7684\u8EAB\u4EFD\u548C\u804C\u8D23\u3002\u6A21\u578B\u3001\u5DE5\u5177\u3001Skill \u4E0E\u534F\u4F5C\u6743\u9650\u4F1A\u5728\u521B\u5EFA\u540E\u5355\u72EC\u914D\u7F6E\u3002\" close={close} width=\"wide\">\n <form className=\"dsh-partner-feature-form dsh-partner-companion-create-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}>\n <label><span>\u4F19\u4F34\u540D\u5B57</span><input name=\"name\" required maxLength={60} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u5C0F\u9ED1\" /></label>\n <label><span>\u4E3B\u8981\u89D2\u8272</span><input name=\"role\" required maxLength={120} placeholder=\"\u4F8B\u5982\uFF1A\u4EA7\u54C1\u4E0E\u5DE5\u7A0B\u534F\u4F5C\u4F19\u4F34\" /></label>\n <label className=\"is-wide\"><span>\u4E00\u53E5\u8BDD\u5B9A\u4F4D</span><input name=\"description\" maxLength={500} placeholder=\"\u5B83\u4E3B\u8981\u8D1F\u8D23\u4EC0\u4E48\uFF0C\u4EC0\u4E48\u65F6\u5019\u5E94\u8BE5\u627E\u5B83\" /></label>\n <label className=\"is-wide\"><span>\u521D\u59CB\u884C\u4E3A\u51C6\u5219</span><textarea name=\"instructions\" maxLength={12000} rows={7} placeholder=\"\u5199\u6E05\u804C\u8D23\u3001\u8868\u8FBE\u65B9\u5F0F\u3001\u5DE5\u4F5C\u8FB9\u754C\u548C\u4EA4\u4ED8\u6807\u51C6\uFF1B\u4E5F\u53EF\u4EE5\u521B\u5EFA\u540E\u518D\u5B8C\u5584\" /></label>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u6B63\u5728\u521B\u5EFA\u2026' : '\u521B\u5EFA\u4F19\u4F34'}</button></footer>\n </form>\n </WorkspaceDialog>\n}\n", "import type { ClientContext, ISessions, SessionId } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { api } from './client-api.js'\nimport { activatePluginWorkspace } from './workspace-ownership.js'\n\nexport interface PartnerController {\n open(companionId?: string): void\n close(): void\n toggle(): void\n isOpen(): boolean\n selected(): string | undefined\n openSession(routeId: string, sessionId: string): Promise<void>\n startSession(companionId: string): Promise<void>\n renewSession(routeId: string): Promise<void>\n subscribe(listener: () => void): () => void\n}\n\nexport function createPartnerController(ctx: ClientContext, pluginId: string, render: (props: PropsRuntime<'conversation'>, controller: PartnerController) => JSX.Element): PartnerController {\n const listeners = new Set<() => void>()\n let selected: string | undefined\n let dispose: (() => void) | undefined\n const notify = (): void => { for (const listener of listeners) listener() }\n const controller: PartnerController = {\n open(companionId) {\n if (companionId !== undefined) selected = companionId\n if (dispose === undefined) {\n activatePluginWorkspace(pluginId)\n dispose = ctx.slots.register({ name: 'conversation', priority: -3 }, props => render(props, controller))\n }\n notify()\n },\n close() { const current = dispose; dispose = undefined; current?.(); notify() },\n toggle() { if (dispose === undefined) controller.open(); else controller.close() },\n isOpen: () => dispose !== undefined,\n selected: () => selected,\n async openSession(routeId, sessionId) {\n const prepared = await api<{ sessionId: string }>(`/sessions/${encodeURIComponent(routeId)}/prepare`, { method: 'POST' })\n if (prepared.sessionId !== sessionId) throw new Error('\u4F19\u4F34\u4F1A\u8BDD\u6807\u8BC6\u4E0D\u4E00\u81F4')\n await waitForClientSession(ctx, sessionId)\n controller.close()\n sessions(ctx).open(sessionId as SessionId)\n },\n async startSession(companionId) {\n const created = await api<{ routeId: string; sessionId: string }>(`/companions/${encodeURIComponent(companionId)}/session`, { method: 'POST' })\n await waitForClientSession(ctx, created.sessionId)\n dispose?.(); dispose = undefined\n sessions(ctx).open(created.sessionId as SessionId)\n },\n async renewSession(routeId) {\n const renewed = await api<{ routeId: string; sessionId: string }>(`/sessions/${encodeURIComponent(routeId)}/renew`, { method: 'POST' })\n await waitForClientSession(ctx, renewed.sessionId)\n controller.close()\n sessions(ctx).open(renewed.sessionId as SessionId)\n },\n subscribe(listener) { listeners.add(listener); return () => listeners.delete(listener) },\n }\n return controller\n}\n\nfunction waitForClientSession(ctx: ClientContext, sessionId: string): Promise<void> {\n const id = sessionId as SessionId\n const clientSessions = sessions(ctx)\n if (clientSessions.list.getSnapshot().byId[id] !== undefined) return Promise.resolve()\n return new Promise((resolve, reject) => {\n let stop = (): void => {}\n const timeout = window.setTimeout(() => { stop(); reject(new Error('\u4F19\u4F34\u4F1A\u8BDD\u5C1A\u672A\u540C\u6B65\u5230\u7F51\u9875\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5')) }, 5_000)\n stop = clientSessions.list.subscribe(() => {\n if (clientSessions.list.getSnapshot().byId[id] === undefined) return\n window.clearTimeout(timeout); stop(); resolve()\n })\n })\n}\n\nfunction sessions(ctx: ClientContext): ISessions { return ctx.sessions as unknown as ISessions }\n"],
|
|
5
|
-
"mappings": "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AAA,MACtG;AAAA,IACF;AAAA,EACF;AACF;AACA,UAAU,cAAc;;;AC5mCxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
|
|
3
|
+
"sources": ["../src/client.tsx", "../src/workspace-ownership.ts", "../node_modules/qrcode.react/lib/esm/index.js", "../src/client.css", "../src/ui/workspace-ui.css", "../src/ui/responsive-ui.css", "../src/client-api.ts", "../src/sidebar-anchor.ts", "../src/time-format.ts", "../src/glass-surface.tsx", "../src/ui/skills-panel.tsx", "../src/ui/workspace-components.tsx", "../src/ui/task-board-panel.tsx", "../src/ui/schedule-panel.tsx", "../src/ui/companion-access-panel.tsx", "../src/ui/partner-components.tsx", "../src/ui/companion-create.tsx", "../src/client-controller.tsx"],
|
|
4
|
+
"sourcesContent": ["import { useCallback, useEffect, useId, useMemo, useRef, useState, type FormEvent } from 'react'\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { PropsRuntime } 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-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-theme/client'\nimport { observePluginWorkspace } from './workspace-ownership.js'\nimport {\n IconAgentPresetOutline16, IconCheckOutline14, IconChevronDownOutline14, IconChevronLeftOutline14,\n IconDataOutline16, IconEditOutline16, IconLinkOutline16, IconPlusOutline16,\n IconRefreshOutline16, IconTrashOutline16, IconUserOutline16, IconBrowseOutline16, IconListPenOutline16, IconPlayOutline16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { QRCodeSVG } from 'qrcode.react'\nimport baseCssText from './client.css'\nimport workspaceCssText from './ui/workspace-ui.css'\nimport responsiveCssText from './ui/responsive-ui.css'\nimport { api, loadPartner, type AutomationView, type Capability, type ChannelView, type CompanionView, type ConcernActivityView, type ConcernObservationView, type ConcernSourceView, type ConcernView, type DailyReflectionView, type LoginView, type MemoryGraphView, type MemoryRelationView, type MemoryView, type ModelCatalogView, type PartnerSnapshot, type UserProfileSnapshotView } from './client-api.js'\nimport { useWorkspaceTopAnchor } from './sidebar-anchor.js'\nimport { futureTime } from './time-format.js'\nimport { GlassSurface } from './glass-surface.js'\nimport { CompanionSkillSettings, SkillsPanel } from './ui/skills-panel.js'\nimport { TaskBoardPanel } from './ui/task-board-panel.js'\nimport { SchedulePanel } from './ui/schedule-panel.js'\nimport { CompanionAccessPanel } from './ui/companion-access-panel.js'\nimport { Avatar, ChannelStatus as Status, ContentState as State, FormField as Field, SectionHeading as Section, TabButton, WeixinGlyph, relativeTime } from './ui/partner-components.js'\nimport { errorMessage as message } from './ui/workspace-components.js'\nimport { CompanionCreateDialog, type NewCompanionDraft } from './ui/companion-create.js'\nimport { createPartnerController, type PartnerController as Controller } from './client-controller.js'\n\nconst PLUGIN_ID = '@lemoncat7/dsh-partner'\nconst STYLE_ID = `${PLUGIN_ID}/client`\nconst cssText = `${baseCssText}\\n${workspaceCssText}\\n${responsiveCssText}`\ntype SidebarProps = PropsRuntime<'sidebar.footer.action'>\ntype ConversationProps = PropsRuntime<'conversation'>\ntype CompanionTab = 'home' | 'identity' | 'capabilities' | 'weixin' | 'memory'\ntype WorkspacePage = 'skills' | 'board' | 'schedules'\ntype View = CompanionTab | WorkspacePage\n\nconst WORKSPACE_PAGES = new Set<View>(['skills', 'board', 'schedules'])\n\nexport const inject = ['slots', 'layout', 'sessions']\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(installStyles, 'dsh-partner: styles')\n const controller = createPartnerController(ctx, PLUGIN_ID, (props, current) => <PartnerWorkspace {...props} controller={current} />)\n ctx.effect(() => observePluginWorkspace(PLUGIN_ID, controller.close), 'dsh-partner: exclusive workspace')\n ctx.effect(() => () => controller.close(), 'dsh-partner: workspace lifecycle')\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action', id: 'partner', order: -120,\n }, props => <PartnerSidebar {...props} controller={controller} collapse={() => ctx.layout.toggleSidebar()} />))\n}\n\nfunction PartnerSidebar(props: SidebarProps & { controller: Controller; collapse(): void }): JSX.Element {\n const ref = useRef<HTMLElement>(null)\n useWorkspaceTopAnchor(ref)\n const [open, setOpen] = useState(true)\n const [snapshot, setSnapshot] = useState<PartnerSnapshot>()\n const [, update] = useState(0)\n useEffect(() => props.controller.subscribe(() => update(value => value + 1)), [props.controller])\n useEffect(() => { void loadPartner().then(setSnapshot).catch(() => {}) }, [props.controller.isOpen()])\n const launch = (id?: string): void => {\n props.controller.open(id)\n if (props.wide && window.matchMedia('(max-width: 820px)').matches) props.collapse()\n }\n if (!props.wide) return <section ref={ref} className=\"dsh-partner-sidebar is-rail\"><button type=\"button\" className={`dsh-partner-rail${props.controller.isOpen() ? ' is-active' : ''}`} title=\"\u4F19\u4F34\" onClick={() => props.controller.toggle()}><IconAgentPresetOutline16 size={18} /></button></section>\n return <section ref={ref} className=\"dsh-partner-sidebar\">\n <div className=\"dsh-partner-sidebar-heading\">\n <button type=\"button\" className=\"dsh-partner-sidebar-title\" aria-expanded={open} onClick={() => setOpen(value => !value)}><span data-open={open}><IconChevronDownOutline14 size={14} /></span>\u4F19\u4F34</button>\n </div>\n <div className={`dsh-partner-sidebar-list${open ? ' is-open' : ''}`} aria-hidden={!open}>\n <div className=\"dsh-partner-sidebar-list-inner\">\n <button type=\"button\" tabIndex={open ? 0 : -1} className={`dsh-partner-sidebar-row${props.controller.isOpen() ? ' is-active' : ''}`} onClick={() => launch()}>\n <span className=\"dsh-partner-sidebar-symbol\"><IconAgentPresetOutline16 size={16} /></span><span><strong>\u4F19\u4F34\u9762\u677F</strong><small>{snapshot ? `${snapshot.companions.length} \u4F4D\u4F19\u4F34 \u00B7 ${snapshot.channels.filter(item => item.runtimeStatus === 'running').length} \u4E2A\u5FAE\u4FE1\u5728\u7EBF` : '\u8EAB\u4EFD\u3001\u80FD\u529B\u4E0E\u6E20\u9053'}</small></span><i className={snapshot?.channels.some(item => item.runtimeStatus === 'running') ? 'is-online' : ''} />\n </button>\n </div>\n </div>\n </section>\n}\n\nfunction PartnerWorkspace({ controller }: ConversationProps & { controller: Controller }): JSX.Element {\n const [snapshot, setSnapshot] = useState<PartnerSnapshot>()\n const [selectedId, setSelectedId] = useState(controller.selected())\n const [view, setView] = useState<View>('home')\n const [error, setError] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [creatingCompanion, setCreatingCompanion] = useState(false)\n const refresh = useCallback(async () => {\n try {\n const next = await loadPartner()\n setSnapshot(next)\n setSelectedId(current => next.companions.some(item => item.id === current) ? current : next.companions[0]?.id)\n setError(undefined)\n } catch (reason) { setError(message(reason)) } finally { setLoading(false) }\n }, [])\n useEffect(() => { void refresh() }, [refresh])\n useEffect(() => controller.subscribe(() => { const next = controller.selected(); if (next) setSelectedId(next) }), [controller])\n const selected = snapshot?.companions.find(item => item.id === selectedId)\n const create = async (draft: NewCompanionDraft): Promise<void> => {\n try {\n const companion = await api<CompanionView>('/companions', { method: 'POST', body: JSON.stringify({ companion: {\n ...draft, capabilities: [],\n } }) })\n await refresh(); setSelectedId(companion.id); setView('identity'); setCreatingCompanion(false)\n } catch (reason) { setError(message(reason)); throw reason }\n }\n const openSession = async (routeId: string, sessionId: string): Promise<void> => {\n try { setError(undefined); await controller.openSession(routeId, sessionId) }\n catch (reason) { setError(message(reason)) }\n }\n const startSession = async (companionId: string): Promise<void> => {\n try { setError(undefined); await controller.startSession(companionId) }\n catch (reason) { setError(message(reason)) }\n }\n const renewSession = async (routeId: string): Promise<void> => {\n try { setError(undefined); await controller.renewSession(routeId) }\n catch (reason) { setError(message(reason)) }\n }\n const workspacePage = WORKSPACE_PAGES.has(view)\n const openCompanion = (id: string): void => { setSelectedId(id); setView('home') }\n return <main className=\"dsh-partner-workspace\">\n {creatingCompanion && <CompanionCreateDialog close={() => setCreatingCompanion(false)} create={create} />}\n <header className=\"dsh-partner-topbar\">\n <div className=\"dsh-partner-topbar-brand\"><button type=\"button\" data-xiaohei-workspace-close onClick={controller.close} aria-label=\"\u8FD4\u56DE\u4F1A\u8BDD\" title=\"\u8FD4\u56DE\u4F1A\u8BDD\"><IconChevronLeftOutline14 size={15} /></button><IconAgentPresetOutline16 size={18} /><span><strong>\u4F19\u4F34</strong><small>\u957F\u671F\u8EAB\u4EFD\u4E0E\u5FAE\u4FE1\u6E20\u9053</small></span></div>\n <MobileWorkspaceControls\n companions={snapshot?.companions ?? []}\n selectedId={selectedId}\n view={view}\n openCompanion={openCompanion}\n openPage={setView}\n createCompanion={() => setCreatingCompanion(true)}\n />\n </header>\n <div className=\"dsh-partner-grid\">\n <aside className=\"dsh-partner-roster\">\n <div className=\"dsh-partner-roster-title\"><span><small>COMPANIONS</small><strong>\u4F19\u4F34\u540D\u518C</strong></span><button type=\"button\" onClick={() => setCreatingCompanion(true)} aria-label=\"\u65B0\u5EFA\u4F19\u4F34\"><IconPlusOutline16 size={16} /></button></div>\n <div className=\"dsh-partner-roster-list\">{snapshot?.companions.map(companion => {\n const channel = snapshot.channels.find(item => item.companionId === companion.id)\n return <button type=\"button\" key={companion.id} className={!workspacePage && selectedId === companion.id ? 'is-active' : ''} onClick={() => openCompanion(companion.id)}>\n <Avatar name={companion.name} /><span><strong>{companion.name}</strong><small>{companion.role}</small></span><i className={channel?.runtimeStatus === 'running' ? 'is-online' : ''} title={channel ? channel.runtimeStatus : '\u672A\u8FDE\u63A5\u6E20\u9053'} />\n </button>\n })}</div>\n <nav className=\"dsh-partner-workspace-nav\" aria-label=\"\u4F19\u4F34\u5DE5\u4F5C\u533A\">\n <button type=\"button\" className={view === 'skills' ? 'is-active' : ''} aria-current={view === 'skills' ? 'page' : undefined} onClick={() => setView('skills')}><span><IconBrowseOutline16 size={16} /></span><strong>Skill \u5E02\u573A</strong><small>\u5B89\u88C5\u4E0E\u7BA1\u7406\u80FD\u529B</small></button>\n <button type=\"button\" className={view === 'board' ? 'is-active' : ''} aria-current={view === 'board' ? 'page' : undefined} onClick={() => setView('board')}><span><IconListPenOutline16 size={16} /></span><strong>\u4EFB\u52A1\u770B\u677F</strong><small>\u534F\u4F5C\u3001\u59D4\u6D3E\u4E0E\u9A8C\u6536</small></button>\n <button type=\"button\" className={view === 'schedules' ? 'is-active' : ''} aria-current={view === 'schedules' ? 'page' : undefined} onClick={() => setView('schedules')}><span><IconPlayOutline16 size={16} /></span><strong>\u5B9A\u65F6\u4EFB\u52A1</strong><small>\u9009\u62E9\u4F19\u4F34\u5468\u671F\u6267\u884C</small></button>\n </nav>\n <div className=\"dsh-partner-roster-note\"><IconLinkOutline16 size={16} /><span><strong>\u8EAB\u4EFD\u4E0E\u6E20\u9053\u5206\u79BB</strong><small>\u5FAE\u4FE1\u53EA\u8D1F\u8D23\u6536\u53D1\uFF0C\u6743\u9650\u4ECD\u7531 DSH \u5DE5\u5177\u51B3\u5B9A\u3002</small></span></div>\n </aside>\n <section className={`dsh-partner-stage${workspacePage ? ' is-workspace-page' : ''}`}>\n {loading ? <State title=\"\u6B63\u5728\u8BFB\u53D6\u4F19\u4F34\u2026\" /> : workspacePage ? <div className=\"dsh-partner-stage-scroll is-workspace-page\">\n {view === 'skills' && <SkillsPanel />}\n {view === 'board' && <TaskBoardPanel />}\n {view === 'schedules' && <SchedulePanel companions={snapshot?.companions ?? []} />}\n </div> : selected === undefined ? <State title=\"\u521B\u5EFA\u7B2C\u4E00\u4E2A\u4F19\u4F34\" detail=\"\u4F19\u4F34\u4F1A\u4FDD\u5B58\u72EC\u7ACB\u8EAB\u4EFD\u3001\u80FD\u529B\u548C\u5FAE\u4FE1\u4F1A\u8BDD\u3002\" action={<button onClick={() => setCreatingCompanion(true)}>\u65B0\u5EFA\u4F19\u4F34</button>} /> : <>\n <div className=\"dsh-partner-identity\"><Avatar name={selected.name} /><span><small>ACTIVE COMPANION</small><h1>{selected.name}</h1><p>{selected.description || selected.role}</p></span><Status channel={snapshot?.channels.find(item => item.companionId === selected.id)} /></div>\n <nav className=\"dsh-partner-tabs\" aria-label=\"\u4F19\u4F34\u914D\u7F6E\">\n <TabButton active={view === 'home'} onClick={() => setView('home')} icon={<IconAgentPresetOutline16 size={16} />}>\u603B\u89C8</TabButton>\n <TabButton active={view === 'identity'} onClick={() => setView('identity')} icon={<IconEditOutline16 size={16} />}>\u8EAB\u4EFD</TabButton>\n <TabButton active={view === 'capabilities'} onClick={() => setView('capabilities')} icon={<IconAgentPresetOutline16 size={16} />}>\u80FD\u529B</TabButton>\n <TabButton active={view === 'weixin'} onClick={() => setView('weixin')} icon={<WeixinGlyph />}>\u5FAE\u4FE1</TabButton>\n <TabButton active={view === 'memory'} onClick={() => setView('memory')} icon={<IconDataOutline16 size={16} />}>\u8BB0\u5FC6</TabButton>\n </nav>\n <div className=\"dsh-partner-stage-scroll\">\n {view === 'home' && <HomePanel companion={selected} snapshot={snapshot!} navigate={setView} openSession={openSession} startSession={startSession} renewSession={renewSession} />}\n {view === 'identity' && <IdentityEditor companion={selected} count={snapshot?.companions.length ?? 1} onChanged={refresh} />}\n {view === 'capabilities' && <CapabilityEditor companion={selected} presets={snapshot?.presets ?? []} onChanged={refresh} />}\n {view === 'weixin' && <WeixinPanel companion={selected} snapshot={snapshot!} onChanged={refresh} />}\n {view === 'memory' && <MemoryPanel companion={selected} snapshot={snapshot!} openSession={openSession} startSession={startSession} renewSession={renewSession} onChanged={refresh} />}\n </div>\n </>}\n {error && <p className=\"dsh-partner-error\" role=\"alert\">{error}</p>}\n </section>\n </div>\n </main>\n}\n\nfunction MobileWorkspaceControls({ companions, selectedId, view, openCompanion, openPage, createCompanion }: {\n companions: CompanionView[]\n selectedId: string | undefined\n view: View\n openCompanion(id: string): void\n openPage(page: WorkspacePage): void\n createCompanion(): void\n}): JSX.Element {\n return <div className=\"dsh-partner-mobile-controls\">\n <div className=\"dsh-partner-mobile-companion-row\">\n <label className=\"dsh-partner-mobile-companion-picker\">\n <span className=\"sr-only\">\u5F53\u524D\u4F19\u4F34</span>\n <select value={selectedId ?? ''} disabled={companions.length === 0} aria-label=\"\u5207\u6362\u5F53\u524D\u4F19\u4F34\" onChange={event => openCompanion(event.target.value)}>\n {companions.length === 0 && <option value=\"\">\u8FD8\u6CA1\u6709\u4F19\u4F34</option>}\n {companions.map(companion => <option value={companion.id} key={companion.id}>{companion.name} \u00B7 {companion.role}</option>)}\n </select>\n </label>\n <button type=\"button\" className=\"dsh-partner-mobile-create\" onClick={createCompanion} aria-label=\"\u65B0\u5EFA\u4F19\u4F34\"><IconPlusOutline16 size={17} /></button>\n </div>\n <nav className=\"dsh-partner-mobile-workspace-nav\" aria-label=\"\u4F19\u4F34\u5DE5\u4F5C\u533A\u5FEB\u6377\u5165\u53E3\">\n <button type=\"button\" className={view === 'skills' ? 'is-active' : ''} aria-pressed={view === 'skills'} onClick={() => openPage('skills')}><IconBrowseOutline16 size={16} /><span>Skill</span></button>\n <button type=\"button\" className={view === 'board' ? 'is-active' : ''} aria-pressed={view === 'board'} onClick={() => openPage('board')}><IconListPenOutline16 size={16} /><span>\u770B\u677F</span></button>\n <button type=\"button\" className={view === 'schedules' ? 'is-active' : ''} aria-pressed={view === 'schedules'} onClick={() => openPage('schedules')}><IconPlayOutline16 size={16} /><span>\u5B9A\u65F6</span></button>\n </nav>\n </div>\n}\n\nfunction HomePanel({ companion, snapshot, navigate, openSession, startSession, renewSession }: { companion: CompanionView; snapshot: PartnerSnapshot; navigate(tab: CompanionTab): void; openSession(routeId: string, sessionId: string): Promise<void>; startSession(companionId: string): Promise<void>; renewSession(routeId: string): Promise<void> }): JSX.Element {\n const channel = snapshot.channels.find(item => item.companionId === companion.id)\n const sessions = snapshot.sessions.filter(item => item.companionId === companion.id)\n const localSession = sessions.find(item => item.kind === 'local')\n const pending = channel ? snapshot.pairings.filter(item => item.channelId === channel.id && item.status === 'pending').length : 0\n const approved = channel ? snapshot.pairings.filter(item => item.channelId === channel.id && item.status === 'approved').length : 0\n const capabilities = companion.capabilities.map(item => ({ knowledge: '\u77E5\u8BC6\u5E93', skills: 'Skill', ssh: 'SSH', git: 'Git', companions: '\u521B\u5EFA\u4F19\u4F34', schedules: '\u5B9A\u65F6\u4EFB\u52A1', access: '\u4F19\u4F34\u6388\u6743' })[item])\n const online = channel?.runtimeStatus === 'running'\n return <div className=\"dsh-partner-home\">\n <header className=\"dsh-partner-home-heading\">\n <span><small>\u5DE5\u4F5C\u53F0</small><h2>{online ? `${companion.name} \u6B63\u5728\u5FAE\u4FE1\u5F85\u547D` : `${companion.name} \u5DF2\u51C6\u5907\u5C31\u7EEA`}</h2></span>\n <p>{online ? '\u6D88\u606F\u3001\u6388\u6743\u4E0E\u4E0A\u4E0B\u6587\u8FB9\u754C\u90FD\u5728\u8FD9\u91CC\u6C47\u603B\u3002' : '\u4F19\u4F34\u8EAB\u4EFD\u3001\u4F1A\u8BDD\u4E0E\u80FD\u529B\u5DF2\u7ECF\u51C6\u5907\u5B8C\u6210\u3002'}</p>\n </header>\n\n <section className={`dsh-partner-home-channel${online ? ' is-online' : ''}`}>\n <div className=\"dsh-partner-home-route\" aria-hidden=\"true\">\n <Avatar name={companion.name} />\n <span className=\"dsh-partner-route-line\"><i /></span>\n <span className=\"dsh-partner-route-weixin\"><WeixinGlyph large /></span>\n </div>\n <div className=\"dsh-partner-home-channel-copy\">\n <span className=\"dsh-partner-home-kicker\"><i />\u4E3B\u8981\u6E20\u9053 \u00B7 \u5FAE\u4FE1</span>\n <h3>{!channel ? '\u7B49\u5F85\u626B\u7801\u8FDE\u63A5' : online ? '\u8FDE\u63A5\u6B63\u5E38\uFF0C\u6B63\u5728\u63A5\u6536\u6D88\u606F' : channel.runtimeStatus === 'error' ? '\u6E20\u9053\u8FDE\u63A5\u9700\u8981\u5904\u7406' : '\u6E20\u9053\u5F53\u524D\u5DF2\u505C\u7528'}</h3>\n <p>{!channel ? '\u901A\u8FC7\u5FAE\u4FE1 iLink Bot \u63A5\u5165\u3002\u51ED\u636E\u53EA\u8FDB\u5165 DSH \u51ED\u636E\u5E93\uFF0C\u8054\u7CFB\u4EBA\u9996\u6B21\u53D1\u6D88\u606F\u4ECD\u9700\u4F60\u7684\u6279\u51C6\u3002' : online ? '\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u62E5\u6709\u72EC\u7ACB DSH \u4F1A\u8BDD\uFF0C\u4F19\u4F34\u8EAB\u4EFD\u4E00\u81F4\uFF0C\u4F46\u4E0A\u4E0B\u6587\u4E0D\u4F1A\u4E92\u76F8\u6DF7\u5408\u3002' : channel.lastError || '\u6E20\u9053\u914D\u7F6E\u4ECD\u7136\u4FDD\u7559\uFF0C\u53EF\u4EE5\u968F\u65F6\u91CD\u65B0\u542F\u7528\u3002'}</p>\n <div className=\"dsh-partner-home-channel-actions\">\n <button type=\"button\" className=\"is-primary\" onClick={() => navigate('weixin')}>{!channel ? '\u8FDE\u63A5\u5FAE\u4FE1' : pending > 0 ? `\u5904\u7406 ${pending} \u4E2A\u8BF7\u6C42` : '\u7BA1\u7406\u6E20\u9053'}</button>\n <span>{!channel ? '\u626B\u7801\u5B8C\u6210\uFF0C\u65E0\u9700\u7C98\u8D34 Token' : `${approved} \u4F4D\u8054\u7CFB\u4EBA \u00B7 ${sessions.length} \u4E2A\u72EC\u7ACB\u4F1A\u8BDD`}</span>\n </div>\n </div>\n </section>\n\n <div className=\"dsh-partner-home-details\">\n <section className=\"dsh-partner-home-profile\">\n <header><span><IconUserOutline16 size={16} /></span><div><small>\u4F19\u4F34\u5E95\u7A3F</small><strong>{companion.role}</strong></div><button type=\"button\" onClick={() => navigate('identity')}>\u7F16\u8F91</button></header>\n <blockquote>{companion.instructions || companion.description || '\u5C1A\u672A\u8BBE\u7F6E\u957F\u671F\u884C\u4E3A\u51C6\u5219\u3002'}</blockquote>\n </section>\n <section className=\"dsh-partner-home-runtime\">\n <header><span><IconAgentPresetOutline16 size={16} /></span><div><small>\u8FD0\u884C\u80FD\u529B</small><strong>{companion.presetId || 'DSH \u9ED8\u8BA4 Preset'}</strong></div><button type=\"button\" onClick={() => navigate('capabilities')}>\u8C03\u6574</button></header>\n <div className=\"dsh-partner-home-capability-list\">{capabilities.length ? capabilities.map(item => <em key={item}>{item}</em>) : <small>\u5C1A\u672A\u58F0\u660E\u80FD\u529B\u8303\u56F4</small>}</div>\n </section>\n <section className=\"dsh-partner-home-continuity\">\n <header><span><IconDataOutline16 size={16} /></span><div><small>\u4F19\u4F34\u5BF9\u8BDD</small><strong>{localSession?.archived ? '\u4F1A\u8BDD\u5DF2\u5F52\u6863' : '\u4F19\u4F34\u4F1A\u8BDD\u5DF2\u5EFA\u7ACB'}</strong></div><button type=\"button\" onClick={() => localSession === undefined ? void startSession(companion.id) : localSession.archived ? void renewSession(localSession.id) : void openSession(localSession.id, localSession.sessionId)}>{localSession === undefined ? '\u5F00\u59CB\u5BF9\u8BDD' : localSession.archived ? '\u5F00\u59CB\u65B0\u4F1A\u8BDD' : '\u6253\u5F00\u4F1A\u8BDD'}</button></header>\n <p>{localSession ? `\u6700\u8FD1\u6D3B\u52A8\u4E8E ${relativeTime(localSession.lastMessageAt)}\uFF1B\u53E6\u6709 ${sessions.filter(item => item.kind === 'channel').length} \u4E2A\u6E20\u9053\u4F1A\u8BDD\u3002` : '\u4F19\u4F34\u4F1A\u8BDD\u6B63\u5728\u521D\u59CB\u5316\uFF0C\u7A0D\u540E\u5373\u53EF\u6253\u5F00\u3002'}</p>\n </section>\n </div>\n </div>\n}\n\nfunction IdentityEditor({ companion, count, onChanged }: { companion: CompanionView; count: number; onChanged(): Promise<void> }): JSX.Element {\n const [form, setForm] = useState(() => companionDraft(companion))\n const [saving, setSaving] = useState(false)\n const [saved, setSaved] = useState(false)\n const [error, setError] = useState<string>()\n const [confirmingRemove, setConfirmingRemove] = useState(false)\n useEffect(() => { setForm(companionDraft(companion)); setSaved(false) }, [companion.id, companion.updatedAt])\n const submit = async (event: FormEvent): Promise<void> => {\n event.preventDefault(); setSaving(true); setError(undefined)\n try { await api(`/companions/${companion.id}`, { method: 'PUT', body: JSON.stringify({ companion: form }) }); setSaved(true); await onChanged() }\n catch (reason) { setError(message(reason)) } finally { setSaving(false) }\n }\n const remove = async (): Promise<void> => {\n try { await api(`/companions/${companion.id}`, { method: 'DELETE' }); await onChanged() } catch (reason) { setError(message(reason)) }\n }\n return <form className=\"dsh-partner-form is-identity\" onSubmit={event => { void submit(event) }}>\n <Section eyebrow=\"IDENTITY\" title=\"\u5DE5\u4F5C\u8EAB\u4EFD\" detail=\"\u5B83\u4E0D\u662F\u4E00\u6B21\u5BF9\u8BDD\u7684\u63D0\u793A\u8BCD\uFF0C\u800C\u662F\u8FD9\u4E2A\u4F19\u4F34\u5728\u684C\u9762\u548C\u5FAE\u4FE1\u4E2D\u7684\u957F\u671F\u884C\u4E3A\u57FA\u7EBF\u3002\" />\n <div className=\"dsh-partner-fields two\"><Field label=\"\u540D\u5B57\"><input required maxLength={60} value={form.name} onChange={event => setForm({ ...form, name: event.target.value })} /></Field><Field label=\"\u89D2\u8272\"><input required maxLength={120} value={form.role} onChange={event => setForm({ ...form, role: event.target.value })} /></Field></div>\n <Field label=\"\u4E00\u53E5\u8BDD\u5B9A\u4F4D\" hint=\"\u7528\u4E8E\u540D\u518C\u8BC6\u522B\uFF0C\u4E0D\u4F1A\u66FF\u4EE3\u5B8C\u6574\u884C\u4E3A\u51C6\u5219\u3002\"><textarea rows={2} maxLength={500} value={form.description} onChange={event => setForm({ ...form, description: event.target.value })} /></Field>\n <Field label=\"\u957F\u671F\u884C\u4E3A\u51C6\u5219\" hint=\"\u5EFA\u8BAE\u5199\u804C\u8D23\u3001\u8868\u8FBE\u65B9\u5F0F\u4E0E\u8FB9\u754C\uFF1B\u6E20\u9053\u3001\u5DE5\u5177\u548C\u6388\u6743\u7531\u7CFB\u7EDF\u5355\u72EC\u63A7\u5236\u3002\"><textarea rows={9} maxLength={12000} value={form.instructions} onChange={event => setForm({ ...form, instructions: event.target.value })} /></Field>\n {error && <p className=\"dsh-partner-inline-error\">{error}</p>}\n <div className=\"dsh-partner-form-actions\"><span>{saved && <><IconCheckOutline14 size={14} />\u5DF2\u4FDD\u5B58\uFF0C\u540E\u7EED\u5FAE\u4FE1\u6D88\u606F\u5C06\u4F7F\u7528\u65B0\u8EAB\u4EFD</>}</span><button disabled={saving}>{saving ? '\u6B63\u5728\u4FDD\u5B58\u2026' : '\u4FDD\u5B58\u8EAB\u4EFD'}</button></div>\n <div className=\"dsh-partner-identity-danger\" data-confirming={confirmingRemove}><span><strong>{confirmingRemove ? `\u786E\u8BA4\u5220\u9664\u300C${companion.name}\u300D\uFF1F` : '\u5220\u9664\u4F19\u4F34'}</strong><small>{confirmingRemove ? '\u8BE5\u4F19\u4F34\u7684\u672C\u5730\u914D\u7F6E\u4F1A\u88AB\u79FB\u9664\uFF1B\u5DF2\u6709\u6E20\u9053\u5FC5\u987B\u5148\u89E3\u7ED1\u3002' : '\u5FC5\u987B\u5148\u79FB\u9664\u5DF2\u7ED1\u5B9A\u5FAE\u4FE1\u6E20\u9053\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u628A\u8054\u7CFB\u4EBA\u8F6C\u4EA4\u7ED9\u5176\u4ED6\u4F19\u4F34\u3002'}</small></span><div>{confirmingRemove && <button type=\"button\" className=\"is-secondary\" onClick={() => setConfirmingRemove(false)}>\u53D6\u6D88</button>}<button type=\"button\" className={confirmingRemove ? 'is-danger' : ''} disabled={count <= 1} onClick={() => confirmingRemove ? void remove() : setConfirmingRemove(true)}><IconTrashOutline16 size={16} />{confirmingRemove ? '\u786E\u8BA4\u5220\u9664' : '\u5220\u9664'}</button></div></div>\n </form>\n}\n\nfunction CapabilityEditor({ companion, presets, onChanged }: { companion: CompanionView; presets: PartnerSnapshot['presets']; onChanged(): Promise<void> }): JSX.Element {\n const [form, setForm] = useState(() => companionDraft(companion))\n const [modelCatalog, setModelCatalog] = useState<ModelCatalogView>()\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string>()\n useEffect(() => setForm(companionDraft(companion)), [companion.id, companion.updatedAt])\n useEffect(() => { void api<ModelCatalogView>('/models').then(setModelCatalog).catch(reason => setError(message(reason))) }, [])\n const toggle = (capability: Capability): void => setForm(current => ({ ...current, capabilities: current.capabilities.includes(capability) ? current.capabilities.filter(item => item !== capability) : [...current.capabilities, capability] }))\n const save = async (): Promise<void> => {\n setSaving(true); setError(undefined)\n try { await api(`/companions/${companion.id}`, { method: 'PUT', body: JSON.stringify({ companion: form }) }); await onChanged() }\n catch (reason) { setError(message(reason)) } finally { setSaving(false) }\n }\n const groups: Array<{ id: string; eyebrow: string; title: string; detail: string; choices: Array<{ id: Capability; title: string; detail: string }> }> = [\n { id: 'tools', eyebrow: 'TOOLS', title: '\u5DE5\u4F5C\u5DE5\u5177', detail: '\u8FDE\u63A5\u5F53\u524D\u4F19\u4F34\u80FD\u591F\u4F7F\u7528\u7684\u4E13\u4E1A\u5DE5\u5177\u3002', choices: [\n { id: 'knowledge', title: '\u77E5\u8BC6\u5E93', detail: '\u5728\u5DF2\u6302\u8F7D\u8303\u56F4\u5185\u68C0\u7D22\u4E0E\u56DE\u5199\u77E5\u8BC6\u3002' },\n { id: 'skills', title: 'Skill', detail: '\u4F7F\u7528\u5355\u72EC\u542F\u7528\u7684 Skill \u4E0E\u5DE5\u4F5C\u6D41\u7A0B\u3002' },\n { id: 'ssh', title: 'SSH', detail: '\u5728 SSH \u63D2\u4EF6\u6388\u6743\u8FB9\u754C\u5185\u64CD\u4F5C\u4E3B\u673A\u3002' },\n { id: 'git', title: 'Git', detail: '\u9884\u7559 Git \u80FD\u529B\uFF0C\u9700\u5BF9\u5E94\u63D2\u4EF6\u5B9E\u9645\u5B89\u88C5\u3002' },\n ] },\n { id: 'coordination', eyebrow: 'COORDINATION', title: '\u534F\u4F5C\u4E0E\u81EA\u52A8\u5316', detail: '\u63A7\u5236\u4F19\u4F34\u5EFA\u7ACB\u5173\u7CFB\u548C\u81EA\u4E3B\u5B89\u6392\u5DE5\u4F5C\u7684\u6743\u9650\u3002', choices: [\n { id: 'companions', title: '\u521B\u5EFA\u4F19\u4F34', detail: '\u6309\u660E\u786E\u9700\u6C42\u521B\u5EFA\u9ED8\u8BA4\u65E0\u6743\u9650\u7684\u65B0\u4F19\u4F34\u3002' },\n { id: 'access', title: '\u4F19\u4F34\u6388\u6743', detail: '\u6309\u660E\u786E\u8981\u6C42\u914D\u7F6E\u4F19\u4F34\u4E4B\u95F4\u7684\u5355\u5411\u8BBF\u95EE\u5173\u7CFB\u3002' },\n { id: 'schedules', title: '\u5B9A\u65F6\u4EFB\u52A1', detail: '\u521B\u5EFA\u5E76\u7BA1\u7406\u7531\u81EA\u5DF1\u6267\u884C\u7684\u5468\u671F\u4EFB\u52A1\u3002' },\n ] },\n ]\n const selectedProvider = form.provider || modelCatalog?.defaultSelection.provider || ''\n const modelOptions = modelCatalog?.providers.find(item => item.id === selectedProvider)?.models ?? []\n const currentModelMissing = Boolean(form.model) && !modelOptions.some(item => item.id === form.model)\n return <div className=\"dsh-partner-form is-capabilities\"><Section eyebrow=\"COMPOSITION\" title=\"\u80FD\u529B\u7EC4\u5408\" detail=\"\u4F19\u4F34\u58F0\u660E\u610F\u56FE\u8303\u56F4\uFF1B\u771F\u6B63\u53EF\u8C03\u7528\u7684\u5DE5\u5177\u4ECD\u6765\u81EA\u6240\u9009 Agent Preset\uFF0C\u5E76\u7EE7\u7EED\u6267\u884C\u5404\u63D2\u4EF6\u6743\u9650\u3002\" />\n <div className=\"dsh-partner-runtime-fields\"><Field label=\"Agent Preset\" hint=\"\u5DE5\u5177\u3001Skill \u4E0E\u7CFB\u7EDF\u63D0\u793A\"><select value={form.presetId} onChange={event => setForm({ ...form, presetId: event.target.value })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 Preset</option>{presets.filter(item => !item.broken).map(item => <option value={item.id} key={item.id}>{item.name}</option>)}</select></Field><Field label=\"\u6A21\u578B\u63D0\u4F9B\u65B9\" hint=\"\u6765\u81EA\u5F53\u524D\u5BA2\u6237\u7AEF\"><select value={form.provider} onChange={event => setForm({ ...form, provider: event.target.value, model: '' })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 \u00B7 {modelCatalog?.defaultSelection.provider || '\u6B63\u5728\u8BFB\u53D6'}</option>{modelCatalog?.providers.map(provider => <option value={provider.id} key={provider.id}>{provider.name || provider.id}</option>)}</select></Field><Field label=\"\u6A21\u578B\" hint=\"\u968F\u63D0\u4F9B\u65B9\u8054\u52A8\"><select value={form.model} onChange={event => setForm({ ...form, model: event.target.value })}><option value=\"\">\u8DDF\u968F DSH \u9ED8\u8BA4 \u00B7 {modelCatalog?.defaultSelection.model || '\u6B63\u5728\u8BFB\u53D6'}</option>{currentModelMissing && <option value={form.model}>\u5F53\u524D\u914D\u7F6E \u00B7 {form.model}</option>}{modelOptions.map(model => <option value={model.id} key={model.id}>{model.name || model.id}</option>)}</select></Field></div>\n <div className=\"dsh-partner-capability-groups\">{groups.map(group => {\n const enabled = group.choices.filter(choice => form.capabilities.includes(choice.id)).length\n return <section className=\"dsh-partner-capability-group\" key={group.id} aria-labelledby={`partner-capability-${group.id}`}><header><span><small>{group.eyebrow}</small><strong id={`partner-capability-${group.id}`}>{group.title}</strong><p>{group.detail}</p></span><em>{enabled} / {group.choices.length} \u5DF2\u542F\u7528</em></header><div className=\"dsh-partner-capabilities\">{group.choices.map(choice => {\n const active = form.capabilities.includes(choice.id)\n return <button type=\"button\" key={choice.id} className={active ? 'is-active' : ''} aria-pressed={active} onClick={() => toggle(choice.id)}><span>{active && <IconCheckOutline14 size={14} />}</span><strong>{choice.title}</strong><small>{choice.detail}</small></button>\n })}</div></section>\n })}</div>\n {form.capabilities.includes('skills') && companion.capabilities.includes('skills') && <CompanionSkillSettings companionId={companion.id} />}\n {form.capabilities.includes('skills') && !companion.capabilities.includes('skills') && <p className=\"dsh-partner-inline-note\">\u5148\u5E94\u7528\u80FD\u529B\u7EC4\u5408\uFF0C\u518D\u4E3A\u5F53\u524D\u4F19\u4F34\u9009\u62E9\u5177\u4F53 Skill\u3002</p>}\n <CompanionAccessPanel companionId={companion.id} />\n {error && <p className=\"dsh-partner-inline-error\">{error}</p>}<div className=\"dsh-partner-form-actions\"><span /><button type=\"button\" disabled={saving} onClick={() => { void save() }}>{saving ? '\u6B63\u5728\u5E94\u7528\u2026' : '\u5E94\u7528\u80FD\u529B\u7EC4\u5408'}</button></div>\n </div>\n}\n\nfunction WeixinPanel({ companion, snapshot, onChanged }: { companion: CompanionView; snapshot: PartnerSnapshot; onChanged(): Promise<void> }): JSX.Element {\n const channel = snapshot.channels.find(item => item.companionId === companion.id)\n const [login, setLogin] = useState<LoginView>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n useEffect(() => {\n if (!login || login.phase === 'confirmed' || login.phase === 'expired' || login.phase === 'error') return\n const timer = window.setInterval(() => {\n void api<{ login: LoginView; channel?: ChannelView }>(`/weixin/login/${login.id}`).then(async result => {\n setLogin(result.login)\n if (result.channel) { setLogin(undefined); await onChanged() }\n }).catch(reason => setError(message(reason)))\n }, 2_000)\n return () => clearInterval(timer)\n }, [login?.id, login?.phase, onChanged])\n const begin = async (): Promise<void> => {\n setBusy(true); setError(undefined)\n try { setLogin(await api('/weixin/login', { method: 'POST', body: JSON.stringify({ companionId: companion.id }) })) }\n catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const toggle = async (): Promise<void> => {\n if (!channel) return\n setBusy(true); setError(undefined)\n try { await api(`/channels/${channel.id}/enabled`, { method: 'POST', body: JSON.stringify({ enabled: !channel.enabled }) }); await onChanged() }\n catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const pairings = channel ? snapshot.pairings.filter(item => item.channelId === channel.id) : []\n const actPairing = async (id: string, status: 'approved' | 'blocked'): Promise<void> => {\n try { await api(`/pairings/${id}/status`, { method: 'POST', body: JSON.stringify({ status }) }); await onChanged() } catch (reason) { setError(message(reason)) }\n }\n return <div className=\"dsh-partner-form is-channel\"><Section eyebrow=\"PRIMARY CHANNEL\" title=\"\u5FAE\u4FE1\u6E20\u9053\" detail=\"\u4F7F\u7528\u5FAE\u4FE1 iLink Bot \u626B\u7801\u63A5\u5165\u3002\u6BCF\u4E2A\u673A\u5668\u4EBA\u53EA\u7ED1\u5B9A\u4E00\u4E2A\u4F19\u4F34\uFF0C\u6BCF\u4F4D\u8054\u7CFB\u4EBA\u4FDD\u6301\u72EC\u7ACB DSH \u4F1A\u8BDD\u3002\" />\n {!channel && !login && <GlassSurface as=\"div\" interactive className=\"dsh-partner-weixin-connect\" borderRadius={15} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-weixin-mark\"><WeixinGlyph large /></div><span><strong>\u628A {companion.name} \u5E26\u5230\u5FAE\u4FE1</strong><p>\u626B\u7801\u540E\uFF0C\u673A\u5668\u4EBA\u51ED\u636E\u76F4\u63A5\u4FDD\u5B58\u8FDB DSH \u51ED\u636E\u5E93\uFF0C\u4E0D\u4F1A\u663E\u793A\u5728\u6D4F\u89C8\u5668\u6216\u666E\u901A\u914D\u7F6E\u6587\u4EF6\u4E2D\u3002</p><ul><li>\u79C1\u804A\u9996\u6B21\u8054\u7CFB\u5FC5\u987B\u5BA1\u6279</li><li>\u8054\u7CFB\u4EBA\u4E4B\u95F4\u4E0A\u4E0B\u6587\u5B8C\u5168\u9694\u79BB</li><li>\u5DE5\u5177\u6743\u9650\u4E0D\u4F1A\u56E0\u5FAE\u4FE1\u8EAB\u4EFD\u81EA\u52A8\u6269\u5927</li></ul></span><button type=\"button\" disabled={busy} onClick={() => { void begin() }}>{busy ? '\u6B63\u5728\u7533\u8BF7\u4E8C\u7EF4\u7801\u2026' : '\u626B\u7801\u8FDE\u63A5\u5FAE\u4FE1'}</button></GlassSurface>}\n {login && <GlassSurface as=\"div\" interactive className=\"dsh-partner-qr\" borderRadius={16} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-qr-code\">{login.qrContent && <QRCodeSVG value={login.qrContent} size={176} level=\"M\" />}</div><span><small>WECHAT ILINK BOT</small><strong>{login.phase === 'scanned' ? '\u5DF2\u626B\u7801\uFF0C\u8BF7\u5728\u5FAE\u4FE1\u786E\u8BA4' : login.phase === 'expired' ? '\u4E8C\u7EF4\u7801\u5DF2\u8FC7\u671F' : login.phase === 'error' ? '\u8FDE\u63A5\u5931\u8D25' : '\u4F7F\u7528\u5FAE\u4FE1\u626B\u7801'}</strong><p>{login.error || (login.phase === 'scanned' ? '\u786E\u8BA4\u540E\u4F1A\u81EA\u52A8\u542F\u52A8\u6E20\u9053\uFF0C\u4E0D\u9700\u8981\u590D\u5236 Token\u3002' : '\u4E8C\u7EF4\u7801\u7EA6 5 \u5206\u949F\u6709\u6548\u3002\u6B64\u9875\u9762\u53EF\u4EE5\u5B89\u5168\u5730\u4FDD\u6301\u6253\u5F00\u3002')}</p>{(login.phase === 'expired' || login.phase === 'error') && <button type=\"button\" onClick={() => { setLogin(undefined); void begin() }}><IconRefreshOutline16 size={16} />\u91CD\u65B0\u751F\u6210</button>}</span></GlassSurface>}\n {channel && <>\n <GlassSurface as=\"div\" interactive className=\"dsh-partner-channel-card\" borderRadius={14} distortionScale={-10} saturation={1.06}><div className=\"dsh-partner-weixin-mark\"><WeixinGlyph large /></div><span><small>WECHAT CHANNEL</small><strong>{channel.name}</strong><p>{channel.accountId}</p></span><Status channel={channel} /><button type=\"button\" className=\"dsh-partner-switch\" data-on={channel.enabled} disabled={busy} aria-label={channel.enabled ? '\u505C\u7528\u5FAE\u4FE1\u6E20\u9053' : '\u542F\u7528\u5FAE\u4FE1\u6E20\u9053'} onClick={() => { void toggle() }}><i /></button></GlassSurface>\n {channel.lastError && <p className=\"dsh-partner-inline-error\">{channel.lastError}</p>}\n <div className=\"dsh-partner-pairing-heading\"><span><small>ACCESS</small><strong>\u79C1\u804A\u914D\u5BF9</strong></span><em>{pairings.filter(item => item.status === 'pending').length} \u4E2A\u5F85\u5904\u7406</em></div>\n <div className=\"dsh-partner-pairings\">{pairings.length === 0 ? <State title=\"\u8FD8\u6CA1\u6709\u8054\u7CFB\u4EBA\" detail=\"\u6709\u4EBA\u9996\u6B21\u5411\u673A\u5668\u4EBA\u53D1\u6D88\u606F\u540E\uFF0C\u914D\u5BF9\u8BF7\u6C42\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002\" compact /> : pairings.map(pairing => <article key={pairing.id}><span className={`is-${pairing.status}`}><IconUserOutline16 size={16} /></span><div><strong>{pairing.displayName}</strong><small>{pairing.status === 'pending' ? '\u7B49\u5F85\u5BA1\u6279' : pairing.status === 'approved' ? '\u5DF2\u6388\u6743\u72EC\u7ACB\u4F1A\u8BDD' : '\u5DF2\u963B\u6B62'} \u00B7 {new Date(pairing.updatedAt).toLocaleString()}</small></div>{pairing.status === 'pending' && <><button onClick={() => { void actPairing(pairing.id, 'blocked') }}>\u62D2\u7EDD</button><button className=\"is-primary\" onClick={() => { void actPairing(pairing.id, 'approved') }}>\u6279\u51C6</button></>}{pairing.status === 'approved' && <button onClick={() => { void actPairing(pairing.id, 'blocked') }}>\u64A4\u9500</button>}{pairing.status === 'blocked' && <button onClick={() => { void actPairing(pairing.id, 'approved') }}>\u91CD\u65B0\u6279\u51C6</button>}</article>)}</div>\n </>}\n {error && <p className=\"dsh-partner-inline-error\">{error}</p>}\n </div>\n}\n\nfunction MemoryPanel({ companion, snapshot, openSession, startSession, renewSession, onChanged }: { companion: CompanionView; snapshot: PartnerSnapshot; openSession(routeId: string, sessionId: string): Promise<void>; startSession(companionId: string): Promise<void>; renewSession(routeId: string): Promise<void>; onChanged(): Promise<void> }): JSX.Element {\n const sessions = snapshot.sessions.filter(item => item.companionId === companion.id).sort((left, right) => Number(right.kind === 'local') - Number(left.kind === 'local') || right.lastMessageAt - left.lastMessageAt)\n const localSession = sessions.find(item => item.kind === 'local')\n const channelSessionCount = sessions.filter(item => item.kind === 'channel').length\n const heartbeat = snapshot.heartbeatStates.find(item => item.companionId === companion.id)\n const [automation, setAutomation] = useState<AutomationView>(() => structuredClone(companion.automation))\n const [memories, setMemories] = useState<MemoryView[]>([])\n const [reflections, setReflections] = useState<DailyReflectionView[]>([])\n const [profiles, setProfiles] = useState<UserProfileSnapshotView[]>([])\n const [concernActivity, setConcernActivity] = useState<ConcernActivityView>({ concerns: [], observations: [] })\n const [newConcern, setNewConcern] = useState('')\n const [memoryRevision, setMemoryRevision] = useState(0)\n const [editing, setEditing] = useState<MemoryView>()\n const [busy, setBusy] = useState(false)\n const [notice, setNotice] = useState<string>()\n const [error, setError] = useState<string>()\n const [modelCatalog, setModelCatalog] = useState<ModelCatalogView>()\n const loadMemory = useCallback(async () => {\n const [result, activity] = await Promise.all([api<{ memories: MemoryView[]; reflections: DailyReflectionView[]; profiles: UserProfileSnapshotView[] }>(`/companions/${companion.id}/memory`), api<ConcernActivityView>(`/companions/${companion.id}/concerns`)])\n setMemories(result.memories); setReflections(result.reflections); setProfiles(result.profiles); setConcernActivity(activity); setMemoryRevision(value => value + 1)\n }, [companion.id])\n useEffect(() => { setAutomation(structuredClone(companion.automation)); void loadMemory().catch(reason => setError(message(reason))) }, [companion.id, companion.updatedAt, loadMemory])\n useEffect(() => { void api<ModelCatalogView>('/models').then(setModelCatalog).catch(reason => setError(message(reason))) }, [])\n const inheritedProvider = companion.provider || modelCatalog?.defaultSelection.provider || ''\n const selectedProvider = automation.memory.provider || inheritedProvider\n const modelOptions = modelCatalog?.providers.find(item => item.id === selectedProvider)?.models ?? []\n const save = async (): Promise<void> => {\n setBusy(true); setError(undefined); setNotice(undefined)\n try {\n await api(`/companions/${companion.id}/automation`, { method: 'PUT', body: JSON.stringify({ automation }) })\n setNotice('\u8BB0\u5FC6\u4E0E\u5FC3\u8DF3\u8BBE\u7F6E\u5DF2\u4FDD\u5B58')\n await onChanged()\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const trigger = async (concernId?: string): Promise<void> => {\n setBusy(true); setError(undefined); setNotice(undefined)\n try {\n const result = await api<{ checked: boolean; sent: boolean; reason?: string }>(`/companions/${companion.id}/heartbeat/trigger`, {\n method: 'POST', body: JSON.stringify(concernId ? { concernId } : {}),\n })\n setNotice(result.sent ? '\u5FC3\u8DF3\u5DF2\u5B8C\u6210\u5E76\u53D1\u9001\u5FAE\u4FE1\u63D0\u9192' : result.reason ?? '\u5FC3\u8DF3\u68C0\u67E5\u5B8C\u6210')\n await Promise.all([onChanged(), loadMemory()])\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const review = async (): Promise<void> => {\n setBusy(true); setError(undefined); setNotice(undefined)\n try {\n const result = await api<{ reviewed: number; failed: number; reason?: string }>(`/companions/${companion.id}/memory/review`, { method: 'POST' })\n setNotice(result.reason ?? `\u7EC8\u5BA1\u5B8C\u6210 ${result.reviewed} \u7BC7${result.failed ? `\uFF0C\u5931\u8D25 ${result.failed} \u7BC7` : ''}`); await loadMemory()\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const saveMemory = async (): Promise<void> => {\n if (!editing) return\n setBusy(true); setError(undefined)\n try {\n await api(`/companions/${companion.id}/memory/${editing.id}`, { method: 'PUT', body: JSON.stringify({ subject: editing.subject, content: editing.content }) })\n setEditing(undefined); setNotice('\u8BB0\u5FC6\u5DF2\u4FEE\u6B63'); await loadMemory()\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const deleteMemory = async (item: MemoryView): Promise<void> => {\n setBusy(true); setError(undefined)\n try { await api(`/companions/${companion.id}/memory/${item.id}`, { method: 'DELETE' }); if (editing?.id === item.id) setEditing(undefined); await loadMemory() }\n catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const addConcern = async (): Promise<void> => {\n const subject = newConcern.trim()\n if (!subject) return\n setBusy(true); setError(undefined); setNotice(undefined)\n try {\n await api(`/companions/${companion.id}/concerns`, { method: 'POST', body: JSON.stringify({ subject }) })\n setNewConcern(''); setNotice('\u4F19\u4F34\u4F1A\u7EE7\u7EED\u7559\u610F\u8FD9\u4EF6\u4E8B')\n await loadMemory()\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n const actConcern = async (item: ConcernView, action: 'watch' | 'ignore' | 'prioritize' | 'resolve'): Promise<void> => {\n setBusy(true); setError(undefined); setNotice(undefined)\n try {\n await api(`/companions/${companion.id}/concerns/${encodeURIComponent(item.id)}/action`, { method: 'POST', body: JSON.stringify({ action }) })\n setNotice(action === 'ignore' ? '\u4F19\u4F34\u4E0D\u518D\u5173\u6CE8\u8FD9\u4EF6\u4E8B' : action === 'resolve' ? '\u5DF2\u6807\u8BB0\u4E3A\u89E3\u51B3' : action === 'prioritize' ? '\u5DF2\u63D0\u9AD8\u5173\u6CE8' : '\u4F1A\u7EE7\u7EED\u7559\u610F')\n await loadMemory()\n } catch (reason) { setError(message(reason)) } finally { setBusy(false) }\n }\n return <div className=\"dsh-partner-form is-memory\"><Section eyebrow=\"CONTINUITY\" title=\"\u4F1A\u8BDD\u8BB0\u5FC6\" detail=\"\u4F19\u4F34\u53EF\u4EE5\u76F4\u63A5\u5728 DSH \u4E2D\u5EFA\u7ACB\u672C\u5730\u5BF9\u8BDD\uFF1B\u5FAE\u4FE1\u53EA\u662F\u53EF\u9009\u6E20\u9053\u3002\u4E0D\u540C\u8054\u7CFB\u4EBA\u4ECD\u4FDD\u6301\u72EC\u7ACB\u4E0A\u4E0B\u6587\uFF0C\u77E5\u8BC6\u5E93\u7EE7\u7EED\u7531\u77E5\u8BC6\u5E93\u63D2\u4EF6\u7BA1\u7406\u3002\" />\n <div className=\"dsh-partner-metrics\"><article><small>\u4F19\u4F34\u4F1A\u8BDD</small><strong>{sessions.length}</strong><p>{localSession ? `1 \u4E2A\u672C\u5730 \u00B7 ${channelSessionCount} \u4E2A\u6E20\u9053` : `${channelSessionCount} \u4E2A\u6E20\u9053`}</p></article><article><small>\u957F\u671F\u8BB0\u5FC6</small><strong>{memories.filter(item => item.status === 'active').length}</strong><p>{reflections.length} \u7BC7\u6BCF\u65E5\u56DE\u987E</p></article><article><small>\u6700\u8FD1\u5FC3\u8DF3</small><strong>{heartbeat?.lastCheckedAt ? relativeTime(heartbeat.lastCheckedAt) : '\u5C1A\u672A'}</strong><p>{heartbeat?.lastError ? '\u4E0A\u6B21\u6267\u884C\u5F02\u5E38' : `\u4ECA\u65E5\u53D1\u9001 ${heartbeat?.sentCount ?? 0} \u6B21`}</p></article></div>\n\n <div className=\"dsh-partner-automation-grid\"><section className=\"dsh-partner-automation\">\n <header><span><strong>\u5B66\u4E60\u4E0E\u957F\u671F\u8BB0\u5FC6</strong><small>\u6309\u8054\u7CFB\u4EBA\u5F52\u6863\u5B8C\u6574\u5BF9\u8BDD\uFF0C\u63D0\u70BC\u6BCF\u65E5\u56DE\u987E\u548C\u7ED3\u6784\u5316\u8BB0\u5FC6\uFF0C\u5E76\u5728\u76F8\u5173\u8BDD\u9898\u51FA\u73B0\u65F6\u53EC\u56DE\u3002</small></span><button type=\"button\" className=\"dsh-partner-switch\" data-on={automation.memory.enabled} aria-label=\"\u542F\u7528\u4F19\u4F34\u5B66\u4E60\" onClick={() => setAutomation(current => ({ ...current, memory: { ...current.memory, enabled: !current.memory.enabled } }))}><i /></button></header>\n <div className=\"dsh-partner-automation-fields is-memory-model\"><Field label=\"\u4FDD\u7559\u671F\u9650\"><select value={automation.memory.retentionDays} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, retentionDays: Number(event.target.value) } }))}><option value={0}>\u6C38\u4E45\u4FDD\u7559</option><option value={30}>30 \u5929</option><option value={90}>90 \u5929</option><option value={180}>180 \u5929</option><option value={365}>1 \u5E74</option><option value={1095}>3 \u5E74</option></select></Field><Field label=\"\u63D0\u70BC Provider\" hint=\"\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34\"><select value={automation.memory.provider ?? ''} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, provider: event.target.value, model: '' } }))}><option value=\"\">\u8DDF\u968F\u4F19\u4F34 \u00B7 {inheritedProvider || 'DSH \u9ED8\u8BA4'}</option>{modelCatalog?.providers.map(provider => <option value={provider.id} key={provider.id}>{provider.name || provider.id}</option>)}</select></Field><Field label=\"\u63D0\u70BC\u6A21\u578B\" hint=\"\u9ED8\u8BA4\u7EE7\u627F\u4F19\u4F34\"><select value={automation.memory.model ?? ''} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, model: event.target.value } }))}><option value=\"\">\u8DDF\u968F\u4F19\u4F34 \u00B7 {companion.model || modelCatalog?.defaultSelection.model || 'DSH \u9ED8\u8BA4'}</option>{modelOptions.map(model => <option value={model.id} key={model.id}>{model.name || model.id}</option>)}</select></Field></div>\n <div className=\"dsh-partner-review-policy\"><button type=\"button\" className=\"dsh-partner-switch\" data-on={automation.memory.dailyReviewEnabled} aria-label=\"\u542F\u7528\u6BCF\u65E5\u7EC8\u5BA1\" onClick={() => setAutomation(current => ({ ...current, memory: { ...current.memory, dailyReviewEnabled: !current.memory.dailyReviewEnabled } }))}><i /></button><span><strong>\u6BCF\u65E5\u7EC8\u5BA1</strong><small>\u6B21\u65E5\u81EA\u52A8\u5408\u5E76\u91CD\u590D\u3001\u7EA0\u6B63\u504F\u5DEE\u5E76\u5EFA\u7ACB\u8BB0\u5FC6\u5173\u7CFB</small></span><label><select aria-label=\"\u6BCF\u65E5\u7EC8\u5BA1\u65F6\u95F4\" value={automation.memory.dailyReviewHour} onChange={event => setAutomation(current => ({ ...current, memory: { ...current.memory, dailyReviewHour: Number(event.target.value) } }))}>{Array.from({ length: 24 }, (_, hour) => <option value={hour} key={hour}>{String(hour).padStart(2, '0')}:00</option>)}</select></label><button type=\"button\" disabled={busy || reflections.length === 0} onClick={() => { void review() }}>\u7ACB\u5373\u7EC8\u5BA1</button></div>\n </section>\n\n <section className=\"dsh-partner-automation\">\n <header><span><strong>\u6301\u7EED\u611F\u77E5</strong><small>\u4F19\u4F34\u53EA\u89C2\u5BDF\u5C1A\u672A\u95ED\u73AF\u7684\u4E8B\u60C5\u662F\u5426\u51FA\u73B0\u65B0\u53D8\u5316\uFF0C\u5E76\u7531\u514B\u5236\u7684\u6253\u6270\u7B56\u7565\u51B3\u5B9A\u4F55\u65F6\u544A\u8BC9\u4F60\u3002</small></span><button type=\"button\" className=\"dsh-partner-switch\" data-on={automation.heartbeat.enabled} aria-label=\"\u542F\u7528\u4F19\u4F34\u5FC3\u8DF3\" onClick={() => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, enabled: !current.heartbeat.enabled } }))}><i /></button></header>\n <div className=\"dsh-partner-automation-fields is-heartbeat\">\n <Field label=\"\u68C0\u67E5\u95F4\u9694\"><select value={automation.heartbeat.intervalMinutes} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, intervalMinutes: Number(event.target.value) } }))}><option value={30}>30 \u5206\u949F</option><option value={60}>1 \u5C0F\u65F6</option><option value={180}>3 \u5C0F\u65F6</option><option value={360}>6 \u5C0F\u65F6</option><option value={720}>12 \u5C0F\u65F6</option><option value={1440}>24 \u5C0F\u65F6</option></select></Field>\n <Field label=\"\u514D\u6253\u6270\u5F00\u59CB\"><input type=\"number\" min={0} max={23} value={automation.heartbeat.quietStartHour} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, quietStartHour: Number(event.target.value) } }))} /></Field>\n <Field label=\"\u514D\u6253\u6270\u7ED3\u675F\"><input type=\"number\" min={0} max={23} value={automation.heartbeat.quietEndHour} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, quietEndHour: Number(event.target.value) } }))} /></Field>\n <Field label=\"\u6BCF\u65E5\u4E0A\u9650\"><select value={automation.heartbeat.dailyLimit} onChange={event => setAutomation(current => ({ ...current, heartbeat: { ...current.heartbeat, dailyLimit: Number(event.target.value) } }))}><option value={0}>\u4E0D\u9650</option><option value={1}>1 \u6B21</option><option value={2}>2 \u6B21</option><option value={3}>3 \u6B21</option><option value={5}>5 \u6B21</option><option value={8}>8 \u6B21</option></select></Field>\n </div>\n <ConcernBoard companionId={companion.id} activity={concernActivity} value={newConcern} busy={busy} onValue={setNewConcern} onAdd={() => { void addConcern() }} onCheck={item => { void trigger(item.id) }} onAct={(item, action) => { void actConcern(item, action) }} />\n {heartbeat?.lastError && <p className=\"dsh-partner-inline-error\">{heartbeat.lastError}</p>}\n <div className=\"dsh-partner-automation-actions\"><button type=\"button\" disabled={busy || sessions.length === 0} onClick={() => { void trigger() }}>\u68C0\u67E5\u5230\u671F\u9879</button><button type=\"button\" className=\"is-primary\" disabled={busy} onClick={() => { void save() }}>{busy ? '\u6B63\u5728\u5904\u7406\u2026' : '\u4FDD\u5B58\u8BBE\u7F6E'}</button></div>\n </section></div>\n\n {notice && <p className=\"dsh-partner-inline-notice\"><IconCheckOutline14 size={14} />{notice}</p>}\n {error && <p className=\"dsh-partner-inline-error\">{error}</p>}\n\n <MemoryLibrary companionId={companion.id} revision={memoryRevision} profiles={profiles} memories={memories} reflections={reflections} editing={editing} busy={busy} setEditing={setEditing} save={() => { void saveMemory() }} remove={item => { void deleteMemory(item) }} />\n\n <div className=\"dsh-partner-section-heading\"><span><small>SESSIONS</small><strong>\u4F19\u4F34\u4F1A\u8BDD</strong></span>{localSession === undefined && <button type=\"button\" onClick={() => { void startSession(companion.id) }}><IconPlusOutline16 size={14} />\u5F00\u59CB\u672C\u5730\u5BF9\u8BDD</button>}</div>\n <div className=\"dsh-partner-session-list\">{sessions.map(item => <article key={item.id} data-archived={item.archived} data-kind={item.kind}><span><IconDataOutline16 size={16} /></span><div><strong>{item.kind === 'local' ? '\u672C\u5730\u4F19\u4F34\u4F1A\u8BDD' : `\u5FAE\u4FE1\u8054\u7CFB\u4EBA \u00B7 ${item.userId.slice(-6)}`}</strong><small>{item.archived ? '\u5DF2\u5F52\u6863 \u00B7 \u957F\u671F\u8BB0\u5FC6\u4FDD\u7559' : `${item.sessionId} \u00B7 ${new Date(item.lastMessageAt).toLocaleString()}`}</small></div><button type=\"button\" className={item.archived ? 'is-primary' : undefined} onClick={() => { if (item.archived) void renewSession(item.id); else void openSession(item.id, item.sessionId) }}>{item.archived ? '\u5F00\u59CB\u65B0\u4F1A\u8BDD' : '\u6253\u5F00\u4F1A\u8BDD'}</button></article>)}{sessions.length === 0 && <State title=\"\u8FD8\u6CA1\u6709\u4F19\u4F34\u4F1A\u8BDD\" detail=\"\u65E0\u9700\u8FDE\u63A5\u5FAE\u4FE1\uFF0C\u76F4\u63A5\u5F00\u59CB\u672C\u5730\u5BF9\u8BDD\uFF1B\u4EE5\u540E\u8FDE\u63A5\u7684\u5FAE\u4FE1\u8054\u7CFB\u4EBA\u4F1A\u7EE7\u7EED\u4F7F\u7528\u5404\u81EA\u72EC\u7ACB\u7684\u6E20\u9053\u4F1A\u8BDD\u3002\" action={<button type=\"button\" onClick={() => { void startSession(companion.id) }}>\u5F00\u59CB\u5BF9\u8BDD</button>} compact />}</div>\n </div>\n}\n\nfunction ConcernBoard({ companionId, activity, value, busy, onValue, onAdd, onCheck, onAct }: {\n companionId: string; activity: ConcernActivityView; value: string; busy: boolean; onValue(value: string): void; onAdd(): void\n onCheck(item: ConcernView): void\n onAct(item: ConcernView, action: 'watch' | 'ignore' | 'prioritize' | 'resolve'): void\n}): JSX.Element {\n const visible = activity.concerns.filter(item => item.state !== 'archived')\n const active = visible.filter(item => item.state !== 'resolved')\n const resolved = visible.filter(item => item.state === 'resolved')\n const latest = new Map([...activity.observations].reverse().map(item => [item.concernId, item]))\n const [composing, setComposing] = useState(false)\n const [expandedId, setExpandedId] = useState<string>()\n const [visibleCount, setVisibleCount] = useState(5)\n const [mention, setMention] = useState<{ start: number; end: number; query: string }>()\n const [sources, setSources] = useState<ConcernSourceView[]>([])\n const [sourcesLoading, setSourcesLoading] = useState(false)\n const [sourceError, setSourceError] = useState<string>()\n const [activeSource, setActiveSource] = useState(0)\n const inputRef = useRef<HTMLInputElement>(null)\n const listboxId = useId()\n const shown = active.slice(0, visibleCount)\n const suggestionsOpen = composing && mention !== undefined\n useEffect(() => {\n if (!suggestionsOpen || mention === undefined) {\n setSources([]); setSourcesLoading(false); setSourceError(undefined); return\n }\n const controller = new AbortController()\n const timer = window.setTimeout(() => {\n setSourcesLoading(true); setSourceError(undefined)\n const params = new URLSearchParams({ q: mention.query })\n void api<{ items: ConcernSourceView[] }>(`/companions/${encodeURIComponent(companionId)}/concern-sources?${params}`).then(result => {\n if (!controller.signal.aborted) { setSources(result.items); setActiveSource(0) }\n }).catch(reason => {\n if (!controller.signal.aborted) { setSources([]); setSourceError(message(reason)) }\n }).finally(() => { if (!controller.signal.aborted) setSourcesLoading(false) })\n }, 150)\n return () => { window.clearTimeout(timer); controller.abort() }\n }, [companionId, mention?.query, suggestionsOpen])\n const submit = (event: FormEvent): void => { event.preventDefault(); onAdd(); setComposing(false); setMention(undefined) }\n const chooseSource = (source: ConcernSourceView): void => {\n if (mention === undefined) return\n const next = `${value.slice(0, mention.start)}${source.token} ${value.slice(mention.end)}`\n const cursor = mention.start + source.token.length + 1\n onValue(next); setMention(undefined); setSources([])\n window.requestAnimationFrame(() => { inputRef.current?.focus(); inputRef.current?.setSelectionRange(cursor, cursor) })\n }\n return <section className=\"dsh-partner-concern-board\" aria-labelledby=\"partner-concerns-title\">\n <header><span><strong id=\"partner-concerns-title\">\u4F19\u4F34\u5728\u610F\u7684\u4E8B <b>{active.length}</b></strong><p>\u5C1A\u672A\u95ED\u73AF\u3001\u503C\u5F97\u7EE7\u7EED\u7559\u610F\u7684\u4E8B\u60C5</p></span><button type=\"button\" aria-expanded={composing} onClick={() => setComposing(current => !current)}><IconPlusOutline16 size={14} />\u4EA4\u4EE3\u4E00\u4EF6\u4E8B</button></header>\n {composing && <form className=\"dsh-partner-concern-compose\" onSubmit={submit}><label><span>\u9700\u8981\u7559\u610F\u7684\u4E8B</span><div className=\"dsh-partner-concern-input-wrap\"><input\n ref={inputRef} autoFocus value={value} maxLength={300} placeholder=\"\u8F93\u5165 @ \u9009\u62E9\u6587\u4EF6\u6216\u77E5\u8BC6\u6587\u6863\"\n role=\"combobox\" aria-autocomplete=\"list\" aria-expanded={suggestionsOpen} aria-controls={suggestionsOpen ? listboxId : undefined}\n aria-activedescendant={suggestionsOpen && sources[activeSource] ? `${listboxId}-option-${activeSource}` : undefined}\n onChange={event => { onValue(event.target.value); setMention(activeMention(event.target.value, event.target.selectionStart ?? event.target.value.length)) }}\n onClick={event => setMention(activeMention(event.currentTarget.value, event.currentTarget.selectionStart ?? event.currentTarget.value.length))}\n onKeyDown={event => {\n if (!suggestionsOpen) return\n if (event.key === 'ArrowDown') { event.preventDefault(); setActiveSource(index => sources.length === 0 ? 0 : (index + 1) % sources.length) }\n else if (event.key === 'ArrowUp') { event.preventDefault(); setActiveSource(index => sources.length === 0 ? 0 : (index - 1 + sources.length) % sources.length) }\n else if (event.key === 'Enter' && sources[activeSource]) { event.preventDefault(); chooseSource(sources[activeSource]) }\n else if (event.key === 'Escape') { event.preventDefault(); setMention(undefined) }\n }}\n />{suggestionsOpen && <div id={listboxId} className=\"dsh-partner-concern-sources\" role=\"listbox\" aria-label=\"\u53EF\u5F15\u7528\u7684\u6587\u4EF6\u4E0E\u77E5\u8BC6\u6587\u6863\">\n {sourcesLoading ? <p role=\"status\">\u6B63\u5728\u67E5\u627E\u53EF\u5F15\u7528\u5185\u5BB9\u2026</p> : sourceError ? <p role=\"status\">\u5019\u9009\u52A0\u8F7D\u5931\u8D25\uFF1A{sourceError}</p> : sources.length === 0 ? <p role=\"status\">\u6CA1\u6709\u627E\u5230\u5339\u914D\u7684\u6587\u4EF6\u6216\u5DF2\u6302\u8F7D\u77E5\u8BC6\u6587\u6863</p> : <>\n {sources.map((source, index) => <button\n type=\"button\" role=\"option\" id={`${listboxId}-option-${index}`} key={`${source.kind}:${source.token}`}\n aria-selected={index === activeSource} data-kind={source.kind} onMouseDown={event => event.preventDefault()}\n onMouseEnter={() => setActiveSource(index)} onClick={() => chooseSource(source)}\n ><span>{source.kind === 'file' ? <IconDataOutline16 size={15} /> : <IconLinkOutline16 size={15} />}</span><strong>{source.label}</strong><small>{source.detail}</small></button>)}\n </>}\n </div>}</div><small className=\"dsh-partner-concern-compose-hint\">\u8F93\u5165 <b>@</b> \u4F1A\u5217\u51FA\u5F53\u524D\u4F1A\u8BDD\u6587\u4EF6\u548C\u5DF2\u6302\u8F7D\u7684\u77E5\u8BC6\u6587\u6863\uFF0C\u4E5F\u53EF\u4EE5\u7EE7\u7EED\u8F93\u5165\u5173\u952E\u8BCD\u7B5B\u9009\u3002</small></label><div><button type=\"button\" onClick={() => { setComposing(false); setMention(undefined); onValue('') }}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !value.trim()}>\u8BA9\u4F19\u4F34\u8BB0\u7740</button></div></form>}\n <div className=\"dsh-partner-concern-list\" role=\"list\">\n {active.length === 0 ? <p className=\"dsh-partner-concern-empty\">\u6700\u8FD1\u6CA1\u6709\u672A\u95ED\u73AF\u7684\u4E8B\u3002\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u5BF9\u4F19\u4F34\u8BF4\u201C\u8FD9\u4E2A\u5E2E\u6211\u7559\u610F\u201D\u3002</p> : shown.map(item => {\n const observation = latest.get(item.id)\n const expanded = expandedId === item.id\n const status = observation ? concernObservationStatus(observation) : item.state === 'active' ? '\u6B63\u5728\u7559\u610F' : '\u6682\u65F6\u8BB0\u7740'\n return <article key={item.id} role=\"listitem\" data-state={item.state} data-expanded={expanded}>\n <button type=\"button\" className=\"dsh-partner-concern-row\" aria-expanded={expanded} onClick={() => setExpandedId(current => current === item.id ? undefined : item.id)}>\n <span className=\"dsh-partner-concern-state\"><i />{status}</span><span className=\"dsh-partner-concern-copy\"><strong>{item.subject}</strong><small>{observation ? observation.event : item.reason}</small></span><span className=\"dsh-partner-concern-time\" title={`\u8BA1\u5212\u4E8E ${new Date(item.nextCheckAt).toLocaleString()} \u518D\u6B21\u7559\u610F`}><small>\u4E0B\u6B21\u7559\u610F</small><strong>{futureTime(item.nextCheckAt)}</strong></span><IconChevronDownOutline14 size={14} />\n </button>\n {expanded && <div className=\"dsh-partner-concern-detail\"><p>{item.reason}</p>{observation && <><blockquote>{observation.event}</blockquote><div className=\"dsh-partner-concern-decision\" data-decision={observation.decision}><strong>{concernObservationStatus(observation)}</strong><span>{observation.decisionReason || concernObservationExplanation(observation)}</span><small>\u6253\u6270\u5206\u6570 {Math.round(observation.interruptScore * 100)}{observation.notificationRuleEffect !== 'auto' && observation.notificationRuleReason ? ` \u00B7 \u77E5\u8BC6\u89C4\u5219\uFF1A${observation.notificationRuleReason}` : ''}</small></div></>}{item.resources.length > 0 && <div className=\"dsh-partner-concern-resources\">{item.resources.map(resource => <span key={`${resource.kind}:${resource.locator}`}>{resource.kind === 'file' ? '\u6587\u4EF6' : '\u77E5\u8BC6'} \u00B7 {resource.label}</span>)}</div>}<small>{item.origin === 'explicit' ? '\u4F60\u660E\u786E\u4EA4\u4EE3' : '\u4F19\u4F34\u4ECE\u5BF9\u8BDD\u4E2D\u6CE8\u610F\u5230'} \u00B7 {watchKindLabel(item.watchKind)}</small><div className=\"dsh-partner-concern-actions\" aria-label={`${item.subject} \u7684\u64CD\u4F5C`}><button type=\"button\" disabled={busy} onClick={() => onCheck(item)}>\u7ACB\u5373\u68C0\u67E5\u8FD9\u6761</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'watch')}>\u7EE7\u7EED\u7559\u610F</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'prioritize')}>\u63D0\u9AD8\u5173\u6CE8</button><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'resolve')}>\u5DF2\u7ECF\u89E3\u51B3</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={() => onAct(item, 'ignore')}>\u522B\u7BA1\u8FD9\u4E2A</button></div></div>}\n </article>\n })}\n </div>\n {(active.length > shown.length || visibleCount > 5) && <div className=\"dsh-partner-concern-more\">{active.length > shown.length ? <button type=\"button\" onClick={() => setVisibleCount(count => Math.min(active.length, count + 20))}>\u518D\u663E\u793A {Math.min(20, active.length - shown.length)} \u6761</button> : <button type=\"button\" onClick={() => setVisibleCount(5)}>\u6536\u8D77\u5217\u8868</button>}</div>}\n {resolved.length > 0 && <details className=\"dsh-partner-concern-resolved\"><summary>\u5DF2\u7ECF\u89E3\u51B3 <b>{resolved.length}</b></summary><div>{resolved.slice(0, 30).map(item => <article key={item.id}><span><IconCheckOutline14 size={13} /></span><strong>{item.subject}</strong><button type=\"button\" disabled={busy} onClick={() => onAct(item, 'watch')}>\u91CD\u65B0\u7559\u610F</button></article>)}</div></details>}\n </section>\n}\n\nfunction activeMention(value: string, cursor: number): { start: number; end: number; query: string } | undefined {\n const prefix = value.slice(0, cursor)\n const start = prefix.lastIndexOf('@')\n if (start < 0 || (start > 0 && !/\\s/u.test(prefix[start - 1] ?? ''))) return undefined\n const fragment = prefix.slice(start + 1)\n if (fragment.startsWith('\u77E5\u8BC6\u5E93[')) {\n if (fragment.includes(']')) return undefined\n return { start, end: cursor, query: fragment.slice(4) }\n }\n if (fragment.startsWith('\"')) {\n if (fragment.slice(1).includes('\"')) return undefined\n return { start, end: cursor, query: fragment.slice(1) }\n }\n if (/\\s/u.test(fragment)) return undefined\n return { start, end: cursor, query: fragment }\n}\n\nfunction watchKindLabel(value: ConcernView['watchKind']): string {\n return value === 'knowledge' ? '\u77E5\u8BC6\u5E93\u53D8\u5316' : value === 'workspace' ? '\u9879\u76EE\u53D8\u5316' : value === 'web' ? '\u5916\u90E8\u53D8\u5316' : '\u6309\u4E8B\u60C5\u5224\u65AD\u6765\u6E90'\n}\n\ntype MemoryLibraryMode = 'profile' | 'memory' | 'reflection' | 'graph'\nconst MEMORY_KINDS: Array<MemoryView['kind'] | 'all'> = ['all', 'preference', 'task', 'event', 'relationship', 'emotion']\n\nfunction MemoryLibrary({ companionId, revision, profiles, memories, reflections, editing, busy, setEditing, save, remove }: {\n companionId: string; revision: number; profiles: UserProfileSnapshotView[]; memories: MemoryView[]; reflections: DailyReflectionView[]; editing: MemoryView | undefined; busy: boolean\n setEditing(value?: MemoryView): void; save(): void; remove(item: MemoryView): void\n}): JSX.Element {\n const activeMemories = useMemo(() => memories.filter(item => item.status === 'active' && item.kind !== 'profile'), [memories])\n const profileMemories = useMemo(() => memories.filter(item => item.status === 'active' && item.kind === 'profile'), [memories])\n const [mode, setMode] = useState<MemoryLibraryMode>('profile')\n const [kind, setKind] = useState<MemoryView['kind'] | 'all'>('all')\n const [query, setQuery] = useState('')\n const [selectedMemoryId, setSelectedMemoryId] = useState<string>()\n const [selectedDate, setSelectedDate] = useState<string>()\n const [graph, setGraph] = useState<MemoryGraphView>()\n const [graphLoading, setGraphLoading] = useState(false)\n const [graphError, setGraphError] = useState<string>()\n const [graphRequest, setGraphRequest] = useState(0)\n useEffect(() => {\n setGraph(undefined); setGraphError(undefined); setGraphLoading(false)\n }, [companionId, revision])\n useEffect(() => {\n if (mode !== 'graph' || graph !== undefined) return\n const controller = new AbortController()\n setGraphLoading(true); setGraphError(undefined)\n void api<MemoryGraphView>(`/companions/${companionId}/memory/graph`, { signal: controller.signal })\n .then(result => { if (!controller.signal.aborted) setGraph(result) })\n .catch(reason => { if (!controller.signal.aborted) setGraphError(message(reason)) })\n .finally(() => { if (!controller.signal.aborted) setGraphLoading(false) })\n return () => controller.abort()\n }, [companionId, graph, graphRequest, mode, revision])\n const normalized = query.trim().toLocaleLowerCase()\n const filteredMemories = useMemo(() => activeMemories.filter(item =>\n (kind === 'all' || item.kind === kind) && (!normalized || `${item.subject} ${item.content}`.toLocaleLowerCase().includes(normalized)),\n ), [activeMemories, kind, normalized])\n const filteredReflections = useMemo(() => reflections.filter(item => !normalized ||\n `${item.date} ${item.summary} ${item.events.join(' ')} ${item.openTasks.join(' ')} ${item.learnings.join(' ')}`.toLocaleLowerCase().includes(normalized),\n ), [reflections, normalized])\n const selectedMemory = filteredMemories.find(item => item.id === selectedMemoryId) ?? filteredMemories[0]\n const selectedReflection = filteredReflections.find(item => item.date === selectedDate) ?? filteredReflections[0]\n\n return <section className=\"dsh-partner-memory-library\">\n <header className=\"dsh-partner-library-header\"><span><small>MEMORY LIBRARY</small><strong>\u4F19\u4F34\u8BB0\u5FC6\u5E93</strong><p>\u67E5\u770B\u4F19\u4F34\u5982\u4F55\u4ECE\u957F\u671F\u5BF9\u8BDD\u4E2D\u8BA4\u8BC6\u4F60\uFF0C\u4EE5\u53CA\u8FD9\u4E9B\u7406\u89E3\u600E\u6837\u968F\u8BC1\u636E\u53D8\u5316\u3002</p></span><nav aria-label=\"\u8BB0\u5FC6\u5185\u5BB9\"><button type=\"button\" className={mode === 'profile' ? 'is-active' : ''} onClick={() => setMode('profile')}>\u4EBA\u7269\u753B\u50CF <b>{profiles.length}</b></button><button type=\"button\" className={mode === 'memory' ? 'is-active' : ''} onClick={() => setMode('memory')}>\u8BDD\u9898\u8BB0\u5FC6 <b>{activeMemories.length}</b></button><button type=\"button\" className={mode === 'reflection' ? 'is-active' : ''} onClick={() => setMode('reflection')}>\u6BCF\u65E5\u56DE\u987E <b>{reflections.length}</b></button><button type=\"button\" className={mode === 'graph' ? 'is-active' : ''} onClick={() => setMode('graph')}>\u5173\u7CFB\u56FE\u8C31 <b>{graph?.relations.length ?? '\u2014'}</b></button></nav></header>\n {mode !== 'profile' && <div className=\"dsh-partner-library-tools\"><label><span className=\"sr-only\">\u641C\u7D22\u8BB0\u5FC6</span><input value={query} onChange={event => setQuery(event.target.value)} placeholder={mode === 'memory' ? '\u641C\u7D22\u4E3B\u9898\u6216\u8BB0\u5FC6\u5185\u5BB9' : '\u641C\u7D22\u65E5\u671F\u3001\u603B\u7ED3\u6216\u5F85\u529E'} /></label>{mode === 'memory' && <div className=\"dsh-partner-memory-kinds\">{MEMORY_KINDS.map(value => <button type=\"button\" key={value} className={kind === value ? 'is-active' : ''} onClick={() => setKind(value)}>{value === 'all' ? '\u5168\u90E8' : memoryKind(value)}</button>)}</div>}</div>}\n {mode === 'profile' ? <ProfileLibrary profiles={profiles} memories={profileMemories} editing={editing} busy={busy} setEditing={setEditing} save={save} remove={remove} /> : mode === 'memory' ? <div className=\"dsh-partner-library-browser\">\n <div className=\"dsh-partner-library-list\" role=\"list\">{filteredMemories.length === 0 ? <State title={activeMemories.length === 0 ? '\u8FD8\u6CA1\u6709\u957F\u671F\u8BB0\u5FC6' : '\u6CA1\u6709\u5339\u914D\u7684\u8BB0\u5FC6'} detail={activeMemories.length === 0 ? '\u4F19\u4F34\u5B8C\u6210\u5BF9\u8BDD\u540E\u4F1A\u81EA\u52A8\u63D0\u70BC\u503C\u5F97\u957F\u671F\u4FDD\u7559\u7684\u4FE1\u606F\u3002' : '\u6362\u4E2A\u5173\u952E\u8BCD\u6216\u7C7B\u578B\u8BD5\u8BD5\u3002'} compact /> : filteredMemories.map(item => <button type=\"button\" role=\"listitem\" key={item.id} className={selectedMemory?.id === item.id ? 'is-active' : ''} onClick={() => { setSelectedMemoryId(item.id); setEditing(undefined) }}><span data-kind={item.kind}>{memoryKind(item.kind)}</span><strong>{item.subject}</strong><p>{item.content}</p><small>{relativeTime(item.updatedAt)}</small></button>)}</div>\n <div className=\"dsh-partner-library-detail\">{selectedMemory ? <MemoryCard item={selectedMemory} editing={editing?.id === selectedMemory.id ? editing : undefined} busy={busy} setEditing={setEditing} save={save} remove={() => remove(selectedMemory)} /> : <State title=\"\u9009\u62E9\u4E00\u6761\u8BB0\u5FC6\" detail=\"\u8BB0\u5FC6\u8BE6\u60C5\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" compact />}</div>\n </div> : mode === 'reflection' ? <div className=\"dsh-partner-library-browser\">\n <div className=\"dsh-partner-library-list is-diary\" role=\"list\">{filteredReflections.length === 0 ? <State title={reflections.length === 0 ? '\u8FD8\u6CA1\u6709\u6BCF\u65E5\u56DE\u987E' : '\u6CA1\u6709\u5339\u914D\u7684\u56DE\u987E'} detail={reflections.length === 0 ? '\u6BCF\u65E5\u56DE\u987E\u4F1A\u5728\u6BCF\u8F6E\u5B8C\u6574\u5BF9\u8BDD\u540E\u6301\u7EED\u66F4\u65B0\u3002' : '\u6362\u4E2A\u5173\u952E\u8BCD\u6216\u65E5\u671F\u8BD5\u8BD5\u3002'} compact /> : filteredReflections.map(entry => <button type=\"button\" role=\"listitem\" key={entry.date} className={selectedReflection?.date === entry.date ? 'is-active' : ''} onClick={() => setSelectedDate(entry.date)}><time>{entry.date}</time><strong>{entry.turnCount} \u8F6E\u4EA4\u6D41</strong><p>{entry.summary}</p><small>{entry.openTasks.length} \u9879\u5F85\u8DDF\u8FDB \u00B7 {entry.learnings.length} \u9879\u7406\u89E3</small></button>)}</div>\n <div className=\"dsh-partner-library-detail\">{selectedReflection ? <DailyReflectionDetail entry={selectedReflection} /> : <State title=\"\u9009\u62E9\u4E00\u5929\" detail=\"\u5F53\u5929\u7684\u603B\u7ED3\u4E0E\u5F85\u529E\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" compact />}</div>\n </div> : graphError ? <State title=\"\u5173\u7CFB\u56FE\u8C31\u52A0\u8F7D\u5931\u8D25\" detail={graphError} action={<button type=\"button\" onClick={() => setGraphRequest(value => value + 1)}>\u91CD\u65B0\u52A0\u8F7D</button>} /> : graphLoading || graph === undefined ? <State title=\"\u6B63\u5728\u52A0\u8F7D\u5173\u7CFB\u56FE\u8C31\" detail=\"\u53EA\u5728\u9700\u8981\u67E5\u770B\u5173\u7CFB\u65F6\u8BFB\u53D6\u5BA1\u8BA1\u6570\u636E\u3002\" /> : <MemoryGraph graph={graph} profiles={profiles} query={normalized} inspect={item => { setEditing(undefined); if (item.kind === 'profile') setMode('profile'); else { setSelectedMemoryId(item.id); setMode('memory') } }} />}\n </section>\n}\n\nfunction ProfileLibrary({ profiles, memories, editing, busy, setEditing, save, remove }: {\n profiles: UserProfileSnapshotView[]; memories: MemoryView[]; editing: MemoryView | undefined; busy: boolean\n setEditing(value?: MemoryView): void; save(): void; remove(item: MemoryView): void\n}): JSX.Element {\n const [selectedScopeId, setSelectedScopeId] = useState<string>()\n const selected = profiles.find(item => item.scopeId === selectedScopeId) ?? profiles[0]\n if (!selected) return <State title=\"\u8FD8\u6CA1\u6709\u8054\u7CFB\u4EBA\u753B\u50CF\" detail=\"\u8054\u7CFB\u4EBA\u5F00\u59CB\u548C\u4F19\u4F34\u4EA4\u6D41\u540E\uFF0C\u8FD9\u91CC\u4F1A\u9010\u6B65\u5C55\u793A\u4F19\u4F34\u4ECE\u660E\u786E\u5BF9\u8BDD\u4E2D\u5F62\u6210\u7684\u957F\u671F\u7406\u89E3\u3002\" />\n const activeIds = new Set(selected.entries.map(item => item.id))\n const pending = memories.filter(item => item.scopeId === selected.scopeId && !activeIds.has(item.id))\n return <div className=\"dsh-partner-profile-browser\">\n <div className=\"dsh-partner-profile-people\" role=\"list\" aria-label=\"\u8054\u7CFB\u4EBA\u753B\u50CF\">\n {profiles.map(profile => <button type=\"button\" role=\"listitem\" key={profile.scopeId} className={profile.scopeId === selected.scopeId ? 'is-active' : ''} onClick={() => { setSelectedScopeId(profile.scopeId); setEditing(undefined) }}>\n <span><IconUserOutline16 size={16} /></span><div><strong>{profile.label}</strong><small>{profile.entries.length > 0 ? `${profile.entries.length} \u9879\u7A33\u5B9A\u7406\u89E3` : '\u8FD8\u5728\u8BA4\u8BC6\u4E2D'}</small></div><i aria-hidden=\"true\" />\n </button>)}\n </div>\n <div className=\"dsh-partner-profile-stage\">\n <header className=\"dsh-partner-profile-heading\"><span><small>PARTNER UNDERSTANDING</small><strong>\u4F19\u4F34\u773C\u4E2D\u7684 {selected.label}</strong><p>\u8FD9\u4E9B\u5185\u5BB9\u6765\u81EA\u4F60\u5728\u5BF9\u8BDD\u4E2D\u7684\u660E\u786E\u8868\u8FBE\u3002\u4F19\u4F34\u4F1A\u7528\u5B83\u4FDD\u6301\u7406\u89E3\u8FDE\u7EED\uFF0C\u4F46\u4E0D\u4F1A\u628A\u753B\u50CF\u5F53\u6210\u6807\u7B7E\u53CD\u590D\u590D\u8FF0\u3002</p></span><div data-ready={selected.entries.length > 0}><i />{selected.entries.length > 0 ? '\u4E0A\u4E0B\u6587\u57FA\u7EBF\u5DF2\u5C31\u7EEA' : '\u7B49\u5F85\u53EF\u9760\u8BC1\u636E'}</div></header>\n {selected.entries.length > 0 ? <>\n <div className=\"dsh-partner-profile-meta\"><span><small>\u753B\u50CF\u7248\u672C</small><strong>{selected.version}</strong></span><span><small>\u5BF9\u8BDD\u4F9D\u636E</small><strong>{selected.evidenceCount} \u5904</strong></span><span><small>\u7528\u6237\u786E\u8BA4</small><strong>{selected.lockedCount} \u9879</strong></span><span><small>\u6700\u8FD1\u4F9D\u636E</small><strong>{selected.updatedAt ? relativeTime(selected.updatedAt) : '\u5C1A\u672A'}</strong></span></div>\n <div className=\"dsh-partner-profile-entries\">{selected.entries.map(item => <MemoryCard key={item.id} item={item} editing={editing?.id === item.id ? editing : undefined} busy={busy} setEditing={setEditing} save={save} remove={() => remove(item)} />)}</div>\n </> : <State title=\"\u4F19\u4F34\u8FD8\u5728\u8BA4\u8BC6\u4F60\" detail=\"\u53EA\u6709\u660E\u786E\u3001\u7A33\u5B9A\u5E76\u8FBE\u5230\u53EF\u9760\u6807\u51C6\u7684\u957F\u671F\u4FE1\u606F\u624D\u4F1A\u8FDB\u5165\u753B\u50CF\uFF1B\u666E\u901A\u504F\u597D\u3001\u4E34\u65F6\u4EFB\u52A1\u548C\u4E00\u6B21\u6027\u60C5\u7EEA\u4E0D\u4F1A\u653E\u5728\u8FD9\u91CC\u3002\" compact />}\n {pending.length > 0 && <details className=\"dsh-partner-profile-pending\"><summary>\u5F85\u786E\u8BA4\u7684\u7406\u89E3 <b>{pending.length}</b></summary><div>{pending.map(item => <MemoryCard key={item.id} item={item} editing={editing?.id === item.id ? editing : undefined} busy={busy} setEditing={setEditing} save={save} remove={() => remove(item)} />)}</div></details>}\n </div>\n </div>\n}\n\ntype RelationFilter = MemoryRelationView['kind'] | 'all'\nconst RELATION_FILTERS: RelationFilter[] = ['all', 'conflicts_with', 'depends_on', 'supports', 'follows', 'about']\n\nfunction MemoryGraph({ graph, profiles, query, inspect }: { graph: MemoryGraphView; profiles: UserProfileSnapshotView[]; query: string; inspect(item: MemoryView): void }): JSX.Element {\n const byId = new Map(graph.memories.map(item => [item.id, item]))\n const scopeIds = [...new Set(graph.relations.map(item => item.scopeId))]\n const [requestedScopeId, setRequestedScopeId] = useState<string>()\n const scopeId = scopeIds.includes(requestedScopeId ?? '') ? requestedScopeId! : scopeIds[0]\n const [filter, setFilter] = useState<RelationFilter>('all')\n const scoped = graph.relations.filter(item => item.scopeId === scopeId)\n const visible = scoped.filter(item => {\n if (filter !== 'all' && item.kind !== filter) return false\n const source = byId.get(item.sourceMemoryId); const target = byId.get(item.targetMemoryId)\n return !query || `${source?.subject ?? ''} ${source?.content ?? ''} ${target?.subject ?? ''} ${target?.content ?? ''} ${item.label}`.toLocaleLowerCase().includes(query)\n }).sort((left, right) => Number(right.kind === 'conflicts_with') - Number(left.kind === 'conflicts_with') || right.confidence - left.confidence)\n const [selectedRelationId, setSelectedRelationId] = useState<string>()\n const selected = visible.find(item => item.id === selectedRelationId) ?? visible[0]\n const source = selected ? byId.get(selected.sourceMemoryId) : undefined\n const target = selected ? byId.get(selected.targetMemoryId) : undefined\n const label = profiles.find(item => item.scopeId === scopeId)?.label ?? (scopeId ? `\u8054\u7CFB\u4EBA ${scopeId.slice(-6)}` : '\u5F53\u524D\u8054\u7CFB\u4EBA')\n const conflictCount = scoped.filter(item => item.kind === 'conflicts_with').length\n if (graph.relations.length === 0) return <State title=\"\u8FD8\u6CA1\u6709\u53EF\u9760\u5173\u7CFB\" detail=\"\u6BCF\u65E5\u7EC8\u5BA1\u53EA\u4F1A\u4FDD\u5B58\u6709\u660E\u786E\u8BC1\u636E\u7684\u8BB0\u5FC6\u8054\u7CFB\uFF0C\u4E0D\u4F1A\u4E3A\u4E86\u586B\u6EE1\u56FE\u8C31\u800C\u731C\u6D4B\u3002\" />\n return <div className=\"dsh-partner-graph-audit\">\n <header className=\"dsh-partner-graph-toolbar\"><span><small>\u5173\u7CFB\u5BA1\u8BA1</small><strong>{label} \u7684\u7406\u89E3\u5173\u7CFB</strong><p>{scoped.length} \u6761\u53EF\u9760\u8054\u7CFB{conflictCount > 0 ? `\uFF0C\u5176\u4E2D ${conflictCount} \u6761\u9700\u8981\u786E\u8BA4` : '\uFF0C\u6682\u65E0\u5F85\u786E\u8BA4\u51B2\u7A81'}</p></span>{scopeIds.length > 1 && <label><span>\u8054\u7CFB\u4EBA</span><select value={scopeId} onChange={event => { setRequestedScopeId(event.target.value); setSelectedRelationId(undefined) }}>{scopeIds.map(value => <option value={value} key={value}>{profiles.find(item => item.scopeId === value)?.label ?? `\u8054\u7CFB\u4EBA ${value.slice(-6)}`}</option>)}</select></label>}</header>\n <nav className=\"dsh-partner-graph-filters\" aria-label=\"\u5173\u7CFB\u7C7B\u578B\">{RELATION_FILTERS.map(value => { const count = value === 'all' ? scoped.length : scoped.filter(item => item.kind === value).length; return <button type=\"button\" key={value} className={filter === value ? 'is-active' : ''} aria-pressed={filter === value} onClick={() => { setFilter(value); setSelectedRelationId(undefined) }}>{value === 'all' ? '\u5168\u90E8' : relationLabel(value)} <b>{count}</b></button> })}</nav>\n <div className=\"dsh-partner-graph-browser\"><div className=\"dsh-partner-graph-index\" role=\"list\">{visible.length === 0 ? <State title=\"\u6CA1\u6709\u5339\u914D\u7684\u5173\u7CFB\" detail=\"\u8C03\u6574\u5173\u7CFB\u7C7B\u578B\u6216\u641C\u7D22\u5173\u952E\u8BCD\u540E\u518D\u8BD5\u3002\" compact /> : visible.map(item => { const from = byId.get(item.sourceMemoryId); const to = byId.get(item.targetMemoryId); return <button type=\"button\" role=\"listitem\" key={item.id} data-kind={item.kind} className={selected?.id === item.id ? 'is-active' : ''} onClick={() => setSelectedRelationId(item.id)}><span>{relationLabel(item.kind)}</span><strong>{from?.subject ?? '\u5DF2\u5220\u9664\u8BB0\u5FC6'} <i aria-hidden=\"true\">\u2192</i> {to?.subject ?? '\u5DF2\u5220\u9664\u8BB0\u5FC6'}</strong><p>{item.label}</p><small>{Math.round(item.confidence * 100)}% \u53EF\u4FE1</small></button> })}</div>\n <div className=\"dsh-partner-graph-stage\">{selected && source && target ? <article data-kind={selected.kind}><header><span>{relationLabel(selected.kind)}</span><strong>{source.subject} <i aria-hidden=\"true\">\u2192</i> {target.subject}</strong><p>{selected.label}</p><small>{relationGuidance(selected.kind)}</small></header><div className=\"dsh-partner-graph-pair\"><GraphMemory item={source} side=\"\u8D77\u70B9\" inspect={inspect} /><div aria-hidden=\"true\"><i /><span>{relationLabel(selected.kind)}</span><i /></div><GraphMemory item={target} side=\"\u5173\u8054\u9879\" inspect={inspect} /></div><footer><small>\u6700\u8FD1\u7EC8\u5BA1\u4E8E {new Date(selected.updatedAt).toLocaleString()}</small><strong>\u5173\u7CFB\u7F6E\u4FE1\u5EA6 {Math.round(selected.confidence * 100)}%</strong></footer></article> : <State title=\"\u9009\u62E9\u4E00\u6761\u5173\u7CFB\" detail=\"\u5173\u7CFB\u4E24\u7AEF\u7684\u8BB0\u5FC6\u4E0E\u4F7F\u7528\u65B9\u5F0F\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" compact />}</div>\n </div>\n </div>\n}\n\nfunction GraphMemory({ item, side, inspect }: { item: MemoryView; side: string; inspect(item: MemoryView): void }): JSX.Element {\n return <section><header><small>{side} \u00B7 {memoryKind(item.kind)}</small><strong>{item.subject}</strong></header><p>{item.content}</p><button type=\"button\" onClick={() => inspect(item)}>\u67E5\u770B\u5E76\u4FEE\u6B63</button></section>\n}\n\nfunction relationLabel(kind: MemoryRelationView['kind']): string { return ({ supports: '\u652F\u6301', depends_on: '\u4F9D\u8D56', about: '\u5173\u4E8E', conflicts_with: '\u51B2\u7A81', follows: '\u540E\u7EED' })[kind] }\nfunction relationGuidance(kind: MemoryRelationView['kind']): string {\n return ({\n supports: '\u56DE\u7B54\u6D89\u53CA\u76EE\u6807\u8BB0\u5FC6\u65F6\uFF0C\u53EF\u628A\u8D77\u70B9\u4F5C\u4E3A\u660E\u786E\u652F\u6301\u4F9D\u636E\uFF0C\u4F46\u4E0D\u80FD\u636E\u6B64\u8865\u5199\u65B0\u4E8B\u5B9E\u3002',\n depends_on: '\u5904\u7406\u8D77\u70B9\u4E8B\u9879\u65F6\uFF0C\u5E94\u540C\u65F6\u68C0\u67E5\u5173\u8054\u9879\u662F\u5426\u6210\u7ACB\u6216\u5DF2\u7ECF\u5B8C\u6210\u3002',\n about: '\u4E24\u6761\u8BB0\u5FC6\u5C5E\u4E8E\u540C\u4E00\u4E0A\u4E0B\u6587\uFF0C\u53EC\u56DE\u5176\u4E2D\u4E00\u6761\u65F6\u53EF\u4EE5\u8865\u5145\u53E6\u4E00\u6761\u5E2E\u52A9\u7406\u89E3\u3002',\n conflicts_with: '\u4E24\u6761\u7406\u89E3\u6682\u65F6\u4E0D\u80FD\u540C\u65F6\u4F5C\u4E3A\u4E8B\u5B9E\uFF1B\u4F19\u4F34\u5E94\u5728\u76F8\u5173\u8BDD\u9898\u51FA\u73B0\u65F6\u6307\u51FA\u5DEE\u5F02\u5E76\u8BF7\u6C42\u786E\u8BA4\u3002',\n follows: '\u5B83\u4EEC\u5B58\u5728\u660E\u786E\u5148\u540E\u5173\u7CFB\uFF0C\u540E\u7EED\u5224\u65AD\u9700\u8981\u4FDD\u7559\u8FD9\u4E2A\u987A\u5E8F\u3002',\n })[kind]\n}\n\nfunction DailyReflectionDetail({ entry }: { entry: DailyReflectionView }): JSX.Element {\n return <article className=\"dsh-partner-diary-detail\"><header><time>{entry.date}</time><strong>{entry.turnCount} \u8F6E\u4EA4\u6D41\u540E\u7684\u7406\u89E3</strong><small>\u66F4\u65B0\u4E8E {new Date(entry.updatedAt).toLocaleString()}</small></header><p>{entry.summary}</p><ReflectionGroup title=\"\u5F85\u8DDF\u8FDB\" items={entry.openTasks} /><ReflectionGroup title=\"\u5F53\u5929\u4E8B\u4EF6\" items={entry.events} /><ReflectionGroup title=\"\u65B0\u7406\u89E3\" items={entry.learnings} /><ReflectionGroup title=\"\u5DF2\u5B8C\u6210\" items={entry.completedTasks} /></article>\n}\n\nfunction ReflectionGroup({ title, items }: { title: string; items: string[] }): JSX.Element | null {\n if (items.length === 0) return null\n return <section><strong>{title}</strong><ul>{items.map(item => <li key={item}>{item}</li>)}</ul></section>\n}\n\nfunction MemoryCard({ item, editing, busy, setEditing, save, remove }: { item: MemoryView; editing: MemoryView | undefined; busy: boolean; setEditing(value?: MemoryView): void; save(): void; remove(): void }): JSX.Element {\n const [confirmingRemove, setConfirmingRemove] = useState(false)\n return <article data-kind={item.kind}>{editing ? <div className=\"dsh-partner-memory-editor\">\n <input aria-label=\"\u8BB0\u5FC6\u4E3B\u9898\" value={editing.subject} onChange={event => setEditing({ ...editing, subject: event.target.value })} />\n <textarea aria-label=\"\u8BB0\u5FC6\u5185\u5BB9\" value={editing.content} onChange={event => setEditing({ ...editing, content: event.target.value })} />\n <footer><button type=\"button\" onClick={() => setEditing(undefined)}>\u53D6\u6D88</button><button type=\"button\" className=\"is-primary\" disabled={busy || !editing.subject.trim() || !editing.content.trim()} onClick={save}>\u4FDD\u5B58\u4FEE\u6B63</button></footer>\n </div> : <>\n <header><span>{memoryKind(item.kind)}</span><div>{confirmingRemove ? <><button type=\"button\" onClick={() => setConfirmingRemove(false)}>\u53D6\u6D88</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={remove}>\u786E\u8BA4\u5220\u9664</button></> : <><button type=\"button\" onClick={() => setEditing({ ...item })}>\u7F16\u8F91</button><button type=\"button\" onClick={() => setConfirmingRemove(true)}>\u5220\u9664</button></>}</div></header>\n <strong>{item.subject}</strong><p>{item.content}</p>\n <footer><progress max={1} value={item.confidence} aria-label={`\u7F6E\u4FE1\u5EA6 ${Math.round(item.confidence * 100)}%`} /><small>{item.locked ? '\u624B\u52A8\u786E\u8BA4' : `${Math.round(item.confidence * 100)}% \u53EF\u4FE1`} \u00B7 {relativeTime(item.updatedAt)}</small></footer>\n {item.evidence.length > 0 && <details className=\"dsh-partner-memory-evidence\"><summary>\u67E5\u770B\u5BF9\u8BDD\u4F9D\u636E <b>{item.evidence.length}</b></summary><div>{[...item.evidence].reverse().map(evidence => <blockquote key={`${evidence.turnId}:${evidence.at}`}><p>{evidence.excerpt}</p><time>{new Date(evidence.at).toLocaleString()}</time></blockquote>)}</div></details>}\n </>}</article>\n}\n\nfunction companionDraft(companion: CompanionView): { name: string; role: string; description: string; instructions: string; presetId: string; provider: string; model: string; capabilities: Capability[] } { return { name: companion.name, role: companion.role, description: companion.description, instructions: companion.instructions, presetId: companion.presetId ?? '', provider: companion.provider ?? '', model: companion.model ?? '', capabilities: [...companion.capabilities] } }\nfunction concernObservationStatus(item: ConcernObservationView): string {\n if (item.decision === 'notify') return item.mentionedAt === undefined ? '\u5F85\u63D0\u9192' : '\u5DF2\u63D0\u9192'\n if (item.decision === 'feed') return '\u4F19\u4F34\u52A8\u6001'\n if (item.decision === 'defer') return item.mentionedAt === undefined ? '\u5F85\u987A\u5E26\u63D0' : '\u5DF2\u987A\u5E26\u63D0'\n return '\u9759\u9ED8\u8BB0\u4E0B'\n}\nfunction concernObservationExplanation(item: ConcernObservationView): string {\n if (item.decision === 'notify') return item.mentionedAt === undefined ? '\u8FBE\u5230\u4E3B\u52A8\u63D0\u9192\u6761\u4EF6\uFF0C\u7B49\u5F85\u6E20\u9053\u6295\u9012' : '\u5DF2\u7ECF\u901A\u8FC7\u6279\u51C6\u7684\u6E20\u9053\u4E3B\u52A8\u63D0\u9192'\n if (item.decision === 'feed') return '\u53EA\u663E\u793A\u5728\u4F19\u4F34\u52A8\u6001\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u8F6C\u6210\u4E3B\u52A8\u63D0\u9192'\n if (item.decision === 'defer') return item.mentionedAt === undefined ? '\u4E0B\u6B21\u51FA\u73B0\u76F8\u5173\u5BF9\u8BDD\u65F6\u987A\u5E26\u63D0\u53CA' : '\u5DF2\u7ECF\u5728\u76F8\u5173\u5BF9\u8BDD\u4E2D\u987A\u5E26\u63D0\u53CA'\n return '\u4EC5\u4FDD\u7559\u4E3A\u89C2\u5BDF\u8BB0\u5F55\uFF0C\u4E0D\u6253\u6270\u4F60'\n}\nfunction memoryKind(value: MemoryView['kind']): string { return ({ profile: '\u753B\u50CF', preference: '\u504F\u597D', task: '\u4EFB\u52A1', event: '\u4E8B\u4EF6', relationship: '\u5173\u7CFB', emotion: '\u60C5\u7EEA\u4FE1\u53F7' })[value] }\nfunction installStyles(): () => void { let style = document.getElementById(STYLE_ID) as HTMLStyleElement | null; if (!style) { style = document.createElement('style'); style.id = STYLE_ID; style.textContent = cssText; document.head.append(style) } return () => style?.remove() }\n", "const WORKSPACE_ACTIVATE_EVENT = '@lemoncat7/dsh-plugin-ui/workspace-activate'\n\ninterface WorkspaceActivateDetail {\n pluginId: string\n}\n\n/** Claim the conversation workspace while remaining compatible with installed plugin versions. */\nexport function activatePluginWorkspace(pluginId: string): void {\n window.dispatchEvent(new CustomEvent<WorkspaceActivateDetail>(WORKSPACE_ACTIVATE_EVENT, {\n detail: { pluginId },\n }))\n}\n\n/** Close this workspace when another plugin claims the conversation area. */\nexport function observePluginWorkspace(pluginId: string, close: () => void): () => void {\n const onActivate = (event: Event): void => {\n const detail = (event as CustomEvent<WorkspaceActivateDetail>).detail\n if (detail?.pluginId !== pluginId) close()\n }\n window.addEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n return () => window.removeEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n}\n", "var __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\n\n// src/index.tsx\nimport React from \"react\";\n\n// src/third-party/qrcodegen/index.ts\n/**\n * @license QR Code generator library (TypeScript)\n * Copyright (c) Project Nayuki.\n * SPDX-License-Identifier: MIT\n */\nvar qrcodegen;\n((qrcodegen2) => {\n const _QrCode = class _QrCode {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code with the given version number,\n // error correction level, data codeword bytes, and mask number.\n // This is a low-level API that most users should not use directly.\n // A mid-level API is the encodeSegments() function.\n constructor(version, errorCorrectionLevel, dataCodewords, msk) {\n this.version = version;\n this.errorCorrectionLevel = errorCorrectionLevel;\n // The modules of this QR Code (false = light, true = dark).\n // Immutable after constructor finishes. Accessed through getModule().\n this.modules = [];\n // Indicates function modules that are not subjected to masking. Discarded when constructor finishes.\n this.isFunction = [];\n if (version < _QrCode.MIN_VERSION || version > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version value out of range\");\n if (msk < -1 || msk > 7)\n throw new RangeError(\"Mask value out of range\");\n this.size = version * 4 + 17;\n let row = [];\n for (let i = 0; i < this.size; i++)\n row.push(false);\n for (let i = 0; i < this.size; i++) {\n this.modules.push(row.slice());\n this.isFunction.push(row.slice());\n }\n this.drawFunctionPatterns();\n const allCodewords = this.addEccAndInterleave(dataCodewords);\n this.drawCodewords(allCodewords);\n if (msk == -1) {\n let minPenalty = 1e9;\n for (let i = 0; i < 8; i++) {\n this.applyMask(i);\n this.drawFormatBits(i);\n const penalty = this.getPenaltyScore();\n if (penalty < minPenalty) {\n msk = i;\n minPenalty = penalty;\n }\n this.applyMask(i);\n }\n }\n assert(0 <= msk && msk <= 7);\n this.mask = msk;\n this.applyMask(msk);\n this.drawFormatBits(msk);\n this.isFunction = [];\n }\n /*-- Static factory functions (high level) --*/\n // Returns a QR Code representing the given Unicode text string at the given error correction level.\n // As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer\n // Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible\n // QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the\n // ecl argument if it can be done without increasing the version.\n static encodeText(text, ecl) {\n const segs = qrcodegen2.QrSegment.makeSegments(text);\n return _QrCode.encodeSegments(segs, ecl);\n }\n // Returns a QR Code representing the given binary data at the given error correction level.\n // This function always encodes using the binary segment mode, not any text mode. The maximum number of\n // bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.\n // The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.\n static encodeBinary(data, ecl) {\n const seg = qrcodegen2.QrSegment.makeBytes(data);\n return _QrCode.encodeSegments([seg], ecl);\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a QR Code representing the given segments with the given encoding parameters.\n // The smallest possible QR Code version within the given range is automatically\n // chosen for the output. Iff boostEcl is true, then the ECC level of the result\n // may be higher than the ecl argument if it can be done without increasing the\n // version. The mask number is either between 0 to 7 (inclusive) to force that\n // mask, or -1 to automatically choose an appropriate mask (which may be slow).\n // This function allows the user to create a custom sequence of segments that switches\n // between modes (such as alphanumeric and byte) to encode text in less space.\n // This is a mid-level API; the high-level API is encodeText() and encodeBinary().\n static encodeSegments(segs, ecl, minVersion = 1, maxVersion = 40, mask = -1, boostEcl = true) {\n if (!(_QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= _QrCode.MAX_VERSION) || mask < -1 || mask > 7)\n throw new RangeError(\"Invalid value\");\n let version;\n let dataUsedBits;\n for (version = minVersion; ; version++) {\n const dataCapacityBits2 = _QrCode.getNumDataCodewords(version, ecl) * 8;\n const usedBits = QrSegment.getTotalBits(segs, version);\n if (usedBits <= dataCapacityBits2) {\n dataUsedBits = usedBits;\n break;\n }\n if (version >= maxVersion)\n throw new RangeError(\"Data too long\");\n }\n for (const newEcl of [_QrCode.Ecc.MEDIUM, _QrCode.Ecc.QUARTILE, _QrCode.Ecc.HIGH]) {\n if (boostEcl && dataUsedBits <= _QrCode.getNumDataCodewords(version, newEcl) * 8)\n ecl = newEcl;\n }\n let bb = [];\n for (const seg of segs) {\n appendBits(seg.mode.modeBits, 4, bb);\n appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);\n for (const b of seg.getData())\n bb.push(b);\n }\n assert(bb.length == dataUsedBits);\n const dataCapacityBits = _QrCode.getNumDataCodewords(version, ecl) * 8;\n assert(bb.length <= dataCapacityBits);\n appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);\n appendBits(0, (8 - bb.length % 8) % 8, bb);\n assert(bb.length % 8 == 0);\n for (let padByte = 236; bb.length < dataCapacityBits; padByte ^= 236 ^ 17)\n appendBits(padByte, 8, bb);\n let dataCodewords = [];\n while (dataCodewords.length * 8 < bb.length)\n dataCodewords.push(0);\n bb.forEach((b, i) => dataCodewords[i >>> 3] |= b << 7 - (i & 7));\n return new _QrCode(version, ecl, dataCodewords, mask);\n }\n /*-- Accessor methods --*/\n // Returns the color of the module (pixel) at the given coordinates, which is false\n // for light or true for dark. The top left corner has the coordinates (x=0, y=0).\n // If the given coordinates are out of bounds, then false (light) is returned.\n getModule(x, y) {\n return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];\n }\n // Modified to expose modules for easy access\n getModules() {\n return this.modules;\n }\n /*-- Private helper methods for constructor: Drawing function modules --*/\n // Reads this object's version field, and draws and marks all function modules.\n drawFunctionPatterns() {\n for (let i = 0; i < this.size; i++) {\n this.setFunctionModule(6, i, i % 2 == 0);\n this.setFunctionModule(i, 6, i % 2 == 0);\n }\n this.drawFinderPattern(3, 3);\n this.drawFinderPattern(this.size - 4, 3);\n this.drawFinderPattern(3, this.size - 4);\n const alignPatPos = this.getAlignmentPatternPositions();\n const numAlign = alignPatPos.length;\n for (let i = 0; i < numAlign; i++) {\n for (let j = 0; j < numAlign; j++) {\n if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))\n this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);\n }\n }\n this.drawFormatBits(0);\n this.drawVersion();\n }\n // Draws two copies of the format bits (with its own error correction code)\n // based on the given mask and this object's error correction level field.\n drawFormatBits(mask) {\n const data = this.errorCorrectionLevel.formatBits << 3 | mask;\n let rem = data;\n for (let i = 0; i < 10; i++)\n rem = rem << 1 ^ (rem >>> 9) * 1335;\n const bits = (data << 10 | rem) ^ 21522;\n assert(bits >>> 15 == 0);\n for (let i = 0; i <= 5; i++)\n this.setFunctionModule(8, i, getBit(bits, i));\n this.setFunctionModule(8, 7, getBit(bits, 6));\n this.setFunctionModule(8, 8, getBit(bits, 7));\n this.setFunctionModule(7, 8, getBit(bits, 8));\n for (let i = 9; i < 15; i++)\n this.setFunctionModule(14 - i, 8, getBit(bits, i));\n for (let i = 0; i < 8; i++)\n this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));\n for (let i = 8; i < 15; i++)\n this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));\n this.setFunctionModule(8, this.size - 8, true);\n }\n // Draws two copies of the version bits (with its own error correction code),\n // based on this object's version field, iff 7 <= version <= 40.\n drawVersion() {\n if (this.version < 7)\n return;\n let rem = this.version;\n for (let i = 0; i < 12; i++)\n rem = rem << 1 ^ (rem >>> 11) * 7973;\n const bits = this.version << 12 | rem;\n assert(bits >>> 18 == 0);\n for (let i = 0; i < 18; i++) {\n const color = getBit(bits, i);\n const a = this.size - 11 + i % 3;\n const b = Math.floor(i / 3);\n this.setFunctionModule(a, b, color);\n this.setFunctionModule(b, a, color);\n }\n }\n // Draws a 9*9 finder pattern including the border separator,\n // with the center module at (x, y). Modules can be out of bounds.\n drawFinderPattern(x, y) {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n const xx = x + dx;\n const yy = y + dy;\n if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)\n this.setFunctionModule(xx, yy, dist != 2 && dist != 4);\n }\n }\n }\n // Draws a 5*5 alignment pattern, with the center module\n // at (x, y). All modules must be in bounds.\n drawAlignmentPattern(x, y) {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++)\n this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);\n }\n }\n // Sets the color of a module and marks it as a function module.\n // Only used by the constructor. Coordinates must be in bounds.\n setFunctionModule(x, y, isDark) {\n this.modules[y][x] = isDark;\n this.isFunction[y][x] = true;\n }\n /*-- Private helper methods for constructor: Codewords and masking --*/\n // Returns a new byte string representing the given data with the appropriate error correction\n // codewords appended to it, based on this object's version and error correction level.\n addEccAndInterleave(data) {\n const ver = this.version;\n const ecl = this.errorCorrectionLevel;\n if (data.length != _QrCode.getNumDataCodewords(ver, ecl))\n throw new RangeError(\"Invalid argument\");\n const numBlocks = _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n const blockEccLen = _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];\n const rawCodewords = Math.floor(_QrCode.getNumRawDataModules(ver) / 8);\n const numShortBlocks = numBlocks - rawCodewords % numBlocks;\n const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n let blocks = [];\n const rsDiv = _QrCode.reedSolomonComputeDivisor(blockEccLen);\n for (let i = 0, k = 0; i < numBlocks; i++) {\n let dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));\n k += dat.length;\n const ecc = _QrCode.reedSolomonComputeRemainder(dat, rsDiv);\n if (i < numShortBlocks)\n dat.push(0);\n blocks.push(dat.concat(ecc));\n }\n let result = [];\n for (let i = 0; i < blocks[0].length; i++) {\n blocks.forEach((block, j) => {\n if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)\n result.push(block[i]);\n });\n }\n assert(result.length == rawCodewords);\n return result;\n }\n // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire\n // data area of this QR Code. Function modules need to be marked off before this is called.\n drawCodewords(data) {\n if (data.length != Math.floor(_QrCode.getNumRawDataModules(this.version) / 8))\n throw new RangeError(\"Invalid argument\");\n let i = 0;\n for (let right = this.size - 1; right >= 1; right -= 2) {\n if (right == 6)\n right = 5;\n for (let vert = 0; vert < this.size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const upward = (right + 1 & 2) == 0;\n const y = upward ? this.size - 1 - vert : vert;\n if (!this.isFunction[y][x] && i < data.length * 8) {\n this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));\n i++;\n }\n }\n }\n }\n assert(i == data.length * 8);\n }\n // XORs the codeword modules in this QR Code with the given mask pattern.\n // The function modules must be marked and the codeword bits must be drawn\n // before masking. Due to the arithmetic of XOR, calling applyMask() with\n // the same mask value a second time will undo the mask. A final well-formed\n // QR Code needs exactly one (not zero, two, etc.) mask applied.\n applyMask(mask) {\n if (mask < 0 || mask > 7)\n throw new RangeError(\"Mask value out of range\");\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n let invert;\n switch (mask) {\n case 0:\n invert = (x + y) % 2 == 0;\n break;\n case 1:\n invert = y % 2 == 0;\n break;\n case 2:\n invert = x % 3 == 0;\n break;\n case 3:\n invert = (x + y) % 3 == 0;\n break;\n case 4:\n invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;\n break;\n case 5:\n invert = x * y % 2 + x * y % 3 == 0;\n break;\n case 6:\n invert = (x * y % 2 + x * y % 3) % 2 == 0;\n break;\n case 7:\n invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\n break;\n default:\n throw new Error(\"Unreachable\");\n }\n if (!this.isFunction[y][x] && invert)\n this.modules[y][x] = !this.modules[y][x];\n }\n }\n }\n // Calculates and returns the penalty score based on state of this QR Code's current modules.\n // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.\n getPenaltyScore() {\n let result = 0;\n for (let y = 0; y < this.size; y++) {\n let runColor = false;\n let runX = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let x = 0; x < this.size; x++) {\n if (this.modules[y][x] == runColor) {\n runX++;\n if (runX == 5)\n result += _QrCode.PENALTY_N1;\n else if (runX > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runX, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runX = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let x = 0; x < this.size; x++) {\n let runColor = false;\n let runY = 0;\n let runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (let y = 0; y < this.size; y++) {\n if (this.modules[y][x] == runColor) {\n runY++;\n if (runY == 5)\n result += _QrCode.PENALTY_N1;\n else if (runY > 5)\n result++;\n } else {\n this.finderPenaltyAddHistory(runY, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * _QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runY = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * _QrCode.PENALTY_N3;\n }\n for (let y = 0; y < this.size - 1; y++) {\n for (let x = 0; x < this.size - 1; x++) {\n const color = this.modules[y][x];\n if (color == this.modules[y][x + 1] && color == this.modules[y + 1][x] && color == this.modules[y + 1][x + 1])\n result += _QrCode.PENALTY_N2;\n }\n }\n let dark = 0;\n for (const row of this.modules)\n dark = row.reduce((sum, color) => sum + (color ? 1 : 0), dark);\n const total = this.size * this.size;\n const k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;\n assert(0 <= k && k <= 9);\n result += k * _QrCode.PENALTY_N4;\n assert(0 <= result && result <= 2568888);\n return result;\n }\n /*-- Private helper functions --*/\n // Returns an ascending list of positions of alignment patterns for this version number.\n // Each position is in the range [0,177), and are used on both the x and y axes.\n // This could be implemented as lookup table of 40 variable-length lists of integers.\n getAlignmentPatternPositions() {\n if (this.version == 1)\n return [];\n else {\n const numAlign = Math.floor(this.version / 7) + 2;\n const step = this.version == 32 ? 26 : Math.ceil((this.version * 4 + 4) / (numAlign * 2 - 2)) * 2;\n let result = [6];\n for (let pos = this.size - 7; result.length < numAlign; pos -= step)\n result.splice(1, 0, pos);\n return result;\n }\n }\n // Returns the number of data bits that can be stored in a QR Code of the given version number, after\n // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.\n // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.\n static getNumRawDataModules(ver) {\n if (ver < _QrCode.MIN_VERSION || ver > _QrCode.MAX_VERSION)\n throw new RangeError(\"Version number out of range\");\n let result = (16 * ver + 128) * ver + 64;\n if (ver >= 2) {\n const numAlign = Math.floor(ver / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (ver >= 7)\n result -= 36;\n }\n assert(208 <= result && result <= 29648);\n return result;\n }\n // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any\n // QR Code of the given version number and error correction level, with remainder bits discarded.\n // This stateless pure function could be implemented as a (40*4)-cell lookup table.\n static getNumDataCodewords(ver, ecl) {\n return Math.floor(_QrCode.getNumRawDataModules(ver) / 8) - _QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] * _QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n }\n // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be\n // implemented as a lookup table over all possible parameter values, instead of as an algorithm.\n static reedSolomonComputeDivisor(degree) {\n if (degree < 1 || degree > 255)\n throw new RangeError(\"Degree out of range\");\n let result = [];\n for (let i = 0; i < degree - 1; i++)\n result.push(0);\n result.push(1);\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < result.length; j++) {\n result[j] = _QrCode.reedSolomonMultiply(result[j], root);\n if (j + 1 < result.length)\n result[j] ^= result[j + 1];\n }\n root = _QrCode.reedSolomonMultiply(root, 2);\n }\n return result;\n }\n // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.\n static reedSolomonComputeRemainder(data, divisor) {\n let result = divisor.map((_) => 0);\n for (const b of data) {\n const factor = b ^ result.shift();\n result.push(0);\n divisor.forEach((coef, i) => result[i] ^= _QrCode.reedSolomonMultiply(coef, factor));\n }\n return result;\n }\n // Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result\n // are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.\n static reedSolomonMultiply(x, y) {\n if (x >>> 8 != 0 || y >>> 8 != 0)\n throw new RangeError(\"Byte out of range\");\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = z << 1 ^ (z >>> 7) * 285;\n z ^= (y >>> i & 1) * x;\n }\n assert(z >>> 8 == 0);\n return z;\n }\n // Can only be called immediately after a light run is added, and\n // returns either 0, 1, or 2. A helper function for getPenaltyScore().\n finderPenaltyCountPatterns(runHistory) {\n const n = runHistory[1];\n assert(n <= this.size * 3);\n const core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;\n return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0) + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);\n }\n // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().\n finderPenaltyTerminateAndCount(currentRunColor, currentRunLength, runHistory) {\n if (currentRunColor) {\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n currentRunLength = 0;\n }\n currentRunLength += this.size;\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n return this.finderPenaltyCountPatterns(runHistory);\n }\n // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().\n finderPenaltyAddHistory(currentRunLength, runHistory) {\n if (runHistory[0] == 0)\n currentRunLength += this.size;\n runHistory.pop();\n runHistory.unshift(currentRunLength);\n }\n };\n /*-- Constants and tables --*/\n // The minimum version number supported in the QR Code Model 2 standard.\n _QrCode.MIN_VERSION = 1;\n // The maximum version number supported in the QR Code Model 2 standard.\n _QrCode.MAX_VERSION = 40;\n // For use in getPenaltyScore(), when evaluating which mask is best.\n _QrCode.PENALTY_N1 = 3;\n _QrCode.PENALTY_N2 = 3;\n _QrCode.PENALTY_N3 = 40;\n _QrCode.PENALTY_N4 = 10;\n _QrCode.ECC_CODEWORDS_PER_BLOCK = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Low\n [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n // Medium\n [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n // Quartile\n [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]\n // High\n ];\n _QrCode.NUM_ERROR_CORRECTION_BLOCKS = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n // Low\n [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n // Medium\n [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n // Quartile\n [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]\n // High\n ];\n let QrCode = _QrCode;\n qrcodegen2.QrCode = _QrCode;\n function appendBits(val, len, bb) {\n if (len < 0 || len > 31 || val >>> len != 0)\n throw new RangeError(\"Value out of range\");\n for (let i = len - 1; i >= 0; i--)\n bb.push(val >>> i & 1);\n }\n function getBit(x, i) {\n return (x >>> i & 1) != 0;\n }\n function assert(cond) {\n if (!cond)\n throw new Error(\"Assertion error\");\n }\n const _QrSegment = class _QrSegment {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code segment with the given attributes and data.\n // The character count (numChars) must agree with the mode and the bit buffer length,\n // but the constraint isn't checked. The given bit buffer is cloned and stored.\n constructor(mode, numChars, bitData) {\n this.mode = mode;\n this.numChars = numChars;\n this.bitData = bitData;\n if (numChars < 0)\n throw new RangeError(\"Invalid argument\");\n this.bitData = bitData.slice();\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a segment representing the given binary data encoded in\n // byte mode. All input byte arrays are acceptable. Any text string\n // can be converted to UTF-8 bytes and encoded as a byte mode segment.\n static makeBytes(data) {\n let bb = [];\n for (const b of data)\n appendBits(b, 8, bb);\n return new _QrSegment(_QrSegment.Mode.BYTE, data.length, bb);\n }\n // Returns a segment representing the given string of decimal digits encoded in numeric mode.\n static makeNumeric(digits) {\n if (!_QrSegment.isNumeric(digits))\n throw new RangeError(\"String contains non-numeric characters\");\n let bb = [];\n for (let i = 0; i < digits.length; ) {\n const n = Math.min(digits.length - i, 3);\n appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb);\n i += n;\n }\n return new _QrSegment(_QrSegment.Mode.NUMERIC, digits.length, bb);\n }\n // Returns a segment representing the given text string encoded in alphanumeric mode.\n // The characters allowed are: 0 to 9, A to Z (uppercase only), space,\n // dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static makeAlphanumeric(text) {\n if (!_QrSegment.isAlphanumeric(text))\n throw new RangeError(\"String contains unencodable characters in alphanumeric mode\");\n let bb = [];\n let i;\n for (i = 0; i + 2 <= text.length; i += 2) {\n let temp = _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;\n temp += _QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));\n appendBits(temp, 11, bb);\n }\n if (i < text.length)\n appendBits(_QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);\n return new _QrSegment(_QrSegment.Mode.ALPHANUMERIC, text.length, bb);\n }\n // Returns a new mutable list of zero or more segments to represent the given Unicode text string.\n // The result may use various segment modes and switch modes to optimize the length of the bit stream.\n static makeSegments(text) {\n if (text == \"\")\n return [];\n else if (_QrSegment.isNumeric(text))\n return [_QrSegment.makeNumeric(text)];\n else if (_QrSegment.isAlphanumeric(text))\n return [_QrSegment.makeAlphanumeric(text)];\n else\n return [_QrSegment.makeBytes(_QrSegment.toUtf8ByteArray(text))];\n }\n // Returns a segment representing an Extended Channel Interpretation\n // (ECI) designator with the given assignment value.\n static makeEci(assignVal) {\n let bb = [];\n if (assignVal < 0)\n throw new RangeError(\"ECI assignment value out of range\");\n else if (assignVal < 1 << 7)\n appendBits(assignVal, 8, bb);\n else if (assignVal < 1 << 14) {\n appendBits(2, 2, bb);\n appendBits(assignVal, 14, bb);\n } else if (assignVal < 1e6) {\n appendBits(6, 3, bb);\n appendBits(assignVal, 21, bb);\n } else\n throw new RangeError(\"ECI assignment value out of range\");\n return new _QrSegment(_QrSegment.Mode.ECI, 0, bb);\n }\n // Tests whether the given string can be encoded as a segment in numeric mode.\n // A string is encodable iff each character is in the range 0 to 9.\n static isNumeric(text) {\n return _QrSegment.NUMERIC_REGEX.test(text);\n }\n // Tests whether the given string can be encoded as a segment in alphanumeric mode.\n // A string is encodable iff each character is in the following set: 0 to 9, A to Z\n // (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n static isAlphanumeric(text) {\n return _QrSegment.ALPHANUMERIC_REGEX.test(text);\n }\n /*-- Methods --*/\n // Returns a new copy of the data bits of this segment.\n getData() {\n return this.bitData.slice();\n }\n // (Package-private) Calculates and returns the number of bits needed to encode the given segments at\n // the given version. The result is infinity if a segment has too many characters to fit its length field.\n static getTotalBits(segs, version) {\n let result = 0;\n for (const seg of segs) {\n const ccbits = seg.mode.numCharCountBits(version);\n if (seg.numChars >= 1 << ccbits)\n return Infinity;\n result += 4 + ccbits + seg.bitData.length;\n }\n return result;\n }\n // Returns a new array of bytes representing the given string encoded in UTF-8.\n static toUtf8ByteArray(str) {\n str = encodeURI(str);\n let result = [];\n for (let i = 0; i < str.length; i++) {\n if (str.charAt(i) != \"%\")\n result.push(str.charCodeAt(i));\n else {\n result.push(parseInt(str.substring(i + 1, i + 3), 16));\n i += 2;\n }\n }\n return result;\n }\n };\n /*-- Constants --*/\n // Describes precisely all strings that are encodable in numeric mode.\n _QrSegment.NUMERIC_REGEX = /^[0-9]*$/;\n // Describes precisely all strings that are encodable in alphanumeric mode.\n _QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\\/:-]*$/;\n // The set of all legal characters in alphanumeric mode,\n // where each character value maps to the index in the string.\n _QrSegment.ALPHANUMERIC_CHARSET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:\";\n let QrSegment = _QrSegment;\n qrcodegen2.QrSegment = _QrSegment;\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrCode;\n ((QrCode2) => {\n const _Ecc = class _Ecc {\n // The QR Code can tolerate about 30% erroneous codewords\n /*-- Constructor and fields --*/\n constructor(ordinal, formatBits) {\n this.ordinal = ordinal;\n this.formatBits = formatBits;\n }\n };\n /*-- Constants --*/\n _Ecc.LOW = new _Ecc(0, 1);\n // The QR Code can tolerate about 7% erroneous codewords\n _Ecc.MEDIUM = new _Ecc(1, 0);\n // The QR Code can tolerate about 15% erroneous codewords\n _Ecc.QUARTILE = new _Ecc(2, 3);\n // The QR Code can tolerate about 25% erroneous codewords\n _Ecc.HIGH = new _Ecc(3, 2);\n let Ecc = _Ecc;\n QrCode2.Ecc = _Ecc;\n })(QrCode = qrcodegen2.QrCode || (qrcodegen2.QrCode = {}));\n})(qrcodegen || (qrcodegen = {}));\n((qrcodegen2) => {\n let QrSegment;\n ((QrSegment2) => {\n const _Mode = class _Mode {\n /*-- Constructor and fields --*/\n constructor(modeBits, numBitsCharCount) {\n this.modeBits = modeBits;\n this.numBitsCharCount = numBitsCharCount;\n }\n /*-- Method --*/\n // (Package-private) Returns the bit width of the character count field for a segment in\n // this mode in a QR Code at the given version number. The result is in the range [0, 16].\n numCharCountBits(ver) {\n return this.numBitsCharCount[Math.floor((ver + 7) / 17)];\n }\n };\n /*-- Constants --*/\n _Mode.NUMERIC = new _Mode(1, [10, 12, 14]);\n _Mode.ALPHANUMERIC = new _Mode(2, [9, 11, 13]);\n _Mode.BYTE = new _Mode(4, [8, 16, 16]);\n _Mode.KANJI = new _Mode(8, [8, 10, 12]);\n _Mode.ECI = new _Mode(7, [0, 0, 0]);\n let Mode = _Mode;\n QrSegment2.Mode = _Mode;\n })(QrSegment = qrcodegen2.QrSegment || (qrcodegen2.QrSegment = {}));\n})(qrcodegen || (qrcodegen = {}));\nvar qrcodegen_default = qrcodegen;\n\n// src/index.tsx\n/**\n * @license qrcode.react\n * Copyright (c) Paul O'Shannessy\n * SPDX-License-Identifier: ISC\n */\nvar ERROR_LEVEL_MAP = {\n L: qrcodegen_default.QrCode.Ecc.LOW,\n M: qrcodegen_default.QrCode.Ecc.MEDIUM,\n Q: qrcodegen_default.QrCode.Ecc.QUARTILE,\n H: qrcodegen_default.QrCode.Ecc.HIGH\n};\nvar DEFAULT_SIZE = 128;\nvar DEFAULT_LEVEL = \"L\";\nvar DEFAULT_BGCOLOR = \"#FFFFFF\";\nvar DEFAULT_FGCOLOR = \"#000000\";\nvar DEFAULT_INCLUDEMARGIN = false;\nvar DEFAULT_MINVERSION = 1;\nvar SPEC_MARGIN_SIZE = 4;\nvar DEFAULT_MARGIN_SIZE = 0;\nvar DEFAULT_IMG_SCALE = 0.1;\nfunction generatePath(modules, margin = 0) {\n const ops = [];\n modules.forEach(function(row, y) {\n let start = null;\n row.forEach(function(cell, x) {\n if (!cell && start !== null) {\n ops.push(\n `M${start + margin} ${y + margin}h${x - start}v1H${start + margin}z`\n );\n start = null;\n return;\n }\n if (x === row.length - 1) {\n if (!cell) {\n return;\n }\n if (start === null) {\n ops.push(`M${x + margin},${y + margin} h1v1H${x + margin}z`);\n } else {\n ops.push(\n `M${start + margin},${y + margin} h${x + 1 - start}v1H${start + margin}z`\n );\n }\n return;\n }\n if (cell && start === null) {\n start = x;\n }\n });\n });\n return ops.join(\"\");\n}\nfunction excavateModules(modules, excavation) {\n return modules.slice().map((row, y) => {\n if (y < excavation.y || y >= excavation.y + excavation.h) {\n return row;\n }\n return row.map((cell, x) => {\n if (x < excavation.x || x >= excavation.x + excavation.w) {\n return cell;\n }\n return false;\n });\n });\n}\nfunction getImageSettings(cells, size, margin, imageSettings) {\n if (imageSettings == null) {\n return null;\n }\n const numCells = cells.length + margin * 2;\n const defaultSize = Math.floor(size * DEFAULT_IMG_SCALE);\n const scale = numCells / size;\n const w = (imageSettings.width || defaultSize) * scale;\n const h = (imageSettings.height || defaultSize) * scale;\n const x = imageSettings.x == null ? cells.length / 2 - w / 2 : imageSettings.x * scale;\n const y = imageSettings.y == null ? cells.length / 2 - h / 2 : imageSettings.y * scale;\n const opacity = imageSettings.opacity == null ? 1 : imageSettings.opacity;\n let excavation = null;\n if (imageSettings.excavate) {\n let floorX = Math.floor(x);\n let floorY = Math.floor(y);\n let ceilW = Math.ceil(w + x - floorX);\n let ceilH = Math.ceil(h + y - floorY);\n excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };\n }\n const crossOrigin = imageSettings.crossOrigin;\n return { x, y, h, w, excavation, opacity, crossOrigin };\n}\nfunction getMarginSize(includeMargin, marginSize) {\n if (marginSize != null) {\n return Math.max(Math.floor(marginSize), 0);\n }\n return includeMargin ? SPEC_MARGIN_SIZE : DEFAULT_MARGIN_SIZE;\n}\nfunction useQRCode({\n value,\n level,\n minVersion,\n includeMargin,\n marginSize,\n imageSettings,\n size,\n boostLevel\n}) {\n let qrcode = React.useMemo(() => {\n const values = Array.isArray(value) ? value : [value];\n const segments = values.reduce((accum, v) => {\n accum.push(...qrcodegen_default.QrSegment.makeSegments(v));\n return accum;\n }, []);\n return qrcodegen_default.QrCode.encodeSegments(\n segments,\n ERROR_LEVEL_MAP[level],\n minVersion,\n void 0,\n void 0,\n boostLevel\n );\n }, [value, level, minVersion, boostLevel]);\n const { cells, margin, numCells, calculatedImageSettings } = React.useMemo(() => {\n let cells2 = qrcode.getModules();\n const margin2 = getMarginSize(includeMargin, marginSize);\n const numCells2 = cells2.length + margin2 * 2;\n const calculatedImageSettings2 = getImageSettings(\n cells2,\n size,\n margin2,\n imageSettings\n );\n return {\n cells: cells2,\n margin: margin2,\n numCells: numCells2,\n calculatedImageSettings: calculatedImageSettings2\n };\n }, [qrcode, size, imageSettings, includeMargin, marginSize]);\n return {\n qrcode,\n margin,\n cells,\n numCells,\n calculatedImageSettings\n };\n}\nvar SUPPORTS_PATH2D = function() {\n try {\n new Path2D().addPath(new Path2D());\n } catch (e) {\n return false;\n }\n return true;\n}();\nvar QRCodeCanvas = React.forwardRef(\n function QRCodeCanvas2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n marginSize,\n imageSettings\n } = _a, extraProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const _b = extraProps, { style } = _b, otherProps = __objRest(_b, [\"style\"]);\n const imgSrc = imageSettings == null ? void 0 : imageSettings.src;\n const _canvas = React.useRef(null);\n const _image = React.useRef(null);\n const setCanvasRef = React.useCallback(\n (node) => {\n _canvas.current = node;\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n },\n [forwardedRef]\n );\n const [isImgLoaded, setIsImageLoaded] = React.useState(false);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n React.useEffect(() => {\n if (_canvas.current != null) {\n const canvas = _canvas.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n let cellsToDraw = cells;\n const image = _image.current;\n const haveImageToRender = calculatedImageSettings != null && image !== null && image.complete && image.naturalHeight !== 0 && image.naturalWidth !== 0;\n if (haveImageToRender) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n }\n const pixelRatio = window.devicePixelRatio || 1;\n canvas.height = canvas.width = size * pixelRatio;\n const scale = size / numCells * pixelRatio;\n ctx.scale(scale, scale);\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, numCells, numCells);\n ctx.fillStyle = fgColor;\n if (SUPPORTS_PATH2D) {\n ctx.fill(new Path2D(generatePath(cellsToDraw, margin)));\n } else {\n cells.forEach(function(row, rdx) {\n row.forEach(function(cell, cdx) {\n if (cell) {\n ctx.fillRect(cdx + margin, rdx + margin, 1, 1);\n }\n });\n });\n }\n if (calculatedImageSettings) {\n ctx.globalAlpha = calculatedImageSettings.opacity;\n }\n if (haveImageToRender) {\n ctx.drawImage(\n image,\n calculatedImageSettings.x + margin,\n calculatedImageSettings.y + margin,\n calculatedImageSettings.w,\n calculatedImageSettings.h\n );\n }\n }\n });\n React.useEffect(() => {\n setIsImageLoaded(false);\n }, [imgSrc]);\n const canvasStyle = __spreadValues({ height: size, width: size }, style);\n let img = null;\n if (imgSrc != null) {\n img = /* @__PURE__ */ React.createElement(\n \"img\",\n {\n src: imgSrc,\n key: imgSrc,\n style: { display: \"none\" },\n onLoad: () => {\n setIsImageLoaded(true);\n },\n ref: _image,\n crossOrigin: calculatedImageSettings == null ? void 0 : calculatedImageSettings.crossOrigin\n }\n );\n }\n return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(\n \"canvas\",\n __spreadValues({\n style: canvasStyle,\n height: size,\n width: size,\n ref: setCanvasRef,\n role: \"img\"\n }, otherProps)\n ), img);\n }\n);\nQRCodeCanvas.displayName = \"QRCodeCanvas\";\nvar QRCodeSVG = React.forwardRef(\n function QRCodeSVG2(props, forwardedRef) {\n const _a = props, {\n value,\n size = DEFAULT_SIZE,\n level = DEFAULT_LEVEL,\n bgColor = DEFAULT_BGCOLOR,\n fgColor = DEFAULT_FGCOLOR,\n includeMargin = DEFAULT_INCLUDEMARGIN,\n minVersion = DEFAULT_MINVERSION,\n boostLevel,\n title,\n marginSize,\n imageSettings\n } = _a, otherProps = __objRest(_a, [\n \"value\",\n \"size\",\n \"level\",\n \"bgColor\",\n \"fgColor\",\n \"includeMargin\",\n \"minVersion\",\n \"boostLevel\",\n \"title\",\n \"marginSize\",\n \"imageSettings\"\n ]);\n const { margin, cells, numCells, calculatedImageSettings } = useQRCode({\n value,\n level,\n minVersion,\n boostLevel,\n includeMargin,\n marginSize,\n imageSettings,\n size\n });\n let cellsToDraw = cells;\n let image = null;\n if (imageSettings != null && calculatedImageSettings != null) {\n if (calculatedImageSettings.excavation != null) {\n cellsToDraw = excavateModules(\n cells,\n calculatedImageSettings.excavation\n );\n }\n image = /* @__PURE__ */ React.createElement(\n \"image\",\n {\n href: imageSettings.src,\n height: calculatedImageSettings.h,\n width: calculatedImageSettings.w,\n x: calculatedImageSettings.x + margin,\n y: calculatedImageSettings.y + margin,\n preserveAspectRatio: \"none\",\n opacity: calculatedImageSettings.opacity,\n crossOrigin: calculatedImageSettings.crossOrigin\n }\n );\n }\n const fgPath = generatePath(cellsToDraw, margin);\n return /* @__PURE__ */ React.createElement(\n \"svg\",\n __spreadValues({\n height: size,\n width: size,\n viewBox: `0 0 ${numCells} ${numCells}`,\n ref: forwardedRef,\n role: \"img\"\n }, otherProps),\n !!title && /* @__PURE__ */ React.createElement(\"title\", null, title),\n /* @__PURE__ */ React.createElement(\n \"path\",\n {\n fill: bgColor,\n d: `M0,0 h${numCells}v${numCells}H0z`,\n shapeRendering: \"crispEdges\"\n }\n ),\n /* @__PURE__ */ React.createElement(\"path\", { fill: fgColor, d: fgPath, shapeRendering: \"crispEdges\" }),\n image\n );\n }\n);\nQRCodeSVG.displayName = \"QRCodeSVG\";\nexport {\n QRCodeCanvas,\n QRCodeSVG\n};\n", ".dsh-partner-sidebar,\n.dsh-partner-workspace {\n color-scheme: light;\n --partner-surface: rgba(246, 247, 250, .17);\n --partner-pane: rgba(255, 255, 255, .16);\n --partner-raised: rgba(255, 255, 255, .38);\n --partner-control: rgba(255, 255, 255, .27);\n --partner-card-surface: rgba(255, 255, 255, .16);\n --partner-card-highlight: rgba(255, 255, 255, .58);\n --partner-solid-panel: #f4f4f4;\n --partner-solid-raised: #fafafa;\n --partner-solid-control: #ffffff;\n --partner-dialog-veil: transparent;\n --partner-card-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 rgba(60, 60, 67, .08),\n 0 9px 24px rgba(31, 31, 35, .075),\n 0 2px 6px rgba(31, 31, 35, .04);\n --partner-text: #1d1d1f;\n --partner-text-secondary: #515154;\n --partner-text-tertiary: #747478;\n --partner-accent: #6e6e73;\n --partner-accent-strong: #2c2c2e;\n --partner-on-accent: #ffffff;\n --partner-success: #248a3d;\n --partner-weixin: #248a52;\n --partner-warning: #c93400;\n --partner-danger: #d70015;\n --partner-border: rgba(60, 60, 67, .14);\n --partner-separator: rgba(60, 60, 67, .11);\n --partner-hover: rgba(118, 118, 128, .09);\n --partner-selected: rgba(60, 60, 67, .085);\n --partner-focus-ring: rgba(60, 60, 67, .46);\n --partner-glass-clear: rgba(255, 255, 255, .11);\n --partner-glass-regular: rgba(255, 255, 255, .24);\n --partner-glass-thick: rgba(255, 255, 255, .42);\n --partner-glass-highlight: rgba(255, 255, 255, .7);\n --partner-glass-rim-shadow: rgba(60, 60, 67, .11);\n --partner-glass-filter: saturate(1.22) contrast(1.03) blur(32px);\n --partner-frosted-filter: blur(18px) saturate(.84) contrast(1.025);\n --partner-shadow-sm: 0 1px 2px rgba(0, 0, 0, .055);\n --partner-shadow-md: 0 10px 28px rgba(31, 31, 35, .085);\n --partner-shadow-lg: 0 24px 64px rgba(31, 31, 35, .14);\n --partner-glass-shadow:\n inset 0 1px 0 var(--partner-glass-highlight),\n inset 0 -1px 0 var(--partner-glass-rim-shadow),\n var(--partner-shadow-sm);\n --partner-ease-out: cubic-bezier(.22, 1, .36, 1);\n --partner-font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, \"SF Pro Text\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif;\n --partner-font-caption: 12px;\n --partner-font-body: 13px;\n --partner-font-label: 14px;\n --partner-font-title: 18px;\n --partner-font-heading: 22px;\n --partner-font-display: clamp(24px, 2.2vw, 28px);\n color: var(--partner-text);\n font-family: var(--partner-font-family);\n font-size: var(--partner-font-body);\n line-height: 1.5;\n}\n\nbody[data-ds-dark-theme] :is(.dsh-partner-sidebar, .dsh-partner-workspace) {\n color-scheme: dark;\n /* Owned cool-charcoal glass: sufficiently opaque to resist host tint while\n preserving depth, blur and edge light across the workspace. */\n --partner-surface: rgb(16 23 25 / 92%);\n --partner-pane: rgb(25 33 35 / 90%);\n --partner-raised: rgb(32 41 43 / 94%);\n --partner-control: rgb(39 50 53 / 92%);\n --partner-card-surface: rgb(32 41 43 / 90%);\n --partner-card-highlight: rgba(255, 255, 255, .11);\n --partner-solid-panel: #182022;\n --partner-solid-raised: #20292b;\n --partner-solid-control: #273235;\n --partner-dialog-veil: transparent;\n --partner-card-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 rgba(0, 0, 0, .28),\n 0 12px 30px rgba(0, 0, 0, .28),\n 0 2px 7px rgba(0, 0, 0, .2);\n --partner-text: #e3eaeb;\n --partner-text-secondary: #bbc9cc;\n --partner-text-tertiary: #95a7ab;\n --partner-accent: #69b6ba;\n --partner-accent-strong: #8aced0;\n --partner-on-accent: #101819;\n --partner-success: #30d158;\n --partner-weixin: #30c96b;\n --partner-warning: #ff9f0a;\n --partner-danger: #ff453a;\n --partner-border: rgb(184 204 205 / 11%);\n --partner-separator: rgb(184 204 205 / 8%);\n --partner-hover: rgb(105 182 186 / 9%);\n --partner-selected: rgb(105 182 186 / 14%);\n --partner-focus-ring: rgb(105 182 186 / 72%);\n --partner-glass-clear: rgba(0, 0, 0, .1);\n --partner-glass-regular: rgba(0, 0, 0, .16);\n --partner-glass-thick: rgba(0, 0, 0, .26);\n --partner-glass-highlight: rgba(255, 255, 255, .16);\n --partner-glass-rim-shadow: rgba(0, 0, 0, .3);\n --partner-shadow-sm: 0 1px 2px rgba(0, 0, 0, .28);\n --partner-shadow-md: 0 12px 32px rgba(0, 0, 0, .34);\n --partner-shadow-lg: 0 28px 72px rgba(0, 0, 0, .48);\n}\n\n.dsh-partner-sidebar,\n.dsh-partner-sidebar *,\n.dsh-partner-workspace,\n.dsh-partner-workspace * { box-sizing: border-box; }\n\n.dsh-partner-sidebar :where(button, input, textarea, select),\n.dsh-partner-workspace :where(button, input, textarea, select) {\n margin: 0;\n border-radius: 0;\n appearance: none;\n color: inherit;\n font-family: var(--partner-font-family);\n font-size: inherit;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n}\n\n.dsh-partner-sidebar :where(button, input, textarea, select):focus,\n.dsh-partner-workspace :where(button, input, textarea, select):focus { outline: none; }\n\n.dsh-partner-sidebar :where(button, input, textarea, select):focus-visible,\n.dsh-partner-workspace :where(button, input, textarea, select):focus-visible {\n outline: 2px solid var(--partner-focus-ring);\n outline-offset: 2px;\n}\n\n.dsh-partner-sidebar :where(button, input, textarea, select):disabled,\n.dsh-partner-workspace :where(button, input, textarea, select):disabled {\n opacity: .45;\n cursor: default;\n}\n\n.dsh-partner-workspace select {\n padding-right: 32px;\n background-image:\n linear-gradient(45deg, transparent 50%, currentColor 50%),\n linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position:\n calc(100% - 15px) calc(50% - 1px),\n calc(100% - 11px) calc(50% - 1px);\n background-repeat: no-repeat;\n background-size: 4px 4px, 4px 4px;\n}\n\n.dsh-partner-workspace input[type=\"number\"] { appearance: textfield; }\n.dsh-partner-workspace input[type=\"number\"]::-webkit-inner-spin-button,\n.dsh-partner-workspace input[type=\"number\"]::-webkit-outer-spin-button { margin: 0; appearance: none; }\n\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds) {\n scrollbar-width: thin;\n scrollbar-color: color-mix(in srgb, var(--partner-text) 20%, transparent) transparent;\n}\n\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar { width: 6px; height: 6px; }\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar-track { background: transparent; }\n.dsh-partner-workspace :where(.dsh-partner-roster-list, .dsh-partner-stage-scroll, .dsh-partner-library-list, .dsh-partner-library-detail, .dsh-partner-profile-people, .dsh-partner-profile-stage, .dsh-partner-graph-index, .dsh-partner-graph-stage, .dsh-partner-concern-sources, .dsh-partner-memory-kinds)::-webkit-scrollbar-thumb {\n border: 1px solid transparent;\n border-radius: 999px;\n background: color-mix(in srgb, var(--partner-text) 20%, transparent);\n background-clip: padding-box;\n}\n\n/* Skills, board and schedule modules share the partner workspace scale. */\n.dsh-partner-feature-page { display: grid; width: min(100%, 1180px); align-content: start; gap: 18px; margin: 0 auto; padding: 26px clamp(22px, 4vw, 52px) 52px; font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-feature-page.is-board { width: min(100%, 1180px); }\n.dsh-partner-feature-hero { display: flex; min-height: 86px; align-items: end; justify-content: space-between; gap: 24px; padding: 0 2px 16px 14px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-feature-hero > span { position: relative; display: grid; min-width: 0; gap: 4px; }\n.dsh-partner-feature-hero > span::before { position: absolute; top: 3px; bottom: 2px; left: -14px; width: 2px; border-radius: 2px; background: linear-gradient(var(--partner-text-secondary), transparent 92%); content: ''; }\n.dsh-partner-feature-hero small,\n.dsh-partner-capability-detail > header small { color: var(--partner-accent); font: 700 var(--partner-font-caption)/1.3 var(--partner-font-family); letter-spacing: .1em; }\n.dsh-partner-feature-hero h2 { margin: 0; color: var(--partner-text); font: 650 var(--partner-font-display)/1.18 var(--partner-font-family); letter-spacing: -.035em; }\n.dsh-partner-feature-hero p { max-width: 680px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-feature-hero > div { display: flex; align-items: end; gap: 8px; }\n.dsh-partner-feature-hero button,\n.dsh-partner-feature-block > header button,\n.dsh-partner-market-grid button,\n.dsh-partner-board button,\n.dsh-partner-schedule-list button,\n.dsh-partner-feature-form button,\n.dsh-partner-task-form button,\n.dsh-partner-schedule-form button { display: inline-flex; min-height: 36px; align-items: center; justify-content: center; gap: 6px; padding: 0 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease, transform .15s var(--partner-ease-out); }\n.dsh-partner-feature-page button:not(:disabled):hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-feature-page button:not(:disabled):active { transform: translateY(1px); }\n.dsh-partner-feature-block,\n.dsh-partner-capability-detail { display: grid; gap: 14px; padding: 18px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-capability-detail { margin: 0 0 18px; }\n.dsh-partner-feature-block > header,\n.dsh-partner-capability-detail > header { display: flex; min-height: 36px; align-items: center; justify-content: space-between; gap: 16px; }\n.dsh-partner-feature-block > header > span,\n.dsh-partner-capability-detail > header > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-feature-block > header > div { display: flex; align-items: center; justify-content: flex-end; gap: 8px; }\n.dsh-partner-capability-actions { display: flex; align-items: center; justify-content: flex-end; gap: 10px; }\n.dsh-partner-capability-actions > button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; gap: 6px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-capability-actions > button:hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-feature-block > header strong,\n.dsh-partner-capability-detail > header strong { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-feature-block > header small,\n.dsh-partner-capability-detail > header em { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-feature-empty { margin: 0; padding: 24px 16px; border: 1px dashed var(--partner-border); border-radius: 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); line-height: 1.55; text-align: center; }\n.dsh-partner-inline-warning { margin: 0; padding: 9px 11px; border-radius: 9px; color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 8%, transparent); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-error { margin: 0; padding: 10px 12px; border: 1px solid color-mix(in srgb, var(--partner-danger) 22%, transparent); border-radius: 10px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-raised)); font-size: var(--partner-font-body); line-height: 1.5; overflow-wrap: anywhere; }\n.dsh-partner-skill-installed { display: grid; gap: 8px; }\n.dsh-partner-skill-installed.is-binding { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-market-toolbar { display: grid; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 14px; background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-market-sources { display: flex; gap: 5px; overflow-x: auto; padding: 7px; border-top: 1px solid var(--partner-separator); background: color-mix(in srgb, var(--partner-control) 74%, transparent); scrollbar-width: thin; }\n.dsh-partner-market-sources > button { display: inline-flex; min-height: 34px; flex: 0 0 auto; align-items: center; gap: 7px; padding: 0 10px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-market-sources > button:hover { color: var(--partner-text-secondary); background: var(--partner-hover); }\n.dsh-partner-market-sources > button:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: -2px; }\n.dsh-partner-market-sources > button.is-active { border-color: var(--partner-separator); color: var(--partner-text); background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), 0 1px 3px color-mix(in srgb, #000 7%, transparent); }\n.dsh-partner-market-sources small { display: grid; min-width: 20px; height: 20px; place-items: center; padding: 0 5px; border-radius: 7px; color: var(--partner-text-tertiary); background: var(--partner-selected); font-size: var(--partner-font-caption); }\n.dsh-partner-skill-installed > article { display: grid; min-height: 72px; grid-template-columns: 36px minmax(0, 1fr) auto 32px; align-items: center; gap: 11px; padding: 11px 12px; border: 1px solid var(--partner-separator); border-radius: 12px; background: var(--partner-raised); }\n.dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 32px; }\n.dsh-partner-skill-installed.is-binding > article { min-height: 122px; grid-template-columns: 36px minmax(0, 1fr) auto; align-content: start; align-items: start; padding: 13px; }\n.dsh-partner-skill-installed.is-binding .dsh-partner-skill-mark { margin-top: 1px; }\n.dsh-partner-skill-installed.is-binding article > span:nth-child(2) { gap: 5px; }\n.dsh-partner-skill-installed.is-binding p { display: -webkit-box; line-height: 1.5; white-space: normal; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-skill-mark { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 11px; color: var(--partner-text-secondary); background: var(--partner-selected); }\n.dsh-partner-skill-installed article > span:nth-child(2) { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-skill-installed strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-skill-installed p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-skill-installed .dsh-partner-skill-action-error { grid-column: 2 / -1; overflow: visible; padding: 8px 10px; border-radius: 8px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, transparent); font-size: var(--partner-font-caption); line-height: 1.45; text-overflow: clip; white-space: normal; overflow-wrap: anywhere; }\n.dsh-partner-skill-installed small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-switch { position: relative; width: 38px; height: 22px; min-height: 22px !important; padding: 0 !important; border-radius: 999px !important; background: color-mix(in srgb, var(--partner-text) 9%, transparent) !important; box-shadow: none !important; }\n.dsh-partner-feature-switch i { position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: 50%; background: var(--partner-raised); box-shadow: 0 1px 3px color-mix(in srgb, #000 16%, transparent); transition: transform .18s var(--partner-ease-out); }\n.dsh-partner-feature-switch[data-on=\"true\"] { border-color: var(--partner-accent-strong) !important; background: var(--partner-accent-strong) !important; }\n.dsh-partner-feature-switch[data-on=\"true\"] i { transform: translateX(16px); }\n.dsh-partner-skill-binding-action,\n.dsh-partner-skill-picker button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); font: 590 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: color .15s ease, border-color .15s ease, background .15s ease; }\n.dsh-partner-skill-binding-action:hover,\n.dsh-partner-skill-picker button:hover { color: var(--partner-text); border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-skill-binding-action:disabled,\n.dsh-partner-skill-picker button:disabled { cursor: wait; opacity: .56; }\n.dsh-partner-skill-disclosure { justify-self: center; min-height: 34px; padding: 0 12px; border-color: transparent; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font-size: var(--partner-font-body); }\n.dsh-partner-skill-disclosure:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-skill-picker { display: grid; gap: 10px; padding: 12px; border: 1px solid var(--partner-border); border-radius: 13px; background: color-mix(in srgb, var(--partner-control) 72%, transparent); animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-skill-search { display: grid; min-height: 56px; grid-template-columns: 36px minmax(0, 1fr) auto auto; align-items: center; gap: 10px; padding: 9px 13px; color: var(--partner-text-tertiary); background: transparent; transition: background .15s ease, border-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-skill-search:focus-within { background: color-mix(in srgb, var(--partner-selected) 28%, transparent); box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--partner-focus-ring) 62%, transparent); }\n.dsh-partner-skill-search-icon { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-control); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-skill-search input { min-width: 0; height: 36px; padding: 0; border: 0; border-radius: 0; outline: 0; appearance: none; color: var(--partner-text); background: transparent; box-shadow: none; font: 500 var(--partner-font-label)/1.4 var(--partner-font-family); }\n.dsh-partner-skill-search input::placeholder { color: var(--partner-text-tertiary); opacity: 1; }\n.dsh-partner-skill-search input::-webkit-search-cancel-button { display: none; appearance: none; }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear { display: grid; width: 30px; min-height: 30px; place-items: center; padding: 0; border: 0; border-radius: 8px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; cursor: pointer; }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-skill-search .dsh-partner-skill-search-clear:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: -2px; }\n.dsh-partner-skill-search-count { min-width: 56px; padding-left: 11px; border-left: 1px solid var(--partner-separator); color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 580; line-height: 20px; text-align: right; white-space: nowrap; }\n.dsh-partner-skill-search.is-compact { min-height: 42px; grid-template-columns: 30px minmax(0, 1fr) auto auto; gap: 8px; padding: 5px 8px; border: 1px solid var(--partner-border); border-radius: 11px; background: var(--partner-raised); }\n.dsh-partner-skill-search.is-compact:focus-within { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 15%, transparent); }\n.dsh-partner-skill-search.is-compact .dsh-partner-skill-search-icon { width: 30px; height: 30px; border-radius: 8px; }\n.dsh-partner-skill-search.is-compact input { height: 30px; font-size: var(--partner-font-body); }\n.dsh-partner-skill-search.is-compact .dsh-partner-skill-search-count { min-width: 48px; padding-left: 8px; }\n.dsh-partner-skill-picker-list { display: grid; max-height: 360px; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; }\n.dsh-partner-skill-picker-list > article { display: grid; min-height: 112px; grid-template-rows: minmax(0, 1fr) auto; gap: 10px; padding: 11px; border: 1px solid var(--partner-separator); border-radius: 11px; background: var(--partner-raised); }\n.dsh-partner-skill-picker-list article > span { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-skill-picker-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-skill-picker-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-skill-picker-list button { justify-self: end; }\n.dsh-partner-skill-picker-list small,\n.dsh-partner-skill-picker-limit { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-skill-picker-empty { margin: 0; padding: 20px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); text-align: center; }\n.dsh-partner-access-note { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-access-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }\n.dsh-partner-access-list > button { display: grid; min-width: 0; min-height: 92px; grid-template-columns: 36px minmax(0, 1fr) 22px; align-items: start; gap: 11px; padding: 12px; border: 1px solid var(--partner-separator); border-radius: 12px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1.5 var(--partner-font-family); text-align: left; cursor: pointer; transition: border-color .15s ease, background .15s ease, transform .15s var(--partner-ease-out); }\n.dsh-partner-access-list > button:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: var(--partner-hover); }\n.dsh-partner-access-list > button.is-active { border-color: color-mix(in srgb, var(--partner-accent) 55%, var(--partner-border)); background: color-mix(in srgb, var(--partner-selected) 74%, var(--partner-raised)); }\n.dsh-partner-access-avatar { display: grid; width: 36px; height: 36px; place-items: center; border-radius: 12px; color: var(--partner-text); background: var(--partner-selected); font-size: var(--partner-font-caption); font-weight: 650; }\n.dsh-partner-access-copy { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-access-copy > strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-access-copy > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-access-copy > p { margin: 3px 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.5; }\n.dsh-partner-access-copy > span { display: flex; flex-wrap: wrap; gap: 5px; }\n.dsh-partner-access-copy em { padding: 2px 7px; border: 1px solid var(--partner-separator); border-radius: 999px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: var(--partner-font-caption); font-style: normal; line-height: 1.4; }\n.dsh-partner-access-check { display: grid; width: 22px; height: 22px; place-items: center; border: 1px solid var(--partner-border); border-radius: 7px; color: transparent; background: var(--partner-control); }\n.dsh-partner-access-list > button.is-active .dsh-partner-access-check { border-color: var(--partner-accent-strong); color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-feature-block .is-icon,\n.dsh-partner-board .is-icon,\n.dsh-partner-schedule-list .is-icon { width: 32px; min-height: 32px; padding: 0; border-color: transparent; background: transparent; box-shadow: none; }\n.dsh-partner-market-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 10px; }\n.dsh-partner-market-grid > article { display: flex; min-height: 164px; flex-direction: column; justify-content: space-between; gap: 14px; padding: 15px; border: 1px solid var(--partner-separator); border-radius: 13px; background: var(--partner-raised); transition: border-color .16s ease, transform .18s var(--partner-ease-out); }\n.dsh-partner-market-grid > article:hover { transform: translateY(-1px); border-color: color-mix(in srgb, var(--partner-text) 22%, var(--partner-border)); }\n.dsh-partner-market-grid article > span { display: grid; gap: 6px; }\n.dsh-partner-market-grid article > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-market-grid strong { font-size: var(--partner-font-label); }\n.dsh-partner-market-grid p { display: -webkit-box; overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; -webkit-box-orient: vertical; -webkit-line-clamp: 3; }\n.dsh-partner-market-grid .dsh-partner-market-card-error { display: block; overflow: visible; padding: 8px 10px; border-radius: 8px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, transparent); font-size: var(--partner-font-caption); line-height: 1.45; overflow-wrap: anywhere; -webkit-line-clamp: unset; }\n.dsh-partner-market-grid footer { display: flex; align-items: center; justify-content: space-between; gap: 10px; }\n.dsh-partner-market-grid footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-feature-form,\n.dsh-partner-task-form,\n.dsh-partner-schedule-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; padding: 18px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label { display: grid; min-width: 0; gap: 8px; color: var(--partner-text-secondary); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select) { width: 100%; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease, background .15s ease; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select):focus { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), inset 0 1px 0 var(--partner-glass-highlight); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) textarea { resize: vertical; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) .is-wide { grid-column: 1 / -1; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer { display: flex; grid-column: 1 / -1; justify-content: flex-end; gap: 8px; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > p { grid-column: 1 / -1; margin: 0; padding: 9px 11px; border-radius: 9px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 6%, transparent); font-size: var(--partner-font-body); }\n.dsh-partner-feature-form > p.is-success { color: var(--partner-success); background: color-mix(in srgb, var(--partner-success) 7%, transparent); }\n.dsh-partner-board-live { display: inline-flex; min-height: 36px; align-items: center; gap: 7px; padding: 0 10px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-board-live > i { width: 7px; height: 7px; border-radius: 50%; background: var(--partner-success); box-shadow: 0 0 0 4px color-mix(in srgb, var(--partner-success) 10%, transparent); }\n.dsh-partner-board-tools { display: grid; grid-template-columns: minmax(220px, 1fr) minmax(140px, 180px) auto; align-items: center; gap: 8px; }\n.dsh-partner-board-search { position: relative; display: flex; min-width: 0; align-items: center; }\n.dsh-partner-board-search > span:not(.sr-only) { position: absolute; z-index: 1; left: 11px; display: grid; place-items: center; color: var(--partner-text-tertiary); pointer-events: none; }\n.dsh-partner-board-search > input,\n.dsh-partner-board-assignee > select { width: 100%; min-height: 38px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text); background-color: var(--partner-control); font: var(--partner-font-body)/1.4 var(--partner-font-family); transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease; }\n.dsh-partner-board-search > input { padding: 8px 38px 8px 34px; }\n.dsh-partner-board-search > input::placeholder { color: var(--partner-text-tertiary); }\n.dsh-partner-board-search > input:hover,\n.dsh-partner-board-assignee > select:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background-color: var(--partner-hover); }\n.dsh-partner-board-search > input:focus-visible,\n.dsh-partner-board-assignee > select:focus-visible { outline: 0; border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent); }\n.dsh-partner-board-search > button { position: absolute; z-index: 1; right: 4px; display: grid; width: 30px; min-height: 30px; place-items: center; padding: 0; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; }\n.dsh-partner-board-search > button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-board-assignee > select { min-width: 0; padding: 8px 30px 8px 10px; }\n.dsh-partner-board-tools > small { justify-self: end; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; white-space: nowrap; }\n.dsh-partner-board-statuses { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; padding-bottom: 2px; }\n.dsh-partner-board-statuses > button { display: inline-flex; min-height: 32px; align-items: center; gap: 7px; padding: 0 9px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; font: var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; transition: border-color 140ms ease, color 140ms ease, background-color 140ms ease; }\n.dsh-partner-board-statuses > button:hover { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-board-statuses > button.is-active { border-color: color-mix(in srgb, var(--partner-text) 18%, var(--partner-border)); color: var(--partner-text); background: var(--partner-selected); }\n.dsh-partner-board-statuses b { min-width: 18px; color: inherit; font-size: inherit; font-variant-numeric: tabular-nums; font-weight: 650; text-align: center; }\n.dsh-partner-board { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr)); align-items: start; gap: 10px; min-width: 0; }\n.dsh-partner-board[data-focused=\"true\"] { grid-template-columns: minmax(0, 1fr); }\n.dsh-partner-board > section { display: grid; height: clamp(220px, 27vh, 280px); min-width: 0; grid-template-rows: auto minmax(0, 1fr); align-content: start; gap: 9px; padding: 11px 9px 9px 11px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); }\n.dsh-partner-board > section[data-empty=\"true\"] { height: 132px; }\n.dsh-partner-board[data-focused=\"true\"] > section { height: clamp(340px, 54vh, 560px); }\n.dsh-partner-board[data-focused=\"true\"] > section[data-empty=\"true\"] { height: 240px; }\n.dsh-partner-board > section > header { display: flex; min-height: 36px; align-items: center; justify-content: space-between; padding: 0 3px; }\n.dsh-partner-board > section > header strong { font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-board > section > header b { display: grid; min-width: 22px; height: 22px; place-items: center; padding: 0 5px; border-radius: 7px; color: var(--partner-text-tertiary); background: var(--partner-selected); font-size: var(--partner-font-caption); }\n.dsh-partner-board-column-list { display: grid; min-height: 0; grid-auto-rows: max-content; align-content: start; gap: 7px; overflow-y: auto; padding: 1px 3px 6px 0; overscroll-behavior: contain; scrollbar-gutter: stable; scrollbar-width: thin; }\n.dsh-partner-board > section > p { align-self: center; margin: 0 0 22px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); text-align: center; }\n.dsh-partner-task-card { position: relative; display: grid; min-height: 82px; overflow: hidden; border: 1px solid var(--partner-separator); border-radius: 11px; background: var(--partner-raised); box-shadow: var(--partner-shadow-sm); transition: border-color .16s ease, box-shadow .18s ease, transform .16s var(--partner-ease-out); }\n.dsh-partner-task-card:hover { border-color: color-mix(in srgb, var(--partner-text) 22%, var(--partner-border)); box-shadow: var(--partner-shadow-md); transform: translateY(-1px); }\n.dsh-partner-task-card:focus-within { border-color: var(--partner-focus-ring); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), var(--partner-shadow-md); }\n.dsh-partner-task-card[data-blocked=\"true\"] { border-left-color: color-mix(in srgb, var(--partner-warning) 55%, var(--partner-border)); }\n.dsh-partner-task-summary { display: grid !important; min-height: 82px !important; grid-template-columns: minmax(0, 1fr) 16px; align-items: center !important; gap: 8px !important; padding: 10px 10px 10px 11px !important; border: 0 !important; border-radius: 0 !important; appearance: none; color: var(--partner-text) !important; background: transparent !important; box-shadow: none !important; font-family: var(--partner-font-family); text-align: left; cursor: pointer; }\n.dsh-partner-task-summary:hover { background: var(--partner-hover) !important; }\n.dsh-partner-task-summary:focus-visible { outline: 0; }\n.dsh-partner-task-summary > span { display: grid; min-width: 0; gap: 4px; }\n.dsh-partner-task-card-title { display: flex; min-width: 0; align-items: flex-start; justify-content: space-between; gap: 8px; }\n.dsh-partner-task-card-title > strong { display: -webkit-box; min-width: 0; overflow: hidden; color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 620; line-height: 1.38; overflow-wrap: anywhere; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-task-card-title > em { flex: none; margin-top: 1px; padding: 2px 5px; border: 1px solid var(--partner-separator); border-radius: 6px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: 10px; font-style: normal; font-weight: 620; line-height: 1.25; }\n.dsh-partner-task-card[data-priority=\"high\"] .dsh-partner-task-card-title > em { border-color: color-mix(in srgb, var(--partner-warning) 35%, var(--partner-separator)); color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 7%, var(--partner-control)); }\n.dsh-partner-task-card[data-priority=\"urgent\"] .dsh-partner-task-card-title > em { border-color: color-mix(in srgb, var(--partner-danger) 34%, var(--partner-separator)); color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-control)); }\n.dsh-partner-task-card-owner { overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-relations { display: flex; min-width: 0; align-items: center; flex-wrap: wrap; gap: 4px; }\n.dsh-partner-task-relations > small { padding: 2px 6px; border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-selected); font-size: 10px; font-variant-numeric: tabular-nums; line-height: 1.3; }\n.dsh-partner-task-relations > small[data-blocked=\"true\"] { color: var(--partner-warning); background: color-mix(in srgb, var(--partner-warning) 8%, var(--partner-selected)); }\n.dsh-partner-task-summary > svg { color: var(--partner-text-tertiary); transition: transform .16s var(--partner-ease-out), color .16s ease; }\n.dsh-partner-task-summary:hover > svg { color: var(--partner-text); transform: translateX(2px); }\n.dsh-partner-task-detail { display: grid; gap: 13px; }\n.dsh-partner-task-description { display: grid; gap: 6px; padding: 12px; border: 1px solid var(--partner-separator); border-radius: 10px; background: color-mix(in srgb, var(--partner-raised) 78%, transparent); }\n.dsh-partner-task-description strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-description p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; white-space: pre-wrap; overflow-wrap: anywhere; }\n.dsh-partner-task-fields { display: grid; gap: 7px; }\n.dsh-partner-task-fields label { display: grid; grid-template-columns: 58px minmax(0, 1fr); align-items: center; gap: 8px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-detail select { width: 100%; height: 34px; padding: 0 28px 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background-color: var(--partner-control); font: var(--partner-font-body)/1 var(--partner-font-family); }\n.dsh-partner-task-detail select:focus { border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 14%, transparent); }\n.dsh-partner-task-execution { display: grid; min-height: 48px; grid-template-columns: 9px minmax(0, 1fr); align-items: start; gap: 10px; padding: 10px 11px; border: 1px solid color-mix(in srgb, var(--partner-accent) 24%, var(--partner-separator)); border-radius: 9px; background: color-mix(in srgb, var(--partner-accent) 5%, var(--partner-raised)); }\n.dsh-partner-task-execution > i { width: 7px; height: 7px; margin-top: 5px; border-radius: 50%; background: var(--partner-success); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-success) 12%, transparent); }\n.dsh-partner-task-execution[data-state=\"queued\"] > i { background: var(--partner-warning); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-warning) 12%, transparent); }\n.dsh-partner-task-execution > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-task-execution strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-execution small { overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-dependency { display: grid; gap: 7px; padding: 10px; border: 1px solid var(--partner-separator); border-radius: 9px; background: color-mix(in srgb, var(--partner-control) 64%, transparent); }\n.dsh-partner-task-dependency > header { display: grid; gap: 2px; }\n.dsh-partner-task-dependency > header strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-dependency > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.4; }\n.dsh-partner-task-dependency > div { display: grid; gap: 5px; }\n.dsh-partner-task-dependency > div > span { display: grid; min-height: 30px; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: 6px; }\n.dsh-partner-task-dependency > div i { display: grid; width: 16px; height: 16px; place-items: center; border: 1px solid var(--partner-border); border-radius: 5px; color: var(--partner-on-accent); background: var(--partner-control); font-style: normal; }\n.dsh-partner-task-dependency > div span[data-done=\"true\"] i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-dependency > div b { overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); font-weight: 560; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-dependency > div button { min-height: 26px; padding: 0 7px; border-color: transparent; background: transparent; box-shadow: none; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-result { display: grid; gap: 6px; padding: 10px; border: 1px solid var(--partner-separator); border-radius: 9px; background: color-mix(in srgb, var(--partner-raised) 78%, transparent); }\n.dsh-partner-task-result strong,\n.dsh-partner-task-activity > strong { font-size: var(--partner-font-body); font-weight: 620; }\n.dsh-partner-task-result p { max-height: 220px; margin: 0; overflow-y: auto; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; }\n.dsh-partner-task-activity { display: grid; gap: 6px; }\n.dsh-partner-task-activity ol { display: grid; gap: 5px; margin: 0; padding: 0; list-style: none; }\n.dsh-partner-task-activity li { display: grid; gap: 2px; padding-left: 8px; border-left: 2px solid var(--partner-separator); color: var(--partner-text-secondary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-activity time { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-reject,\n.dsh-partner-task-delete-confirm { display: grid; gap: 9px; padding: 10px; border: 1px solid var(--partner-border); border-radius: 9px; background: var(--partner-control); }\n.dsh-partner-task-reject label { display: grid; gap: 6px; color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-task-reject textarea { width: 100%; min-height: 76px; resize: vertical; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1.5 var(--partner-font-family); }\n.dsh-partner-task-reject textarea:focus { border-color: var(--partner-focus-ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 15%, transparent); }\n.dsh-partner-task-reject > div,\n.dsh-partner-task-delete-confirm > div { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; }\n.dsh-partner-task-reject button,\n.dsh-partner-task-delete-confirm button { min-height: 32px; padding-inline: 10px; font-size: var(--partner-font-caption); }\n.dsh-partner-task-delete-confirm { border-color: color-mix(in srgb, var(--partner-danger) 28%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 6%, var(--partner-control)); }\n.dsh-partner-task-delete-confirm > span { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; }\n.dsh-partner-task-delete-confirm .is-danger { color: var(--partner-on-accent); border-color: var(--partner-danger); background: var(--partner-danger); }\n.dsh-partner-task-actions { display: grid; gap: 8px; padding-top: 9px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-task-actions > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-actions > span { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 5px; }\n.dsh-partner-task-actions button { min-height: 32px; padding-inline: 9px; font-size: var(--partner-font-caption); }\n.dsh-partner-task-actions button.is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-form,\n.dsh-partner-schedule-form { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-task-form .is-wide,\n.dsh-partner-schedule-form .is-wide { grid-column: 1 / -1; }\n.dsh-partner-task-form-dependencies { display: grid; gap: 8px; }\n.dsh-partner-task-form-dependencies > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-task-form-dependencies > span > small { margin-left: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 500; }\n.dsh-partner-task-form-dependencies > div { display: grid; max-height: 180px; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; overflow-y: auto; padding: 6px; border: 1px solid var(--partner-border); border-radius: 10px; background: var(--partner-control); }\n.dsh-partner-task-form-dependencies label { display: grid; min-height: 36px; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: 7px; padding: 0 7px; border-radius: 7px; color: var(--partner-text-secondary); cursor: pointer; }\n.dsh-partner-task-form-dependencies label:hover { background: var(--partner-hover); }\n.dsh-partner-task-form-dependencies input { position: absolute; width: 1px !important; min-height: 1px !important; opacity: 0; pointer-events: none; }\n.dsh-partner-task-form-dependencies label > i { display: grid; width: 18px; height: 18px; place-items: center; border: 1px solid var(--partner-border); border-radius: 5px; background: var(--partner-raised); }\n.dsh-partner-task-form-dependencies input:checked + i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-task-form-dependencies input:checked + i::after { width: 7px; height: 4px; border-bottom: 2px solid var(--partner-on-accent); border-left: 2px solid var(--partner-on-accent); content: ''; transform: rotate(-45deg) translateY(-1px); }\n.dsh-partner-task-form-dependencies input:focus-visible + i { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-task-form-dependencies label > span { overflow: hidden; font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-task-form-dependencies label > small,\n.dsh-partner-task-form-dependencies > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-task-form-dependencies > p { margin: 0; padding: 12px; border: 1px dashed var(--partner-border); border-radius: 10px; color: var(--partner-text-tertiary); background: var(--partner-control); font-size: var(--partner-font-body); text-align: center; }\n.dsh-partner-schedule-time { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }\n.dsh-partner-schedule-time > label { display: grid; min-width: 0; gap: 8px; }\n.dsh-partner-schedule-time > label > span { color: var(--partner-text); font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-schedule-list { display: grid; gap: 8px; }\n.dsh-partner-schedule-list > article { display: grid; min-height: 76px; grid-template-columns: minmax(0, 1fr) auto auto 32px; align-items: center; gap: 11px; padding: 12px 13px; border: 1px solid var(--partner-separator); border-radius: 12px; background: var(--partner-raised); }\n.dsh-partner-schedule-list article > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-schedule-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-schedule-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-schedule-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-run-list { display: grid; gap: 3px; }\n.dsh-partner-run-list > article { display: grid; grid-template-columns: 10px minmax(0, 1fr); align-items: start; gap: 10px; padding: 10px 6px; border-bottom: 1px solid var(--partner-separator); }\n.dsh-partner-run-list article > i { width: 7px; height: 7px; margin-top: 7px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-run-list article[data-status=\"completed\"] > i { background: var(--partner-success); }\n.dsh-partner-run-list article[data-status=\"failed\"] > i,\n.dsh-partner-run-list article[data-status=\"timed-out\"] > i { background: var(--partner-danger); }\n.dsh-partner-run-list article > span { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-run-list strong { font-size: var(--partner-font-label); font-weight: 600; }\n.dsh-partner-run-list p { overflow: hidden; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-run-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-check { display: flex !important; min-height: 38px; align-items: center; align-self: end; gap: 8px !important; cursor: pointer; }\n.dsh-partner-check input { position: absolute; width: 1px !important; min-height: 1px !important; opacity: 0; pointer-events: none; }\n.dsh-partner-check i { display: grid; width: 20px; height: 20px; place-items: center; border: 1px solid var(--partner-border); border-radius: 6px; background: var(--partner-control); }\n.dsh-partner-check input:checked + i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-check input:checked + i::after { width: 8px; height: 4px; border-bottom: 2px solid var(--partner-on-accent); border-left: 2px solid var(--partner-on-accent); content: ''; transform: rotate(-45deg) translateY(-1px); }\n.dsh-partner-check input:focus-visible + i { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n\n@media (max-width: 820px) {\n .dsh-partner-feature-hero { align-items: start; flex-direction: column; gap: 12px; }\n .dsh-partner-feature-hero > div { width: 100%; flex-wrap: wrap; }\n .dsh-partner-board-tools { grid-template-columns: minmax(0, 1fr) minmax(130px, 168px); }\n .dsh-partner-board-tools > small { grid-column: 1 / -1; justify-self: start; }\n .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form { grid-template-columns: 1fr 1fr; }\n .dsh-partner-schedule-list > article { grid-template-columns: minmax(0, 1fr) auto 30px; }\n .dsh-partner-schedule-list > article > button:not(.is-icon):not(.dsh-partner-feature-switch) { grid-column: 1 / -1; }\n}\n\n@media (max-width: 560px) {\n .dsh-partner-feature-page { padding: 20px 14px 36px; }\n .dsh-partner-feature-block, .dsh-partner-capability-detail { padding: 14px; }\n .dsh-partner-capability-detail > header { align-items: flex-start; flex-direction: column; }\n .dsh-partner-capability-actions { width: 100%; justify-content: space-between; }\n .dsh-partner-access-list { grid-template-columns: 1fr; }\n .dsh-partner-skill-installed > article { grid-template-columns: 36px minmax(0, 1fr) auto; }\n .dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 32px; }\n .dsh-partner-skill-installed.is-binding,\n .dsh-partner-skill-picker-list { grid-template-columns: 1fr; }\n .dsh-partner-skill-installed > article > .is-icon { grid-column: 3; }\n .dsh-partner-feature-block > header { align-items: flex-start; flex-direction: column; }\n .dsh-partner-feature-block > header > div { width: 100%; flex-wrap: wrap; justify-content: flex-start; }\n .dsh-partner-board-tools { grid-template-columns: 1fr; }\n .dsh-partner-board-assignee, .dsh-partner-board-tools > small { grid-column: 1; }\n .dsh-partner-board-assignee > select { min-height: 42px; }\n .dsh-partner-board-statuses { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); }\n .dsh-partner-board-statuses > button { min-width: 0; justify-content: center; padding-inline: 6px; }\n .dsh-partner-board > section, .dsh-partner-board[data-focused=\"true\"] > section { height: min(430px, 58vh); }\n .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form { grid-template-columns: 1fr; padding: 14px; }\n :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > label { grid-column: 1 !important; }\n .dsh-partner-task-form-dependencies > div { grid-template-columns: 1fr; }\n}\n\n.dsh-partner-sidebar { box-sizing: border-box; flex: none; margin: 0 8px 8px 2px; padding: 4px 0 7px; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 62%, transparent); }\n.dsh-partner-sidebar.is-rail { width: 36px; margin: 0 0 8px; padding: 0; border: 0; }\n.dsh-partner-sidebar-heading { display: flex; align-items: stretch; height: 32px; padding: 0 4px 0 5px; }\n.dsh-partner-sidebar-title { display: flex; min-width: 0; min-height: 32px; flex: 1 1 auto; align-items: center; justify-content: flex-start; gap: 5px; padding: 0 5px; border: 0; border-radius: 7px; appearance: none; color: var(--partner-text-secondary); background: transparent; font: 600 var(--partner-font-body)/1 var(--partner-font-family); text-align: left; cursor: pointer; }\n.dsh-partner-sidebar-title > span { display: grid; place-items: center; transition: transform .16s ease; }\n.dsh-partner-sidebar-title > span[data-open=\"false\"] { transform: rotate(-90deg); }\n.dsh-partner-sidebar-title:hover,\n.dsh-partner-rail:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-sidebar-list { display: grid; grid-template-rows: 0fr; opacity: 0; transition: grid-template-rows 220ms var(--partner-ease-out), opacity 150ms ease; }\n.dsh-partner-sidebar-list.is-open { grid-template-rows: 1fr; opacity: 1; }\n.dsh-partner-sidebar-list-inner { display: grid; min-height: 0; gap: 2px; overflow: hidden; padding: 2px 1px 0; }\n.dsh-partner-sidebar-row { position: relative; isolation: isolate; display: grid; grid-template-columns: 26px minmax(0, 1fr) 7px; align-items: center; gap: 8px; width: 100%; min-height: 40px; padding: 4px 7px; overflow: hidden; border: 1px solid transparent; border-radius: 10px; color: inherit; background: transparent; text-align: left; cursor: pointer; transition: color 140ms ease, background-color 140ms ease, box-shadow 180ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-sidebar-row:hover { background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-sidebar-row.is-active { border-color: transparent; background: var(--partner-selected); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); }\n.dsh-partner-sidebar-row > span:nth-child(2) { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-sidebar-row strong,\n.dsh-partner-sidebar-row small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-sidebar-row strong { font-size: var(--partner-font-label); font-weight: 520; }\n.dsh-partner-sidebar-row small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-sidebar-row > i,\n.dsh-partner-roster-list button > i { width: 6px; height: 6px; border: 1px solid var(--partner-text-tertiary); border-radius: 50%; }\n.dsh-partner-sidebar-row > i.is-online,\n.dsh-partner-roster-list button > i.is-online { border-color: var(--partner-success); background: var(--partner-success); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-success) 12%, transparent); }\n.dsh-partner-sidebar-symbol { display: grid !important; place-items: center; width: 25px; height: 25px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-sidebar-empty { margin: 5px 9px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); }\n.dsh-partner-rail { display: grid; place-items: center; width: 36px; height: 36px; padding: 0; border: 0; border-radius: 10px; color: var(--partner-text); background: transparent; cursor: pointer; }\n.dsh-partner-rail.is-active { background: var(--partner-hover); }\n\n.dsh-partner-avatar { display: grid; place-items: center; flex: none; width: 36px; height: 36px; border: 1px solid var(--partner-border); border-radius: 12px; color: var(--partner-text); background: linear-gradient(145deg, var(--partner-glass-thick), var(--partner-control)); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); font-size: var(--partner-font-label); font-weight: 650; }\n.dsh-partner-avatar.is-small { width: 25px; height: 25px; border-radius: 8px; font-size: var(--partner-font-caption); }\n\n.dsh-partner-workspace { position: relative; isolation: isolate; display: grid; grid-template-rows: auto minmax(0, 1fr); width: 100%; height: 100%; min-width: 0; overflow: hidden; background: transparent; }\n.dsh-partner-glass-surface { position: relative; isolation: isolate; transition: opacity 180ms ease-out, border-color 180ms ease, box-shadow 220ms var(--partner-ease-out), transform 220ms var(--partner-ease-out); }\n.dsh-partner-glass-surface.is-svg { -webkit-backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); backdrop-filter: var(--partner-glass-filter-id) saturate(var(--partner-glass-saturation)); }\n.dsh-partner-glass-surface.is-fallback { -webkit-backdrop-filter: var(--partner-glass-filter); backdrop-filter: var(--partner-glass-filter); }\n.dsh-partner-glass-filter { position: absolute; z-index: -1; inset: 0; width: 100%; height: 100%; opacity: 0; pointer-events: none; }\n.dsh-partner-glass-surface.is-interactive::after {\n position: absolute;\n z-index: 2;\n inset: 1px;\n border-radius: inherit;\n background: linear-gradient(112deg, transparent 20%, color-mix(in srgb, var(--partner-glass-highlight) 86%, transparent) 48%, transparent 76%);\n -webkit-mask-image: radial-gradient(circle 180px at var(--partner-glare-x) var(--partner-glare-y), #000 0, rgba(0, 0, 0, .72) 38%, transparent 74%);\n mask-image: radial-gradient(circle 180px at var(--partner-glare-x) var(--partner-glare-y), #000 0, rgba(0, 0, 0, .72) 38%, transparent 74%);\n opacity: 0;\n pointer-events: none;\n transition: opacity 180ms ease-out;\n content: \"\";\n}\n.dsh-partner-glass-surface.is-interactive > :not(.dsh-partner-glass-filter) { position: relative; z-index: 1; }\n@media (hover: hover) {\n .dsh-partner-glass-surface.is-interactive:hover {\n border-color: color-mix(in srgb, var(--partner-border) 70%, var(--partner-text-tertiary));\n box-shadow:\n inset 0 1px 0 var(--partner-card-highlight),\n inset 0 -1px 0 var(--partner-glass-rim-shadow),\n 0 14px 32px color-mix(in srgb, var(--partner-text) 9%, transparent);\n transform: translateY(-1px);\n }\n .dsh-partner-glass-surface.is-interactive:hover::after { opacity: .72; }\n}\n.dsh-partner-topbar { position: relative; z-index: 3; display: flex; align-items: center; justify-content: space-between; min-height: 52px; margin: 8px 10px 0; padding: 7px 14px; border: 1px solid var(--partner-border); border-radius: 14px 14px 11px 11px; background: linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-highlight) 20%, transparent), transparent 58%), var(--partner-pane); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: var(--partner-glass-shadow); }\n.dsh-partner-topbar > div { display: flex; align-items: center; gap: 10px; }\n.dsh-partner-topbar > div > span:last-child { display: grid; gap: 2px; }\n.dsh-partner-topbar strong { font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-topbar small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-topbar [data-xiaohei-workspace-close] {\n display: grid;\n place-items: center;\n flex: none;\n width: 30px;\n height: 30px;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 9px;\n color: var(--partner-text-secondary);\n background: transparent;\n line-height: 1;\n cursor: pointer;\n transition: color 140ms ease, background 140ms ease, border-color 140ms ease, transform 140ms ease;\n}\n.dsh-partner-topbar [data-xiaohei-workspace-close]:hover {\n border-color: var(--partner-border);\n color: var(--partner-text);\n background: var(--partner-hover);\n}\n.dsh-partner-topbar [data-xiaohei-workspace-close]:active { transform: scale(.96); }\n.dsh-partner-topbar [data-xiaohei-workspace-close] > svg { display: block; pointer-events: none; }\n.dsh-partner-mobile-workspace-nav { display: none; }\n.dsh-partner-grid { display: grid; grid-template-columns: 214px minmax(520px, 1fr); min-width: 0; min-height: 0; padding: 8px 10px 10px; gap: 8px; }\n\n.dsh-partner-roster { position: relative; display: flex; min-width: 0; min-height: 0; flex-direction: column; padding: 17px 10px 13px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 15px; background: linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-highlight) 20%, transparent), transparent 56%), var(--partner-pane); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: var(--partner-glass-shadow); }\n.dsh-partner-roster-title { display: flex; align-items: flex-start; justify-content: space-between; padding: 0 5px 13px; }\n.dsh-partner-roster-title > span { display: grid; gap: 5px; }\n.dsh-partner-roster-title small,\n.dsh-partner-section > small,\n.dsh-partner-identity small,\n.dsh-partner-channel-card small,\n.dsh-partner-pairing-heading small,\n.dsh-partner-qr small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .12em; }\n.dsh-partner-roster-title strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-roster-title button { display: grid; place-items: center; width: 30px; height: 30px; padding: 0; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-sm); cursor: pointer; transition: color 140ms ease, background-color 140ms ease, transform 160ms var(--partner-ease-out), box-shadow 180ms ease; }\n.dsh-partner-roster-title button:hover { color: var(--partner-text); border-color: var(--partner-border); background: var(--partner-glass-thick); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); transform: translateY(-1px); }\n.dsh-partner-roster-list { display: grid; width: 100%; min-width: 0; min-height: 72px; flex: 1 1 auto; align-content: start; gap: 3px; overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; }\n.dsh-partner-roster-list button { display: grid; grid-template-columns: 36px minmax(0, 1fr) 7px; align-items: center; gap: 9px; width: 100%; min-height: 58px; padding: 9px 8px; border: 1px solid transparent; border-radius: 12px; color: inherit; background: transparent; text-align: left; cursor: pointer; transition: transform .17s cubic-bezier(.2,.8,.2,1), background .15s ease, border-color .15s ease; }\n.dsh-partner-roster-list button:hover { background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-roster-list button.is-active { transform: translateX(2px); border-color: transparent; background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-text-secondary), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-roster-list button > span:nth-child(2) { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-roster-list strong,\n.dsh-partner-roster-list small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-roster-list strong { font-size: var(--partner-font-label); font-weight: 580; }\n.dsh-partner-roster-list small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-workspace-nav { display: grid; gap: 3px; margin-top: 12px; padding: 12px 0 0; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-workspace-nav button { display: grid; grid-template-columns: 30px minmax(0, 1fr); grid-template-rows: auto auto; align-items: center; column-gap: 9px; width: 100%; min-height: 52px; padding: 7px 8px; border: 1px solid transparent; border-radius: 11px; color: var(--partner-text-secondary); background: transparent; text-align: left; cursor: pointer; transition: color 150ms ease, background-color 150ms ease, border-color 150ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-workspace-nav button:hover { color: var(--partner-text); background: var(--partner-hover); transform: translateX(1px); }\n.dsh-partner-workspace-nav button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-workspace-nav button > span { display: grid; grid-row: 1 / span 2; place-items: center; width: 29px; height: 29px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); }\n.dsh-partner-workspace-nav button.is-active > span { color: var(--partner-accent-strong); background: var(--partner-raised); }\n.dsh-partner-workspace-nav strong { align-self: end; overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-workspace-nav small { align-self: start; overflow: hidden; color: var(--partner-text-tertiary); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-roster-note { display: flex; align-items: flex-start; gap: 9px; margin-top: 0; padding: 12px 8px 2px; color: var(--partner-text-tertiary); }\n.dsh-partner-roster-note > svg { flex: none; margin-top: 1px; color: var(--partner-accent); }\n.dsh-partner-roster-note > span { display: grid; gap: 4px; }\n.dsh-partner-roster-note strong { color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-weight: 580; }\n.dsh-partner-roster-note small { font-size: var(--partner-font-caption); line-height: 1.5; }\n\n.dsh-partner-stage { position: relative; display: grid; grid-template-rows: auto auto minmax(0, 1fr); min-width: 0; min-height: 0; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 15px; background: linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-highlight) 16%, transparent), transparent 52%), var(--partner-surface); -webkit-backdrop-filter: var(--partner-frosted-filter); backdrop-filter: var(--partner-frosted-filter); box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-glass-highlight) 72%, transparent), inset 0 -1px 0 var(--partner-glass-rim-shadow), var(--partner-shadow-sm); }\n.dsh-partner-stage.is-workspace-page { grid-template-rows: minmax(0, 1fr); }\n.dsh-partner-identity { display: flex; align-items: center; gap: 12px; min-height: 86px; padding: 18px clamp(20px, 4vw, 46px) 13px; }\n.dsh-partner-identity > span:nth-child(2) { display: grid; min-width: 0; flex: 1; gap: 3px; }\n.dsh-partner-identity h1 { margin: 0; font-size: var(--partner-font-heading); line-height: 1.15; font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-identity p { margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-body); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-status { display: inline-flex; align-items: center; flex: none; gap: 6px; padding: 5px 8px; border: 1px solid var(--partner-border); border-radius: 999px; color: var(--partner-text-secondary); background: color-mix(in srgb, var(--partner-raised) 76%, transparent); font-size: var(--partner-font-caption); }\n.dsh-partner-status > i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-status.is-running > i { background: var(--partner-success); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-success) 13%, transparent); }\n.dsh-partner-status.is-starting > i { background: var(--partner-warning); }\n.dsh-partner-status.is-error > i { background: var(--partner-danger); }\n.dsh-partner-tabs { display: flex; align-items: center; gap: 3px; margin: 0 clamp(20px, 4vw, 46px); border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-tabs button { position: relative; display: inline-flex; align-items: center; gap: 6px; min-height: 37px; padding: 0 10px; border: 0; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-body); cursor: pointer; }\n.dsh-partner-tabs button::after { content: \"\"; position: absolute; right: 9px; bottom: -1px; left: 9px; height: 2px; border-radius: 99px; background: var(--partner-text); opacity: 0; transform: scaleX(.45); transition: opacity 150ms ease, transform 210ms var(--partner-ease-out); }\n.dsh-partner-tabs button:hover { color: var(--partner-text); }\n.dsh-partner-tabs button.is-active { color: var(--partner-accent-strong); }\n.dsh-partner-tabs button.is-active::after { opacity: 1; transform: scaleX(1); }\n.dsh-partner-stage-scroll { min-width: 0; min-height: 0; overflow: auto; padding: 26px clamp(22px, 4vw, 52px) 52px; overscroll-behavior: contain; }\n.dsh-partner-stage-scroll.is-workspace-page { padding: 0; }\n.dsh-partner-stage-scroll > * { animation: dsh-partner-content-enter 260ms var(--partner-ease-out) both; }\n\n.dsh-partner-home { width: min(100%, 1160px); margin: 0 auto; }\n.dsh-partner-home-heading { display: flex; align-items: end; justify-content: space-between; gap: 28px; margin: 0 2px 22px; }\n.dsh-partner-home-heading > span { display: grid; gap: 6px; }\n.dsh-partner-home-heading small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .08em; }\n.dsh-partner-home-heading h2 { margin: 0; font-size: var(--partner-font-display); line-height: 1.18; font-weight: 660; letter-spacing: -.035em; }\n.dsh-partner-home-heading p { max-width: 320px; margin: 0 0 2px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; text-align: right; }\n.dsh-partner-home-channel { display: grid; grid-template-columns: minmax(230px, .8fr) minmax(330px, 1.2fr); align-items: center; min-height: 238px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 20px; background: linear-gradient(118deg, color-mix(in srgb, var(--partner-glass-highlight) 18%, transparent), transparent 56%), var(--partner-pane); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); }\n.dsh-partner-home-route { position: relative; display: flex; align-items: center; justify-content: center; min-height: 100%; padding: 28px; background: radial-gradient(circle at 42% 50%, color-mix(in srgb, var(--partner-glass-highlight) 44%, transparent), transparent 58%); }\n.dsh-partner-home-route > .dsh-partner-avatar { position: relative; z-index: 1; width: 58px; height: 58px; border-radius: 18px; background: var(--partner-raised); box-shadow: 0 9px 28px color-mix(in srgb, var(--partner-accent-strong) 10%, transparent); font-size: var(--partner-font-title); }\n.dsh-partner-route-line { position: relative; width: clamp(58px, 7vw, 94px); height: 1px; margin: 0 10px; overflow: hidden; background: repeating-linear-gradient(90deg, color-mix(in srgb, var(--partner-accent) 25%, transparent) 0 4px, transparent 4px 9px); }\n.dsh-partner-route-line > i { position: absolute; left: 0; top: -2px; width: 5px; height: 5px; border-radius: 50%; background: var(--partner-accent); opacity: 0; transform: translateX(0); }\n.dsh-partner-home-channel.is-online .dsh-partner-route-line > i { animation: dsh-partner-route-pulse 2.4s ease-in-out infinite; }\n.dsh-partner-route-weixin { position: relative; z-index: 1; display: grid; place-items: center; width: 58px; height: 58px; border: 1px solid color-mix(in srgb, var(--partner-weixin) 18%, var(--partner-border)); border-radius: 18px; color: var(--partner-weixin); background: var(--partner-raised); box-shadow: inset 0 1px 0 var(--partner-glass-highlight), var(--partner-shadow-md); }\n.dsh-partner-home-channel-copy { position: relative; z-index: 1; display: grid; justify-items: start; gap: 8px; padding: 32px 36px 32px 12px; }\n.dsh-partner-home-kicker { display: inline-flex; align-items: center; gap: 7px; color: var(--partner-accent-strong); font-size: var(--partner-font-caption); font-weight: 680; letter-spacing: .06em; }\n.dsh-partner-home-kicker > i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-home-channel.is-online .dsh-partner-home-kicker > i { background: var(--partner-success); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-success) 11%, transparent); }\n.dsh-partner-home-channel-copy h3 { margin: 1px 0 0; font-size: var(--partner-font-title); line-height: 1.28; font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-home-channel-copy p { max-width: 510px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-home-channel-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; margin-top: 7px; }\n.dsh-partner-home-channel-actions button { min-height: 36px; padding: 0 16px; border: 1px solid color-mix(in srgb, var(--partner-accent-strong) 78%, var(--partner-glass-highlight)); border-radius: 10px; color: var(--partner-on-accent); background: var(--partner-accent-strong); box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-glass-highlight) 45%, transparent), var(--partner-shadow-sm); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; transition: transform 160ms var(--partner-ease-out), background-color 160ms ease, box-shadow 180ms ease; }\n.dsh-partner-home-channel-actions button:hover { background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); transform: translateY(-1px); }\n.dsh-partner-home-channel-actions button:active { transform: translateY(0) scale(.98); }\n.dsh-partner-home-channel-actions span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-home-details { display: grid; grid-template-columns: minmax(0, 1.18fr) minmax(260px, .82fr); gap: 12px; margin-top: 18px; }\n.dsh-partner-home-details > section {\n position: relative;\n min-width: 0;\n padding: 19px 18px 21px;\n overflow: hidden;\n border: 1px solid var(--partner-border);\n border-radius: 15px;\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--partner-glass-thick) 88%, transparent), var(--partner-glass-clear)),\n var(--partner-glass-regular);\n box-shadow:\n inset 0 1px 0 var(--partner-glass-highlight),\n inset 0 -1px 0 var(--partner-glass-rim-shadow),\n 0 8px 22px rgba(31, 31, 35, .075),\n 0 2px 5px rgba(31, 31, 35, .045);\n}\n.dsh-partner-home-details > section::after {\n position: absolute;\n top: 0;\n right: 16px;\n left: 16px;\n height: 1px;\n background: linear-gradient(90deg, transparent, var(--partner-glass-highlight), transparent);\n opacity: .72;\n pointer-events: none;\n content: \"\";\n}\n.dsh-partner-home-profile { grid-row: span 2; }\n.dsh-partner-home-details header { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto; align-items: center; gap: 10px; }\n.dsh-partner-home-details header > span { display: grid; place-items: center; width: 32px; height: 32px; border-radius: 10px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-home-details header > div { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-home-details header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-home-details header strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-home-details header button { padding: 5px 7px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-home-details header button:hover { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 6%, transparent); }\n.dsh-partner-home-profile blockquote { display: -webkit-box; margin: 17px 2px 0 44px; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.7; -webkit-box-orient: vertical; -webkit-line-clamp: 5; }\n.dsh-partner-home-capability-list { display: flex; flex-wrap: wrap; gap: 6px; margin: 14px 0 0 44px; }\n.dsh-partner-home-capability-list em { padding: 5px 8px; border-radius: 7px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-home-capability-list small,\n.dsh-partner-home-continuity > p { margin: 13px 0 0 44px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n@keyframes dsh-partner-route-pulse { 0% { opacity: 0; transform: translateX(0); } 18% { opacity: .8; } 82% { opacity: .8; } 100% { opacity: 0; transform: translateX(clamp(58px, 7vw, 94px)); } }\n\n.dsh-partner-form { width: min(100%, 1120px); margin: 0 auto; }\n.dsh-partner-form.is-identity { width: min(100%, 980px); }\n.dsh-partner-form.is-capabilities,\n.dsh-partner-form.is-channel,\n.dsh-partner-form.is-memory { width: min(100%, 1180px); }\n.dsh-partner-form.is-memory { container: partner-memory / inline-size; }\n.dsh-partner-section { position: relative; margin-bottom: 27px; padding-left: 14px; }\n.dsh-partner-section::before { position: absolute; top: 3px; bottom: 2px; left: 0; width: 2px; border-radius: 2px; background: linear-gradient(var(--partner-text-secondary), transparent 92%); content: ''; }\n.dsh-partner-section h2 { margin: 5px 0 7px; font-size: var(--partner-font-display); font-weight: 650; letter-spacing: -.035em; }\n.dsh-partner-section p { max-width: 640px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-fields { display: grid; gap: 14px; }\n.dsh-partner-fields.two { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n.dsh-partner-runtime-fields { display: grid; grid-template-columns: minmax(190px, 1.15fr) minmax(160px, .85fr) minmax(190px, 1.15fr); gap: 14px; }\n.dsh-partner-runtime-fields > .dsh-partner-field { margin-bottom: 18px; }\n.dsh-partner-field { display: grid; min-width: 0; gap: 8px; margin-bottom: 16px; }\n.dsh-partner-field > span { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }\n.dsh-partner-field strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-field small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.35; text-align: right; }\n.dsh-partner-field input,\n.dsh-partner-field textarea,\n.dsh-partner-field select { box-sizing: border-box; width: 100%; min-height: 38px; padding: 8px 10px; border: 1px solid var(--partner-border); border-radius: 10px; outline: none; color: var(--partner-text); background: var(--partner-control); font: var(--partner-font-label)/1.5 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease, background .15s ease; }\n.dsh-partner-field textarea { resize: vertical; }\n.dsh-partner-field input:focus,\n.dsh-partner-field textarea:focus,\n.dsh-partner-field select:focus { border-color: var(--partner-focus-ring); background: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 18%, transparent), inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-form-actions { display: flex; align-items: center; justify-content: space-between; min-height: 40px; padding-top: 5px; }\n.dsh-partner-form-actions > span { display: inline-flex; align-items: center; gap: 5px; color: var(--partner-accent-strong); font-size: var(--partner-font-body); }\n.dsh-partner-form-actions > button,\n.dsh-partner-state > button,\n.dsh-partner-weixin-connect > button { min-height: 34px; padding: 0 15px; border: 1px solid color-mix(in srgb, var(--partner-accent) 60%, transparent); border-radius: 10px; color: var(--partner-on-accent); background: var(--partner-accent-strong); font: 600 var(--partner-font-body)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-form-actions > button:hover,\n.dsh-partner-state > button:hover,\n.dsh-partner-weixin-connect > button:hover { background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); }\n.dsh-partner-form-actions > button:disabled,\n.dsh-partner-weixin-connect > button:disabled { opacity: .55; cursor: default; }\n.dsh-partner-identity-danger { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-top: 34px; padding-top: 17px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-identity-danger > span { display: grid; gap: 4px; }\n.dsh-partner-identity-danger strong { font-size: var(--partner-font-body); font-weight: 600; }\n.dsh-partner-identity-danger small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-identity-danger button { display: inline-flex; align-items: center; gap: 6px; min-height: 30px; padding: 0 10px; border: 1px solid color-mix(in srgb, var(--partner-danger) 24%, transparent); border-radius: 8px; color: var(--partner-danger); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-identity-danger button:disabled { opacity: .4; cursor: default; }\n.dsh-partner-inline-error,\n.dsh-partner-error { padding: 9px 11px; border: 1px solid color-mix(in srgb, var(--partner-danger) 20%, transparent); border-radius: 9px; color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 6%, transparent); font-size: var(--partner-font-body); }\n.dsh-partner-error { position: absolute; right: 18px; bottom: 14px; left: 18px; margin: 0; }\n\n.dsh-partner-capability-groups { display: grid; gap: 13px; margin: 3px 0 22px; }\n.dsh-partner-capability-group { padding: 14px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-pane) 84%, transparent); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-capability-group > header { display: flex; align-items: flex-start; justify-content: space-between; gap: 18px; padding: 1px 2px 12px; }\n.dsh-partner-capability-group > header > span { display: grid; gap: 3px; min-width: 0; }\n.dsh-partner-capability-group > header small { color: var(--partner-accent-strong); font-size: var(--partner-font-micro); font-weight: 650; letter-spacing: .12em; }\n.dsh-partner-capability-group > header strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-capability-group > header p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.45; }\n.dsh-partner-capability-group > header em { flex: none; padding: 5px 8px; border-radius: 7px; color: var(--partner-text-secondary); background: var(--partner-selected); font-size: var(--partner-font-caption); font-style: normal; font-variant-numeric: tabular-nums; }\n.dsh-partner-capabilities { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 8px; margin: 0; }\n.dsh-partner-capabilities button { position: relative; display: grid; grid-template-columns: 22px minmax(0, 1fr); gap: 3px 9px; min-height: 72px; padding: 12px; border: 1px solid var(--partner-border); border-radius: 11px; appearance: none; color: inherit; background: color-mix(in srgb, var(--partner-raised) 70%, transparent); font-family: var(--partner-font-family); text-align: left; cursor: pointer; transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-capabilities button:hover { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background: color-mix(in srgb, var(--partner-raised) 90%, var(--partner-selected)); }\n.dsh-partner-capabilities button:focus-visible { outline: 2px solid var(--partner-focus-ring); outline-offset: 2px; }\n.dsh-partner-capabilities button.is-active { border-color: color-mix(in srgb, var(--partner-accent) 30%, transparent); background: color-mix(in srgb, var(--partner-accent) 7%, var(--partner-raised)); }\n.dsh-partner-capabilities button > span { display: grid; place-items: center; grid-row: 1 / span 2; width: 19px; height: 19px; margin-top: 1px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-on-accent); }\n.dsh-partner-capabilities button.is-active > span { border-color: var(--partner-accent); background: var(--partner-accent); }\n.dsh-partner-capabilities strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-capabilities small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }\n\n.dsh-partner-weixin-connect { display: grid; grid-template-columns: 54px minmax(0, 1fr) auto; align-items: center; gap: 17px; padding: 19px; border: 1px solid var(--partner-border); border-radius: 15px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-weixin-connect > span { display: grid; gap: 4px; }\n.dsh-partner-weixin-connect strong { font-size: var(--partner-font-label); }\n.dsh-partner-weixin-connect p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; }\n.dsh-partner-weixin-connect ul { display: flex; flex-wrap: wrap; gap: 6px 15px; margin: 7px 0 0; padding: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); list-style: none; }\n.dsh-partner-weixin-connect li::before { content: \"\u00B7\"; margin-right: 4px; color: var(--partner-accent); }\n.dsh-partner-weixin-mark { display: grid; place-items: center; width: 52px; height: 52px; border: 1px solid color-mix(in srgb, var(--partner-weixin) 18%, var(--partner-border)); border-radius: 16px; color: var(--partner-weixin); background: color-mix(in srgb, var(--partner-weixin) 7%, var(--partner-raised)); }\n.dsh-partner-weixin-glyph { position: relative; display: inline-block; width: 16px; height: 14px; }\n.dsh-partner-weixin-glyph::before,\n.dsh-partner-weixin-glyph::after { content: \"\"; position: absolute; border: 1.5px solid currentColor; border-radius: 48%; }\n.dsh-partner-weixin-glyph::before { left: 0; top: 0; width: 10px; height: 8px; }\n.dsh-partner-weixin-glyph::after { right: 0; bottom: 0; width: 9px; height: 7px; background: inherit; }\n.dsh-partner-weixin-glyph i,\n.dsh-partner-weixin-glyph b { position: absolute; z-index: 1; top: 4px; width: 1.5px; height: 1.5px; border-radius: 50%; background: currentColor; }\n.dsh-partner-weixin-glyph i { left: 3px; }\n.dsh-partner-weixin-glyph b { left: 7px; }\n.dsh-partner-weixin-glyph.is-large { transform: scale(1.55); }\n.dsh-partner-qr { display: grid; grid-template-columns: 206px minmax(0, 1fr); align-items: center; gap: 27px; padding: 22px; border: 1px solid var(--partner-border); border-radius: 16px; background: color-mix(in srgb, var(--partner-raised) 74%, transparent); }\n.dsh-partner-qr-code { display: grid; place-items: center; width: 196px; height: 196px; border-radius: 14px; background: #fff; box-shadow: 0 9px 28px color-mix(in srgb, #000 7%, transparent); }\n.dsh-partner-qr > span { display: grid; justify-items: start; gap: 7px; }\n.dsh-partner-qr strong { font-size: var(--partner-font-title); }\n.dsh-partner-qr p { max-width: 300px; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-qr button { display: inline-flex; align-items: center; gap: 6px; min-height: 32px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: inherit; background: var(--partner-raised); cursor: pointer; }\n.dsh-partner-channel-card { display: grid; grid-template-columns: 52px minmax(0, 1fr) auto auto; align-items: center; gap: 14px; padding: 15px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-channel-card > span:nth-child(2) { display: grid; gap: 3px; }\n.dsh-partner-channel-card strong { font-size: var(--partner-font-label); }\n.dsh-partner-channel-card p { margin: 0; color: var(--partner-text-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; }\n.dsh-partner-switch { position: relative; width: 38px; height: 22px; padding: 0; border: 1px solid var(--partner-border); border-radius: 999px; background: color-mix(in srgb, var(--partner-text) 9%, transparent); cursor: pointer; transition: background .16s ease; }\n.dsh-partner-switch i { position: absolute; left: 3px; top: 3px; width: 14px; height: 14px; border-radius: 50%; background: var(--partner-raised); box-shadow: 0 1px 3px color-mix(in srgb, #000 16%, transparent); transition: transform .18s cubic-bezier(.2,.8,.2,1); }\n.dsh-partner-switch[data-on=\"true\"] { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-switch[data-on=\"true\"] i { transform: translateX(16px); }\n.dsh-partner-pairing-heading { display: flex; align-items: end; justify-content: space-between; margin: 25px 1px 10px; }\n.dsh-partner-pairing-heading > span { display: grid; gap: 4px; }\n.dsh-partner-pairing-heading strong { font-size: var(--partner-font-label); }\n.dsh-partner-pairing-heading em { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; }\n.dsh-partner-pairings { display: grid; gap: 5px; }\n.dsh-partner-pairings article { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto auto; align-items: center; gap: 9px; min-height: 52px; padding: 8px 9px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-pairings article > span { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: var(--partner-text-tertiary); background: var(--partner-hover); }\n.dsh-partner-pairings article > span.is-approved { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-pairings article > div { display: grid; gap: 3px; }\n.dsh-partner-pairings strong { font-size: var(--partner-font-body); }\n.dsh-partner-pairings small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-pairings button { min-height: 29px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-pairings button.is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n\n.dsh-partner-metrics { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }\n.dsh-partner-metrics article { padding: 14px; border: 1px solid var(--partner-border); border-radius: 12px; background: color-mix(in srgb, var(--partner-raised) 66%, transparent); }\n.dsh-partner-metrics small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-metrics strong { display: block; margin: 8px 0 4px; font-size: var(--partner-font-title); font-weight: 640; }\n.dsh-partner-metrics p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-session-list { display: grid; gap: 4px; margin-top: 20px; }\n.dsh-partner-session-list article { display: flex; align-items: center; gap: 10px; min-height: 48px; padding: 7px 5px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-session-list article > span { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; color: var(--partner-accent); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-session-list article > div { display: grid; min-width: 0; flex: 1; gap: 3px; }\n.dsh-partner-session-list strong { font-size: var(--partner-font-body); }\n.dsh-partner-session-list small { overflow: hidden; color: var(--partner-text-tertiary); font: var(--partner-font-caption)/1.4 ui-monospace, monospace; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-session-list button { flex: none; min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-session-list button:hover { color: var(--partner-accent-strong); border-color: color-mix(in srgb, var(--partner-accent) 24%, var(--partner-border)); }\n.dsh-partner-automation { display: grid; min-width: 0; max-width: 100%; gap: 14px; margin-top: 16px; padding: 16px; border: 1px solid var(--partner-border); border-radius: 14px; background: color-mix(in srgb, var(--partner-raised) 72%, transparent); }\n.dsh-partner-automation-grid { display: grid; min-width: 0; grid-template-columns: minmax(480px, .95fr) minmax(430px, 1.05fr); align-items: stretch; gap: 12px; margin-top: 17px; }\n.dsh-partner-automation-grid .dsh-partner-automation { align-content: start; margin-top: 0; }\n.dsh-partner-automation-grid .dsh-partner-automation:last-child .dsh-partner-automation-actions { margin-top: auto; }\n.dsh-partner-review-policy { display: grid; grid-template-columns: auto minmax(0, 1fr) 90px auto; align-items: center; gap: 10px; padding-top: 12px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-review-policy > span { display: grid; gap: 2px; }\n.dsh-partner-review-policy > span strong { font-size: var(--partner-font-body); }\n.dsh-partner-review-policy > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.4; }\n.dsh-partner-review-policy select { width: 100%; height: 32px; padding: 0 26px 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; background-color: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-review-policy > button:last-child { height: 32px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-automation > header { display: flex; align-items: center; justify-content: space-between; gap: 16px; }\n.dsh-partner-automation > header > span { display: grid; gap: 4px; }\n.dsh-partner-automation > header strong { font-size: var(--partner-font-body); }\n.dsh-partner-automation > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-automation-fields { display: grid; min-width: 0; grid-template-columns: minmax(120px, 180px); gap: 10px; }\n.dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(110px, .7fr) minmax(130px, 1fr) minmax(150px, 1.25fr); }\n.dsh-partner-automation-fields.is-heartbeat { grid-template-columns: repeat(4, minmax(100px, 1fr)); }\n.dsh-partner-concern-board { position: relative; display: grid; min-width: 0; max-width: 100%; overflow: visible; border: 1px solid var(--partner-border); border-radius: 11px; background: color-mix(in srgb, var(--partner-raised) 42%, transparent); }\n.dsh-partner-concern-board > header { display: flex; min-height: 46px; align-items: center; justify-content: space-between; gap: 14px; padding: 7px 10px 7px 12px; }\n.dsh-partner-concern-board > header > span { display: flex; min-width: 0; align-items: baseline; gap: 8px; }\n.dsh-partner-concern-board > header strong { display: flex; align-items: center; gap: 6px; font-size: var(--partner-font-body); font-weight: 640; white-space: nowrap; }\n.dsh-partner-concern-board > header strong b { display: grid; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 999px; place-items: center; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, transparent); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-concern-board > header p { min-width: 0; margin: 0; overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-board > header > button { display: inline-flex; flex: none; height: 30px; align-items: center; gap: 5px; padding: 0 9px; border: 1px solid transparent; border-radius: 8px; color: var(--partner-text-secondary); background: transparent; font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-board > header > button:hover,\n.dsh-partner-concern-board > header > button[aria-expanded=\"true\"] { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-concern-compose { display: grid; gap: 8px; padding: 10px 12px 11px; border-top: 1px solid var(--partner-border); background: color-mix(in srgb, var(--partner-control) 60%, transparent); animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-concern-compose label { display: grid; gap: 6px; }\n.dsh-partner-concern-compose label > span { color: var(--partner-text-secondary); font-size: var(--partner-font-caption); font-weight: 600; }\n.dsh-partner-concern-compose input { width: 100%; height: 36px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text); background: var(--partner-raised); font: var(--partner-font-body)/1 var(--partner-font-family); transition: border-color .15s ease, box-shadow .15s ease; }\n.dsh-partner-concern-compose input:focus-visible { border-color: color-mix(in srgb, var(--partner-accent) 55%, var(--partner-border)); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-concern-input-wrap { position: relative; min-width: 0; }\n.dsh-partner-concern-compose-hint { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 400; line-height: 1.45; }\n.dsh-partner-concern-compose-hint b { color: var(--partner-accent-strong); font-weight: 700; }\n.dsh-partner-concern-sources {\n position: absolute;\n z-index: 40;\n top: calc(100% + 6px);\n right: 0;\n left: 0;\n display: grid;\n max-height: 264px;\n overflow-y: auto;\n padding: 5px;\n border: 1px solid color-mix(in srgb, var(--partner-border) 88%, var(--partner-text) 12%);\n border-radius: 10px;\n background: var(--partner-raised);\n box-shadow: 0 14px 34px color-mix(in srgb, var(--partner-text) 15%, transparent);\n scrollbar-width: thin;\n}\n.dsh-partner-concern-sources > p { margin: 0; padding: 14px 12px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.45; }\n.dsh-partner-concern-sources > button {\n display: grid;\n min-height: 46px;\n grid-template-columns: 28px minmax(0, 1fr);\n grid-template-rows: auto auto;\n align-items: center;\n column-gap: 8px;\n padding: 6px 8px;\n border: 1px solid transparent;\n border-radius: 8px;\n color: var(--partner-text);\n background: transparent;\n text-align: left;\n cursor: pointer;\n}\n.dsh-partner-concern-sources > button > span { display: grid; grid-row: 1 / 3; width: 28px; height: 28px; place-items: center; border-radius: 8px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 9%, var(--partner-control)); }\n.dsh-partner-concern-sources > button > strong { min-width: 0; overflow: hidden; font-size: var(--partner-font-body); font-weight: 610; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-sources > button > small { min-width: 0; overflow: hidden; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 400; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-sources > button:hover,\n.dsh-partner-concern-sources > button[aria-selected=\"true\"] { border-color: color-mix(in srgb, var(--partner-accent) 22%, var(--partner-border)); background: color-mix(in srgb, var(--partner-accent) 8%, var(--partner-raised)); }\n.dsh-partner-concern-compose > div { display: flex; justify-content: flex-end; gap: 6px; }\n.dsh-partner-concern-compose button { min-height: 30px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-raised); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-compose button.is-primary { border-color: transparent; color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-concern-list { display: grid; min-height: 0; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-list > article { min-width: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 72%, transparent); background: transparent; transition: background .15s ease; }\n.dsh-partner-concern-list > article:last-child { border-bottom: 0; }\n.dsh-partner-concern-list > article:hover,\n.dsh-partner-concern-list > article[data-expanded=\"true\"] { background: color-mix(in srgb, var(--partner-accent) 4.5%, transparent); }\n.dsh-partner-concern-row { display: grid; width: 100%; min-height: 49px; grid-template-columns: 76px minmax(0, 1fr) auto 14px; align-items: center; gap: 9px; padding: 6px 11px 6px 12px; border: 0; color: inherit; background: transparent; text-align: left; cursor: pointer; }\n.dsh-partner-concern-state { display: flex; align-items: center; gap: 7px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); white-space: nowrap; }\n.dsh-partner-concern-state i { width: 6px; height: 6px; border-radius: 50%; background: var(--partner-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-accent) 9%, transparent); }\n.dsh-partner-concern-copy { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-concern-copy strong,\n.dsh-partner-concern-copy small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-copy strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-concern-copy small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-time { display: grid; justify-items: end; gap: 2px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; line-height: 1.1; white-space: nowrap; }\n.dsh-partner-concern-time small { font: inherit; }\n.dsh-partner-concern-time strong { color: var(--partner-text-secondary); font: 590 var(--partner-font-caption)/1.1 var(--partner-font-family); }\n.dsh-partner-concern-row > svg { color: var(--partner-text-tertiary); transition: transform .16s ease, color .16s ease; }\n.dsh-partner-concern-list > article[data-expanded=\"true\"] .dsh-partner-concern-row > svg { color: var(--partner-accent); transform: rotate(180deg); }\n.dsh-partner-concern-detail { display: grid; gap: 7px; padding: 0 34px 11px 97px; animation: dsh-partner-reveal .16s ease-out; }\n.dsh-partner-concern-detail p,\n.dsh-partner-concern-detail blockquote { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-concern-detail blockquote { padding-left: 9px; border-left: 2px solid color-mix(in srgb, var(--partner-accent) 40%, transparent); }\n.dsh-partner-concern-detail > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-decision { display: grid; min-width: 0; grid-template-columns: auto minmax(0, 1fr); align-items: baseline; gap: 3px 8px; padding: 7px 9px; border: 1px solid var(--partner-border); border-radius: 8px; background: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-concern-decision strong { color: var(--partner-accent-strong); font-weight: 620; white-space: nowrap; }\n.dsh-partner-concern-decision span { min-width: 0; color: var(--partner-text-secondary); line-height: 1.45; }\n.dsh-partner-concern-decision small { grid-column: 1 / -1; color: var(--partner-text-tertiary); line-height: 1.45; overflow-wrap: anywhere; }\n.dsh-partner-concern-resources { display: flex; flex-wrap: wrap; gap: 5px; }\n.dsh-partner-concern-resources span { max-width: 100%; overflow: hidden; padding: 4px 7px; border-radius: 6px; color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); font-size: var(--partner-font-caption); text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-concern-actions { display: flex; flex-wrap: wrap; gap: 5px; padding-top: 2px; }\n.dsh-partner-concern-actions button,\n.dsh-partner-concern-resolved button { min-height: 28px; padding: 0 8px; border: 1px solid var(--partner-border); border-radius: 7px; color: var(--partner-text-secondary); background: var(--partner-control); font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-actions button:hover,\n.dsh-partner-concern-resolved button:hover { color: var(--partner-accent-strong); border-color: color-mix(in srgb, var(--partner-accent) 32%, var(--partner-border)); background: color-mix(in srgb, var(--partner-accent) 7%, var(--partner-control)); }\n.dsh-partner-concern-actions button.is-danger:hover { color: var(--partner-danger); border-color: color-mix(in srgb, var(--partner-danger) 35%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 7%, var(--partner-control)); }\n.dsh-partner-concern-more { display: flex; justify-content: center; padding: 5px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-more button { min-height: 26px; padding: 0 9px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font: 540 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-concern-more button:hover { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 7%, transparent); }\n.dsh-partner-concern-empty { margin: 0; padding: 13px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.5; }\n.dsh-partner-concern-resolved { border-top: 1px solid var(--partner-border); }\n.dsh-partner-concern-resolved summary { min-height: 34px; padding: 9px 12px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); cursor: pointer; list-style: none; }\n.dsh-partner-concern-resolved summary::-webkit-details-marker { display: none; }\n.dsh-partner-concern-resolved summary::before { display: inline-block; margin-right: 7px; content: '\\203A'; transition: transform .15s ease; }\n.dsh-partner-concern-resolved[open] summary::before { transform: rotate(90deg); }\n.dsh-partner-concern-resolved summary b { margin-left: 4px; color: var(--partner-accent); font-variant-numeric: tabular-nums; }\n.dsh-partner-concern-resolved > div { display: grid; max-height: 170px; overflow-y: auto; border-top: 1px solid color-mix(in srgb, var(--partner-border) 72%, transparent); }\n.dsh-partner-concern-resolved article { display: grid; min-height: 38px; grid-template-columns: 22px minmax(0, 1fr) auto; align-items: center; gap: 7px; padding: 4px 10px; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 60%, transparent); }\n.dsh-partner-concern-resolved article > span { display: grid; width: 20px; height: 20px; border-radius: 7px; place-items: center; color: var(--partner-accent); background: color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-concern-resolved article strong { overflow: hidden; font-size: var(--partner-font-caption); font-weight: 560; text-overflow: ellipsis; white-space: nowrap; }\n@keyframes dsh-partner-reveal { from { opacity: 0; transform: translateY(-3px); } to { opacity: 1; transform: translateY(0); } }\n.dsh-partner-automation-actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 12px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-automation-actions button, .dsh-partner-section-heading button { min-height: 32px; padding: 0 12px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-automation-actions button.is-primary { color: var(--partner-raised); border-color: transparent; background: var(--partner-accent-strong); }\n.dsh-partner-automation-actions button:disabled, .dsh-partner-section-heading button:disabled { opacity: .45; cursor: default; }\n.dsh-partner-inline-notice { display: flex; align-items: center; gap: 6px; margin: 12px 0 0; color: var(--partner-accent-strong); font-size: var(--partner-font-caption); }\n.dsh-partner-section-heading { display: flex; align-items: end; justify-content: space-between; gap: 12px; margin-top: 24px; padding-bottom: 8px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-section-heading span { display: grid; gap: 3px; }\n.dsh-partner-section-heading small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); letter-spacing: .12em; }\n.dsh-partner-section-heading strong { font-size: var(--partner-font-body); }\n.dsh-partner-memory-library { margin-top: 28px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 17px; background: color-mix(in srgb, var(--partner-raised) 58%, transparent); box-shadow: 0 22px 64px color-mix(in srgb, var(--partner-accent-strong) 5%, transparent), inset 0 1px color-mix(in srgb, white 6%, transparent); }\n.dsh-partner-library-header { display: flex; align-items: end; justify-content: space-between; gap: 24px; padding: 19px 20px 0; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-library-header > span { display: grid; gap: 4px; padding-bottom: 15px; }\n.dsh-partner-library-header > span small { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 700; letter-spacing: .12em; }\n.dsh-partner-library-header > span strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.02em; }\n.dsh-partner-library-header > span p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-library-header nav { display: flex; align-self: stretch; gap: 4px; }\n.dsh-partner-library-header nav button { position: relative; padding: 0 8px; border: 0; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-library-header nav button::after { position: absolute; right: 7px; bottom: -1px; left: 7px; height: 2px; border-radius: 2px; background: var(--partner-accent); opacity: 0; content: ''; }\n.dsh-partner-library-header nav button.is-active { color: var(--partner-text); }\n.dsh-partner-library-header nav button.is-active::after { opacity: 1; }\n.dsh-partner-library-header nav b { margin-left: 4px; color: var(--partner-accent); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-library-tools { display: flex; align-items: center; gap: 12px; min-height: 53px; padding: 9px 12px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-library-tools > label { flex: 0 1 230px; }\n.dsh-partner-library-tools input { width: 100%; height: 34px; padding: 0 11px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-library-tools input::placeholder { color: var(--partner-text-tertiary); }\n.dsh-partner-memory-kinds { display: flex; min-width: 0; gap: 3px; overflow-x: auto; }\n.dsh-partner-memory-kinds button { flex: none; height: 28px; padding: 0 8px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-memory-kinds button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-memory-kinds button.is-active { color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent) 10%, transparent); }\n.dsh-partner-library-browser { display: grid; grid-template-columns: minmax(270px, 31%) minmax(0, 1fr); height: clamp(430px, 58vh, 640px); min-height: 0; overflow: hidden; }\n.dsh-partner-library-list { min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-library-list > button { display: grid; width: 100%; gap: 5px; padding: 12px 14px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; }\n.dsh-partner-library-list > button:hover { background: color-mix(in srgb, var(--partner-accent) 4%, transparent); }\n.dsh-partner-library-list > button.is-active { background: color-mix(in srgb, var(--partner-accent) 8%, transparent); box-shadow: inset 2px 0 var(--partner-accent); }\n.dsh-partner-library-list > button > span { width: max-content; color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-library-list > button > strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 610; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-library-list > button > p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-library-list > button > small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-library-list.is-diary time { color: var(--partner-accent); font: 600 var(--partner-font-caption)/1.2 var(--partner-font-family); font-variant-numeric: tabular-nums; }\n.dsh-partner-library-detail { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; padding: 24px clamp(20px, 3vw, 34px) 40px; background: radial-gradient(circle at 92% 4%, color-mix(in srgb, var(--partner-accent) 6%, transparent), transparent 34%); scrollbar-gutter: stable; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) { display: grid; align-content: start; gap: 13px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header,\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header span { color: var(--partner-accent); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .08em; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header > div { display: flex; gap: 10px; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header button { min-width: 28px; min-height: 28px; padding: 0 6px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > header button:hover { color: var(--partner-accent); }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-library-detail > article:not(.dsh-partner-diary-detail) > p { max-width: 64ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }\n.dsh-partner-library-detail progress { width: min(100px, 45%); height: 3px; overflow: hidden; border: 0; border-radius: 2px; appearance: none; background: var(--partner-border); }\n.dsh-partner-library-detail progress::-webkit-progress-bar { background: transparent; }\n.dsh-partner-library-detail progress::-webkit-progress-value { background: var(--partner-accent); }\n.dsh-partner-library-detail progress::-moz-progress-bar { background: var(--partner-accent); }\n.dsh-partner-library-detail footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-browser { display: grid; grid-template-columns: minmax(220px, 25%) minmax(0, 1fr); height: clamp(450px, 61vh, 660px); min-height: 0; overflow: hidden; }\n.dsh-partner-profile-people { min-height: 0; overflow-x: hidden; overflow-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-profile-people > button { display: grid; grid-template-columns: 32px minmax(0, 1fr) 7px; align-items: center; gap: 10px; width: 100%; min-height: 58px; padding: 9px 13px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; transition: background-color 150ms ease, box-shadow 180ms var(--partner-ease-out); }\n.dsh-partner-profile-people > button:hover { background: var(--partner-hover); }\n.dsh-partner-profile-people > button.is-active { background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent-strong); }\n.dsh-partner-profile-people > button > span { display: grid; place-items: center; width: 32px; height: 32px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-profile-people > button > div { display: grid; min-width: 0; gap: 2px; }\n.dsh-partner-profile-people strong, .dsh-partner-profile-people small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-profile-people strong { font-size: var(--partner-font-body); font-weight: 610; }\n.dsh-partner-profile-people small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-people > button > i { width: 6px; height: 6px; border: 1px solid var(--partner-text-tertiary); border-radius: 50%; }\n.dsh-partner-profile-people > button.is-active > i { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n.dsh-partner-profile-stage { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; overscroll-behavior-x: contain; overscroll-behavior-y: auto; padding: 25px clamp(20px, 3vw, 36px) 42px; scrollbar-gutter: stable; }\n.dsh-partner-profile-heading { display: flex; align-items: start; justify-content: space-between; gap: 24px; padding-bottom: 21px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-profile-heading > span { display: grid; max-width: 66ch; gap: 5px; }\n.dsh-partner-profile-heading > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .1em; }\n.dsh-partner-profile-heading > span strong { font-size: var(--partner-font-title); font-weight: 660; letter-spacing: -.025em; }\n.dsh-partner-profile-heading > span p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; }\n.dsh-partner-profile-heading > div { display: flex; flex: none; align-items: center; gap: 6px; min-height: 28px; padding: 0 9px; border: 1px solid var(--partner-border); border-radius: 999px; color: var(--partner-text-tertiary); background: var(--partner-glass-clear); font-size: var(--partner-font-caption); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-profile-heading > div > i { width: 6px; height: 6px; border: 1px solid currentColor; border-radius: 50%; }\n.dsh-partner-profile-heading > div[data-ready=\"true\"] { color: var(--partner-text-secondary); }\n.dsh-partner-profile-heading > div[data-ready=\"true\"] > i { background: currentColor; }\n.dsh-partner-profile-meta { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 17px 0 8px; padding: 13px 0; border-block: 1px solid var(--partner-separator); }\n.dsh-partner-profile-meta > span { display: grid; min-width: 0; gap: 3px; padding: 0 14px; border-left: 1px solid var(--partner-separator); }\n.dsh-partner-profile-meta > span:first-child { padding-left: 0; border-left: 0; }\n.dsh-partner-profile-meta small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-meta strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-profile-entries { display: grid; }\n.dsh-partner-profile-entries > article, .dsh-partner-profile-pending > div > article { display: grid; gap: 11px; padding: 18px 0; border-bottom: 1px solid var(--partner-separator); }\n.dsh-partner-profile-entries > article > header, .dsh-partner-profile-entries > article > footer,\n.dsh-partner-profile-pending > div > article > header, .dsh-partner-profile-pending > div > article > footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n.dsh-partner-profile-entries article > header > span, .dsh-partner-profile-pending article > header > span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .07em; }\n.dsh-partner-profile-entries article > header > div, .dsh-partner-profile-pending article > header > div { display: flex; gap: 11px; }\n.dsh-partner-profile-entries article > header button, .dsh-partner-profile-pending article > header button { min-width: 28px; min-height: 28px; padding: 0 6px; border: 0; border-radius: 7px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-profile-entries article > header button:hover, .dsh-partner-profile-pending article > header button:hover { color: var(--partner-text); }\n.dsh-partner-profile-entries article > strong, .dsh-partner-profile-pending article > strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-profile-entries article > p, .dsh-partner-profile-pending article > p { max-width: 68ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; text-wrap: pretty; }\n.dsh-partner-profile-entries progress, .dsh-partner-profile-pending progress { width: min(100px, 45%); height: 3px; overflow: hidden; border: 0; border-radius: 2px; appearance: none; background: var(--partner-border); }\n.dsh-partner-profile-entries progress::-webkit-progress-bar, .dsh-partner-profile-pending progress::-webkit-progress-bar { background: transparent; }\n.dsh-partner-profile-entries progress::-webkit-progress-value, .dsh-partner-profile-pending progress::-webkit-progress-value { background: var(--partner-accent); }\n.dsh-partner-profile-entries progress::-moz-progress-bar, .dsh-partner-profile-pending progress::-moz-progress-bar { background: var(--partner-accent); }\n.dsh-partner-profile-entries footer small, .dsh-partner-profile-pending footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-profile-pending { margin-top: 18px; border-top: 1px solid var(--partner-border); }\n.dsh-partner-profile-pending > summary { display: flex; min-height: 40px; align-items: center; gap: 6px; padding: 8px 0 2px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-weight: 610; list-style: none; cursor: pointer; }\n.dsh-partner-profile-pending > summary::-webkit-details-marker, .dsh-partner-memory-evidence > summary::-webkit-details-marker { display: none; }\n.dsh-partner-profile-pending > summary::before, .dsh-partner-memory-evidence > summary::before { display: inline-block; color: var(--partner-text-tertiary); font-size: 10px; content: '\u203A'; transform: rotate(0); transition: transform 160ms var(--partner-ease-out); }\n.dsh-partner-profile-pending[open] > summary::before, .dsh-partner-memory-evidence[open] > summary::before { transform: rotate(90deg); }\n.dsh-partner-profile-pending > summary b { margin-left: 4px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-memory-evidence { margin-top: 2px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-memory-evidence > summary { display: flex; min-height: 34px; align-items: center; gap: 5px; padding-top: 6px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); list-style: none; cursor: pointer; }\n.dsh-partner-memory-evidence > summary b { margin-left: 3px; font-weight: 620; }\n.dsh-partner-memory-evidence > div { display: grid; gap: 7px; padding-top: 9px; }\n.dsh-partner-memory-evidence blockquote { margin: 0; padding: 9px 11px; border-left: 2px solid var(--partner-border); color: var(--partner-text-secondary); background: color-mix(in srgb, var(--partner-control) 50%, transparent); }\n.dsh-partner-memory-evidence blockquote p { margin: 0; font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-memory-evidence blockquote time { display: block; margin-top: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-memory-editor { display: grid; gap: 9px; }\n.dsh-partner-memory-editor input, .dsh-partner-memory-editor textarea { box-sizing: border-box; width: 100%; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); outline: none; background: var(--partner-control); font: 500 var(--partner-font-caption)/1.5 var(--partner-font-family); }\n.dsh-partner-memory-editor input { min-height: 32px; padding: 0 10px; }\n.dsh-partner-memory-editor textarea { min-height: 76px; padding: 8px 10px; resize: vertical; }\n.dsh-partner-memory-editor input:focus, .dsh-partner-memory-editor textarea:focus { border-color: color-mix(in srgb, var(--partner-accent) 48%, var(--partner-border)); box-shadow: 0 0 0 2px color-mix(in srgb, var(--partner-accent) 8%, transparent); }\n.dsh-partner-memory-editor footer { display: flex; justify-content: flex-end; gap: 7px; }\n.dsh-partner-memory-editor button { min-height: 28px; padding: 0 10px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font: 560 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n.dsh-partner-memory-editor button.is-primary { border-color: transparent; color: var(--partner-on-accent); background: var(--partner-accent-strong); }\n.dsh-partner-diary-detail { display: grid; align-content: start; gap: 20px; }\n.dsh-partner-diary-detail > header { display: grid; gap: 5px; padding-bottom: 16px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-diary-detail > header time { color: var(--partner-accent); font: 600 var(--partner-font-caption)/1 var(--partner-font-family); font-variant-numeric: tabular-nums; }\n.dsh-partner-diary-detail > header strong { font-size: var(--partner-font-title); letter-spacing: -.02em; }\n.dsh-partner-diary-detail > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-diary-detail > p { margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.75; text-wrap: pretty; }\n.dsh-partner-diary-detail > section { display: grid; gap: 8px; }\n.dsh-partner-diary-detail > section > strong { color: var(--partner-accent-strong); font-size: var(--partner-font-caption); }\n.dsh-partner-diary-detail ul { display: grid; gap: 6px; margin: 0; padding: 0; list-style: none; }\n.dsh-partner-diary-detail li { position: relative; padding-left: 12px; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-diary-detail li::before { position: absolute; top: .62em; left: 1px; width: 3px; height: 3px; border-radius: 50%; background: var(--partner-accent); content: ''; }\n.dsh-partner-graph-audit { min-height: 0; }\n.dsh-partner-graph-toolbar { display: flex; min-height: 78px; align-items: center; justify-content: space-between; gap: 20px; padding: 13px 18px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-graph-toolbar > span { display: grid; min-width: 0; gap: 3px; }\n.dsh-partner-graph-toolbar > span small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .1em; }\n.dsh-partner-graph-toolbar > span strong { overflow: hidden; font-size: var(--partner-font-label); font-weight: 650; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-graph-toolbar > span p { margin: 0; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-toolbar > label { display: grid; flex: 0 1 220px; gap: 4px; }\n.dsh-partner-graph-toolbar > label > span { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-toolbar select { width: 100%; height: 34px; padding: 0 30px 0 10px; border: 1px solid var(--partner-border); border-radius: 9px; color: var(--partner-text); background-color: var(--partner-control); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-filters { display: flex; min-width: 0; gap: 4px; min-height: 45px; align-items: center; padding: 7px 12px; overflow-x: auto; border-bottom: 1px solid var(--partner-border); scrollbar-width: none; }\n.dsh-partner-graph-filters::-webkit-scrollbar { display: none; }\n.dsh-partner-graph-filters button { flex: none; min-height: 30px; padding: 0 9px; border: 1px solid transparent; border-radius: 8px; color: var(--partner-text-tertiary); background: transparent; font-size: var(--partner-font-caption); cursor: pointer; transition: color 140ms ease, background-color 140ms ease, border-color 140ms ease; }\n.dsh-partner-graph-filters button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-graph-filters button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); box-shadow: inset 0 1px 0 var(--partner-glass-highlight); }\n.dsh-partner-graph-filters b { margin-left: 3px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-graph-browser { display: grid; grid-template-columns: minmax(270px, 33%) minmax(0, 1fr); height: clamp(430px, 56vh, 620px); min-height: 0; overflow: hidden; }\n.dsh-partner-graph-index { min-height: 0; overflow-x: hidden; overflow-y: auto; border-right: 1px solid var(--partner-border); scrollbar-gutter: stable; }\n.dsh-partner-graph-index > button { display: grid; width: 100%; gap: 5px; padding: 12px 14px; border: 0; border-bottom: 1px solid color-mix(in srgb, var(--partner-border) 70%, transparent); color: inherit; background: transparent; text-align: left; cursor: pointer; transition: background-color 150ms ease, box-shadow 180ms var(--partner-ease-out); }\n.dsh-partner-graph-index > button:hover { background: var(--partner-hover); }\n.dsh-partner-graph-index > button.is-active { background: var(--partner-selected); box-shadow: inset 2px 0 var(--partner-accent-strong); }\n.dsh-partner-graph-index > button > span { width: max-content; padding: 3px 6px; border: 1px solid var(--partner-border); border-radius: 6px; color: var(--partner-text-secondary); background: var(--partner-glass-clear); font-size: var(--partner-font-caption); font-weight: 630; }\n.dsh-partner-graph-index > button[data-kind=\"conflicts_with\"] > span { color: var(--partner-danger); border-color: color-mix(in srgb, var(--partner-danger) 26%, var(--partner-border)); }\n.dsh-partner-graph-index strong { overflow: hidden; font-size: var(--partner-font-body); font-weight: 620; text-overflow: ellipsis; white-space: nowrap; }\n.dsh-partner-graph-index strong i { color: var(--partner-text-tertiary); font-style: normal; }\n.dsh-partner-graph-index p { display: -webkit-box; margin: 0; overflow: hidden; color: var(--partner-text-secondary); font-size: var(--partner-font-caption); line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n.dsh-partner-graph-index small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-stage { min-width: 0; min-height: 0; overflow-x: hidden; overflow-y: auto; padding: 24px clamp(20px, 3vw, 36px) 40px; scrollbar-gutter: stable; }\n.dsh-partner-graph-stage > article { display: grid; gap: 20px; animation: dsh-partner-content-enter 220ms var(--partner-ease-out) both; }\n.dsh-partner-graph-stage > article > header { display: grid; gap: 6px; padding-bottom: 18px; border-bottom: 1px solid var(--partner-border); }\n.dsh-partner-graph-stage > article > header > span { width: max-content; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 650; letter-spacing: .06em; }\n.dsh-partner-graph-stage > article[data-kind=\"conflicts_with\"] > header > span { color: var(--partner-danger); }\n.dsh-partner-graph-stage > article > header > strong { font-size: var(--partner-font-title); font-weight: 650; letter-spacing: -.025em; }\n.dsh-partner-graph-stage > article > header > strong i { color: var(--partner-text-tertiary); font-style: normal; font-weight: 450; }\n.dsh-partner-graph-stage > article > header > p { max-width: 68ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.65; }\n.dsh-partner-graph-stage > article > header > small { max-width: 72ch; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); line-height: 1.55; }\n.dsh-partner-graph-pair { display: grid; grid-template-columns: minmax(0, 1fr) 64px minmax(0, 1fr); align-items: stretch; }\n.dsh-partner-graph-pair > section { display: grid; align-content: start; gap: 9px; min-height: 170px; padding: 15px; border: 1px solid var(--partner-border); border-radius: 13px; }\n.dsh-partner-graph-pair > section > header { display: grid; gap: 3px; }\n.dsh-partner-graph-pair > section small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-pair > section strong { font-size: var(--partner-font-label); font-weight: 640; }\n.dsh-partner-graph-pair > section p { margin: 0 0 8px; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.6; overflow-wrap: anywhere; }\n.dsh-partner-graph-pair > section button { width: max-content; min-height: 30px; margin-top: auto; padding: 0 9px; border: 1px solid var(--partner-border); border-radius: 8px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-caption); cursor: pointer; }\n.dsh-partner-graph-pair > section button:hover { color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-graph-pair > div { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-pair > div i { height: 1px; background: var(--partner-border); }\n.dsh-partner-graph-pair > div span { padding: 0 5px; white-space: nowrap; }\n.dsh-partner-graph-stage > article > footer { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; padding-top: 2px; }\n.dsh-partner-graph-stage > article > footer small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); }\n.dsh-partner-graph-stage > article > footer > strong { color: var(--partner-text-secondary); font-size: var(--partner-font-body); font-variant-numeric: tabular-nums; }\n.dsh-partner-state { display: grid; place-items: center; align-content: center; min-height: 280px; padding: 30px; color: var(--partner-text-tertiary); text-align: center; }\n.dsh-partner-state > svg { margin-bottom: 10px; color: var(--partner-accent); }\n.dsh-partner-state strong { color: var(--partner-text-secondary); font-size: var(--partner-font-label); }\n.dsh-partner-state p { max-width: 330px; margin: 7px 0 14px; font-size: var(--partner-font-body); line-height: 1.55; }\n.dsh-partner-state.is-compact { min-height: 130px; }\n\n/* One material contract for every card surface in the partner workspace.\n Individual components own layout and state; this layer owns glass, edge\n refraction and elevation so visual treatment cannot drift between tabs. */\n:is(\n .dsh-partner-home-details > section,\n .dsh-partner-capabilities button,\n .dsh-partner-weixin-connect,\n .dsh-partner-qr,\n .dsh-partner-channel-card,\n .dsh-partner-metrics article,\n .dsh-partner-automation,\n .dsh-partner-concern-board,\n .dsh-partner-memory-library,\n .dsh-partner-graph-pair > section\n) {\n border-color: var(--partner-border);\n background:\n linear-gradient(118deg, color-mix(in srgb, var(--partner-card-highlight) 18%, transparent), transparent 56%),\n var(--partner-card-surface);\n box-shadow: var(--partner-card-shadow);\n}\n\n/* Editable controls share one compact translucent material. Keeping this\n separate from cards preserves hierarchy while preventing theme defaults or\n platform form colors from leaking into the workspace. */\n:is(\n .dsh-partner-field input,\n .dsh-partner-field textarea,\n .dsh-partner-field select,\n .dsh-partner-review-policy select,\n .dsh-partner-concern-compose input,\n .dsh-partner-library-tools input,\n .dsh-partner-memory-editor input,\n .dsh-partner-memory-editor textarea,\n .dsh-partner-graph-toolbar select\n) {\n background-color: var(--partner-control);\n box-shadow:\n inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 54%, transparent),\n inset 0 -1px 0 var(--partner-glass-rim-shadow);\n}\n\n:is(\n .dsh-partner-field input,\n .dsh-partner-field textarea,\n .dsh-partner-field select,\n .dsh-partner-review-policy select,\n .dsh-partner-concern-compose input,\n .dsh-partner-library-tools input,\n .dsh-partner-memory-editor input,\n .dsh-partner-memory-editor textarea,\n .dsh-partner-graph-toolbar select\n):focus {\n border-color: var(--partner-focus-ring);\n background-color: var(--partner-raised);\n box-shadow:\n 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent),\n inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 66%, transparent);\n}\n\n.dsh-partner-concern-decision {\n background: color-mix(in srgb, var(--partner-card-surface) 76%, transparent);\n box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 68%, transparent);\n}\n\n.dsh-partner-capabilities button.is-active {\n border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border));\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--partner-card-highlight) 46%, transparent), transparent 58%),\n color-mix(in srgb, var(--partner-card-surface) 90%, var(--partner-card-highlight) 10%);\n box-shadow: var(--partner-card-shadow), inset 2px 0 var(--partner-text-secondary);\n}\n\n/* Shared motion and material contract. Business components keep their own\n layout while interactive surfaces receive one consistent physical response. */\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n) {\n position: relative;\n isolation: isolate;\n overflow: hidden;\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n)::after {\n position: absolute;\n z-index: -1;\n top: -75%;\n bottom: -75%;\n left: -70%;\n width: 48%;\n border-radius: 45%;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .24), transparent);\n opacity: 0;\n transform: skewX(-18deg) translate3d(0, 0, 0);\n pointer-events: none;\n transition: opacity 140ms ease, transform 680ms var(--partner-ease-out);\n content: \"\";\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button.is-primary,\n .dsh-partner-automation-actions button.is-primary,\n .dsh-partner-concern-compose button.is-primary,\n .dsh-partner-memory-editor button.is-primary\n):hover:not(:disabled)::after {\n opacity: 1;\n transform: skewX(-18deg) translate3d(360%, 0, 0);\n}\n\n:is(\n .dsh-partner-roster-title button,\n .dsh-partner-home-details header button,\n .dsh-partner-qr button,\n .dsh-partner-pairings button,\n .dsh-partner-session-list button,\n .dsh-partner-review-policy > button:last-child,\n .dsh-partner-automation-actions button,\n .dsh-partner-section-heading button,\n .dsh-partner-concern-actions button,\n .dsh-partner-concern-resolved button,\n .dsh-partner-memory-editor button,\n .dsh-partner-graph-pair > section button\n) {\n transition:\n color 140ms ease,\n border-color 140ms ease,\n background-color 140ms ease,\n box-shadow 180ms ease,\n transform 160ms var(--partner-ease-out);\n}\n\n:is(\n .dsh-partner-home-channel-actions button,\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-pairings button,\n .dsh-partner-session-list button,\n .dsh-partner-review-policy > button:last-child,\n .dsh-partner-automation-actions button,\n .dsh-partner-section-heading button,\n .dsh-partner-concern-actions button,\n .dsh-partner-concern-resolved button,\n .dsh-partner-memory-editor button,\n .dsh-partner-graph-pair > section button\n):active:not(:disabled) {\n transform: scale(.97);\n}\n\n:is(.dsh-partner-library-list > button, .dsh-partner-graph-index > button):hover {\n border-color: var(--partner-border);\n background: var(--partner-hover);\n}\n\n.dsh-partner-home-details > section,\n.dsh-partner-metrics > article,\n.dsh-partner-automation-grid > section {\n animation: dsh-partner-item-enter 300ms var(--partner-ease-out) both;\n}\n.dsh-partner-home-details > section:nth-child(2),\n.dsh-partner-metrics > article:nth-child(2),\n.dsh-partner-automation-grid > section:nth-child(2) { animation-delay: 36ms; }\n.dsh-partner-home-details > section:nth-child(3),\n.dsh-partner-metrics > article:nth-child(3) { animation-delay: 72ms; }\n\n@keyframes dsh-partner-content-enter {\n from { opacity: 0; transform: translate3d(0, 6px, 0); }\n to { opacity: 1; transform: translate3d(0, 0, 0); }\n}\n@keyframes dsh-partner-item-enter {\n from { opacity: 0; transform: translate3d(0, 8px, 0) scale(.99); }\n to { opacity: 1; transform: translate3d(0, 0, 0) scale(1); }\n}\n\n@media (prefers-reduced-transparency: reduce) {\n :is(.dsh-partner-sidebar, .dsh-partner-workspace) {\n --partner-surface: var(--partner-solid-panel);\n --partner-pane: var(--partner-solid-panel);\n --partner-raised: var(--partner-solid-raised);\n --partner-control: var(--partner-solid-control);\n --partner-card-surface: var(--partner-solid-raised);\n }\n .dsh-partner-topbar,\n .dsh-partner-roster,\n .dsh-partner-stage,\n .dsh-partner-home-channel,\n .dsh-partner-home-details > section,\n .dsh-partner-capabilities button,\n .dsh-partner-weixin-connect,\n .dsh-partner-qr,\n .dsh-partner-channel-card,\n .dsh-partner-metrics article,\n .dsh-partner-automation,\n .dsh-partner-concern-board,\n .dsh-partner-memory-library,\n .dsh-partner-graph-pair > section { -webkit-backdrop-filter: none; backdrop-filter: none; }\n .dsh-partner-glass-surface { -webkit-backdrop-filter: none; backdrop-filter: none; }\n}\n\n@supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {\n :is(.dsh-partner-sidebar, .dsh-partner-workspace) {\n --partner-surface: var(--partner-solid-panel);\n --partner-pane: var(--partner-solid-panel);\n --partner-raised: var(--partner-solid-raised);\n --partner-control: var(--partner-solid-control);\n --partner-card-surface: var(--partner-solid-raised);\n }\n}\n\n@container partner-memory (max-width: 980px) {\n .dsh-partner-automation-grid { grid-template-columns: minmax(0, 1fr); }\n}\n\n@container partner-memory (max-width: 640px) {\n .dsh-partner-automation-fields.is-heartbeat { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-automation-fields.is-memory-model { grid-template-columns: minmax(0, 1fr); }\n .dsh-partner-review-policy { grid-template-columns: auto minmax(0, 1fr); }\n .dsh-partner-review-policy > label,\n .dsh-partner-review-policy > button:last-child { grid-column: span 1; }\n .dsh-partner-concern-board > header p { display: none; }\n .dsh-partner-concern-row { grid-template-columns: minmax(0, 1fr) auto 14px; gap: 7px; }\n .dsh-partner-concern-state { grid-column: 1; }\n .dsh-partner-concern-copy { grid-row: 2; grid-column: 1 / -1; padding-left: 13px; }\n .dsh-partner-concern-time { grid-row: 1; grid-column: 2; }\n .dsh-partner-concern-row > svg { grid-row: 1; grid-column: 3; }\n .dsh-partner-concern-detail { padding: 0 12px 11px 25px; }\n .dsh-partner-concern-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n}\n\n@media (max-width: 1080px) {\n .dsh-partner-grid { grid-template-columns: 190px minmax(400px, 1fr); }\n .dsh-partner-home-channel { grid-template-columns: minmax(190px, .7fr) minmax(300px, 1.3fr); }\n .dsh-partner-home-channel-copy { padding-right: 26px; }\n}\n@media (max-width: 760px) {\n .dsh-partner-access-list { grid-template-columns: 1fr; }\n .dsh-partner-runtime-fields { grid-template-columns: 1fr; }\n .dsh-partner-topbar { align-items: stretch; flex-direction: column; gap: 7px; padding: 7px 9px; }\n .dsh-partner-mobile-workspace-nav { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 4px; }\n .dsh-partner-mobile-workspace-nav button { display: inline-flex; min-height: 34px; align-items: center; justify-content: center; gap: 5px; padding: 0 8px; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; font: 580 var(--partner-font-caption)/1 var(--partner-font-family); cursor: pointer; }\n .dsh-partner-mobile-workspace-nav button.is-active { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-selected); }\n .dsh-partner-grid { grid-template-columns: 1fr; }\n .dsh-partner-roster { display: none; }\n .dsh-partner-identity { padding-inline: 16px; }\n .dsh-partner-tabs { margin-inline: 12px; overflow-x: auto; }\n .dsh-partner-tabs button { flex: none; }\n .dsh-partner-stage-scroll { padding: 19px 16px 38px; }\n .dsh-partner-stage-scroll.is-workspace-page { padding: 0; }\n .dsh-partner-fields.two,\n .dsh-partner-capabilities,\n .dsh-partner-metrics { grid-template-columns: 1fr; }\n .dsh-partner-capability-group { padding: 11px; }\n .dsh-partner-capability-group > header { display: grid; gap: 8px; }\n .dsh-partner-capability-group > header em { justify-self: start; }\n .dsh-partner-home-heading { display: grid; gap: 8px; }\n .dsh-partner-home-heading p { text-align: left; }\n .dsh-partner-home-channel { grid-template-columns: 1fr; }\n .dsh-partner-home-route { min-height: 128px; padding-bottom: 10px; }\n .dsh-partner-home-channel-copy { padding: 12px 22px 24px; }\n .dsh-partner-home-details { grid-template-columns: 1fr; }\n .dsh-partner-home-profile { grid-row: auto; }\n .dsh-partner-weixin-connect { grid-template-columns: 52px 1fr; }\n .dsh-partner-weixin-connect > button { grid-column: 1 / -1; }\n .dsh-partner-qr { grid-template-columns: 1fr; justify-items: center; text-align: center; }\n .dsh-partner-qr > span { justify-items: center; }\n .dsh-partner-channel-card { grid-template-columns: 45px minmax(0, 1fr) auto; }\n .dsh-partner-channel-card > .dsh-partner-status { display: none; }\n .dsh-partner-library-header { display: grid; gap: 0; }\n .dsh-partner-library-header nav { min-height: 38px; }\n .dsh-partner-library-tools { display: grid; }\n .dsh-partner-library-tools > label { width: 100%; }\n .dsh-partner-library-browser { grid-template-columns: 1fr; height: auto; overflow: visible; }\n .dsh-partner-library-list { max-height: 300px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-library-detail { min-height: 280px; }\n .dsh-partner-profile-browser { grid-template-columns: 1fr; height: auto; overflow: visible; }\n .dsh-partner-profile-people { max-height: 240px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-profile-stage { min-height: 330px; }\n .dsh-partner-profile-heading { display: grid; }\n .dsh-partner-profile-heading > div { width: max-content; }\n .dsh-partner-profile-meta { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-profile-meta > span:nth-child(3) { padding-left: 0; border-left: 0; }\n .dsh-partner-graph-toolbar { display: grid; min-height: 0; gap: 12px; }\n .dsh-partner-graph-toolbar > label { width: 100%; }\n .dsh-partner-graph-browser { grid-template-columns: 1fr; height: auto; }\n .dsh-partner-graph-index { max-height: 280px; border-right: 0; border-bottom: 1px solid var(--partner-border); }\n .dsh-partner-graph-stage { min-height: 320px; }\n .dsh-partner-graph-pair { grid-template-columns: 1fr; gap: 9px; }\n .dsh-partner-graph-pair > div { min-height: 20px; grid-template-columns: 1fr auto 1fr; }\n .dsh-partner-graph-stage > article > footer { display: grid; gap: 4px; }\n}\n@media (prefers-reduced-motion: reduce) {\n .dsh-partner-workspace *,\n .dsh-partner-sidebar * { scroll-behavior: auto !important; transition-duration: .01ms !important; animation-duration: .01ms !important; }\n}\n", ".dsh-partner-feature-hero-actions { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 8px; }\n.dsh-partner-feature-page { gap: 20px; }\n.dsh-partner-feature-hero { min-height: 92px; padding-bottom: 18px; }\n.dsh-partner-feature-hero p { max-width: 62ch; text-wrap: pretty; }\n.dsh-partner-feature-block { gap: 16px; padding: 20px; border-radius: 18px; box-shadow: inset 0 1px 0 var(--partner-card-highlight), 0 5px 16px color-mix(in srgb, var(--partner-text) 4%, transparent); }\n.dsh-partner-feature-block > header { min-height: 40px; }\n.dsh-partner-feature-block > header strong { font-size: var(--partner-font-label); letter-spacing: -.01em; }\n.dsh-partner-feature-block > header small { margin-top: 1px; }\n\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, textarea, select) { outline: 0; }\n.dsh-partner-workspace select:not([multiple]) {\n appearance: none;\n padding-right: 32px;\n border-color: var(--partner-border);\n border-radius: 9px;\n color: var(--partner-text);\n background-color: var(--partner-control);\n background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);\n background-position: calc(100% - 15px) calc(50% - 1px), calc(100% - 11px) calc(50% - 1px);\n background-repeat: no-repeat;\n background-size: 4px 4px, 4px 4px;\n box-shadow: inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 54%, transparent), inset 0 -1px 0 var(--partner-glass-rim-shadow);\n font-family: var(--partner-font-family);\n font-size: var(--partner-font-body);\n font-weight: 520;\n cursor: pointer;\n transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease;\n}\n.dsh-partner-workspace select:not([multiple]):hover:not(:disabled) { border-color: color-mix(in srgb, var(--partner-text) 24%, var(--partner-border)); background-color: var(--partner-hover); }\n.dsh-partner-workspace select:not([multiple]):focus-visible { border-color: var(--partner-focus-ring); background-color: var(--partner-raised); box-shadow: 0 0 0 3px color-mix(in srgb, var(--partner-focus-ring) 16%, transparent), inset 0 1px 0 color-mix(in srgb, var(--partner-card-highlight) 66%, transparent); }\n.dsh-partner-workspace select:not([multiple]):disabled { cursor: not-allowed; }\n.dsh-partner-workspace select option { color: var(--partner-text); background: var(--partner-solid-control); font: inherit; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer { align-items: center; margin-top: 4px; padding-top: 16px; border-top: 1px solid var(--partner-separator); }\n.dsh-partner-form-footer-spacer { flex: 1; }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer .is-primary { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > footer .is-primary:hover { color: var(--partner-on-accent); border-color: var(--partner-accent-strong); background: color-mix(in srgb, var(--partner-accent-strong) 88%, #000); }\n:is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) > .dsh-partner-workspace-notice { grid-column: 1 / -1; margin: 0; }\n.dsh-partner-feature-page button:disabled { cursor: not-allowed; opacity: .48; }\n.dsh-partner-identity-danger > div { display: flex; align-items: center; justify-content: flex-end; gap: 7px; }\n.dsh-partner-identity-danger[data-confirming=\"true\"] { margin-inline: -12px; padding: 16px 12px 0; border-top-color: color-mix(in srgb, var(--partner-danger) 30%, var(--partner-border)); background: color-mix(in srgb, var(--partner-danger) 4%, transparent); }\n.dsh-partner-identity-danger button.is-secondary { border-color: var(--partner-border); color: var(--partner-text-secondary); background: var(--partner-control); }\n.dsh-partner-identity-danger button.is-danger { color: var(--partner-on-accent); border-color: var(--partner-danger); background: var(--partner-danger); }\n.dsh-partner-profile-entries article > header button.is-danger { color: var(--partner-danger); background: color-mix(in srgb, var(--partner-danger) 8%, transparent); }\n\n.dsh-partner-skill-installed > article,\n.dsh-partner-market-grid > article,\n.dsh-partner-schedule-list > article { transition: border-color 150ms ease, background-color 150ms ease, transform 180ms var(--partner-ease-out); }\n.dsh-partner-skill-installed > article:hover,\n.dsh-partner-schedule-list > article:hover { border-color: color-mix(in srgb, var(--partner-text) 20%, var(--partner-border)); background: color-mix(in srgb, var(--partner-hover) 60%, var(--partner-raised)); transform: translate3d(0, -1px, 0); }\n.dsh-partner-schedule-meta { display: flex !important; align-items: center; flex-wrap: wrap; gap: 5px 10px !important; margin-top: 2px; }\n.dsh-partner-schedule-meta > em { position: relative; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-style: normal; font-variant-numeric: tabular-nums; }\n.dsh-partner-schedule-meta > em + em::before { position: absolute; top: 50%; left: -6px; width: 2px; height: 2px; border-radius: 50%; background: var(--partner-text-tertiary); content: \"\"; }\n.dsh-partner-run-list > article { border-radius: 9px; transition: background-color 140ms ease; }\n.dsh-partner-run-list > article:hover { background: var(--partner-hover); }\n.dsh-partner-board > section { border-radius: 16px; }\n.dsh-partner-task-card { box-shadow: none; }\n.dsh-partner-task-card[data-expanded=\"true\"] { box-shadow: 0 6px 18px color-mix(in srgb, var(--partner-text) 6%, transparent); }\n\n@media (hover: hover) {\n .dsh-partner-skill-installed .is-icon,\n .dsh-partner-schedule-list .is-icon { opacity: .34; transition: opacity 140ms ease, color 140ms ease, background-color 140ms ease; }\n .dsh-partner-skill-installed > article:hover .is-icon,\n .dsh-partner-schedule-list > article:hover .is-icon,\n .dsh-partner-skill-installed .is-icon:focus-visible,\n .dsh-partner-schedule-list .is-icon:focus-visible { opacity: 1; }\n}\n\n.dsh-partner-workspace-dialog-layer { position: absolute; z-index: 12; inset: 0; display: flex; align-items: center; justify-content: center; padding: clamp(16px, 3vw, 32px); background: var(--partner-dialog-veil); }\n.dsh-partner-workspace-dialog { position: relative; inset: auto; display: grid; grid-template-rows: auto minmax(0, 1fr); width: min(560px, 100%); max-width: none; height: auto; max-height: min(680px, 100%); margin: 0; padding: 0; overflow: hidden; border: 1px solid color-mix(in srgb, var(--partner-text) 18%, var(--partner-border)); border-radius: 16px; color: var(--partner-text); background: var(--partner-solid-panel); box-shadow: 0 22px 58px color-mix(in srgb, #000 18%, transparent), 0 4px 14px color-mix(in srgb, #000 8%, transparent), inset 0 1px 0 var(--partner-card-highlight); animation: dsh-partner-dialog-enter 200ms var(--partner-ease-out) both; }\n.dsh-partner-workspace-dialog.is-wide { width: min(680px, 100%); max-height: min(720px, 100%); }\n.dsh-partner-workspace-dialog > header { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 20px; padding: 22px 22px 18px; border-bottom: 1px solid var(--partner-separator); background: var(--partner-solid-raised); }\n.dsh-partner-workspace-dialog > header > span { display: grid; gap: 5px; min-width: 0; }\n.dsh-partner-workspace-dialog > header small { color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-weight: 680; letter-spacing: .09em; }\n.dsh-partner-workspace-dialog > header strong { font-size: var(--partner-font-title); line-height: 1.25; font-weight: 660; letter-spacing: -.025em; text-wrap: balance; }\n.dsh-partner-workspace-dialog > header p { max-width: 58ch; margin: 0; color: var(--partner-text-secondary); font-size: var(--partner-font-body); line-height: 1.55; text-wrap: pretty; }\n.dsh-partner-workspace-dialog > header button { display: grid; place-items: center; width: 32px; min-height: 32px; padding: 0; border: 1px solid transparent; border-radius: 9px; color: var(--partner-text-tertiary); background: transparent; box-shadow: none; cursor: pointer; transition: color 140ms ease, border-color 140ms ease, background-color 140ms ease, transform 140ms var(--partner-ease-out); }\n.dsh-partner-workspace-dialog > header button:hover { border-color: var(--partner-border); color: var(--partner-text); background: var(--partner-hover); }\n.dsh-partner-workspace-dialog > header button:active { transform: scale(.94); }\n.dsh-partner-workspace-dialog-body { min-width: 0; min-height: 0; overflow: auto; padding: 20px 22px 24px; overscroll-behavior: contain; scrollbar-gutter: stable; }\n.dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) { margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }\n.dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child { position: sticky; z-index: 2; bottom: -24px; margin: 4px -22px -24px; padding: 14px 22px; border-top: 1px solid var(--partner-separator); background: var(--partner-solid-raised); box-shadow: 0 -10px 24px color-mix(in srgb, #000 5%, transparent); }\n\n.dsh-partner-workspace-notice { display: grid; grid-template-columns: 7px minmax(0, 1fr); align-items: start; gap: 10px; margin: 0 0 14px; padding: 11px 13px; border: 1px solid var(--partner-border); border-radius: 10px; color: var(--partner-text-secondary); background: var(--partner-control); font-size: var(--partner-font-body); line-height: 1.5; }\n.dsh-partner-workspace-notice > i { width: 7px; height: 7px; margin-top: .42em; border-radius: 50%; background: var(--partner-text-tertiary); }\n.dsh-partner-workspace-notice.is-error { border-color: color-mix(in srgb, var(--partner-danger) 30%, var(--partner-border)); color: var(--partner-danger); }\n.dsh-partner-workspace-notice.is-error > i { background: var(--partner-danger); }\n.dsh-partner-workspace-notice.is-warning > i { background: var(--partner-warning); }\n.dsh-partner-workspace-notice.is-success > i { background: var(--partner-success); }\n\n.dsh-partner-collection-empty { display: grid; justify-items: center; padding: 38px 24px 42px; color: var(--partner-text-secondary); text-align: center; }\n.dsh-partner-collection-empty > span { display: grid; place-items: center; width: 42px; height: 42px; margin-bottom: 12px; border: 1px solid var(--partner-border); border-radius: 13px; color: var(--partner-text-tertiary); background: var(--partner-control); }\n.dsh-partner-collection-empty > strong { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 620; }\n.dsh-partner-collection-empty > p { max-width: 46ch; margin: 6px 0 14px; color: var(--partner-text-tertiary); font-size: var(--partner-font-body); line-height: 1.55; text-wrap: pretty; }\n.dsh-partner-collection-empty > button { margin-top: 14px; }\n\n.dsh-partner-collection-skeleton { display: grid; gap: 8px; padding: 6px 0; }\n.dsh-partner-collection-skeleton > i { display: block; height: 68px; overflow: hidden; border: 1px solid var(--partner-border); border-radius: 12px; background: linear-gradient(100deg, var(--partner-control) 20%, var(--partner-hover) 38%, var(--partner-control) 56%); background-size: 220% 100%; animation: dsh-partner-skeleton 1.4s ease-in-out infinite; }\n\n.dsh-partner-count-label { display: inline-flex; align-items: baseline; gap: 5px; color: var(--partner-text-tertiary); font-size: var(--partner-font-caption); font-variant-numeric: tabular-nums; }\n.dsh-partner-count-label > b { color: var(--partner-text); font-size: var(--partner-font-label); font-weight: 650; }\n\n@keyframes dsh-partner-dialog-enter { from { opacity: 0; transform: translate3d(0, 10px, 0) scale(.985); } to { opacity: 1; transform: translate3d(0, 0, 0) scale(1); } }\n@keyframes dsh-partner-skeleton { 0% { background-position: 120% 0; } 100% { background-position: -120% 0; } }\n\n@media (max-width: 760px) {\n .dsh-partner-workspace-dialog-layer { align-items: stretch; padding: 0; }\n .dsh-partner-workspace-dialog, .dsh-partner-workspace-dialog.is-wide { width: 100%; height: 100%; max-height: none; border-width: 0; border-radius: 0; }\n .dsh-partner-workspace-dialog > header { padding: 18px 18px 15px; }\n .dsh-partner-workspace-dialog-body { padding: 18px 18px 26px; }\n .dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child { bottom: -26px; margin: 4px -18px -26px; padding: 13px 18px max(13px, env(safe-area-inset-bottom)); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-partner-workspace-dialog, .dsh-partner-collection-skeleton > i { animation: none; }\n}\n", "/* Mobile composition lives separately from the desktop visual system so each\n layout can evolve without selector-specificity patches. */\n.dsh-partner-mobile-controls { display: none; }\n\n@media (max-width: 760px) {\n .dsh-partner-workspace {\n min-height: 0;\n height: 100%;\n max-height: 100dvh;\n overflow: hidden;\n font-size: 14px;\n }\n\n .dsh-partner-topbar {\n min-width: 0;\n margin: max(6px, env(safe-area-inset-top)) 6px 0;\n padding: 7px 8px 8px;\n border-radius: 14px 14px 10px 10px;\n }\n\n .dsh-partner-topbar > .dsh-partner-topbar-brand {\n display: flex;\n min-width: 0;\n min-height: 44px;\n gap: 9px;\n }\n\n .dsh-partner-topbar-brand > span:last-child { min-width: 0; }\n .dsh-partner-topbar-brand strong,\n .dsh-partner-topbar-brand small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .dsh-partner-topbar [data-xiaohei-workspace-close] { width: 44px; height: 44px; }\n\n .dsh-partner-topbar > .dsh-partner-mobile-controls {\n display: grid;\n width: 100%;\n gap: 6px;\n }\n\n .dsh-partner-mobile-companion-row { display: grid; min-width: 0; grid-template-columns: minmax(0, 1fr) 44px; gap: 6px; }\n .dsh-partner-mobile-companion-picker { position: relative; display: block; min-width: 0; }\n .dsh-partner-mobile-companion-picker::after {\n position: absolute;\n top: 50%;\n right: 16px;\n width: 7px;\n height: 7px;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n color: var(--partner-text-tertiary);\n content: '';\n transform: translateY(-70%) rotate(45deg);\n pointer-events: none;\n }\n .dsh-partner-mobile-companion-picker select {\n width: 100%;\n min-width: 0;\n min-height: 44px;\n padding: 0 38px 0 13px;\n overflow: hidden;\n border: 1px solid var(--partner-border);\n border-radius: 10px;\n color: var(--partner-text);\n background: var(--partner-control);\n background-image: none;\n box-shadow: inset 0 1px 0 var(--partner-glass-highlight);\n font: 560 16px/1.25 var(--partner-font-family);\n text-overflow: ellipsis;\n }\n .dsh-partner-mobile-create {\n display: grid;\n width: 44px;\n min-height: 44px;\n place-items: center;\n padding: 0;\n border: 1px solid var(--partner-border);\n border-radius: 10px;\n color: var(--partner-text-secondary);\n background: var(--partner-control);\n box-shadow: inset 0 1px 0 var(--partner-glass-highlight);\n }\n\n .dsh-partner-mobile-workspace-nav { gap: 6px; }\n .dsh-partner-mobile-workspace-nav button {\n min-height: 44px;\n padding: 0 9px;\n border-radius: 10px;\n font-size: 13px;\n touch-action: manipulation;\n }\n\n .dsh-partner-grid { min-width: 0; padding: 6px 6px max(6px, env(safe-area-inset-bottom)); }\n .dsh-partner-stage { min-width: 0; border-radius: 13px; }\n .dsh-partner-stage-scroll { padding: 18px 14px max(36px, calc(20px + env(safe-area-inset-bottom))); }\n\n .dsh-partner-identity { min-width: 0; min-height: 76px; padding: 13px 14px 9px; }\n .dsh-partner-identity > span:nth-child(2) { overflow: hidden; }\n .dsh-partner-identity h1 { font-size: 20px; }\n .dsh-partner-identity .dsh-partner-status { max-width: 112px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .dsh-partner-tabs { min-height: 45px; margin-inline: 8px; gap: 0; scrollbar-width: none; }\n .dsh-partner-tabs::-webkit-scrollbar { display: none; }\n .dsh-partner-tabs button { min-height: 44px; padding-inline: 11px; touch-action: manipulation; }\n\n .dsh-partner-feature-page { width: 100%; gap: 14px; padding: 18px 12px max(34px, calc(18px + env(safe-area-inset-bottom))); }\n .dsh-partner-feature-hero { min-height: 0; gap: 13px; padding: 0 2px 14px 12px; }\n .dsh-partner-feature-hero h2 { font-size: 23px; }\n .dsh-partner-feature-hero p { font-size: 14px; line-height: 1.55; }\n .dsh-partner-feature-hero > div { align-items: center; }\n .dsh-partner-feature-block,\n .dsh-partner-capability-detail { gap: 13px; padding: 14px; border-radius: 14px; }\n\n .dsh-partner-workspace :where(input:not([type=\"checkbox\"]):not([type=\"radio\"]), textarea, select) { font-size: 16px; }\n .dsh-partner-field :where(input, select),\n :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) :where(input, select),\n .dsh-partner-board-search > input,\n .dsh-partner-board-assignee > select,\n .dsh-partner-task-detail select { min-height: 44px; height: auto; }\n .dsh-partner-field textarea,\n :is(.dsh-partner-feature-form, .dsh-partner-task-form, .dsh-partner-schedule-form) textarea { min-height: 96px; }\n\n .dsh-partner-workspace :where(button:not(.dsh-partner-feature-switch)) { touch-action: manipulation; }\n .dsh-partner-feature-page :where(button:not(.dsh-partner-feature-switch)),\n .dsh-partner-form-actions > button,\n .dsh-partner-state > button,\n .dsh-partner-weixin-connect > button,\n .dsh-partner-home-channel-actions button,\n .dsh-partner-home-details header button,\n .dsh-partner-identity-danger button,\n .dsh-partner-library-header nav button,\n .dsh-partner-graph-filters button,\n .dsh-partner-graph-pair > section button { min-height: 44px; }\n .dsh-partner-feature-page .is-icon { width: 44px; min-width: 44px; min-height: 44px; }\n .dsh-partner-check { min-height: 44px; }\n .dsh-partner-feature-switch,\n .dsh-partner-feature-switch[data-on=\"true\"] {\n width: 44px;\n height: 44px;\n min-height: 44px !important;\n border-color: transparent !important;\n background: transparent !important;\n }\n .dsh-partner-feature-switch::before {\n position: absolute;\n top: 11px;\n left: 3px;\n width: 38px;\n height: 22px;\n border: 1px solid var(--partner-border);\n border-radius: 999px;\n background: color-mix(in srgb, var(--partner-text) 9%, transparent);\n content: '';\n }\n .dsh-partner-feature-switch[data-on=\"true\"]::before { border-color: var(--partner-accent-strong); background: var(--partner-accent-strong); }\n .dsh-partner-feature-switch i { top: 15px; left: 6px; }\n\n .dsh-partner-home-heading { margin-bottom: 16px; }\n .dsh-partner-home-channel { min-height: 0; border-radius: 16px; }\n .dsh-partner-home-route { min-height: 116px; padding: 20px; }\n .dsh-partner-home-channel-copy { padding: 12px 18px 20px; }\n .dsh-partner-home-channel-actions { align-items: stretch; flex-direction: column; gap: 8px; width: 100%; }\n .dsh-partner-home-channel-actions button { width: 100%; }\n .dsh-partner-home-details { gap: 10px; margin-top: 12px; }\n .dsh-partner-home-details > section { padding: 16px 14px 17px; }\n .dsh-partner-home-details header { grid-template-columns: 34px minmax(0, 1fr) auto; }\n .dsh-partner-home-profile blockquote,\n .dsh-partner-home-capability-list,\n .dsh-partner-home-capability-list small,\n .dsh-partner-home-continuity > p { margin-left: 0; }\n\n .dsh-partner-form-actions,\n .dsh-partner-identity-danger { align-items: stretch; flex-direction: column; }\n .dsh-partner-form-actions > button,\n .dsh-partner-identity-danger > div,\n .dsh-partner-identity-danger button { width: 100%; }\n .dsh-partner-identity-danger > div { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n\n .dsh-partner-skill-search,\n .dsh-partner-skill-search.is-compact { min-height: 52px; grid-template-columns: 36px minmax(0, 1fr) 44px; gap: 6px; padding: 4px 5px 4px 8px; }\n .dsh-partner-skill-search input,\n .dsh-partner-skill-search.is-compact input { height: 44px; font-size: 16px; }\n .dsh-partner-skill-search .dsh-partner-skill-search-clear { width: 44px; min-height: 44px; }\n .dsh-partner-skill-search-count { grid-column: 2 / -1; min-width: 0; padding: 0 7px 3px 0; border-left: 0; line-height: 16px; text-align: left; }\n .dsh-partner-skill-search:not(:has(.dsh-partner-skill-search-clear)) { grid-template-columns: 36px minmax(0, 1fr); }\n .dsh-partner-market-sources > button { min-height: 44px; }\n .dsh-partner-market-grid { grid-template-columns: 1fr; }\n .dsh-partner-skill-installed > article,\n .dsh-partner-skill-installed.is-market > article { grid-template-columns: 36px minmax(0, 1fr) 44px; padding: 10px; }\n .dsh-partner-skill-installed.is-binding > article { min-height: 0; grid-template-columns: 36px minmax(0, 1fr); }\n .dsh-partner-skill-installed.is-binding .dsh-partner-skill-binding-action { grid-column: 1 / -1; width: 100%; }\n .dsh-partner-skill-picker-list { max-height: min(420px, 48dvh); grid-template-columns: 1fr; }\n .dsh-partner-skill-picker-list > article { min-height: 0; }\n .dsh-partner-skill-picker-list button { width: 100%; justify-self: stretch; }\n\n .dsh-partner-board-tools { grid-template-columns: 1fr; }\n .dsh-partner-board-assignee,\n .dsh-partner-board-tools > small { grid-column: 1; }\n .dsh-partner-board-tools > small { justify-self: start; }\n .dsh-partner-board-search > button { right: 0; width: 44px; min-height: 44px; }\n .dsh-partner-board-statuses { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 5px; }\n .dsh-partner-board-statuses > button { min-width: 0; min-height: 44px; justify-content: center; gap: 4px; padding-inline: 5px; }\n .dsh-partner-board { grid-template-columns: 1fr; }\n .dsh-partner-board > section,\n .dsh-partner-board[data-focused=\"true\"] > section { height: min(430px, 55dvh); }\n .dsh-partner-board > section[data-empty=\"true\"],\n .dsh-partner-board[data-focused=\"true\"] > section[data-empty=\"true\"] { height: 112px; }\n .dsh-partner-task-fields label { grid-template-columns: 1fr; gap: 5px; }\n .dsh-partner-task-dependency > div > span { min-height: 44px; grid-template-columns: 18px minmax(0, 1fr) 52px; }\n .dsh-partner-task-dependency > div button { min-height: 44px; }\n .dsh-partner-task-actions > span { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-task-actions button { width: 100%; }\n\n .dsh-partner-schedule-time { grid-template-columns: 1fr; }\n .dsh-partner-schedule-list > article {\n min-height: 0;\n grid-template-columns: minmax(0, 1fr) 44px;\n align-items: center;\n gap: 8px;\n padding: 12px;\n }\n .dsh-partner-schedule-list > article > span:first-child { grid-column: 1 / -1; }\n .dsh-partner-schedule-list > article > .dsh-partner-feature-switch { grid-column: 1; justify-self: start; }\n .dsh-partner-schedule-list > article > button:not(.is-icon):not(.dsh-partner-feature-switch) { grid-column: 1; grid-row: 2; justify-self: end; }\n .dsh-partner-schedule-list > article > .is-icon { grid-column: 2; grid-row: 2; }\n .dsh-partner-schedule-list p,\n .dsh-partner-run-list p { white-space: normal; overflow-wrap: anywhere; }\n\n .dsh-partner-workspace-dialog > header {\n padding: max(14px, env(safe-area-inset-top)) 14px 13px;\n }\n .dsh-partner-workspace-dialog > header button { width: 44px; min-height: 44px; }\n .dsh-partner-workspace-dialog-body { padding: 16px 14px max(24px, env(safe-area-inset-bottom)); }\n .dsh-partner-workspace-dialog-body > :is(form, .dsh-partner-task-detail) > footer:last-child {\n bottom: calc(-1 * max(24px, env(safe-area-inset-bottom)));\n margin: 4px -14px calc(-1 * max(24px, env(safe-area-inset-bottom)));\n padding: 12px 14px max(12px, env(safe-area-inset-bottom));\n }\n}\n\n@media (max-width: 420px) {\n .dsh-partner-topbar-brand small { display: none; }\n .dsh-partner-feature-page { padding-inline: 10px; }\n .dsh-partner-feature-block,\n .dsh-partner-capability-detail { padding: 12px; }\n .dsh-partner-board-statuses { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .dsh-partner-profile-meta { grid-template-columns: 1fr; }\n .dsh-partner-profile-meta > span { padding-left: 0; border-left: 0; }\n}\n\n@media (max-width: 760px) and (max-height: 520px) and (orientation: landscape) {\n .dsh-partner-topbar { grid-template-columns: minmax(150px, .72fr) minmax(0, 1.28fr); align-items: center; flex-direction: row; gap: 8px; }\n .dsh-partner-mobile-controls { grid-template-columns: minmax(0, 1fr) minmax(190px, 1fr); }\n .dsh-partner-stage-scroll { padding-bottom: 20px; }\n .dsh-partner-workspace-dialog > header { padding-top: 10px; padding-bottom: 10px; }\n}\n", "export const PARTNER_API = '/partner-local/v1'\n\nexport type Capability = 'knowledge' | 'skills' | 'ssh' | 'git' | 'companions' | 'schedules' | 'access'\nexport interface AutomationView {\n memory: { enabled: boolean; retentionDays: number; provider?: string; model?: string; dailyReviewEnabled: boolean; dailyReviewHour: number }\n heartbeat: { enabled: boolean; intervalMinutes: number; quietStartHour: number; quietEndHour: number; dailyLimit: number }\n}\nexport interface CompanionView {\n id: string; name: string; role: string; description: string; instructions: string\n presetId?: string; provider?: string; model?: string; capabilities: Capability[]\n createdAt: number; updatedAt: number\n automation: AutomationView\n}\nexport interface ChannelView {\n id: string; companionId: string; accountId: string; name: string; enabled: boolean\n createdAt: number; updatedAt: number; runtimeStatus: 'stopped' | 'starting' | 'running' | 'error'\n lastError?: string; credentialConfigured: boolean\n}\nexport interface PairingView {\n id: string; channelId: string; userId: string; displayName: string\n status: 'pending' | 'approved' | 'blocked'; createdAt: number; updatedAt: number\n}\nexport interface ChannelSessionView {\n id: string; kind: 'local' | 'channel'; channelId: string; userId: string; companionId: string; sessionId: string; cwd?: string; lastMessageAt: number; archived: boolean\n}\nexport interface HeartbeatStateView {\n companionId: string; lastCheckedAt?: number; lastSentAt?: number; nextCheckAt: number\n sentDay: string; sentCount: number; consecutiveFailures: number; lastError?: string\n}\nexport type MemoryKindView = 'profile' | 'preference' | 'task' | 'event' | 'relationship' | 'emotion'\nexport interface MemoryEvidenceView { turnId: string; at: number; excerpt: string }\nexport interface MemoryView { id: string; scopeId: string; kind: MemoryKindView; subject: string; content: string; status: 'active' | 'completed' | 'superseded' | 'expired'; confidence: number; importance: number; updatedAt: number; locked?: boolean; evidence: MemoryEvidenceView[] }\nexport interface UserProfileSnapshotView { scopeId: string; label: string; version: string; updatedAt?: number; entries: MemoryView[]; evidenceCount: number; lockedCount: number }\nexport interface MemoryRelationView { id: string; scopeId: string; sourceMemoryId: string; targetMemoryId: string; kind: 'supports' | 'depends_on' | 'about' | 'conflicts_with' | 'follows'; label: string; confidence: number; updatedAt: number }\nexport interface MemoryGraphView { memories: MemoryView[]; relations: MemoryRelationView[] }\nexport interface DailyReflectionView { date: string; summary: string; events: string[]; openTasks: string[]; completedTasks: string[]; learnings: string[]; updatedAt: number; turnCount: number }\nexport interface ConcernView {\n id: string; subject: string; reason: string; origin: 'explicit' | 'implicit'; state: 'active' | 'watching' | 'snoozed' | 'resolved' | 'archived'\n priority: number; confidence: number; score: number; watchKind: 'auto' | 'knowledge' | 'workspace' | 'web'; updatedAt: number; nextCheckAt: number; lastCheckedAt?: number\n resources: Array<{ kind: 'file' | 'knowledge'; locator: string; label: string }>\n}\nexport interface ConcernObservationView {\n id: string; concernId: string; event: string; evidence: string; source: string; interruptScore: number\n decision: 'drop' | 'remember' | 'defer' | 'feed' | 'notify'; notificationRuleEffect: 'auto' | 'notify' | 'suppress'\n notificationRuleReason: string; decisionReason: string; createdAt: number; mentionedAt?: number\n}\nexport interface ConcernActivityView { concerns: ConcernView[]; observations: ConcernObservationView[] }\nexport interface ConcernSourceView { kind: 'file' | 'knowledge'; label: string; detail: string; token: string }\nexport interface PresetView { id: string; name: string; broken?: string }\nexport interface ModelCatalogView { providers: Array<{ id: string; name: string; models: Array<{ id: string; name: string }> }>; defaultSelection: { provider: string; model: string } }\nexport interface PartnerSnapshot {\n companions: CompanionView[]; channels: ChannelView[]; pairings: PairingView[]; sessions: ChannelSessionView[]; heartbeatStates: HeartbeatStateView[]; presets: PresetView[]\n}\nexport interface LoginView {\n id: string; companionId: string; phase: 'waiting' | 'scanned' | 'confirmed' | 'expired' | 'error'\n qrContent?: string; accountId?: string; baseUrl?: string; error?: string; expiresAt: number\n}\n\nexport interface SkillView {\n id: string; name: string; displayName: string; description: string; version: string\n source: 'builtin' | 'market' | 'local'; sourceId?: string; executionContext: 'inline' | 'fork'; trusted: boolean; updatedAt: number\n}\nexport interface SkillBindingView { companionId: string; skillId: string; enabled: boolean }\nexport interface SkillMarketSourceView { id: string; name: string; kind: 'dsh-index' | 'clawhub' | 'loophub' | 'skillhub'; indexUrl: string; enabled: boolean; trusted: boolean; builtin?: boolean }\nexport interface MarketSkillView { id: string; name: string; description: string; version: string; tags: string[]; sourceId: string }\nexport interface SkillCatalogView { installed: SkillView[]; bindings: SkillBindingView[]; sources: SkillMarketSourceView[] }\nexport interface SkillMarketView { sources: SkillMarketSourceView[]; entries: MarketSkillView[]; errors: Array<{ sourceId: string; error: string }> }\nexport interface SkillMarketNetworkView { proxyUrl?: string }\nexport interface SkillMarketNetworkTestView { ok: true; latencyMs: number; sourceCount: number; entryCount: number }\n\nexport type BoardTaskStatusView = 'backlog' | 'ready' | 'doing' | 'review' | 'done' | 'blocked'\nexport interface BoardTaskView {\n id: string; title: string; description: string; status: BoardTaskStatusView; priority: 'low' | 'normal' | 'high' | 'urgent'\n assigneeCompanionId?: string; reviewerCompanionId?: string; createdBy: 'user' | 'companion' | 'schedule'; revision: number; createdAt: number; updatedAt: number; completedAt?: number\n skillIds: string[]; dependencyTaskIds: string[]; resultAbstract?: string; resultSummary?: string; reviewHandoff?: string; reviewSummary?: string; dueAt?: number\n}\nexport interface TaskActivityView { id: string; taskId: string; actor: 'user' | 'companion' | 'schedule' | 'system'; actorCompanionId?: string; kind: string; message: string; at: number }\nexport interface TaskBoardView { tasks: BoardTaskView[]; activities: TaskActivityView[] }\nexport interface PartnerDirectoryEntryView { id: string; name: string; role: string; description: string; capabilities: string[]; enabledSkills: Array<{ id: string; name: string }>; availability: 'available' | 'busy' | 'offline' }\nexport interface PartnerDelegationView {\n id: string; kind?: 'task' | 'review'; taskId: string; toCompanionId: string; status: 'queued' | 'running' | 'completed' | 'failed' | 'canceled'\n attempts?: number; nextAttemptAt?: number; lastAttemptAt?: number; error?: string; createdAt: number\n}\nexport interface CompanionAccessView { targetIds: string[]; companions: PartnerDirectoryEntryView[] }\n\nexport interface ScheduledTaskView {\n id: string; companionId: string; title: string; prompt: string\n schedule: { kind: 'interval'; minutes: number } | { kind: 'daily'; hour: number; minute: number }\n enabled: boolean; destroySessionAfterRun: boolean; overlapPolicy: 'skip' | 'queue'; timeoutMinutes: number\n nextRunAt: number; lastRunAt?: number; lastRunStatus?: 'completed' | 'failed' | 'skipped'; createdAt: number; updatedAt: number\n}\nexport interface ExecutionRunView { id: string; kind: 'schedule' | 'delegation' | 'review' | 'skill'; ownerCompanionId: string; sessionId: string; sourceId: string; status: string; destroyAfterRun: boolean; startedAt: number; completedAt?: number; outputSummary?: string; error?: string }\n\nexport async function api<T>(path = '', init: RequestInit = {}): Promise<T> {\n const method = init.method ?? 'GET'\n const response = await fetch(`${PARTNER_API}${path}`, {\n ...init,\n headers: {\n Accept: 'application/json',\n ...(method === 'GET' ? {} : { 'Content-Type': 'application/json', 'X-DSH-Partner-Request': '1' }),\n ...init.headers,\n },\n })\n if (response.status === 204) return undefined as T\n const body = await response.json().catch(() => ({})) as Record<string, unknown>\n if (!response.ok) throw new Error(typeof body.error === 'string' ? body.error : `HTTP ${response.status}`)\n return body as T\n}\n\nexport function loadPartner(): Promise<PartnerSnapshot> { return api() }\n", "import { useEffect, type RefObject } from 'react'\n\nexport function useWorkspaceTopAnchor(ref: RefObject<HTMLElement>): void {\n useEffect(() => {\n const element = ref.current\n const originalParent = element?.parentElement\n if (!element || !originalParent) return\n let moved = false\n let observer: MutationObserver | undefined\n const place = (): boolean => {\n let ancestor: HTMLElement | null = element.parentElement\n while (ancestor && ancestor !== document.body) {\n const candidate = ancestor.previousElementSibling\n if (candidate instanceof HTMLElement) {\n const style = getComputedStyle(candidate)\n if (style.display === 'flex' && style.flexDirection === 'column' && Number.parseFloat(style.flexGrow) > 0) {\n candidate.insertBefore(element, candidate.firstChild)\n moved = true\n return true\n }\n }\n ancestor = ancestor.parentElement\n }\n return false\n }\n if (!place()) {\n observer = new MutationObserver(() => { if (place()) observer?.disconnect() })\n observer.observe(document.body, { childList: true, subtree: true })\n }\n return () => {\n observer?.disconnect()\n if (moved && originalParent.isConnected) originalParent.append(element)\n }\n }, [ref])\n}\n", "export function futureTime(value: number, now = Date.now()): string {\n const minutes = Math.ceil((value - now) / 60_000)\n if (minutes <= 0) return '\u5373\u5C06\u68C0\u67E5'\n if (minutes < 60) return `${minutes} \u5206\u949F\u540E`\n const hours = Math.ceil(minutes / 60)\n if (hours < 24) return `${hours} \u5C0F\u65F6\u540E`\n const days = Math.ceil(hours / 24)\n if (days <= 7) return `${days} \u5929\u540E`\n const date = new Date(value)\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n const hour = String(date.getHours()).padStart(2, '0')\n const minute = String(date.getMinutes()).padStart(2, '0')\n return `${month}/${day} ${hour}:${minute}`\n}\n", "import {\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\ntype GlassElement = 'header' | 'aside' | 'section' | 'article' | 'div' | 'button'\n\ninterface GlassSurfaceProps extends Omit<HTMLAttributes<HTMLElement>, 'children' | 'className'> {\n as: GlassElement\n children: ReactNode\n className: string\n borderRadius: number\n borderWidth?: number\n brightness?: number\n blur?: number\n distortionScale?: number\n interactive?: boolean\n opacity?: number\n saturation?: number\n type?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n}\n\ninterface GlassStyle extends CSSProperties {\n '--partner-glass-filter-id': string\n '--partner-glass-saturation': number\n '--partner-glare-x': string\n '--partner-glare-y': string\n}\n\nfunction supportsSvgBackdropFilter(filterId: string): boolean {\n if (typeof window === 'undefined' || typeof document === 'undefined') return false\n if (window.matchMedia('(prefers-reduced-transparency: reduce)').matches) return false\n const userAgent = navigator.userAgent\n if (/Firefox/i.test(userAgent) || (/Safari/i.test(userAgent) && !/(Chrome|Chromium|CriOS)/i.test(userAgent))) return false\n const probe = document.createElement('div')\n probe.style.backdropFilter = `url(#${filterId})`\n return probe.style.backdropFilter !== ''\n}\n\nfunction displacementMap(\n width: number,\n height: number,\n radius: number,\n borderWidth: number,\n brightness: number,\n opacity: number,\n blur: number,\n redGradientId: string,\n blueGradientId: string,\n): string {\n const edge = Math.max(1, Math.min(width, height) * borderWidth * .5)\n const innerWidth = Math.max(1, width - edge * 2)\n const innerHeight = Math.max(1, height - edge * 2)\n const svg = `<svg viewBox=\"0 0 ${width} ${height}\" xmlns=\"http://www.w3.org/2000/svg\">\n <defs>\n <linearGradient id=\"${redGradientId}\" x1=\"100%\" y1=\"0%\" x2=\"0%\" y2=\"0%\"><stop offset=\"0%\" stop-color=\"#0000\"/><stop offset=\"100%\" stop-color=\"red\"/></linearGradient>\n <linearGradient id=\"${blueGradientId}\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"><stop offset=\"0%\" stop-color=\"#0000\"/><stop offset=\"100%\" stop-color=\"blue\"/></linearGradient>\n </defs>\n <rect width=\"${width}\" height=\"${height}\" fill=\"black\"/>\n <rect width=\"${width}\" height=\"${height}\" rx=\"${radius}\" fill=\"url(#${redGradientId})\"/>\n <rect width=\"${width}\" height=\"${height}\" rx=\"${radius}\" fill=\"url(#${blueGradientId})\" style=\"mix-blend-mode:difference\"/>\n <rect x=\"${edge}\" y=\"${edge}\" width=\"${innerWidth}\" height=\"${innerHeight}\" rx=\"${radius}\" fill=\"hsl(0 0% ${brightness}% / ${opacity})\" style=\"filter:blur(${blur}px)\"/>\n </svg>`\n return `data:image/svg+xml,${encodeURIComponent(svg)}`\n}\n\nexport function GlassSurface({\n as: Element,\n children,\n className,\n borderRadius,\n borderWidth = .07,\n brightness = 50,\n blur = 11,\n distortionScale = -26,\n interactive = false,\n opacity = .93,\n saturation = 1.16,\n ...elementProps\n}: GlassSurfaceProps): JSX.Element {\n const uniqueId = useId().replace(/:/g, '-')\n const filterId = `partner-glass-filter-${uniqueId}`\n const redGradientId = `partner-glass-red-${uniqueId}`\n const blueGradientId = `partner-glass-blue-${uniqueId}`\n const containerRef = useRef<HTMLElement>(null)\n const imageRef = useRef<SVGFEImageElement>(null)\n const redRef = useRef<SVGFEDisplacementMapElement>(null)\n const greenRef = useRef<SVGFEDisplacementMapElement>(null)\n const blueRef = useRef<SVGFEDisplacementMapElement>(null)\n const glareFrameRef = useRef(0)\n const glarePointerRef = useRef<{ clientX: number; clientY: number }>()\n const [svgSupported, setSvgSupported] = useState(false)\n\n useEffect(() => {\n setSvgSupported(supportsSvgBackdropFilter(filterId))\n }, [filterId])\n\n useEffect(() => {\n if (!svgSupported) return\n const element = containerRef.current\n const image = imageRef.current\n if (element === null || image === null) return\n let frame = 0\n let previousWidth = 0\n let previousHeight = 0\n const update = (): void => {\n frame = 0\n const rect = element.getBoundingClientRect()\n const width = Math.max(1, Math.round(rect.width))\n const height = Math.max(1, Math.round(rect.height))\n if (width === previousWidth && height === previousHeight) return\n previousWidth = width\n previousHeight = height\n image.setAttribute('href', displacementMap(\n width,\n height,\n Math.min(borderRadius, Math.min(width, height) / 2),\n borderWidth,\n brightness,\n opacity,\n blur,\n redGradientId,\n blueGradientId,\n ))\n }\n const schedule = (): void => {\n if (frame === 0) frame = requestAnimationFrame(update)\n }\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(schedule)\n observer?.observe(element)\n schedule()\n return () => {\n if (frame !== 0) cancelAnimationFrame(frame)\n observer?.disconnect()\n }\n }, [blueGradientId, blur, borderRadius, borderWidth, brightness, opacity, redGradientId, svgSupported])\n\n useEffect(() => {\n if (!svgSupported) return\n const channels = [redRef.current, greenRef.current, blueRef.current]\n const offsets = [0, 5, 10]\n channels.forEach((channel, index) => channel?.setAttribute('scale', String(distortionScale + (offsets[index] ?? 0))))\n }, [distortionScale, svgSupported])\n\n useEffect(() => () => {\n if (glareFrameRef.current !== 0) cancelAnimationFrame(glareFrameRef.current)\n }, [])\n\n const renderGlare = (): void => {\n glareFrameRef.current = 0\n const element = containerRef.current\n if (element === null) return\n const pointer = glarePointerRef.current\n if (pointer === undefined) {\n element.style.setProperty('--partner-glare-x', '50%')\n element.style.setProperty('--partner-glare-y', '50%')\n return\n }\n const rect = element.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) return\n const x = Math.max(0, Math.min(100, (pointer.clientX - rect.left) / rect.width * 100))\n const y = Math.max(0, Math.min(100, (pointer.clientY - rect.top) / rect.height * 100))\n element.style.setProperty('--partner-glare-x', `${x}%`)\n element.style.setProperty('--partner-glare-y', `${y}%`)\n }\n const scheduleGlare = (): void => {\n if (glareFrameRef.current === 0) glareFrameRef.current = requestAnimationFrame(renderGlare)\n }\n const moveGlare = (clientX: number, clientY: number): void => {\n if (!interactive) return\n glarePointerRef.current = { clientX, clientY }\n scheduleGlare()\n }\n const resetGlare = (): void => {\n if (!interactive) return\n glarePointerRef.current = undefined\n scheduleGlare()\n }\n\n const style: GlassStyle = {\n '--partner-glass-filter-id': `url(#${filterId})`,\n '--partner-glass-saturation': saturation,\n '--partner-glare-x': '50%',\n '--partner-glare-y': '50%',\n }\n\n return <Element\n {...elementProps}\n ref={containerRef as never}\n className={`dsh-partner-glass-surface ${svgSupported ? 'is-svg' : 'is-fallback'}${interactive ? ' is-interactive' : ''} ${className}`}\n style={style}\n onPointerMove={interactive ? event => moveGlare(event.clientX, event.clientY) : undefined}\n onPointerLeave={interactive ? resetGlare : undefined}\n >\n {svgSupported && <svg className=\"dsh-partner-glass-filter\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\">\n <defs>\n <filter id={filterId} colorInterpolationFilters=\"sRGB\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\">\n <feImage ref={imageRef} x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\" result=\"map\" />\n <feDisplacementMap ref={redRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-red\" />\n <feColorMatrix in=\"displaced-red\" type=\"matrix\" values=\"1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0\" result=\"red\" />\n <feDisplacementMap ref={greenRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-green\" />\n <feColorMatrix in=\"displaced-green\" type=\"matrix\" values=\"0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0\" result=\"green\" />\n <feDisplacementMap ref={blueRef} in=\"SourceGraphic\" in2=\"map\" result=\"displaced-blue\" />\n <feColorMatrix in=\"displaced-blue\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0\" result=\"blue\" />\n <feBlend in=\"red\" in2=\"green\" mode=\"screen\" result=\"red-green\" />\n <feBlend in=\"red-green\" in2=\"blue\" mode=\"screen\" result=\"output\" />\n <feGaussianBlur in=\"output\" stdDeviation=\".45\" />\n </filter>\n </defs>\n </svg>}\n {children}\n </Element>\n}\n", "import { useCallback, useEffect, useMemo, useState, type FormEvent } from 'react'\nimport { IconCheckOutline16, IconCloseOutline16, IconPlusOutline16, IconRefreshOutline16, IconSearchOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type MarketSkillView, type SkillCatalogView, type SkillMarketNetworkTestView, type SkillMarketNetworkView, type SkillMarketView } from '../client-api.js'\nimport { CollectionEmpty, CollectionSkeleton, WorkspaceBlock, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport function SkillsPanel(): JSX.Element {\n const [catalog, setCatalog] = useState<SkillCatalogView>({ installed: [], bindings: [], sources: [] })\n const [market, setMarket] = useState<SkillMarketView>({ sources: [], entries: [], errors: [] })\n const [query, setQuery] = useState('')\n const [activeSource, setActiveSource] = useState('market-clawhub')\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const [actionError, setActionError] = useState<{ kind: 'install' | 'uninstall'; id: string; message: string }>()\n const [addingSource, setAddingSource] = useState(false)\n const [creatingSkill, setCreatingSkill] = useState(false)\n const [editingNetwork, setEditingNetwork] = useState(false)\n const [showAllInstalled, setShowAllInstalled] = useState(false)\n const [network, setNetwork] = useState<SkillMarketNetworkView>({})\n const load = useCallback(async (refresh = false) => {\n try {\n const [nextCatalog, nextMarket, nextNetwork] = await Promise.all([\n api<SkillCatalogView>('/skills'), api<SkillMarketView>(`/skills/market${refresh ? '?refresh=1' : ''}`), api<SkillMarketNetworkView>('/skill-markets/network'),\n ])\n setCatalog(nextCatalog); setMarket(nextMarket); setNetwork(nextNetwork); setError(undefined)\n } catch (reason) { setError(errorMessage(reason)) } finally { setLoading(false) }\n }, [])\n useEffect(() => { void load() }, [load])\n const installed = new Map(catalog.installed.map(item => [item.id, item]))\n const visibleInstalled = showAllInstalled ? catalog.installed : catalog.installed.slice(0, 4)\n const visible = useMemo(() => {\n const normalized = query.trim().toLocaleLowerCase()\n return market.entries.filter(item => (item.sourceId === activeSource) && (!normalized || `${item.name} ${item.description} ${item.tags.join(' ')}`.toLocaleLowerCase().includes(normalized)))\n }, [activeSource, market.entries, query])\n const sources = [{ id: 'builtin', name: '\u5185\u7F6E\u7CBE\u9009' }, ...market.sources.map(source => ({ id: source.id, name: source.name }))]\n const sourceCounts = useMemo(() => market.entries.reduce((counts, entry) => {\n counts.set(entry.sourceId, (counts.get(entry.sourceId) ?? 0) + 1)\n return counts\n }, new Map<string, number>()), [market.entries])\n const install = async (entry: MarketSkillView): Promise<void> => {\n setBusy(entry.id); setActionError(undefined)\n try {\n await api('/skills/market/install', { method: 'POST', body: JSON.stringify({ sourceId: entry.sourceId, entryId: entry.id }) })\n await load()\n } catch (reason) { setActionError({ kind: 'install', id: entry.id, message: errorMessage(reason) }) } finally { setBusy(undefined) }\n }\n const uninstall = async (id: string): Promise<void> => {\n setBusy(id); setActionError(undefined)\n try { await api(`/skills/${encodeURIComponent(id)}`, { method: 'DELETE' }); await load() }\n catch (reason) { setActionError({ kind: 'uninstall', id, message: errorMessage(reason) }) } finally { setBusy(undefined) }\n }\n return <div className=\"dsh-partner-feature-page\">\n <WorkspaceHero eyebrow=\"Capability catalog\" title=\"Skill \u5E02\u573A\" detail=\"\u96C6\u4E2D\u5B89\u88C5\u548C\u7EF4\u62A4\u5DE5\u4F5C\u80FD\u529B\uFF1B\u5B89\u88C5\u540E\uFF0C\u518D\u4E3A\u9700\u8981\u5B83\u7684\u4F19\u4F34\u5355\u72EC\u542F\u7528\u3002\" actions={<button type=\"button\" disabled={loading} onClick={() => { void load(true) }}><IconRefreshOutline16 size={15} />{loading ? '\u540C\u6B65\u4E2D\u2026' : '\u5237\u65B0\u5E02\u573A'}</button>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {creatingSkill && <WorkspaceDialog title=\"\u65B0\u5EFA Skill\" detail=\"\u521B\u5EFA\u4E00\u4E2A\u53EF\u590D\u7528\u7684\u5DE5\u4F5C\u6D41\u7A0B\uFF0C\u5E76\u660E\u786E\u6267\u884C\u4E0A\u4E0B\u6587\u3001\u5DE5\u5177\u8FB9\u754C\u548C\u9A8C\u6536\u6307\u4EE4\u3002\" close={() => setCreatingSkill(false)} width=\"wide\"><NewSkillForm existingIds={catalog.installed.map(skill => skill.id)} close={() => setCreatingSkill(false)} changed={load} /></WorkspaceDialog>}\n {editingNetwork && <WorkspaceDialog title=\"\u5E02\u573A\u7F51\u7EDC\u8BBE\u7F6E\" detail=\"\u914D\u7F6E Skill \u7D22\u5F15\u548C\u5B89\u88C5\u5305\u4E0B\u8F7D\u5171\u7528\u7684 HTTP \u4EE3\u7406\uFF0C\u5E76\u5728\u4FDD\u5B58\u524D\u6D4B\u8BD5\u8FDE\u901A\u6027\u3002\" close={() => setEditingNetwork(false)}><NetworkSettingsForm value={network} close={() => setEditingNetwork(false)} changed={async next => { setNetwork(next); await load(true) }} /></WorkspaceDialog>}\n {addingSource && <WorkspaceDialog title=\"\u6DFB\u52A0\u5E02\u573A\u6765\u6E90\" detail=\"\u63A5\u5165\u56E2\u961F\u6216\u4E2A\u4EBA\u7EF4\u62A4\u7684 Skill \u7D22\u5F15\u3002\u81EA\u5B9A\u4E49\u6765\u6E90\u9ED8\u8BA4\u6309\u4E0D\u53EF\u4FE1\u6765\u6E90\u9694\u79BB\u6267\u884C\u3002\" close={() => setAddingSource(false)}><MarketSourceForm close={() => setAddingSource(false)} changed={() => load(true)} /></WorkspaceDialog>}\n <WorkspaceBlock title=\"\u5DF2\u5B89\u88C5\" detail={`${catalog.installed.length} \u4E2A\u53EF\u4F9B\u4F19\u4F34\u4F7F\u7528`} actions={<button type=\"button\" onClick={() => setCreatingSkill(true)}><IconPlusOutline16 size={14} />\u65B0\u5EFA Skill</button>}>\n {loading ? <CollectionSkeleton rows={2} /> : catalog.installed.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u5B89\u88C5 Skill\" detail=\"\u53EF\u4EE5\u521B\u5EFA\u81EA\u5DF1\u7684 Skill\uFF0C\u6216\u4ECE\u4E0B\u65B9\u5E02\u573A\u9009\u62E9\u3002\" action={<button type=\"button\" onClick={() => setCreatingSkill(true)}><IconPlusOutline16 size={14} />\u65B0\u5EFA\u7B2C\u4E00\u4E2A Skill</button>} /> : <><div className=\"dsh-partner-skill-installed is-market\">{visibleInstalled.map(skill => <article key={skill.id}>\n <span className=\"dsh-partner-skill-mark\"><IconCheckOutline16 size={16} /></span><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.version} \u00B7 {skill.executionContext === 'fork' ? '\u4E34\u65F6\u4F1A\u8BDD' : '\u5F53\u524D\u4F1A\u8BDD'} \u00B7 {skill.source}</small></span>\n <button type=\"button\" className=\"is-icon\" disabled={busy === skill.id} aria-label={`\u5378\u8F7D ${skill.displayName}`} onClick={() => { void uninstall(skill.id) }}><IconTrashOutline16 size={15} /></button>\n {actionError?.kind === 'uninstall' && actionError.id === skill.id && <p className=\"dsh-partner-skill-action-error\" role=\"alert\">\u5378\u8F7D\u5931\u8D25\uFF1A{actionError.message}</p>}\n </article>)}</div>{catalog.installed.length > 4 && <button type=\"button\" className=\"dsh-partner-skill-disclosure\" aria-expanded={showAllInstalled} onClick={() => setShowAllInstalled(value => !value)}>{showAllInstalled ? '\u6536\u8D77\u5DF2\u5B89\u88C5 Skill' : `\u67E5\u770B\u5168\u90E8 ${catalog.installed.length} \u4E2A\u5DF2\u5B89\u88C5 Skill`}</button>}</>}\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u5E02\u573A\u76EE\u5F55\" detail=\"\u5185\u7F6E ClawHub\u3001LoopHub\u3001SkillHub\uFF0C\u4E0E nomifun \u5F53\u524D Skill \u699C\u5355\u4E00\u81F4\" actions={<><button type=\"button\" onClick={() => setEditingNetwork(true)}>\u4EE3\u7406\u8BBE\u7F6E{network.proxyUrl ? ' \u00B7 \u5DF2\u542F\u7528' : ''}</button><button type=\"button\" onClick={() => setAddingSource(true)}><IconPlusOutline16 size={14} />\u81EA\u5B9A\u4E49\u6E90</button></>}>\n <div className=\"dsh-partner-market-toolbar\">\n <SkillSearch value={query} change={setQuery} count={visible.length} label=\"\u641C\u7D22 Skill \u5E02\u573A\" placeholder=\"\u641C\u7D22\u540D\u79F0\u3001\u8BF4\u660E\u6216\u6807\u7B7E\" loading={loading} />\n <nav className=\"dsh-partner-market-sources\" aria-label=\"Skill \u5E02\u573A\u6765\u6E90\">{sources.map(source => <button type=\"button\" key={source.id} className={activeSource === source.id ? 'is-active' : ''} aria-pressed={activeSource === source.id} onClick={() => setActiveSource(source.id)}><span>{source.name}</span><small>{sourceCounts.get(source.id) ?? 0}</small></button>)}</nav>\n </div>\n {market.errors.some(item => item.sourceId === activeSource) && <p className=\"dsh-partner-inline-warning\">{market.errors.filter(item => item.sourceId === activeSource).map(item => item.error).join('\uFF1B')}</p>}\n {loading ? <CollectionSkeleton rows={4} /> : <div className=\"dsh-partner-market-grid\">{visible.map(entry => {\n const current = installed.get(entry.id)\n const cardError = actionError?.kind === 'install' && actionError.id === entry.id ? actionError.message : undefined\n const errorId = cardError ? `dsh-partner-skill-error-${entry.id}` : undefined\n return <article key={`${entry.sourceId}:${entry.id}`}><span><small>{entry.tags.slice(0, 3).join(' \u00B7 ') || 'SKILL'}</small><strong>{entry.name}</strong><p>{entry.description}</p></span>{cardError && <p id={errorId} className=\"dsh-partner-market-card-error\" role=\"alert\">\u5B89\u88C5\u5931\u8D25\uFF1A{cardError}</p>}<footer><small>v{entry.version}</small>{current ? <button type=\"button\" disabled><IconCheckOutline16 size={14} />\u5DF2\u5B89\u88C5</button> : <button type=\"button\" disabled={busy === entry.id} aria-describedby={errorId} onClick={() => { void install(entry) }}>{busy === entry.id ? '\u5B89\u88C5\u4E2D\u2026' : cardError ? '\u91CD\u8BD5\u5B89\u88C5' : '\u5B89\u88C5'}</button>}</footer></article>\n })}</div>}\n {!loading && visible.length === 0 && <CollectionEmpty title={query ? '\u6CA1\u6709\u5339\u914D\u7684 Skill' : '\u5F53\u524D\u6765\u6E90\u6682\u65F6\u4E0D\u53EF\u7528'} detail={query ? '\u6362\u4E00\u4E2A\u5173\u952E\u8BCD\uFF0C\u6216\u5207\u6362\u5E02\u573A\u6765\u6E90\u3002' : '\u5237\u65B0\u5E02\u573A\uFF0C\u6216\u68C0\u67E5\u4EE3\u7406\u4E0E\u6765\u6E90\u914D\u7F6E\u3002'} />}\n </WorkspaceBlock>\n </div>\n}\n\nexport function CompanionSkillSettings({ companionId }: { companionId: string }): JSX.Element {\n const [catalog, setCatalog] = useState<SkillCatalogView>({ installed: [], bindings: [], sources: [] })\n const [busy, setBusy] = useState<string>()\n const [error, setError] = useState<string>()\n const [selecting, setSelecting] = useState(false)\n const [showAll, setShowAll] = useState(false)\n const [query, setQuery] = useState('')\n const load = useCallback(async () => {\n try { setCatalog(await api<SkillCatalogView>('/skills')); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) }\n }, [])\n useEffect(() => { void load() }, [load, companionId])\n useEffect(() => { setSelecting(false); setShowAll(false); setQuery(''); setError(undefined) }, [companionId])\n const enabled = useMemo(() => new Set(catalog.bindings.filter(item => item.companionId === companionId && item.enabled).map(item => item.skillId)), [catalog.bindings, companionId])\n const enabledSkills = useMemo(() => catalog.installed.filter(skill => enabled.has(skill.id)), [catalog.installed, enabled])\n const availableSkills = useMemo(() => {\n const normalized = query.trim().toLocaleLowerCase()\n return catalog.installed.filter(skill => !enabled.has(skill.id) && (!normalized || `${skill.displayName} ${skill.description} ${skill.id}`.toLocaleLowerCase().includes(normalized)))\n }, [catalog.installed, enabled, query])\n const visibleEnabledSkills = showAll ? enabledSkills : enabledSkills.slice(0, 4)\n const visibleAvailableSkills = availableSkills.slice(0, 80)\n const setBinding = async (skillId: string, nextEnabled: boolean): Promise<void> => {\n setBusy(skillId)\n setError(undefined)\n try {\n await api(`/companions/${encodeURIComponent(companionId)}/skills/${encodeURIComponent(skillId)}`, { method: 'PUT', body: JSON.stringify({ enabled: nextEnabled }) })\n await load()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <section className=\"dsh-partner-capability-detail\" aria-labelledby=\"dsh-partner-skill-capability-title\">\n <header><span><small>PARTNER SKILLS</small><strong id=\"dsh-partner-skill-capability-title\">\u5F53\u524D\u4F19\u4F34\u7684 Skill</strong></span><div className=\"dsh-partner-capability-actions\"><em>{enabledSkills.length} \u4E2A\u542F\u7528</em>{catalog.installed.length > 0 && <button type=\"button\" aria-expanded={selecting} onClick={() => setSelecting(value => !value)}><IconPlusOutline16 size={14} />\u6DFB\u52A0 Skill</button>}</div></header>\n {selecting && <div className=\"dsh-partner-skill-picker\" aria-label=\"\u6DFB\u52A0 Skill\">\n <SkillSearch value={query} change={setQuery} count={availableSkills.length} label=\"\u641C\u7D22\u53EF\u6DFB\u52A0\u7684 Skill\" placeholder=\"\u641C\u7D22\u540D\u79F0\u3001\u8BF4\u660E\u6216\u6807\u8BC6\" autoFocus compact />\n <div className=\"dsh-partner-skill-picker-list\">{visibleAvailableSkills.map(skill => <article key={skill.id}><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.executionContext === 'fork' ? '\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u6267\u884C' : '\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD\u6267\u884C'}</small></span><button type=\"button\" disabled={busy === skill.id} onClick={() => { void setBinding(skill.id, true) }}>{busy === skill.id ? '\u6DFB\u52A0\u4E2D\u2026' : '\u6DFB\u52A0'}</button></article>)}{availableSkills.length === 0 && <p className=\"dsh-partner-skill-picker-empty\">{query ? '\u6CA1\u6709\u5339\u914D\u7684\u672A\u542F\u7528 Skill\u3002' : '\u6240\u6709\u5DF2\u5B89\u88C5 Skill \u90FD\u5DF2\u542F\u7528\u3002'}</p>}</div>\n {availableSkills.length > visibleAvailableSkills.length && <small className=\"dsh-partner-skill-picker-limit\">\u8FD8\u6709 {availableSkills.length - visibleAvailableSkills.length} \u4E2A\u7ED3\u679C\uFF0C\u8BF7\u8F93\u5165\u5173\u952E\u8BCD\u7EE7\u7EED\u7B5B\u9009\u3002</small>}\n </div>}\n {catalog.installed.length === 0 ? <p className=\"dsh-partner-feature-empty\">\u5C1A\u672A\u5B89\u88C5 Skill\uFF0C\u8BF7\u5148\u4ECE\u5DE6\u4FA7\u7684 Skill \u5E02\u573A\u5B89\u88C5\u3002</p> : enabledSkills.length === 0 ? <p className=\"dsh-partner-feature-empty\">\u5F53\u524D\u4F19\u4F34\u8FD8\u6CA1\u6709\u542F\u7528 Skill\u3002\u70B9\u51FB\u201C\u6DFB\u52A0 Skill\u201D\u9009\u62E9\u9700\u8981\u7684\u80FD\u529B\u3002</p> : <>\n <div className=\"dsh-partner-skill-installed is-binding\">{visibleEnabledSkills.map(skill => <article key={skill.id}>\n <span className=\"dsh-partner-skill-mark\"><IconCheckOutline16 size={16} /></span><span><strong>{skill.displayName}</strong><p>{skill.description}</p><small>{skill.executionContext === 'fork' ? '\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u6267\u884C' : '\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD\u6267\u884C'}</small></span>\n <button type=\"button\" className=\"dsh-partner-skill-binding-action\" disabled={busy === skill.id} aria-label={`\u4ECE\u5F53\u524D\u4F19\u4F34\u505C\u7528 ${skill.displayName}`} onClick={() => { void setBinding(skill.id, false) }}>{busy === skill.id ? '\u5904\u7406\u4E2D\u2026' : '\u505C\u7528'}</button>\n </article>)}</div>\n {enabledSkills.length > 4 && <button type=\"button\" className=\"dsh-partner-skill-disclosure\" aria-expanded={showAll} onClick={() => setShowAll(value => !value)}>{showAll ? '\u6536\u8D77 Skill' : `\u67E5\u770B\u5168\u90E8 ${enabledSkills.length} \u4E2A Skill`}</button>}\n </>}\n {error && <p className=\"dsh-partner-inline-error\" role=\"alert\">{error}</p>}\n </section>\n}\n\nfunction SkillSearch({ value, change, count, label, placeholder, loading = false, autoFocus = false, compact = false }: {\n value: string\n change(value: string): void\n count: number\n label: string\n placeholder: string\n loading?: boolean\n autoFocus?: boolean\n compact?: boolean\n}): JSX.Element {\n return <div className={`dsh-partner-skill-search${compact ? ' is-compact' : ''}`} role=\"search\" aria-label={label}>\n <span className=\"dsh-partner-skill-search-icon\" aria-hidden=\"true\"><IconSearchOutline16 size={16} /></span>\n <input\n type=\"search\"\n value={value}\n autoFocus={autoFocus}\n aria-label={label}\n placeholder={placeholder}\n onChange={event => change(event.target.value)}\n onKeyDown={event => { if (event.key === 'Escape' && value) { event.preventDefault(); change('') } }}\n />\n {value && <button type=\"button\" className=\"dsh-partner-skill-search-clear\" aria-label=\"\u6E05\u7A7A\u641C\u7D22\" title=\"\u6E05\u7A7A\u641C\u7D22\" onClick={() => change('')}><IconCloseOutline16 size={14} /></button>}\n <span className=\"dsh-partner-skill-search-count\" aria-live=\"polite\">{loading ? '\u540C\u6B65\u4E2D' : `${count} \u9879`}</span>\n </div>\n}\n\nfunction NewSkillForm({ existingIds, close, changed }: { existingIds: string[]; close(): void; changed(): Promise<void> | void }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n const id = String(data.get('id') ?? '').trim().toLocaleLowerCase()\n if (existingIds.includes(id)) { setError('\u8FD9\u4E2A Skill \u6807\u8BC6\u5DF2\u7ECF\u5B58\u5728\uFF0C\u8BF7\u6362\u4E00\u4E2A\u6807\u8BC6\u3002'); return }\n setBusy(true); setError(undefined)\n try {\n const document = skillDocument({\n id,\n displayName: String(data.get('displayName') ?? ''),\n description: String(data.get('description') ?? ''),\n context: String(data.get('context') ?? 'fork'),\n allowedTools: String(data.get('allowedTools') ?? ''),\n instructions: String(data.get('instructions') ?? ''),\n })\n await api('/skills/local', { method: 'POST', body: JSON.stringify({ id, document }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-skill-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>Skill \u540D\u79F0</span><input name=\"displayName\" required maxLength={120} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u53D1\u5E03\u8BF4\u660E\u6574\u7406\" /></label><label><span>Skill \u6807\u8BC6</span><input name=\"id\" required maxLength={80} pattern=\"[A-Za-z0-9][A-Za-z0-9._-]{0,79}\" placeholder=\"release-notes\" /></label><label className=\"is-wide\"><span>\u4E00\u53E5\u8BDD\u8BF4\u660E</span><input name=\"description\" required maxLength={600} placeholder=\"\u8BF4\u660E\u4EC0\u4E48\u65F6\u5019\u4F7F\u7528\uFF0C\u4EE5\u53CA\u8981\u89E3\u51B3\u4EC0\u4E48\u95EE\u9898\" /></label><label><span>\u6267\u884C\u65B9\u5F0F</span><select name=\"context\" defaultValue=\"fork\"><option value=\"fork\">\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD</option><option value=\"inline\">\u53EF\u4FE1\u5F53\u524D\u4F1A\u8BDD</option></select></label><label><span>\u5141\u8BB8\u7684\u5DE5\u5177</span><input name=\"allowedTools\" maxLength={1000} placeholder=\"\u591A\u4E2A\u5DE5\u5177\u7528\u9017\u53F7\u5206\u9694\uFF0C\u53EF\u7559\u7A7A\" /></label><label className=\"is-wide\"><span>Skill \u6307\u4EE4</span><textarea name=\"instructions\" required maxLength={500000} rows={8} placeholder=\"\u5199\u6E05\u5DE5\u4F5C\u6B65\u9AA4\u3001\u8FB9\u754C\u3001\u8F93\u51FA\u683C\u5F0F\u548C\u9A8C\u6536\u6761\u4EF6\" /></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA Skill'}</button></footer></form>\n}\n\nfunction NetworkSettingsForm({ value, close, changed }: { value: SkillMarketNetworkView; close(): void; changed(value: SkillMarketNetworkView): Promise<void> | void }): JSX.Element {\n const [proxyUrl, setProxyUrl] = useState(value.proxyUrl ?? '')\n const [busy, setBusy] = useState<'save' | 'test'>()\n const [status, setStatus] = useState<string>()\n const [error, setError] = useState<string>()\n const test = async (): Promise<void> => {\n setBusy('test'); setError(undefined); setStatus(undefined)\n try {\n const result = await api<SkillMarketNetworkTestView>('/skill-markets/network', { method: 'POST', body: JSON.stringify({ proxyUrl: proxyUrl.trim() }) })\n setStatus(`\u8FDE\u63A5\u6B63\u5E38 \u00B7 ${result.sourceCount} \u4E2A\u6765\u6E90 \u00B7 ${result.entryCount} \u4E2A Skill \u00B7 ${result.latencyMs} ms`)\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const save = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); setBusy('save'); setError(undefined)\n try {\n const next = await api<SkillMarketNetworkView>('/skill-markets/network', { method: 'PUT', body: JSON.stringify({ proxyUrl: proxyUrl.trim() }) })\n await changed(next); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-network-form\" aria-busy={busy !== undefined} onSubmit={event => { void save(event) }}><label className=\"is-wide\"><span>HTTP \u4EE3\u7406</span><input type=\"url\" autoFocus value={proxyUrl} onChange={event => setProxyUrl(event.target.value)} placeholder=\"http://host.docker.internal:7893\" /><small>\u7559\u7A7A\u4E3A\u76F4\u8FDE\uFF1B\u5E02\u573A\u5217\u8868\u548C\u5B89\u88C5\u5305\u4E0B\u8F7D\u5171\u7528\u8FD9\u4E2A\u4EE3\u7406\u3002</small></label>{status && <WorkspaceNotice kind=\"success\">{status}</WorkspaceNotice>}{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy !== undefined} onClick={() => { void test() }}>{busy === 'test' ? '\u6D4B\u8BD5\u4E2D\u2026' : '\u6D4B\u8BD5\u8FDE\u63A5'}</button><span className=\"dsh-partner-form-footer-spacer\" /><button type=\"button\" disabled={busy !== undefined} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy !== undefined}>{busy === 'save' ? '\u4FDD\u5B58\u4E2D\u2026' : '\u4FDD\u5B58\u8BBE\u7F6E'}</button></footer></form>\n}\n\nfunction MarketSourceForm({ close, changed }: { close(): void; changed(): Promise<void> | void }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await api('/skill-markets', { method: 'POST', body: JSON.stringify({ name: data.get('name'), indexUrl: data.get('indexUrl'), enabled: true, trusted: false }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-feature-form dsh-partner-market-source-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u6765\u6E90\u540D\u79F0</span><input name=\"name\" required maxLength={100} autoFocus placeholder=\"\u56E2\u961F Skill \u5E02\u573A\" /></label><label><span>\u7D22\u5F15 URL</span><input name=\"indexUrl\" required type=\"url\" placeholder=\"https://example.com/skills.json\" /></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}>{busy ? '\u6DFB\u52A0\u4E2D\u2026' : '\u6DFB\u52A0\u6765\u6E90'}</button></footer></form>\n}\nfunction skillDocument(value: { id: string; displayName: string; description: string; context: string; allowedTools: string; instructions: string }): string {\n const requestedTools = value.allowedTools.split(/[,\uFF0C\\s]+/).map(item => item.trim()).filter(Boolean)\n const invalidTool = requestedTools.find(item => !/^[a-zA-Z0-9._:-]+$/.test(item))\n if (invalidTool) throw new Error(`\u5DE5\u5177\u540D\u79F0\u683C\u5F0F\u4E0D\u6B63\u786E\uFF1A${invalidTool}`)\n const tools = [...new Set(requestedTools)].slice(0, 64)\n return `---\\nname: ${value.id}\\ndisplay-name: ${skillScalar(value.displayName)}\\ndescription: ${skillScalar(value.description)}\\nversion: 1.0.0\\ncontext: ${value.context === 'inline' ? 'inline' : 'fork'}\\nallowed-tools: [${tools.join(', ')}]\\n---\\n# ${value.displayName.replace(/[\\r\\n#]+/g, ' ').trim()}\\n\\n${value.instructions.trim()}\\n`\n}\nfunction skillScalar(value: string): string { return `\"${value.replace(/[\\r\\n]+/g, ' ').replace(/\"/g, \"'\").trim()}\"` }\n", "import { useEffect, useId, useRef, type KeyboardEvent, type ReactNode } from 'react'\nimport { IconAgentPresetOutline16, IconCloseOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\n\nexport function WorkspaceHero({ eyebrow, title, detail, actions }: { eyebrow: string; title: string; detail: string; actions?: ReactNode }): JSX.Element {\n return <header className=\"dsh-partner-feature-hero\">\n <span><small>{eyebrow}</small><h2>{title}</h2><p>{detail}</p></span>\n {actions && <div className=\"dsh-partner-feature-hero-actions\">{actions}</div>}\n </header>\n}\n\nexport function WorkspaceBlock({ title, detail, actions, children, className = '' }: { title: string; detail?: string; actions?: ReactNode; children: ReactNode; className?: string }): JSX.Element {\n return <section className={`dsh-partner-feature-block${className ? ` ${className}` : ''}`}>\n <header><span><strong>{title}</strong>{detail && <small>{detail}</small>}</span>{actions && <div>{actions}</div>}</header>\n {children}\n </section>\n}\n\nexport function WorkspaceDialog({ eyebrow = 'CREATE & CONFIGURE', title, detail, close, children, width = 'regular' }: { eyebrow?: string; title: string; detail: string; close(): void; children: ReactNode; width?: 'regular' | 'wide' }): JSX.Element {\n const titleId = useId()\n const detailId = useId()\n const panelRef = useRef<HTMLDialogElement>(null)\n useEffect(() => {\n const previous = document.activeElement instanceof HTMLElement ? document.activeElement : undefined\n const frame = requestAnimationFrame(() => {\n const panel = panelRef.current\n const target = panel?.querySelector<HTMLElement>('[autofocus]') ?? panel?.querySelector<HTMLElement>('input, textarea, select, button')\n target?.focus()\n })\n return () => { cancelAnimationFrame(frame); previous?.focus() }\n }, [])\n const keyDown = (event: KeyboardEvent<HTMLElement>): void => {\n if (event.key === 'Escape') { event.preventDefault(); close(); return }\n if (event.key !== 'Tab') return\n const focusable = [...(panelRef.current?.querySelectorAll<HTMLElement>('button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])') ?? [])]\n if (focusable.length === 0) return\n const first = focusable[0]; const last = focusable.at(-1)\n if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last?.focus() }\n else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first?.focus() }\n }\n return <div className=\"dsh-partner-workspace-dialog-layer\" onPointerDown={event => { if (event.target === event.currentTarget) close() }}>\n <dialog ref={panelRef} className={`dsh-partner-workspace-dialog is-${width}`} open aria-modal=\"true\" aria-labelledby={titleId} aria-describedby={detailId} onKeyDown={keyDown}>\n <header><span><small>{eyebrow}</small><strong id={titleId}>{title}</strong><p id={detailId}>{detail}</p></span><button type=\"button\" onClick={close} aria-label=\"\u5173\u95ED\"><IconCloseOutline16 size={16} /></button></header>\n <div className=\"dsh-partner-workspace-dialog-body\">{children}</div>\n </dialog>\n </div>\n}\n\nexport function WorkspaceNotice({ children, kind = 'error' }: { children: ReactNode; kind?: 'error' | 'warning' | 'success' }): JSX.Element {\n return <p className={`dsh-partner-workspace-notice is-${kind}`} role={kind === 'error' ? 'alert' : 'status'}><i />{children}</p>\n}\n\nexport function CollectionEmpty({ title, detail, action }: { title: string; detail?: string; action?: ReactNode }): JSX.Element {\n return <div className=\"dsh-partner-collection-empty\"><span><IconAgentPresetOutline16 size={18} /></span><strong>{title}</strong>{detail && <p>{detail}</p>}{action}</div>\n}\n\nexport function CollectionSkeleton({ rows = 3 }: { rows?: number }): JSX.Element {\n return <div className=\"dsh-partner-collection-skeleton\" aria-label=\"\u6B63\u5728\u52A0\u8F7D\" aria-busy=\"true\">{Array.from({ length: rows }, (_, index) => <i key={index} />)}</div>\n}\n\nexport function CountLabel({ value, label }: { value: number; label: string }): JSX.Element {\n return <span className=\"dsh-partner-count-label\"><b>{value}</b>{label}</span>\n}\n\nexport function errorMessage(value: unknown): string { return value instanceof Error ? value.message : String(value) }\n", "import { useCallback, useDeferredValue, useEffect, useMemo, useRef, useState, type FormEvent } from 'react'\nimport { IconCheckOutline16, IconChevronRightOutline14, IconCloseOutline16, IconPlusOutline16, IconSearchOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type BoardTaskStatusView, type BoardTaskView, type PartnerDelegationView, type PartnerDirectoryEntryView, type TaskActivityView, type TaskBoardView } from '../client-api.js'\nimport { CollectionSkeleton, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nconst COLUMNS: Array<{ id: BoardTaskStatusView; label: string }> = [\n { id: 'backlog', label: '\u6536\u96C6\u7BB1' }, { id: 'ready', label: '\u5F85\u5F00\u59CB' }, { id: 'doing', label: '\u8FDB\u884C\u4E2D' },\n { id: 'review', label: '\u5F85\u9A8C\u6536' }, { id: 'blocked', label: '\u53D7\u963B' }, { id: 'done', label: '\u5DF2\u5B8C\u6210' },\n]\nconst LIVE_REFRESH_MS = 4_000\ntype BoardStatusFilter = BoardTaskStatusView | 'all'\n\nexport function TaskBoardPanel(): JSX.Element {\n const [board, setBoard] = useState<TaskBoardView>({ tasks: [], activities: [] })\n const [directory, setDirectory] = useState<PartnerDirectoryEntryView[]>([])\n const [delegations, setDelegations] = useState<PartnerDelegationView[]>([])\n const [creating, setCreating] = useState(false)\n const [selectedTaskId, setSelectedTaskId] = useState<string>()\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const [syncedAt, setSyncedAt] = useState<number>()\n const [query, setQuery] = useState('')\n const [statusFilter, setStatusFilter] = useState<BoardStatusFilter>('all')\n const [assigneeFilter, setAssigneeFilter] = useState('all')\n const deferredQuery = useDeferredValue(query.trim().toLocaleLowerCase())\n const tasksById = useMemo(() => new Map(board.tasks.map(item => [item.id, item])), [board.tasks])\n const directoryById = useMemo(() => new Map(directory.map(item => [item.id, item])), [directory])\n const activeDelegationByTaskId = useMemo(() => {\n const result = new Map<string, PartnerDelegationView>()\n for (const delegation of delegations) {\n if ((delegation.status === 'queued' || delegation.status === 'running') && !result.has(delegation.taskId)) result.set(delegation.taskId, delegation)\n }\n return result\n }, [delegations])\n const selectedTask = selectedTaskId ? tasksById.get(selectedTaskId) : undefined\n const dependentsById = useMemo(() => {\n const result = new Map<string, number>()\n for (const task of board.tasks) for (const dependencyId of task.dependencyTaskIds) result.set(dependencyId, (result.get(dependencyId) ?? 0) + 1)\n return result\n }, [board.tasks])\n const scopedTasks = useMemo(() => board.tasks.filter(task => {\n if (assigneeFilter !== 'all' && (task.assigneeCompanionId ?? 'unassigned') !== assigneeFilter) return false\n if (!deferredQuery) return true\n const dependencies = task.dependencyTaskIds.map(id => tasksById.get(id)?.title ?? '')\n return [task.title, task.description, task.resultAbstract, task.resultSummary, directoryById.get(task.assigneeCompanionId ?? '')?.name, ...dependencies]\n .some(value => value?.toLocaleLowerCase().includes(deferredQuery))\n }), [assigneeFilter, board.tasks, deferredQuery, directoryById, tasksById])\n const statusCounts = useMemo(() => {\n const result = new Map<BoardTaskStatusView, number>(COLUMNS.map(column => [column.id, 0]))\n for (const task of scopedTasks) result.set(task.status, (result.get(task.status) ?? 0) + 1)\n return result\n }, [scopedTasks])\n const visibleColumns = statusFilter === 'all' ? COLUMNS : COLUMNS.filter(column => column.id === statusFilter)\n const tasksByStatus = useMemo(() => {\n const priorityRank: Record<BoardTaskView['priority'], number> = { urgent: 3, high: 2, normal: 1, low: 0 }\n const result = new Map<BoardTaskStatusView, BoardTaskView[]>(COLUMNS.map(column => [column.id, []]))\n for (const task of scopedTasks) {\n if (statusFilter !== 'all' && task.status !== statusFilter) continue\n result.get(task.status)?.push(task)\n }\n for (const tasks of result.values()) tasks.sort((left, right) => priorityRank[right.priority] - priorityRank[left.priority] || right.updatedAt - left.updatedAt)\n return result\n }, [scopedTasks, statusFilter])\n const visibleTaskCount = statusFilter === 'all' ? scopedTasks.length : (statusCounts.get(statusFilter) ?? 0)\n const loadingRef = useRef(false)\n const load = useCallback(async () => {\n if (loadingRef.current) return\n loadingRef.current = true\n try {\n const [next, collaboration] = await Promise.all([api<TaskBoardView>('/tasks'), api<{ companions: PartnerDirectoryEntryView[]; delegations: PartnerDelegationView[] }>('/collaboration')])\n setBoard(next); setDirectory(collaboration.companions); setDelegations(collaboration.delegations); setSyncedAt(Date.now()); setError(undefined)\n } catch (reason) { setError(errorMessage(reason)) } finally { loadingRef.current = false; setLoading(false) }\n }, [])\n useEffect(() => {\n void load()\n const timer = window.setInterval(() => { if (document.visibilityState === 'visible') void load() }, LIVE_REFRESH_MS)\n const visible = (): void => { if (document.visibilityState === 'visible') void load() }\n document.addEventListener('visibilitychange', visible)\n return () => { window.clearInterval(timer); document.removeEventListener('visibilitychange', visible) }\n }, [load])\n const update = async (task: BoardTaskView, change: Record<string, unknown>): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}`, { method: 'PUT', body: JSON.stringify({ expectedRevision: task.revision, ...change }) }); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const delegate = async (task: BoardTaskView): Promise<void> => {\n if (!task.assigneeCompanionId) return\n setBusy(task.id); setError(undefined)\n try {\n await api(`/tasks/${task.id}/delegate`, { method: 'POST', body: JSON.stringify({ to: task.assigneeCompanionId, request: task.description || `\u5B8C\u6210\u4EFB\u52A1\uFF1A${task.title}` }) })\n await load()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const review = async (task: BoardTaskView): Promise<void> => {\n if (!task.reviewerCompanionId) return\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/review`, { method: 'POST', body: JSON.stringify({ to: task.reviewerCompanionId }) }); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const accept = async (task: BoardTaskView): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/accept`, { method: 'POST' }); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n const reject = async (task: BoardTaskView, reason: string): Promise<void> => {\n if (!reason) return\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}/reject`, { method: 'POST', body: JSON.stringify({ reason }) }); await load() }\n catch (cause) { setError(errorMessage(cause)) } finally { setBusy(undefined) }\n }\n const remove = async (task: BoardTaskView): Promise<void> => {\n setBusy(task.id); setError(undefined)\n try { await api(`/tasks/${task.id}`, { method: 'DELETE' }); if (selectedTaskId === task.id) setSelectedTaskId(undefined); await load() }\n catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) }\n }\n return <div className=\"dsh-partner-feature-page is-board\">\n <WorkspaceHero eyebrow=\"Shared workspace\" title=\"\u4F19\u4F34\u4EFB\u52A1\u770B\u677F\" detail=\"\u627F\u63A5\u591A\u6B65\u3001\u4F9D\u8D56\u548C\u8DE8\u4F19\u4F34\u5DE5\u4F5C\u3002\u524D\u7F6E\u4EFB\u52A1\u5B8C\u6210\u540E\u624D\u80FD\u6267\u884C\uFF0C\u7ED3\u679C\u9A8C\u6536\u901A\u8FC7\u540E\u624D\u4F1A\u89E3\u9501\u540E\u7EED\u4EFB\u52A1\u3002\" actions={<><span className=\"dsh-partner-board-live\" title={syncedAt ? `\u6700\u8FD1\u540C\u6B65 ${new Date(syncedAt).toLocaleTimeString()}` : '\u6B63\u5728\u8FDE\u63A5'}><i />\u5B9E\u65F6\u540C\u6B65</span><button type=\"button\" onClick={() => setCreating(true)}><IconPlusOutline16 size={15} />\u65B0\u4EFB\u52A1</button></>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {creating && <WorkspaceDialog title=\"\u65B0\u5EFA\u4EFB\u52A1\" detail=\"\u5199\u6E05\u76EE\u6807\u3001\u8D1F\u8D23\u4EBA\u548C\u9A8C\u6536\u8FB9\u754C\uFF1B\u53EA\u6709\u771F\u6B63\u5B58\u5728\u524D\u7F6E\u5173\u7CFB\u65F6\u624D\u6DFB\u52A0\u4F9D\u8D56\u3002\" close={() => setCreating(false)} width=\"wide\"><TaskForm companions={directory} tasks={board.tasks} close={() => setCreating(false)} changed={load} /></WorkspaceDialog>}\n {selectedTask && <WorkspaceDialog eyebrow=\"TASK DETAIL\" title={selectedTask.title} detail={taskDialogSummary(selectedTask, directory)} close={() => setSelectedTaskId(undefined)} width=\"wide\"><TaskDetail\n key={selectedTask.id} task={selectedTask} tasks={board.tasks} activities={board.activities.filter(item => item.taskId === selectedTask.id)} directory={directory}\n execution={activeDelegationByTaskId.get(selectedTask.id)}\n busy={busy === selectedTask.id} update={change => { void update(selectedTask, change) }} delegate={() => { void delegate(selectedTask) }} review={() => { void review(selectedTask) }}\n accept={() => { void accept(selectedTask) }} reject={reason => { void reject(selectedTask, reason) }} remove={() => { void remove(selectedTask) }}\n /></WorkspaceDialog>}\n {loading ? <CollectionSkeleton rows={6} /> : <>\n <div className=\"dsh-partner-board-tools\">\n <label className=\"dsh-partner-board-search\"><span className=\"sr-only\">\u641C\u7D22\u4EFB\u52A1</span><span aria-hidden=\"true\"><IconSearchOutline16 size={16} /></span><input value={query} onChange={event => setQuery(event.target.value)} placeholder=\"\u641C\u7D22\u4EFB\u52A1\u3001\u8D1F\u8D23\u4EBA\u6216\u524D\u7F6E\u4EFB\u52A1\" />{query && <button type=\"button\" onClick={() => setQuery('')} aria-label=\"\u6E05\u9664\u4EFB\u52A1\u641C\u7D22\"><IconCloseOutline16 size={14} /></button>}</label>\n <label className=\"dsh-partner-board-assignee\"><span className=\"sr-only\">\u6309\u8D1F\u8D23\u4EBA\u7B5B\u9009</span><select value={assigneeFilter} onChange={event => setAssigneeFilter(event.target.value)}><option value=\"all\">\u5168\u90E8\u4F19\u4F34</option><option value=\"unassigned\">\u672A\u6307\u6D3E</option>{directory.map(item => <option value={item.id} key={item.id}>@{item.name}</option>)}</select></label>\n <small aria-live=\"polite\">\u663E\u793A {visibleTaskCount} / {board.tasks.length}</small>\n </div>\n <nav className=\"dsh-partner-board-statuses\" aria-label=\"\u6309\u4EFB\u52A1\u72B6\u6001\u7B5B\u9009\"><button type=\"button\" className={statusFilter === 'all' ? 'is-active' : ''} aria-pressed={statusFilter === 'all'} onClick={() => setStatusFilter('all')}><span>\u5168\u90E8</span><b>{scopedTasks.length}</b></button>{COLUMNS.map(column => <button type=\"button\" key={column.id} className={statusFilter === column.id ? 'is-active' : ''} aria-pressed={statusFilter === column.id} onClick={() => setStatusFilter(column.id)}><span>{column.label}</span><b>{statusCounts.get(column.id) ?? 0}</b></button>)}</nav>\n <div className=\"dsh-partner-board\" data-focused={statusFilter !== 'all'} aria-label=\"\u4EFB\u52A1\u770B\u677F\">{visibleColumns.map(column => {\n const tasks = tasksByStatus.get(column.id) ?? []\n const columnTitleId = `dsh-partner-board-${column.id}`\n return <section key={column.id} data-status={column.id} data-empty={tasks.length === 0} aria-labelledby={columnTitleId}><header><strong id={columnTitleId}>{column.label}</strong><b>{tasks.length}</b></header>{tasks.length > 0 ? <div className=\"dsh-partner-board-column-list\">{tasks.map(task => <TaskCard\n key={task.id} task={task} tasksById={tasksById} directoryById={directoryById} dependentCount={dependentsById.get(task.id) ?? 0}\n execution={activeDelegationByTaskId.get(task.id)}\n open={() => setSelectedTaskId(task.id)}\n />)}</div> : <p>{query || assigneeFilter !== 'all' ? '\u6CA1\u6709\u5339\u914D\u4EFB\u52A1' : '\u6682\u65E0\u4EFB\u52A1'}</p>}</section>\n })}</div></>}\n </div>\n}\n\nfunction TaskCard({ task, tasksById, directoryById, dependentCount, execution, open }: {\n task: BoardTaskView; tasksById: ReadonlyMap<string, BoardTaskView>; directoryById: ReadonlyMap<string, PartnerDirectoryEntryView>; dependentCount: number; execution: PartnerDelegationView | undefined; open(): void\n}): JSX.Element {\n const dependencies = task.dependencyTaskIds.map(id => tasksById.get(id)).filter((item): item is BoardTaskView => item !== undefined)\n const blockers = dependencies.filter(item => item.status !== 'done')\n const completedDependencies = dependencies.length - blockers.length\n const assignee = directoryById.get(task.assigneeCompanionId ?? '')\n const executionState = execution ? delegationState(execution) : undefined\n return <article className=\"dsh-partner-task-card\" data-blocked={blockers.length > 0} data-priority={task.priority}>\n <button type=\"button\" className=\"dsh-partner-task-summary\" aria-haspopup=\"dialog\" onClick={open}><span><span className=\"dsh-partner-task-card-title\"><strong title={task.title}>{task.title}</strong><em>{priorityLabel(task.priority)}</em></span><small className=\"dsh-partner-task-card-owner\">{assignee ? `@${assignee.name}` : '\u672A\u6307\u6D3E'}{task.resultSummary ? ' \u00B7 \u5DF2\u6709\u7ED3\u679C' : ''}{executionState ? ` \u00B7 ${executionState.label}` : ''}</small>{(dependencies.length > 0 || dependentCount > 0) && <span className=\"dsh-partner-task-relations\">{dependencies.length > 0 && <small data-blocked={blockers.length > 0}>\u524D\u7F6E {completedDependencies}/{dependencies.length}</small>}{dependentCount > 0 && <small>\u5B8C\u6210\u540E\u89E3\u9501 {dependentCount}</small>}</span>}</span><IconChevronRightOutline14 size={14} /></button>\n </article>\n}\n\nfunction TaskDetail({ task, tasks, activities, directory, execution, busy, update, delegate, review, accept, reject, remove }: {\n task: BoardTaskView; tasks: BoardTaskView[]; activities: TaskActivityView[]; directory: PartnerDirectoryEntryView[]; execution: PartnerDelegationView | undefined; busy: boolean\n update(change: Record<string, unknown>): void; delegate(): void; review(): void; accept(): void; reject(reason: string): void; remove(): void\n}): JSX.Element {\n const [rejecting, setRejecting] = useState(false)\n const [rejectReason, setRejectReason] = useState('')\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const byId = useMemo(() => new Map(tasks.map(item => [item.id, item])), [tasks])\n const dependencies = task.dependencyTaskIds.map(id => byId.get(id)).filter((item): item is BoardTaskView => item !== undefined)\n const blockers = dependencies.filter(item => item.status !== 'done')\n const assignee = directory.find(item => item.id === task.assigneeCompanionId)\n const reviewer = directory.find(item => item.id === task.reviewerCompanionId)\n const dependencyCandidates = tasks.filter(item => item.id !== task.id && !task.dependencyTaskIds.includes(item.id) && !dependsOn(item.id, task.id, byId))\n const canExecute = Boolean(task.assigneeCompanionId) && blockers.length === 0 && !['doing', 'review', 'done'].includes(task.status)\n const recentActivities = [...activities].sort((left, right) => right.at - left.at).slice(0, 6)\n const executionState = execution ? delegationState(execution) : undefined\n return <div className=\"dsh-partner-task-detail\">\n <section className=\"dsh-partner-task-description\"><strong>\u4EFB\u52A1\u8BF4\u660E</strong><p>{task.description || '\u6CA1\u6709\u8865\u5145\u8BF4\u660E'}</p></section>\n <div className=\"dsh-partner-task-fields\"><label><span>\u72B6\u6001</span><select value={task.status} disabled={busy} onChange={event => update({ status: event.target.value })}>{COLUMNS.map(item => <option key={item.id} value={item.id} disabled={(item.id === 'doing' || item.id === 'review' || item.id === 'done') && blockers.length > 0 || item.id === 'done' && task.status !== 'review' && task.status !== 'done'}>{item.label}</option>)}</select></label><label><span>\u8D1F\u8D23\u4EBA</span><select value={task.assigneeCompanionId ?? ''} disabled={busy || task.status === 'doing'} onChange={event => update({ assigneeCompanionId: event.target.value })}><option value=\"\">\u672A\u6307\u6D3E</option>{directory.map(item => <option key={item.id} value={item.id}>@{item.name} \u00B7 {item.availability === 'busy' ? '\u5FD9\u788C' : '\u53EF\u7528'}</option>)}</select></label><label><span>\u9A8C\u6536\u4F19\u4F34</span><select value={task.reviewerCompanionId ?? ''} disabled={busy} onChange={event => update({ reviewerCompanionId: event.target.value })}><option value=\"\">\u7559\u7A7A \u00B7 \u4EBA\u5DE5\u9A8C\u6536</option>{directory.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label></div>\n {executionState && <section className=\"dsh-partner-task-execution\" data-state={execution?.status}><i /><span><strong>{executionState.title}</strong><small>{executionState.detail}</small></span></section>}\n <section className=\"dsh-partner-task-dependency\"><header><strong>\u524D\u7F6E\u4EFB\u52A1</strong><small>{blockers.length ? `${blockers.length} \u9879\u672A\u5B8C\u6210\uFF0C\u5F53\u524D\u4EFB\u52A1\u4E0D\u80FD\u542F\u52A8` : dependencies.length ? '\u5DF2\u5168\u90E8\u5B8C\u6210\uFF0C\u53EF\u4EE5\u542F\u52A8' : '\u6CA1\u6709\u524D\u7F6E\u4F9D\u8D56'}</small></header>{dependencies.length > 0 && <div>{dependencies.map(item => <span key={item.id} data-done={item.status === 'done'}><i>{item.status === 'done' ? <IconCheckOutline16 size={12} /> : ''}</i><b>{item.title}</b><button type=\"button\" disabled={busy || ['doing', 'review', 'done'].includes(task.status)} aria-label={`\u79FB\u9664\u524D\u7F6E\u4EFB\u52A1 ${item.title}`} onClick={() => update({ dependencyTaskIds: task.dependencyTaskIds.filter(id => id !== item.id) })}>\u79FB\u9664</button></span>)}</div>}{dependencyCandidates.length > 0 && <label><span className=\"sr-only\">\u589E\u52A0\u524D\u7F6E\u4EFB\u52A1</span><select defaultValue=\"\" disabled={busy || ['doing', 'review', 'done'].includes(task.status)} onChange={event => { const id = event.currentTarget.value; if (id) update({ dependencyTaskIds: [...task.dependencyTaskIds, id] }); event.currentTarget.value = '' }}><option value=\"\">\u589E\u52A0\u524D\u7F6E\u4EFB\u52A1\u2026</option>{dependencyCandidates.map(item => <option value={item.id} key={item.id}>{item.title} \u00B7 {statusLabel(item.status)}</option>)}</select></label>}</section>\n {task.resultSummary && <ResultBlock label=\"\u6267\u884C\u7ED3\u679C\" value={task.resultSummary} />}\n {task.reviewSummary && <ResultBlock label={`\u6838\u9A8C\u610F\u89C1${reviewer ? ` \u00B7 @${reviewer.name}` : ''}`} value={task.reviewSummary} />}\n {recentActivities.length > 0 && <section className=\"dsh-partner-task-activity\"><strong>\u6700\u8FD1\u6D3B\u52A8</strong><ol>{recentActivities.map(item => <li key={item.id}><span>{item.message}</span><time>{new Date(item.at).toLocaleString()}</time></li>)}</ol></section>}\n {rejecting && <form className=\"dsh-partner-task-reject\" onSubmit={event => { event.preventDefault(); const reason = rejectReason.trim(); if (!reason) return; reject(reason); setRejecting(false); setRejectReason('') }}><label><span>\u6253\u56DE\u539F\u56E0</span><textarea autoFocus value={rejectReason} onChange={event => setRejectReason(event.target.value)} rows={3} maxLength={1200} placeholder=\"\u8BF4\u660E\u9700\u8981\u91CD\u505A\u6216\u8865\u5145\u7684\u5185\u5BB9\" /></label><div><button type=\"button\" onClick={() => { setRejecting(false); setRejectReason('') }}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy || !rejectReason.trim()}>\u786E\u8BA4\u6253\u56DE</button></div></form>}\n {confirmingDelete && <div className=\"dsh-partner-task-delete-confirm\" role=\"alert\"><span>\u5220\u9664\u540E\uFF0C\u4F9D\u8D56\u5B83\u7684\u4EFB\u52A1\u4F1A\u89E3\u9664\u8FD9\u6761\u524D\u7F6E\u5173\u7CFB\u3002</span><div><button type=\"button\" onClick={() => setConfirmingDelete(false)}>\u53D6\u6D88</button><button type=\"button\" className=\"is-danger\" disabled={busy} onClick={remove}>\u786E\u8BA4\u5220\u9664</button></div></div>}\n <footer className=\"dsh-partner-task-actions\"><small>r{task.revision} \u00B7 {new Date(task.updatedAt).toLocaleString()}</small><span>{task.status === 'review' ? <>{task.reviewerCompanionId && <button type=\"button\" disabled={busy} onClick={review}>{busy ? '\u6838\u9A8C\u4E2D\u2026' : `\u4EA4\u7ED9 @${reviewer?.name ?? '\u4F19\u4F34'} \u6838\u9A8C`}</button>}<button type=\"button\" disabled={busy} onClick={() => setRejecting(true)}>\u6253\u56DE\u91CD\u505A</button><button type=\"button\" className=\"is-primary\" disabled={busy} onClick={accept}>\u9A8C\u6536\u901A\u8FC7</button></> : <button type=\"button\" disabled={busy || !canExecute} title={blockers.length ? '\u524D\u7F6E\u4EFB\u52A1\u5C1A\u672A\u5B8C\u6210' : !task.assigneeCompanionId ? '\u8BF7\u5148\u9009\u62E9\u8D1F\u8D23\u4EBA' : undefined} onClick={delegate}>{busy ? '\u6267\u884C\u4E2D\u2026' : task.status === 'doing' ? '\u6B63\u5728\u6267\u884C' : task.status === 'done' ? '\u5DF2\u7ECF\u5B8C\u6210' : `\u4EA4\u7ED9 @${assignee?.name ?? '\u4F19\u4F34'}`}</button>}<button type=\"button\" className=\"is-icon\" aria-label={`\u5220\u9664 ${task.title}`} aria-expanded={confirmingDelete} disabled={busy} onClick={() => setConfirmingDelete(true)}><IconTrashOutline16 size={14} /></button></span></footer>\n </div>\n}\n\nfunction ResultBlock({ label, value }: { label: string; value: string }): JSX.Element {\n return <section className=\"dsh-partner-task-result\"><strong>{label}</strong><p>{value}</p></section>\n}\n\nfunction TaskForm({ companions, tasks, close, changed }: { companions: PartnerDirectoryEntryView[]; tasks: BoardTaskView[]; close(): void; changed(): Promise<void> }): JSX.Element {\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const dependencyOptions = tasks.filter(item => item.status !== 'done')\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await api('/tasks', { method: 'POST', body: JSON.stringify({\n title: data.get('title'), description: data.get('description'), priority: data.get('priority'), status: 'backlog',\n assigneeCompanionId: data.get('assignee') || undefined, reviewerCompanionId: data.get('reviewer') || undefined,\n dependencyTaskIds: data.getAll('dependencyTaskId'),\n }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-task-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u4EFB\u52A1\u540D\u79F0</span><input name=\"title\" maxLength={200} required autoFocus placeholder=\"\u4E00\u53E5\u8BDD\u8BF4\u660E\u4EA4\u4ED8\u76EE\u6807\" /></label><label><span>\u8D1F\u8D23\u4EBA</span><select name=\"assignee\" defaultValue=\"\"><option value=\"\">\u672A\u6307\u6D3E</option>{companions.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label><label className=\"is-wide\"><span>\u4EFB\u52A1\u8BF4\u660E</span><textarea name=\"description\" maxLength={8000} rows={5} placeholder=\"\u8865\u5145\u80CC\u666F\u3001\u4EA4\u4ED8\u7269\u548C\u5B8C\u6210\u6761\u4EF6\" /></label><label><span>\u4F18\u5148\u7EA7</span><select name=\"priority\" defaultValue=\"normal\"><option value=\"low\">\u4F4E</option><option value=\"normal\">\u666E\u901A</option><option value=\"high\">\u9AD8</option><option value=\"urgent\">\u7D27\u6025</option></select></label><label><span>\u9A8C\u6536\u4F19\u4F34</span><select name=\"reviewer\" defaultValue=\"\"><option value=\"\">\u7559\u7A7A \u00B7 \u4EBA\u5DE5\u9A8C\u6536</option>{companions.map(item => <option key={item.id} value={item.id}>@{item.name}</option>)}</select></label><div className=\"dsh-partner-task-form-dependencies is-wide\"><span>\u4F9D\u8D56\u4EFB\u52A1 <small>\u53EF\u9009</small></span>{dependencyOptions.length > 0 ? <div>{dependencyOptions.map(item => <label key={item.id}><input type=\"checkbox\" name=\"dependencyTaskId\" value={item.id} /><i /><span>{item.title}</span><small>{statusLabel(item.status)}</small></label>)}</div> : <p>\u5F53\u524D\u6CA1\u6709\u53EF\u9009\u7684\u672A\u5B8C\u6210\u4EFB\u52A1</p>}<small>\u53EF\u4EE5\u9009\u62E9\u591A\u4E2A\uFF1B\u7559\u7A7A\u8868\u793A\u8BE5\u4EFB\u52A1\u4E0D\u4F9D\u8D56\u5176\u4ED6\u4EFB\u52A1\u3002</small></div>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u4EFB\u52A1'}</button></footer></form>\n}\n\nfunction dependsOn(candidateId: string, targetId: string, tasks: Map<string, BoardTaskView>, visited = new Set<string>()): boolean {\n if (candidateId === targetId) return true\n if (visited.has(candidateId)) return false\n visited.add(candidateId)\n return (tasks.get(candidateId)?.dependencyTaskIds ?? []).some(id => dependsOn(id, targetId, tasks, visited))\n}\nfunction statusLabel(value: BoardTaskStatusView): string { return COLUMNS.find(item => item.id === value)?.label ?? value }\nfunction taskDialogSummary(task: BoardTaskView, directory: PartnerDirectoryEntryView[]): string {\n const assignee = directory.find(item => item.id === task.assigneeCompanionId)\n return `${statusLabel(task.status)} \u00B7 ${assignee ? `\u8D1F\u8D23\u4EBA @${assignee.name}` : '\u5C1A\u672A\u6307\u6D3E\u8D1F\u8D23\u4EBA'} \u00B7 ${priorityLabel(task.priority)}`\n}\nfunction priorityLabel(value: BoardTaskView['priority']): string { return ({ low: '\u4F4E\u4F18\u5148\u7EA7', normal: '\u666E\u901A\u4F18\u5148\u7EA7', high: '\u9AD8\u4F18\u5148\u7EA7', urgent: '\u7D27\u6025' })[value] }\nfunction delegationState(value: PartnerDelegationView): { label: string; title: string; detail: string } {\n const review = value.kind === 'review'\n if (value.status === 'queued') {\n const at = value.nextAttemptAt ? new Date(value.nextAttemptAt).toLocaleString() : '\u7A0D\u540E'\n return { label: '\u7B49\u5F85\u81EA\u52A8\u6062\u590D', title: review ? '\u9A8C\u6536\u5C06\u5728\u8FDE\u63A5\u6062\u590D\u540E\u7EE7\u7EED' : '\u4EFB\u52A1\u5C06\u5728\u8FDE\u63A5\u6062\u590D\u540E\u7EE7\u7EED', detail: `${at} \u81EA\u52A8\u91CD\u8BD5${value.error ? ` \u00B7 ${value.error}` : ''}` }\n }\n const recovered = (value.attempts ?? 1) > 1\n return {\n label: recovered ? `\u7B2C ${value.attempts} \u6B21\u6062\u590D\u4E2D` : review ? '\u4F19\u4F34\u9A8C\u6536\u4E2D' : '\u4F19\u4F34\u6267\u884C\u4E2D',\n title: recovered ? (review ? '\u6B63\u5728\u6062\u590D\u4F19\u4F34\u9A8C\u6536' : '\u6B63\u5728\u6062\u590D\u4F19\u4F34\u4EFB\u52A1') : review ? '\u4F19\u4F34\u6B63\u5728\u6838\u9A8C\u7ED3\u679C' : '\u4F19\u4F34\u6B63\u5728\u6267\u884C\u4EFB\u52A1',\n detail: recovered ? '\u4F1A\u5148\u68C0\u67E5\u5DF2\u6709\u4EA7\u51FA\uFF0C\u907F\u514D\u91CD\u590D\u5199\u5165\u6216\u91CD\u590D\u53D1\u5E03\u3002' : '\u6267\u884C\u72B6\u6001\u4F1A\u81EA\u52A8\u540C\u6B65\uFF0C\u65E0\u9700\u624B\u52A8\u5237\u65B0\u3002',\n }\n}\n", "import { useCallback, useEffect, useState, type FormEvent } from 'react'\nimport { IconPlayOutline16, IconPlusOutline16, IconRefreshOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type CompanionView, type ExecutionRunView, type ScheduledTaskView } from '../client-api.js'\nimport { CollectionEmpty, CollectionSkeleton, WorkspaceBlock, WorkspaceDialog, WorkspaceHero, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport function SchedulePanel({ companions }: { companions: CompanionView[] }): JSX.Element {\n const [schedules, setSchedules] = useState<ScheduledTaskView[]>([])\n const [runs, setRuns] = useState<ExecutionRunView[]>([])\n const [creating, setCreating] = useState(false)\n const [busy, setBusy] = useState<string>()\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string>()\n const load = useCallback(async () => {\n try { const value = await api<{ schedules: ScheduledTaskView[]; runs: ExecutionRunView[] }>('/schedules'); setSchedules(value.schedules); setRuns(value.runs.filter(item => item.kind === 'schedule').slice(-50).reverse()); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) } finally { setLoading(false) }\n }, [])\n useEffect(() => { void load() }, [load])\n const update = async (entry: ScheduledTaskView, value: Record<string, unknown>): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}`, { method: 'PUT', body: JSON.stringify(value) }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n const run = async (entry: ScheduledTaskView): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}/trigger`, { method: 'POST' }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n const remove = async (entry: ScheduledTaskView): Promise<void> => { setBusy(entry.id); try { await api(`/schedules/${entry.id}`, { method: 'DELETE' }); await load() } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(undefined) } }\n return <div className=\"dsh-partner-feature-page\">\n <WorkspaceHero eyebrow=\"Ephemeral automation\" title=\"\u4F19\u4F34\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u7531\u6307\u5B9A\u4F19\u4F34\u5728\u9694\u79BB\u4E34\u65F6\u4F1A\u8BDD\u4E2D\u6267\u884C\uFF1B\u9ED8\u8BA4\u5B8C\u6210\u5373\u9500\u6BC1\uFF0C\u907F\u514D\u957F\u671F\u4F1A\u8BDD\u88AB\u540E\u53F0\u4EFB\u52A1\u6C61\u67D3\u3002\" actions={<><button type=\"button\" disabled={loading} onClick={() => { void load() }}><IconRefreshOutline16 size={15} />\u5237\u65B0</button><button type=\"button\" disabled={companions.length === 0} onClick={() => setCreating(true)}><IconPlusOutline16 size={15} />\u65B0\u8BA1\u5212</button></>} />\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n {creating && <WorkspaceDialog title=\"\u65B0\u5EFA\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u9009\u62E9\u6267\u884C\u4F19\u4F34\u3001\u8FD0\u884C\u9891\u7387\u548C\u4F1A\u8BDD\u4FDD\u7559\u7B56\u7565\u3002\u8BA1\u5212\u521B\u5EFA\u540E\u53EF\u4EE5\u968F\u65F6\u505C\u7528\u6216\u7ACB\u5373\u6267\u884C\u3002\" close={() => setCreating(false)} width=\"wide\"><ScheduleForm companions={companions} close={() => setCreating(false)} changed={load} /></WorkspaceDialog>}\n <WorkspaceBlock title=\"\u6267\u884C\u8BA1\u5212\" detail={`${schedules.filter(item => item.enabled).length} \u4E2A\u542F\u7528`}>\n {loading ? <CollectionSkeleton rows={3} /> : schedules.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u5B9A\u65F6\u4EFB\u52A1\" detail=\"\u521B\u5EFA\u8BA1\u5212\u540E\uFF0C\u4F19\u4F34\u4F1A\u6309\u8BBE\u5B9A\u5728\u72EC\u7ACB\u4F1A\u8BDD\u4E2D\u6267\u884C\u3002\" action={<button type=\"button\" disabled={companions.length === 0} onClick={() => setCreating(true)}><IconPlusOutline16 size={14} />\u521B\u5EFA\u7B2C\u4E00\u4E2A\u8BA1\u5212</button>} /> : <div className=\"dsh-partner-schedule-list\">{schedules.map(entry => <article key={entry.id}><span><strong>{entry.title}</strong><p>{entry.prompt}</p><span className=\"dsh-partner-schedule-meta\"><em>@{companionName(companions, entry.companionId)}</em><em>{scheduleLabel(entry)}</em><em>\u4E0B\u6B21 {new Date(entry.nextRunAt).toLocaleString()}</em><em>{entry.destroySessionAfterRun ? '\u6267\u884C\u540E\u9500\u6BC1' : '\u4FDD\u7559\u4F1A\u8BDD'}</em></span></span><button type=\"button\" className=\"dsh-partner-feature-switch\" data-on={entry.enabled} aria-pressed={entry.enabled} disabled={busy === entry.id} onClick={() => { void update(entry, { enabled: !entry.enabled }) }}><i /></button><button type=\"button\" disabled={busy === entry.id} onClick={() => { void run(entry) }}><IconPlayOutline16 size={14} />{busy === entry.id ? '\u6267\u884C\u4E2D\u2026' : '\u7ACB\u5373\u6267\u884C'}</button><button type=\"button\" className=\"is-icon\" disabled={busy === entry.id} onClick={() => { void remove(entry) }} aria-label={`\u5220\u9664 ${entry.title}`}><IconTrashOutline16 size={14} /></button></article>)}</div>}\n </WorkspaceBlock>\n <WorkspaceBlock title=\"\u6700\u8FD1\u8FD0\u884C\" detail=\"\u4FDD\u7559\u6700\u8FD1\u7684\u72B6\u6001\u4E0E\u7ED3\u679C\u6458\u8981\"><div className=\"dsh-partner-run-list\">{runs.map(run => <article key={run.id} data-status={run.status}><i /><span><strong>{schedules.find(item => item.id === run.sourceId)?.title ?? '\u5DF2\u5220\u9664\u8BA1\u5212'} \u00B7 @{companionName(companions, run.ownerCompanionId)}</strong><p>{run.error || run.outputSummary || '\u7B49\u5F85\u7ED3\u679C'}</p><small>{new Date(run.startedAt).toLocaleString()} \u00B7 {run.status} \u00B7 {run.destroyAfterRun ? '\u4F1A\u8BDD\u5DF2\u9500\u6BC1' : '\u4F1A\u8BDD\u4FDD\u7559'}</small></span></article>)}</div>{!loading && runs.length === 0 && <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u6267\u884C\u8BB0\u5F55\" detail=\"\u8BA1\u5212\u7B2C\u4E00\u6B21\u6267\u884C\u540E\uFF0C\u7ED3\u679C\u548C\u8017\u65F6\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\" />}</WorkspaceBlock>\n </div>\n}\n\nfunction ScheduleForm({ companions, close, changed }: { companions: CompanionView[]; close(): void; changed(): Promise<void> }): JSX.Element {\n const [kind, setKind] = useState<'interval' | 'daily'>('interval')\n const [error, setError] = useState<string>()\n const [busy, setBusy] = useState(false)\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault(); const data = new FormData(event.currentTarget)\n const schedule = kind === 'interval' ? { kind, minutes: Number(data.get('minutes')) } : { kind, hour: Number(data.get('hour')), minute: Number(data.get('minute')) }\n setBusy(true); setError(undefined)\n try {\n await api('/schedules', { method: 'POST', body: JSON.stringify({ companionId: data.get('companionId'), title: data.get('title'), prompt: data.get('prompt'), schedule, enabled: true, destroySessionAfterRun: data.get('retain') !== 'on', overlapPolicy: data.get('overlapPolicy'), timeoutMinutes: Number(data.get('timeoutMinutes')) }) })\n await changed(); close()\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <form className=\"dsh-partner-schedule-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}><label><span>\u8BA1\u5212\u540D\u79F0</span><input name=\"title\" required maxLength={160} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u6BCF\u65E5\u6574\u7406\u9879\u76EE\u53D8\u5316\" /></label><label><span>\u6267\u884C\u4F19\u4F34</span><select name=\"companionId\" required defaultValue={companions[0]?.id ?? ''}><option value=\"\" disabled>\u9009\u62E9\u4F19\u4F34</option>{companions.map(companion => <option key={companion.id} value={companion.id}>@{companion.name} \u00B7 {companion.role}</option>)}</select></label><label className=\"is-wide\"><span>\u6267\u884C\u5185\u5BB9</span><textarea name=\"prompt\" required maxLength={12000} rows={5} placeholder=\"\u660E\u786E\u8BF4\u660E\u8981\u68C0\u67E5\u3001\u6574\u7406\u6216\u5B8C\u6210\u4EC0\u4E48\uFF0C\u4EE5\u53CA\u5E0C\u671B\u8FD4\u56DE\u4EC0\u4E48\u7ED3\u679C\" /></label><label><span>\u9891\u7387</span><select value={kind} onChange={event => setKind(event.target.value as 'interval' | 'daily')}><option value=\"interval\">\u6BCF\u9694\u4E00\u6BB5\u65F6\u95F4</option><option value=\"daily\">\u6BCF\u5929\u56FA\u5B9A\u65F6\u95F4</option></select></label>{kind === 'interval' ? <label><span>\u95F4\u9694\u5206\u949F</span><input name=\"minutes\" type=\"number\" min={5} max={43200} defaultValue={60} /></label> : <div className=\"dsh-partner-schedule-time\"><label><span>\u5C0F\u65F6</span><input name=\"hour\" type=\"number\" min={0} max={23} defaultValue={9} /></label><label><span>\u5206\u949F</span><input name=\"minute\" type=\"number\" min={0} max={59} defaultValue={0} /></label></div>}<label><span>\u91CD\u53E0\u7B56\u7565</span><select name=\"overlapPolicy\" defaultValue=\"skip\"><option value=\"skip\">\u8DF3\u8FC7\u91CD\u53E0</option><option value=\"queue\">\u6392\u961F\u6267\u884C</option></select></label><label><span>\u8D85\u65F6\u5206\u949F</span><input name=\"timeoutMinutes\" type=\"number\" min={1} max={120} defaultValue={10} /></label><label className=\"dsh-partner-check is-wide\"><input name=\"retain\" type=\"checkbox\" /><i /><span>\u6267\u884C\u540E\u4FDD\u7559\u4E34\u65F6\u4F1A\u8BDD</span></label>{error && <WorkspaceNotice>{error}</WorkspaceNotice>}<footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u521B\u5EFA\u4E2D\u2026' : '\u521B\u5EFA\u8BA1\u5212'}</button></footer></form>\n}\nfunction scheduleLabel(entry: ScheduledTaskView): string { return entry.schedule.kind === 'interval' ? `\u6BCF ${entry.schedule.minutes} \u5206\u949F` : `\u6BCF\u5929 ${String(entry.schedule.hour).padStart(2, '0')}:${String(entry.schedule.minute).padStart(2, '0')}` }\nfunction companionName(companions: CompanionView[], id: string): string { return companions.find(item => item.id === id)?.name ?? '\u5DF2\u5220\u9664\u4F19\u4F34' }\n", "import { useCallback, useEffect, useState } from 'react'\nimport { IconCheckOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { api, type CompanionAccessView } from '../client-api.js'\nimport { CollectionEmpty, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nconst CAPABILITY_LABELS: Record<string, string> = { knowledge: '\u77E5\u8BC6\u5E93', skills: 'Skill', ssh: 'SSH', git: 'Git', companions: '\u521B\u5EFA\u4F19\u4F34', schedules: '\u5B9A\u65F6\u4EFB\u52A1', access: '\u4F19\u4F34\u6388\u6743' }\n\nexport function CompanionAccessPanel({ companionId }: { companionId: string }): JSX.Element {\n const [access, setAccess] = useState<CompanionAccessView>({ targetIds: [], companions: [] })\n const [busy, setBusy] = useState<string>()\n const [error, setError] = useState<string>()\n const load = useCallback(async () => {\n try { setAccess(await api<CompanionAccessView>(`/companions/${encodeURIComponent(companionId)}/access`)); setError(undefined) }\n catch (reason) { setError(errorMessage(reason)) }\n }, [companionId])\n useEffect(() => { void load() }, [load])\n\n const toggle = async (targetId: string): Promise<void> => {\n const previous = access.targetIds\n const targetIds = previous.includes(targetId) ? previous.filter(id => id !== targetId) : [...previous, targetId]\n setBusy(targetId); setAccess(current => ({ ...current, targetIds })); setError(undefined)\n try {\n const result = await api<{ targetIds: string[] }>(`/companions/${encodeURIComponent(companionId)}/access`, { method: 'PUT', body: JSON.stringify({ targetIds }) })\n setAccess(current => ({ ...current, targetIds: result.targetIds }))\n } catch (reason) { setAccess(current => ({ ...current, targetIds: previous })); setError(errorMessage(reason)) }\n finally { setBusy(undefined) }\n }\n\n return <section className=\"dsh-partner-capability-detail dsh-partner-access\" aria-labelledby=\"dsh-partner-access-title\">\n <header><span><small>DIRECTED ACCESS</small><strong id=\"dsh-partner-access-title\">\u53EF\u8BBF\u95EE\u7684\u4F19\u4F34</strong></span><em>{access.targetIds.length} \u4F4D\u5DF2\u6388\u6743</em></header>\n <p className=\"dsh-partner-access-note\">\u52FE\u9009\u540E\uFF0C\u5F53\u524D\u4F19\u4F34\u80FD\u4E86\u89E3\u5BF9\u65B9\u7684\u516C\u5F00\u80FD\u529B\uFF0C\u5E76\u5728\u4EFB\u52A1\u770B\u677F\u4E2D `@` \u5BF9\u65B9\u6267\u884C\u4EFB\u52A1\u3002\u6388\u6743\u53EA\u6CBF\u5F53\u524D\u65B9\u5411\u751F\u6548\uFF0C\u4E0D\u4F1A\u53CD\u5411\u6388\u6743\uFF0C\u4E5F\u4E0D\u4F1A\u5171\u4EAB\u4F1A\u8BDD\u3001\u8BB0\u5FC6\u3001\u6E20\u9053\u6216\u51ED\u636E\u3002</p>\n {access.companions.length === 0 ? <CollectionEmpty title=\"\u8FD8\u6CA1\u6709\u53EF\u6388\u6743\u7684\u4F19\u4F34\" detail=\"\u521B\u5EFA\u7B2C\u4E8C\u4F4D\u4F19\u4F34\u540E\uFF0C\u53EF\u4EE5\u5728\u8FD9\u91CC\u5EFA\u7ACB\u5355\u5411\u534F\u4F5C\u6388\u6743\u3002\" /> : <div className=\"dsh-partner-access-list\">{access.companions.map(companion => {\n const selected = access.targetIds.includes(companion.id)\n const abilities = companion.capabilities.map(capability => CAPABILITY_LABELS[capability] ?? capability)\n return <button type=\"button\" key={companion.id} className={selected ? 'is-active' : ''} aria-pressed={selected} disabled={busy === companion.id} onClick={() => { void toggle(companion.id) }}>\n <span className=\"dsh-partner-access-avatar\" aria-hidden=\"true\">{initials(companion.name)}</span>\n <span className=\"dsh-partner-access-copy\"><strong>@{companion.name}</strong><small>{companion.role}</small><p>{companion.description || '\u672A\u586B\u5199\u4F19\u4F34\u8BF4\u660E'}</p><span>{[...abilities, ...companion.enabledSkills.map(skill => skill.name)].map(item => <em key={item}>{item}</em>)}</span></span>\n <span className=\"dsh-partner-access-check\" aria-hidden=\"true\">{selected && <IconCheckOutline16 size={15} />}</span>\n </button>\n })}</div>}\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n </section>\n}\n\nfunction initials(name: string): string { return [...name.trim()].slice(0, 2).join('').toUpperCase() || 'AI' }\n", "import type { ReactNode } from 'react'\nimport { IconAgentPresetOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { ChannelView } from '../client-api.js'\n\nexport function ChannelStatus({ channel }: { channel: ChannelView | undefined }): JSX.Element {\n const status = channel?.runtimeStatus ?? 'unbound'\n return <span className={`dsh-partner-status is-${status}`}><i />{channel ? channelStatusLabel(channel.runtimeStatus) : '\u672A\u8FDE\u63A5'}</span>\n}\n\nexport function Avatar({ name, small = false }: { name: string; small?: boolean }): JSX.Element {\n return <span className={`dsh-partner-avatar${small ? ' is-small' : ''}`} aria-hidden=\"true\">{[...name][0] ?? '\u4F34'}</span>\n}\n\nexport function WeixinGlyph({ large = false }: { large?: boolean }): JSX.Element {\n return <span className={`dsh-partner-weixin-glyph${large ? ' is-large' : ''}`} aria-hidden=\"true\"><i /><b /></span>\n}\n\nexport function TabButton({ active, onClick, icon, children }: { active: boolean; onClick(): void; icon: ReactNode; children: ReactNode }): JSX.Element {\n return <button type=\"button\" className={active ? 'is-active' : ''} aria-current={active ? 'page' : undefined} onClick={onClick}>{icon}<span>{children}</span></button>\n}\n\nexport function FormField({ label, hint, children }: { label: string; hint?: string; children: ReactNode }): JSX.Element {\n return <label className=\"dsh-partner-field\"><span><strong>{label}</strong>{hint && <small>{hint}</small>}</span>{children}</label>\n}\n\nexport function SectionHeading({ eyebrow, title, detail }: { eyebrow: string; title: string; detail: string }): JSX.Element {\n return <header className=\"dsh-partner-section\"><small>{eyebrow}</small><h2>{title}</h2><p>{detail}</p></header>\n}\n\nexport function ContentState({ title, detail, action, compact = false }: { title: string; detail?: string; action?: ReactNode; compact?: boolean }): JSX.Element {\n return <div className={`dsh-partner-state${compact ? ' is-compact' : ''}`}><IconAgentPresetOutline16 size={20} /><strong>{title}</strong>{detail && <p>{detail}</p>}{action}</div>\n}\n\nexport function relativeTime(value: number): string {\n const minutes = Math.floor((Date.now() - value) / 60_000)\n return minutes < 1 ? '\u521A\u521A' : minutes < 60 ? `${minutes} \u5206\u949F\u524D` : minutes < 1440 ? `${Math.floor(minutes / 60)} \u5C0F\u65F6\u524D` : `${Math.floor(minutes / 1440)} \u5929\u524D`\n}\n\nfunction channelStatusLabel(status: ChannelView['runtimeStatus']): string {\n return status === 'running' ? '\u5FAE\u4FE1\u5728\u7EBF' : status === 'starting' ? '\u8FDE\u63A5\u4E2D' : status === 'error' ? '\u8FDE\u63A5\u5F02\u5E38' : '\u5DF2\u505C\u7528'\n}\n", "import { useState, type FormEvent } from 'react'\nimport { IconPlusOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { WorkspaceDialog, WorkspaceNotice, errorMessage } from './workspace-components.js'\n\nexport interface NewCompanionDraft {\n name: string\n role: string\n description: string\n instructions: string\n}\n\nexport function CompanionCreateDialog({ close, create }: { close(): void; create(value: NewCompanionDraft): Promise<void> }): JSX.Element {\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n const submit = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault()\n const data = new FormData(event.currentTarget)\n setBusy(true); setError(undefined)\n try {\n await create({\n name: String(data.get('name') ?? '').trim(),\n role: String(data.get('role') ?? '').trim(),\n description: String(data.get('description') ?? '').trim(),\n instructions: String(data.get('instructions') ?? '').trim(),\n })\n } catch (reason) { setError(errorMessage(reason)) } finally { setBusy(false) }\n }\n return <WorkspaceDialog title=\"\u65B0\u5EFA\u4F19\u4F34\" detail=\"\u5148\u5EFA\u7ACB\u6E05\u6670\u7684\u8EAB\u4EFD\u548C\u804C\u8D23\u3002\u6A21\u578B\u3001\u5DE5\u5177\u3001Skill \u4E0E\u534F\u4F5C\u6743\u9650\u4F1A\u5728\u521B\u5EFA\u540E\u5355\u72EC\u914D\u7F6E\u3002\" close={close} width=\"wide\">\n <form className=\"dsh-partner-feature-form dsh-partner-companion-create-form\" aria-busy={busy} onSubmit={event => { void submit(event) }}>\n <label><span>\u4F19\u4F34\u540D\u5B57</span><input name=\"name\" required maxLength={60} autoFocus placeholder=\"\u4F8B\u5982\uFF1A\u5C0F\u9ED1\" /></label>\n <label><span>\u4E3B\u8981\u89D2\u8272</span><input name=\"role\" required maxLength={120} placeholder=\"\u4F8B\u5982\uFF1A\u4EA7\u54C1\u4E0E\u5DE5\u7A0B\u534F\u4F5C\u4F19\u4F34\" /></label>\n <label className=\"is-wide\"><span>\u4E00\u53E5\u8BDD\u5B9A\u4F4D</span><input name=\"description\" maxLength={500} placeholder=\"\u5B83\u4E3B\u8981\u8D1F\u8D23\u4EC0\u4E48\uFF0C\u4EC0\u4E48\u65F6\u5019\u5E94\u8BE5\u627E\u5B83\" /></label>\n <label className=\"is-wide\"><span>\u521D\u59CB\u884C\u4E3A\u51C6\u5219</span><textarea name=\"instructions\" maxLength={12000} rows={7} placeholder=\"\u5199\u6E05\u804C\u8D23\u3001\u8868\u8FBE\u65B9\u5F0F\u3001\u5DE5\u4F5C\u8FB9\u754C\u548C\u4EA4\u4ED8\u6807\u51C6\uFF1B\u4E5F\u53EF\u4EE5\u521B\u5EFA\u540E\u518D\u5B8C\u5584\" /></label>\n {error && <WorkspaceNotice>{error}</WorkspaceNotice>}\n <footer><button type=\"button\" disabled={busy} onClick={close}>\u53D6\u6D88</button><button type=\"submit\" className=\"is-primary\" disabled={busy}><IconPlusOutline16 size={14} />{busy ? '\u6B63\u5728\u521B\u5EFA\u2026' : '\u521B\u5EFA\u4F19\u4F34'}</button></footer>\n </form>\n </WorkspaceDialog>\n}\n", "import type { ClientContext, ISessions, SessionId } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { api } from './client-api.js'\nimport { activatePluginWorkspace } from './workspace-ownership.js'\n\nexport interface PartnerController {\n open(companionId?: string): void\n close(): void\n toggle(): void\n isOpen(): boolean\n selected(): string | undefined\n openSession(routeId: string, sessionId: string): Promise<void>\n startSession(companionId: string): Promise<void>\n renewSession(routeId: string): Promise<void>\n subscribe(listener: () => void): () => void\n}\n\nexport function createPartnerController(ctx: ClientContext, pluginId: string, render: (props: PropsRuntime<'conversation'>, controller: PartnerController) => JSX.Element): PartnerController {\n const listeners = new Set<() => void>()\n let selected: string | undefined\n let dispose: (() => void) | undefined\n const notify = (): void => { for (const listener of listeners) listener() }\n const controller: PartnerController = {\n open(companionId) {\n if (companionId !== undefined) selected = companionId\n if (dispose === undefined) {\n activatePluginWorkspace(pluginId)\n dispose = ctx.slots.register({ name: 'conversation', priority: -3 }, props => render(props, controller))\n }\n notify()\n },\n close() { const current = dispose; dispose = undefined; current?.(); notify() },\n toggle() { if (dispose === undefined) controller.open(); else controller.close() },\n isOpen: () => dispose !== undefined,\n selected: () => selected,\n async openSession(routeId, sessionId) {\n const prepared = await api<{ sessionId: string }>(`/sessions/${encodeURIComponent(routeId)}/prepare`, { method: 'POST' })\n if (prepared.sessionId !== sessionId) throw new Error('\u4F19\u4F34\u4F1A\u8BDD\u6807\u8BC6\u4E0D\u4E00\u81F4')\n await waitForClientSession(ctx, sessionId)\n controller.close()\n sessions(ctx).open(sessionId as SessionId)\n },\n async startSession(companionId) {\n const created = await api<{ routeId: string; sessionId: string }>(`/companions/${encodeURIComponent(companionId)}/session`, { method: 'POST' })\n await waitForClientSession(ctx, created.sessionId)\n dispose?.(); dispose = undefined\n sessions(ctx).open(created.sessionId as SessionId)\n },\n async renewSession(routeId) {\n const renewed = await api<{ routeId: string; sessionId: string }>(`/sessions/${encodeURIComponent(routeId)}/renew`, { method: 'POST' })\n await waitForClientSession(ctx, renewed.sessionId)\n controller.close()\n sessions(ctx).open(renewed.sessionId as SessionId)\n },\n subscribe(listener) { listeners.add(listener); return () => listeners.delete(listener) },\n }\n return controller\n}\n\nfunction waitForClientSession(ctx: ClientContext, sessionId: string): Promise<void> {\n const id = sessionId as SessionId\n const clientSessions = sessions(ctx)\n if (clientSessions.list.getSnapshot().byId[id] !== undefined) return Promise.resolve()\n return new Promise((resolve, reject) => {\n let stop = (): void => {}\n const timeout = window.setTimeout(() => { stop(); reject(new Error('\u4F19\u4F34\u4F1A\u8BDD\u5C1A\u672A\u540C\u6B65\u5230\u7F51\u9875\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5')) }, 5_000)\n stop = clientSessions.list.subscribe(() => {\n if (clientSessions.list.getSnapshot().byId[id] === undefined) return\n window.clearTimeout(timeout); stop(); resolve()\n })\n })\n}\n\nfunction sessions(ctx: ClientContext): ISessions { return ctx.sessions as unknown as ISessions }\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,iBAAyF;;;ACAzF,IAAM,2BAA2B;AAO1B,SAAS,wBAAwB,UAAwB;AAC9D,SAAO,cAAc,IAAI,YAAqC,0BAA0B;AAAA,IACtF,QAAQ,EAAE,SAAS;AAAA,EACrB,CAAC,CAAC;AACJ;AAGO,SAAS,uBAAuB,UAAkB,OAA+B;AACtF,QAAM,aAAa,CAAC,UAAuB;AACzC,UAAM,SAAU,MAA+C;AAC/D,QAAI,QAAQ,aAAa,SAAU,OAAM;AAAA,EAC3C;AACA,SAAO,iBAAiB,0BAA0B,UAAU;AAC5D,SAAO,MAAM,OAAO,oBAAoB,0BAA0B,UAAU;AAC9E;;;ADbA,IAAAC,mCAIO;;;AEkBP,mBAAkB;AA9BlB,IAAIC,aAAY,OAAO;AACvB,IAAI,sBAAsB,OAAO;AACjC,IAAIC,gBAAe,OAAO,UAAU;AACpC,IAAI,eAAe,OAAO,UAAU;AACpC,IAAI,kBAAkB,CAAC,KAAK,KAAK,UAAU,OAAO,MAAMD,WAAU,KAAK,KAAK,EAAE,YAAY,MAAM,cAAc,MAAM,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI,GAAG,IAAI;AAC1J,IAAI,iBAAiB,CAAC,GAAG,MAAM;AAC7B,WAAS,QAAQ,MAAM,IAAI,CAAC;AAC1B,QAAIC,cAAa,KAAK,GAAG,IAAI;AAC3B,sBAAgB,GAAG,MAAM,EAAE,IAAI,CAAC;AACpC,MAAI;AACF,aAAS,QAAQ,oBAAoB,CAAC,GAAG;AACvC,UAAI,aAAa,KAAK,GAAG,IAAI;AAC3B,wBAAgB,GAAG,MAAM,EAAE,IAAI,CAAC;AAAA,IACpC;AACF,SAAO;AACT;AACA,IAAI,YAAY,CAAC,QAAQ,YAAY;AACnC,MAAI,SAAS,CAAC;AACd,WAAS,QAAQ;AACf,QAAIA,cAAa,KAAK,QAAQ,IAAI,KAAK,QAAQ,QAAQ,IAAI,IAAI;AAC7D,aAAO,IAAI,IAAI,OAAO,IAAI;AAC9B,MAAI,UAAU,QAAQ;AACpB,aAAS,QAAQ,oBAAoB,MAAM,GAAG;AAC5C,UAAI,QAAQ,QAAQ,IAAI,IAAI,KAAK,aAAa,KAAK,QAAQ,IAAI;AAC7D,eAAO,IAAI,IAAI,OAAO,IAAI;AAAA,IAC9B;AACF,SAAO;AACT;AAWA,IAAI;AAAA,CACH,CAAC,eAAe;AACf,QAAM,UAAU,MAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM5B,YAAY,SAAS,sBAAsB,eAAe,KAAK;AAC7D,WAAK,UAAU;AACf,WAAK,uBAAuB;AAG5B,WAAK,UAAU,CAAC;AAEhB,WAAK,aAAa,CAAC;AACnB,UAAI,UAAUA,SAAQ,eAAe,UAAUA,SAAQ;AACrD,cAAM,IAAI,WAAW,4BAA4B;AACnD,UAAI,MAAM,MAAM,MAAM;AACpB,cAAM,IAAI,WAAW,yBAAyB;AAChD,WAAK,OAAO,UAAU,IAAI;AAC1B,UAAI,MAAM,CAAC;AACX,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM;AAC7B,YAAI,KAAK,KAAK;AAChB,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,aAAK,QAAQ,KAAK,IAAI,MAAM,CAAC;AAC7B,aAAK,WAAW,KAAK,IAAI,MAAM,CAAC;AAAA,MAClC;AACA,WAAK,qBAAqB;AAC1B,YAAM,eAAe,KAAK,oBAAoB,aAAa;AAC3D,WAAK,cAAc,YAAY;AAC/B,UAAI,OAAO,IAAI;AACb,YAAI,aAAa;AACjB,iBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAK,UAAU,CAAC;AAChB,eAAK,eAAe,CAAC;AACrB,gBAAM,UAAU,KAAK,gBAAgB;AACrC,cAAI,UAAU,YAAY;AACxB,kBAAM;AACN,yBAAa;AAAA,UACf;AACA,eAAK,UAAU,CAAC;AAAA,QAClB;AAAA,MACF;AACA,aAAO,KAAK,OAAO,OAAO,CAAC;AAC3B,WAAK,OAAO;AACZ,WAAK,UAAU,GAAG;AAClB,WAAK,eAAe,GAAG;AACvB,WAAK,aAAa,CAAC;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,OAAO,WAAW,MAAM,KAAK;AAC3B,YAAM,OAAO,WAAW,UAAU,aAAa,IAAI;AACnD,aAAOA,SAAQ,eAAe,MAAM,GAAG;AAAA,IACzC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,aAAa,MAAM,KAAK;AAC7B,YAAM,MAAM,WAAW,UAAU,UAAU,IAAI;AAC/C,aAAOA,SAAQ,eAAe,CAAC,GAAG,GAAG,GAAG;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,OAAO,eAAe,MAAM,KAAK,aAAa,GAAG,aAAa,IAAI,OAAO,IAAI,WAAW,MAAM;AAC5F,UAAI,EAAEA,SAAQ,eAAe,cAAc,cAAc,cAAc,cAAcA,SAAQ,gBAAgB,OAAO,MAAM,OAAO;AAC/H,cAAM,IAAI,WAAW,eAAe;AACtC,UAAI;AACJ,UAAI;AACJ,WAAK,UAAU,cAAc,WAAW;AACtC,cAAM,oBAAoBA,SAAQ,oBAAoB,SAAS,GAAG,IAAI;AACtE,cAAM,WAAW,UAAU,aAAa,MAAM,OAAO;AACrD,YAAI,YAAY,mBAAmB;AACjC,yBAAe;AACf;AAAA,QACF;AACA,YAAI,WAAW;AACb,gBAAM,IAAI,WAAW,eAAe;AAAA,MACxC;AACA,iBAAW,UAAU,CAACA,SAAQ,IAAI,QAAQA,SAAQ,IAAI,UAAUA,SAAQ,IAAI,IAAI,GAAG;AACjF,YAAI,YAAY,gBAAgBA,SAAQ,oBAAoB,SAAS,MAAM,IAAI;AAC7E,gBAAM;AAAA,MACV;AACA,UAAI,KAAK,CAAC;AACV,iBAAW,OAAO,MAAM;AACtB,mBAAW,IAAI,KAAK,UAAU,GAAG,EAAE;AACnC,mBAAW,IAAI,UAAU,IAAI,KAAK,iBAAiB,OAAO,GAAG,EAAE;AAC/D,mBAAW,KAAK,IAAI,QAAQ;AAC1B,aAAG,KAAK,CAAC;AAAA,MACb;AACA,aAAO,GAAG,UAAU,YAAY;AAChC,YAAM,mBAAmBA,SAAQ,oBAAoB,SAAS,GAAG,IAAI;AACrE,aAAO,GAAG,UAAU,gBAAgB;AACpC,iBAAW,GAAG,KAAK,IAAI,GAAG,mBAAmB,GAAG,MAAM,GAAG,EAAE;AAC3D,iBAAW,IAAI,IAAI,GAAG,SAAS,KAAK,GAAG,EAAE;AACzC,aAAO,GAAG,SAAS,KAAK,CAAC;AACzB,eAAS,UAAU,KAAK,GAAG,SAAS,kBAAkB,WAAW,MAAM;AACrE,mBAAW,SAAS,GAAG,EAAE;AAC3B,UAAI,gBAAgB,CAAC;AACrB,aAAO,cAAc,SAAS,IAAI,GAAG;AACnC,sBAAc,KAAK,CAAC;AACtB,SAAG,QAAQ,CAAC,GAAG,MAAM,cAAc,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE;AAC/D,aAAO,IAAIA,SAAQ,SAAS,KAAK,eAAe,IAAI;AAAA,IACtD;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,UAAU,GAAG,GAAG;AACd,aAAO,KAAK,KAAK,IAAI,KAAK,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAA,IAChF;AAAA;AAAA,IAEA,aAAa;AACX,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA,IAGA,uBAAuB;AACrB,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,aAAK,kBAAkB,GAAG,GAAG,IAAI,KAAK,CAAC;AACvC,aAAK,kBAAkB,GAAG,GAAG,IAAI,KAAK,CAAC;AAAA,MACzC;AACA,WAAK,kBAAkB,GAAG,CAAC;AAC3B,WAAK,kBAAkB,KAAK,OAAO,GAAG,CAAC;AACvC,WAAK,kBAAkB,GAAG,KAAK,OAAO,CAAC;AACvC,YAAM,cAAc,KAAK,6BAA6B;AACtD,YAAM,WAAW,YAAY;AAC7B,eAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,iBAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,cAAI,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,WAAW,KAAK,KAAK,WAAW,KAAK,KAAK;AACjF,iBAAK,qBAAqB,YAAY,CAAC,GAAG,YAAY,CAAC,CAAC;AAAA,QAC5D;AAAA,MACF;AACA,WAAK,eAAe,CAAC;AACrB,WAAK,YAAY;AAAA,IACnB;AAAA;AAAA;AAAA,IAGA,eAAe,MAAM;AACnB,YAAM,OAAO,KAAK,qBAAqB,cAAc,IAAI;AACzD,UAAI,MAAM;AACV,eAAS,IAAI,GAAG,IAAI,IAAI;AACtB,cAAM,OAAO,KAAK,QAAQ,KAAK;AACjC,YAAM,QAAQ,QAAQ,KAAK,OAAO;AAClC,aAAO,SAAS,MAAM,CAAC;AACvB,eAAS,IAAI,GAAG,KAAK,GAAG;AACtB,aAAK,kBAAkB,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AAC9C,WAAK,kBAAkB,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AAC5C,WAAK,kBAAkB,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AAC5C,WAAK,kBAAkB,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AAC5C,eAAS,IAAI,GAAG,IAAI,IAAI;AACtB,aAAK,kBAAkB,KAAK,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AACnD,eAAS,IAAI,GAAG,IAAI,GAAG;AACrB,aAAK,kBAAkB,KAAK,OAAO,IAAI,GAAG,GAAG,OAAO,MAAM,CAAC,CAAC;AAC9D,eAAS,IAAI,GAAG,IAAI,IAAI;AACtB,aAAK,kBAAkB,GAAG,KAAK,OAAO,KAAK,GAAG,OAAO,MAAM,CAAC,CAAC;AAC/D,WAAK,kBAAkB,GAAG,KAAK,OAAO,GAAG,IAAI;AAAA,IAC/C;AAAA;AAAA;AAAA,IAGA,cAAc;AACZ,UAAI,KAAK,UAAU;AACjB;AACF,UAAI,MAAM,KAAK;AACf,eAAS,IAAI,GAAG,IAAI,IAAI;AACtB,cAAM,OAAO,KAAK,QAAQ,MAAM;AAClC,YAAM,OAAO,KAAK,WAAW,KAAK;AAClC,aAAO,SAAS,MAAM,CAAC;AACvB,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,QAAQ,OAAO,MAAM,CAAC;AAC5B,cAAM,IAAI,KAAK,OAAO,KAAK,IAAI;AAC/B,cAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAC1B,aAAK,kBAAkB,GAAG,GAAG,KAAK;AAClC,aAAK,kBAAkB,GAAG,GAAG,KAAK;AAAA,MACpC;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,kBAAkB,GAAG,GAAG;AACtB,eAAS,KAAK,IAAI,MAAM,GAAG,MAAM;AAC/B,iBAAS,KAAK,IAAI,MAAM,GAAG,MAAM;AAC/B,gBAAM,OAAO,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;AAChD,gBAAM,KAAK,IAAI;AACf,gBAAM,KAAK,IAAI;AACf,cAAI,KAAK,MAAM,KAAK,KAAK,QAAQ,KAAK,MAAM,KAAK,KAAK;AACpD,iBAAK,kBAAkB,IAAI,IAAI,QAAQ,KAAK,QAAQ,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,qBAAqB,GAAG,GAAG;AACzB,eAAS,KAAK,IAAI,MAAM,GAAG,MAAM;AAC/B,iBAAS,KAAK,IAAI,MAAM,GAAG;AACzB,eAAK,kBAAkB,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC;AAAA,MACpF;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,kBAAkB,GAAG,GAAG,QAAQ;AAC9B,WAAK,QAAQ,CAAC,EAAE,CAAC,IAAI;AACrB,WAAK,WAAW,CAAC,EAAE,CAAC,IAAI;AAAA,IAC1B;AAAA;AAAA;AAAA;AAAA,IAIA,oBAAoB,MAAM;AACxB,YAAM,MAAM,KAAK;AACjB,YAAM,MAAM,KAAK;AACjB,UAAI,KAAK,UAAUA,SAAQ,oBAAoB,KAAK,GAAG;AACrD,cAAM,IAAI,WAAW,kBAAkB;AACzC,YAAM,YAAYA,SAAQ,4BAA4B,IAAI,OAAO,EAAE,GAAG;AACtE,YAAM,cAAcA,SAAQ,wBAAwB,IAAI,OAAO,EAAE,GAAG;AACpE,YAAM,eAAe,KAAK,MAAMA,SAAQ,qBAAqB,GAAG,IAAI,CAAC;AACrE,YAAM,iBAAiB,YAAY,eAAe;AAClD,YAAM,gBAAgB,KAAK,MAAM,eAAe,SAAS;AACzD,UAAI,SAAS,CAAC;AACd,YAAM,QAAQA,SAAQ,0BAA0B,WAAW;AAC3D,eAAS,IAAI,GAAG,IAAI,GAAG,IAAI,WAAW,KAAK;AACzC,YAAI,MAAM,KAAK,MAAM,GAAG,IAAI,gBAAgB,eAAe,IAAI,iBAAiB,IAAI,EAAE;AACtF,aAAK,IAAI;AACT,cAAM,MAAMA,SAAQ,4BAA4B,KAAK,KAAK;AAC1D,YAAI,IAAI;AACN,cAAI,KAAK,CAAC;AACZ,eAAO,KAAK,IAAI,OAAO,GAAG,CAAC;AAAA,MAC7B;AACA,UAAI,SAAS,CAAC;AACd,eAAS,IAAI,GAAG,IAAI,OAAO,CAAC,EAAE,QAAQ,KAAK;AACzC,eAAO,QAAQ,CAAC,OAAO,MAAM;AAC3B,cAAI,KAAK,gBAAgB,eAAe,KAAK;AAC3C,mBAAO,KAAK,MAAM,CAAC,CAAC;AAAA,QACxB,CAAC;AAAA,MACH;AACA,aAAO,OAAO,UAAU,YAAY;AACpC,aAAO;AAAA,IACT;AAAA;AAAA;AAAA,IAGA,cAAc,MAAM;AAClB,UAAI,KAAK,UAAU,KAAK,MAAMA,SAAQ,qBAAqB,KAAK,OAAO,IAAI,CAAC;AAC1E,cAAM,IAAI,WAAW,kBAAkB;AACzC,UAAI,IAAI;AACR,eAAS,QAAQ,KAAK,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG;AACtD,YAAI,SAAS;AACX,kBAAQ;AACV,iBAAS,OAAO,GAAG,OAAO,KAAK,MAAM,QAAQ;AAC3C,mBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,kBAAM,IAAI,QAAQ;AAClB,kBAAM,UAAU,QAAQ,IAAI,MAAM;AAClC,kBAAM,IAAI,SAAS,KAAK,OAAO,IAAI,OAAO;AAC1C,gBAAI,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC,KAAK,IAAI,KAAK,SAAS,GAAG;AACjD,mBAAK,QAAQ,CAAC,EAAE,CAAC,IAAI,OAAO,KAAK,MAAM,CAAC,GAAG,KAAK,IAAI,EAAE;AACtD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO,KAAK,KAAK,SAAS,CAAC;AAAA,IAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,UAAU,MAAM;AACd,UAAI,OAAO,KAAK,OAAO;AACrB,cAAM,IAAI,WAAW,yBAAyB;AAChD,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,iBAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,cAAI;AACJ,kBAAQ,MAAM;AAAA,YACZ,KAAK;AACH,wBAAU,IAAI,KAAK,KAAK;AACxB;AAAA,YACF,KAAK;AACH,uBAAS,IAAI,KAAK;AAClB;AAAA,YACF,KAAK;AACH,uBAAS,IAAI,KAAK;AAClB;AAAA,YACF,KAAK;AACH,wBAAU,IAAI,KAAK,KAAK;AACxB;AAAA,YACF,KAAK;AACH,wBAAU,KAAK,MAAM,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK;AACxD;AAAA,YACF,KAAK;AACH,uBAAS,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK;AAClC;AAAA,YACF,KAAK;AACH,wBAAU,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK;AACxC;AAAA,YACF,KAAK;AACH,yBAAW,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;AAC1C;AAAA,YACF;AACE,oBAAM,IAAI,MAAM,aAAa;AAAA,UACjC;AACA,cAAI,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC,KAAK;AAC5B,iBAAK,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA,IAGA,kBAAkB;AAChB,UAAI,SAAS;AACb,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,YAAI,WAAW;AACf,YAAI,OAAO;AACX,YAAI,aAAa,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACrC,iBAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,cAAI,KAAK,QAAQ,CAAC,EAAE,CAAC,KAAK,UAAU;AAClC;AACA,gBAAI,QAAQ;AACV,wBAAUA,SAAQ;AAAA,qBACX,OAAO;AACd;AAAA,UACJ,OAAO;AACL,iBAAK,wBAAwB,MAAM,UAAU;AAC7C,gBAAI,CAAC;AACH,wBAAU,KAAK,2BAA2B,UAAU,IAAIA,SAAQ;AAClE,uBAAW,KAAK,QAAQ,CAAC,EAAE,CAAC;AAC5B,mBAAO;AAAA,UACT;AAAA,QACF;AACA,kBAAU,KAAK,+BAA+B,UAAU,MAAM,UAAU,IAAIA,SAAQ;AAAA,MACtF;AACA,eAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,YAAI,WAAW;AACf,YAAI,OAAO;AACX,YAAI,aAAa,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACrC,iBAAS,IAAI,GAAG,IAAI,KAAK,MAAM,KAAK;AAClC,cAAI,KAAK,QAAQ,CAAC,EAAE,CAAC,KAAK,UAAU;AAClC;AACA,gBAAI,QAAQ;AACV,wBAAUA,SAAQ;AAAA,qBACX,OAAO;AACd;AAAA,UACJ,OAAO;AACL,iBAAK,wBAAwB,MAAM,UAAU;AAC7C,gBAAI,CAAC;AACH,wBAAU,KAAK,2BAA2B,UAAU,IAAIA,SAAQ;AAClE,uBAAW,KAAK,QAAQ,CAAC,EAAE,CAAC;AAC5B,mBAAO;AAAA,UACT;AAAA,QACF;AACA,kBAAU,KAAK,+BAA+B,UAAU,MAAM,UAAU,IAAIA,SAAQ;AAAA,MACtF;AACA,eAAS,IAAI,GAAG,IAAI,KAAK,OAAO,GAAG,KAAK;AACtC,iBAAS,IAAI,GAAG,IAAI,KAAK,OAAO,GAAG,KAAK;AACtC,gBAAM,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC;AAC/B,cAAI,SAAS,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC,KAAK,SAAS,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,KAAK,SAAS,KAAK,QAAQ,IAAI,CAAC,EAAE,IAAI,CAAC;AAC1G,sBAAUA,SAAQ;AAAA,QACtB;AAAA,MACF;AACA,UAAI,OAAO;AACX,iBAAW,OAAO,KAAK;AACrB,eAAO,IAAI,OAAO,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,IAAI,IAAI;AAC/D,YAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,YAAM,IAAI,KAAK,KAAK,KAAK,IAAI,OAAO,KAAK,QAAQ,EAAE,IAAI,KAAK,IAAI;AAChE,aAAO,KAAK,KAAK,KAAK,CAAC;AACvB,gBAAU,IAAIA,SAAQ;AACtB,aAAO,KAAK,UAAU,UAAU,OAAO;AACvC,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,+BAA+B;AAC7B,UAAI,KAAK,WAAW;AAClB,eAAO,CAAC;AAAA,WACL;AACH,cAAM,WAAW,KAAK,MAAM,KAAK,UAAU,CAAC,IAAI;AAChD,cAAM,OAAO,KAAK,WAAW,KAAK,KAAK,KAAK,MAAM,KAAK,UAAU,IAAI,MAAM,WAAW,IAAI,EAAE,IAAI;AAChG,YAAI,SAAS,CAAC,CAAC;AACf,iBAAS,MAAM,KAAK,OAAO,GAAG,OAAO,SAAS,UAAU,OAAO;AAC7D,iBAAO,OAAO,GAAG,GAAG,GAAG;AACzB,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAIA,OAAO,qBAAqB,KAAK;AAC/B,UAAI,MAAMA,SAAQ,eAAe,MAAMA,SAAQ;AAC7C,cAAM,IAAI,WAAW,6BAA6B;AACpD,UAAI,UAAU,KAAK,MAAM,OAAO,MAAM;AACtC,UAAI,OAAO,GAAG;AACZ,cAAM,WAAW,KAAK,MAAM,MAAM,CAAC,IAAI;AACvC,mBAAW,KAAK,WAAW,MAAM,WAAW;AAC5C,YAAI,OAAO;AACT,oBAAU;AAAA,MACd;AACA,aAAO,OAAO,UAAU,UAAU,KAAK;AACvC,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA,IAIA,OAAO,oBAAoB,KAAK,KAAK;AACnC,aAAO,KAAK,MAAMA,SAAQ,qBAAqB,GAAG,IAAI,CAAC,IAAIA,SAAQ,wBAAwB,IAAI,OAAO,EAAE,GAAG,IAAIA,SAAQ,4BAA4B,IAAI,OAAO,EAAE,GAAG;AAAA,IACrK;AAAA;AAAA;AAAA,IAGA,OAAO,0BAA0B,QAAQ;AACvC,UAAI,SAAS,KAAK,SAAS;AACzB,cAAM,IAAI,WAAW,qBAAqB;AAC5C,UAAI,SAAS,CAAC;AACd,eAAS,IAAI,GAAG,IAAI,SAAS,GAAG;AAC9B,eAAO,KAAK,CAAC;AACf,aAAO,KAAK,CAAC;AACb,UAAI,OAAO;AACX,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,iBAAO,CAAC,IAAIA,SAAQ,oBAAoB,OAAO,CAAC,GAAG,IAAI;AACvD,cAAI,IAAI,IAAI,OAAO;AACjB,mBAAO,CAAC,KAAK,OAAO,IAAI,CAAC;AAAA,QAC7B;AACA,eAAOA,SAAQ,oBAAoB,MAAM,CAAC;AAAA,MAC5C;AACA,aAAO;AAAA,IACT;AAAA;AAAA,IAEA,OAAO,4BAA4B,MAAM,SAAS;AAChD,UAAI,SAAS,QAAQ,IAAI,CAAC,MAAM,CAAC;AACjC,iBAAW,KAAK,MAAM;AACpB,cAAM,SAAS,IAAI,OAAO,MAAM;AAChC,eAAO,KAAK,CAAC;AACb,gBAAQ,QAAQ,CAAC,MAAM,MAAM,OAAO,CAAC,KAAKA,SAAQ,oBAAoB,MAAM,MAAM,CAAC;AAAA,MACrF;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA,IAGA,OAAO,oBAAoB,GAAG,GAAG;AAC/B,UAAI,MAAM,KAAK,KAAK,MAAM,KAAK;AAC7B,cAAM,IAAI,WAAW,mBAAmB;AAC1C,UAAI,IAAI;AACR,eAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,YAAI,KAAK,KAAK,MAAM,KAAK;AACzB,cAAM,MAAM,IAAI,KAAK;AAAA,MACvB;AACA,aAAO,MAAM,KAAK,CAAC;AACnB,aAAO;AAAA,IACT;AAAA;AAAA;AAAA,IAGA,2BAA2B,YAAY;AACrC,YAAM,IAAI,WAAW,CAAC;AACtB,aAAO,KAAK,KAAK,OAAO,CAAC;AACzB,YAAM,OAAO,IAAI,KAAK,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,IAAI,KAAK,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK;AAC7G,cAAQ,QAAQ,WAAW,CAAC,KAAK,IAAI,KAAK,WAAW,CAAC,KAAK,IAAI,IAAI,MAAM,QAAQ,WAAW,CAAC,KAAK,IAAI,KAAK,WAAW,CAAC,KAAK,IAAI,IAAI;AAAA,IACtI;AAAA;AAAA,IAEA,+BAA+B,iBAAiB,kBAAkB,YAAY;AAC5E,UAAI,iBAAiB;AACnB,aAAK,wBAAwB,kBAAkB,UAAU;AACzD,2BAAmB;AAAA,MACrB;AACA,0BAAoB,KAAK;AACzB,WAAK,wBAAwB,kBAAkB,UAAU;AACzD,aAAO,KAAK,2BAA2B,UAAU;AAAA,IACnD;AAAA;AAAA,IAEA,wBAAwB,kBAAkB,YAAY;AACpD,UAAI,WAAW,CAAC,KAAK;AACnB,4BAAoB,KAAK;AAC3B,iBAAW,IAAI;AACf,iBAAW,QAAQ,gBAAgB;AAAA,IACrC;AAAA,EACF;AAGA,UAAQ,cAAc;AAEtB,UAAQ,cAAc;AAEtB,UAAQ,aAAa;AACrB,UAAQ,aAAa;AACrB,UAAQ,aAAa;AACrB,UAAQ,aAAa;AACrB,UAAQ,0BAA0B;AAAA;AAAA;AAAA,IAGhC,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAElK,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAEnK,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAEnK,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,EAErK;AACA,UAAQ,8BAA8B;AAAA;AAAA;AAAA,IAGpC,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAE5I,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAErJ,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,IAExJ,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA;AAAA,EAE3J;AACA,MAAI,SAAS;AACb,aAAW,SAAS;AACpB,WAAS,WAAW,KAAK,KAAK,IAAI;AAChC,QAAI,MAAM,KAAK,MAAM,MAAM,QAAQ,OAAO;AACxC,YAAM,IAAI,WAAW,oBAAoB;AAC3C,aAAS,IAAI,MAAM,GAAG,KAAK,GAAG;AAC5B,SAAG,KAAK,QAAQ,IAAI,CAAC;AAAA,EACzB;AACA,WAAS,OAAO,GAAG,GAAG;AACpB,YAAQ,MAAM,IAAI,MAAM;AAAA,EAC1B;AACA,WAAS,OAAO,MAAM;AACpB,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,iBAAiB;AAAA,EACrC;AACA,QAAM,aAAa,MAAMC,YAAW;AAAA;AAAA;AAAA;AAAA;AAAA,IAKlC,YAAY,MAAM,UAAU,SAAS;AACnC,WAAK,OAAO;AACZ,WAAK,WAAW;AAChB,WAAK,UAAU;AACf,UAAI,WAAW;AACb,cAAM,IAAI,WAAW,kBAAkB;AACzC,WAAK,UAAU,QAAQ,MAAM;AAAA,IAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,UAAU,MAAM;AACrB,UAAI,KAAK,CAAC;AACV,iBAAW,KAAK;AACd,mBAAW,GAAG,GAAG,EAAE;AACrB,aAAO,IAAIA,YAAWA,YAAW,KAAK,MAAM,KAAK,QAAQ,EAAE;AAAA,IAC7D;AAAA;AAAA,IAEA,OAAO,YAAY,QAAQ;AACzB,UAAI,CAACA,YAAW,UAAU,MAAM;AAC9B,cAAM,IAAI,WAAW,wCAAwC;AAC/D,UAAI,KAAK,CAAC;AACV,eAAS,IAAI,GAAG,IAAI,OAAO,UAAU;AACnC,cAAM,IAAI,KAAK,IAAI,OAAO,SAAS,GAAG,CAAC;AACvC,mBAAW,SAAS,OAAO,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE;AAClE,aAAK;AAAA,MACP;AACA,aAAO,IAAIA,YAAWA,YAAW,KAAK,SAAS,OAAO,QAAQ,EAAE;AAAA,IAClE;AAAA;AAAA;AAAA;AAAA,IAIA,OAAO,iBAAiB,MAAM;AAC5B,UAAI,CAACA,YAAW,eAAe,IAAI;AACjC,cAAM,IAAI,WAAW,6DAA6D;AACpF,UAAI,KAAK,CAAC;AACV,UAAI;AACJ,WAAK,IAAI,GAAG,IAAI,KAAK,KAAK,QAAQ,KAAK,GAAG;AACxC,YAAI,OAAOA,YAAW,qBAAqB,QAAQ,KAAK,OAAO,CAAC,CAAC,IAAI;AACrE,gBAAQA,YAAW,qBAAqB,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC;AAClE,mBAAW,MAAM,IAAI,EAAE;AAAA,MACzB;AACA,UAAI,IAAI,KAAK;AACX,mBAAWA,YAAW,qBAAqB,QAAQ,KAAK,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE;AAC3E,aAAO,IAAIA,YAAWA,YAAW,KAAK,cAAc,KAAK,QAAQ,EAAE;AAAA,IACrE;AAAA;AAAA;AAAA,IAGA,OAAO,aAAa,MAAM;AACxB,UAAI,QAAQ;AACV,eAAO,CAAC;AAAA,eACDA,YAAW,UAAU,IAAI;AAChC,eAAO,CAACA,YAAW,YAAY,IAAI,CAAC;AAAA,eAC7BA,YAAW,eAAe,IAAI;AACrC,eAAO,CAACA,YAAW,iBAAiB,IAAI,CAAC;AAAA;AAEzC,eAAO,CAACA,YAAW,UAAUA,YAAW,gBAAgB,IAAI,CAAC,CAAC;AAAA,IAClE;AAAA;AAAA;AAAA,IAGA,OAAO,QAAQ,WAAW;AACxB,UAAI,KAAK,CAAC;AACV,UAAI,YAAY;AACd,cAAM,IAAI,WAAW,mCAAmC;AAAA,eACjD,YAAY,KAAK;AACxB,mBAAW,WAAW,GAAG,EAAE;AAAA,eACpB,YAAY,KAAK,IAAI;AAC5B,mBAAW,GAAG,GAAG,EAAE;AACnB,mBAAW,WAAW,IAAI,EAAE;AAAA,MAC9B,WAAW,YAAY,KAAK;AAC1B,mBAAW,GAAG,GAAG,EAAE;AACnB,mBAAW,WAAW,IAAI,EAAE;AAAA,MAC9B;AACE,cAAM,IAAI,WAAW,mCAAmC;AAC1D,aAAO,IAAIA,YAAWA,YAAW,KAAK,KAAK,GAAG,EAAE;AAAA,IAClD;AAAA;AAAA;AAAA,IAGA,OAAO,UAAU,MAAM;AACrB,aAAOA,YAAW,cAAc,KAAK,IAAI;AAAA,IAC3C;AAAA;AAAA;AAAA;AAAA,IAIA,OAAO,eAAe,MAAM;AAC1B,aAAOA,YAAW,mBAAmB,KAAK,IAAI;AAAA,IAChD;AAAA;AAAA;AAAA,IAGA,UAAU;AACR,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AAAA;AAAA;AAAA,IAGA,OAAO,aAAa,MAAM,SAAS;AACjC,UAAI,SAAS;AACb,iBAAW,OAAO,MAAM;AACtB,cAAM,SAAS,IAAI,KAAK,iBAAiB,OAAO;AAChD,YAAI,IAAI,YAAY,KAAK;AACvB,iBAAO;AACT,kBAAU,IAAI,SAAS,IAAI,QAAQ;AAAA,MACrC;AACA,aAAO;AAAA,IACT;AAAA;AAAA,IAEA,OAAO,gBAAgB,KAAK;AAC1B,YAAM,UAAU,GAAG;AACnB,UAAI,SAAS,CAAC;AACd,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAI,IAAI,OAAO,CAAC,KAAK;AACnB,iBAAO,KAAK,IAAI,WAAW,CAAC,CAAC;AAAA,aAC1B;AACH,iBAAO,KAAK,SAAS,IAAI,UAAU,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACrD,eAAK;AAAA,QACP;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAGA,aAAW,gBAAgB;AAE3B,aAAW,qBAAqB;AAGhC,aAAW,uBAAuB;AAClC,MAAI,YAAY;AAChB,aAAW,YAAY;AACzB,GAAG,cAAc,YAAY,CAAC,EAAE;AAAA,CAC/B,CAAC,eAAe;AACf,MAAI;AACJ,GAAC,CAAC,YAAY;AACZ,UAAM,OAAO,MAAM,KAAK;AAAA;AAAA;AAAA,MAGtB,YAAY,SAAS,YAAY;AAC/B,aAAK,UAAU;AACf,aAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAEA,SAAK,MAAM,IAAI,KAAK,GAAG,CAAC;AAExB,SAAK,SAAS,IAAI,KAAK,GAAG,CAAC;AAE3B,SAAK,WAAW,IAAI,KAAK,GAAG,CAAC;AAE7B,SAAK,OAAO,IAAI,KAAK,GAAG,CAAC;AACzB,QAAI,MAAM;AACV,YAAQ,MAAM;AAAA,EAChB,GAAG,SAAS,WAAW,WAAW,WAAW,SAAS,CAAC,EAAE;AAC3D,GAAG,cAAc,YAAY,CAAC,EAAE;AAAA,CAC/B,CAAC,eAAe;AACf,MAAI;AACJ,GAAC,CAAC,eAAe;AACf,UAAM,QAAQ,MAAM,MAAM;AAAA;AAAA,MAExB,YAAY,UAAU,kBAAkB;AACtC,aAAK,WAAW;AAChB,aAAK,mBAAmB;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAIA,iBAAiB,KAAK;AACpB,eAAO,KAAK,iBAAiB,KAAK,OAAO,MAAM,KAAK,EAAE,CAAC;AAAA,MACzD;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;AACzC,UAAM,eAAe,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;AAC7C,UAAM,OAAO,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;AACrC,UAAM,QAAQ,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;AACtC,UAAM,MAAM,IAAI,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AAClC,QAAI,OAAO;AACX,eAAW,OAAO;AAAA,EACpB,GAAG,YAAY,WAAW,cAAc,WAAW,YAAY,CAAC,EAAE;AACpE,GAAG,cAAc,YAAY,CAAC,EAAE;AAChC,IAAI,oBAAoB;AAQxB,IAAI,kBAAkB;AAAA,EACpB,GAAG,kBAAkB,OAAO,IAAI;AAAA,EAChC,GAAG,kBAAkB,OAAO,IAAI;AAAA,EAChC,GAAG,kBAAkB,OAAO,IAAI;AAAA,EAChC,GAAG,kBAAkB,OAAO,IAAI;AAClC;AACA,IAAI,eAAe;AACnB,IAAI,gBAAgB;AACpB,IAAI,kBAAkB;AACtB,IAAI,kBAAkB;AACtB,IAAI,wBAAwB;AAC5B,IAAI,qBAAqB;AACzB,IAAI,mBAAmB;AACvB,IAAI,sBAAsB;AAC1B,IAAI,oBAAoB;AACxB,SAAS,aAAa,SAAS,SAAS,GAAG;AACzC,QAAM,MAAM,CAAC;AACb,UAAQ,QAAQ,SAAS,KAAK,GAAG;AAC/B,QAAI,QAAQ;AACZ,QAAI,QAAQ,SAAS,MAAM,GAAG;AAC5B,UAAI,CAAC,QAAQ,UAAU,MAAM;AAC3B,YAAI;AAAA,UACF,IAAI,QAAQ,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,KAAK,MAAM,QAAQ,MAAM;AAAA,QACnE;AACA,gBAAQ;AACR;AAAA,MACF;AACA,UAAI,MAAM,IAAI,SAAS,GAAG;AACxB,YAAI,CAAC,MAAM;AACT;AAAA,QACF;AACA,YAAI,UAAU,MAAM;AAClB,cAAI,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,SAAS,IAAI,MAAM,GAAG;AAAA,QAC7D,OAAO;AACL,cAAI;AAAA,YACF,IAAI,QAAQ,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,MAAM,QAAQ,MAAM;AAAA,UACxE;AAAA,QACF;AACA;AAAA,MACF;AACA,UAAI,QAAQ,UAAU,MAAM;AAC1B,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,SAAO,IAAI,KAAK,EAAE;AACpB;AACA,SAAS,gBAAgB,SAAS,YAAY;AAC5C,SAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,KAAK,MAAM;AACrC,QAAI,IAAI,WAAW,KAAK,KAAK,WAAW,IAAI,WAAW,GAAG;AACxD,aAAO;AAAA,IACT;AACA,WAAO,IAAI,IAAI,CAAC,MAAM,MAAM;AAC1B,UAAI,IAAI,WAAW,KAAK,KAAK,WAAW,IAAI,WAAW,GAAG;AACxD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AACH;AACA,SAAS,iBAAiB,OAAO,MAAM,QAAQ,eAAe;AAC5D,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAM,SAAS,SAAS;AACzC,QAAM,cAAc,KAAK,MAAM,OAAO,iBAAiB;AACvD,QAAM,QAAQ,WAAW;AACzB,QAAM,KAAK,cAAc,SAAS,eAAe;AACjD,QAAM,KAAK,cAAc,UAAU,eAAe;AAClD,QAAM,IAAI,cAAc,KAAK,OAAO,MAAM,SAAS,IAAI,IAAI,IAAI,cAAc,IAAI;AACjF,QAAM,IAAI,cAAc,KAAK,OAAO,MAAM,SAAS,IAAI,IAAI,IAAI,cAAc,IAAI;AACjF,QAAM,UAAU,cAAc,WAAW,OAAO,IAAI,cAAc;AAClE,MAAI,aAAa;AACjB,MAAI,cAAc,UAAU;AAC1B,QAAI,SAAS,KAAK,MAAM,CAAC;AACzB,QAAI,SAAS,KAAK,MAAM,CAAC;AACzB,QAAI,QAAQ,KAAK,KAAK,IAAI,IAAI,MAAM;AACpC,QAAI,QAAQ,KAAK,KAAK,IAAI,IAAI,MAAM;AACpC,iBAAa,EAAE,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM;AAAA,EAC1D;AACA,QAAM,cAAc,cAAc;AAClC,SAAO,EAAE,GAAG,GAAG,GAAG,GAAG,YAAY,SAAS,YAAY;AACxD;AACA,SAAS,cAAc,eAAe,YAAY;AAChD,MAAI,cAAc,MAAM;AACtB,WAAO,KAAK,IAAI,KAAK,MAAM,UAAU,GAAG,CAAC;AAAA,EAC3C;AACA,SAAO,gBAAgB,mBAAmB;AAC5C;AACA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAG;AACD,MAAI,SAAS,aAAAC,QAAM,QAAQ,MAAM;AAC/B,UAAM,SAAS,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACpD,UAAM,WAAW,OAAO,OAAO,CAAC,OAAO,MAAM;AAC3C,YAAM,KAAK,GAAG,kBAAkB,UAAU,aAAa,CAAC,CAAC;AACzD,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AACL,WAAO,kBAAkB,OAAO;AAAA,MAC9B;AAAA,MACA,gBAAgB,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,OAAO,YAAY,UAAU,CAAC;AACzC,QAAM,EAAE,OAAO,QAAQ,UAAU,wBAAwB,IAAI,aAAAA,QAAM,QAAQ,MAAM;AAC/E,QAAI,SAAS,OAAO,WAAW;AAC/B,UAAM,UAAU,cAAc,eAAe,UAAU;AACvD,UAAM,YAAY,OAAO,SAAS,UAAU;AAC5C,UAAM,2BAA2B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,yBAAyB;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,QAAQ,MAAM,eAAe,eAAe,UAAU,CAAC;AAC3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AACA,IAAI,mBAAkB,WAAW;AAC/B,MAAI;AACF,QAAI,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC;AAAA,EACnC,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AACA,SAAO;AACT,GAAE;AACF,IAAI,eAAe,aAAAA,QAAM;AAAA,EACvB,SAAS,cAAc,OAAO,cAAc;AAC1C,UAAM,KAAK,OAAO;AAAA,MAChB;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,IAAI,aAAa,UAAU,IAAI;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,KAAK,YAAY,EAAE,MAAM,IAAI,IAAI,aAAa,UAAU,IAAI,CAAC,OAAO,CAAC;AAC3E,UAAM,SAAS,iBAAiB,OAAO,SAAS,cAAc;AAC9D,UAAM,UAAU,aAAAA,QAAM,OAAO,IAAI;AACjC,UAAM,SAAS,aAAAA,QAAM,OAAO,IAAI;AAChC,UAAM,eAAe,aAAAA,QAAM;AAAA,MACzB,CAAC,SAAS;AACR,gBAAQ,UAAU;AAClB,YAAI,OAAO,iBAAiB,YAAY;AACtC,uBAAa,IAAI;AAAA,QACnB,WAAW,cAAc;AACvB,uBAAa,UAAU;AAAA,QACzB;AAAA,MACF;AAAA,MACA,CAAC,YAAY;AAAA,IACf;AACA,UAAM,CAAC,aAAa,gBAAgB,IAAI,aAAAA,QAAM,SAAS,KAAK;AAC5D,UAAM,EAAE,QAAQ,OAAO,UAAU,wBAAwB,IAAI,UAAU;AAAA,MACrE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,iBAAAA,QAAM,UAAU,MAAM;AACpB,UAAI,QAAQ,WAAW,MAAM;AAC3B,cAAM,SAAS,QAAQ;AACvB,cAAM,MAAM,OAAO,WAAW,IAAI;AAClC,YAAI,CAAC,KAAK;AACR;AAAA,QACF;AACA,YAAI,cAAc;AAClB,cAAM,QAAQ,OAAO;AACrB,cAAM,oBAAoB,2BAA2B,QAAQ,UAAU,QAAQ,MAAM,YAAY,MAAM,kBAAkB,KAAK,MAAM,iBAAiB;AACrJ,YAAI,mBAAmB;AACrB,cAAI,wBAAwB,cAAc,MAAM;AAC9C,0BAAc;AAAA,cACZ;AAAA,cACA,wBAAwB;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AACA,cAAM,aAAa,OAAO,oBAAoB;AAC9C,eAAO,SAAS,OAAO,QAAQ,OAAO;AACtC,cAAM,QAAQ,OAAO,WAAW;AAChC,YAAI,MAAM,OAAO,KAAK;AACtB,YAAI,YAAY;AAChB,YAAI,SAAS,GAAG,GAAG,UAAU,QAAQ;AACrC,YAAI,YAAY;AAChB,YAAI,iBAAiB;AACnB,cAAI,KAAK,IAAI,OAAO,aAAa,aAAa,MAAM,CAAC,CAAC;AAAA,QACxD,OAAO;AACL,gBAAM,QAAQ,SAAS,KAAK,KAAK;AAC/B,gBAAI,QAAQ,SAAS,MAAM,KAAK;AAC9B,kBAAI,MAAM;AACR,oBAAI,SAAS,MAAM,QAAQ,MAAM,QAAQ,GAAG,CAAC;AAAA,cAC/C;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AACA,YAAI,yBAAyB;AAC3B,cAAI,cAAc,wBAAwB;AAAA,QAC5C;AACA,YAAI,mBAAmB;AACrB,cAAI;AAAA,YACF;AAAA,YACA,wBAAwB,IAAI;AAAA,YAC5B,wBAAwB,IAAI;AAAA,YAC5B,wBAAwB;AAAA,YACxB,wBAAwB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,iBAAAA,QAAM,UAAU,MAAM;AACpB,uBAAiB,KAAK;AAAA,IACxB,GAAG,CAAC,MAAM,CAAC;AACX,UAAM,cAAc,eAAe,EAAE,QAAQ,MAAM,OAAO,KAAK,GAAG,KAAK;AACvE,QAAI,MAAM;AACV,QAAI,UAAU,MAAM;AAClB,YAAsB,6BAAAA,QAAM;AAAA,QAC1B;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO,EAAE,SAAS,OAAO;AAAA,UACzB,QAAQ,MAAM;AACZ,6BAAiB,IAAI;AAAA,UACvB;AAAA,UACA,KAAK;AAAA,UACL,aAAa,2BAA2B,OAAO,SAAS,wBAAwB;AAAA,QAClF;AAAA,MACF;AAAA,IACF;AACA,WAAuB,6BAAAA,QAAM,cAAc,aAAAA,QAAM,UAAU,MAAsB,6BAAAA,QAAM;AAAA,MACrF;AAAA,MACA,eAAe;AAAA,QACb,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,KAAK;AAAA,QACL,MAAM;AAAA,MACR,GAAG,UAAU;AAAA,IACf,GAAG,GAAG;AAAA,EACR;AACF;AACA,aAAa,cAAc;AAC3B,IAAI,YAAY,aAAAA,QAAM;AAAA,EACpB,SAAS,WAAW,OAAO,cAAc;AACvC,UAAM,KAAK,OAAO;AAAA,MAChB;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI,IAAI,aAAa,UAAU,IAAI;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,EAAE,QAAQ,OAAO,UAAU,wBAAwB,IAAI,UAAU;AAAA,MACrE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,cAAc;AAClB,QAAI,QAAQ;AACZ,QAAI,iBAAiB,QAAQ,2BAA2B,MAAM;AAC5D,UAAI,wBAAwB,cAAc,MAAM;AAC9C,sBAAc;AAAA,UACZ;AAAA,UACA,wBAAwB;AAAA,QAC1B;AAAA,MACF;AACA,cAAwB,6BAAAA,QAAM;AAAA,QAC5B;AAAA,QACA;AAAA,UACE,MAAM,cAAc;AAAA,UACpB,QAAQ,wBAAwB;AAAA,UAChC,OAAO,wBAAwB;AAAA,UAC/B,GAAG,wBAAwB,IAAI;AAAA,UAC/B,GAAG,wBAAwB,IAAI;AAAA,UAC/B,qBAAqB;AAAA,UACrB,SAAS,wBAAwB;AAAA,UACjC,aAAa,wBAAwB;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS,aAAa,aAAa,MAAM;AAC/C,WAAuB,6BAAAA,QAAM;AAAA,MAC3B;AAAA,MACA,eAAe;AAAA,QACb,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,SAAS,OAAO,QAAQ,IAAI,QAAQ;AAAA,QACpC,KAAK;AAAA,QACL,MAAM;AAAA,MACR,GAAG,UAAU;AAAA,MACb,CAAC,CAAC,SAAyB,6BAAAA,QAAM,cAAc,SAAS,MAAM,KAAK;AAAA,MACnD,6BAAAA,QAAM;AAAA,QACpB;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,GAAG,SAAS,QAAQ,IAAI,QAAQ;AAAA,UAChC,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACgB,6BAAAA,QAAM,cAAc,QAAQ,EAAE,MAAM,SAAS,GAAG,QAAQ,gBAAgB,aAAa,CAAC;AAAA,MACtG;AAAA,IACF;AAAA,EACF;AACF;AACA,UAAU,cAAc;;;AC5mCxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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",
|
|
6
6
|
"names": ["import_react", "import_dsh_client_ui_primitives", "__defProp", "__hasOwnProp", "_QrCode", "_QrSegment", "React", "import_react", "import_react", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_jsx_runtime", "import_jsx_runtime", "document", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "run", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_jsx_runtime", "sessions", "source", "target"]
|
|
7
7
|
}
|