@klarkxy/dsh-mood 0.1.0
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/LICENSE +41 -0
- package/README.md +28 -0
- package/cordis.patch.yml +5 -0
- package/docs/README.zh-CN.md +21 -0
- package/lib/client.inner.cjs +634 -0
- package/lib/client.inner.cjs.map +1 -0
- package/lib/client.js +804 -0
- package/lib/contracts.d.ts +91 -0
- package/lib/contracts.js +70 -0
- package/lib/contracts.js.map +1 -0
- package/lib/index.d.ts +173 -0
- package/lib/index.js +1261 -0
- package/lib/index.js.map +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.inner.cjs","names":["useSyncExternalStore","useCallback","useRef","useId","useState","useRef"],"sources":["../../dsh-ai-services/src/client-utils.ts","../src/contracts.ts","../src/client.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useSyncExternalStore } from 'react'\n\nexport interface NativeSurfaceClient {\n sessions: {\n binding?(sessionId: string): { eventSource: { subscribe(listener: () => void): () => void } } | undefined\n }\n uiWorkspace: { current?: { getSnapshot(): { sessionId: string } | undefined; subscribe(listener: () => void): () => void } }\n uiSession: { adapter: { current: { getSnapshot(): { key?: string }; subscribe(listener: () => void): () => void } } }\n locale: { getSnapshot(): { active: string }; subscribe(listener: () => void): () => void }\n connection?: { generation?: { subscribe(listener: () => void): () => void } }\n}\n\n/** The Editor retains its manuscript session separately; native DSH exposes the main-view binding. */\nexport function selectedSessionId(client: Pick<NativeSurfaceClient, 'uiWorkspace' | 'uiSession'>): string {\n return client.uiWorkspace.current\n ? client.uiWorkspace.current.getSnapshot()?.sessionId ?? ''\n : client.uiSession.adapter.current.getSnapshot().key ?? ''\n}\n\n/** Owner props win; native settings only supplies close, so resolve its selected session. */\nexport function useNativeSeat(client: NativeSurfaceClient, props: unknown) {\n const current = useSyncExternalStore(\n useCallback((fn: () => void) => (client.uiWorkspace.current ?? client.uiSession.adapter.current).subscribe(fn), [client]),\n useCallback(() => selectedSessionId(client), [client]),\n () => '',\n )\n const language = useSyncExternalStore(\n useCallback((fn: () => void) => client.locale.subscribe(fn), [client]),\n useCallback(() => client.locale.getSnapshot().active, [client]),\n () => 'en',\n )\n const row = props && typeof props === 'object' ? props as Record<string, unknown> : {}\n const owner = row.owner && typeof row.owner === 'object' ? row.owner as Record<string, unknown> : {}\n const sessionId = typeof row.sessionId === 'string' ? row.sessionId\n : typeof owner.sessionId === 'string' ? owner.sessionId : current\n const requestedLocale = row.locale ?? owner.locale ?? language\n return { sessionId, locale: (String(requestedLocale).startsWith('zh') ? 'zh' : 'en') as 'zh' | 'en',\n hidden: row.hidden === true || owner.hidden === true }\n}\n\n/** Refresh on native log boundaries/reconnect/focus. Read-only settling is bounded to an observed job. */\nexport function useFeatureRefresh(\n client: NativeSurfaceClient, sessionId: string, refresh: () => void,\n working = false, enabled = true,\n): void {\n const refreshRef = useRef(refresh)\n refreshRef.current = refresh\n useEffect(() => {\n if (!enabled) return\n let timer: ReturnType<typeof setTimeout> | undefined\n const queue = () => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') return\n clearTimeout(timer)\n timer = setTimeout(() => refreshRef.current(), 150)\n }\n const source = sessionId ? client.sessions.binding?.(sessionId)?.eventSource : undefined\n const stopEvents = source?.subscribe(queue)\n const stopConnection = client.connection?.generation?.subscribe(queue)\n const visibility = () => { if (document.visibilityState === 'visible') queue() }\n window.addEventListener('focus', queue)\n document.addEventListener('visibilitychange', visibility)\n // Details are collapsed by default; opening an existing panel must get current state.\n document.addEventListener('toggle', queue, true)\n return () => {\n clearTimeout(timer)\n stopEvents?.(); stopConnection?.()\n window.removeEventListener('focus', queue)\n document.removeEventListener('visibilitychange', visibility)\n document.removeEventListener('toggle', queue, true)\n }\n }, [client, sessionId, enabled])\n useEffect(() => {\n if (!enabled || !working) return\n let delay = 250\n const until = Date.now() + 300_000\n let timer: ReturnType<typeof setTimeout>\n const tick = () => {\n if (Date.now() >= until) return\n if (document.visibilityState !== 'hidden') refreshRef.current()\n delay = Math.min(delay * 2, 2000)\n timer = setTimeout(tick, delay)\n }\n timer = setTimeout(tick, delay)\n return () => clearTimeout(timer)\n }, [client, sessionId, working, enabled])\n}\n","/** Browser-safe Mood contracts. Shared TaskContract fields match frozen @klarkxy/dsh-ai-services. */\nimport type { AiFeatureScope, EvidenceRef, ProducerMessageSource, RpcResult, TaskContract } from '@klarkxy/dsh-ai-services/contracts'\n\nexport type { AiFeatureScope, EvidenceRef, ProducerMessageSource, RpcResult, TaskContract }\nexport { projectIdFromCwd } from '@klarkxy/dsh-ai-services/contracts'\n\n/** Frozen shared chat-events seat. Must stay equal to @klarkxy/dsh-ai-services CHAT_EVENTS_SLOT. */\nexport const CHAT_EVENTS_SLOT = 'dsh-editor.chat.events'\nexport const MOOD_PLUGIN = '@klarkxy/dsh-mood'\nexport const MOOD_SOURCE_KIND = 'plugin:@klarkxy/dsh-mood' as const\n/** Production activate identity after scoped pluginName support. */\nexport const MOOD_AI_PLUGIN = MOOD_PLUGIN\nexport const MOOD_RPC_CHANNEL = '/dsh-mood'\nexport const MOOD_ANALYZE_PURPOSE = 'mood.analyze'\nexport const CONTRACT_SECTION = 'dsh-mood:contract'\nexport const PROMPT_VERSION = 'mood.analyze.v1'\nexport const SCHEMA_VERSION = 'mood-contract.v1'\nexport const MAX_QUESTIONS = 3\nexport const MAX_EXCERPT_CHARS = 200\nexport const MAX_PROJECT_ID_CHARS = 32_768\nexport const DEFAULT_QUESTION = '这次要改哪些内容,做到什么程度算完成?'\n\nexport type MoodMode = 'auto' | 'manual' | 'strict'\nexport type ClarificationStatus = 'pending' | 'answered' | 'skipped' | 'cancelled' | 'stale'\nexport type MoodLocale = 'zh' | 'en'\n\nexport interface MoodSettings {\n revision: number\n mode: MoodMode\n}\n\nexport const defaultSettings = (): MoodSettings => ({ revision: 0, mode: 'auto' })\n\nexport interface ClarificationItem {\n id: string\n question: string\n status: ClarificationStatus\n answer?: string\n}\n\nexport interface HeldRequest {\n sourceVersion: string\n trigger: 'material' | 'risk' | 'mild' | 'clear'\n messages: unknown[]\n}\n\nexport interface MoodSessionView {\n sessionId: string\n projectId?: string\n contract?: TaskContract\n clarification: ClarificationItem[]\n pendingManual: boolean\n held: boolean\n}\n\nexport interface MoodStatus {\n settings: MoodSettings\n storageFailed: boolean\n session?: MoodSessionView\n}\n\n/** Native `@deepseek-ai/dsh-user-questions` AskUserQuestionItem. */\nexport interface AskUserQuestionOption {\n label: string\n description?: string\n}\n\nexport interface AskUserQuestionItem {\n id: string\n question: string\n detail?: string\n header?: string\n options?: AskUserQuestionOption[]\n multiSelect?: boolean\n}\n\nexport interface AskUserQuestionAnswerItem {\n id: string\n selected: string[]\n custom?: string\n}\n\nexport interface AskUserQuestionAnswer {\n answers: AskUserQuestionAnswerItem[]\n}\n\nexport interface AskUserRequest {\n questions: AskUserQuestionItem[]\n agent?: unknown\n signal?: AbortSignal\n}\n\nexport function ok<T>(value: T): RpcResult<T> {\n return { ok: true, value }\n}\n\nexport function fail(code: string, message: string): RpcResult<never> {\n return { ok: false, error: { code, message } }\n}\n\nexport function isMoodMode(value: unknown): value is MoodMode {\n return value === 'auto' || value === 'manual' || value === 'strict'\n}\n\nexport function parseSessionId(payload: unknown): string | undefined {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return undefined\n const sessionId = (payload as { sessionId?: unknown }).sessionId\n return typeof sessionId === 'string' && sessionId.length > 0 && sessionId.length <= 200 ? sessionId : undefined\n}\n\nexport function excerptOf(text: string, limit = MAX_EXCERPT_CHARS): string {\n const trimmed = text.replace(/\\s+/g, ' ').trim()\n if (!trimmed) return ''\n return trimmed.length <= limit ? trimmed : `${trimmed.slice(0, limit - 1)}…`\n}\n\nexport function sessionIdOf(agent: { id?: unknown; session?: { id?: unknown } } | undefined): string {\n const fromSession = agent?.session?.id\n if (fromSession != null && String(fromSession).length > 0) return String(fromSession)\n if (agent?.id != null && String(agent.id).length > 0) return String(agent.id)\n return ''\n}\n\nexport function cloneContract(contract: TaskContract): TaskContract {\n return structuredClone(contract)\n}\n\nexport function readinessLabel(readiness: TaskContract['readiness']): string {\n if (readiness === 'clear-request') return '表述清楚'\n if (readiness === 'user-confirmed') return '作者已确认'\n if (readiness === 'disclosed-assumptions') return '按已披露假定继续'\n if (readiness === 'cancelled') return '已取消,未确认'\n if (readiness === 'stale') return '已过期'\n return '待确认'\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport { useFeatureRefresh, useNativeSeat, type NativeSurfaceClient } from '@klarkxy/dsh-ai-services/client-utils'\nimport { useEffect, useId, useRef, useState } from 'react'\nimport {\n CHAT_EVENTS_SLOT, MOOD_RPC_CHANNEL, defaultSettings, type ClarificationItem, type MoodLocale, type MoodMode,\n type MoodStatus, type RpcResult, type TaskContract,\n} from './contracts.ts'\nimport { readinessLabel } from './contracts.ts'\n\nexport const name = 'dsh-mood-client'\nexport const inject = ['slots', 'connection', 'sessions', 'locale', 'uiWorkspace', 'uiSession'] as const\n\ntype Client = NativeSurfaceClient & {\n connection: {\n rpc: { call(channel: string, endpoint: string, payload: unknown): Promise<unknown> }\n generation?: { subscribe(listener: () => void): () => void }\n }\n slots: {\n inject(key: string, callback: () => unknown): () => void\n register(spec: { name: string; id: string; label: string; order: number }, render: unknown): () => void\n }\n}\n\nexport interface MoodSeatProps {\n sessionId?: string\n locale?: MoodLocale\n hidden?: boolean\n}\n\nfunction unwrap<T>(result: RpcResult<T> | unknown): T {\n const row = result as RpcResult<T>\n if (!row || typeof row !== 'object' || !('ok' in row)) throw new Error('请求失败。')\n if (!row.ok) throw new Error(row.error.message)\n return row.value\n}\n\nexport function copy(locale: MoodLocale) {\n if (locale === 'en') {\n return {\n settings: 'Requirements',\n auto: 'Auto',\n manual: 'Manual',\n strict: 'Strict',\n hint: 'Clear requests skip analysis. Confirmation is not file or publish approval.',\n card: 'Task contract',\n amend: 'Amend',\n reanalyze: 'Reanalyze',\n retry: 'Retry original',\n save: 'Save',\n loading: 'Loading…',\n empty: 'No contract yet.',\n goal: 'Goal',\n evidence: 'Evidence',\n questions: 'Questions',\n recovery: 'The original request is waiting. Retry or reanalyze it; it has not been executed.',\n sessionHint: 'Select a session to view its task contract.',\n }\n }\n return {\n settings: '需求澄清',\n auto: '自动',\n manual: '手动',\n strict: '严格',\n hint: '表述清楚的请求不调用分析。确认需求不能代替文件或发布审批。',\n card: '任务约定',\n amend: '修订',\n reanalyze: '重新分析',\n retry: '按原请求重试',\n save: '保存',\n loading: '正在读取…',\n empty: '还没有任务约定。',\n goal: '目标',\n evidence: '证据',\n questions: '澄清',\n recovery: '原请求尚未执行。可重试或手动分析,不会另造一条提问。',\n sessionHint: '选择一个会话后可以查看该会话的任务约定。',\n }\n}\n\nexport function modeFromKey(current: MoodMode, key: string): MoodMode | undefined {\n const order: MoodMode[] = ['auto', 'manual', 'strict']\n const index = order.indexOf(current)\n if (key === 'Home') return 'auto'\n if (key === 'End') return 'strict'\n if (key === 'ArrowRight' || key === 'ArrowDown') return order[(index + 1) % order.length]\n if (key === 'ArrowLeft' || key === 'ArrowUp') return order[(index + order.length - 1) % order.length]\n return undefined\n}\n\nexport function shouldShowCard(\n hidden: boolean,\n contract: TaskContract | undefined,\n pendingManual: boolean,\n recovery = false,\n): boolean {\n if (hidden) return false\n return Boolean(contract) || pendingManual || recovery\n}\n\nexport function isCurrentMoodRequest(input: {\n mounted: boolean\n sessionId: string\n viewSessionId: string\n requestId: number\n latestRequestId: number\n}): boolean {\n return input.mounted && input.sessionId === input.viewSessionId && input.requestId === input.latestRequestId\n}\n\nexport function shouldSkipMoodRefresh(input: { busy: boolean; editing?: boolean }): boolean {\n return input.busy || input.editing === true\n}\n\n/** Read-only status peek; does not bump request generation or abort an in-flight edit. */\nexport async function peekMoodStatus(input: {\n call: (endpoint: string, payload: unknown) => Promise<unknown>\n sessionId: string\n requestId: number\n latestRequestId: () => number\n viewSessionId: () => string\n mounted: () => boolean\n busy: () => boolean\n editing?: () => boolean\n}): Promise<MoodStatus | undefined> {\n if (shouldSkipMoodRefresh({ busy: input.busy(), editing: input.editing?.() === true })) return undefined\n if (!input.sessionId || input.requestId === 0) return undefined\n try {\n const next = unwrap<MoodStatus>(await input.call('status', { sessionId: input.sessionId }) as RpcResult<MoodStatus>)\n if (shouldSkipMoodRefresh({ busy: input.busy(), editing: input.editing?.() === true })) return undefined\n if (!isCurrentMoodRequest({\n mounted: input.mounted(),\n sessionId: input.sessionId,\n viewSessionId: input.viewSessionId(),\n requestId: input.requestId,\n latestRequestId: input.latestRequestId(),\n })) return undefined\n return next\n } catch {\n return undefined\n }\n}\n\nexport function shouldOfferRecovery(status: MoodStatus | undefined): boolean {\n const session = status?.session\n if (!session) return false\n if (session.held || session.pendingManual) return true\n const readiness = session.contract?.readiness\n if (readiness === 'pending' || readiness === 'cancelled') return true\n return session.clarification.some(item => item.status === 'pending' || item.status === 'cancelled')\n}\n\nfunction MoodModePanel({ client, locale }: { client: Client; locale: MoodLocale }) {\n const text = copy(locale)\n const groupId = useId()\n const [status, setStatus] = useState<MoodStatus>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [note, setNote] = useState('')\n const requestId = useRef(0)\n\n async function call<T>(endpoint: string, payload: unknown = {}): Promise<T> {\n return unwrap(await client.connection.rpc.call(MOOD_RPC_CHANNEL, endpoint, payload) as RpcResult<T>)\n }\n useEffect(() => {\n const id = ++requestId.current\n let mounted = true\n void call<MoodStatus>('status').then(next => {\n if (!isCurrentMoodRequest({ mounted, sessionId: '', viewSessionId: '', requestId: id, latestRequestId: requestId.current })) return\n setStatus(next)\n }).catch(() => {\n if (mounted && id === requestId.current) setError('无法读取需求澄清设置。')\n })\n return () => { mounted = false }\n }, [client])\n\n async function action(run: () => Promise<void>) {\n setBusy(true); setNote(''); setError('')\n try { await run() }\n catch (cause) { setError(cause instanceof Error ? cause.message : '操作失败。') }\n finally { setBusy(false) }\n }\n\n const mode = status?.settings.mode ?? defaultSettings().mode\n return <section className=\"mood-settings\" data-testid=\"mood-settings\">\n <h3>{text.settings}</h3>\n {error ? <p role=\"alert\">{error}</p> : null}\n {note ? <p role=\"status\">{note}</p> : null}\n {!status ? <p role=\"status\">{text.loading}</p> : null}\n <div role=\"radiogroup\" aria-label={text.settings} onKeyDown={event => {\n const next = modeFromKey(mode, event.key)\n if (!next || busy || !status) return\n event.preventDefault()\n void action(async () => {\n const updated = await call<MoodStatus>('mode', { mode: next, expectedRevision: status.settings.revision })\n setStatus(updated)\n setNote('已保存。')\n })\n }}>\n {([['auto', text.auto], ['manual', text.manual], ['strict', text.strict]] as const).map(([value, label]) => (\n <label key={value}>\n <input id={`${groupId}-${value}`} type=\"radio\" name={groupId} value={value}\n checked={mode === value} disabled={busy || !status}\n onChange={() => {\n if (!status) return\n void action(async () => {\n const updated = await call<MoodStatus>('mode', { mode: value, expectedRevision: status.settings.revision })\n setStatus(updated)\n setNote('已保存。')\n })\n }} />\n {label}\n </label>\n ))}\n </div>\n <p className=\"mood-meta\">{text.hint}</p>\n </section>\n}\n\nfunction MoodContractCard({ client, sessionId, locale, hidden, surface = 'chat' }: MoodSeatProps & {\n client: Client\n surface?: 'chat' | 'settings'\n}) {\n const text = copy(locale === 'en' ? 'en' : 'zh')\n const [status, setStatus] = useState<MoodStatus>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [editing, setEditing] = useState(false)\n const [goal, setGoal] = useState('')\n const requestId = useRef(0)\n const viewSession = useRef(sessionId ?? '')\n const liveRef = useRef(true)\n const busyRef = useRef(false)\n const editingRef = useRef(false)\n busyRef.current = busy\n editingRef.current = editing\n\n async function call<T>(endpoint: string, payload: unknown): Promise<T> {\n return unwrap(await client.connection.rpc.call(MOOD_RPC_CHANNEL, endpoint, payload) as RpcResult<T>)\n }\n useEffect(() => {\n liveRef.current = true\n return () => { liveRef.current = false }\n }, [])\n useEffect(() => {\n viewSession.current = sessionId ?? ''\n const id = ++requestId.current\n setStatus(undefined)\n setEditing(false)\n setError('')\n if (!sessionId) return\n let mounted = true\n void call<MoodStatus>('status', { sessionId }).then(next => {\n if (!isCurrentMoodRequest({\n mounted,\n sessionId,\n viewSessionId: viewSession.current,\n requestId: id,\n latestRequestId: requestId.current,\n })) return\n setStatus(next)\n setGoal(next.session?.contract?.goal ?? '')\n }).catch(() => {\n if (!isCurrentMoodRequest({\n mounted,\n sessionId,\n viewSessionId: viewSession.current,\n requestId: id,\n latestRequestId: requestId.current,\n })) return\n setError('无法读取任务约定。')\n })\n return () => { mounted = false }\n }, [client, sessionId])\n\n useFeatureRefresh(client, sessionId ?? '', () => {\n void peekMoodStatus({\n call: (endpoint, payload) => client.connection.rpc.call(MOOD_RPC_CHANNEL, endpoint, payload),\n sessionId: viewSession.current,\n requestId: requestId.current,\n latestRequestId: () => requestId.current,\n viewSessionId: () => viewSession.current,\n mounted: () => liveRef.current,\n busy: () => busyRef.current,\n editing: () => editingRef.current,\n }).then(next => {\n if (!next) return\n setStatus(next)\n if (!editingRef.current) setGoal(next.session?.contract?.goal ?? '')\n })\n }, Boolean(status?.session?.pendingManual) && !busy, Boolean(sessionId) && (surface === 'settings' || !hidden))\n\n const contract = status?.session?.contract\n const pendingManual = Boolean(status?.session?.pendingManual)\n const recovery = shouldOfferRecovery(status)\n if (surface !== 'settings' && !shouldShowCard(Boolean(hidden), contract, pendingManual, recovery)) return null\n\n async function action(run: () => Promise<void>) {\n const id = requestId.current\n const view = viewSession.current\n setBusy(true); setError('')\n try {\n await run()\n } catch (cause) {\n if (!isCurrentMoodRequest({\n mounted: true,\n sessionId: view,\n viewSessionId: viewSession.current,\n requestId: id,\n latestRequestId: requestId.current,\n })) return\n setError(cause instanceof Error ? cause.message : '操作失败。')\n } finally {\n if (isCurrentMoodRequest({\n mounted: true,\n sessionId: view,\n viewSessionId: viewSession.current,\n requestId: id,\n latestRequestId: requestId.current,\n })) setBusy(false)\n }\n }\n\n return <article className=\"mood-card\" data-testid=\"mood-contract-card\" data-session={sessionId || undefined}>\n <header>\n <h3>{text.card}</h3>\n {contract ? <span className=\"mood-meta\">{readinessLabel(contract.readiness)}</span> : null}\n </header>\n {error ? <p role=\"alert\">{error}</p> : null}\n {recovery ? <p role=\"status\">{text.recovery}</p> : null}\n {contract ? <p>{text.goal}:{contract.goal || text.empty}</p> : <p>{text.empty}</p>}\n {contract?.evidence.length ? <ul aria-label={text.evidence}>\n {contract.evidence.map((item: { kind: string; seq: number; excerpt?: string }) => (\n <li key={`${item.kind}-${item.seq}`}>{item.excerpt ?? `#${item.seq}`}</li>\n ))}\n </ul> : null}\n {(status?.session?.clarification ?? []).length ? <ul aria-label={text.questions}>\n {(status?.session?.clarification ?? []).map((item: ClarificationItem) => (\n <li key={item.id}>[{item.status}] {item.question}{item.answer ? ` → ${item.answer}` : ''}</li>\n ))}\n </ul> : null}\n {editing ? <label>{text.goal}\n <textarea aria-label={text.goal} rows={3} value={goal} disabled={busy}\n onChange={event => setGoal(event.target.value)} />\n </label> : null}\n <div className=\"mood-actions\">\n <button type=\"button\" disabled={busy || !contract} onClick={() => {\n if (editing && contract && sessionId) {\n const view = sessionId\n const id = requestId.current\n void action(async () => {\n const next = await call<MoodStatus>('edit', {\n sessionId: view, expectedRevision: contract.revision, patch: { goal },\n })\n if (!isCurrentMoodRequest({\n mounted: true, sessionId: view, viewSessionId: viewSession.current, requestId: id, latestRequestId: requestId.current,\n })) return\n setStatus(next)\n setEditing(false)\n })\n return\n }\n setEditing(true)\n }}>{editing ? text.save : text.amend}</button>\n <button type=\"button\" disabled={busy || !sessionId} onClick={() => {\n const view = sessionId\n if (!view) return\n const id = requestId.current\n void action(async () => {\n const next = await call<MoodStatus>('manual', { sessionId: view })\n if (!isCurrentMoodRequest({\n mounted: true, sessionId: view, viewSessionId: viewSession.current, requestId: id, latestRequestId: requestId.current,\n })) return\n setStatus(next)\n })\n }}>{text.reanalyze}</button>\n {recovery ? <button type=\"button\" disabled={busy || !sessionId || !status?.session?.held} onClick={() => {\n const view = sessionId\n if (!view) return\n const id = requestId.current\n void action(async () => {\n const next = await call<MoodStatus>('retry', { sessionId: view })\n if (!isCurrentMoodRequest({\n mounted: true, sessionId: view, viewSessionId: viewSession.current, requestId: id, latestRequestId: requestId.current,\n })) return\n setStatus(next)\n })\n }}>{text.retry}</button> : null}\n </div>\n </article>\n}\n\nexport function moodPanelKey(sessionId: string, locale: MoodLocale): string {\n return `${sessionId}:${locale}`\n}\n\nexport function MoodSettings({ client, props }: { client: Client; props: unknown }) {\n const seat = useNativeSeat(client, props)\n const text = copy(seat.locale)\n return <div className=\"mood-settings-root\" data-testid=\"mood-settings-root\" data-session={seat.sessionId || undefined}>\n <MoodModePanel client={client} locale={seat.locale} />\n {seat.sessionId\n ? <MoodContractCard key={`contract:${moodPanelKey(seat.sessionId, seat.locale)}`} client={client}\n sessionId={seat.sessionId} locale={seat.locale} surface=\"settings\" />\n : <p className=\"mood-meta\">{text.sessionHint}</p>}\n </div>\n}\n\nexport function MoodChatCard({ client, props }: { client: Client; props: unknown }) {\n const seat = useNativeSeat(client, props)\n if (seat.hidden || !seat.sessionId) return null\n return <MoodContractCard key={moodPanelKey(seat.sessionId, seat.locale)} client={client}\n sessionId={seat.sessionId} locale={seat.locale} hidden={seat.hidden} />\n}\n\nconst styles = `\n.mood-settings-root,.mood-settings,.mood-card{max-width:760px;display:grid;gap:12px;color:inherit;font:400 var(--font-size-2,14px)/1.5 var(--default-font-family,system-ui,sans-serif)}\n.mood-settings-root{gap:16px}\n.mood-settings h3,.mood-card h3{margin:0;font-size:var(--font-size-3,16px);font-weight:600}\n.mood-settings p,.mood-card p,.mood-settings-root p{margin:0;line-height:1.5}\n.mood-meta{font-size:var(--font-size-1,13px);color:var(--gray-11,inherit)}\n.mood-settings [role=\"radiogroup\"]{display:flex;flex-wrap:wrap;gap:12px 20px}\n.mood-settings label{display:flex;gap:8px;align-items:center;min-height:32px}\n.mood-card header{display:flex;justify-content:space-between;gap:12px;align-items:center}\n.mood-card ul{margin:0;padding-left:1.2em}\n.mood-card{padding:14px 16px;border:1px solid var(--gray-6,color-mix(in srgb,currentColor 15%,transparent));border-radius:12px}\n.mood-card textarea{box-sizing:border-box;width:100%;min-width:0;padding:8px 10px;border:1px solid var(--gray-6,color-mix(in srgb,currentColor 22%,transparent));border-radius:8px;background:var(--color-surface,transparent);color:inherit;font:inherit;transition:border-color 150ms ease,box-shadow 150ms ease}\n.mood-card textarea:focus{border-color:var(--accent-9,#3b82f6);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent-9,#3b82f6) 25%,transparent)}\n.mood-actions{display:flex;flex-wrap:wrap;gap:8px}\n.mood-settings button,.mood-card button{min-height:34px;padding:6px 12px;border:1px solid color-mix(in srgb,currentColor 25%,transparent);border-radius:8px;background:transparent;color:inherit;cursor:pointer;font:inherit;transition:background-color 150ms ease,color 150ms ease,border-color 150ms ease,box-shadow 150ms ease,transform 150ms ease}\n.mood-settings button:hover:not(:disabled),.mood-card button:hover:not(:disabled){background:var(--gray-3,color-mix(in srgb,currentColor 6%,transparent));border-color:color-mix(in srgb,currentColor 35%,transparent)}\n.mood-settings button:active:not(:disabled),.mood-card button:active:not(:disabled){transform:scale(.97)}\n.mood-settings button:disabled,.mood-card button:disabled{opacity:.45;cursor:not-allowed}\n.mood-settings :focus-visible,.mood-card :focus-visible,.mood-settings-root :focus-visible{outline:2px solid var(--accent-9,currentColor);outline-offset:3px}\n@media(prefers-reduced-motion:reduce){.mood-settings button,.mood-card button,.mood-card textarea{transition:none}}\n`\n\nexport function apply(ctx: Context): void {\n const client = ctx as unknown as Client\n ctx.effect(() => {\n if (typeof document === 'undefined') return () => {}\n const style = document.createElement('style')\n style.setAttribute('data-plugin', '@klarkxy/dsh-mood')\n style.textContent = styles\n document.head.appendChild(style)\n return () => style.remove()\n }, 'dsh-mood.styles')\n ctx.effect(() => client.slots.inject('settings.section', () => client.slots.register({\n name: 'settings.section', id: 'mood', order: 55, label: '需求澄清',\n }, (props: unknown) => <MoodSettings client={client} props={props} />)), 'dsh-mood.settings')\n ctx.effect(() => client.slots.inject(CHAT_EVENTS_SLOT, () => client.slots.register({\n name: CHAT_EVENTS_SLOT, id: 'mood', order: 10, label: '需求约定',\n }, (props: unknown) => <MoodChatCard client={client} props={props} />)), 'dsh-mood.card')\n}\n"],"mappings":";;;;;AAaA,SAAgB,kBAAkB,QAAwE;CACxG,OAAO,OAAO,YAAY,UACtB,OAAO,YAAY,QAAQ,YAAY,CAAC,EAAE,aAAa,KACvD,OAAO,UAAU,QAAQ,QAAQ,YAAY,CAAC,CAAC,OAAO;AAC5D;;AAGA,SAAgB,cAAc,QAA6B,OAAgB;CACzE,MAAM,WAAA,GAAUA,MAAAA,qBAAAA,EAAAA,GACdC,MAAAA,YAAAA,EAAa,QAAoB,OAAO,YAAY,WAAW,OAAO,UAAU,QAAQ,QAAA,CAAS,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,IAAA,GACxHA,MAAAA,YAAAA,OAAkB,kBAAkB,MAAM,GAAG,CAAC,MAAM,CAAC,SAC/C,EACR;CACA,MAAM,YAAA,GAAWD,MAAAA,qBAAAA,EAAAA,GACfC,MAAAA,YAAAA,EAAa,OAAmB,OAAO,OAAO,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,IAAA,GACrEA,MAAAA,YAAAA,OAAkB,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SACxD,IACR;CACA,MAAM,MAAM,SAAS,OAAO,UAAU,WAAW,QAAmC,CAAC;CACrF,MAAM,QAAQ,IAAI,SAAS,OAAO,IAAI,UAAU,WAAW,IAAI,QAAmC,CAAC;CACnG,MAAM,YAAY,OAAO,IAAI,cAAc,WAAW,IAAI,YACtD,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY;CAC5D,MAAM,kBAAkB,IAAI,UAAU,MAAM,UAAU;CACtD,OAAO;EAAE;EAAW,QAAS,OAAO,eAAe,CAAC,CAAC,WAAW,IAAI,IAAI,OAAO;EAC7E,QAAQ,IAAI,WAAW,QAAQ,MAAM,WAAW;CAAK;AACzD;;AAGA,SAAgB,kBACd,QAA6B,WAAmB,SAChD,UAAU,OAAO,UAAU,MACrB;CACN,MAAM,cAAA,GAAaC,MAAAA,OAAAA,CAAO,OAAO;CACjC,WAAW,UAAU;CACrB,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,SAAS;EACd,IAAI;EACJ,MAAM,cAAc;GAClB,IAAI,OAAO,aAAa,eAAe,SAAS,oBAAoB,UAAU;GAC9E,aAAa,KAAK;GAClB,QAAQ,iBAAiB,WAAW,QAAQ,GAAG,GAAG;EACpD;EAEA,MAAM,cADS,YAAY,OAAO,SAAS,UAAU,SAAS,CAAC,EAAE,cAAc,KAAA,EAAA,EACpD,UAAU,KAAK;EAC1C,MAAM,iBAAiB,OAAO,YAAY,YAAY,UAAU,KAAK;EACrE,MAAM,mBAAmB;GAAE,IAAI,SAAS,oBAAoB,WAAW,MAAM;EAAE;EAC/E,OAAO,iBAAiB,SAAS,KAAK;EACtC,SAAS,iBAAiB,oBAAoB,UAAU;EAExD,SAAS,iBAAiB,UAAU,OAAO,IAAI;EAC/C,aAAa;GACX,aAAa,KAAK;GAClB,aAAa;GAAG,iBAAiB;GACjC,OAAO,oBAAoB,SAAS,KAAK;GACzC,SAAS,oBAAoB,oBAAoB,UAAU;GAC3D,SAAS,oBAAoB,UAAU,OAAO,IAAI;EACpD;CACF,GAAG;EAAC;EAAQ;EAAW;CAAO,CAAC;CAC/B,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,WAAW,CAAC,SAAS;EAC1B,IAAI,QAAQ;EACZ,MAAM,QAAQ,KAAK,IAAI,IAAI;EAC3B,IAAI;EACJ,MAAM,aAAa;GACjB,IAAI,KAAK,IAAI,KAAK,OAAO;GACzB,IAAI,SAAS,oBAAoB,UAAU,WAAW,QAAQ;GAC9D,QAAQ,KAAK,IAAI,QAAQ,GAAG,GAAI;GAChC,QAAQ,WAAW,MAAM,KAAK;EAChC;EACA,QAAQ,WAAW,MAAM,KAAK;EAC9B,aAAa,aAAa,KAAK;CACjC,GAAG;EAAC;EAAQ;EAAW;EAAS;CAAO,CAAC;AAC1C;;;;AC9EA,MAAa,mBAAmB;AAKhC,MAAa,mBAAmB;AAmBhC,MAAa,yBAAuC;CAAE,UAAU;CAAG,MAAM;AAAO;AAgGhF,SAAgB,eAAe,WAA8C;CAC3E,IAAI,cAAc,iBAAiB,OAAO;CAC1C,IAAI,cAAc,kBAAkB,OAAO;CAC3C,IAAI,cAAc,yBAAyB,OAAO;CAClD,IAAI,cAAc,aAAa,OAAO;CACtC,IAAI,cAAc,SAAS,OAAO;CAClC,OAAO;AACT;;;AC7HA,MAAa,OAAO;AACpB,MAAa,SAAS;CAAC;CAAS;CAAc;CAAY;CAAU;CAAe;AAAW;AAmB9F,SAAS,OAAU,QAAmC;CACpD,MAAM,MAAM;CACZ,IAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,EAAE,QAAQ,MAAM,MAAM,IAAI,MAAM,OAAO;CAC9E,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,OAAO;CAC9C,OAAO,IAAI;AACb;AAEA,SAAgB,KAAK,QAAoB;CACvC,IAAI,WAAW,MACb,OAAO;EACL,UAAU;EACV,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,MAAM;EACN,OAAO;EACP,WAAW;EACX,OAAO;EACP,MAAM;EACN,SAAS;EACT,OAAO;EACP,MAAM;EACN,UAAU;EACV,WAAW;EACX,UAAU;EACV,aAAa;CACf;CAEF,OAAO;EACL,UAAU;EACV,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,MAAM;EACN,OAAO;EACP,WAAW;EACX,OAAO;EACP,MAAM;EACN,SAAS;EACT,OAAO;EACP,MAAM;EACN,UAAU;EACV,WAAW;EACX,UAAU;EACV,aAAa;CACf;AACF;AAEA,SAAgB,YAAY,SAAmB,KAAmC;CAChF,MAAM,QAAoB;EAAC;EAAQ;EAAU;CAAQ;CACrD,MAAM,QAAQ,MAAM,QAAQ,OAAO;CACnC,IAAI,QAAQ,QAAQ,OAAO;CAC3B,IAAI,QAAQ,OAAO,OAAO;CAC1B,IAAI,QAAQ,gBAAgB,QAAQ,aAAa,OAAO,OAAO,QAAQ,KAAK,MAAM;CAClF,IAAI,QAAQ,eAAe,QAAQ,WAAW,OAAO,OAAO,QAAQ,MAAM,SAAS,KAAK,MAAM;AAEhG;AAEA,SAAgB,eACd,QACA,UACA,eACA,WAAW,OACF;CACT,IAAI,QAAQ,OAAO;CACnB,OAAO,QAAQ,QAAQ,KAAK,iBAAiB;AAC/C;AAEA,SAAgB,qBAAqB,OAMzB;CACV,OAAO,MAAM,WAAW,MAAM,cAAc,MAAM,iBAAiB,MAAM,cAAc,MAAM;AAC/F;AAEA,SAAgB,sBAAsB,OAAsD;CAC1F,OAAO,MAAM,QAAQ,MAAM,YAAY;AACzC;;AAGA,eAAsB,eAAe,OASD;CAClC,IAAI,sBAAsB;EAAE,MAAM,MAAM,KAAK;EAAG,SAAS,MAAM,UAAU,MAAM;CAAK,CAAC,GAAG,OAAO,KAAA;CAC/F,IAAI,CAAC,MAAM,aAAa,MAAM,cAAc,GAAG,OAAO,KAAA;CACtD,IAAI;EACF,MAAM,OAAO,OAAmB,MAAM,MAAM,KAAK,UAAU,EAAE,WAAW,MAAM,UAAU,CAAC,CAA0B;EACnH,IAAI,sBAAsB;GAAE,MAAM,MAAM,KAAK;GAAG,SAAS,MAAM,UAAU,MAAM;EAAK,CAAC,GAAG,OAAO,KAAA;EAC/F,IAAI,CAAC,qBAAqB;GACxB,SAAS,MAAM,QAAQ;GACvB,WAAW,MAAM;GACjB,eAAe,MAAM,cAAc;GACnC,WAAW,MAAM;GACjB,iBAAiB,MAAM,gBAAgB;EACzC,CAAC,GAAG,OAAO,KAAA;EACX,OAAO;CACT,QAAQ;EACN;CACF;AACF;AAEA,SAAgB,oBAAoB,QAAyC;CAC3E,MAAM,UAAU,QAAQ;CACxB,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI,QAAQ,QAAQ,QAAQ,eAAe,OAAO;CAClD,MAAM,YAAY,QAAQ,UAAU;CACpC,IAAI,cAAc,aAAa,cAAc,aAAa,OAAO;CACjE,OAAO,QAAQ,cAAc,MAAK,SAAQ,KAAK,WAAW,aAAa,KAAK,WAAW,WAAW;AACpG;AAEA,SAAS,cAAc,EAAE,QAAQ,UAAkD;CACjF,MAAM,OAAO,KAAK,MAAM;CACxB,MAAM,WAAA,GAAUC,MAAAA,MAAAA,CAAM;CACtB,MAAM,CAAC,QAAQ,cAAA,GAAaC,MAAAA,SAAAA,CAAqB;CACjD,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;CACtC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE;CACrC,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,EAAE;CACnC,MAAM,aAAA,GAAYC,MAAAA,OAAAA,CAAO,CAAC;CAE1B,eAAe,KAAQ,UAAkB,UAAmB,CAAC,GAAe;EAC1E,OAAO,OAAO,MAAM,OAAO,WAAW,IAAI,KAAK,kBAAkB,UAAU,OAAO,CAAiB;CACrG;CACA,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,MAAM,KAAK,EAAE,UAAU;EACvB,IAAI,UAAU;EACd,KAAsB,QAAQ,CAAC,CAAC,MAAK,SAAQ;GAC3C,IAAI,CAAC,qBAAqB;IAAE;IAAS,WAAW;IAAI,eAAe;IAAI,WAAW;IAAI,iBAAiB,UAAU;GAAQ,CAAC,GAAG;GAC7H,UAAU,IAAI;EAChB,CAAC,CAAC,CAAC,YAAY;GACb,IAAI,WAAW,OAAO,UAAU,SAAS,SAAS,aAAa;EACjE,CAAC;EACD,aAAa;GAAE,UAAU;EAAM;CACjC,GAAG,CAAC,MAAM,CAAC;CAEX,eAAe,OAAO,KAA0B;EAC9C,QAAQ,IAAI;EAAG,QAAQ,EAAE;EAAG,SAAS,EAAE;EACvC,IAAI;GAAE,MAAM,IAAI;EAAE,SACX,OAAO;GAAE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO;EAAE,UACnE;GAAE,QAAQ,KAAK;EAAE;CAC3B;CAEA,MAAM,OAAO,QAAQ,SAAS,QAAQ,gBAAgB,CAAC,CAAC;CACxD,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;EAAS,WAAU;EAAgB,eAAY;EAA/C,UAAA;GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,KAAK,SAAa,CAAA;GACtB,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,MAAK;IAAS,UAAA;GAAS,CAAA,IAAI;GACtC,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,MAAK;IAAU,UAAA;GAAQ,CAAA,IAAI;GACrC,CAAC,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,MAAK;IAAU,UAAA,KAAK;GAAW,CAAA,IAAI;GACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,MAAK;IAAa,cAAY,KAAK;IAAU,YAAW,UAAS;KACpE,MAAM,OAAO,YAAY,MAAM,MAAM,GAAG;KACxC,IAAI,CAAC,QAAQ,QAAQ,CAAC,QAAQ;KAC9B,MAAM,eAAe;KACrB,OAAY,YAAY;MACtB,MAAM,UAAU,MAAM,KAAiB,QAAQ;OAAE,MAAM;OAAM,kBAAkB,OAAO,SAAS;MAAS,CAAC;MACzG,UAAU,OAAO;MACjB,QAAQ,MAAM;KAChB,CAAC;IACH;IACI,UAAA;KAAC,CAAC,QAAQ,KAAK,IAAI;KAAG,CAAC,UAAU,KAAK,MAAM;KAAG,CAAC,UAAU,KAAK,MAAM;IAAC,CAAC,CAAW,KAAK,CAAC,OAAO,WAC/F,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KAAO,IAAI,GAAG,QAAQ,GAAG;KAAS,MAAK;KAAQ,MAAM;KAAgB;KACnE,SAAS,SAAS;KAAO,UAAU,QAAQ,CAAC;KAC5C,gBAAgB;MACd,IAAI,CAAC,QAAQ;MACb,OAAY,YAAY;OACtB,MAAM,UAAU,MAAM,KAAiB,QAAQ;QAAE,MAAM;QAAO,kBAAkB,OAAO,SAAS;OAAS,CAAC;OAC1G,UAAU,OAAO;OACjB,QAAQ,MAAM;MAChB,CAAC;KACH;IAAI,CAAA,GACL,KACI,EAAA,GAZK,KAYL,CACR;GACE,CAAA;GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,WAAU;IAAa,UAAA,KAAK;GAAQ,CAAA;EAChC;;AACX;AAEA,SAAS,iBAAiB,EAAE,QAAQ,WAAW,QAAQ,QAAQ,UAAU,UAGtE;CACD,MAAM,OAAO,KAAK,WAAW,OAAO,OAAO,IAAI;CAC/C,MAAM,CAAC,QAAQ,cAAA,GAAaD,MAAAA,SAAAA,CAAqB;CACjD,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;CACtC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE;CACrC,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,KAAK;CAC5C,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,EAAE;CACnC,MAAM,aAAA,GAAYC,MAAAA,OAAAA,CAAO,CAAC;CAC1B,MAAM,eAAA,GAAcA,MAAAA,OAAAA,CAAO,aAAa,EAAE;CAC1C,MAAM,WAAA,GAAUA,MAAAA,OAAAA,CAAO,IAAI;CAC3B,MAAM,WAAA,GAAUA,MAAAA,OAAAA,CAAO,KAAK;CAC5B,MAAM,cAAA,GAAaA,MAAAA,OAAAA,CAAO,KAAK;CAC/B,QAAQ,UAAU;CAClB,WAAW,UAAU;CAErB,eAAe,KAAQ,UAAkB,SAA8B;EACrE,OAAO,OAAO,MAAM,OAAO,WAAW,IAAI,KAAK,kBAAkB,UAAU,OAAO,CAAiB;CACrG;CACA,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,QAAQ,UAAU;EAClB,aAAa;GAAE,QAAQ,UAAU;EAAM;CACzC,GAAG,CAAC,CAAC;CACL,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,YAAY,UAAU,aAAa;EACnC,MAAM,KAAK,EAAE,UAAU;EACvB,UAAU,KAAA,CAAS;EACnB,WAAW,KAAK;EAChB,SAAS,EAAE;EACX,IAAI,CAAC,WAAW;EAChB,IAAI,UAAU;EACd,KAAsB,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,MAAK,SAAQ;GAC1D,IAAI,CAAC,qBAAqB;IACxB;IACA;IACA,eAAe,YAAY;IAC3B,WAAW;IACX,iBAAiB,UAAU;GAC7B,CAAC,GAAG;GACJ,UAAU,IAAI;GACd,QAAQ,KAAK,SAAS,UAAU,QAAQ,EAAE;EAC5C,CAAC,CAAC,CAAC,YAAY;GACb,IAAI,CAAC,qBAAqB;IACxB;IACA;IACA,eAAe,YAAY;IAC3B,WAAW;IACX,iBAAiB,UAAU;GAC7B,CAAC,GAAG;GACJ,SAAS,WAAW;EACtB,CAAC;EACD,aAAa;GAAE,UAAU;EAAM;CACjC,GAAG,CAAC,QAAQ,SAAS,CAAC;CAEtB,kBAAkB,QAAQ,aAAa,UAAU;EAC/C,eAAoB;GAClB,OAAO,UAAU,YAAY,OAAO,WAAW,IAAI,KAAK,kBAAkB,UAAU,OAAO;GAC3F,WAAW,YAAY;GACvB,WAAW,UAAU;GACrB,uBAAuB,UAAU;GACjC,qBAAqB,YAAY;GACjC,eAAe,QAAQ;GACvB,YAAY,QAAQ;GACpB,eAAe,WAAW;EAC5B,CAAC,CAAC,CAAC,MAAK,SAAQ;GACd,IAAI,CAAC,MAAM;GACX,UAAU,IAAI;GACd,IAAI,CAAC,WAAW,SAAS,QAAQ,KAAK,SAAS,UAAU,QAAQ,EAAE;EACrE,CAAC;CACH,GAAG,QAAQ,QAAQ,SAAS,aAAa,KAAK,CAAC,MAAM,QAAQ,SAAS,MAAM,YAAY,cAAc,CAAC,OAAO;CAE9G,MAAM,WAAW,QAAQ,SAAS;CAClC,MAAM,gBAAgB,QAAQ,QAAQ,SAAS,aAAa;CAC5D,MAAM,WAAW,oBAAoB,MAAM;CAC3C,IAAI,YAAY,cAAc,CAAC,eAAe,QAAQ,MAAM,GAAG,UAAU,eAAe,QAAQ,GAAG,OAAO;CAE1G,eAAe,OAAO,KAA0B;EAC9C,MAAM,KAAK,UAAU;EACrB,MAAM,OAAO,YAAY;EACzB,QAAQ,IAAI;EAAG,SAAS,EAAE;EAC1B,IAAI;GACF,MAAM,IAAI;EACZ,SAAS,OAAO;GACd,IAAI,CAAC,qBAAqB;IACxB,SAAS;IACT,WAAW;IACX,eAAe,YAAY;IAC3B,WAAW;IACX,iBAAiB,UAAU;GAC7B,CAAC,GAAG;GACJ,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO;EAC3D,UAAU;GACR,IAAI,qBAAqB;IACvB,SAAS;IACT,WAAW;IACX,eAAe,YAAY;IAC3B,WAAW;IACX,iBAAiB,UAAU;GAC7B,CAAC,GAAG,QAAQ,KAAK;EACnB;CACF;CAEA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;EAAS,WAAU;EAAY,eAAY;EAAqB,gBAAc,aAAa,KAAA;EAA3F,UAAA;GACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,KAAK,KAAS,CAAA,GAClB,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,WAAU;IAAa,UAAA,eAAe,SAAS,SAAS;GAAQ,CAAA,IAAI,IAChF,EAAA,CAAA;GACP,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,MAAK;IAAS,UAAA;GAAS,CAAA,IAAI;GACtC,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,MAAK;IAAU,UAAA,KAAK;GAAY,CAAA,IAAI;GAClD,WAAW,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;IAAI,KAAK;IAAK;IAAE,SAAS,QAAQ,KAAK;GAAS,EAAA,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,KAAK,MAAS,CAAA;GAChF,UAAU,SAAS,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;IAAI,cAAY,KAAK;IAC/C,UAAA,SAAS,SAAS,KAAK,SACtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAsC,KAAK,WAAW,IAAI,KAAK,MAAU,GAAhE,GAAG,KAAK,KAAK,GAAG,KAAK,KAA2C,CAC1E;GACC,CAAA,IAAI;IACN,QAAQ,SAAS,iBAAiB,CAAC,EAAA,CAAG,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;IAAI,cAAY,KAAK;IAClE,WAAA,QAAQ,SAAS,iBAAiB,CAAC,EAAA,CAAG,KAAK,SAC3C,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;KAAkB;KAAE,KAAK;KAAO;KAAG,KAAK;KAAU,KAAK,SAAS,MAAM,KAAK,WAAW;IAAO,EAAA,GAApF,KAAK,EAA+E,CAC9F;GACC,CAAA,IAAI;GACP,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,KAAK,MACtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;IAAU,cAAY,KAAK;IAAM,MAAM;IAAG,OAAO;IAAM,UAAU;IAC/D,WAAU,UAAS,QAAQ,MAAM,OAAO,KAAK;GAAI,CAAA,CAC9C,EAAA,CAAA,IAAI;GACX,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,UAAU,QAAQ,CAAC;MAAU,eAAe;OAChE,IAAI,WAAW,YAAY,WAAW;QACpC,MAAM,OAAO;QACb,MAAM,KAAK,UAAU;QACrB,OAAY,YAAY;SACtB,MAAM,OAAO,MAAM,KAAiB,QAAQ;UAC1C,WAAW;UAAM,kBAAkB,SAAS;UAAU,OAAO,EAAE,KAAK;SACtE,CAAC;SACD,IAAI,CAAC,qBAAqB;UACxB,SAAS;UAAM,WAAW;UAAM,eAAe,YAAY;UAAS,WAAW;UAAI,iBAAiB,UAAU;SAChH,CAAC,GAAG;SACJ,UAAU,IAAI;SACd,WAAW,KAAK;QAClB,CAAC;QACD;OACF;OACA,WAAW,IAAI;MACjB;MAAI,UAAA,UAAU,KAAK,OAAO,KAAK;KAAc,CAAA;KAC7C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,UAAU,QAAQ,CAAC;MAAW,eAAe;OACjE,MAAM,OAAO;OACb,IAAI,CAAC,MAAM;OACX,MAAM,KAAK,UAAU;OACrB,OAAY,YAAY;QACtB,MAAM,OAAO,MAAM,KAAiB,UAAU,EAAE,WAAW,KAAK,CAAC;QACjE,IAAI,CAAC,qBAAqB;SACxB,SAAS;SAAM,WAAW;SAAM,eAAe,YAAY;SAAS,WAAW;SAAI,iBAAiB,UAAU;QAChH,CAAC,GAAG;QACJ,UAAU,IAAI;OAChB,CAAC;MACH;MAAI,UAAA,KAAK;KAAkB,CAAA;KAC1B,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,UAAU,QAAQ,CAAC,aAAa,CAAC,QAAQ,SAAS;MAAM,eAAe;OACvG,MAAM,OAAO;OACb,IAAI,CAAC,MAAM;OACX,MAAM,KAAK,UAAU;OACrB,OAAY,YAAY;QACtB,MAAM,OAAO,MAAM,KAAiB,SAAS,EAAE,WAAW,KAAK,CAAC;QAChE,IAAI,CAAC,qBAAqB;SACxB,SAAS;SAAM,WAAW;SAAM,eAAe,YAAY;SAAS,WAAW;SAAI,iBAAiB,UAAU;QAChH,CAAC,GAAG;QACJ,UAAU,IAAI;OAChB,CAAC;MACH;MAAI,UAAA,KAAK;KAAc,CAAA,IAAI;IACxB;;EACE;;AACX;AAEA,SAAgB,aAAa,WAAmB,QAA4B;CAC1E,OAAO,GAAG,UAAU,GAAG;AACzB;AAEA,SAAgB,aAAa,EAAE,QAAQ,SAA6C;CAClF,MAAM,OAAO,cAAc,QAAQ,KAAK;CACxC,MAAM,OAAO,KAAK,KAAK,MAAM;CAC7B,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAAqB,eAAY;EAAqB,gBAAc,KAAK,aAAa,KAAA;EAArG,UAAA,CACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;GAAuB;GAAQ,QAAQ,KAAK;EAAS,CAAA,GACpD,KAAK,YACF,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;GAAwF;GACtF,WAAW,KAAK;GAAW,QAAQ,KAAK;GAAQ,SAAQ;EAAY,GAD/C,YAAY,aAAa,KAAK,WAAW,KAAK,MAAM,GACL,IACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;GAAG,WAAU;GAAa,UAAA,KAAK;EAAe,CAAA,CAC/C;;AACP;AAEA,SAAgB,aAAa,EAAE,QAAQ,SAA6C;CAClF,MAAM,OAAO,cAAc,QAAQ,KAAK;CACxC,IAAI,KAAK,UAAU,CAAC,KAAK,WAAW,OAAO;CAC3C,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;EAA0E;EAC/E,WAAW,KAAK;EAAW,QAAQ,KAAK;EAAQ,QAAQ,KAAK;CAAS,GAD1C,aAAa,KAAK,WAAW,KAAK,MAAM,CACE;AAC1E;AAEA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;AAsBf,SAAgB,MAAM,KAAoB;CACxC,MAAM,SAAS;CACf,IAAI,aAAa;EACf,IAAI,OAAO,aAAa,aAAa,aAAa,CAAC;EACnD,MAAM,QAAQ,SAAS,cAAc,OAAO;EAC5C,MAAM,aAAa,eAAe,mBAAmB;EACrD,MAAM,cAAc;EACpB,SAAS,KAAK,YAAY,KAAK;EAC/B,aAAa,MAAM,OAAO;CAC5B,GAAG,iBAAiB;CACpB,IAAI,aAAa,OAAO,MAAM,OAAO,0BAA0B,OAAO,MAAM,SAAS;EACnF,MAAM;EAAoB,IAAI;EAAQ,OAAO;EAAI,OAAO;CAC1D,IAAI,UAAmB,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;EAAsB;EAAe;CAAQ,CAAA,CAAC,CAAC,GAAG,mBAAmB;CAC5F,IAAI,aAAa,OAAO,MAAM,OAAO,wBAAwB,OAAO,MAAM,SAAS;EACjF,MAAM;EAAkB,IAAI;EAAQ,OAAO;EAAI,OAAO;CACxD,IAAI,UAAmB,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;EAAsB;EAAe;CAAQ,CAAA,CAAC,CAAC,GAAG,eAAe;AAC1F"}
|