From 45c03c23cd1f744171e609d1dbd0e3beed1dfc7c Mon Sep 17 00:00:00 2001 From: taekchef Date: Fri, 14 Aug 2026 22:50:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20panel=20dock=20frozen=20after=20page=20r?= =?UTF-8?q?efresh=20=E2=80=94=20barrier=20rejects=20every=20new=20fence?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The host's anchor key is `:` (`14:assistant-step3:0`); `anchorSeqOf` grabbed the FIRST number in the key — the kind-name length constant — so every assistant step yielded the same order[0]. The panel store's persisted replay barrier (hydration sets replayBarrier = persisted maxSeenSeq = that constant) then rejected every new panel:true fence after a refresh. Dock froze on the old snapshot, actions kept working, zero logs (issue #4). - anchorSeqOf: parse `:` from assistant-step keys → seq = turn*1000+step, strictly monotonic in message order and growing across reloads; document-order fallback kept for non-assistant / anchor-less (Safari) rows. Also un-freezes the /panel local-override barrier, which depended on the same broken seq. - Diagnostics: one-time console.warn per source per page session when a barrier rejects an op ([genui] prefix, values included); budget-overflow rejections stay on the existing budget diagnostic. Closes #4 --- CHANGELOG.md | 7 ++++ lib/client.js | 6 +-- package.json | 2 +- src/client/dom-fence.tsx | 30 +++++++++++---- src/client/panel-store.ts | 32 ++++++++++++++++ tests/dom-fence.spec.tsx | 75 +++++++++++++++++++++++++++++++++++++- tests/genui-panel.spec.tsx | 19 ++++++++++ 7 files changed, 158 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index beb629f..3d4c1de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.8.2] - 2026-08-14 +### 修复 +- **页面刷新后面板 dock 冻结(issue #4)**:宿主 anchor key 格式为 `:`(assistant step 的 id 是 `:`,如 `14:assistant-step3:0`)。DOM 通道 `anchorSeqOf` 旧实现取 key 里**第一个数字 = kind 名称长度常量**(所有 assistant step 都是同一个值)→ 面板 store 的持久化重放屏障(刷新后 replayBarrier = 持久化 maxSeenSeq = 该常量)拒绝一切新 panel 围栏:dock 停在旧快照、`[genui-action]` 还活着、控制台零日志;清 `localStorage['dsh.genui.panel']` 恢复但刷新复发(与报告完全一致)。修复:`anchorSeqOf` 改从 assistant-step key 解析 `:`,seq = `turn*1000+step`(随消息顺序严格单调,刷新后新消息必然大于持久化屏障);非 assistant 行 / 无锚点(Safari)行保留文档序兜底。同类隐患一并修复:`/panel` 本地覆盖的 localBarrier 同样依赖该 seq,此前也会冻结后续更新 +- **面板静默拒绝可观测(issue #4 建议 3)**:`applyPanelOperation` 的 barrier 拒绝路径加一次性 `console.warn`(`[genui] 面板操作被重放屏障拒绝…`,每 source 每页面会话一条;预算 overflow 后置 append 拒绝仍走既有的 budget 诊断,不重复告警);`clearSessionPanel` 同步清理 blocked 诊断集 +### 测试 +- 263 → 266(+3:DOM 通道刷新回归「turn 2/3 面板 → 模拟刷新 → 历史重放保持旧快照 → turn 4 新围栏更新 dock」(旧代码上该测试失败于 `expected '面板B' to be '面板C'`,精确复现报告症状)/同 turn 内 step 单调性;panel-store 屏障拒绝告警一次/条);363 全绿 + ## [0.8.1] - 2026-08-14 ### 修复 - **Safari 围栏全部静默丢失(issue #1)**:Safari 宿主渲染消息行时不带 `data-chat-anchor-key`(该属性是 React key 派生值,key 为 undefined 时 React 直接不渲染该属性;Chrome 同页 14 个代码块全有锚点、Safari 0 个)→ DOM 通道 `rowOf` 落空 → 每个 `dsh-ui` 围栏在静默 return 点被放弃,控制台零报错。修复:行解析降级链 `[data-chat-anchor-key]` → `[data-chat-flow-key]/[data-chat-flow-kind]`(宿主同一行 div 上的路由属性,kind 与 key 相互独立、可幸存)→ 代码块自身(身份降级为 `dom:unknown:<序数>`,`contextOf` 的 `?? 'unknown'` 分支本就存在);`fenceIndexOf` 在无行兜底时改按全文档已落定 dsh-ui 块的序数计数,同行兄弟围栏不会撞同一个 `dom:unknown:N`;`anchorSeqOf` 文档序兜底改用联合选择器(锚点行 + flow 行),无锚点行仍得单调 seq 估计。**所有静默 return 点加一次性 `console.warn`(`[dsh-genui]` 前缀,WeakSet 每块一次,1s sweep 不刷屏)**:无锚点降级、落定空体、落定不可修复体各一条诊断 diff --git a/lib/client.js b/lib/client.js index 96169b4..54e77c1 100644 --- a/lib/client.js +++ b/lib/client.js @@ -1,5 +1,5 @@ -window.__ModuleLoader__.load({id:`@omdsh-dev/dsh-genui`,factory:e=>{var t={exports:{}},n=t.exports;Object.defineProperty(n,Symbol.toStringTag,{value:`Module`});var r=Object.create,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.getPrototypeOf,c=Object.prototype.hasOwnProperty,l=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},u=(e,t)=>{let n={};for(var r in e)i(n,r,{get:e[r],enumerable:!0});return t||i(n,Symbol.toStringTag,{value:`Module`}),n},d=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var s=o(t),l=0,u=s.length,d;lt[e]).bind(null,d),enumerable:!(r=a(t,d))||r.enumerable});return e},f=(e,t,n)=>(n=e==null?{}:r(s(e)),d(t||!e||!e.__esModule||!c.call(e,`default`)?i(n,`default`,{value:e,enumerable:!0}):n,e));let p=e("@deepseek-ai/dsh-client-ui-primitives");p=f(p,1);let ee=e("react-dom/client"),m=e("react"),h=e("react/jsx-runtime"),g=(0,m.createContext)(void 0),_=p.GenuiActionContext??g;function v(){return(0,m.useContext)(_)}let y={display:`flex`,flexDirection:`column`,gap:`4px`,padding:`8px 12px`,margin:`4px 0`,borderRadius:`8px`,border:`1px solid rgba(127,127,127,0.35)`,background:`rgba(127,127,127,0.08)`,color:`inherit`,fontSize:`12px`,lineHeight:1.5,fontFamily:`inherit`};var b=class extends m.Component{state={error:null};static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error(`[dsh-genui] render failed:`,e,t.componentStack??``)}render(){let{error:e}=this.state;return e===null?this.props.children:(0,h.jsxs)(`div`,{style:y,role:`alert`,"data-genui-error":!0,children:[(0,h.jsxs)(`span`,{style:{fontWeight:600},children:[`⚠️ `,this.props.label??`此界面`,`渲染失败(已隔离,不影响其他内容)`]}),(0,h.jsx)(`span`,{style:{opacity:.75,overflowWrap:`anywhere`},children:e.message})]})}};let x=`@omdsh-dev/dsh-genui/GenuiBlock.module.css`;if(typeof document<`u`&&document.querySelector(`style[data-plugin-css=`+JSON.stringify(x)+`]`)===null){let e=document.createElement(`style`);e.dataset.plugin=`@omdsh-dev/dsh-genui`,e.dataset.pluginCss=x,e.textContent=`.V1MMBW_block{--dsl-g-radius-surface:12px;--dsl-g-radius-control:8px;--dsl-g-radius-pill:999px;--dsl-g-font-display:24px;--dsl-g-font-h1:20px;--dsl-g-font-h2:16px;--dsl-g-font-h3:14px;--dsl-g-font-body:14px;--dsl-g-font-title:13px;--dsl-g-font-meta:12px;--dsl-g-font-data:11px;--dsl-g-gap-lg:16px;--dsl-g-gap-md:12px;--dsl-g-gap-sm:8px;--dsl-g-gap-xs:4px;--dsl-g-border:var(--dsw-alias-border-l1,var(--dsw-alias-border-l2,#ffffff1f));--dsl-g-border-strong:var(--dsw-alias-border-l2,#ffffff1f);--dsl-g-accent:var(--dsw-alias-state-business-primary,#4f8ef7);--dsl-g-accent-soft:color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint), transparent);--dsl-g-tint:8%;--dsl-g-tint-strong:14%;--dsl-g-font-mono:var(--ds-font-family-code,ui-monospace, "SF Mono", monospace);color:var(--dsw-alias-label-primary);margin:8px 0}.V1MMBW_banner{font-size:var(--dsl-g-font-title);letter-spacing:.01em;color:var(--dsw-alias-label-primary);margin-bottom:var(--dsl-g-gap-lg);border-bottom:1px solid var(--dsl-g-border);padding-bottom:10px;font-weight:600}.V1MMBW_col{gap:var(--dsl-g-gap-md);flex-direction:column;display:flex}.V1MMBW_row{align-items:center;gap:var(--dsl-g-gap-md);display:flex}.V1MMBW_row.V1MMBW_wrap{flex-wrap:wrap}.V1MMBW_grid{gap:var(--dsl-g-gap-md);display:grid}.V1MMBW_spacer{flex:1}.V1MMBW_divider{background:var(--dsw-alias-markdown-hr,var(--dsl-g-border));height:1px;margin:var(--dsl-g-gap-xs) 0;border:none}.V1MMBW_card{background:var(--dsw-alias-bg-layer-1,var(--dsw-alias-markdown-code-block));border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-surface);padding:var(--dsl-g-gap-lg);gap:var(--dsl-g-gap-md);flex-direction:column;display:flex}.V1MMBW_cardTitle{font-size:var(--dsl-g-font-meta);letter-spacing:.02em;color:var(--dsw-alias-label-secondary);font-weight:600}.V1MMBW_text{color:var(--dsw-alias-label-primary)}.V1MMBW_text.V1MMBW_h1{font-size:var(--dsl-g-font-h1);letter-spacing:-.02em;font-weight:700;line-height:1.3}.V1MMBW_text.V1MMBW_h2{font-size:var(--dsl-g-font-h2);letter-spacing:-.01em;font-weight:600;line-height:1.35}.V1MMBW_text.V1MMBW_h3{font-size:var(--dsl-g-font-h3);font-weight:600;line-height:1.5}.V1MMBW_text.V1MMBW_body{font-size:var(--dsl-g-font-body);color:var(--dsw-alias-label-primary);line-height:1.6}.V1MMBW_text.V1MMBW_muted{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary);line-height:1.5}.V1MMBW_text.V1MMBW_caption{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);letter-spacing:.02em;line-height:1.5}.V1MMBW_text.V1MMBW_center{text-align:center}.V1MMBW_button{border:1px solid var(--dsl-g-border);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:var(--dsl-g-radius-control);padding:8px var(--dsl-g-gap-lg);font-size:var(--dsl-g-font-title);cursor:pointer;text-align:center;font-family:inherit;font-weight:600;line-height:1.4;transition:border-color .15s,filter .15s,background .15s}.V1MMBW_button:hover:not(:disabled){border-color:var(--dsl-g-accent);filter:brightness(1.06)}.V1MMBW_button.V1MMBW_primary:hover:not(:disabled){filter:brightness(1.08)}.V1MMBW_button:disabled{cursor:not-allowed;opacity:.45;filter:none;box-shadow:none;pointer-events:none}.V1MMBW_button.V1MMBW_primary{background:var(--dsl-g-accent);color:#fff;border:none;box-shadow:inset 0 1px #ffffff24}.V1MMBW_button.V1MMBW_danger{background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) var(--dsl-g-tint), transparent);border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) 30%, transparent);color:var(--dsw-alias-state-error-primary,#ffb3b3)}.V1MMBW_button.V1MMBW_success{background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) var(--dsl-g-tint), transparent);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) 30%, transparent);color:var(--dsw-alias-state-success-secondary,#9fe8c5)}.V1MMBW_button.V1MMBW_ghost{background:0 0}.V1MMBW_button.V1MMBW_full{width:100%}.V1MMBW_button.V1MMBW_small{font-size:var(--dsl-g-font-meta);border-radius:var(--dsl-g-radius-control);padding:4px 12px}.V1MMBW_field{gap:var(--dsl-g-gap-xs);flex-direction:column;display:flex}.V1MMBW_field>span{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary)}.V1MMBW_input,.V1MMBW_select{background:var(--dsw-alias-bg-base,#17171a);border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-control);color:var(--dsw-alias-label-primary);font-size:var(--dsl-g-font-title);outline:none;width:100%;padding:8px 12px;font-family:inherit}.V1MMBW_input:focus,.V1MMBW_select:focus{border-color:var(--dsl-g-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint-strong), transparent)}.V1MMBW_input::placeholder{color:var(--dsw-alias-label-caption,#5b6378)}.V1MMBW_checkbox{align-items:center;gap:var(--dsl-g-gap-sm);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary);cursor:pointer;display:flex}.V1MMBW_checkbox input{accent-color:var(--dsl-g-accent);width:15px;height:15px}.V1MMBW_link{color:var(--dsl-g-accent);font-size:var(--dsl-g-font-title);cursor:pointer;background:0 0;border:none;padding:0;font-family:inherit;text-decoration:none}.V1MMBW_link:hover{text-decoration:underline}.V1MMBW_linkText{color:var(--dsl-g-accent);font-size:var(--dsl-g-font-title);font-family:inherit;text-decoration:none}.V1MMBW_badge{align-items:center;gap:var(--dsl-g-gap-xs);font-size:var(--dsl-g-font-meta);letter-spacing:.01em;border-radius:var(--dsl-g-radius-pill);background:color-mix(in srgb, var(--dsw-alias-label-tertiary) var(--dsl-g-tint), transparent);width:fit-content;color:var(--dsw-alias-label-secondary);border:1px solid var(--dsl-g-border);padding:1px 10px;font-weight:500;line-height:1.5;display:inline-flex}.V1MMBW_badge.V1MMBW_success{background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) var(--dsl-g-tint), transparent);color:var(--dsw-alias-state-success-secondary,#7fe3b4);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) 30%, transparent)}.V1MMBW_badge.V1MMBW_warn{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary,#f5b83d) var(--dsl-g-tint), transparent);color:var(--dsw-alias-state-warn-secondary,#f7cf7d);border-color:color-mix(in srgb, var(--dsw-alias-state-warn-primary,#f5b83d) 30%, transparent)}.V1MMBW_badge.V1MMBW_danger{background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) var(--dsl-g-tint), transparent);color:var(--dsw-alias-state-error-primary,#ff9d9d);border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) 30%, transparent)}.V1MMBW_badge.V1MMBW_accent{background:color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint), transparent);color:var(--dsw-alias-state-business-primary,#9cc3ff);border-color:color-mix(in srgb, var(--dsl-g-accent) 30%, transparent)}.V1MMBW_stat{padding:6px var(--dsl-g-gap-lg);flex-direction:column;gap:2px;display:flex}.V1MMBW_grid>.V1MMBW_stat,.V1MMBW_row>.V1MMBW_stat{border-left:1px solid var(--dsl-g-border)}.V1MMBW_grid>.V1MMBW_stat:first-child,.V1MMBW_row>.V1MMBW_stat:first-child{padding-left:var(--dsl-g-gap-xs);border-left:none}.V1MMBW_statLabel{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);letter-spacing:.02em}.V1MMBW_statValue{font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-display);letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);font-weight:600;line-height:1.2}.V1MMBW_statDelta{font-size:var(--dsl-g-font-meta);font-weight:500}.V1MMBW_statDelta.V1MMBW_up{color:var(--dsw-alias-state-success-primary,#22c55e)}.V1MMBW_statDelta.V1MMBW_down{color:var(--dsw-alias-state-error-primary,#f25a5a)}.V1MMBW_progress{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_progressRow{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);justify-content:space-between;display:flex}.V1MMBW_progressRow span:last-child{font-family:var(--dsl-g-font-mono)}.V1MMBW_track{border-radius:var(--dsl-g-radius-pill);background:var(--dsw-alias-bg-layer-1);height:6px;box-shadow:inset 0 0 0 1px var(--dsl-g-border);overflow:hidden}.V1MMBW_fill{border-radius:var(--dsl-g-radius-pill);background:var(--dsl-g-accent);height:100%;transition:width .5s}.V1MMBW_list{flex-direction:column;display:flex}.V1MMBW_li{padding:var(--dsl-g-gap-sm) var(--dsl-g-gap-xs);flex-direction:column;gap:2px;display:flex}.V1MMBW_li+.V1MMBW_li{border-top:1px solid var(--dsl-g-border)}.V1MMBW_li:last-child{border-bottom:none}.V1MMBW_liTitle{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-primary);font-weight:600;line-height:1.5}.V1MMBW_liDesc{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);line-height:1.5}.V1MMBW_tableWrap{border-radius:var(--dsl-g-radius-control);overscroll-behavior-x:contain;min-width:0;max-width:100%;overflow-x:auto}.V1MMBW_table{border-collapse:collapse;width:100%;font-size:var(--dsl-g-font-title)}.V1MMBW_table th{text-align:left;padding:var(--dsl-g-gap-sm) var(--dsl-g-gap-md);color:var(--dsw-alias-label-tertiary);font-weight:600;font-size:var(--dsl-g-font-meta);border-bottom:1px solid var(--dsl-g-border);white-space:nowrap}.V1MMBW_table td{padding:var(--dsl-g-gap-sm) var(--dsl-g-gap-md);border-bottom:1px solid var(--dsl-g-border);color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums;line-height:1.5}.V1MMBW_table tr:last-child td{border-bottom:none}.V1MMBW_thSort{color:inherit;font:inherit;font-weight:inherit;cursor:pointer;text-align:left;background:0 0;border:none;margin:0;padding:0}.V1MMBW_thSort:hover{color:var(--dsw-alias-label-primary)}.V1MMBW_thSortMark{color:var(--dsl-g-accent)}.V1MMBW_thSort:focus-visible{outline:2px solid var(--dsl-g-accent);outline-offset:1px;border-radius:var(--dsl-g-radius-control)}.V1MMBW_chart{gap:var(--dsl-g-gap-xs);flex-direction:column;display:flex}.V1MMBW_chartPlot{align-items:flex-end;gap:var(--dsl-g-gap-sm);height:132px;display:flex;position:relative}.V1MMBW_baseline{background:var(--dsl-g-border-strong);pointer-events:none;height:1px;position:absolute;bottom:0;left:0;right:0}.V1MMBW_gridline{background:var(--dsw-alias-border-l1,#ffffff0f);pointer-events:none;height:1px;position:absolute;left:0;right:0}.V1MMBW_chartLabels{gap:var(--dsl-g-gap-sm);display:flex}.V1MMBW_chartLabels>span{flex:1;min-width:0}.V1MMBW_barCol{justify-content:flex-end;gap:var(--dsl-g-gap-xs);flex-direction:column;flex:1;min-width:0;height:100%;display:flex}.V1MMBW_barValue{font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-data);font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-secondary);text-align:center;line-height:1.2}.V1MMBW_barFill{background:var(--dsl-g-accent);border-radius:4px 4px 2px 2px;min-height:4px;transition:height .6s}.V1MMBW_barLabel{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);text-align:center;white-space:nowrap;text-overflow:ellipsis;line-height:1.5;overflow:hidden}.V1MMBW_tabs{gap:var(--dsl-g-gap-md);flex-direction:column;display:flex}.V1MMBW_tabBar{gap:var(--dsl-g-gap-xs);border-bottom:1px solid var(--dsl-g-border);display:flex}.V1MMBW_tab{color:var(--dsw-alias-label-tertiary);font-size:var(--dsl-g-font-title);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-1px;padding:6px 12px;font-family:inherit;font-weight:600;line-height:1.5}.V1MMBW_tabActive{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsl-g-accent)}.V1MMBW_avatar{width:32px;height:32px;font-size:var(--dsl-g-font-title);color:#fff;border:1px solid #ffffff24;border-radius:50%;flex-shrink:0;place-items:center;font-weight:700;display:grid;box-shadow:inset 0 1px #ffffff29}.V1MMBW_callout{border-radius:var(--dsl-g-radius-control);border:1px solid var(--dsl-g-border);font-size:var(--dsl-g-font-title);background:var(--dsw-alias-bg-layer-1,var(--dsw-alias-markdown-code-block));flex-direction:column;gap:2px;padding:10px 14px;line-height:1.6;display:flex}.V1MMBW_calloutInfo{background:color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint), transparent)}.V1MMBW_calloutSuccess{background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) var(--dsl-g-tint), transparent)}.V1MMBW_calloutWarning{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary,#f5b83d) var(--dsl-g-tint), transparent)}.V1MMBW_calloutError{background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) var(--dsl-g-tint), transparent)}.V1MMBW_calloutTitle{font-weight:600;font-size:var(--dsl-g-font-meta);letter-spacing:.02em;color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;display:flex}.V1MMBW_calloutTitle:before{content:"";background:var(--dsw-alias-label-caption,var(--dsw-alias-label-tertiary));border-radius:50%;width:6px;height:6px}.V1MMBW_calloutInfo .V1MMBW_calloutTitle:before{background:var(--dsl-g-accent)}.V1MMBW_calloutSuccess .V1MMBW_calloutTitle:before{background:var(--dsw-alias-state-success-primary,#3ecf8e)}.V1MMBW_calloutWarning .V1MMBW_calloutTitle:before{background:var(--dsw-alias-state-warn-primary,#f5b83d)}.V1MMBW_calloutError .V1MMBW_calloutTitle:before{background:var(--dsw-alias-state-error-primary,#ff6b6b)}.V1MMBW_calloutBody{color:var(--dsw-alias-label-secondary)}.V1MMBW_steps{gap:var(--dsl-g-gap-sm);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.V1MMBW_step{gap:var(--dsl-g-gap-md);align-items:flex-start;display:flex}.V1MMBW_stepMarker{width:24px;height:24px;font-size:var(--dsl-g-font-meta);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsl-g-border);color:var(--dsw-alias-label-tertiary);border-radius:50%;flex-shrink:0;place-items:center;font-weight:700;display:grid}.V1MMBW_stepDone .V1MMBW_stepMarker{background:var(--dsw-alias-state-success-primary,#3ecf8e);color:#fff;border-color:#0000;font-size:13px}.V1MMBW_stepActive .V1MMBW_stepMarker{background:color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint-strong), transparent);border-color:var(--dsl-g-accent);color:var(--dsl-g-accent)}.V1MMBW_stepContent{flex-direction:column;gap:2px;padding-top:3px;display:flex}.V1MMBW_stepTitle{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-primary);font-weight:600;line-height:1.5}.V1MMBW_stepDesc{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);line-height:1.5}.V1MMBW_keyvalue{flex-direction:column;margin:0;display:flex}.V1MMBW_kvRow{gap:var(--dsl-g-gap-md);font-size:var(--dsl-g-font-title);padding:6px 0;display:flex}.V1MMBW_kvRow+.V1MMBW_kvRow{border-top:1px solid var(--dsl-g-border)}.V1MMBW_kvRow:last-child{border-bottom:none}.V1MMBW_kvKey{width:96px;color:var(--dsw-alias-label-tertiary);flex-shrink:0;font-weight:600}.V1MMBW_kvValue{color:var(--dsw-alias-label-primary);word-break:break-word;margin:0;line-height:1.5}.V1MMBW_jsonScalar{font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary)}.V1MMBW_lineChart{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_linePath{fill:none;stroke:var(--dsl-g-accent);stroke-width:2px;stroke-linejoin:round;stroke-linecap:round}.V1MMBW_lineDot{fill:var(--dsl-g-accent)}.V1MMBW_lineGrid{stroke:var(--dsw-alias-border-l1,#ffffff12);stroke-width:1px}.V1MMBW_lineGridAxis{stroke:var(--dsl-g-border-strong);stroke-width:1px}.V1MMBW_lineTick{fill:var(--dsw-alias-label-tertiary);font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-data)}.V1MMBW_lineLabels{justify-content:space-between;display:flex}.V1MMBW_groupedBars{gap:var(--dsl-g-gap-xs);align-items:flex-end;width:100%;height:100%;display:flex}.V1MMBW_groupedBar{flex-direction:column;flex:1;justify-content:flex-end;align-items:center;gap:2px;min-width:0;height:100%;display:flex}.V1MMBW_groupValue{font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-data);font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;max-width:100%;line-height:1.2;overflow:hidden}.V1MMBW_groupedFill{background:var(--dsl-g-accent);border-radius:4px 4px 2px 2px;flex:none;width:100%;min-height:3px}.V1MMBW_donut{align-items:center;gap:var(--dsl-g-gap-lg);display:flex}.V1MMBW_donutTrack{stroke:var(--dsw-alias-border-l1,#ffffff14)}.V1MMBW_donutTotal{fill:var(--dsw-alias-label-primary);font-size:var(--dsl-g-font-h2);font-weight:700}.V1MMBW_donutTotalLabel{fill:var(--dsw-alias-label-tertiary);font-size:10px}.V1MMBW_donutLegend{gap:var(--dsl-g-gap-xs);font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-secondary);flex-direction:column;line-height:1.5;display:flex}.V1MMBW_fieldGroup{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_fieldLabel{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary)}.V1MMBW_radio{align-items:center;gap:var(--dsl-g-gap-sm);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary);cursor:pointer;line-height:1.5;display:flex}.V1MMBW_radio input{accent-color:var(--dsl-g-accent)}.V1MMBW_submitRow{align-items:center;gap:var(--dsl-g-gap-md);margin-top:2px;display:flex}.V1MMBW_submit{align-self:flex-start}.V1MMBW_submitHint{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary)}.V1MMBW_btnSent{margin-left:var(--dsl-g-gap-sm);font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-state-success-primary,#3ecf8e);font-weight:600}.V1MMBW_gradeWrap{gap:var(--dsl-g-gap-md);flex-direction:column;display:flex}.V1MMBW_gradeScore{align-items:baseline;gap:var(--dsl-g-gap-sm);display:flex}.V1MMBW_gradeScoreValue{font-size:var(--dsl-g-font-display);color:var(--dsw-alias-label-primary);font-weight:700;line-height:1.2}.V1MMBW_gradeScoreLabel{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary)}.V1MMBW_gradeList{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_gradeItem{font-size:var(--dsl-g-font-title);padding:var(--dsl-g-gap-sm) 12px;border-radius:var(--dsl-g-radius-control);border:1px solid var(--dsl-g-border);background:var(--dsw-alias-bg-layer-1);grid-template-columns:auto auto 1fr;align-items:baseline;gap:6px 10px;line-height:1.5;display:grid}.V1MMBW_gradeItemOk{border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) 30%, transparent)}.V1MMBW_gradeItemNo{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) 30%, transparent)}.V1MMBW_gradeQ{color:var(--dsw-alias-label-primary);font-weight:600}.V1MMBW_gradeTag{font-weight:700}.V1MMBW_gradeItemOk .V1MMBW_gradeTag{color:var(--dsw-alias-state-success-primary,#3ecf8e)}.V1MMBW_gradeItemNo .V1MMBW_gradeTag{color:var(--dsw-alias-state-error-primary,#ff6b6b)}.V1MMBW_gradeAns{color:var(--dsw-alias-label-secondary)}.V1MMBW_gradeRight{color:var(--dsw-alias-state-error-primary,#ffb3b3)}.V1MMBW_gradeExp{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);grid-column:1/-1;line-height:1.5}.V1MMBW_switchRow{justify-content:space-between;align-items:center;gap:var(--dsl-g-gap-md);cursor:pointer;display:flex}.V1MMBW_switchRow:focus-within .V1MMBW_switch{box-shadow:0 0 0 3px color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint-strong), transparent)}.V1MMBW_switchLabel{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-primary);line-height:1.5}.V1MMBW_switch{border-radius:var(--dsl-g-radius-pill);border:1px solid var(--dsl-g-border);background:var(--dsw-alias-bg-base,#17171a);width:38px;height:22px;transition:background .2s;position:relative}.V1MMBW_switchOn{background:var(--dsl-g-accent);border-color:#0000}.V1MMBW_switchKnob{background:#fff;border-radius:50%;width:14px;height:14px;transition:left .2s;position:absolute;top:3px;left:3px;box-shadow:0 1px 2px #0000004d}.V1MMBW_switchOn .V1MMBW_switchKnob{left:19px}.V1MMBW_sliderRow{align-items:center;gap:var(--dsl-g-gap-md);width:100%;display:flex}.V1MMBW_sliderInput{min-width:0;accent-color:var(--dsl-g-accent);flex:1}.V1MMBW_sliderValue{text-align:right;min-width:44px;font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-data);color:var(--dsw-alias-label-primary)}.V1MMBW_textarea{background:var(--dsw-alias-bg-base,#17171a);border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-control);width:100%;color:var(--dsw-alias-label-primary);padding:var(--dsl-g-gap-sm) 12px;font-size:var(--dsl-g-font-title);resize:vertical;outline:none;font-family:inherit;line-height:1.5}.V1MMBW_textarea:focus{border-color:var(--dsl-g-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint-strong), transparent)}.V1MMBW_accordion{border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-surface);flex-direction:column;display:flex;overflow:hidden}.V1MMBW_accItem{border-bottom:1px solid var(--dsl-g-border)}.V1MMBW_accItem:last-child{border-bottom:none}.V1MMBW_accHead{justify-content:space-between;align-items:center;gap:var(--dsl-g-gap-sm);background:var(--dsw-alias-bg-layer-1);width:100%;color:var(--dsw-alias-label-primary);font-size:var(--dsl-g-font-title);cursor:pointer;border:none;padding:10px 14px;font-family:inherit;font-weight:600;line-height:1.5;display:flex}.V1MMBW_accChevron{color:var(--dsw-alias-label-tertiary)}.V1MMBW_accBody{padding:var(--dsl-g-gap-md) 14px;gap:var(--dsl-g-gap-sm);background:var(--dsw-alias-bg-base,#17171a);flex-direction:column;display:flex}.V1MMBW_copyChip{border:1px solid var(--dsl-g-border);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);cursor:pointer;width:fit-content;padding:6px 14px;font-family:inherit;font-weight:600;transition:all .15s}.V1MMBW_copyChip:hover{border-color:var(--dsl-g-accent)}.V1MMBW_copyChipDone{border-color:var(--dsw-alias-state-success-primary,#3ecf8e);color:var(--dsw-alias-state-success-primary,#3ecf8e)}.V1MMBW_mermaid{padding:var(--dsl-g-gap-xs) 0;overflow-x:auto}.V1MMBW_mermaid svg{max-width:100%;height:auto}.V1MMBW_mermaidFallback{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_mermaidFallback pre{padding:var(--dsl-g-gap-sm) 10px;background:var(--dsw-alias-bg-base,#17171a);border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-control);font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-meta);margin:0;overflow-x:auto}.V1MMBW_mermaidErr{color:var(--dsw-alias-state-error-primary,#ff6b6b);font-size:var(--dsl-g-font-meta)}.V1MMBW_mermaidHint{color:var(--dsw-alias-label-tertiary);font-size:var(--dsl-g-font-meta)}.V1MMBW_scene3dWrap{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_scene3dTitle{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-primary);font-weight:700}.V1MMBW_scene3dCanvas{border-radius:var(--dsl-g-radius-surface);background:var(--dsw-alias-bg-base,#17171a);border:1px solid var(--dsl-g-border);height:240px;overflow:hidden}.V1MMBW_scene3dCanvas canvas{display:block}.V1MMBW_scene3dHint{color:var(--dsw-alias-label-tertiary);font-size:var(--dsl-g-font-meta)}.V1MMBW_timeline{flex-direction:column;display:flex}.V1MMBW_tlItem{gap:var(--dsl-g-gap-md);display:flex}.V1MMBW_tlRail{flex-direction:column;flex-shrink:0;align-items:center;width:12px;display:flex}.V1MMBW_tlDot{background:var(--dsl-g-accent);width:10px;height:10px;box-shadow:0 0 0 3px color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint-strong), transparent);border-radius:50%;flex-shrink:0;margin-top:4px}.V1MMBW_tlLine{background:var(--dsl-g-border);flex:1;width:2px;margin:2px 0}.V1MMBW_tlBody{padding-bottom:var(--dsl-g-gap-lg);flex:1;min-width:0}.V1MMBW_tlHead{align-items:baseline;gap:var(--dsl-g-gap-md);display:flex}.V1MMBW_tlTitle{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-primary);font-weight:600;line-height:1.5}.V1MMBW_tlTime{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);white-space:nowrap;margin-left:auto}.V1MMBW_tlDesc{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary);margin-top:2px;line-height:1.5}.V1MMBW_fileTree{font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-meta);flex-direction:column;display:flex}.V1MMBW_ftRow{align-items:center;gap:var(--dsl-g-gap-sm);padding:3px var(--dsl-g-gap-xs);border-radius:var(--dsl-g-radius-control);display:flex}.V1MMBW_ftRow:hover{background:var(--dsw-alias-bg-layer-1)}.V1MMBW_ftIcon{text-align:center;width:13px;font-size:10px;font-family:var(--dsl-g-font-mono);color:var(--dsw-alias-label-caption,var(--dsw-alias-label-tertiary));flex-shrink:0;line-height:1}.V1MMBW_ftIconDir{color:var(--dsl-g-accent);font-size:11px}.V1MMBW_ftName{color:var(--dsw-alias-label-secondary)}.V1MMBW_ftDir{color:var(--dsw-alias-label-primary);font-weight:600}.V1MMBW_ftNameBtn{align-items:center;gap:var(--dsl-g-gap-sm);min-width:0;font-family:inherit;font-size:var(--dsl-g-font-body);cursor:default;text-align:left;background:0 0;border:none;padding:0;display:inline-flex}button.V1MMBW_ftNameBtn[aria-expanded]{cursor:pointer}.V1MMBW_ftNameBtn:focus-visible{outline:2px solid var(--dsl-g-accent);outline-offset:1px;border-radius:var(--dsl-g-radius-control)}.V1MMBW_breadcrumb{align-items:center;gap:var(--dsl-g-gap-xs);font-size:var(--dsl-g-font-title);flex-wrap:wrap;display:flex}.V1MMBW_bcItem{align-items:center;gap:var(--dsl-g-gap-xs);display:inline-flex}.V1MMBW_bcText{color:var(--dsw-alias-label-secondary);cursor:pointer}.V1MMBW_bcText:hover{color:var(--dsl-g-accent)}.V1MMBW_bcCurrent{color:var(--dsw-alias-label-primary);cursor:default;font-weight:600}.V1MMBW_bcSep{color:var(--dsw-alias-label-caption,var(--dsw-alias-label-tertiary))}@keyframes V1MMBW_genuiReveal{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.V1MMBW_reveal{animation:.45s cubic-bezier(.22,1,.36,1) both V1MMBW_genuiReveal}@media (prefers-reduced-motion:reduce){.V1MMBW_reveal{animation:none}}.V1MMBW_quiz{gap:var(--dsl-g-gap-md);padding:var(--dsl-g-gap-lg);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-surface);flex-direction:column;display:flex}.V1MMBW_quizQuestion{font-size:var(--dsl-g-font-body);color:var(--dsw-alias-label-primary);font-weight:600;line-height:1.6}.V1MMBW_quizOptions{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_quizOpt{align-items:center;gap:var(--dsl-g-gap-sm);text-align:left;background:var(--dsw-alias-bg-base,#17171a);border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary);cursor:pointer;padding:10px 14px;font-family:inherit;line-height:1.5;transition:border-color .15s,background .15s;display:flex}.V1MMBW_quizOpt:hover:not(:disabled){border-color:var(--dsl-g-accent);background:var(--dsl-g-accent-soft)}.V1MMBW_quizOpt:focus-visible,.V1MMBW_button:focus-visible,.V1MMBW_tab:focus-visible,.V1MMBW_accHead:focus-visible,.V1MMBW_copyChip:focus-visible,.V1MMBW_link:focus-visible,.V1MMBW_quizRetry:focus-visible,.V1MMBW_resetBtn:focus-visible,.V1MMBW_playBtn:focus-visible,.V1MMBW_bcText:focus-visible{outline:2px solid var(--dsl-g-accent);outline-offset:1px}.V1MMBW_quizOpt:disabled{cursor:default;opacity:.85}.V1MMBW_quizOptCorrect{align-items:center;gap:var(--dsl-g-gap-sm);text-align:left;background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) var(--dsl-g-tint), transparent);border:1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) 40%, transparent);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-state-success-primary,#3ecf8e);padding:10px 14px;font-family:inherit;font-weight:600;line-height:1.5;display:flex}.V1MMBW_quizOptWrong{align-items:center;gap:var(--dsl-g-gap-sm);text-align:left;background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) var(--dsl-g-tint), transparent);border:1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) 30%, transparent);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-state-error-primary,#ff6b6b);padding:10px 14px;font-family:inherit;font-weight:600;line-height:1.5;display:flex}.V1MMBW_quizOptReveal{align-items:center;gap:var(--dsl-g-gap-sm);text-align:left;background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) var(--dsl-g-tint), transparent);border:1px dashed color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) 40%, transparent);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-state-success-primary,#3ecf8e);padding:10px 14px;font-family:inherit;line-height:1.5;display:flex}.V1MMBW_quizMarker{text-align:center;width:16px;font-weight:700}.V1MMBW_quizResult{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_quizCorrectMsg{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-state-success-primary,#3ecf8e);font-weight:600}.V1MMBW_quizWrongMsg{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-state-error-primary,#ff6b6b);font-weight:600}.V1MMBW_quizFeedback{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-secondary);margin-top:3px;font-weight:400;line-height:1.5}.V1MMBW_quizExplanation{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);padding:var(--dsl-g-gap-sm) 10px;border-top:1px solid var(--dsl-g-border);line-height:1.6}.V1MMBW_quizRetry{border:1px solid var(--dsl-g-border);width:fit-content;color:var(--dsw-alias-label-secondary);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);cursor:pointer;background:0 0;padding:6px 14px;font-family:inherit}.V1MMBW_quizRetry:hover{border-color:var(--dsl-g-accent);color:var(--dsl-g-accent)}.V1MMBW_tool{margin:4px 0}.V1MMBW_toolFallback{align-items:center;gap:var(--dsl-g-gap-md);padding:var(--dsl-g-gap-sm) 12px;border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-surface);background:var(--dsw-alias-bg-layer-1,var(--dsw-alias-markdown-code-block));font-size:var(--dsl-g-font-title);display:flex}.V1MMBW_toolFallbackTitle{color:var(--dsw-alias-label-primary);font-weight:600}.V1MMBW_toolFallbackMeta{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.V1MMBW_panel{border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary,#4f8ef7) 35%, transparent);background:var(--dsw-alias-bg-layer-1,#ffffff0a);border-radius:14px;margin:10px 14px 2px;overflow:hidden}.V1MMBW_panelHeader{align-items:center;display:flex}.V1MMBW_panelToggle{align-items:center;gap:var(--dsl-g-gap-sm);width:100%;color:inherit;font:inherit;font-size:var(--dsl-g-font-title);cursor:pointer;background:0 0;border:0;padding:9px 14px;display:flex}.V1MMBW_panelToggle:hover{background:#ffffff0a}.V1MMBW_panelBadge{padding:0 var(--dsl-g-gap-sm);background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4f8ef7) var(--dsl-g-tint-strong), transparent);color:var(--dsw-alias-state-business-primary,#7ba8ff);letter-spacing:.04em;border-radius:6px;flex:none;font-size:11px;font-weight:600;line-height:1.6}.V1MMBW_panelTitle{color:var(--dsw-alias-label-primary,#e6e6e6);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.V1MMBW_panelChevron{color:var(--dsw-alias-label-secondary,#ffffff8c);font-size:var(--dsl-g-font-meta);margin-left:auto}.V1MMBW_panelBody{height:360px;padding:0 16px var(--dsl-g-gap-lg);overflow-y:auto}.V1MMBW_panelResizeHandle{cursor:ns-resize;touch-action:none;background:0 0;border-radius:3px;height:6px;transition:background .15s}.V1MMBW_panelResizeHandle:hover,.V1MMBW_panelResizeHandleActive{background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4f8ef7) 35%, transparent)}`,document.head.appendChild(e)}var S={accBody:`V1MMBW_accBody`,accChevron:`V1MMBW_accChevron`,accHead:`V1MMBW_accHead`,accItem:`V1MMBW_accItem`,accent:`V1MMBW_accent`,accordion:`V1MMBW_accordion`,avatar:`V1MMBW_avatar`,badge:`V1MMBW_badge`,banner:`V1MMBW_banner`,barCol:`V1MMBW_barCol`,barFill:`V1MMBW_barFill`,barLabel:`V1MMBW_barLabel`,barValue:`V1MMBW_barValue`,baseline:`V1MMBW_baseline`,bcCurrent:`V1MMBW_bcCurrent`,bcItem:`V1MMBW_bcItem`,bcSep:`V1MMBW_bcSep`,bcText:`V1MMBW_bcText`,block:`V1MMBW_block`,body:`V1MMBW_body`,breadcrumb:`V1MMBW_breadcrumb`,btnSent:`V1MMBW_btnSent`,button:`V1MMBW_button`,callout:`V1MMBW_callout`,calloutBody:`V1MMBW_calloutBody`,calloutError:`V1MMBW_calloutError`,calloutInfo:`V1MMBW_calloutInfo`,calloutSuccess:`V1MMBW_calloutSuccess`,calloutTitle:`V1MMBW_calloutTitle`,calloutWarning:`V1MMBW_calloutWarning`,caption:`V1MMBW_caption`,card:`V1MMBW_card`,cardTitle:`V1MMBW_cardTitle`,center:`V1MMBW_center`,chart:`V1MMBW_chart`,chartLabels:`V1MMBW_chartLabels`,chartPlot:`V1MMBW_chartPlot`,checkbox:`V1MMBW_checkbox`,col:`V1MMBW_col`,copyChip:`V1MMBW_copyChip`,copyChipDone:`V1MMBW_copyChipDone`,danger:`V1MMBW_danger`,divider:`V1MMBW_divider`,donut:`V1MMBW_donut`,donutLegend:`V1MMBW_donutLegend`,donutTotal:`V1MMBW_donutTotal`,donutTotalLabel:`V1MMBW_donutTotalLabel`,donutTrack:`V1MMBW_donutTrack`,down:`V1MMBW_down`,field:`V1MMBW_field`,fieldGroup:`V1MMBW_fieldGroup`,fieldLabel:`V1MMBW_fieldLabel`,fileTree:`V1MMBW_fileTree`,fill:`V1MMBW_fill`,ftDir:`V1MMBW_ftDir`,ftIcon:`V1MMBW_ftIcon`,ftIconDir:`V1MMBW_ftIconDir`,ftName:`V1MMBW_ftName`,ftNameBtn:`V1MMBW_ftNameBtn`,ftRow:`V1MMBW_ftRow`,full:`V1MMBW_full`,genuiReveal:`V1MMBW_genuiReveal`,ghost:`V1MMBW_ghost`,gradeAns:`V1MMBW_gradeAns`,gradeExp:`V1MMBW_gradeExp`,gradeItem:`V1MMBW_gradeItem`,gradeItemNo:`V1MMBW_gradeItemNo`,gradeItemOk:`V1MMBW_gradeItemOk`,gradeList:`V1MMBW_gradeList`,gradeQ:`V1MMBW_gradeQ`,gradeRight:`V1MMBW_gradeRight`,gradeScore:`V1MMBW_gradeScore`,gradeScoreLabel:`V1MMBW_gradeScoreLabel`,gradeScoreValue:`V1MMBW_gradeScoreValue`,gradeTag:`V1MMBW_gradeTag`,gradeWrap:`V1MMBW_gradeWrap`,grid:`V1MMBW_grid`,gridline:`V1MMBW_gridline`,groupValue:`V1MMBW_groupValue`,groupedBar:`V1MMBW_groupedBar`,groupedBars:`V1MMBW_groupedBars`,groupedFill:`V1MMBW_groupedFill`,h1:`V1MMBW_h1`,h2:`V1MMBW_h2`,h3:`V1MMBW_h3`,input:`V1MMBW_input`,jsonScalar:`V1MMBW_jsonScalar`,keyvalue:`V1MMBW_keyvalue`,kvKey:`V1MMBW_kvKey`,kvRow:`V1MMBW_kvRow`,kvValue:`V1MMBW_kvValue`,li:`V1MMBW_li`,liDesc:`V1MMBW_liDesc`,liTitle:`V1MMBW_liTitle`,lineChart:`V1MMBW_lineChart`,lineDot:`V1MMBW_lineDot`,lineGrid:`V1MMBW_lineGrid`,lineGridAxis:`V1MMBW_lineGridAxis`,lineLabels:`V1MMBW_lineLabels`,linePath:`V1MMBW_linePath`,lineTick:`V1MMBW_lineTick`,link:`V1MMBW_link`,linkText:`V1MMBW_linkText`,list:`V1MMBW_list`,mermaid:`V1MMBW_mermaid`,mermaidErr:`V1MMBW_mermaidErr`,mermaidFallback:`V1MMBW_mermaidFallback`,mermaidHint:`V1MMBW_mermaidHint`,muted:`V1MMBW_muted`,panel:`V1MMBW_panel`,panelBadge:`V1MMBW_panelBadge`,panelBody:`V1MMBW_panelBody`,panelChevron:`V1MMBW_panelChevron`,panelHeader:`V1MMBW_panelHeader`,panelResizeHandle:`V1MMBW_panelResizeHandle`,panelResizeHandleActive:`V1MMBW_panelResizeHandleActive`,panelTitle:`V1MMBW_panelTitle`,panelToggle:`V1MMBW_panelToggle`,playBtn:`V1MMBW_playBtn`,primary:`V1MMBW_primary`,progress:`V1MMBW_progress`,progressRow:`V1MMBW_progressRow`,quiz:`V1MMBW_quiz`,quizCorrectMsg:`V1MMBW_quizCorrectMsg`,quizExplanation:`V1MMBW_quizExplanation`,quizFeedback:`V1MMBW_quizFeedback`,quizMarker:`V1MMBW_quizMarker`,quizOpt:`V1MMBW_quizOpt`,quizOptCorrect:`V1MMBW_quizOptCorrect`,quizOptReveal:`V1MMBW_quizOptReveal`,quizOptWrong:`V1MMBW_quizOptWrong`,quizOptions:`V1MMBW_quizOptions`,quizQuestion:`V1MMBW_quizQuestion`,quizResult:`V1MMBW_quizResult`,quizRetry:`V1MMBW_quizRetry`,quizWrongMsg:`V1MMBW_quizWrongMsg`,radio:`V1MMBW_radio`,resetBtn:`V1MMBW_resetBtn`,reveal:`V1MMBW_reveal`,row:`V1MMBW_row`,scene3dCanvas:`V1MMBW_scene3dCanvas`,scene3dHint:`V1MMBW_scene3dHint`,scene3dTitle:`V1MMBW_scene3dTitle`,scene3dWrap:`V1MMBW_scene3dWrap`,select:`V1MMBW_select`,sliderInput:`V1MMBW_sliderInput`,sliderRow:`V1MMBW_sliderRow`,sliderValue:`V1MMBW_sliderValue`,small:`V1MMBW_small`,spacer:`V1MMBW_spacer`,stat:`V1MMBW_stat`,statDelta:`V1MMBW_statDelta`,statLabel:`V1MMBW_statLabel`,statValue:`V1MMBW_statValue`,step:`V1MMBW_step`,stepActive:`V1MMBW_stepActive`,stepContent:`V1MMBW_stepContent`,stepDesc:`V1MMBW_stepDesc`,stepDone:`V1MMBW_stepDone`,stepMarker:`V1MMBW_stepMarker`,stepTitle:`V1MMBW_stepTitle`,steps:`V1MMBW_steps`,submit:`V1MMBW_submit`,submitHint:`V1MMBW_submitHint`,submitRow:`V1MMBW_submitRow`,success:`V1MMBW_success`,switch:`V1MMBW_switch`,switchKnob:`V1MMBW_switchKnob`,switchLabel:`V1MMBW_switchLabel`,switchOn:`V1MMBW_switchOn`,switchRow:`V1MMBW_switchRow`,tab:`V1MMBW_tab`,tabActive:`V1MMBW_tabActive`,tabBar:`V1MMBW_tabBar`,table:`V1MMBW_table`,tableWrap:`V1MMBW_tableWrap`,tabs:`V1MMBW_tabs`,text:`V1MMBW_text`,textarea:`V1MMBW_textarea`,thSort:`V1MMBW_thSort`,thSortMark:`V1MMBW_thSortMark`,timeline:`V1MMBW_timeline`,tlBody:`V1MMBW_tlBody`,tlDesc:`V1MMBW_tlDesc`,tlDot:`V1MMBW_tlDot`,tlHead:`V1MMBW_tlHead`,tlItem:`V1MMBW_tlItem`,tlLine:`V1MMBW_tlLine`,tlRail:`V1MMBW_tlRail`,tlTime:`V1MMBW_tlTime`,tlTitle:`V1MMBW_tlTitle`,tool:`V1MMBW_tool`,toolFallback:`V1MMBW_toolFallback`,toolFallbackMeta:`V1MMBW_toolFallbackMeta`,toolFallbackTitle:`V1MMBW_toolFallbackTitle`,track:`V1MMBW_track`,up:`V1MMBW_up`,warn:`V1MMBW_warn`,wrap:`V1MMBW_wrap`};let C=`dsh.genui.interaction`;function w(){return{order:[],blocks:{}}}function T(){try{let e=localStorage.getItem(C);if(e===null)return w();let t=JSON.parse(e);return!Array.isArray(t.order)||typeof t.blocks!=`object`||t.blocks===null?w():{order:t.order.filter(e=>typeof e==`string`),blocks:t.blocks}}catch{return w()}}function te(e){try{localStorage.setItem(C,JSON.stringify(e))}catch{}}function ne(e){return e===``?null:T().blocks[e]??null}function re(e,t){if(e===``)return;let n=T(),r=n.order.filter(t=>t!==e);r.unshift(e);let i={...n.blocks,[e]:t};for(;r.length>200;){let e=r.pop();e!==void 0&&delete i[e]}te({order:r,blocks:i})}function E(e){let t=5381;for(let n=0;n>>0;return t.toString(36)}function ie(e,t,n){return`f:${e}:${String(t)}:${E(n)}`}function ae(e,t){return`p:${e}:${E(t)}`}function oe(e,t){return`t:${e}:${t}`}let D={maxDepth:8,maxNodes:200,maxString:2e3,maxCode:12e3,maxMermaid:8e3,maxGridCols:12,maxTabs:12,maxAccordionItems:24,maxListItems:50,maxOptions:50,maxTableRows:50,maxTableCols:12,maxChartPoints:60,maxPlotSeries:8,maxPlotParams:6,maxMeshes:5,maxQuizOptions:8,maxSteps:24,maxTimelineItems:24,maxBreadcrumbItems:12,maxKeyValuePairs:24,maxTreeDepth:6};function se(e,t){return typeof e==`string`&&t.includes(e)}function O(e,t){return typeof e==`string`?e.slice(0,t):void 0}let ce=/^(?:#[\da-fA-F]{3,8}|rgba?\([^)]{0,64}\)|hsla?\([^)]{0,64}\)|var\(--dsw-[\w-]+(?:,\s*#[0-9a-fA-F]{3,8})?\))$/;function k(e){if(typeof e!=`string`)return;let t=e.trim();return t.length<=64&&ce.test(t)?t:void 0}function le(e){if(typeof e!=`string`)return;let t=e.trim();if(!(t.length>2048))return/^https?:\/\//i.test(t)||/^mailto:[^@\s]+@[^@\s]+$/i.test(t)?t:void 0}function A(e,t,n){return typeof e==`number`&&Number.isFinite(e)?Math.min(n,Math.max(t,e)):void 0}function j(e,t,n){return typeof e==`number`&&Number.isFinite(e)?Math.min(n,Math.max(t,Math.trunc(e))):void 0}function M(e,t){return se(e,t)?e:void 0}function N(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function P(e,t){return t===void 0?{}:{[e]:t}}let ue=[`h1`,`h2`,`h3`,`body`,`muted`,`caption`],de=[`primary`,`danger`,`success`,`ghost`],fe=[`success`,`warn`,`danger`,`accent`],pe=[`text`,`email`,`password`],me=[`info`,`success`,`warning`,`error`],he=[`bars`,`line`,`donut`],ge=[`line`,`area`,`scatter`],_e=[`box`,`sphere`,`cone`,`cylinder`,`torus`],ve=[`file`,`dir`];function F(e,t,n){if(!Array.isArray(e))return[];let r=[];for(let i of e){if(t.remaining<=0)break;--t.remaining;let e=ye(i,t,n);e!==null&&r.push(e)}return r}function ye(e,t,n){if(n>D.maxDepth)return null;let r=N(e);if(r===void 0)return null;let i=r.type;if(typeof i!=`string`)return null;switch(i){case`text`:{let e=O(r.content,D.maxString);return e===void 0?null:{type:`text`,content:e,...P(`size`,M(r.size,ue)),...P(`center`,r.center===!0||void 0)}}case`row`:return{type:`row`,items:F(r.items,t,n+1),...P(`wrap`,r.wrap===!0||void 0),...P(`spacer`,r.spacer===!0||void 0)};case`col`:return{type:`col`,items:F(r.items,t,n+1),...P(`gap`,A(r.gap,0,96))};case`grid`:return{type:`grid`,cols:j(r.cols,1,D.maxGridCols)??1,items:F(r.items,t,n+1)};case`card`:return{type:`card`,items:F(r.items,t,n+1),...P(`title`,O(r.title,D.maxString))};case`button`:{let e=O(r.label,D.maxString);return e===void 0?null:{type:`button`,label:e,...P(`tone`,M(r.tone,de)),...P(`full`,r.full===!0||void 0),...P(`small`,r.small===!0||void 0),...P(`icon`,O(r.icon,64)),...P(`action`,O(r.action,200))}}case`input`:return{type:`input`,...P(`label`,O(r.label,D.maxString)),...P(`placeholder`,O(r.placeholder,D.maxString)),...P(`value`,O(r.value,D.maxString)),...P(`inputType`,M(r.inputType,pe)),...P(`action`,O(r.action,200)),...P(`id`,O(r.id,200))};case`select`:{let e=I(r.options,D.maxOptions,D.maxString);return e===void 0?null:{type:`select`,options:e,...P(`label`,O(r.label,D.maxString)),...P(`action`,O(r.action,200)),...P(`selected`,j(r.selected,0,e.length-1)),...P(`id`,O(r.id,200))}}case`checkbox`:{let e=O(r.label,D.maxString);return e===void 0?null:{type:`checkbox`,label:e,...P(`checked`,r.checked===!0||void 0),...P(`action`,O(r.action,200))}}case`link`:{let e=O(r.label,D.maxString);return e===void 0?null:{type:`link`,label:e,...P(`href`,le(r.href))}}case`badge`:{let e=O(r.label,D.maxString);return e===void 0?null:{type:`badge`,label:e,...P(`tone`,M(r.tone,fe)),...P(`icon`,O(r.icon,64))}}case`stat`:{let e=O(r.label,D.maxString),t=O(r.value,128);return e===void 0||t===void 0?null:{type:`stat`,label:e,value:t,...P(`delta`,O(r.delta,64))}}case`progress`:{let e=A(r.value,0,100);return e===void 0?null:{type:`progress`,value:e,...P(`label`,O(r.label,D.maxString)),...P(`valueLabel`,O(r.valueLabel,64))}}case`divider`:return{type:`divider`};case`spacer`:return{type:`spacer`};case`avatar`:{let e=O(r.name,64);return e===void 0?null:{type:`avatar`,name:e,...P(`color`,k(r.color))}}case`list`:{let e=be(r.items,D.maxListItems);return e===void 0?null:{type:`list`,items:e}}case`table`:{let e=I(r.columns,D.maxTableCols,128),t=xe(r.rows,D.maxTableRows,D.maxTableCols);return e===void 0||t===void 0?null:{type:`table`,columns:e,rows:t}}case`chart`:{let e=Se(r.data,D.maxChartPoints),t=Array.isArray(r.series)?Ce(r.series,D.maxPlotSeries,D.maxChartPoints):void 0;return e===void 0&&t===void 0?null:{type:`chart`,data:e??[],...P(`kind`,M(r.kind,he)),...P(`series`,t)}}case`tabs`:{let e=we(r.tabs,t,n);return e===void 0?null:{type:`tabs`,tabs:e}}case`plot`:{let e=Te(r.series,D.maxPlotSeries);return e===void 0?null:{type:`plot`,series:e,...P(`xMin`,A(r.xMin,-1e6,1e6)),...P(`xMax`,A(r.xMax,-1e6,1e6)),...P(`yMin`,A(r.yMin,-1e9,1e9)),...P(`yMax`,A(r.yMax,-1e9,1e9)),...P(`title`,O(r.title,D.maxString))}}case`callout`:{let e=O(r.content,D.maxString);return e===void 0?null:{type:`callout`,content:e,...P(`tone`,M(r.tone,me)),...P(`title`,O(r.title,D.maxString))}}case`steps`:{let e=Ee(r.steps);return e===void 0?null:{type:`steps`,steps:e,...P(`current`,j(r.current,0,e.length))}}case`keyvalue`:{let e=De(r.pairs,D.maxKeyValuePairs);return e===void 0?null:{type:`keyvalue`,pairs:e}}case`diff`:{let e=Oe(r.diffs);return e===void 0?null:{type:`diff`,diffs:e}}case`json`:return`value`in r?{type:`json`,value:r.value}:null;case`code`:{let e=O(r.code,D.maxCode);return e===void 0?null:{type:`code`,code:e,...P(`lang`,O(r.lang,64))}}case`radio`:{let e=I(r.options,D.maxOptions,D.maxString);return e===void 0?null:{type:`radio`,options:e,...P(`label`,O(r.label,D.maxString)),...P(`selected`,j(r.selected,0,e.length-1)),...P(`action`,O(r.action,200)),...P(`group`,O(r.group,200)),...P(`answer`,typeof r.answer==`number`&&Number.isFinite(r.answer)&&r.answer>=0&&r.answer=t)break;typeof i==`string`&&r.push(i.slice(0,n))}return r}function be(e,t){if(!Array.isArray(e))return;let n=[];for(let r of e){if(n.length>=t)break;if(typeof r==`string`){n.push(r.slice(0,D.maxString));continue}let e=N(r),i=e===void 0?void 0:O(e.title,D.maxString);i!==void 0&&n.push({title:i,...P(`desc`,e===void 0?void 0:O(e.desc,D.maxString))})}return n}function xe(e,t,n){if(!Array.isArray(e))return;let r=[];for(let i of e){if(r.length>=t)break;if(!Array.isArray(i))continue;let e=[];for(let t of i){if(e.length>=n)break;typeof t==`string`?e.push(t.slice(0,256)):typeof t==`number`&&Number.isFinite(t)&&e.push(t)}e.length>0&&r.push(e)}return r}function Se(e,t){if(!Array.isArray(e))return;let n=[];for(let r of e){if(n.length>=t)break;let e=N(r),i=e===void 0?void 0:O(e.label,128),a=e===void 0?void 0:A(e.value,-0xe8d4a51000,0xe8d4a51000);i!==void 0&&a!==void 0&&n.push({label:i,value:a,...P(`color`,e===void 0?void 0:k(e.color))})}return n}function Ce(e,t,n){if(!Array.isArray(e))return;let r=[];for(let i of e){if(r.length>=t)break;let e=N(i),a=e===void 0?void 0:O(e.label,128),o=e===void 0?void 0:Se(e.data,n);a!==void 0&&o!==void 0&&r.push({label:a,data:o,...P(`color`,e===void 0?void 0:k(e.color))})}return r}function we(e,t,n){if(!Array.isArray(e))return;let r=[];for(let i of e){if(r.length>=D.maxTabs)break;let e=N(i),a=e===void 0?void 0:O(e.label,128);a!==void 0&&e!==void 0&&r.push({label:a,items:F(e.items,t,n+1)})}return r}function Te(e,t){if(!Array.isArray(e))return;let n=[];for(let r of e){if(n.length>=t)break;let e=N(r),i=e===void 0?void 0:O(e.expr,512);if(i===void 0||e===void 0)continue;let a=[];if(Array.isArray(e.params))for(let t of e.params){if(a.length>=D.maxPlotParams)break;let e=N(t),n=e===void 0?void 0:O(e.name,64),r=e===void 0?void 0:A(e.value,-1e9,1e9);n!==void 0&&r!==void 0&&a.push({name:n,value:r,...P(`min`,e===void 0?void 0:A(e.min,-1e9,1e9)),...P(`max`,e===void 0?void 0:A(e.max,-1e9,1e9)),...P(`step`,e===void 0?void 0:A(e.step,1e-9,1e9)),...P(`animateTo`,e===void 0?void 0:A(e.animateTo,-1e9,1e9)),...P(`durationMs`,e===void 0?void 0:A(e.durationMs,1,12e4)),...P(`loop`,e===void 0?void 0:e.loop===!0||void 0)})}n.push({expr:i,...P(`label`,O(e.label,128)),...P(`color`,k(e.color)),...P(`kind`,M(e.kind,ge)),...P(`params`,a.length>0?a:void 0)})}return n}function Ee(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(t.length>=D.maxSteps)break;let e=N(n),r=e===void 0?void 0:O(e.title,256);r!==void 0&&t.push({title:r,...P(`desc`,e===void 0?void 0:O(e.desc,D.maxString))})}return t}function De(e,t){if(!Array.isArray(e))return;let n=[];for(let r of e){if(n.length>=t)break;let e=N(r),i=e===void 0?void 0:O(e.key,256),a=e===void 0?void 0:O(e.value,D.maxString);i!==void 0&&a!==void 0&&n.push({key:i,value:a})}return n}function Oe(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(t.length>=24)break;let e=N(n),r=e===void 0?void 0:O(e.path,1024),i=e===void 0?void 0:O(e.newText,2e4);if(r===void 0||i===void 0)continue;let a=e===void 0?void 0:e.oldText;t.push({path:r,newText:i,oldText:a===null||typeof a!=`string`?null:a.slice(0,2e4)})}return t}function ke(e,t,n){if(!Array.isArray(e))return;let r=[];for(let i of e){if(r.length>=D.maxAccordionItems)break;let e=N(i),a=e===void 0?void 0:O(e.title,256);a!==void 0&&e!==void 0&&r.push({title:a,items:F(e.items,t,n+1)})}return r}function Ae(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(t.length>=D.maxMeshes)break;let e=N(n),r=e===void 0?void 0:M(e.shape,_e);if(r===void 0)continue;let i=e===void 0?void 0:A(e.scale,-1e6,1e6)??L(e.scale),a=e===void 0?void 0:A(e.size,-1e6,1e6)??L(e.size);t.push({shape:r,...P(`color`,e===void 0?void 0:k(e.color)),...P(`position`,e===void 0?void 0:L(e.position)),...P(`rotation`,e===void 0?void 0:L(e.rotation)),...P(`scale`,i),...P(`size`,a)})}return t}function L(e){if(!Array.isArray(e)||e.length!==3)return;let[t,n,r]=e;if(!(typeof t!=`number`||!Number.isFinite(t)||typeof n!=`number`||!Number.isFinite(n)||typeof r!=`number`||!Number.isFinite(r)))return[Math.min(1e6,Math.max(-1e6,t)),Math.min(1e6,Math.max(-1e6,n)),Math.min(1e6,Math.max(-1e6,r))]}function je(e,t){if(!Array.isArray(e))return;let n=[];for(let r of e){if(n.length>=t)break;let e=N(r),i=e===void 0?void 0:O(e.title,256);i!==void 0&&n.push({title:i,...P(`desc`,e===void 0?void 0:O(e.desc,D.maxString)),...P(`time`,e===void 0?void 0:O(e.time,128))})}return n}function Me(e,t){return Ne(e,t,D.maxTreeDepth)}function Ne(e,t,n){if(!Array.isArray(e))return;let r=[];for(let i of e){if(r.length>=t)break;let e=N(i),a=e===void 0?void 0:O(e.name,256);if(a===void 0)continue;let o=e!==void 0&&n>0&&Array.isArray(e.children)?Ne(e.children,t,n-1):void 0;r.push({name:a,...P(`type`,e===void 0?void 0:M(e.type,ve)),...P(`children`,o)})}return r}function Pe(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(t.length>=D.maxQuizOptions)break;let e=N(n),r=e===void 0?void 0:O(e.label,512);r!==void 0&&t.push({label:r,...P(`correct`,e===void 0?void 0:e.correct===!0||void 0),...P(`feedback`,e===void 0?void 0:O(e.feedback,D.maxString))})}return t}function R(e){let t=N(e);if(t===void 0||!Array.isArray(t.items))return null;let n={remaining:D.maxNodes};return{...P(`title`,O(t.title,D.maxString)),...P(`gap`,A(t.gap,0,96)),...P(`panel`,t.panel===!0||void 0),...P(`append`,t.append===!0||void 0),items:F(t.items,n,0)}}function Fe(e,t=1/0){let n=0,r=e=>{if(Array.isArray(e))for(let i of e){if(n>=t)return;n+=1;let e=N(i);if(e!==void 0){if(e.type===`tabs`&&Array.isArray(e.tabs))for(let i of e.tabs){if(n>=t)return;let e=N(i);e!==void 0&&r(e.items)}else if(e.type===`accordion`&&Array.isArray(e.items))for(let i of e.items){if(n>=t)return;let e=N(i);e!==void 0&&r(e.items)}else e.type===`file-tree`&&Array.isArray(e.items)&&r(e.items)}}},i=N(e);return r(i===void 0?[]:i.items),n}let Ie=[`var(--dsw-static-deepseek-400)`,`var(--dsw-static-deepseek-450)`,`var(--dsw-static-blue-450)`,`var(--dsw-static-green-400)`,`var(--dsw-static-amber-400)`,`var(--dsw-static-red-400)`,`var(--dsw-static-deepseek-300)`,`var(--dsw-static-neutral-bluish-400)`];function Le(e){let t=0;for(let n=0;n>>0;return Ie[t%Ie.length]}function Re({className:e,disabled:t,onClick:n,children:r}){let[i,a]=(0,m.useState)(!1),o=(0,m.useRef)(null);return(0,m.useEffect)(()=>()=>{o.current!==null&&clearTimeout(o.current)},[]),(0,h.jsxs)(`button`,{type:`button`,className:e,disabled:t,onClick:n===void 0?void 0:()=>{n(),o.current!==null&&clearTimeout(o.current),a(!0),o.current=setTimeout(()=>a(!1),1400)},children:[r,i&&(0,h.jsx)(`span`,{className:S.btnSent,children:`✓ 已触发`})]})}let ze=[`var(--dsw-static-deepseek-400)`,`var(--dsw-static-green-400)`,`var(--dsw-static-amber-400)`,`var(--dsw-static-red-400)`,`var(--dsw-static-blue-450)`,`var(--dsw-static-deepseek-450)`,`var(--dsw-static-neutral-bluish-400)`,`var(--dsw-static-deepseek-300)`],z=(e,t,n)=>n??(t>1?ze[e%ze.length]:void 0);function Be({node:e}){let t=e.columns.slice(0,D.maxTableCols),n=e.rows.slice(0,D.maxTableRows),[r,i]=(0,m.useState)(null),a=r===null?n:[...n].sort((e,t)=>{let n=e[r.col],i=t[r.col],a=typeof n==`number`?n:n===``?NaN:Number(n),o=typeof i==`number`?i:i===``?NaN:Number(i);if(Number.isFinite(a)&&Number.isFinite(o)&&a!==o)return(a-o)*r.dir;let s=String(n??``),c=String(i??``);return(sc))*r.dir}),o=e=>{i(t=>t!==null&&t.col===e?t.dir===1?{col:e,dir:-1}:null:{col:e,dir:1})};return(0,h.jsx)(`div`,{className:S.tableWrap,children:(0,h.jsxs)(`table`,{className:S.table,children:[(0,h.jsx)(`thead`,{children:(0,h.jsx)(`tr`,{children:t.map((e,t)=>(0,h.jsx)(`th`,{"aria-sort":r!==null&&r.col===t?r.dir===1?`ascending`:`descending`:`none`,children:(0,h.jsxs)(`button`,{type:`button`,className:S.thSort,onClick:()=>o(t),children:[e,r!==null&&r.col===t&&(0,h.jsx)(`span`,{className:S.thSortMark,"aria-hidden":!0,children:r.dir===1?` ▲`:` ▼`})]})},t))})}),(0,h.jsx)(`tbody`,{children:a.map((e,n)=>(0,h.jsx)(`tr`,{children:e.slice(0,t.length).map((e,t)=>(0,h.jsx)(`td`,{children:String(e)},t))},n))})]})})}function Ve({chart:e}){let t=e.kind??`bars`;return t===`donut`?(0,h.jsx)(We,{chart:e}):t===`line`?(0,h.jsx)(Ue,{chart:e}):(0,h.jsx)(He,{chart:e})}function He({chart:e}){let t=e.series===void 0?void 0:e.series.slice(0,D.maxPlotSeries);if(t!==void 0&&t.length>0){let e=t[0].data.map(e=>e.label),n=Math.max(...t.flatMap(e=>e.data.map(e=>Number(e.value)||0)),1);return(0,h.jsxs)(`div`,{className:S.chart,children:[(0,h.jsxs)(`div`,{className:S.chartPlot,children:[[0,25,50,75].map(e=>(0,h.jsx)(`span`,{className:e===0?S.baseline:S.gridline,style:{bottom:`${e}%`}},e)),e.map((e,r)=>(0,h.jsx)(`div`,{className:S.barCol,children:(0,h.jsx)(`div`,{className:S.groupedBars,children:t.map((e,i)=>{let a=e.data[r],o=a===void 0?0:Number(a.value)||0,s=a===void 0?0:Math.min(Math.round(Math.max(0,o)/n*100),82);return(0,h.jsxs)(`div`,{className:S.groupedBar,title:a===void 0?e.label:`${e.label}: ${String(a.value)}`,children:[(0,h.jsx)(`span`,{className:S.groupValue,children:a===void 0?``:String(a.value)}),(0,h.jsx)(`div`,{className:S.groupedFill,style:{height:`${s}%`,background:z(i,t.length,e.color)??`var(--dsw-alias-state-business-primary, #4f8ef7)`}})]},i)})})},r))]}),(0,h.jsx)(`div`,{className:S.chartLabels,children:e.map(e=>(0,h.jsx)(`span`,{className:S.barLabel,children:e},e))})]})}let n=e.data.slice(0,D.maxChartPoints),r=Math.max(...n.map(e=>Number(e.value)||0),1);return(0,h.jsxs)(`div`,{className:S.chart,children:[(0,h.jsxs)(`div`,{className:S.chartPlot,children:[[0,25,50,75].map(e=>(0,h.jsx)(`span`,{className:e===0?S.baseline:S.gridline,style:{bottom:`${e}%`}},e)),n.map((e,t)=>{let n=Number(e.value)||0,i=Math.min(Math.round(Math.max(0,n)/r*100),85);return(0,h.jsxs)(`div`,{className:S.barCol,title:`${e.label}: ${String(e.value)}`,children:[(0,h.jsx)(`span`,{className:S.barValue,children:String(e.value)}),(0,h.jsx)(`div`,{className:S.barFill,style:{height:`${i}%`,...e.color===void 0?{}:{background:e.color}}})]},t)})]}),(0,h.jsx)(`div`,{className:S.chartLabels,children:n.map(e=>(0,h.jsx)(`span`,{className:S.barLabel,children:e.label},e.label))})]})}function Ue({chart:e}){let t=e.data.slice(0,D.maxChartPoints),n=Math.max(...t.map(e=>Number(e.value)||0),1),r=Math.min(...t.map(e=>Number(e.value)||0),0),i=n-r||1,a=Math.max(t.length-1,1),o=(e,t)=>[36+e/a*416,10+(1-(t-r)/i)*134],s=t.map((e,t)=>o(t,Number(e.value)||0)).map((e,t)=>`${t===0?`M`:`L`} ${e[0].toFixed(1)} ${e[1].toFixed(1)}`).join(` `),c=[0,1,2,3].map(e=>r+i*e/3),l=e=>{let t=Math.abs(e);return t>=1e3?`${(e/1e3).toFixed(t%1e3==0?0:1)}k`:Number.isInteger(e)?String(e):e.toFixed(1)};return(0,h.jsxs)(`div`,{className:S.lineChart,children:[(0,h.jsxs)(`svg`,{width:`100%`,viewBox:`0 0 460 150`,children:[c.map((e,t)=>{let n=10+(1-(e-r)/i)*134;return(0,h.jsxs)(`g`,{children:[(0,h.jsx)(`line`,{x1:36,x2:452,y1:n,y2:n,className:t===0?S.lineGridAxis:S.lineGrid}),(0,h.jsx)(`text`,{x:30,y:n+3,textAnchor:`end`,className:S.lineTick,children:l(e)})]},t)}),t.map((e,t)=>{let[n,r]=o(t,Number(e.value)||0);return(0,h.jsx)(`circle`,{cx:n,cy:r,r:3,className:S.lineDot,fill:e.color??void 0,children:(0,h.jsx)(`title`,{children:`${e.label}: ${String(e.value)}`})},t)}),(0,h.jsx)(`path`,{d:s,className:S.linePath})]}),(0,h.jsx)(`div`,{className:S.lineLabels,children:t.map((e,t)=>(0,h.jsx)(`span`,{className:S.barLabel,children:e.label},t))})]})}function We({chart:e}){let t=e.data.slice(0,D.maxChartPoints),n=t.map(e=>({...e,v:Math.max(0,Number(e.value)||0)})),r=n.reduce((e,t)=>e+t.v,0)||1,i=2*Math.PI*42,a=0;return(0,h.jsxs)(`div`,{className:S.donut,children:[(0,h.jsxs)(`svg`,{width:`120`,height:`120`,viewBox:`0 0 120 120`,children:[(0,h.jsx)(`circle`,{cx:`60`,cy:`60`,r:42,fill:`none`,strokeWidth:`14`,className:S.donutTrack}),n.map((e,n)=>{let o=e.v/r*i,s=(0,h.jsx)(`circle`,{cx:`60`,cy:`60`,r:42,fill:`none`,strokeWidth:`14`,style:{stroke:z(n,t.length,e.color)??`var(--dsw-alias-state-business-primary, #4f8ef7)`},strokeDasharray:`${o} ${i-o}`,strokeDashoffset:-a,transform:`rotate(-90 60 60)`,children:(0,h.jsx)(`title`,{children:`${e.label}: ${String(e.value)}`})},n);return a+=o,s}),(0,h.jsx)(`text`,{x:`60`,y:`58`,textAnchor:`middle`,className:S.donutTotal,children:r>=1e3?`${Math.round(r/100)/10}k`:String(r)}),(0,h.jsx)(`text`,{x:`60`,y:`74`,textAnchor:`middle`,className:S.donutTotalLabel,children:`合计`})]}),(0,h.jsx)(`div`,{className:S.donutLegend,children:t.map((e,n)=>(0,h.jsxs)(`span`,{className:S.legendItem,children:[(0,h.jsx)(`span`,{className:S.legendSwatch,style:{background:z(n,t.length,e.color)??`var(--dsw-alias-state-business-primary, #4f8ef7)`}}),e.label,` · `,String(e.value)]},n))})]})}function Ge({node:e,onAction:t,answers:n}){let r=e.action,i=e.group,a=i!==void 0,o=e.options.slice(0,D.maxOptions),s=i!==void 0&&n?.answers[i]!==void 0?o.indexOf(n.answers[i]):-1,[c,l]=(0,m.useState)(s>=0?s:e.selected??null),u=(0,m.useId)(),d=a&&n?.locked===!0;return(0,m.useEffect)(()=>{i!==void 0&&(n?.registerMeta(i,{label:e.label??i,options:o,answer:e.answer,explanation:e.explanation}),e.selected!==void 0&&o[e.selected]!==void 0&&n?.answers[i]===void 0&&n?.setAnswer(i,o[e.selected]))},[i,e.label,e.answer,e.explanation,e.options,e.selected]),(0,h.jsxs)(`div`,{className:S.fieldGroup,role:`radiogroup`,"aria-label":e.label,children:[e.label!==void 0&&(0,h.jsx)(`span`,{className:S.fieldLabel,children:e.label}),o.map((e,o)=>(0,h.jsxs)(`label`,{className:S.radio,children:[(0,h.jsx)(`input`,{type:`radio`,name:`genui-radio-${u}`,checked:c===o,disabled:d,onChange:()=>{l(o),a?n?.setAnswer(i,e):r!==void 0&&t!==void 0&&t(r,{type:`radio`,value:e})}}),(0,h.jsx)(`span`,{children:e})]},o))]})}function Ke(e){if(e.answer!==void 0)return typeof e.answer==`number`?e.options[e.answer]:e.answer}function qe({node:e,onAction:t,answers:n}){let r=n?.answers??{},i=n?.fields??{},a=n?.meta??{},o=e.groups,s=Object.fromEntries(Object.entries(i).filter(([e,t])=>t.trim()!==``&&!n?.secretFields.has(e))),c=o===void 0?Math.max(Object.keys(r).length,Object.keys(s).length):o.filter(e=>r[e]!==void 0).length,l=o?.length??c,u=o??Object.keys(r),d=u.some(e=>a[e]?.answer!==void 0),f=n?.locked===!0,p=c>0&&c>=l&&(d||e.action!==void 0&&t!==void 0);if(f){let i=u.filter(e=>r[e]!==void 0&&a[e]?.answer!==void 0),s=i.filter(e=>r[e]===Ke(a[e])).length;return(0,h.jsxs)(`div`,{className:S.gradeWrap,"data-genui-grade":!0,children:[(0,h.jsxs)(`div`,{className:S.gradeScore,children:[(0,h.jsxs)(`span`,{className:S.gradeScoreValue,children:[s,` / `,i.length]}),(0,h.jsxs)(`span`,{className:S.gradeScoreLabel,children:[`得分`,i.length{let t=r[e],n=a[e];if(t===void 0||n===void 0)return null;let i=Ke(n);if(i===void 0)return(0,h.jsxs)(`div`,{className:S.gradeItem,children:[(0,h.jsx)(`span`,{className:S.gradeQ,children:n.label}),(0,h.jsxs)(`span`,{className:S.gradeAns,children:[`你的答案:`,t]})]},e);let o=t===i;return(0,h.jsxs)(`div`,{className:`${S.gradeItem} ${o?S.gradeItemOk:S.gradeItemNo}`,children:[(0,h.jsx)(`span`,{className:S.gradeQ,children:n.label}),(0,h.jsx)(`span`,{className:S.gradeTag,children:o?`✓`:`✗`}),(0,h.jsxs)(`span`,{className:S.gradeAns,children:[`你的答案:`,t,!o&&(0,h.jsxs)(`span`,{className:S.gradeRight,children:[` 正确答案:`,i]})]}),n.explanation!==void 0&&(0,h.jsx)(`span`,{className:S.gradeExp,children:n.explanation})]},e)})}),(0,h.jsx)(`button`,{type:`button`,className:`${S.button} ${S.ghost} ${S.submit}`,onClick:()=>{n?.clear(),e.resetAction!==void 0&&t!==void 0&&t(e.resetAction,{type:`submit-reset`,groups:o??Object.keys(r)})},children:`重新作答`})]})}return(0,h.jsxs)(`div`,{className:S.submitRow,children:[(0,h.jsx)(`button`,{type:`button`,className:`${S.button} ${S.primary} ${S.submit}`,disabled:!p,onClick:p?()=>{d?n?.setLocked(!0):e.action!==void 0&&t!==void 0&&t(e.action,{type:`submit`,answers:r,...Object.keys(s).length>0?{fields:s}:{},total:l,answered:c})}:void 0,children:e.label}),l>0&&(0,h.jsxs)(`span`,{className:S.submitHint,"aria-live":`polite`,children:[`已选 `,c,`/`,l]})]})}function Je({node:e,onAction:t}){let[n,r]=(0,m.useState)(e.checked===!0),i=e.action;return(0,h.jsxs)(`label`,{className:S.switchRow,children:[(0,h.jsx)(`span`,{className:S.switchLabel,children:e.label}),(0,h.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":n,className:`${S.switch} ${n?S.switchOn:``}`,onClick:()=>{let e=!n;r(e),i!==void 0&&t!==void 0&&t(i,{type:`switch`,checked:e})},children:(0,h.jsx)(`span`,{className:S.switchKnob})})]})}function Ye({node:e,onAction:t,answers:n}){let r=e.action,i=e.id,a=i!==void 0&&n?.fields[i]!==void 0?Number(n.fields[i]):NaN,o=Number.isFinite(a)?a:e.value??e.min??0,[s,c]=(0,m.useState)(o),l=(0,m.useRef)(!1);(0,m.useEffect)(()=>{l.current||(l.current=!0,i!==void 0&&n?.setField(i,String(o)))},[]);let u=e=>{r!==void 0&&t!==void 0&&t(r,{type:`slider`,value:e,...i===void 0?{}:{id:i}})};return(0,h.jsxs)(`label`,{className:S.sliderRow,children:[e.label!==void 0&&(0,h.jsx)(`span`,{className:S.fieldLabel,children:e.label}),(0,h.jsx)(`input`,{type:`range`,className:S.sliderInput,min:e.min,max:e.max,step:e.step??1,value:s,"aria-label":e.label,onChange:e=>{let t=Number(e.currentTarget.value);c(t),i!==void 0&&n?.setField(i,String(t)),u(t)}}),(0,h.jsx)(`span`,{className:S.sliderValue,children:Math.round(s*100)/100})]})}function Xe(){let e=(0,m.useRef)(!1),t=(0,m.useRef)(null);return(0,m.useEffect)(()=>()=>{t.current!==null&&clearTimeout(t.current)},[]),{isComposing:()=>e.current,onCompositionStart:()=>{e.current=!0,t.current!==null&&(clearTimeout(t.current),t.current=null)},onCompositionEnd:()=>{t.current!==null&&clearTimeout(t.current),t.current=setTimeout(()=>{e.current=!1},10)}}}function Ze(e){let t=e.nativeEvent;return t.isComposing===!0||t.keyCode===229}function Qe({node:e,onAction:t,answers:n}){let r=e.action,i=e.id,a=e.options.slice(0,D.maxOptions),o=i!==void 0&&n?.fields[i]!==void 0?a.indexOf(n.fields[i]):-1,s=o>=0?a[o]:e.selected!==void 0&&a[e.selected]!==void 0?a[e.selected]:null,[c,l]=(0,m.useState)(s),u=(0,m.useRef)(!1);(0,m.useEffect)(()=>{u.current||(u.current=!0,i!==void 0&&s!==null&&n?.setField(i,s))},[]);let d=e=>{r!==void 0&&t!==void 0&&t(r,{type:`select`,value:e,...i===void 0?{}:{id:i}})};return(0,h.jsxs)(`label`,{className:S.field,children:[e.label!==void 0&&(0,h.jsx)(`span`,{children:e.label}),(0,h.jsxs)(`select`,{className:S.select,value:c??``,onChange:e=>{let t=e.currentTarget.value;l(t),i!==void 0&&n?.setField(i,t),d(t)},children:[c===null&&(0,h.jsx)(`option`,{value:``,hidden:!0,disabled:!0,children:`请选择…`}),a.map((e,t)=>(0,h.jsx)(`option`,{value:e,children:e},t))]})]})}function $e({node:e,onAction:t,answers:n}){let r=e.action,i=e.id,a=e.inputType===`password`,[o,s]=(0,m.useState)(()=>a?``:e.value??(i===void 0?``:n?.fields[i]??``)),c=(0,m.useRef)(o),l=e=>{r!==void 0&&t!==void 0&&(c.current=o,t(r,{type:`input`,value:o,...i===void 0?{}:{id:i},...e?{submit:!0}:{}}))},u=Xe(),d=(0,m.useRef)(!1);return(0,m.useEffect)(()=>{d.current||(d.current=!0,!a&&i!==void 0&&e.value!==void 0&&e.value.trim()!==``&&n?.setField(i,e.value))},[]),(0,m.useEffect)(()=>{a&&i!==void 0&&n?.registerSecretField(i)},[a,i]),(0,h.jsxs)(`label`,{className:S.field,children:[e.label!==void 0&&(0,h.jsx)(`span`,{children:e.label}),(0,h.jsx)(`input`,{className:S.input,type:e.inputType??`text`,placeholder:e.placeholder,value:o,onChange:e=>{let t=e.currentTarget.value;s(t),i!==void 0&&n?.setField(i,t)},onBlur:()=>{o!==c.current&&l(!1)},onCompositionStart:u.onCompositionStart,onCompositionEnd:u.onCompositionEnd,onKeyDown:e=>{e.key===`Enter`&&(u.isComposing()||Ze(e)||(e.preventDefault(),l(!0)))}})]})}function et({node:e,onAction:t,answers:n}){let r=e.action,i=e.id,[a,o]=(0,m.useState)(()=>e.value??(i===void 0?``:n?.fields[i]??``)),s=(0,m.useRef)(a),c=e=>{r!==void 0&&t!==void 0&&(s.current=a,t(r,{type:`textarea`,value:a,...i===void 0?{}:{id:i},...e?{submit:!0}:{}}))},l=Xe(),u=(0,m.useRef)(!1);return(0,m.useEffect)(()=>{u.current||(u.current=!0,i!==void 0&&e.value!==void 0&&e.value.trim()!==``&&n?.setField(i,e.value))},[]),(0,h.jsxs)(`label`,{className:S.field,children:[e.label!==void 0&&(0,h.jsx)(`span`,{children:e.label}),(0,h.jsx)(`textarea`,{className:S.textarea,placeholder:e.placeholder,rows:e.rows??4,value:a,onChange:e=>{let t=e.currentTarget.value;o(t),i!==void 0&&n?.setField(i,t)},onBlur:()=>{a!==s.current&&c(!1)},onCompositionStart:l.onCompositionStart,onCompositionEnd:l.onCompositionEnd,onKeyDown:e=>{!(e.metaKey||e.ctrlKey)||e.key!==`Enter`||l.isComposing()||Ze(e)||(e.preventDefault(),c(!0))}})]})}let tt={pi:Math.PI,e:Math.E,tau:Math.PI*2},nt={sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,sqrt:Math.sqrt,cbrt:Math.cbrt,exp:Math.exp,log:Math.log10,ln:Math.log,abs:Math.abs,floor:Math.floor,ceil:Math.ceil,round:Math.round,min:Math.min,max:Math.max,pow:(e,t)=>e**+t};var B=class extends Error{pos;constructor(e,t){super(`SafeMath parse error at ${t}: ${e}`),this.pos=t}},rt=class{src;vars;i=0;constructor(e,t){this.src=e,this.vars=t}parse(){let e=this.parseExpr();if(this.skipWs(),this.ie:e}parseExpr(){let e=this.parseTerm();for(;;){this.skipWs();let t=this.peek();if(t===`+`||t===`-`){this.i++;let n=this.parseTerm(),r=t,i=e;e=r===`+`?e=>this.asNum(i,e)+this.asNum(n,e):e=>this.asNum(i,e)-this.asNum(n,e)}else return e}}parseTerm(){let e=this.parseUnary();for(;;){this.skipWs();let t=this.peek();if(t===`*`||t===`/`||t===`%`){this.i++;let n=this.parseUnary(),r=t,i=e;e=r===`*`?e=>this.asNum(i,e)*this.asNum(n,e):r===`/`?e=>this.asNum(i,e)/this.asNum(n,e):e=>this.asNum(i,e)%this.asNum(n,e)}else return e}}parseUnary(){this.skipWs();let e=this.char();if(e===`-`||e===`+`){this.i++;let t=this.parseUnary();return e===`-`?e=>-this.asNum(t,e):e=>this.asNum(t,e)}return this.parsePower()}parsePower(){let e=this.parseAtom();if(this.skipWs(),this.peek()===`^`){this.i++;let t=this.parsePower(),n=e;return e=>this.asNum(n,e)**+this.asNum(t,e)}return e}parseAtom(){this.skipWs();let e=this.char();if(e===`(`){this.i++;let e=this.parseExpr();if(this.skipWs(),this.peek()!==`)`)throw new B(`expected )`,this.i);return this.i++,e}if(e>=`0`&&e<=`9`||e===`.`)return this.parseNumber();if(this.isIdentStart(e))return this.parseIdent();throw new B(`unexpected character '${e}'`,this.i)}parseNumber(){let e=this.i;for(;this.in(...r.map(t=>this.asNum(t,e)))}if(Object.hasOwn(tt,t))return tt[t];if(t===`x`)return e=>e;if(Object.hasOwn(this.vars,t)){let e=this.vars[t];return()=>e}if(/^[a-z]$/.test(t))return()=>1;throw new B(`unknown identifier '${t}'`,e)}asNum(e,t){return typeof e==`number`?e:e(t)}skipWs(){for(;this.in??(t>1?st[e%st.length]:void 0);function lt(e){let t=1/0,n=-1/0;for(let[,r]of e)rn&&(n=r);if(!Number.isFinite(t)||!Number.isFinite(n))return[-1,1];t===n&&(--t,n+=1);let r=(n-t)*.08;return[t-r,n+r]}function ut(e,t,n=5){let r=t-e;if(!Number.isFinite(r)||r<=0)return[];let i=10**Math.floor(Math.log10(r/n)),a=r/n/i,o=i*(a>=7.5?10:a>=3.5?5:a>=1.5?2:1),s=[];for(let n=Math.ceil(e/o)*o;n<=t+o*1e-9;n+=o)s.push(Math.round(n*1e9)/1e9);return s}function dt(e){return Math.abs(e)>=1e5||Math.abs(e)<.001&&e!==0?e.toExponential(1):String(Math.round(e*100)/100)}function ft({points:e,className:t,color:n}){let r=e.length>40?`${e.slice(0,16)}|${e.slice(-16)}`:e;return(0,h.jsx)(`polyline`,{points:e,className:t,style:n===void 0?void 0:{stroke:n}},r)}let pt=(0,m.memo)(function({series:e,xMin:t=-5,xMax:n=5,yMin:r,yMax:i,title:a}){let[o,s]=(0,m.useState)(()=>{let a={};for(let[t,n]of e.entries())for(let e of n.params??[])e!=null&&(a[`${t}:${e.name}`]=e.value);let[o,s]=lt(e.map((e,r)=>{let i={};for(let t of e.params??[])t!=null&&(i[t.name]=a[`${r}:${t.name}`]??t.value);return at(e.expr,t,n,240,i)}).flatMap(e=>e));return{xMin:t,xMax:n,yMin:r??o,yMax:i??s}}),c=(0,m.useRef)(null),[l,u]=(0,m.useState)(()=>({})),d=(()=>{for(let[t,n]of e.entries())for(let e of n.params??[])if(e!=null&&e.animateTo!==void 0)return{si:t,param:e};return null})(),[f,p]=(0,m.useState)(!1),[ee,g]=(0,m.useState)(0),_=(0,m.useRef)(null);(0,m.useEffect)(()=>{if(!f||d===null)return;let e=l[`${d.si}:${d.param.name}`]??d.param.value,t=d.param.animateTo,n=d.param.durationMs??4e3,r=performance.now(),i=a=>{let o=Math.min(1,(a-r)/n),s=1-(1-o)**3,c=e+(t-e)*s;u(e=>({...e,[`${d.si}:${d.param.name}`]:c})),g(o),o<1?_.current=requestAnimationFrame(i):d.param.loop===!0?(u(e=>({...e,[`${d.si}:${d.param.name}`]:d.param.value})),g(0),_.current=requestAnimationFrame(()=>p(e=>e))):p(!1)};return _.current=requestAnimationFrame(i),()=>{_.current!==null&&cancelAnimationFrame(_.current)}},[f,d?.si,d?.param.name,d?.param.animateTo]);let v=o.xMin,y=o.xMax,b=o.yMin,x=o.yMax,S=e=>v+(e-34)/436*(y-v),C=e=>34+(e-v)/(y-v)*436,w=e=>14+(1-(e-b)/(x-b))*182,T=e.map((e,t)=>{let n={};for(let r of e.params??[])r!=null&&(n[r.name]=l[`${t}:${r.name}`]??r.value);return{series:e,points:at(e.expr,v,y,240,n).map(([e,t])=>`${C(e).toFixed(2)},${w(t).toFixed(2)}`).join(` `)}}),te=ut(v,y),ne=ut(b,x),re=T.some(e=>e.points.length>1),E=Number.isFinite(v)&&Number.isFinite(y)&&y>v&&Number.isFinite(x)&&Number.isFinite(b)&&x>b,ie=(e,t,n)=>{let r=ct(t,T.length,e.color)??`var(--dsw-alias-state-business-primary, #4f8ef7)`,i=e.kind??`line`;if(i===`scatter`){let e=n===``?[]:n.split(` `).map(e=>{let[t,n]=e.split(`,`);return[Number(t),Number(n)]});return(0,h.jsx)(`g`,{children:e.map(([e,t],n)=>(0,h.jsx)(`circle`,{cx:e,cy:t,r:2.6,className:V.scatterDot,style:{fill:r}},n))},t)}if(i===`area`){if(n===``)return(0,h.jsx)(ft,{points:``,className:V.line,color:r},t);let e=n.slice(0,n.indexOf(` `)).split(`,`)[0],i=n.slice(n.lastIndexOf(` `)+1).split(`,`)[0],a=w(b),o=`${e},${a.toFixed(2)} ${n} ${i},${a.toFixed(2)}`;return(0,h.jsx)(`polygon`,{points:o,className:V.area,style:{fill:r}},t)}return(0,h.jsx)(ft,{points:n,className:V.line,color:r},t)},ae=e=>{c.current={startX:e.clientX,startY:e.clientY,xMin:v,xMax:y},e.target.setPointerCapture?.(e.pointerId)},oe=e=>{let t=c.current;if(t===null)return;let n=t.xMax-t.xMin,r=(t.startX-e.clientX)/436*n;s(e=>({xMin:t.xMin+r,xMax:t.xMax+r,yMin:e.yMin,yMax:e.yMax}))},D=()=>{c.current=null},se=e=>{let t=y-v,n=t*(e.deltaY>0?1.15:1/1.15),r=e.currentTarget.getBoundingClientRect(),i=S((e.clientX-r.left)/r.width*480),a=i-(i-v)/t*n;s(e=>({xMin:a,xMax:a+n,yMin:e.yMin,yMax:e.yMax}))},O=e.some(e=>(e.params?.length??0)>0);return(0,h.jsxs)(`div`,{className:V.block,"data-genui-plot":!0,children:[a!==void 0&&(0,h.jsx)(`div`,{className:V.title,children:a}),re&&E?(0,h.jsxs)(`svg`,{width:`100%`,viewBox:`0 0 480 220`,role:`img`,"aria-label":a??`function plot`,className:V.surface,onPointerDown:ae,onPointerMove:oe,onPointerUp:D,onPointerLeave:D,onWheel:se,children:[ne.map(e=>(0,h.jsxs)(`g`,{children:[(0,h.jsx)(`line`,{x1:34,x2:470,y1:w(e),y2:w(e),className:V.gridLine}),(0,h.jsx)(`text`,{x:28,y:w(e)+4,className:V.tick,textAnchor:`end`,children:dt(e)})]},`y${e}`)),te.map(e=>(0,h.jsxs)(`g`,{children:[(0,h.jsx)(`line`,{x1:C(e),x2:C(e),y1:14,y2:196,className:V.gridLine}),(0,h.jsx)(`text`,{x:C(e),y:210,className:V.tick,textAnchor:`middle`,children:dt(e)})]},`x${e}`)),(0,h.jsx)(`line`,{x1:34,x2:470,y1:196,y2:196,className:V.axis}),(0,h.jsx)(`line`,{x1:34,x2:34,y1:14,y2:196,className:V.axis}),T.map(({series:e,points:t},n)=>ie(e,n,t))]}):(0,h.jsx)(`div`,{className:V.empty,children:e.map((e,t)=>(0,h.jsxs)(`div`,{className:V.emptyRow,children:[e.expr,` — 无法绘制(表达式无效或范围非法)`]},t))}),O&&(0,h.jsxs)(`div`,{className:V.sliders,children:[(0,h.jsxs)(`div`,{className:V.slidersHead,children:[(0,h.jsx)(`span`,{className:V.slidersTitle,children:`参数调节`}),(0,h.jsx)(`button`,{type:`button`,className:V.resetBtn,onClick:()=>{p(!1);let t={};for(let[n,r]of e.entries())for(let e of r.params??[])e!=null&&(t[`${n}:${e.name}`]=e.value);u(t),g(0)},children:`↺ 重置`})]}),e.map((e,t)=>(e.params??[]).map(n=>{if(n==null)return null;let r=`${t}:${n.name}`,i=l[r]??n.value;return(0,h.jsxs)(`label`,{className:V.sliderRow,children:[(0,h.jsxs)(`span`,{className:V.sliderName,children:[e.label??e.expr,` · `,n.name]}),(0,h.jsx)(`input`,{type:`range`,className:V.slider,min:n.min??0,max:n.max??10,step:n.step??.1,value:i,onChange:e=>{let t=Number(e.currentTarget.value);u(e=>({...e,[r]:t}))}}),(0,h.jsx)(`span`,{className:V.sliderValue,children:Math.round(i*100)/100})]},r)}))]}),d!==null&&(0,h.jsxs)(`div`,{className:V.animBar,children:[(0,h.jsx)(`button`,{type:`button`,className:V.playBtn,onClick:()=>{f?p(!1):(u(e=>({...e,[`${d.si}:${d.param.name}`]:d.param.value})),g(0),p(!0))},children:f?`⏸ 暂停`:`▶ 播放动画`}),f&&(0,h.jsx)(`div`,{className:V.animTrack,children:(0,h.jsx)(`div`,{className:V.animFill,style:{width:`${ee*100}%`}})})]}),(e.length>1||O)&&(0,h.jsx)(`div`,{className:V.legend,children:e.map((t,n)=>(0,h.jsxs)(`span`,{className:V.legendItem,children:[(0,h.jsx)(`span`,{className:V.legendSwatch,style:{background:ct(n,e.length,t.color)??`var(--dsw-alias-state-business-primary, #4f8ef7)`}}),t.label??t.expr]},n))})]})});function H(e){let t=window.__DSH_BOOT__?.entries?.find(e=>e.id===U)?.rev;return`${ht}/${e}${t===void 0?``:`?rev=${t}`}`}function mt(e){let t=`${e}.js`,n=gt.get(t);if(n!==void 0)return n;let r=new Promise((n,r)=>{let i=document.createElement(`script`);i.src=H(t),i.async=!0,i.onload=()=>{let i=(window.__GenuiAssets__??{})[e];if(i===void 0){r(Error(`genui asset '${t}' loaded but registered no '${e}' engine`));return}n(i)},i.onerror=()=>{r(Error(`genui asset '${t}' failed to load (host asset route missing?)`))},document.head.appendChild(i)});return gt.set(t,r),r}var U,ht,gt,_t=l((()=>{U=`@omdsh-dev/dsh-genui`,ht=`/plugins/${U}/assets`,gt=new Map}));function vt(e){if(bt.test(e))throw Error(`mermaid output failed the sanitization check; refusing to render`)}function yt(e){let t=/^([A-Za-z]+)/.exec(e.trim())?.[1]??``;if(t!==`graph`&&t!==`flowchart`)return e;let n=e.replace(/`/g,``).replace(//gi,` `),r=/(--|==|-\.)(?!>)[ \t]*([^-\n]|-(?!--))*?[ \t]*(-->|==>|\.->)/g,i=[],a=n.replace(r,e=>(i.push(e),`\uE000${i.length-1}\uE001`)),o=/\|([^|\n]*[\[\]][^|\n]*)\|/g,s=[];return a.replace(o,(e,t)=>{let n=t.trim();return n.includes(`"`)?e:(s.push(n),`\uE002${s.length-1}\uE003`)}).replace(/([\[\(])([^\[\]\(\)\{\}"'\n]*)([\]\)])/g,(e,t,n,r)=>{let i=n.trim();return i===``?e:/[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]/.test(i)||/\s/.test(i)?`${t}"${i}"${r}`:e}).replace(/\uE000(\d+)\uE001/g,(e,t)=>i[Number(t)]??e).replace(/\uE002(\d+)\uE003/g,(e,t)=>{let n=s[Number(t)];return n===void 0?e:`|"${n}"|`})}var bt,xt=l((()=>{bt=/vt,renderMermaid:()=>Ct,repairMermaidSource:()=>yt});async function Ct(e){return(await mt(`mermaid`)).renderMermaid(e)}var wt=l((()=>{_t(),xt()})),Tt=u({mountScene:()=>Et});async function Et(e,t){return(await mt(`three`)).mountScene(e,t)}var Dt=l((()=>{_t()}));let Ot={info:S.calloutInfo,success:S.calloutSuccess,warning:S.calloutWarning,error:S.calloutError};function kt({node:e}){let t=e.tone??`info`,n=Ot[t]??S.calloutInfo;return(0,h.jsxs)(`div`,{className:`${S.callout} ${n}`,"data-genui-callout":!0,children:[e.title!==void 0&&(0,h.jsx)(`div`,{className:S.calloutTitle,children:e.title}),(0,h.jsx)(`div`,{className:S.calloutBody,children:e.content})]})}function At({steps:e}){let t=e.steps.slice(0,D.maxSteps),n=e.current??t.length;return(0,h.jsx)(`ol`,{className:S.steps,children:t.map((e,t)=>{let r=t(0,h.jsxs)(`div`,{className:S.kvRow,children:[(0,h.jsx)(`dt`,{className:S.kvKey,children:e.key}),(0,h.jsx)(`dd`,{className:S.kvValue,children:e.value})]},t))})}function Mt({plot:e}){let t=e.series.slice(0,D.maxPlotSeries);return(0,h.jsx)(pt,{series:t.map(e=>({expr:e.expr,label:e.label,color:e.color,kind:e.kind,params:e.params})),xMin:e.xMin,xMax:e.xMax,yMin:e.yMin,yMax:e.yMax,title:e.title})}function Nt({node:e}){return(0,h.jsx)(p.DiffBlock,{diffs:e.diffs})}function Pt({node:e}){let t=e.value;return typeof t!=`object`||!t?(0,h.jsx)(`div`,{className:S.jsonScalar,children:String(t)}):(0,h.jsx)(p.JsonTree,{data:t,copyable:!0})}function Ft({node:e}){return(0,h.jsx)(p.CodeBlock,{code:e.code.slice(0,D.maxCode),lang:e.lang})}function It({tabs:e,onAction:t,depth:n=0,answers:r}){let[i,a]=(0,m.useState)(0),o=(0,m.useId)(),s=e.tabs.slice(0,D.maxTabs),c=s[i],l=e=>{let t=(e+s.length)%s.length;a(t),document.getElementById(`${o}-tab-${t}`)?.focus()};return(0,h.jsxs)(`div`,{className:S.tabs,children:[(0,h.jsx)(`div`,{className:S.tabBar,role:`tablist`,"aria-orientation":`horizontal`,onKeyDown:e=>{e.key===`ArrowRight`?(e.preventDefault(),l(i+1)):e.key===`ArrowLeft`?(e.preventDefault(),l(i-1)):e.key===`Home`?(e.preventDefault(),l(0)):e.key===`End`&&(e.preventDefault(),l(s.length-1))},children:s.map((e,t)=>(0,h.jsx)(`button`,{id:`${o}-tab-${t}`,type:`button`,role:`tab`,"aria-selected":t===i,"aria-controls":`${o}-panel-${t}`,tabIndex:t===i?0:-1,className:`${S.tab} ${t===i?S.tabActive:``}`,onClick:()=>a(t),children:e.label},t))}),c!==void 0&&(0,h.jsx)(`div`,{className:S.col,role:`tabpanel`,id:`${o}-panel-${i}`,"aria-labelledby":`${o}-tab-${i}`,children:c.items.map((e,i)=>W(e,i,t,n+1,r))})]})}function Lt({node:e,onAction:t,depth:n=0,answers:r}){let[i,a]=(0,m.useState)(0),o=(0,m.useId)(),s=e.items.slice(0,D.maxAccordionItems);return(0,h.jsx)(`div`,{className:S.accordion,children:s.map((e,s)=>(0,h.jsxs)(`div`,{className:S.accItem,children:[(0,h.jsxs)(`button`,{type:`button`,className:S.accHead,id:`${o}-head-${s}`,"aria-expanded":i===s,"aria-controls":`${o}-body-${s}`,onClick:()=>a(i===s?null:s),children:[(0,h.jsx)(`span`,{className:S.accTitle,children:e.title}),(0,h.jsx)(`span`,{className:S.accChevron,children:i===s?`▾`:`▸`})]}),i===s&&(0,h.jsx)(`div`,{className:S.accBody,id:`${o}-body-${s}`,"aria-labelledby":`${o}-head-${s}`,children:e.items.map((e,i)=>W(e,i,t,n+1,r))})]},s))})}function Rt({node:e}){let[t,n]=(0,m.useState)(!1);return(0,h.jsx)(`button`,{type:`button`,className:`${S.copyChip} ${t?S.copyChipDone:``}`,onClick:()=>{navigator.clipboard?.writeText(e.text).catch(()=>{}),n(!0),setTimeout(()=>n(!1),1500)},children:t?`✓ 已复制`:e.label??`复制`})}function zt({node:e}){let[t,n]=(0,m.useState)(null),[r,i]=(0,m.useState)(!1),a=e.code.slice(0,D.maxMermaid);return(0,m.useEffect)(()=>{let e=!0;return Promise.resolve().then(()=>(wt(),St)).then(async t=>{try{let r=await t.renderMermaid(a);e&&n(r)}catch{e&&i(!0)}}),()=>{e=!1}},[a]),r?(0,h.jsxs)(`div`,{className:S.mermaidFallback,children:[(0,h.jsx)(`pre`,{children:a}),(0,h.jsx)(`div`,{className:S.mermaidErr,children:`图语法有误,已降级显示源码`})]}):t===null?(0,h.jsxs)(`div`,{className:S.mermaidFallback,children:[(0,h.jsx)(`pre`,{children:a}),(0,h.jsx)(`div`,{className:S.mermaidHint,children:`渲染中…`})]}):(0,h.jsx)(`div`,{className:S.mermaid,dangerouslySetInnerHTML:{__html:t},"data-genui-mermaid":!0})}function Bt({node:e}){let[t,n]=(0,m.useState)(`loading`),r=(0,m.useRef)(null),i=e.meshes.length>D.maxMeshes?{...e,meshes:e.meshes.slice(0,D.maxMeshes)}:e;return(0,m.useEffect)(()=>{let e=!0,t;return Promise.resolve().then(()=>(Dt(),Tt)).then(async a=>{if(!(!e||r.current===null))try{t=await a.mountScene(r.current,i),e&&n(`ready`)}catch{e&&n(`error`)}}),()=>{e=!1,t?.()}},[i]),(0,h.jsxs)(`div`,{className:S.scene3dWrap,"data-genui-scene3d":!0,children:[e.title!==void 0&&(0,h.jsx)(`div`,{className:S.scene3dTitle,children:e.title}),(0,h.jsx)(`div`,{ref:r,className:S.scene3dCanvas}),t===`loading`&&(0,h.jsx)(`div`,{className:S.scene3dHint,children:`加载 3D 场景…`}),t===`error`&&(0,h.jsx)(`div`,{className:S.scene3dHint,children:`3D 渲染失败`})]})}function Vt({node:e}){let t=e.items.slice(0,D.maxTimelineItems);return(0,h.jsx)(`div`,{className:S.timeline,children:t.map((e,n)=>(0,h.jsxs)(`div`,{className:S.tlItem,children:[(0,h.jsxs)(`div`,{className:S.tlRail,children:[(0,h.jsx)(`span`,{className:S.tlDot}),n`${e}-${t}`,i=e=>{n(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},a=(e,n,o)=>{if(n>D.maxTreeDepth)return null;let s=e.type===`dir`||e.children!==void 0&&e.children.length>0,c=r(n,o),l=s&&t.has(c);return(0,h.jsxs)(`div`,{className:S.ftRow,style:{paddingLeft:`${n*16}px`},children:[(0,h.jsxs)(`button`,{type:`button`,className:S.ftNameBtn,"aria-expanded":s?!l:void 0,onClick:s?()=>i(c):void 0,children:[(0,h.jsx)(`span`,{className:`${S.ftIcon} ${s?S.ftIconDir:``}`,"aria-hidden":!0,children:s?l?`▸`:`▾`:`·`}),(0,h.jsx)(`span`,{className:`${S.ftName} ${s?S.ftDir:``}`,children:e.name})]}),s&&!l&&(e.children??[]).map((e,t)=>a(e,n+1,t))]},c)};return(0,h.jsx)(`div`,{className:S.fileTree,children:e.items.slice(0,D.maxListItems).map((e,t)=>a(e,0,t))})}function Ut({node:e,onAction:t}){let[n,r]=(0,m.useState)(null),i=e.options.slice(0,D.maxQuizOptions),a=n!==null,o=n===null?void 0:i[n],s=o?.correct===!0,c=e.action;return(0,h.jsxs)(`div`,{className:S.quiz,"data-genui-quiz":!0,children:[(0,h.jsx)(`div`,{className:S.quizQuestion,children:e.question}),(0,h.jsx)(`div`,{className:S.quizOptions,children:i.map((i,o)=>{let s=n===o,l=a?s?i.correct===!0?S.quizOptCorrect:S.quizOptWrong:i.correct===!0?S.quizOptReveal:S.quizOpt:S.quizOpt;return(0,h.jsxs)(`button`,{type:`button`,className:l,disabled:a,onClick:()=>{r(o),c!==void 0&&t!==void 0&&t(c,{type:`quiz`,question:e.question,answer:i.label,correct:i.correct===!0})},children:[(0,h.jsx)(`span`,{className:S.quizMarker,children:a&&(i.correct===!0?`✓`:s?`✗`:``)}),i.label]},o)})}),a&&(0,h.jsxs)(`div`,{className:S.quizResult,"aria-live":`polite`,children:[(0,h.jsxs)(`div`,{className:s?S.quizCorrectMsg:S.quizWrongMsg,children:[s?`✓ 回答正确!`:`✗ 再想想看`,o?.feedback!==void 0&&(0,h.jsx)(`div`,{className:S.quizFeedback,children:o.feedback})]}),e.explanation!==void 0&&(0,h.jsx)(`div`,{className:S.quizExplanation,children:e.explanation}),(0,h.jsx)(`button`,{type:`button`,className:S.quizRetry,onClick:()=>r(null),children:`重新作答`})]})]})}function Wt({node:e}){let t=e.items.slice(0,D.maxBreadcrumbItems);return(0,h.jsx)(`nav`,{className:S.breadcrumb,"aria-label":`breadcrumb`,children:t.map((e,n)=>(0,h.jsxs)(`span`,{className:S.bcItem,children:[(0,h.jsx)(`span`,{className:`${S.bcText} ${n===t.length-1?S.bcCurrent:``}`,children:e}),nD.maxDepth)return null;switch(e.type){case`text`:{let n=e.size??`body`;return(0,h.jsx)(`div`,{className:`${S.text} ${S[n]}`+(e.center?` ${S.center}`:``),children:e.content},t)}case`row`:return(0,h.jsxs)(`div`,{className:S.row+(e.wrap?` ${S.wrap}`:``),children:[e.items.map((e,t)=>W(e,t,n,r+1,i)),e.spacer&&(0,h.jsx)(`div`,{className:S.spacer})]},t);case`col`:return(0,h.jsx)(`div`,{className:S.col,style:e.gap===void 0?void 0:{gap:`${e.gap}px`},children:e.items.map((e,t)=>W(e,t,n,r+1,i))},t);case`grid`:return(0,h.jsx)(`div`,{className:S.grid,style:{gridTemplateColumns:`repeat(${Math.max(1,e.cols)}, minmax(0, 1fr))`},children:e.items.map((e,t)=>W(e,t,n,r+1,i))},t);case`card`:return(0,h.jsxs)(`div`,{className:S.card,children:[e.title!==void 0&&(0,h.jsx)(`div`,{className:S.cardTitle,children:e.title}),e.items.map((e,t)=>W(e,t,n,r+1,i))]},t);case`button`:{let r=e.tone??``,i=`${S.button} ${S[r]||``}`+(e.full?` ${S.full}`:``)+(e.small?` ${S.small}`:``),a=e.action,o=a!==void 0&&n!==void 0;return(0,h.jsxs)(Re,{className:i,disabled:!o,onClick:o?()=>n(a,{type:`button`,label:e.label}):void 0,children:[e.icon!==void 0&&(0,h.jsxs)(`span`,{"aria-hidden":!0,children:[e.icon,` `]}),e.label]},t)}case`input`:return(0,h.jsx)($e,{node:e,onAction:n,answers:i},t);case`select`:return(0,h.jsx)(Qe,{node:e,onAction:n,answers:i},t);case`checkbox`:{let r=e.action;return(0,h.jsxs)(`label`,{className:S.checkbox,children:[(0,h.jsx)(`input`,{type:`checkbox`,defaultChecked:e.checked===!0,onChange:r!==void 0&&n!==void 0?e=>n(r,{type:`checkbox`,checked:e.currentTarget.checked}):void 0}),(0,h.jsx)(`span`,{children:e.label})]},t)}case`link`:{let n=e.href;return n===void 0?(0,h.jsx)(`span`,{className:S.linkText,children:e.label},t):(0,h.jsx)(`a`,{className:S.link,href:n,target:`_blank`,rel:`noopener noreferrer`,children:e.label},t)}case`badge`:{let n=e.tone??``;return(0,h.jsxs)(`span`,{className:`${S.badge} ${S[n]||``}`,children:[e.icon!==void 0&&(0,h.jsxs)(`span`,{"aria-hidden":!0,children:[e.icon,` `]}),e.label]},t)}case`stat`:{let n=e.delta!==void 0&&e.delta.startsWith(`-`);return(0,h.jsxs)(`div`,{className:S.stat,children:[(0,h.jsx)(`span`,{className:S.statLabel,children:e.label}),(0,h.jsx)(`span`,{className:S.statValue,children:e.value}),e.delta!==void 0&&(0,h.jsx)(`span`,{className:`${S.statDelta} ${n?S.down:S.up}`,children:e.delta})]},t)}case`progress`:{let n=Math.max(0,Math.min(100,Number(e.value)||0));return(0,h.jsxs)(`div`,{className:S.progress,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":n,"aria-label":e.label??e.valueLabel??void 0,children:[(e.label!==void 0||e.valueLabel!==void 0)&&(0,h.jsxs)(`div`,{className:S.progressRow,children:[(0,h.jsx)(`span`,{children:e.label}),e.valueLabel!==void 0&&(0,h.jsx)(`span`,{children:e.valueLabel})]}),(0,h.jsx)(`div`,{className:S.track,children:(0,h.jsx)(`div`,{className:S.fill,style:{width:`${n}%`}})})]},t)}case`divider`:return(0,h.jsx)(`hr`,{className:S.divider},t);case`list`:{let n=e.items.slice(0,D.maxListItems);return(0,h.jsx)(`div`,{className:S.list,children:n.map((e,t)=>(0,h.jsx)(`div`,{className:S.li,children:typeof e==`string`?(0,h.jsx)(`span`,{className:S.liTitle,children:e}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`span`,{className:S.liTitle,children:e.title}),e.desc!==void 0&&(0,h.jsx)(`span`,{className:S.liDesc,children:e.desc})]})},t))},t)}case`table`:return(0,h.jsx)(Be,{node:e},t);case`chart`:return(0,h.jsx)(Ve,{chart:e},t);case`tabs`:return(0,h.jsx)(It,{tabs:e,onAction:n,depth:r+1,answers:i},t);case`avatar`:return(0,h.jsx)(`div`,{className:S.avatar,style:{background:e.color??Le(e.name)},children:e.name.slice(0,1).toUpperCase()},t);case`spacer`:return(0,h.jsx)(`div`,{className:S.spacer},t);case`plot`:return(0,h.jsx)(Mt,{plot:e},t);case`callout`:return(0,h.jsx)(kt,{node:e},t);case`steps`:return(0,h.jsx)(At,{steps:e},t);case`keyvalue`:return(0,h.jsx)(jt,{node:e},t);case`diff`:return(0,h.jsx)(Nt,{node:e},t);case`json`:return(0,h.jsx)(Pt,{node:e},t);case`code`:return(0,h.jsx)(Ft,{node:e},t);case`radio`:return(0,h.jsx)(Ge,{node:e,onAction:n,answers:i},`${t}:r${i?.round??0}`);case`submit`:return(0,h.jsx)(qe,{node:e,onAction:n,answers:i},t);case`switch`:return(0,h.jsx)(Je,{node:e,onAction:n},t);case`slider`:return(0,h.jsx)(Ye,{node:e,onAction:n,answers:i},t);case`textarea`:return(0,h.jsx)(et,{node:e,onAction:n,answers:i},t);case`accordion`:return(0,h.jsx)(Lt,{node:e,onAction:n,depth:r+1,answers:i},t);case`copy`:return(0,h.jsx)(Rt,{node:e},t);case`mermaid`:return(0,h.jsx)(zt,{node:e},t);case`scene3d`:return(0,h.jsx)(Bt,{node:e},t);case`timeline`:return(0,h.jsx)(Vt,{node:e},t);case`file-tree`:return(0,h.jsx)(Ht,{node:e},t);case`breadcrumb`:return(0,h.jsx)(Wt,{node:e},t);case`quiz`:return(0,h.jsx)(Ut,{node:e,onAction:n},t);default:{let a=e,o=Gt?.(a.type);return o===void 0?null:(0,h.jsx)(o,{node:a,onAction:n,renderChildren:(e,t)=>e.map((e,a)=>W(e,Number(t)+a,n,r+1,i))},t)}}}function Kt(e){let t=(0,m.useRef)(null);return(0,m.useEffect)(()=>()=>{let e=t.current;if(e!==null){for(let t of e.values())clearTimeout(t);e.clear()}},[]),(0,m.useMemo)(()=>{if(e===void 0)return;let n=new Map;return t.current=n,(t,r)=>{let i=n.get(t);i!==void 0&&clearTimeout(i),n.set(t,setTimeout(()=>{n.delete(t),e(t,r)},300))}},[e])}function qt(e,t){return e===t||JSON.stringify(e)===JSON.stringify(t)}let Jt=(0,m.memo)(function({spec:e,stateKey:t}){let n=e.gap??16,r=Kt(v()),[i]=(0,m.useState)(()=>t===void 0?null:ne(t)),[a,o]=(0,m.useState)(i?.answers??{}),[s,c]=(0,m.useState)(i?.fields??{}),[l,u]=(0,m.useState)({}),[d,f]=(0,m.useState)(i?.locked===!0),[p,ee]=(0,m.useState)(0),[g,_]=(0,m.useState)(new Set),y=(0,m.useCallback)((e,t)=>{o(n=>n[e]===t?n:{...n,[e]:t})},[]),b=(0,m.useCallback)((e,t)=>{c(n=>{if(t.trim()===``){if(!(e in n))return n;let t={...n};return delete t[e],t}return n[e]===t?n:{...n,[e]:t}})},[]),x=(0,m.useCallback)(e=>{_(t=>t.has(e)?t:new Set(t).add(e))},[]),C=(0,m.useCallback)((e,t)=>{u(n=>{let r=n[e];return r!==void 0&&r.label===t.label&&r.answer===t.answer&&r.explanation===t.explanation?n:{...n,[e]:t}})},[]),w=(0,m.useCallback)(()=>{o({}),f(!1),ee(e=>e+1)},[]),T=(0,m.useMemo)(()=>({answers:a,fields:s,secretFields:g,meta:l,locked:d,round:p,setAnswer:y,setField:b,registerSecretField:x,registerMeta:C,clear:w,setLocked:f}),[a,s,g,l,d,p,y,b,x,C,w]);return(0,m.useEffect)(()=>{if(t===void 0)return;let e=setTimeout(()=>{let e=Object.fromEntries(Object.entries(s).filter(([e])=>!g.has(e)));re(t,{answers:a,locked:d,...Object.keys(e).length>0?{fields:e}:{}})},300);return()=>clearTimeout(e)},[t,a,d,s,g]),(0,h.jsxs)(`div`,{className:S.block,"data-genui":!0,children:[e.title!==void 0&&(0,h.jsx)(`div`,{className:S.banner,children:e.title}),(0,h.jsx)(`div`,{className:S.col,style:{gap:`${n}px`},children:e.items.map((e,t)=>(0,h.jsx)(`div`,{className:S.reveal,style:{animationDelay:`${Math.min(t*90,720)}ms`},children:W(e,t,r,0,T)},t))})]})},(e,t)=>e.stateKey===t.stateKey&&qt(e.spec,t.spec));function Yt(e){if(typeof e!=`object`||!e)return!1;let t=e;return!(!Array.isArray(t.items)||t.title!==void 0&&typeof t.title!=`string`||t.gap!==void 0&&typeof t.gap!=`number`)}function Xt(e){let t=[],n=[],r=e=>{n.length>=32&&n.shift(),n.push(e)},i=!1,a=!1,o=0;for(;ot.end-e.end);let s=[];for(let e of n)(s.length===0||s[s.length-1].end!==e.end)&&s.push(e);return{candidates:s.slice(0,32),scannedChars:o}}function Zt(e){let t=``;for(let n=e.length-1;n>=0;n--)t+=e[n]===`{`?`}`:`]`;return t}function Qt(e){try{let t=JSON.parse(e);return Yt(t)?t:null}catch{return null}}function G(e){let t=e.trim();if(t===``)return null;let n=Qt(t);if(n!==null)return n;let{candidates:r}=Xt(t);for(let e of r){let n=Qt(t.slice(0,e.end)+e.closingSuffix);if(n!==null)return n}return null}let K={maxNodes:200,maxAppends:200},$t=new Map,q=new Set;function en(){return{ops:new Map,seen:new Map,overflow:null,local:null,localBarrier:-1,replayBarrier:-1,maxSeenSeq:-1,snapshot:null}}let tn=`dsh.genui.panel`;function nn(){try{let e=localStorage.getItem(tn);if(e===null)return{order:[],sessions:{}};let t=JSON.parse(e);return!Array.isArray(t.order)||typeof t.sessions!=`object`||t.sessions===null?{order:[],sessions:{}}:{order:t.order.filter(e=>typeof e==`string`),sessions:t.sessions}}catch{return{order:[],sessions:{}}}}function rn(e,t){try{let n=nn(),r=n.order.filter(t=>t!==e);r.unshift(e);let i={...n.sessions,[e]:t};for(;r.length>50;){let e=r.pop();e!==void 0&&delete i[e]}localStorage.setItem(tn,JSON.stringify({order:r,sessions:i}))}catch{}}function an(e){let t=$t.get(e);if(t!==void 0)return t;let n=en();try{let t=nn().sessions[e];t!==void 0&&(n={ops:new Map,seen:new Map,overflow:null,local:t.local??null,localBarrier:t.localBarrier??-1,replayBarrier:t.maxSeenSeq??-1,maxSeenSeq:t.maxSeenSeq??-1,snapshot:t.snapshot??null})}catch{}return $t.set(e,n),n}function J(e,t){for(let n=0;n<3;n++){let r=e[n]-t[n];if(r!==0)return r}return 0}function on(e,t){if(t!==null&&(t.order[0]<=e.localBarrier||t.order[0]<=e.replayBarrier||e.seen.has(t.sourceId)||e.overflow!==null&&e.overflow.sourceId===t.sourceId||t.mode===`append`&&e.overflow!==null&&J(t.order,e.overflow.order)>0))return null;let n=[...e.ops.values()].filter(t=>t.order[0]>e.localBarrier&&t.order[0]>e.replayBarrier);t!==null&&n.push(t),n.sort((e,t)=>J(e.order,t.order));let r=0;for(let e=0;ec&&(c=t.order[0]),t.mode===`replace`){if(Fe(t.spec,K.maxNodes+1)>K.maxNodes){(a===null||J(t.order,a.order)<0)&&(a=t);continue}a=null,i=t.spec,s.length=0,o=0,s.push(t);continue}let r=hn(i,t.spec);if(o>=K.maxAppends||Fe(r,K.maxNodes+1)>K.maxNodes){(a===null||J(t.order,a.order)<0)&&(a=t);continue}i=r,o+=1,s.push(t)}return t!==null&&s.length===e.ops.size&&s.every(t=>e.ops.get(t.sourceId)?.mode===t.mode)&&(a===null&&e.overflow===null||a!==null&&e.overflow!==null&&a.sourceId===e.overflow.sourceId)?null:{snapshot:i,kept:s,overflow:a,maxSeenSeq:c}}function sn(e,t,n){e.snapshot=t.snapshot,e.overflow=t.overflow,e.maxSeenSeq=t.maxSeenSeq,e.ops=new Map(t.kept.map(e=>[e.sourceId,e]));for(let n of t.kept)e.seen.set(n.sourceId,n.order);t.overflow!==null&&e.seen.set(t.overflow.sourceId,t.overflow.order),rn(n,{snapshot:e.snapshot,local:e.local,localBarrier:e.localBarrier,maxSeenSeq:e.maxSeenSeq})}function cn(e,t){let n=an(e),r=on(n,t);if(r===null)return n.seen.has(t.sourceId)||n.overflow?.sourceId===t.sourceId?`idempotent`:`blocked`;let i=r.overflow!==null&&r.overflow.sourceId===t.sourceId?`overflow`:`accepted`,a=n.snapshot!==r.snapshot;if(sn(n,r,e),a)for(let e of q)e();return i}function ln(e,t){let n=an(e),r=n.maxSeenSeq;if(n.local!==t||n.localBarrier!==r){n.local=t,n.localBarrier=r,sn(n,on(n,null),e);for(let e of q)e()}}let Y=new Set;function un(e,t){let n=`${e}\u0000${t}`;Y.has(n)||(Y.add(n),console.warn(`[genui] 面板已到节点/操作上限(${K.maxNodes} 节点、${K.maxAppends} 条追加),本次 append 被拒绝;请让模型发送 replace 更新面板。`))}function dn(e){let t=$t.delete(e),n=X.delete(e),r=`${e}\u0000`;for(let e of Y)e.startsWith(r)&&Y.delete(e);if(!(!t&&!n)){for(let e of q)e();for(let e of Z)e()}}function fn(e){return an(e).snapshot}function pn(e){return q.add(e),()=>{q.delete(e)}}function mn(e){if(e.items.length!==1)return null;let t=e.items[0];return t?.type!==`tabs`||!Array.isArray(t.tabs)?null:t.tabs}function hn(e,t){if(e===null||e.items.length===0)return t;let n=e.title??t.title,r={...e,...n===void 0?{}:{title:n}},i=mn(e),a=mn(t);if(i!==null&&a!==null){let e=new Map(i.map(e=>[e.label,{label:e.label,items:[...e.items]}]));for(let t of a){let n=e.get(t.label);n===void 0?e.set(t.label,{label:t.label,items:[...t.items]}):n.items.push(...t.items)}return{...r,items:[{type:`tabs`,tabs:[...e.values()]}]}}return{...r,items:[...e.items,...t.items]}}let X=new Map,Z=new Set;function gn(e){X.set(e,(X.get(e)??0)+1);for(let e of Z)e()}function _n(e){return X.get(e)??0}function vn(e){return Z.add(e),()=>{Z.delete(e)}}function yn(e){try{return JSON.parse(e),!0}catch{return!1}}function bn(e){try{return JSON.parse(e),null}catch(e){let t=e instanceof Error?e.message:String(e),n=t.match(/position (\d+)/i);return`${n===null?``:`(字符 ${n[1]} 附近)`}${t.slice(0,140)}`}}function xn(e){try{return JSON.parse(e),null}catch{}let t=``,n=!1,r=!1,i=0;for(let a=0;a{var t={exports:{}},n=t.exports;Object.defineProperty(n,Symbol.toStringTag,{value:`Module`});var r=Object.create,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.getPrototypeOf,c=Object.prototype.hasOwnProperty,l=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},u=(e,t)=>{let n={};for(var r in e)i(n,r,{get:e[r],enumerable:!0});return t||i(n,Symbol.toStringTag,{value:`Module`}),n},d=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var s=o(t),l=0,u=s.length,d;lt[e]).bind(null,d),enumerable:!(r=a(t,d))||r.enumerable});return e},f=(e,t,n)=>(n=e==null?{}:r(s(e)),d(t||!e||!e.__esModule||!c.call(e,`default`)?i(n,`default`,{value:e,enumerable:!0}):n,e));let p=e("@deepseek-ai/dsh-client-ui-primitives");p=f(p,1);let ee=e("react-dom/client"),m=e("react"),h=e("react/jsx-runtime"),g=(0,m.createContext)(void 0),_=p.GenuiActionContext??g;function v(){return(0,m.useContext)(_)}let y={display:`flex`,flexDirection:`column`,gap:`4px`,padding:`8px 12px`,margin:`4px 0`,borderRadius:`8px`,border:`1px solid rgba(127,127,127,0.35)`,background:`rgba(127,127,127,0.08)`,color:`inherit`,fontSize:`12px`,lineHeight:1.5,fontFamily:`inherit`};var b=class extends m.Component{state={error:null};static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error(`[dsh-genui] render failed:`,e,t.componentStack??``)}render(){let{error:e}=this.state;return e===null?this.props.children:(0,h.jsxs)(`div`,{style:y,role:`alert`,"data-genui-error":!0,children:[(0,h.jsxs)(`span`,{style:{fontWeight:600},children:[`⚠️ `,this.props.label??`此界面`,`渲染失败(已隔离,不影响其他内容)`]}),(0,h.jsx)(`span`,{style:{opacity:.75,overflowWrap:`anywhere`},children:e.message})]})}};let x=`@omdsh-dev/dsh-genui/GenuiBlock.module.css`;if(typeof document<`u`&&document.querySelector(`style[data-plugin-css=`+JSON.stringify(x)+`]`)===null){let e=document.createElement(`style`);e.dataset.plugin=`@omdsh-dev/dsh-genui`,e.dataset.pluginCss=x,e.textContent=`.V1MMBW_block{--dsl-g-radius-surface:12px;--dsl-g-radius-control:8px;--dsl-g-radius-pill:999px;--dsl-g-font-display:24px;--dsl-g-font-h1:20px;--dsl-g-font-h2:16px;--dsl-g-font-h3:14px;--dsl-g-font-body:14px;--dsl-g-font-title:13px;--dsl-g-font-meta:12px;--dsl-g-font-data:11px;--dsl-g-gap-lg:16px;--dsl-g-gap-md:12px;--dsl-g-gap-sm:8px;--dsl-g-gap-xs:4px;--dsl-g-border:var(--dsw-alias-border-l1,var(--dsw-alias-border-l2,#ffffff1f));--dsl-g-border-strong:var(--dsw-alias-border-l2,#ffffff1f);--dsl-g-accent:var(--dsw-alias-state-business-primary,#4f8ef7);--dsl-g-accent-soft:color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint), transparent);--dsl-g-tint:8%;--dsl-g-tint-strong:14%;--dsl-g-font-mono:var(--ds-font-family-code,ui-monospace, "SF Mono", monospace);color:var(--dsw-alias-label-primary);margin:8px 0}.V1MMBW_banner{font-size:var(--dsl-g-font-title);letter-spacing:.01em;color:var(--dsw-alias-label-primary);margin-bottom:var(--dsl-g-gap-lg);border-bottom:1px solid var(--dsl-g-border);padding-bottom:10px;font-weight:600}.V1MMBW_col{gap:var(--dsl-g-gap-md);flex-direction:column;display:flex}.V1MMBW_row{align-items:center;gap:var(--dsl-g-gap-md);display:flex}.V1MMBW_row.V1MMBW_wrap{flex-wrap:wrap}.V1MMBW_grid{gap:var(--dsl-g-gap-md);display:grid}.V1MMBW_spacer{flex:1}.V1MMBW_divider{background:var(--dsw-alias-markdown-hr,var(--dsl-g-border));height:1px;margin:var(--dsl-g-gap-xs) 0;border:none}.V1MMBW_card{background:var(--dsw-alias-bg-layer-1,var(--dsw-alias-markdown-code-block));border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-surface);padding:var(--dsl-g-gap-lg);gap:var(--dsl-g-gap-md);flex-direction:column;display:flex}.V1MMBW_cardTitle{font-size:var(--dsl-g-font-meta);letter-spacing:.02em;color:var(--dsw-alias-label-secondary);font-weight:600}.V1MMBW_text{color:var(--dsw-alias-label-primary)}.V1MMBW_text.V1MMBW_h1{font-size:var(--dsl-g-font-h1);letter-spacing:-.02em;font-weight:700;line-height:1.3}.V1MMBW_text.V1MMBW_h2{font-size:var(--dsl-g-font-h2);letter-spacing:-.01em;font-weight:600;line-height:1.35}.V1MMBW_text.V1MMBW_h3{font-size:var(--dsl-g-font-h3);font-weight:600;line-height:1.5}.V1MMBW_text.V1MMBW_body{font-size:var(--dsl-g-font-body);color:var(--dsw-alias-label-primary);line-height:1.6}.V1MMBW_text.V1MMBW_muted{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary);line-height:1.5}.V1MMBW_text.V1MMBW_caption{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);letter-spacing:.02em;line-height:1.5}.V1MMBW_text.V1MMBW_center{text-align:center}.V1MMBW_button{border:1px solid var(--dsl-g-border);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:var(--dsl-g-radius-control);padding:8px var(--dsl-g-gap-lg);font-size:var(--dsl-g-font-title);cursor:pointer;text-align:center;font-family:inherit;font-weight:600;line-height:1.4;transition:border-color .15s,filter .15s,background .15s}.V1MMBW_button:hover:not(:disabled){border-color:var(--dsl-g-accent);filter:brightness(1.06)}.V1MMBW_button.V1MMBW_primary:hover:not(:disabled){filter:brightness(1.08)}.V1MMBW_button:disabled{cursor:not-allowed;opacity:.45;filter:none;box-shadow:none;pointer-events:none}.V1MMBW_button.V1MMBW_primary{background:var(--dsl-g-accent);color:#fff;border:none;box-shadow:inset 0 1px #ffffff24}.V1MMBW_button.V1MMBW_danger{background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) var(--dsl-g-tint), transparent);border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) 30%, transparent);color:var(--dsw-alias-state-error-primary,#ffb3b3)}.V1MMBW_button.V1MMBW_success{background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) var(--dsl-g-tint), transparent);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) 30%, transparent);color:var(--dsw-alias-state-success-secondary,#9fe8c5)}.V1MMBW_button.V1MMBW_ghost{background:0 0}.V1MMBW_button.V1MMBW_full{width:100%}.V1MMBW_button.V1MMBW_small{font-size:var(--dsl-g-font-meta);border-radius:var(--dsl-g-radius-control);padding:4px 12px}.V1MMBW_field{gap:var(--dsl-g-gap-xs);flex-direction:column;display:flex}.V1MMBW_field>span{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary)}.V1MMBW_input,.V1MMBW_select{background:var(--dsw-alias-bg-base,#17171a);border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-control);color:var(--dsw-alias-label-primary);font-size:var(--dsl-g-font-title);outline:none;width:100%;padding:8px 12px;font-family:inherit}.V1MMBW_input:focus,.V1MMBW_select:focus{border-color:var(--dsl-g-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint-strong), transparent)}.V1MMBW_input::placeholder{color:var(--dsw-alias-label-caption,#5b6378)}.V1MMBW_checkbox{align-items:center;gap:var(--dsl-g-gap-sm);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary);cursor:pointer;display:flex}.V1MMBW_checkbox input{accent-color:var(--dsl-g-accent);width:15px;height:15px}.V1MMBW_link{color:var(--dsl-g-accent);font-size:var(--dsl-g-font-title);cursor:pointer;background:0 0;border:none;padding:0;font-family:inherit;text-decoration:none}.V1MMBW_link:hover{text-decoration:underline}.V1MMBW_linkText{color:var(--dsl-g-accent);font-size:var(--dsl-g-font-title);font-family:inherit;text-decoration:none}.V1MMBW_badge{align-items:center;gap:var(--dsl-g-gap-xs);font-size:var(--dsl-g-font-meta);letter-spacing:.01em;border-radius:var(--dsl-g-radius-pill);background:color-mix(in srgb, var(--dsw-alias-label-tertiary) var(--dsl-g-tint), transparent);width:fit-content;color:var(--dsw-alias-label-secondary);border:1px solid var(--dsl-g-border);padding:1px 10px;font-weight:500;line-height:1.5;display:inline-flex}.V1MMBW_badge.V1MMBW_success{background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) var(--dsl-g-tint), transparent);color:var(--dsw-alias-state-success-secondary,#7fe3b4);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) 30%, transparent)}.V1MMBW_badge.V1MMBW_warn{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary,#f5b83d) var(--dsl-g-tint), transparent);color:var(--dsw-alias-state-warn-secondary,#f7cf7d);border-color:color-mix(in srgb, var(--dsw-alias-state-warn-primary,#f5b83d) 30%, transparent)}.V1MMBW_badge.V1MMBW_danger{background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) var(--dsl-g-tint), transparent);color:var(--dsw-alias-state-error-primary,#ff9d9d);border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) 30%, transparent)}.V1MMBW_badge.V1MMBW_accent{background:color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint), transparent);color:var(--dsw-alias-state-business-primary,#9cc3ff);border-color:color-mix(in srgb, var(--dsl-g-accent) 30%, transparent)}.V1MMBW_stat{padding:6px var(--dsl-g-gap-lg);flex-direction:column;gap:2px;display:flex}.V1MMBW_grid>.V1MMBW_stat,.V1MMBW_row>.V1MMBW_stat{border-left:1px solid var(--dsl-g-border)}.V1MMBW_grid>.V1MMBW_stat:first-child,.V1MMBW_row>.V1MMBW_stat:first-child{padding-left:var(--dsl-g-gap-xs);border-left:none}.V1MMBW_statLabel{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);letter-spacing:.02em}.V1MMBW_statValue{font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-display);letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);font-weight:600;line-height:1.2}.V1MMBW_statDelta{font-size:var(--dsl-g-font-meta);font-weight:500}.V1MMBW_statDelta.V1MMBW_up{color:var(--dsw-alias-state-success-primary,#22c55e)}.V1MMBW_statDelta.V1MMBW_down{color:var(--dsw-alias-state-error-primary,#f25a5a)}.V1MMBW_progress{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_progressRow{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);justify-content:space-between;display:flex}.V1MMBW_progressRow span:last-child{font-family:var(--dsl-g-font-mono)}.V1MMBW_track{border-radius:var(--dsl-g-radius-pill);background:var(--dsw-alias-bg-layer-1);height:6px;box-shadow:inset 0 0 0 1px var(--dsl-g-border);overflow:hidden}.V1MMBW_fill{border-radius:var(--dsl-g-radius-pill);background:var(--dsl-g-accent);height:100%;transition:width .5s}.V1MMBW_list{flex-direction:column;display:flex}.V1MMBW_li{padding:var(--dsl-g-gap-sm) var(--dsl-g-gap-xs);flex-direction:column;gap:2px;display:flex}.V1MMBW_li+.V1MMBW_li{border-top:1px solid var(--dsl-g-border)}.V1MMBW_li:last-child{border-bottom:none}.V1MMBW_liTitle{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-primary);font-weight:600;line-height:1.5}.V1MMBW_liDesc{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);line-height:1.5}.V1MMBW_tableWrap{border-radius:var(--dsl-g-radius-control);overscroll-behavior-x:contain;min-width:0;max-width:100%;overflow-x:auto}.V1MMBW_table{border-collapse:collapse;width:100%;font-size:var(--dsl-g-font-title)}.V1MMBW_table th{text-align:left;padding:var(--dsl-g-gap-sm) var(--dsl-g-gap-md);color:var(--dsw-alias-label-tertiary);font-weight:600;font-size:var(--dsl-g-font-meta);border-bottom:1px solid var(--dsl-g-border);white-space:nowrap}.V1MMBW_table td{padding:var(--dsl-g-gap-sm) var(--dsl-g-gap-md);border-bottom:1px solid var(--dsl-g-border);color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums;line-height:1.5}.V1MMBW_table tr:last-child td{border-bottom:none}.V1MMBW_thSort{color:inherit;font:inherit;font-weight:inherit;cursor:pointer;text-align:left;background:0 0;border:none;margin:0;padding:0}.V1MMBW_thSort:hover{color:var(--dsw-alias-label-primary)}.V1MMBW_thSortMark{color:var(--dsl-g-accent)}.V1MMBW_thSort:focus-visible{outline:2px solid var(--dsl-g-accent);outline-offset:1px;border-radius:var(--dsl-g-radius-control)}.V1MMBW_chart{gap:var(--dsl-g-gap-xs);flex-direction:column;display:flex}.V1MMBW_chartPlot{align-items:flex-end;gap:var(--dsl-g-gap-sm);height:132px;display:flex;position:relative}.V1MMBW_baseline{background:var(--dsl-g-border-strong);pointer-events:none;height:1px;position:absolute;bottom:0;left:0;right:0}.V1MMBW_gridline{background:var(--dsw-alias-border-l1,#ffffff0f);pointer-events:none;height:1px;position:absolute;left:0;right:0}.V1MMBW_chartLabels{gap:var(--dsl-g-gap-sm);display:flex}.V1MMBW_chartLabels>span{flex:1;min-width:0}.V1MMBW_barCol{justify-content:flex-end;gap:var(--dsl-g-gap-xs);flex-direction:column;flex:1;min-width:0;height:100%;display:flex}.V1MMBW_barValue{font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-data);font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-secondary);text-align:center;line-height:1.2}.V1MMBW_barFill{background:var(--dsl-g-accent);border-radius:4px 4px 2px 2px;min-height:4px;transition:height .6s}.V1MMBW_barLabel{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);text-align:center;white-space:nowrap;text-overflow:ellipsis;line-height:1.5;overflow:hidden}.V1MMBW_tabs{gap:var(--dsl-g-gap-md);flex-direction:column;display:flex}.V1MMBW_tabBar{gap:var(--dsl-g-gap-xs);border-bottom:1px solid var(--dsl-g-border);display:flex}.V1MMBW_tab{color:var(--dsw-alias-label-tertiary);font-size:var(--dsl-g-font-title);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-1px;padding:6px 12px;font-family:inherit;font-weight:600;line-height:1.5}.V1MMBW_tabActive{color:var(--dsw-alias-label-primary);border-bottom-color:var(--dsl-g-accent)}.V1MMBW_avatar{width:32px;height:32px;font-size:var(--dsl-g-font-title);color:#fff;border:1px solid #ffffff24;border-radius:50%;flex-shrink:0;place-items:center;font-weight:700;display:grid;box-shadow:inset 0 1px #ffffff29}.V1MMBW_callout{border-radius:var(--dsl-g-radius-control);border:1px solid var(--dsl-g-border);font-size:var(--dsl-g-font-title);background:var(--dsw-alias-bg-layer-1,var(--dsw-alias-markdown-code-block));flex-direction:column;gap:2px;padding:10px 14px;line-height:1.6;display:flex}.V1MMBW_calloutInfo{background:color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint), transparent)}.V1MMBW_calloutSuccess{background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) var(--dsl-g-tint), transparent)}.V1MMBW_calloutWarning{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary,#f5b83d) var(--dsl-g-tint), transparent)}.V1MMBW_calloutError{background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) var(--dsl-g-tint), transparent)}.V1MMBW_calloutTitle{font-weight:600;font-size:var(--dsl-g-font-meta);letter-spacing:.02em;color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;display:flex}.V1MMBW_calloutTitle:before{content:"";background:var(--dsw-alias-label-caption,var(--dsw-alias-label-tertiary));border-radius:50%;width:6px;height:6px}.V1MMBW_calloutInfo .V1MMBW_calloutTitle:before{background:var(--dsl-g-accent)}.V1MMBW_calloutSuccess .V1MMBW_calloutTitle:before{background:var(--dsw-alias-state-success-primary,#3ecf8e)}.V1MMBW_calloutWarning .V1MMBW_calloutTitle:before{background:var(--dsw-alias-state-warn-primary,#f5b83d)}.V1MMBW_calloutError .V1MMBW_calloutTitle:before{background:var(--dsw-alias-state-error-primary,#ff6b6b)}.V1MMBW_calloutBody{color:var(--dsw-alias-label-secondary)}.V1MMBW_steps{gap:var(--dsl-g-gap-sm);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.V1MMBW_step{gap:var(--dsl-g-gap-md);align-items:flex-start;display:flex}.V1MMBW_stepMarker{width:24px;height:24px;font-size:var(--dsl-g-font-meta);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsl-g-border);color:var(--dsw-alias-label-tertiary);border-radius:50%;flex-shrink:0;place-items:center;font-weight:700;display:grid}.V1MMBW_stepDone .V1MMBW_stepMarker{background:var(--dsw-alias-state-success-primary,#3ecf8e);color:#fff;border-color:#0000;font-size:13px}.V1MMBW_stepActive .V1MMBW_stepMarker{background:color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint-strong), transparent);border-color:var(--dsl-g-accent);color:var(--dsl-g-accent)}.V1MMBW_stepContent{flex-direction:column;gap:2px;padding-top:3px;display:flex}.V1MMBW_stepTitle{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-primary);font-weight:600;line-height:1.5}.V1MMBW_stepDesc{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);line-height:1.5}.V1MMBW_keyvalue{flex-direction:column;margin:0;display:flex}.V1MMBW_kvRow{gap:var(--dsl-g-gap-md);font-size:var(--dsl-g-font-title);padding:6px 0;display:flex}.V1MMBW_kvRow+.V1MMBW_kvRow{border-top:1px solid var(--dsl-g-border)}.V1MMBW_kvRow:last-child{border-bottom:none}.V1MMBW_kvKey{width:96px;color:var(--dsw-alias-label-tertiary);flex-shrink:0;font-weight:600}.V1MMBW_kvValue{color:var(--dsw-alias-label-primary);word-break:break-word;margin:0;line-height:1.5}.V1MMBW_jsonScalar{font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary)}.V1MMBW_lineChart{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_linePath{fill:none;stroke:var(--dsl-g-accent);stroke-width:2px;stroke-linejoin:round;stroke-linecap:round}.V1MMBW_lineDot{fill:var(--dsl-g-accent)}.V1MMBW_lineGrid{stroke:var(--dsw-alias-border-l1,#ffffff12);stroke-width:1px}.V1MMBW_lineGridAxis{stroke:var(--dsl-g-border-strong);stroke-width:1px}.V1MMBW_lineTick{fill:var(--dsw-alias-label-tertiary);font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-data)}.V1MMBW_lineLabels{justify-content:space-between;display:flex}.V1MMBW_groupedBars{gap:var(--dsl-g-gap-xs);align-items:flex-end;width:100%;height:100%;display:flex}.V1MMBW_groupedBar{flex-direction:column;flex:1;justify-content:flex-end;align-items:center;gap:2px;min-width:0;height:100%;display:flex}.V1MMBW_groupValue{font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-data);font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;max-width:100%;line-height:1.2;overflow:hidden}.V1MMBW_groupedFill{background:var(--dsl-g-accent);border-radius:4px 4px 2px 2px;flex:none;width:100%;min-height:3px}.V1MMBW_donut{align-items:center;gap:var(--dsl-g-gap-lg);display:flex}.V1MMBW_donutTrack{stroke:var(--dsw-alias-border-l1,#ffffff14)}.V1MMBW_donutTotal{fill:var(--dsw-alias-label-primary);font-size:var(--dsl-g-font-h2);font-weight:700}.V1MMBW_donutTotalLabel{fill:var(--dsw-alias-label-tertiary);font-size:10px}.V1MMBW_donutLegend{gap:var(--dsl-g-gap-xs);font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-secondary);flex-direction:column;line-height:1.5;display:flex}.V1MMBW_fieldGroup{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_fieldLabel{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary)}.V1MMBW_radio{align-items:center;gap:var(--dsl-g-gap-sm);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary);cursor:pointer;line-height:1.5;display:flex}.V1MMBW_radio input{accent-color:var(--dsl-g-accent)}.V1MMBW_submitRow{align-items:center;gap:var(--dsl-g-gap-md);margin-top:2px;display:flex}.V1MMBW_submit{align-self:flex-start}.V1MMBW_submitHint{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary)}.V1MMBW_btnSent{margin-left:var(--dsl-g-gap-sm);font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-state-success-primary,#3ecf8e);font-weight:600}.V1MMBW_gradeWrap{gap:var(--dsl-g-gap-md);flex-direction:column;display:flex}.V1MMBW_gradeScore{align-items:baseline;gap:var(--dsl-g-gap-sm);display:flex}.V1MMBW_gradeScoreValue{font-size:var(--dsl-g-font-display);color:var(--dsw-alias-label-primary);font-weight:700;line-height:1.2}.V1MMBW_gradeScoreLabel{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary)}.V1MMBW_gradeList{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_gradeItem{font-size:var(--dsl-g-font-title);padding:var(--dsl-g-gap-sm) 12px;border-radius:var(--dsl-g-radius-control);border:1px solid var(--dsl-g-border);background:var(--dsw-alias-bg-layer-1);grid-template-columns:auto auto 1fr;align-items:baseline;gap:6px 10px;line-height:1.5;display:grid}.V1MMBW_gradeItemOk{border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) 30%, transparent)}.V1MMBW_gradeItemNo{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) 30%, transparent)}.V1MMBW_gradeQ{color:var(--dsw-alias-label-primary);font-weight:600}.V1MMBW_gradeTag{font-weight:700}.V1MMBW_gradeItemOk .V1MMBW_gradeTag{color:var(--dsw-alias-state-success-primary,#3ecf8e)}.V1MMBW_gradeItemNo .V1MMBW_gradeTag{color:var(--dsw-alias-state-error-primary,#ff6b6b)}.V1MMBW_gradeAns{color:var(--dsw-alias-label-secondary)}.V1MMBW_gradeRight{color:var(--dsw-alias-state-error-primary,#ffb3b3)}.V1MMBW_gradeExp{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);grid-column:1/-1;line-height:1.5}.V1MMBW_switchRow{justify-content:space-between;align-items:center;gap:var(--dsl-g-gap-md);cursor:pointer;display:flex}.V1MMBW_switchRow:focus-within .V1MMBW_switch{box-shadow:0 0 0 3px color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint-strong), transparent)}.V1MMBW_switchLabel{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-primary);line-height:1.5}.V1MMBW_switch{border-radius:var(--dsl-g-radius-pill);border:1px solid var(--dsl-g-border);background:var(--dsw-alias-bg-base,#17171a);width:38px;height:22px;transition:background .2s;position:relative}.V1MMBW_switchOn{background:var(--dsl-g-accent);border-color:#0000}.V1MMBW_switchKnob{background:#fff;border-radius:50%;width:14px;height:14px;transition:left .2s;position:absolute;top:3px;left:3px;box-shadow:0 1px 2px #0000004d}.V1MMBW_switchOn .V1MMBW_switchKnob{left:19px}.V1MMBW_sliderRow{align-items:center;gap:var(--dsl-g-gap-md);width:100%;display:flex}.V1MMBW_sliderInput{min-width:0;accent-color:var(--dsl-g-accent);flex:1}.V1MMBW_sliderValue{text-align:right;min-width:44px;font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-data);color:var(--dsw-alias-label-primary)}.V1MMBW_textarea{background:var(--dsw-alias-bg-base,#17171a);border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-control);width:100%;color:var(--dsw-alias-label-primary);padding:var(--dsl-g-gap-sm) 12px;font-size:var(--dsl-g-font-title);resize:vertical;outline:none;font-family:inherit;line-height:1.5}.V1MMBW_textarea:focus{border-color:var(--dsl-g-accent);box-shadow:0 0 0 3px color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint-strong), transparent)}.V1MMBW_accordion{border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-surface);flex-direction:column;display:flex;overflow:hidden}.V1MMBW_accItem{border-bottom:1px solid var(--dsl-g-border)}.V1MMBW_accItem:last-child{border-bottom:none}.V1MMBW_accHead{justify-content:space-between;align-items:center;gap:var(--dsl-g-gap-sm);background:var(--dsw-alias-bg-layer-1);width:100%;color:var(--dsw-alias-label-primary);font-size:var(--dsl-g-font-title);cursor:pointer;border:none;padding:10px 14px;font-family:inherit;font-weight:600;line-height:1.5;display:flex}.V1MMBW_accChevron{color:var(--dsw-alias-label-tertiary)}.V1MMBW_accBody{padding:var(--dsl-g-gap-md) 14px;gap:var(--dsl-g-gap-sm);background:var(--dsw-alias-bg-base,#17171a);flex-direction:column;display:flex}.V1MMBW_copyChip{border:1px solid var(--dsl-g-border);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);cursor:pointer;width:fit-content;padding:6px 14px;font-family:inherit;font-weight:600;transition:all .15s}.V1MMBW_copyChip:hover{border-color:var(--dsl-g-accent)}.V1MMBW_copyChipDone{border-color:var(--dsw-alias-state-success-primary,#3ecf8e);color:var(--dsw-alias-state-success-primary,#3ecf8e)}.V1MMBW_mermaid{padding:var(--dsl-g-gap-xs) 0;overflow-x:auto}.V1MMBW_mermaid svg{max-width:100%;height:auto}.V1MMBW_mermaidFallback{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_mermaidFallback pre{padding:var(--dsl-g-gap-sm) 10px;background:var(--dsw-alias-bg-base,#17171a);border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-control);font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-meta);margin:0;overflow-x:auto}.V1MMBW_mermaidErr{color:var(--dsw-alias-state-error-primary,#ff6b6b);font-size:var(--dsl-g-font-meta)}.V1MMBW_mermaidHint{color:var(--dsw-alias-label-tertiary);font-size:var(--dsl-g-font-meta)}.V1MMBW_scene3dWrap{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_scene3dTitle{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-primary);font-weight:700}.V1MMBW_scene3dCanvas{border-radius:var(--dsl-g-radius-surface);background:var(--dsw-alias-bg-base,#17171a);border:1px solid var(--dsl-g-border);height:240px;overflow:hidden}.V1MMBW_scene3dCanvas canvas{display:block}.V1MMBW_scene3dHint{color:var(--dsw-alias-label-tertiary);font-size:var(--dsl-g-font-meta)}.V1MMBW_timeline{flex-direction:column;display:flex}.V1MMBW_tlItem{gap:var(--dsl-g-gap-md);display:flex}.V1MMBW_tlRail{flex-direction:column;flex-shrink:0;align-items:center;width:12px;display:flex}.V1MMBW_tlDot{background:var(--dsl-g-accent);width:10px;height:10px;box-shadow:0 0 0 3px color-mix(in srgb, var(--dsl-g-accent) var(--dsl-g-tint-strong), transparent);border-radius:50%;flex-shrink:0;margin-top:4px}.V1MMBW_tlLine{background:var(--dsl-g-border);flex:1;width:2px;margin:2px 0}.V1MMBW_tlBody{padding-bottom:var(--dsl-g-gap-lg);flex:1;min-width:0}.V1MMBW_tlHead{align-items:baseline;gap:var(--dsl-g-gap-md);display:flex}.V1MMBW_tlTitle{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-primary);font-weight:600;line-height:1.5}.V1MMBW_tlTime{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);white-space:nowrap;margin-left:auto}.V1MMBW_tlDesc{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary);margin-top:2px;line-height:1.5}.V1MMBW_fileTree{font-family:var(--dsl-g-font-mono);font-size:var(--dsl-g-font-meta);flex-direction:column;display:flex}.V1MMBW_ftRow{align-items:center;gap:var(--dsl-g-gap-sm);padding:3px var(--dsl-g-gap-xs);border-radius:var(--dsl-g-radius-control);display:flex}.V1MMBW_ftRow:hover{background:var(--dsw-alias-bg-layer-1)}.V1MMBW_ftIcon{text-align:center;width:13px;font-size:10px;font-family:var(--dsl-g-font-mono);color:var(--dsw-alias-label-caption,var(--dsw-alias-label-tertiary));flex-shrink:0;line-height:1}.V1MMBW_ftIconDir{color:var(--dsl-g-accent);font-size:11px}.V1MMBW_ftName{color:var(--dsw-alias-label-secondary)}.V1MMBW_ftDir{color:var(--dsw-alias-label-primary);font-weight:600}.V1MMBW_ftNameBtn{align-items:center;gap:var(--dsl-g-gap-sm);min-width:0;font-family:inherit;font-size:var(--dsl-g-font-body);cursor:default;text-align:left;background:0 0;border:none;padding:0;display:inline-flex}button.V1MMBW_ftNameBtn[aria-expanded]{cursor:pointer}.V1MMBW_ftNameBtn:focus-visible{outline:2px solid var(--dsl-g-accent);outline-offset:1px;border-radius:var(--dsl-g-radius-control)}.V1MMBW_breadcrumb{align-items:center;gap:var(--dsl-g-gap-xs);font-size:var(--dsl-g-font-title);flex-wrap:wrap;display:flex}.V1MMBW_bcItem{align-items:center;gap:var(--dsl-g-gap-xs);display:inline-flex}.V1MMBW_bcText{color:var(--dsw-alias-label-secondary);cursor:pointer}.V1MMBW_bcText:hover{color:var(--dsl-g-accent)}.V1MMBW_bcCurrent{color:var(--dsw-alias-label-primary);cursor:default;font-weight:600}.V1MMBW_bcSep{color:var(--dsw-alias-label-caption,var(--dsw-alias-label-tertiary))}@keyframes V1MMBW_genuiReveal{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.V1MMBW_reveal{animation:.45s cubic-bezier(.22,1,.36,1) both V1MMBW_genuiReveal}@media (prefers-reduced-motion:reduce){.V1MMBW_reveal{animation:none}}.V1MMBW_quiz{gap:var(--dsl-g-gap-md);padding:var(--dsl-g-gap-lg);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-surface);flex-direction:column;display:flex}.V1MMBW_quizQuestion{font-size:var(--dsl-g-font-body);color:var(--dsw-alias-label-primary);font-weight:600;line-height:1.6}.V1MMBW_quizOptions{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_quizOpt{align-items:center;gap:var(--dsl-g-gap-sm);text-align:left;background:var(--dsw-alias-bg-base,#17171a);border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-label-secondary);cursor:pointer;padding:10px 14px;font-family:inherit;line-height:1.5;transition:border-color .15s,background .15s;display:flex}.V1MMBW_quizOpt:hover:not(:disabled){border-color:var(--dsl-g-accent);background:var(--dsl-g-accent-soft)}.V1MMBW_quizOpt:focus-visible,.V1MMBW_button:focus-visible,.V1MMBW_tab:focus-visible,.V1MMBW_accHead:focus-visible,.V1MMBW_copyChip:focus-visible,.V1MMBW_link:focus-visible,.V1MMBW_quizRetry:focus-visible,.V1MMBW_resetBtn:focus-visible,.V1MMBW_playBtn:focus-visible,.V1MMBW_bcText:focus-visible{outline:2px solid var(--dsl-g-accent);outline-offset:1px}.V1MMBW_quizOpt:disabled{cursor:default;opacity:.85}.V1MMBW_quizOptCorrect{align-items:center;gap:var(--dsl-g-gap-sm);text-align:left;background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) var(--dsl-g-tint), transparent);border:1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) 40%, transparent);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-state-success-primary,#3ecf8e);padding:10px 14px;font-family:inherit;font-weight:600;line-height:1.5;display:flex}.V1MMBW_quizOptWrong{align-items:center;gap:var(--dsl-g-gap-sm);text-align:left;background:color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) var(--dsl-g-tint), transparent);border:1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary,#ff6b6b) 30%, transparent);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-state-error-primary,#ff6b6b);padding:10px 14px;font-family:inherit;font-weight:600;line-height:1.5;display:flex}.V1MMBW_quizOptReveal{align-items:center;gap:var(--dsl-g-gap-sm);text-align:left;background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) var(--dsl-g-tint), transparent);border:1px dashed color-mix(in srgb, var(--dsw-alias-state-success-primary,#3ecf8e) 40%, transparent);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);color:var(--dsw-alias-state-success-primary,#3ecf8e);padding:10px 14px;font-family:inherit;line-height:1.5;display:flex}.V1MMBW_quizMarker{text-align:center;width:16px;font-weight:700}.V1MMBW_quizResult{gap:var(--dsl-g-gap-sm);flex-direction:column;display:flex}.V1MMBW_quizCorrectMsg{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-state-success-primary,#3ecf8e);font-weight:600}.V1MMBW_quizWrongMsg{font-size:var(--dsl-g-font-title);color:var(--dsw-alias-state-error-primary,#ff6b6b);font-weight:600}.V1MMBW_quizFeedback{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-secondary);margin-top:3px;font-weight:400;line-height:1.5}.V1MMBW_quizExplanation{font-size:var(--dsl-g-font-meta);color:var(--dsw-alias-label-tertiary);padding:var(--dsl-g-gap-sm) 10px;border-top:1px solid var(--dsl-g-border);line-height:1.6}.V1MMBW_quizRetry{border:1px solid var(--dsl-g-border);width:fit-content;color:var(--dsw-alias-label-secondary);border-radius:var(--dsl-g-radius-control);font-size:var(--dsl-g-font-title);cursor:pointer;background:0 0;padding:6px 14px;font-family:inherit}.V1MMBW_quizRetry:hover{border-color:var(--dsl-g-accent);color:var(--dsl-g-accent)}.V1MMBW_tool{margin:4px 0}.V1MMBW_toolFallback{align-items:center;gap:var(--dsl-g-gap-md);padding:var(--dsl-g-gap-sm) 12px;border:1px solid var(--dsl-g-border);border-radius:var(--dsl-g-radius-surface);background:var(--dsw-alias-bg-layer-1,var(--dsw-alias-markdown-code-block));font-size:var(--dsl-g-font-title);display:flex}.V1MMBW_toolFallbackTitle{color:var(--dsw-alias-label-primary);font-weight:600}.V1MMBW_toolFallbackMeta{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.V1MMBW_panel{border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary,#4f8ef7) 35%, transparent);background:var(--dsw-alias-bg-layer-1,#ffffff0a);border-radius:14px;margin:10px 14px 2px;overflow:hidden}.V1MMBW_panelHeader{align-items:center;display:flex}.V1MMBW_panelToggle{align-items:center;gap:var(--dsl-g-gap-sm);width:100%;color:inherit;font:inherit;font-size:var(--dsl-g-font-title);cursor:pointer;background:0 0;border:0;padding:9px 14px;display:flex}.V1MMBW_panelToggle:hover{background:#ffffff0a}.V1MMBW_panelBadge{padding:0 var(--dsl-g-gap-sm);background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4f8ef7) var(--dsl-g-tint-strong), transparent);color:var(--dsw-alias-state-business-primary,#7ba8ff);letter-spacing:.04em;border-radius:6px;flex:none;font-size:11px;font-weight:600;line-height:1.6}.V1MMBW_panelTitle{color:var(--dsw-alias-label-primary,#e6e6e6);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.V1MMBW_panelChevron{color:var(--dsw-alias-label-secondary,#ffffff8c);font-size:var(--dsl-g-font-meta);margin-left:auto}.V1MMBW_panelBody{height:360px;padding:0 16px var(--dsl-g-gap-lg);overflow-y:auto}.V1MMBW_panelResizeHandle{cursor:ns-resize;touch-action:none;background:0 0;border-radius:3px;height:6px;transition:background .15s}.V1MMBW_panelResizeHandle:hover,.V1MMBW_panelResizeHandleActive{background:color-mix(in srgb, var(--dsw-alias-state-business-primary,#4f8ef7) 35%, transparent)}`,document.head.appendChild(e)}var S={accBody:`V1MMBW_accBody`,accChevron:`V1MMBW_accChevron`,accHead:`V1MMBW_accHead`,accItem:`V1MMBW_accItem`,accent:`V1MMBW_accent`,accordion:`V1MMBW_accordion`,avatar:`V1MMBW_avatar`,badge:`V1MMBW_badge`,banner:`V1MMBW_banner`,barCol:`V1MMBW_barCol`,barFill:`V1MMBW_barFill`,barLabel:`V1MMBW_barLabel`,barValue:`V1MMBW_barValue`,baseline:`V1MMBW_baseline`,bcCurrent:`V1MMBW_bcCurrent`,bcItem:`V1MMBW_bcItem`,bcSep:`V1MMBW_bcSep`,bcText:`V1MMBW_bcText`,block:`V1MMBW_block`,body:`V1MMBW_body`,breadcrumb:`V1MMBW_breadcrumb`,btnSent:`V1MMBW_btnSent`,button:`V1MMBW_button`,callout:`V1MMBW_callout`,calloutBody:`V1MMBW_calloutBody`,calloutError:`V1MMBW_calloutError`,calloutInfo:`V1MMBW_calloutInfo`,calloutSuccess:`V1MMBW_calloutSuccess`,calloutTitle:`V1MMBW_calloutTitle`,calloutWarning:`V1MMBW_calloutWarning`,caption:`V1MMBW_caption`,card:`V1MMBW_card`,cardTitle:`V1MMBW_cardTitle`,center:`V1MMBW_center`,chart:`V1MMBW_chart`,chartLabels:`V1MMBW_chartLabels`,chartPlot:`V1MMBW_chartPlot`,checkbox:`V1MMBW_checkbox`,col:`V1MMBW_col`,copyChip:`V1MMBW_copyChip`,copyChipDone:`V1MMBW_copyChipDone`,danger:`V1MMBW_danger`,divider:`V1MMBW_divider`,donut:`V1MMBW_donut`,donutLegend:`V1MMBW_donutLegend`,donutTotal:`V1MMBW_donutTotal`,donutTotalLabel:`V1MMBW_donutTotalLabel`,donutTrack:`V1MMBW_donutTrack`,down:`V1MMBW_down`,field:`V1MMBW_field`,fieldGroup:`V1MMBW_fieldGroup`,fieldLabel:`V1MMBW_fieldLabel`,fileTree:`V1MMBW_fileTree`,fill:`V1MMBW_fill`,ftDir:`V1MMBW_ftDir`,ftIcon:`V1MMBW_ftIcon`,ftIconDir:`V1MMBW_ftIconDir`,ftName:`V1MMBW_ftName`,ftNameBtn:`V1MMBW_ftNameBtn`,ftRow:`V1MMBW_ftRow`,full:`V1MMBW_full`,genuiReveal:`V1MMBW_genuiReveal`,ghost:`V1MMBW_ghost`,gradeAns:`V1MMBW_gradeAns`,gradeExp:`V1MMBW_gradeExp`,gradeItem:`V1MMBW_gradeItem`,gradeItemNo:`V1MMBW_gradeItemNo`,gradeItemOk:`V1MMBW_gradeItemOk`,gradeList:`V1MMBW_gradeList`,gradeQ:`V1MMBW_gradeQ`,gradeRight:`V1MMBW_gradeRight`,gradeScore:`V1MMBW_gradeScore`,gradeScoreLabel:`V1MMBW_gradeScoreLabel`,gradeScoreValue:`V1MMBW_gradeScoreValue`,gradeTag:`V1MMBW_gradeTag`,gradeWrap:`V1MMBW_gradeWrap`,grid:`V1MMBW_grid`,gridline:`V1MMBW_gridline`,groupValue:`V1MMBW_groupValue`,groupedBar:`V1MMBW_groupedBar`,groupedBars:`V1MMBW_groupedBars`,groupedFill:`V1MMBW_groupedFill`,h1:`V1MMBW_h1`,h2:`V1MMBW_h2`,h3:`V1MMBW_h3`,input:`V1MMBW_input`,jsonScalar:`V1MMBW_jsonScalar`,keyvalue:`V1MMBW_keyvalue`,kvKey:`V1MMBW_kvKey`,kvRow:`V1MMBW_kvRow`,kvValue:`V1MMBW_kvValue`,li:`V1MMBW_li`,liDesc:`V1MMBW_liDesc`,liTitle:`V1MMBW_liTitle`,lineChart:`V1MMBW_lineChart`,lineDot:`V1MMBW_lineDot`,lineGrid:`V1MMBW_lineGrid`,lineGridAxis:`V1MMBW_lineGridAxis`,lineLabels:`V1MMBW_lineLabels`,linePath:`V1MMBW_linePath`,lineTick:`V1MMBW_lineTick`,link:`V1MMBW_link`,linkText:`V1MMBW_linkText`,list:`V1MMBW_list`,mermaid:`V1MMBW_mermaid`,mermaidErr:`V1MMBW_mermaidErr`,mermaidFallback:`V1MMBW_mermaidFallback`,mermaidHint:`V1MMBW_mermaidHint`,muted:`V1MMBW_muted`,panel:`V1MMBW_panel`,panelBadge:`V1MMBW_panelBadge`,panelBody:`V1MMBW_panelBody`,panelChevron:`V1MMBW_panelChevron`,panelHeader:`V1MMBW_panelHeader`,panelResizeHandle:`V1MMBW_panelResizeHandle`,panelResizeHandleActive:`V1MMBW_panelResizeHandleActive`,panelTitle:`V1MMBW_panelTitle`,panelToggle:`V1MMBW_panelToggle`,playBtn:`V1MMBW_playBtn`,primary:`V1MMBW_primary`,progress:`V1MMBW_progress`,progressRow:`V1MMBW_progressRow`,quiz:`V1MMBW_quiz`,quizCorrectMsg:`V1MMBW_quizCorrectMsg`,quizExplanation:`V1MMBW_quizExplanation`,quizFeedback:`V1MMBW_quizFeedback`,quizMarker:`V1MMBW_quizMarker`,quizOpt:`V1MMBW_quizOpt`,quizOptCorrect:`V1MMBW_quizOptCorrect`,quizOptReveal:`V1MMBW_quizOptReveal`,quizOptWrong:`V1MMBW_quizOptWrong`,quizOptions:`V1MMBW_quizOptions`,quizQuestion:`V1MMBW_quizQuestion`,quizResult:`V1MMBW_quizResult`,quizRetry:`V1MMBW_quizRetry`,quizWrongMsg:`V1MMBW_quizWrongMsg`,radio:`V1MMBW_radio`,resetBtn:`V1MMBW_resetBtn`,reveal:`V1MMBW_reveal`,row:`V1MMBW_row`,scene3dCanvas:`V1MMBW_scene3dCanvas`,scene3dHint:`V1MMBW_scene3dHint`,scene3dTitle:`V1MMBW_scene3dTitle`,scene3dWrap:`V1MMBW_scene3dWrap`,select:`V1MMBW_select`,sliderInput:`V1MMBW_sliderInput`,sliderRow:`V1MMBW_sliderRow`,sliderValue:`V1MMBW_sliderValue`,small:`V1MMBW_small`,spacer:`V1MMBW_spacer`,stat:`V1MMBW_stat`,statDelta:`V1MMBW_statDelta`,statLabel:`V1MMBW_statLabel`,statValue:`V1MMBW_statValue`,step:`V1MMBW_step`,stepActive:`V1MMBW_stepActive`,stepContent:`V1MMBW_stepContent`,stepDesc:`V1MMBW_stepDesc`,stepDone:`V1MMBW_stepDone`,stepMarker:`V1MMBW_stepMarker`,stepTitle:`V1MMBW_stepTitle`,steps:`V1MMBW_steps`,submit:`V1MMBW_submit`,submitHint:`V1MMBW_submitHint`,submitRow:`V1MMBW_submitRow`,success:`V1MMBW_success`,switch:`V1MMBW_switch`,switchKnob:`V1MMBW_switchKnob`,switchLabel:`V1MMBW_switchLabel`,switchOn:`V1MMBW_switchOn`,switchRow:`V1MMBW_switchRow`,tab:`V1MMBW_tab`,tabActive:`V1MMBW_tabActive`,tabBar:`V1MMBW_tabBar`,table:`V1MMBW_table`,tableWrap:`V1MMBW_tableWrap`,tabs:`V1MMBW_tabs`,text:`V1MMBW_text`,textarea:`V1MMBW_textarea`,thSort:`V1MMBW_thSort`,thSortMark:`V1MMBW_thSortMark`,timeline:`V1MMBW_timeline`,tlBody:`V1MMBW_tlBody`,tlDesc:`V1MMBW_tlDesc`,tlDot:`V1MMBW_tlDot`,tlHead:`V1MMBW_tlHead`,tlItem:`V1MMBW_tlItem`,tlLine:`V1MMBW_tlLine`,tlRail:`V1MMBW_tlRail`,tlTime:`V1MMBW_tlTime`,tlTitle:`V1MMBW_tlTitle`,tool:`V1MMBW_tool`,toolFallback:`V1MMBW_toolFallback`,toolFallbackMeta:`V1MMBW_toolFallbackMeta`,toolFallbackTitle:`V1MMBW_toolFallbackTitle`,track:`V1MMBW_track`,up:`V1MMBW_up`,warn:`V1MMBW_warn`,wrap:`V1MMBW_wrap`};let C=`dsh.genui.interaction`;function w(){return{order:[],blocks:{}}}function T(){try{let e=localStorage.getItem(C);if(e===null)return w();let t=JSON.parse(e);return!Array.isArray(t.order)||typeof t.blocks!=`object`||t.blocks===null?w():{order:t.order.filter(e=>typeof e==`string`),blocks:t.blocks}}catch{return w()}}function te(e){try{localStorage.setItem(C,JSON.stringify(e))}catch{}}function ne(e){return e===``?null:T().blocks[e]??null}function re(e,t){if(e===``)return;let n=T(),r=n.order.filter(t=>t!==e);r.unshift(e);let i={...n.blocks,[e]:t};for(;r.length>200;){let e=r.pop();e!==void 0&&delete i[e]}te({order:r,blocks:i})}function E(e){let t=5381;for(let n=0;n>>0;return t.toString(36)}function ie(e,t,n){return`f:${e}:${String(t)}:${E(n)}`}function ae(e,t){return`p:${e}:${E(t)}`}function oe(e,t){return`t:${e}:${t}`}let D={maxDepth:8,maxNodes:200,maxString:2e3,maxCode:12e3,maxMermaid:8e3,maxGridCols:12,maxTabs:12,maxAccordionItems:24,maxListItems:50,maxOptions:50,maxTableRows:50,maxTableCols:12,maxChartPoints:60,maxPlotSeries:8,maxPlotParams:6,maxMeshes:5,maxQuizOptions:8,maxSteps:24,maxTimelineItems:24,maxBreadcrumbItems:12,maxKeyValuePairs:24,maxTreeDepth:6};function se(e,t){return typeof e==`string`&&t.includes(e)}function O(e,t){return typeof e==`string`?e.slice(0,t):void 0}let ce=/^(?:#[\da-fA-F]{3,8}|rgba?\([^)]{0,64}\)|hsla?\([^)]{0,64}\)|var\(--dsw-[\w-]+(?:,\s*#[0-9a-fA-F]{3,8})?\))$/;function k(e){if(typeof e!=`string`)return;let t=e.trim();return t.length<=64&&ce.test(t)?t:void 0}function le(e){if(typeof e!=`string`)return;let t=e.trim();if(!(t.length>2048))return/^https?:\/\//i.test(t)||/^mailto:[^@\s]+@[^@\s]+$/i.test(t)?t:void 0}function A(e,t,n){return typeof e==`number`&&Number.isFinite(e)?Math.min(n,Math.max(t,e)):void 0}function j(e,t,n){return typeof e==`number`&&Number.isFinite(e)?Math.min(n,Math.max(t,Math.trunc(e))):void 0}function M(e,t){return se(e,t)?e:void 0}function N(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function P(e,t){return t===void 0?{}:{[e]:t}}let ue=[`h1`,`h2`,`h3`,`body`,`muted`,`caption`],de=[`primary`,`danger`,`success`,`ghost`],fe=[`success`,`warn`,`danger`,`accent`],pe=[`text`,`email`,`password`],me=[`info`,`success`,`warning`,`error`],he=[`bars`,`line`,`donut`],ge=[`line`,`area`,`scatter`],_e=[`box`,`sphere`,`cone`,`cylinder`,`torus`],ve=[`file`,`dir`];function F(e,t,n){if(!Array.isArray(e))return[];let r=[];for(let i of e){if(t.remaining<=0)break;--t.remaining;let e=ye(i,t,n);e!==null&&r.push(e)}return r}function ye(e,t,n){if(n>D.maxDepth)return null;let r=N(e);if(r===void 0)return null;let i=r.type;if(typeof i!=`string`)return null;switch(i){case`text`:{let e=O(r.content,D.maxString);return e===void 0?null:{type:`text`,content:e,...P(`size`,M(r.size,ue)),...P(`center`,r.center===!0||void 0)}}case`row`:return{type:`row`,items:F(r.items,t,n+1),...P(`wrap`,r.wrap===!0||void 0),...P(`spacer`,r.spacer===!0||void 0)};case`col`:return{type:`col`,items:F(r.items,t,n+1),...P(`gap`,A(r.gap,0,96))};case`grid`:return{type:`grid`,cols:j(r.cols,1,D.maxGridCols)??1,items:F(r.items,t,n+1)};case`card`:return{type:`card`,items:F(r.items,t,n+1),...P(`title`,O(r.title,D.maxString))};case`button`:{let e=O(r.label,D.maxString);return e===void 0?null:{type:`button`,label:e,...P(`tone`,M(r.tone,de)),...P(`full`,r.full===!0||void 0),...P(`small`,r.small===!0||void 0),...P(`icon`,O(r.icon,64)),...P(`action`,O(r.action,200))}}case`input`:return{type:`input`,...P(`label`,O(r.label,D.maxString)),...P(`placeholder`,O(r.placeholder,D.maxString)),...P(`value`,O(r.value,D.maxString)),...P(`inputType`,M(r.inputType,pe)),...P(`action`,O(r.action,200)),...P(`id`,O(r.id,200))};case`select`:{let e=I(r.options,D.maxOptions,D.maxString);return e===void 0?null:{type:`select`,options:e,...P(`label`,O(r.label,D.maxString)),...P(`action`,O(r.action,200)),...P(`selected`,j(r.selected,0,e.length-1)),...P(`id`,O(r.id,200))}}case`checkbox`:{let e=O(r.label,D.maxString);return e===void 0?null:{type:`checkbox`,label:e,...P(`checked`,r.checked===!0||void 0),...P(`action`,O(r.action,200))}}case`link`:{let e=O(r.label,D.maxString);return e===void 0?null:{type:`link`,label:e,...P(`href`,le(r.href))}}case`badge`:{let e=O(r.label,D.maxString);return e===void 0?null:{type:`badge`,label:e,...P(`tone`,M(r.tone,fe)),...P(`icon`,O(r.icon,64))}}case`stat`:{let e=O(r.label,D.maxString),t=O(r.value,128);return e===void 0||t===void 0?null:{type:`stat`,label:e,value:t,...P(`delta`,O(r.delta,64))}}case`progress`:{let e=A(r.value,0,100);return e===void 0?null:{type:`progress`,value:e,...P(`label`,O(r.label,D.maxString)),...P(`valueLabel`,O(r.valueLabel,64))}}case`divider`:return{type:`divider`};case`spacer`:return{type:`spacer`};case`avatar`:{let e=O(r.name,64);return e===void 0?null:{type:`avatar`,name:e,...P(`color`,k(r.color))}}case`list`:{let e=be(r.items,D.maxListItems);return e===void 0?null:{type:`list`,items:e}}case`table`:{let e=I(r.columns,D.maxTableCols,128),t=xe(r.rows,D.maxTableRows,D.maxTableCols);return e===void 0||t===void 0?null:{type:`table`,columns:e,rows:t}}case`chart`:{let e=Se(r.data,D.maxChartPoints),t=Array.isArray(r.series)?Ce(r.series,D.maxPlotSeries,D.maxChartPoints):void 0;return e===void 0&&t===void 0?null:{type:`chart`,data:e??[],...P(`kind`,M(r.kind,he)),...P(`series`,t)}}case`tabs`:{let e=we(r.tabs,t,n);return e===void 0?null:{type:`tabs`,tabs:e}}case`plot`:{let e=Te(r.series,D.maxPlotSeries);return e===void 0?null:{type:`plot`,series:e,...P(`xMin`,A(r.xMin,-1e6,1e6)),...P(`xMax`,A(r.xMax,-1e6,1e6)),...P(`yMin`,A(r.yMin,-1e9,1e9)),...P(`yMax`,A(r.yMax,-1e9,1e9)),...P(`title`,O(r.title,D.maxString))}}case`callout`:{let e=O(r.content,D.maxString);return e===void 0?null:{type:`callout`,content:e,...P(`tone`,M(r.tone,me)),...P(`title`,O(r.title,D.maxString))}}case`steps`:{let e=Ee(r.steps);return e===void 0?null:{type:`steps`,steps:e,...P(`current`,j(r.current,0,e.length))}}case`keyvalue`:{let e=De(r.pairs,D.maxKeyValuePairs);return e===void 0?null:{type:`keyvalue`,pairs:e}}case`diff`:{let e=Oe(r.diffs);return e===void 0?null:{type:`diff`,diffs:e}}case`json`:return`value`in r?{type:`json`,value:r.value}:null;case`code`:{let e=O(r.code,D.maxCode);return e===void 0?null:{type:`code`,code:e,...P(`lang`,O(r.lang,64))}}case`radio`:{let e=I(r.options,D.maxOptions,D.maxString);return e===void 0?null:{type:`radio`,options:e,...P(`label`,O(r.label,D.maxString)),...P(`selected`,j(r.selected,0,e.length-1)),...P(`action`,O(r.action,200)),...P(`group`,O(r.group,200)),...P(`answer`,typeof r.answer==`number`&&Number.isFinite(r.answer)&&r.answer>=0&&r.answer=t)break;typeof i==`string`&&r.push(i.slice(0,n))}return r}function be(e,t){if(!Array.isArray(e))return;let n=[];for(let r of e){if(n.length>=t)break;if(typeof r==`string`){n.push(r.slice(0,D.maxString));continue}let e=N(r),i=e===void 0?void 0:O(e.title,D.maxString);i!==void 0&&n.push({title:i,...P(`desc`,e===void 0?void 0:O(e.desc,D.maxString))})}return n}function xe(e,t,n){if(!Array.isArray(e))return;let r=[];for(let i of e){if(r.length>=t)break;if(!Array.isArray(i))continue;let e=[];for(let t of i){if(e.length>=n)break;typeof t==`string`?e.push(t.slice(0,256)):typeof t==`number`&&Number.isFinite(t)&&e.push(t)}e.length>0&&r.push(e)}return r}function Se(e,t){if(!Array.isArray(e))return;let n=[];for(let r of e){if(n.length>=t)break;let e=N(r),i=e===void 0?void 0:O(e.label,128),a=e===void 0?void 0:A(e.value,-0xe8d4a51000,0xe8d4a51000);i!==void 0&&a!==void 0&&n.push({label:i,value:a,...P(`color`,e===void 0?void 0:k(e.color))})}return n}function Ce(e,t,n){if(!Array.isArray(e))return;let r=[];for(let i of e){if(r.length>=t)break;let e=N(i),a=e===void 0?void 0:O(e.label,128),o=e===void 0?void 0:Se(e.data,n);a!==void 0&&o!==void 0&&r.push({label:a,data:o,...P(`color`,e===void 0?void 0:k(e.color))})}return r}function we(e,t,n){if(!Array.isArray(e))return;let r=[];for(let i of e){if(r.length>=D.maxTabs)break;let e=N(i),a=e===void 0?void 0:O(e.label,128);a!==void 0&&e!==void 0&&r.push({label:a,items:F(e.items,t,n+1)})}return r}function Te(e,t){if(!Array.isArray(e))return;let n=[];for(let r of e){if(n.length>=t)break;let e=N(r),i=e===void 0?void 0:O(e.expr,512);if(i===void 0||e===void 0)continue;let a=[];if(Array.isArray(e.params))for(let t of e.params){if(a.length>=D.maxPlotParams)break;let e=N(t),n=e===void 0?void 0:O(e.name,64),r=e===void 0?void 0:A(e.value,-1e9,1e9);n!==void 0&&r!==void 0&&a.push({name:n,value:r,...P(`min`,e===void 0?void 0:A(e.min,-1e9,1e9)),...P(`max`,e===void 0?void 0:A(e.max,-1e9,1e9)),...P(`step`,e===void 0?void 0:A(e.step,1e-9,1e9)),...P(`animateTo`,e===void 0?void 0:A(e.animateTo,-1e9,1e9)),...P(`durationMs`,e===void 0?void 0:A(e.durationMs,1,12e4)),...P(`loop`,e===void 0?void 0:e.loop===!0||void 0)})}n.push({expr:i,...P(`label`,O(e.label,128)),...P(`color`,k(e.color)),...P(`kind`,M(e.kind,ge)),...P(`params`,a.length>0?a:void 0)})}return n}function Ee(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(t.length>=D.maxSteps)break;let e=N(n),r=e===void 0?void 0:O(e.title,256);r!==void 0&&t.push({title:r,...P(`desc`,e===void 0?void 0:O(e.desc,D.maxString))})}return t}function De(e,t){if(!Array.isArray(e))return;let n=[];for(let r of e){if(n.length>=t)break;let e=N(r),i=e===void 0?void 0:O(e.key,256),a=e===void 0?void 0:O(e.value,D.maxString);i!==void 0&&a!==void 0&&n.push({key:i,value:a})}return n}function Oe(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(t.length>=24)break;let e=N(n),r=e===void 0?void 0:O(e.path,1024),i=e===void 0?void 0:O(e.newText,2e4);if(r===void 0||i===void 0)continue;let a=e===void 0?void 0:e.oldText;t.push({path:r,newText:i,oldText:a===null||typeof a!=`string`?null:a.slice(0,2e4)})}return t}function ke(e,t,n){if(!Array.isArray(e))return;let r=[];for(let i of e){if(r.length>=D.maxAccordionItems)break;let e=N(i),a=e===void 0?void 0:O(e.title,256);a!==void 0&&e!==void 0&&r.push({title:a,items:F(e.items,t,n+1)})}return r}function Ae(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(t.length>=D.maxMeshes)break;let e=N(n),r=e===void 0?void 0:M(e.shape,_e);if(r===void 0)continue;let i=e===void 0?void 0:A(e.scale,-1e6,1e6)??L(e.scale),a=e===void 0?void 0:A(e.size,-1e6,1e6)??L(e.size);t.push({shape:r,...P(`color`,e===void 0?void 0:k(e.color)),...P(`position`,e===void 0?void 0:L(e.position)),...P(`rotation`,e===void 0?void 0:L(e.rotation)),...P(`scale`,i),...P(`size`,a)})}return t}function L(e){if(!Array.isArray(e)||e.length!==3)return;let[t,n,r]=e;if(!(typeof t!=`number`||!Number.isFinite(t)||typeof n!=`number`||!Number.isFinite(n)||typeof r!=`number`||!Number.isFinite(r)))return[Math.min(1e6,Math.max(-1e6,t)),Math.min(1e6,Math.max(-1e6,n)),Math.min(1e6,Math.max(-1e6,r))]}function je(e,t){if(!Array.isArray(e))return;let n=[];for(let r of e){if(n.length>=t)break;let e=N(r),i=e===void 0?void 0:O(e.title,256);i!==void 0&&n.push({title:i,...P(`desc`,e===void 0?void 0:O(e.desc,D.maxString)),...P(`time`,e===void 0?void 0:O(e.time,128))})}return n}function Me(e,t){return Ne(e,t,D.maxTreeDepth)}function Ne(e,t,n){if(!Array.isArray(e))return;let r=[];for(let i of e){if(r.length>=t)break;let e=N(i),a=e===void 0?void 0:O(e.name,256);if(a===void 0)continue;let o=e!==void 0&&n>0&&Array.isArray(e.children)?Ne(e.children,t,n-1):void 0;r.push({name:a,...P(`type`,e===void 0?void 0:M(e.type,ve)),...P(`children`,o)})}return r}function Pe(e){if(!Array.isArray(e))return;let t=[];for(let n of e){if(t.length>=D.maxQuizOptions)break;let e=N(n),r=e===void 0?void 0:O(e.label,512);r!==void 0&&t.push({label:r,...P(`correct`,e===void 0?void 0:e.correct===!0||void 0),...P(`feedback`,e===void 0?void 0:O(e.feedback,D.maxString))})}return t}function R(e){let t=N(e);if(t===void 0||!Array.isArray(t.items))return null;let n={remaining:D.maxNodes};return{...P(`title`,O(t.title,D.maxString)),...P(`gap`,A(t.gap,0,96)),...P(`panel`,t.panel===!0||void 0),...P(`append`,t.append===!0||void 0),items:F(t.items,n,0)}}function Fe(e,t=1/0){let n=0,r=e=>{if(Array.isArray(e))for(let i of e){if(n>=t)return;n+=1;let e=N(i);if(e!==void 0){if(e.type===`tabs`&&Array.isArray(e.tabs))for(let i of e.tabs){if(n>=t)return;let e=N(i);e!==void 0&&r(e.items)}else if(e.type===`accordion`&&Array.isArray(e.items))for(let i of e.items){if(n>=t)return;let e=N(i);e!==void 0&&r(e.items)}else e.type===`file-tree`&&Array.isArray(e.items)&&r(e.items)}}},i=N(e);return r(i===void 0?[]:i.items),n}let Ie=[`var(--dsw-static-deepseek-400)`,`var(--dsw-static-deepseek-450)`,`var(--dsw-static-blue-450)`,`var(--dsw-static-green-400)`,`var(--dsw-static-amber-400)`,`var(--dsw-static-red-400)`,`var(--dsw-static-deepseek-300)`,`var(--dsw-static-neutral-bluish-400)`];function Le(e){let t=0;for(let n=0;n>>0;return Ie[t%Ie.length]}function Re({className:e,disabled:t,onClick:n,children:r}){let[i,a]=(0,m.useState)(!1),o=(0,m.useRef)(null);return(0,m.useEffect)(()=>()=>{o.current!==null&&clearTimeout(o.current)},[]),(0,h.jsxs)(`button`,{type:`button`,className:e,disabled:t,onClick:n===void 0?void 0:()=>{n(),o.current!==null&&clearTimeout(o.current),a(!0),o.current=setTimeout(()=>a(!1),1400)},children:[r,i&&(0,h.jsx)(`span`,{className:S.btnSent,children:`✓ 已触发`})]})}let ze=[`var(--dsw-static-deepseek-400)`,`var(--dsw-static-green-400)`,`var(--dsw-static-amber-400)`,`var(--dsw-static-red-400)`,`var(--dsw-static-blue-450)`,`var(--dsw-static-deepseek-450)`,`var(--dsw-static-neutral-bluish-400)`,`var(--dsw-static-deepseek-300)`],z=(e,t,n)=>n??(t>1?ze[e%ze.length]:void 0);function Be({node:e}){let t=e.columns.slice(0,D.maxTableCols),n=e.rows.slice(0,D.maxTableRows),[r,i]=(0,m.useState)(null),a=r===null?n:[...n].sort((e,t)=>{let n=e[r.col],i=t[r.col],a=typeof n==`number`?n:n===``?NaN:Number(n),o=typeof i==`number`?i:i===``?NaN:Number(i);if(Number.isFinite(a)&&Number.isFinite(o)&&a!==o)return(a-o)*r.dir;let s=String(n??``),c=String(i??``);return(sc))*r.dir}),o=e=>{i(t=>t!==null&&t.col===e?t.dir===1?{col:e,dir:-1}:null:{col:e,dir:1})};return(0,h.jsx)(`div`,{className:S.tableWrap,children:(0,h.jsxs)(`table`,{className:S.table,children:[(0,h.jsx)(`thead`,{children:(0,h.jsx)(`tr`,{children:t.map((e,t)=>(0,h.jsx)(`th`,{"aria-sort":r!==null&&r.col===t?r.dir===1?`ascending`:`descending`:`none`,children:(0,h.jsxs)(`button`,{type:`button`,className:S.thSort,onClick:()=>o(t),children:[e,r!==null&&r.col===t&&(0,h.jsx)(`span`,{className:S.thSortMark,"aria-hidden":!0,children:r.dir===1?` ▲`:` ▼`})]})},t))})}),(0,h.jsx)(`tbody`,{children:a.map((e,n)=>(0,h.jsx)(`tr`,{children:e.slice(0,t.length).map((e,t)=>(0,h.jsx)(`td`,{children:String(e)},t))},n))})]})})}function Ve({chart:e}){let t=e.kind??`bars`;return t===`donut`?(0,h.jsx)(We,{chart:e}):t===`line`?(0,h.jsx)(Ue,{chart:e}):(0,h.jsx)(He,{chart:e})}function He({chart:e}){let t=e.series===void 0?void 0:e.series.slice(0,D.maxPlotSeries);if(t!==void 0&&t.length>0){let e=t[0].data.map(e=>e.label),n=Math.max(...t.flatMap(e=>e.data.map(e=>Number(e.value)||0)),1);return(0,h.jsxs)(`div`,{className:S.chart,children:[(0,h.jsxs)(`div`,{className:S.chartPlot,children:[[0,25,50,75].map(e=>(0,h.jsx)(`span`,{className:e===0?S.baseline:S.gridline,style:{bottom:`${e}%`}},e)),e.map((e,r)=>(0,h.jsx)(`div`,{className:S.barCol,children:(0,h.jsx)(`div`,{className:S.groupedBars,children:t.map((e,i)=>{let a=e.data[r],o=a===void 0?0:Number(a.value)||0,s=a===void 0?0:Math.min(Math.round(Math.max(0,o)/n*100),82);return(0,h.jsxs)(`div`,{className:S.groupedBar,title:a===void 0?e.label:`${e.label}: ${String(a.value)}`,children:[(0,h.jsx)(`span`,{className:S.groupValue,children:a===void 0?``:String(a.value)}),(0,h.jsx)(`div`,{className:S.groupedFill,style:{height:`${s}%`,background:z(i,t.length,e.color)??`var(--dsw-alias-state-business-primary, #4f8ef7)`}})]},i)})})},r))]}),(0,h.jsx)(`div`,{className:S.chartLabels,children:e.map(e=>(0,h.jsx)(`span`,{className:S.barLabel,children:e},e))})]})}let n=e.data.slice(0,D.maxChartPoints),r=Math.max(...n.map(e=>Number(e.value)||0),1);return(0,h.jsxs)(`div`,{className:S.chart,children:[(0,h.jsxs)(`div`,{className:S.chartPlot,children:[[0,25,50,75].map(e=>(0,h.jsx)(`span`,{className:e===0?S.baseline:S.gridline,style:{bottom:`${e}%`}},e)),n.map((e,t)=>{let n=Number(e.value)||0,i=Math.min(Math.round(Math.max(0,n)/r*100),85);return(0,h.jsxs)(`div`,{className:S.barCol,title:`${e.label}: ${String(e.value)}`,children:[(0,h.jsx)(`span`,{className:S.barValue,children:String(e.value)}),(0,h.jsx)(`div`,{className:S.barFill,style:{height:`${i}%`,...e.color===void 0?{}:{background:e.color}}})]},t)})]}),(0,h.jsx)(`div`,{className:S.chartLabels,children:n.map(e=>(0,h.jsx)(`span`,{className:S.barLabel,children:e.label},e.label))})]})}function Ue({chart:e}){let t=e.data.slice(0,D.maxChartPoints),n=Math.max(...t.map(e=>Number(e.value)||0),1),r=Math.min(...t.map(e=>Number(e.value)||0),0),i=n-r||1,a=Math.max(t.length-1,1),o=(e,t)=>[36+e/a*416,10+(1-(t-r)/i)*134],s=t.map((e,t)=>o(t,Number(e.value)||0)).map((e,t)=>`${t===0?`M`:`L`} ${e[0].toFixed(1)} ${e[1].toFixed(1)}`).join(` `),c=[0,1,2,3].map(e=>r+i*e/3),l=e=>{let t=Math.abs(e);return t>=1e3?`${(e/1e3).toFixed(t%1e3==0?0:1)}k`:Number.isInteger(e)?String(e):e.toFixed(1)};return(0,h.jsxs)(`div`,{className:S.lineChart,children:[(0,h.jsxs)(`svg`,{width:`100%`,viewBox:`0 0 460 150`,children:[c.map((e,t)=>{let n=10+(1-(e-r)/i)*134;return(0,h.jsxs)(`g`,{children:[(0,h.jsx)(`line`,{x1:36,x2:452,y1:n,y2:n,className:t===0?S.lineGridAxis:S.lineGrid}),(0,h.jsx)(`text`,{x:30,y:n+3,textAnchor:`end`,className:S.lineTick,children:l(e)})]},t)}),t.map((e,t)=>{let[n,r]=o(t,Number(e.value)||0);return(0,h.jsx)(`circle`,{cx:n,cy:r,r:3,className:S.lineDot,fill:e.color??void 0,children:(0,h.jsx)(`title`,{children:`${e.label}: ${String(e.value)}`})},t)}),(0,h.jsx)(`path`,{d:s,className:S.linePath})]}),(0,h.jsx)(`div`,{className:S.lineLabels,children:t.map((e,t)=>(0,h.jsx)(`span`,{className:S.barLabel,children:e.label},t))})]})}function We({chart:e}){let t=e.data.slice(0,D.maxChartPoints),n=t.map(e=>({...e,v:Math.max(0,Number(e.value)||0)})),r=n.reduce((e,t)=>e+t.v,0)||1,i=2*Math.PI*42,a=0;return(0,h.jsxs)(`div`,{className:S.donut,children:[(0,h.jsxs)(`svg`,{width:`120`,height:`120`,viewBox:`0 0 120 120`,children:[(0,h.jsx)(`circle`,{cx:`60`,cy:`60`,r:42,fill:`none`,strokeWidth:`14`,className:S.donutTrack}),n.map((e,n)=>{let o=e.v/r*i,s=(0,h.jsx)(`circle`,{cx:`60`,cy:`60`,r:42,fill:`none`,strokeWidth:`14`,style:{stroke:z(n,t.length,e.color)??`var(--dsw-alias-state-business-primary, #4f8ef7)`},strokeDasharray:`${o} ${i-o}`,strokeDashoffset:-a,transform:`rotate(-90 60 60)`,children:(0,h.jsx)(`title`,{children:`${e.label}: ${String(e.value)}`})},n);return a+=o,s}),(0,h.jsx)(`text`,{x:`60`,y:`58`,textAnchor:`middle`,className:S.donutTotal,children:r>=1e3?`${Math.round(r/100)/10}k`:String(r)}),(0,h.jsx)(`text`,{x:`60`,y:`74`,textAnchor:`middle`,className:S.donutTotalLabel,children:`合计`})]}),(0,h.jsx)(`div`,{className:S.donutLegend,children:t.map((e,n)=>(0,h.jsxs)(`span`,{className:S.legendItem,children:[(0,h.jsx)(`span`,{className:S.legendSwatch,style:{background:z(n,t.length,e.color)??`var(--dsw-alias-state-business-primary, #4f8ef7)`}}),e.label,` · `,String(e.value)]},n))})]})}function Ge({node:e,onAction:t,answers:n}){let r=e.action,i=e.group,a=i!==void 0,o=e.options.slice(0,D.maxOptions),s=i!==void 0&&n?.answers[i]!==void 0?o.indexOf(n.answers[i]):-1,[c,l]=(0,m.useState)(s>=0?s:e.selected??null),u=(0,m.useId)(),d=a&&n?.locked===!0;return(0,m.useEffect)(()=>{i!==void 0&&(n?.registerMeta(i,{label:e.label??i,options:o,answer:e.answer,explanation:e.explanation}),e.selected!==void 0&&o[e.selected]!==void 0&&n?.answers[i]===void 0&&n?.setAnswer(i,o[e.selected]))},[i,e.label,e.answer,e.explanation,e.options,e.selected]),(0,h.jsxs)(`div`,{className:S.fieldGroup,role:`radiogroup`,"aria-label":e.label,children:[e.label!==void 0&&(0,h.jsx)(`span`,{className:S.fieldLabel,children:e.label}),o.map((e,o)=>(0,h.jsxs)(`label`,{className:S.radio,children:[(0,h.jsx)(`input`,{type:`radio`,name:`genui-radio-${u}`,checked:c===o,disabled:d,onChange:()=>{l(o),a?n?.setAnswer(i,e):r!==void 0&&t!==void 0&&t(r,{type:`radio`,value:e})}}),(0,h.jsx)(`span`,{children:e})]},o))]})}function Ke(e){if(e.answer!==void 0)return typeof e.answer==`number`?e.options[e.answer]:e.answer}function qe({node:e,onAction:t,answers:n}){let r=n?.answers??{},i=n?.fields??{},a=n?.meta??{},o=e.groups,s=Object.fromEntries(Object.entries(i).filter(([e,t])=>t.trim()!==``&&!n?.secretFields.has(e))),c=o===void 0?Math.max(Object.keys(r).length,Object.keys(s).length):o.filter(e=>r[e]!==void 0).length,l=o?.length??c,u=o??Object.keys(r),d=u.some(e=>a[e]?.answer!==void 0),f=n?.locked===!0,p=c>0&&c>=l&&(d||e.action!==void 0&&t!==void 0);if(f){let i=u.filter(e=>r[e]!==void 0&&a[e]?.answer!==void 0),s=i.filter(e=>r[e]===Ke(a[e])).length;return(0,h.jsxs)(`div`,{className:S.gradeWrap,"data-genui-grade":!0,children:[(0,h.jsxs)(`div`,{className:S.gradeScore,children:[(0,h.jsxs)(`span`,{className:S.gradeScoreValue,children:[s,` / `,i.length]}),(0,h.jsxs)(`span`,{className:S.gradeScoreLabel,children:[`得分`,i.length{let t=r[e],n=a[e];if(t===void 0||n===void 0)return null;let i=Ke(n);if(i===void 0)return(0,h.jsxs)(`div`,{className:S.gradeItem,children:[(0,h.jsx)(`span`,{className:S.gradeQ,children:n.label}),(0,h.jsxs)(`span`,{className:S.gradeAns,children:[`你的答案:`,t]})]},e);let o=t===i;return(0,h.jsxs)(`div`,{className:`${S.gradeItem} ${o?S.gradeItemOk:S.gradeItemNo}`,children:[(0,h.jsx)(`span`,{className:S.gradeQ,children:n.label}),(0,h.jsx)(`span`,{className:S.gradeTag,children:o?`✓`:`✗`}),(0,h.jsxs)(`span`,{className:S.gradeAns,children:[`你的答案:`,t,!o&&(0,h.jsxs)(`span`,{className:S.gradeRight,children:[` 正确答案:`,i]})]}),n.explanation!==void 0&&(0,h.jsx)(`span`,{className:S.gradeExp,children:n.explanation})]},e)})}),(0,h.jsx)(`button`,{type:`button`,className:`${S.button} ${S.ghost} ${S.submit}`,onClick:()=>{n?.clear(),e.resetAction!==void 0&&t!==void 0&&t(e.resetAction,{type:`submit-reset`,groups:o??Object.keys(r)})},children:`重新作答`})]})}return(0,h.jsxs)(`div`,{className:S.submitRow,children:[(0,h.jsx)(`button`,{type:`button`,className:`${S.button} ${S.primary} ${S.submit}`,disabled:!p,onClick:p?()=>{d?n?.setLocked(!0):e.action!==void 0&&t!==void 0&&t(e.action,{type:`submit`,answers:r,...Object.keys(s).length>0?{fields:s}:{},total:l,answered:c})}:void 0,children:e.label}),l>0&&(0,h.jsxs)(`span`,{className:S.submitHint,"aria-live":`polite`,children:[`已选 `,c,`/`,l]})]})}function Je({node:e,onAction:t}){let[n,r]=(0,m.useState)(e.checked===!0),i=e.action;return(0,h.jsxs)(`label`,{className:S.switchRow,children:[(0,h.jsx)(`span`,{className:S.switchLabel,children:e.label}),(0,h.jsx)(`button`,{type:`button`,role:`switch`,"aria-checked":n,className:`${S.switch} ${n?S.switchOn:``}`,onClick:()=>{let e=!n;r(e),i!==void 0&&t!==void 0&&t(i,{type:`switch`,checked:e})},children:(0,h.jsx)(`span`,{className:S.switchKnob})})]})}function Ye({node:e,onAction:t,answers:n}){let r=e.action,i=e.id,a=i!==void 0&&n?.fields[i]!==void 0?Number(n.fields[i]):NaN,o=Number.isFinite(a)?a:e.value??e.min??0,[s,c]=(0,m.useState)(o),l=(0,m.useRef)(!1);(0,m.useEffect)(()=>{l.current||(l.current=!0,i!==void 0&&n?.setField(i,String(o)))},[]);let u=e=>{r!==void 0&&t!==void 0&&t(r,{type:`slider`,value:e,...i===void 0?{}:{id:i}})};return(0,h.jsxs)(`label`,{className:S.sliderRow,children:[e.label!==void 0&&(0,h.jsx)(`span`,{className:S.fieldLabel,children:e.label}),(0,h.jsx)(`input`,{type:`range`,className:S.sliderInput,min:e.min,max:e.max,step:e.step??1,value:s,"aria-label":e.label,onChange:e=>{let t=Number(e.currentTarget.value);c(t),i!==void 0&&n?.setField(i,String(t)),u(t)}}),(0,h.jsx)(`span`,{className:S.sliderValue,children:Math.round(s*100)/100})]})}function Xe(){let e=(0,m.useRef)(!1),t=(0,m.useRef)(null);return(0,m.useEffect)(()=>()=>{t.current!==null&&clearTimeout(t.current)},[]),{isComposing:()=>e.current,onCompositionStart:()=>{e.current=!0,t.current!==null&&(clearTimeout(t.current),t.current=null)},onCompositionEnd:()=>{t.current!==null&&clearTimeout(t.current),t.current=setTimeout(()=>{e.current=!1},10)}}}function Ze(e){let t=e.nativeEvent;return t.isComposing===!0||t.keyCode===229}function Qe({node:e,onAction:t,answers:n}){let r=e.action,i=e.id,a=e.options.slice(0,D.maxOptions),o=i!==void 0&&n?.fields[i]!==void 0?a.indexOf(n.fields[i]):-1,s=o>=0?a[o]:e.selected!==void 0&&a[e.selected]!==void 0?a[e.selected]:null,[c,l]=(0,m.useState)(s),u=(0,m.useRef)(!1);(0,m.useEffect)(()=>{u.current||(u.current=!0,i!==void 0&&s!==null&&n?.setField(i,s))},[]);let d=e=>{r!==void 0&&t!==void 0&&t(r,{type:`select`,value:e,...i===void 0?{}:{id:i}})};return(0,h.jsxs)(`label`,{className:S.field,children:[e.label!==void 0&&(0,h.jsx)(`span`,{children:e.label}),(0,h.jsxs)(`select`,{className:S.select,value:c??``,onChange:e=>{let t=e.currentTarget.value;l(t),i!==void 0&&n?.setField(i,t),d(t)},children:[c===null&&(0,h.jsx)(`option`,{value:``,hidden:!0,disabled:!0,children:`请选择…`}),a.map((e,t)=>(0,h.jsx)(`option`,{value:e,children:e},t))]})]})}function $e({node:e,onAction:t,answers:n}){let r=e.action,i=e.id,a=e.inputType===`password`,[o,s]=(0,m.useState)(()=>a?``:e.value??(i===void 0?``:n?.fields[i]??``)),c=(0,m.useRef)(o),l=e=>{r!==void 0&&t!==void 0&&(c.current=o,t(r,{type:`input`,value:o,...i===void 0?{}:{id:i},...e?{submit:!0}:{}}))},u=Xe(),d=(0,m.useRef)(!1);return(0,m.useEffect)(()=>{d.current||(d.current=!0,!a&&i!==void 0&&e.value!==void 0&&e.value.trim()!==``&&n?.setField(i,e.value))},[]),(0,m.useEffect)(()=>{a&&i!==void 0&&n?.registerSecretField(i)},[a,i]),(0,h.jsxs)(`label`,{className:S.field,children:[e.label!==void 0&&(0,h.jsx)(`span`,{children:e.label}),(0,h.jsx)(`input`,{className:S.input,type:e.inputType??`text`,placeholder:e.placeholder,value:o,onChange:e=>{let t=e.currentTarget.value;s(t),i!==void 0&&n?.setField(i,t)},onBlur:()=>{o!==c.current&&l(!1)},onCompositionStart:u.onCompositionStart,onCompositionEnd:u.onCompositionEnd,onKeyDown:e=>{e.key===`Enter`&&(u.isComposing()||Ze(e)||(e.preventDefault(),l(!0)))}})]})}function et({node:e,onAction:t,answers:n}){let r=e.action,i=e.id,[a,o]=(0,m.useState)(()=>e.value??(i===void 0?``:n?.fields[i]??``)),s=(0,m.useRef)(a),c=e=>{r!==void 0&&t!==void 0&&(s.current=a,t(r,{type:`textarea`,value:a,...i===void 0?{}:{id:i},...e?{submit:!0}:{}}))},l=Xe(),u=(0,m.useRef)(!1);return(0,m.useEffect)(()=>{u.current||(u.current=!0,i!==void 0&&e.value!==void 0&&e.value.trim()!==``&&n?.setField(i,e.value))},[]),(0,h.jsxs)(`label`,{className:S.field,children:[e.label!==void 0&&(0,h.jsx)(`span`,{children:e.label}),(0,h.jsx)(`textarea`,{className:S.textarea,placeholder:e.placeholder,rows:e.rows??4,value:a,onChange:e=>{let t=e.currentTarget.value;o(t),i!==void 0&&n?.setField(i,t)},onBlur:()=>{a!==s.current&&c(!1)},onCompositionStart:l.onCompositionStart,onCompositionEnd:l.onCompositionEnd,onKeyDown:e=>{!(e.metaKey||e.ctrlKey)||e.key!==`Enter`||l.isComposing()||Ze(e)||(e.preventDefault(),c(!0))}})]})}let tt={pi:Math.PI,e:Math.E,tau:Math.PI*2},nt={sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,sqrt:Math.sqrt,cbrt:Math.cbrt,exp:Math.exp,log:Math.log10,ln:Math.log,abs:Math.abs,floor:Math.floor,ceil:Math.ceil,round:Math.round,min:Math.min,max:Math.max,pow:(e,t)=>e**+t};var B=class extends Error{pos;constructor(e,t){super(`SafeMath parse error at ${t}: ${e}`),this.pos=t}},rt=class{src;vars;i=0;constructor(e,t){this.src=e,this.vars=t}parse(){let e=this.parseExpr();if(this.skipWs(),this.ie:e}parseExpr(){let e=this.parseTerm();for(;;){this.skipWs();let t=this.peek();if(t===`+`||t===`-`){this.i++;let n=this.parseTerm(),r=t,i=e;e=r===`+`?e=>this.asNum(i,e)+this.asNum(n,e):e=>this.asNum(i,e)-this.asNum(n,e)}else return e}}parseTerm(){let e=this.parseUnary();for(;;){this.skipWs();let t=this.peek();if(t===`*`||t===`/`||t===`%`){this.i++;let n=this.parseUnary(),r=t,i=e;e=r===`*`?e=>this.asNum(i,e)*this.asNum(n,e):r===`/`?e=>this.asNum(i,e)/this.asNum(n,e):e=>this.asNum(i,e)%this.asNum(n,e)}else return e}}parseUnary(){this.skipWs();let e=this.char();if(e===`-`||e===`+`){this.i++;let t=this.parseUnary();return e===`-`?e=>-this.asNum(t,e):e=>this.asNum(t,e)}return this.parsePower()}parsePower(){let e=this.parseAtom();if(this.skipWs(),this.peek()===`^`){this.i++;let t=this.parsePower(),n=e;return e=>this.asNum(n,e)**+this.asNum(t,e)}return e}parseAtom(){this.skipWs();let e=this.char();if(e===`(`){this.i++;let e=this.parseExpr();if(this.skipWs(),this.peek()!==`)`)throw new B(`expected )`,this.i);return this.i++,e}if(e>=`0`&&e<=`9`||e===`.`)return this.parseNumber();if(this.isIdentStart(e))return this.parseIdent();throw new B(`unexpected character '${e}'`,this.i)}parseNumber(){let e=this.i;for(;this.in(...r.map(t=>this.asNum(t,e)))}if(Object.hasOwn(tt,t))return tt[t];if(t===`x`)return e=>e;if(Object.hasOwn(this.vars,t)){let e=this.vars[t];return()=>e}if(/^[a-z]$/.test(t))return()=>1;throw new B(`unknown identifier '${t}'`,e)}asNum(e,t){return typeof e==`number`?e:e(t)}skipWs(){for(;this.in??(t>1?st[e%st.length]:void 0);function lt(e){let t=1/0,n=-1/0;for(let[,r]of e)rn&&(n=r);if(!Number.isFinite(t)||!Number.isFinite(n))return[-1,1];t===n&&(--t,n+=1);let r=(n-t)*.08;return[t-r,n+r]}function ut(e,t,n=5){let r=t-e;if(!Number.isFinite(r)||r<=0)return[];let i=10**Math.floor(Math.log10(r/n)),a=r/n/i,o=i*(a>=7.5?10:a>=3.5?5:a>=1.5?2:1),s=[];for(let n=Math.ceil(e/o)*o;n<=t+o*1e-9;n+=o)s.push(Math.round(n*1e9)/1e9);return s}function dt(e){return Math.abs(e)>=1e5||Math.abs(e)<.001&&e!==0?e.toExponential(1):String(Math.round(e*100)/100)}function ft({points:e,className:t,color:n}){let r=e.length>40?`${e.slice(0,16)}|${e.slice(-16)}`:e;return(0,h.jsx)(`polyline`,{points:e,className:t,style:n===void 0?void 0:{stroke:n}},r)}let pt=(0,m.memo)(function({series:e,xMin:t=-5,xMax:n=5,yMin:r,yMax:i,title:a}){let[o,s]=(0,m.useState)(()=>{let a={};for(let[t,n]of e.entries())for(let e of n.params??[])e!=null&&(a[`${t}:${e.name}`]=e.value);let[o,s]=lt(e.map((e,r)=>{let i={};for(let t of e.params??[])t!=null&&(i[t.name]=a[`${r}:${t.name}`]??t.value);return at(e.expr,t,n,240,i)}).flatMap(e=>e));return{xMin:t,xMax:n,yMin:r??o,yMax:i??s}}),c=(0,m.useRef)(null),[l,u]=(0,m.useState)(()=>({})),d=(()=>{for(let[t,n]of e.entries())for(let e of n.params??[])if(e!=null&&e.animateTo!==void 0)return{si:t,param:e};return null})(),[f,p]=(0,m.useState)(!1),[ee,g]=(0,m.useState)(0),_=(0,m.useRef)(null);(0,m.useEffect)(()=>{if(!f||d===null)return;let e=l[`${d.si}:${d.param.name}`]??d.param.value,t=d.param.animateTo,n=d.param.durationMs??4e3,r=performance.now(),i=a=>{let o=Math.min(1,(a-r)/n),s=1-(1-o)**3,c=e+(t-e)*s;u(e=>({...e,[`${d.si}:${d.param.name}`]:c})),g(o),o<1?_.current=requestAnimationFrame(i):d.param.loop===!0?(u(e=>({...e,[`${d.si}:${d.param.name}`]:d.param.value})),g(0),_.current=requestAnimationFrame(()=>p(e=>e))):p(!1)};return _.current=requestAnimationFrame(i),()=>{_.current!==null&&cancelAnimationFrame(_.current)}},[f,d?.si,d?.param.name,d?.param.animateTo]);let v=o.xMin,y=o.xMax,b=o.yMin,x=o.yMax,S=e=>v+(e-34)/436*(y-v),C=e=>34+(e-v)/(y-v)*436,w=e=>14+(1-(e-b)/(x-b))*182,T=e.map((e,t)=>{let n={};for(let r of e.params??[])r!=null&&(n[r.name]=l[`${t}:${r.name}`]??r.value);return{series:e,points:at(e.expr,v,y,240,n).map(([e,t])=>`${C(e).toFixed(2)},${w(t).toFixed(2)}`).join(` `)}}),te=ut(v,y),ne=ut(b,x),re=T.some(e=>e.points.length>1),E=Number.isFinite(v)&&Number.isFinite(y)&&y>v&&Number.isFinite(x)&&Number.isFinite(b)&&x>b,ie=(e,t,n)=>{let r=ct(t,T.length,e.color)??`var(--dsw-alias-state-business-primary, #4f8ef7)`,i=e.kind??`line`;if(i===`scatter`){let e=n===``?[]:n.split(` `).map(e=>{let[t,n]=e.split(`,`);return[Number(t),Number(n)]});return(0,h.jsx)(`g`,{children:e.map(([e,t],n)=>(0,h.jsx)(`circle`,{cx:e,cy:t,r:2.6,className:V.scatterDot,style:{fill:r}},n))},t)}if(i===`area`){if(n===``)return(0,h.jsx)(ft,{points:``,className:V.line,color:r},t);let e=n.slice(0,n.indexOf(` `)).split(`,`)[0],i=n.slice(n.lastIndexOf(` `)+1).split(`,`)[0],a=w(b),o=`${e},${a.toFixed(2)} ${n} ${i},${a.toFixed(2)}`;return(0,h.jsx)(`polygon`,{points:o,className:V.area,style:{fill:r}},t)}return(0,h.jsx)(ft,{points:n,className:V.line,color:r},t)},ae=e=>{c.current={startX:e.clientX,startY:e.clientY,xMin:v,xMax:y},e.target.setPointerCapture?.(e.pointerId)},oe=e=>{let t=c.current;if(t===null)return;let n=t.xMax-t.xMin,r=(t.startX-e.clientX)/436*n;s(e=>({xMin:t.xMin+r,xMax:t.xMax+r,yMin:e.yMin,yMax:e.yMax}))},D=()=>{c.current=null},se=e=>{let t=y-v,n=t*(e.deltaY>0?1.15:1/1.15),r=e.currentTarget.getBoundingClientRect(),i=S((e.clientX-r.left)/r.width*480),a=i-(i-v)/t*n;s(e=>({xMin:a,xMax:a+n,yMin:e.yMin,yMax:e.yMax}))},O=e.some(e=>(e.params?.length??0)>0);return(0,h.jsxs)(`div`,{className:V.block,"data-genui-plot":!0,children:[a!==void 0&&(0,h.jsx)(`div`,{className:V.title,children:a}),re&&E?(0,h.jsxs)(`svg`,{width:`100%`,viewBox:`0 0 480 220`,role:`img`,"aria-label":a??`function plot`,className:V.surface,onPointerDown:ae,onPointerMove:oe,onPointerUp:D,onPointerLeave:D,onWheel:se,children:[ne.map(e=>(0,h.jsxs)(`g`,{children:[(0,h.jsx)(`line`,{x1:34,x2:470,y1:w(e),y2:w(e),className:V.gridLine}),(0,h.jsx)(`text`,{x:28,y:w(e)+4,className:V.tick,textAnchor:`end`,children:dt(e)})]},`y${e}`)),te.map(e=>(0,h.jsxs)(`g`,{children:[(0,h.jsx)(`line`,{x1:C(e),x2:C(e),y1:14,y2:196,className:V.gridLine}),(0,h.jsx)(`text`,{x:C(e),y:210,className:V.tick,textAnchor:`middle`,children:dt(e)})]},`x${e}`)),(0,h.jsx)(`line`,{x1:34,x2:470,y1:196,y2:196,className:V.axis}),(0,h.jsx)(`line`,{x1:34,x2:34,y1:14,y2:196,className:V.axis}),T.map(({series:e,points:t},n)=>ie(e,n,t))]}):(0,h.jsx)(`div`,{className:V.empty,children:e.map((e,t)=>(0,h.jsxs)(`div`,{className:V.emptyRow,children:[e.expr,` — 无法绘制(表达式无效或范围非法)`]},t))}),O&&(0,h.jsxs)(`div`,{className:V.sliders,children:[(0,h.jsxs)(`div`,{className:V.slidersHead,children:[(0,h.jsx)(`span`,{className:V.slidersTitle,children:`参数调节`}),(0,h.jsx)(`button`,{type:`button`,className:V.resetBtn,onClick:()=>{p(!1);let t={};for(let[n,r]of e.entries())for(let e of r.params??[])e!=null&&(t[`${n}:${e.name}`]=e.value);u(t),g(0)},children:`↺ 重置`})]}),e.map((e,t)=>(e.params??[]).map(n=>{if(n==null)return null;let r=`${t}:${n.name}`,i=l[r]??n.value;return(0,h.jsxs)(`label`,{className:V.sliderRow,children:[(0,h.jsxs)(`span`,{className:V.sliderName,children:[e.label??e.expr,` · `,n.name]}),(0,h.jsx)(`input`,{type:`range`,className:V.slider,min:n.min??0,max:n.max??10,step:n.step??.1,value:i,onChange:e=>{let t=Number(e.currentTarget.value);u(e=>({...e,[r]:t}))}}),(0,h.jsx)(`span`,{className:V.sliderValue,children:Math.round(i*100)/100})]},r)}))]}),d!==null&&(0,h.jsxs)(`div`,{className:V.animBar,children:[(0,h.jsx)(`button`,{type:`button`,className:V.playBtn,onClick:()=>{f?p(!1):(u(e=>({...e,[`${d.si}:${d.param.name}`]:d.param.value})),g(0),p(!0))},children:f?`⏸ 暂停`:`▶ 播放动画`}),f&&(0,h.jsx)(`div`,{className:V.animTrack,children:(0,h.jsx)(`div`,{className:V.animFill,style:{width:`${ee*100}%`}})})]}),(e.length>1||O)&&(0,h.jsx)(`div`,{className:V.legend,children:e.map((t,n)=>(0,h.jsxs)(`span`,{className:V.legendItem,children:[(0,h.jsx)(`span`,{className:V.legendSwatch,style:{background:ct(n,e.length,t.color)??`var(--dsw-alias-state-business-primary, #4f8ef7)`}}),t.label??t.expr]},n))})]})});function H(e){let t=window.__DSH_BOOT__?.entries?.find(e=>e.id===U)?.rev;return`${ht}/${e}${t===void 0?``:`?rev=${t}`}`}function mt(e){let t=`${e}.js`,n=gt.get(t);if(n!==void 0)return n;let r=new Promise((n,r)=>{let i=document.createElement(`script`);i.src=H(t),i.async=!0,i.onload=()=>{let i=(window.__GenuiAssets__??{})[e];if(i===void 0){r(Error(`genui asset '${t}' loaded but registered no '${e}' engine`));return}n(i)},i.onerror=()=>{r(Error(`genui asset '${t}' failed to load (host asset route missing?)`))},document.head.appendChild(i)});return gt.set(t,r),r}var U,ht,gt,_t=l((()=>{U=`@omdsh-dev/dsh-genui`,ht=`/plugins/${U}/assets`,gt=new Map}));function vt(e){if(bt.test(e))throw Error(`mermaid output failed the sanitization check; refusing to render`)}function yt(e){let t=/^([A-Za-z]+)/.exec(e.trim())?.[1]??``;if(t!==`graph`&&t!==`flowchart`)return e;let n=e.replace(/`/g,``).replace(//gi,` `),r=/(--|==|-\.)(?!>)[ \t]*([^-\n]|-(?!--))*?[ \t]*(-->|==>|\.->)/g,i=[],a=n.replace(r,e=>(i.push(e),`\uE000${i.length-1}\uE001`)),o=/\|([^|\n]*[\[\]][^|\n]*)\|/g,s=[];return a.replace(o,(e,t)=>{let n=t.trim();return n.includes(`"`)?e:(s.push(n),`\uE002${s.length-1}\uE003`)}).replace(/([\[\(])([^\[\]\(\)\{\}"'\n]*)([\]\)])/g,(e,t,n,r)=>{let i=n.trim();return i===``?e:/[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]/.test(i)||/\s/.test(i)?`${t}"${i}"${r}`:e}).replace(/\uE000(\d+)\uE001/g,(e,t)=>i[Number(t)]??e).replace(/\uE002(\d+)\uE003/g,(e,t)=>{let n=s[Number(t)];return n===void 0?e:`|"${n}"|`})}var bt,xt=l((()=>{bt=/vt,renderMermaid:()=>Ct,repairMermaidSource:()=>yt});async function Ct(e){return(await mt(`mermaid`)).renderMermaid(e)}var wt=l((()=>{_t(),xt()})),Tt=u({mountScene:()=>Et});async function Et(e,t){return(await mt(`three`)).mountScene(e,t)}var Dt=l((()=>{_t()}));let Ot={info:S.calloutInfo,success:S.calloutSuccess,warning:S.calloutWarning,error:S.calloutError};function kt({node:e}){let t=e.tone??`info`,n=Ot[t]??S.calloutInfo;return(0,h.jsxs)(`div`,{className:`${S.callout} ${n}`,"data-genui-callout":!0,children:[e.title!==void 0&&(0,h.jsx)(`div`,{className:S.calloutTitle,children:e.title}),(0,h.jsx)(`div`,{className:S.calloutBody,children:e.content})]})}function At({steps:e}){let t=e.steps.slice(0,D.maxSteps),n=e.current??t.length;return(0,h.jsx)(`ol`,{className:S.steps,children:t.map((e,t)=>{let r=t(0,h.jsxs)(`div`,{className:S.kvRow,children:[(0,h.jsx)(`dt`,{className:S.kvKey,children:e.key}),(0,h.jsx)(`dd`,{className:S.kvValue,children:e.value})]},t))})}function Mt({plot:e}){let t=e.series.slice(0,D.maxPlotSeries);return(0,h.jsx)(pt,{series:t.map(e=>({expr:e.expr,label:e.label,color:e.color,kind:e.kind,params:e.params})),xMin:e.xMin,xMax:e.xMax,yMin:e.yMin,yMax:e.yMax,title:e.title})}function Nt({node:e}){return(0,h.jsx)(p.DiffBlock,{diffs:e.diffs})}function Pt({node:e}){let t=e.value;return typeof t!=`object`||!t?(0,h.jsx)(`div`,{className:S.jsonScalar,children:String(t)}):(0,h.jsx)(p.JsonTree,{data:t,copyable:!0})}function Ft({node:e}){return(0,h.jsx)(p.CodeBlock,{code:e.code.slice(0,D.maxCode),lang:e.lang})}function It({tabs:e,onAction:t,depth:n=0,answers:r}){let[i,a]=(0,m.useState)(0),o=(0,m.useId)(),s=e.tabs.slice(0,D.maxTabs),c=s[i],l=e=>{let t=(e+s.length)%s.length;a(t),document.getElementById(`${o}-tab-${t}`)?.focus()};return(0,h.jsxs)(`div`,{className:S.tabs,children:[(0,h.jsx)(`div`,{className:S.tabBar,role:`tablist`,"aria-orientation":`horizontal`,onKeyDown:e=>{e.key===`ArrowRight`?(e.preventDefault(),l(i+1)):e.key===`ArrowLeft`?(e.preventDefault(),l(i-1)):e.key===`Home`?(e.preventDefault(),l(0)):e.key===`End`&&(e.preventDefault(),l(s.length-1))},children:s.map((e,t)=>(0,h.jsx)(`button`,{id:`${o}-tab-${t}`,type:`button`,role:`tab`,"aria-selected":t===i,"aria-controls":`${o}-panel-${t}`,tabIndex:t===i?0:-1,className:`${S.tab} ${t===i?S.tabActive:``}`,onClick:()=>a(t),children:e.label},t))}),c!==void 0&&(0,h.jsx)(`div`,{className:S.col,role:`tabpanel`,id:`${o}-panel-${i}`,"aria-labelledby":`${o}-tab-${i}`,children:c.items.map((e,i)=>W(e,i,t,n+1,r))})]})}function Lt({node:e,onAction:t,depth:n=0,answers:r}){let[i,a]=(0,m.useState)(0),o=(0,m.useId)(),s=e.items.slice(0,D.maxAccordionItems);return(0,h.jsx)(`div`,{className:S.accordion,children:s.map((e,s)=>(0,h.jsxs)(`div`,{className:S.accItem,children:[(0,h.jsxs)(`button`,{type:`button`,className:S.accHead,id:`${o}-head-${s}`,"aria-expanded":i===s,"aria-controls":`${o}-body-${s}`,onClick:()=>a(i===s?null:s),children:[(0,h.jsx)(`span`,{className:S.accTitle,children:e.title}),(0,h.jsx)(`span`,{className:S.accChevron,children:i===s?`▾`:`▸`})]}),i===s&&(0,h.jsx)(`div`,{className:S.accBody,id:`${o}-body-${s}`,"aria-labelledby":`${o}-head-${s}`,children:e.items.map((e,i)=>W(e,i,t,n+1,r))})]},s))})}function Rt({node:e}){let[t,n]=(0,m.useState)(!1);return(0,h.jsx)(`button`,{type:`button`,className:`${S.copyChip} ${t?S.copyChipDone:``}`,onClick:()=>{navigator.clipboard?.writeText(e.text).catch(()=>{}),n(!0),setTimeout(()=>n(!1),1500)},children:t?`✓ 已复制`:e.label??`复制`})}function zt({node:e}){let[t,n]=(0,m.useState)(null),[r,i]=(0,m.useState)(!1),a=e.code.slice(0,D.maxMermaid);return(0,m.useEffect)(()=>{let e=!0;return Promise.resolve().then(()=>(wt(),St)).then(async t=>{try{let r=await t.renderMermaid(a);e&&n(r)}catch{e&&i(!0)}}),()=>{e=!1}},[a]),r?(0,h.jsxs)(`div`,{className:S.mermaidFallback,children:[(0,h.jsx)(`pre`,{children:a}),(0,h.jsx)(`div`,{className:S.mermaidErr,children:`图语法有误,已降级显示源码`})]}):t===null?(0,h.jsxs)(`div`,{className:S.mermaidFallback,children:[(0,h.jsx)(`pre`,{children:a}),(0,h.jsx)(`div`,{className:S.mermaidHint,children:`渲染中…`})]}):(0,h.jsx)(`div`,{className:S.mermaid,dangerouslySetInnerHTML:{__html:t},"data-genui-mermaid":!0})}function Bt({node:e}){let[t,n]=(0,m.useState)(`loading`),r=(0,m.useRef)(null),i=e.meshes.length>D.maxMeshes?{...e,meshes:e.meshes.slice(0,D.maxMeshes)}:e;return(0,m.useEffect)(()=>{let e=!0,t;return Promise.resolve().then(()=>(Dt(),Tt)).then(async a=>{if(!(!e||r.current===null))try{t=await a.mountScene(r.current,i),e&&n(`ready`)}catch{e&&n(`error`)}}),()=>{e=!1,t?.()}},[i]),(0,h.jsxs)(`div`,{className:S.scene3dWrap,"data-genui-scene3d":!0,children:[e.title!==void 0&&(0,h.jsx)(`div`,{className:S.scene3dTitle,children:e.title}),(0,h.jsx)(`div`,{ref:r,className:S.scene3dCanvas}),t===`loading`&&(0,h.jsx)(`div`,{className:S.scene3dHint,children:`加载 3D 场景…`}),t===`error`&&(0,h.jsx)(`div`,{className:S.scene3dHint,children:`3D 渲染失败`})]})}function Vt({node:e}){let t=e.items.slice(0,D.maxTimelineItems);return(0,h.jsx)(`div`,{className:S.timeline,children:t.map((e,n)=>(0,h.jsxs)(`div`,{className:S.tlItem,children:[(0,h.jsxs)(`div`,{className:S.tlRail,children:[(0,h.jsx)(`span`,{className:S.tlDot}),n`${e}-${t}`,i=e=>{n(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},a=(e,n,o)=>{if(n>D.maxTreeDepth)return null;let s=e.type===`dir`||e.children!==void 0&&e.children.length>0,c=r(n,o),l=s&&t.has(c);return(0,h.jsxs)(`div`,{className:S.ftRow,style:{paddingLeft:`${n*16}px`},children:[(0,h.jsxs)(`button`,{type:`button`,className:S.ftNameBtn,"aria-expanded":s?!l:void 0,onClick:s?()=>i(c):void 0,children:[(0,h.jsx)(`span`,{className:`${S.ftIcon} ${s?S.ftIconDir:``}`,"aria-hidden":!0,children:s?l?`▸`:`▾`:`·`}),(0,h.jsx)(`span`,{className:`${S.ftName} ${s?S.ftDir:``}`,children:e.name})]}),s&&!l&&(e.children??[]).map((e,t)=>a(e,n+1,t))]},c)};return(0,h.jsx)(`div`,{className:S.fileTree,children:e.items.slice(0,D.maxListItems).map((e,t)=>a(e,0,t))})}function Ut({node:e,onAction:t}){let[n,r]=(0,m.useState)(null),i=e.options.slice(0,D.maxQuizOptions),a=n!==null,o=n===null?void 0:i[n],s=o?.correct===!0,c=e.action;return(0,h.jsxs)(`div`,{className:S.quiz,"data-genui-quiz":!0,children:[(0,h.jsx)(`div`,{className:S.quizQuestion,children:e.question}),(0,h.jsx)(`div`,{className:S.quizOptions,children:i.map((i,o)=>{let s=n===o,l=a?s?i.correct===!0?S.quizOptCorrect:S.quizOptWrong:i.correct===!0?S.quizOptReveal:S.quizOpt:S.quizOpt;return(0,h.jsxs)(`button`,{type:`button`,className:l,disabled:a,onClick:()=>{r(o),c!==void 0&&t!==void 0&&t(c,{type:`quiz`,question:e.question,answer:i.label,correct:i.correct===!0})},children:[(0,h.jsx)(`span`,{className:S.quizMarker,children:a&&(i.correct===!0?`✓`:s?`✗`:``)}),i.label]},o)})}),a&&(0,h.jsxs)(`div`,{className:S.quizResult,"aria-live":`polite`,children:[(0,h.jsxs)(`div`,{className:s?S.quizCorrectMsg:S.quizWrongMsg,children:[s?`✓ 回答正确!`:`✗ 再想想看`,o?.feedback!==void 0&&(0,h.jsx)(`div`,{className:S.quizFeedback,children:o.feedback})]}),e.explanation!==void 0&&(0,h.jsx)(`div`,{className:S.quizExplanation,children:e.explanation}),(0,h.jsx)(`button`,{type:`button`,className:S.quizRetry,onClick:()=>r(null),children:`重新作答`})]})]})}function Wt({node:e}){let t=e.items.slice(0,D.maxBreadcrumbItems);return(0,h.jsx)(`nav`,{className:S.breadcrumb,"aria-label":`breadcrumb`,children:t.map((e,n)=>(0,h.jsxs)(`span`,{className:S.bcItem,children:[(0,h.jsx)(`span`,{className:`${S.bcText} ${n===t.length-1?S.bcCurrent:``}`,children:e}),nD.maxDepth)return null;switch(e.type){case`text`:{let n=e.size??`body`;return(0,h.jsx)(`div`,{className:`${S.text} ${S[n]}`+(e.center?` ${S.center}`:``),children:e.content},t)}case`row`:return(0,h.jsxs)(`div`,{className:S.row+(e.wrap?` ${S.wrap}`:``),children:[e.items.map((e,t)=>W(e,t,n,r+1,i)),e.spacer&&(0,h.jsx)(`div`,{className:S.spacer})]},t);case`col`:return(0,h.jsx)(`div`,{className:S.col,style:e.gap===void 0?void 0:{gap:`${e.gap}px`},children:e.items.map((e,t)=>W(e,t,n,r+1,i))},t);case`grid`:return(0,h.jsx)(`div`,{className:S.grid,style:{gridTemplateColumns:`repeat(${Math.max(1,e.cols)}, minmax(0, 1fr))`},children:e.items.map((e,t)=>W(e,t,n,r+1,i))},t);case`card`:return(0,h.jsxs)(`div`,{className:S.card,children:[e.title!==void 0&&(0,h.jsx)(`div`,{className:S.cardTitle,children:e.title}),e.items.map((e,t)=>W(e,t,n,r+1,i))]},t);case`button`:{let r=e.tone??``,i=`${S.button} ${S[r]||``}`+(e.full?` ${S.full}`:``)+(e.small?` ${S.small}`:``),a=e.action,o=a!==void 0&&n!==void 0;return(0,h.jsxs)(Re,{className:i,disabled:!o,onClick:o?()=>n(a,{type:`button`,label:e.label}):void 0,children:[e.icon!==void 0&&(0,h.jsxs)(`span`,{"aria-hidden":!0,children:[e.icon,` `]}),e.label]},t)}case`input`:return(0,h.jsx)($e,{node:e,onAction:n,answers:i},t);case`select`:return(0,h.jsx)(Qe,{node:e,onAction:n,answers:i},t);case`checkbox`:{let r=e.action;return(0,h.jsxs)(`label`,{className:S.checkbox,children:[(0,h.jsx)(`input`,{type:`checkbox`,defaultChecked:e.checked===!0,onChange:r!==void 0&&n!==void 0?e=>n(r,{type:`checkbox`,checked:e.currentTarget.checked}):void 0}),(0,h.jsx)(`span`,{children:e.label})]},t)}case`link`:{let n=e.href;return n===void 0?(0,h.jsx)(`span`,{className:S.linkText,children:e.label},t):(0,h.jsx)(`a`,{className:S.link,href:n,target:`_blank`,rel:`noopener noreferrer`,children:e.label},t)}case`badge`:{let n=e.tone??``;return(0,h.jsxs)(`span`,{className:`${S.badge} ${S[n]||``}`,children:[e.icon!==void 0&&(0,h.jsxs)(`span`,{"aria-hidden":!0,children:[e.icon,` `]}),e.label]},t)}case`stat`:{let n=e.delta!==void 0&&e.delta.startsWith(`-`);return(0,h.jsxs)(`div`,{className:S.stat,children:[(0,h.jsx)(`span`,{className:S.statLabel,children:e.label}),(0,h.jsx)(`span`,{className:S.statValue,children:e.value}),e.delta!==void 0&&(0,h.jsx)(`span`,{className:`${S.statDelta} ${n?S.down:S.up}`,children:e.delta})]},t)}case`progress`:{let n=Math.max(0,Math.min(100,Number(e.value)||0));return(0,h.jsxs)(`div`,{className:S.progress,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":n,"aria-label":e.label??e.valueLabel??void 0,children:[(e.label!==void 0||e.valueLabel!==void 0)&&(0,h.jsxs)(`div`,{className:S.progressRow,children:[(0,h.jsx)(`span`,{children:e.label}),e.valueLabel!==void 0&&(0,h.jsx)(`span`,{children:e.valueLabel})]}),(0,h.jsx)(`div`,{className:S.track,children:(0,h.jsx)(`div`,{className:S.fill,style:{width:`${n}%`}})})]},t)}case`divider`:return(0,h.jsx)(`hr`,{className:S.divider},t);case`list`:{let n=e.items.slice(0,D.maxListItems);return(0,h.jsx)(`div`,{className:S.list,children:n.map((e,t)=>(0,h.jsx)(`div`,{className:S.li,children:typeof e==`string`?(0,h.jsx)(`span`,{className:S.liTitle,children:e}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`span`,{className:S.liTitle,children:e.title}),e.desc!==void 0&&(0,h.jsx)(`span`,{className:S.liDesc,children:e.desc})]})},t))},t)}case`table`:return(0,h.jsx)(Be,{node:e},t);case`chart`:return(0,h.jsx)(Ve,{chart:e},t);case`tabs`:return(0,h.jsx)(It,{tabs:e,onAction:n,depth:r+1,answers:i},t);case`avatar`:return(0,h.jsx)(`div`,{className:S.avatar,style:{background:e.color??Le(e.name)},children:e.name.slice(0,1).toUpperCase()},t);case`spacer`:return(0,h.jsx)(`div`,{className:S.spacer},t);case`plot`:return(0,h.jsx)(Mt,{plot:e},t);case`callout`:return(0,h.jsx)(kt,{node:e},t);case`steps`:return(0,h.jsx)(At,{steps:e},t);case`keyvalue`:return(0,h.jsx)(jt,{node:e},t);case`diff`:return(0,h.jsx)(Nt,{node:e},t);case`json`:return(0,h.jsx)(Pt,{node:e},t);case`code`:return(0,h.jsx)(Ft,{node:e},t);case`radio`:return(0,h.jsx)(Ge,{node:e,onAction:n,answers:i},`${t}:r${i?.round??0}`);case`submit`:return(0,h.jsx)(qe,{node:e,onAction:n,answers:i},t);case`switch`:return(0,h.jsx)(Je,{node:e,onAction:n},t);case`slider`:return(0,h.jsx)(Ye,{node:e,onAction:n,answers:i},t);case`textarea`:return(0,h.jsx)(et,{node:e,onAction:n,answers:i},t);case`accordion`:return(0,h.jsx)(Lt,{node:e,onAction:n,depth:r+1,answers:i},t);case`copy`:return(0,h.jsx)(Rt,{node:e},t);case`mermaid`:return(0,h.jsx)(zt,{node:e},t);case`scene3d`:return(0,h.jsx)(Bt,{node:e},t);case`timeline`:return(0,h.jsx)(Vt,{node:e},t);case`file-tree`:return(0,h.jsx)(Ht,{node:e},t);case`breadcrumb`:return(0,h.jsx)(Wt,{node:e},t);case`quiz`:return(0,h.jsx)(Ut,{node:e,onAction:n},t);default:{let a=e,o=Gt?.(a.type);return o===void 0?null:(0,h.jsx)(o,{node:a,onAction:n,renderChildren:(e,t)=>e.map((e,a)=>W(e,Number(t)+a,n,r+1,i))},t)}}}function Kt(e){let t=(0,m.useRef)(null);return(0,m.useEffect)(()=>()=>{let e=t.current;if(e!==null){for(let t of e.values())clearTimeout(t);e.clear()}},[]),(0,m.useMemo)(()=>{if(e===void 0)return;let n=new Map;return t.current=n,(t,r)=>{let i=n.get(t);i!==void 0&&clearTimeout(i),n.set(t,setTimeout(()=>{n.delete(t),e(t,r)},300))}},[e])}function qt(e,t){return e===t||JSON.stringify(e)===JSON.stringify(t)}let Jt=(0,m.memo)(function({spec:e,stateKey:t}){let n=e.gap??16,r=Kt(v()),[i]=(0,m.useState)(()=>t===void 0?null:ne(t)),[a,o]=(0,m.useState)(i?.answers??{}),[s,c]=(0,m.useState)(i?.fields??{}),[l,u]=(0,m.useState)({}),[d,f]=(0,m.useState)(i?.locked===!0),[p,ee]=(0,m.useState)(0),[g,_]=(0,m.useState)(new Set),y=(0,m.useCallback)((e,t)=>{o(n=>n[e]===t?n:{...n,[e]:t})},[]),b=(0,m.useCallback)((e,t)=>{c(n=>{if(t.trim()===``){if(!(e in n))return n;let t={...n};return delete t[e],t}return n[e]===t?n:{...n,[e]:t}})},[]),x=(0,m.useCallback)(e=>{_(t=>t.has(e)?t:new Set(t).add(e))},[]),C=(0,m.useCallback)((e,t)=>{u(n=>{let r=n[e];return r!==void 0&&r.label===t.label&&r.answer===t.answer&&r.explanation===t.explanation?n:{...n,[e]:t}})},[]),w=(0,m.useCallback)(()=>{o({}),f(!1),ee(e=>e+1)},[]),T=(0,m.useMemo)(()=>({answers:a,fields:s,secretFields:g,meta:l,locked:d,round:p,setAnswer:y,setField:b,registerSecretField:x,registerMeta:C,clear:w,setLocked:f}),[a,s,g,l,d,p,y,b,x,C,w]);return(0,m.useEffect)(()=>{if(t===void 0)return;let e=setTimeout(()=>{let e=Object.fromEntries(Object.entries(s).filter(([e])=>!g.has(e)));re(t,{answers:a,locked:d,...Object.keys(e).length>0?{fields:e}:{}})},300);return()=>clearTimeout(e)},[t,a,d,s,g]),(0,h.jsxs)(`div`,{className:S.block,"data-genui":!0,children:[e.title!==void 0&&(0,h.jsx)(`div`,{className:S.banner,children:e.title}),(0,h.jsx)(`div`,{className:S.col,style:{gap:`${n}px`},children:e.items.map((e,t)=>(0,h.jsx)(`div`,{className:S.reveal,style:{animationDelay:`${Math.min(t*90,720)}ms`},children:W(e,t,r,0,T)},t))})]})},(e,t)=>e.stateKey===t.stateKey&&qt(e.spec,t.spec));function Yt(e){if(typeof e!=`object`||!e)return!1;let t=e;return!(!Array.isArray(t.items)||t.title!==void 0&&typeof t.title!=`string`||t.gap!==void 0&&typeof t.gap!=`number`)}function Xt(e){let t=[],n=[],r=e=>{n.length>=32&&n.shift(),n.push(e)},i=!1,a=!1,o=0;for(;ot.end-e.end);let s=[];for(let e of n)(s.length===0||s[s.length-1].end!==e.end)&&s.push(e);return{candidates:s.slice(0,32),scannedChars:o}}function Zt(e){let t=``;for(let n=e.length-1;n>=0;n--)t+=e[n]===`{`?`}`:`]`;return t}function Qt(e){try{let t=JSON.parse(e);return Yt(t)?t:null}catch{return null}}function $t(e){let t=e.trim();if(t===``)return null;let n=Qt(t);if(n!==null)return n;let{candidates:r}=Xt(t);for(let e of r){let n=Qt(t.slice(0,e.end)+e.closingSuffix);if(n!==null)return n}return null}let G={maxNodes:200,maxAppends:200},en=new Map,K=new Set;function tn(){return{ops:new Map,seen:new Map,overflow:null,local:null,localBarrier:-1,replayBarrier:-1,maxSeenSeq:-1,snapshot:null}}let nn=`dsh.genui.panel`;function rn(){try{let e=localStorage.getItem(nn);if(e===null)return{order:[],sessions:{}};let t=JSON.parse(e);return!Array.isArray(t.order)||typeof t.sessions!=`object`||t.sessions===null?{order:[],sessions:{}}:{order:t.order.filter(e=>typeof e==`string`),sessions:t.sessions}}catch{return{order:[],sessions:{}}}}function an(e,t){try{let n=rn(),r=n.order.filter(t=>t!==e);r.unshift(e);let i={...n.sessions,[e]:t};for(;r.length>50;){let e=r.pop();e!==void 0&&delete i[e]}localStorage.setItem(nn,JSON.stringify({order:r,sessions:i}))}catch{}}function on(e){let t=en.get(e);if(t!==void 0)return t;let n=tn();try{let t=rn().sessions[e];t!==void 0&&(n={ops:new Map,seen:new Map,overflow:null,local:t.local??null,localBarrier:t.localBarrier??-1,replayBarrier:t.maxSeenSeq??-1,maxSeenSeq:t.maxSeenSeq??-1,snapshot:t.snapshot??null})}catch{}return en.set(e,n),n}function q(e,t){for(let n=0;n<3;n++){let r=e[n]-t[n];if(r!==0)return r}return 0}function sn(e,t){if(t!==null&&(t.order[0]<=e.localBarrier||t.order[0]<=e.replayBarrier||e.seen.has(t.sourceId)||e.overflow!==null&&e.overflow.sourceId===t.sourceId||t.mode===`append`&&e.overflow!==null&&q(t.order,e.overflow.order)>0))return null;let n=[...e.ops.values()].filter(t=>t.order[0]>e.localBarrier&&t.order[0]>e.replayBarrier);t!==null&&n.push(t),n.sort((e,t)=>q(e.order,t.order));let r=0;for(let e=0;ec&&(c=t.order[0]),t.mode===`replace`){if(Fe(t.spec,G.maxNodes+1)>G.maxNodes){(a===null||q(t.order,a.order)<0)&&(a=t);continue}a=null,i=t.spec,s.length=0,o=0,s.push(t);continue}let r=_n(i,t.spec);if(o>=G.maxAppends||Fe(r,G.maxNodes+1)>G.maxNodes){(a===null||q(t.order,a.order)<0)&&(a=t);continue}i=r,o+=1,s.push(t)}return t!==null&&s.length===e.ops.size&&s.every(t=>e.ops.get(t.sourceId)?.mode===t.mode)&&(a===null&&e.overflow===null||a!==null&&e.overflow!==null&&a.sourceId===e.overflow.sourceId)?null:{snapshot:i,kept:s,overflow:a,maxSeenSeq:c}}function cn(e,t,n){e.snapshot=t.snapshot,e.overflow=t.overflow,e.maxSeenSeq=t.maxSeenSeq,e.ops=new Map(t.kept.map(e=>[e.sourceId,e]));for(let n of t.kept)e.seen.set(n.sourceId,n.order);t.overflow!==null&&e.seen.set(t.overflow.sourceId,t.overflow.order),an(n,{snapshot:e.snapshot,local:e.local,localBarrier:e.localBarrier,maxSeenSeq:e.maxSeenSeq})}function ln(e,t){let n=on(e),r=sn(n,t);if(r===null)return n.seen.has(t.sourceId)||n.overflow?.sourceId===t.sourceId?`idempotent`:(n.overflow!==null&&t.mode===`append`&&q(t.order,n.overflow.order)>0||un(e,t,n),`blocked`);let i=r.overflow!==null&&r.overflow.sourceId===t.sourceId?`overflow`:`accepted`,a=n.snapshot!==r.snapshot;if(cn(n,r,e),a)for(let e of K)e();return i}let J=new Set;function un(e,t,n){let r=`${e}\u0000${t.sourceId}`;J.has(r)||(J.add(r),console.warn(`[genui] 面板操作被重放屏障拒绝(source ${t.sourceId},order[0]=${t.order[0]} ≤ replayBarrier ${n.replayBarrier} / localBarrier ${n.localBarrier})。历史消息重放被拒是预期行为;若是刚发送的新消息,说明消息序号推导异常,请报告。`))}function dn(e,t){let n=on(e),r=n.maxSeenSeq;if(n.local!==t||n.localBarrier!==r){n.local=t,n.localBarrier=r,cn(n,sn(n,null),e);for(let e of K)e()}}let Y=new Set;function fn(e,t){let n=`${e}\u0000${t}`;Y.has(n)||(Y.add(n),console.warn(`[genui] 面板已到节点/操作上限(${G.maxNodes} 节点、${G.maxAppends} 条追加),本次 append 被拒绝;请让模型发送 replace 更新面板。`))}function pn(e){let t=en.delete(e),n=X.delete(e),r=`${e}\u0000`;for(let e of Y)e.startsWith(r)&&Y.delete(e);for(let e of J)e.startsWith(r)&&J.delete(e);if(!(!t&&!n)){for(let e of K)e();for(let e of Z)e()}}function mn(e){return on(e).snapshot}function hn(e){return K.add(e),()=>{K.delete(e)}}function gn(e){if(e.items.length!==1)return null;let t=e.items[0];return t?.type!==`tabs`||!Array.isArray(t.tabs)?null:t.tabs}function _n(e,t){if(e===null||e.items.length===0)return t;let n=e.title??t.title,r={...e,...n===void 0?{}:{title:n}},i=gn(e),a=gn(t);if(i!==null&&a!==null){let e=new Map(i.map(e=>[e.label,{label:e.label,items:[...e.items]}]));for(let t of a){let n=e.get(t.label);n===void 0?e.set(t.label,{label:t.label,items:[...t.items]}):n.items.push(...t.items)}return{...r,items:[{type:`tabs`,tabs:[...e.values()]}]}}return{...r,items:[...e.items,...t.items]}}let X=new Map,Z=new Set;function vn(e){X.set(e,(X.get(e)??0)+1);for(let e of Z)e()}function yn(e){return X.get(e)??0}function bn(e){return Z.add(e),()=>{Z.delete(e)}}function xn(e){try{return JSON.parse(e),!0}catch{return!1}}function Sn(e){try{return JSON.parse(e),null}catch(e){let t=e instanceof Error?e.message:String(e),n=t.match(/position (\d+)/i);return`${n===null?``:`(字符 ${n[1]} 附近)`}${t.slice(0,140)}`}}function Cn(e){try{return JSON.parse(e),null}catch{}let t=``,n=!1,r=!1,i=0;for(let a=0;a0;)t+=n.pop(),a++;if(a===0)return null;try{return JSON.parse(t),{text:t,repairs:a}}catch{return null}}let Cn={margin:`0 0 6px`,padding:`6px 10px`,borderRadius:6,background:`rgba(239, 68, 68, 0.14)`,border:`1px solid rgba(239, 68, 68, 0.4)`,color:`#f87171`,fontSize:12,lineHeight:1.55,whiteSpace:`pre-wrap`};function wn({raw:e,fenceKey:t}){let n=(0,m.useRef)(null),[r,i]=(0,m.useState)(!1);(0,m.useLayoutEffect)(()=>{let e=n.current;e!==null&&e.closest(`[data-streaming]`)===null&&i(!0)});let a=r&&e.trim()!==``?bn(e):null;return(0,h.jsxs)(`div`,{ref:n,children:[a!==null&&(0,h.jsxs)(`div`,{style:Cn,role:`alert`,children:[`⚠️ dsh-ui fence JSON 解析失败`,a,` —— 围栏保持为代码块;请让模型检查并修复 JSON 后重发。`]}),(0,h.jsx)(p.CodeBlock,{code:`${e}\n`,lang:`dsh-ui`},t)]})}function Tn({sessionId:e,sourceId:t,order:n,spec:r}){return(0,m.useEffect)(()=>{cn(e,{sourceId:t,order:n,mode:r.append===!0?`append`:`replace`,spec:r})===`overflow`&&un(e,t)},[e,t,n,r]),null}function En(e,t){let n=G(e),r=n===null?null:R(n);if(r===null){let n=xn(e);if(n!==null){let e=G(n.text);r=e===null?null:R(e)}if(r===null&&t?.source!==void 0){let t=Sn(e);if(t!==null){let e=G(t.text);r=e===null?null:R(e)}}}return r}function Dn(e,t,n){let r=t?.sessionId;return(0,h.jsx)(b,{label:`该界面`,children:(0,h.jsx)(Jt,{spec:n,stateKey:r===void 0?void 0:ie(r,t?.source?.id??String(e),JSON.stringify(n))})},t?.source?.id??e)}function On(e,t,n){let r=En(e,n);return r===null?null:r.panel===!0?n!==void 0&&n.sessionId!==void 0&&n.source!==void 0?r.append===!0&&!yn(e)?(0,h.jsx)(m.Fragment,{},t):(0,h.jsx)(Tn,{sessionId:n.sessionId,sourceId:n.source.id,order:n.source.order,spec:r},t):(0,h.jsx)(m.Fragment,{},t):Dn(t,n,r)}function kn(e,t,n){let r=En(e,n);return r===null?(0,h.jsx)(wn,{fenceKey:t,raw:e},t):r.panel===!0?n!==void 0&&n.sessionId!==void 0&&n.source!==void 0?r.append===!0&&!yn(e)?null:(0,h.jsx)(Tn,{sessionId:n.sessionId,sourceId:n.source.id,order:n.source.order,spec:r},t):null:Dn(t,n,r)}let An=`.md-code-block`,Q=`data-genui-rendered`,jn=`[data-streaming]`;function Mn(e){return e.nodeType===Node.TEXT_NODE}function Nn(e){for(let t of e.querySelectorAll(`div`))if(t.childElementCount===0&&t.textContent===`dsh-ui`)return`dsh-ui`;return null}function Pn(e){for(let t of e.querySelectorAll(`div`))if(t.childElementCount===0)return t.textContent??``;return``}function Fn(e){let t=e.querySelector(`pre`);if(t===null)return``;let n=``;for(let e of t.childNodes)Mn(e),n+=e.textContent??``;return n}function In(e){return e.closest(jn)===null}let Ln=`[data-chat-flow-key], [data-chat-flow-kind]`;function Rn(e){return e.closest(`[data-chat-anchor-key]`)??e.closest(Ln)??e}function zn(e,t){if(e===t){let e=0;for(let n of document.querySelectorAll(An))if(n.closest(jn)===null&&Nn(n)!==null&&(e+=1,n===t))return e;return e+1}let n=0;for(let r of e.querySelectorAll(An))if(r.closest(jn)===null&&Nn(r)!==null&&(n+=1,r===t))return n;return n+1}function Bn(e){let t=e.getAttribute(`data-chat-anchor-key`)??``,n=/(\d+)/.exec(t);if(n!==null){let e=Number(n[1]);if(Number.isFinite(e))return e}let r=document.querySelectorAll(`[data-chat-anchor-key], ${Ln}`);for(let t=0;t`u`)return()=>{};let n=new Map,r=()=>{try{return e.sessions.list.getSnapshot().current}catch{return}};function i(e,t,n){n&&e.getAttribute(`data-chat-anchor-key`)===null&&s(t,`no [data-chat-anchor-key] ancestor for a dsh-ui fence (host render path without row anchor — e.g. Safari); using fallback identity dom:unknown:N`);let i=zn(e,t),a=`dom:${e.getAttribute(`data-chat-anchor-key`)??`unknown`}:${i}`,o=r();return{key:a,context:{...o===void 0?{}:{sessionId:o},...n?{source:{id:a,order:[Bn(e),0,i]}}:{}}}}function a(e){let t=n.get(e);t!==void 0&&(n.delete(e),t.root.unmount(),t.container.remove(),e.style.display=``,e.removeAttribute(Q))}let o=new WeakSet;function s(e,t){o.has(e)||(o.add(e),console.warn(`[dsh-genui] ${t}`))}function c(e){if(e.hasAttribute(Q))return;let a=Rn(e),o=In(e);if(o&&Nn(e)===null)return;let c=Fn(e);if(c.trim()===``){o&&s(e,`settled dsh-ui fence has an empty body; keeping the code block`);return}let{key:l,context:u}=i(a,e,o),d=On(c,l,u);if(d===null){o&&s(e,`settled dsh-ui fence body does not parse; keeping the code block`);return}let f=document.createElement(`div`);f.className=`genui-dom-fence`,e.style.display=`none`,e.after(f),e.setAttribute(Q,``);let p=(0,ee.createRoot)(f);p.render((0,h.jsx)(_.Provider,{value:(e,n)=>{let i=r();i!==void 0&&t(i,e,n)},children:d})),n.set(e,{root:p,container:f,block:e,lastRaw:c,lastSettled:o})}function l(){for(let e of n.values()){let t=e.block;t.isConnected&&(t.style.display!==`none`&&(t.style.display=`none`),t.hasAttribute(Q)||t.setAttribute(Q,``),(e.container.parentElement!==t.parentElement||e.container.previousElementSibling!==t)&&t.after(e.container))}}function u(){for(let[e,o]of n){if(!e.isConnected){a(e);continue}let n=Fn(e),s=In(e);if(s&&!o.lastSettled){let t=Pn(e);if(t!==``&&t!==`dsh-ui`){a(e);continue}}if(o.lastRaw!==n||o.lastSettled!==s){let{key:c,context:l}=i(Rn(e),e,s),u=On(n,c,l);if(u===null){a(e);continue}o.lastRaw=n,o.lastSettled=s,o.root.render((0,h.jsx)(_.Provider,{value:(e,n)=>{let i=r();i!==void 0&&t(i,e,n)},children:u}))}}l();for(let e of Array.from(document.querySelectorAll(An)))c(e)}let d=!1,f=()=>{d||(d=!0,requestAnimationFrame(()=>{d=!1,u()}))},p=new MutationObserver(()=>{l(),f()});p.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`data-streaming`],characterData:!0});let m=window.setInterval(u,1e3);return u(),()=>{p.disconnect(),window.clearInterval(m);for(let e of Array.from(n.keys()))a(e)}}let Hn={title:`GenUI 面板`,items:[{type:`text`,size:`h3`,content:`GenUI 生成式界面`},{type:`text`,size:`muted`,content:`面板会原地更新:对话里说「更新面板」,或再次执行 /panel 刷新。`},{type:`grid`,cols:4,items:[{type:`stat`,label:`组件`,value:`38`},{type:`stat`,label:`单个`,value:`12`},{type:`stat`,label:`组合`,value:`8`},{type:`stat`,label:`高级`,value:`18`}]},{type:`list`,items:[{title:`单个 ×12`,desc:`text button input select checkbox link badge stat progress divider avatar spacer`},{title:`组合 ×8`,desc:`row col grid card list table chart tabs`},{title:`数据 ×7`,desc:`plot callout steps keyvalue diff json code`},{title:`交互 ×5`,desc:`radio switch textarea accordion copy`},{title:`高级 ×5`,desc:`mermaid scene3d timeline file-tree breadcrumb`},{title:`教学 ×1`,desc:`quiz`}]},{type:`callout`,tone:`info`,title:`更新方式`,content:`对话说「更新面板」→ 模型输出 panel:true 围栏;/panel clear 清空面板。`}]};function $(e,t){let n=t.trim().toLowerCase();if(n===`clear`||n===`off`||n===`close`){ln(e,null);return}ln(e,Hn),gn(e)}function Un(e,t){return{token:`/panel`,hint:`开启 GenUI 面板;/panel <指令> 让模型定制;/panel clear 清空`,submit:async(n,r)=>{let i=n.trim();return i===``?$(e,``):/^(clear|off|close)$/i.test(i)?$(e,i):($(e,``),t(e,i)),{kind:`success`}}}}function Wn(e){return{trigger:`/`,name:`genui`,order:60,candidates:async(e,t)=>[{name:`panel`,description:`开启 GenUI 面板(/panel clear 清空;/panel <指令> 定制内容)`,hint:`/panel`}],onPick(t){return{claim:Un(t.session.sessionId,e)}},matchEnter:async(t,n,r)=>{if(/^\/panel(?:\s|$)/.test(n.trim()))return{claim:Un(t.sessionId,e)}}}}function Gn({sessionId:e,sendGenuiAction:t}){let n=(0,m.useSyncExternalStore)(pn,()=>fn(e)),r=(0,m.useSyncExternalStore)(vn,()=>_n(e)),[i,a]=(0,m.useState)(!0),[o,s]=(0,m.useState)(null),[c,l]=(0,m.useState)(!1),u=(0,m.useRef)(null),d=(0,m.useRef)(null);(0,m.useEffect)(()=>{r>0&&a(!1)},[r]),(0,m.useEffect)(()=>()=>{dn(e)},[e]),(0,m.useEffect)(()=>{if(c)return()=>{u.current=null}},[c]);let f=(0,m.useCallback)(e=>{e.preventDefault();let t=e.currentTarget,n=o??360;u.current={y:e.clientY,height:n},l(!0);try{t.setPointerCapture(e.pointerId)}catch{}let r=e=>{let t=u.current;if(t===null)return;let n=Math.min(600,Math.max(120,t.height+(t.y-e.clientY)));s(n)},i=()=>{u.current=null,l(!1),t.removeEventListener(`pointermove`,r),t.removeEventListener(`pointerup`,i),t.removeEventListener(`pointercancel`,i)};t.addEventListener(`pointermove`,r),t.addEventListener(`pointerup`,i),t.addEventListener(`pointercancel`,i)},[o]);return n===null||n.items.length===0?null:(0,h.jsxs)(`div`,{className:S.panel,"data-genui-panel":!0,children:[!i&&(0,h.jsx)(`div`,{role:`separator`,"aria-orientation":`horizontal`,"aria-label":`调整面板高度`,className:`${S.panelResizeHandle}${c?` ${S.panelResizeHandleActive}`:``}`,onPointerDown:f}),(0,h.jsx)(`div`,{className:S.panelHeader,children:(0,h.jsxs)(`button`,{type:`button`,className:S.panelToggle,"aria-expanded":!i,onClick:()=>a(e=>!e),children:[(0,h.jsx)(`span`,{className:S.panelBadge,children:`面板`}),(0,h.jsx)(`span`,{className:S.panelTitle,children:n.title??`GenUI 面板`}),(0,h.jsx)(`span`,{className:S.panelChevron,"aria-hidden":!0,children:i?`▸`:`▾`})]})}),!i&&(0,h.jsx)(`div`,{ref:d,className:S.panelBody,"data-genui-panel-body":!0,style:o===null?void 0:{height:o},children:(0,h.jsx)(_.Provider,{value:t,children:(0,h.jsx)(b,{label:`面板`,children:(0,h.jsx)(Jt,{spec:n,stateKey:ae(e,JSON.stringify(n))})})})})]})}function Kn({toolName:e,block:t,sessionId:n}){let r=`meta`in t?t.meta:void 0,i=(0,m.useMemo)(()=>r===void 0?null:R(r),[r]);return(0,m.useEffect)(()=>{i!==null&&i.items.length>0&&cn(n,{sourceId:JSON.stringify([`render_ui`,t.callId]),order:[`seq`in t&&typeof t.seq==`number`?t.seq:0,-1,0],mode:`replace`,spec:i})},[n,i,t]),i===null||i.items.length===0?(0,h.jsxs)(`div`,{className:S.toolFallback,"data-genui-tool":!0,children:[(0,h.jsx)(`span`,{className:S.toolFallbackTitle,children:e}),(0,h.jsx)(`span`,{className:S.toolFallbackMeta,children:t.callId})]}):(0,h.jsx)(`div`,{className:S.tool,"data-genui-tool":!0,children:(0,h.jsx)(b,{label:`工具卡片`,children:(0,h.jsx)(Jt,{spec:i,stateKey:oe(n,t.callId)})})})}_t();function qn(){if(!(typeof document>`u`))for(let e of[`mermaid.js`,`three.js`]){if(document.head.querySelector(`link[rel="prefetch"][href="${H(e)}"]`)!==null)continue;let t=document.createElement(`link`);t.rel=`prefetch`,t.as=`script`,t.href=H(e),document.head.appendChild(t)}}function Jn(e,t){let n=e.sessions.scope(t)?.get(`conversation`);return{sessionId:t,sendGenuiAction:(e,r)=>{if(n===void 0)return;let i=Object.keys(r).length===0?``:` 组件数据: ${JSON.stringify(r)}`;n.send(`[genui-action] ${e}。用户刚刚在面板中触发了动作 "${e}",请根据组件数据执行相应操作,只输出一个 panel:true 的 dsh-ui 围栏来更新面板,回复文本至多一行 10 字以内的确认(如"已刷新"),不要解释、不要普通围栏。${i}`).catch(n=>{console.warn(`[genui] 面板动作 "${e}" 发送失败(session ${t}):`,n instanceof Error?n.message:String(n))})}}}function Yn(e,t,n){let r=e.sessions.scope(t)?.get(`conversation`);r!==void 0&&r.send(`用户执行了 /panel 并请求:${n}。请只输出一个 panel:true 的 dsh-ui 围栏来更新会话面板,内容按请求定制;回复文本至多一行 10 字以内的确认(如"已更新"),不要解释、不要普通围栏。`).catch(e=>{console.warn(`[genui] /panel 指令发送失败(session ${t}):`,e instanceof Error?e.message:String(e))})}function Xn(e,t,n,r){let i=e.sessions.scope(t)?.get(`conversation`);if(i===void 0)return;let a=Object.keys(r).length===0?``:` 组件数据: ${JSON.stringify(r)}`;i.send(`[genui-action] ${n}。用户刚刚在界面中触发了动作 "${n}",请根据组件数据执行相应操作,并用 dsh-ui 输出更新后的界面。${a}`).catch(()=>{})}function Zn(e){let t=p.registerFenceRenderer,n=typeof t==`function`?[t(`dsh-ui`,kn)]:(console.info(`[genui] fence-registry 扩展点不存在(原版 DSH)——启用 DOM 渲染通道`),[Vn(e,(t,n,r)=>Xn(e,t,n,r))]);qn(),n.push(e.slots.inject(`tool.call.toolview`,()=>e.slots.register({name:`tool.call.toolview`,key:`render_ui`},Kn))),n.push(e.slots.inject(`conversation.input.dock`,()=>e.slots.register({name:`conversation.input.dock`,id:`genui-panel`,order:50,inject:t=>Jn(e,t)},Gn)));let r=e.get(`inputTriggers`);return r===void 0?console.warn(`[genui] inputTriggers service unavailable; /panel command disabled`):n.push(e.effect(()=>r.registerSource(Wn((t,n)=>Yn(e,t,n))),`genui: /panel`)),()=>{for(let e of n)e()}}return n.apply=Zn,n.inject=[`slots`,`sessions`,`inputTriggers`],n.prefetchGenuiAssets=qn,n.renderGenuiFence=kn,t.exports}}); \ No newline at end of file +`||e[t]===`\r`);)t++;let n=t0;)t+=n.pop(),a++;if(a===0)return null;try{return JSON.parse(t),{text:t,repairs:a}}catch{return null}}let Tn={margin:`0 0 6px`,padding:`6px 10px`,borderRadius:6,background:`rgba(239, 68, 68, 0.14)`,border:`1px solid rgba(239, 68, 68, 0.4)`,color:`#f87171`,fontSize:12,lineHeight:1.55,whiteSpace:`pre-wrap`};function En({raw:e,fenceKey:t}){let n=(0,m.useRef)(null),[r,i]=(0,m.useState)(!1);(0,m.useLayoutEffect)(()=>{let e=n.current;e!==null&&e.closest(`[data-streaming]`)===null&&i(!0)});let a=r&&e.trim()!==``?Sn(e):null;return(0,h.jsxs)(`div`,{ref:n,children:[a!==null&&(0,h.jsxs)(`div`,{style:Tn,role:`alert`,children:[`⚠️ dsh-ui fence JSON 解析失败`,a,` —— 围栏保持为代码块;请让模型检查并修复 JSON 后重发。`]}),(0,h.jsx)(p.CodeBlock,{code:`${e}\n`,lang:`dsh-ui`},t)]})}function Dn({sessionId:e,sourceId:t,order:n,spec:r}){return(0,m.useEffect)(()=>{ln(e,{sourceId:t,order:n,mode:r.append===!0?`append`:`replace`,spec:r})===`overflow`&&fn(e,t)},[e,t,n,r]),null}function On(e,t){let n=$t(e),r=n===null?null:R(n);if(r===null){let n=Cn(e);if(n!==null){let e=$t(n.text);r=e===null?null:R(e)}if(r===null&&t?.source!==void 0){let t=wn(e);if(t!==null){let e=$t(t.text);r=e===null?null:R(e)}}}return r}function kn(e,t,n){let r=t?.sessionId;return(0,h.jsx)(b,{label:`该界面`,children:(0,h.jsx)(Jt,{spec:n,stateKey:r===void 0?void 0:ie(r,t?.source?.id??String(e),JSON.stringify(n))})},t?.source?.id??e)}function An(e,t,n){let r=On(e,n);return r===null?null:r.panel===!0?n!==void 0&&n.sessionId!==void 0&&n.source!==void 0?r.append===!0&&!xn(e)?(0,h.jsx)(m.Fragment,{},t):(0,h.jsx)(Dn,{sessionId:n.sessionId,sourceId:n.source.id,order:n.source.order,spec:r},t):(0,h.jsx)(m.Fragment,{},t):kn(t,n,r)}function jn(e,t,n){let r=On(e,n);return r===null?(0,h.jsx)(En,{fenceKey:t,raw:e},t):r.panel===!0?n!==void 0&&n.sessionId!==void 0&&n.source!==void 0?r.append===!0&&!xn(e)?null:(0,h.jsx)(Dn,{sessionId:n.sessionId,sourceId:n.source.id,order:n.source.order,spec:r},t):null:kn(t,n,r)}let Mn=`.md-code-block`,Q=`data-genui-rendered`,Nn=`[data-streaming]`;function Pn(e){return e.nodeType===Node.TEXT_NODE}function $(e){for(let t of e.querySelectorAll(`div`))if(t.childElementCount===0&&t.textContent===`dsh-ui`)return`dsh-ui`;return null}function Fn(e){for(let t of e.querySelectorAll(`div`))if(t.childElementCount===0)return t.textContent??``;return``}function In(e){let t=e.querySelector(`pre`);if(t===null)return``;let n=``;for(let e of t.childNodes)Pn(e),n+=e.textContent??``;return n}function Ln(e){return e.closest(Nn)===null}let Rn=`[data-chat-flow-key], [data-chat-flow-kind]`;function zn(e){return e.closest(`[data-chat-anchor-key]`)??e.closest(Rn)??e}function Bn(e,t){if(e===t){let e=0;for(let n of document.querySelectorAll(Mn))if(n.closest(Nn)===null&&$(n)!==null&&(e+=1,n===t))return e;return e+1}let n=0;for(let r of e.querySelectorAll(Mn))if(r.closest(Nn)===null&&$(r)!==null&&(n+=1,r===t))return n;return n+1}function Vn(e){let t=e.getAttribute(`data-chat-anchor-key`)??``,n=/assistant-step(\d+):(\d+)$/.exec(t);if(n!==null){let e=Number(n[1]),t=Number(n[2]);if(Number.isFinite(e)&&Number.isFinite(t))return e*1e3+t}let r=document.querySelectorAll(`[data-chat-anchor-key], ${Rn}`);for(let t=0;t`u`)return()=>{};let n=new Map,r=()=>{try{return e.sessions.list.getSnapshot().current}catch{return}};function i(e,t,n){n&&e.getAttribute(`data-chat-anchor-key`)===null&&s(t,`no [data-chat-anchor-key] ancestor for a dsh-ui fence (host render path without row anchor — e.g. Safari); using fallback identity dom:unknown:N`);let i=Bn(e,t),a=`dom:${e.getAttribute(`data-chat-anchor-key`)??`unknown`}:${i}`,o=r();return{key:a,context:{...o===void 0?{}:{sessionId:o},...n?{source:{id:a,order:[Vn(e),0,i]}}:{}}}}function a(e){let t=n.get(e);t!==void 0&&(n.delete(e),t.root.unmount(),t.container.remove(),e.style.display=``,e.removeAttribute(Q))}let o=new WeakSet;function s(e,t){o.has(e)||(o.add(e),console.warn(`[dsh-genui] ${t}`))}function c(e){if(e.hasAttribute(Q))return;let a=zn(e),o=Ln(e);if(o&&$(e)===null)return;let c=In(e);if(c.trim()===``){o&&s(e,`settled dsh-ui fence has an empty body; keeping the code block`);return}let{key:l,context:u}=i(a,e,o),d=An(c,l,u);if(d===null){o&&s(e,`settled dsh-ui fence body does not parse; keeping the code block`);return}let f=document.createElement(`div`);f.className=`genui-dom-fence`,e.style.display=`none`,e.after(f),e.setAttribute(Q,``);let p=(0,ee.createRoot)(f);p.render((0,h.jsx)(_.Provider,{value:(e,n)=>{let i=r();i!==void 0&&t(i,e,n)},children:d})),n.set(e,{root:p,container:f,block:e,lastRaw:c,lastSettled:o})}function l(){for(let e of n.values()){let t=e.block;t.isConnected&&(t.style.display!==`none`&&(t.style.display=`none`),t.hasAttribute(Q)||t.setAttribute(Q,``),(e.container.parentElement!==t.parentElement||e.container.previousElementSibling!==t)&&t.after(e.container))}}function u(){for(let[e,o]of n){if(!e.isConnected){a(e);continue}let n=In(e),s=Ln(e);if(s&&!o.lastSettled){let t=Fn(e);if(t!==``&&t!==`dsh-ui`){a(e);continue}}if(o.lastRaw!==n||o.lastSettled!==s){let{key:c,context:l}=i(zn(e),e,s),u=An(n,c,l);if(u===null){a(e);continue}o.lastRaw=n,o.lastSettled=s,o.root.render((0,h.jsx)(_.Provider,{value:(e,n)=>{let i=r();i!==void 0&&t(i,e,n)},children:u}))}}l();for(let e of Array.from(document.querySelectorAll(Mn)))c(e)}let d=!1,f=()=>{d||(d=!0,requestAnimationFrame(()=>{d=!1,u()}))},p=new MutationObserver(()=>{l(),f()});p.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`data-streaming`],characterData:!0});let m=window.setInterval(u,1e3);return u(),()=>{p.disconnect(),window.clearInterval(m);for(let e of Array.from(n.keys()))a(e)}}let Un={title:`GenUI 面板`,items:[{type:`text`,size:`h3`,content:`GenUI 生成式界面`},{type:`text`,size:`muted`,content:`面板会原地更新:对话里说「更新面板」,或再次执行 /panel 刷新。`},{type:`grid`,cols:4,items:[{type:`stat`,label:`组件`,value:`38`},{type:`stat`,label:`单个`,value:`12`},{type:`stat`,label:`组合`,value:`8`},{type:`stat`,label:`高级`,value:`18`}]},{type:`list`,items:[{title:`单个 ×12`,desc:`text button input select checkbox link badge stat progress divider avatar spacer`},{title:`组合 ×8`,desc:`row col grid card list table chart tabs`},{title:`数据 ×7`,desc:`plot callout steps keyvalue diff json code`},{title:`交互 ×5`,desc:`radio switch textarea accordion copy`},{title:`高级 ×5`,desc:`mermaid scene3d timeline file-tree breadcrumb`},{title:`教学 ×1`,desc:`quiz`}]},{type:`callout`,tone:`info`,title:`更新方式`,content:`对话说「更新面板」→ 模型输出 panel:true 围栏;/panel clear 清空面板。`}]};function Wn(e,t){let n=t.trim().toLowerCase();if(n===`clear`||n===`off`||n===`close`){dn(e,null);return}dn(e,Un),vn(e)}function Gn(e,t){return{token:`/panel`,hint:`开启 GenUI 面板;/panel <指令> 让模型定制;/panel clear 清空`,submit:async(n,r)=>{let i=n.trim();return i===``?Wn(e,``):/^(clear|off|close)$/i.test(i)?Wn(e,i):(Wn(e,``),t(e,i)),{kind:`success`}}}}function Kn(e){return{trigger:`/`,name:`genui`,order:60,candidates:async(e,t)=>[{name:`panel`,description:`开启 GenUI 面板(/panel clear 清空;/panel <指令> 定制内容)`,hint:`/panel`}],onPick(t){return{claim:Gn(t.session.sessionId,e)}},matchEnter:async(t,n,r)=>{if(/^\/panel(?:\s|$)/.test(n.trim()))return{claim:Gn(t.sessionId,e)}}}}function qn({sessionId:e,sendGenuiAction:t}){let n=(0,m.useSyncExternalStore)(hn,()=>mn(e)),r=(0,m.useSyncExternalStore)(bn,()=>yn(e)),[i,a]=(0,m.useState)(!0),[o,s]=(0,m.useState)(null),[c,l]=(0,m.useState)(!1),u=(0,m.useRef)(null),d=(0,m.useRef)(null);(0,m.useEffect)(()=>{r>0&&a(!1)},[r]),(0,m.useEffect)(()=>()=>{pn(e)},[e]),(0,m.useEffect)(()=>{if(c)return()=>{u.current=null}},[c]);let f=(0,m.useCallback)(e=>{e.preventDefault();let t=e.currentTarget,n=o??360;u.current={y:e.clientY,height:n},l(!0);try{t.setPointerCapture(e.pointerId)}catch{}let r=e=>{let t=u.current;if(t===null)return;let n=Math.min(600,Math.max(120,t.height+(t.y-e.clientY)));s(n)},i=()=>{u.current=null,l(!1),t.removeEventListener(`pointermove`,r),t.removeEventListener(`pointerup`,i),t.removeEventListener(`pointercancel`,i)};t.addEventListener(`pointermove`,r),t.addEventListener(`pointerup`,i),t.addEventListener(`pointercancel`,i)},[o]);return n===null||n.items.length===0?null:(0,h.jsxs)(`div`,{className:S.panel,"data-genui-panel":!0,children:[!i&&(0,h.jsx)(`div`,{role:`separator`,"aria-orientation":`horizontal`,"aria-label":`调整面板高度`,className:`${S.panelResizeHandle}${c?` ${S.panelResizeHandleActive}`:``}`,onPointerDown:f}),(0,h.jsx)(`div`,{className:S.panelHeader,children:(0,h.jsxs)(`button`,{type:`button`,className:S.panelToggle,"aria-expanded":!i,onClick:()=>a(e=>!e),children:[(0,h.jsx)(`span`,{className:S.panelBadge,children:`面板`}),(0,h.jsx)(`span`,{className:S.panelTitle,children:n.title??`GenUI 面板`}),(0,h.jsx)(`span`,{className:S.panelChevron,"aria-hidden":!0,children:i?`▸`:`▾`})]})}),!i&&(0,h.jsx)(`div`,{ref:d,className:S.panelBody,"data-genui-panel-body":!0,style:o===null?void 0:{height:o},children:(0,h.jsx)(_.Provider,{value:t,children:(0,h.jsx)(b,{label:`面板`,children:(0,h.jsx)(Jt,{spec:n,stateKey:ae(e,JSON.stringify(n))})})})})]})}function Jn({toolName:e,block:t,sessionId:n}){let r=`meta`in t?t.meta:void 0,i=(0,m.useMemo)(()=>r===void 0?null:R(r),[r]);return(0,m.useEffect)(()=>{i!==null&&i.items.length>0&&ln(n,{sourceId:JSON.stringify([`render_ui`,t.callId]),order:[`seq`in t&&typeof t.seq==`number`?t.seq:0,-1,0],mode:`replace`,spec:i})},[n,i,t]),i===null||i.items.length===0?(0,h.jsxs)(`div`,{className:S.toolFallback,"data-genui-tool":!0,children:[(0,h.jsx)(`span`,{className:S.toolFallbackTitle,children:e}),(0,h.jsx)(`span`,{className:S.toolFallbackMeta,children:t.callId})]}):(0,h.jsx)(`div`,{className:S.tool,"data-genui-tool":!0,children:(0,h.jsx)(b,{label:`工具卡片`,children:(0,h.jsx)(Jt,{spec:i,stateKey:oe(n,t.callId)})})})}_t();function Yn(){if(!(typeof document>`u`))for(let e of[`mermaid.js`,`three.js`]){if(document.head.querySelector(`link[rel="prefetch"][href="${H(e)}"]`)!==null)continue;let t=document.createElement(`link`);t.rel=`prefetch`,t.as=`script`,t.href=H(e),document.head.appendChild(t)}}function Xn(e,t){let n=e.sessions.scope(t)?.get(`conversation`);return{sessionId:t,sendGenuiAction:(e,r)=>{if(n===void 0)return;let i=Object.keys(r).length===0?``:` 组件数据: ${JSON.stringify(r)}`;n.send(`[genui-action] ${e}。用户刚刚在面板中触发了动作 "${e}",请根据组件数据执行相应操作,只输出一个 panel:true 的 dsh-ui 围栏来更新面板,回复文本至多一行 10 字以内的确认(如"已刷新"),不要解释、不要普通围栏。${i}`).catch(n=>{console.warn(`[genui] 面板动作 "${e}" 发送失败(session ${t}):`,n instanceof Error?n.message:String(n))})}}}function Zn(e,t,n){let r=e.sessions.scope(t)?.get(`conversation`);r!==void 0&&r.send(`用户执行了 /panel 并请求:${n}。请只输出一个 panel:true 的 dsh-ui 围栏来更新会话面板,内容按请求定制;回复文本至多一行 10 字以内的确认(如"已更新"),不要解释、不要普通围栏。`).catch(e=>{console.warn(`[genui] /panel 指令发送失败(session ${t}):`,e instanceof Error?e.message:String(e))})}function Qn(e,t,n,r){let i=e.sessions.scope(t)?.get(`conversation`);if(i===void 0)return;let a=Object.keys(r).length===0?``:` 组件数据: ${JSON.stringify(r)}`;i.send(`[genui-action] ${n}。用户刚刚在界面中触发了动作 "${n}",请根据组件数据执行相应操作,并用 dsh-ui 输出更新后的界面。${a}`).catch(()=>{})}function $n(e){let t=p.registerFenceRenderer,n=typeof t==`function`?[t(`dsh-ui`,jn)]:(console.info(`[genui] fence-registry 扩展点不存在(原版 DSH)——启用 DOM 渲染通道`),[Hn(e,(t,n,r)=>Qn(e,t,n,r))]);Yn(),n.push(e.slots.inject(`tool.call.toolview`,()=>e.slots.register({name:`tool.call.toolview`,key:`render_ui`},Jn))),n.push(e.slots.inject(`conversation.input.dock`,()=>e.slots.register({name:`conversation.input.dock`,id:`genui-panel`,order:50,inject:t=>Xn(e,t)},qn)));let r=e.get(`inputTriggers`);return r===void 0?console.warn(`[genui] inputTriggers service unavailable; /panel command disabled`):n.push(e.effect(()=>r.registerSource(Kn((t,n)=>Zn(e,t,n))),`genui: /panel`)),()=>{for(let e of n)e()}}return n.apply=$n,n.inject=[`slots`,`sessions`,`inputTriggers`],n.prefetchGenuiAssets=Yn,n.renderGenuiFence=jn,t.exports}}); \ No newline at end of file diff --git a/package.json b/package.json index a8cc965..de3c060 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@omdsh-dev/dsh-genui", "description": "GenUI for DeepSeek Harness: interactive UI components rendered inline in assistant replies via the ```dsh-ui fence — layout, charts, plots, forms, quizzes, mermaid, 3D scenes, and an action event loop back to the model. Ships the fence-teaching host plugin, the browser renderer (client half), and the genui skill.", - "version": "0.8.1", + "version": "0.8.2", "type": "module", "main": "lib/index.js", "types": "lib/types/plugin/index.d.ts", diff --git a/src/client/dom-fence.tsx b/src/client/dom-fence.tsx index 8a93e5a..8e34938 100644 --- a/src/client/dom-fence.tsx +++ b/src/client/dom-fence.tsx @@ -150,16 +150,30 @@ function fenceIndexOf(row: Element, block: Element): number { return index + 1 } -/** messageSeq estimate: the numeric part of the anchor key when present, - * else the row's document-order index among chat rows (monotonic in seq). - * The document-order fallback counts every host flow row — anchored or not — - * so anchor-less (Safari) rows still get a monotonic seq estimate. */ +/** + * messageSeq estimate from the row's anchor key. + * + * The host's context key is `:` (e.g. + * `14:assistant-step3:0`); the id of an assistant step is `:` — + * the ONLY per-message monotonic counter the host exposes in the DOM. Turn + * and step strictly increase with message order, so a turn-based seq keeps + * growing across page reloads: the panel store's persisted replay barrier + * (hydration: replays at/below the persisted max seq are dead) depends on + * this monotonicity. Without it every assistant step yields the SAME + * constant (the kind-length prefix), so after a refresh the barrier equals + * that constant and silently rejects every new panel fence (issue #4). + * + * Fallback (non-assistant rows, anchor-less Safari rows): the row's + * document-order index among chat rows — monotonic within the current + * render window, degraded across reloads. + */ function anchorSeqOf(row: Element): number { const key = row.getAttribute('data-chat-anchor-key') ?? '' - const match = /(\d+)/.exec(key) - if (match !== null) { - const value = Number(match[1]) - if (Number.isFinite(value)) return value + const turnStep = /assistant-step(\d+):(\d+)$/.exec(key) + if (turnStep !== null) { + const turn = Number(turnStep[1]) + const step = Number(turnStep[2]) + if (Number.isFinite(turn) && Number.isFinite(step)) return turn * 1000 + step } const rows = document.querySelectorAll(`[data-chat-anchor-key], ${FLOW_ROW}`) for (let i = 0; i < rows.length; i += 1) { diff --git a/src/client/panel-store.ts b/src/client/panel-store.ts index 24c70a0..5414f24 100644 --- a/src/client/panel-store.ts +++ b/src/client/panel-store.ts @@ -288,6 +288,13 @@ export function applyPanelOperation(sessionId: string, op: PanelOperation): Pane const result = fold(state, op) if (result === null) { if (state.seen.has(op.sourceId) || state.overflow?.sourceId === op.sourceId) return 'idempotent' + // A rejection may come from the replay/local barriers (dead old content + // — worth one diagnostic) or from the budget overflow barrier (a later + // append beyond the panel budget — the budget diagnostic covers it). + const laterThanOverflow = state.overflow !== null + && op.mode === 'append' + && compareOrder(op.order, state.overflow.order) > 0 + if (!laterThanOverflow) diagnosePanelBlocked(sessionId, op, state) return 'blocked' } const status: PanelOperationStatus = result.overflow !== null && result.overflow.sourceId === op.sourceId @@ -299,6 +306,28 @@ export function applyPanelOperation(sessionId: string, op: PanelOperation): Pane return status } +/* ---------------- barrier-rejection diagnostics ---------------- */ + +/** One diagnostic per blocked source per page session (replays stay quiet). */ +const diagnosedBlocked = new Set() + +/** + * Log one barrier-rejection diagnostic. Barrier kills are EXPECTED for + * history replays (the persisted hydration barrier makes replays at/below + * the persisted max seq dead), so this stays quiet on repeat visits — but a + * NEW message's fence being blocked is a real defect (broken seq + * derivation), and the one-time warning makes it observable instead of a + * silent dock freeze (issue #4 asked for exactly this). + */ +function diagnosePanelBlocked(sessionId: string, op: PanelOperation, state: SessionPanelState): void { + const key = `${sessionId}\u0000${op.sourceId}` + if (diagnosedBlocked.has(key)) return + diagnosedBlocked.add(key) + console.warn( + `[genui] 面板操作被重放屏障拒绝(source ${op.sourceId},order[0]=${op.order[0]} ≤ replayBarrier ${state.replayBarrier} / localBarrier ${state.localBarrier})。历史消息重放被拒是预期行为;若是刚发送的新消息,说明消息序号推导异常,请报告。`, + ) +} + /* ---------------- local /panel override ---------------- */ /** @@ -350,6 +379,9 @@ export function clearSessionPanel(sessionId: string): void { for (const key of diagnosedOverflow) { if (key.startsWith(prefix)) diagnosedOverflow.delete(key) } + for (const key of diagnosedBlocked) { + if (key.startsWith(prefix)) diagnosedBlocked.delete(key) + } if (!had && !hadToken) return for (const fn of listeners) fn() for (const fn of expandListeners) fn() diff --git a/tests/dom-fence.spec.tsx b/tests/dom-fence.spec.tsx index d64e598..50df2b3 100644 --- a/tests/dom-fence.spec.tsx +++ b/tests/dom-fence.spec.tsx @@ -7,7 +7,7 @@ import { afterEach, describe, expect, it, vi } from 'vitest' import type { Context } from '@deepseek-ai/cordis' import { installDomFenceRenderer } from '../src/client/dom-fence.tsx' import { inject } from '../src/client/index.tsx' -import { getPanelSpec } from '../src/client/panel-store.ts' +import { clearSessionPanel, getPanelSpec } from '../src/client/panel-store.ts' const VALID_SPEC = '{"title":"卡片","items":[{"type":"text","content":"你好,世界"}]}' const BUTTON_SPEC = '{"items":[{"type":"button","label":"刷新","action":"refresh"}]}' @@ -431,3 +431,76 @@ describe('anchor-less rows (Safari fallback render path)', () => { } }) }) + +describe('persisted replay barrier across page refresh (issue #4)', () => { + // 回归钉 #4: 宿主 anchor key 是 `:`,assistant step 的 + // id 是 `:`(如 `14:assistant-step3:0`)。旧实现取 key 里第一个 + // 数字 = kind 长度常量 → 所有消息的 order[0] 相同 → 刷新后 replayBarrier + // (= 持久化 maxSeenSeq = 该常量) 拒绝一切新 panel 围栏,dock 冻结且零日志。 + // 修复:order[0] 改为 turn*1000+step(随消息顺序严格单调),刷新后新消息 + // 的 turn 必然大于持久化屏障 → 正常更新。 + const PANEL = (title: string, content: string) => + `{"panel":true,"title":"${title}","items":[{"type":"text","content":"${content}"}]}` + + it('lets a new-turn panel fence update the dock after a refresh', async () => { + const send = vi.fn() + + // ── 页面 1:turn 2 与 turn 3 的两个 panel 围栏(宿主真实 key 格式)── + const row2 = assistantRow('14:assistant-step2:0') + const blockA = stockCodeBlock(PANEL('面板A', 'A'), 'dsh-ui') + row2.appendChild(blockA) + document.body.appendChild(row2) + const row3 = assistantRow('14:assistant-step3:0') + const blockB = stockCodeBlock(PANEL('面板B', 'B'), 'dsh-ui') + row3.appendChild(blockB) + document.body.appendChild(row3) + let dispose = installDomFenceRenderer(makeCtx('sess-refresh', send), send) + try { + await tick() + expect(getPanelSpec('sess-refresh')?.title).toBe('面板B') + + // ── 刷新:内存态清空(localStorage 存活),新页面重装渲染器 ── + dispose() + clearSessionPanel('sess-refresh') + document.body.innerHTML = '' + dispose = installDomFenceRenderer(makeCtx('sess-refresh', send), send) + await tick() + + // 历史重放(同一 DOM 重建):被持久化屏障杀死,dock 保持面板B + document.body.appendChild(row2) + document.body.appendChild(row3) + await tick() + expect(getPanelSpec('sess-refresh')?.title).toBe('面板B') + + // ── 新消息(turn 4):order[0]=4000 > 屏障 3000 → dock 必须更新 ── + const row4 = assistantRow('14:assistant-step4:0') + const blockC = stockCodeBlock(PANEL('面板C', 'C'), 'dsh-ui') + row4.appendChild(blockC) + document.body.appendChild(row4) + await tick() + expect(getPanelSpec('sess-refresh')?.title).toBe('面板C') + } finally { + dispose() + } + }) + + it('keeps per-step monotonicity within one turn (later step wins)', async () => { + // 同一 turn 内的多步:step 必须参与 seq,后一步的围栏覆盖前一步。 + const send = vi.fn() + const rowA = assistantRow('14:assistant-step5:0') + const blockA = stockCodeBlock(PANEL('面板甲', '甲'), 'dsh-ui') + rowA.appendChild(blockA) + document.body.appendChild(rowA) + const rowB = assistantRow('14:assistant-step5:1') + const blockB = stockCodeBlock(PANEL('面板乙', '乙'), 'dsh-ui') + rowB.appendChild(blockB) + document.body.appendChild(rowB) + const dispose = installDomFenceRenderer(makeCtx('sess-refresh-step', send), send) + try { + await tick() + expect(getPanelSpec('sess-refresh-step')?.title).toBe('面板乙') + } finally { + dispose() + } + }) +}) diff --git a/tests/genui-panel.spec.tsx b/tests/genui-panel.spec.tsx index f49da23..683df84 100644 --- a/tests/genui-panel.spec.tsx +++ b/tests/genui-panel.spec.tsx @@ -362,6 +362,25 @@ describe('panel operation model (real order, no Infinity)', () => { applyPanelOperation('s1', { sourceId: 'new:10', order: [10, 0, 0], mode: 'replace', spec: { items: [text('新')] } }) expect(getPanelSpec('s1')!.items).toEqual([text('新')]) }) + + it('warns once per source when a barrier rejects an op (issue #4 diagnostics)', () => { + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}) + try { + direct('s1', { items: [text('持久')] }, 3000) + clearSessionPanel('s1') // reload: memory gone, storage keeps maxSeenSeq + const old = { items: [text('旧')] } + applyPanelOperation('s1', { sourceId: 'old:2000', order: [2000, 0, 0], mode: 'replace', spec: old }) + expect(getPanelSpec('s1')!.items).toEqual([text('持久')]) // replay dead + // replay of the same source stays silent (one diagnostic per source) + applyPanelOperation('s1', { sourceId: 'old:2000', order: [2000, 0, 0], mode: 'replace', spec: old }) + const calls = warn.mock.calls.filter(([m]) => String(m).includes('[genui]')) + expect(calls).toHaveLength(1) + expect(String(calls[0]![0])).toContain('屏障') + expect(String(calls[0]![0])).toContain('2000') + } finally { + warn.mockRestore() + } + }) }) describe('panel budget (node/appends limits)', () => {