dsh-prompt-customizer 0.5.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.en.md +26 -2
  2. package/README.md +129 -15
  3. package/build.mjs +219 -0
  4. package/client/client.js +8160 -3465
  5. package/client/client.js.map +7 -1
  6. package/cordis.patch.yml +6 -3
  7. package/lib/index.js +16360 -905
  8. package/lib/index.js.map +7 -0
  9. package/package.json +50 -38
  10. package/scripts/fixtures/rc2-mode.mjs +12 -0
  11. package/scripts/fixtures/rc2-preview.snapshot.json +35 -0
  12. package/scripts/fixtures/rc2-runtime.mjs +85 -0
  13. package/scripts/fixtures/rc2.cordis.yml +31 -0
  14. package/scripts/fixtures/rc2.overlay.yml +9 -0
  15. package/scripts/smoke-client.mjs +382 -0
  16. package/scripts/smoke-host.mjs +130 -0
  17. package/scripts/test-mcp-layering.mjs +441 -0
  18. package/scripts/test-mcp-tool-disable.mjs +420 -0
  19. package/scripts/test-rc2-runtime.mjs +42 -0
  20. package/scripts/test-skill-manager.mjs +170 -0
  21. package/scripts/test-skill-toggles.mjs +100 -0
  22. package/lib/catalog.js +0 -131
  23. package/lib/effective.js +0 -161
  24. package/lib/promotion.js +0 -80
  25. package/lib/schema.js +0 -125
  26. package/lib/sectionOps.d.mts +0 -67
  27. package/lib/sectionOps.mjs +0 -269
  28. package/lib/store.js +0 -124
  29. package/lib/vars.js +0 -147
  30. package/lib/zh/cordis.mjs +0 -110
  31. package/lib/zh/core.mjs +0 -47
  32. package/lib/zh/index.d.mts +0 -8
  33. package/lib/zh/index.mjs +0 -23
  34. package/lib/zh/sdk.mjs +0 -22
  35. package/lib/zh/teams.mjs +0 -19
  36. package/lib/zh/undo.mjs +0 -18
  37. package/src/client/Panel.tsx +0 -532
  38. package/src/client/PresetsPane.tsx +0 -298
  39. package/src/client/PreviewPane.tsx +0 -73
  40. package/src/client/PreviewTools.tsx +0 -33
  41. package/src/client/SectionsPane.tsx +0 -331
  42. package/src/client/ToolsPane.tsx +0 -230
  43. package/src/client/error-boundary.tsx +0 -48
  44. package/src/client/index.ts +0 -97
  45. package/src/client/locales.ts +0 -301
  46. package/src/client/nav.tsx +0 -284
  47. package/src/client/preset-io.ts +0 -226
  48. package/src/client/presets.ts +0 -413
  49. package/src/client/shell.tsx +0 -179
  50. package/src/client/styles.ts +0 -59
  51. package/src/client/types.ts +0 -125
@@ -1 +1,7 @@
1
- {"version":3,"file":"client.js","names":["useState","h","useState","h","useState","useRef","h","h","h","useState","useRef","h","Component","useState","STYLE_ID","SHEET","createPortal","useState","createPortal","useState","h","createRoot"],"sources":["../src/client/locales.ts","../src/client/styles.ts","../src/client/presets.ts","../lib/sectionOps.mjs","../lib/zh/core.mjs","../lib/zh/undo.mjs","../lib/zh/teams.mjs","../lib/zh/cordis.mjs","../lib/zh/sdk.mjs","../lib/zh/index.mjs","../src/client/SectionsPane.tsx","../src/client/ToolsPane.tsx","../src/client/preset-io.ts","../src/client/PresetsPane.tsx","../src/client/PreviewTools.tsx","../src/client/PreviewPane.tsx","../src/client/Panel.tsx","../src/client/error-boundary.tsx","../src/client/nav.tsx","../src/client/shell.tsx","../src/client/index.ts"],"sourcesContent":["/** Locale dictionaries for the prompt-customizer panel. */\nexport const DICT = {\n zh: {\n nav: '提示词定制',\n loading: '加载中…',\n unavailable: '当前环境未启用本命名空间。',\n tabsSections: '提示词',\n tabsTools: '工具',\n tabsPresets: '配置',\n tabsPreview: '预览',\n refresh: '刷新',\n blockedOff: '未屏蔽',\n blockedOn: '已屏蔽',\n replaced: '已替换',\n manual: '手动',\n system: '系统',\n replace: '编辑',\n clearReplace: '清除',\n clearInput: '清空',\n injectNew: '注入新段',\n name: '名称',\n order: '顺序',\n text: '文本',\n add: '添加',\n hiddenOff: '可见',\n hiddenOn: '已隐藏',\n selectAll: '全选',\n selectNone: '全不选',\n empty: '(空)',\n dynamic: '<动态生成>',\n drag: '拖动排序',\n moveUp: '上移',\n moveDown: '下移',\n previewHint: '以下为屏蔽/替换/注入后的最终系统提示词:',\n previewPrompt: '提示词预览',\n previewSections: '段',\n previewTools: '工具预览',\n previewToolCount: '个工具',\n savePreset: '保存当前配置',\n presetName: '配置名称',\n saveAsPresetCard: '存为 agent 预设',\n saveAsPresetHint: '整体复制「{name}」这个预设的组成为新预设(组成文件与伴生脚本一并带走),再把当前定制写进它的覆盖项 —— 新预设出现在顶部编辑目标里。',\n agentPresetName: '新预设名',\n forkSourceDefault: '默认预设',\n saveAsPresetOk: '预设已创建,可在顶部的编辑目标选择器里选到它',\n saveAsPresetFail: '保存预设失败',\n save: '保存',\n importPreset: '导入配置',\n import: '导入',\n apply: '应用',\n export: '导出',\n delete: '删除',\n restore: '还原',\n active: '使用中',\n preset: '预设',\n ioFailed: '导入/导出失败',\n importInvalid: '无效的配置文件',\n targetGlobal: '目标:全局默认',\n targetHint: '选择编辑目标 —— 选中某个 agent 预设后,改动只对该预设生效(字段级覆盖)。',\n syncAllPhases: '三态同步',\n syncAllPhasesHint: '勾选后,屏蔽 / 解除屏蔽、替换文本(提示词)与拖入 / 拖出(工具的加减)对三个阶段一起生效,只作用于同名的那一项;某阶段没有的名字保持原样。默认关闭:三个阶段需逐一处理。',\n broken: '损坏',\n brokenPreset: '该 agent 预设当前无法挂载,仍可编辑其定制(修复预设后自动生效)。',\n phaseBootstrap: '仅引导阶段',\n phaseActive: '晋级后',\n phaseCompaction: '压缩后',\n // agent 周期三阶段的展示命名(引导期 → 常驻期 → 压缩受控期)。\n phaseStageGuide: '引导期',\n phaseStageResident: '常驻期',\n phaseStageControlled: '压缩受控期',\n toolsPartGuide: '引导期工具',\n toolsPartResident: '常驻期工具',\n toolsPartControlled: '压缩受控期工具',\n allToolsTitle: '本系统全部工具',\n sectionsPartGuide: '引导期提示词',\n sectionsPartResident: '常驻期提示词',\n sectionsPartControlled: '压缩受控期提示词',\n allSectionsTitle: '本系统全部提示词',\n toolsFourHint: '三个阶段各一份名单,互不继承:勾选 = 该阶段是否对模型可见;从「全部」拖入某阶段 = 让这一个工具在该阶段出现(若该阶段默认裁掉了它,就加回去);在两个阶段之间拖动 = 复制(源阶段不动,目标阶段多一份,隐藏/启用状态一起带过去);拖回「全部」= 从该阶段拿掉它。每个动作只影响被拖的那一个工具。',\n sectionsFourHint: '拖拽双向:把「全部」里的段拖入上方阶段 = 加入该阶段并默认开启;从阶段拖回「全部」= 从该阶段移除。屏蔽段与普通段完全一样可拖拽 / 编辑,只是不注入模型。',\n dragHint: '拖入 = 让该工具在这个阶段出现',\n phaseShortGuide: '引',\n phaseShortResident: '常',\n phaseShortControlled: '压',\n poolMarksHint: '每个名字后的三个标记 = 该工具在引导期 / 常驻期 / 压缩受控期的状态:绿=该阶段可见(或已加回),灰=该阶段已隐藏,暗=不在该阶段、也没加回。',\n toolAddedTag: '加回',\n toolAdded: '已把「{name}」加回{phase}:该阶段默认裁掉了它,保存后它会重新出现在该阶段(当前预设注册表里有它)。',\n toolNotInRegistry: '「{name}」不在本预设的注册表里(它是别的预设独有的工具),当前预设没有它的定义,加不进来。',\n toolCopied: '已把「{name}」复制到{to}:{from}那份保持不动,隐藏/启用状态一起带过去。',\n toolShown: '「{name}」已在{to}显示。',\n toolHiddenIn: '「{name}」已在{to}隐藏。',\n toolSyncShown: '「{name}」已在三个阶段显示(该阶段目录里没有的已写进各自的加回名单)。',\n toolSyncHidden: '「{name}」已在三个阶段隐藏 / 移除。',\n sectionsTakenOver: '「{name}」段声明了 complete 整段接管(宿主在装配瀑布流之后强制还原为那一条段)。本插件默认的 forceSections 已绕开该机制,段级屏蔽 / 替换 / 注入 / 排序照常生效;此提示只会在 forceSections 关闭或强制覆盖失效时出现,开启 forceSections 即可恢复。',\n sectionsLost: '本插件在该阶段产出的 {emitted} 个段里,只有 {survived} 个进入最终提示词:其余被下游装配规则丢弃,段级定制不会完全生效(工具过滤不受影响)。',\n sectionBlockedStrip: '(本阶段已屏蔽,模型不可见)',\n phaseSuppressed: '被抑制(不在任何阶段的装配中)',\n sectionDynamicNoAdd: '「{name}」是运行时才生成的动态段,没法预先加进某个阶段(它的内容只有装配时才知道)。',\n exportOk: '导出成功',\n exportCancel: '已取消导出',\n exportFail: '导出失败',\n importOk: '导入完成',\n importNone: '没有新增预设(同名已存在或文件为空)',\n importCancel: '已取消导入',\n importFail: '导入失败',\n saveOk: '已保存',\n saveFail: '保存失败',\n discardConfirm: '有未保存的更改,离开将丢弃。确定离开吗?',\n forceTitle: '强制覆盖(forceSections)',\n forceHint: '开启后所有预设的提示词段一律以本插件为准(绕过 complete 整段接管与预设阶段裁段);关闭后退回瀑布流内过滤,预设可能压过定制。「恢复初始状态」会自动关闭它。',\n forceOn: '已开启',\n forceOff: '已关闭',\n zhSwitch: '中文提示词',\n zhHint: '开关。开启:把名字对得上译本的段一次性覆盖为中文(写入编辑草稿,保存后生效);关闭:清除这些段的替换文本,回归英文原文。自定义段与对不上名字的段不受影响。',\n zhApplied: '已把中文写入编辑草稿:点「保存」生效;对不上名字的段保持原样。',\n zhReverted: '已把英文原文写回编辑草稿(清除中文替换),点「保存」生效。',\n zhNotReady: '三阶段装配尚未加载完成,请先点「刷新」或稍后再试。',\n envBlockTitle: '环境变量黑名单(envBlocklist)',\n envBlockHint: '系统环境变量(process.env)已全量注册为提示词变量:段文本里写 {{env_键名小写}} 引用(如 {{env_path}});命中黑名单的键不注册——env 里常有密钥,进了提示词就会随请求发给模型。条目支持 * 通配、大小写不敏感。内置变量 {{date}} {{time}} {{datetime}} {{weekday}} {{hostname}} {{platform}} {{arch}} {{username}} {{home}} {{shell}} {{locale}} {{node_version}} 恒可用。',\n envBlockAdd: '键名或通配,如 GITHUB_TOKEN 或 *_KEY*',\n envBlockAddAction: '添加',\n envBlockEmpty: '黑名单为空:所有环境变量都会被注册',\n envVarsTitle: '已注册的提示词变量',\n envVarsHint: '段文本里引用 {{变量名}};引用未注册的名字会让整次渲染报错(宿主严格模式)。',\n importBlockMerge: ',文件中的环境变量黑名单已并入(+{count} 条)',\n resetTitle: '恢复初始状态',\n resetHint: '清空全部定制(屏蔽 / 替换 / 注入 / 排序、阶段工具目录、配置快照、agent 预设覆盖),并关闭 forceSections —— 之后所有 AI 对话不再受本插件影响,与卸载插件等效,无需卸载或重启。此操作不可撤销;要重新启用定制,在上方打开「强制覆盖」开关即可。',\n resetConfirm: '确定清空全部定制并恢复初始状态吗?\\n\\n将删除:屏蔽名单、段替换、注入段、阶段工具目录、配置快照、agent 预设覆盖;并关闭 forceSections。\\n之后所有 AI 对话都不再受本插件影响(与卸载插件等效)。\\n此操作不可撤销。',\n resetAction: '清空全部定制',\n resetOk: '已恢复初始状态:所有 AI 对话不再受本插件影响',\n resetFail: '恢复初始状态失败',\n scopeFallback: '该 agent 预设的常驻 scope 未能挂载,以下显示的是全局层内容(并非该预设的原生段与工具)。',\n previewFail: '该阶段装配失败(scope 挂载失败或预设插件异常),请切换目标或查看服务日志。',\n phaseVisible: '阶段可见',\n previewToolsHint: '模型实际可见的工具目录(按所选阶段运行预设的全部装配规则,含原生阶段裁剪):',\n previewToolsCount: '注册表',\n saveAsPreset: '存为预设',\n // 独立面板(侧边栏入口 + 抽屉分栏)新增。\n navShort: '提示词',\n close: '关闭',\n filterAll: '全部',\n filterOn: '已启用',\n filterOff: '已停用',\n targetAllTab: '全部 Agent',\n poolAddTitle: '加入{phase}',\n settingsTitle: '全局设置',\n libraryTitle: '配置快照库',\n draftBadge: '预览含未保存草稿',\n previewSyncFail: '实时预览同步失败(下次编辑会自动重试,或点「刷新」)',\n },\n en: {\n nav: 'Prompt Customizer',\n loading: 'Loading…',\n unavailable: 'Namespace unavailable in this environment.',\n tabsSections: 'Sections',\n tabsTools: 'Tools',\n tabsPresets: 'Presets',\n tabsPreview: 'Preview',\n refresh: 'Refresh',\n blockedOff: 'Active',\n blockedOn: 'Blocked',\n replaced: 'Replaced',\n manual: 'Manual',\n system: 'System',\n replace: 'Replace',\n clearReplace: 'Clear',\n clearInput: 'Clear',\n injectNew: 'Inject section',\n name: 'Name',\n order: 'Order',\n text: 'Text',\n add: 'Add',\n hiddenOff: 'Visible',\n hiddenOn: 'Hidden',\n selectAll: 'Select all',\n selectNone: 'Select none',\n empty: '(empty)',\n dynamic: '<dynamic>',\n drag: 'Drag to reorder',\n moveUp: 'Move up',\n moveDown: 'Move down',\n previewHint: 'Final system prompt after block/replace/inject:',\n previewPrompt: 'Prompt preview',\n previewSections: 'sections',\n previewTools: 'Tools preview',\n previewToolCount: 'tools',\n savePreset: 'Save current config',\n presetName: 'Config name',\n saveAsPresetCard: 'Save as agent preset',\n saveAsPresetHint: 'Copy the whole \"{name}\" preset into a new one (composition plus its companion scripts), then write the current customization into its override — the new preset shows up in the target selector above.',\n agentPresetName: 'New preset name',\n forkSourceDefault: 'the default preset',\n saveAsPresetOk: 'Preset created — pick it in the target selector above',\n saveAsPresetFail: 'Failed to save preset',\n save: 'Save',\n importPreset: 'Import preset',\n import: 'Import',\n apply: 'Apply',\n export: 'Export',\n delete: 'Delete',\n restore: 'Restore',\n active: 'Active',\n preset: 'Preset',\n ioFailed: 'Import/export failed',\n importInvalid: 'Invalid preset file',\n targetGlobal: 'Target: global default',\n targetHint: 'Pick an edit target — changes apply only to the chosen agent preset (field-level override).',\n syncAllPhases: 'Sync phases',\n syncAllPhasesHint: 'When checked, blocking / unblocking, text replacement (sections), and drag-in / drag-out (adding / removing tools) apply to the same-named item across all three phases at once; names a phase does not have are left untouched. Unchecked (default): handle each phase separately.',\n broken: 'broken',\n brokenPreset: 'This agent preset cannot mount right now; its customization is still editable and applies once fixed.',\n phaseBootstrap: 'Bootstrap only',\n phaseActive: 'After promotion',\n phaseCompaction: 'Post-compaction',\n // agent 周期三阶段的展示命名(引导期 → 常驻期 → 压缩受控期)。\n phaseStageGuide: 'Guide period',\n phaseStageResident: 'Resident period',\n phaseStageControlled: 'Compaction-controlled period',\n toolsPartGuide: 'Guide-period tools',\n toolsPartResident: 'Resident-period tools',\n toolsPartControlled: 'Compaction-controlled tools',\n allToolsTitle: 'All system tools',\n sectionsPartGuide: 'Guide-period sections',\n sectionsPartResident: 'Resident-period sections',\n sectionsPartControlled: 'Compaction-controlled sections',\n allSectionsTitle: 'All system sections',\n toolsFourHint: 'Each of the three periods keeps its own list, with no inheritance: the checkbox = visible to the model in that period; dragging a tool from \"All\" into a period makes it appear there (if the period trims it by default, it is added back); dragging between two periods copies it (the source is untouched, the target gains one, and the hidden/enabled state carries over); dragging it back to \"All\" removes it from that period. Every action touches only the tool you dragged.',\n sectionsFourHint: 'Drag both ways: drop a section from \"All\" onto a period part to enable it there; drag from a part back to \"All\" to remove it from that period. Blocked sections stay fully operable — they are just not injected.',\n dragHint: 'Drag in to make this tool appear in this period',\n phaseShortGuide: 'G',\n phaseShortResident: 'R',\n phaseShortControlled: 'C',\n poolMarksHint: 'The three marks after each name = this tool’s state in the guide / resident / compaction-controlled periods: green = visible there (or added back), grey = hidden there, dim = not present and not added.',\n toolAddedTag: 'added',\n toolAdded: 'Added \"{name}\" back to {phase}: the period trims it by default, so it will reappear there once saved (it exists in this preset’s registry).',\n toolNotInRegistry: '\"{name}\" is not in this preset’s registry (it belongs to another preset). There is no definition for it here, so it cannot be added.',\n toolCopied: 'Copied \"{name}\" to {to}: the copy in {from} is left untouched, and its hidden/enabled state carries over.',\n toolShown: '\"{name}\" is now visible in {to}.',\n toolHiddenIn: '\"{name}\" is now hidden in {to}.',\n toolSyncShown: '\"{name}\" is now visible in all three phases (periods without it in their catalog got it added back).',\n toolSyncHidden: '\"{name}\" is now hidden / removed in all three phases.',\n sectionsTakenOver: 'The \"{name}\" section declares a complete takeover (the host restores that single section after the assembly waterfall). This plugin’s forceSections (default on) bypasses that mechanism, so section-level blocking / replacement / injection / ordering still applies; this notice only appears when forceSections is off or the override fails — enable it to restore.',\n sectionsLost: 'Only {survived} of the {emitted} sections this plugin emitted for this phase reach the final prompt — the rest are dropped by downstream assembly rules, so section-level customization cannot fully apply (tool filtering is unaffected).',\n sectionBlockedStrip: ' (blocked in this period; invisible to the model)',\n phaseSuppressed: 'Suppressed (absent from every phase assembly)',\n sectionDynamicNoAdd: '\"{name}\" is generated at runtime — it cannot be added to a phase ahead of time (its content is only known during assembly).',\n exportOk: 'Exported',\n exportCancel: 'Export cancelled',\n exportFail: 'Export failed',\n importOk: 'Import complete',\n importNone: 'Nothing imported (duplicate names or empty file)',\n importCancel: 'Import cancelled',\n importFail: 'Import failed',\n saveOk: 'Saved',\n saveFail: 'Save failed',\n discardConfirm: 'You have unsaved changes; leaving will discard them. Leave anyway?',\n forceTitle: 'Force override (forceSections)',\n forceHint: 'When on, every preset’s prompt sections always follow this plugin (bypassing complete takeover and preset phase pruning); when off, filtering falls back to the waterfall, where presets may override your customization. \"Restore initial state\" turns this off automatically.',\n forceOn: 'On',\n forceOff: 'Off',\n zhSwitch: 'Chinese sections',\n zhHint: 'Toggle. On: overwrite sections matching the bundled translation with Chinese (written to the edit draft, applies on save). Off: clear those replacements, restoring the English originals. Custom sections and unmatched names are untouched.',\n zhApplied: 'Chinese written to the edit draft — press Save to apply; unmatched sections stay as-is.',\n zhReverted: 'English originals written back to the edit draft (Chinese replacements cleared) — press Save to apply.',\n zhNotReady: 'Phase assemblies are not loaded yet — press Refresh or try again shortly.',\n envBlockTitle: 'Environment variable blocklist (envBlocklist)',\n envBlockHint: 'All system environment variables (process.env) are registered as prompt variables: reference them in section text as {{env_lowercase_key}} (e.g. {{env_path}}); keys hit by the blocklist are not registered — env often carries secrets, and anything in the prompt is sent to the model. Entries support * wildcards, case-insensitive. Built-ins {{date}} {{time}} {{datetime}} {{weekday}} {{hostname}} {{platform}} {{arch}} {{username}} {{home}} {{shell}} {{locale}} {{node_version}} are always available.',\n envBlockAdd: 'Key or wildcard, e.g. GITHUB_TOKEN or *_KEY*',\n envBlockAddAction: 'Add',\n envBlockEmpty: 'Blocklist is empty: every environment variable gets registered',\n envVarsTitle: 'Registered prompt variables',\n envVarsHint: 'Reference {{name}} in section text; an unregistered name fails the whole render (host strict mode).',\n importBlockMerge: ', the file’s env-variable blocklist was merged in (+{count} entries)',\n resetTitle: 'Restore initial state',\n resetHint: 'Clears all customization (blocking / replacement / injection / ordering, per-phase tool catalogs, config snapshots, agent-preset overrides) and turns forceSections off — every AI conversation goes back to being unaffected by this plugin, equivalent to uninstalling it, without uninstalling or restarting. This cannot be undone; to re-enable customization, turn the \"Force override\" switch above back on.',\n resetConfirm: 'Clear all customization and restore the initial state?\\n\\nThis will delete: block lists, section replacements, injected sections, per-phase tool catalogs, config snapshots, and agent-preset overrides; forceSections will be turned off.\\nAfterwards no AI conversation is affected by this plugin (equivalent to uninstalling).\\nThis cannot be undone.',\n resetAction: 'Clear all customization',\n resetOk: 'Initial state restored: no AI conversation is affected by this plugin anymore',\n resetFail: 'Failed to restore initial state',\n scopeFallback: \"This agent preset's standing scope could not be mounted; what you see is the global layer (not the preset's native sections/tools).\",\n previewFail: 'Assembly for this phase failed (scope mount error or a preset plugin threw); switch target or check the server log.',\n phaseVisible: 'visible in phase',\n previewToolsHint: 'Tool catalog as the model actually sees it (all assembly rules run for the selected phase, including native phase narrowing):',\n previewToolsCount: 'of registry',\n saveAsPreset: 'Save as preset',\n // 独立面板(侧边栏入口 + 抽屉分栏)新增。\n navShort: 'Prompts',\n close: 'Close',\n filterAll: 'All',\n filterOn: 'Enabled',\n filterOff: 'Disabled',\n targetAllTab: 'All agents',\n poolAddTitle: 'Add to {phase}',\n settingsTitle: 'Global settings',\n libraryTitle: 'Config snapshots',\n draftBadge: 'Preview includes unsaved draft',\n previewSyncFail: 'Live preview sync failed (retries on next edit, or press Refresh)',\n },\n} as const\n\nexport type Translate = (key: string, params?: Record<string, string | number>) => string\n","/** 提示词定制面板各组件共享的内联样式(颜色走半透明灰,随宿主主题自然适配)。 */\nexport const s = (() => {\n const flex = { display: 'flex', alignItems: 'center' }\n return {\n // ── 面板骨架(抽屉内部分栏布局) ──────────────────────────────────\n pRoot: { height: '100%', display: 'flex', flexDirection: 'column', fontFamily: 'inherit', fontSize: 13, lineHeight: 1.5, minHeight: 0 },\n head: { ...flex, gap: 10, padding: '10px 14px 8px', flexWrap: 'wrap', borderBottom: '1px solid rgba(128,128,128,.18)' },\n headTitle: { ...flex, gap: 8, fontSize: 15, fontWeight: 600, whiteSpace: 'nowrap' },\n seg: { ...flex, gap: 2, padding: 2, border: '1px solid rgba(128,128,128,.28)', borderRadius: 8 },\n segBtn: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.72, fontSize: 13, whiteSpace: 'nowrap' },\n segBtnActive: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'rgba(88,166,255,.22)', cursor: 'pointer', color: 'inherit', fontWeight: 600, fontSize: 13, whiteSpace: 'nowrap' },\n grow: { flex: 1, minWidth: 0 },\n headActions: { ...flex, gap: 6, marginLeft: 'auto' },\n iconBtn: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 28, height: 28, border: 'none', borderRadius: 8, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.75 },\n subhead: { ...flex, gap: 8, padding: '8px 14px', flexWrap: 'wrap', borderBottom: '1px solid rgba(128,128,128,.14)' },\n targetRow: { ...flex, gap: 4, overflowX: 'auto', maxWidth: '100%', scrollbarWidth: 'thin' },\n targetTab: { ...flex, gap: 6, padding: '4px 12px', border: '1px solid rgba(128,128,128,.28)', borderRadius: 999, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.78, fontSize: 12, whiteSpace: 'nowrap' },\n targetTabActive: { ...flex, gap: 6, padding: '4px 12px', border: '1px solid rgba(88,166,255,.65)', borderRadius: 999, background: 'rgba(88,166,255,.18)', cursor: 'pointer', color: 'inherit', fontWeight: 600, fontSize: 12, whiteSpace: 'nowrap' },\n body: { flex: 1, minHeight: 0, display: 'flex', alignItems: 'stretch' },\n colLeft: { width: 420, flex: 'none', display: 'flex', flexDirection: 'column', minHeight: 0, borderRight: '1px solid rgba(128,128,128,.18)', boxSizing: 'border-box' },\n colScroll: { flex: 1, minHeight: 0, overflowY: 'auto', padding: '10px 12px' },\n colFoot: { flex: 'none', ...flex, gap: 8, padding: '8px 12px', borderTop: '1px solid rgba(128,128,128,.18)', flexWrap: 'wrap' },\n colRight: { flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', minHeight: 0 },\n colRightScroll: { flex: 1, minHeight: 0, overflowY: 'auto', padding: '10px 14px' },\n groupHead: { ...flex, gap: 8, marginBottom: 6, color: 'rgba(128,128,128,.95)', fontSize: 12, fontWeight: 600 },\n // ── 通用控件(沿用旧面板的观感) ──────────────────────────────────\n list: { display: 'flex', flexDirection: 'column', gap: 6 },\n row: { ...flex, gap: 8, padding: '6px 8px', border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(128,128,128,.06)' },\n switchWrap: { ...flex, gap: 6, minWidth: 90 },\n rowBody: { flex: 1, minWidth: 0 },\n rowTitle: { ...flex, gap: 6, alignItems: 'baseline', flexWrap: 'wrap' },\n code: { fontFamily: 'monospace', fontSize: 12, wordBreak: 'break-all' },\n orderTag: { color: 'rgba(128,128,128,.8)', fontSize: 11 },\n preview: { color: 'rgba(128,128,128,.85)', fontSize: 12, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },\n previewText: { fontFamily: 'monospace', fontSize: 12, lineHeight: 1.6, whiteSpace: 'pre-wrap', wordBreak: 'break-word', flex: 1, minHeight: 0, overflowY: 'auto', padding: 10, border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(0,0,0,.18)', margin: 0 },\n toolWrap: { display: 'flex', flexWrap: 'wrap', gap: 6 },\n toolChip: { fontFamily: 'monospace', fontSize: 12, color: 'rgba(128,128,128,.95)', border: '1px solid rgba(128,128,128,.3)', borderRadius: 6, padding: '2px 6px', cursor: 'help' },\n badgeOk: { color: '#3fb950', fontSize: 11, border: '1px solid rgba(63,185,80,.5)', borderRadius: 999, padding: '0 6px' },\n badgeBlocked: { color: '#f85149', fontSize: 11, border: '1px solid rgba(248,81,73,.5)', borderRadius: 999, padding: '0 6px' },\n badgeReplaced: { color: '#d29922', fontSize: 11, border: '1px solid rgba(210,153,34,.5)', borderRadius: 999, padding: '0 6px' },\n badgeCustom: { color: '#58a6ff', fontSize: 11, border: '1px solid rgba(88,166,255,.5)', borderRadius: 999, padding: '0 6px' },\n badgeSystem: { color: 'rgba(128,128,128,.85)', fontSize: 11, border: '1px solid rgba(128,128,128,.4)', borderRadius: 999, padding: '0 6px' },\n mini: { padding: '3px 8px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', whiteSpace: 'nowrap' },\n arrowCol: { display: 'flex', flexDirection: 'column', gap: 2 },\n arrow: { padding: '0 6px', border: '1px solid rgba(128,128,128,.3)', borderRadius: 4, background: 'transparent', cursor: 'pointer', color: 'inherit', fontSize: 11, lineHeight: 1.4, opacity: 0.8 },\n rowBlocked: { opacity: 0.55 },\n injectBox: { marginTop: 10, padding: '8px', border: '1px dashed rgba(128,128,128,.4)', borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 6 },\n injectRow: { ...flex, gap: 6 },\n editBox: { display: 'flex', flexDirection: 'column', gap: 6, marginTop: 4 },\n editInput: { padding: '6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit', fontFamily: 'inherit', fontSize: 12, resize: 'vertical', width: '100%', boxSizing: 'border-box' },\n input: { padding: '4px 6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit' },\n muted: { color: 'rgba(128,128,128,.75)', fontSize: 12 },\n error: { color: '#f85149', fontSize: 12, marginBottom: 6 },\n noticeOk: { color: '#3fb950', fontSize: 12, marginBottom: 6 },\n noticeWarn: { color: '#d29922', fontSize: 12, marginBottom: 6 },\n saveBtn: { padding: '4px 12px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit' },\n saveBtnDirty: { padding: '4px 12px', border: '1px solid #d29922', borderRadius: 6, background: 'rgba(210,153,34,.15)', cursor: 'pointer', color: 'inherit' },\n }\n})()\n","/** 纯函数的预设 / 段操作助手,同时被客户端 UI 与 Node 测试复用(不触碰 IO 与 React)。 */\nimport type { Config, Inventory, OverrideData, Phase, PhaseViewKey, Preset, PresetData, ToolsConfig } from './types.ts'\n\nexport interface Section {\n name: string\n order: number\n text?: string\n active: boolean\n replaced: boolean\n /** `system` = 读自宿主提示词清单(不可删除);`custom` = 本插件注入(可删除)。 */\n source?: 'system' | 'custom'\n}\n\n/** 应用预设后需要回写到设置作用域的那部分配置字段。\n * 阶段名单为可选:旧快照不带 → 应用时保留当前值,绝不抹掉。 */\nexport interface ConfigPatch {\n sections: string[]\n sectionsBootstrap?: string[]\n sectionsCompaction?: string[]\n replace: Record<string, string>\n inject: ResolvedInject[]\n tools: ToolsConfig\n}\n\n/** 快照捕获的阶段 order 空间(always 之外的三个阶段)。 */\nconst CAPTURE_PHASES: Array<'bootstrap' | 'active' | 'compaction'> = ['bootstrap', 'active', 'compaction']\n\n/** 把一条有序名字转成相对链(每段记住它的前一段),text / custom 只给 custom 段。 */\nfunction toChain(names: string[], textOf: (name: string) => string, customOf: (name: string) => boolean, phase?: Phase): NonNullable<PresetData['order']> {\n return names.map((name, i) => ({\n name,\n after: i > 0 ? names[i - 1] : undefined,\n text: customOf(name) ? (textOf(name) ?? '') : '',\n custom: customOf(name),\n ...(phase !== undefined ? { phase } : {}),\n }))\n}\n\n/**\n * 从当前配置构建预设快照(完整捕获,含每阶段独立设定)。\n *\n * 全局相对链派生自合并后的完整段列表(而不仅是 `cfg.inject`),这样即使保存前\n * 只是屏蔽了几个段(没有重排),预设仍会携带完整的有序集合,应用时才能得到一个\n * 有意义的「激活列表」。在此之上,bootstrap / active / compaction 各再带一条自己\n * 的相对链 —— 数据源就是 UI 逐阶段持久化的注入条目(每阶段独立的 order 空间),\n * 否则阶段化的名单与排序在「导出 → 导入 → 应用」后就丢了。\n */\nexport function buildPresetData(cfg: Config, merged: Section[]): PresetData {\n const globalNames = merged.map((sec) => sec.name)\n const textOf = new Map(merged.map((sec) => [sec.name, sec.text ?? ''] as const))\n const customOf = new Map(merged.map((sec) => [sec.name, sec.source === 'custom'] as const))\n const order = toChain(globalNames, (n) => textOf.get(n) ?? '', (n) => customOf.get(n) === true)\n for (const phase of CAPTURE_PHASES) {\n const items = (cfg.inject ?? [])\n .filter((item) => item.phase === phase)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n if (items.length === 0) continue\n order.push(...toChain(\n items.map((item) => item.name),\n (n) => items.find((item) => item.name === n)?.text ?? '',\n (n) => items.find((item) => item.name === n)?.custom === true,\n phase,\n ))\n }\n const data: PresetData = {\n sections: cfg.sections,\n replace: cfg.replace,\n order,\n tools: cfg.tools,\n }\n // 非空才捕获:没有阶段名单的配置导出的快照与改动前逐键一致。\n if ((cfg.sectionsBootstrap ?? []).length > 0) data.sectionsBootstrap = cfg.sectionsBootstrap\n if ((cfg.sectionsCompaction ?? []).length > 0) data.sectionsCompaction = cfg.sectionsCompaction\n return data\n}\n\n/**\n * 把宿主清单段与用户注入列表按 order 合并、排序。\n * 读自清单(其他插件产出)的段标记为 `system`;本插件生成的段带隐藏的\n * `custom` 标记,标记为 `custom`。来源只由隐藏标记决定——绝不靠名字碰撞\n * 判断——因此即使自定义段恰好与某个清单段重名,它也能保住自己的身份\n * (以及可删除性),并在切换预设后依然成立。自定义段始终渲染自己的文本,\n * 永远不会显示为「<动态生成>」。\n */\nexport function mergeSections(inv: Inventory | null, cfg: Config, blockedNames: ReadonlySet<string>): Section[] {\n const map = new Map<string, Section>()\n for (const sec of inv?.sections ?? []) map.set(sec.name, { ...sec, source: 'system' })\n for (const item of cfg.inject ?? []) {\n const isCustom = item.custom === true\n const existing = map.get(item.name)\n if (existing) {\n map.set(item.name, isCustom\n ? { ...existing, order: item.order, text: item.text ?? '', source: 'custom' }\n : { ...existing, order: item.order, source: 'system' })\n } else {\n map.set(item.name, {\n name: item.name,\n order: item.order,\n text: item.text ?? '',\n active: !blockedNames.has(item.name),\n replaced: false,\n source: isCustom ? 'custom' : 'system',\n })\n }\n }\n return [...map.values()].sort((a, b) => a.order - b.order).map((sec, i) => ({ ...sec, order: i }))\n}\n\n/** ConfigPatch 里对外的注入条目(always 组刻意不带 phase 键)。 */\nexport interface ResolvedInject {\n name: string\n order: number\n text: string\n custom?: boolean\n phase?: Phase\n}\n\n/**\n * 把一条相对链解析为绝对有序名字(0..n-1)。\n * 没有锚点(或锚点不在本组内)的名字按原始顺序排在最前;每个带锚点的名字\n * 插到其锚点之后;剩余的名字(存在环)追加到末尾。\n */\nfunction resolveChain(list: Array<{ name: string; after?: string }>): string[] {\n const afterMap = new Map<string, string | undefined>()\n for (const sec of list) afterMap.set(sec.name, sec.after)\n\n const result: string[] = []\n const placed = new Set<string>()\n\n for (const sec of list) {\n const anchor = afterMap.get(sec.name)\n if (!anchor || !afterMap.has(anchor)) { result.push(sec.name); placed.add(sec.name) }\n }\n\n let changed = true\n while (changed) {\n changed = false\n for (const sec of list) {\n if (placed.has(sec.name)) continue\n const anchor = afterMap.get(sec.name)\n if (anchor && placed.has(anchor)) {\n result.splice(result.indexOf(anchor) + 1, 0, sec.name)\n placed.add(sec.name)\n changed = true\n }\n }\n }\n\n for (const sec of list) {\n if (!placed.has(sec.name)) { result.push(sec.name); placed.add(sec.name) }\n }\n return result\n}\n\n/**\n * 把快照里的相对顺序解析为注入条目列表。\n *\n * order 条目可以带 `phase`:同名而不同 phase 的多条 = 该段在多个阶段各有自己的\n * 位置(每阶段有独立的 order 空间,与 UI 的 phaseInjectEntries 一致)。无 phase\n * 的条目属于 always 组 —— 也就是旧快照的单一全局序,输出形状与旧实现逐键一致\n * (刻意不写 phase 键,「保存 → 应用 = 不动点」的不变量依赖键形状完全相同)。\n */\nexport function resolveOrder(presetOrder: PresetData['order']): ResolvedInject[] {\n const list = presetOrder ?? []\n const groups = new Map<Phase, NonNullable<PresetData['order']>>([['always', []]])\n for (const sec of list) {\n const phase = sec.phase ?? 'always'\n const group = groups.get(phase)\n if (group) group.push(sec)\n else groups.set(phase, [sec])\n }\n const out: ResolvedInject[] = []\n for (const [phase, members] of groups) {\n const textMap = new Map(members.map((x) => [x.name, x.text ?? '']))\n const customMap = new Map(members.map((x) => [x.name, x.custom === true]))\n const names = resolveChain(members)\n out.push(...names.map((name, i) => (phase === 'always'\n ? { name, order: i, text: textMap.get(name) ?? '', custom: customMap.get(name) }\n : { name, order: i, text: textMap.get(name) ?? '', custom: customMap.get(name), phase })))\n }\n return out\n}\n\n/**\n * 计算应用预设时的配置补丁:\n * - 同名段被覆盖(顺序列表在运行时驱动这一行为)\n * - 预设中有、当前系统里匹配不上的段默认跳过(跨系统导入不凭空建段)\n * - 当前有、但不在预设有序列表中的段默认被屏蔽\n * - 只有预设的「激活段」(在 order 列表且不在其屏蔽名单中)被解除屏蔽;\n * 预设自己屏蔽的段保持屏蔽。\n *\n * 当前配置里存在、但不在预设有序列表中的自定义注入段会被保留到结果的\n * inject 列表中(因此仍然可见)并置为禁用(加入屏蔽集合),而不是被静默\n * 丢弃——预设不能让用户自己注入的凭空消失。\n */\nexport function applyPresetData(data: PresetData, cfg: Config, currentNames: ReadonlySet<string>): ConfigPatch {\n const presetOrder = data.order ?? []\n const presetNames = new Set(presetOrder.map((x) => x.name))\n // 黑名单同样按当前系统过滤:匹配不上的名字跳过(屏蔽不存在的段没有意义,\n // 还会污染配置,让下一次快照出现「sections ⊆ order」被破坏的孤儿名单)。\n const blocked = new Set((data.sections ?? []).filter((n) => currentNames.has(n)))\n\n // 注入列表 = 预设解析出的顺序,再追加当前配置中存在、但预设列表没有的\n // 自定义注入段。让它们留在 `inject` 里才能保持可见;随后统一置为禁用。\n // 被保留的自定义段接在预设自身的下标之后;若预设只覆盖一小部分段,它们\n // 可能与清单原生 order 并列——合并视图按稳定排序(清单在前),顺序仍是\n // 确定性的,且下一次重排/持久化会把所有下标重新连续化。\n // 预设 order 先按当前系统的段名过滤(匹配不上就跳过,绝不凭空建段)——\n // 在解析前过滤让保留条目的 order 保持按组连续;锚点被过滤掉时\n // resolveChain 会把该条目回退到组尾,顺序仍然确定。\n const inject = resolveOrder(presetOrder.filter((x) => currentNames.has(x.name)))\n const kept = new Set(inject.map((x) => x.name))\n let order = inject.length\n for (const item of cfg.inject ?? []) {\n if (!item || !item.name || presetNames.has(item.name) || kept.has(item.name)) continue\n kept.add(item.name)\n inject.push({ name: item.name, order: order++, text: item.text ?? '', custom: item.custom === true })\n }\n\n // 仅当预设确实定义了 order 列表时才强制执行「激活集合」。\n // 空的 order(例如手工编写 / 只屏蔽了几个段的导入预设)绝不能把当前所有\n // 段默认禁用。\n if (presetOrder.length > 0) {\n const activeNames = new Set([...presetNames].filter((n) => !blocked.has(n)))\n for (const name of currentNames) if (!presetNames.has(name)) blocked.add(name)\n for (const name of activeNames) blocked.delete(name)\n }\n\n // 阶段化字段一律「快照有则覆盖,缺省则保留当前值」:旧快照(没有这些键)\n // 应用后仍只换静态过滤,绝不把用户已有的阶段目录与阶段名单抹平。\n // 缺席时不留下显式 undefined 键 —— 「保存→应用 = 不动点」的不变量依赖键形状。\n const keptCatalogs: ToolsConfig = {}\n const bootstrap = data.tools?.bootstrap !== undefined ? data.tools.bootstrap : cfg.tools?.bootstrap\n const compaction = data.tools?.compaction !== undefined ? data.tools.compaction : cfg.tools?.compaction\n if (bootstrap !== undefined) keptCatalogs.bootstrap = bootstrap\n if (compaction !== undefined) keptCatalogs.compaction = compaction\n const patch: ConfigPatch = {\n sections: [...blocked],\n replace: { ...(cfg.replace ?? {}), ...(data.replace ?? {}) },\n inject,\n tools: {\n exclude: data.tools?.exclude ?? [],\n ...keptCatalogs,\n },\n }\n if (Array.isArray(data.sectionsBootstrap)) patch.sectionsBootstrap = data.sectionsBootstrap\n if (Array.isArray(data.sectionsCompaction)) patch.sectionsCompaction = data.sectionsCompaction\n return patch\n}\n\n/**\n * 从配置中移除一个 custom(本插件注入)段:它从 inject 列表消失,不再被\n * 强制加入屏蔽集合,相关的替换文本也被清除。剩余的 inject 条目会被重新\n * 编号为连续的 0..n-1(虚拟下标模型),删除不会留下空洞。读自宿主清单的\n * system 段无法这样移除(下次读取清单时它们又会回来)。\n */\nexport function removeSection(name: string, cfg: Config): Pick<Config, 'sections' | 'inject' | 'replace'> {\n const sections = (cfg.sections ?? []).filter((n) => n !== name)\n const inject = (cfg.inject ?? [])\n .filter((item) => item.name !== name)\n .map((item, i) => ({ ...item, order: i }))\n const replace = { ...(cfg.replace ?? {}) }\n delete replace[name]\n return { sections, inject, replace }\n}\n\n// ── 工具过滤 ─────────────────────────────────────────────────────────────\n\nexport type ToolsCfg = { exclude?: string[] }\n\n/** 三个阶段部分的固定展示顺序:引导期 → 常驻期 → 压缩受控期。\n * 恒定全部渲染 —— 预设没有某个阶段时该部分只是空的,绝不隐藏。 */\nexport const PART_ORDER: PhaseViewKey[] = ['bootstrap', 'active', 'compaction']\n\n/**\n * 一个阶段部分写回哪一份过滤配置:引导期 → `tools.bootstrap`、压缩受控期 →\n * `tools.compaction`、常驻期 → 静态 `tools.exclude`。三份名单互不继承。\n */\nexport function phaseConfigKey(key: PhaseViewKey): 'bootstrap' | 'compaction' | 'static' {\n return key === 'active' ? 'static' : key\n}\n\n/**\n * 把一个阶段的 exclude 名单写回整份工具配置,返回新对象(其余阶段原样保留)。\n * 一次拖放可能要同时改两个阶段的名单(搬移 = 源阶段隐藏 + 目标阶段显示),必须\n * 在同一个对象上连续套完再落一次写入 —— 分两次写会各自基于旧 cfg 计算而互相覆盖。\n */\nexport function withPhaseExclude(tools: ToolsConfig | undefined, key: PhaseViewKey, exclude: string[]): ToolsConfig {\n const base = tools ?? {}\n const target = phaseConfigKey(key)\n if (target === 'bootstrap') return { ...base, bootstrap: { ...(base.bootstrap ?? {}), exclude } }\n if (target === 'compaction') return { ...base, compaction: { ...(base.compaction ?? {}), exclude } }\n return { ...base, exclude }\n}\n\n/**\n * 把一个阶段的 add 名单(要加回该阶段的工具)写回整份工具配置,返回新对象。\n * 与 withPhaseExclude 对称:常驻期写静态 `tools.add`,引导期写 `tools.bootstrap.add`,\n * 压缩受控期写 `tools.compaction.add`,其余阶段原样保留。\n */\nexport function withPhaseAdd(tools: ToolsConfig | undefined, key: PhaseViewKey, add: string[]): ToolsConfig {\n const base = tools ?? {}\n const target = phaseConfigKey(key)\n if (target === 'bootstrap') return { ...base, bootstrap: { ...(base.bootstrap ?? {}), add } }\n if (target === 'compaction') return { ...base, compaction: { ...(base.compaction ?? {}), add } }\n return { ...base, add }\n}\n\n/** 某个工具在当前黑名单配置下是否被隐藏。 */\nexport function isToolHidden(name: string, toolsCfg: ToolsCfg | undefined): boolean {\n return (toolsCfg?.exclude ?? []).includes(name)\n}\n\n/** 切换某个工具的隐藏状态,返回新的工具配置(不改原对象)。 */\nexport function toggleTool(name: string, currentlyHidden: boolean, toolsCfg: ToolsCfg | undefined): ToolsCfg {\n const exclude = (toolsCfg?.exclude ?? []).slice()\n if (currentlyHidden) { const i = exclude.indexOf(name); if (i >= 0) exclude.splice(i, 1) }\n else if (!exclude.includes(name)) exclude.push(name)\n return { exclude }\n}\n\n// ── 按 agent 预设的覆盖编辑 ─────────────────────────────────────────────\n\n/**\n * 编辑目标的「显示视图」:全局目标返回原配置;agent 预设目标把该预设\n * override 的字段叠在全局值之上展示(空缺字段显示全局继承值)。`presets`\n * 与 `activePreset` 永远来自全局 —— 预设快照库本身不分作用域。\n */\nexport function editView(cfg: Config, target: string | undefined): Config {\n if (!target) return cfg\n const ovr = cfg.overrides?.[target] ?? {}\n return {\n sections: ovr.sections ?? cfg.sections,\n sectionsBootstrap: ovr.sectionsBootstrap ?? cfg.sectionsBootstrap,\n sectionsCompaction: ovr.sectionsCompaction ?? cfg.sectionsCompaction,\n replace: ovr.replace ?? cfg.replace,\n inject: ovr.inject ?? cfg.inject,\n tools: {\n exclude: ovr.tools?.exclude ?? cfg.tools?.exclude,\n add: ovr.tools?.add ?? cfg.tools?.add,\n bootstrap: ovr.tools?.bootstrap ?? cfg.tools?.bootstrap,\n compaction: ovr.tools?.compaction ?? cfg.tools?.compaction,\n },\n presets: cfg.presets,\n activePreset: cfg.activePreset,\n }\n}\n\n/**\n * 往某个 agent 预设的 override 里写入一个字段,返回新的 overrides 记录\n * (不改原对象)。与 editView 配对:编辑视图里看到的继承值一旦被修改,\n * 就整体落成该预设自己的字段(字段级接管语义)。\n */\nexport function setOverrideField(\n cfg: Config,\n target: string,\n field: 'sections' | 'replace' | 'inject' | 'tools',\n value: unknown,\n): Record<string, OverrideData> {\n return {\n ...(cfg.overrides ?? {}),\n [target]: { ...(cfg.overrides?.[target] ?? {}), [field]: value },\n }\n}\n\n// ── 预设列表操作 ──────────────────────────────────────────────────────────\n\n/** 序列化预设用于导出(JSON 安全的完整快照)。 */\nexport function serializePreset(preset: Preset): { name: string; data: PresetData } {\n return { name: preset.name, data: preset.data }\n}\n\n/**\n * Derive a safe default filename for a preset export. User-entered preset\n * names may contain characters that are illegal in filenames (`/\\:*?\"<>|`,\n * control chars) — those are replaced; a trailing dot/space is trimmed\n * (invalid on Windows); an empty or all-illegal result falls back to\n * `preset`.\n */\nexport function presetExportFilename(name: string): string {\n const sanitized = String(name)\n .replace(/[<>:\"/\\\\|?*\\u0000-\\u001f]/g, '_')\n .trim()\n .replace(/[. ]+$/, '')\n const base = sanitized === '' ? 'preset' : sanitized\n return `${base}.json`\n}\n\n/**\n * 导入预设:同名的会被跳过,只追加名字不同的预设。返回新的预设列表\n * (若没有任何变更则返回原列表)。\n */\nexport function addImportedPresets(existing: Preset[], parsed: unknown, makeId: () => string): Preset[] {\n const incoming = Array.isArray(parsed) ? parsed : [parsed]\n const existingNames = new Set(existing.map((p) => p.name))\n const added = incoming\n .filter((p) => p && typeof (p as { name?: unknown }).name === 'string' && !existingNames.has((p as Preset).name))\n .map((p) => ({ id: makeId(), name: (p as Preset).name, data: ((p as Preset).data ?? {}) as PresetData }))\n return added.length > 0 ? [...existing, ...added] : existing\n}\n\n/** 删除某个预设;若它正是当前激活的预设,则同时清除 activeId。 */\nexport function removePreset(presets: Preset[], id: string, activeId?: string): { presets: Preset[]; activeId?: string } {\n return {\n presets: presets.filter((p) => p.id !== id),\n activeId: activeId === id ? undefined : activeId,\n }\n}\n\n/** 生成预设 id:时间戳 + 随机段(base36),够用且无需额外依赖。 */\nexport function genId(): string {\n return 'p_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 7)\n}\n","/**\n * 提示词段面板的纯状态逻辑(无 React / 无 IO)。\n * 与 src/client/SectionsTab.tsx 共享同一份实现(浏览器里随 client bundle\n * 打包;node --test 直接 import 本文件跑单测),保证「测试即上线代码」。\n *\n * 阶段模型:引导期(bootstrap)/ 常驻期(active)/ 压缩受控期(compaction)\n * 恒定全部显示(预设没有某个阶段时该部分就是空的),各自拥有独立的注入\n * 名单与 order 空间;屏蔽按「每阶段独立名单」写回(引导期 →\n * sectionsBootstrap,压缩受控期 → sectionsCompaction,常驻期 → 全局 sections)。\n * 入参统一是名义阶段键,不再有「同形折叠组」这种把引导期当常驻期用的形态。\n */\n\n/** 名义阶段键 → 屏蔽名单写回目标(常驻期用全局 sections)。 */\nexport function sectionListOf(key) {\n return key === 'bootstrap' ? 'bootstrap' : key === 'compaction' ? 'compaction' : 'global'\n}\n\n/** 名义阶段键 → 注入阶段:压缩受控期是独立注入阶段(compaction)。 */\nexport function injectPhaseOf(key) {\n return key === 'bootstrap' ? 'bootstrap' : key === 'active' ? 'active' : 'compaction'\n}\n\n/** 某注入段出现在哪些阶段部分:always 全阶段;bootstrap/compaction/active\n * 仅各自对应的阶段(与服务端 filterInjectByPhase 的三态互相独立一致)。 */\nexport function acceptsInjectFor(key, phase) {\n if (phase === 'always') return true\n return phase === key\n}\n\n/** 该阶段自己的屏蔽名单(三态互相独立:引导期 sectionsBootstrap /\n * 压缩受控期 sectionsCompaction / 常驻期 sections,互不继承、互不影响)。 */\nexport function deniedNames(cfg, key) {\n const list = sectionListOf(key)\n return list === 'bootstrap' ? (cfg.sectionsBootstrap ?? [])\n : list === 'compaction' ? (cfg.sectionsCompaction ?? [])\n : (cfg.sections ?? [])\n}\n\n/**\n * 某个阶段部分当前的注入身份(含未保存草稿)。\n *\n * `names` = 本部分可见的注入段名(本阶段专属 + 跨阶段的 always)。post 视图来自\n * 「上次保存」的服务端结果,删除只改草稿,所以 post 独有段必须有 names 背书才\n * 能显示 —— 否则刚删掉的自定义段会以「系统段」复活(身份只认 custom 标记,条目\n * 没了就被判成系统),再经一次重排就被写成 custom:false 空文本,用户填的内容被\n * 抹平。`custom` 只收真正的自定义段,`order` 只收本阶段的草稿序。\n *\n * `text` = 本阶段生效的用户文本:自定义段自带的文本,以及**系统段在本阶段被\n * 替换后的文本**(非空即替换)。系统段的文本必须按阶段存 —— 注入条目本来就带\n * `phase`,服务端按阶段筛选,所以三个阶段各改各的文本互不影响;旧的全局\n * `replace` 字典一份文本对三个阶段同时生效,已不承担界面编辑。\n */\nexport function injectedAt(cfg, key) {\n const phase = injectPhaseOf(key)\n const names = new Set()\n const custom = new Set()\n const text = new Map()\n const order = new Map()\n for (const item of cfg.inject ?? []) {\n if (item === null || typeof item !== 'object' || typeof item.name !== 'string') continue\n const itemPhase = item.phase ?? 'always'\n if (itemPhase === phase) order.set(item.name, item.order ?? 0)\n if (!acceptsInjectFor(key, itemPhase)) continue\n names.add(item.name)\n if (item.text && !text.has(item.name)) text.set(item.name, item.text)\n if (item.custom === true) custom.add(item.name)\n }\n return { phase, names, custom, text, order }\n}\n\n/**\n * 屏蔽/恢复一个段(当前阶段语义):返回需要写盘的字段补丁。\n * 三态名单互相独立:只读写本阶段自己的名单(引导期 → sectionsBootstrap,\n * 压缩受控期 → sectionsCompaction,常驻期 → sections),屏蔽 / 恢复都绝不\n * 波及其它阶段的名单 —— 一个阶段的屏蔽不再连带屏蔽另一个阶段。\n * 名单无变化时不产出字段(空补丁 = 不写盘),避免把继承值冻结成无意义的\n * 空数组覆盖。\n */\nexport function blockPatch(cfg, key, name, blocked) {\n const list = sectionListOf(key)\n const field = list === 'bootstrap' ? 'sectionsBootstrap' : list === 'compaction' ? 'sectionsCompaction' : 'sections'\n const cur = (cfg[field] ?? []).slice()\n const i = cur.indexOf(name)\n if (blocked) {\n if (i >= 0) return {}\n cur.push(name)\n } else {\n if (i < 0) return {}\n cur.splice(i, 1)\n }\n return { [field]: cur }\n}\n\n/**\n * 重排/插入一个阶段的有序行列表:把 dragName 从列表中移除后,插入到\n * targetName 行之上(pos='above')或之下(pos='below');返回新列表。\n * 拖入的新段由调用方以 newRow 提供,插入后保留在列表中(其余行保持原样)。\n */\nexport function reorderInsert(rows, dragName, targetName, pos, newRow = null) {\n const base = rows.filter((row) => row.name !== dragName)\n const idx = base.findIndex((row) => row.name === targetName)\n if (idx < 0) return null\n const insertAt = Math.max(0, Math.min(pos === 'above' ? idx : idx + 1, base.length))\n const entry = newRow ?? rows.find((row) => row.name === dragName)\n if (!entry) return null\n base.splice(insertAt, 0, entry)\n return base\n}\n\n/**\n * 持久化一个阶段的有序列表(v1 persistOrder 的逐阶段版):把 rows(有序行)\n * 写成该阶段的注入条目,order = 连续整数(0,1,2,…)——「虚拟 order 决定注入\n * 顺序」;文本优先级 = 本阶段的用户替换文本(row.override)→ 自定义段自带的\n * 文本(row.text)→ 空文本(= 仅 order 覆盖,服务端保留原文)。三者缺一不可:\n * 重排走的就是这个函数,漏掉 override 会让一次拖动把用户在该阶段改的文本抹平。\n * 其它阶段(含 always)的注入条目原样保留。\n */\nexport function phaseInjectEntries(cfg, key, rows) {\n const phase = injectPhaseOf(key)\n const others = (cfg.inject ?? []).filter((item) => (item.phase ?? 'always') !== phase)\n const entries = rows.map((row, i) => ({\n name: row.name,\n order: i,\n text: row.override || (row.custom ? (row.text ?? '') : ''),\n phase,\n custom: row.custom,\n }))\n return [...others, ...entries]\n}\n\n/**\n * 三态同步持久化:rowsByKey 给出三个阶段各自的有序行集合(bootstrap /\n * active / compaction),生成完整 inject 列表 —— always 条目原样保留,三个\n * 阶段各自写成连续虚拟 order 的注入条目(条目形状与 phaseInjectEntries 完全\n * 一致)。用于「三态同步」的一次写入:edit 对 inject 是整体替换,逐阶段各写\n * 一次会互相覆盖只留下最后一次。\n */\nexport function mergedPhaseInjectEntries(cfg, rowsByKey) {\n const always = (cfg.inject ?? []).filter((item) => (item.phase ?? 'always') === 'always')\n const entries = ['bootstrap', 'active', 'compaction'].flatMap((key) => {\n const phase = injectPhaseOf(key)\n return (rowsByKey[key] ?? []).map((row, i) => ({\n name: row.name,\n order: i,\n text: row.override || (row.custom ? (row.text ?? '') : ''),\n phase,\n custom: row.custom,\n }))\n })\n return [...always, ...entries]\n}\n\n/**\n * 一个阶段部分的全部行(提示词 Tab 每行):行集合 = 「真实进入该阶段装配的段」\n *(post 视图,与预览一致 —— 预设原生阶段插件裁剪掉的段不显示)∪「被屏蔽的段」\n *(屏蔽名单含未保存草稿,随时可反选)∪「配置里属于该阶段的自定义注入段」。\n * 顺序以 base(预过滤)视图的骨架为底,再叠加「该阶段的注入 order」草稿序\n * —— 未保存的重排立即反映到界面。文本 post 优先(替换 / 注入结果),回退\n * base 原文与注入文本。身份只认注入条目的 custom 隐藏标记,绝不互相转换。\n * `view` = 三阶段预览装配里的对应阶段(可为 null = 视为空)。从 SectionsTab\n * 的 rowsOf 原样迁出 —— 纯函数,UI 与 node --test 单测共用同一份实现。\n */\nexport function phaseRows(cfg, view, key) {\n const replace = cfg.replace ?? {}\n const denied = new Set(deniedNames(cfg, key))\n const postByName = new Map((view?.sections ?? []).map((sec) => [sec.name, sec]))\n const baseByName = new Map((view?.baseSections ?? []).map((sec) => [sec.name, sec]))\n const { phase, names: injectedHere, custom: customNames, text, order: phaseOrder } = injectedAt(cfg, key)\n const names = []\n const seen = new Set()\n const push = (name) => { if (!seen.has(name)) { seen.add(name); names.push(name) } }\n // base 骨架顺序里取 post 段与被屏蔽段(保持自然位置)。被屏蔽取并集:\n // 当前草稿名单(切换立即反馈)∪ 上次保存的名单(base 的 blocked 标记 ——\n // 刚解除屏蔽的行不会立即消失,仍可再勾回去)。\n for (const sec of view?.baseSections ?? []) {\n if (postByName.has(sec.name) || denied.has(sec.name) || sec.blocked === true) push(sec.name)\n }\n // post 独有段 = 本插件注入进去的段(post 恒为 base 减去屏蔽再加上注入),\n // 追加在尾部。但它来自「上次保存」的服务端结果,删除只改草稿,所以必须\n // 有当前 inject 条目背书 —— 否则刚删掉的自定义段会以「系统段」复活(身份\n // 只认 inject 的 custom 标记,条目没了就被判成系统),再经一次重排就被写成\n // custom:false 空文本,用户填的内容被抹平。\n for (const name of postByName.keys()) {\n if (baseByName.has(name) || injectedHere.has(name)) push(name)\n }\n // 精确属于该阶段的注入条目:自定义段始终显示;系统段在装配输入里见过\n //(base/post)**或**带着用户为该阶段填的文本(= 从全部池显式加进来的)才\n // 显示 —— 既让拖入立即出现,又不让历史遗留的陈旧条目把装配里根本没有的段带回来。\n for (const item of cfg.inject ?? []) {\n if (item === null || typeof item !== 'object' || typeof item.name !== 'string') continue\n if ((item.phase ?? 'always') !== phase) continue\n if (item.custom === true || text.get(item.name) || baseByName.has(item.name) || postByName.has(item.name)) push(item.name)\n }\n // 跨阶段生效的自定义段(如 always)。\n for (const name of customNames) push(name)\n const rows = names.map((name) => {\n // 本阶段的用户替换文本:只认属于本阶段的注入条目(injectedAt 已按阶段筛)。\n const override = text.get(name) ?? ''\n return {\n name,\n text: postByName.get(name)?.text ?? baseByName.get(name)?.text ?? '',\n replaced: override !== '' || Object.hasOwn(replace, name),\n custom: customNames.has(name),\n override,\n blocked: denied.has(name),\n }\n })\n // 草稿序叠加:该阶段有注入 order 就按它重排当前行(未保存的拖动/箭头\n // 立即生效);无 order 的行走 base 骨架相对序(稳定排序)。\n if (phaseOrder.size > 0) {\n const fallback = new Map(rows.map((row, i) => [row.name, i]))\n rows.sort((a, b) => (phaseOrder.get(a.name) ?? fallback.get(a.name) ?? 0) - (phaseOrder.get(b.name) ?? fallback.get(b.name) ?? 0))\n }\n return rows\n}\n\n/**\n * 「应用中文」(开关开启方向,等效手动编辑):把三个阶段各自的行里名字命中\n * zhMap 的**非自定义**行打上中文文本补丁,再经 mergedPhaseInjectEntries 生成\n * 完整 inject 列表(调用方写入编辑草稿,保存后生效)。zhMap 条目为字符串\n *(整段替换)或函数(入参该行原文,返回空值 = 放弃替换,如 tools:sdk 的围栏\n * 守卫);未命中的行与阶段原样保留,段数与注入不增不减。自定义段是用户自撰\n * 内容,绝不覆盖。`views` = 三阶段预览装配(键可为 null —— 该阶段行集视为空)。\n */\nexport function zhMergedInjectEntries(cfg, views, zhMap) {\n const patched = {}\n for (const key of ['bootstrap', 'active', 'compaction']) {\n patched[key] = phaseRows(cfg, views?.[key] ?? null, key).map((row) => {\n if (row.custom) return row\n const entry = zhMap?.[row.name]\n if (entry === undefined) return row\n const zh = typeof entry === 'function' ? entry(row.text) : entry\n return zh ? { ...row, override: zh, text: zh } : row\n })\n }\n return mergedPhaseInjectEntries(cfg, patched)\n}\n\n/**\n * 「回归英文」(开关关闭方向):把三个阶段行里命中译本的非自定义行的替换\n * 文本清空 —— 系统段的注入条目回落为仅 order 覆盖,服务端恢复注册表英文\n * 原文。与 zhMergedInjectEntries 严格对称:开关独占这些段的文本所有权,\n * 关闭即整体回英文(用户在开启期间的手工微调一并清除)。自定义段不碰。\n */\nexport function zhRevertInjectEntries(cfg, views, zhMap) {\n const patched = {}\n for (const key of ['bootstrap', 'active', 'compaction']) {\n patched[key] = phaseRows(cfg, views?.[key] ?? null, key).map((row) => {\n if (row.custom || row.override === '' || zhMap?.[row.name] === undefined) return row\n return { ...row, override: '', text: '' }\n })\n }\n return mergedPhaseInjectEntries(cfg, patched)\n}\n\n/**\n * 开关状态探测:任一注入条目的文本与**字符串译本**逐字相等即视为已应用。\n * 只探测字符串译本(函数译本无法从译文反推),而应用时所有命中行都会写入、\n * 字符串译本必然存在 —— 足以作为探针。混合状态(用户手动还原了个别段)仍算\n * 开启,关闭方向会整体回归英文。\n */\nexport function zhApplied(cfg, zhMap) {\n for (const item of cfg?.inject ?? []) {\n if (item === null || typeof item !== 'object' || typeof item.name !== 'string') continue\n const zh = zhMap?.[item.name]\n if (typeof zh === 'string' && zh !== '' && item.text === zh) return true\n }\n return false\n}","/**\n * 中文段译本(专属定制)—— 小段集合。\n * 规则:`{{...}}` 提示词变量、工具名、参数名、路径、URL、代码一律原样保留,\n * 只译散文。plan:policy 是动态段(清单里拿不到稳定文本),不设译本条目,\n * 按「名字对不上就跳过」规则自然豁免。\n */\nexport const CORE = {\n 'harness:identity': `你是一个由 DeepSeek Harness 驱动的 AI 智能体。`,\n\n 'harness:source': `DeepSeek Harness 的实现代码检出位于 C:\\\\nvm\\\\v22.22.0\\\\node_modules\\\\@deepseek-ai\\\\dsh\\\\。检出位置与当前工作目录是两个独立的值,可能不同;绝不要根据该路径推断工作目录。请用 pwd 确定当前工作目录。该检出只用于查看或扩展 DSH 本身。`,\n\n 'app:web-surface': `你正在通过 DeepSeek Harness 的 Web 图形界面(http://127.0.0.1:3080)与用户交互。当用户提到「这个页面」「这个 GUI」「这个应用」而没有指名其他目标时,指的就是这个 GUI。浏览器不提供任何隐式的 DOM、路由或截图上下文。客户端插件的 HMR 接收器处于激活状态,但只有当 \\`pnpm run dev:web\\` 也在同一检出里运行以重建其包时,客户端插件的改动才能免刷新重载;在承诺自动更新之前,先确认该监视进程在运行。其他任何改动 —— apps/web 外壳与普通包 —— 都需要重新构建受影响的 Web 产物,并在页面刷新后用这个既有 URL 验证。另起一个服务器不会更新这个 GUI。apps/web 的 Vite 入口只构建外壳,不是独立应用,因为只有 dsh web 会注入 window.__DSH_BOOT__。除非用户要求,不要启动替代服务器;确有必要时,用受管后台作业运行,并核实其确切 URL。`,\n\n 'deployment:persona': `你是一个由 {{model}} 模型驱动的编码智能体。你的工作目录是 {{cwd}}。`,\n\n 'tool:read': `使用 read 工具(而不是 cat 之类的 shell 命令)查看文本文件。结果带有行号;对大文件可用 offset 与 limit 继续读取。`,\n\n 'tool:write': `使用 write 工具新建文件或整体替换文件内容。已有文件会被覆盖,因此先 read 现有文件(默认的 fs-observation-policy 有此要求),并优先用 edit 做针对性修改。`,\n\n 'tool:edit': `使用 edit 工具对现有的 UTF-8 文本文件做针对性修改。它把字面量 old_string 替换为 new_string;默认要求 old_string 恰好出现一次。若 old_string 出现多次,请提供更具体的 old_string,或将 replace_all 设为 true。先 read 文件(默认的 fs-observation-policy 有此要求),除非你在本会话中刚创建或刚编辑过它。`,\n\n 'tool:glob': `使用 glob 工具(而不是 shell 的 find)按路径模式发现文件。不含 \"/\" 的模式在任意深度匹配基本名,因此 \"*\" 匹配的是整棵树里的每个文件,而不只是顶层。结果只含文件、绝不含目录,且包含隐藏与被忽略的文件:完全符合的结果按修改时间顺序返回;结果超量时,保留按修改时间排序的前缀。`,\n\n 'tool:grep': `使用 grep 工具(而不是 shell 的 grep 或 rg)搜索文件内容。需要上下文时,用 read 读取匹配到的文件。`,\n\n 'tool:pwsh': `非零退出码会以 \\`[exit code: N]\\` 标记呈现;继续之前先排查失败。在 Windows 上,被杀掉的进程以 \\`[exit code: 1]\\` 收尾且没有信号标记;把中断之后的裸退出码 1 视为进程被终止,而不是命令失败。`,\n\n 'tool:jobs': `跟踪你启动的每一个后台作业 id。作业完成时你会在会话内收到通知 —— 不要忙轮询或空等某个作业;继续做独立的步骤,不要重复正在运行的作业的工作。给出最终答复之前,用 job_output 收集每一个仍然相关的作业(只在确实被它阻塞时才设 wait: true),并用 job_kill 终止已经不再要紧的作业。`,\n\n 'tool:web_search': `使用 web_search 工具在网络上发现最新信息。必填的 queries 数组接受 1–4 条非空搜索查询;单次搜索用只含一项的数组。它返回一个可选的 answer 和一份来源 URL 列表。有来源摘要时尽量使用,并以 Markdown 链接的形式引用相关 URL。`,\n\n 'tool:web_fetch': `使用 web_fetch 工具获取特定 HTTP(S) URL 的内容(例如来自 web_search 的某条结果)。它返回解码为文本的页面内容。使用其内容时,以 Markdown 链接的形式引用该 URL。`,\n\n 'tool:goal': `goal 工具用于当前会话中的一个长期运行的完成目标。create_goal 可以从任何语言的直接人类请求中推断目标意图;常规的单轮工作不要创建目标。调用 update_goal 之前先调用 get_goal,并逐字复制它的 goal_id 与 revision。会话恢复或 fork 之后,活跃目标会被解除武装:当人类以任何措辞、任何语言要求继续或恢复时,用 update_goal 的 resume 动作重新武装它。只有目标真正达成才标记 complete。同一个阻塞条件至少连续 3 个目标轮次仍未解除,才可标记 blocked,并在 blocked_reason 里写明那个具体条件;困难、不确定或还有剩余工作都不算阻塞。`,\n\n 'tool:workflow': `只有当用户明确要求 workflow 或大规模多智能体编排时,才使用 workflow 工具:你编写一个 JavaScript 脚本(工具描述里写明确切格式),把工作扇出到大量子智能体,带阶段与结构化结果。只有一两次委派时,优先用普通的 subagent 调用。`,\n\n 'tool:ralph': `只有当直接人类明确要求 Ralph 循环或全新智能体迭代执行时,才使用 ralph 工具。每一轮 Ralph 都启动一个不带对话种子的全新子智能体,并把共享工作区当作持久记忆。完成与阻塞只是 worker 的报告,不是独立评估。普通的长目标用同会话的 goal 工具;有边界的委派与扇出用普通 subagent 或 workflow。`,\n\n 'tool:subagent': `默认在后台使用 subagent。把相互独立的委派放在同一条助手消息里一起启动,并在它们运行期间继续做有用的工作。只有当你的下一步动作依赖该 subagent 的结果时,才设 \\`run_in_background: false\\`。后台运行尘埃落定时,运行时会向你发送一条通知,内含其结果与最后一条助手消息。`,\n\n 'tool:subagent_fork': `默认在后台使用 subagent_fork。把相互独立的委派放在同一条助手消息里一起启动,并在它们运行期间继续做有用的工作。只有当你的下一步动作依赖该 subagent_fork 的结果时,才设 \\`run_in_background: false\\`。后台运行尘埃落定时,运行时会向你发送一条通知,内含其结果与最后一条助手消息。`,\n\n 'ui:file-review-references': `当你成功创建或修改了文件时,在最终答复里提到主要产物。要让这些文件以及其它被改动文件的引用在 Web 里可以点击,用 Markdown 行内代码的格式书写,路径使用文件工具的确切路径;若在该轮改动的文件中基本名唯一,也可以只写基本名。`,\n\n 'tools:code-only': `\\`run_code\\` 是你唯一能直接调用的工具 —— 指名任何其它工具的工具调用都会失败。下面 SDK 声明的所有工具都要从程序内部调用。`,\n}\n","/**\n * 中文段译本(专属定制)—— tool:dsh-undo-savepoint。\n * 用户触发短语(\"撤销上一步\"、\"redo\" 等)、\"⚠️ Previous DSH run did not\n * finish starting\" 告警前缀、主动提示的固定话术(配置已自动保存为快照…)\n * 都是匹配 / 输出用的精确字符串,逐字保留。\n */\nexport const UNDO = `## 撤销 / 回退(dsh-undo-savepoint)\n当用户要求撤销上一步操作(\"撤销上一步\"、\"回退\"、\"恢复\"、\"redo\"、\"保存快照\"、\"查看快照\")—— 通常发生在安装插件、应用皮肤或更改设置之后 —— 不要靠猜、也不要手动改配置文件:\n1. 调用 undo_list 展示可用快照(配置变更时自动创建,外加手动快照)。\n2. 调用 undo_restore:mode \"undo\" 撤销最近一次变更,mode \"redo\" 重新应用上一次 undo 之前保存的状态,或 mode \"id\" 配合 undo_list 里的快照 id 恢复。拿不准时先用 undo_diff 预览。\n3. undo_restore 绝不销毁当前状态(会先存为 pre-restore 快照),并会重新确保 dsh-undo-savepoint 挂载本身。\n4. 手动快照与自动快照分开存放(settings: manualDir / autoDir)。\n5. 主动提示:只要用户提到或执行了配置变更(安装插件、应用皮肤、修改设置),主动告诉用户\"配置已自动保存为快照,改错了随时可以撤销/回退\",并主动提出可以用 undo_list 展示最近的快照。不要等用户来问。\n6. 崩溃告警:如果 undo_list 的输出以 \"⚠️ Previous DSH run did not finish starting\" 开头,主动建议回退到最近一次良好状态(undo_restore mode \"undo\"),并说明上一次运行在本插件启动完成之前就崩溃了。\n7. 配置状态困惑:当用户对当前配置感到困惑(某个插件/皮肤/设置突然消失或变了样,或陷入漫长而无果的调试循环),先调用 undo_recent 检查最近是否有回退能解释它;有就明确告诉用户哪些文件在何时被回退。回退可能发生在另一个会话或经由离线工具执行,用户/AI 可能没有亲眼见到。\n8. 插件代码:快照也包含用户插件的 CODE 文件(node_modules 下的 junction 目标,例如 D:\\\\dsh\\\\plugins\\\\*,以及 router-global.mjs 之类 profile 本地文件)。插件代码被改坏(例如 \"yield* (intermediate value) is not async iterable\")同样可以回滚,即使没有任何配置文件变化 —— undo_list 的行会显示插件文件数。\n9. 安全模式(SAFE MODE):当 DSH 完全无法启动或某个插件破坏了启动流程时,用 undo_safe_mode 的 action \"on\" 停用除 undo 之外的所有用户插件,然后重启 DSH 再排查;action \"off\" 恢复之前的插件集合(需再次重启)。undo_list 的崩溃告警会指名一个具体的最近良好快照用于恢复(undo_restore mode \"id\")。\n注意:本系统只回滚 DSH 的配置/插件/皮肤状态,不回滚聊天记录。`\n","/**\n * 中文段译本(专属定制)—— agent-teams:usage。\n * agent_teams_* 工具名、参数名(approval= / profile= / attempt_id 等)、\n * 任务 kind 与 verdict 的取值、\"Approve & Run\"、.agent-teams 状态目录名\n * 都是运行时契约,逐字保留。\n */\nexport const TEAMS = `当用户要求用 AgentTeams 运行某件事(例如\"用 AgentTeams 做 X\"),或 /agent-teams 斜杠命令的激活消息到达时,你就是多智能体团队的队长。遵循以下协议:\n1. 调用 agent_teams_create,带上团队名、作为 description 的目标,以及 approval=\"required\"。这只会创建一个待审计划,绝不能生成成员或排期工作。只有用户明确要求跳过评审、立即执行时,才用 approval=\"automatic\"。\n2. 按目标所需的角色逐个调用 agent_teams_add_member(研究员、工程师、评审……)。在 staging 阶段它们只是可编辑的花名册条目,不是运行中的子智能体。默认情况下成员会快照你当前的 provider/model/reasoning 路由;只有目标或用户要求时才改用别的路由。\n3. 在 staging 阶段分析目标,创建最小可用的任务 DAG。每次 agent_teams_create_task 调用都必须带非空 subject,验证与评审任务也不例外。独立的工作应当并行;依赖只留给真正的前置关系。把完整的花名册与 DAG 建完后,告诉用户 Web 计划已就绪,然后结束本轮。规划轮里绝不要调用 agent_teams_approve。用户可以点击 Approve & Run、在之后的用户轮里明确批准、回到聊天要求修改,或丢弃该计划。评审 UI 会为返回/丢弃动作注入权威控制消息:严格照办,绝不要自行推断某个缺失或暂停的团队需要重建。用户回到聊天时,先问一个简短的澄清问题,期间不编辑、不重建;得到答复后,用 agent_teams_edit_plan 一次性提交有序的原子批次,先更新下游依赖/负责人再执行删除,概述这次修订,然后再次等待评审。绝不要通过查看或编辑 .agent-teams 状态文件或插件源码来修订计划。只有明确批准才允许调用 agent_teams_approve。\n4. 批准之后,最终成员配置被原子式生成,调度器开始安排就绪的工作。以委派带队:用 agent_teams_status 监控,用 agent_teams_send_message 传达指导,让空闲的队友执行就绪的工作。不要因为某个队友的回合较慢就亲手重复它的工作。如果用户要求每个成员都出力或汇报,就为每项要求创建一个任务(或直接给每位成员发消息);绝不要等待一个从未被分配工作的成员产出成果。\n5. 如果用户明确要求暂停某个运行中的成员,其未完成的尝试在打断后会保持搁置;回答用户之后,用 agent_teams_send_message 给同一位成员传达指导,让它继续同一次尝试。普通用户问题若没有要求暂停,不要打断成员。如果工作必须换人、从头重启或被接管,先调用 agent_teams_reassign_task。优先选另一位空闲成员,或让同一位成员重试。assignee=captain 只用于你将在本轮亲手推进到终态的那一个就绪任务;绝不在还有一个队长接管未完成时启动第二个,也绝不在还有队长负责的工作未收尾时结束回合。重派会撤销旧尝试并等待该成员静止,防止迟到的结果覆盖新尝试。\n6. 任务携带 attempt_id 能力凭证。成员更新时必须使用当前 attempt_id;stale-attempt 错误说明所有权已变更。收到进度通知后持续检查状态,直到每项要求的任务都到终态、每位成员都空闲/就绪;不要忙轮询,也不要向没有被分配工作的成员索要汇报。\n7. 如果用户点名了某个已配置的 profile / template / 固定花名册,把该名字作为 profile= 传给 agent_teams_create。用 profile 成功创建后,不要重建相同的成员。种子 profile 自带模板任务;队长规划 profile 只提供花名册与护栏,DAG 要你在 staging 阶段自行设计。评审/测试失败时添加修复或重试任务,但绝不让新任务依赖失败的任务。不要用 send_message 去启动下一阶段;批准后调度器会分配就绪的工作。删除团队之前,盯到每项要求的任务都到终态。未经用户明确确认,绝不要执行真实的部署。\n8. 质量类任务(requirements、implementation、verification、review、repair、integration)必须带契约:非空 objective 与 acceptance;implementation/repair 还需要 inScope 与 verify。review/requirements 只有 verdict=pass 才能完成;needs_revision/reject 必须带 findings 失败收场。系统随后会打开依赖成功来源(绝不依赖失败的评审)的修复 + 下一次评审。不要批准你自己的实现。create_task 不再静默恢复已停摆(halted)的团队 —— 调用 agent_teams_resume 并附原因,或 create_task({resume:true, resumeReason})。\n9. 当用户明确要求完整的质量模式规划时,除非约束禁止某个阶段,按此顺序:requirements → implementation → verification → review → integration。在团队还处于 staging 时就把整张 DAG 建好:当某个实现的依赖链包含那个 requirements 任务时,允许它在 requirements 完成前创建。这是受支持的行为;不要等 requirements 跑完,也不要靠查看插件源码来确认。staged 的 integration 任务可以依赖第 1 轮 review。若该评审随后返回 needs_revision,系统会自动把仍未开始的下游依赖改接到生成的修复 + 下一次评审门上,所以把 integration 留在原计划里,不要省略或手工重建。从真实工作区或明确的 profile 推导 inScope 与验证命令;绝不要假设 src/ 或 pnpm test。给每个质量任务契约。评审的 acceptance 要评判最新的实现,而不是门会不会拒掉 needs_revision。不要把冒烟测试脚本写进任务。不要让评审者故意提交 needs_revision。除非用户要求队长接管,不要自称实现或评审。评审失败后,等待自动修复 + 下一次评审,不要手工重建这个循环。halted 表示人类停止了团队;创建更多工作前先调用 agent_teams_resume。escalated 表示自动评审循环撞到了上限;那不是 halt。\n10. 把团队成果呈现给用户,然后 agent_teams_delete 该团队,除非用户还想继续用它。停止团队会同时中止队长的当前回合和成员的工作;只有之后明确的用户轮才能恢复。\n\n工具:agent_teams_create, agent_teams_approve, agent_teams_edit_plan, agent_teams_add_member, agent_teams_remove_member, agent_teams_create_task, agent_teams_reassign_task, agent_teams_claim_task, agent_teams_update_task, agent_teams_send_message, agent_teams_status, agent_teams_resume, agent_teams_delete`\n","/**\n * 中文段译本(专属定制)—— tool:cordis。\n * cordis_* 工具名、pluginId / packageId / pluginRunId / currentPackageId /\n * nextPackageId 等运行时标识、@pluginId 引用语法、示例代码块逐字保留。\n */\nexport const CORDIS = `# 动态 Cordis 插件\n\n动态 Cordis 插件临时扩展当前 DSH 进程。插件用 apply(ctx) 消费服务、监听事件、提供服务、注册模型工具,或在槽位(Slot)中注册浏览器 UI。\n\n- 插件与包(Package)的定义只存在于当前进程。define 本身不修改仓库源码、配置或磁盘,定义也不会在进程重启后保留。\n- 受限执行环境防的是误用,不是针对恶意代码的安全边界。动态代码取得的服务连接的是真实运行时。\n\n## 先把面向用户的计划说清楚\n\n- 动态 Cordis 插件是可选的实现机制之一,不是所有请求的默认选项。只有当用户打算设计或创造某样东西,或一个临时界面能实质性帮助当前工作时,才考虑用它。这些指令或相关工具的存在,以及关于 Cordis 本身的讨论,都不意味着请求就是动态插件任务。\n- 当 Cordis 可能合适时,从请求与对话推断意图中的工作目标与生命周期。只有当成果属于当前运行中的 Harness、且应作为临时运行时扩展交付时才使用它。如果这个区分实质性地模糊,最多问一个关于预期结果或生命周期的简短问题;否则按匹配的工作流继续,不要要求用户了解或选择 Cordis 作为实现机制。\n- 一旦确定动态插件合适,判断任务是创建新插件,还是用 @pluginId 修改用户指名的插件。目标明确时直接进行,不要反复请求确认。\n- 从请求的成果出发选择宿主(Host)、客户端(Client)或两者。任务不需要可见的页面行为时,不要提议客户端/浏览器 UI;当请求的成果是可视化、可交互或依赖页面状态时,也不要回避客户端。宿主还是客户端是实现选择,不要让用户去选。\n- 当设计方向或一个潜在有用的界面会实质性影响结果时,最多问一个关于成果或创作偏好的简短问题,并给出几个候选方向;否则直接进行,不要搞多轮访谈或复杂问卷。\n- cordis_define 只定义并呈现代码,不会运行它。定义之后,说明宿主返回的 pluginId 与 packageId,以及下一步是 run 还是 update。\n- cordis_run 可能需要用户批准。返回 awaiting-approval 时,说明用户需要在 UI 里允许或拒绝。不要等待、重试或声称它已在运行。\n- 返回 starting 时,说明请求已进入异步流程,客户端仍在激活。starting 不代表成功。等系统通过 steering 上下文报告最终结果。\n- 用户拒绝后不要再请求批准。技术失败后,从该插件的诊断出发修复同一个插件;不要悄悄另建替代插件。\n\n## 推荐工作流与工具\n\n创建、修改或修复插件之前,先加载 cordis-plugin-development 技能(Skill)。该技能提供需求导航、能力组合、完整示例与故障排查。把 Inspect Provider 的结果当作确切 API 的唯一事实来源。\n\n1. cordis_inspect_list:发现当前宿主与客户端的 Provider 及其只读查询方法。\n2. cordis_inspect_query:用返回的 platform、provider、method 与 schema 查询确切的服务、事件、内建(Builtin)、槽位、主题 token 或工具信息。\n3. cordis_inspect_self:查看当前会话的插件、包、版本指针、源码与诊断。只有同时给出 pluginId 与 packageId 才返回源码。\n4. cordis_define:为新插件创建第一个包,或向既有插件追加一个不可变包。它定义代码但不运行。\n5. cordis_run:激活确切的包。首次激活、重启当前或回滚用 run;切换版本用 update。\n6. cordis_stop:移除当前 Run 与待批准请求,但保留定义、授权与版本指针。\n7. cordis_undefine:永久停用并删除一个插件及其所有包。只在确认用户不再需要后使用。\n\n- 在写代码之前,Inspect 与目录(Catalog)数据只用于确认能力、名字、签名、类型与注册协议;它们不替代业务 API。\n- 不带输入调用 Service.listService 与 Event.listEvents,从紧凑的签名目录里挑选,然后再精确查询目标服务或事件。精确查询返回结构化契约及其引用的类型。\n- 运行时,插件必须调用真实服务、监听真实事件。不要缓存、展示 Inspect 结果,也不要把它当业务数据依赖。\n\n## 身份、版本与批准\n\n- pluginId 标识一个可以随时间修改的插件。新建插件只提交 3–6 个小写英文字母的语义化 idPrefix;最终 ID 由宿主分配。\n- packageId 标识插件下一个不可变的宿主/客户端源码版本。要改代码就定义新包,绝不覆盖旧版本。\n- pluginRunId 标识一次激活尝试,关联其批准、宿主/客户端加载、私有 RPC、Run 卡片与错误。\n- currentPackageId 是最近一次完全成功的包。停止、启动更新或更新失败都不会清除它。\n- nextPackageId 是等待批准、正在尝试、等待客户端激活或最近失败的目标包。\n- 单个对勾只批准当前包;双对勾批准同一插件未来的版本。技术失败后授权仍然有效。\n- 更新会在启动目标包之前停止旧 Run。失败不会自动重启旧版本;之后用 update 重试,或用 run 回滚到 current。\n\n当用户输入 @pluginId 时,系统注入身份、默认基础包、版本指针与运行状态,但不注入源码:\n\n1. 调用 cordis_inspect_self(pluginId, packageId) 读取目标源码。\n2. 以既有模式使用 cordis_define,向同一插件追加包。\n3. 按版本关系以 run 或 update 模式调用 cordis_run。\n\n绝不为 @pluginId 悄悄另建插件。如果该引用因为被删除、属于别的会话或随进程重启丢失而不可用,直接告诉用户。\n\n## 必须避免的高频错误\n\n### 服务:ctx.get 与 inject\n\n- 默认用 ctx.get('serviceName') 读取可选服务,并处理 undefined。\n- 只有当该服务是硬依赖、且插件必须进入等待(直到 Cordis 在服务出现后重新激活它)时,才在返回的插件对象上声明 inject: ['serviceName']。\n- 只有在 inject 里声明过某服务后,才能以 ctx.serviceName 属性方式读取。绝不要以 ctx 属性访问未声明的服务。\n\n\\`\\`\\`js\nreturn {\n inject: ['requiredService'],\n apply(ctx) {\n ctx.requiredService.someMethod()\n const optionalService = ctx.get('optionalService')\n if (optionalService !== undefined) optionalService.someMethod()\n },\n}\n\\`\\`\\`\n\n### 代码:只用普通 JavaScript\n\n- 宿主与客户端代码不经 TypeScript、JSX 或打包器转换。\n- 不要用 TypeScript 类型、as、装饰器、import、require 或 JSX。\n- 客户端 React 代码必须用 React.createElement(...);绝不写 <Component />。\n- 不要假设 process、Buffer、window、document、fetch、原生定时器或任何其它全局可用。先查询对应平台的 Builtins 与服务。\n\n### 数据:不要序列化活数据\n\n- 服务、事件、槽位、会话及其衍生的 Cordis/DSH 对象是内部活数据,不是可以倾倒的普通 JSON。\n- 不要对活数据使用 JSON.stringify、structuredClone、递归枚举、整体复制或整对象展示。\n- 只读取任务所需的叶子字段,然后构造不带宿主引用的最小自有数据对象。\n\n### 生命周期:每个副作用都必须可逆\n\n- 服务、事件、工具、处理器、定时器、槽位、样式与主题覆盖都必须属于当前 Fiber。\n- 用 ctx.effect()、ctx.on() 或返回 disposer 的官方 API,保证 stop、update 或 undefine 能移除每个副作用。\n- cordis-plugin-development 技能包含定时器、瀑布流、槽位、主题、工具、RPC 与 React 的完整示例与故障排查。\n\n## 宿主与客户端\n\n- 宿主运行在 DSH 的 Node.js 进程里,适合文件、网络、命令、Agent/会话访问、宿主事件、服务、模型工具,以及可被客户端调用的 JSON 方法。\n- 客户端运行在浏览器页面里,适合主题、布局、当前页面状态、工具卡片与槽位 UI。\n- 宿主与客户端通过包私有的 JSON 方法通信:宿主用 harness.handle(method, handler),客户端用 host.call(method, args)。方向是客户端→宿主,且只有无损 JSON 可以跨越它。\n- 客户端 UI 必须注册在查询到的槽位里;apply() 不能直接返回 React Element。不带 root 查询 Slots.listSubTree,从紧凑的目的/拓扑树里挑选,然后再精确查询目标 root 的完整注册契约与 props,之后才写代码。\n- Run 专属面板与确切的槽位注册模式见技能与 Inspect Provider。\n\n## 异步结果与恢复\n\n- 不要在工具里等待只有当前回合结束后才可能发生的批准或浏览器工作。\n- 异步成功、拒绝与运行时错误会更新 Run 状态,并通过 steering 上下文通知你。\n- 技术失败后,用 cordis_inspect_self 读取确切包源码及其 message/stack。在同一插件下定义一个修正后的包并自主重试。\n- 其它失败原因、修复流程与完整扩展模式,使用 cordis-plugin-development 技能。`\n","/**\n * 中文段译本(专属定制)—— tools:sdk。\n * 该段 95% 是 TS 类型声明代码块(工具签名契约),逐字翻译既无意义又有抄写\n * 风险 —— 译本因此是**函数形态**:只替换前导散文,代码块从原文的 \\`\\`\\`ts\n * 围栏起逐字节保留(运行时取自原文,绝不手抄)。引擎约定:函数返回\n * null/undefined = 放弃替换、保持原文。\n * ponytail: 依赖 \\`\\`\\`ts 围栏标记存在;宿主若改掉围栏风格,函数返回 null\n * 自动退回英文原文,升级路径是把整段改成纯静态译本。\n */\nexport const SDK_ZH = (original) => {\n const at = String(original ?? '').indexOf('\\`\\`\\`ts')\n if (at < 0) return null\n const head = `## 为 run_code 编写代码\n\n\\`run_code\\` 接受两个必填参数:\\`code\\` —— 一个异步 TypeScript 函数的函数体(只允许可擦除语法 —— 不用 \\`enum\\` 与命名空间;类型注解仅供参考,运行时会剥离类型)—— 和 \\`description\\`,一段说明该程序做什么的简短摘要。在程序内部:\n\n- 用 \\`await tools.name(args)\\` 调用工具 —— 名称古怪时用引号访问:\\`tools[\"my-tool\"](args)\\`。每次调用都会解析为该工具的规范化 JSON 值。工具参数必须是无损 JSON。\n- 失败的工具调用会以 \\`ToolCallError\\` reject,其 \\`toolName\\` 标识失败的工具,\\`message\\` 人类可读 —— 用 \\`try/catch\\` 捕获后继续。\n- 相互独立的只读调用可以在 \\`Promise.all\\` 下并行(安全调用并发执行;会改动状态的调用单独按提交顺序执行)。有依赖的工作用 \\`await\\` 串行。\n- 用 \\`return\\` 和/或 \\`console.log(...)\\` 输出结果。只有你打印或返回的内容才算程序输出。包含图片的成功工具结果会在运行结束后附上,供你下一步查看;其它所有中间结果都不会进入对话,因此只提取你需要的部分。`\n return head + '\\n\\n可用工具:\\n\\n' + original.slice(at)\n}\n","/**\n * 中文段译本(专属定制)—— 汇总入口。\n * 引擎(lib/effective.js 的 applySectionPolicy)在 zhSections 开启时按段名\n * 精确匹配替换文本:对得上号的段整段换成译本,对不上的段保持原文 —— 段数\n * 与注入不增不减。取值是字符串(整段替换)或函数((原文) => 译本 | null,\n * 见 sdk.mjs;返回 null = 放弃替换)。\n * 安全边界:{{...}} 提示词变量(deployment:persona 的 {{model}} / {{cwd}}、\n * env_* 等)由宿主在装配后渲染,译本里逐字保留;黑名单挡下的密钥类 env 变量\n * 本来就不会被注册,替换文本不引入任何新的变量引用。\n */\nimport { CORE } from './core.mjs'\nimport { UNDO } from './undo.mjs'\nimport { TEAMS } from './teams.mjs'\nimport { CORDIS } from './cordis.mjs'\nimport { SDK_ZH } from './sdk.mjs'\n\nexport const ZH_SECTIONS = {\n ...CORE,\n 'tool:dsh-undo-savepoint': UNDO,\n 'agent-teams:usage': TEAMS,\n 'tool:cordis': CORDIS,\n 'tools:sdk': SDK_ZH,\n}\n","/**\n * SectionsPane — 独立面板的左栏(提示词模式)。\n *\n * 顶部三个阶段 Tab(引导期 / 常驻期 / 压缩受控期,恒定全部可选),与右栏\n * 预览的阶段按钮**联动**:两边切的是同一个阶段,编辑哪个阶段就看哪个阶段的\n * 装配。每个阶段列出该阶段装配里的段:勾选框 = 该阶段是否注入模型(勾上 =\n * 启用),被停用的行半透明原位保留、随时可勾回。行内:↑/↓ 重排、编辑(按\n * 阶段替换文本)、还原、删除(仅自定义段);「+ 注入」展开注入新段表单。\n *\n * 底部固定条:三态过滤(全部 / 已启用 / 已停用)——像宿主能力管理页一样按\n * 勾选状态筛选当前阶段的列表。\n *\n * 「本系统全部提示词」只读池收在列表末尾的折叠区(不分阶段):每行三个小\n * 按钮把该段加入对应阶段(替代旧版的拖拽搬移;运行时动态段加不进,会给出\n * 说明)。\n *\n * 全部阶段状态逻辑来自 lib/sectionOps.mjs(纯函数,node --test 单测直接\n * 覆盖同一份代码)。\n */\nimport { createElement as h, useState, type ChangeEvent, type ReactElement } from 'react'\nimport type { Config, Inventory, Phase, PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { PART_ORDER } from './presets.ts'\nimport { injectPhaseOf, deniedNames, blockPatch, phaseInjectEntries, mergedPhaseInjectEntries, phaseRows } from '../../lib/sectionOps.mjs'\nimport { s } from './styles.ts'\n\n/** Panel 并行拉取的三阶段装配。 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** 屏幕上一条可交互的段行。 */\ninterface PartRow {\n name: string\n text: string\n replaced: boolean\n custom: boolean\n /** 本阶段的用户替换文本(空串 = 本阶段没改过文本)—— 三个阶段各一份,互不影响。 */\n override: string\n /** 该阶段自己的屏蔽名单是否屏蔽了此段:勾选框 = 未屏蔽(注入模型)。 */\n blocked: boolean\n}\n\n/** 三态过滤:全部 / 已启用(未屏蔽)/ 已停用(被屏蔽)。 */\nexport type TriState = 'all' | 'on' | 'off'\n\n/** 编辑态的键:段名之外还要带阶段,否则三个部分里同名的行会同时展开编辑器。 */\nconst editKey = (key: PhaseViewKey, name: string): string => `${key}:${name}`\n\nexport function SectionsPane({ cfg, inv, phases, phase, syncAll, t, write }: {\n cfg: Config\n inv: Inventory | null\n phases: PhaseViews | null\n /** 当前阶段(状态在 Panel 持有,头部阶段按钮统一切换)。 */\n phase: PhaseViewKey\n /** 三态同步(默认关):勾选后屏蔽 / 解除屏蔽与替换文本对三个阶段一起生效(只作用于同名段)。 */\n syncAll?: boolean\n t: Translate\n write: (field: 'sections' | 'sectionsBootstrap' | 'sectionsCompaction' | 'replace' | 'inject' | 'tools', value: unknown) => void\n}): ReactElement {\n const [filter, setFilter] = useState<TriState>('all')\n const [editing, setEditing] = useState<string | null>(null)\n const [draft, setDraft] = useState('')\n // 「注入新段」表单展开态(当前阶段分组内)。\n const [addOpen, setAddOpen] = useState(false)\n // 面板内短提示(例如:动态段加不进某个阶段时说明原因)。\n const [notice, setNotice] = useState<string | null>(null)\n\n const rowsOf = (key: PhaseViewKey): PartRow[] => phaseRows(cfg, phases?.[key] ?? null, key)\n\n // 屏蔽 / 恢复一个段(blockPatch 只动本阶段自己的名单)。写入严格落在当前\n // 编辑目标的草稿里 —— 预设之间互相独立:在 A 预设里的任何改动对 B 预设与\n // 全局默认零影响。\n const applyBlock = (key: PhaseViewKey, name: string, blocked: boolean): void => {\n const patch = blockPatch(cfg, key, name, blocked)\n for (const [field, value] of Object.entries(patch)) {\n write(field as 'sections' | 'sectionsBootstrap' | 'sectionsCompaction', value)\n }\n }\n const toggleBlocked = (key: PhaseViewKey, name: string): void => {\n const blocked = !deniedNames(cfg, key).includes(name)\n // 三态同步(可选):一次写全三个阶段 —— 只作用于同名的这一段。\n for (const k of syncAll ? PART_ORDER : [key]) applyBlock(k, name, blocked)\n }\n\n // 该阶段中某名字是否在该阶段的装配输入里(判断加入是「解除屏蔽」还是「凭空注入」)。\n const inBaseOf = (key: PhaseViewKey, name: string): boolean =>\n (phases?.[key]?.baseSections ?? []).some((sec) => sec.name === name)\n\n // 持久化一个阶段的有序列表(写回 inject):每行一条注入项、order 为连续整数;\n // 系统行空文本(仅 order 覆盖),custom 行保留文本;其它阶段的注入项原样保留。\n const persistPhase = (key: PhaseViewKey, rows: PartRow[]): void => {\n write('inject', phaseInjectEntries(cfg, key, rows))\n }\n\n // 上移/下移一格(数组交换后重排整个阶段)。\n const moveRow = (key: PhaseViewKey, index: number, dir: -1 | 1): void => {\n const rows = rowsOf(key)\n const target = index + dir\n if (target < 0 || target >= rows.length) return\n const next = rows.slice()\n const [item] = next.splice(index, 1)\n next.splice(target, 0, item)\n persistPhase(key, next)\n }\n\n // 从该阶段移除一个段:删掉它在本阶段的注入条目,以及跨阶段生效(always)的\n // 条目 —— 预设应用 / 导入产生的自定义段就是 always。随后解除该阶段屏蔽。\n const removeFromPart = (key: PhaseViewKey, name: string): void => {\n const phaseOfItem = injectPhaseOf(key)\n const inject = (cfg.inject ?? []).filter((x) => {\n if (x.name !== name) return true\n const itemPhase = x.phase ?? 'always'\n return !(itemPhase === phaseOfItem || itemPhase === 'always')\n })\n write('inject', inject)\n applyBlock(key, name, false)\n }\n\n // 文本编辑按阶段生效:编辑态的键是「阶段 + 段名」。写入走 persistPhase\n //(本阶段的注入条目带 text),绝不碰全局 replace 字典。\n const startReplace = (key: PhaseViewKey, row: PartRow): void => {\n setEditing(editKey(key, row.name))\n setDraft(row.override || row.text)\n }\n const commitReplace = (key: PhaseViewKey, row: PartRow): void => {\n const patchRow = (r: PartRow): PartRow => (r.name !== row.name ? r : { ...r, override: draft, text: draft })\n if (syncAll) {\n // 三态同步(可选):替换文本一次写全三个阶段 —— 只改各阶段里同名的那\n // 一行。edit 对 inject 是整体替换,必须把三个阶段叠进同一份列表一次写入。\n const rowsByKey = {} as Record<PhaseViewKey, PartRow[]>\n for (const k of PART_ORDER) {\n const rows = rowsOf(k)\n rowsByKey[k] = k === key || rows.some((r) => r.name === row.name) ? rows.map(patchRow) : rows\n }\n write('inject', mergedPhaseInjectEntries(cfg, rowsByKey))\n } else {\n persistPhase(key, rowsOf(key).map(patchRow))\n }\n setEditing(null)\n }\n const restoreReplace = (key: PhaseViewKey, row: PartRow): void => {\n const next = rowsOf(key).map((r) =>\n r.name !== row.name ? r : { ...r, override: '', text: r.custom ? r.text : '' },\n )\n persistPhase(key, next)\n // 遗留的全局替换条目(旧版 UI 的产物):只在本部分还原时一并清除。\n if (!row.custom && Object.hasOwn(cfg.replace ?? {}, row.name)) {\n const rest = { ...(cfg.replace ?? {}) }\n delete rest[row.name]\n write('replace', rest)\n }\n }\n\n const addSection = (name: string, text: string, phase: Phase): void => {\n const inject = (cfg.inject ?? []).slice()\n inject.push({ name, order: 120 + inject.length, text, phase, custom: true })\n write('inject', inject)\n }\n\n // 从「全部」池把一个段加入某阶段(替代旧版拖拽:池 → 阶段)。该阶段已有的\n // 段只是移到末尾;新段带上池里的原文(注入条目带文本,服务端才会把它真正\n // 建出来)。动态段没有可带的原文,给出说明。\n const addFromPool = (key: PhaseViewKey, name: string, text: string): void => {\n if (text === '' || text.startsWith('<')) {\n setNotice(t('sectionDynamicNoAdd', { name }))\n return\n }\n setNotice(null)\n const rows = rowsOf(key)\n const existing = rows.find((row) => row.name === name)\n const next = existing !== undefined\n ? [...rows.filter((row) => row.name !== name), existing]\n : [...rows, {\n name,\n text: '',\n replaced: Object.hasOwn(cfg.replace ?? {}, name),\n custom: false,\n override: text,\n blocked: false,\n }]\n if (existing === undefined && inBaseOf(key, name) && deniedNames(cfg, key).includes(name)) {\n applyBlock(key, name, false)\n }\n persistPhase(key, next)\n }\n\n const stageLabel = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('phaseStageGuide') : key === 'compaction' ? t('phaseStageControlled') : t('phaseStageResident')\n\n // 该阶段的「段级定制没进最终提示词」警示(forceSections 关闭或失效时)。\n const partNote = (key: PhaseViewKey): ReactElement | null => {\n const view = phases?.[key]\n if (view === undefined || view === null) return null\n if (cfg.forceSections !== false) return null\n if (view.takenOverBy !== undefined) {\n return h('div', { style: s.noticeWarn }, t('sectionsTakenOver', { name: view.takenOverBy }))\n }\n const lost = view.lostSections\n if (lost !== undefined) {\n return h('div', { style: s.noticeWarn }, t('sectionsLost', { emitted: lost.emitted, survived: lost.survived }))\n }\n return null\n }\n\n const isEditing = (key: PhaseViewKey, row: PartRow): boolean => editing === editKey(key, row.name)\n\n const renderRow = (key: PhaseViewKey, row: PartRow, index: number, total: number): ReactElement | null => {\n if (!rowVisible(row)) return null\n return h('div', {\n key: row.name,\n style: { ...s.row, ...(row.blocked ? s.rowBlocked : {}) },\n }, [\n h('input', {\n type: 'checkbox',\n checked: !row.blocked,\n onChange: () => toggleBlocked(key, row.name),\n title: row.blocked ? t('blockedOn') : t('blockedOff'),\n style: { margin: 0, cursor: 'pointer', flex: 'none' },\n }),\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, row.name),\n h('span', { style: s.orderTag }, '#' + index),\n h('span', { style: row.custom ? s.badgeCustom : s.badgeSystem }, row.custom ? t('manual') : t('system')),\n row.replaced ? h('span', { style: s.badgeReplaced }, t('replaced')) : null,\n row.blocked ? h('span', { style: s.badgeBlocked }, t('blockedOn')) : null,\n ]),\n isEditing(key, row)\n ? h('div', { style: s.editBox }, [\n h('textarea', { style: s.editInput, value: draft, onChange: (e: ChangeEvent<HTMLTextAreaElement>) => setDraft(e.target.value), rows: 3 }),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => commitReplace(key, row) }, t('save')),\n h('button', { style: s.mini, onClick: () => setDraft('') }, t('clearInput')),\n !row.custom && (row.override || Object.hasOwn(cfg.replace ?? {}, row.name))\n ? h('button', { style: s.mini, onClick: () => restoreReplace(key, row) }, t('restore'))\n : null,\n ]),\n ])\n : h('div', { style: s.preview }, String(row.override || row.text || '').slice(0, 140) || (row.custom ? t('empty') : t('dynamic'))),\n ]),\n h('div', { style: s.arrowCol }, [\n h('button', { style: s.arrow, disabled: index === 0, onClick: () => moveRow(key, index, -1), title: t('moveUp') }, '↑'),\n h('button', { style: s.arrow, disabled: index === total - 1, onClick: () => moveRow(key, index, 1), title: t('moveDown') }, '↓'),\n ]),\n isEditing(key, row) ? null : h('button', { style: s.mini, onClick: () => startReplace(key, row) }, t('replace')),\n !isEditing(key, row) && !row.custom && (row.override || Object.hasOwn(cfg.replace ?? {}, row.name))\n ? h('button', { style: s.mini, onClick: () => restoreReplace(key, row) }, t('restore'))\n : null,\n row.custom ? h('button', { style: s.mini, onClick: () => removeFromPart(key, row.name), title: t('delete') }, t('delete')) : null,\n ])\n }\n\n // 当前阶段的行 + 三态过滤。\n const rows = rowsOf(phase)\n const onCount = rows.filter((row) => !row.blocked).length\n const offCount = rows.length - onCount\n const rowVisible = (row: PartRow): boolean =>\n filter === 'all' || (filter === 'on' ? !row.blocked : row.blocked)\n\n const poolSections = inv?.sections ?? []\n\n return h('div', { style: s.colLeft }, [\n h('div', { style: s.colScroll }, [\n notice ? h('div', { style: s.noticeWarn }, notice) : null,\n partNote(phase),\n rows.map((row, i) => renderRow(phase, row, i, rows.length)),\n rows.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n addOpen\n ? h(InjectForm, {\n onAdd: (name, text) => { addSection(name, text, injectPhaseOf(phase)); setAddOpen(false) },\n phaseLabel: stageLabel(phase),\n t,\n })\n : null,\n // 本系统全部提示词:跨预设累积的只读池(折叠区),每行可加入三个阶段。\n h('details', { style: s.injectBox }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } },\n `${t('allSectionsTitle')} (${poolSections.length})`),\n h('div', { style: { ...s.muted, marginBottom: 4 } }, t('sectionsFourHint')),\n poolSections.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n poolSections.map((sec) => h('div', { key: sec.name, style: { ...s.row, opacity: 0.92 } }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, sec.name)),\n h('div', { style: s.preview }, String(sec.text ?? '').slice(0, 140) || t('dynamic')),\n ]),\n ...PART_ORDER.map((key) => h('button', {\n key,\n style: s.arrow,\n title: t('poolAddTitle', { phase: stageLabel(key) }),\n onClick: () => addFromPool(key, sec.name, sec.text ?? ''),\n }, t(key === 'bootstrap' ? 'phaseShortGuide' : key === 'active' ? 'phaseShortResident' : 'phaseShortControlled'))),\n ])),\n ]),\n // 「+ 注入」入口放在滚动区末尾:新段通常追加在当前阶段列表尾部。\n h('div', { style: { ...s.injectRow, marginTop: 8 } }, [\n h('button', { style: s.mini, onClick: () => setAddOpen(!addOpen), title: t('injectNew') },\n addOpen ? `× ${t('clearInput')}` : `+ ${t('injectNew')}`),\n ]),\n ]),\n // 左栏底部固定条:三态过滤(全部 / 已启用 / 已停用),只统计当前阶段。\n h('div', { style: s.colFoot }, [\n h('div', { style: s.seg }, [\n h('button', { style: filter === 'all' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('all') },\n `${t('filterAll')} ${rows.length}`),\n h('button', { style: filter === 'on' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('on') },\n `${t('filterOn')} ${onCount}`),\n h('button', { style: filter === 'off' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('off') },\n `${t('filterOff')} ${offCount}`),\n ]),\n ]),\n ])\n}\n\n/** 注入新段表单:「+ 注入」展开,阶段锁定为当前 Tab 的阶段。 */\nfunction InjectForm({ onAdd, phaseLabel, t }: {\n onAdd: (name: string, text: string) => void\n phaseLabel: string\n t: Translate\n}): ReactElement {\n const [name, setName] = useState('')\n const [text, setText] = useState('')\n const submit = (): void => {\n if (!name.trim()) return\n onAdd(name.trim(), text)\n setName(''); setText('')\n }\n return h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, width: '30%' }, placeholder: t('name'), value: name, onChange: (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value) }),\n h('input', { style: { ...s.input, flex: 1 }, placeholder: `${t('text')}(${phaseLabel})`, value: text, onChange: (e: ChangeEvent<HTMLInputElement>) => setText(e.target.value) }),\n h('button', { style: s.mini, onClick: submit }, t('add')),\n ])\n}\n","/**\n * ToolsPane — 独立面板的左栏(工具模式)。\n *\n * 顶部三个阶段 Tab(引导期 / 常驻期 / 压缩受控期),与右栏预览的阶段按钮\n * **联动**。每个阶段列出该阶段进入过滤的目录 ∪ 用户加回的工具:勾选框 =\n * 该阶段对模型可见;隐藏后仍在列表可反选。三份名单互不继承。\n *\n * 底部固定条:三态过滤(全部 / 已启用 = 可见 / 已停用 = 隐藏),只统计当前\n * 阶段。\n *\n * 「本系统全部工具」只读池收在折叠区(不分阶段):每行三个小按钮把该工具\n * 加入对应阶段(替代旧版拖拽)——被该阶段默认裁掉、但注册表里仍有的会写进\n * add 名单加回;注册表里根本没有的(别的预设独有)加不进来,界面明确说明。\n */\nimport { createElement as h, useState, type ReactElement } from 'react'\nimport type { Config, Inventory, PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { PART_ORDER, withPhaseAdd, withPhaseExclude } from './presets.ts'\nimport { s } from './styles.ts'\nimport type { TriState } from './SectionsPane.tsx'\n\n/** Panel 并行拉取的三阶段装配。 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** 一次加回操作的反馈(ok = 已写入,warn = 什么都没改并说明原因)。 */\ntype Notice = { kind: 'ok' | 'warn'; text: string }\n\nexport function ToolsPane({ cfg, inv, phases, phase, syncAll, t, write }: {\n cfg: Config\n inv: Inventory | null\n phases: PhaseViews | null\n /** 当前阶段(状态在 Panel 持有,头部阶段按钮统一切换)。 */\n phase: PhaseViewKey\n /** 三态同步(默认关):勾选后隐藏 / 显示与加回对三个阶段一起生效(只作用于同名工具)。 */\n syncAll?: boolean\n t: Translate\n write: (field: 'sections' | 'replace' | 'inject' | 'tools', value: unknown) => void\n}): ReactElement {\n const [filter, setFilter] = useState<TriState>('all')\n const [notice, setNotice] = useState<Notice | null>(null)\n\n // 某阶段自己的黑名单 / 加回名单(三份互不继承)。\n const excludeOf = (key: PhaseViewKey): string[] => {\n const tools = cfg.tools ?? {}\n const list = key === 'bootstrap' ? tools.bootstrap?.exclude : key === 'compaction' ? tools.compaction?.exclude : tools.exclude\n return list ?? []\n }\n const addOf = (key: PhaseViewKey): string[] => {\n const tools = cfg.tools ?? {}\n const list = key === 'bootstrap' ? tools.bootstrap?.add : key === 'compaction' ? tools.compaction?.add : tools.add\n return list ?? []\n }\n // 一次写入同时落该阶段的 exclude 与 add(在同一份 tools 上叠完再写一次)。\n const writeLists = (key: PhaseViewKey, exclude: string[], add: string[]): void => {\n write('tools', withPhaseAdd(withPhaseExclude(cfg.tools ?? {}, key, exclude), key, add))\n }\n\n // 三态同步写入(syncAll 开启时):对三个阶段各自的 exclude / add 名单做同一\n // 变换,叠进一份 tools 后一次写入。变换返回 null = 该阶段无可做的改动,跳过。\n const writeSynced = (\n apply: (key: PhaseViewKey, exclude: string[], add: string[]) => { exclude: string[]; add: string[] } | null,\n ): void => {\n let tools = cfg.tools\n for (const k of PART_ORDER) {\n const next = apply(k, excludeOf(k), addOf(k))\n if (next === null) continue\n tools = withPhaseExclude(withPhaseAdd(tools, k, next.add), k, next.exclude)\n }\n write('tools', tools)\n }\n\n // 该阶段的装配目录(进入本插件过滤的工具原文)与该预设注册表(能加回的来源)。\n const catalogOf = (key: PhaseViewKey): string[] => (phases?.[key]?.baseTools ?? []).map((tool) => tool.name)\n const isInCatalog = (key: PhaseViewKey, name: string): boolean => catalogOf(key).includes(name)\n // 注册表三个阶段共享同一 scope,取第一个非空的即可。\n const registry: Set<string> = (() => {\n const list = PART_ORDER.map((key) => phases?.[key]?.registryTools).find((x) => Array.isArray(x) && x.length > 0) ?? []\n return new Set(list)\n })()\n\n // 把一个工具放进某阶段(复制语义,绝不改动其它阶段):不在该阶段目录里就\n // 加进 add 名单;hidden 决定它在目标阶段是可见还是隐藏。\n const addToPhase = (key: PhaseViewKey, name: string, hidden: boolean): void => {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (!isInCatalog(key, name) && !add.includes(name)) add = [...add, name]\n exclude = hidden\n ? (exclude.includes(name) ? exclude : [...exclude, name])\n : exclude.filter((x) => x !== name)\n writeLists(key, exclude, add)\n }\n\n // 阶段分组里的行 = 该阶段进入过滤的目录 ∪ 已加回(但尚未出现在装配里)的工具。\n const rowsOf = (key: PhaseViewKey): Array<{ name: string; description: string; hidden: boolean; added: boolean }> => {\n const exclude = excludeOf(key)\n const catalog = (phases?.[key]?.baseTools ?? []).map((tool) => ({\n name: tool.name,\n description: tool.description ?? '',\n hidden: exclude.includes(tool.name),\n added: false,\n }))\n const names = new Set(catalog.map((row) => row.name))\n const added = addOf(key)\n .filter((name) => !names.has(name))\n .map((name) => ({ name, description: '', hidden: false, added: true }))\n return [...catalog, ...added]\n }\n\n // 勾选 / 取消勾选:只动这一个工具在本阶段的可见性。\n const toggleHide = (key: PhaseViewKey, name: string, currentlyHidden: boolean): void => {\n if (syncAll) {\n // 三态同步:显示 = 各阶段 exclude 移除(绝不顺手把没加回的工具加进 add);\n // 隐藏 = 已加回的撤销加回、原生的进该阶段 exclude。\n writeSynced((_k, exclude, add) => {\n if (currentlyHidden) return { exclude: exclude.filter((x) => x !== name), add }\n if (add.includes(name)) return { exclude, add: add.filter((x) => x !== name) }\n return exclude.includes(name) ? null : { exclude: [...exclude, name], add }\n })\n setNotice(null)\n return\n }\n if (currentlyHidden) {\n addToPhase(key, name, false)\n } else {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (add.includes(name)) add = add.filter((x) => x !== name)\n else if (!exclude.includes(name)) exclude = [...exclude, name]\n writeLists(key, exclude, add)\n }\n setNotice(null)\n }\n\n // 从池加入某阶段(替代旧版拖拽:池 → 阶段)。注册表里没有的加不进来。\n const addFromPool = (key: PhaseViewKey, name: string): void => {\n if (!isInCatalog(key, name) && !registry.has(name)) {\n setNotice({ kind: 'warn', text: t('toolNotInRegistry', { name }) })\n return\n }\n if (syncAll) {\n // 三态同步:三个阶段都让它出现(该阶段目录里没有的就写进各自的 add 名单)。\n writeSynced((k, exclude, add) => ({\n exclude: exclude.filter((x) => x !== name),\n add: !isInCatalog(k, name) && !add.includes(name) ? [...add, name] : add,\n }))\n setNotice({ kind: 'ok', text: t('toolSyncShown', { name }) })\n return\n }\n addToPhase(key, name, false)\n setNotice({ kind: 'ok', text: isInCatalog(key, name) ? t('toolShown', { name, to: stageLabel(key) }) : t('toolAdded', { name, phase: stageLabel(key) }) })\n }\n\n const stageLabel = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('phaseStageGuide') : key === 'compaction' ? t('phaseStageControlled') : t('phaseStageResident')\n\n // 当前阶段的行 + 三态过滤(已启用 = 对模型可见)。\n const rows = rowsOf(phase)\n const onCount = rows.filter((row) => !row.hidden).length\n const offCount = rows.length - onCount\n const rowVisible = (row: { hidden: boolean }): boolean =>\n filter === 'all' || (filter === 'on' ? !row.hidden : row.hidden)\n\n const renderRow = (row: { name: string; description: string; hidden: boolean; added: boolean }): ReactElement | null => {\n if (!rowVisible(row)) return null\n return h('div', {\n key: row.name,\n style: { ...s.row, ...(row.hidden ? s.rowBlocked : {}) },\n title: row.description.slice(0, 120),\n }, [\n h('input', {\n type: 'checkbox',\n checked: !row.hidden,\n onChange: () => toggleHide(phase, row.name, row.hidden),\n title: row.hidden ? t('hiddenOn') : t('hiddenOff'),\n style: { margin: 0, cursor: 'pointer', flex: 'none' },\n }),\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, row.name),\n row.added ? h('span', { style: s.badgeCustom }, t('toolAddedTag')) : null,\n row.hidden ? h('span', { style: s.badgeBlocked }, t('hiddenOn')) : null,\n ]),\n row.description !== '' ? h('div', { style: s.preview }, row.description.slice(0, 120)) : null,\n ]),\n ])\n }\n\n const allTools = (inv?.tools ?? []).map((tool) => ({\n name: tool.name,\n description: typeof tool === 'string' ? '' : (tool.description ?? ''),\n }))\n\n return h('div', { style: s.colLeft }, [\n h('div', { style: s.colScroll }, [\n h('div', { style: s.muted }, t('toolsFourHint')),\n notice ? h('div', { style: notice.kind === 'ok' ? s.noticeOk : s.noticeWarn }, notice.text) : null,\n rows.map(renderRow),\n rows.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n // 本系统全部工具:注册表的完整目录,只读池(每行可加入三个阶段)。\n h('details', { style: s.injectBox }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } },\n `${t('allToolsTitle')} (${allTools.length})`),\n allTools.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n allTools.map((tool) => h('div', { key: tool.name, style: { ...s.row, opacity: 0.92 } }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, tool.name)),\n h('div', { style: s.preview }, tool.description.slice(0, 120)),\n ]),\n ...PART_ORDER.map((key) => h('button', {\n key,\n style: s.arrow,\n title: t('poolAddTitle', { phase: stageLabel(key) }),\n onClick: () => addFromPool(key, tool.name),\n }, t(key === 'bootstrap' ? 'phaseShortGuide' : key === 'active' ? 'phaseShortResident' : 'phaseShortControlled'))),\n ])),\n ]),\n ]),\n // 左栏底部固定条:三态过滤(全部 / 已启用 = 可见 / 已停用 = 隐藏)。\n h('div', { style: s.colFoot }, [\n h('div', { style: s.seg }, [\n h('button', { style: filter === 'all' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('all') },\n `${t('filterAll')} ${rows.length}`),\n h('button', { style: filter === 'on' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('on') },\n `${t('filterOn')} ${onCount}`),\n h('button', { style: filter === 'off' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('off') },\n `${t('filterOff')} ${offCount}`),\n ]),\n ]),\n ])\n}\n","/**\n * preset-io.ts —— 跨环境(Tauri 2 桌面 / Web)的预设导入导出适配层。\n *\n * 浏览器端最初跑在普通网页里:导出用 Blob + <a download>,导入用隐藏的\n * <input type=\"file\"> + FileReader。宿主现在可能包在 Tauri 桌面 WebView\n * 里,桌面端的预期交互是「原生保存 / 打开对话框 + 真实文件读写」。\n *\n * 本模块保持文件格式纯净(encode/decode 为纯函数),把真正的 I/O 路由到\n * 一个小型的可注入 `PresetIoEnv`:\n *\n * - Tauri v2:通过 window.__TAURI_INTERNALS__.invoke 调用原生的\n * `plugin:dialog|save` / `plugin:dialog|open` 与\n * `plugin:fs|write_text_file` / `plugin:fs|read_text_file` 命令 —— 但\n * 仅当宿主应用注册了 dialog / fs 插件、且其 capability ACL 放行这些\n * 命令时才可用。任何拒绝(插件未注册、ACL \"not allowed\")都归为\n * `unavailable`,由调用方回退到 Web 路径 —— 所以即使 Tauri 宿主尚未\n * 带 dialog/fs 插件,本插件也照常工作。\n * - Web(以及 tauri 回退):Blob + 锚点下载 / 隐藏文件输入,与旧行为\n * 完全一致。在 WebView2 里锚点下载会退化为 WebView 默认的下载处理,\n * 文件输入仍会打开系统选择器。\n *\n * 本模块在模块作用域不触碰 DOM —— 每个分支都接受注入的假实现 —— 因此\n * 可以在 Node 下加载,web / tauri 已保存 / tauri 已取消 / tauri 不可用\n * 的整个矩阵都能单测覆盖。\n */\nimport type { Preset } from './types.ts'\nimport { presetExportFilename } from './presets.ts'\n\n// ── 环境检测 ────────────────────────────────────────────────────────────────\n\n/** Tauri v2 原始 IPC 桥(window.__TAURI_INTERNALS__)。 */\nexport interface TauriInvoke {\n (cmd: string, args?: Record<string, unknown>, options?: unknown): Promise<unknown>\n}\n\n/** 页面是否运行在 Tauri(v1 标记或 v2 桥)webview 内。 */\nexport function isTauriEnv(win: unknown): boolean {\n if (win === null || win === undefined) return false\n const w = win as { __TAURI_INTERNALS__?: unknown; __TAURI__?: unknown }\n return w.__TAURI_INTERNALS__ !== undefined || w.__TAURI__ !== undefined\n}\n\n/** 取可用的 Tauri v2 invoke 桥;不可用时返回 null。 */\nfunction invokeOf(win: unknown): TauriInvoke | null {\n if (!isTauriEnv(win)) return null\n const internals = (win as { __TAURI_INTERNALS__?: { invoke?: unknown } }).__TAURI_INTERNALS__\n return internals && typeof internals.invoke === 'function' ? (internals.invoke as TauriInvoke) : null\n}\n\n// ── 原生(tauri)原语 ───────────────────────────────────────────────────────\n\nexport type SaveOutcome = { kind: 'saved' } | { kind: 'cancelled' } | { kind: 'unavailable' }\nexport type OpenOutcome = { kind: 'text'; text: string } | { kind: 'cancelled' } | { kind: 'unavailable' }\n\nconst JSON_FILTERS = [{ name: 'JSON', extensions: ['json'] }]\n\n/**\n * 原生保存对话框 + 写文件。`cancelled` = 用户关闭了对话框(调用方绝不\n * 得再回退到下载);`unavailable` = 宿主无法提供 dialog/fs 插件(插件\n * 缺失或被 ACL 拦截),调用方应当回退。\n */\nexport async function tauriSaveText(invoke: TauriInvoke, defaultName: string, text: string): Promise<SaveOutcome> {\n try {\n const path = await invoke('plugin:dialog|save', { defaultPath: defaultName, filters: JSON_FILTERS })\n if (typeof path !== 'string' || path === '') return { kind: 'cancelled' }\n await invoke('plugin:fs|write_text_file', { path, contents: text })\n return { kind: 'saved' }\n } catch {\n return { kind: 'unavailable' }\n }\n}\n\n/** 原生打开对话框 + 读文件。`cancelled` = 用户关闭了对话框。 */\nexport async function tauriOpenText(invoke: TauriInvoke): Promise<OpenOutcome> {\n try {\n const picked = await invoke('plugin:dialog|open', { multiple: false, directory: false, filters: JSON_FILTERS })\n const path = Array.isArray(picked) ? picked[0] : picked\n if (typeof path !== 'string' || path === '') return { kind: 'cancelled' }\n const text = await invoke('plugin:fs|read_text_file', { path })\n if (typeof text !== 'string') return { kind: 'unavailable' }\n return { kind: 'text', text }\n } catch {\n return { kind: 'unavailable' }\n }\n}\n\n// ── Web 回退原语 ────────────────────────────────────────────────────────────\n\n/** 锚点下载的目标接口;依赖全部注入以便 Node 里伪造。 */\nexport interface BrowserDownloadTarget {\n makeAnchor(): { href: string; download: string; click(): void }\n makeBlob(text: string): unknown\n objectUrl(blob: unknown): string\n revoke(url: string): void\n}\n\n/** Web 回退导出:Blob + object URL + <a download> + revoke。 */\nexport function webDownload(target: BrowserDownloadTarget, filename: string, text: string): void {\n const blob = target.makeBlob(text)\n const url = target.objectUrl(blob)\n const anchor = target.makeAnchor()\n anchor.href = url\n anchor.download = filename\n anchor.click()\n target.revoke(url)\n}\n\n/** FileReader 形状的读取器(浏览器注入真 FileReader,测试注入假实现)。\n * 回调类型带可选的事件参数,让 DOM FileReader 的\n * `(this: FileReader, ev: ProgressEvent) => any` 处理器能干净赋值。 */\nexport interface FileReaderLike {\n readAsText(file: unknown): void\n onload: ((ev?: unknown) => void) | null\n onerror: ((ev?: unknown) => void) | null\n result: string | ArrayBuffer | null\n}\n\n/** Web 回退导入:经 FileReader 形状的读取器解析所选文件的文本。 */\nexport function readPickedFile(reader: FileReaderLike, file: unknown): Promise<string> {\n return new Promise((resolve, reject) => {\n reader.onload = () => {\n const r = reader.result\n resolve(typeof r === 'string' ? r : String(r ?? ''))\n }\n reader.onerror = () => reject(new Error('FREAD'))\n reader.readAsText(file)\n })\n}\n\n// ── 纯文件格式 ──────────────────────────────────────────────────────────────\n\n/** 把单个预设编码为导出文件的 JSON 格式(单对象格式)。`envBlocklist`\n * 是全局环境变量黑名单的随行快照:导入端按并集并入(见 PresetsTab)。 */\nexport function encodePresetExport(preset: Preset, envBlocklist?: string[]): string {\n return JSON.stringify({ name: preset.name, data: preset.data, ...(Array.isArray(envBlocklist) ? { envBlocklist } : {}) }, null, 2)\n}\n\n/**\n * 解析导出的预设文件:单个 { name, data } 对象或对象数组。空内容 /\n * 非法 JSON 抛普通 Error,由调用方给出友好提示;条目级的过滤在\n * addImportedPresets 里进行。\n */\nexport function decodePresetExport(text: string): unknown {\n const trimmed = String(text).trim()\n if (trimmed === '') throw new Error('EMPTY_EXPORT')\n return JSON.parse(trimmed)\n}\n\n// ── 环境门面 ────────────────────────────────────────────────────────────────\n\n/** 调用方(UI 或测试)驱动的 I/O 面。 */\nexport interface PresetIoEnv {\n readonly tauri: boolean\n saveText(defaultName: string, text: string): Promise<SaveOutcome>\n openText(): Promise<OpenOutcome>\n download(name: string, text: string): void\n}\n\nfunction browserDownloadTarget(): BrowserDownloadTarget {\n const g = globalThis as { document?: Document; URL?: { createObjectURL(b: Blob): string; revokeObjectURL(u: string): void } }\n const doc = g.document!\n const url = g.URL!\n return {\n makeAnchor: () => doc.createElement('a'),\n makeBlob: (text) => new Blob([text], { type: 'application/json' }),\n objectUrl: (blob) => url.createObjectURL(blob as Blob),\n revoke: (u) => url.revokeObjectURL(u),\n }\n}\n\n/** 为当前 window 构建真实环境(在 Node 里调用也安全)。 */\nexport function makeIoEnv(win?: unknown): PresetIoEnv {\n const w = win !== undefined ? win : typeof window !== 'undefined' ? window : undefined\n const invoke = invokeOf(w)\n const tauri = invoke !== null\n return {\n tauri,\n saveText: (name, text) => (tauri ? tauriSaveText(invoke!, name, text) : Promise.resolve({ kind: 'unavailable' })),\n openText: () => (tauri ? tauriOpenText(invoke!) : Promise.resolve({ kind: 'unavailable' })),\n download: (name, text) => webDownload(browserDownloadTarget(), name, text),\n }\n}\n\nexport type ExportResult = { ok: boolean; via: 'tauri' | 'browser'; cancelled?: boolean; message?: string }\n\n/**\n * 导出一个预设:宿主能提供原生对话框时走 tauri 保存(cancelled = 用户\n * 拒绝,绝不回退下载);否则走 Web 下载。\n */\nexport async function exportPresetFile(preset: Preset, io?: PresetIoEnv, envBlocklist?: string[]): Promise<ExportResult> {\n const env = io ?? makeIoEnv()\n try {\n const text = encodePresetExport(preset, envBlocklist)\n const filename = presetExportFilename(preset.name)\n if (env.tauri) {\n const out = await env.saveText(filename, text)\n if (out.kind === 'saved') return { ok: true, via: 'tauri' }\n if (out.kind === 'cancelled') return { ok: false, via: 'tauri', cancelled: true }\n // unavailable -> 继续走 Web 下载\n }\n env.download(filename, text)\n return { ok: true, via: 'browser' }\n } catch (e) {\n return { ok: false, via: 'browser', message: e instanceof Error ? e.message : String(e) }\n }\n}\n\nexport type ImportResult = { kind: 'text'; text: string; via: 'tauri' } | { kind: 'cancelled' } | { kind: 'unavailable' }\n\n/**\n * 经原生 tauri 打开对话框导入一个预设;返回 `unavailable` 时由调用方\n * 点击自己的隐藏文件输入(Web 回退)。\n */\nexport async function importPresetFile(io?: PresetIoEnv): Promise<ImportResult> {\n const env = io ?? makeIoEnv()\n try {\n if (env.tauri) {\n const out = await env.openText()\n if (out.kind === 'text') return { kind: 'text', text: out.text, via: 'tauri' }\n if (out.kind === 'cancelled') return { kind: 'cancelled' }\n }\n } catch {\n /* 落到下面的选择器回退 */\n }\n return { kind: 'unavailable' }\n}\n","/**\n * PresetsPane — 独立面板的预设模式(左右双栏)。\n *\n * 两种「预设」分开,各占一栏:\n * - 左栏(PresetsPane):配置快照库 —— 保存当前配置 / 导入 / 应用 / 导出 /\n * 删除。快照只改本插件内的 presets 库,不会变成可选的 agent 预设;\n * - 右栏(SettingsPane):存为 agent 预设(整体 fork 当前编辑目标的预设目录,\n * 并把当前定制写进它的覆盖项)+ 全局设置(强制覆盖开关、环境变量黑名单、\n * 提示词变量参考、恢复初始状态)。\n *\n * 导入导出经 preset-io 双端适配:Tauri 2 桌面走原生对话框,Web 走下载 /\n * 文件选择;成功 / 失败 / 取消都有面板内消息条提示。\n */\nimport { createElement as h, useEffect, useRef, useState, type ReactElement, type ChangeEvent } from 'react'\nimport type { Config, Inventory, PhaseViewKey, Preview, Preset } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { addImportedPresets, applyPresetData, buildPresetData, genId, mergeSections, PART_ORDER, removePreset, type ConfigPatch } from './presets.ts'\nimport { decodePresetExport, exportPresetFile, importPresetFile } from './preset-io.ts'\nimport { s } from './styles.ts'\n\n/** 一次性操作提示:kind 决定配色,几秒后自动消失。 */\ninterface Notice {\n kind: 'ok' | 'error'\n text: string\n}\n\n/** 4 秒自动消失的面板内消息条(左右两栏共用行为)。 */\nfunction useNotice(): { notice: Notice | null; show: (kind: Notice['kind'], text: string) => void } {\n const [notice, setNotice] = useState<Notice | null>(null)\n const noticeTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n useEffect(() => () => {\n if (noticeTimer.current !== null) clearTimeout(noticeTimer.current)\n }, [])\n const show = (kind: Notice['kind'], text: string): void => {\n if (noticeTimer.current !== null) clearTimeout(noticeTimer.current)\n setNotice({ kind, text })\n noticeTimer.current = setTimeout(() => setNotice(null), 4000)\n }\n return { notice, show }\n}\n\nexport function PresetsPane({ cfg, inv, phases, t, writePatch, writeGlobal, envBlocklist }: {\n cfg: Config\n inv: Inventory | null\n /** Panel 并行拉取的三阶段装配:快照只捕获当前装配里真实存在的段。 */\n phases: Record<PhaseViewKey, Preview | null> | null\n t: Translate\n /** 应用预设:完整补丁一次落盘(显式意图,不经草稿)。 */\n writePatch: (patch: ConfigPatch) => void\n /** 预设库专用:永远写在全局字段(presets / activePreset 不分作用域)。 */\n writeGlobal: (field: string, value: unknown) => void\n /** 全局环境变量黑名单(永远顶层字段,不分作用域);导出随行、导入并集。 */\n envBlocklist: string[]\n}): ReactElement {\n const presets = cfg.presets ?? []\n const [name, setName] = useState('')\n const { notice, show } = useNotice()\n // Web 回退用的隐藏文件输入(tauri 不可用时才点它)。\n const fileRef = useRef<HTMLInputElement | null>(null)\n\n const blockedNames = new Set(cfg.sections ?? [])\n // 快照的捕获宇宙 = 当前预设三个阶段装配里真实存在的段名。「本系统全部提示词」\n // 是跨预设只增不减的并集池,直接拿它当捕获集合会把别的预设独有段名灌进快照,\n // 应用回来就是一条条空白幽灵段。装配数据未就绪(宇宙为空)时不过滤,避免捕获成空。\n const assemblyNames = new Set<string>()\n for (const key of PART_ORDER) {\n for (const sec of phases?.[key]?.baseSections ?? []) assemblyNames.add(sec.name)\n }\n const mergedAll = mergeSections(inv, cfg, blockedNames)\n const merged = assemblyNames.size === 0\n ? mergedAll\n : mergedAll.filter((sec) => sec.source === 'custom' || assemblyNames.has(sec.name))\n const currentNames = new Set(merged.map((sec) => sec.name))\n\n // 把当前定制捕获为新预设(完整快照)。绝对顺序会被转成相对形式\n //(每段记录它应跟随的前一段),因此预设可以跨不同提示词移植。\n const saveCurrent = (): void => {\n const presetName = name.trim() || `${t('preset')} ${presets.length + 1}`\n const data = buildPresetData(cfg, merged)\n writeGlobal('presets', [...presets, { id: genId(), name: presetName, data }])\n setName('')\n }\n\n // 应用预设。补丁由纯函数助手计算(同名段覆盖、匹配不上的跳过、不在预设\n // 列表中的当前段被屏蔽、只有预设的「激活段」被解除屏蔽)。四个定制字段以\n // 一个补丁写入当前编辑目标;快照库(presets / activePreset)永远保持在全局。\n const applyPreset = (preset: Preset): void => {\n writePatch(applyPresetData(preset.data, cfg, currentNames))\n writeGlobal('activePreset', preset.id)\n }\n\n const deletePreset = (id: string): void => {\n const next = removePreset(presets, id, cfg.activePreset)\n writeGlobal('presets', next.presets)\n if (next.activeId === undefined && cfg.activePreset === id) writeGlobal('activePreset', undefined)\n }\n\n // 导出一个预设:Tauri 桌面走原生保存对话框,Web(或 tauri 插件不可用\n // 时)回退为下载。saved/downloaded = 成功;用户取消单独提示,不算失败。\n const exportPreset = async (preset: Preset): Promise<void> => {\n try {\n const res = await exportPresetFile(preset, undefined, envBlocklist)\n if (res.ok) show('ok', t('exportOk'))\n else if (res.cancelled) show('ok', t('exportCancel'))\n else show('error', `${t('exportFail')}${res.message ? ': ' + res.message : ''}`)\n } catch (e) {\n show('error', `${t('exportFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // 解析导入文本 → 去重追加 → 提示新增数量。解析失败提示错误。\n // 单对象格式的文件还可能随行携带全局环境变量黑名单:与当前名单并集合并。\n const importParsed = (text: string): void => {\n try {\n const parsed = decodePresetExport(text)\n const next = addImportedPresets(presets, parsed, genId)\n const added = next.length - presets.length\n const fileBlock = parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)\n && Array.isArray((parsed as { envBlocklist?: unknown }).envBlocklist)\n ? ((parsed as { envBlocklist?: unknown[] }).envBlocklist ?? []).filter((e): e is string => typeof e === 'string')\n : []\n const fresh = fileBlock.filter((e) => !envBlocklist.includes(e))\n if (fresh.length > 0) writeGlobal('envBlocklist', [...envBlocklist, ...fresh])\n const mergedNote = fresh.length > 0 ? t('importBlockMerge', { count: fresh.length }) : ''\n if (added <= 0) show('ok', t('importNone') + mergedNote)\n else {\n writeGlobal('presets', next)\n show('ok', `${t('importOk')} (+${added})${mergedNote}`)\n }\n } catch (e) {\n show('error', `${t('importFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // 导入预设:优先 Tauri 原生打开对话框;unavailable(Web 或桌面端缺\n // dialog/fs 插件)时点隐藏 file input 回退到文件选择器。取消单独提示。\n const importPreset = async (): Promise<void> => {\n try {\n const res = await importPresetFile()\n if (res.kind === 'text') { importParsed(res.text); return }\n if (res.kind === 'cancelled') { show('ok', t('importCancel')); return }\n fileRef.current?.click()\n } catch (e) {\n show('error', `${t('importFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // Web 回退路径:文件选择器的 onChange。用户取消(无文件)静默返回。\n const onImportFile = (e: ChangeEvent<HTMLInputElement>): void => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (!file) return\n const reader = new FileReader()\n reader.onload = () => importParsed(String(reader.result))\n reader.onerror = () => show('error', t('importFail'))\n reader.readAsText(file)\n }\n\n return h('div', { style: s.colLeft }, [\n h('div', { style: s.colScroll }, [\n notice ? h('div', { style: notice.kind === 'ok' ? s.noticeOk : s.error }, notice.text) : null,\n h('div', { style: s.groupHead }, t('libraryTitle')),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, flex: 1 }, placeholder: t('presetName'), value: name, onChange: (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value) }),\n h('button', { style: s.mini, onClick: saveCurrent }, t('save')),\n ]),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => { void importPreset() } }, t('import')),\n h('input', { ref: fileRef, type: 'file', accept: '.json,application/json', style: { display: 'none' }, onChange: onImportFile }),\n ]),\n ]),\n presets.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n presets.map((preset) => {\n const active = cfg.activePreset === preset.id\n return h('div', { key: preset.id, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, preset.name),\n active ? h('span', { style: s.badgeOk }, t('active')) : null,\n ]),\n ]),\n h('button', { style: s.mini, onClick: () => applyPreset(preset) }, t('apply')),\n h('button', { style: s.mini, onClick: () => { void exportPreset(preset) } }, t('export')),\n h('button', { style: s.mini, onClick: () => deletePreset(preset.id) }, t('delete')),\n ])\n }),\n ]),\n ])\n}\n\nexport function SettingsPane({ cfg, inv, t, writeGlobal, saveAsPreset, forkSource, onReset, envBlocklist }: {\n cfg: Config\n inv: Inventory | null\n t: Translate\n /** 全局字段专用写通道(forceSections / envBlocklist,不经草稿)。 */\n writeGlobal: (field: string, value: unknown) => void\n /** 存为 agent 预设:fork 当前编辑目标的预设目录并写入 overrides[新名]。 */\n saveAsPreset: (name: string) => Promise<boolean>\n /** fork 来源的显示名(当前编辑目标预设);undefined = 全局目标,由服务端回落默认预设。 */\n forkSource: string | undefined\n /** 恢复初始状态:清空全部定制并关闭 forceSections(与不装插件等效)。 */\n onReset: () => void\n envBlocklist: string[]\n}): ReactElement {\n // 「存为 agent 预设」的名字与在途标记(与服务端往返期间禁用按钮)。\n const [agentName, setAgentName] = useState('')\n const [creating, setCreating] = useState(false)\n // 黑名单「添加」输入框的暂存值。\n const [blockInput, setBlockInput] = useState('')\n\n // 存为 agent 预设:成败由服务端返回,提示统一走面板顶部的消息条(Panel\n // 的 flash),这里只在成功时清空输入框,避免同一条消息显示两遍。\n const createAgentPreset = async (): Promise<void> => {\n const trimmed = agentName.trim()\n if (trimmed.length === 0 || creating) return\n setCreating(true)\n if (await saveAsPreset(trimmed)) setAgentName('')\n setCreating(false)\n }\n\n // 环境变量黑名单:全局字段,改动即写(与 forceSections 同一通道,不经草稿)。\n const removeBlockEntry = (entry: string): void => {\n writeGlobal('envBlocklist', envBlocklist.filter((e) => e !== entry))\n }\n const addBlockEntry = (): void => {\n const entry = blockInput.trim()\n setBlockInput('')\n if (entry === '' || envBlocklist.includes(entry)) return\n writeGlobal('envBlocklist', [...envBlocklist, entry])\n }\n\n return h('div', { style: s.colRight }, [\n h('div', { style: s.colRightScroll }, [\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('saveAsPresetCard')),\n h('div', { style: s.muted }, t('saveAsPresetHint', { name: forkSource ?? t('forkSourceDefault') })),\n h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, flex: 1 }, placeholder: t('agentPresetName'), value: agentName, onChange: (e: ChangeEvent<HTMLInputElement>) => setAgentName(e.target.value) }),\n h('button', { style: s.mini, disabled: creating || agentName.trim().length === 0, onClick: () => { void createAgentPreset() } }, t('saveAsPreset')),\n ]),\n ]),\n h('div', { style: s.groupHead }, t('settingsTitle')),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('forceTitle')),\n h('div', { style: s.muted }, t('forceHint')),\n h('div', { style: s.injectRow }, [\n h('label', { style: s.switchWrap }, [\n h('input', {\n type: 'checkbox',\n checked: cfg.forceSections !== false,\n // forceSections 是全局字段,与 presets/activePreset 一样永远写顶层。\n onChange: (e: ChangeEvent<HTMLInputElement>) => writeGlobal('forceSections', e.target.checked),\n }),\n h('span', { style: cfg.forceSections !== false ? s.badgeOk : s.badgeBlocked },\n cfg.forceSections !== false ? t('forceOn') : t('forceOff')),\n ]),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('envBlockTitle')),\n h('div', { style: s.muted }, t('envBlockHint')),\n h('div', { style: { ...s.toolWrap, marginTop: 6 } }, envBlocklist.map((entry) => h('span', {\n key: entry,\n style: { ...s.toolChip, display: 'inline-flex', alignItems: 'center', gap: 4 },\n }, [\n entry,\n h('span', { style: { cursor: 'pointer' }, title: t('delete'), onClick: () => removeBlockEntry(entry) }, '×'),\n ]))),\n envBlocklist.length === 0 ? h('div', { style: s.muted }, t('envBlockEmpty')) : null,\n h('div', { style: { ...s.injectRow, marginTop: 6 } }, [\n h('input', {\n style: { ...s.input, flex: 1 },\n placeholder: t('envBlockAdd'),\n value: blockInput,\n onChange: (e: ChangeEvent<HTMLInputElement>) => setBlockInput(e.target.value),\n }),\n h('button', { style: s.mini, disabled: blockInput.trim() === '', onClick: addBlockEntry }, t('envBlockAddAction')),\n ]),\n h('details', { style: { marginTop: 6 } }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } }, `${t('envVarsTitle')} (${inv?.variables?.length ?? 0})`),\n h('div', { style: { ...s.muted, marginTop: 4 } }, t('envVarsHint')),\n h('div', { style: { ...s.toolWrap, marginTop: 4 } }, (inv?.variables ?? []).map((varName) => h('span', { key: varName, style: s.toolChip }, `{{${varName}}}`))),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('resetTitle')),\n h('div', { style: s.muted }, t('resetHint')),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => {\n // 二次确认:清空不可撤销,必须明确点头才动手。\n if (window.confirm(t('resetConfirm'))) onReset()\n } }, t('resetAction')),\n ]),\n ]),\n ]),\n ])\n}\n","/** 工具预览:当前定制(黑名单过滤之后)最终对模型可见的工具目录,\n * 只读、清单式呈现:列出即代表模型看得见 —— 这里没有「已屏蔽」状态。\n * 本视图绝不修改黑名单配置。 */\nimport { createElement as h, type ReactElement } from 'react'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\n\n/** 预览工具条目:对象形态或纯字符串工具名(统一归一化为对象)。 */\nexport type PreviewTool = { name: string; description: string } | string\n\n/** 把字符串形态的条目补全为 { name, description: '' }。 */\n\nfunction norm(tool: PreviewTool): { name: string; description: string } {\n return typeof tool === 'string' ? { name: tool, description: '' } : tool\n}\n\nexport function PreviewTools({ tools, t }: { tools: PreviewTool[]; t: Translate }): ReactElement {\n if (tools.length === 0) return h('div', { style: s.muted }, t('empty'))\n return h('div', { style: s.list }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.orderTag }, `${tools.length} ${t('previewToolCount')}`),\n ]),\n tools.map((tool) => {\n const { name, description } = norm(tool)\n return h('div', { key: name, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, name)),\n h('div', { style: s.preview }, String(description ?? '').slice(0, 140)),\n ]),\n ])\n }),\n ])\n}\n","/**\n * PreviewPane — 独立面板的右栏(提示词 / 工具模式常驻)。\n *\n * 只读预览,没有任何切换控件:看提示词还是工具由顶部模式决定(选「提示词」\n * = 提示词编辑 + 提示词预览;选「工具」= 工具编辑 + 工具预览),阶段由头部\n * 的阶段按钮统一控制(与左栏联动)。数据来自 Panel 并行拉取的三阶段装配,\n * 编辑草稿后由 Panel 防抖叠加同步 —— 所见即模型所见。本视图绝不修改配置。\n */\nimport { createElement as h, type ReactElement } from 'react'\nimport type { PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport { PreviewTools } from './PreviewTools.tsx'\n\n/** Panel 并行拉取的三阶段装配。 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\nexport function PreviewPane({ t, phases, phase, sub }: {\n t: Translate\n phases: PhaseViews | null\n /** 当前阶段(状态在 Panel 持有,头部阶段按钮统一切换)。 */\n phase: PhaseViewKey\n /** 提示词 / 工具子视图:跟随顶部模式(无手动切换)。 */\n sub: 'prompt' | 'tools'\n}): ReactElement {\n const data = phases?.[phase] ?? null\n // 按当前所选阶段判定「段级定制没进最终提示词」:有 complete 段整段接管就说\n // 接管,否则探测本插件产出的段是否被下游丢弃(丢弃规则不止一种)。\n const lossNote = data === null || data === undefined ? null\n : data.takenOverBy !== undefined\n ? t('sectionsTakenOver', { name: data.takenOverBy })\n : data.lostSections !== undefined\n ? t('sectionsLost', { emitted: data.lostSections.emitted, survived: data.lostSections.survived })\n : null\n\n return h('div', { style: s.colRight }, [\n h('div', { style: s.colRightScroll }, [\n // 该阶段的本插件段级产出没进最终提示词(整段接管或被下游丢弃)。\n lossNote !== null ? h('div', { style: s.noticeWarn }, lossNote) : null,\n // scope 挂载失败回退全局层时明确警示:这不是该预设的原生装配。\n data !== null && data.scopeResolved === false\n ? h('div', { style: s.noticeWarn }, t('scopeFallback'))\n : null,\n phases === null ? h('div', { style: s.muted }, t('loading')) : null,\n phases !== null && data === null\n ? h('div', { style: s.error }, t('previewFail'))\n : null,\n sub === 'prompt'\n ? data\n ? [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.muted }, t('previewHint')),\n h('span', { style: s.orderTag }, `${data.sections.length} ${t('previewSections')}`),\n ]),\n h('pre', { style: s.previewText }, data.text || t('empty')),\n ]\n : null\n : data\n ? [\n // 模型视角 vs 注册表视角的对照:预览按所选阶段运行全部装配规则\n //(含预设原生的阶段裁剪),某些预设(如 PTC / Code Mode)会把\n // 完整目录包装成单一工具,注册表原始目录仍列在工具子视图。\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.muted }, t('previewToolsHint')),\n h('span', { style: s.orderTag },\n `${data.tools.length} / ${data.registryTotal ?? '?'} ${t('previewToolsCount')}`),\n ]),\n h(PreviewTools, { tools: data.tools, t }),\n ]\n : null,\n ]),\n ])\n}\n","/**\n * Panel — 提示词管理面板(独立抽屉的根组件)。\n *\n * 拉取配置与清单、维护模式与编辑目标状态,把左右两栏装配起来:\n * - 头部:标题 + 模式切换(提示词 / 工具 / 预设)+ 保存 / 刷新 / 关闭;\n * - 第二行:agent 预设 Tab(全部 Agent + 各预设,点击即切换编辑目标,\n * 像宿主能力管理页的预设切换)+ 三态同步 / 中文提示词开关;\n * - 主体分栏:左栏 = 勾选列表(提示词或工具,底部三态过滤),右栏 =\n * 最终装配预览;预设模式下左栏是快照库、右栏是全局设置。\n *\n * 配置来自插件自有 /config 路由;清单与三阶段预览来自 /inventory 与\n * /preview?phase=…。编辑只改内存草稿,由「保存」按钮经 /config/apply 一次\n * 写盘(写错的配置不点保存就不会进文件)。\n */\nimport { createElement as h, useEffect, useRef, useState, type ReactElement } from 'react'\nimport { DICT, type Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport type { AgentPresetInfo, Config, Inventory, PhaseViewKey, Preview } from './types.ts'\nimport { editView, type ConfigPatch } from './presets.ts'\nimport { zhMergedInjectEntries, zhRevertInjectEntries, zhApplied } from '../../lib/sectionOps.mjs'\nimport { ZH_SECTIONS } from '../../lib/zh/index.mjs'\nimport { SectionsPane } from './SectionsPane.tsx'\nimport { ToolsPane } from './ToolsPane.tsx'\nimport { PresetsPane, SettingsPane } from './PresetsPane.tsx'\nimport { PreviewPane } from './PreviewPane.tsx'\n\nconst INVENTORY_URL = '/api/prompt-customizer/inventory'\nconst AGENT_PRESETS_URL = '/api/prompt-customizer/agent-presets'\nconst CONFIG_URL = '/api/prompt-customizer/config'\nconst CONFIG_SET_URL = '/api/prompt-customizer/config/set'\nconst CONFIG_UNSET_URL = '/api/prompt-customizer/config/unset'\nconst CONFIG_APPLY_URL = '/api/prompt-customizer/config/apply'\nconst CONFIG_RESET_URL = '/api/prompt-customizer/config/reset'\nconst PRESETS_CREATE_URL = '/api/prompt-customizer/presets'\nconst PREVIEW_URL = '/api/prompt-customizer/preview'\n\n/** 三阶段预览装配(模型视角):左栏列表与右栏预览的统一数据源。 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** 三套名义装配的共享布局:顺序固定,refresh 按此并行拉取。 */\nconst VIEW_KEYS: PhaseViewKey[] = ['bootstrap', 'compaction', 'active']\n\n/** 编辑草稿里可能出现的字段(与服务端 /config/apply 的 APPLY_FIELDS 一致)。 */\nconst DRAFT_FIELDS = ['sections', 'sectionsBootstrap', 'sectionsCompaction', 'replace', 'inject', 'tools'] as const\n\n/** 面板顶层模式:提示词 / 工具 / 预设(预览常驻右栏,不再是独立模式)。 */\ntype PanelMode = 'sections' | 'tools' | 'presets'\n\n/** 可编辑的配置字段(含每阶段独立段屏蔽名单)。 */\ntype EditField = 'sections' | 'sectionsBootstrap' | 'sectionsCompaction' | 'replace' | 'inject' | 'tools'\n\n/** 编辑域草稿:提示词/工具两栏共享的未保存字段 + 脏标记。\n * 只记录用户实际编辑过的字段(首次编辑只写那一项),保存时也只提交这些\n * 字段 —— 未编辑的字段继续回落全局 / 继承,避免一次保存冻结全部继承值。 */\ninterface EditDraft {\n sections?: Config['sections']\n sectionsBootstrap?: Config['sectionsBootstrap']\n sectionsCompaction?: Config['sectionsCompaction']\n replace?: Config['replace']\n inject?: Config['inject']\n tools?: Config['tools']\n dirty: boolean\n}\n\nexport function Panel({ t, onClose }: { t: Translate; onClose: () => void }): ReactElement {\n const [cfg, setCfg] = useState<Config | null>(null)\n const [inv, setInv] = useState<Inventory | null>(null)\n // 三阶段预览装配:模型视角的唯一数据源(加载中为 null)。\n const [phases, setPhases] = useState<PhaseViews | null>(null)\n const [agentPresets, setAgentPresets] = useState<AgentPresetInfo[]>([])\n const [mode, setMode] = useState<PanelMode>('sections')\n const [error, setError] = useState<string | null>(null)\n // 配置写入计数:每次成功写配置后 +1,驱动预览重载。\n const [version, setVersion] = useState(0)\n // 三阶段视图:左栏列表与右栏预览共用;左右两栏的阶段 Tab 联动切换同一份。\n const [phase, setPhase] = useState<PhaseViewKey>('bootstrap')\n // 草稿预览的同步序号:每次发起同步 +1,过期响应(已保存 / 再次编辑后)\n // 直接丢弃,绝不覆盖新数据。\n const syncSeq = useRef(0)\n // 编辑目标:undefined = 全局默认;字符串 = agent 预设 id(字段级覆盖)。\n const [target, setTarget] = useState<string | undefined>(undefined)\n // 三态同步(默认关):勾选后提示词 / 工具两栏的屏蔽与解除屏蔽对三个阶段\n // 一起生效(只作用于同名的那一项)。仅在提示词 / 工具两个模式显示。\n const [syncAll, setSyncAll] = useState(false)\n // 右栏预览的子视图:提示词模式默认看提示词、工具模式默认看工具。\n const [previewSub, setPreviewSub] = useState<'prompt' | 'tools'>('prompt')\n // 编辑域草稿:null = 无草稿(显示磁盘值)。提示词 ↔ 工具切换保留;\n // 切到预设模式或切换编辑目标时丢弃(脏草稿先经确认)。\n const [draft, setDraft] = useState<EditDraft | null>(null)\n const [saving, setSaving] = useState(false)\n const [flash, setFlash] = useState<string | null>(null)\n const [flashKind, setFlashKind] = useState<'ok' | 'err'>('ok')\n const flashTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const load = (): void => {\n fetch(CONFIG_URL + `?t=${Date.now()}`)\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'config failed')\n setCfg(body.config as Config)\n setError(null)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n useEffect(load, [])\n\n // 返回 Promise:手动刷新后可以链上草稿补同步(见「刷新」按钮)。\n const refresh = (): Promise<void> => {\n const qs = target ? `?scope=${encodeURIComponent(target)}` : ''\n // 三阶段预览并行拉取:左栏列表与右栏预览全部以这套装配结果为唯一数据源\n // —— 静态清单只是注册表视角(不含伪 agent 阶段裁剪、pre-step 注入等\n // 运行时规则),与它保持一致才是\"所见即模型所见\"。\n const params = (phase: string): string =>\n `${qs}${qs ? '&' : '?'}phase=${phase}&t=${Date.now()}`\n const grab = (phase: string): Promise<Preview | null> =>\n fetch(PREVIEW_URL + params(phase))\n .then((r) => r.json())\n .then((body: Preview) => (body?.ok === false ? null : body))\n .catch(() => null)\n // 「本系统全部提示词/工具」池是全局注册表,永不随编辑目标切换 ——\n // 清单请求不带 scope,三阶段预览仍带 scope(作为该预设的真实装配)。\n return Promise.all([...VIEW_KEYS.map(grab), fetch(INVENTORY_URL).then((r) => r.json())])\n .then(([boot, comp, act, inventoryData]) => {\n setPhases({ bootstrap: boot, compaction: comp, active: act })\n setInv(inventoryData as Inventory)\n setError(null)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n // 挂载时与切换编辑目标后:清单与三阶段预览切到对应 scope。\n // version 入依赖:保存/写配置成功后 +1,驱动重新拉取(否则一直显示保存前的装配)。\n useEffect(() => { void refresh() }, [target, version])\n\n // 草稿实时预览:把未保存的编辑草稿补丁 POST 给 /preview(服务端只在内存里\n // 叠加,磁盘不动),只刷新当前阶段视图 —— 预览随改随动;保存后的 GET 全量\n // 拉取会覆盖回权威状态。syncSeq 让过期响应(又编辑了 / 已保存)直接丢弃。\n const syncDraftPreview = (): void => {\n if (draft === null || !draft.dirty) return\n const patch: Record<string, unknown> = {}\n const source = draft as unknown as Record<string, unknown>\n for (const field of DRAFT_FIELDS) {\n if (Object.hasOwn(source, field)) patch[field] = source[field]\n }\n if (Object.keys(patch).length === 0) return\n const seq = ++syncSeq.current\n fetch(PREVIEW_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch, phase }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok === false) throw new Error(body?.error ?? 'preview failed')\n if (seq !== syncSeq.current) return // 过期响应:草稿又变了或已保存,丢弃\n setPhases((prev) => (prev === null ? prev : { ...prev, [phase]: body as Preview }))\n setError(null)\n })\n .catch((e: unknown) => {\n // 实时预览失败不再静默:消息条提示(下一次成功会自动清除)。保存后\n // 的全量刷新仍会覆盖回权威状态,不影响编辑。\n setError(`${t('previewSyncFail')}:${e instanceof Error ? e.message : String(e)}`)\n })\n }\n // 编辑(draft 身份变化)、切换阶段 / 编辑目标后:防抖 600ms 同步一次。\n useEffect(() => {\n if (draft === null || !draft.dirty) return undefined\n const timer = setTimeout(syncDraftPreview, 600)\n return () => { clearTimeout(timer) }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [draft, phase, target])\n\n // 枚举已安装的 agent 预设(roster 实时读取),给顶部预设 Tab 供货。\n // 抽成函数:保存预设成功后也要立即刷新 Tab 行。\n const fetchPresets = (): void => {\n fetch(AGENT_PRESETS_URL + `?t=${Date.now()}`)\n .then((r) => r.json())\n .then((body) => setAgentPresets(Array.isArray(body?.presets) ? body.presets as AgentPresetInfo[] : []))\n .catch(() => setAgentPresets([]))\n }\n useEffect(() => { fetchPresets() }, [])\n\n // 保存成功/失败后的短促闪示消息(3 秒自动消失;err 用红色样式)。\n const showFlash = (text: string, kind: 'ok' | 'err' = 'ok'): void => {\n if (flashTimer.current !== null) clearTimeout(flashTimer.current)\n setFlash(text)\n setFlashKind(kind)\n flashTimer.current = setTimeout(() => setFlash(null), 3200)\n }\n\n // 丢弃草稿:递增同步序号,作废在途的草稿预览响应(保存后 GET 会整体覆盖,\n // 过期响应绝不能反过来盖掉权威数据)。\n const clearDraft = (): void => {\n syncSeq.current += 1\n setDraft(null)\n }\n\n if (cfg === null) {\n return h('div', { style: { ...s.pRoot, padding: 16 } }, t('loading'))\n }\n\n // 编辑视图:草稿存在时以草稿覆盖对应字段(两栏共享编辑域)。\n // 草稿只含用户实际编辑过的字段,未编辑字段回落基线 —— 绝不把继承值\n // 冻结进 override。\n const base = editView(cfg, target)\n const view: Config = draft\n ? {\n ...base,\n sections: draft.sections ?? base.sections,\n sectionsBootstrap: draft.sectionsBootstrap ?? base.sectionsBootstrap,\n sectionsCompaction: draft.sectionsCompaction ?? base.sectionsCompaction,\n replace: draft.replace ?? base.replace,\n inject: draft.inject ?? base.inject,\n tools: draft.tools ?? base.tools,\n }\n : base\n\n const writeField = (field: string, value: unknown): void => {\n const url = value === undefined ? CONFIG_UNSET_URL : CONFIG_SET_URL\n fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ field, value }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'write failed')\n setCfg(body.config as Config)\n setError(null)\n setVersion((n) => n + 1)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n\n // 两栏的写入:只改内存草稿,不落盘。草稿只记录被编辑的这一字段 —— 保存时\n // 也只会提交编辑过的字段,未编辑字段继续回落全局 / 继承。target 缺省时写\n // 全局顶层;预设目标由 /config/apply 写 overrides[id](字段级接管语义在保存\n // 时生效)。\n const edit = (field: EditField, value: unknown): void => {\n setDraft((d) => ({\n ...(d ?? { dirty: false }),\n [field]: value,\n dirty: true,\n }))\n }\n\n // 统一保存:草稿里实际编辑过的字段一次 POST 到 /config/apply,成功后清\n // 草稿并采纳最新配置。失败时保留草稿(改完可以再试,不会丢)。\n const save = (): void => {\n if (draft === null || saving) return\n const EDITED_FIELDS = ['sections', 'sectionsBootstrap', 'sectionsCompaction', 'replace', 'inject', 'tools'] as const\n const patch: Record<string, unknown> = {}\n for (const field of EDITED_FIELDS) {\n if (Object.hasOwn(draft, field)) patch[field] = draft[field]\n }\n setSaving(true)\n fetch(CONFIG_APPLY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'save failed')\n setCfg(body.config as Config)\n clearDraft()\n setError(null)\n setVersion((n) => n + 1)\n showFlash(t('saveOk'))\n })\n .catch((e: unknown) => setError(`${t('saveFail')}: ${e instanceof Error ? e.message : String(e)}`))\n .finally(() => setSaving(false))\n }\n\n // 预设模式的「应用」:显式意图直接落盘(不经草稿),完整补丁一次写入当前\n // 编辑目标。调用点已在离开编辑域时清空草稿,不会有并发草稿写盘。\n const writePatch = (patch: ConfigPatch): void => {\n fetch(CONFIG_APPLY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'apply failed')\n setCfg(body.config as Config)\n setError(null)\n setVersion((n) => n + 1)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n // 预设库(presets / activePreset)永远保持在全局字段,不分作用域。\n const writeGlobal = writeField\n\n // 「中文提示词」开关(头部工具栏):开 = 把名字对得上译本(lib/zh/)的段\n // 一次性覆盖为中文,关 = 清掉这些段的替换文本回归英文 —— 两个方向都走编辑\n // 草稿(edit),与手动编辑同一条保存路径。状态从配置探测(zhApplied)。\n // 三阶段装配未就绪时拒绝执行(否则会把对应阶段的注入条目当作空集写掉)。\n const zhOn = zhApplied(view, ZH_SECTIONS)\n const toggleZh = (): void => {\n if (phases === null || phases.bootstrap === null || phases.active === null || phases.compaction === null) {\n showFlash(t('zhNotReady'), 'err')\n return\n }\n edit('inject', zhOn ? zhRevertInjectEntries(view, phases, ZH_SECTIONS) : zhMergedInjectEntries(view, phases, ZH_SECTIONS))\n showFlash(zhOn ? t('zhReverted') : t('zhApplied'))\n }\n\n // 恢复初始状态:服务端清空全部定制并关闭 forceSections(与不装插件等效)。\n // 二次确认由设置栏的调用点负责;成功后清草稿、重拉全部视图。\n const resetAll = (): void => {\n fetch(CONFIG_RESET_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'reset failed')\n setCfg(body.config as Config)\n clearDraft()\n setError(null)\n setVersion((n) => n + 1)\n showFlash(t('resetOk'))\n })\n .catch((e: unknown) => setError(`${t('resetFail')}: ${e instanceof Error ? e.message : String(e)}`))\n }\n\n // 切换模式:提示词 ↔ 工具是同一编辑域,草稿保留;切到预设即离开编辑域,\n // 脏草稿经确认后丢弃。右栏预览子视图跟随模式。\n const switchMode = (next: PanelMode): void => {\n const leaving = (mode === 'sections' || mode === 'tools') && next === 'presets'\n if (leaving) {\n if (draft?.dirty && !window.confirm(t('discardConfirm'))) return\n clearDraft()\n }\n setMode(next)\n setPreviewSub(next === 'tools' ? 'tools' : 'prompt')\n }\n\n // 切换编辑目标(顶部预设 Tab):草稿基线随目标变化,脏草稿先经确认再丢弃。\n const switchTarget = (next: string | undefined): void => {\n if (draft?.dirty && !window.confirm(t('discardConfirm'))) return\n clearDraft()\n setTarget(next)\n }\n\n // 「存为预设」:把当前编辑内容(含未保存草稿)fork 成一个新的 agent 预设 ——\n // 宿主 authoring API 整体复制来源预设目录(组成文件 / 伴生 .mjs / 技能目录),\n // 同时把当前配置写进 overrides[name]。来源 = 当前编辑目标;全局目标由服务端\n // 回落到 roster 默认预设。名字非法 / 同名由服务端报错。\n const saveAsPreset = (presetName: string): Promise<boolean> => {\n const name = presetName.trim()\n if (name.length === 0) return Promise.resolve(false)\n return fetch(PRESETS_CREATE_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n name,\n from: target,\n config: {\n sections: view.sections ?? [],\n sectionsBootstrap: view.sectionsBootstrap ?? [],\n sectionsCompaction: view.sectionsCompaction ?? [],\n replace: view.replace ?? {},\n inject: view.inject ?? [],\n tools: view.tools ?? {},\n },\n }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? t('saveAsPresetFail'))\n load()\n fetchPresets()\n showFlash(t('saveAsPresetOk'), 'ok')\n return true\n })\n .catch((e: unknown) => {\n showFlash(`${t('saveAsPresetFail')}:${String(e instanceof Error ? e.message : e)}`, 'err')\n return false\n })\n }\n\n const modeBtn = (key: PanelMode, label: string): ReactElement =>\n h('button', { key, style: mode === key ? s.segBtnActive : s.segBtn, onClick: () => switchMode(key) }, label)\n\n // 阶段按钮命名(头部合并控制:引导期 / 常驻期 / 压缩受控期)。\n const stageLabel = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('phaseStageGuide') : key === 'compaction' ? t('phaseStageControlled') : t('phaseStageResident')\n const draftDirty = draft?.dirty === true\n\n const targetTab = (id: string | undefined, label: string, broken?: string): ReactElement =>\n h('button', {\n key: id ?? '__global__',\n style: target === id ? s.targetTabActive : s.targetTab,\n onClick: () => switchTarget(id),\n title: broken !== undefined && broken !== '' ? `${label} — ${t('broken')}` : id === undefined ? t('targetHint') : label,\n }, [\n label,\n broken !== undefined && broken !== '' ? h('span', { style: s.badgeBlocked }, t('broken')) : null,\n ])\n\n return h('div', { style: s.pRoot }, [\n // ── 头部:标题 + 模式切换 + (阶段切换 + 开关) + 工具栏 ──\n // 阶段按钮合并放在三态同步选择框左侧:左栏列表与右栏预览跟着同一个\n // 阶段状态走,一处切换两边联动。仅在提示词 / 工具两个模式显示。\n h('div', { style: s.head }, [\n h('span', { style: s.headTitle }, [\n h('svg', { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.8, strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': 'true', style: { flex: 'none' } }, [\n h('path', { d: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z' }),\n h('path', { d: 'M14 2v6h6' }),\n h('path', { d: 'M16 13H8' }),\n h('path', { d: 'M16 17H8' }),\n h('path', { d: 'M10 9H8' }),\n ]),\n t('nav'),\n ]),\n h('div', { style: s.seg }, [\n modeBtn('sections', t('tabsSections')),\n modeBtn('tools', t('tabsTools')),\n modeBtn('presets', t('tabsPresets')),\n ]),\n h('div', { style: s.headActions }, [\n mode === 'sections' || mode === 'tools'\n ? h('div', { style: s.seg }, VIEW_KEYS.map((key) => h('button', {\n key,\n style: phase === key ? s.segBtnActive : s.segBtn,\n onClick: () => setPhase(key),\n }, stageLabel(key))))\n : null,\n draftDirty && (mode === 'sections' || mode === 'tools')\n ? h('span', { style: s.badgeReplaced, title: t('draftBadge') }, t('draftBadge'))\n : null,\n mode === 'sections' || mode === 'tools'\n ? h('label', {\n style: { ...s.muted, display: 'inline-flex', alignItems: 'center', gap: 4, cursor: 'pointer', whiteSpace: 'nowrap' },\n title: t('syncAllPhasesHint'),\n }, [\n h('input', {\n type: 'checkbox',\n checked: syncAll,\n onChange: (e: { target: { checked: boolean } }) => setSyncAll(e.target.checked),\n style: { margin: 0, cursor: 'pointer' },\n }),\n t('syncAllPhases'),\n ])\n : null,\n mode === 'sections'\n ? h('label', {\n style: { ...s.muted, display: 'inline-flex', alignItems: 'center', gap: 4, cursor: 'pointer', whiteSpace: 'nowrap' },\n title: t('zhHint'),\n }, [\n h('input', {\n type: 'checkbox',\n checked: zhOn,\n onChange: toggleZh,\n style: { margin: 0, cursor: 'pointer' },\n }),\n t('zhSwitch'),\n ])\n : null,\n h('button', {\n style: draft?.dirty ? s.saveBtnDirty : s.saveBtn,\n disabled: !draft?.dirty || saving,\n onClick: save,\n }, t('save')),\n // 刷新 = GET 磁盘权威状态;有脏草稿时再补一次当前阶段的草稿叠加预览,\n // 避免预览短暂回退到「上次保存」的状态。\n h('button', { style: s.saveBtn, onClick: () => { void refresh().then(() => syncDraftPreview()) } }, t('refresh')),\n h('button', { style: s.iconBtn, onClick: onClose, 'aria-label': t('close'), title: t('close') },\n h('svg', { width: 15, height: 15, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': 'true' }, [\n h('path', { d: 'M4 4l8 8M12 4l-8 8', stroke: 'currentColor', strokeWidth: 1.6, strokeLinecap: 'round' }),\n ])),\n ]),\n ]),\n // ── 第二行:agent 预设 Tab(编辑目标) ──\n h('div', { style: s.subhead }, [\n h('div', { style: s.targetRow }, [\n targetTab(undefined, t('targetAllTab')),\n ...agentPresets.map((p) => targetTab(p.id, p.name, p.broken)),\n ]),\n ]),\n // ── 消息条(错误 / 闪示 / 目标异常警示) ──\n h('div', { style: { padding: '0 14px' } }, [\n error ? h('div', { style: s.error }, String(error)) : null,\n flash ? h('div', { style: flashKind === 'err' ? s.error : s.noticeOk }, flash) : null,\n target && agentPresets.find((p) => p.id === target)?.broken\n ? h('div', { style: s.error }, t('brokenPreset'))\n : null,\n inv?.scopeResolved === false && mode !== 'presets'\n ? h('div', { style: s.noticeWarn }, t('scopeFallback'))\n : null,\n ]),\n // ── 主体分栏(flex row:左栏列表 / 右栏预览)──\n // 顶部选「提示词」= 提示词编辑 + 提示词预览;选「工具」= 工具编辑 +\n // 工具预览(previewSub 跟随模式,无手动切换)。阶段由头部统一控制。\n h('div', { key: 'body', style: s.body },\n mode === 'sections'\n ? [\n h(SectionsPane, { key: 'sections', cfg: view, inv, phases, phase, syncAll, t, write: edit }),\n h(PreviewPane, { key: 'preview', t, phases, phase, sub: previewSub }),\n ]\n : mode === 'tools'\n ? [\n h(ToolsPane, { key: 'tools', cfg: view, inv, phases, phase, syncAll, t, write: edit }),\n h(PreviewPane, { key: 'preview', t, phases, phase, sub: previewSub }),\n ]\n : [\n h(PresetsPane, {\n key: 'presets',\n cfg: view,\n inv,\n phases,\n t,\n writePatch,\n writeGlobal,\n // 黑名单永远是全局字段:取原始配置(不经 editView 的目标叠加)。\n envBlocklist: cfg.envBlocklist ?? [],\n }),\n h(SettingsPane, {\n key: 'settings',\n cfg: view,\n inv,\n t,\n writeGlobal,\n saveAsPreset,\n forkSource: target ? (agentPresets.find((p) => p.id === target)?.name ?? target) : undefined,\n onReset: resetAll,\n envBlocklist: cfg.envBlocklist ?? [],\n }),\n ]),\n ])\n}\n","/**\n * error-boundary — 把「面板渲染崩溃」关进笼子。\n *\n * 侧边栏入口是 createRoot 挂出来的独立 React 根,React 18 对渲染期异常的\n * 默认处理是卸载整个根——面板里一个组件抛错,导航行按钮会跟着一起消失。\n * 因此面板单独包一层:崩了只收起面板,导航按钮照常留着,真实错误打到控制台。\n */\n\nimport { Component, type ErrorInfo, type ReactNode } from 'react'\n\n/** 边界属性。 */\nexport interface ErrorBoundaryProps {\n /** 出错时打在日志里的名字。 */\n label: string\n /** 崩溃后的替代内容(面板场景传 null,只收面板)。 */\n fallback?: ReactNode\n /** 捕获到错误时的回调(用于顺手把面板关掉)。 */\n onError?: (error: Error) => void\n children: ReactNode\n}\n\ninterface ErrorBoundaryState {\n error: Error | null\n}\n\n/** 只兜渲染/生命周期异常的错误边界(不兜事件回调与异步)。 */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n override state: ErrorBoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error }\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n // 打出组件栈:没有它,崩溃只会表现为「界面少了一块」,无从下手。\n console.error(`[dsh-prompt-customizer] ${this.props.label} 渲染崩溃:`, error, info.componentStack ?? '')\n try {\n this.props.onError?.(error)\n } catch (callbackError) {\n console.error('[dsh-prompt-customizer] 错误边界回调失败:', callbackError)\n }\n }\n\n override render(): ReactNode {\n if (this.state.error !== null) return this.props.fallback ?? null\n return this.props.children\n }\n}\n","/**\n * nav — 侧边栏导航入口(独立于设置栏的面板入口)。\n *\n * 在 sidebar 底部的「设置」行(`[data-slot=\"sidebar.settings\"]`,harness\n * SidebarRoot 的稳定插槽)正上方插一个 host,host 内放一个 `data-nav-slot`\n * 槽位容器;入口组件经 `useNavSlot` 轮询拿到槽位后 `createPortal` 进去。\n * 选底部而不选工作区上方:顶部区域是插件抢座重灾区(任务看板等组件都往\n * 新会话/工作区一带插),settings 插槽由宿主自有渲染树持有,没人争。\n *\n * host 是手工插进 DSH 自有 React 树的裸节点(React 不认识它),因此用\n * MutationObserver 盯父节点补位 + 低频轮询兜底重挂(HMR、React 重建侧边栏\n * 时入口不会消失)。\n *\n * rail 折叠态由 `useRail` 观察框架容器的 `data-sidebar-collapsed` 属性切换,\n * 折叠时按钮收缩为图标。\n *\n * 结构与 dsh-triad 的 sidebar-nav 同款(各自独立创建 host,互不依赖)。\n */\n\nimport { useEffect, useState, type MouseEvent, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\n/** nav host id(本模块创建)。 */\nconst HOST_ID = 'dsh-prompt-customizer-nav-host'\n/** slots 渲染器的稳定锚点(SidebarRoot 暴露的 `sidebar.settings` slot)。 */\nconst ANCHOR_SELECTOR = '[data-slot=\"sidebar.settings\"]'\n/** 侧边栏折叠观察:框架容器选择在所有 sidebar 状态(wide/rail)下都唯一。 */\nconst FRAME_SELECTOR = 'div:has(> [data-shell-overlay])'\n\n/** 槽位名(本插件只有一个入口)。 */\nexport type NavSlotName = 'prompt'\n\n/** 建一个槽位容器(portal 目标)。 */\nfunction makeSlot(name: string): HTMLDivElement {\n const slot = document.createElement('div')\n slot.dataset.navSlot = name\n return slot\n}\n\nlet started = false\nlet pollTimer = 0\nlet hostObserver: MutationObserver | undefined\n\n/** 确保 host 已创建并插到 `sidebar.settings` slot 之前(幂等)。 */\nfunction ensureHostPlaced(): boolean {\n const anchor = document.querySelector(ANCHOR_SELECTOR)\n if (anchor === null) return false\n const parent = anchor.parentElement\n if (parent === null) return false\n let host = document.getElementById(HOST_ID) as HTMLDivElement | null\n if (host === null) {\n host = document.createElement('div')\n host.id = HOST_ID\n host.dataset.plugin = 'dsh-prompt-customizer'\n host.appendChild(makeSlot('prompt'))\n }\n // 就位判定:host 与锚点同父、且在锚点之前。\n const inPlace = host.parentElement === parent\n && (anchor.compareDocumentPosition(host) & Node.DOCUMENT_POSITION_PRECEDING) !== 0\n if (!inPlace) {\n parent.insertBefore(host, anchor)\n }\n return true\n}\n\n/**\n * 盯住宿主的直接父节点,宿主一被摘掉立刻补位。\n *\n * host 是手工 insertBefore 进 DSH 自有 React 树的裸节点——侧边栏任何一次\n * children 重排都可能把它回收掉。只观察父节点的 childList(不开 subtree);\n * 父节点整体被替换时观察会失联,由轮询兜底重挂。补位后 ensureHostPlaced\n * 不再改动 DOM,不会自激。\n */\nfunction watchHostParent(): void {\n const parent = document.getElementById(HOST_ID)?.parentElement\n if (parent === undefined || parent === null) return\n hostObserver?.disconnect()\n hostObserver = new MutationObserver(() => {\n const before = document.getElementById(HOST_ID)?.parentElement\n ensureHostPlaced()\n if (document.getElementById(HOST_ID)?.parentElement !== before) watchHostParent()\n })\n hostObserver.observe(parent, { childList: true })\n}\n\n/**\n * 挂载导航区 host(幂等单例)。首次调用者持有清理权(停轮询、移除 host),\n * 后续调用返回 no-op。\n */\nexport function ensureNavMount(): () => void {\n if (typeof document === 'undefined') return () => {}\n if (started) return () => {}\n started = true\n ensureHostPlaced()\n watchHostParent()\n // 低频轮询兜底:侧边栏容器整体被替换(观察失联)时重挂(HMR、React 重建等)。\n pollTimer = window.setInterval(() => {\n ensureHostPlaced()\n if (hostObserver === undefined) watchHostParent()\n }, 1500)\n return () => {\n window.clearInterval(pollTimer)\n pollTimer = 0\n hostObserver?.disconnect()\n hostObserver = undefined\n started = false\n document.getElementById(HOST_ID)?.remove()\n }\n}\n\n/** 轮询获取指定槽位容器(未就位时返回 null,组件据此暂不渲染)。\n *\n * **永不停止**:未就位时 100ms 阶梯快查(10 次后退 400ms);找到后退化为\n * 800ms 慢速校验——同一节点 setSlot 被 React 直接跳过,零渲染开销。这样\n * 槽位一旦被移除/替换(HMR、React 重建 host),portal 会自动迁到新槽。\n */\nexport function useNavSlot(name: NavSlotName): HTMLElement | null {\n const [slot, setSlot] = useState<HTMLElement | null>(null)\n useEffect(() => {\n let timer = 0\n let tries = 0\n const poll = (): void => {\n const found = document.querySelector<HTMLElement>(`[data-nav-slot='${name}']`)\n if (found !== null) tries = 0\n else tries += 1\n setSlot(found)\n timer = window.setTimeout(poll, found !== null ? 800 : tries <= 10 ? 100 : 400)\n }\n poll()\n return () => { window.clearTimeout(timer) }\n }, [name])\n return slot\n}\n\n/** 侧边栏折叠态(rail = 只显示图标)。\n *\n * 观察 body 子树的 data-sidebar-collapsed(框架容器可能在折叠时被 React\n * 重挂,盯单节点会失联)+ 低频兜底重读。值不变时 React 自动跳过渲染。\n */\nexport function useRail(): boolean {\n const [rail, setRail] = useState(() =>\n document.querySelector(FRAME_SELECTOR)?.hasAttribute('data-sidebar-collapsed') ?? false)\n useEffect(() => {\n const read = (): void => {\n setRail(document.querySelector(FRAME_SELECTOR)?.hasAttribute('data-sidebar-collapsed') ?? false)\n }\n read()\n const observer = new MutationObserver(read)\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-sidebar-collapsed'], subtree: true })\n const timer = window.setInterval(read, 1500)\n return () => {\n observer.disconnect()\n window.clearInterval(timer)\n }\n }, [])\n return rail\n}\n\nconst STYLE_ID = 'dsh-prompt-customizer-nav-styles'\n\nconst SHEET = `\n/* 导航行:与侧边栏原生行同款几何(透明底 + hover 高亮 + 文字省略) */\n.dsh-pc-nav-btn{position:relative;display:flex;align-items:center;gap:8px;width:calc(100% - 4px);height:34px;padding:0 10px;margin:0 2px 4px;box-sizing:border-box;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-primary,#eee);font-size:14px;line-height:20px;font-family:inherit;cursor:pointer;text-align:left;user-select:none;overflow:hidden;transition:background 120ms ease}\n.dsh-pc-nav-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.dsh-pc-nav-btn[data-open='true']{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.dsh-pc-nav-btn>svg{flex:none;color:var(--dsw-alias-label-secondary,#bbb)}\n.dsh-pc-nav-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n/* 折叠 rail 态:只留图标 */\n.dsh-pc-nav-btn[data-rail='true']{width:36px;height:36px;padding:0;margin:0 0 8px;justify-content:center;border-radius:8px}\n/* nav host:槽位 display:contents,按钮直接撑满整行。 */\n#dsh-prompt-customizer-nav-host{display:flex;flex-direction:column;align-items:stretch;width:100%}\n#dsh-prompt-customizer-nav-host>[data-nav-slot]{display:contents}\n`\n\n/** 注入导航行样式(幂等)。 */\nexport function ensureNavStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.dataset.plugin = 'dsh-prompt-customizer'\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** NavButton 属性。 */\nexport interface NavButtonProps {\n /** 行图标(svg 元素,颜色由样式表统一着色)。 */\n icon: ReactNode\n /** 行文字(rail 态不渲染)。 */\n label: string\n /** 折叠态(只留图标)。 */\n rail?: boolean\n /** 面板展开态(高亮底色)。 */\n expanded?: boolean\n /** 无障碍名(缺省用 label)。 */\n ariaLabel?: string\n /** 点击。 */\n onClick: (e: MouseEvent<HTMLButtonElement>) => void\n}\n\n/** 渲染一条导航行按钮。 */\nexport function NavButton({\n icon, label, rail = false, expanded = false, ariaLabel, onClick,\n}: NavButtonProps): JSX.Element {\n return (\n <button\n type=\"button\"\n className=\"dsh-pc-nav-btn\"\n data-rail={rail || undefined}\n data-open={expanded || undefined}\n aria-label={ariaLabel ?? label}\n aria-expanded={expanded}\n title={rail ? (ariaLabel ?? label) : undefined}\n onClick={onClick}\n >\n {icon}\n {!rail && <span className=\"dsh-pc-nav-label\">{label}</span>}\n </button>\n )\n}\n\n/** 便捷组合:portal 到指定槽位(slot 未就位时不渲染)。 */\nexport function NavPortal({ name, children }: { name: NavSlotName; children: ReactNode }): JSX.Element | null {\n const slot = useNavSlot(name)\n if (slot === null) return null\n return createPortal(children, slot)\n}\n\n/** 面板互斥 + 切会话自动收(与 dsh-triad 的面板互相礼让)。\n *\n * - 互斥:打开时广播自己的事件,并监听本插件与 dsh-triad 的同类广播,\n * 别的面板打开时自动收回(主区同时只被一个面板占住);\n * - 切会话自动收:面板盖住会话主区、无遮罩,侧栏保持可点;侧栏会话区内\n * 的点击(自己导航行与面板本体除外)直接收面板。\n */\nconst PANEL_OPEN_EVENT = 'dsh-prompt-customizer:panel-open'\n/** dsh-triad 的面板广播(装了 triad 时互相礼让;detail 永远不等于本插件名)。 */\nconst TRIAD_PANEL_OPEN_EVENT = 'dsh-triad:panel-open'\n\n/** 点击是否落在侧栏列内(按几何判定,不依赖宿主的哈希类名)。 */\nfunction clickInSidebar(target: Element): boolean {\n let node: Element | null = target\n while (node !== null && node !== document.body) {\n const rect = node.getBoundingClientRect()\n if (\n rect.height >= window.innerHeight * 0.7\n && rect.left <= 8\n && rect.right <= window.innerWidth * 0.6\n ) return true\n node = node.parentElement\n }\n return false\n}\n\nexport function usePanelAutoClose(open: boolean, requestClose: () => void): void {\n // 打开时广播,挤掉别的面板。\n useEffect(() => {\n if (!open) return\n window.dispatchEvent(new CustomEvent(PANEL_OPEN_EVENT, { detail: 'prompt-customizer' }))\n }, [open])\n // 听别人的广播 + 侧栏会话区点击。detail 是本插件自己的广播,忽略。\n useEffect(() => {\n if (!open) return undefined\n const onSiblingOpen = (event: Event): void => {\n if ((event as CustomEvent<unknown>).detail !== 'prompt-customizer') requestClose()\n }\n const onDocClick = (event: globalThis.MouseEvent): void => {\n const target = event.target\n if (!(target instanceof Element)) return\n // 自己导航行、面板本体不收。\n if (target.closest(`#${HOST_ID}, .pcsh-card`) !== null) return\n if (clickInSidebar(target)) requestClose()\n }\n window.addEventListener(PANEL_OPEN_EVENT, onSiblingOpen)\n window.addEventListener(TRIAD_PANEL_OPEN_EVENT, onSiblingOpen)\n document.addEventListener('click', onDocClick, true)\n return () => {\n window.removeEventListener(PANEL_OPEN_EVENT, onSiblingOpen)\n window.removeEventListener(TRIAD_PANEL_OPEN_EVENT, onSiblingOpen)\n document.removeEventListener('click', onDocClick, true)\n }\n }, [open, requestClose])\n}\n","/**\n * shell — 「覆盖会话主区」的面板外壳(提示词管理面板)。\n *\n * 跟点会话一致的行为(与 dsh-triad 的 popover-shell 同款交互,各自独立实现):\n * - drawer 模式:直接盖住会话主区(侧栏右缘 → 视口右缘,全高,无遮罩),\n * 自右向左滑入,关闭反向收回;侧栏保持可点,随时切会话(切会话自动收面板);\n * - 窄视口回退全屏 sheet(上滑入场,带遮罩);\n * - Esc 关闭走 props.onClose。\n *\n * z 层级:mask 999 / card 1000——与宿主 Modal 同层;面板内部 portal 到 body\n * 的二级弹窗 DOM 顺序更靠后,自然浮于本壳之上。\n */\n\nimport { useEffect, useState, type CSSProperties, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\nconst STYLE_ID = 'dsh-prompt-customizer-shell-styles'\n\n/** 动画时长(ms),CSS 与 JS 计时保持一致。 */\nexport const PANEL_ANIM_MS = 240\n\n/** 会话主区左缘回退值(px):侧栏实测失败时盖住 280px 右侧全部区域。 */\nconst FALLBACK_MAIN_LEFT = 280\n/** 窄屏阈值(px):低于该宽度回退全屏 sheet。 */\nconst NARROW_VP = 768\n\n/** 读会话主区左缘 = 侧栏列右缘(跟随侧栏折叠变化;失败回退 280)。 */\nfunction readMainLeft(): number {\n try {\n const host = document.getElementById('dsh-prompt-customizer-nav-host')\n if (host !== null) {\n const hostRight = host.getBoundingClientRect().right\n let node = host.parentElement\n while (node !== null && node !== document.body) {\n const rect = node.getBoundingClientRect()\n if (rect.height >= window.innerHeight * 0.7 && rect.left <= 8 && rect.right >= hostRight - 4) {\n return Math.round(rect.right)\n }\n node = node.parentElement\n }\n }\n } catch { /* 量不到就回退固定值 */ }\n return FALLBACK_MAIN_LEFT\n}\n\nconst SHEET = `\n@keyframes pc-modal-drawer-in{from{opacity:0;transform:translateX(56px)}to{opacity:1;transform:translateX(0)}}\n@keyframes pc-modal-drawer-out{from{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(40px)}}\n@keyframes pc-modal-slide-in{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}\n@keyframes pc-modal-slide-out{from{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(24px)}}\n@keyframes pc-modal-mask-in{from{opacity:0}to{opacity:1}}\n@keyframes pc-modal-mask-out{from{opacity:1}to{opacity:0}}\n/* ── 遮罩:淡入淡出(仅窄屏 sheet 模式有遮罩) ── */\n.pcsh-mask{position:fixed;inset:0;z-index:999;background:var(--dsw-alias-bg-mask-1,rgba(0,0,0,.45))}\n.pcsh-mask[data-anim='in']{animation:pc-modal-mask-in ${PANEL_ANIM_MS}ms ease both}\n.pcsh-mask[data-anim='out']{animation:pc-modal-mask-out ${PANEL_ANIM_MS}ms ease both}\n/* ── 卡片:会话式右侧抽屉 / 窄屏全屏 sheet 回退 ── */\n.pcsh-card{position:fixed;z-index:1000;display:flex;flex-direction:column;box-sizing:border-box;background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,#16181d));color:var(--dsw-alias-label-primary,#eee);overflow:hidden}\n.pcsh-card[data-mode='drawer']{top:0;right:0;bottom:0;height:100vh;height:100dvh;border:none;border-left:1px solid var(--dsw-alias-border-l1,rgba(128,128,128,.18));box-shadow:none;transition:left ${PANEL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n/* in 动画不得带 fill-mode(both/forwards 会残留 to 帧 transform,使卡片成为\n 后代 position:fixed 元素的包含块);out 需要 forwards 保持隐藏态直到卸载。 */\n.pcsh-card[data-mode='drawer'][data-anim='in']{animation:pc-modal-drawer-in ${PANEL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n.pcsh-card[data-mode='drawer'][data-anim='out']{animation:pc-modal-drawer-out ${PANEL_ANIM_MS}ms cubic-bezier(.4,0,.2,1) both}\n.pcsh-card[data-mode='sheet'][data-anim='in']{animation:pc-modal-slide-in ${PANEL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n.pcsh-card[data-mode='sheet'][data-anim='out']{animation:pc-modal-slide-out ${PANEL_ANIM_MS}ms cubic-bezier(.4,0,.2,1) both}\n/* ── 窄屏:任何模式强制全屏 sheet(!important 压过内联 left/width)。 ── */\n@media (max-width: 767.98px){\n .pcsh-card{\n left:0 !important;top:0 !important;right:auto !important;bottom:auto !important;\n width:100vw !important;max-width:100vw !important;\n height:100vh !important;height:100dvh !important;max-height:100vh !important;max-height:100dvh !important;\n border-radius:0 !important;transform:none !important;\n }\n}\n@media (prefers-reduced-motion:reduce){\n .pcsh-mask,.pcsh-card{animation:none!important}\n .pcsh-card{transition:none!important}\n}\n`\n\n/** 注入外壳样式(幂等)。 */\nexport function ensureShellStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.dataset.plugin = 'dsh-prompt-customizer'\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** PanelShell 属性。 */\nexport interface PanelShellProps {\n /** 正在播放收回动画(此时仍挂载,播 out 动画)。 */\n closing: boolean\n /** 请求关闭(Esc / 关闭钮统一走这里)。 */\n onClose: () => void\n /** 无障碍名(role=dialog 的 aria-label)。 */\n ariaLabel: string\n children: ReactNode\n}\n\n/** 渲染覆盖会话主区的抽屉面板(portal 到 body;窄屏回退全屏 sheet + 遮罩)。 */\nexport function PanelShell({ closing, onClose, ariaLabel, children }: PanelShellProps): JSX.Element {\n // 视口宽度 + 会话主区左缘走 state:窗口缩放/侧栏折叠时实时跟随。\n const [vw, setVw] = useState(window.innerWidth)\n const [mainLeft, setMainLeft] = useState(readMainLeft)\n useEffect(() => {\n const reread = (): void => {\n setVw(window.innerWidth)\n setMainLeft(readMainLeft())\n }\n reread()\n window.addEventListener('resize', reread)\n const observer = new MutationObserver(reread)\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-sidebar-collapsed'], subtree: true })\n const timer = window.setInterval(reread, 1500)\n return () => {\n window.removeEventListener('resize', reread)\n observer.disconnect()\n window.clearInterval(timer)\n }\n }, [])\n const anim = closing ? 'out' : 'in'\n // 窄屏回退全屏 sheet;桌面端直接盖住会话主区(left=侧栏右缘,右拉满)。\n const narrow = vw < NARROW_VP\n const mode = narrow ? 'sheet' : 'drawer'\n const style: CSSProperties | undefined = narrow ? undefined : { left: mainLeft }\n\n useEffect(() => {\n if (closing) return undefined\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', onKey)\n return () => { document.removeEventListener('keydown', onKey) }\n }, [closing, onClose])\n\n // portal 到 body:入口 portal 在侧边栏导航槽里,而槽位宿主是手工插进 DSH\n // 自有 React 树的裸节点——弹层留在里面会被侧边栏重渲染连带回收,且\n // position:fixed 会被 transform 祖先变成局部定位。挪到 body 后不受影响。\n return createPortal(\n <>\n {narrow && (\n <div className=\"pcsh-mask\" data-anim={anim} aria-hidden=\"true\" onClick={onClose} />\n )}\n <div\n className=\"pcsh-card\"\n data-anim={anim}\n data-mode={mode}\n style={style}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n >\n {children}\n </div>\n </>,\n document.body,\n )\n}\n\n/**\n * 面板关闭动画状态机:先置 closing 播放收回动画,结束后再真正 onClose。\n * `open` 再次变 true 时重置 closing(否则上一次收回动画会把 closing 卡在 true)。\n */\nexport function usePanelClose(open: boolean, onClose: () => void, durationMs = PANEL_ANIM_MS): { closing: boolean; requestClose: () => void } {\n const [closing, setClosing] = useState(false)\n useEffect(() => {\n if (open) setClosing(false)\n }, [open])\n useEffect(() => {\n if (!closing) return undefined\n const timer = window.setTimeout(() => onClose(), durationMs)\n return () => { window.clearTimeout(timer) }\n }, [closing, onClose, durationMs])\n const requestClose = (): void => setClosing(true)\n return { closing, requestClose }\n}\n","/**\n * dsh-prompt-customizer — 浏览器端(TypeScript 源码)。\n *\n * 在侧边栏注册一个「提示词」入口按钮(不再挤在设置栏里),点击打开覆盖\n * 会话主区的「提示词管理」面板:左栏勾选提示词 / 工具,右栏实时预览最终\n * 装配;顶部 Tab 切换 agent 预设(编辑目标)。面板从宿主的\n * `/api/prompt-customizer/inventory` 拉取当前生效的段 / 工具清单,屏蔽、\n * 替换、注入提示词段并隐藏工具;所有写入走插件自有路由(宿主端的\n * config.yaml),保存按钮一次落盘。\n *\n * 由 tsdown 打包为 client/client.js(__ModuleLoader__ factory bundle);\n * 外部依赖只有 loader 模块表中的 react 入口。\n */\nimport { createElement as h, useState, type ReactElement } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { DICT, type Translate } from './locales.ts'\nimport { Panel } from './Panel.tsx'\nimport { ErrorBoundary } from './error-boundary.tsx'\nimport { NavButton, NavPortal, ensureNavMount, ensureNavStyles, usePanelAutoClose, useRail } from './nav.tsx'\nimport { PanelShell, ensureShellStyles, usePanelClose } from './shell.tsx'\n\nconst NS = 'prompt-customizer'\n\nexport const name = 'prompt-customizer'\n// 只依赖 locale 服务:导航入口是自建 host + DOM portal,不经过宿主 slots。\nexport const inject = ['locale']\n\n/** 本插件用到的客户端 cordis 上下文的最小子集。 */\ninterface ClientContext {\n effect(callback: () => unknown, label?: string): void\n locale: {\n register(namespace: string, dicts: { zh: Record<string, string>; en: Record<string, string> }): unknown\n bind(namespace: string): Translate\n }\n}\n\n/** 提示词入口:导航行按钮 + 点击打开覆盖主区的面板。 */\nfunction PromptEntry({ t }: { t: Translate }): ReactElement {\n const [open, setOpen] = useState(false)\n const { closing, requestClose } = usePanelClose(open, () => { setOpen(false) })\n const rail = useRail()\n usePanelAutoClose(open, requestClose)\n return h('div', null, [\n h(NavButton, {\n // 文档线性风图标(file-text),颜色由导航样式表统一着色。\n icon: h('svg', { width: rail ? 18 : 16, height: rail ? 18 : 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.8, strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': 'true' }, [\n h('path', { d: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z' }),\n h('path', { d: 'M14 2v6h6' }),\n h('path', { d: 'M16 13H8' }),\n h('path', { d: 'M16 17H8' }),\n h('path', { d: 'M10 9H8' }),\n ]),\n label: t('navShort'),\n rail,\n expanded: open,\n onClick: () => { setOpen(true) },\n }),\n // 面板单独包边界:面板内部崩了只收面板,导航行按钮留着(否则 React 18\n // 会卸载整个 root,侧边栏入口凭空消失且控制台无痕)。\n open ? h(ErrorBoundary, {\n key: 'panel',\n label: '提示词管理面板',\n fallback: null,\n onError: () => requestClose(),\n children: h(PanelShell, {\n closing,\n onClose: requestClose,\n ariaLabel: t('nav'),\n children: h(Panel, { t, onClose: requestClose }),\n }),\n }) : null,\n ])\n}\n\n/** 导航行应用:入口 portal 到自建 nav host 的槽位。 */\nfunction PromptNavApp({ t }: { t: Translate }): ReactElement {\n return h('div', null,\n h(NavPortal, { name: 'prompt', children: h(PromptEntry, { t }) }))\n}\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(() => ctx.locale.register(NS, DICT), 'prompt-customizer: locale')\n const t = ctx.locale.bind(NS)\n\n // 侧边栏入口:自建 host 插在 sidebar.workspaces 槽位之前(见 nav.tsx),\n // React 根挂在游离容器上(React 18 支持容器后入树);实际 UI 经 portal\n // 落到 nav host 的槽位 div。\n ctx.effect(() => {\n ensureNavMount()\n ensureNavStyles()\n ensureShellStyles()\n const holder = document.createElement('div')\n const root = createRoot(holder)\n root.render(h(PromptNavApp, { t }))\n return () => { root.unmount() }\n }, 'prompt-customizer: sidebar nav entry')\n}\n"],"mappings":"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"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/client/index.ts", "../src/client/skills/entry.tsx", "../src/client/skills/SkillsPanel.tsx", "../src/client/popover-shell.tsx", "../src/client/modal-animation.ts", "../src/client/prompt/Panel.tsx", "../src/client/skills/styles.ts", "../src/client/prompt/dnd.ts", "../src/client/prompt/styles.ts", "../src/client/prompt/presets.ts", "../vendor/prompt-customizer/sectionOps.mjs", "../vendor/prompt-customizer/zh/core.mjs", "../vendor/prompt-customizer/zh/undo.mjs", "../vendor/prompt-customizer/zh/teams.mjs", "../vendor/prompt-customizer/zh/cordis.mjs", "../vendor/prompt-customizer/zh/sdk.mjs", "../vendor/prompt-customizer/zh/index.mjs", "../src/client/prompt/SectionsPane.tsx", "../src/client/prompt/drag-scroll.ts", "../src/client/prompt/ToolsPane.tsx", "../src/client/prompt/PresetsPane.tsx", "../src/client/prompt/preset-io.ts", "../src/client/prompt/PreviewPane.tsx", "../src/client/prompt/PreviewTools.tsx", "../src/client/prompt/locales.ts", "../src/client/prompt/index.ts", "../src/client/prompt/PromptView.tsx", "../src/client/skills/api.ts", "../src/client/skills/files.ts", "../src/client/skills/GuidePanel.tsx", "../src/client/skills/icons.tsx", "../src/client/skills/locales.ts", "../src/client/skills/McpAddModal.tsx", "../src/client/skills/McpView.tsx", "../src/client/confirm-dialog.tsx", "../src/client/skills/mcp-live.ts", "../src/client/skills/SkillCard.tsx", "../src/client/skills/types.ts", "../src/client/skills/SkillViewer.tsx", "../src/client/skills/markdown.ts", "../src/client/skills/SkillsView.tsx", "../src/client/skills/TopBar.tsx", "../src/client/error-boundary.tsx", "../src/client/sidebar-nav.tsx"],
4
+ "sourcesContent": ["/**\n * dsh-prompt-customizer \u2014 browser half entry.\n *\n * Mounts the capability module (skills + MCP + prompt management), each piece\n * isolated so a failure in one cannot take down the others:\n *\n * - skills panel \u2192 sidebar nav row + panel (SKILL / MCP / \u63D0\u793A\u8BCD top-level tabs)\n * - prompt \u2192 locale registration for the \u63D0\u793A\u8BCD tab (panel body lives in\n * `./prompt`, ported from dsh-prompt-customizer)\n *\n * \u4E0D\u518D\u6CE8\u518C\u5185\u6838\u5DF2\u7ECF\u63D0\u4F9B\u7684\u90A3\u4E09\u6837\uFF08`skill` locale \u547D\u540D\u7A7A\u95F4\u3001`tool.call.toolview`\n * \u7684 `skill` \u5DE5\u5177\u884C\u3001`/` \u659C\u6760\u6E90\uFF09\uFF1A\u5B83\u4EEC\u5C5E\u4E8E `@deepseek-ai/dsh-client-ui-skill`\uFF0C\n * \u800C locale / slots / inputTriggers \u4E09\u4E2A\u6CE8\u518C\u8868\u5BF9\u540C\u540D/\u540C\u952E**\u76F4\u63A5\u629B\u9519**\uFF0C\u4E14\u8C01\u5148\n * \u6CE8\u518C\u8C01\u8BA9\u540E\u6765\u8005\u629B \u2014\u2014 \u91CD\u590D\u6CE8\u518C\u4F1A\u628A\u5185\u6838\u63D2\u4EF6\u7684 apply \u6253\u6302\uFF0C\u6574\u6761\u5BA2\u6237\u7AEF\u63D2\u4EF6\u52A0\u8F7D\n * \u94FE\u4E00\u8D77\u5931\u8D25\uFF080.6.0 \u5B9E\u6D4B\u8E29\u8FC7\uFF09\u3002\u6280\u80FD\u6570\u636E\u672C\u8EAB\u4ECD\u7531\u672C\u63D2\u4EF6\u7684\u9762\u677F\u4E0E\u8DEF\u7531\u63D0\u4F9B\u3002\n *\n * All data comes from the host half's loopback-only HTTP routes via\n * same-origin fetch. No DSH source is modified.\n */\n\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport { apply as applySkillsEntry } from './skills/entry.js'\nimport { applyPrompt } from './prompt/index.js'\n\n/** Client services required before the browser half activates. */\nexport const inject = ['slots', 'locale', 'inputTriggers', 'sessions']\n\n/** Run one module's apply, logging and swallowing any failure. */\nfunction safe(label: string, run: (ctx: ClientContext) => void, ctx: ClientContext): void {\n try {\n run(ctx)\n } catch (error) {\n console.error(`[dsh-prompt-customizer] ${label} failed:`, error)\n }\n}\n\nexport function apply(ctx: ClientContext): void {\n safe('skills panel', applySkillsEntry, ctx)\n safe('prompt locale', applyPrompt, ctx)\n}\n", "/**\r\n * \u80FD\u529B\uFF08\u6280\u80FD + MCP \u7BA1\u7406\uFF09\u5165\u53E3\uFF1A\u4FA7\u8FB9\u680F\u5BFC\u822A\u884C\u3002\r\n *\r\n * \u70B9\u51FB\u6253\u5F00\u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\u7684\u9762\u677F\uFF08\u8DDF\u70B9\u4F1A\u8BDD\u4E00\u6837\u5360\u4F4F\u4E3B\u533A\uFF0C\u79FB\u52A8\u7AEF\u56DE\u9000\u5E95\u90E8 sheet\uFF09\uFF0C\r\n * \u9762\u677F\u9876\u90E8 SKILL / MCP \u53CC\u5C42\u9876\u5C42 tab\u3002\r\n */\r\nimport { useState } from 'react'\r\nimport { createRoot } from 'react-dom/client'\r\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\r\nimport { SkillsPanel } from './SkillsPanel'\r\nimport { ensureModalAnimStyles, useModalClose } from '../modal-animation'\r\nimport { ErrorBoundary } from '../error-boundary'\r\nimport { NavButton, NavPortal, ensureNavMount, ensureNavStyles, navAnchorFrom, usePanelAutoClose, useRail } from '../sidebar-nav'\r\nimport { ensureShellStyles, type PopoverAnchor } from '../popover-shell'\r\n\r\n/** \u4ECE\u70B9\u51FB\u4E8B\u4EF6\u53D6\u951A\u70B9\uFF1A\u6240\u5728\u5BFC\u822A\u884C\u53F3\u7F18 +8\u3001\u6309\u94AE\u9876\u7F18 -6\u3002 */\r\nfunction anchorFromEvent(e: React.MouseEvent<HTMLButtonElement>): PopoverAnchor | null {\r\n return navAnchorFrom(e.currentTarget)\r\n}\r\n\r\n/** \u6280\u80FD\u5165\u53E3\uFF1A\u5BFC\u822A\u884C + \u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\u7684\u9762\u677F\u3002 */\r\nfunction SkillsEntry(): JSX.Element {\r\n ensureModalAnimStyles()\r\n ensureShellStyles()\r\n const [open, setOpen] = useState(false)\r\n const [anchor, setAnchor] = useState<PopoverAnchor | null>(null)\r\n const { closing, requestClose } = useModalClose(open, () => { setOpen(false) })\r\n const rail = useRail()\r\n usePanelAutoClose('skills', open, requestClose)\r\n return (\r\n <>\r\n {/* \u80FD\u529B\uFF08\u95EA\u7535\uFF0CFeather zap \u7EBF\u6027\u98CE\uFF0C\u81EA\u7ED8\u56FE\u6807\uFF09 */}\r\n <NavButton\r\n icon={(\r\n <svg width={rail ? 18 : 16} height={rail ? 18 : 16} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M13 2 3 14h7l-1 8 10-12h-7l1-8z\" />\r\n </svg>\r\n )}\r\n label=\"\u80FD\u529B\"\r\n rail={rail}\r\n expanded={open}\r\n onClick={e => {\r\n e.stopPropagation()\r\n setAnchor(anchorFromEvent(e))\r\n setOpen(true)\r\n }}\r\n />\r\n {open && (\r\n <ErrorBoundary label=\"\u6280\u80FD\u9762\u677F\" fallback={null} onError={requestClose}>\r\n <SkillsPanel closing={closing} onClose={requestClose} anchor={anchor} />\r\n </ErrorBoundary>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\n/** \u5BFC\u822A\u884C\u5E94\u7528\uFF1A\u80FD\u529B\u5165\u53E3 portal \u5230 nav host \u7684 skills \u69FD\u3002 */\r\nfunction SkillsNavApp(): JSX.Element | null {\r\n ensureNavStyles()\r\n return (\r\n <NavPortal name=\"skills\">\r\n <SkillsEntry />\r\n </NavPortal>\r\n )\r\n}\r\n\r\nexport function apply(ctx: ClientContext): void {\r\n ctx.effect(() => {\r\n ensureNavMount()\r\n // React \u6839\u6302\u5728\u6E38\u79BB\u5BB9\u5668\u4E0A\uFF08React 18 \u652F\u6301\u5BB9\u5668\u540E\u5165\u6811\uFF09\uFF1B\u5B9E\u9645 UI \u7ECF portal\r\n // \u843D\u5230 sidebar-nav \u7684\u69FD\u4F4D div\u3002\r\n const holder = document.createElement('div')\r\n const root = createRoot(holder)\r\n root.render(<SkillsNavApp />)\r\n return () => { root.unmount() }\r\n }, 'triad: skills nav entry')\r\n}\r\n", "/**\n * SkillsPanel \u2014 \u80FD\u529B\u7BA1\u7406\u9762\u677F\uFF08SKILL / MCP \u53CC\u9876\u5C42 tab\uFF09\u3002\n *\n * \u62C6\u5206\u540E\u7684\u7F16\u6392\u5C42\uFF1A\u6301\u6709\u5168\u90E8\u72B6\u6001\u4E0E\u64CD\u4F5C\uFF0C\u6309\u9875\u7B7E\u6E32\u67D3\u9876\u680F\uFF08TopBar\uFF09\u4E0E\u4E3B\u533A\n * \uFF08SkillsView / McpView\uFF09\uFF0C\u5E76\u7EDF\u7BA1\u4E8C\u7EA7\u5F39\u7A97\uFF08\u6DFB\u52A0\u6280\u80FD\u3001\u65B0\u5EFA\u6280\u80FD\u5305\u3001\u8BBE\u7F6E\u5206\u7C7B\u3001\n * \u5220\u9664\u786E\u8BA4\u3001\u6587\u4EF6\u67E5\u770B\u5668\u3001\u5F52\u5165\u6280\u80FD\u5305\uFF09\u4E0E\u53F3\u4E0B\u89D2\u64CD\u4F5C\u56DE\u6267\u3002\n *\n * \u6570\u636E\u5168\u90E8\u8D70 /api/skill-manager\u3001/api/skill-toggles\u3001/api/skill-health\u3001\n * /api/triad/mcp-* \u3002\u62C6\u5206\u53EA\u79FB\u52A8\u4EE3\u7801\uFF0C\u672A\u6539\u52A8 DOM \u7ED3\u6784\u4E0E\u7C7B\u540D\u3002\n */\nimport { useEffect, useRef, useState, type CSSProperties, type DragEvent, type FormEvent } from 'react'\nimport {\n Button, IconChevronDownOutlineRegular, IconFolderOpenOutlineRegular, Modal,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { PshBody, PopoverShell, type PopoverAnchor } from '../popover-shell'\nimport { PromptView } from '../prompt/PromptView'\nimport { skillApi } from './api.js'\nimport { collectEntry, fileToBase64 } from './files.js'\nimport { GuidePanel } from './GuidePanel.js'\nimport { CloudUpIcon } from './icons.js'\nimport { skillT } from './locales.js'\nimport { McpAddModal } from './McpAddModal.js'\nimport { McpView } from './McpView.js'\nimport {\n MCP_TOOL_WATCH_INTERVAL_MS, MCP_TOOL_WATCH_TIMEOUT_MS, mcpRegisteredToolCountOf, useMcpLiveState,\n} from './mcp-live.js'\nimport { CategoryEditor } from './SkillCard.js'\nimport { SkillViewer, VIEWER_FONT_SIZES, readViewerPrefs, writeViewerPrefs } from './SkillViewer.js'\nimport { SkillsView } from './SkillsView.js'\nimport { css, ensureStyles } from './styles.js'\nimport { McpTopBar, PanelHead, SkillTopBar } from './TopBar.js'\nimport { ALL_PRESETS, UNCATEGORIZED, sortCategories } from './types.js'\nimport type {\n BundleInfo, CollectedFile, ConfirmState, HealthView, InstallState, PanelState, PresetRow, SkillInfo, ViewerState,\n} from './types.js'\nconst SKILL_NAME_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/\n\n/** \u4ECE SKILL.md \u6587\u672C\u91CC\u53D6 frontmatter \u7684 name\uFF08\u5B89\u88C5\u5F39\u7A97\u9884\u89C8\u771F\u5B9E\u6280\u80FD\u540D\u7528\uFF09\u3002 */\nfunction frontmatterName(text: string): string | null {\n const lines = text.split(/\\r?\\n/).slice(0, 80)\n if ((lines[0] ?? '').trim() !== '---') return null\n for (const line of lines.slice(1)) {\n if (line.trim() === '---') break\n const pair = /^\\s*name\\s*:\\s*(.+?)\\s*$/.exec(line)\n if (pair !== null) return (pair[1] ?? '').replace(/^[\"']|[\"']$/g, '')\n }\n return null\n}\nexport function SkillsPanel({ onClose, closing = false, anchor = null, onCardMouseEnter, onCardMouseLeave }: { onClose: () => void; closing?: boolean; anchor?: PopoverAnchor | null; onCardMouseEnter?: () => void; onCardMouseLeave?: () => void }): JSX.Element {\n ensureStyles()\n const [state, setState] = useState<PanelState>({ status: 'loading' })\n const [reload, setReload] = useState(0)\n // \u5206\u533A\u5C55\u5F00\u96C6\u5408\uFF1A\u9ED8\u8BA4\u7A7A = \u5168\u90E8\u6536\u8D77\uFF08\u9762\u677F\u6253\u5F00\u65F6\u53EA\u663E\u793A\u6280\u80FD\u5305\u6807\u9898\u884C\uFF09\u3002\n const [expanded, setExpanded] = useState<Set<string>>(new Set())\n // \u6563\u88C5\u6280\u80FD\u533A\u5C55\u5F00\u3002\n const [looseOpen, setLooseExpanded] = useState(false)\n const [viewer, setViewer] = useState<ViewerState | null>(null)\n /** \u67E5\u770B\u5668\u504F\u597D\uFF1A\u5B57\u53F7\u6863\u4F4D + \u662F\u5426\u5168\u5C4F\uFF08localStorage \u6301\u4E45\u5316\uFF0C\u8DE8\u4F1A\u8BDD\u8BB0\u4F4F\uFF09\u3002 */\n const [viewerFont, setViewerFont] = useState<number>(() => readViewerPrefs().font)\n const [viewerFull, setViewerFull] = useState<boolean>(() => readViewerPrefs().full)\n const [assignTarget, setAssignTarget] = useState<SkillInfo | null>(null)\n const [newBundleOpen, setNewBundleOpen] = useState(false)\n const [newBundleName, setNewBundleName] = useState('')\n /** \u65B0\u5EFA\u6280\u80FD\u5305\u5F39\u7A97\u91CC\u540C\u65F6\u6302\u7684\u5206\u7C7B\u3002 */\n const [newBundleCats, setNewBundleCats] = useState<string[]>([])\n const [creatingBundle, setCreatingBundle] = useState(false)\n const [renameTarget, setRenameTarget] = useState<{ bundleId: string; name: string } | null>(null)\n const [renaming, setRenaming] = useState(false)\n // \u6539\u540D\u6210\u529F\u7684\u5361\u7247 id\uFF1A\u89E6\u53D1\u4E00\u6B21\u9AD8\u4EAE\u8109\u51B2\uFF0C\u968F\u540E\u81EA\u52A8\u6E05\u9664\u3002\n const [renamedFlash, setRenamedFlash] = useState<string | null>(null)\n const renamedTimer = useRef<number | null>(null)\n const [confirm, setConfirm] = useState<ConfirmState | null>(null)\n const [confirming, setConfirming] = useState(false)\n const [install, setInstall] = useState<InstallState | null>(null)\n /** \u6DFB\u52A0\u6280\u80FD\u5F39\u7A97\u5F00\u5173\uFF08\u9009\u5B8C\u6587\u4EF6\u540E\u540C\u4E00\u5F39\u7A97\u5185\u586B\u8868\u5355\uFF09\u3002 */\n const [addOpen, setAddOpen] = useState(false)\n const [installName, setInstallName] = useState('')\n const [installDescription, setInstallDescription] = useState('')\n const [installBundleId, setInstallBundleId] = useState<string | undefined>(undefined)\n const [installing, setInstalling] = useState(false)\n const [installError, setInstallError] = useState<string | null>(null)\n /**\n * \u9762\u677F\u7EA7\u63D0\u793A\u6761\u3002\u65E7\u5B9E\u73B0\u628A\u6240\u6709\u5931\u8D25\u90FD\u585E\u8FDB installError\uFF0C\u800C\u5B83\u53EA\u5728\u300C\u6DFB\u52A0\u6280\u80FD\u300D\u5F39\u7A97\u91CC\n * \u6E32\u67D3 \u2014\u2014 \u4E8E\u662F\u5220\u9664\u6280\u80FD\u3001\u5F52\u7EC4\u3001\u6539\u540D\u3001\u5F00\u5173\u5931\u8D25\u65F6\u9762\u677F\u4E0A\u4EC0\u4E48\u90FD\u4E0D\u663E\u793A\uFF0C\u7528\u6237\u53EA\u770B\u5230\n * \u300C\u70B9\u4E86\u6CA1\u53CD\u5E94\u300D\u3002\u6210\u8D25\u53CD\u9988\u7EDF\u4E00\u8D70\u8FD9\u91CC\u3002\n */\n const [toasts, setToasts] = useState<Array<{ id: number; tone: 'ok' | 'err'; text: string }>>([])\n const toastTimers = useRef<number[]>([])\n const pushToast = (tone: 'ok' | 'err', text: string): void => {\n const id = Date.now() + Math.random()\n setToasts((current) => [...current.slice(-2), { id, tone, text }])\n const timer = window.setTimeout(() => {\n setToasts((current) => current.filter((item) => item.id !== id))\n }, tone === 'err' ? 6400 : 2800)\n toastTimers.current.push(timer)\n }\n /** \u7EDF\u4E00\u5931\u8D25\u63D0\u793A\uFF1Alabel \u8BF4\u6E05\u662F\u54EA\u4E00\u6B65\uFF0Cmessage \u7528 host \u539F\u6587\u3002 */\n const failToast = (label: string, error: unknown): void => {\n pushToast('err', skillT('opFailed', { label, message: error instanceof Error ? error.message : String(error) }))\n }\n /** \u6587\u4EF6\u5939\u5BFC\u5165\u65F6 SKILL.md \u91CC\u5199\u7684\u6280\u80FD\u540D\uFF1A\u4E0E\u7528\u6237\u586B\u7684\u540D\u5B57\u4E0D\u4E00\u81F4\u65F6\u63D0\u524D\u8BF4\u660E\u4F1A\u6539\u5199\u3002 */\n const [installMetaName, setInstallMetaName] = useState<string | null>(null)\n useEffect(() => {\n if (install === null || install.archive === true) { setInstallMetaName(null); return undefined }\n const entry = install.files.find((item) => item.path === 'SKILL.md')\n if (entry === undefined) { setInstallMetaName(null); return undefined }\n let current = true\n void entry.file.text().then((text) => {\n if (!current) return\n setInstallMetaName(frontmatterName(text))\n }, () => { if (current) setInstallMetaName(null) })\n return () => { current = false }\n }, [install])\n const [dropActive, setDropActive] = useState(false)\n const fileInput = useRef<HTMLInputElement>(null)\n // \u6280\u80FD/\u6280\u80FD\u5305\u5F00\u5173\u72B6\u6001\uFF08skillName \u2192 enabled\uFF1BbundleId \u2192 enabled\uFF09\n const [toggles, setToggles] = useState<{ skills: Record<string, boolean>; bundles: Record<string, boolean> }>({ skills: {}, bundles: {} })\n // \u5207\u6362\u8FDB\u884C\u4E2D\u7684 key\uFF08\u907F\u514D\u91CD\u590D\u70B9\u51FB\uFF09\n const [toggling, setToggling] = useState<Set<string>>(new Set())\n // Agent \u9884\u8BBE\u5206\u7C7B\uFF1A\u540D\u5355 + \u5404\u9884\u8BBE\u8986\u76D6 + \u5F53\u524D\u9009\u4E2D\u7684\u9884\u8BBE\uFF08'*' = \u5168\u90E8 Agent\uFF09\n const [presets, setPresets] = useState<PresetRow[]>([])\n const [overrides, setOverrides] = useState<Record<string, Record<string, boolean>>>({})\n const [activePreset, setActivePreset] = useState<string>(ALL_PRESETS)\n // Skills Hub \u5DE5\u5177\u680F\uFF1A\u641C\u7D22\u8BCD / \u6765\u6E90\u7B5B\u9009(\u5168\u90E8=all|bundles|loose) / \u540D\u79F0\u6392\u5E8F / \u89C6\u56FE\u5207\u6362\n const [query, setQuery] = useState('')\n const [sourceFilter, setSourceFilter] = useState<'all' | 'bundles' | 'loose'>('all')\n const [sortAsc, setSortAsc] = useState(true)\n const [viewMode] = useState<'grid' | 'list'>('grid')\n /** \u5DE6\u680F\u5206\u7C7B / \u7B5B\u9009\uFF1A\u542F\u7528\u72B6\u6001 + Agent \u9884\u8BBE\uFF08\u5206\u7C7B\u5207\u6362\u7531\u5DE6\u680F\u300CAgent \u9884\u8BBE\u5206\u7C7B\u300D\u9A71\u52A8\uFF09\u3002 */\n const [statusFilter, setStatusFilter] = useState<'all' | 'on' | 'off'>('all')\n /** \u6280\u80FD\u5305\u5206\u7C7B\u7B5B\u9009\uFF1Anull = \u4E0D\u7B5B\uFF1B\u5206\u7C7B\u540D\u6216 UNCATEGORIZED = \u53EA\u770B\u8BE5\u7C7B\u3002 */\n const [catFilter, setCatFilter] = useState<string | null>(null)\n /** \u300C\u8BBE\u7F6E\u5206\u7C7B\u300D\u5F39\u7A97\u7684\u76EE\u6807\u5305\uFF08null = \u5173\uFF09\uFF1BcatDraft \u662F\u5F39\u7A97\u5185\u7684\u7F16\u8F91\u526F\u672C\u3002 */\n const [catTarget, setCatTarget] = useState<{ bundleId: string; name: string } | null>(null)\n const [catDraft, setCatDraft] = useState<string[]>([])\n const [savingCats, setSavingCats] = useState(false)\n /** \u81EA\u5B9A\u4E49\u4E0B\u62C9/\u83DC\u5355\uFF1A\u6765\u6E90\u7B5B\u9009 / Agent \u9884\u8BBE / \u540D\u79F0\u6392\u5E8F / \u5FEB\u6377\u7B5B\u9009 / \u884C\u5185\u66F4\u591A\u83DC\u5355\uFF08\u54EA\u4E2A\u5F00\u7740\uFF0Cnull = \u90FD\u5173\uFF09\u3002 */\n const [openMenu, setOpenMenu] = useState<string | null>(null)\n /** \u540C\u6B65\u72B6\u6001\uFF1A/api/skill-health \u53EA\u8BFB\u626B\u63CF\u7ED3\u679C\uFF08\u7F3A SKILL.md \u7B49\uFF09\u3002 */\n const [health, setHealth] = useState<HealthView>({ state: 'loading' })\n /** \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5F39\u7A97\u5F00\u5173\u3002 */\n const [guideOpen, setGuideOpen] = useState(false)\n /** \u5DE6\u4FA7\u9876\u5C42 tab\uFF1ASKILL\uFF08\u6280\u80FD\u7BA1\u7406\uFF09/ MCP\uFF08MCP Server\uFF09\u3002 */\n const [kind, setKind] = useState<'skill' | 'mcp' | 'prompt'>('skill')\n /** MCP \u9875\u8303\u56F4\uFF08'' = \u5168\u90E8 Agent\uFF09\u3002 */\n const [mcpScope, setMcpScope] = useState('')\n /** MCP Server \u641C\u7D22\u8BCD\u3002 */\n const [mcpQuery, setMcpQuery] = useState('')\n /** MCP \u542F\u7528\u72B6\u6001\u7B5B\u9009\uFF08\u4F5C\u7528\u4E8E\u5168\u5C40\u6761\u76EE\uFF09\u3002 */\n const [mcpStatusFilter, setMcpStatusFilter] = useState<'all' | 'on' | 'off'>('all')\n /** \u771F\u5B9E MCP \u6CE8\u518C\u72B6\u6001\uFF08/api/triad/mcp-status\uFF09\uFF1AMCP \u9875\u552F\u4E00\u6570\u636E\u6E90\u3002 */\n const [mcpLive, mcpRefreshLive] = useMcpLiveState()\n /** \u6DFB\u52A0 MCP Server\uFF08\u7C98\u8D34 JSON / YAML\uFF09\u5F39\u7A97\u5F00\u5173\u3002 */\n const [mcpAddOpen, setMcpAddOpen] = useState(false)\n /** \u6DFB\u52A0\u300C\u9884\u8BBE\u4E13\u5C5E Server\u300D\u5F39\u7A97\u5F00\u5173\uFF08\u6309\u94AE\u5728 MCP \u9876\u680F\uFF0C\u5F39\u7A97\u7531 McpView \u6E32\u67D3\uFF09\u3002 */\n const [mcpAddOwnOpen, setMcpAddOwnOpen] = useState(false)\n /* \u2500\u2500 \u6DFB\u52A0/\u542F\u7528\u540E\u81EA\u52A8\u7B49\u5DE5\u5177\u6CE8\u518C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * \u5199\u914D\u7F6E\u53EA\u662F\u8BA9 DSH \u70ED\u91CD\u8F7D\u90A3\u4E00\u884C\uFF1BMCP \u8FDB\u7A0B\u8981\u665A\u51E0\u79D2\u624D\u8FDE\u4E0A\u5E76\u6CE8\u518C\u5DE5\u5177\u3002\n * \u4E4B\u524D\u53EA\u5237\u65B0\u4E00\u6B21 \u2192 \u9762\u677F\u4E0A Server \u6709\u4E86\u4F46\u5DE5\u5177\u662F\u7A7A\u7684\uFF0C\u7528\u6237\u8FD8\u5F97\u81EA\u5DF1\u70B9\u300C\u5237\u65B0\u300D\u3002\n * \u8FD9\u91CC\u6309 2s \u8F6E\u8BE2\uFF0C\u76EE\u6807\u90FD\u62A5\u51FA\u5DE5\u5177\uFF08\u6216 90s \u8D85\u65F6\uFF09\u5C31\u6536\u5DE5\u3002 */\n const mcpWatchTimer = useRef<number | null>(null)\n const [mcpWaitingTools, setMcpWaitingTools] = useState<string[]>([])\n /** \u6700\u65B0\u72B6\u6001\u5FEB\u7167\uFF1A\u5B9A\u65F6\u5668\u56DE\u8C03\u91CC\u8BFB\u4E0D\u5230\u65B0\u7684\u95ED\u5305\u503C\u3002 */\n const mcpLiveRef = useRef(mcpLive)\n useEffect(() => { mcpLiveRef.current = mcpLive }, [mcpLive])\n const stopMcpWatch = (): void => {\n if (mcpWatchTimer.current !== null) {\n window.clearInterval(mcpWatchTimer.current)\n mcpWatchTimer.current = null\n }\n setMcpWaitingTools([])\n }\n /** \u7ACB\u5373\u5237\u65B0\u4E00\u6B21\uFF0C\u7136\u540E\u8F6E\u8BE2\u5230\u8FD9\u4E9B Server \u6CE8\u518C\u51FA\u5DE5\u5177\u4E3A\u6B62\uFF08\u8D85\u65F6/\u5168\u90E8\u5C31\u7EEA\u5373\u505C\uFF09\u3002 */\n const watchMcpTools = (names: string[]): void => {\n if (mcpWatchTimer.current !== null) {\n window.clearInterval(mcpWatchTimer.current)\n mcpWatchTimer.current = null\n }\n mcpRefreshLive()\n const pending = new Set(names.filter(name => name !== ''))\n if (pending.size === 0) { setMcpWaitingTools([]); return }\n setMcpWaitingTools([...pending])\n const startedAt = Date.now()\n mcpWatchTimer.current = window.setInterval(() => {\n const snapshot = mcpLiveRef.current\n if (snapshot.state === 'ready') {\n for (const name of [...pending]) {\n if (mcpRegisteredToolCountOf(snapshot.data, name) > 0) pending.delete(name)\n }\n setMcpWaitingTools([...pending])\n }\n if (pending.size === 0 || Date.now() - startedAt > MCP_TOOL_WATCH_TIMEOUT_MS) stopMcpWatch()\n else mcpRefreshLive()\n }, MCP_TOOL_WATCH_INTERVAL_MS)\n }\n\n const refresh = (): void => {\n setReload((value) => value + 1)\n }\n\n /** \u9759\u9ED8\u540C\u6B65\uFF1A\u4E0D\u7F6E loading\uFF0C\u76F4\u63A5\u66FF\u6362\u6570\u636E\uFF08\u81EA\u52A8\u540C\u6B65\u673A\u5236\u7528\uFF09\u3002 */\n const silentSync = (): void => {\n void skillApi.list().then((snapshot) => {\n setState((current) => current.status === 'error'\n ? current\n : { status: 'ready', snapshot })\n }, () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ })\n void skillApi.presetStatus().then(\n (status) => {\n setToggles({ skills: status.skills, bundles: status.bundles })\n setOverrides(status.overrides)\n setPresets(status.presets)\n },\n () => {\n void skillApi.toggleStatus().then((status) => { setToggles(status) }, () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ })\n },\n )\n void skillApi.health().then(\n (report) => { setHealth(report.ok ? { state: 'ok', report } : { state: 'issue', report }) },\n () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ },\n )\n }\n\n /** \u81EA\u52A8\u540C\u6B65\u673A\u5236\uFF1A\u9762\u677F\u6253\u5F00\u671F\u95F4 30s \u8F6E\u8BE2 + \u9875\u9762\u91CD\u65B0\u53EF\u89C1/\u805A\u7126\u7ACB\u5373\u5237\u65B0\uFF08\u4E0D\u95EA\u70C1\uFF09\u3002 */\n useEffect(() => {\n const timer = window.setInterval(silentSync, 30_000)\n const onVis = (): void => { if (document.visibilityState === 'visible') silentSync() }\n const onFocus = (): void => { silentSync() }\n document.addEventListener('visibilitychange', onVis)\n window.addEventListener('focus', onFocus)\n return () => {\n window.clearInterval(timer)\n document.removeEventListener('visibilitychange', onVis)\n window.removeEventListener('focus', onFocus)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n /** \u5F00\u5173\u5207\u6362\u540E\u9759\u9ED8\u540C\u6B65:\u53EA\u91CD\u62C9\u5F00\u5173\u72B6\u6001,\u4E0D\u91CD\u8F7D\u6574\u4E2A\u9762\u677F(\u907F\u514D\u95EA\u70C1)\u3002 */\n const refreshTogglesOnly = (): void => {\n void skillApi.presetStatus().then(\n (status) => {\n setToggles({ skills: status.skills, bundles: status.bundles })\n setOverrides(status.overrides)\n setPresets(status.presets)\n },\n () => {\n // \u9884\u8BBE\u63A5\u53E3\u4E0D\u53EF\u7528\uFF08\u8001 host\uFF09\u65F6\u9000\u56DE\u53EA\u8BFB\u5168\u5C40\u5C42\u72B6\u6001\u3002\n void skillApi.toggleStatus().then((status) => { setToggles(status) }, () => { /* \u4FDD\u6301\u5F53\u524D\u663E\u793A */ })\n },\n )\n }\n\n const t = skillT\n\n useEffect(() => {\n let current = true\n setState({ status: 'loading' })\n void skillApi.list().then(\n (snapshot) => {\n if (current) setState({ status: 'ready', snapshot })\n },\n () => {\n if (current) setState({ status: 'error' })\n },\n )\n void skillApi.presetStatus().then(\n (status) => {\n if (!current) return\n setToggles({ skills: status.skills, bundles: status.bundles })\n setOverrides(status.overrides)\n setPresets(status.presets)\n },\n () => {\n // \u9884\u8BBE\u63A5\u53E3\u4E0D\u53EF\u7528\u65F6\u9000\u5316\u4E3A\u300C\u53EA\u6709\u5168\u5C40\u5C42\u300D\uFF1A\u5706\u7403\u6761\u53EA\u5269\u300C\u5168\u90E8 Agent\u300D\u3002\n void skillApi.toggleStatus().then(\n (status) => { if (current) setToggles(status) },\n () => { /* \u5F00\u5173\u63A5\u53E3\u4E5F\u4E0D\u53EF\u7528\u65F6\u4FDD\u6301\u7A7A\u72B6\u6001\uFF08\u5F00\u5173\u4ECD\u53EF\u64CD\u4F5C,\u5931\u8D25\u4F1A\u63D0\u793A\uFF09\u3002 */ },\n )\n },\n )\n // \u540C\u6B65\u72B6\u6001\uFF1A\u53EA\u8BFB\u5065\u5EB7\u626B\u63CF\uFF08\u76EE\u5F55\u5B8C\u6574\u6027 + \u8D26\u672C\u60AC\u6302\u5F15\u7528\uFF09\u3002\n setHealth({ state: 'loading' })\n void skillApi.health().then(\n (report) => { if (current) setHealth(report.ok ? { state: 'ok', report } : { state: 'issue', report }) },\n () => { if (current) setHealth({ state: 'unavailable' }) },\n )\n return () => { current = false }\n // reload \u62C6\u5206\u4E3A\u53D8\u5316\u952E\uFF1Bopen \u6052 true\uFF08\u672C\u7EC4\u4EF6\u5728\u6253\u5F00\u65F6\u624D\u6E32\u67D3\uFF09\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [reload])\n\n // \u5378\u8F7D\u65F6\u6E05\u6389\u6539\u540D\u9AD8\u4EAE\u4E0E\u63D0\u793A\u6761\u5B9A\u65F6\u5668\uFF0C\u907F\u514D\u5378\u8F7D\u540E setState\u3002\n useEffect(() => () => {\n if (renamedTimer.current !== null) window.clearTimeout(renamedTimer.current)\n if (mcpWatchTimer.current !== null) window.clearInterval(mcpWatchTimer.current)\n for (const timer of toastTimers.current) window.clearTimeout(timer)\n }, [])\n\n /** \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u6D6E\u5C42\u7684\u4F4D\u7F6E\uFF1A\u8D34\u7740\u9762\u677F\u5361\u7247\u53F3\u7F18\u5185\u4FA7\uFF08\u9762\u677F\u94FA\u6EE1\u4E3B\u533A\uFF0C\u5916\u4FA7\u5DF2\u65E0\u7A7A\u95F4\uFF09\u3002 */\n const [guidePos, setGuidePos] = useState<{ left: number; top: number; height: number } | null>(null)\n useEffect(() => {\n if (!guideOpen) return\n const marker = document.querySelector('[data-skm-panel-marker]')\n const card = marker?.closest('.psh-card')\n if (!(card instanceof HTMLElement)) return\n const rect = card.getBoundingClientRect()\n const vh = window.innerHeight\n const top = Math.max(8, rect.top)\n const overlayW = 300\n setGuidePos({\n left: Math.max(rect.left + 12, rect.right - overlayW - 12),\n top,\n height: Math.min(rect.height, vh - top - 12),\n })\n }, [guideOpen])\n\n const runToggle = async (key: string, action: () => Promise<unknown>): Promise<void> => {\n if (toggling.has(key)) return\n setToggling((current) => new Set(current).add(key))\n setInstallError(null)\n try {\n await action()\n // \u5F00\u5173\u53EA\u6539 frontmatter,\u6280\u80FD\u5217\u8868\u7ED3\u6784\u4E0D\u53D8:\u9759\u9ED8\u540C\u6B65\u5373\u53EF,\u4E0D\u91CD\u8F7D\u9762\u677F\u3002\n refreshTogglesOnly()\n } catch (error) {\n pushToast('err', skillT('toggleFailed', { message: error instanceof Error ? error.message : String(error) }))\n } finally {\n setToggling((current) => {\n const next = new Set(current)\n next.delete(key)\n return next\n })\n }\n }\n\n const toggleSkill = (skill: SkillInfo, enabled: boolean): void => {\n if (activePreset === ALL_PRESETS) {\n void runToggle(`skill:${skill.name}`, () => skillApi.setSkillEnabled(skill.name, enabled))\n return\n }\n void runToggle(\n `skill:${skill.name}`,\n () => skillApi.setPresetSkillEnabled(activePreset, skill.name, enabled),\n )\n }\n\n const toggleBundle = (bundle: BundleInfo, enabled: boolean): void => {\n if (activePreset === ALL_PRESETS) {\n void runToggle(`bundle:${bundle.id}`, () => skillApi.setBundleEnabled(bundle.id, enabled))\n return\n }\n void runToggle(\n `bundle:${bundle.id}`,\n () => skillApi.setPresetBundleEnabled(activePreset, bundle.id, enabled),\n )\n }\n\n /** \u8BE5\u9884\u8BBE\u4E0B\u88AB\u5355\u72EC\u5173\u6389\u7684\u6280\u80FD\uFF08'*' \u89C6\u56FE\u4E0B\u4E3A\u7A7A\u8868\uFF09\u3002 */\n const presetOverride = activePreset === ALL_PRESETS ? {} : (overrides[activePreset] ?? {})\n\n /**\n * \u4EFB\u4E00\u9884\u8BBE\u4E0B\u6280\u80FD\u7684\u5F00\u5173\u503C\uFF08\u4E0E skillEnabledIn \u540C\u89C4\u5219\uFF0C\u4F9B\u5DE6\u680F\u5206\u7C7B\u8BA1\u6570\uFF09\u3002\n * - \u300C\u5168\u90E8 Agent\u300D\uFF1A\u76F4\u63A5\u8BFB\u5168\u5C40\u5C42\uFF08SKILL.md frontmatter\uFF09\uFF1B\n * - \u67D0\u4E2A\u9884\u8BBE\uFF1A\u5168\u5C40\u5C42\u5173\u6389\u7684\u4ECD\u663E\u793A\u4E3A\u5173\uFF08\u9884\u8BBE\u5C42\u65E0\u6CD5\u6253\u5F00\u5168\u5C40\u5173\u6389\u7684\u6280\u80FD\uFF09\uFF0C\n * \u5426\u5219\u770B\u8BE5\u9884\u8BBE\u662F\u5426\u6709 false \u8986\u76D6\u3002\n */\n const skillEnabledAt = (presetId: string, name: string): boolean => {\n if (toggles.skills[name] === false) return false\n if (presetId === ALL_PRESETS) return true\n return (overrides[presetId] ?? {})[name] !== false\n }\n\n /** \u67D0\u9884\u8BBE\u4E0B\u5DF2\u542F\u7528\u7684\u6280\u80FD\u6570\uFF08\u5DE6\u680F\u300CAgent \u9884\u8BBE\u5206\u7C7B\u300D\u8BA1\u6570\uFF09\u3002 */\n const enabledCountFor = (presetId: string): number => {\n let n = 0\n for (const bundle of bundles) for (const skill of bundle.skills) if (skillEnabledAt(presetId, skill.name)) n += 1\n for (const skill of loose) if (skillEnabledAt(presetId, skill.name)) n += 1\n return n\n }\n\n /**\n * \u5F53\u524D\u89C6\u56FE\u91CC\u4E00\u4E2A\u6280\u80FD\u7684\u5F00\u5173\u503C\u3002\n * - \u300C\u5168\u90E8 Agent\u300D\uFF1A\u76F4\u63A5\u8BFB\u5168\u5C40\u5C42\uFF08SKILL.md frontmatter\uFF09\uFF1B\n * - \u67D0\u4E2A\u9884\u8BBE\uFF1A\u5168\u5C40\u5C42\u5173\u6389\u7684\u4ECD\u663E\u793A\u4E3A\u5173\uFF08\u9884\u8BBE\u5C42\u65E0\u6CD5\u6253\u5F00\u5168\u5C40\u5173\u6389\u7684\u6280\u80FD\uFF09\uFF0C\n * \u5426\u5219\u770B\u8BE5\u9884\u8BBE\u662F\u5426\u6709 false \u8986\u76D6\u3002\n */\n const skillEnabledIn = (name: string): boolean => skillEnabledAt(activePreset, name)\n\n /** \u6280\u80FD\u5305\u5728\u5F53\u524D\u89C6\u56FE\u4E0B\u7684\u5F00\u5173\u503C\uFF1A\u5185\u90E8\u6280\u80FD\u5168\u5F00\u624D\u7B97\u5F00\u3002 */\n const bundleEnabledIn = (bundle: BundleInfo): boolean => {\n if (activePreset === ALL_PRESETS) return toggles.bundles[bundle.id] !== false\n return bundle.skills.every((skill) => skillEnabledIn(skill.name))\n }\n\n /** \u9884\u8BBE\u89C6\u56FE\u4E0B\uFF0C\u88AB\u5168\u5C40\u5C42\u7981\u7528\u7684\u6280\u80FD\u884C\u9501\u4F4F\u5F00\u5173\uFF08\u9884\u8BBE\u5C42\u53EA\u80FD\u6536\u7A84\uFF0C\u65E0\u6CD5\u6253\u5F00\uFF09\u3002 */\n const skillLockedReason = (name: string): string | undefined =>\n activePreset !== ALL_PRESETS && toggles.skills[name] === false ? t('presetLockedByGlobal') : undefined\n\n /** \u6E05\u7A7A\u5F53\u524D\u9884\u8BBE\u7684\u5168\u90E8\u5355\u72EC\u8BBE\u7F6E\u3002 */\n const resetActivePreset = (): void => {\n if (activePreset === ALL_PRESETS) return\n void runToggle(`reset:${activePreset}`, () => skillApi.resetPreset(activePreset))\n }\n\n const toggleExpanded = (bundleId: string): void => {\n setExpanded((current) => {\n const next = new Set(current)\n if (next.has(bundleId)) next.delete(bundleId)\n else next.add(bundleId)\n return next\n })\n }\n\n // Skills Hub \u9ED8\u8BA4\u5168\u5C55\u5F00\uFF08\u53C2\u8003\u56FE\u6574\u9875\u53EF\u89C1\uFF09\uFF1B\u7528\u6237\u624B\u52A8\u6536\u8D77\u540E\u4FDD\u6301\u5404\u81EA\u72B6\u6001\u3002\n\n const loadViewerContent = async (skillName: string, filePath: string): Promise<void> => {\n try {\n const res = await fetch(`/api/skill-manager/skills/${encodeURIComponent(skillName)}/files/${encodeURIComponent(filePath)}`)\n const body = await res.json() as { error?: unknown; content?: unknown }\n if (body.error !== undefined) throw new Error(String(body.error))\n setViewer((v) => v === null ? v : { ...v, loading: false, content: (body.content ?? '') as string })\n } catch (error) {\n setViewer((v) => v === null ? v : { ...v, loading: false, error: error instanceof Error ? error.message : String(error) })\n }\n }\n\n const openViewer = (skill: SkillInfo): void => {\n setViewer({ skill, file: 'SKILL.md', loading: true })\n void loadViewerContent(skill.name, 'SKILL.md')\n }\n\n /** \u5207\u5B57\u53F7\u6863\u4F4D\uFF08\u5939\u5230\u5408\u6CD5\u533A\u95F4\uFF09\u3002 */\n const setViewerFontLevel = (level: number): void => {\n setViewerFont(Math.min(Math.max(level, 0), VIEWER_FONT_SIZES.length - 1))\n }\n\n /** \u5168\u5C4F / \u8FD8\u539F\uFF1A\u5F39\u7A97\u5BBD\u9AD8\u8D70 CSS \u8FC7\u6E21\uFF0C\u4E0D\u91CD\u6302\u5185\u5BB9\uFF0C\u6EDA\u52A8\u4F4D\u7F6E\u4FDD\u6301\u3002 */\n const toggleViewerFull = (): void => {\n setViewerFull((current) => !current)\n }\n\n // \u504F\u597D\u7EDF\u4E00\u5728\u8FD9\u91CC\u843D\u76D8\uFF1A\u8FDE\u70B9\u4E24\u4E2A\u63A7\u4EF6\u65F6\uFF0C\u4E8B\u4EF6\u56DE\u8C03\u8BFB\u5230\u7684\u662F\u540C\u4E00\u5E27\u7684\u65E7\u95ED\u5305\u503C\uFF0C\n // \u5206\u5F00\u5199\u4F1A\u628A\u5176\u4E2D\u4E00\u9879\u5B58\u6210\u65E7\u503C\u3002\n useEffect(() => { writeViewerPrefs({ font: viewerFont, full: viewerFull }) }, [viewerFont, viewerFull])\n\n const selectViewerFile = (filePath: string): void => {\n if (viewer === null) return\n setViewer({ ...viewer, file: filePath, loading: true, error: undefined })\n void loadViewerContent(viewer.skill.name, filePath)\n }\n\n const doAssign = async (skill: SkillInfo, bundleId: string): Promise<void> => {\n try {\n if (state.status !== 'ready') return\n const bundle = state.snapshot.bundles.find((candidate) => candidate.id === bundleId)\n if (bundle === undefined) throw new Error('bundle not found')\n await skillApi.setBundleSkills(bundleId, [...bundle.skills.map((s) => s.name), skill.name])\n setAssignTarget(null)\n pushToast('ok', skillT('assignOk', { name: skill.name }))\n refresh()\n } catch (error) {\n failToast('\u5F52\u5165\u6280\u80FD\u5305', error)\n }\n }\n\n const acceptFiles = (files: File[] | null): void => {\n if (files === null || files.length === 0) return\n const collected: CollectedFile[] = []\n for (const file of files) {\n const relative = file.webkitRelativePath\n if (relative === '') continue\n const parts = relative.split('/')\n if (parts.length < 2) continue\n collected.push({ path: parts.slice(1).join('/'), file })\n }\n if (collected.length === 0) return\n const zipCandidate = collected.length === 1 && collected[0].path.toLowerCase().endsWith('.zip') ? collected[0] : undefined\n if (zipCandidate !== undefined) {\n const reader = new FileReader()\n reader.onload = () => {\n const data = String(reader.result ?? '').split(',')[1] ?? ''\n setInstall({ archive: true, name: zipCandidate.path, data, folderName: zipCandidate.path })\n setInstallError(null)\n setAddOpen(true)\n }\n reader.readAsDataURL(zipCandidate.file)\n return\n }\n const rootName = collected[0]?.path.split('/')[0] ?? ''\n setInstallName(rootName)\n setInstallError(null)\n setInstall({ files: collected, folderName: rootName })\n setAddOpen(true)\n }\n\n const onDrop = async (event: DragEvent<HTMLDivElement>): Promise<void> => {\n event.preventDefault()\n setDropActive(false)\n const collected: CollectedFile[] = []\n const items = event.dataTransfer.items\n if (items === undefined) return\n const pending: Array<Promise<void>> = []\n for (const item of Array.from(items)) {\n const entry = item.webkitGetAsEntry?.()\n if (entry !== undefined && entry !== null) pending.push(collectEntry(entry, '', collected))\n }\n await Promise.all(pending)\n if (collected.length === 0) return\n const zipCandidate = collected.length === 1 && collected[0].path.toLowerCase().endsWith('.zip') ? collected[0] : undefined\n if (zipCandidate !== undefined) {\n setInstall({ archive: true, name: zipCandidate.path, data: await fileToBase64(zipCandidate.file), folderName: zipCandidate.path })\n setInstallError(null)\n setAddOpen(true)\n return\n }\n const rootName = collected[0]?.path.split('/')[0] ?? ''\n setInstallName(rootName)\n setInstallError(null)\n setInstall({ files: collected, folderName: rootName })\n setAddOpen(true)\n }\n\n const confirmInstall = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault()\n if (install === null || installing) return\n if (install.archive !== true && installName.trim() === '') return\n setInstalling(true)\n setInstallError(null)\n try {\n let installed: { name?: string } = {}\n if (install.archive === true) {\n installed = await skillApi.installSkill({\n archive: install.data,\n description: installDescription.trim(),\n ...installBundleId === undefined ? {} : { bundleId: installBundleId },\n })\n } else {\n const files = await Promise.all(install.files.map(async ({ path, file }) => ({\n path,\n data: await fileToBase64(file),\n })))\n installed = await skillApi.installSkill({\n skillName: installName.trim(),\n description: installDescription.trim(),\n ...installBundleId === undefined ? {} : { bundleId: installBundleId },\n files,\n })\n }\n // \u540D\u5B57\u4EE5 host \u843D\u5730\u7684\u89C4\u8303\u540D\u4E3A\u51C6\uFF1A\u76EE\u5F55\u540D\u4E0E\u6280\u80FD\u540D\u4E0D\u4E00\u81F4\u65F6\uFF0C\u7528\u6237\u770B\u5F97\u5230\u88C5\u6210\u4E86\u4EC0\u4E48\u3002\n pushToast('ok', skillT('installedOk', { name: installed.name ?? installName.trim() }))\n setInstall(null)\n setInstallName('')\n setInstallDescription('')\n setInstallBundleId(undefined)\n setAddOpen(false)\n refresh()\n } catch (error) {\n setInstallError(error instanceof Error ? error.message : String(error))\n } finally {\n setInstalling(false)\n }\n }\n\n const submitNewBundle = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n event.preventDefault()\n if (creatingBundle || newBundleName.trim() === '') return\n setCreatingBundle(true)\n try {\n const created = newBundleName.trim()\n await skillApi.createBundle(created, newBundleCats)\n setNewBundleName('')\n setNewBundleCats([])\n setNewBundleOpen(false)\n pushToast('ok', skillT('bundleCreated', { name: created }))\n refresh()\n } catch (error) {\n failToast('\u65B0\u5EFA\u6280\u80FD\u5305', error)\n } finally {\n setCreatingBundle(false)\n }\n }\n\n /** \u6253\u5F00\u300C\u8BBE\u7F6E\u5206\u7C7B\u300D\u5F39\u7A97\uFF1A\u8349\u7A3F\u4ECE\u5FEB\u7167\u91CC\u7684\u5F53\u524D\u503C\u8D77\u6B65\u3002 */\n const openCatEditor = (bundle: BundleInfo): void => {\n setCatTarget({ bundleId: bundle.id, name: bundle.name })\n setCatDraft([...(bundle.categories ?? [])])\n }\n\n /** \u4FDD\u5B58\u5206\u7C7B\uFF1APATCH \u53EA\u5E26 categories\uFF1B\u987A\u624B\u628A\u7B5B\u9009\u8DDF\u5230\u65B0\u503C\uFF0C\u907F\u514D\u6539\u5B8C\u5305\u300C\u6D88\u5931\u300D\u3002 */\n const submitCategories = async (): Promise<void> => {\n if (catTarget === null || savingCats) return\n setSavingCats(true)\n try {\n await skillApi.setBundleCategories(catTarget.bundleId, catDraft)\n if (activeCat !== null && !catDraft.includes(activeCat) && activeCat !== UNCATEGORIZED) setCatFilter(null)\n pushToast('ok', skillT('bundleCatSaved', { name: catTarget.name }))\n setCatTarget(null)\n refresh()\n } catch (error) {\n failToast('\u8BBE\u7F6E\u5206\u7C7B', error)\n } finally {\n setSavingCats(false)\n }\n }\n\n const submitRename = async (event: FormEvent<HTMLFormElement>): Promise<void> => {\n\n event.preventDefault()\n if (renaming || renameTarget === null || renameTarget.name.trim() === '') return\n setRenaming(true)\n try {\n await skillApi.renameBundle(renameTarget.bundleId, renameTarget.name.trim())\n // \u6539\u540D\u6210\u529F\u540E\u8BA9\u5361\u7247\u95EA\u4E00\u4E0B\u9AD8\u4EAE\uFF081600ms \u540E\u81EA\u52A8\u6E05\u9664\uFF09\u3002\n const renamedId = renameTarget.bundleId\n if (renamedTimer.current !== null) window.clearTimeout(renamedTimer.current)\n setRenamedFlash(renamedId)\n renamedTimer.current = window.setTimeout(() => { setRenamedFlash(null) }, 1600)\n setRenameTarget(null)\n refresh()\n } catch (error) {\n failToast('\u91CD\u547D\u540D\u6280\u80FD\u5305', error)\n } finally {\n setRenaming(false)\n }\n }\n\n const confirmDelete = async (): Promise<void> => {\n if (confirm === null || confirming) return\n setConfirming(true)\n const label = confirm.kind === 'bundle' ? confirm.bundle.name : confirm.name\n try {\n if (confirm.kind === 'bundle') await skillApi.deleteBundle(confirm.bundle.id)\n else await skillApi.deleteSkill(confirm.name)\n setConfirm(null)\n pushToast('ok', confirm.kind === 'bundle'\n ? skillT('bundleDeleted', { name: label })\n : skillT('deletedOk', { name: label }))\n refresh()\n } catch (error) {\n // \u65E7\u5B9E\u73B0\u628A\u5931\u8D25\u5199\u8FDB\u53EA\u5728\u5B89\u88C5\u5F39\u7A97\u91CC\u6E32\u67D3\u7684 installError\uFF1A\u5220\u9664\u5931\u8D25\u65F6\u9762\u677F\u4E0A\u6BEB\u65E0\u53CD\u5E94\u3002\n failToast(confirm.kind === 'bundle' ? '\u5220\u9664\u6280\u80FD\u5305' : '\u5220\u9664\u6280\u80FD', error)\n } finally {\n setConfirming(false)\n }\n }\n\n const removeFromBundle = async (bundleId: string, name: string): Promise<void> => {\n try {\n if (state.status !== 'ready') return\n const bundle = state.snapshot.bundles.find((candidate) => candidate.id === bundleId)\n if (bundle === undefined) return\n await skillApi.setBundleSkills(bundleId, bundle.skills.map((skill) => skill.name).filter((skillName) => skillName !== name))\n pushToast('ok', skillT('removedOk', { name }))\n refresh()\n } catch (error) {\n failToast('\u79FB\u51FA\u6280\u80FD\u5305', error)\n }\n }\n\n /** \u6E05\u7406\u8D26\u672C\u91CC\u6307\u5411\u5DF2\u5220\u9664\u6280\u80FD\u7684\u6761\u76EE\uFF08\u6280\u80FD\u5305\u663E\u793A\u300CN \u4E2A\u5931\u6548\u5F15\u7528\u300D\u65F6\u7528\uFF09\u3002 */\n const pruneBundle = async (bundle: BundleInfo): Promise<void> => {\n try {\n // \u5FC5\u987B\u56DE\u5230\u672A\u8FC7\u6EE4\u7684\u5FEB\u7167\u53D6\u6210\u5458\uFF1A\u89C6\u56FE\u91CC\u7684 bundle \u53EF\u80FD\u5DF2\u88AB\u641C\u7D22/\u72B6\u6001\u7B5B\u9009\u88C1\u6389\u8FC7\u3002\n const full = state.status === 'ready'\n ? (state.snapshot.bundles.find((candidate) => candidate.id === bundle.id) ?? bundle)\n : bundle\n await skillApi.setBundleSkills(bundle.id, full.skills.map((skill) => skill.name))\n pushToast('ok', skillT('pruned'))\n refresh()\n } catch (error) {\n failToast('\u6E05\u7406\u5931\u6548\u5F15\u7528', error)\n }\n }\n\n /** \u4ECE\u7A7A\u6280\u80FD\u5305\u7684\u5F15\u5BFC\u6309\u94AE\u76F4\u63A5\u8FDB\u5165\u300C\u6DFB\u52A0\u6280\u80FD\u300D\uFF0C\u5E76\u628A\u5F52\u7EC4\u9884\u9009\u6210\u5B83\u3002 */\n const openInstallFor = (bundleId: string): void => {\n setInstall(null)\n setInstallError(null)\n setInstallBundleId(bundleId)\n setAddOpen(true)\n }\n\n const bundles = state.status === 'ready' ? state.snapshot.bundles : []\n const loose = state.status === 'ready' ? state.snapshot.loose : []\n /** \u5F53\u524D\u4F5C\u7528\u57DF pill \u6587\u6848\uFF1A\u300C\u5168\u90E8 Agent\u300D\u89C6\u56FE = \u5168\u5C40\uFF08Global\uFF09\uFF0C\u9884\u8BBE\u89C6\u56FE = \u9884\u8BBE\u540D\u3002 */\n const scopeLabel = activePreset === ALL_PRESETS\n ? t('scopeAll')\n : (presets.find((preset) => preset.id === activePreset)?.name ?? activePreset)\n\n /* \u2500\u2500 Skills Hub \u6D3E\u751F\u6570\u636E\uFF1A\u641C\u7D22 / Agent \u9884\u8BBE / \u72B6\u6001 / \u6392\u5E8F \u2500\u2500 */\n const q = query.trim().toLowerCase()\n const qMatch = (skill: SkillInfo): boolean => {\n if (q === '') return true\n if (skill.name.toLowerCase().includes(q)) return true\n return (skill.description ?? '').toLowerCase().includes(q)\n }\n const statusMatch = (skill: SkillInfo): boolean => {\n // \u300C\u5168\u90E8\u300D= \u4E0D\u5206\u542F\u7528\u72B6\u6001\u4E00\u5F8B\u663E\u793A\u3002\u65E7\u5B9E\u73B0\u5728\u8FD9\u91CC\u4E5F return on\uFF0C\u4E8E\u662F\u6280\u80FD\u4E00\u5173\u5361\u7247\u5C31\n // \u5F53\u573A\u4ECE\u5217\u8868\u91CC\u6D88\u5931\uFF0C\u60F3\u518D\u6253\u5F00\u53EA\u80FD\u5207\u5230\u300C\u5DF2\u505C\u7528\u300D\u6863\u53BB\u635E \u2014\u2014 \u5173\u6389\u5373\u9690\u8EAB\u3002\n if (statusFilter === 'all') return true\n // \u542F\u7528\u6001\u6309\u5F53\u524D\u89C6\u56FE\u8BA1\u7B97\uFF1A\u5168\u90E8 Agent = \u5168\u5C40\u5C42\uFF0C\u9884\u8BBE\u89C6\u56FE = \u9884\u8BBE\u5C42\uFF08\u542B\u5168\u5C40\u9501\u5B9A\uFF09\u3002\n const on = activePreset === ALL_PRESETS\n ? toggles.skills[skill.name] !== false\n : skillEnabledAt(activePreset, skill.name)\n return statusFilter === 'on' ? on : !on\n }\n const sortedSkills = (list: SkillInfo[]): SkillInfo[] => [...list].sort((a, b) => {\n const order = a.name.localeCompare(b.name)\n return sortAsc ? order : -order\n })\n const filteredSkills = (list: SkillInfo[]): SkillInfo[] =>\n sortedSkills(list.filter((skill) =>\n qMatch(skill)\n && statusMatch(skill)))\n /**\n * \u5168\u91CF\u7B5B\u9009\u7ED3\u679C\uFF08\u6279\u91CF\u64CD\u4F5C\u4F5C\u7528\u4E8E\u5168\u90E8\uFF09\u3002\n * \u7A7A\u6280\u80FD\u5305\u5FC5\u987B\u7559\u5728\u5217\u8868\u91CC\uFF1A\u65E7\u5B9E\u73B0\u4E00\u5F8B filter(skills.length > 0)\uFF0C\u4E8E\u662F\u65B0\u5EFA\u7684\u5305\u3001\n * \u4EE5\u53CA\u8D26\u672C\u6309\u76EE\u5F55\u540D\u8BB0\u8D26\u5BFC\u81F4\u6210\u5458\u89E3\u6790\u4E0D\u5230\u7684\u5305\uFF0C\u90FD\u4F1A\u4ECE\u9762\u677F\u4E0A\u51ED\u7A7A\u6D88\u5931 \u2014\u2014 \u65E2\u770B\u4E0D\u5230\n * \u4E5F\u70B9\u4E0D\u5230\uFF0C\u6CA1\u6CD5\u518D\u5F80\u91CC\u5F52\u6280\u80FD\u3002\u53EA\u6709\u771F\u6B63\u5E26\u7B5B\u9009\u6761\u4EF6\u65F6\u624D\u6309\u547D\u4E2D\u60C5\u51B5\u9690\u85CF\u3002\n */\n const filtering = q !== '' || statusFilter !== 'all'\n /**\n * \u5206\u7C7B\u7D22\u5F15\uFF1A\u5206\u7C7B\u540D \u2192 \u6302\u4E86\u5B83\u7684\u6280\u80FD\u5305\u6570\uFF1B\u6CA1\u6302\u4EFB\u4F55\u5206\u7C7B\u7684\u5305\u5F52\u5230 UNCATEGORIZED \u6876\u3002\n * \u9876\u680F\u80F6\u56CA\u4E0E\u5305\u540D\u65C1\u7684\u6807\u7B7E\u90FD\u4ECE\u8FD9\u91CC\u53D6\u6570\uFF0C\u6240\u4EE5\u4E24\u8FB9\u53E3\u5F84\u5929\u7136\u4E00\u81F4\u3002\n */\n const categoryCounts = (() => {\n const counts = new Map<string, number>()\n for (const bundle of bundles) {\n const cats = bundle.categories ?? []\n if (cats.length === 0) {\n counts.set(UNCATEGORIZED, (counts.get(UNCATEGORIZED) ?? 0) + 1)\n continue\n }\n for (const cat of cats) counts.set(cat, (counts.get(cat) ?? 0) + 1)\n }\n return counts\n })()\n const categoryList = sortCategories(categoryCounts)\n /** \u81F3\u5C11\u8981\u6709\u4E00\u4E2A\u771F\u5206\u7C7B\uFF08\u672A\u5206\u7C7B\u6876\u4E0D\u7B97\uFF09\u624D\u503C\u5F97\u5360\u4E00\u884C\u9876\u680F\u7A7A\u95F4\u3002 */\n const hasCategories = categoryList.some((cat) => cat !== UNCATEGORIZED)\n /** \u9009\u4E2D\u7684\u5206\u7C7B\u88AB\u6700\u540E\u4E00\u4E2A\u5305\u6458\u6389\u65F6\u81EA\u52A8\u56DE\u843D\u300C\u5168\u90E8\u300D\uFF0C\u4E0D\u7559\u4E00\u4E2A\u7B5B\u4E0D\u51FA\u4E1C\u897F\u7684\u6B7B\u72B6\u6001\u3002 */\n const activeCat = catFilter !== null && categoryCounts.has(catFilter) ? catFilter : null\n const catMatch = (bundle: BundleInfo): boolean => {\n if (activeCat === null) return true\n const cats = bundle.categories ?? []\n return activeCat === UNCATEGORIZED ? cats.length === 0 : cats.includes(activeCat)\n }\n const visibleBundleAll = (sourceFilter === 'loose' ? [] : bundles)\n .filter((bundle) => catMatch(bundle))\n .map((bundle) => ({ ...bundle, skills: filteredSkills(bundle.skills) }))\n .filter((bundle) => bundle.skills.length > 0 || (bundle.skillCount === 0 && !filtering))\n const visibleLooseAll = sourceFilter === 'bundles' || activeCat !== null ? [] : filteredSkills(loose)\n const totalSkills = bundles.reduce((n, bundle) => n + bundle.skillCount, 0) + loose.length\n const bundleCount = bundles.length\n /** \u540C\u6B65\u72B6\u6001\u5361\u5C55\u793A\u6A21\u578B\uFF1Aok=\u7EFF\u70B9\u5168\u5065\u5EB7\uFF1Bissue=\u6A59\u70B9\u5E26\u6570\u91CF\uFF1Bunavailable=\u7070\u70B9\u5F85\u68C0\u6D4B\uFF08\u65E7 host \u672A\u52A0\u8F7D\u65B0\u8DEF\u7531\uFF09\uFF1Bloading=\u68C0\u6D4B\u4E2D\u3002 */\n const healthView = health.state === 'ok'\n ? { tone: 'ok', label: t('statHealthy'), title: t('statHealthy') }\n : health.state === 'issue'\n ? { tone: 'warn', label: t('statIssues', { n: health.report.issues.length }), title: health.report.issues.map((issue) => issue.message).join('\\n') }\n : health.state === 'unavailable'\n ? { tone: 'pending', label: t('statPending'), title: t('statPending') }\n : { tone: 'idle', label: t('statChecking'), title: '' }\n const enabledCount = (() => {\n let n = 0\n for (const bundle of bundles) for (const skill of bundle.skills) if (toggles.skills[skill.name] !== false) n += 1\n for (const skill of loose) if (toggles.skills[skill.name] !== false) n += 1\n return n\n })()\n /** \u5F53\u524D\u88AB\u5168\u5C40\u5C42\u5173\u6389\u7684\u6280\u80FD\u6570\uFF08\u9876\u680F\u300C\u5DF2\u505C\u7528\u300D\u8BA1\u6570\uFF1B\u4E0E\u300C\u5DF2\u542F\u7528\u300D\u540C\u4E00\u53E3\u5F84\uFF09\u3002 */\n const disabledCount = (() => {\n let n = 0\n for (const bundle of bundles) for (const skill of bundle.skills) if (toggles.skills[skill.name] === false) n += 1\n for (const skill of loose) if (toggles.skills[skill.name] === false) n += 1\n return n\n })()\n const noResults = visibleBundleAll.length === 0 && visibleLooseAll.length === 0\n\n const trimmedName = installName.trim()\n const nameInvalid = trimmedName !== '' && !SKILL_NAME_PATTERN.test(trimmedName)\n\n const confirmTitle = confirm === null\n ? t('deleteSkillConfirm', { name: '' })\n : confirm.kind === 'bundle'\n ? t('deleteBundleConfirm', { name: confirm.bundle.name })\n : t('deleteSkillConfirm', { name: confirm.name })\n // \u76EE\u5F55\u540D\u4E0E\u6280\u80FD\u540D\u4E0D\u4E00\u81F4\u65F6\u8BF4\u660E\u767D\uFF1A\u5220\u7684\u662F\u90A3\u4E2A\u76EE\u5F55\uFF0C\u907F\u514D\u7528\u6237\u4EE5\u4E3A\u5220\u9519\u4E1C\u897F\u3002\n + (confirm.kind === 'skill' && confirm.dir !== undefined && confirm.dir !== confirm.name\n ? t('deleteSkillDirNote', { dir: confirm.dir }) : '')\n\n return (\n <PopoverShell\n solid\n closing={closing}\n onClose={() => {\n // \u5B89\u88C5/\u786E\u8BA4\u8FDB\u884C\u4E2D\u7981\u6B62\u5173\u95ED\uFF1B\u4E8C\u7EA7\u5F39\u7A97\uFF08\u65B0\u5EFA/\u6DFB\u52A0/\u786E\u8BA4/\u67E5\u770B\u5668/\u5F52\u7EC4\uFF09\u6253\u5F00\u65F6 Esc \u5F52\u4E8C\u7EA7\u5F39\u7A97\u3002\n if (installing || confirming) return\n if (newBundleOpen || addOpen || confirm !== null || viewer !== null || assignTarget !== null || catTarget !== null) return\n onClose()\n }}\n anchor={anchor}\n onCardMouseEnter={onCardMouseEnter}\n onCardMouseLeave={onCardMouseLeave}\n size={{ width: 1150, height: 860 }}\n ariaLabel={t('panelTitle')}\n >\n {/* \u5934\u90E8\uFF1A\u6807\u9898\uFF08\u80FD\u529B\u7BA1\u7406\uFF09+ \u7D27\u8D34\u6587\u5B57\u53F3\u4FA7\u7684 SKILL/MCP \u9876\u5C42 tab + \u5173\u95ED */}\n <PanelHead t={t} kind={kind} onKind={setKind} />\n <PshBody className={css.modalBody}>\n <span data-skm-panel-marker aria-hidden=\"true\" style={{ display: 'none' }} />\n <div className={css.hub} aria-busy={state.status === 'loading'}>\n {/* \u2500\u2500 \u9876\u680F\uFF08\u4EC5 SKILL \u89C6\u56FE\uFF09\uFF1A\u9884\u8BBE chips + \u5FEB\u6377\u7B5B\u9009 + \u65B0\u5EFA/\u6DFB\u52A0/\u6307\u5357 \u2500\u2500 */}\n {kind === 'skill' && (\n <SkillTopBar\n t={t}\n dropActive={dropActive}\n setDropActive={setDropActive}\n onDrop={onDrop}\n activePreset={activePreset}\n setActivePreset={setActivePreset}\n presets={presets}\n overrides={overrides}\n enabledCountFor={enabledCountFor}\n totalSkills={totalSkills}\n enabledCount={enabledCount}\n disabledCount={disabledCount}\n healthView={healthView}\n hasCategories={hasCategories}\n activeCat={activeCat}\n setCatFilter={setCatFilter}\n categoryList={categoryList}\n categoryCounts={categoryCounts}\n bundleCount={bundleCount}\n statusFilter={statusFilter}\n setStatusFilter={setStatusFilter}\n query={query}\n setQuery={setQuery}\n openMenu={openMenu}\n setOpenMenu={setOpenMenu}\n sortAsc={sortAsc}\n setSortAsc={setSortAsc}\n newBundleOpen={newBundleOpen}\n onNewBundle={() => { setNewBundleOpen(true) }}\n onAdd={() => { setInstall(null); setInstallError(null); setAddOpen(true) }}\n onRefresh={refresh}\n fileInput={fileInput}\n acceptFiles={acceptFiles}\n />\n )}\n {/* \u2500\u2500 \u9876\u680F\uFF08MCP \u89C6\u56FE\uFF09\uFF1A\u4E0E\u6280\u80FD\u9875\u540C\u6784\u7684\u9884\u8BBE chips + \u72B6\u6001\u5206\u6BB5 \u2500\u2500 */}\n {kind === 'mcp' && (\n <McpTopBar\n t={t}\n live={mcpLive}\n scope={mcpScope}\n onScope={setMcpScope}\n status={mcpStatusFilter}\n onStatus={setMcpStatusFilter}\n query={mcpQuery}\n onQuery={setMcpQuery}\n onRefresh={() => { mcpRefreshLive() }}\n onAddOwn={() => { setMcpAddOwnOpen(true) }}\n onAddCustom={() => { setMcpAddOpen(true) }}\n />\n )}\n\n {/* \u2500\u2500 \u4E3B\u533A \u2500\u2500 */}\n <div className={css.hubMain}>\n {kind === 'prompt' ? (\n <PromptView />\n ) : kind === 'mcp' ? (\n <McpView\n t={t}\n live={mcpLive}\n scope={mcpScope}\n query={mcpQuery}\n status={mcpStatusFilter}\n onRefresh={() => { mcpRefreshLive() }}\n waitingTools={mcpWaitingTools}\n onWatchTools={(names) => { watchMcpTools(names) }}\n addOwnOpen={mcpAddOwnOpen}\n onCloseAddOwn={() => { setMcpAddOwnOpen(false) }}\n />\n ) : (\n <SkillsView\n t={t}\n state={state}\n health={health}\n activePreset={activePreset}\n presets={presets}\n presetOverride={presetOverride}\n resetActivePreset={resetActivePreset}\n openMenu={openMenu}\n setOpenMenu={setOpenMenu}\n refresh={refresh}\n noResults={noResults}\n visibleBundleAll={visibleBundleAll}\n expanded={expanded}\n renameTarget={renameTarget}\n setRenameTarget={setRenameTarget}\n renaming={renaming}\n submitRename={submitRename}\n bundleEnabledIn={bundleEnabledIn}\n toggling={toggling}\n viewMode={viewMode}\n setCatFilter={setCatFilter}\n activeCat={activeCat}\n toggleExpanded={toggleExpanded}\n renamedFlash={renamedFlash}\n openInstallFor={openInstallFor}\n skillEnabledIn={skillEnabledIn}\n skillLockedReason={skillLockedReason}\n scopeLabel={scopeLabel}\n toggleSkill={toggleSkill}\n toggleBundle={toggleBundle}\n openViewer={openViewer}\n removeFromBundle={removeFromBundle}\n pruneBundle={pruneBundle}\n openCatEditor={openCatEditor}\n setConfirm={setConfirm}\n setAssignTarget={setAssignTarget}\n looseOpen={looseOpen}\n setLooseExpanded={setLooseExpanded}\n visibleLooseAll={visibleLooseAll}\n />\n )}\n </div>\n </div>\n </PshBody>\n {/* \u64CD\u4F5C\u56DE\u6267\uFF1A\u5B89\u88C5/\u5220\u9664/\u5F52\u7EC4/\u5F00\u5173\u7684\u6210\u8D25\u90FD\u4ECE\u8FD9\u91CC\u5192\u51FA\u6765\uFF08\u9762\u677F\u53F3\u4E0B\u89D2\uFF0C\u81EA\u52A8\u6536\u8D77\uFF09 */}\n {toasts.length > 0 && (\n <div className={css.toastStack} role=\"status\" aria-live=\"polite\">\n {toasts.map((item) => (\n <span key={item.id} className={`${css.toast} ${item.tone === 'err' ? css.toastErr : css.toastOk}`} data-tone={item.tone}>\n <i className={css.toastDot} aria-hidden=\"true\" />\n {item.text}\n </span>\n ))}\n </div>\n )}\n {/* \u5FEB\u901F\u4E0A\u624B\u6307\u5357 / MCP \u89E3\u91CA\uFF1A\u9762\u677F\u53F3\u4FA7\u60AC\u6D6E\u5361\uFF08portal \u5230 body\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF09 */}\n {guideOpen && guidePos !== null && (\n <GuidePanel t={t} onClose={() => { setGuideOpen(false) }} left={guidePos.left} top={guidePos.top} height={guidePos.height} />\n )}\n\n <McpAddModal\n t={t}\n open={mcpAddOpen}\n onClose={() => { setMcpAddOpen(false) }}\n onAdded={(added) => { watchMcpTools(added) }}\n />\n\n {/* \u65B0\u5EFA\u6280\u80FD\u5305\u5F39\u7A97\uFF1A\u540D\u5B57\u4E0E\u5206\u7C7B\u4E00\u8D77\u7ED9\uFF0C\u7701\u5F97\u5EFA\u5B8C\u518D\u8FDB\u53BB\u8BBE\u7F6E\u4E00\u6B21\u3002 */}\n <Modal\n open={newBundleOpen}\n onClose={() => { if (!creatingBundle) { setNewBundleOpen(false); setNewBundleCats([]) } }}\n closeLabel={t('close')}\n title={t('newBundle')}\n >\n <form className={css.stackForm} onSubmit={(event) => { void submitNewBundle(event) }}>\n <input className={css.inlineInput} value={newBundleName} placeholder={t('newBundlePlaceholder')}\n aria-label={t('newBundlePlaceholder')} autoFocus disabled={creatingBundle}\n onChange={(event) => { setNewBundleName(event.currentTarget.value) }} />\n <CategoryEditor value={newBundleCats} onChange={setNewBundleCats} label={t('newBundle')} />\n <div className={css.inlineForm}>\n <Button variant=\"primary\" type=\"submit\" disabled={creatingBundle || newBundleName.trim() === ''}>{t('create')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={creatingBundle} onClick={() => { setNewBundleOpen(false); setNewBundleCats([]) }}>{t('cancel')}</Button>\n </div>\n </form>\n </Modal>\n\n {/* \u8BBE\u7F6E\u5206\u7C7B\u5F39\u7A97\uFF1A\u4E0E\u65B0\u5EFA\u5305\u5171\u7528\u540C\u4E00\u4E2A CategoryEditor\uFF0C\u503C\u8D70\u8349\u7A3F\u6001\uFF0C\u4FDD\u5B58\u624D\u843D\u76D8\u3002 */}\n <Modal\n open={catTarget !== null}\n onClose={() => { if (!savingCats) setCatTarget(null) }}\n closeLabel={t('close')}\n title={t('bundleCatEditTitle', { name: catTarget?.name ?? '' })}\n >\n <div className={css.stackForm}>\n <CategoryEditor value={catDraft} onChange={setCatDraft} label={t('bundleCatEdit')} />\n <div className={css.inlineForm}>\n <Button variant=\"primary\" type=\"button\" disabled={savingCats} onClick={() => { void submitCategories() }}>{t('bundleCatDone')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={savingCats} onClick={() => { setCatTarget(null) }}>{t('cancel')}</Button>\n </div>\n </div>\n </Modal>\n\n {/* \u6DFB\u52A0\u6280\u80FD\u5F39\u7A97\uFF1A\u5148\u62D6\u653E/\u6D4F\u89C8\u9009\u6587\u4EF6\uFF0C\u518D\u586B\u8868\u5355\u5B89\u88C5 */}\n <Modal\n open={addOpen}\n onClose={() => {\n if (installing) return\n setAddOpen(false)\n setInstall(null)\n setDropActive(false)\n }}\n closeLabel={t('close')}\n title={t('addSkillsTitle')}\n >\n {install === null ? (\n <div\n className={`${css.addCard} ${dropActive ? css.addCardActive : ''}`}\n role=\"button\"\n tabIndex={0}\n aria-label={t('addSkillsTitle')}\n onClick={() => { fileInput.current?.click() }}\n onDragOver={(event) => { event.preventDefault(); setDropActive(true) }}\n onDragLeave={() => { setDropActive(false) }}\n onDrop={(event) => { void onDrop(event) }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n fileInput.current?.click()\n }\n }}\n >\n <span className={css.addCardHead}>\n <span className={css.addCardIcon}><CloudUpIcon size={22} /></span>\n <span className={css.addCardTitle}>{t('bannerTitle')}</span>\n </span>\n <span className={css.addCardSub}>{t('bannerSub')}</span>\n <span className={css.addDrop}>\n <CloudUpIcon size={18} />\n <span className={css.addDropText}>{t('dropHere')}</span>\n <span className={css.addDropHint}>{t('dropFormat')}</span>\n </span>\n <button type=\"button\" className={css.addBtn} onClick={(event) => { event.stopPropagation(); fileInput.current?.click() }}>\n {t('browseImport')}\n </button>\n <input\n ref={fileInput}\n type=\"file\"\n className={css.hiddenInput}\n multiple\n {...{ webkitdirectory: '' }}\n onChange={(event) => {\n acceptFiles(event.currentTarget.files === null ? null : Array.from(event.currentTarget.files))\n }}\n />\n </div>\n ) : (\n <form className={css.installForm} onSubmit={(event) => { void confirmInstall(event) }}>\n <div className={css.installRow}>\n <input className={css.inlineInput} value={installName}\n placeholder={install.archive === true ? t('installNameFromArchive') : t('installNamePlaceholder')}\n aria-label={t('installName')}\n disabled={installing || install.archive === true}\n onChange={(event) => { setInstallName(event.currentTarget.value) }} />\n <input className={css.inlineInput} value={installDescription} placeholder={t('installDescription')}\n aria-label={t('installDescription')} disabled={installing}\n onChange={(event) => { setInstallDescription(event.currentTarget.value) }} />\n <label className={css.bundleSelect}>\n <span className={css.visuallyHidden}>{t('installBundle')}</span>\n <select value={installBundleId ?? ''} disabled={installing}\n onChange={(event) => { setInstallBundleId(event.currentTarget.value === '' ? undefined : event.currentTarget.value) }}>\n <option value=\"\">{t('installLoose')}</option>\n {bundles.map((bundle) => <option key={bundle.id} value={bundle.id}>{bundle.name}</option>)}\n </select>\n </label>\n <span className={css.installMeta}>\n {install.archive === true\n ? t('uploadMeta', { n: 1, folder: install.folderName })\n : t('uploadMeta', { n: install.files.length, folder: install.folderName })}\n </span>\n </div>\n {install.archive !== true && nameInvalid && <p className={css.error} role=\"alert\">{t('installNameInvalid')}</p>}\n {install.archive !== true && !nameInvalid && trimmedName !== '' && installMetaName !== null && installMetaName !== trimmedName && (\n <p className={css.installHint}>{t('installNameRewrite', { meta: installMetaName, name: trimmedName })}</p>\n )}\n <div className={css.installActions}>\n <Button variant=\"primary\" type=\"submit\" disabled={installing || (install.archive !== true && (trimmedName === '' || nameInvalid))}>{t('installConfirm')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={installing} onClick={() => { setInstall(null); setAddOpen(false) }}>{t('installCancel')}</Button>\n </div>\n {installError !== null && <p className={css.error} role=\"alert\">{installError}</p>}\n </form>\n )}\n </Modal>\n\n <Modal\n open={confirm !== null}\n onClose={() => {\n if (!confirming) setConfirm(null)\n }}\n closeLabel={t('close')}\n title={confirmTitle}\n footer={\n <>\n <Button variant=\"outline\" disabled={confirming} onClick={() => { setConfirm(null) }}>{t('cancel')}</Button>\n <Button variant=\"primary\" disabled={confirming} onClick={() => { void confirmDelete() }}>{t('delete')}</Button>\n </>\n }\n />\n\n <SkillViewer\n t={t}\n viewer={viewer}\n viewerFont={viewerFont}\n viewerFull={viewerFull}\n onFontLevel={setViewerFontLevel}\n onToggleFull={toggleViewerFull}\n onSelectFile={selectViewerFile}\n onClose={() => { setViewer(null) }}\n />\n {assignTarget !== null && (\n <Modal\n open\n onClose={() => { setAssignTarget(null) }}\n closeLabel={t('close')}\n title={t('assignTitle', { name: assignTarget.name })}\n className={css.assignModal}\n contentClassName={css.assignModalBody}\n >\n {bundles.length === 0 ? (\n <p className={css.looseEmpty}>{t('assignEmpty')}</p>\n ) : (\n <ul className={css.assignList}>\n {bundles.map((bundle, index) => (\n <li key={bundle.id} style={{ listStyle: 'none' }}>\n <button\n type=\"button\"\n className={css.assignCard}\n style={{ '--skm-i': index } as CSSProperties}\n onClick={() => { void doAssign(assignTarget, bundle.id) }}\n >\n <span className={css.assignCardIcon} aria-hidden=\"true\"><IconFolderOpenOutlineRegular size={16} /></span>\n <span className={css.assignCardBody}>\n <span className={css.assignCardName}>{bundle.name}</span>\n <span className={css.assignCardDesc}>{t('skillsCount', { n: bundle.skillCount })}</span>\n </span>\n <span className={css.assignGo} aria-hidden=\"true\"><IconChevronDownOutlineRegular size={14} /></span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </Modal>\n )}\n </PopoverShell>\n )\n}\n", "/**\n * popover-shell \u2014 \u300C\u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\u300D\u9762\u677F\u5916\u58F3\uFF08\u6280\u80FD\u9762\u677F\u7528\uFF09\u3002\n *\n * \u8DDF\u70B9\u4F1A\u8BDD\u4E00\u81F4\u7684\u884C\u4E3A\uFF1A\n * - drawer \u6A21\u5F0F\uFF1A\u76F4\u63A5\u76D6\u4F4F\u4F1A\u8BDD\u4E3B\u533A\uFF08\u4FA7\u680F\u53F3\u7F18 \u2192 \u89C6\u53E3\u53F3\u7F18\uFF0C\u5168\u9AD8\uFF0C\u65E0\u906E\u7F69\uFF09\uFF0C\n * \u81EA\u53F3\u5411\u5DE6\u6ED1\u5165\uFF08translateX(56px)\u21920\uFF09\uFF0C\u5173\u95ED\u53CD\u5411\u6536\u56DE\uFF1B\u4FA7\u680F\u4FDD\u6301\u53EF\u70B9\uFF0C\n * \u968F\u65F6\u5207\u4F1A\u8BDD\uFF08\u5207\u4F1A\u8BDD\u81EA\u52A8\u6536\u9762\u677F\uFF09\uFF1B\n * - \u79FB\u52A8\u7AEF\u56DE\u9000\u5168\u5C4F sheet\uFF08translateY(24px) \u4E0A\u6ED1\uFF0C\u540C auto-sheet-in\uFF0C\u5E26\u906E\u7F69\uFF09\uFF1B\n * - Esc \u5173\u95ED\u8D70 props.onClose\uFF08\u9762\u677F\u53EF\u81EA\u884C\u62E6\u622A\uFF09\u3002\n *\n * z \u5C42\u7EA7\uFF1Amask 999 / card 1000\u2014\u2014\u4E0E ui-primitives Modal \u7684 root(1000) \u540C\u5C42\uFF0C\n * \u9762\u677F\u5185\u90E8\u7684 primitives \u4E8C\u7EA7\u5F39\u7A97\uFF08\u5982\u6280\u80FD\u6587\u4EF6\u67E5\u770B\u5668\uFF09portal \u5230 body \u66F4\u9760\u540E\uFF0C\n * DOM \u987A\u5E8F\u53D6\u80DC\u6D6E\u4E8E\u672C\u58F3\u4E4B\u4E0A\u3002\n */\n\nimport { useEffect, useState, type CSSProperties, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { MODAL_ANIM_MS, modalDrawerAnimClass } from './modal-animation.js'\n\nconst STYLE_ID = 'dsh-popover-shell-styles'\n\n/** \u4F1A\u8BDD\u4E3B\u533A\u5DE6\u7F18\u56DE\u9000\u503C\uFF08px\uFF09\uFF1A\u4FA7\u680F\u5B9E\u6D4B\u5931\u8D25\u65F6\u76D6\u4F4F 280px \u53F3\u4FA7\u5168\u90E8\u533A\u57DF\u3002 */\nconst FALLBACK_MAIN_LEFT = 280\n/** \u7A84\u5C4F\u9608\u503C\uFF08px\uFF09\uFF1A\u4F4E\u4E8E\u8BE5\u5BBD\u5EA6\u56DE\u9000\u5168\u5C4F sheet\uFF08\u4E0E\u79FB\u52A8\u7AEF\u5168\u5C4F\u5A92\u4F53\u67E5\u8BE2\u540C\u503C\uFF09\u3002 */\nconst NARROW_VP = 768\n\n/** \u8BFB\u4F1A\u8BDD\u4E3B\u533A\u5DE6\u7F18 = \u4FA7\u680F\u5217\u53F3\u7F18\uFF08\u8DDF\u968F\u4FA7\u680F\u6298\u53E0\u53D8\u5316\uFF1B\u5931\u8D25\u56DE\u9000 280\uFF09\u3002 */\nfunction readMainLeft(): number {\n try {\n const host = document.getElementById('dsh-prompt-customizer-nav-host')\n if (host !== null) {\n const hostRight = host.getBoundingClientRect().right\n let node = host.parentElement\n while (node !== null && node !== document.body) {\n const rect = node.getBoundingClientRect()\n if (rect.height >= window.innerHeight * 0.7 && rect.left <= 8 && rect.right >= hostRight - 4) {\n return Math.round(rect.right)\n }\n node = node.parentElement\n }\n }\n } catch { /* \u91CF\u4E0D\u5230\u5C31\u56DE\u9000\u56FA\u5B9A\u503C */ }\n return FALLBACK_MAIN_LEFT\n}\n\nconst SHEET = `\n/* \u2500\u2500 \u906E\u7F69\uFF1A\u6DE1\u5165\u6DE1\u51FA \u2500\u2500 */\n.psh-mask{position:fixed;inset:0;z-index:999;background:var(--dsw-alias-bg-mask-1,rgba(0,0,0,.45))}\n.psh-mask[data-anim='in']{animation:dsh-modal-mask-in ${MODAL_ANIM_MS}ms ease both}\n.psh-mask[data-anim='out']{animation:dsh-modal-mask-out ${MODAL_ANIM_MS}ms ease both}\n/* \u2500\u2500 \u5361\u7247\uFF1A\u4F1A\u8BDD\u5F0F\u53F3\u4FA7\u62BD\u5C49 / \u5E95\u90E8 sheet \u56DE\u9000 \u2500\u2500 */\n.psh-card{position:fixed;z-index:1000;display:flex;flex-direction:column;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.14));border-radius:14px;background:var(--dsw-specific-menu,var(--dsw-alias-bg-layer-2,#16181d));box-shadow:var(--dsw-shadow-lv3,0 8px 40px rgba(0,0,0,.5));overflow:hidden;transition:width ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1),height ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n/* \u8986\u76D6\u4F1A\u8BDD\u4E3B\u533A\uFF1A\u4FA7\u680F\u53F3\u7F18 \u2192 \u89C6\u53E3\u53F3\u7F18\u5168\u9AD8\u5E73\u94FA\uFF0C\u65E0\u5706\u89D2\u65E0\u9634\u5F71\uFF0C\u50CF\u5207\u4E86\u4E2A\u89C6\u56FE */\n.psh-card[data-mode='drawer']{top:0;right:0;bottom:0;height:100vh;height:100dvh;max-height:100vh;max-height:100dvh;border-radius:0;border:none;border-left:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.06));box-shadow:none;transition:left ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n/* in \u52A8\u753B\u4E0D\u5F97\u5E26 fill-mode\uFF08both/forwards \u4F1A\u6B8B\u7559 to \u5E27 transform\uFF0C\u4F7F\u5361\u7247\u6210\u4E3A\n \u540E\u4EE3 position:fixed \u5143\u7D20\uFF08\u56FE\u8868 tooltip\uFF09\u7684\u5305\u542B\u5757\uFF0C\u6D6E\u5C42\u6574\u4F53\u504F\u79FB\uFF09\uFF1Bout \u9700\u8981\n forwards \u4FDD\u6301\u9690\u85CF\u6001\u76F4\u5230\u5378\u8F7D\uFF0C\u6B64\u65F6\u65E0\u4EA4\u4E92\u3001\u65E0\u526F\u4F5C\u7528\u3002 */\n.psh-card[data-mode='drawer'][data-anim='in']{animation:dsh-modal-drawer-in ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n.psh-card[data-mode='drawer'][data-anim='out']{animation:dsh-modal-drawer-out ${MODAL_ANIM_MS}ms cubic-bezier(.4,0,.2,1) both}\n.psh-card[data-mode='sheet']{left:12px !important;right:12px;bottom:12px;top:auto !important}\n/* \u5B9E\u5E95\u5361\u7247\uFF08solid \u6A21\u5F0F\uFF09\uFF1A\u73BB\u7483\u8D28\u611F\u5F00\u542F\u65F6\u4E5F\u4FDD\u6301\u4E0D\u900F\u660E\u8868\u9762\u3002\n \u4E24\u6761\u5FC5\u8981\u6761\u4EF6\u2014\u2014\n 1) \u5E95\u8272\u5FC5\u987B\u7528 static token\uFF08bg-layer-* \u7B49 alias \u5728\u73BB\u7483\u6A21\u5F0F\u4E0B\u88AB\n overrideTokens \u6362\u6210 rgba\uFF0C\u7528\u5B83\u4EEC\u4ECD\u7136\u900F\uFF09\uFF1B\n 2) \u9009\u62E9\u5668\u9700\u5E26 html[data-dsh-glass] \u524D\u7F00\u4EE5\u538B\u8FC7 glass.ts \u91CC\n \u300C\u63D2\u4EF6\u81EA\u7ED8\u9762\u677F\u4E00\u5F8B transparent\u300D\u90A3\u6761\u89C4\u5219\uFF08\u540C\u7279\u5F02\u6027\u9760\u987A\u5E8F\u53D6\u80DC\u4E0D\u53EF\u9760\uFF09\u3002 */\n.psh-card[data-solid],html[data-dsh-glass] .psh-card[data-solid]{\n background:var(--dsw-static-neutral-bluish-00,#fff);\n backdrop-filter:none;-webkit-backdrop-filter:none}\nbody[data-ds-dark-theme] .psh-card[data-solid],\nhtml[data-dsh-glass] body[data-ds-dark-theme] .psh-card[data-solid]{\n background:var(--dsw-static-neutral-bluish-850,#2c2c2e)}\n.psh-card[data-mode='sheet'][data-anim='in']{animation:dsh-modal-slide-in ${MODAL_ANIM_MS}ms cubic-bezier(.2,.8,.2,1)}\n.psh-card[data-mode='sheet'][data-anim='out']{animation:dsh-modal-slide-out ${MODAL_ANIM_MS}ms cubic-bezier(.4,0,.2,1) both}\n/* \u2500\u2500 \u901A\u7528\u5361\u7247\u5934\u90E8\uFF1A\u6807\u9898 + \u5173\u95ED\uFF08\u5BF9\u9F50 auto-card-head \u89C4\u683C\uFF09\u2500\u2500 */\n.psh-head{flex:none;display:flex;align-items:center;gap:8px;padding:12px 16px 10px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08))}\n.psh-title{flex:1;min-width:0;font-size:15px;font-weight:600;line-height:22px;color:var(--dsw-alias-label-primary,#eee)}\n.psh-close{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:8px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-secondary,#bbb)}\n.psh-close:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06));color:var(--dsw-alias-label-primary,#eee)}\n/* \u5361\u7247\u4E3B\u4F53\u6EDA\u52A8\u533A */\n.psh-body{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}\n/* \u2500\u2500 \u79FB\u52A8\u7AEF\uFF1A\u4EFB\u4F55\u6A21\u5F0F\u5F3A\u5236\u5168\u5C4F sheet\uFF08100vw / 100dvh\uFF0Cradius 0\uFF09\u3002\n \u53C2\u8003 tool-summary .dts__modal \u7684 767.98px \u5199\u6CD5\uFF1B!important \u538B\u8FC7\u7EC4\u4EF6\u5185\u8054\n left/top/width/height\uFF08drawer \u6A21\u5F0F\u7528\u5185\u8054\u5BBD\u5EA6\uFF0C\u5FC5\u987B\u8986\u76D6\u5230 0/\u5168\u5C4F\uFF09\u3002\n transform:none \u4EC5\u4F5C\u9759\u6001\u515C\u5E95\uFF0C\u6ED1\u5165/\u6ED1\u51FA\u52A8\u753B\u7684 keyframe transform \u4ECD\u4F18\u5148\u64AD\u653E\uFF1B\n \u672C\u5757\u6CE8\u91CA\u5185\u5BB9\u672A\u5199\u51FA\u300C\u661F\u53F7\u7D27\u8DDF\u6B63\u659C\u6760\u300D\u4E24\u5B57\u7B26\u5E8F\u5217\u3002 \u2500\u2500 */\n@media (max-width: 767.98px){\n .psh-card{\n left:0 !important;\n top:0 !important;\n right:auto !important;\n bottom:auto !important;\n width:100vw !important;\n max-width:100vw !important;\n height:100vh !important;\n height:100dvh !important;\n max-height:100vh !important;\n max-height:100dvh !important;\n border-radius:0 !important;\n transform:none !important;\n }\n}\n@media (prefers-reduced-motion:reduce){\n .psh-mask,.psh-card{animation:none!important}\n .psh-card{transition:none!important}\n}\n`\n\n/** \u6CE8\u5165\u5916\u58F3\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nexport function ensureShellStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.dataset.plugin = 'dsh-prompt-customizer'\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** \u951A\u70B9\uFF1A\u5165\u53E3\u6309\u94AE\u53F3\u7F18 + \u9876\u7F18\u7684\u89C6\u53E3\u5750\u6807\uFF08getBoundingClientRect \u7CFB\uFF09\u3002 */\nexport interface PopoverAnchor {\n left: number\n top: number\n}\n\n/** \u7406\u60F3\u5C3A\u5BF8\uFF08px\uFF09\uFF1A\u62BD\u5C49\u5BBD\u5EA6\u968F tab \u5207\u6362\u4EE5 240ms \u5E73\u6ED1\u8FC7\u6E21\uFF08automation \u5361\u7247\u540C\u6B3E\u66F2\u7EBF\uFF09\u3002 */\nexport interface PopoverSize {\n width: number\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u62BD\u5C49\u4E00\u5F8B\u5168\u9AD8\uFF0Cheight/fill \u4E0D\u518D\u751F\u6548\u3002 */\n height?: number\n fill?: boolean\n}\n\n/** PopoverShell \u5C5E\u6027\u3002 */\nexport interface PopoverShellProps {\n /** \u6B63\u5728\u64AD\u653E\u6536\u56DE\u52A8\u753B\uFF08\u6B64\u65F6\u4ECD\u6302\u8F7D\uFF0C\u64AD out \u52A8\u753B\uFF09\u3002 */\n closing: boolean\n /** \u8BF7\u6C42\u5173\u95ED\uFF08\u906E\u7F69\u70B9\u51FB / Esc / \u5173\u95ED\u94AE\u7EDF\u4E00\u8D70\u8FD9\u91CC\uFF09\u3002 */\n onClose: () => void\n /** \u5165\u53E3\u951A\u70B9\uFF08\u517C\u5BB9\u4FDD\u7559\uFF1A\u62BD\u5C49\u4E0D\u518D\u8DDF\u968F\u6309\u94AE\u5B9A\u4F4D\uFF0C\u4F20\u4E0D\u4F20\u90FD\u4E0D\u5F71\u54CD\u5E03\u5C40\uFF09\u3002 */\n anchor?: PopoverAnchor | null\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u9762\u677F\u76F4\u63A5\u94FA\u6EE1\u4F1A\u8BDD\u4E3B\u533A\uFF0C\u7406\u60F3\u5BBD\u5EA6\u4E0D\u518D\u751F\u6548\u3002 */\n width?: number\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u94FA\u6EE1\u4E3B\u533A\uFF0C\u52A8\u6001\u5C3A\u5BF8\u4E0D\u518D\u751F\u6548\u3002 */\n size?: PopoverSize\n /** \u9F20\u6807\u8FDB\u5165\u5361\u7247\uFF08hover \u6A21\u5F0F\uFF1A\u53D6\u6D88\u81EA\u52A8\u6536\u56DE\uFF09\u3002 */\n onCardMouseEnter?: () => void\n /** \u9F20\u6807\u79BB\u5F00\u5361\u7247\uFF08hover \u6A21\u5F0F\uFF1A\u542F\u52A8\u81EA\u52A8\u6536\u56DE\u8BA1\u65F6\uFF09\u3002 */\n onCardMouseLeave?: () => void\n /** \u65E0\u969C\u788D\u540D\uFF08role=dialog \u7684 aria-label\uFF09\u3002 */\n ariaLabel: string\n /** \u5B9E\u5E95\u5361\u7247\uFF1A\u73BB\u7483\u8D28\u611F\u5F00\u542F\u65F6\u4E5F\u4E0D\u900F\u660E\uFF08\u5185\u5BB9\u5BC6\u96C6\u7684\u6570\u636E\u9762\u677F\u7528\uFF0C\u907F\u514D\u80CC\u666F\u7A7F\u900F\u5E72\u6270\u9605\u8BFB\uFF09\u3002 */\n solid?: boolean\n /** \u517C\u5BB9\u4FDD\u7559\uFF1A\u62BD\u5C49\u4E00\u5F8B\u5168\u9AD8\uFF0C\u8BE5\u503C\u4E0D\u518D\u751F\u6548\u3002 */\n bottomInset?: number\n children: ReactNode\n}\n\n/** \u6E32\u67D3\u300C\u4F1A\u8BDD\u5F0F\u53F3\u4FA7\u9762\u677F\u300D\uFF08\u542B\u906E\u7F69\uFF09\u3002\u5185\u5BB9\u81EA\u5E26\u5934\u90E8\u65F6\u65E0\u9700\u518D\u7528 PshHead\u3002 */\nexport function PopoverShell({\n closing, onClose, width = 560, size, onCardMouseEnter, onCardMouseLeave, ariaLabel, solid = false, children,\n}: PopoverShellProps): JSX.Element {\n // \u89C6\u53E3\u5BBD\u5EA6 + \u4F1A\u8BDD\u4E3B\u533A\u5DE6\u7F18\u8D70 state\uFF1A\u7A97\u53E3\u7F29\u653E/\u4FA7\u680F\u6298\u53E0\u65F6\u5B9E\u65F6\u8DDF\u968F\u3002\n const [vw, setVw] = useState(window.innerWidth)\n const [mainLeft, setMainLeft] = useState(readMainLeft)\n useEffect(() => {\n const reread = (): void => {\n setVw(window.innerWidth)\n setMainLeft(readMainLeft())\n }\n reread()\n window.addEventListener('resize', reread)\n const observer = new MutationObserver(reread)\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-sidebar-collapsed'], subtree: true })\n const timer = window.setInterval(reread, 1500)\n return () => {\n window.removeEventListener('resize', reread)\n observer.disconnect()\n window.clearInterval(timer)\n }\n }, [])\n void (size?.width ?? width)\n const anim = closing ? 'out' : 'in'\n // \u7A84\u5C4F\u56DE\u9000\u5168\u5C4F sheet\uFF1B\u684C\u9762\u7AEF\u76F4\u63A5\u76D6\u4F4F\u4F1A\u8BDD\u4E3B\u533A\uFF08left=\u4FA7\u680F\u53F3\u7F18\uFF0C\u53F3\u62C9\u6EE1\uFF09\u3002\n const narrow = vw < NARROW_VP\n const mode = narrow ? 'sheet' : 'drawer'\n const style: CSSProperties | undefined = narrow ? undefined : { left: mainLeft }\n\n useEffect(() => {\n if (closing) return undefined\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', onKey)\n return () => { document.removeEventListener('keydown', onKey) }\n }, [closing, onClose])\n\n // portal \u5230 body\uFF1A\u5361\u7247\u4E0D\u80FD\u7559\u5728\u5165\u53E3\u6240\u5728\u7684 DOM \u5B50\u6811\u91CC\u3002\n // \u5165\u53E3\u662F portal \u8FDB\u4FA7\u8FB9\u680F\u5BFC\u822A\u69FD\u7684\uFF0C\u800C\u69FD\u4F4D\u5BBF\u4E3B\u662F\u6211\u4EEC\u624B\u5DE5\u63D2\u8FDB DSH \u81EA\u6709\n // React \u6811\u7684\u88F8\u8282\u70B9\u2014\u2014\u5F39\u5C42\u4E00\u65E6\u7559\u5728\u91CC\u9762\uFF0C\u4FA7\u8FB9\u680F\u4EFB\u4F55\u4E00\u6B21\u91CD\u6E32\u67D3\u90FD\u53EF\u80FD\u8FDE\u5E26\n // \u56DE\u6536\u5B83\uFF0C\u4E14 position:fixed \u4F1A\u88AB\u4FA7\u8FB9\u680F\u7684 transform \u7956\u5148\u53D8\u6210\u5C40\u90E8\u5B9A\u4F4D\u3002\n // \u632A\u5230 body \u540E\uFF1A\u4E0D\u53D7\u4FA7\u8FB9\u680F\u6E32\u67D3\u5F71\u54CD\u3001fixed \u951A\u5B9A\u89C6\u53E3\u3001\u5C42\u7EA7\u4E0E DOM \u987A\u5E8F\u53EF\u63A7\u3002\n return createPortal(\n <>\n {narrow && (\n <div className=\"psh-mask\" data-anim={anim} aria-hidden=\"true\" onClick={onClose} />\n )}\n <div\n className={`psh-card ${modalDrawerAnimClass(closing)}`}\n data-anim={anim}\n data-mode={mode}\n data-solid={solid ? '' : undefined}\n style={style}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n onMouseEnter={onCardMouseEnter}\n onMouseLeave={onCardMouseLeave}\n >\n {children}\n </div>\n </>,\n document.body,\n )\n}\n\n/** \u5361\u7247\u5934\u90E8\u5C5E\u6027\u3002 */\nexport interface PshHeadProps {\n title: string\n closeLabel: string\n onClose: () => void\n}\n\n/** \u901A\u7528\u5361\u7247\u5934\u90E8\uFF08\u6807\u9898 + \u5173\u95ED\u94AE\uFF09\u3002 */\nexport function PshHead({ title, closeLabel, onClose }: PshHeadProps): JSX.Element {\n return (\n <div className=\"psh-head\">\n <span className=\"psh-title\">{title}</span>\n <button type=\"button\" className=\"psh-close\" aria-label={closeLabel} onClick={onClose}>\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M4 4l8 8M12 4l-8 8\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n )\n}\n\n/** \u5361\u7247\u4E3B\u4F53\u6EDA\u52A8\u5BB9\u5668\uFF08flex:1 + overflow hidden\uFF0C\u5185\u90E8\u9762\u677F\u81EA\u884C\u6EDA\u52A8\uFF09\u3002 */\nexport function PshBody({ children, className }: { children: ReactNode; className?: string }): JSX.Element {\n return <div className={className !== undefined && className !== '' ? `psh-body ${className}` : 'psh-body'}>{children}</div>\n}\n", "/**\n * \u5F39\u7A97\u5F00\u5408\u52A8\u753B\uFF08\u7528\u91CF\u5DE5\u4F5C\u53F0 / \u6280\u80FD\u9762\u677F / \u8BB0\u5FC6\u9762\u677F\u5171\u7528\uFF09\u2014\u2014\u5BF9\u9F50\u300C\u81EA\u52A8\u5316\u300D\u5361\u7247\u7684\u6ED1\u5165\u6ED1\u51FA\u624B\u611F\uFF1A\n * - \u5F39\u51FA\uFF1Afade + \u81EA\u5E95\u90E8 24px \u4E0A\u6ED1\u8FDB\u5165\uFF08\u65E0\u7F29\u653E\uFF1Bautomation sheet-in \u540C\u6B3E\u4F4D\u79FB\u4E0E\u66F2\u7EBF\uFF09\uFF0Cmount \u65F6\u64AD\u653E\u3002\n * - \u6536\u56DE\uFF1Afade + \u4E0B\u6ED1 24px \u9000\u51FA\uFF08automation sheet-out \u540C\u6B3E\u53CD\u5411\u66F2\u7EBF\uFF09\uFF0Cclosing \u9636\u6BB5\u64AD\u653E\uFF0C\u7ED3\u675F\u540E\u518D\u5378\u8F7D\u3002\n * - \u5185\u5BB9\uFF1A`.dsh-modal-stagger` \u5BB9\u5668\u5728\u5361\u7247\u6ED1\u5165\u540E 60ms \u8F7B\u5FAE\u4E0A\u6D6E\u8DDF\u8FDB\uFF08automation \u5185\u90E8\u533A\u5757\u540C\u6B3E\n * rise-in\uFF09\uFF0C\u5173\u95ED\u65F6\u52A8\u753B\u81EA\u52A8\u89E3\u9664\u3001\u968F\u5361\u7247\u6574\u4F53\u6536\u56DE\u6E10\u9690\u3002\n *\n * \u7528\u6CD5\uFF1A\u5165\u53E3\u7EC4\u4EF6\u7528 useModalClose \u6301\u6709 closing \u6001\uFF0C\u628A closing \u4F20\u7ED9\u5F39\u7A97\uFF0C\n * \u5F39\u7A97\u628A closing \u6620\u5C04\u6210 slide-out class\uFF08\u5361\u7247\uFF09\u4E0E mask \u7684\u6DE1\u51FA class\uFF1B\n * \u9700\u8981\u5185\u5BB9\u9519\u843D\u611F\u7684\u9762\u677F\u5728\u5185\u5BB9\u6839\u5BB9\u5668\u4E0A\u52A0 `dsh-modal-stagger` \u5373\u53EF\u3002\n */\n\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\n/** \u52A8\u753B\u65F6\u957F\uFF08ms\uFF09\uFF0CCSS \u4E0E hook \u8BA1\u65F6\u4FDD\u6301\u4E00\u81F4\uFF08\u4E0E automation \u7684 AUTO_ANIM_MS \u540C\u503C\uFF09\u3002 */\nexport const MODAL_ANIM_MS = 240\n\n/** \u6837\u5F0F\u6807\u7B7E id\uFF08\u5E26 triad \u524D\u7F00\uFF1Adsh-chat-flow \u6CE8\u5165\u540C\u540D\u65E7\u8868\uFF0C\u5148\u5230\u5148\u5F97\u4F1A\u541E\u6389\u672C\u8868\u7684 keyframes\uFF09\u3002 */\nconst STYLE_ID = 'dsh-prompt-customizer-modal-animation-styles'\n\nconst SHEET = `\n@keyframes dsh-modal-slide-in {\n from { opacity: 0; transform: translateY(24px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes dsh-modal-slide-out {\n from { opacity: 1; transform: translateY(0); }\n to { opacity: 0; transform: translateY(24px); }\n}\n@keyframes dsh-modal-side-in {\n from { opacity: 0; transform: translateX(-14px); }\n to { opacity: 1; transform: translateX(0); }\n}\n@keyframes dsh-modal-side-out {\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(-10px); }\n}\n@keyframes dsh-modal-drawer-in {\n from { opacity: 0; transform: translateX(56px); }\n to { opacity: 1; transform: translateX(0); }\n}\n@keyframes dsh-modal-drawer-out {\n from { opacity: 1; transform: translateX(0); }\n to { opacity: 0; transform: translateX(40px); }\n}\n@keyframes dsh-modal-rise-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes dsh-modal-mask-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n@keyframes dsh-modal-mask-out {\n from { opacity: 1; }\n to { opacity: 0; }\n}\n.dsh-modal-slide-in { animation: dsh-modal-slide-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1); }\n.dsh-modal-slide-out { animation: dsh-modal-slide-out ${MODAL_ANIM_MS}ms cubic-bezier(0.4, 0, 0.2, 1) forwards; }\n.dsh-modal-side-in { animation: dsh-modal-side-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1); }\n.dsh-modal-side-out { animation: dsh-modal-side-out ${MODAL_ANIM_MS}ms cubic-bezier(0.4, 0, 0.2, 1) forwards; }\n.dsh-modal-drawer-in { animation: dsh-modal-drawer-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1); }\n.dsh-modal-drawer-out { animation: dsh-modal-drawer-out ${MODAL_ANIM_MS}ms cubic-bezier(0.4, 0, 0.2, 1) forwards; }\n/* \u5185\u5BB9\u9519\u843D\uFF1A\u5361\u7247\u64AD\u653E\u6ED1\u5165\uFF08\u5E95\u90E8\u4E0A\u6ED1 / \u53F3\u4FA7\u6ED1\u5165\u5747\u53EF\uFF09\u65F6\u751F\u6548\uFF0C\u5173\u95ED\u65F6\u968F\u5361\u7247\u6574\u4F53\u6536\u56DE\u3002\n fill-mode \u5FC5\u987B\u7528 backwards\uFF08\u5EF6\u8FDF\u671F\u5E94\u7528 from \u5E27\u9690\u85CF\uFF09\u800C\u975E both\u2014\u2014both \u4F1A\u5728\u52A8\u753B\n \u7ED3\u675F\u540E\u6B8B\u7559 to \u5E27 transform\uFF08\u5373\u4F7F translateY(0)\uFF09\uFF0C\u4F7F\u8BE5\u5BB9\u5668\u6210\u4E3A\u540E\u4EE3 position:fixed\n \u5143\u7D20\uFF08\u56FE\u8868 tooltip\uFF09\u7684\u5305\u542B\u5757\uFF0C\u6D6E\u5C42\u6574\u4F53\u504F\u79FB\u3002 */\n.dsh-modal-slide-in .dsh-modal-stagger,\n.dsh-modal-side-in .dsh-modal-stagger,\n.dsh-modal-drawer-in .dsh-modal-stagger {\n animation: dsh-modal-rise-in ${MODAL_ANIM_MS}ms cubic-bezier(0.2, 0.8, 0.2, 1) backwards;\n animation-delay: 60ms;\n}\n.dsh-modal-mask-in { animation: dsh-modal-mask-in ${MODAL_ANIM_MS}ms ease; }\n.dsh-modal-mask-out { animation: dsh-modal-mask-out ${MODAL_ANIM_MS}ms ease forwards; }\n@media (prefers-reduced-motion: reduce) {\n .dsh-modal-slide-in, .dsh-modal-slide-out, .dsh-modal-side-in, .dsh-modal-side-out,\n .dsh-modal-drawer-in, .dsh-modal-drawer-out,\n .dsh-modal-mask-in, .dsh-modal-mask-out { animation: none; }\n .dsh-modal-slide-in .dsh-modal-stagger, .dsh-modal-side-in .dsh-modal-stagger, .dsh-modal-drawer-in .dsh-modal-stagger { animation: none; }\n}\n`\n\n/** \u6CE8\u5165\u5F39\u7A97\u52A8\u753B\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nexport function ensureModalAnimStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** \u5361\u7247\u52A8\u753B class\uFF08open \u9636\u6BB5\u6ED1\u5165\uFF0Cclosing \u9636\u6BB5\u6ED1\u51FA\uFF09\u3002 */\nexport function modalAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-slide-out' : 'dsh-modal-slide-in'\n}\n\n/** \u5361\u7247\u52A8\u753B class\u2014\u2014\u53F3\u4FA7\u6ED1\u5165\u53D8\u4F53\uFF08\u8D34\u5165\u53E3\u5F39\u51FA\u7684 popover \u5361\u7247\u7528\uFF0C\u73B0\u4EC5\u517C\u5BB9\u4FDD\u7559\uFF09\u3002 */\nexport function modalSideAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-side-out' : 'dsh-modal-side-in'\n}\n\n/** \u5361\u7247\u52A8\u753B class\u2014\u2014\u4F1A\u8BDD\u5F0F\u53F3\u4FA7\u62BD\u5C49\u53D8\u4F53\uFF08\u7528\u91CF/\u6280\u80FD/\u8BB0\u5FC6\u9762\u677F\u7528\uFF1A\u81EA\u53F3\u5411\u5DE6\u6ED1\u5165\uFF09\u3002 */\nexport function modalDrawerAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-drawer-out' : 'dsh-modal-drawer-in'\n}\n\n/** \u906E\u7F69\u52A8\u753B class\uFF08\u81EA\u5B9A\u4E49\u5F39\u7A97\u624D\u6709\u906E\u7F69\uFF0C\u5982\u7528\u91CF\u5DE5\u4F5C\u53F0\uFF09\u3002 */\nexport function modalMaskAnimClass(closing: boolean): string {\n return closing ? 'dsh-modal-mask-out' : 'dsh-modal-mask-in'\n}\n\n/** \u5185\u5BB9\u5BB9\u5668 class\uFF1A\u5361\u7247\u6ED1\u5165\u540E\u9519\u843D\u8DDF\u8FDB\uFF08\u914D\u5408 modalAnimClass \u4F7F\u7528\uFF09\u3002 */\nexport const modalStaggerClass = 'dsh-modal-stagger'\n\n/**\n * \u5F39\u7A97\u5173\u95ED\u52A8\u753B\u72B6\u6001\u673A\uFF1A\u5148\u7F6E closing \u64AD\u653E\u6536\u56DE\u52A8\u753B\uFF0C\u7ED3\u675F\u540E\u518D\u771F\u6B63 onClose\u3002\n * `open` \u7531\u5165\u53E3\u4F20\u5165\uFF1A\u5F39\u7A97\u518D\u6B21\u6253\u5F00\u65F6\u91CD\u7F6E closing\uFF08\u5426\u5219\u4E0A\u4E00\u6B21\u6536\u56DE\u52A8\u753B\u4F1A\u628A\n * closing \u5361\u5728 true\uFF0C\u91CD\u5F00\u540E\u5F39\u7A97\u900F\u660E\u4E14\u906E\u7F69\u6321\u4F4F\u6574\u9875\uFF09\u3002\n */\nexport function useModalClose(open: boolean, onClose: () => void, durationMs = MODAL_ANIM_MS): { closing: boolean; requestClose: () => void } {\n const [closing, setClosing] = useState(false)\n const timerRef = useRef<number | null>(null)\n const closingRef = useRef(false)\n\n // \u6253\u5F00\uFF08\u542B\u91CD\u65B0\u6253\u5F00\uFF09\u65F6\u91CD\u7F6E\u5173\u95ED\u6001\uFF1A\u5728\u7ED8\u5236\u524D\u540C\u6B65\u590D\u4F4D\uFF0C\u907F\u514D\u4E00\u5E27\u900F\u660E\u95EA\u73B0\u3002\n useLayoutEffect(() => {\n if (open) {\n closingRef.current = false\n setClosing(false)\n }\n }, [open])\n\n const requestClose = useCallback(() => {\n if (closingRef.current) return\n closingRef.current = true\n setClosing(true)\n timerRef.current = window.setTimeout(() => {\n onClose()\n }, durationMs)\n }, [onClose, durationMs])\n\n useEffect(() => () => {\n if (timerRef.current !== null) window.clearTimeout(timerRef.current)\n }, [])\n\n return { closing, requestClose }\n}\n", "/**\n * Panel \u2014 \u63D0\u793A\u8BCD\u7BA1\u7406\u9762\u677F\uFF08\u72EC\u7ACB\u62BD\u5C49\u7684\u6839\u7EC4\u4EF6\uFF09\u3002\n *\n * \u62C9\u53D6\u914D\u7F6E\u4E0E\u6E05\u5355\u3001\u7EF4\u62A4\u6A21\u5F0F\u4E0E\u7F16\u8F91\u76EE\u6807\u72B6\u6001\uFF0C\u628A\u5DE6\u53F3\u4E24\u680F\u88C5\u914D\u8D77\u6765\uFF1A\n * - \u5934\u90E8\uFF1A\u6807\u9898 + \u6A21\u5F0F\u5207\u6362\uFF08\u63D0\u793A\u8BCD / \u5DE5\u5177 / \u9884\u8BBE\uFF09+ \u4FDD\u5B58 / \u5237\u65B0 / \u5173\u95ED\uFF1B\n * - \u7B2C\u4E8C\u884C\uFF1Aagent \u9884\u8BBE Tab\uFF08\u5168\u90E8 Agent + \u5404\u9884\u8BBE\uFF0C\u70B9\u51FB\u5373\u5207\u6362\u7F16\u8F91\u76EE\u6807\uFF0C\n * \u50CF\u5BBF\u4E3B\u80FD\u529B\u7BA1\u7406\u9875\u7684\u9884\u8BBE\u5207\u6362\uFF09+ \u4E09\u6001\u540C\u6B65 / \u4E2D\u6587\u63D0\u793A\u8BCD\u5F00\u5173\uFF1B\n * - \u4E3B\u4F53\u5206\u680F\uFF1A\u5DE6\u680F = \u52FE\u9009\u5217\u8868\uFF08\u63D0\u793A\u8BCD\u6216\u5DE5\u5177\uFF0C\u5E95\u90E8\u4E09\u6001\u8FC7\u6EE4\uFF09\uFF0C\u53F3\u680F =\n * \u6700\u7EC8\u88C5\u914D\u9884\u89C8\uFF1B\u9884\u8BBE\u6A21\u5F0F\u4E0B\u5DE6\u680F\u662F\u5FEB\u7167\u5E93\u3001\u53F3\u680F\u662F\u5168\u5C40\u8BBE\u7F6E\u3002\n *\n * \u914D\u7F6E\u6765\u81EA\u63D2\u4EF6\u81EA\u6709 /config \u8DEF\u7531\uFF1B\u6E05\u5355\u4E0E\u4E09\u9636\u6BB5\u9884\u89C8\u6765\u81EA /inventory \u4E0E\n * /preview?phase=\u2026\u3002\u7F16\u8F91\u53EA\u6539\u5185\u5B58\u8349\u7A3F\uFF0C\u7531\u300C\u4FDD\u5B58\u300D\u6309\u94AE\u7ECF /config/apply \u4E00\u6B21\n * \u5199\u76D8\uFF08\u5199\u9519\u7684\u914D\u7F6E\u4E0D\u70B9\u4FDD\u5B58\u5C31\u4E0D\u4F1A\u8FDB\u6587\u4EF6\uFF09\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type DragEvent as ReactDragEvent, type ReactElement } from 'react'\nimport { IconAgentPresetOutlineRegular } from '@deepseek-ai/dsh-client-ui-primitives'\n// \u9884\u8BBE chips \u884C\u76F4\u63A5\u590D\u7528\u80FD\u529B\u9762\u677F\uFF08SKILL / MCP\uFF09\u7684\u7C7B\u540D\uFF1A\u4E09\u5904\u300CAgent \u9884\u8BBE\u300D\u51E0\u4F55\u4E00\u81F4\u3002\nimport { css } from '../skills/styles.js'\nimport { payloadOf, dropOnPhase } from './dnd.ts'\nimport { DICT, type Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport type { AgentPresetInfo, Config, Inventory, PhaseViewKey, Preview } from './types.ts'\nimport { editView, type ConfigPatch } from './presets.ts'\nimport { zhMergedInjectEntries, zhRevertInjectEntries, zhApplied, mirroredRows, mirrorPhaseInjectEntries, mirroredDeniedLists, mirrorSkippedNames } from '../../../vendor/prompt-customizer/sectionOps.mjs'\nimport { ZH_SECTIONS } from '../../../vendor/prompt-customizer/zh/index.mjs'\nimport { SectionsPane } from './SectionsPane.tsx'\nimport { ToolsPane } from './ToolsPane.tsx'\nimport { PresetsPane, SettingsPane } from './PresetsPane.tsx'\nimport { PreviewPane } from './PreviewPane.tsx'\n\nconst INVENTORY_URL = '/api/prompt-customizer/inventory'\nconst AGENT_PRESETS_URL = '/api/prompt-customizer/agent-presets'\nconst CONFIG_URL = '/api/prompt-customizer/config'\nconst CONFIG_SET_URL = '/api/prompt-customizer/config/set'\nconst CONFIG_UNSET_URL = '/api/prompt-customizer/config/unset'\nconst CONFIG_APPLY_URL = '/api/prompt-customizer/config/apply'\nconst CONFIG_RESET_URL = '/api/prompt-customizer/config/reset'\nconst PRESETS_CREATE_URL = '/api/prompt-customizer/presets'\nconst PREVIEW_URL = '/api/prompt-customizer/preview'\n\n/** \u4E09\u9636\u6BB5\u9884\u89C8\u88C5\u914D\uFF08\u6A21\u578B\u89C6\u89D2\uFF09\uFF1A\u5DE6\u680F\u5217\u8868\u4E0E\u53F3\u680F\u9884\u89C8\u7684\u7EDF\u4E00\u6570\u636E\u6E90\u3002 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** \u4E09\u5957\u540D\u4E49\u88C5\u914D\u7684\u5171\u4EAB\u5E03\u5C40\uFF1A\u987A\u5E8F\u56FA\u5B9A\uFF0Crefresh \u6309\u6B64\u5E76\u884C\u62C9\u53D6\u3002 */\nconst VIEW_KEYS: PhaseViewKey[] = ['bootstrap', 'compaction', 'active']\n\n/** \u7F16\u8F91\u8349\u7A3F\u91CC\u53EF\u80FD\u51FA\u73B0\u7684\u5B57\u6BB5\uFF08\u4E0E\u670D\u52A1\u7AEF /config/apply \u7684 APPLY_FIELDS \u4E00\u81F4\uFF09\u3002 */\nconst DRAFT_FIELDS = ['sections', 'sectionsBootstrap', 'sectionsCompaction', 'replace', 'inject', 'tools'] as const\n\n/** \u9762\u677F\u9876\u5C42\u6A21\u5F0F\uFF1A\u63D0\u793A\u8BCD / \u5DE5\u5177 / \u9884\u8BBE\uFF08\u9884\u89C8\u5E38\u9A7B\u53F3\u680F\uFF0C\u4E0D\u518D\u662F\u72EC\u7ACB\u6A21\u5F0F\uFF09\u3002 */\ntype PanelMode = 'sections' | 'tools' | 'presets'\n\n/** \u53EF\u7F16\u8F91\u7684\u914D\u7F6E\u5B57\u6BB5\uFF08\u542B\u6BCF\u9636\u6BB5\u72EC\u7ACB\u6BB5\u5C4F\u853D\u540D\u5355\uFF09\u3002 */\ntype EditField = 'sections' | 'sectionsBootstrap' | 'sectionsCompaction' | 'replace' | 'inject' | 'tools'\n\n/** \u7F16\u8F91\u57DF\u8349\u7A3F\uFF1A\u63D0\u793A\u8BCD/\u5DE5\u5177\u4E24\u680F\u5171\u4EAB\u7684\u672A\u4FDD\u5B58\u5B57\u6BB5 + \u810F\u6807\u8BB0\u3002\n * \u53EA\u8BB0\u5F55\u7528\u6237\u5B9E\u9645\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\uFF08\u9996\u6B21\u7F16\u8F91\u53EA\u5199\u90A3\u4E00\u9879\uFF09\uFF0C\u4FDD\u5B58\u65F6\u4E5F\u53EA\u63D0\u4EA4\u8FD9\u4E9B\n * \u5B57\u6BB5 \u2014\u2014 \u672A\u7F16\u8F91\u7684\u5B57\u6BB5\u7EE7\u7EED\u56DE\u843D\u5168\u5C40 / \u7EE7\u627F\uFF0C\u907F\u514D\u4E00\u6B21\u4FDD\u5B58\u51BB\u7ED3\u5168\u90E8\u7EE7\u627F\u503C\u3002 */\ninterface EditDraft {\n sections?: Config['sections']\n sectionsBootstrap?: Config['sectionsBootstrap']\n sectionsCompaction?: Config['sectionsCompaction']\n replace?: Config['replace']\n inject?: Config['inject']\n tools?: Config['tools']\n dirty: boolean\n}\n\nexport function Panel({ t, onClose }: { t: Translate; onClose?: () => void }): ReactElement {\n const [cfg, setCfg] = useState<Config | null>(null)\n const [inv, setInv] = useState<Inventory | null>(null)\n // \u4E09\u9636\u6BB5\u9884\u89C8\u88C5\u914D\uFF1A\u6A21\u578B\u89C6\u89D2\u7684\u552F\u4E00\u6570\u636E\u6E90\uFF08\u52A0\u8F7D\u4E2D\u4E3A null\uFF09\u3002\n const [phases, setPhases] = useState<PhaseViews | null>(null)\n const [agentPresets, setAgentPresets] = useState<AgentPresetInfo[]>([])\n const [mode, setMode] = useState<PanelMode>('sections')\n const [error, setError] = useState<string | null>(null)\n // \u914D\u7F6E\u5199\u5165\u8BA1\u6570\uFF1A\u6BCF\u6B21\u6210\u529F\u5199\u914D\u7F6E\u540E +1\uFF0C\u9A71\u52A8\u9884\u89C8\u91CD\u8F7D\u3002\n const [version, setVersion] = useState(0)\n // \u4E09\u9636\u6BB5\u89C6\u56FE\uFF1A\u5DE6\u680F\u5217\u8868\u4E0E\u53F3\u680F\u9884\u89C8\u5171\u7528\uFF1B\u5DE6\u53F3\u4E24\u680F\u7684\u9636\u6BB5 Tab \u8054\u52A8\u5207\u6362\u540C\u4E00\u4EFD\u3002\n const [phase, setPhase] = useState<PhaseViewKey>('bootstrap')\n // \u62D6\u62FD\u60AC\u505C\u4E2D\u7684\u9636\u6BB5 Tab\uFF1A\u9AD8\u4EAE\u63D0\u793A\u300C\u677E\u624B = \u590D\u5236\u5230\u8BE5\u9636\u6BB5\u300D\uFF08\u5904\u7406\u7531\u6302\u8F7D\u4E2D\u7684\u5217\u8868\u8D1F\u8D23\uFF09\u3002\n const [dropPhase, setDropPhase] = useState<PhaseViewKey | null>(null)\n // \u8349\u7A3F\u9884\u89C8\u7684\u540C\u6B65\u5E8F\u53F7\uFF1A\u6BCF\u6B21\u53D1\u8D77\u540C\u6B65 +1\uFF0C\u8FC7\u671F\u54CD\u5E94\uFF08\u5DF2\u4FDD\u5B58 / \u518D\u6B21\u7F16\u8F91\u540E\uFF09\n // \u76F4\u63A5\u4E22\u5F03\uFF0C\u7EDD\u4E0D\u8986\u76D6\u65B0\u6570\u636E\u3002\n const syncSeq = useRef(0)\n const refreshSeq = useRef(0)\n // \u7F16\u8F91\u76EE\u6807\uFF1Aagent \u9884\u8BBE id\u30020.9.0 \u8D77\u300C\u5168\u90E8 Agent\u300D\u5165\u53E3\u5DF2\u79FB\u9664 \u2014\u2014 \u63D0\u793A\u8BCD\u5FC5\u987B\n // \u6309\u5177\u4F53\u9884\u8BBE\u4FEE\u6539\uFF1B\u5217\u8868\u5230\u8FBE\u540E\u9ED8\u8BA4\u9009\u4E2D\u7B2C\u4E00\u4E2A\u53EF\u7528\u9884\u8BBE\uFF08\u89C1\u4E0B\u65B9 effect\uFF09\u3002\n const [target, setTarget] = useState<string | undefined>(undefined)\n // \u4E09\u6001\u540C\u6B65\uFF08\u9ED8\u8BA4\u5173\uFF09\uFF1A\u52FE\u9009\u540E\u63D0\u793A\u8BCD / \u5DE5\u5177\u4E24\u680F\u7684\u4E09\u6001\u4E00\u8D77\u751F\u6548 \u2014\u2014 \u63D0\u793A\u8BCD\u680F\u6309\n // \u5E38\u9A7B\u671F\u7684\u5E76\u96C6\u884C\u96C6\u8986\u5199\u53E6\u5916\u4E24\u6001\uFF08\u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u4E00\u6B21\u5199\u5168\u4E09\u6001\uFF09\uFF0C\n // \u5DE5\u5177\u680F\u7684\u5C4F\u853D\u4E0E\u52A0\u56DE\u5BF9\u4E09\u4E2A\u9636\u6BB5\u540C\u65F6\u751F\u6548\u3002\u4EC5\u5728\u63D0\u793A\u8BCD / \u5DE5\u5177\u4E24\u4E2A\u6A21\u5F0F\u663E\u793A\u3002\n const [syncAll, setSyncAll] = useState(false)\n // \u53F3\u680F\u9884\u89C8\u7684\u5B50\u89C6\u56FE\uFF1A\u63D0\u793A\u8BCD\u6A21\u5F0F\u9ED8\u8BA4\u770B\u63D0\u793A\u8BCD\u3001\u5DE5\u5177\u6A21\u5F0F\u9ED8\u8BA4\u770B\u5DE5\u5177\u3002\n const [previewSub, setPreviewSub] = useState<'prompt' | 'tools'>('prompt')\n // \u7F16\u8F91\u57DF\u8349\u7A3F\uFF1Anull = \u65E0\u8349\u7A3F\uFF08\u663E\u793A\u78C1\u76D8\u503C\uFF09\u3002\u63D0\u793A\u8BCD \u2194 \u5DE5\u5177\u5207\u6362\u4FDD\u7559\uFF1B\n // \u5207\u5230\u9884\u8BBE\u6A21\u5F0F\u6216\u5207\u6362\u7F16\u8F91\u76EE\u6807\u65F6\u4E22\u5F03\uFF08\u810F\u8349\u7A3F\u5148\u7ECF\u786E\u8BA4\uFF09\u3002\n const [draft, setDraft] = useState<EditDraft | null>(null)\n const [saving, setSaving] = useState(false)\n const [flash, setFlash] = useState<string | null>(null)\n const [flashKind, setFlashKind] = useState<'ok' | 'err'>('ok')\n const flashTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const load = (): void => {\n fetch(CONFIG_URL + `?t=${Date.now()}`)\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'config failed')\n setCfg(body.config as Config)\n setError(null)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n useEffect(load, [])\n\n // \u8FD4\u56DE Promise\uFF1A\u624B\u52A8\u5237\u65B0\u540E\u53EF\u4EE5\u94FE\u4E0A\u8349\u7A3F\u8865\u540C\u6B65\uFF08\u89C1\u300C\u5237\u65B0\u300D\u6309\u94AE\uFF09\u3002\n const refresh = (): Promise<void> => {\n const seq = ++refreshSeq.current\n const qs = target ? `?scope=${encodeURIComponent(target)}` : ''\n // \u4E09\u9636\u6BB5\u4E0E\u6E05\u5355\u90FD\u8BFB\u53D6\u5F53\u524D\u6A21\u5F0F\uFF1B\u7D2F\u8BA1\u6C60\u4EC5\u4F9B\u6DFB\u52A0\u53C2\u8003\uFF0C\u4E0D\u66FF\u4EE3\u9884\u8BBE\u88C5\u914D\u3002\n const params = (phase: string): string =>\n `${qs}${qs ? '&' : '?'}phase=${phase}&t=${Date.now()}`\n const failures: string[] = []\n const grab = (phase: string): Promise<Preview | null> =>\n fetch(PREVIEW_URL + params(phase))\n .then((r) => r.json())\n .then((body: Preview) => {\n if (body.ok === false) throw new Error(body.error ?? t('previewFail'))\n return body\n })\n .catch((error: unknown) => {\n failures.push(`${phase}: ${String(error instanceof Error ? error.message : error)}`)\n return null\n })\n // \u6E05\u5355\u5E26 scope\uFF1A\u5F53\u524D\u6A21\u5F0F\u7684\u540C\u540D\u6B63\u6587\u4F18\u5148\uFF0C\u5176\u5B83\u5386\u53F2\u6761\u76EE\u53EA\u4F5C\u4E3A\u6C60\u5B50\u53C2\u8003\u3002\n return Promise.all([...VIEW_KEYS.map(grab), fetch(INVENTORY_URL + qs).then((r) => r.json()).then(body => {\n if (body.ok === false) throw new Error(body.error ?? 'inventory failed')\n return body\n }).catch((error: unknown) => {\n failures.push(String(error instanceof Error ? error.message : error))\n return null\n })])\n .then(([boot, comp, act, inventoryData]) => {\n if (seq !== refreshSeq.current) return\n setPhases({ bootstrap: boot, compaction: comp, active: act })\n setInv(inventoryData as Inventory)\n setError(failures.length ? failures.join('\\n') : null)\n })\n .catch((e: unknown) => {\n if (seq !== refreshSeq.current) return\n setPhases({ bootstrap: null, compaction: null, active: null })\n setError(String(e instanceof Error ? e.message : e))\n })\n }\n // \u6302\u8F7D\u65F6\u4E0E\u5207\u6362\u7F16\u8F91\u76EE\u6807\u540E\uFF1A\u6E05\u5355\u4E0E\u4E09\u9636\u6BB5\u9884\u89C8\u5207\u5230\u5BF9\u5E94 scope\u3002\n // version \u5165\u4F9D\u8D56\uFF1A\u4FDD\u5B58/\u5199\u914D\u7F6E\u6210\u529F\u540E +1\uFF0C\u9A71\u52A8\u91CD\u65B0\u62C9\u53D6\uFF08\u5426\u5219\u4E00\u76F4\u663E\u793A\u4FDD\u5B58\u524D\u7684\u88C5\u914D\uFF09\u3002\n useEffect(() => { void refresh() }, [target, version])\n\n // \u8349\u7A3F\u5B9E\u65F6\u9884\u89C8\uFF1A\u628A\u672A\u4FDD\u5B58\u7684\u7F16\u8F91\u8349\u7A3F\u8865\u4E01 POST \u7ED9 /preview\uFF08\u670D\u52A1\u7AEF\u53EA\u5728\u5185\u5B58\u91CC\n // \u53E0\u52A0\uFF0C\u78C1\u76D8\u4E0D\u52A8\uFF09\uFF0C\u53EA\u5237\u65B0\u5F53\u524D\u9636\u6BB5\u89C6\u56FE \u2014\u2014 \u9884\u89C8\u968F\u6539\u968F\u52A8\uFF1B\u4FDD\u5B58\u540E\u7684 GET \u5168\u91CF\n // \u62C9\u53D6\u4F1A\u8986\u76D6\u56DE\u6743\u5A01\u72B6\u6001\u3002syncSeq \u8BA9\u8FC7\u671F\u54CD\u5E94\uFF08\u53C8\u7F16\u8F91\u4E86 / \u5DF2\u4FDD\u5B58\uFF09\u76F4\u63A5\u4E22\u5F03\u3002\n const syncDraftPreview = (): void => {\n if (draft === null || !draft.dirty) return\n const patch: Record<string, unknown> = {}\n const source = draft as unknown as Record<string, unknown>\n for (const field of DRAFT_FIELDS) {\n if (Object.hasOwn(source, field)) patch[field] = source[field]\n }\n if (Object.keys(patch).length === 0) return\n const seq = ++syncSeq.current\n // scope \u8D70\u67E5\u8BE2\u4E32\uFF08\u670D\u52A1\u7AEF previewTarget \u53EA\u8BA4 query\uFF09\uFF1A\u8349\u7A3F\u8865\u4E01\u5FC5\u987B\u843D\u5728\n // \u5F53\u524D\u7F16\u8F91\u7684\u9884\u8BBE\u4E0A\uFF0C\u5426\u5219\u751F\u6548\u89C6\u56FE\u4E3A\u7A7A\u3001\u9884\u89C8\u9000\u56DE\u5B98\u65B9\u539F\u6837\u3002\n const scopeQs = target !== undefined ? `?scope=${encodeURIComponent(target)}` : ''\n fetch(PREVIEW_URL + scopeQs, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch, phase }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok === false) throw new Error(body?.error ?? 'preview failed')\n if (seq !== syncSeq.current) return // \u8FC7\u671F\u54CD\u5E94\uFF1A\u8349\u7A3F\u53C8\u53D8\u4E86\u6216\u5DF2\u4FDD\u5B58\uFF0C\u4E22\u5F03\n setPhases((prev) => (prev === null ? prev : { ...prev, [phase]: body as Preview }))\n setError(null)\n })\n .catch((e: unknown) => {\n // \u5B9E\u65F6\u9884\u89C8\u5931\u8D25\u4E0D\u518D\u9759\u9ED8\uFF1A\u6D88\u606F\u6761\u63D0\u793A\uFF08\u4E0B\u4E00\u6B21\u6210\u529F\u4F1A\u81EA\u52A8\u6E05\u9664\uFF09\u3002\u4FDD\u5B58\u540E\n // \u7684\u5168\u91CF\u5237\u65B0\u4ECD\u4F1A\u8986\u76D6\u56DE\u6743\u5A01\u72B6\u6001\uFF0C\u4E0D\u5F71\u54CD\u7F16\u8F91\u3002\n setError(`${t('previewSyncFail')}\uFF1A${e instanceof Error ? e.message : String(e)}`)\n })\n }\n // \u7F16\u8F91\uFF08draft \u8EAB\u4EFD\u53D8\u5316\uFF09\u3001\u5207\u6362\u9636\u6BB5 / \u7F16\u8F91\u76EE\u6807\u540E\uFF1A\u9632\u6296 600ms \u540C\u6B65\u4E00\u6B21\u3002\n useEffect(() => {\n if (draft === null || !draft.dirty) return undefined\n const timer = setTimeout(syncDraftPreview, 600)\n return () => { clearTimeout(timer) }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [draft, phase, target])\n\n // \u679A\u4E3E\u5DF2\u5B89\u88C5\u7684 agent \u9884\u8BBE\uFF08roster \u5B9E\u65F6\u8BFB\u53D6\uFF09\uFF0C\u7ED9\u9876\u90E8\u9884\u8BBE Tab \u4F9B\u8D27\u3002\n // \u62BD\u6210\u51FD\u6570\uFF1A\u4FDD\u5B58\u9884\u8BBE\u6210\u529F\u540E\u4E5F\u8981\u7ACB\u5373\u5237\u65B0 Tab \u884C\u3002\n const fetchPresets = (): void => {\n fetch(AGENT_PRESETS_URL + `?t=${Date.now()}`)\n .then((r) => r.json())\n .then((body) => setAgentPresets(Array.isArray(body?.presets) ? body.presets as AgentPresetInfo[] : []))\n .catch(() => setAgentPresets([]))\n }\n useEffect(() => { fetchPresets() }, [])\n\n // \u9ED8\u8BA4\u7F16\u8F91\u76EE\u6807\uFF1A\u9884\u8BBE\u540D\u5355\u5F02\u6B65\u5230\u8FBE\u540E\u8865\u9009\u4E00\u6B21\uFF08\u9996\u4E2A\u53EF\u7528\u9884\u8BBE\uFF0C\u5168\u5931\u6548\u5219\u9996\u4E2A\uFF09\u3002\n // \u53EA\u5728\u5C1A\u672A\u9009\u62E9\u65F6\u751F\u6548 \u2014\u2014 \u7528\u6237\u6B64\u540E\u5207\u6362 / \u540D\u5355\u5237\u65B0\u90FD\u4E0D\u8986\u76D6\u5F53\u524D\u9009\u62E9\u3002\n useEffect(() => {\n setTarget((current) => {\n if (current !== undefined) return current\n const first = agentPresets.find((p) => !p.broken) ?? agentPresets[0]\n return first?.id\n })\n }, [agentPresets])\n\n // \u4FDD\u5B58\u6210\u529F/\u5931\u8D25\u540E\u7684\u77ED\u4FC3\u95EA\u793A\u6D88\u606F\uFF083 \u79D2\u81EA\u52A8\u6D88\u5931\uFF1Berr \u7528\u7EA2\u8272\u6837\u5F0F\uFF09\u3002\n const showFlash = (text: string, kind: 'ok' | 'err' = 'ok'): void => {\n if (flashTimer.current !== null) clearTimeout(flashTimer.current)\n setFlash(text)\n setFlashKind(kind)\n flashTimer.current = setTimeout(() => setFlash(null), 3200)\n }\n\n // \u4E22\u5F03\u8349\u7A3F\uFF1A\u9012\u589E\u540C\u6B65\u5E8F\u53F7\uFF0C\u4F5C\u5E9F\u5728\u9014\u7684\u8349\u7A3F\u9884\u89C8\u54CD\u5E94\uFF08\u4FDD\u5B58\u540E GET \u4F1A\u6574\u4F53\u8986\u76D6\uFF0C\n // \u8FC7\u671F\u54CD\u5E94\u7EDD\u4E0D\u80FD\u53CD\u8FC7\u6765\u76D6\u6389\u6743\u5A01\u6570\u636E\uFF09\u3002\n const clearDraft = (): void => {\n syncSeq.current += 1\n setDraft(null)\n }\n\n if (cfg === null) {\n return h('div', { style: { ...s.pRoot, padding: 16 } }, t('loading'))\n }\n\n // \u7F16\u8F91\u89C6\u56FE\uFF1A\u8349\u7A3F\u5B58\u5728\u65F6\u4EE5\u8349\u7A3F\u8986\u76D6\u5BF9\u5E94\u5B57\u6BB5\uFF08\u4E24\u680F\u5171\u4EAB\u7F16\u8F91\u57DF\uFF09\u3002\n // \u8349\u7A3F\u53EA\u542B\u7528\u6237\u5B9E\u9645\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\uFF0C\u672A\u7F16\u8F91\u5B57\u6BB5\u56DE\u843D\u57FA\u7EBF \u2014\u2014 \u7EDD\u4E0D\u628A\u7EE7\u627F\u503C\n // \u51BB\u7ED3\u8FDB override\u3002\n const base = editView(cfg, target)\n const view: Config = draft\n ? {\n ...base,\n sections: draft.sections ?? base.sections,\n sectionsBootstrap: draft.sectionsBootstrap ?? base.sectionsBootstrap,\n sectionsCompaction: draft.sectionsCompaction ?? base.sectionsCompaction,\n replace: draft.replace ?? base.replace,\n inject: draft.inject ?? base.inject,\n tools: draft.tools ?? base.tools,\n }\n : base\n\n const writeField = (field: string, value: unknown): void => {\n const url = value === undefined ? CONFIG_UNSET_URL : CONFIG_SET_URL\n fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ field, value }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'write failed')\n setCfg(body.config as Config)\n setError(null)\n setVersion((n) => n + 1)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n\n // \u4E24\u680F\u7684\u5199\u5165\uFF1A\u53EA\u6539\u5185\u5B58\u8349\u7A3F\uFF0C\u4E0D\u843D\u76D8\u3002\u8349\u7A3F\u53EA\u8BB0\u5F55\u88AB\u7F16\u8F91\u7684\u8FD9\u4E00\u5B57\u6BB5 \u2014\u2014 \u4FDD\u5B58\u65F6\n // \u4E5F\u53EA\u4F1A\u63D0\u4EA4\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\u3002/config/apply \u5FC5\u5E26 target\uFF08agent \u9884\u8BBE id\uFF0C0.9.0\n // \u8D77\u670D\u52A1\u7AEF\u62D2\u7EDD\u65E0\u76EE\u6807\u5199\u76D8\uFF09\uFF0C\u5199 overrides[id]\uFF08\u5B57\u6BB5\u7EA7\u63A5\u7BA1\u8BED\u4E49\u5728\u4FDD\u5B58\u65F6\u751F\u6548\uFF09\u3002\n const edit = (field: EditField, value: unknown): void => {\n setDraft((d) => ({\n ...(d ?? { dirty: false }),\n [field]: value,\n dirty: true,\n }))\n }\n\n // \u7EDF\u4E00\u4FDD\u5B58\uFF1A\u8349\u7A3F\u91CC\u5B9E\u9645\u7F16\u8F91\u8FC7\u7684\u5B57\u6BB5\u4E00\u6B21 POST \u5230 /config/apply\uFF0C\u6210\u529F\u540E\u6E05\n // \u8349\u7A3F\u5E76\u91C7\u7EB3\u6700\u65B0\u914D\u7F6E\u3002\u5931\u8D25\u65F6\u4FDD\u7559\u8349\u7A3F\uFF08\u6539\u5B8C\u53EF\u4EE5\u518D\u8BD5\uFF0C\u4E0D\u4F1A\u4E22\uFF09\u3002\n const save = (): void => {\n if (draft === null || saving) return\n const EDITED_FIELDS = ['sections', 'sectionsBootstrap', 'sectionsCompaction', 'replace', 'inject', 'tools'] as const\n const patch: Record<string, unknown> = {}\n for (const field of EDITED_FIELDS) {\n if (Object.hasOwn(draft, field)) patch[field] = draft[field]\n }\n setSaving(true)\n fetch(CONFIG_APPLY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'save failed')\n setCfg(body.config as Config)\n clearDraft()\n setError(null)\n setVersion((n) => n + 1)\n showFlash(t('saveOk'))\n })\n .catch((e: unknown) => setError(`${t('saveFail')}: ${e instanceof Error ? e.message : String(e)}`))\n .finally(() => setSaving(false))\n }\n\n // \u9884\u8BBE\u6A21\u5F0F\u7684\u300C\u5E94\u7528\u300D\uFF1A\u663E\u5F0F\u610F\u56FE\u76F4\u63A5\u843D\u76D8\uFF08\u4E0D\u7ECF\u8349\u7A3F\uFF09\uFF0C\u5B8C\u6574\u8865\u4E01\u4E00\u6B21\u5199\u5165\u5F53\u524D\n // \u7F16\u8F91\u76EE\u6807\u3002\u8C03\u7528\u70B9\u5DF2\u5728\u79BB\u5F00\u7F16\u8F91\u57DF\u65F6\u6E05\u7A7A\u8349\u7A3F\uFF0C\u4E0D\u4F1A\u6709\u5E76\u53D1\u8349\u7A3F\u5199\u76D8\u3002\n const writePatch = (patch: ConfigPatch): void => {\n fetch(CONFIG_APPLY_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ target, patch }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'apply failed')\n setCfg(body.config as Config)\n setError(null)\n setVersion((n) => n + 1)\n })\n .catch((e: unknown) => setError(String(e instanceof Error ? e.message : e)))\n }\n // \u9884\u8BBE\u5E93\uFF08presets / activePreset\uFF09\u6C38\u8FDC\u4FDD\u6301\u5728\u5168\u5C40\u5B57\u6BB5\uFF0C\u4E0D\u5206\u4F5C\u7528\u57DF\u3002\n const writeGlobal = writeField\n\n // \u300C\u4E2D\u6587\u63D0\u793A\u8BCD\u300D\u5F00\u5173\uFF08\u5934\u90E8\u5DE5\u5177\u680F\uFF09\uFF1A\u5F00 = \u628A\u540D\u5B57\u5BF9\u5F97\u4E0A\u8BD1\u672C\uFF08lib/zh/\uFF09\u7684\u6BB5\n // \u4E00\u6B21\u6027\u8986\u76D6\u4E3A\u4E2D\u6587\uFF0C\u5173 = \u6E05\u6389\u8FD9\u4E9B\u6BB5\u7684\u66FF\u6362\u6587\u672C\u56DE\u5F52\u82F1\u6587 \u2014\u2014 \u4E24\u4E2A\u65B9\u5411\u90FD\u8D70\u7F16\u8F91\n // \u8349\u7A3F\uFF08edit\uFF09\uFF0C\u4E0E\u624B\u52A8\u7F16\u8F91\u540C\u4E00\u6761\u4FDD\u5B58\u8DEF\u5F84\u3002\u72B6\u6001\u4ECE\u914D\u7F6E\u63A2\u6D4B\uFF08zhApplied\uFF09\u3002\n // \u4E09\u9636\u6BB5\u88C5\u914D\u672A\u5C31\u7EEA\u65F6\u62D2\u7EDD\u6267\u884C\uFF08\u5426\u5219\u4F1A\u628A\u5BF9\u5E94\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\u5F53\u4F5C\u7A7A\u96C6\u5199\u6389\uFF09\u3002\n const zhOn = zhApplied(view, ZH_SECTIONS)\n // \u300C\u4E2D\u6587\u63D0\u793A\u8BCD\u300D\u5F00\u542F\u65F6\uFF0C\u4ECE\u6C60\u91CC\u52A0\u5165\u7684\u6BB5\u4F18\u5148\u7528\u8BD1\u672C\u6587\u672C\uFF1A\u6CA1\u8FDB\u8FC7\u9762\u677F\u7684\u6BB5\uFF08\u5982\n // agent \u4F5C\u7528\u57DF\u6CE8\u518C\u7684 tool:subagent / context:file-reference\uFF09\u4E5F\u80FD\u4E00\u952E\u63A5\u7BA1\n // \u6210\u4E2D\u6587\u3002\u8BD1\u672C\u7F3A\u5E2D\u6216\u51FD\u6570\u8BD1\u672C\u8FD4\u56DE\u7A7A = \u4FDD\u6301\u6C60\u91CC\u539F\u6587\u3002\n const poolText = (name: string, fallback: string): string => {\n if (!zhOn) return fallback\n const entry = (ZH_SECTIONS as Record<string, unknown>)[name]\n const zh = typeof entry === 'function' ? (entry as (source: string) => unknown)(fallback) : entry\n return typeof zh === 'string' && zh !== '' ? zh : fallback\n }\n const toggleZh = (): void => {\n if (phases === null || phases.bootstrap === null || phases.active === null || phases.compaction === null) {\n showFlash(t('zhNotReady'), 'err')\n return\n }\n edit('inject', zhOn ? zhRevertInjectEntries(view, phases, ZH_SECTIONS) : zhMergedInjectEntries(view, phases, ZH_SECTIONS))\n showFlash(zhOn ? t('zhReverted') : t('zhApplied'))\n }\n\n /** \u8BE5\u6BB5\u662F\u5426\u5728\u76EE\u6807\u9636\u6BB5\u7684\u88C5\u914D\u8F93\u5165\uFF08base \u89C6\u56FE\uFF09\u91CC\uFF1A\u955C\u50CF\u65F6\u636E\u6B64\u51B3\u5B9A\u300C\u53EA\u5199 order\u300D\u8FD8\u662F\u300C\u5FC5\u987B\u5E26\u6B63\u6587\u300D\u3002 */\n const nativeIn = (key: PhaseViewKey, name: string): boolean | null => {\n const view = phases?.[key]\n if (view === undefined || view === null) return null\n return (view.baseSections ?? []).some((sec) => sec.name === name)\n }\n\n // \u300C\u4E09\u6001\u540C\u6B65\u300D\u5F00\u5173\uFF08\u5934\u90E8\u5DE5\u5177\u680F\uFF09\uFF1A\u52FE\u9009\u77AC\u95F4\u5373\u6309\u5E38\u9A7B\u671F\u7684\u5E76\u96C6\u884C\u96C6\u8986\u5199\u53E6\u5916\u4E24\u6001\n // \uFF08inject + \u4E09\u4EFD\u5C4F\u853D\u540D\u5355\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF0C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF09\uFF1B\u4E4B\u540E\u63D0\u793A\u8BCD\u680F\u7684\u4EFB\u4F55\n // \u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u90FD\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08\u89C1 SectionsPane \u7684 persistMirror\uFF09\u3002\n // \u4E09\u9636\u6BB5\u88C5\u914D\u672A\u5C31\u7EEA\uFF08\u6216\u4E3A\u7A7A\uFF09\u65F6\u62D2\u7EDD\u6267\u884C \u2014\u2014 \u7F3A\u4E00\u6001\u4F1A\u628A\u8BE5\u9636\u6BB5\u5F53\u7A7A\u96C6\u5199\u6389\u3002\n const toggleSyncAll = (on: boolean): void => {\n setSyncAll(on)\n if (!on) return\n if (phases === null || VIEW_KEYS.some((key) => phases[key] === null)) {\n showFlash(t('syncNotReady'), 'err')\n return\n }\n const rows = mirroredRows(view, phases, nativeIn)\n if (rows.length === 0) {\n showFlash(t('syncNotReady'), 'err')\n return\n }\n edit('inject', mirrorPhaseInjectEntries(view, rows, nativeIn))\n const denied = mirroredDeniedLists(rows)\n edit('sections', denied.sections)\n edit('sectionsBootstrap', denied.sectionsBootstrap)\n edit('sectionsCompaction', denied.sectionsCompaction)\n const skipped = mirrorSkippedNames(rows, nativeIn)\n showFlash(skipped.length > 0\n ? `${t('syncApplied')} ${t('syncSkippedDynamic', { names: skipped.join('\u3001') })}`\n : t('syncApplied'))\n }\n\n // \u6062\u590D\u521D\u59CB\u72B6\u6001\uFF1A\u670D\u52A1\u7AEF\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\u5E76\u5173\u95ED forceSections\uFF08\u4E0E\u4E0D\u88C5\u63D2\u4EF6\u7B49\u6548\uFF09\u3002\n // \u4E8C\u6B21\u786E\u8BA4\u7531\u8BBE\u7F6E\u680F\u7684\u8C03\u7528\u70B9\u8D1F\u8D23\uFF1B\u6210\u529F\u540E\u6E05\u8349\u7A3F\u3001\u91CD\u62C9\u5168\u90E8\u89C6\u56FE\u3002\n const resetAll = (): void => {\n fetch(CONFIG_RESET_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? 'reset failed')\n setCfg(body.config as Config)\n clearDraft()\n setError(null)\n setVersion((n) => n + 1)\n showFlash(t('resetOk'))\n })\n .catch((e: unknown) => setError(`${t('resetFail')}: ${e instanceof Error ? e.message : String(e)}`))\n }\n\n // \u5207\u6362\u6A21\u5F0F\uFF1A\u63D0\u793A\u8BCD \u2194 \u5DE5\u5177\u662F\u540C\u4E00\u7F16\u8F91\u57DF\uFF0C\u8349\u7A3F\u4FDD\u7559\uFF1B\u5207\u5230\u9884\u8BBE\u5373\u79BB\u5F00\u7F16\u8F91\u57DF\uFF0C\n // \u810F\u8349\u7A3F\u7ECF\u786E\u8BA4\u540E\u4E22\u5F03\u3002\u53F3\u680F\u9884\u89C8\u5B50\u89C6\u56FE\u8DDF\u968F\u6A21\u5F0F\u3002\n const switchMode = (next: PanelMode): void => {\n const leaving = (mode === 'sections' || mode === 'tools') && next === 'presets'\n if (leaving) {\n if (draft?.dirty && !window.confirm(t('discardConfirm'))) return\n clearDraft()\n }\n setMode(next)\n setPreviewSub(next === 'tools' ? 'tools' : 'prompt')\n }\n\n // \u5207\u6362\u7F16\u8F91\u76EE\u6807\uFF08\u9876\u90E8\u9884\u8BBE Tab\uFF09\uFF1A\u8349\u7A3F\u57FA\u7EBF\u968F\u76EE\u6807\u53D8\u5316\uFF0C\u810F\u8349\u7A3F\u5148\u7ECF\u786E\u8BA4\u518D\u4E22\u5F03\u3002\n const switchTarget = (next: string | undefined): void => {\n if (draft?.dirty && !window.confirm(t('discardConfirm'))) return\n clearDraft()\n setTarget(next)\n }\n\n // \u300C\u5B58\u4E3A\u9884\u8BBE\u300D\uFF1A\u628A\u5F53\u524D\u7F16\u8F91\u5185\u5BB9\uFF08\u542B\u672A\u4FDD\u5B58\u8349\u7A3F\uFF09fork \u6210\u4E00\u4E2A\u65B0\u7684 agent \u9884\u8BBE \u2014\u2014\n // \u5BBF\u4E3B authoring API \u6574\u4F53\u590D\u5236\u6765\u6E90\u9884\u8BBE\u76EE\u5F55\uFF08\u7EC4\u6210\u6587\u4EF6 / \u4F34\u751F .mjs / \u6280\u80FD\u76EE\u5F55\uFF09\uFF0C\n // \u540C\u65F6\u628A\u5F53\u524D\u914D\u7F6E\u5199\u8FDB overrides[name]\u3002\u6765\u6E90 = \u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1B\u5168\u5C40\u76EE\u6807\u7531\u670D\u52A1\u7AEF\n // \u56DE\u843D\u5230 roster \u9ED8\u8BA4\u9884\u8BBE\u3002\u540D\u5B57\u975E\u6CD5 / \u540C\u540D\u7531\u670D\u52A1\u7AEF\u62A5\u9519\u3002\n const saveAsPreset = (presetName: string): Promise<boolean> => {\n const name = presetName.trim()\n if (name.length === 0) return Promise.resolve(false)\n return fetch(PRESETS_CREATE_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n name,\n from: target,\n config: {\n sections: view.sections ?? [],\n sectionsBootstrap: view.sectionsBootstrap ?? [],\n sectionsCompaction: view.sectionsCompaction ?? [],\n replace: view.replace ?? {},\n inject: view.inject ?? [],\n tools: view.tools ?? {},\n },\n }),\n })\n .then((r) => r.json())\n .then((body) => {\n if (body?.ok !== true) throw new Error(body?.error ?? t('saveAsPresetFail'))\n load()\n fetchPresets()\n showFlash(t('saveAsPresetOk'), 'ok')\n return true\n })\n .catch((e: unknown) => {\n showFlash(`${t('saveAsPresetFail')}\uFF1A${String(e instanceof Error ? e.message : e)}`, 'err')\n return false\n })\n }\n\n const modeBtn = (key: PanelMode, label: string): ReactElement =>\n h('button', { key, style: mode === key ? s.segBtnActive : s.segBtn, onClick: () => switchMode(key) }, label)\n\n // \u9636\u6BB5\u6309\u94AE\u547D\u540D\uFF08\u5934\u90E8\u5408\u5E76\u63A7\u5236\uFF1A\u5F15\u5BFC\u671F / \u5E38\u9A7B\u671F / \u538B\u7F29\u53D7\u63A7\u671F\uFF09\u3002\n const stageLabel = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('phaseStageGuide') : key === 'compaction' ? t('phaseStageControlled') : t('phaseStageResident')\n const draftDirty = draft?.dirty === true\n\n /**\n * \u7F16\u8F91\u76EE\u6807 chip\uFF1A\u4E0E SKILL / MCP \u9876\u680F\u7684\u9884\u8BBE chips \u7528\u540C\u4E00\u5957\u7C7B\u540D\uFF08\u51E0\u4F55\u3001\u914D\u8272\u3001\n * \u60AC\u505C\u4E0E\u9009\u4E2D\u6001\u5B8C\u5168\u5BF9\u9F50\uFF09\u3002\u5C3E\u90E8\u6570\u5B57 = \u8BE5\u9884\u8BBE\u5DF2\u5B9A\u5236\u7684\u5B57\u6BB5\u6570\uFF08\u6709\u5219\u6A59\u8272\uFF09\uFF0C\n * \u4E0E MCP \u7684\u300C\u6570\u5B57 + \u6A59\u8272 = \u6709\u5355\u72EC\u8BBE\u7F6E\u300D\u540C\u4E00\u8BFB\u6CD5\uFF1B\u5931\u6548\u9884\u8BBE\u7F6E\u6362\u6210\u300C\u5931\u6548\u300D\u6807\u8BB0\u3002\n */\n const targetChip = (id: string, label: string, icon: ReactElement, broken?: string): ReactElement => {\n const active = target === id\n const bad = broken !== undefined && broken !== ''\n const customized = Object.keys(cfg?.overrides?.[id] ?? {}).length\n return h('button', {\n key: id,\n type: 'button',\n className: css.catItem,\n 'data-active': active || undefined,\n onClick: () => switchTarget(id),\n title: bad\n ? `${label} \u2014 ${t('broken')}`\n : customized > 0 ? `${label} \u00B7 ${t('targetCustomized', { n: customized })}` : label,\n }, [\n h('span', { className: css.catIcon, 'data-active': active || undefined }, icon),\n h('span', { className: css.catLabel }, label),\n bad ? h('span', { className: css.catCount, 'data-warn': true }, t('broken')) : null,\n !bad && customized > 0 ? h('span', { className: css.catCount, 'data-warn': true }, String(customized)) : null,\n ])\n }\n\n return h('div', { style: s.pRoot }, [\n // \u2500\u2500 \u7B2C\u4E00\u884C\uFF1Aagent \u9884\u8BBE\uFF08\u7F16\u8F91\u76EE\u6807\uFF09\u2500\u2500\n // \u4E0E SKILL / MCP \u9876\u680F\u540C\u6B3E chips \u884C\uFF08\u540C\u4E00\u5957\u7C7B\u540D + \u56FE\u6807 + \u8BA1\u6570\uFF09\uFF0C\u4E14\u6392\u5728\n // \u5B9A\u5236\u9762\u677F\u81EA\u5DF1\u7684\u5934\u90E8\u4E4B\u4E0A\uFF1A\u4E09\u4E2A tab \u7684\u300C\u9884\u8BBE\u5728\u4E0A\u300D\u8282\u594F\u4E00\u81F4\u3002\n // 0.9.0 \u8D77\u300C\u5168\u90E8 Agent\u300D\u5165\u53E3\u79FB\u9664\uFF1A\u63D0\u793A\u8BCD\u5FC5\u987B\u6309\u5177\u4F53\u9884\u8BBE\u4FEE\u6539\uFF0C\u65E0\u5168\u5C40\u76EE\u6807\u3002\n h('div', { key: 'targets', className: css.topbar }, [\n h('div', { className: css.chipRow, role: 'group', 'aria-label': t('targetLabel') }, [\n ...agentPresets.map((p) => targetChip(p.id, p.name, h(IconAgentPresetOutlineRegular, { size: 15 }), p.broken)),\n ]),\n ]),\n // \u2500\u2500 \u7B2C\u4E8C\u884C\uFF1A\u6807\u9898 + \u6A21\u5F0F\u5207\u6362 + \uFF08\u9636\u6BB5\u5207\u6362 + \u5F00\u5173\uFF09 + \u5DE5\u5177\u680F \u2500\u2500\n // \u9636\u6BB5\u6309\u94AE\u5408\u5E76\u653E\u5728\u4E09\u6001\u540C\u6B65\u9009\u62E9\u6846\u5DE6\u4FA7\uFF1A\u5DE6\u680F\u5217\u8868\u4E0E\u53F3\u680F\u9884\u89C8\u8DDF\u7740\u540C\u4E00\u4E2A\n // \u9636\u6BB5\u72B6\u6001\u8D70\uFF0C\u4E00\u5904\u5207\u6362\u4E24\u8FB9\u8054\u52A8\u3002\u4EC5\u5728\u63D0\u793A\u8BCD / \u5DE5\u5177\u4E24\u4E2A\u6A21\u5F0F\u663E\u793A\u3002\n h('div', { style: s.head }, [\n h('span', { style: s.headTitle }, [\n h('svg', { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 1.8, strokeLinecap: 'round', strokeLinejoin: 'round', 'aria-hidden': 'true', style: { flex: 'none' } }, [\n h('path', { d: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z' }),\n h('path', { d: 'M14 2v6h6' }),\n h('path', { d: 'M16 13H8' }),\n h('path', { d: 'M16 17H8' }),\n h('path', { d: 'M10 9H8' }),\n ]),\n t('nav'),\n ]),\n h('div', { style: s.seg }, [\n modeBtn('sections', t('tabsSections')),\n modeBtn('tools', t('tabsTools')),\n modeBtn('presets', t('tabsPresets')),\n ]),\n h('div', { style: s.headActions }, [\n mode === 'sections' || mode === 'tools'\n ? h('div', { style: s.seg }, VIEW_KEYS.map((key) => h('button', {\n key,\n style: dropPhase === key\n ? (phase === key ? s.segBtnDropActive : s.segBtnDrop)\n : phase === key ? s.segBtnActive : s.segBtn,\n onClick: () => setPhase(key),\n // \u62D6\u5230\u9636\u6BB5 Tab = \u628A\u884C\u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u6BB5 / \u5DE5\u5177\u5404\u6309\u81EA\u5DF1\u7684\u8BED\u4E49\u843D\u5730\uFF09\u3002\n onDragOver: (event: ReactDragEvent) => {\n if (payloadOf(event) === null) return\n event.preventDefault()\n setDropPhase(key)\n },\n onDragLeave: () => setDropPhase((current) => (current === key ? null : current)),\n onDrop: (event: ReactDragEvent) => {\n const payload = payloadOf(event)\n setDropPhase(null)\n if (payload === null) return\n event.preventDefault()\n dropOnPhase(key, payload)\n },\n }, stageLabel(key))))\n : null,\n draftDirty && (mode === 'sections' || mode === 'tools')\n ? h('span', { style: s.badgeReplaced, title: t('draftBadge') }, t('draftBadge'))\n : null,\n mode === 'sections' || mode === 'tools'\n ? h('label', {\n style: { ...s.muted, display: 'inline-flex', alignItems: 'center', gap: 4, cursor: 'pointer', whiteSpace: 'nowrap' },\n title: t('syncAllPhasesHint'),\n }, [\n h('input', {\n type: 'checkbox',\n checked: syncAll,\n onChange: (e: { target: { checked: boolean } }) => toggleSyncAll(e.target.checked),\n style: { margin: 0, cursor: 'pointer' },\n }),\n t('syncAllPhases'),\n ])\n : null,\n mode === 'sections'\n ? h('label', {\n style: { ...s.muted, display: 'inline-flex', alignItems: 'center', gap: 4, cursor: 'pointer', whiteSpace: 'nowrap' },\n title: t('zhHint'),\n }, [\n h('input', {\n type: 'checkbox',\n checked: zhOn,\n onChange: toggleZh,\n style: { margin: 0, cursor: 'pointer' },\n }),\n t('zhSwitch'),\n ])\n : null,\n h('button', {\n style: draft?.dirty ? s.saveBtnDirty : s.saveBtn,\n disabled: !draft?.dirty || saving,\n onClick: save,\n }, t('save')),\n // \u5237\u65B0 = GET \u78C1\u76D8\u6743\u5A01\u72B6\u6001\uFF1B\u6709\u810F\u8349\u7A3F\u65F6\u518D\u8865\u4E00\u6B21\u5F53\u524D\u9636\u6BB5\u7684\u8349\u7A3F\u53E0\u52A0\u9884\u89C8\uFF0C\n // \u907F\u514D\u9884\u89C8\u77ED\u6682\u56DE\u9000\u5230\u300C\u4E0A\u6B21\u4FDD\u5B58\u300D\u7684\u72B6\u6001\u3002\n h('button', { style: s.saveBtn, onClick: () => { void refresh().then(() => syncDraftPreview()) } }, t('refresh')),\n // \u5173\u95ED\u6309\u94AE\u53EA\u5728\u72EC\u7ACB\u5F00\u7A97\u65F6\u7ED9\u51FA\uFF08onClose \u7F3A\u7701 = \u7531\u5916\u5C42 tab \u627F\u8F7D\uFF0C\u4E0D\u9700\u8981\u5B83\uFF09\u3002\n onClose === undefined ? null : h('button', { style: s.iconBtn, onClick: onClose, 'aria-label': t('close'), title: t('close') },\n h('svg', { width: 15, height: 15, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': 'true' }, [\n h('path', { d: 'M4 4l8 8M12 4l-8 8', stroke: 'currentColor', strokeWidth: 1.6, strokeLinecap: 'round' }),\n ])),\n ]),\n ]),\n // \u2500\u2500 \u6D88\u606F\u6761\uFF08\u9519\u8BEF / \u95EA\u793A / \u76EE\u6807\u5F02\u5E38\u8B66\u793A\uFF09 \u2500\u2500\n h('div', { style: { padding: '0 14px' } }, [\n error ? h('div', { style: s.error }, String(error)) : null,\n flash ? h('div', { style: flashKind === 'err' ? s.error : s.noticeOk }, flash) : null,\n target && agentPresets.find((p) => p.id === target)?.broken\n ? h('div', { style: s.error }, t('brokenPreset'))\n : null,\n inv?.scopeResolved === false && mode !== 'presets'\n ? h('div', { style: s.noticeWarn }, t('scopeFallback'))\n : null,\n ]),\n // \u2500\u2500 \u4E3B\u4F53\u5206\u680F\uFF08flex row\uFF1A\u5DE6\u680F\u5217\u8868 / \u53F3\u680F\u9884\u89C8\uFF09\u2500\u2500\n // \u9876\u90E8\u9009\u300C\u63D0\u793A\u8BCD\u300D= \u63D0\u793A\u8BCD\u7F16\u8F91 + \u63D0\u793A\u8BCD\u9884\u89C8\uFF1B\u9009\u300C\u5DE5\u5177\u300D= \u5DE5\u5177\u7F16\u8F91 +\n // \u5DE5\u5177\u9884\u89C8\uFF08previewSub \u8DDF\u968F\u6A21\u5F0F\uFF0C\u65E0\u624B\u52A8\u5207\u6362\uFF09\u3002\u9636\u6BB5\u7531\u5934\u90E8\u7EDF\u4E00\u63A7\u5236\u3002\n h('div', { key: 'body', style: s.body },\n mode === 'sections'\n ? [\n h(SectionsPane, { key: 'sections', cfg: view, inv, phases, phase, syncAll, t, poolText, write: edit }),\n h(PreviewPane, { key: 'preview', t, phases, phase, sub: previewSub }),\n ]\n : mode === 'tools'\n ? [\n h(ToolsPane, { key: 'tools', cfg: view, inv, phases, phase, syncAll, t, write: edit }),\n h(PreviewPane, { key: 'preview', t, phases, phase, sub: previewSub }),\n ]\n : [\n h(PresetsPane, {\n key: 'presets',\n cfg: view,\n inv,\n phases,\n t,\n writePatch,\n writeGlobal,\n // \u9ED1\u540D\u5355\u6C38\u8FDC\u662F\u5168\u5C40\u5B57\u6BB5\uFF1A\u53D6\u539F\u59CB\u914D\u7F6E\uFF08\u4E0D\u7ECF editView \u7684\u76EE\u6807\u53E0\u52A0\uFF09\u3002\n envBlocklist: cfg.envBlocklist ?? [],\n }),\n h(SettingsPane, {\n key: 'settings',\n cfg: view,\n inv,\n t,\n writeGlobal,\n saveAsPreset,\n forkSource: target ? (agentPresets.find((p) => p.id === target)?.name ?? target) : undefined,\n onReset: resetAll,\n envBlocklist: cfg.envBlocklist ?? [],\n }),\n ]),\n ])\n}\n", "/**\n * skills/styles \u2014 \u9762\u677F\u5168\u5957\u6837\u5F0F\uFF1Acss \u7C7B\u540D\u8868 + \u6CE8\u5165\u7528\u7684 SHEET + ensureStyles()\u3002\n */\n\n/** ---------------------------------------------------------------- \u6837\u5F0F */\n\nexport const css = {\n entry: 'skm-entry',\n label: 'skm-label',\n // SKILL / MCP \u9876\u5C42 tab + MCP \u5360\u4F4D\n kindTabs: 'skm-kind-tabs',\n kindTab: 'skm-kind-tab',\n kindTabActive: 'skm-kind-tab-active',\n mcpEmpty: 'skm-mcp-empty',\n mcpEmptyIcon: 'skm-mcp-empty-icon',\n mcpEmptyTitle: 'skm-mcp-empty-title',\n mcpEmptyDesc: 'skm-mcp-empty-desc',\n mcpPage: 'skm-mcp-view-root',\n mcpViewRoot: 'skm-mcp-view-root',\n mcpSide: 'skm-mcp-side',\n mcpMain: 'skm-mcp-main',\n mcpServerLayout: 'skm-mcp-server-layout',\n mcpServerMain: 'skm-mcp-server-main',\n mcpHeader: 'skm-mcp-header',\n mcpHeaderText: 'skm-mcp-header-text',\n mcpHeaderTitleRow: 'skm-mcp-header-title-row',\n mcpHeaderTitle: 'skm-mcp-header-title',\n mcpHeaderBadge: 'skm-mcp-header-badge',\n mcpHeaderSub: 'skm-mcp-header-sub',\n mcpHeaderActions: 'skm-mcp-header-actions',\n mcpMarketBtn: 'skm-mcp-market-btn',\n mcpAddBtn: 'skm-mcp-add-btn',\n mcpBellBtn: 'skm-mcp-bell-btn',\n mcpEmptyList: 'skm-mcp-empty-list',\n mcpCopyHint: 'skm-mcp-copy-hint',\n mcpIntroCard: 'skm-mcp-intro-card',\n mcpIntroBody: 'skm-mcp-intro-body',\n mcpIntroTitle: 'skm-mcp-intro-title',\n mcpIntroDesc: 'skm-mcp-intro-desc',\n mcpIntroBtn: 'skm-mcp-intro-btn',\n mcpInfoOverlay: 'skm-mcp-info-overlay',\n mcpInfoOverlayHead: 'skm-mcp-info-overlay-head',\n mcpInfoOverlayIcon: 'skm-mcp-info-overlay-icon',\n mcpInfoOverlayTitle: 'skm-mcp-info-overlay-title',\n mcpInfoOverlayBody: 'skm-mcp-info-overlay-body',\n mcpRow: 'skm-mcp-row',\n mcpRowLogo: 'skm-mcp-row-logo',\n mcpRowBody: 'skm-mcp-row-body',\n mcpRowNameRow: 'skm-mcp-row-name-row',\n mcpRowName: 'skm-mcp-row-name',\n mcpRowTag: 'skm-mcp-row-tag',\n mcpRowExt: 'skm-mcp-row-ext',\n mcpRowDesc: 'skm-mcp-row-desc',\n mcpRowStatus: 'skm-mcp-row-status',\n mcpViewAll: 'skm-mcp-view-all',\n mcpAddSmallBtn: 'skm-mcp-add-small-btn',\n mcpRecommendTitle: 'skm-mcp-recommend-title',\n mcpRecHead: 'skm-mcp-rec-head',\n mcpRecCatsRow: 'skm-mcp-rec-cats-row',\n mcpRecResultsTitle: 'skm-mcp-rec-results-title',\n mcpRecStars: 'skm-mcp-rec-stars',\n mcpOpenLink: 'skm-mcp-open-link',\n mcpRecCardExternal: 'skm-mcp-rec-card-external',\n mcpResolveErr: 'skm-mcp-resolve-err',\n mcpExtActions: 'skm-mcp-ext-actions',\n mcpCardFoot: 'skm-mcp-card-foot',\n mcpCardItem: 'skm-mcp-card-item',\n mcpCardItemLabel: 'skm-mcp-card-item-label',\n mcpCardItemMeta: 'skm-mcp-card-item-meta',\n mcpCardDelete: 'skm-mcp-card-delete',\n mcpToolChips: 'skm-mcp-tool-chips',\n mcpToolChip: 'skm-mcp-tool-chip',\n mcpRecCats: 'skm-mcp-rec-cats',\n mcpRecCat: 'skm-mcp-rec-cat',\n mcpRecCatActive: 'skm-mcp-rec-cat-active',\n mcpRecGrid: 'skm-mcp-rec-grid',\n mcpRecCard: 'skm-mcp-rec-card',\n mcpRecCardHead: 'skm-mcp-rec-card-head',\n mcpRecCardTitleRow: 'skm-mcp-rec-card-title-row',\n mcpRecCardName: 'skm-mcp-rec-card-name',\n mcpRecCardTags: 'skm-mcp-rec-card-tags',\n mcpRecCatTag: 'skm-mcp-rec-cat-tag',\n mcpRecCardDesc: 'skm-mcp-rec-card-desc',\n mcpRecCardFoot: 'skm-mcp-rec-card-foot',\n mcpRecCardMeta: 'skm-mcp-rec-card-meta',\n mcpAddedTag: 'skm-mcp-added-tag',\n mcpAddForm: 'skm-mcp-add-form',\n mcpAddTypeRow: 'skm-mcp-add-type-row',\n mcpAddTypeBtn: 'skm-mcp-add-type-btn',\n mcpAddTypeActive: 'skm-mcp-add-type-active',\n mcpToolSearch: 'skm-mcp-tool-search',\n mcpToolSearchInput: 'skm-mcp-tool-search-input',\n mcpLogRow: 'skm-mcp-log-row',\n mcpLogDot: 'skm-mcp-log-dot',\n mcpLogBody: 'skm-mcp-log-body',\n mcpLogText: 'skm-mcp-log-text',\n mcpLogClear: 'skm-mcp-log-clear',\n mcpConfigGrid: 'skm-mcp-config-grid',\n mcpConfigCard: 'skm-mcp-config-card',\n mcpConfigHead: 'skm-mcp-config-head',\n mcpConfigTitle: 'skm-mcp-config-title',\n mcpConfigCopy: 'skm-mcp-config-copy',\n mcpConfigCode: 'skm-mcp-config-code',\n mcpInfoCol: 'skm-mcp-info-col',\n mcpInfoCard: 'skm-mcp-info-card',\n mcpInfoCardTitle: 'skm-mcp-info-card-title',\n mcpInfoDesc: 'skm-mcp-info-desc',\n mcpInfoPoints: 'skm-mcp-info-points',\n mcpPoint: 'skm-mcp-point',\n mcpPointIcon: 'skm-mcp-point-icon',\n mcpPointBody: 'skm-mcp-point-body',\n mcpPointTitle: 'skm-mcp-point-title',\n mcpPointDesc: 'skm-mcp-point-desc',\n mcpFlow: 'skm-mcp-flow',\n mcpFlowNode: 'skm-mcp-flow-node',\n mcpFlowIcon: 'skm-mcp-flow-icon',\n mcpFlowLabel: 'skm-mcp-flow-label',\n mcpFlowArrow: 'skm-mcp-flow-arrow',\n mcpFlowArrowText: 'skm-mcp-flow-arrow-text',\n mcpFlowExt: 'skm-mcp-flow-ext',\n mcpFlowExtLabel: 'skm-mcp-flow-ext-label',\n mcpFlowExtIcons: 'skm-mcp-flow-ext-icons',\n mcpFlowExtIcon: 'skm-mcp-flow-ext-icon',\n mcpApiText: 'skm-mcp-api-text',\n mcpSteps: 'skm-mcp-steps',\n mcpStep: 'skm-mcp-step',\n mcpStepNum: 'skm-mcp-step-num',\n mcpStepBody: 'skm-mcp-step-body',\n mcpStepTitle: 'skm-mcp-step-title',\n mcpStepDesc: 'skm-mcp-step-desc',\n modal: 'skm-modal',\n modalBody: 'skm-modal-body',\n panel: 'skm-panel',\n topRow: 'skm-top-row',\n newBundleButton: 'skm-new-bundle',\n upload: 'skm-upload',\n uploadActive: 'skm-upload-active',\n hiddenInput: 'skm-hidden-input',\n installForm: 'skm-install-form',\n installRow: 'skm-install-row',\n inlineForm: 'skm-inline-form',\n // \u6280\u80FD\u5305\u5206\u7C7B\uFF1A\u9876\u680F\u80F6\u56CA\u884C / \u5305\u540D\u65C1\u6807\u7B7E / \u5206\u7C7B\u7F16\u8F91\u5668\n stackForm: 'skm-stack-form',\n catChipRow: 'skm-cat-chip-row',\n catChipLabel: 'skm-cat-chip-label',\n catChip: 'skm-cat-chip',\n catChipCount: 'skm-cat-chip-count',\n bundleCats: 'skm-bundle-cats',\n bundleCatTag: 'skm-bundle-cat-tag',\n catEditor: 'skm-cat-editor',\n catEmpty: 'skm-cat-empty',\n catSelected: 'skm-cat-selected',\n catSelectedTag: 'skm-cat-selected-tag',\n catSelectedName: 'skm-cat-selected-name',\n catRemove: 'skm-cat-remove',\n catSuggest: 'skm-cat-suggest',\n catPreset: 'skm-cat-preset',\n catPresetPlus: 'skm-cat-preset-plus',\n catInput: 'skm-cat-input',\n catLimit: 'skm-cat-limit',\n // \u5757\u7EA7\u53D8\u4F53\uFF1A\u6539\u540D\u8F93\u5165\u884C\u72EC\u5360\u4E00\u6574\u884C\uFF08\u6574\u884C\u5185\u5BB9\u4FDD\u7559\uFF0C\u8868\u5355\u8FFD\u52A0\u5728\u5176\u4E0B\u65B9\uFF09\u3002\n inlineFormBlock: 'skm-inline-form-block',\n inlineInput: 'skm-inline-input',\n bundleSelect: 'skm-bundle-select',\n installMeta: 'skm-install-meta',\n installActions: 'skm-install-actions',\n sectionTitle: 'skm-section-title',\n status: 'skm-status',\n failure: 'skm-failure',\n error: 'skm-error',\n bundleList: 'skm-bundle-list',\n bundle: 'skm-bundle',\n bundleRow: 'skm-bundle-row',\n bundleName: 'skm-bundle-name',\n bundleCount: 'skm-bundle-count',\n chevron: 'skm-chevron',\n bundleActions: 'skm-bundle-actions',\n iconAction: 'skm-icon-action',\n skillList: 'skm-skill-list',\n skillItem: 'skm-skill-item',\n skillRow: 'skm-skill-row',\n skillLabel: 'skm-skill-label',\n skillName: 'skm-skill-name',\n skillDescription: 'skm-skill-desc',\n skillExpand: 'skm-skill-expand',\n skillCount: 'skm-skill-count',\n skillCompat: 'skm-skill-compat',\n // \u6280\u80FD\u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\n skillGrid: 'skm-skill-grid',\n skillCard: 'skm-skill-card',\n skillCardHead: 'skm-skill-card-head',\n skillIcon: 'skm-skill-icon',\n skillBadge: 'skm-skill-badge',\n skillTitleWrap: 'skm-skill-title-wrap',\n skillTitle: 'skm-skill-title',\n skillCopy: 'skm-skill-copy',\n skillCardToggle: 'skm-skill-card-toggle',\n skillDesc: 'skm-skill-card-desc',\n skillTags: 'skm-skill-tags',\n tag: 'skm-tag',\n tagSource: 'skm-tag-source',\n tagScope: 'skm-tag-scope',\n skillMeta: 'skm-skill-meta',\n skillCardFoot: 'skm-skill-card-foot',\n skillFootLabel: 'skm-skill-foot-label',\n skillFootIcon: 'skm-skill-foot-icon',\n skillCardActions: 'skm-skill-card-actions',\n // Skills Hub \u9875\u9762\u7ED3\u6784\n hub: 'skm-hub',\n hubRow: 'skm-hub-row',\n hubSide: 'skm-hub-side',\n topbar: 'skm-topbar',\n chipRow: 'skm-chip-row',\n hubBrand: 'skm-hub-brand',\n hubLogo: 'skm-hub-logo',\n hubBrandText: 'skm-hub-brand-text',\n hubBrandTitle: 'skm-hub-brand-title',\n hubBrandSub: 'skm-hub-brand-sub',\n hubGroup: 'skm-hub-group',\n hubItem: 'skm-hub-item',\n hubItemActive: 'skm-hub-item-active',\n hubItemIcon: 'skm-hub-item-icon',\n hubItemLabel: 'skm-hub-item-label',\n hubItemCount: 'skm-hub-item-count',\n // \u5DE6\u680F\uFF1A\u6280\u80FD\u5206\u7C7B / \u5FEB\u6377\u7B5B\u9009 / \u6DFB\u52A0\u6280\u80FD\u5361\n catTitle: 'skm-cat-title',\n catItem: 'skm-cat-item',\n catItemActive: 'skm-cat-item-active',\n catIcon: 'skm-cat-icon',\n catLabel: 'skm-cat-label',\n catCount: 'skm-cat-count',\n filterBlock: 'skm-filter-block',\n filterRow: 'skm-filter-row',\n filterRowLabel: 'skm-filter-row-label',\n filterRowLabelStrong: 'skm-filter-row-label-strong',\n filterRowChevron: 'skm-filter-row-chevron',\n filterRowWrap: 'skm-filter-row-wrap',\n filterMenu: 'skm-filter-menu',\n filterOption: 'skm-filter-option',\n presetDot: 'skm-preset-dot',\n filtersTitle: 'skm-filters-title',\n statusSeg: 'skm-status-seg',\n statusSegBtn: 'skm-status-seg-btn',\n statusSegActive: 'skm-status-seg-active',\n statusSegCount: 'skm-status-seg-count',\n topbarActions: 'skm-topbar-actions',\n healthInline: 'skm-health-inline',\n addCard: 'skm-add-card',\n addCardHead: 'skm-add-card-head',\n addCardIcon: 'skm-add-card-icon',\n addCardTitle: 'skm-add-card-title',\n addCardSub: 'skm-add-card-sub',\n addDrop: 'skm-add-drop',\n addDropIcon: 'skm-add-drop-icon',\n addDropText: 'skm-add-drop-text',\n addDropHint: 'skm-add-drop-hint',\n addBtn: 'skm-add-btn',\n // \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5361\n guideCard: 'skm-guide-card',\n guideTitle: 'skm-guide-title',\n guideDesc: 'skm-guide-desc',\n guideBtn: 'skm-guide-btn',\n guideArt: 'skm-guide-art',\n // \u53F3\u4FA7\u6307\u5357\u680F\n guidePanel: 'skm-guide-panel',\n guidePanelHead: 'skm-guide-panel-head',\n guidePanelLogo: 'skm-guide-panel-logo',\n guidePanelTitle: 'skm-guide-panel-title',\n guidePanelClose: 'skm-guide-panel-close',\n guidePanelBody: 'skm-guide-panel-body',\n guideSec: 'skm-guide-sec',\n guideSecHead: 'skm-guide-sec-head',\n guideSecIcon: 'skm-guide-sec-icon',\n guideSecTitle: 'skm-guide-sec-title',\n guideWhatDesc: 'skm-guide-what-desc',\n guideCaps: 'skm-guide-caps',\n guideCap: 'skm-guide-cap',\n guideCapIcon: 'skm-guide-cap-icon',\n guideCapLabel: 'skm-guide-cap-label',\n guideStep: 'skm-guide-step',\n guideStepNum: 'skm-guide-step-num',\n guideStepBody: 'skm-guide-step-body',\n guideStepTitleRow: 'skm-guide-step-title-row',\n guideStepTitle: 'skm-guide-step-title',\n guideStepArrow: 'skm-guide-step-arrow',\n guideStepDesc: 'skm-guide-step-desc',\n guideFullBtn: 'skm-guide-full-btn',\n guideBest: 'skm-guide-best',\n guideBestTitle: 'skm-guide-best-title',\n guideBestList: 'skm-guide-best-list',\n guideBestItem: 'skm-guide-best-item',\n guideMoreBtn: 'skm-guide-more-btn',\n guideBestArt: 'skm-guide-best-art',\n hubMain: 'skm-hub-main',\n // \u5206\u7EC4\u884C\n bundleRowOuter: 'skm-bundle-row-outer',\n bundleIcon: 'skm-bundle-icon',\n bundleMore: 'skm-bundle-more',\n bundleMoreBtn: 'skm-bundle-more-btn',\n // \u5206\u9875\n pagination: 'skm-pagination',\n pageInfo: 'skm-page-info',\n pageBtns: 'skm-page-btns',\n pageBtn: 'skm-page-btn',\n pageBtnActive: 'skm-page-btn-active',\n pageSizeSel: 'skm-page-size-sel',\n newBundleBtn: 'skm-new-bundle-btn',\n newBundleBtnOpen: 'skm-new-bundle-btn-open',\n toolbar: 'skm-toolbar',\n searchBox: 'skm-search-box',\n searchInput: 'skm-search-input',\n toolSelectWrap: 'skm-tool-select-wrap',\n toolSelect: 'skm-tool-select',\n toolSelectChevron: 'skm-tool-select-chevron',\n dropWrap: 'skm-drop-wrap',\n dropMenu: 'skm-drop-menu',\n dropItem: 'skm-drop-item',\n dropCheck: 'skm-drop-check',\n dropBadge: 'skm-drop-badge',\n toolButton: 'skm-tool-button',\n toolbarSpacer: 'skm-toolbar-spacer',\n bulkOverlay: 'skm-bulk-overlay',\n presetPill: 'skm-preset-pill',\n presetSelect: 'skm-preset-select',\n presetPillChevron: 'skm-preset-pill-chevron',\n presetPillLabel: 'skm-preset-pill-label',\n viewToggle: 'skm-view-toggle',\n viewBtn: 'skm-view-btn',\n hintRow: 'skm-hint-row',\n hintRowText: 'skm-hint-row-text',\n banner: 'skm-banner',\n bannerActive: 'skm-banner-active',\n bannerIcon: 'skm-banner-icon',\n bannerText: 'skm-banner-text',\n bannerTitle: 'skm-banner-title',\n bannerSub: 'skm-banner-sub',\n bannerBtn: 'skm-banner-btn',\n mainScroll: 'skm-main-scroll',\n hubSection: 'skm-hub-section',\n hubSectionHead: 'skm-hub-section-head',\n skillGridList: 'skm-skill-grid-list',\n noResult: 'skm-no-result',\n // \u5F52\u5165\u6280\u80FD\u5305\u5F39\u7A97\uFF08\u5361\u7247\u5316\uFF09\n assignModal: 'skm-assign-modal',\n assignModalBody: 'skm-assign-modal-body',\n assignList: 'skm-assign-list',\n assignCard: 'skm-assign-card',\n assignCardIcon: 'skm-assign-card-icon',\n assignCardBody: 'skm-assign-card-body',\n assignCardName: 'skm-assign-card-name',\n assignCardDesc: 'skm-assign-card-desc',\n assignGo: 'skm-assign-go',\n // \u540C\u6B65\u72B6\u6001\u5065\u5EB7\u68C0\u67E5\n healthNotice: 'skm-health-notice',\n healthNoticeTitle: 'skm-health-notice-title',\n skillFiles: 'skm-skill-files',\n skillFile: 'skm-skill-file',\n skillPreview: 'skm-skill-preview',\n viewerModal: 'skm-viewer-modal',\n viewerBody: 'skm-viewer-body',\n viewerLayout: 'skm-viewer-layout',\n viewerNav: 'skm-viewer-nav',\n viewerNavItem: 'skm-viewer-nav-item',\n viewerNavDir: 'skm-viewer-nav-dir',\n viewerContent: 'skm-viewer-content',\n viewerModalFull: 'skm-viewer-modal-full',\n viewerToolbar: 'skm-viewer-toolbar',\n viewerPath: 'skm-viewer-path',\n viewerToolGroup: 'skm-viewer-tool-group',\n viewerToolBtn: 'skm-viewer-tool-btn',\n viewerToolBtnA1: 'skm-viewer-tool-btn-a1',\n viewerToolBtnA3: 'skm-viewer-tool-btn-a3',\n viewerToolBtnFrame: 'skm-viewer-tool-btn-frame',\n looseEmpty: 'skm-loose-empty',\n visuallyHidden: 'skm-visually-hidden',\n // \u6280\u80FD/\u6280\u80FD\u5305\u5F00\u5173\n toggle: 'skm-toggle',\n toggleOn: 'skm-toggle-on',\n toggleOff: 'skm-toggle-off',\n toggleKnob: 'skm-toggle-knob',\n bundleToggle: 'skm-bundle-toggle',\n // Agent \u9884\u8BBE\u5206\u7C7B\uFF08\u5706\u7403\uFF09\n presetStrip: 'skm-preset-strip',\n presetBallWrap: 'skm-preset-ball-wrap',\n presetBall: 'skm-preset-ball',\n presetBallLabel: 'skm-preset-ball-label',\n presetHint: 'skm-preset-hint',\n presetHintText: 'skm-preset-hint-text',\n presetReset: 'skm-preset-reset',\n // \u7A7A\u6280\u80FD\u5305 / \u5931\u6548\u5F15\u7528 / \u9762\u677F\u7EA7\u63D0\u793A\u6761\n toastStack: 'skm-toast-stack',\n toast: 'skm-toast',\n toastOk: 'skm-toast-ok',\n toastErr: 'skm-toast-err',\n toastDot: 'skm-toast-dot',\n bundleEmpty: 'skm-bundle-empty',\n bundleEmptyTitle: 'skm-bundle-empty-title',\n bundleEmptyHint: 'skm-bundle-empty-hint',\n bundleEmptyBtn: 'skm-bundle-empty-btn',\n bundleMissing: 'skm-bundle-missing',\n bundleMissingBtn: 'skm-bundle-missing-btn',\n installHint: 'skm-install-hint',\n tagStatus: 'skm-tag-status',\n}\n\nexport const STYLE_ID = 'dsh-skill-manager-styles'\nexport const SHEET = `\n.skm-entry{flex:1 1 50%;min-width:0;display:inline-flex;align-items:center;gap:8px;height:32px;box-sizing:border-box;border:none;border-radius:10px;padding:0 8px;background:transparent;cursor:pointer;color:var(--dsw-alias-label-primary,#eee);font-family:inherit;font-size:14px;line-height:20px;overflow:hidden}\n.skm-entry:hover{background:transparent}\n.skm-entry[aria-expanded='true']{background:transparent;color:var(--dsw-alias-label-primary,#eee)}\n.skm-entry:focus,.skm-entry:focus-visible{outline:none;border:none}\n.skm-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-modal-body{overflow:hidden;display:flex;flex-direction:column}\n.skm-panel{flex:1;min-height:0;display:flex;flex-direction:column;gap:8px;overflow-y:auto;padding:2px 2px 6px;box-sizing:border-box}\n.skm-top-row{flex:none;display:flex;align-items:center;justify-content:flex-end;gap:8px}\n.skm-new-bundle{flex:none;display:inline-flex;align-items:center;gap:4px;appearance:none;border:none;border-radius:12px;padding:4px 10px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#999);background:transparent;cursor:pointer}\n.skm-new-bundle:hover,.skm-new-bundle[aria-expanded='true']{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06));color:var(--dsw-alias-label-primary,#eee)}\n.skm-upload{flex:none;display:flex;align-items:center;justify-content:center;gap:8px;min-height:56px;padding:10px 12px;box-sizing:border-box;border:1px dashed var(--dsw-alias-border-l3,#444);border-radius:12px;color:var(--dsw-alias-label-tertiary,#888);font-size:12px;line-height:18px;text-align:center;cursor:pointer;user-select:none}\n.skm-upload:hover{border-color:var(--dsw-alias-state-business-primary,#4a9eff);color:var(--dsw-alias-label-secondary,#bbb)}\n.skm-upload-active{border-color:var(--dsw-alias-state-business-primary,#4a9eff);background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-hidden-input{display:none}\n.skm-install-form{flex:none;display:flex;flex-direction:column;gap:8px;padding:10px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:12px;background:var(--dsw-alias-bg-layer-1,#1c1f26)}\n.skm-install-row{display:flex;flex-direction:column;gap:6px}\n.skm-inline-form{flex:none;display:flex;align-items:center;gap:6px}\n/* \u5757\u7EA7\u53D8\u4F53\uFF1Awidth:100% \u8BA9\u5B83\u5728 .skm-bundle\uFF08flex-wrap\uFF09\u91CC\u81EA\u52A8\u6362\u884C\u72EC\u5360\u4E00\u884C\uFF0C\n \u8F93\u5165\u6846\u56E0\u6B64\u80FD\u5403\u6EE1\u6574\u884C\u5BBD\u5EA6\uFF0C\u4E0D\u5FC5\u88AB\u4E24\u4E2A\u6309\u94AE\u6324\u5230\u53EA\u5269\u9ED8\u8BA4 20 \u5B57\u7B26\u3002 */\n.skm-inline-form-block{width:100%;box-sizing:border-box;padding:0 8px 8px;animation:skm-form-in 160ms ease-out}\n@keyframes skm-form-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n/* \u6539\u540D\u6210\u529F\uFF1A\u5361\u7247\u8FB9\u6846\u9AD8\u4EAE\u8109\u51B2\uFF081 \u79D2\u540E\u56DE\u843D\uFF09\uFF0C\u4E0E\u6574\u4F53\u6DF1\u8272\u5361\u7247\u8282\u594F\u4E00\u81F4 */\n.skm-bundle[data-renamed='true']{animation:skm-card-pop 900ms ease-out}\n@keyframes skm-card-pop{0%{border-color:var(--dsw-alias-state-business-primary,#4a9eff);box-shadow:0 0 0 1px var(--dsw-alias-state-business-primary,#4a9eff)}55%{border-color:var(--dsw-alias-state-business-primary,#4a9eff);box-shadow:0 0 0 1px var(--dsw-alias-state-business-primary,#4a9eff)}100%{border-color:var(--dsw-alias-border-l1,rgba(255,255,255,.08));box-shadow:none}}\n.skm-inline-input{flex:1;min-width:0;height:32px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:8px;padding:0 10px;font-size:13px;color:var(--dsw-alias-label-primary,#eee);background:var(--dsw-alias-bg-base,#0e1116)}\n.skm-inline-input::placeholder{color:var(--dsw-alias-label-tertiary,#888)}\n.skm-bundle-select{display:flex;align-items:center}\n.skm-bundle-select select{flex:1;height:32px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:8px;padding:0 8px;font-size:13px;color:var(--dsw-alias-label-primary,#eee);background:var(--dsw-alias-bg-base,#0e1116)}\n.skm-install-meta{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-install-actions{display:flex;align-items:center;gap:6px}\n.skm-section-title{margin:6px 2px 0;font-size:12px;font-weight:600;line-height:18px;color:var(--dsw-alias-label-secondary,#bbb)}\n.skm-status{margin:2px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-failure{display:flex;align-items:center;gap:8px}\n.skm-failure p{margin:2px;font-size:13px;line-height:20px;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-error{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-bundle-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}\n/* \u5206\u7EC4\u884C\uFF08\u53C2\u8003\u8BBE\u8BA1\u7A3F\uFF09\uFF1A\u767D\u5E95\u5706\u89D2\u884C\uFF0C\u84DD\u6587\u4EF6\u5939\u56FE\u6807 + \u540D\u79F0 + \u8BA1\u6570 pill + chevron + \u66F4\u591A */\n.skm-bundle-row-outer{flex:none;display:flex;align-items:center;gap:6px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:11px;background:var(--dsw-alias-bg-base,#fff);padding:2px 6px 2px 10px;min-height:40px;transition:border-color 160ms ease,box-shadow 160ms ease,background 160ms ease}\n.skm-bundle-row-outer:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.14));box-shadow:0 2px 8px rgba(16,24,40,.06)}\n.skm-bundle-row{flex:1;min-width:0;display:inline-flex;align-items:center;gap:10px;appearance:none;border:none;background:transparent;padding:6px 2px;font-size:14px;cursor:pointer;color:var(--dsw-alias-label-primary,#1f2430);font-family:inherit;border-radius:8px;text-align:left;transition:background 140ms ease}\n.skm-bundle-row:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.02))}\n.skm-bundle-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-bundle-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600;display:inline-flex;align-items:center;gap:6px}\n.skm-bundle-count{flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b);background:var(--dsw-alias-bg-module-platform,#f1f3f5);border-radius:999px;padding:0 8px;white-space:nowrap}\n/* \u2500\u2500 \u6280\u80FD\u5305\u5206\u7C7B\uFF1A\u9876\u680F\u80F6\u56CA\u7B5B\u9009 / \u5305\u540D\u65C1\u6807\u7B7E / \u5206\u7C7B\u7F16\u8F91\u5668 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n/* \u914D\u8272\u53EA\u8D70\u4E3B\u9898\u84DD\u4E00\u628A\u5237\u5B50\uFF08\u4E0E .skm-tag \u540C\u8BED\u8A00\uFF09\uFF1B\u5206\u7C7B\u540D\u4E0D\u53C2\u4E0E\u914D\u8272\u2014\u2014\n \u5F69\u8679\u8272\u677F\u5B9E\u6D4B\u89C6\u89C9\u592A\u5435\uFF0C\u4E0E\u9762\u677F\u5176\u4F59\u90E8\u5206\u6253\u67B6\uFF0C\u5DF2\u5426\u3002 */\n.skm-stack-form{display:flex;flex-direction:column;gap:10px}\n.skm-cat-chip-row{flex:1 1 100%;order:3;display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding-top:2px;animation:skm-cat-row-in 220ms cubic-bezier(.2,.8,.2,1) both}\n@keyframes skm-cat-row-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}\n.skm-cat-chip-label{flex:none;font-size:11.5px;line-height:18px;letter-spacing:.02em;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-cat-chip{flex:none;display:inline-flex;align-items:center;gap:5px;height:26px;box-sizing:border-box;padding:0 9px;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-family:inherit;font-size:12px;line-height:18px;cursor:pointer;transition:color 150ms ease,border-color 150ms ease,background 150ms ease,box-shadow 200ms ease,transform 120ms ease}\n.skm-cat-chip:hover{border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 52%,transparent);color:var(--dsw-alias-label-primary,#1f2430);transform:translateY(-1px)}\n.skm-cat-chip:active{transform:translateY(0) scale(.97)}\n.skm-cat-chip[data-active]{border-color:transparent;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 15%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-weight:600;box-shadow:0 0 0 1px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 36%,transparent),0 2px 10px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 20%,transparent)}\n.skm-cat-chip-count{flex:none;min-width:16px;padding:0 5px;box-sizing:border-box;border-radius:999px;background:var(--dsw-alias-bg-module-platform,rgba(0,0,0,.05));color:var(--dsw-alias-label-tertiary,#81858c);font-size:10.5px;line-height:16px;font-variant-numeric:tabular-nums;transition:background 160ms ease,color 160ms ease}\n.skm-cat-chip[data-active] .skm-cat-chip-count{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n/* \u5305\u540D\u65C1\u6807\u7B7E\uFF1A\u6574\u9897\u53EF\u70B9\uFF08\u70B9\u5728\u6807\u9898\u884C\u91CC\uFF0C\u7531 JS \u5206\u6D41\u6210\u7B5B\u9009\u800C\u975E\u5C55\u5F00\uFF09\uFF0C\u5E26\u5165\u573A\u5F39\u5165\u3002 */\n.skm-bundle-cats{flex:none;display:inline-flex;align-items:center;gap:4px;flex-wrap:wrap;min-width:0}\n.skm-bundle-cat-tag{display:inline-flex;align-items:center;gap:4px;height:19px;box-sizing:border-box;padding:0 7px;border-radius:999px;font-size:11px;line-height:17px;white-space:nowrap;cursor:pointer;color:var(--dsw-alias-state-business-primary,#3d6be5);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 11%,transparent);border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent);animation:skm-cat-tag-in 200ms cubic-bezier(.2,.9,.3,1.1) both;transition:background 150ms ease,border-color 150ms ease,transform 120ms ease,box-shadow 180ms ease}\n.skm-bundle-cat-tag:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 20%,transparent);border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 45%,transparent);transform:translateY(-1px);box-shadow:0 2px 7px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent)}\n.skm-bundle-cat-tag[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:transparent;color:#fff;box-shadow:0 2px 9px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 40%,transparent)}\n@keyframes skm-cat-tag-in{from{opacity:0;transform:translateY(3px) scale(.94)}to{opacity:1;transform:none}}\n/* \u5206\u7C7B\u7F16\u8F91\u5668 */\n.skm-cat-editor{display:flex;flex-direction:column;gap:8px;box-sizing:border-box;width:100%}\n.skm-cat-empty{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-cat-selected{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:5px}\n.skm-cat-selected-tag{display:inline-flex;align-items:center;gap:5px;height:24px;box-sizing:border-box;padding:0 4px 0 9px;border-radius:999px;font-size:12px;line-height:20px;color:var(--dsw-alias-state-business-primary,#3d6be5);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 26%,transparent);animation:skm-cat-tag-in 200ms cubic-bezier(.2,.9,.3,1.1) both}\n.skm-cat-selected-name{white-space:nowrap}\n.skm-cat-remove{flex:none;display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;padding:0;border:none;border-radius:50%;background:transparent;color:inherit;cursor:pointer;opacity:.6;transition:opacity 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-cat-remove:hover{opacity:1;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 22%,transparent)}\n.skm-cat-remove:active{transform:scale(.9)}\n.skm-cat-suggest{display:flex;flex-wrap:wrap;gap:4px}\n.skm-cat-preset{display:inline-flex;align-items:center;gap:3px;height:23px;box-sizing:border-box;padding:0 8px;border:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.16));border-radius:999px;background:transparent;color:var(--dsw-alias-label-secondary,#61666b);font-family:inherit;font-size:11.5px;line-height:19px;cursor:pointer;transition:color 140ms ease,border-color 140ms ease,background 140ms ease,transform 120ms ease}\n.skm-cat-preset:hover:not(:disabled){color:var(--dsw-alias-state-business-primary,#3d6be5);border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 55%,transparent);border-style:solid;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 9%,transparent);transform:translateY(-1px)}\n.skm-cat-preset:active:not(:disabled){transform:translateY(0) scale(.96)}\n.skm-cat-preset:disabled{opacity:.4;cursor:default}\n.skm-cat-preset-plus{font-size:13px;line-height:16px;opacity:.7}\n.skm-cat-input{box-sizing:border-box;width:100%;height:32px;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:9px;padding:0 10px;font-family:inherit;font-size:12.5px;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430);background:var(--dsw-alias-bg-base,#fff);transition:border-color 150ms ease,box-shadow 150ms ease}\n.skm-cat-input:focus,.skm-cat-input:focus-visible{outline:none;border-color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 0 0 3px rgba(61,107,229,.12)}\n.skm-cat-limit{margin:0;font-size:11.5px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n\n.skm-chevron{flex:none;margin-left:auto;color:var(--dsw-alias-label-caption,#adb2b8);transition:transform 120ms}\n.skm-bundle-row-outer[data-open='true'] .skm-chevron{transform:rotate(180deg)}\n.skm-bundle-more{flex:none;display:flex;align-items:center}\n.skm-bundle-more-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:8px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-caption,#adb2b8);transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-bundle-more-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-bundle-more-btn:active{transform:scale(.9)}\n.skm-bundle-actions{margin-left:auto;display:flex;align-items:center;gap:2px;padding-right:2px}\n.skm-icon-action{flex:none;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;border-radius:50%;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-tertiary,#888);transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-icon-action:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05));color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-icon-action:active{transform:scale(.9)}\n\n/* \u2500\u2500 \u6280\u80FD\u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\uFF1A\u53CC\u5217\u7F51\u683C\uFF1B\u5217\u8868\u89C6\u56FE\u5207\u5355\u5217\u5BBD\u5361 \u2500\u2500 */\n.skm-skill-grid{list-style:none;margin:8px 0 0;padding:0;width:100%;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;box-sizing:border-box}\n.skm-skill-grid-list{grid-template-columns:minmax(0,1fr)}\n.skm-skill-grid > .skm-status{grid-column:1/-1;padding-top:4px}\n.skm-skill-card{position:relative;min-width:0;display:flex;flex-direction:column;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:16px;background:var(--dsw-alias-bg-base,#fff);padding:14px 16px 0;overflow:hidden;opacity:0;animation:skm-card-in 260ms cubic-bezier(.2,.7,.3,1.06) forwards;animation-delay:calc(var(--skm-i,0)*40ms);transition:border-color 160ms ease,box-shadow 160ms ease,transform 160ms ease}\n.skm-skill-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));box-shadow:0 3px 14px rgba(16,24,40,.08);transform:translateY(-1px)}\n@keyframes skm-card-in{from{opacity:0;transform:translateY(8px) scale(.99)}to{opacity:1;transform:translateY(0) scale(1)}}\n.skm-skill-card-head{display:flex;align-items:center;gap:10px;min-width:0}\n.skm-skill-icon{flex:none;width:42px;height:42px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:12px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b);transition:color 160ms ease,border-color 160ms ease,transform 160ms ease}\n.skm-skill-badge{flex:none;display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:7px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:10.5px;font-weight:700;letter-spacing:.2px}\n.skm-skill-title-wrap{flex:1;min-width:0;display:flex;align-items:center;gap:6px}\n.skm-skill-title{flex:1;min-width:0;appearance:none;border:none;background:transparent;padding:0;text-align:left;font-family:inherit;font-size:15px;font-weight:600;line-height:22px;color:var(--dsw-alias-label-primary,#0f1115);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;border-radius:6px;transition:color 140ms ease}\n.skm-skill-title:hover{color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-skill-title:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4176e6);outline-offset:1px}\n.skm-skill-copy{flex:none;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;border-radius:6px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-caption,#adb2b8);opacity:.55;transition:opacity 140ms ease,color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-skill-copy:hover{opacity:1;color:var(--dsw-alias-label-secondary,#61666b);background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));transform:scale(1.08)}\n.skm-skill-copy:active{transform:scale(.9)}\n.skm-skill-copy[data-copied='true']{opacity:1;color:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-skill-card-toggle{flex:none;display:inline-flex;align-items:center}\n.skm-skill-card-desc{margin:8px 0 0;appearance:none;border:none;background:transparent;padding:0;text-align:left;font-family:inherit;font-size:13px;line-height:19px;color:var(--dsw-alias-label-tertiary,#81858c);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;min-height:38px;cursor:pointer;transition:color 140ms ease}\n.skm-skill-card-desc:hover{color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-skill-tags{display:flex;align-items:center;gap:8px;margin-top:12px;min-width:0}\n.skm-tag{flex:none;display:inline-flex;align-items:center;height:22px;padding:0 10px;border-radius:999px;font-size:12px;line-height:20px;box-sizing:border-box;white-space:nowrap;transition:color 160ms ease,border-color 160ms ease,background 160ms ease}\n.skm-tag-source{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-tag-scope{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-tag-scope[data-off='true']{border-color:var(--dsw-alias-border-l2,rgba(0,0,0,.12));color:var(--dsw-alias-label-tertiary,#81858c)}\n/* \u5173\u6389\u7684\u6280\u80FD\u7559\u5728\u5217\u8868\u91CC\uFF0C\u4F46\u8981\u4E00\u773C\u770B\u51FA\u662F\u5173\u7684\uFF1A\u5DE6\u4FA7\u72B6\u6001\u6761 + \u6807\u9898\u964D\u9971\u548C\uFF08\u5E26\u8FC7\u6E21\uFF09 */\n.skm-skill-card::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:transparent;transition:background 220ms ease}\n.skm-skill-card[data-off='true']{background:var(--dsw-alias-bg-layer-1,rgba(0,0,0,.02))}\n.skm-skill-card[data-off='true']::before{background:var(--dsw-alias-border-l3,rgba(0,0,0,.2))}\n.skm-skill-card[data-off='true'] .skm-skill-badge,.skm-skill-card[data-off='true'] .skm-skill-title{color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-skill-card[data-off='true'] .skm-skill-card-desc{color:var(--dsw-alias-label-quaternary,#a5aab2)}\n.skm-skill-badge,.skm-skill-title{transition:color 220ms ease}\n.skm-tag-status{background:transparent;border:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.18));color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-skill-meta{margin-left:auto;flex:none;font-size:12px;line-height:17px;color:var(--dsw-alias-label-caption,#adb2b8);white-space:nowrap}\n.skm-skill-card-foot{display:flex;align-items:center;gap:6px;margin:12px -16px 0;padding:8px 14px 8px 16px;border-top:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.06))}\n.skm-skill-foot-label{flex:none;font-size:12px;line-height:17px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-skill-foot-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;border-radius:8px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-secondary,#61666b);transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-skill-foot-icon:hover{background:var(--dsw-alias-interactive-bg-hover-solid,#f1f3f5);color:var(--dsw-alias-label-primary,#0f1115);transform:scale(1.05)}\n.skm-skill-foot-icon:active{transform:scale(.92)}\n.skm-skill-foot-icon:disabled{opacity:.38;cursor:default}\n.skm-skill-foot-icon:disabled:hover{background:transparent;color:var(--dsw-alias-label-secondary,#61666b);transform:none}\n.skm-skill-foot-icon-danger:hover{background:#fdebeb;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-skill-card-actions{margin-left:auto;display:flex;align-items:center;gap:4px}\n\n/* \u2500\u2500 Skills Hub \u9875\u9762\u9AA8\u67B6\uFF1A\u5DE6\u680F\uFF08\u5206\u7C7B/\u7B5B\u9009/\u6DFB\u52A0\uFF09 / \u7EDF\u8BA1\u884C / \u5DE5\u5177\u680F / tabs / \u5206\u7EC4 / \u5361\u7247 \u2500\u2500 */\n.skm-hub{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;min-width:0;background:var(--dsw-alias-bg-base,#fff)}\n.skm-topbar{flex:none;display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 16px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05));background:var(--dsw-alias-bg-base,#fff)}\n.skm-topbar[data-drop]{outline:2px dashed var(--dsw-alias-state-business-primary,#3d6be5);outline-offset:-2px}\n.skm-chip-row{flex:1 1 auto;min-width:200px;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\n.skm-topbar .skm-cat-item{flex:none;width:auto}\n.skm-topbar .skm-new-bundle-btn{flex:none;width:auto;margin-top:0;height:32px;font-size:12px}\n/* SKILL / MCP \u9876\u5C42 tab\uFF08\u7D27\u8D34\u6807\u9898\u6587\u5B57\u53F3\u4FA7\uFF09 */\n.skm-kind-tabs{flex:none;display:inline-flex;align-items:center;gap:4px;padding:2px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:999px;background:var(--dsw-alias-bg-module-platform,#f2f4f7)}\n.skm-kind-tab{flex:none;display:inline-flex;align-items:center;justify-content:center;height:24px;box-sizing:border-box;border:none;border-radius:999px;background:transparent;padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-kind-tab:hover{color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-kind-tab:active{transform:scale(.96)}\n.skm-kind-tab[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 1px 5px rgba(61,107,229,.3)}\n/* MCP \u89C6\u56FE\u6839\uFF1A\u5DE6\u4FA7\u7AD6\u6392\u83DC\u5355\uFF08\u540C\u6280\u80FD\u5DE6\u680F\u98CE\u683C\uFF09+ \u5185\u5BB9\u533A */\n.skm-mcp-view-root{flex:1;min-height:0;display:flex;min-width:0;overflow-y:auto;padding:14px 20px 22px 0}\n.skm-mcp-side{flex:none;width:216px;box-sizing:border-box;padding:4px 12px 0 20px;border-right:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05));display:flex;flex-direction:column;gap:2px}\n.skm-mcp-main{flex:1;min-width:0;padding:0 4px 0 18px;display:flex;flex-direction:column}\n.skm-mcp-tabs{flex:none;display:flex;align-items:center;gap:10px}\n.skm-mcp-tab{flex:none;display:inline-flex;align-items:center;justify-content:center;height:34px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 18px;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-tab:hover{color:var(--dsw-alias-label-primary,#1f2430);border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16))}\n.skm-mcp-tab:active{transform:scale(.97)}\n.skm-mcp-tab[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 2px 8px rgba(61,107,229,.3)}\n/* MCP Server \u9875\uFF1A\u5DE6\u4E3B\u5217 + \u53F3\u4FE1\u606F\u5217 */\n.skm-mcp-server-layout{flex:none;display:flex;align-items:flex-start;gap:18px;min-width:0}\n/* MCP \u9875\u4E3B\u5BB9\u5668 = \u6EDA\u52A8\u5BB9\u5668\uFF1A\u5361\u7247\u591A\u4E86/\u5DE5\u5177\u591A\u4E86\u90FD\u80FD\u6EDA\u5230\u5E95\uFF08\u7236\u5C42 .skm-hub-main \u662F overflow:hidden\uFF09\u3002 */\n.skm-mcp-server-main{flex:1 1 auto;min-width:0;min-height:0;display:flex;flex-direction:column;gap:16px;overflow-y:auto;overflow-x:hidden;padding-right:6px;scrollbar-gutter:stable}\n/* \u56FE\u4E00\uFF1A\u5934\u90E8 */\n.skm-mcp-header{flex:none;display:flex;align-items:flex-start;justify-content:space-between;gap:14px}\n.skm-mcp-header-text{min-width:0;display:flex;flex-direction:column;gap:5px}\n.skm-mcp-header-title-row{display:flex;align-items:center;gap:10px}\n.skm-mcp-header-title{font-size:20px;font-weight:700;line-height:26px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-header-badge{flex:none;display:inline-flex;align-items:center;height:20px;padding:0 9px;border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:10.5px;font-weight:600;line-height:14px}\n.skm-mcp-header-sub{font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-mcp-header-actions{flex:none;display:inline-flex;align-items:center;gap:8px}\n.skm-mcp-market-btn{flex:none;display:inline-flex;align-items:center;height:34px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;font-size:13px;line-height:18px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:border-color 140ms ease,color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-mcp-market-btn:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.18));color:var(--dsw-alias-label-primary,#1f2430);background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.02))}\n.skm-mcp-market-btn:active{transform:scale(.98)}\n.skm-mcp-add-btn{flex:none;display:inline-flex;align-items:center;height:34px;box-sizing:border-box;border:none;border-radius:10px;background:var(--dsw-alias-state-business-primary,#3d6be5);padding:0 14px;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;color:#fff;cursor:pointer;box-shadow:0 2px 8px rgba(61,107,229,.3);transition:background 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-add-btn:hover{background:#3059cf;box-shadow:0 3px 12px rgba(61,107,229,.4);transform:translateY(-1px)}\n.skm-mcp-add-btn:active{transform:translateY(0) scale(.98)}\n.skm-mcp-bell-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border:none;border-radius:10px;background:transparent;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-mcp-bell-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-bell-btn:active{transform:scale(.94)}\n.skm-mcp-copy-hint{flex:none;margin:0;padding:8px 12px;border-radius:10px;background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#2fb344) 10%,transparent);color:var(--dsw-alias-state-success-primary,#2fb344);font-size:12px;line-height:17px}\n/* \u7EDF\u8BA1\u5361\uFF08\u590D\u7528\u6280\u80FD\u7EDF\u8BA1\u5361\u6837\u5F0F\uFF0C\u53BB\u6389\u5217\u8868\u9875\u5185\u8FB9\u8DDD\uFF09 */\n/* \u56FE\u4E8C\uFF1A\u5217\u8868\u5361 */\n/* MCP \u5FEB\u901F\u4E86\u89E3\u5F15\u5BFC\u5361\uFF08\u5DE6\u680F\u5E95\u90E8\uFF0C\u70B9\u51FB\u53F3\u4FA7\u60AC\u6D6E\uFF1B\u540C\u6280\u80FD\u6307\u5357\u5361\u6837\u5F0F\uFF09 */\n.skm-mcp-intro-card{flex:none;display:flex;flex-direction:column;gap:5px;margin-top:auto;box-sizing:border-box;border:1px solid #e4e9f8;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#f3f7ff);padding:14px;cursor:pointer;box-shadow:0 1px 2px rgba(16,24,40,.03);transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-intro-card:hover{border-color:#cdd9f7;box-shadow:0 4px 14px rgba(61,107,229,.08)}\n.skm-mcp-intro-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-intro-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-mcp-intro-btn{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:5px;margin-top:4px;height:28px;box-sizing:border-box;border:none;border-radius:999px;background:var(--dsw-alias-state-business-primary,#3d6be5);padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:#fff;cursor:pointer;box-shadow:0 2px 6px rgba(61,107,229,.3);transition:background 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-mcp-intro-btn:hover{background:#3059cf;box-shadow:0 3px 10px rgba(61,107,229,.38);transform:translateY(-1px)}\n.skm-mcp-intro-btn:active{transform:translateY(0) scale(.97)}\n/* MCP \u89E3\u91CA\u60AC\u6D6E\u5C42\uFF08\u540C\u6280\u80FD\u6307\u5357\u6D6E\u5C42\uFF09 */\n.skm-mcp-info-overlay{position:fixed;z-index:1001;width:330px;max-height:calc(100vh - 24px);box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:16px;background:var(--dsw-alias-bg-base,#fff);box-shadow:0 12px 40px rgba(16,24,40,.16);display:flex;flex-direction:column;overflow:hidden;animation:skm-guide-in 240ms cubic-bezier(.2,.7,.3,1.06) both}\n.skm-mcp-info-overlay-head{flex:none;display:flex;align-items:center;gap:8px;padding:12px 12px 10px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-mcp-info-overlay-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-info-overlay-title{flex:1;min-width:0;font-size:15px;font-weight:700;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-info-overlay-body{flex:1;min-height:0;overflow-y:auto;padding:12px 14px 20px;display:flex;flex-direction:column;gap:12px}\n.skm-mcp-row{display:flex;align-items:center;gap:10px;padding:10px 4px;border-top:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-mcp-row:first-child{border-top:none}\n.skm-mcp-row-logo{flex:none;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-row-logo[data-kind='slack']{background:#fff}\n.skm-mcp-row-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.skm-mcp-row-name-row{display:flex;align-items:center;gap:7px;min-width:0}\n.skm-mcp-row-name{font-size:13px;font-weight:600;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-row-tag{flex:none;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;font-size:10px;line-height:14px;background:#f1f3f5;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-row-tag[data-official]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-row-ext{flex:none;display:inline-flex;border:none;background:transparent;padding:2px;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:color 140ms ease}\n.skm-mcp-row-ext:hover{color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-row-desc{font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-row-status{flex:none;display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:999px;font-size:11px;line-height:16px;background:#f0f4ee;color:#2f9e44}\n.skm-mcp-row-status[data-on]{background:#e7f6ec}\n.skm-mcp-row-status:not([data-on]){background:#f2f3f5;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-mcp-view-all{flex:none;align-self:center;display:inline-flex;align-items:center;gap:5px;margin-top:8px;border:none;background:transparent;padding:6px 10px;font-size:12px;line-height:17px;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;font-family:inherit;transition:color 140ms ease}\n.skm-mcp-view-all:hover{color:#3059cf}\n/* \u63A8\u8350\u884C\u300C\u6DFB\u52A0\u300D\u5C0F\u6309\u94AE */\n.skm-mcp-add-small-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:26px;box-sizing:border-box;border:1px solid #bccff5;border-radius:999px;background:#f4f8ff;padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;transition:background 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-add-small-btn:hover{border-color:#9db6ef;background:#e9f1ff}\n.skm-mcp-add-small-btn:active{transform:scale(.96)}\n/* \u63A8\u8350 MCP Server \u6807\u9898 */\n.skm-mcp-recommend-title{flex:none;font-size:15px;font-weight:700;line-height:21px;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n/* \u63A8\u8350\u533A\uFF1A\u6807\u9898\u884C + \u5206\u7C7B pills + \u5361\u7247\u7F51\u683C */\n.skm-mcp-rec-head{flex:none;display:flex;align-items:center;justify-content:space-between;gap:12px}\n.skm-mcp-rec-cats-row{flex:none;display:flex;align-items:center}\n.skm-mcp-rec-results-title{flex:none;font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-rec-stars{flex:none;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;background:var(--dsw-alias-bg-module-platform,#f1f3f5);color:var(--dsw-alias-label-secondary,#61666b);font-size:10.5px;line-height:16px}\n.skm-mcp-open-link{flex:none;display:inline-flex;align-items:center;gap:4px;height:26px;box-sizing:border-box;border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 30%,transparent);border-radius:999px;background:transparent;padding:0 11px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-state-business-primary,#3d6be5);text-decoration:none;cursor:pointer;transition:background 140ms ease,transform 140ms ease}\n.skm-mcp-open-link:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 10%,transparent)}\n.skm-mcp-open-link:active{transform:scale(.96)}\n.skm-mcp-rec-card-external{border-style:dashed}\n.skm-mcp-resolve-err{flex:none;margin:0;font-size:11px;line-height:16px;color:var(--dsw-alias-state-warn-primary,#e0851c)}\n.skm-mcp-ext-actions{flex:none;display:inline-flex;align-items:center;gap:6px}\n/* MCP Server \u5361\uFF1A\u81EA\u542F\u52A8/\u542F\u7528 \u8BBE\u7F6E\u884C */\n.skm-mcp-card-foot{flex:none;display:flex;align-items:center;gap:12px;margin-top:auto;padding-top:8px;border-top:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-mcp-card-item{flex:none;display:inline-flex;align-items:center;gap:6px}\n.skm-mcp-card-item-label{font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-card-item-meta{flex:none;margin-left:auto;font-size:11px;line-height:16px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-card-item-meta[data-on]{color:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-mcp-card-delete{flex:none;margin-left:auto;display:inline-flex;align-items:center;gap:4px;height:26px;box-sizing:border-box;border:1px solid transparent;border-radius:8px;background:transparent;padding:0 8px;font:inherit;font-size:11.5px;font-weight:600;line-height:1;font-family:inherit;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-card-delete:hover{background:#fdebeb;border-color:#f3c4c4;color:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-mcp-card-delete:active{transform:scale(.94)}\n.skm-mcp-card-delete:disabled{opacity:.5;cursor:default;transform:none}\n.skm-mcp-rec-cats{flex:none;display:inline-flex;align-items:center;gap:6px}\n.skm-mcp-rec-cat{flex:none;display:inline-flex;align-items:center;justify-content:center;height:28px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;font-size:12px;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-rec-cat:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-rec-cat:active{transform:scale(.96)}\n.skm-mcp-rec-cat[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff}\n.skm-mcp-rec-grid{flex:none;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}\n.skm-mcp-rec-card{flex:none;min-width:0;display:flex;flex-direction:column;gap:9px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:14px;background:var(--dsw-alias-bg-base,#fff);padding:14px 16px;box-shadow:0 1px 2px rgba(16,24,40,.03);opacity:0;animation:skm-card-in 260ms cubic-bezier(.2,.7,.3,1.06) forwards;transition:border-color 160ms ease,box-shadow 160ms ease,transform 160ms ease}\n.skm-mcp-rec-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.13));box-shadow:0 4px 14px rgba(16,24,40,.08);transform:translateY(-1px)}\n.skm-mcp-rec-card-head{display:flex;align-items:center;gap:10px;min-width:0}\n.skm-mcp-rec-card-title-row{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.skm-mcp-rec-card-name{font-size:14px;font-weight:600;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-rec-card-tags{display:flex;align-items:center;gap:6px}\n.skm-mcp-rec-cat-tag{flex:none;display:inline-flex;align-items:center;height:18px;padding:0 7px;border-radius:999px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:10px;line-height:14px}\n.skm-mcp-rec-cat-tag[data-off]{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary,#f5a524) 16%,transparent);color:var(--dsw-alias-state-warn-label,#b26b00)}\n.skm-mcp-rec-cat-tag[data-shadow]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 10%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);border:1px dashed color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 40%,transparent)}\n.skm-mcp-rec-cat-tag[data-locked]{background:var(--dsw-alias-bg-module-platform,#f1f3f5);color:var(--dsw-alias-label-tertiary,#81858c);border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08))}\n.skm-mcp-tool-chip[data-locked]{text-decoration:line-through}\n.skm-mcp-tool-chips{display:flex;flex-wrap:wrap;gap:4px;margin:6px 0 8px;max-height:132px;overflow-y:auto}\n.skm-mcp-tool-chip[data-locked]{opacity:.5;cursor:not-allowed;text-decoration:line-through}\n.skm-mcp-tool-chip{font:inherit;font-size:11px;line-height:16px;padding:1px 7px;border-radius:999px;cursor:pointer;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));background:var(--dsw-alias-bg-module-platform,#f1f3f5);color:var(--dsw-alias-label-tertiary,#81858c);transition:background .12s,color .12s,border-color .12s}\n.skm-mcp-tool-chip[data-on]{background:color-mix(in srgb,var(--dsw-alias-state-success-primary,#2ba471) 12%,transparent);border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary,#2ba471) 34%,transparent);color:var(--dsw-alias-state-success-primary,#2ba471)}\n.skm-mcp-tool-chip:hover:not(:disabled){border-color:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 50%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-tool-chip:disabled{opacity:.55;cursor:default}\n.skm-mcp-tool-chip[data-busy]{opacity:.35}\n.skm-mcp-rec-card-desc{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;min-height:36px}\n.skm-mcp-rec-card-foot{display:flex;align-items:center;gap:8px;margin-top:auto;padding-top:6px}\n.skm-mcp-rec-card-meta{flex:1;min-width:0;font-size:11px;line-height:16px;color:var(--dsw-alias-label-caption,#adb2b8);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-mcp-added-tag{flex:none;display:inline-flex;align-items:center;gap:4px;height:26px;box-sizing:border-box;border:1px solid #b7e0c3;border-radius:999px;background:#e7f6ec;padding:0 10px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:#2f9e44;cursor:pointer;transition:background 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-added-tag:hover{border-color:#93cfa6;background:#d9f0e1}\n.skm-mcp-added-tag:active{transform:scale(.96)}\n/* \u6DFB\u52A0 MCP Server \u8868\u5355 */\n.skm-mcp-add-form{display:flex;flex-direction:column;gap:8px}\n.skm-mcp-add-type-row{display:flex;align-items:center;gap:6px}\n.skm-mcp-add-type-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:28px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;font-size:12px;font-weight:600;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,transform 140ms ease}\n.skm-mcp-add-type-btn:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-add-type-btn:active{transform:scale(.96)}\n.skm-mcp-add-type-btn[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff}\n/* \u5DE5\u5177\u5217\u8868\u641C\u7D22\u6846 */\n.skm-mcp-tool-search{flex:none;display:flex;align-items:center;gap:8px;height:32px;width:260px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:0 10px;color:var(--dsw-alias-label-caption,#adb2b8);transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-mcp-tool-search:focus-within{border-color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 0 0 3px color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 14%,transparent)}\n.skm-mcp-tool-search-input{flex:1;min-width:0;border:none;outline:none;background:transparent;font-size:12.5px;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430);font-family:inherit}\n.skm-mcp-tool-search-input::placeholder{color:var(--dsw-alias-label-caption,#adb2b8)}\n/* \u8FDE\u63A5\u65E5\u5FD7\u884C */\n.skm-mcp-log-row{display:flex;align-items:center;gap:10px;padding:9px 4px;border-top:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-mcp-log-row:first-child{border-top:none}\n.skm-mcp-log-dot{flex:none;width:9px;height:9px;border-radius:50%;background:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-log-dot[data-kind='enable']{background:#2fb26b}\n.skm-mcp-log-dot[data-kind='disable']{background:var(--dsw-alias-state-warn-primary,#e8a33d)}\n.skm-mcp-log-dot[data-kind='remove']{background:var(--dsw-alias-state-error-primary,#e0434b)}\n.skm-mcp-log-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}\n.skm-mcp-log-text{font-size:12.5px;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-log-text strong{font-weight:600}\n.skm-mcp-log-clear{flex:none;display:inline-flex;align-items:center;height:28px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:999px;background:transparent;padding:0 12px;font-size:12px;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;transition:border-color 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-mcp-log-clear:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.18));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-log-clear:active{transform:scale(.96)}\n/* \u914D\u7F6E\u6A21\u677F\u5361 */\n.skm-mcp-config-grid{flex:none;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}\n.skm-mcp-config-card{flex:none;min-width:0;display:flex;flex-direction:column;gap:10px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:14px;background:var(--dsw-alias-bg-base,#fff);padding:12px 14px;box-shadow:0 1px 2px rgba(16,24,40,.03);transition:border-color 160ms ease,box-shadow 160ms ease}\n.skm-mcp-config-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.13));box-shadow:0 3px 10px rgba(16,24,40,.07)}\n.skm-mcp-config-head{display:flex;align-items:center;justify-content:space-between;gap:8px}\n.skm-mcp-config-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-config-copy{flex:none;display:inline-flex;align-items:center;height:24px;box-sizing:border-box;border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 30%,transparent);border-radius:999px;background:transparent;padding:0 10px;font-size:11px;line-height:16px;font-family:inherit;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-mcp-config-copy:hover{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 10%,transparent)}\n.skm-mcp-config-copy:active{transform:scale(.96)}\n.skm-mcp-config-code{flex:none;margin:0;padding:10px 12px;border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;line-height:17px;overflow:auto}\n/* \u56FE\u4E09\uFF1A\u53F3\u4FA7\u4FE1\u606F\u680F */\n.skm-mcp-info-col{flex:none;width:322px;display:flex;flex-direction:column;gap:12px}\n.skm-mcp-info-card{flex:none;display:flex;flex-direction:column;gap:9px;box-sizing:border-box;border:1px solid #dfe8fa;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#f1f5ff);padding:14px}\n.skm-mcp-info-card-title{font-size:14px;font-weight:700;line-height:20px;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-info-desc{margin:0;font-size:12px;line-height:19px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-info-points{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}\n.skm-mcp-point{display:flex;gap:8px;align-items:flex-start}\n.skm-mcp-point-icon{flex:none;width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;background:#e7effe;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-point-body{min-width:0;display:flex;flex-direction:column;gap:1px}\n.skm-mcp-point-title{font-size:12px;font-weight:600;line-height:17px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-point-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n/* \u5DE5\u4F5C\u539F\u7406\u6D41\u7A0B */\n.skm-mcp-flow{flex:none;display:flex;align-items:center;gap:4px}\n.skm-mcp-flow-node{flex:none;width:64px;display:inline-flex;flex-direction:column;align-items:center;gap:4px}\n.skm-mcp-flow-icon{flex:none;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;background:#e7effe;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-mcp-flow-icon[data-client]{background:#dbebfd;color:#2276d2}\n.skm-mcp-flow-icon[data-server]{background:#eae8fa;color:#6b46e5}\n.skm-mcp-flow-label{font-size:10px;line-height:14px;color:var(--dsw-alias-label-secondary,#61666b);white-space:nowrap}\n.skm-mcp-flow-arrow{flex:1;min-width:0;display:inline-flex;flex-direction:column;align-items:center;gap:2px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-flow-arrow-text{font-size:9px;line-height:12px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-flow-ext{flex:none;display:flex;flex-direction:column;gap:6px;padding-top:6px;border-top:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.1))}\n.skm-mcp-flow-ext-label{font-size:10px;line-height:14px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-mcp-flow-ext-icons{display:flex;gap:8px}\n.skm-mcp-flow-ext-icon{flex:none;width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.07));border-radius:8px;background:#fff;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-mcp-api-text{font-size:9px;font-weight:700;color:var(--dsw-alias-state-business-primary,#3d6be5)}\n/* \u5FEB\u901F\u4E0A\u624B */\n.skm-mcp-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}\n.skm-mcp-step{display:flex;gap:8px;align-items:flex-start}\n.skm-mcp-step-num{flex:none;width:22px;height:22px;border-radius:50%;background:#e7effe;color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:12px;font-weight:700;line-height:22px;text-align:center}\n.skm-mcp-step-body{min-width:0;display:flex;flex-direction:column;gap:1px}\n.skm-mcp-step-title{font-size:12px;font-weight:600;line-height:17px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-step-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n/* MCP \u7A7A\u6001\uFF08\u5DE5\u5177\u5217\u8868/\u8FDE\u63A5\u65E5\u5FD7/\u914D\u7F6E\u6A21\u677F\u5360\u4F4D\uFF09 */\n.skm-mcp-empty{flex:1;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:40px}\n.skm-mcp-empty-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:64px;height:64px;border-radius:18px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 4px 12px rgba(61,107,229,.1)}\n.skm-mcp-empty-title{font-size:16px;font-weight:700;line-height:22px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-mcp-empty-desc{font-size:13px;line-height:19px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-hub-row{flex:1;min-height:0;min-width:0;display:flex}\n/* \u53F3\u4FA7\u6307\u5357\u6D6E\u5C42\u5361\uFF08\u70B9\u51FB\u300C\u5F00\u59CB\u5B66\u4E60\u300D\u51FA\u73B0\uFF0C\u8D34\u9762\u677F\u53F3\u7F18\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF09 */\n.skm-guide-panel{position:fixed;z-index:1001;width:300px;max-height:calc(100vh - 24px);box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:16px;background:var(--dsw-alias-bg-base,#fff);box-shadow:0 12px 40px rgba(16,24,40,.16);display:flex;flex-direction:column;overflow:hidden;animation:skm-guide-in 240ms cubic-bezier(.2,.7,.3,1.06) both}\n@keyframes skm-guide-in{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:translateX(0)}}\n.skm-guide-panel-head{flex:none;display:flex;align-items:center;gap:8px;padding:12px 12px 10px;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05))}\n.skm-guide-panel-logo{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-guide-panel-title{flex:1;min-width:0;font-size:15px;font-weight:700;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-panel-close{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-guide-panel-close:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-panel-close:active{transform:scale(.9)}\n.skm-guide-panel-body{flex:1;min-height:0;overflow-y:auto;padding:12px 14px 20px;display:flex;flex-direction:column;gap:14px}\n.skm-guide-sec{flex:none;display:flex;flex-direction:column;gap:8px}\n.skm-guide-sec-head{display:flex;align-items:center;gap:7px}\n.skm-guide-sec-icon{flex:none;display:inline-flex;width:22px;height:22px;align-items:center;justify-content:center;border-radius:7px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-guide-sec-title{font-size:14px;font-weight:700;line-height:20px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-what-desc{margin:0;font-size:12px;line-height:19px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-guide-caps{display:flex;flex-wrap:wrap;gap:6px 10px}\n.skm-guide-cap{flex:none;display:inline-flex;align-items:center;gap:4px}\n.skm-guide-cap-icon{flex:none;display:inline-flex;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-guide-cap-label{font-size:10px;line-height:14px;color:var(--dsw-alias-label-tertiary,#81858c);white-space:nowrap}\n.skm-guide-step{display:flex;gap:8px;padding:2px 0}\n.skm-guide-step-num{flex:none;width:22px;height:22px;border-radius:50%;background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;font-size:12px;font-weight:700;line-height:22px;text-align:center}\n.skm-guide-step-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}\n.skm-guide-step-title-row{display:flex;align-items:center;gap:6px}\n.skm-guide-step-title{font-size:13px;font-weight:600;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-step-arrow{margin-left:auto;flex:none;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-guide-step-desc{margin:0;font-size:11px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-guide-full-btn{flex:none;align-self:stretch;display:inline-flex;align-items:center;justify-content:center;gap:6px;margin-top:6px;height:32px;box-sizing:border-box;border:1px solid #bccff5;border-radius:999px;background:#f4f8ff;color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:12px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;transition:background 140ms ease,border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-guide-full-btn:hover{border-color:#9db6ef;background:#e9f1ff;box-shadow:0 2px 8px rgba(61,107,229,.1)}\n.skm-guide-full-btn:active{transform:scale(.98)}\n.skm-guide-best{flex:none;display:flex;flex-direction:column;gap:8px;box-sizing:border-box;border:1px solid #dbe6fb;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#eef4ff);padding:12px 12px 0;overflow:hidden;position:relative}\n.skm-guide-best-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-best-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}\n.skm-guide-best-item{display:flex;align-items:center;gap:7px;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-guide-best-item svg{flex:none;color:#2fb26b}\n.skm-guide-more-btn{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:5px;border:none;background:transparent;padding:2px 0;font-size:11px;line-height:16px;color:var(--dsw-alias-state-business-primary,#3d6be5);cursor:pointer;font-family:inherit;transition:color 140ms ease}\n.skm-guide-more-btn:hover{color:#3059cf}\n.skm-guide-best-art{flex:none;display:inline-flex;align-items:flex-end;justify-content:center;margin:2px -12px 0;transform:scale(.8);transform-origin:bottom right;pointer-events:none}\n.skm-hub-side{flex:none;width:216px;box-sizing:border-box;padding:16px 14px 16px 16px;border-right:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.05));background:var(--dsw-alias-bg-base,#fff);overflow-y:auto;display:flex;flex-direction:column;gap:2px}\n.skm-cat-title{flex:none;margin:0 6px 10px;font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-cat-list{flex:none;display:flex;flex-direction:column;gap:4px;max-height:190px;overflow-y:auto;padding-right:2px;box-sizing:border-box;--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2,rgba(0,0,0,.18));--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2,rgba(0,0,0,.3))}\n.skm-cat-item{flex:none;display:flex;align-items:center;gap:10px;width:100%;box-sizing:border-box;border:1px solid transparent;border-radius:10px;padding:8px 10px;background:transparent;cursor:pointer;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);transition:background 140ms ease,border-color 140ms ease,color 140ms ease,box-shadow 140ms ease}\n.skm-cat-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.03));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-cat-item[data-active]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);border-color:rgba(61,107,229,.10);color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-cat-icon{flex:none;display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;color:var(--dsw-alias-label-caption,#adb2b8);transition:color 140ms ease}\n.skm-cat-icon[data-active]{color:var(--dsw-alias-state-business-primary,#3d6be5)}\n.skm-cat-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;font-size:13px;font-weight:500;line-height:18px}\n.skm-cat-item[data-active] .skm-cat-label{font-weight:600}\n.skm-cat-count{flex:none;font-size:12px;line-height:16px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-cat-item[data-active] .skm-cat-count{color:var(--dsw-alias-state-business-primary,#5b82e5)}\n.skm-cat-count[data-warn]{color:#e0851c;font-weight:600}\n.skm-filters-title{flex:none;margin:18px 6px 8px;font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-filter-block{flex:none;display:flex;flex-direction:column;gap:8px}\n/* \u542F\u7528\u72B6\u6001\uFF1A\u5E73\u94FA\u4E09\u6863\u5206\u6BB5\u6309\u94AE */\n.skm-status-seg{flex:none;display:flex;align-items:center;gap:6px;padding:0 2px}\n.skm-status-seg-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:30px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:999px;background:var(--dsw-alias-bg-base,#fff);padding:0 10px;font-size:12px;line-height:17px;font-family:inherit;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;white-space:nowrap;transition:background 140ms ease,color 140ms ease,border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-status-seg-btn:hover{color:var(--dsw-alias-label-primary,#1f2430);border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16))}\n.skm-status-seg-btn:active{transform:scale(.96)}\n.skm-status-seg-btn[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 2px 6px rgba(61,107,229,.28)}\n.skm-filter-row-wrap{position:relative;flex:none}\n.skm-filter-row{flex:none;display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;height:34px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:9px;background:var(--dsw-alias-bg-base,#fff);padding:0 10px;font-family:inherit;cursor:pointer;transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-filter-row:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16))}\n.skm-filter-row[aria-expanded='true']{border-color:var(--dsw-alias-state-business-primary,var(--dsw-alias-state-business-primary,#3d6be5));box-shadow:0 0 0 2px rgba(61,107,229,.12)}\n.skm-filter-row-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;font-size:12px;line-height:17px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-filter-row-label-strong{font-weight:600;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-filter-row-chevron{flex:none;color:var(--dsw-alias-label-caption,#adb2b8);transition:transform 140ms ease}\n.skm-filter-row-chevron[data-open]{transform:rotate(180deg)}\n.skm-filter-menu{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:60;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:0 8px 22px rgba(16,24,40,.12);padding:4px;display:flex;flex-direction:column;gap:2px;animation:skm-form-in 140ms ease-out}\n.skm-filter-option{display:flex;align-items:center;gap:8px;width:100%;border:none;border-radius:8px;padding:7px 10px;background:transparent;font-size:13px;line-height:18px;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;font-family:inherit;text-align:left;white-space:nowrap;transition:background 120ms ease,color 120ms ease}\n.skm-filter-option:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-preset-dot{flex:none;justify-content:center;width:8px;height:8px;border-radius:50%;background:transparent;margin-left:auto}\n.skm-preset-dot[data-on]{background:var(--dsw-alias-state-business-primary,#e0851c)}\n/* \u65B0\u5EFA\u6280\u80FD\u5305\u6309\u94AE\uFF08\u5DE6\u680F\uFF0C\u6DFB\u52A0\u6280\u80FD\u5361\u4E0A\u65B9\uFF09 */\n.skm-new-bundle-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;gap:6px;height:34px;width:100%;box-sizing:border-box;margin-top:18px;border:1px solid #c7d6f7;border-radius:10px;background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent);color:var(--dsw-alias-state-business-primary,#3d6be5);font-size:13px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;transition:background 140ms ease,border-color 140ms ease,color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-new-bundle-btn:hover{border-color:#9db6ef;background:#e3ecff;box-shadow:0 2px 8px rgba(61,107,229,.12)}\n.skm-new-bundle-btn:active{transform:scale(.98)}\n.skm-new-bundle-btn-open{border-color:var(--dsw-alias-state-business-primary,#3d6be5);background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;box-shadow:0 2px 8px rgba(61,107,229,.3)}\n.skm-new-bundle-btn-open:hover{background:#3059cf;border-color:#3059cf;color:#fff}\n/* \u6DFB\u52A0\u6280\u80FD\u5361 */\n.skm-add-card{flex:none;display:flex;flex-direction:column;gap:8px;margin-top:18px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:14px;background:var(--dsw-alias-bg-base,#fff);padding:12px;cursor:pointer;box-shadow:0 1px 2px rgba(16,24,40,.04);transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-add-card:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.14));box-shadow:0 4px 14px rgba(16,24,40,.08)}\n.skm-add-card-active{border-color:var(--dsw-alias-state-business-primary,#3d6be5);box-shadow:0 0 0 2px rgba(61,107,229,.14)}\n.skm-add-card-head{display:flex;align-items:center;gap:8px}\n.skm-add-card-icon{flex:none;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;color:var(--dsw-alias-state-business-primary,#3d6be5);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#3d6be5) 12%,transparent)}\n.skm-add-card-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-add-card-sub{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-add-drop{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;border:1px dashed var(--dsw-alias-border-l3,rgba(0,0,0,.18));border-radius:10px;padding:12px 8px;color:var(--dsw-alias-label-tertiary,#81858c);background:var(--dsw-alias-bg-module-platform,#fafbfc);transition:border-color 140ms ease,background 140ms ease}\n.skm-add-card:hover .skm-add-drop{border-color:rgba(61,107,229,.4);background:#f5f8ff}\n.skm-add-drop-icon{flex:none;display:inline-flex}\n.skm-add-drop-text{font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-add-drop-hint{font-size:10px;line-height:14px;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-add-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;height:32px;box-sizing:border-box;border:none;border-radius:9px;background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;box-shadow:0 1px 3px rgba(61,107,229,.35);transition:background 140ms ease,transform 140ms ease,box-shadow 140ms ease}\n.skm-add-btn:hover{background:#3059cf;box-shadow:0 2px 8px rgba(61,107,229,.4);transform:translateY(-1px)}\n.skm-add-btn:active{transform:translateY(0) scale(.98)}\n/* \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5361\uFF08\u6DFB\u52A0\u6280\u80FD\u5361\u4E0B\u65B9\uFF09 */\n.skm-guide-card{flex:none;display:flex;flex-direction:column;gap:5px;margin-top:18px;box-sizing:border-box;border:1px solid #e4e9f8;border-radius:14px;background:var(--dsw-alias-bg-module-platform,#f3f7ff);padding:14px;overflow:hidden;position:relative;box-shadow:0 1px 2px rgba(16,24,40,.03);transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-guide-card:hover{border-color:#cdd9f7;box-shadow:0 4px 14px rgba(61,107,229,.08)}\n.skm-guide-title{font-size:13px;font-weight:700;line-height:18px;color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-guide-desc{font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-guide-btn{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:5px;margin-top:4px;height:28px;box-sizing:border-box;border:none;border-radius:999px;background:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff;font-size:12px;font-weight:600;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;box-shadow:0 2px 6px rgba(61,107,229,.3);transition:background 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-guide-btn:hover{background:#3059cf;box-shadow:0 3px 10px rgba(61,107,229,.38);transform:translateY(-1px)}\n.skm-guide-btn:active{transform:translateY(0) scale(.97)}\n.skm-guide-art{flex:none;display:inline-flex;align-items:flex-end;justify-content:center;margin:8px -14px 0;padding-top:6px;background:linear-gradient(180deg,rgba(61,107,229,.06),rgba(61,107,229,.14))}\n.skm-guide-modal-text{margin:0;font-size:13px;line-height:22px;color:var(--dsw-alias-label-secondary,#4a4f5a)}\n.skm-hub-main{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden}\n.skm-health-notice{flex:none;margin:8px 16px 0;box-sizing:border-box;border:1px solid #f0cf9e;border-radius:10px;background:#fdf6e3;padding:8px 12px;display:flex;flex-direction:column;gap:4px;animation:skm-form-in 180ms ease-out}\n.skm-health-notice-title{font-size:12px;font-weight:700;line-height:17px;color:#b45309}\n.skm-health-notice ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px}\n.skm-health-notice li{font-size:12px;line-height:17px;color:#8a5a17}\n.skm-toolbar{flex:none;display:flex;align-items:center;gap:8px;padding:12px 16px 4px;flex-wrap:wrap}\n.skm-search-box{flex:1;min-width:170px;display:flex;align-items:center;gap:8px;height:36px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:0 12px;color:var(--dsw-alias-label-caption,#adb2b8);transition:border-color 140ms ease,box-shadow 140ms ease}\n.skm-search-box:focus-within{border-color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:0 0 0 3px rgba(65,118,230,.14)}\n.skm-search-input{flex:1;min-width:0;border:none;outline:none;background:transparent;font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary,#0f1115);font-family:inherit}\n.skm-search-input::placeholder{color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-tool-select-wrap{position:relative;flex:none;display:inline-flex;align-items:center}\n.skm-tool-select{appearance:none;-webkit-appearance:none;height:36px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-size:13px;line-height:18px;font-family:inherit;padding:0 26px 0 12px;cursor:pointer;transition:border-color 140ms ease,background 140ms ease}\n.skm-tool-select:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.18))}\n.skm-tool-select:focus-visible{outline:none;border-color:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-tool-select-chevron{position:absolute;right:9px;pointer-events:none;color:var(--dsw-alias-label-caption,#adb2b8)}\n.skm-tool-button{flex:none;display:inline-flex;align-items:center;gap:6px;height:36px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-size:13px;line-height:18px;font-family:inherit;padding:0 12px;cursor:pointer;transition:border-color 140ms ease,background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-tool-button:hover{background:var(--dsw-alias-interactive-bg-hover-solid,#f7f8f9);color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-tool-button:active{transform:scale(.97)}\n.skm-tool-button:disabled{opacity:.5;cursor:default}\n.skm-toolbar-spacer{flex:1 1 12px}\n.skm-bulk-overlay{position:fixed;inset:0;z-index:995;border:none;background:transparent;cursor:default;padding:0}\n.skm-preset-pill{position:relative;flex:none;display:inline-flex;align-items:center;gap:6px;height:36px;box-sizing:border-box;border:1px solid #c9d6f5;border-radius:10px;background:#eef3fd;color:#3b62d6;padding:0 10px;font-family:inherit;font-size:13px;line-height:18px;cursor:pointer;transition:border-color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-preset-pill:active{transform:scale(.97)}\n.skm-preset-pill-label{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-preset-select{appearance:none;-webkit-appearance:none;border:none;outline:none;background:transparent;color:inherit;font-size:13px;line-height:18px;font-family:inherit;padding:0 18px 0 0;cursor:pointer;max-width:150px}\n.skm-preset-pill-chevron{pointer-events:none;color:#6f8cd6;transition:transform 140ms ease}\n.skm-preset-pill[aria-expanded='true'] .skm-preset-pill-chevron{transform:rotate(180deg)}\n.skm-drop-wrap{position:relative;flex:none}\n.skm-drop-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:996;min-width:180px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:0 6px 20px rgba(16,24,40,.12);padding:4px;display:flex;flex-direction:column;gap:2px;animation:skm-form-in 140ms ease-out;max-height:320px;overflow-y:auto}\n.skm-drop-item{display:flex;align-items:center;gap:8px;border:none;border-radius:8px;padding:7px 10px;background:transparent;font-size:13px;line-height:18px;color:var(--dsw-alias-label-secondary,#61666b);cursor:pointer;font-family:inherit;text-align:left;white-space:nowrap;transition:background 120ms ease,color 120ms ease}\n.skm-drop-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-drop-item[aria-checked='true']{color:var(--dsw-alias-label-primary,#0f1115);font-weight:600}\n.skm-drop-check{flex:none;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;color:var(--dsw-alias-state-business-primary,#4176e6);opacity:0;transform:scale(.6);transition:opacity 140ms ease,transform 140ms ease}\n.skm-drop-check[data-on]{opacity:1;transform:scale(1)}\n.skm-drop-badge{margin-left:auto;flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#61666b);background:var(--dsw-alias-bg-module-platform,#f1f3f5);border-radius:999px;padding:0 8px}\n.skm-view-toggle{flex:none;display:inline-flex;align-items:center;gap:2px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.12));border-radius:10px;background:var(--dsw-alias-bg-base,#fff);padding:3px;transition:border-color 140ms ease}\n.skm-view-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;width:30px;height:28px;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-caption,#adb2b8);cursor:pointer;transition:background 140ms ease,color 140ms ease,transform 140ms ease}\n.skm-view-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-view-btn[data-active]{background:var(--dsw-alias-bg-module-platform,#eef0f2);color:var(--dsw-alias-label-primary,#0f1115)}\n.skm-view-btn:active{transform:scale(.94)}\n.skm-hint-row{flex:none;display:flex;align-items:center;gap:10px;padding:6px 16px 0}\n.skm-hint-row-text{flex:1;min-width:0;font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-banner{flex:none;display:flex;align-items:center;gap:12px;margin:10px 16px 0;box-sizing:border-box;border:1px solid #f2df9e;border-radius:14px;background:#fdf8e3;padding:10px 12px;cursor:pointer;transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-banner:hover{border-color:#ecd58a;box-shadow:0 2px 8px rgba(232,163,61,.12)}\n.skm-banner:active{transform:scale(.995)}\n.skm-banner-active{border-color:#e8a33d;box-shadow:0 0 0 3px rgba(232,163,61,.18)}\n.skm-banner-icon{flex:none;width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;border:1.5px solid #e8a33d;color:#e8a33d;background:transparent}\n.skm-banner-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.skm-banner-title{font-size:14px;font-weight:700;line-height:20px;color:#1f2937}\n.skm-banner-sub{font-size:12px;line-height:17px;color:#6b7280;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-banner-btn{flex:none;display:inline-flex;align-items:center;height:32px;box-sizing:border-box;border:none;border-radius:10px;background:#e8850c;color:#fff;font-size:13px;font-weight:600;line-height:18px;font-family:inherit;padding:0 14px;cursor:pointer;box-shadow:0 1px 3px rgba(232,133,12,.35);transition:background 140ms ease,transform 140ms ease,box-shadow 140ms ease}\n.skm-banner-btn:hover{background:#d67906;box-shadow:0 2px 8px rgba(232,133,12,.4);transform:translateY(-1px)}\n.skm-banner-btn:active{transform:translateY(0) scale(.98)}\n.skm-main-scroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;box-sizing:border-box;padding:12px 16px 20px;display:flex;flex-direction:column;gap:12px;scrollbar-gutter:stable}\n.skm-hub-section{min-width:0;width:100%;box-sizing:border-box}\n/* \u5C55\u5F00/\u6298\u53E0\u6052\u4E3A\u6574\u884C\u5BBD\uFF1A\u65E7\u89C4\u5219\u53EA\u8BA9 data-open \u7684 section \u8DE8\u4E24\u5217\uFF0C\u6536\u8D77\u65F6\u4F1A\u7F29\u6210\u534A\u5BBD\u3002 */\n.skm-hub-section{display:flex;flex-direction:column;min-width:0}\n.skm-hub-section-head{display:flex;align-items:center;gap:8px;min-width:0;padding:2px 4px 0}\n.skm-no-result{padding:18px 4px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-tertiary,#81858c)}\n/* \u65B0\u5EFA\u6280\u80FD\u5305\u5165\u53E3\uFF08\u7070\u5B57\u6309\u94AE\u884C\uFF09 */\n.skm-new-bundle-line{flex:none;align-self:flex-start;display:inline-flex;align-items:center;gap:4px;border:none;border-radius:8px;padding:6px 10px;margin:2px 0 0 4px;background:transparent;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c);cursor:pointer;font-family:inherit;transition:background 140ms ease,color 140ms ease}\n.skm-new-bundle-line:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.04));color:var(--dsw-alias-label-secondary,#61666b)}\n/* \u5206\u9875\u884C */\n.skm-pagination{flex:none;display:flex;align-items:center;gap:10px;padding:4px 4px 0}\n.skm-page-info{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-page-btns{flex:1;display:flex;align-items:center;gap:4px}\n.skm-page-btn{flex:none;min-width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));border-radius:8px;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-secondary,#61666b);font-size:12px;line-height:18px;font-family:inherit;cursor:pointer;transition:border-color 140ms ease,color 140ms ease,background 140ms ease,transform 140ms ease}\n.skm-page-btn:hover{border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.16));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-page-btn:active{transform:scale(.94)}\n.skm-page-btn:disabled{opacity:.45;cursor:default}\n.skm-page-btn[data-active]{background:var(--dsw-alias-state-business-primary,#3d6be5);border-color:var(--dsw-alias-state-business-primary,#3d6be5);color:#fff}\n.skm-page-size-sel{font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#61666b)}\n\n/* \u2500\u2500 \u5F52\u5165\u6280\u80FD\u5305\u5F39\u7A97\uFF08\u5361\u7247\u5316\uFF0C\u4E0E\u6280\u80FD\u5361\u7247\u540C\u8BED\u8A00\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.skm-assign-modal{width:min(560px,calc(100vw - 48px))}\n.skm-assign-modal-body{overflow:hidden;display:flex;flex-direction:column;max-height:min(560px,calc(100vh - 180px))}\n.skm-assign-list{list-style:none;margin:0;padding:4px 2px 2px;display:flex;flex-direction:column;gap:8px;overflow-y:auto}\n.skm-assign-card{display:flex;align-items:center;gap:10px;width:100%;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.08));border-radius:12px;background:var(--dsw-alias-bg-base,#fff);padding:10px 12px;cursor:pointer;font-family:inherit;text-align:left;opacity:0;animation:skm-card-in 240ms cubic-bezier(.2,.7,.3,1.06) forwards;animation-delay:calc(var(--skm-i,0)*45ms);transition:border-color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-assign-card:hover{border-color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:0 2px 8px rgba(16,24,40,.07);transform:translateY(-1px)}\n.skm-assign-card:active{transform:translateY(0) scale(.99)}\n.skm-assign-card-icon{flex:none;width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.08));border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7);color:var(--dsw-alias-label-secondary,#61666b);transition:color 140ms ease,border-color 140ms ease}\n.skm-assign-card:hover .skm-assign-card-icon{color:var(--dsw-alias-label-primary,#0f1115);border-color:var(--dsw-alias-border-l3,rgba(0,0,0,.14))}\n.skm-assign-card-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n.skm-assign-card-name{font-size:14px;font-weight:600;line-height:20px;color:var(--dsw-alias-label-primary,#0f1115);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-assign-card-desc{font-size:12px;line-height:17px;color:var(--dsw-alias-label-tertiary,#81858c)}\n.skm-assign-go{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;color:var(--dsw-alias-label-caption,#adb2b8);transform:rotate(-90deg);transition:transform 160ms ease,background 140ms ease,color 140ms ease}\n.skm-assign-card:hover .skm-assign-go{transform:rotate(-90deg) translateX(2px);color:var(--dsw-alias-state-business-primary,#4176e6);background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.03))}\n.skm-skill-list{list-style:none;margin:0;padding:2px 6px 6px;width:100%;display:flex;flex-direction:column;gap:2px}\n.skm-skill-item{display:flex;flex-direction:column;gap:2px;padding:2px 0;border-radius:8px}\n.skm-skill-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-row{display:flex;align-items:center;gap:6px;padding:2px 6px;border-radius:8px}\n.skm-skill-row:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-label{flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden}\n.skm-skill-name{font-size:13px;line-height:18px;color:var(--dsw-alias-label-primary,#eee);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-skill-desc{font-size:12px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.skm-skill-expand{flex:none;display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;border-radius:6px;padding:0;background:transparent;cursor:pointer;color:var(--dsw-alias-label-tertiary,#888);transition:transform 120ms}\n.skm-skill-expand:hover{color:var(--dsw-alias-label-primary,#eee);background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-expand[data-open='true']{transform:rotate(180deg)}\n.skm-skill-count{flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888);background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:8px;padding:0 6px;white-space:nowrap}\n.skm-skill-compat{flex:none;font-size:11px;line-height:16px;color:var(--dsw-alias-label-tertiary,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:170px}\n.skm-skill-files{list-style:none;margin:0 0 2px 10px;padding:2px 0 2px 10px;border-left:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.1));display:flex;flex-direction:column;gap:0}\n.skm-skill-file{display:flex;align-items:center;gap:6px;padding:2px 6px;border-radius:6px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#bbb);font-family:ui-monospace,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.skm-skill-file:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-skill-file[data-main='true']{color:var(--dsw-alias-label-primary,#eee);font-weight:500}\n.skm-skill-dir{color:var(--dsw-alias-label-tertiary,#888)}\n.skm-skill-preview{border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:10px;background:var(--dsw-alias-bg-base,#0e1116);padding:8px 12px;margin:0 0 2px 10px;font-size:12px;line-height:20px;color:var(--dsw-alias-label-primary,#eee);overflow:auto;max-height:280px;box-sizing:border-box}\n.skm-skill-preview h3,.skm-skill-preview h4,.skm-skill-preview h5{margin:10px 0 4px;font-size:13px;line-height:20px;color:var(--dsw-alias-label-primary,#eee)}\n.skm-skill-preview p{margin:4px 0}\n.skm-skill-preview pre{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:8px;padding:8px 10px;overflow:auto;font-family:ui-monospace,monospace;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,#bbb);margin:6px 0}\n.skm-skill-preview code{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:4px;padding:0 4px;font-family:ui-monospace,monospace;font-size:11px}\n.skm-skill-preview a{color:var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-skill-preview ul{margin:4px 0;padding-left:18px}\n.skm-skill-preview li{margin:2px 0}\n/* \u67E5\u770B\u5668\u9ED8\u8BA4\u5C31\u662F\u5927\u753B\u5E45\uFF081280\u00D7880 \u4E0A\u9650\uFF0C\u968F\u89C6\u53E3\u6536\u7F29\uFF09\uFF0C\u53EF\u4E00\u952E\u5168\u5C4F\uFF1B\u5BBD/\u9AD8\u5E26\u7F13\u52A8\u8FC7\u6E21\u3002 */\n.skm-viewer-modal{width:min(1280px,calc(100vw - 64px));animation:skm-viewer-in 260ms cubic-bezier(.2,.7,.3,1.06);transition:width 320ms cubic-bezier(.22,.72,.24,1)}\n.skm-viewer-modal-full{width:calc(100vw - 48px)}\n@keyframes skm-viewer-in{from{opacity:0;transform:translateY(12px) scale(.985)}to{opacity:1;transform:none}}\n.skm-viewer-body{overflow:hidden;display:flex;flex-direction:column;height:min(880px,calc(100vh - 96px));transition:height 320ms cubic-bezier(.22,.72,.24,1);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2)}\n/* \u5B98\u65B9 Modal \u7684 root \u81EA\u5E26 24px \u5185\u8FB9\u8DDD\u3001dialog \u81EA\u5E26 24px \u4E0B\u5185\u8FB9\u8DDD\uFF1A\n \u5168\u5C4F\u6863\u6309\u8FD9\u4E24\u5904\u7559\u767D\u6536\uFF0C\u514D\u5F97\u88AB flex-shrink \u622A\u65AD\u6216\u4E0A\u4E0B\u6EA2\u51FA\u3002 */\n.skm-viewer-modal-full .skm-viewer-body{height:calc(100vh - 76px)}\n/* \u5F39\u7A97\u5934\u90E8\uFF08\u5B98\u65B9 Modal \u7684 header \u662F\u672C\u5BB9\u5668\u7B2C\u4E00\u4E2A div\uFF09\uFF1A\u968F\u5927\u753B\u5E45\u653E\u5927\u4E00\u6863\u3002 */\n.skm-viewer-body > div:first-child{padding:20px 18px 0 26px}\n.skm-viewer-body > div:first-child h2{font-size:17px;line-height:26px;font-weight:600}\n.skm-viewer-body > div:nth-of-type(2){flex:1;min-height:0;display:flex;flex-direction:column;margin-top:2px;padding:0 20px 20px}\n.skm-viewer-toolbar{flex:none;display:flex;align-items:center;gap:10px;padding:0 2px 12px}\n.skm-viewer-path{flex:1;min-width:0;display:flex;align-items:center;gap:8px;font-size:12.5px;line-height:18px;font-family:ui-monospace,monospace;color:var(--dsw-alias-label-tertiary,#888);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.skm-viewer-path b{font-weight:600;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-viewer-tool-group{flex:none;display:inline-flex;align-items:center;gap:2px;padding:2px;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.08));border-radius:10px;background:var(--dsw-alias-bg-module-platform,#f5f6f7)}\n.skm-viewer-tool-btn{flex:none;display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:26px;padding:0 7px;box-sizing:border-box;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary,#61666b);font-family:inherit;font-weight:600;line-height:16px;cursor:pointer;transition:background 140ms ease,color 140ms ease,box-shadow 140ms ease,transform 140ms ease}\n.skm-viewer-tool-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05));color:var(--dsw-alias-label-primary,#1f2430)}\n.skm-viewer-tool-btn:active{transform:scale(.93)}\n.skm-viewer-tool-btn[data-active='true']{background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:0 1px 3px rgba(16,24,40,.12)}\n.skm-viewer-tool-btn-a1{font-size:11px}\n.skm-viewer-tool-btn-a3{font-size:15px}\n.skm-viewer-tool-btn-frame{border:1px solid var(--dsw-alias-border-l1,rgba(0,0,0,.1));border-radius:10px;background:var(--dsw-alias-bg-base,#fff)}\n.skm-viewer-tool-btn-frame[data-active='true']{border-color:var(--dsw-alias-state-business-primary,#4176e6);background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4176e6) 10%,transparent);color:var(--dsw-alias-state-business-primary,#4176e6);box-shadow:none}\n.skm-viewer-layout{flex:1;min-height:0;display:flex;border:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));border-radius:14px;overflow:hidden}\n.skm-viewer-nav{flex:none;width:252px;border-right:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));overflow-y:auto;padding:8px;box-sizing:border-box;background:var(--dsw-alias-bg-module-platform,#f5f6f7)}\n.skm-viewer-nav-item{display:flex;align-items:center;gap:6px;padding:5px 9px;border-radius:8px;font-size:12.5px;line-height:20px;color:var(--dsw-alias-label-secondary,#bbb);font-family:ui-monospace,monospace;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:background 140ms ease,color 140ms ease,box-shadow 160ms ease}\n.skm-viewer-nav-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.skm-viewer-nav-item[data-active='true']{background:color-mix(in srgb,var(--dsw-alias-state-business-primary,#4a9eff) 14%,transparent);color:var(--dsw-alias-label-primary,#eee);box-shadow:inset 2px 0 0 var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-viewer-nav-dir{cursor:default;color:var(--dsw-alias-label-tertiary,#888)}\n/* \u6B63\u6587\u5168\u90E8\u8D70 em\uFF1A--skm-vfs \u4E00\u4E2A\u53D8\u91CF\u9A71\u52A8\u5B57\u53F7\u4E09\u6863\uFF0C\u5207\u6362\u65F6\u53EA\u8FC7\u6E21 font-size\u3002 */\n.skm-viewer-content{flex:1;min-width:0;overflow:auto;padding:26px 34px 48px;box-sizing:border-box;font-size:var(--skm-vfs,15px);line-height:1.75;color:var(--dsw-alias-label-primary,#eee);transition:font-size 180ms ease}\n.skm-viewer-content > :first-child{margin-top:0}\n.skm-viewer-content h1,.skm-viewer-content h2,.skm-viewer-content h3,.skm-viewer-content h4,.skm-viewer-content h5{margin:1.15em 0 .5em;line-height:1.35;font-weight:600;color:var(--dsw-alias-label-primary,#eee);max-width:84ch}\n.skm-viewer-content h1{font-size:1.72em;letter-spacing:-.012em}\n.skm-viewer-content h2{font-size:1.38em}\n.skm-viewer-content h3{font-size:1.16em}\n.skm-viewer-content h4,.skm-viewer-content h5{font-size:1.04em}\n.skm-viewer-content p{margin:.62em 0;max-width:92ch}\n.skm-viewer-content pre{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:10px;padding:14px 16px;overflow:auto;font-family:ui-monospace,monospace;font-size:.86em;line-height:1.7;color:var(--dsw-alias-label-secondary,#bbb)}\n.skm-viewer-content code{background:var(--dsw-alias-bg-module-platform,rgba(255,255,255,.05));border-radius:5px;padding:1px 5px;font-family:ui-monospace,monospace;font-size:.86em}\n.skm-viewer-content pre code{background:transparent;padding:0}\n.skm-viewer-content a{color:var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-viewer-content ul,.skm-viewer-content ol{margin:.62em 0;padding-left:1.6em}\n.skm-viewer-content li{margin:.32em 0;max-width:92ch}\n.skm-viewer-content blockquote{margin:.9em 0;padding:.25em 1em;border-left:3px solid var(--dsw-alias-border-l2,rgba(255,255,255,.12));color:var(--dsw-alias-label-secondary,#bbb);max-width:82ch}\n.skm-viewer-content hr{border:none;border-top:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));margin:1.5em 0}\n.skm-loose-empty{margin:2px;padding:4px 0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n\n/* \u2500\u2500 \u6280\u80FD/\u6280\u80FD\u5305\u5F00\u5173\uFF08Skills Hub \u98CE\u683C\uFF1A\u7EFF\u8272\u80F6\u56CA + \u767D\u8272\u5706\u94AE\uFF0C\u56DE\u5F39\u8FC7\u6E21\uFF09 \u2500\u2500 */\n.skm-toggle{flex:none;display:inline-flex;align-items:center;width:34px;height:20px;box-sizing:border-box;border-radius:10px;padding:2px;appearance:none;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:var(--dsw-alias-bg-module-platform,#e9ebee);cursor:pointer;transition:background 160ms ease,border-color 160ms ease,filter 160ms ease}\n.skm-toggle:hover{filter:brightness(1.03)}\n.skm-toggle:disabled{opacity:.55;cursor:not-allowed;filter:none}\n.skm-toggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4176e6);outline-offset:1px}\n.skm-toggle-on{border-color:transparent;background:var(--dsw-alias-state-business-primary,#4176e6)}\n.skm-toggle-off{background:var(--dsw-alias-bg-module-platform,#e9ebee);border-color:var(--dsw-alias-border-l2,rgba(0,0,0,.1))}\n.skm-toggle-knob{display:block;width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2);transition:transform 180ms cubic-bezier(.3,1.4,.5,1)}\n.skm-toggle-on .skm-toggle-knob{transform:translateX(14px)}\n.skm-toggle-off .skm-toggle-knob{transform:translateX(0)}\n.skm-bundle-toggle{flex:none;display:inline-flex;align-items:center;gap:4px;margin-left:0}\n\n/* \u2500\u2500 Agent \u9884\u8BBE\u5206\u7C7B\u5706\u7403\u6761\uFF08\u5F27\u5F62\u6062\u590D\uFF0C\u6574\u5217\u4F4D\u4E8E\u7EDF\u8BA1\u884C\u4E0E\u5DE5\u5177\u680F\u4E4B\u95F4\uFF09 \u2500\u2500 */\n.skm-preset-strip{flex:none;display:flex;align-items:flex-start;gap:10px;padding:12px 16px 0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}\n.skm-preset-strip::-webkit-scrollbar{display:none}\n.skm-preset-ball-wrap{flex:none;display:flex;flex-direction:column;align-items:center;gap:6px;width:56px;border:none;background:transparent;padding:0;cursor:pointer;font-family:inherit}\n.skm-preset-ball{position:relative;display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:50%;box-sizing:border-box;font-size:17px;font-weight:600;line-height:1;color:var(--dsw-alias-label-primary,#eee);text-transform:uppercase;background:var(--dsw-alias-bg-layer-2,#262b36);border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.14));transition:border-color 140ms,filter 140ms}\n.skm-preset-ball-wrap:hover .skm-preset-ball{filter:brightness(1.15)}\n.skm-preset-ball-wrap[data-active='true'] .skm-preset-ball{border-color:var(--dsw-alias-state-business-primary,#4a9eff);box-shadow:inset 0 0 0 1px var(--dsw-alias-state-business-primary,#4a9eff)}\n.skm-preset-ball[data-dot='true']::after{content:'';position:absolute;right:-1px;bottom:-1px;width:12px;height:12px;border-radius:50%;background:var(--dsw-alias-state-business-primary,#4a9eff);border:2px solid var(--dsw-alias-bg-layer-1,#1c1f26);box-sizing:border-box}\n.skm-preset-ball-label{max-width:56px;font-size:11px;line-height:15px;color:var(--dsw-alias-label-tertiary,#888);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}\n.skm-preset-ball-wrap[data-active='true'] .skm-preset-ball-label{color:var(--dsw-alias-label-primary,#eee)}\n.skm-preset-hint{flex:none;display:flex;align-items:center;gap:8px;padding:0 2px 2px}\n.skm-preset-hint-text{flex:1;min-width:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#888)}\n.skm-preset-reset{flex:none;appearance:none;border:none;border-radius:12px;padding:2px 10px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#999);background:transparent;cursor:pointer;font-family:inherit}\n.skm-preset-reset:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06));color:var(--dsw-alias-label-primary,#eee)}\n\n/* \u2500\u2500 \u9762\u677F\u7EA7\u63D0\u793A\u6761\uFF1A\u5220\u9664/\u5F52\u7EC4/\u6539\u540D/\u5B89\u88C5\u7684\u6210\u8D25\u90FD\u8981\u8BA9\u7528\u6237\u770B\u89C1 \u2500\u2500 */\n.skm-toast-stack{position:absolute;right:18px;bottom:18px;z-index:6;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}\n.skm-toast{display:inline-flex;align-items:center;gap:8px;max-width:min(460px,72vw);box-sizing:border-box;padding:8px 14px;border-radius:10px;font-size:12.5px;line-height:18px;border:1px solid var(--dsw-alias-border-l2,rgba(0,0,0,.1));background:var(--dsw-static-neutral-bluish-00,#fff);color:var(--dsw-alias-label-primary,#222);box-shadow:var(--dsw-shadow-lv2,0 6px 22px rgba(0,0,0,.16));animation:skm-toast-in 260ms cubic-bezier(.2,.9,.25,1) both}\n.skm-toast-ok{border-color:rgba(35,160,90,.38);color:#1c7a45}\n.skm-toast-err{border-color:rgba(226,80,64,.42);color:#b3271c}\n.skm-toast-dot{flex:none;width:6px;height:6px;border-radius:50%;background:currentColor;animation:skm-toast-ping 1.7s ease-out infinite}\n@keyframes skm-toast-in{from{opacity:0;transform:translateY(10px) scale(.97)}to{opacity:1;transform:none}}\n@keyframes skm-toast-ping{0%{box-shadow:0 0 0 0 currentColor;opacity:.9}70%{box-shadow:0 0 0 7px rgba(0,0,0,0);opacity:.35}100%{box-shadow:0 0 0 0 rgba(0,0,0,0);opacity:1}}\nbody[data-ds-dark-theme] .skm-toast{background:var(--dsw-static-neutral-bluish-850,#2c2c2e)}\nbody[data-ds-dark-theme] .skm-toast-ok{color:#6ee7a8}\nbody[data-ds-dark-theme] .skm-toast-err{color:#ff8a7a}\n\n/* \u2500\u2500 \u7A7A\u6280\u80FD\u5305\uFF1A\u53EF\u89C1 + \u53EF\u64CD\u4F5C\uFF08\u65E7\u5B9E\u73B0\u628A 0 \u6210\u5458\u7684\u5305\u6574\u6BB5\u8FC7\u6EE4\u6389\uFF0C\u5EFA\u5B8C\u5305\u5C31\u300C\u6D88\u5931\u300D\uFF09 \u2500\u2500 */\n.skm-bundle-empty{grid-column:1/-1;display:flex;align-items:center;gap:12px;flex-wrap:wrap;box-sizing:border-box;margin:2px 0 6px;padding:14px 16px;border:1px dashed var(--dsw-alias-border-l2,rgba(0,0,0,.18));border-radius:12px;background:var(--dsw-alias-bg-layer-1,rgba(0,0,0,.02));animation:skm-fade-up 260ms ease both}\n.skm-bundle-empty-title{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary,#333)}\n.skm-bundle-empty-hint{flex:1 1 200px;min-width:160px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#8b9099)}\n.skm-bundle-empty-btn{flex:none;display:inline-flex;align-items:center;gap:6px;appearance:none;border:1px solid var(--dsw-alias-state-business-primary,#4176e6);border-radius:9px;padding:5px 12px;font-size:12px;line-height:18px;font-family:inherit;cursor:pointer;color:var(--dsw-alias-state-business-primary,#4176e6);background:transparent;transition:background 160ms ease,color 160ms ease,transform 160ms ease,box-shadow 160ms ease}\n.skm-bundle-empty-btn:hover{background:var(--dsw-alias-state-business-primary,#4176e6);color:#fff;transform:translateY(-1px);box-shadow:0 4px 14px rgba(65,118,230,.28)}\n.skm-bundle-empty-btn:active{transform:translateY(0)}\n@keyframes skm-fade-up{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}\n\n/* \u2500\u2500 \u8D26\u672C\u5931\u6548\u5F15\u7528\uFF1A\u660E\u8BF4\u300C\u5305\u91CC\u6709\u6307\u5411\u5DF2\u5220\u9664\u6280\u80FD\u7684\u6761\u76EE\u300D\u5E76\u4E00\u952E\u6E05\u7406 \u2500\u2500 */\n.skm-bundle-missing{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:2px 0 6px;padding:8px 12px;border-radius:10px;border:1px solid rgba(240,150,40,.38);background:rgba(240,150,40,.09);font-size:12px;line-height:18px;color:#8a5a12;animation:skm-fade-up 260ms ease both}\n.skm-bundle-missing code{padding:1px 6px;border-radius:5px;background:rgba(240,150,40,.16);font-size:11.5px}\n.skm-bundle-missing-btn{appearance:none;border:1px solid rgba(240,150,40,.55);background:transparent;border-radius:8px;padding:2px 9px;font-size:11.5px;line-height:18px;font-family:inherit;cursor:pointer;color:inherit;transition:background 140ms ease,transform 140ms ease}\n.skm-bundle-missing-btn:hover{background:rgba(240,150,40,.2);transform:translateY(-1px)}\nbody[data-ds-dark-theme] .skm-bundle-missing{color:#f0c48a}\n.skm-install-hint{margin:2px 0 0;font-size:11.5px;line-height:17px;color:var(--dsw-alias-label-tertiary,#8b9099)}\n\n/* \u2500\u2500 SKILL \u9876\u680F\u64CD\u4F5C\u884C\uFF1A\u641C\u7D22 + \u72B6\u6001\u5206\u6BB5\uFF08\u5E26\u8BA1\u6570\uFF09+ \u5065\u5EB7\u6307\u793A + \u5237\u65B0/\u65B0\u5EFA/\u6DFB\u52A0 \u2500\u2500 */\n.skm-topbar-actions{flex:1 1 100%;order:4;min-width:0;display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.skm-status-seg-count{margin-left:6px;font-size:11px;line-height:15px;font-variant-numeric:tabular-nums;opacity:.72}\n.skm-health-inline{flex:none;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:17px;white-space:nowrap;color:var(--dsw-alias-label-secondary,#61666b)}\n.skm-health-inline::before{content:'';flex:none;width:7px;height:7px;border-radius:50%;background:currentColor}\n.skm-health-inline[data-tone='ok']{color:#12805c}\n.skm-health-inline[data-tone='warn']{color:#c2410c}\n.skm-health-inline[data-tone='pending'],.skm-health-inline[data-tone='idle']{color:var(--dsw-alias-label-caption,#adb2b8)}\n\n/* \u2500\u2500 \u79FB\u52A8\u7AEF\uFF1A\u4FA7\u680F\u6536\u7A84/\u9690\u85CF\u3001\u67E5\u770B\u5668\u4E0A\u4E0B\u5806\u53E0\u3001\u5361\u7247\u7F51\u683C\u5355\u5217 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (max-width: 767.98px) {\n .skm-viewer-modal,.skm-viewer-modal-full{width:calc(100vw - 48px)}\n .skm-viewer-body,.skm-viewer-modal-full .skm-viewer-body{height:calc(100vh - 76px)}\n .skm-viewer-body > div:nth-of-type(2){padding:0 10px 10px}\n .skm-viewer-toolbar{flex-wrap:wrap;gap:6px;padding-bottom:8px}\n .skm-viewer-layout{flex-direction:column}\n .skm-viewer-nav{width:100%;border-right:none;border-bottom:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08));flex:none;max-height:38%}\n .skm-viewer-content{flex:1;min-height:0;padding:16px 14px 28px}\n .skm-hub-side{display:none}\n .skm-skill-grid{grid-template-columns:minmax(0,1fr)}\n .skm-toolbar{padding:12px 12px 4px}\n .skm-banner{margin:10px 12px 0}\n .skm-main-scroll{padding:12px 12px 20px}\n}\n\n/* \u2500\u2500 \u51CF\u5F31\u52A8\u6548\uFF1A\u5361\u7247\u5165\u573A/\u60AC\u505C\u4F4D\u79FB\u4E0E\u5F00\u5173\u56DE\u5F39\u5168\u90E8\u6536\u655B \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n@media (prefers-reduced-motion: reduce) {\n .skm-skill-card{animation:none;opacity:1;transition:none}\n .skm-assign-card{animation:none;opacity:1;transition:none}\n .skm-drop-menu{animation:none}\n .skm-viewer-modal{animation:none}\n .skm-viewer-modal,.skm-viewer-body,.skm-viewer-content,.skm-viewer-nav-item,.skm-viewer-tool-btn{transition:none}\n .skm-toggle-knob{transition:none}\n .skm-toggle{transition:none}\n .skm-tag{transition:none}\n .skm-skill-copy,.skm-skill-icon,.skm-skill-foot-icon,.skm-icon-action,.skm-bundle,.skm-hub-item,.skm-tool-button,.skm-banner,.skm-banner-btn,.skm-view-btn,.skm-drop-item,.skm-assign-card{transition:none}\n .skm-toast{animation:none}\n .skm-toast-dot{animation:none}\n .skm-bundle-empty,.skm-bundle-missing{animation:none}\n .skm-bundle-empty-btn,.skm-bundle-missing-btn{transition:none}\n .skm-skill-card::before,.skm-skill-badge,.skm-skill-title,.skm-tag-status{transition:none}\n .skm-cat-chip-row{animation:none}\n .skm-bundle-cat-tag,.skm-cat-selected-tag{animation:none}\n .skm-cat-chip,.skm-bundle-cat-tag,.skm-cat-preset,.skm-cat-remove,.skm-cat-input,.skm-cat-chip-count{transition:none}\n}\n`\n\nexport function ensureStyles() {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n", "/**\r\n * dnd \u2014 \u63D0\u793A\u8BCD\u9762\u677F\u7684\u62D6\u62FD\u8F7D\u8377 + \u300C\u62D6\u5230\u9636\u6BB5 Tab\u300D\u6295\u9012\u70B9\u3002\r\n *\r\n * \u4E09\u4E2A Tab \u7684\u62D6\u62FD\u624B\u52BF\uFF08\u4E0E locales \u91CC\u7684\u63D0\u793A\u6587\u6848\u4E00\u4E00\u5BF9\u5E94\uFF09\uFF1A\r\n * - \u5217\u8868\u5185\u4E0A\u4E0B\u62D6 = \u6392\u5E8F\uFF08\u6BB5\u884C\uFF1B\u5DE5\u5177\u5217\u8868\u6309\u6CE8\u518C\u8868\u987A\u5E8F\uFF0C\u4E0D\u652F\u6301\u6392\u5E8F\uFF09\uFF1B\r\n * - \u300C\u5168\u90E8\u300D\u6C60 \u21C4 \u9636\u6BB5\u5217\u8868 = \u52A0\u5165\u8BE5\u9636\u6BB5 / \u4ECE\u8BE5\u9636\u6BB5\u62FF\u6389\uFF1B\r\n * - \u884C\u62D6\u5230\u5934\u90E8\u9636\u6BB5 Tab = \u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u5DE5\u5177\u7684\u9690\u85CF\u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\uFF09\u3002\r\n *\r\n * \u8F7D\u8377\u8D70\u4E24\u6761\u8DEF\uFF1A`dataTransfer`\uFF08\u6807\u51C6\u8DEF\u5F84\uFF09\u4E0E\u6A21\u5757\u5185\u5B58\uFF08dragover \u9636\u6BB5\u591A\u6570\u6D4F\u89C8\u5668\r\n * \u4E0D\u7ED9\u8BFB dataTransfer\uFF0C\u540C\u9875\u9762\u62D6\u62FD\u672C\u6765\u4E5F\u4E0D\u9700\u8981\u5E8F\u5217\u5316\uFF09\u3002\u9636\u6BB5 Tab \u5728 Panel \u5934\u90E8\u3001\r\n * \u4E0E\u5217\u8868\u4E0D\u5728\u540C\u4E00\u68F5\u5B50\u6811\uFF0C\u6240\u4EE5\u6295\u9012\u70B9\u7528\u300C\u5F53\u524D\u6302\u8F7D\u7684\u5217\u8868\u6CE8\u518C\u4E00\u4E2A\u56DE\u8C03\u300D\u6765\u63A5\uFF1A\r\n * \u6362 Tab / \u6362\u6A21\u5F0F\u65F6\u65E7\u5217\u8868\u5378\u8F7D\u3001\u65B0\u5217\u8868\u6CE8\u518C\uFF0C\u4EFB\u4F55\u65F6\u523B\u53EA\u6709\u4E00\u4E2A\u5904\u7406\u8005\u3002\r\n */\r\nimport type { DragEvent as ReactDragEvent } from 'react'\r\nimport type { PhaseViewKey } from './types.ts'\r\n\r\n/** \u8F7D\u8377\u79CD\u7C7B\uFF1A\u6BB5\u884C / \u5DE5\u5177\u884C\u3002 */\r\nexport type DragKind = 'section' | 'tool'\r\n/** \u6765\u6E90\uFF1A\u67D0\u4E2A\u9636\u6BB5\u5217\u8868\uFF0C\u6216\u300C\u5168\u90E8\u300D\u53EA\u8BFB\u6C60\u3002 */\r\nexport type DragFrom = PhaseViewKey | 'pool'\r\n\r\nexport interface DragPayload {\r\n kind: DragKind\r\n name: string\r\n from: DragFrom\r\n /** \u6BB5\u884C\u5F53\u524D\u6587\u672C\uFF08\u62D6\u5230\u522B\u7684\u9636\u6BB5\u65F6\u4F5C\u4E3A\u8BE5\u9636\u6BB5\u7684\u6CE8\u5165\u6587\u672C\uFF09\uFF1B\u5DE5\u5177\u4E0D\u7528\u3002 */\r\n text?: string\r\n /** \u5DE5\u5177\u884C\u5F53\u524D\u662F\u5426\u5728\u8BE5\u9636\u6BB5\u9690\u85CF\uFF1A\u9636\u6BB5\u95F4\u590D\u5236\u65F6\u4E00\u8D77\u5E26\u8FC7\u53BB\u3002 */\r\n hidden?: boolean\r\n}\r\n\r\n/** \u81EA\u5B9A\u4E49 MIME\uFF1A\u540C\u9875\u9762\u5185\u7528\u5B83\u533A\u5206\u300C\u672C\u9762\u677F\u7684\u62D6\u62FD\u300D\u4E0E\u5916\u90E8\u62D6\u5165\uFF08\u5982\u5BFC\u5165\u6280\u80FD\uFF09\u3002 */\r\nconst MIME = 'application/x-dsh-prompt-part'\r\n\r\n/**\r\n * \u662F\u4E0D\u662F\u672C\u9762\u677F\u53D1\u8D77\u7684\u62D6\u62FD \u2014\u2014 \u539F\u751F\u4E8B\u4EF6\u7248\uFF08drag-scroll \u7528\uFF09\u3002\r\n *\r\n * \u62D6\u62FD\u8FDB\u884C\u4E2D `dataTransfer.types` \u53EF\u8BFB\uFF08\u6570\u636E\u672C\u8EAB\u88AB\u4FDD\u62A4\uFF0C\u7C7B\u578B\u6E05\u5355\u4E0D\u4FDD\u62A4\uFF09\uFF0C\r\n * \u6240\u4EE5\u6355\u83B7\u9636\u6BB5\u7684\u76D1\u542C\u80FD\u9760\u5B83\u8FC7\u6EE4\uFF1A\u53EA\u7ED9\u81EA\u5DF1\u4EBA\u7684\u62D6\u62FD\u505A\u8D34\u8FB9\u6EDA\u52A8\uFF0C\u5916\u6765\u62D6\u5165\u4E0D\u6EDA\u3002\r\n */\r\nexport function isPanelDrag(event: DragEvent): boolean {\r\n const types = event.dataTransfer?.types\r\n if (types === undefined) return false\r\n return Array.from(types).includes(MIME)\r\n}\r\n\r\nlet current: DragPayload | null = null\r\nlet phaseDrop: ((key: PhaseViewKey, payload: DragPayload) => void) | null = null\r\n\r\n/** \u62D6\u8D77\uFF1A\u767B\u8BB0\u8F7D\u8377 + \u5199 dataTransfer\uFF08\u5199\u4E0D\u8FDB\u53BB\u4E5F\u80FD\u9760\u5185\u5B58\u8F7D\u8377\u7EE7\u7EED\uFF09\u3002 */\r\nexport function beginDrag(event: ReactDragEvent, payload: DragPayload): void {\r\n current = payload\r\n try {\r\n event.dataTransfer.setData(MIME, JSON.stringify(payload))\r\n event.dataTransfer.setData('text/plain', payload.name)\r\n event.dataTransfer.effectAllowed = 'copyMove'\r\n } catch { /* \u81EA\u5B9A\u4E49 MIME \u88AB\u62D2\uFF1A\u8BFB\u4FA7\u56DE\u843D\u5185\u5B58\u8F7D\u8377 */ }\r\n}\r\n\r\n/** \u62D6\u5B8C\uFF1A\u6E05\u6389\u8F7D\u8377\uFF08drop \u4E4B\u540E\u6D4F\u89C8\u5668\u8FD8\u4F1A\u8865\u4E00\u6B21 dragend\uFF09\u3002 */\r\nexport function finishDrag(): void {\r\n current = null\r\n}\r\n\r\n/** \u8BFB\u8F7D\u8377\uFF1A\u4F18\u5148 dataTransfer\uFF0C\u56DE\u843D\u5185\u5B58\uFF08dragover \u9636\u6BB5\u53EA\u53EF\u80FD\u662F\u540E\u8005\uFF09\u3002 */\r\nexport function payloadOf(event: ReactDragEvent): DragPayload | null {\r\n try {\r\n const raw = event.dataTransfer.getData(MIME)\r\n if (raw !== '') return JSON.parse(raw) as DragPayload\r\n } catch { /* \u8BFB\u4E0D\u5230\u5C31\u7528\u5185\u5B58\u8F7D\u8377 */ }\r\n return current\r\n}\r\n\r\n/** \u662F\u4E0D\u662F\u672C\u9762\u677F\u8BA4\u53EF\u7684\u53EF\u6295\u653E\u8F7D\u8377\uFF08dragover \u9760\u5B83\u51B3\u5B9A\u8981\u4E0D\u8981 preventDefault\uFF09\u3002 */\r\nexport function acceptsDrop(event: ReactDragEvent, kind: DragKind): boolean {\r\n const payload = payloadOf(event)\r\n return payload !== null && payload.kind === kind\r\n}\r\n\r\n/** \u5F53\u524D\u6302\u8F7D\u7684\u5217\u8868\uFF08\u6BB5 / \u5DE5\u5177\uFF09\u628A\u300C\u62D6\u5230\u9636\u6BB5 Tab\u300D\u7684\u5904\u7406\u51FD\u6570\u6CE8\u518C\u8FDB\u6765\u3002 */\r\nexport function setPhaseDropHandler(next: ((key: PhaseViewKey, payload: DragPayload) => void) | null): void {\r\n phaseDrop = next\r\n}\r\n\r\n/** \u9636\u6BB5 Tab \u88AB\u6295\u653E\uFF1A\u4EA4\u7ED9\u5F53\u524D\u6302\u8F7D\u7684\u5217\u8868\u5904\u7406\uFF08\u6CA1\u6709\u5217\u8868\u5C31\u4EC0\u4E48\u90FD\u4E0D\u505A\uFF09\u3002 */\r\nexport function dropOnPhase(key: PhaseViewKey, payload: DragPayload | null): void {\r\n if (payload === null) return\r\n phaseDrop?.(key, payload)\r\n}\r\n", "/** \u63D0\u793A\u8BCD\u5B9A\u5236\u9762\u677F\u5404\u7EC4\u4EF6\u5171\u4EAB\u7684\u5185\u8054\u6837\u5F0F\uFF08\u989C\u8272\u8D70\u534A\u900F\u660E\u7070\uFF0C\u968F\u5BBF\u4E3B\u4E3B\u9898\u81EA\u7136\u9002\u914D\uFF09\u3002 */\nexport const s = (() => {\n const flex = { display: 'flex', alignItems: 'center' }\n return {\n // \u2500\u2500 \u9762\u677F\u9AA8\u67B6\uFF08\u62BD\u5C49\u5185\u90E8\u5206\u680F\u5E03\u5C40\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n pRoot: { height: '100%', display: 'flex', flexDirection: 'column', fontFamily: 'inherit', fontSize: 13, lineHeight: 1.5, minHeight: 0 },\n head: { ...flex, gap: 10, padding: '10px 14px 8px', flexWrap: 'wrap', borderBottom: '1px solid rgba(128,128,128,.18)' },\n headTitle: { ...flex, gap: 8, fontSize: 15, fontWeight: 600, whiteSpace: 'nowrap' },\n seg: { ...flex, gap: 2, padding: 2, border: '1px solid rgba(128,128,128,.28)', borderRadius: 8 },\n segBtn: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.72, fontSize: 13, whiteSpace: 'nowrap' },\n segBtnActive: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'rgba(88,166,255,.22)', cursor: 'pointer', color: 'inherit', fontWeight: 600, fontSize: 13, whiteSpace: 'nowrap' },\n // \u62D6\u62FD\u60AC\u505C\u5728\u9636\u6BB5\u6309\u94AE\u4E0A\uFF08\u677E\u624B = \u590D\u5236\u5230\u8BE5\u9636\u6BB5\uFF09\u3002\n segBtnDrop: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'rgba(88,166,255,.16)', outline: '2px dashed rgba(88,166,255,.85)', outlineOffset: 1, cursor: 'pointer', color: 'inherit', fontSize: 13, whiteSpace: 'nowrap' },\n segBtnDropActive: { padding: '3px 12px', border: 'none', borderRadius: 6, background: 'rgba(88,166,255,.3)', outline: '2px dashed rgba(88,166,255,.9)', outlineOffset: 1, cursor: 'pointer', color: 'inherit', fontWeight: 600, fontSize: 13, whiteSpace: 'nowrap' },\n grow: { flex: 1, minWidth: 0 },\n headActions: { ...flex, gap: 6, marginLeft: 'auto' },\n iconBtn: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 28, height: 28, border: 'none', borderRadius: 8, background: 'transparent', cursor: 'pointer', color: 'inherit', opacity: 0.75 },\n // \u9884\u8BBE\uFF08\u7F16\u8F91\u76EE\u6807\uFF09\u884C\u6539\u7528\u80FD\u529B\u9762\u677F\u9876\u680F\u7684 chips \u7C7B\u540D\uFF08\u89C1 Panel.tsx \u7684 css.topbar / css.catItem\uFF09\uFF0C\n // \u8FD9\u91CC\u4E0D\u518D\u4FDD\u7559\u81EA\u7ED8\u7684 subhead / targetRow / targetTab \u6837\u5F0F\u3002\n body: { flex: 1, minHeight: 0, display: 'flex', alignItems: 'stretch' },\n colLeft: { width: 420, flex: 'none', display: 'flex', flexDirection: 'column', minHeight: 0, borderRight: '1px solid rgba(128,128,128,.18)', boxSizing: 'border-box' },\n colScroll: { flex: 1, minHeight: 0, overflowY: 'auto', padding: '10px 12px' },\n colFoot: { flex: 'none', ...flex, gap: 8, padding: '8px 12px', borderTop: '1px solid rgba(128,128,128,.18)', flexWrap: 'wrap' },\n colRight: { flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', minHeight: 0 },\n colRightScroll: { flex: 1, minHeight: 0, overflowY: 'auto', padding: '10px 14px' },\n groupHead: { ...flex, gap: 8, marginBottom: 6, color: 'rgba(128,128,128,.95)', fontSize: 12, fontWeight: 600 },\n // \u2500\u2500 \u901A\u7528\u63A7\u4EF6\uFF08\u6CBF\u7528\u65E7\u9762\u677F\u7684\u89C2\u611F\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n list: { display: 'flex', flexDirection: 'column', gap: 6 },\n row: { ...flex, gap: 8, padding: '6px 8px', border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(128,128,128,.06)' },\n switchWrap: { ...flex, gap: 6, minWidth: 90 },\n rowBody: { flex: 1, minWidth: 0 },\n rowTitle: { ...flex, gap: 6, alignItems: 'baseline', flexWrap: 'wrap' },\n code: { fontFamily: 'monospace', fontSize: 12, wordBreak: 'break-all' },\n orderTag: { color: 'rgba(128,128,128,.8)', fontSize: 11 },\n preview: { color: 'rgba(128,128,128,.85)', fontSize: 12, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },\n previewText: { fontFamily: 'monospace', fontSize: 12, lineHeight: 1.6, whiteSpace: 'pre-wrap', wordBreak: 'break-word', flex: 1, minHeight: 0, overflowY: 'auto', padding: 10, border: '1px solid rgba(128,128,128,.2)', borderRadius: 8, background: 'rgba(0,0,0,.18)', margin: 0 },\n toolWrap: { display: 'flex', flexWrap: 'wrap', gap: 6 },\n toolChip: { fontFamily: 'monospace', fontSize: 12, color: 'rgba(128,128,128,.95)', border: '1px solid rgba(128,128,128,.3)', borderRadius: 6, padding: '2px 6px', cursor: 'help' },\n badgeOk: { color: '#3fb950', fontSize: 11, border: '1px solid rgba(63,185,80,.5)', borderRadius: 999, padding: '0 6px' },\n badgeBlocked: { color: '#f85149', fontSize: 11, border: '1px solid rgba(248,81,73,.5)', borderRadius: 999, padding: '0 6px' },\n badgeReplaced: { color: '#d29922', fontSize: 11, border: '1px solid rgba(210,153,34,.5)', borderRadius: 999, padding: '0 6px' },\n badgeCustom: { color: '#58a6ff', fontSize: 11, border: '1px solid rgba(88,166,255,.5)', borderRadius: 999, padding: '0 6px' },\n badgeSystem: { color: 'rgba(128,128,128,.85)', fontSize: 11, border: '1px solid rgba(128,128,128,.4)', borderRadius: 999, padding: '0 6px' },\n mini: { padding: '3px 8px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit', whiteSpace: 'nowrap' },\n arrowCol: { display: 'flex', flexDirection: 'column', gap: 2 },\n arrow: { padding: '0 6px', border: '1px solid rgba(128,128,128,.3)', borderRadius: 4, background: 'transparent', cursor: 'pointer', color: 'inherit', fontSize: 11, lineHeight: 1.4, opacity: 0.8 },\n rowBlocked: { opacity: 0.55 },\n // \u2500\u2500 \u62D6\u62FD\uFF08\u89C1 dnd.ts\uFF09\uFF1A\u6293\u624B / \u62D6\u52A8\u4E2D\u7684\u884C / \u884C\u4E0A\u7684\u63D2\u5165\u4F4D\u7F6E / \u6574\u5757\u6295\u653E\u533A \u2500\u2500\n dragHandle: { flex: 'none', cursor: 'grab', color: 'rgba(128,128,128,.85)', fontSize: 13, lineHeight: 1, userSelect: 'none', padding: '0 2px' },\n dragging: { opacity: 0.5 },\n dropAbove: { boxShadow: 'inset 0 2px 0 0 #58a6ff' },\n dropBelow: { boxShadow: 'inset 0 -2px 0 0 #58a6ff' },\n dropZone: { outline: '2px dashed rgba(88,166,255,.55)', outlineOffset: -3, borderRadius: 8 },\n dropZoneActive: { outline: '2px dashed rgba(88,166,255,.9)', outlineOffset: -3, borderRadius: 8, background: 'rgba(88,166,255,.06)' },\n injectBox: { marginTop: 10, padding: '8px', border: '1px dashed rgba(128,128,128,.4)', borderRadius: 8, display: 'flex', flexDirection: 'column', gap: 6 },\n injectRow: { ...flex, gap: 6 },\n editBox: { display: 'flex', flexDirection: 'column', gap: 6, marginTop: 4 },\n editInput: { padding: '6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit', fontFamily: 'inherit', fontSize: 12, resize: 'vertical', width: '100%', boxSizing: 'border-box' },\n input: { padding: '4px 6px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', color: 'inherit' },\n muted: { color: 'rgba(128,128,128,.75)', fontSize: 12 },\n error: { color: '#f85149', fontSize: 12, marginBottom: 6 },\n noticeOk: { color: '#3fb950', fontSize: 12, marginBottom: 6 },\n noticeWarn: { color: '#d29922', fontSize: 12, marginBottom: 6 },\n saveBtn: { padding: '4px 12px', border: '1px solid rgba(128,128,128,.35)', borderRadius: 6, background: 'transparent', cursor: 'pointer', color: 'inherit' },\n saveBtnDirty: { padding: '4px 12px', border: '1px solid #d29922', borderRadius: 6, background: 'rgba(210,153,34,.15)', cursor: 'pointer', color: 'inherit' },\n }\n})()\n", "/** \u7EAF\u51FD\u6570\u7684\u9884\u8BBE / \u6BB5\u64CD\u4F5C\u52A9\u624B\uFF0C\u540C\u65F6\u88AB\u5BA2\u6237\u7AEF UI \u4E0E Node \u6D4B\u8BD5\u590D\u7528\uFF08\u4E0D\u89E6\u78B0 IO \u4E0E React\uFF09\u3002 */\nimport type { Config, Inventory, OverrideData, Phase, PhaseViewKey, Preset, PresetData, ToolsConfig } from './types.ts'\n\nexport interface Section {\n name: string\n order: number\n text?: string\n active: boolean\n replaced: boolean\n /** `system` = \u8BFB\u81EA\u5BBF\u4E3B\u63D0\u793A\u8BCD\u6E05\u5355\uFF08\u4E0D\u53EF\u5220\u9664\uFF09\uFF1B`custom` = \u672C\u63D2\u4EF6\u6CE8\u5165\uFF08\u53EF\u5220\u9664\uFF09\u3002 */\n source?: 'system' | 'custom'\n}\n\n/** \u5E94\u7528\u9884\u8BBE\u540E\u9700\u8981\u56DE\u5199\u5230\u8BBE\u7F6E\u4F5C\u7528\u57DF\u7684\u90A3\u90E8\u5206\u914D\u7F6E\u5B57\u6BB5\u3002\n * \u9636\u6BB5\u540D\u5355\u4E3A\u53EF\u9009\uFF1A\u65E7\u5FEB\u7167\u4E0D\u5E26 \u2192 \u5E94\u7528\u65F6\u4FDD\u7559\u5F53\u524D\u503C\uFF0C\u7EDD\u4E0D\u62B9\u6389\u3002 */\nexport interface ConfigPatch {\n sections: string[]\n sectionsBootstrap?: string[]\n sectionsCompaction?: string[]\n replace: Record<string, string>\n inject: ResolvedInject[]\n tools: ToolsConfig\n}\n\n/** \u5FEB\u7167\u6355\u83B7\u7684\u9636\u6BB5 order \u7A7A\u95F4\uFF08always \u4E4B\u5916\u7684\u4E09\u4E2A\u9636\u6BB5\uFF09\u3002 */\nconst CAPTURE_PHASES: Array<'bootstrap' | 'active' | 'compaction'> = ['bootstrap', 'active', 'compaction']\n\n/** \u628A\u4E00\u6761\u6709\u5E8F\u540D\u5B57\u8F6C\u6210\u76F8\u5BF9\u94FE\uFF08\u6BCF\u6BB5\u8BB0\u4F4F\u5B83\u7684\u524D\u4E00\u6BB5\uFF09\uFF0Ctext / custom \u53EA\u7ED9 custom \u6BB5\u3002 */\nfunction toChain(names: string[], textOf: (name: string) => string, customOf: (name: string) => boolean, phase?: Phase): NonNullable<PresetData['order']> {\n return names.map((name, i) => ({\n name,\n after: i > 0 ? names[i - 1] : undefined,\n text: customOf(name) ? (textOf(name) ?? '') : '',\n custom: customOf(name),\n ...(phase !== undefined ? { phase } : {}),\n }))\n}\n\n/**\n * \u4ECE\u5F53\u524D\u914D\u7F6E\u6784\u5EFA\u9884\u8BBE\u5FEB\u7167\uFF08\u5B8C\u6574\u6355\u83B7\uFF0C\u542B\u6BCF\u9636\u6BB5\u72EC\u7ACB\u8BBE\u5B9A\uFF09\u3002\n *\n * \u5168\u5C40\u76F8\u5BF9\u94FE\u6D3E\u751F\u81EA\u5408\u5E76\u540E\u7684\u5B8C\u6574\u6BB5\u5217\u8868\uFF08\u800C\u4E0D\u4EC5\u662F `cfg.inject`\uFF09\uFF0C\u8FD9\u6837\u5373\u4F7F\u4FDD\u5B58\u524D\n * \u53EA\u662F\u5C4F\u853D\u4E86\u51E0\u4E2A\u6BB5\uFF08\u6CA1\u6709\u91CD\u6392\uFF09\uFF0C\u9884\u8BBE\u4ECD\u4F1A\u643A\u5E26\u5B8C\u6574\u7684\u6709\u5E8F\u96C6\u5408\uFF0C\u5E94\u7528\u65F6\u624D\u80FD\u5F97\u5230\u4E00\u4E2A\n * \u6709\u610F\u4E49\u7684\u300C\u6FC0\u6D3B\u5217\u8868\u300D\u3002\u5728\u6B64\u4E4B\u4E0A\uFF0Cbootstrap / active / compaction \u5404\u518D\u5E26\u4E00\u6761\u81EA\u5DF1\n * \u7684\u76F8\u5BF9\u94FE \u2014\u2014 \u6570\u636E\u6E90\u5C31\u662F UI \u9010\u9636\u6BB5\u6301\u4E45\u5316\u7684\u6CE8\u5165\u6761\u76EE\uFF08\u6BCF\u9636\u6BB5\u72EC\u7ACB\u7684 order \u7A7A\u95F4\uFF09\uFF0C\n * \u5426\u5219\u9636\u6BB5\u5316\u7684\u540D\u5355\u4E0E\u6392\u5E8F\u5728\u300C\u5BFC\u51FA \u2192 \u5BFC\u5165 \u2192 \u5E94\u7528\u300D\u540E\u5C31\u4E22\u4E86\u3002\n */\nexport function buildPresetData(cfg: Config, merged: Section[]): PresetData {\n const globalNames = merged.map((sec) => sec.name)\n const textOf = new Map(merged.map((sec) => [sec.name, sec.text ?? ''] as const))\n const customOf = new Map(merged.map((sec) => [sec.name, sec.source === 'custom'] as const))\n const order = toChain(globalNames, (n) => textOf.get(n) ?? '', (n) => customOf.get(n) === true)\n for (const phase of CAPTURE_PHASES) {\n const items = (cfg.inject ?? [])\n .filter((item) => item.phase === phase)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n if (items.length === 0) continue\n order.push(...toChain(\n items.map((item) => item.name),\n (n) => items.find((item) => item.name === n)?.text ?? '',\n (n) => items.find((item) => item.name === n)?.custom === true,\n phase,\n ))\n }\n const data: PresetData = {\n sections: cfg.sections,\n replace: cfg.replace,\n order,\n tools: cfg.tools,\n }\n // \u975E\u7A7A\u624D\u6355\u83B7\uFF1A\u6CA1\u6709\u9636\u6BB5\u540D\u5355\u7684\u914D\u7F6E\u5BFC\u51FA\u7684\u5FEB\u7167\u4E0E\u6539\u52A8\u524D\u9010\u952E\u4E00\u81F4\u3002\n if ((cfg.sectionsBootstrap ?? []).length > 0) data.sectionsBootstrap = cfg.sectionsBootstrap\n if ((cfg.sectionsCompaction ?? []).length > 0) data.sectionsCompaction = cfg.sectionsCompaction\n return data\n}\n\n/**\n * \u628A\u5BBF\u4E3B\u6E05\u5355\u6BB5\u4E0E\u7528\u6237\u6CE8\u5165\u5217\u8868\u6309 order \u5408\u5E76\u3001\u6392\u5E8F\u3002\n * \u8BFB\u81EA\u6E05\u5355\uFF08\u5176\u4ED6\u63D2\u4EF6\u4EA7\u51FA\uFF09\u7684\u6BB5\u6807\u8BB0\u4E3A `system`\uFF1B\u672C\u63D2\u4EF6\u751F\u6210\u7684\u6BB5\u5E26\u9690\u85CF\u7684\n * `custom` \u6807\u8BB0\uFF0C\u6807\u8BB0\u4E3A `custom`\u3002\u6765\u6E90\u53EA\u7531\u9690\u85CF\u6807\u8BB0\u51B3\u5B9A\u2014\u2014\u7EDD\u4E0D\u9760\u540D\u5B57\u78B0\u649E\n * \u5224\u65AD\u2014\u2014\u56E0\u6B64\u5373\u4F7F\u81EA\u5B9A\u4E49\u6BB5\u6070\u597D\u4E0E\u67D0\u4E2A\u6E05\u5355\u6BB5\u91CD\u540D\uFF0C\u5B83\u4E5F\u80FD\u4FDD\u4F4F\u81EA\u5DF1\u7684\u8EAB\u4EFD\n * \uFF08\u4EE5\u53CA\u53EF\u5220\u9664\u6027\uFF09\uFF0C\u5E76\u5728\u5207\u6362\u9884\u8BBE\u540E\u4F9D\u7136\u6210\u7ACB\u3002\u81EA\u5B9A\u4E49\u6BB5\u59CB\u7EC8\u6E32\u67D3\u81EA\u5DF1\u7684\u6587\u672C\uFF0C\n * \u6C38\u8FDC\u4E0D\u4F1A\u663E\u793A\u4E3A\u300C<\u52A8\u6001\u751F\u6210>\u300D\u3002\n */\nexport function mergeSections(inv: Inventory | null, cfg: Config, blockedNames: ReadonlySet<string>): Section[] {\n const map = new Map<string, Section>()\n for (const sec of inv?.sections ?? []) map.set(sec.name, { ...sec, source: 'system' })\n for (const item of cfg.inject ?? []) {\n const isCustom = item.custom === true\n const existing = map.get(item.name)\n if (existing) {\n map.set(item.name, isCustom\n ? { ...existing, order: item.order, text: item.text ?? '', source: 'custom' }\n : { ...existing, order: item.order, source: 'system' })\n } else {\n map.set(item.name, {\n name: item.name,\n order: item.order,\n text: item.text ?? '',\n active: !blockedNames.has(item.name),\n replaced: false,\n source: isCustom ? 'custom' : 'system',\n })\n }\n }\n return [...map.values()].sort((a, b) => a.order - b.order).map((sec, i) => ({ ...sec, order: i }))\n}\n\n/** ConfigPatch \u91CC\u5BF9\u5916\u7684\u6CE8\u5165\u6761\u76EE\uFF08always \u7EC4\u523B\u610F\u4E0D\u5E26 phase \u952E\uFF09\u3002 */\nexport interface ResolvedInject {\n name: string\n order: number\n text: string\n custom?: boolean\n phase?: Phase\n}\n\n/**\n * \u628A\u4E00\u6761\u76F8\u5BF9\u94FE\u89E3\u6790\u4E3A\u7EDD\u5BF9\u6709\u5E8F\u540D\u5B57\uFF080..n-1\uFF09\u3002\n * \u6CA1\u6709\u951A\u70B9\uFF08\u6216\u951A\u70B9\u4E0D\u5728\u672C\u7EC4\u5185\uFF09\u7684\u540D\u5B57\u6309\u539F\u59CB\u987A\u5E8F\u6392\u5728\u6700\u524D\uFF1B\u6BCF\u4E2A\u5E26\u951A\u70B9\u7684\u540D\u5B57\n * \u63D2\u5230\u5176\u951A\u70B9\u4E4B\u540E\uFF1B\u5269\u4F59\u7684\u540D\u5B57\uFF08\u5B58\u5728\u73AF\uFF09\u8FFD\u52A0\u5230\u672B\u5C3E\u3002\n */\nfunction resolveChain(list: Array<{ name: string; after?: string }>): string[] {\n const afterMap = new Map<string, string | undefined>()\n for (const sec of list) afterMap.set(sec.name, sec.after)\n\n const result: string[] = []\n const placed = new Set<string>()\n\n for (const sec of list) {\n const anchor = afterMap.get(sec.name)\n if (!anchor || !afterMap.has(anchor)) { result.push(sec.name); placed.add(sec.name) }\n }\n\n let changed = true\n while (changed) {\n changed = false\n for (const sec of list) {\n if (placed.has(sec.name)) continue\n const anchor = afterMap.get(sec.name)\n if (anchor && placed.has(anchor)) {\n result.splice(result.indexOf(anchor) + 1, 0, sec.name)\n placed.add(sec.name)\n changed = true\n }\n }\n }\n\n for (const sec of list) {\n if (!placed.has(sec.name)) { result.push(sec.name); placed.add(sec.name) }\n }\n return result\n}\n\n/**\n * \u628A\u5FEB\u7167\u91CC\u7684\u76F8\u5BF9\u987A\u5E8F\u89E3\u6790\u4E3A\u6CE8\u5165\u6761\u76EE\u5217\u8868\u3002\n *\n * order \u6761\u76EE\u53EF\u4EE5\u5E26 `phase`\uFF1A\u540C\u540D\u800C\u4E0D\u540C phase \u7684\u591A\u6761 = \u8BE5\u6BB5\u5728\u591A\u4E2A\u9636\u6BB5\u5404\u6709\u81EA\u5DF1\u7684\n * \u4F4D\u7F6E\uFF08\u6BCF\u9636\u6BB5\u6709\u72EC\u7ACB\u7684 order \u7A7A\u95F4\uFF0C\u4E0E UI \u7684 phaseInjectEntries \u4E00\u81F4\uFF09\u3002\u65E0 phase\n * \u7684\u6761\u76EE\u5C5E\u4E8E always \u7EC4 \u2014\u2014 \u4E5F\u5C31\u662F\u65E7\u5FEB\u7167\u7684\u5355\u4E00\u5168\u5C40\u5E8F\uFF0C\u8F93\u51FA\u5F62\u72B6\u4E0E\u65E7\u5B9E\u73B0\u9010\u952E\u4E00\u81F4\n * \uFF08\u523B\u610F\u4E0D\u5199 phase \u952E\uFF0C\u300C\u4FDD\u5B58 \u2192 \u5E94\u7528 = \u4E0D\u52A8\u70B9\u300D\u7684\u4E0D\u53D8\u91CF\u4F9D\u8D56\u952E\u5F62\u72B6\u5B8C\u5168\u76F8\u540C\uFF09\u3002\n */\nexport function resolveOrder(presetOrder: PresetData['order']): ResolvedInject[] {\n const list = presetOrder ?? []\n const groups = new Map<Phase, NonNullable<PresetData['order']>>([['always', []]])\n for (const sec of list) {\n const phase = sec.phase ?? 'always'\n const group = groups.get(phase)\n if (group) group.push(sec)\n else groups.set(phase, [sec])\n }\n const out: ResolvedInject[] = []\n for (const [phase, members] of groups) {\n const textMap = new Map(members.map((x) => [x.name, x.text ?? '']))\n const customMap = new Map(members.map((x) => [x.name, x.custom === true]))\n const names = resolveChain(members)\n out.push(...names.map((name, i) => (phase === 'always'\n ? { name, order: i, text: textMap.get(name) ?? '', custom: customMap.get(name) }\n : { name, order: i, text: textMap.get(name) ?? '', custom: customMap.get(name), phase })))\n }\n return out\n}\n\n/**\n * \u8BA1\u7B97\u5E94\u7528\u9884\u8BBE\u65F6\u7684\u914D\u7F6E\u8865\u4E01\uFF1A\n * - \u540C\u540D\u6BB5\u88AB\u8986\u76D6\uFF08\u987A\u5E8F\u5217\u8868\u5728\u8FD0\u884C\u65F6\u9A71\u52A8\u8FD9\u4E00\u884C\u4E3A\uFF09\n * - \u9884\u8BBE\u4E2D\u6709\u3001\u5F53\u524D\u7CFB\u7EDF\u91CC\u5339\u914D\u4E0D\u4E0A\u7684\u6BB5\u9ED8\u8BA4\u8DF3\u8FC7\uFF08\u8DE8\u7CFB\u7EDF\u5BFC\u5165\u4E0D\u51ED\u7A7A\u5EFA\u6BB5\uFF09\n * - \u5F53\u524D\u6709\u3001\u4F46\u4E0D\u5728\u9884\u8BBE\u6709\u5E8F\u5217\u8868\u4E2D\u7684\u6BB5\u9ED8\u8BA4\u88AB\u5C4F\u853D\n * - \u53EA\u6709\u9884\u8BBE\u7684\u300C\u6FC0\u6D3B\u6BB5\u300D\uFF08\u5728 order \u5217\u8868\u4E14\u4E0D\u5728\u5176\u5C4F\u853D\u540D\u5355\u4E2D\uFF09\u88AB\u89E3\u9664\u5C4F\u853D\uFF1B\n * \u9884\u8BBE\u81EA\u5DF1\u5C4F\u853D\u7684\u6BB5\u4FDD\u6301\u5C4F\u853D\u3002\n *\n * \u5F53\u524D\u914D\u7F6E\u91CC\u5B58\u5728\u3001\u4F46\u4E0D\u5728\u9884\u8BBE\u6709\u5E8F\u5217\u8868\u4E2D\u7684\u81EA\u5B9A\u4E49\u6CE8\u5165\u6BB5\u4F1A\u88AB\u4FDD\u7559\u5230\u7ED3\u679C\u7684\n * inject \u5217\u8868\u4E2D\uFF08\u56E0\u6B64\u4ECD\u7136\u53EF\u89C1\uFF09\u5E76\u7F6E\u4E3A\u7981\u7528\uFF08\u52A0\u5165\u5C4F\u853D\u96C6\u5408\uFF09\uFF0C\u800C\u4E0D\u662F\u88AB\u9759\u9ED8\n * \u4E22\u5F03\u2014\u2014\u9884\u8BBE\u4E0D\u80FD\u8BA9\u7528\u6237\u81EA\u5DF1\u6CE8\u5165\u7684\u51ED\u7A7A\u6D88\u5931\u3002\n */\nexport function applyPresetData(data: PresetData, cfg: Config, currentNames: ReadonlySet<string>): ConfigPatch {\n const presetOrder = data.order ?? []\n const presetNames = new Set(presetOrder.map((x) => x.name))\n // \u9ED1\u540D\u5355\u540C\u6837\u6309\u5F53\u524D\u7CFB\u7EDF\u8FC7\u6EE4\uFF1A\u5339\u914D\u4E0D\u4E0A\u7684\u540D\u5B57\u8DF3\u8FC7\uFF08\u5C4F\u853D\u4E0D\u5B58\u5728\u7684\u6BB5\u6CA1\u6709\u610F\u4E49\uFF0C\n // \u8FD8\u4F1A\u6C61\u67D3\u914D\u7F6E\uFF0C\u8BA9\u4E0B\u4E00\u6B21\u5FEB\u7167\u51FA\u73B0\u300Csections \u2286 order\u300D\u88AB\u7834\u574F\u7684\u5B64\u513F\u540D\u5355\uFF09\u3002\n const blocked = new Set((data.sections ?? []).filter((n) => currentNames.has(n)))\n\n // \u6CE8\u5165\u5217\u8868 = \u9884\u8BBE\u89E3\u6790\u51FA\u7684\u987A\u5E8F\uFF0C\u518D\u8FFD\u52A0\u5F53\u524D\u914D\u7F6E\u4E2D\u5B58\u5728\u3001\u4F46\u9884\u8BBE\u5217\u8868\u6CA1\u6709\u7684\n // \u81EA\u5B9A\u4E49\u6CE8\u5165\u6BB5\u3002\u8BA9\u5B83\u4EEC\u7559\u5728 `inject` \u91CC\u624D\u80FD\u4FDD\u6301\u53EF\u89C1\uFF1B\u968F\u540E\u7EDF\u4E00\u7F6E\u4E3A\u7981\u7528\u3002\n // \u88AB\u4FDD\u7559\u7684\u81EA\u5B9A\u4E49\u6BB5\u63A5\u5728\u9884\u8BBE\u81EA\u8EAB\u7684\u4E0B\u6807\u4E4B\u540E\uFF1B\u82E5\u9884\u8BBE\u53EA\u8986\u76D6\u4E00\u5C0F\u90E8\u5206\u6BB5\uFF0C\u5B83\u4EEC\n // \u53EF\u80FD\u4E0E\u6E05\u5355\u539F\u751F order \u5E76\u5217\u2014\u2014\u5408\u5E76\u89C6\u56FE\u6309\u7A33\u5B9A\u6392\u5E8F\uFF08\u6E05\u5355\u5728\u524D\uFF09\uFF0C\u987A\u5E8F\u4ECD\u662F\n // \u786E\u5B9A\u6027\u7684\uFF0C\u4E14\u4E0B\u4E00\u6B21\u91CD\u6392/\u6301\u4E45\u5316\u4F1A\u628A\u6240\u6709\u4E0B\u6807\u91CD\u65B0\u8FDE\u7EED\u5316\u3002\n // \u9884\u8BBE order \u5148\u6309\u5F53\u524D\u7CFB\u7EDF\u7684\u6BB5\u540D\u8FC7\u6EE4\uFF08\u5339\u914D\u4E0D\u4E0A\u5C31\u8DF3\u8FC7\uFF0C\u7EDD\u4E0D\u51ED\u7A7A\u5EFA\u6BB5\uFF09\u2014\u2014\n // \u5728\u89E3\u6790\u524D\u8FC7\u6EE4\u8BA9\u4FDD\u7559\u6761\u76EE\u7684 order \u4FDD\u6301\u6309\u7EC4\u8FDE\u7EED\uFF1B\u951A\u70B9\u88AB\u8FC7\u6EE4\u6389\u65F6\n // resolveChain \u4F1A\u628A\u8BE5\u6761\u76EE\u56DE\u9000\u5230\u7EC4\u5C3E\uFF0C\u987A\u5E8F\u4ECD\u7136\u786E\u5B9A\u3002\n const inject = resolveOrder(presetOrder.filter((x) => currentNames.has(x.name)))\n const kept = new Set(inject.map((x) => x.name))\n let order = inject.length\n for (const item of cfg.inject ?? []) {\n if (!item || !item.name || presetNames.has(item.name) || kept.has(item.name)) continue\n kept.add(item.name)\n inject.push({ name: item.name, order: order++, text: item.text ?? '', custom: item.custom === true })\n }\n\n // \u4EC5\u5F53\u9884\u8BBE\u786E\u5B9E\u5B9A\u4E49\u4E86 order \u5217\u8868\u65F6\u624D\u5F3A\u5236\u6267\u884C\u300C\u6FC0\u6D3B\u96C6\u5408\u300D\u3002\n // \u7A7A\u7684 order\uFF08\u4F8B\u5982\u624B\u5DE5\u7F16\u5199 / \u53EA\u5C4F\u853D\u4E86\u51E0\u4E2A\u6BB5\u7684\u5BFC\u5165\u9884\u8BBE\uFF09\u7EDD\u4E0D\u80FD\u628A\u5F53\u524D\u6240\u6709\n // \u6BB5\u9ED8\u8BA4\u7981\u7528\u3002\n if (presetOrder.length > 0) {\n const activeNames = new Set([...presetNames].filter((n) => !blocked.has(n)))\n for (const name of currentNames) if (!presetNames.has(name)) blocked.add(name)\n for (const name of activeNames) blocked.delete(name)\n }\n\n // \u9636\u6BB5\u5316\u5B57\u6BB5\u4E00\u5F8B\u300C\u5FEB\u7167\u6709\u5219\u8986\u76D6\uFF0C\u7F3A\u7701\u5219\u4FDD\u7559\u5F53\u524D\u503C\u300D\uFF1A\u65E7\u5FEB\u7167\uFF08\u6CA1\u6709\u8FD9\u4E9B\u952E\uFF09\n // \u5E94\u7528\u540E\u4ECD\u53EA\u6362\u9759\u6001\u8FC7\u6EE4\uFF0C\u7EDD\u4E0D\u628A\u7528\u6237\u5DF2\u6709\u7684\u9636\u6BB5\u76EE\u5F55\u4E0E\u9636\u6BB5\u540D\u5355\u62B9\u5E73\u3002\n // \u7F3A\u5E2D\u65F6\u4E0D\u7559\u4E0B\u663E\u5F0F undefined \u952E \u2014\u2014 \u300C\u4FDD\u5B58\u2192\u5E94\u7528 = \u4E0D\u52A8\u70B9\u300D\u7684\u4E0D\u53D8\u91CF\u4F9D\u8D56\u952E\u5F62\u72B6\u3002\n const keptCatalogs: ToolsConfig = {}\n const bootstrap = data.tools?.bootstrap !== undefined ? data.tools.bootstrap : cfg.tools?.bootstrap\n const compaction = data.tools?.compaction !== undefined ? data.tools.compaction : cfg.tools?.compaction\n if (bootstrap !== undefined) keptCatalogs.bootstrap = bootstrap\n if (compaction !== undefined) keptCatalogs.compaction = compaction\n const patch: ConfigPatch = {\n sections: [...blocked],\n replace: { ...(cfg.replace ?? {}), ...(data.replace ?? {}) },\n inject,\n tools: {\n exclude: data.tools?.exclude ?? [],\n ...keptCatalogs,\n },\n }\n if (Array.isArray(data.sectionsBootstrap)) patch.sectionsBootstrap = data.sectionsBootstrap\n if (Array.isArray(data.sectionsCompaction)) patch.sectionsCompaction = data.sectionsCompaction\n return patch\n}\n\n/**\n * \u4ECE\u914D\u7F6E\u4E2D\u79FB\u9664\u4E00\u4E2A custom\uFF08\u672C\u63D2\u4EF6\u6CE8\u5165\uFF09\u6BB5\uFF1A\u5B83\u4ECE inject \u5217\u8868\u6D88\u5931\uFF0C\u4E0D\u518D\u88AB\n * \u5F3A\u5236\u52A0\u5165\u5C4F\u853D\u96C6\u5408\uFF0C\u76F8\u5173\u7684\u66FF\u6362\u6587\u672C\u4E5F\u88AB\u6E05\u9664\u3002\u5269\u4F59\u7684 inject \u6761\u76EE\u4F1A\u88AB\u91CD\u65B0\n * \u7F16\u53F7\u4E3A\u8FDE\u7EED\u7684 0..n-1\uFF08\u865A\u62DF\u4E0B\u6807\u6A21\u578B\uFF09\uFF0C\u5220\u9664\u4E0D\u4F1A\u7559\u4E0B\u7A7A\u6D1E\u3002\u8BFB\u81EA\u5BBF\u4E3B\u6E05\u5355\u7684\n * system \u6BB5\u65E0\u6CD5\u8FD9\u6837\u79FB\u9664\uFF08\u4E0B\u6B21\u8BFB\u53D6\u6E05\u5355\u65F6\u5B83\u4EEC\u53C8\u4F1A\u56DE\u6765\uFF09\u3002\n */\nexport function removeSection(name: string, cfg: Config): Pick<Config, 'sections' | 'inject' | 'replace'> {\n const sections = (cfg.sections ?? []).filter((n) => n !== name)\n const inject = (cfg.inject ?? [])\n .filter((item) => item.name !== name)\n .map((item, i) => ({ ...item, order: i }))\n const replace = { ...(cfg.replace ?? {}) }\n delete replace[name]\n return { sections, inject, replace }\n}\n\n// \u2500\u2500 \u5DE5\u5177\u8FC7\u6EE4 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ToolsCfg = { exclude?: string[] }\n\n/** \u4E09\u4E2A\u9636\u6BB5\u90E8\u5206\u7684\u56FA\u5B9A\u5C55\u793A\u987A\u5E8F\uFF1A\u5F15\u5BFC\u671F \u2192 \u5E38\u9A7B\u671F \u2192 \u538B\u7F29\u53D7\u63A7\u671F\u3002\n * \u6052\u5B9A\u5168\u90E8\u6E32\u67D3 \u2014\u2014 \u9884\u8BBE\u6CA1\u6709\u67D0\u4E2A\u9636\u6BB5\u65F6\u8BE5\u90E8\u5206\u53EA\u662F\u7A7A\u7684\uFF0C\u7EDD\u4E0D\u9690\u85CF\u3002 */\nexport const PART_ORDER: PhaseViewKey[] = ['bootstrap', 'active', 'compaction']\n\n/**\n * \u4E00\u4E2A\u9636\u6BB5\u90E8\u5206\u5199\u56DE\u54EA\u4E00\u4EFD\u8FC7\u6EE4\u914D\u7F6E\uFF1A\u5F15\u5BFC\u671F \u2192 `tools.bootstrap`\u3001\u538B\u7F29\u53D7\u63A7\u671F \u2192\n * `tools.compaction`\u3001\u5E38\u9A7B\u671F \u2192 \u9759\u6001 `tools.exclude`\u3002\u4E09\u4EFD\u540D\u5355\u4E92\u4E0D\u7EE7\u627F\u3002\n */\nexport function phaseConfigKey(key: PhaseViewKey): 'bootstrap' | 'compaction' | 'static' {\n return key === 'active' ? 'static' : key\n}\n\n/**\n * \u628A\u4E00\u4E2A\u9636\u6BB5\u7684 exclude \u540D\u5355\u5199\u56DE\u6574\u4EFD\u5DE5\u5177\u914D\u7F6E\uFF0C\u8FD4\u56DE\u65B0\u5BF9\u8C61\uFF08\u5176\u4F59\u9636\u6BB5\u539F\u6837\u4FDD\u7559\uFF09\u3002\n * \u4E00\u6B21\u62D6\u653E\u53EF\u80FD\u8981\u540C\u65F6\u6539\u4E24\u4E2A\u9636\u6BB5\u7684\u540D\u5355\uFF08\u642C\u79FB = \u6E90\u9636\u6BB5\u9690\u85CF + \u76EE\u6807\u9636\u6BB5\u663E\u793A\uFF09\uFF0C\u5FC5\u987B\n * \u5728\u540C\u4E00\u4E2A\u5BF9\u8C61\u4E0A\u8FDE\u7EED\u5957\u5B8C\u518D\u843D\u4E00\u6B21\u5199\u5165 \u2014\u2014 \u5206\u4E24\u6B21\u5199\u4F1A\u5404\u81EA\u57FA\u4E8E\u65E7 cfg \u8BA1\u7B97\u800C\u4E92\u76F8\u8986\u76D6\u3002\n */\nexport function withPhaseExclude(tools: ToolsConfig | undefined, key: PhaseViewKey, exclude: string[]): ToolsConfig {\n const base = tools ?? {}\n const target = phaseConfigKey(key)\n if (target === 'bootstrap') return { ...base, bootstrap: { ...(base.bootstrap ?? {}), exclude } }\n if (target === 'compaction') return { ...base, compaction: { ...(base.compaction ?? {}), exclude } }\n return { ...base, exclude }\n}\n\n/**\n * \u628A\u4E00\u4E2A\u9636\u6BB5\u7684 add \u540D\u5355\uFF08\u8981\u52A0\u56DE\u8BE5\u9636\u6BB5\u7684\u5DE5\u5177\uFF09\u5199\u56DE\u6574\u4EFD\u5DE5\u5177\u914D\u7F6E\uFF0C\u8FD4\u56DE\u65B0\u5BF9\u8C61\u3002\n * \u4E0E withPhaseExclude \u5BF9\u79F0\uFF1A\u5E38\u9A7B\u671F\u5199\u9759\u6001 `tools.add`\uFF0C\u5F15\u5BFC\u671F\u5199 `tools.bootstrap.add`\uFF0C\n * \u538B\u7F29\u53D7\u63A7\u671F\u5199 `tools.compaction.add`\uFF0C\u5176\u4F59\u9636\u6BB5\u539F\u6837\u4FDD\u7559\u3002\n */\nexport function withPhaseAdd(tools: ToolsConfig | undefined, key: PhaseViewKey, add: string[]): ToolsConfig {\n const base = tools ?? {}\n const target = phaseConfigKey(key)\n if (target === 'bootstrap') return { ...base, bootstrap: { ...(base.bootstrap ?? {}), add } }\n if (target === 'compaction') return { ...base, compaction: { ...(base.compaction ?? {}), add } }\n return { ...base, add }\n}\n\n/** \u67D0\u4E2A\u5DE5\u5177\u5728\u5F53\u524D\u9ED1\u540D\u5355\u914D\u7F6E\u4E0B\u662F\u5426\u88AB\u9690\u85CF\u3002 */\nexport function isToolHidden(name: string, toolsCfg: ToolsCfg | undefined): boolean {\n return (toolsCfg?.exclude ?? []).includes(name)\n}\n\n/** \u5207\u6362\u67D0\u4E2A\u5DE5\u5177\u7684\u9690\u85CF\u72B6\u6001\uFF0C\u8FD4\u56DE\u65B0\u7684\u5DE5\u5177\u914D\u7F6E\uFF08\u4E0D\u6539\u539F\u5BF9\u8C61\uFF09\u3002 */\nexport function toggleTool(name: string, currentlyHidden: boolean, toolsCfg: ToolsCfg | undefined): ToolsCfg {\n const exclude = (toolsCfg?.exclude ?? []).slice()\n if (currentlyHidden) { const i = exclude.indexOf(name); if (i >= 0) exclude.splice(i, 1) }\n else if (!exclude.includes(name)) exclude.push(name)\n return { exclude }\n}\n\n// \u2500\u2500 \u6309 agent \u9884\u8BBE\u7684\u8986\u76D6\u7F16\u8F91 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * \u7F16\u8F91\u76EE\u6807\u7684\u300C\u663E\u793A\u89C6\u56FE\u300D\uFF1A0.9.0 \u8D77\u5168\u5C40\u5C42\u505C\u7528\uFF08\u63D0\u793A\u8BCD\u5FC5\u987B\u6309\u5177\u4F53\u9884\u8BBE\u4FEE\u6539\uFF09\uFF0C\n * \u9884\u8BBE\u89C6\u56FE\u53EA\u663E\u793A\u8BE5\u9884\u8BBE override \u81EA\u5DF1\u7684\u5B57\u6BB5 \u2014\u2014 \u7A7A\u7F3A\u5B57\u6BB5 = \u65E0\u5B9A\u5236 = \u5B98\u65B9\u9ED8\u8BA4\uFF0C\n * **\u4E0D\u518D\u53E0\u663E\u793A\u5168\u5C40\u7EE7\u627F\u503C**\uFF08\u8FD0\u884C\u65F6\u5DF2\u4E0D\u8BFB\u5B83\uFF0C\u663E\u793A\u4E86\u4F1A\u8BEF\u5BFC\uFF09\u3002`presets` \u4E0E\n * `activePreset` \u6C38\u8FDC\u6765\u81EA\u5168\u5C40 \u2014\u2014 \u9884\u8BBE\u5FEB\u7167\u5E93\u672C\u8EAB\u4E0D\u5206\u4F5C\u7528\u57DF\u3002\n */\nexport function editView(cfg: Config, target: string | undefined): Config {\n if (!target) return cfg\n const ovr = cfg.overrides?.[target] ?? {}\n return {\n sections: ovr.sections ?? [],\n sectionsBootstrap: ovr.sectionsBootstrap ?? [],\n sectionsCompaction: ovr.sectionsCompaction ?? [],\n replace: ovr.replace ?? {},\n inject: ovr.inject ?? [],\n tools: {\n exclude: ovr.tools?.exclude ?? [],\n add: ovr.tools?.add ?? [],\n bootstrap: ovr.tools?.bootstrap,\n compaction: ovr.tools?.compaction,\n },\n presets: cfg.presets,\n activePreset: cfg.activePreset,\n }\n}\n\n/**\n * \u5F80\u67D0\u4E2A agent \u9884\u8BBE\u7684 override \u91CC\u5199\u5165\u4E00\u4E2A\u5B57\u6BB5\uFF0C\u8FD4\u56DE\u65B0\u7684 overrides \u8BB0\u5F55\n * \uFF08\u4E0D\u6539\u539F\u5BF9\u8C61\uFF09\u3002\u4E0E editView \u914D\u5BF9\uFF1A\u7F16\u8F91\u89C6\u56FE\u91CC\u770B\u5230\u7684\u7EE7\u627F\u503C\u4E00\u65E6\u88AB\u4FEE\u6539\uFF0C\n * \u5C31\u6574\u4F53\u843D\u6210\u8BE5\u9884\u8BBE\u81EA\u5DF1\u7684\u5B57\u6BB5\uFF08\u5B57\u6BB5\u7EA7\u63A5\u7BA1\u8BED\u4E49\uFF09\u3002\n */\nexport function setOverrideField(\n cfg: Config,\n target: string,\n field: 'sections' | 'replace' | 'inject' | 'tools',\n value: unknown,\n): Record<string, OverrideData> {\n return {\n ...(cfg.overrides ?? {}),\n [target]: { ...(cfg.overrides?.[target] ?? {}), [field]: value },\n }\n}\n\n// \u2500\u2500 \u9884\u8BBE\u5217\u8868\u64CD\u4F5C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u5E8F\u5217\u5316\u9884\u8BBE\u7528\u4E8E\u5BFC\u51FA\uFF08JSON \u5B89\u5168\u7684\u5B8C\u6574\u5FEB\u7167\uFF09\u3002 */\nexport function serializePreset(preset: Preset): { name: string; data: PresetData } {\n return { name: preset.name, data: preset.data }\n}\n\n/**\n * Derive a safe default filename for a preset export. User-entered preset\n * names may contain characters that are illegal in filenames (`/\\:*?\"<>|`,\n * control chars) \u2014 those are replaced; a trailing dot/space is trimmed\n * (invalid on Windows); an empty or all-illegal result falls back to\n * `preset`.\n */\nexport function presetExportFilename(name: string): string {\n const sanitized = String(name)\n .replace(/[<>:\"/\\\\|?*\\u0000-\\u001f]/g, '_')\n .trim()\n .replace(/[. ]+$/, '')\n const base = sanitized === '' ? 'preset' : sanitized\n return `${base}.json`\n}\n\n/**\n * \u5BFC\u5165\u9884\u8BBE\uFF1A\u540C\u540D\u7684\u4F1A\u88AB\u8DF3\u8FC7\uFF0C\u53EA\u8FFD\u52A0\u540D\u5B57\u4E0D\u540C\u7684\u9884\u8BBE\u3002\u8FD4\u56DE\u65B0\u7684\u9884\u8BBE\u5217\u8868\n * \uFF08\u82E5\u6CA1\u6709\u4EFB\u4F55\u53D8\u66F4\u5219\u8FD4\u56DE\u539F\u5217\u8868\uFF09\u3002\n */\nexport function addImportedPresets(existing: Preset[], parsed: unknown, makeId: () => string): Preset[] {\n const incoming = Array.isArray(parsed) ? parsed : [parsed]\n const existingNames = new Set(existing.map((p) => p.name))\n const added = incoming\n .filter((p) => p && typeof (p as { name?: unknown }).name === 'string' && !existingNames.has((p as Preset).name))\n .map((p) => ({ id: makeId(), name: (p as Preset).name, data: ((p as Preset).data ?? {}) as PresetData }))\n return added.length > 0 ? [...existing, ...added] : existing\n}\n\n/** \u5220\u9664\u67D0\u4E2A\u9884\u8BBE\uFF1B\u82E5\u5B83\u6B63\u662F\u5F53\u524D\u6FC0\u6D3B\u7684\u9884\u8BBE\uFF0C\u5219\u540C\u65F6\u6E05\u9664 activeId\u3002 */\nexport function removePreset(presets: Preset[], id: string, activeId?: string): { presets: Preset[]; activeId?: string } {\n return {\n presets: presets.filter((p) => p.id !== id),\n activeId: activeId === id ? undefined : activeId,\n }\n}\n\n/** \u751F\u6210\u9884\u8BBE id\uFF1A\u65F6\u95F4\u6233 + \u968F\u673A\u6BB5\uFF08base36\uFF09\uFF0C\u591F\u7528\u4E14\u65E0\u9700\u989D\u5916\u4F9D\u8D56\u3002 */\nexport function genId(): string {\n return 'p_' + Date.now().toString(36) + Math.random().toString(36).slice(2, 7)\n}\n", "/**\n * \u63D0\u793A\u8BCD\u6BB5\u9762\u677F\u7684\u7EAF\u72B6\u6001\u903B\u8F91\uFF08\u65E0 React / \u65E0 IO\uFF09\u3002\n * \u4E0E src/client/SectionsTab.tsx \u5171\u4EAB\u540C\u4E00\u4EFD\u5B9E\u73B0\uFF08\u6D4F\u89C8\u5668\u91CC\u968F client bundle\n * \u6253\u5305\uFF1Bnode --test \u76F4\u63A5 import \u672C\u6587\u4EF6\u8DD1\u5355\u6D4B\uFF09\uFF0C\u4FDD\u8BC1\u300C\u6D4B\u8BD5\u5373\u4E0A\u7EBF\u4EE3\u7801\u300D\u3002\n *\n * \u9636\u6BB5\u6A21\u578B\uFF1A\u5F15\u5BFC\u671F\uFF08bootstrap\uFF09/ \u5E38\u9A7B\u671F\uFF08active\uFF09/ \u538B\u7F29\u53D7\u63A7\u671F\uFF08compaction\uFF09\n * \u6052\u5B9A\u5168\u90E8\u663E\u793A\uFF08\u9884\u8BBE\u6CA1\u6709\u67D0\u4E2A\u9636\u6BB5\u65F6\u8BE5\u90E8\u5206\u5C31\u662F\u7A7A\u7684\uFF09\uFF0C\u5404\u81EA\u62E5\u6709\u72EC\u7ACB\u7684\u6CE8\u5165\n * \u540D\u5355\u4E0E order \u7A7A\u95F4\uFF1B\u5C4F\u853D\u6309\u300C\u6BCF\u9636\u6BB5\u72EC\u7ACB\u540D\u5355\u300D\u5199\u56DE\uFF08\u5F15\u5BFC\u671F \u2192\n * sectionsBootstrap\uFF0C\u538B\u7F29\u53D7\u63A7\u671F \u2192 sectionsCompaction\uFF0C\u5E38\u9A7B\u671F \u2192 \u5168\u5C40 sections\uFF09\u3002\n * \u5165\u53C2\u7EDF\u4E00\u662F\u540D\u4E49\u9636\u6BB5\u952E\uFF0C\u4E0D\u518D\u6709\u300C\u540C\u5F62\u6298\u53E0\u7EC4\u300D\u8FD9\u79CD\u628A\u5F15\u5BFC\u671F\u5F53\u5E38\u9A7B\u671F\u7528\u7684\u5F62\u6001\u3002\n */\n\n/** \u540D\u4E49\u9636\u6BB5\u952E \u2192 \u5C4F\u853D\u540D\u5355\u5199\u56DE\u76EE\u6807\uFF08\u5E38\u9A7B\u671F\u7528\u5168\u5C40 sections\uFF09\u3002 */\nexport function sectionListOf(key) {\n return key === 'bootstrap' ? 'bootstrap' : key === 'compaction' ? 'compaction' : 'global'\n}\n\n/** \u540D\u4E49\u9636\u6BB5\u952E \u2192 \u6CE8\u5165\u9636\u6BB5\uFF1A\u538B\u7F29\u53D7\u63A7\u671F\u662F\u72EC\u7ACB\u6CE8\u5165\u9636\u6BB5\uFF08compaction\uFF09\u3002 */\nexport function injectPhaseOf(key) {\n return key === 'bootstrap' ? 'bootstrap' : key === 'active' ? 'active' : 'compaction'\n}\n\n/** \u67D0\u6CE8\u5165\u6BB5\u51FA\u73B0\u5728\u54EA\u4E9B\u9636\u6BB5\u90E8\u5206\uFF1Aalways \u5168\u9636\u6BB5\uFF1Bbootstrap/compaction/active\n * \u4EC5\u5404\u81EA\u5BF9\u5E94\u7684\u9636\u6BB5\uFF08\u4E0E\u670D\u52A1\u7AEF filterInjectByPhase \u7684\u4E09\u6001\u4E92\u76F8\u72EC\u7ACB\u4E00\u81F4\uFF09\u3002 */\nexport function acceptsInjectFor(key, phase) {\n if (phase === 'always') return true\n return phase === key\n}\n\n/** \u8BE5\u9636\u6BB5\u81EA\u5DF1\u7684\u5C4F\u853D\u540D\u5355\uFF08\u4E09\u6001\u4E92\u76F8\u72EC\u7ACB\uFF1A\u5F15\u5BFC\u671F sectionsBootstrap /\n * \u538B\u7F29\u53D7\u63A7\u671F sectionsCompaction / \u5E38\u9A7B\u671F sections\uFF0C\u4E92\u4E0D\u7EE7\u627F\u3001\u4E92\u4E0D\u5F71\u54CD\uFF09\u3002 */\nexport function deniedNames(cfg, key) {\n const list = sectionListOf(key)\n return list === 'bootstrap' ? (cfg.sectionsBootstrap ?? [])\n : list === 'compaction' ? (cfg.sectionsCompaction ?? [])\n : (cfg.sections ?? [])\n}\n\n/**\n * \u67D0\u4E2A\u9636\u6BB5\u90E8\u5206\u5F53\u524D\u7684\u6CE8\u5165\u8EAB\u4EFD\uFF08\u542B\u672A\u4FDD\u5B58\u8349\u7A3F\uFF09\u3002\n *\n * `names` = \u672C\u90E8\u5206\u53EF\u89C1\u7684\u6CE8\u5165\u6BB5\u540D\uFF08\u672C\u9636\u6BB5\u4E13\u5C5E + \u8DE8\u9636\u6BB5\u7684 always\uFF09\u3002post \u89C6\u56FE\u6765\u81EA\n * \u300C\u4E0A\u6B21\u4FDD\u5B58\u300D\u7684\u670D\u52A1\u7AEF\u7ED3\u679C\uFF0C\u5220\u9664\u53EA\u6539\u8349\u7A3F\uFF0C\u6240\u4EE5 post \u72EC\u6709\u6BB5\u5FC5\u987B\u6709 names \u80CC\u4E66\u624D\n * \u80FD\u663E\u793A \u2014\u2014 \u5426\u5219\u521A\u5220\u6389\u7684\u81EA\u5B9A\u4E49\u6BB5\u4F1A\u4EE5\u300C\u7CFB\u7EDF\u6BB5\u300D\u590D\u6D3B\uFF08\u8EAB\u4EFD\u53EA\u8BA4 custom \u6807\u8BB0\uFF0C\u6761\u76EE\n * \u6CA1\u4E86\u5C31\u88AB\u5224\u6210\u7CFB\u7EDF\uFF09\uFF0C\u518D\u7ECF\u4E00\u6B21\u91CD\u6392\u5C31\u88AB\u5199\u6210 custom:false \u7A7A\u6587\u672C\uFF0C\u7528\u6237\u586B\u7684\u5185\u5BB9\u88AB\n * \u62B9\u5E73\u3002`custom` \u53EA\u6536\u771F\u6B63\u7684\u81EA\u5B9A\u4E49\u6BB5\uFF0C`order` \u53EA\u6536\u672C\u9636\u6BB5\u7684\u8349\u7A3F\u5E8F\u3002\n *\n * `text` = \u672C\u9636\u6BB5\u751F\u6548\u7684\u7528\u6237\u6587\u672C\uFF1A\u81EA\u5B9A\u4E49\u6BB5\u81EA\u5E26\u7684\u6587\u672C\uFF0C\u4EE5\u53CA**\u7CFB\u7EDF\u6BB5\u5728\u672C\u9636\u6BB5\u88AB\n * \u66FF\u6362\u540E\u7684\u6587\u672C**\uFF08\u975E\u7A7A\u5373\u66FF\u6362\uFF09\u3002\u7CFB\u7EDF\u6BB5\u7684\u6587\u672C\u5FC5\u987B\u6309\u9636\u6BB5\u5B58 \u2014\u2014 \u6CE8\u5165\u6761\u76EE\u672C\u6765\u5C31\u5E26\n * `phase`\uFF0C\u670D\u52A1\u7AEF\u6309\u9636\u6BB5\u7B5B\u9009\uFF0C\u6240\u4EE5\u4E09\u4E2A\u9636\u6BB5\u5404\u6539\u5404\u7684\u6587\u672C\u4E92\u4E0D\u5F71\u54CD\uFF1B\u65E7\u7684\u5168\u5C40\n * `replace` \u5B57\u5178\u4E00\u4EFD\u6587\u672C\u5BF9\u4E09\u4E2A\u9636\u6BB5\u540C\u65F6\u751F\u6548\uFF0C\u5DF2\u4E0D\u627F\u62C5\u754C\u9762\u7F16\u8F91\u3002\n */\nexport function injectedAt(cfg, key) {\n const phase = injectPhaseOf(key)\n const names = new Set()\n const custom = new Set()\n const text = new Map()\n const order = new Map()\n for (const item of cfg.inject ?? []) {\n if (item === null || typeof item !== 'object' || typeof item.name !== 'string') continue\n const itemPhase = item.phase ?? 'always'\n if (itemPhase === phase) order.set(item.name, item.order ?? 0)\n if (!acceptsInjectFor(key, itemPhase)) continue\n names.add(item.name)\n if (item.text && !text.has(item.name)) text.set(item.name, item.text)\n if (item.custom === true) custom.add(item.name)\n }\n return { phase, names, custom, text, order }\n}\n\n/**\n * \u5C4F\u853D/\u6062\u590D\u4E00\u4E2A\u6BB5\uFF08\u5F53\u524D\u9636\u6BB5\u8BED\u4E49\uFF09\uFF1A\u8FD4\u56DE\u9700\u8981\u5199\u76D8\u7684\u5B57\u6BB5\u8865\u4E01\u3002\n * \u4E09\u6001\u540D\u5355\u4E92\u76F8\u72EC\u7ACB\uFF1A\u53EA\u8BFB\u5199\u672C\u9636\u6BB5\u81EA\u5DF1\u7684\u540D\u5355\uFF08\u5F15\u5BFC\u671F \u2192 sectionsBootstrap\uFF0C\n * \u538B\u7F29\u53D7\u63A7\u671F \u2192 sectionsCompaction\uFF0C\u5E38\u9A7B\u671F \u2192 sections\uFF09\uFF0C\u5C4F\u853D / \u6062\u590D\u90FD\u7EDD\u4E0D\n * \u6CE2\u53CA\u5176\u5B83\u9636\u6BB5\u7684\u540D\u5355 \u2014\u2014 \u4E00\u4E2A\u9636\u6BB5\u7684\u5C4F\u853D\u4E0D\u518D\u8FDE\u5E26\u5C4F\u853D\u53E6\u4E00\u4E2A\u9636\u6BB5\u3002\n * \u540D\u5355\u65E0\u53D8\u5316\u65F6\u4E0D\u4EA7\u51FA\u5B57\u6BB5\uFF08\u7A7A\u8865\u4E01 = \u4E0D\u5199\u76D8\uFF09\uFF0C\u907F\u514D\u628A\u7EE7\u627F\u503C\u51BB\u7ED3\u6210\u65E0\u610F\u4E49\u7684\n * \u7A7A\u6570\u7EC4\u8986\u76D6\u3002\n */\nexport function blockPatch(cfg, key, name, blocked) {\n const list = sectionListOf(key)\n const field = list === 'bootstrap' ? 'sectionsBootstrap' : list === 'compaction' ? 'sectionsCompaction' : 'sections'\n const cur = (cfg[field] ?? []).slice()\n const i = cur.indexOf(name)\n if (blocked) {\n if (i >= 0) return {}\n cur.push(name)\n } else {\n if (i < 0) return {}\n cur.splice(i, 1)\n }\n return { [field]: cur }\n}\n\n/**\n * \u91CD\u6392/\u63D2\u5165\u4E00\u4E2A\u9636\u6BB5\u7684\u6709\u5E8F\u884C\u5217\u8868\uFF1A\u628A dragName \u4ECE\u5217\u8868\u4E2D\u79FB\u9664\u540E\uFF0C\u63D2\u5165\u5230\n * targetName \u884C\u4E4B\u4E0A\uFF08pos='above'\uFF09\u6216\u4E4B\u4E0B\uFF08pos='below'\uFF09\uFF1B\u8FD4\u56DE\u65B0\u5217\u8868\u3002\n * \u62D6\u5165\u7684\u65B0\u6BB5\u7531\u8C03\u7528\u65B9\u4EE5 newRow \u63D0\u4F9B\uFF0C\u63D2\u5165\u540E\u4FDD\u7559\u5728\u5217\u8868\u4E2D\uFF08\u5176\u4F59\u884C\u4FDD\u6301\u539F\u6837\uFF09\u3002\n */\nexport function reorderInsert(rows, dragName, targetName, pos, newRow = null) {\n const base = rows.filter((row) => row.name !== dragName)\n const idx = base.findIndex((row) => row.name === targetName)\n if (idx < 0) return null\n const insertAt = Math.max(0, Math.min(pos === 'above' ? idx : idx + 1, base.length))\n const entry = newRow ?? rows.find((row) => row.name === dragName)\n if (!entry) return null\n base.splice(insertAt, 0, entry)\n return base\n}\n\n/**\n * \u6301\u4E45\u5316\u4E00\u4E2A\u9636\u6BB5\u7684\u6709\u5E8F\u5217\u8868\uFF08v1 persistOrder \u7684\u9010\u9636\u6BB5\u7248\uFF09\uFF1A\u628A rows\uFF08\u6709\u5E8F\u884C\uFF09\n * \u5199\u6210\u8BE5\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\uFF0Corder = \u8FDE\u7EED\u6574\u6570\uFF080,1,2,\u2026\uFF09\u2014\u2014\u300C\u865A\u62DF order \u51B3\u5B9A\u6CE8\u5165\n * \u987A\u5E8F\u300D\uFF1B\u6587\u672C\u4F18\u5148\u7EA7 = \u672C\u9636\u6BB5\u7684\u7528\u6237\u66FF\u6362\u6587\u672C\uFF08row.override\uFF09\u2192 \u81EA\u5B9A\u4E49\u6BB5\u81EA\u5E26\u7684\n * \u6587\u672C\uFF08row.text\uFF09\u2192 \u7A7A\u6587\u672C\uFF08= \u4EC5 order \u8986\u76D6\uFF0C\u670D\u52A1\u7AEF\u4FDD\u7559\u539F\u6587\uFF09\u3002\u4E09\u8005\u7F3A\u4E00\u4E0D\u53EF\uFF1A\n * \u91CD\u6392\u8D70\u7684\u5C31\u662F\u8FD9\u4E2A\u51FD\u6570\uFF0C\u6F0F\u6389 override \u4F1A\u8BA9\u4E00\u6B21\u62D6\u52A8\u628A\u7528\u6237\u5728\u8BE5\u9636\u6BB5\u6539\u7684\u6587\u672C\u62B9\u5E73\u3002\n * \u5176\u5B83\u9636\u6BB5\uFF08\u542B always\uFF09\u7684\u6CE8\u5165\u6761\u76EE\u539F\u6837\u4FDD\u7559\u3002\n */\nexport function phaseInjectEntries(cfg, key, rows) {\n const phase = injectPhaseOf(key)\n const others = (cfg.inject ?? []).filter((item) => (item.phase ?? 'always') !== phase)\n const entries = rows.map((row, i) => ({\n name: row.name,\n order: i,\n text: row.override || (row.custom ? (row.text ?? '') : ''),\n phase,\n custom: row.custom,\n }))\n return [...others, ...entries]\n}\n\n/**\n * \u4E09\u6001\u540C\u6B65\u6301\u4E45\u5316\uFF1ArowsByKey \u7ED9\u51FA\u4E09\u4E2A\u9636\u6BB5\u5404\u81EA\u7684\u6709\u5E8F\u884C\u96C6\u5408\uFF08bootstrap /\n * active / compaction\uFF09\uFF0C\u751F\u6210\u5B8C\u6574 inject \u5217\u8868 \u2014\u2014 always \u6761\u76EE\u539F\u6837\u4FDD\u7559\uFF0C\u4E09\u4E2A\n * \u9636\u6BB5\u5404\u81EA\u5199\u6210\u8FDE\u7EED\u865A\u62DF order \u7684\u6CE8\u5165\u6761\u76EE\uFF08\u6761\u76EE\u5F62\u72B6\u4E0E phaseInjectEntries \u5B8C\u5168\n * \u4E00\u81F4\uFF09\u3002\u7528\u4E8E\u300C\u4E09\u6001\u540C\u6B65\u300D\u7684\u4E00\u6B21\u5199\u5165\uFF1Aedit \u5BF9 inject \u662F\u6574\u4F53\u66FF\u6362\uFF0C\u9010\u9636\u6BB5\u5404\u5199\n * \u4E00\u6B21\u4F1A\u4E92\u76F8\u8986\u76D6\u53EA\u7559\u4E0B\u6700\u540E\u4E00\u6B21\u3002\n */\nexport function mergedPhaseInjectEntries(cfg, rowsByKey) {\n const always = (cfg.inject ?? []).filter((item) => (item.phase ?? 'always') === 'always')\n const entries = ['bootstrap', 'active', 'compaction'].flatMap((key) => {\n const phase = injectPhaseOf(key)\n return (rowsByKey[key] ?? []).map((row, i) => ({\n name: row.name,\n order: i,\n text: row.override || (row.custom ? (row.text ?? '') : ''),\n phase,\n custom: row.custom,\n }))\n })\n return [...always, ...entries]\n}\n\n/**\n * \u4E09\u6001\u540C\u6B65\uFF08\u5E76\u96C6\u955C\u50CF\uFF09\u7684\u9AA8\u67B6\u987A\u5E8F\uFF1A\u5E38\u9A7B\u671F\u5728\u524D \u2014\u2014 \u5E76\u96C6\u884C\u5E8F\u4EE5\u5E38\u9A7B\u671F\u4E3A\u51C6\uFF0C\u5176\u4F59\n * \u4E24\u6001\u72EC\u6709\u7684\u6BB5\u6309\u5404\u81EA\u987A\u5E8F\u8FFD\u52A0\u5728\u5C3E\u90E8\uFF08\u4E0E PART_ORDER \u7684\u5C55\u793A\u5E8F\u4E0D\u540C\uFF0C\u8FD9\u91CC\u662F\u6570\u636E\u5E8F\uFF09\u3002\n */\nconst MIRROR_KEYS = ['active', 'bootstrap', 'compaction']\n\n/** \u955C\u50CF\u5230\u67D0\u9636\u6BB5\u65F6\u8BE5\u884C\u8981\u5199\u7684\u6B63\u6587\uFF08'' = \u53EA\u8986\u76D6 order\uFF0C\u6CE8\u518C\u8868\u539F\u6587\u4E0D\u52A8\uFF09\u3002\n * \u81EA\u5B9A\u4E49\u6BB5\u4E0E\u5E26\u66FF\u6362\u6587\u672C\u7684\u884C\u5FC5\u987B\u5199\u6B63\u6587\uFF08\u5426\u5219\u66FF\u6362\u5728\u8BE5\u9636\u6BB5\u4E0D\u751F\u6548\uFF09\uFF1B\u975E\u539F\u751F\u6BB5\n * \u5FC5\u987B\u5199\u6B63\u6587\uFF08\u5426\u5219\u670D\u52A1\u7AEF\u5EFA\u4E0D\u51FA\u6765\uFF0C\u89C1 applySectionPolicy \u7684\u5E7D\u7075\u6BB5\u5B88\u536B\uFF09\u2014\u2014\n * \u52A8\u6001\u6BB5\uFF08\u7A7A\u6587\u672C / \u5BBF\u4E3B\u56DE\u663E\u7684 `<\u52A8\u6001\u751F\u6210>`\uFF09\u53D6\u4E0D\u5230\u6B63\u6587\uFF0C\u8FD4\u56DE '' \u8BA9\u8C03\u7528\u65B9\u8DF3\u8FC7\u3002 */\nfunction mirrorText(row, native) {\n if (row.custom === true) return row.override || (row.text ?? '')\n if (row.override !== '') return row.override\n if (native === true) return ''\n const text = row.text ?? ''\n return text === '' || text.startsWith('<') ? '' : text\n}\n\n/**\n * \u4E09\u6001\u540C\u6B65\u7684\u5E76\u96C6\u884C\u96C6\uFF1A\u5E38\u9A7B\u671F\u7684\u884C\u5E8F\u4E3A\u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8 \u2014\u2014\n * \u4E09\u6001\u6700\u7EC8\u6536\u655B\u5230\u540C\u4E00\u4EFD\u540D\u5355\uFF0C\u4E0D\u5C4F\u853D\u4EFB\u4F55\u6BB5\u3002\u540C\u540D\u6BB5\u53EA\u4FDD\u7559\u4E00\u884C\uFF1A\u4F18\u5148\u53D6\u300C\u8BE5\u6BB5\u539F\u751F\n * \u5B58\u5728\u300D\u7684\u90A3\u4E2A\u9636\u6BB5\u7684\u884C\uFF08\u6587\u672C / \u8EAB\u4EFD / \u52FE\u9009\u4EE5\u5B83\u4E3A\u51C6\uFF09\uFF0C\u90FD\u975E\u539F\u751F\u65F6\u53D6\u9AA8\u67B6\u5E8F\u91CC\n * \u9996\u6B21\u51FA\u73B0\u7684\u90A3\u884C \u2014\u2014 \u8FD9\u6837\u539F\u751F\u9636\u6BB5\u7684\u6587\u672C\u4E0D\u4F1A\u88AB\u955C\u50CF\u5199\u56DE\u51BB\u7ED3\u8FDB\u914D\u7F6E\u3002\n * `views` \u91CC\u67D0\u9636\u6BB5\u4E3A null\uFF08\u88C5\u914D\u672A\u5C31\u7EEA\uFF09\u65F6\u8BE5\u9636\u6BB5\u4E0D\u53C2\u4E0E\u5E76\u96C6\uFF0C\u7EDD\u4E0D\u81C6\u9020\u884C\u3002\n * `nativeOf(key, name)` \u53EF\u9009\uFF1A\u5224\u5B9A\u8BE5\u6BB5\u662F\u5426\u5728\u76EE\u6807\u9636\u6BB5\u7684\u88C5\u914D\u8F93\u5165\u91CC\u3002\n */\nexport function mirroredRows(cfg, views, nativeOf) {\n const picked = new Map()\n const order = []\n for (const key of MIRROR_KEYS) {\n for (const row of phaseRows(cfg, views?.[key] ?? null, key)) {\n const native = nativeOf?.(key, row.name) === true\n const cur = picked.get(row.name)\n if (cur === undefined) {\n picked.set(row.name, { row, native })\n order.push(row.name)\n } else if (cur.native !== true && native) {\n picked.set(row.name, { row, native })\n }\n }\n }\n return order.map((name) => picked.get(name).row)\n}\n\n/**\n * \u4E09\u6001\u540C\u6B65\u6301\u4E45\u5316\uFF1A\u628A\u540C\u4E00\u4EFD\u5E76\u96C6\u884C\u96C6\u955C\u50CF\u5199\u5165\u4E09\u4E2A\u9636\u6BB5\uFF08\u5404\u9636\u6BB5\u8FDE\u7EED order\uFF0C\u6761\u76EE\n * \u5F62\u72B6\u4E0E phaseInjectEntries \u5B8C\u5168\u4E00\u81F4\uFF09\u3002\n *\n * `nativeOf(key, name)` \u5224\u5B9A\u8BE5\u6BB5\u662F\u5426\u5DF2\u5728\u76EE\u6807\u9636\u6BB5\u7684**\u88C5\u914D\u8F93\u5165**\uFF08base \u89C6\u56FE\uFF09\u91CC\uFF1A\n * - \u539F\u751F\u7CFB\u7EDF\u6BB5\u4E14\u65E0\u66FF\u6362\u6587\u672C \u2192 \u53EA\u5199 order \u8986\u76D6\uFF0C\u7EDD\u4E0D\u628A\u6CE8\u518C\u8868\u539F\u6587\u51BB\u7ED3\u8FDB\u914D\u7F6E\uFF1B\n * - \u81EA\u5B9A\u4E49\u6BB5 / \u5E26\u66FF\u6362\u6587\u672C\u7684\u884C \u2192 \u6B63\u6587\u7167\u5199\uFF08\u4E09\u6001\u540C\u65F6\u751F\u6548\uFF09\uFF1B\n * - \u975E\u539F\u751F\u6BB5 \u2192 \u5FC5\u987B\u5E26\u6B63\u6587\u624D\u80FD\u88AB\u670D\u52A1\u7AEF\u5EFA\u51FA\u6765\uFF1B\u52A8\u6001\u6BB5\uFF08`<\u52A8\u6001\u751F\u6210>`\uFF0C\u53D6\u4E0D\u5230\n * \u6B63\u6587\uFF09\u5EFA\u4E0D\u51FA\u6765\uFF0C\u53EA\u80FD\u8DF3\u8FC7 \u2014\u2014 \u5B83\u7559\u5728\u81EA\u5DF1\u539F\u6709\u7684\u9636\u6BB5\u91CC\uFF08mirrorSkippedNames\n * \u4F9B\u754C\u9762\u63D0\u793A\uFF09\u3002\n * \u8FD4\u56DE null/undefined = \u8BE5\u9636\u6BB5\u89C6\u56FE\u672A\u5C31\u7EEA\uFF0C\u6574\u6BB5\u8DF3\u8FC7\uFF08\u7EDD\u4E0D\u628A\u7F3A\u5931\u7684\u9636\u6BB5\u5F53\u7A7A\u96C6\u5199\u6389\uFF09\u3002\n * always \u6761\u76EE\u53EA\u4FDD\u7559\u540D\u5B57\u4ECD\u5728\u884C\u96C6\u91CC\u7684\uFF1A\u5220\u9664\u4E00\u4E2A\u81EA\u5B9A\u4E49\u6BB5 = \u4E09\u6001\u4E00\u8D77\u6D88\u5931\uFF08always\n * \u6761\u76EE\u4F1A\u8BA9\u5B83\u5728\u4E09\u4E2A\u9636\u6BB5\u590D\u6D3B\uFF09\u3002\n */\nexport function mirrorPhaseInjectEntries(cfg, rows, nativeOf) {\n const names = new Set(rows.map((row) => row.name))\n const always = (cfg.inject ?? []).filter((item) => (item.phase ?? 'always') === 'always' && names.has(item.name))\n const entries = []\n for (const key of MIRROR_KEYS) {\n const phase = injectPhaseOf(key)\n let order = 0\n for (const row of rows) {\n const native = nativeOf === undefined ? false : nativeOf(key, row.name)\n if (native === null || native === undefined) continue\n const text = mirrorText(row, native)\n if (native !== true && text === '') continue\n entries.push({ name: row.name, order: order++, text, phase, custom: row.custom === true })\n }\n }\n return [...always, ...entries]\n}\n\n/**\n * \u955C\u50CF\u65F6\u5728\u76EE\u6807\u9636\u6BB5\u5EFA\u4E0D\u51FA\u6765\u7684\u6BB5\u540D\uFF08\u52A8\u6001\u6BB5\u65E0\u6B63\u6587\uFF09\uFF1A\u754C\u9762\u636E\u6B64\u7ED9\u51FA\u8BF4\u660E \u2014\u2014\n * \u884C\u96C6\u91CC\u4ECD\u663E\u793A\u5B83\uFF0C\u4F46\u53E6\u5916\u4E24\u6001\u7684\u88C5\u914D\u91CC\u4E0D\u4F1A\u6709\u5B83\u3002\n */\nexport function mirrorSkippedNames(rows, nativeOf) {\n const skipped = new Set()\n for (const key of MIRROR_KEYS) {\n for (const row of rows) {\n const native = nativeOf?.(key, row.name)\n if (native === null || native === undefined || native === true) continue\n if (mirrorText(row, false) === '') skipped.add(row.name)\n }\n }\n return [...skipped]\n}\n\n/**\n * \u4E09\u6001\u540C\u6B65\u7684\u5C4F\u853D\u540D\u5355\uFF1A\u4E09\u4EFD\u540D\u5355\u7EDF\u4E00\u4E3A\u5E76\u96C6\u884C\u96C6\u91CC\u7684\u5C4F\u853D\u540D\u96C6\u5408\uFF08\u884C\u96C6\u5305\u542B\u4E09\u6001\u5168\u90E8\n * \u7684\u884C\uFF0C\u542B\u88AB\u5C4F\u853D\u9879\uFF0C\u6240\u4EE5\u7528\u6237\u7684\u5C4F\u853D\u610F\u56FE\u4E0D\u4F1A\u4E22\uFF09\u3002\u540D\u5B57\u987A\u5E8F\u6309\u884C\u96C6\u987A\u5E8F\uFF0C\u7A33\u5B9A\u53EF\u8BFB\u3002\n */\nexport function mirroredDeniedLists(rows) {\n const blocked = rows.filter((row) => row.blocked === true).map((row) => row.name)\n return { sections: blocked, sectionsBootstrap: [...blocked], sectionsCompaction: [...blocked] }\n}\n\n/**\n * \u4E00\u4E2A\u9636\u6BB5\u90E8\u5206\u7684\u5168\u90E8\u884C\uFF08\u63D0\u793A\u8BCD Tab \u6BCF\u884C\uFF09\uFF1A\u884C\u96C6\u5408 = \u300C\u771F\u5B9E\u8FDB\u5165\u8BE5\u9636\u6BB5\u88C5\u914D\u7684\u6BB5\u300D\n *\uFF08post \u89C6\u56FE\uFF0C\u4E0E\u9884\u89C8\u4E00\u81F4 \u2014\u2014 \u9884\u8BBE\u539F\u751F\u9636\u6BB5\u63D2\u4EF6\u88C1\u526A\u6389\u7684\u6BB5\u4E0D\u663E\u793A\uFF09\u222A\u300C\u88AB\u5C4F\u853D\u7684\u6BB5\u300D\n *\uFF08\u5C4F\u853D\u540D\u5355\u542B\u672A\u4FDD\u5B58\u8349\u7A3F\uFF0C\u968F\u65F6\u53EF\u53CD\u9009\uFF09\u222A\u300C\u914D\u7F6E\u91CC\u5C5E\u4E8E\u8BE5\u9636\u6BB5\u7684\u81EA\u5B9A\u4E49\u6CE8\u5165\u6BB5\u300D\u3002\n * \u987A\u5E8F\u4EE5 base\uFF08\u9884\u8FC7\u6EE4\uFF09\u89C6\u56FE\u7684\u9AA8\u67B6\u4E3A\u5E95\uFF0C\u518D\u53E0\u52A0\u300C\u8BE5\u9636\u6BB5\u7684\u6CE8\u5165 order\u300D\u8349\u7A3F\u5E8F\n * \u2014\u2014 \u672A\u4FDD\u5B58\u7684\u91CD\u6392\u7ACB\u5373\u53CD\u6620\u5230\u754C\u9762\u3002\u6587\u672C post \u4F18\u5148\uFF08\u66FF\u6362 / \u6CE8\u5165\u7ED3\u679C\uFF09\uFF0C\u56DE\u9000\n * base \u539F\u6587\u4E0E\u6CE8\u5165\u6587\u672C\u3002\u8EAB\u4EFD\u53EA\u8BA4\u6CE8\u5165\u6761\u76EE\u7684 custom \u9690\u85CF\u6807\u8BB0\uFF0C\u7EDD\u4E0D\u4E92\u76F8\u8F6C\u6362\u3002\n * `view` = \u4E09\u9636\u6BB5\u9884\u89C8\u88C5\u914D\u91CC\u7684\u5BF9\u5E94\u9636\u6BB5\uFF08\u53EF\u4E3A null = \u89C6\u4E3A\u7A7A\uFF09\u3002\u4ECE SectionsTab\n * \u7684 rowsOf \u539F\u6837\u8FC1\u51FA \u2014\u2014 \u7EAF\u51FD\u6570\uFF0CUI \u4E0E node --test \u5355\u6D4B\u5171\u7528\u540C\u4E00\u4EFD\u5B9E\u73B0\u3002\n */\nexport function phaseRows(cfg, view, key) {\n const replace = cfg.replace ?? {}\n const denied = new Set(deniedNames(cfg, key))\n const postByName = new Map((view?.sections ?? []).map((sec) => [sec.name, sec]))\n const baseByName = new Map((view?.baseSections ?? []).map((sec) => [sec.name, sec]))\n const { phase, names: injectedHere, custom: customNames, text, order: phaseOrder } = injectedAt(cfg, key)\n const names = []\n const seen = new Set()\n const push = (name) => { if (!seen.has(name)) { seen.add(name); names.push(name) } }\n // base \u9AA8\u67B6\u987A\u5E8F\u91CC\u53D6 post \u6BB5\u4E0E\u88AB\u5C4F\u853D\u6BB5\uFF08\u4FDD\u6301\u81EA\u7136\u4F4D\u7F6E\uFF09\u3002\u88AB\u5C4F\u853D\u53D6\u5E76\u96C6\uFF1A\n // \u5F53\u524D\u8349\u7A3F\u540D\u5355\uFF08\u5207\u6362\u7ACB\u5373\u53CD\u9988\uFF09\u222A \u4E0A\u6B21\u4FDD\u5B58\u7684\u540D\u5355\uFF08base \u7684 blocked \u6807\u8BB0 \u2014\u2014\n // \u521A\u89E3\u9664\u5C4F\u853D\u7684\u884C\u4E0D\u4F1A\u7ACB\u5373\u6D88\u5931\uFF0C\u4ECD\u53EF\u518D\u52FE\u56DE\u53BB\uFF09\u3002\n for (const sec of view?.baseSections ?? []) {\n if (postByName.has(sec.name) || denied.has(sec.name) || sec.blocked === true) push(sec.name)\n }\n // post \u72EC\u6709\u6BB5 = \u672C\u63D2\u4EF6\u6CE8\u5165\u8FDB\u53BB\u7684\u6BB5\uFF08post \u6052\u4E3A base \u51CF\u53BB\u5C4F\u853D\u518D\u52A0\u4E0A\u6CE8\u5165\uFF09\uFF0C\n // \u8FFD\u52A0\u5728\u5C3E\u90E8\u3002\u4F46\u5B83\u6765\u81EA\u300C\u4E0A\u6B21\u4FDD\u5B58\u300D\u7684\u670D\u52A1\u7AEF\u7ED3\u679C\uFF0C\u5220\u9664\u53EA\u6539\u8349\u7A3F\uFF0C\u6240\u4EE5\u5FC5\u987B\n // \u6709\u5F53\u524D inject \u6761\u76EE\u80CC\u4E66 \u2014\u2014 \u5426\u5219\u521A\u5220\u6389\u7684\u81EA\u5B9A\u4E49\u6BB5\u4F1A\u4EE5\u300C\u7CFB\u7EDF\u6BB5\u300D\u590D\u6D3B\uFF08\u8EAB\u4EFD\n // \u53EA\u8BA4 inject \u7684 custom \u6807\u8BB0\uFF0C\u6761\u76EE\u6CA1\u4E86\u5C31\u88AB\u5224\u6210\u7CFB\u7EDF\uFF09\uFF0C\u518D\u7ECF\u4E00\u6B21\u91CD\u6392\u5C31\u88AB\u5199\u6210\n // custom:false \u7A7A\u6587\u672C\uFF0C\u7528\u6237\u586B\u7684\u5185\u5BB9\u88AB\u62B9\u5E73\u3002\n for (const name of postByName.keys()) {\n if (baseByName.has(name) || injectedHere.has(name)) push(name)\n }\n // \u7CBE\u786E\u5C5E\u4E8E\u8BE5\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\uFF1A\u81EA\u5B9A\u4E49\u6BB5\u59CB\u7EC8\u663E\u793A\uFF1B\u7CFB\u7EDF\u6BB5\u5728\u88C5\u914D\u8F93\u5165\u91CC\u89C1\u8FC7\n //\uFF08base/post\uFF09**\u6216**\u5E26\u7740\u7528\u6237\u4E3A\u8BE5\u9636\u6BB5\u586B\u7684\u6587\u672C\uFF08= \u4ECE\u5168\u90E8\u6C60\u663E\u5F0F\u52A0\u8FDB\u6765\u7684\uFF09\u624D\n // \u663E\u793A \u2014\u2014 \u65E2\u8BA9\u62D6\u5165\u7ACB\u5373\u51FA\u73B0\uFF0C\u53C8\u4E0D\u8BA9\u5386\u53F2\u9057\u7559\u7684\u9648\u65E7\u6761\u76EE\u628A\u88C5\u914D\u91CC\u6839\u672C\u6CA1\u6709\u7684\u6BB5\u5E26\u56DE\u6765\u3002\n for (const item of cfg.inject ?? []) {\n if (item === null || typeof item !== 'object' || typeof item.name !== 'string') continue\n if ((item.phase ?? 'always') !== phase) continue\n if (item.custom === true || text.get(item.name) || baseByName.has(item.name) || postByName.has(item.name)) push(item.name)\n }\n // \u8DE8\u9636\u6BB5\u751F\u6548\u7684\u81EA\u5B9A\u4E49\u6BB5\uFF08\u5982 always\uFF09\u3002\n for (const name of customNames) push(name)\n const rows = names.map((name) => {\n // \u672C\u9636\u6BB5\u7684\u7528\u6237\u66FF\u6362\u6587\u672C\uFF1A\u53EA\u8BA4\u5C5E\u4E8E\u672C\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\uFF08injectedAt \u5DF2\u6309\u9636\u6BB5\u7B5B\uFF09\u3002\n const override = text.get(name) ?? ''\n return {\n name,\n text: postByName.get(name)?.text ?? baseByName.get(name)?.text ?? '',\n replaced: override !== '' || Object.hasOwn(replace, name),\n custom: customNames.has(name),\n override,\n blocked: denied.has(name),\n }\n })\n // \u8349\u7A3F\u5E8F\u53E0\u52A0\uFF1A\u8BE5\u9636\u6BB5\u6709\u6CE8\u5165 order \u5C31\u6309\u5B83\u91CD\u6392\u5F53\u524D\u884C\uFF08\u672A\u4FDD\u5B58\u7684\u62D6\u52A8/\u7BAD\u5934\n // \u7ACB\u5373\u751F\u6548\uFF09\uFF1B\u65E0 order \u7684\u884C\u8D70 base \u9AA8\u67B6\u76F8\u5BF9\u5E8F\uFF08\u7A33\u5B9A\u6392\u5E8F\uFF09\u3002\n if (phaseOrder.size > 0) {\n const fallback = new Map(rows.map((row, i) => [row.name, i]))\n rows.sort((a, b) => (phaseOrder.get(a.name) ?? fallback.get(a.name) ?? 0) - (phaseOrder.get(b.name) ?? fallback.get(b.name) ?? 0))\n }\n return rows\n}\n\n/**\n * \u300C\u5E94\u7528\u4E2D\u6587\u300D\uFF08\u5F00\u5173\u5F00\u542F\u65B9\u5411\uFF0C\u7B49\u6548\u624B\u52A8\u7F16\u8F91\uFF09\uFF1A\u628A\u4E09\u4E2A\u9636\u6BB5\u5404\u81EA\u7684\u884C\u91CC\u540D\u5B57\u547D\u4E2D\n * zhMap \u7684**\u975E\u81EA\u5B9A\u4E49**\u884C\u6253\u4E0A\u4E2D\u6587\u6587\u672C\u8865\u4E01\uFF0C\u518D\u7ECF mergedPhaseInjectEntries \u751F\u6210\n * \u5B8C\u6574 inject \u5217\u8868\uFF08\u8C03\u7528\u65B9\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF0C\u4FDD\u5B58\u540E\u751F\u6548\uFF09\u3002zhMap \u6761\u76EE\u4E3A\u5B57\u7B26\u4E32\n *\uFF08\u6574\u6BB5\u66FF\u6362\uFF09\u6216\u51FD\u6570\uFF08\u5165\u53C2\u8BE5\u884C\u539F\u6587\uFF0C\u8FD4\u56DE\u7A7A\u503C = \u653E\u5F03\u66FF\u6362\uFF0C\u5982 tools:sdk \u7684\u56F4\u680F\n * \u5B88\u536B\uFF09\uFF1B\u672A\u547D\u4E2D\u7684\u884C\u4E0E\u9636\u6BB5\u539F\u6837\u4FDD\u7559\uFF0C\u6BB5\u6570\u4E0E\u6CE8\u5165\u4E0D\u589E\u4E0D\u51CF\u3002\u81EA\u5B9A\u4E49\u6BB5\u662F\u7528\u6237\u81EA\u64B0\n * \u5185\u5BB9\uFF0C\u7EDD\u4E0D\u8986\u76D6\u3002`views` = \u4E09\u9636\u6BB5\u9884\u89C8\u88C5\u914D\uFF08\u952E\u53EF\u4E3A null \u2014\u2014 \u8BE5\u9636\u6BB5\u884C\u96C6\u89C6\u4E3A\u7A7A\uFF09\u3002\n */\nexport function zhMergedInjectEntries(cfg, views, zhMap) {\n const patched = {}\n for (const key of ['bootstrap', 'active', 'compaction']) {\n patched[key] = phaseRows(cfg, views?.[key] ?? null, key).map((row) => {\n if (row.custom) return row\n const entry = zhMap?.[row.name]\n if (entry === undefined) return row\n const zh = typeof entry === 'function' ? entry(row.text) : entry\n return zh ? { ...row, override: zh, text: zh } : row\n })\n }\n return mergedPhaseInjectEntries(cfg, patched)\n}\n\n/**\n * \u300C\u56DE\u5F52\u82F1\u6587\u300D\uFF08\u5F00\u5173\u5173\u95ED\u65B9\u5411\uFF09\uFF1A\u628A\u4E09\u4E2A\u9636\u6BB5\u884C\u91CC\u547D\u4E2D\u8BD1\u672C\u7684\u975E\u81EA\u5B9A\u4E49\u884C\u7684\u66FF\u6362\n * \u6587\u672C\u6E05\u7A7A \u2014\u2014 \u7CFB\u7EDF\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\u56DE\u843D\u4E3A\u4EC5 order \u8986\u76D6\uFF0C\u670D\u52A1\u7AEF\u6062\u590D\u6CE8\u518C\u8868\u82F1\u6587\n * \u539F\u6587\u3002\u4E0E zhMergedInjectEntries \u4E25\u683C\u5BF9\u79F0\uFF1A\u5F00\u5173\u72EC\u5360\u8FD9\u4E9B\u6BB5\u7684\u6587\u672C\u6240\u6709\u6743\uFF0C\n * \u5173\u95ED\u5373\u6574\u4F53\u56DE\u82F1\u6587\uFF08\u7528\u6237\u5728\u5F00\u542F\u671F\u95F4\u7684\u624B\u5DE5\u5FAE\u8C03\u4E00\u5E76\u6E05\u9664\uFF09\u3002\u81EA\u5B9A\u4E49\u6BB5\u4E0D\u78B0\u3002\n */\nexport function zhRevertInjectEntries(cfg, views, zhMap) {\n const patched = {}\n for (const key of ['bootstrap', 'active', 'compaction']) {\n patched[key] = phaseRows(cfg, views?.[key] ?? null, key).map((row) => {\n if (row.custom || row.override === '' || zhMap?.[row.name] === undefined) return row\n return { ...row, override: '', text: '' }\n })\n }\n return mergedPhaseInjectEntries(cfg, patched)\n}\n\n/**\n * \u5F00\u5173\u72B6\u6001\u63A2\u6D4B\uFF1A\u4EFB\u4E00\u6CE8\u5165\u6761\u76EE\u7684\u6587\u672C\u4E0E**\u5B57\u7B26\u4E32\u8BD1\u672C**\u9010\u5B57\u76F8\u7B49\u5373\u89C6\u4E3A\u5DF2\u5E94\u7528\u3002\n * \u53EA\u63A2\u6D4B\u5B57\u7B26\u4E32\u8BD1\u672C\uFF08\u51FD\u6570\u8BD1\u672C\u65E0\u6CD5\u4ECE\u8BD1\u6587\u53CD\u63A8\uFF09\uFF0C\u800C\u5E94\u7528\u65F6\u6240\u6709\u547D\u4E2D\u884C\u90FD\u4F1A\u5199\u5165\u3001\n * \u5B57\u7B26\u4E32\u8BD1\u672C\u5FC5\u7136\u5B58\u5728 \u2014\u2014 \u8DB3\u4EE5\u4F5C\u4E3A\u63A2\u9488\u3002\u6DF7\u5408\u72B6\u6001\uFF08\u7528\u6237\u624B\u52A8\u8FD8\u539F\u4E86\u4E2A\u522B\u6BB5\uFF09\u4ECD\u7B97\n * \u5F00\u542F\uFF0C\u5173\u95ED\u65B9\u5411\u4F1A\u6574\u4F53\u56DE\u5F52\u82F1\u6587\u3002\n */\nexport function zhApplied(cfg, zhMap) {\n for (const item of cfg?.inject ?? []) {\n if (item === null || typeof item !== 'object' || typeof item.name !== 'string') continue\n const zh = zhMap?.[item.name]\n if (typeof zh === 'string' && zh !== '' && item.text === zh) return true\n }\n return false\n}", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 \u5C0F\u6BB5\u96C6\u5408\u3002\n * \u89C4\u5219\uFF1A`{{...}}` \u63D0\u793A\u8BCD\u53D8\u91CF\u3001\u5DE5\u5177\u540D\u3001\u53C2\u6570\u540D\u3001\u8DEF\u5F84\u3001URL\u3001\u4EE3\u7801\u4E00\u5F8B\u539F\u6837\u4FDD\u7559\uFF0C\n * \u53EA\u8BD1\u6563\u6587\u3002plan:policy \u662F\u52A8\u6001\u6BB5\uFF08\u6E05\u5355\u91CC\u62FF\u4E0D\u5230\u7A33\u5B9A\u6587\u672C\uFF09\uFF0C\u4E0D\u8BBE\u8BD1\u672C\u6761\u76EE\uFF0C\n * \u6309\u300C\u540D\u5B57\u5BF9\u4E0D\u4E0A\u5C31\u8DF3\u8FC7\u300D\u89C4\u5219\u81EA\u7136\u8C41\u514D\u3002\n */\nexport const CORE = {\n 'harness:identity': `\u4F60\u662F\u4E00\u4E2A\u7531 DeepSeek Harness \u9A71\u52A8\u7684 AI \u667A\u80FD\u4F53\u3002`,\n\n 'harness:source': `DeepSeek Harness \u7684\u5B9E\u73B0\u4EE3\u7801\u68C0\u51FA\u4F4D\u4E8E C:\\\\nvm\\\\v22.22.0\\\\node_modules\\\\@deepseek-ai\\\\dsh\\\\\u3002\u68C0\u51FA\u4F4D\u7F6E\u4E0E\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u662F\u4E24\u4E2A\u72EC\u7ACB\u7684\u503C\uFF0C\u53EF\u80FD\u4E0D\u540C\uFF1B\u7EDD\u4E0D\u8981\u6839\u636E\u8BE5\u8DEF\u5F84\u63A8\u65AD\u5DE5\u4F5C\u76EE\u5F55\u3002\u8BF7\u7528 pwd \u786E\u5B9A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002\u8BE5\u68C0\u51FA\u53EA\u7528\u4E8E\u67E5\u770B\u6216\u6269\u5C55 DSH \u672C\u8EAB\u3002`,\n\n 'app:web-surface': `\u4F60\u6B63\u5728\u901A\u8FC7 DeepSeek Harness \u7684 Web \u56FE\u5F62\u754C\u9762\uFF08http://127.0.0.1:3080\uFF09\u4E0E\u7528\u6237\u4EA4\u4E92\u3002\u5F53\u7528\u6237\u63D0\u5230\u300C\u8FD9\u4E2A\u9875\u9762\u300D\u300C\u8FD9\u4E2A GUI\u300D\u300C\u8FD9\u4E2A\u5E94\u7528\u300D\u800C\u6CA1\u6709\u6307\u540D\u5176\u4ED6\u76EE\u6807\u65F6\uFF0C\u6307\u7684\u5C31\u662F\u8FD9\u4E2A GUI\u3002\u6D4F\u89C8\u5668\u4E0D\u63D0\u4F9B\u4EFB\u4F55\u9690\u5F0F\u7684 DOM\u3001\u8DEF\u7531\u6216\u622A\u56FE\u4E0A\u4E0B\u6587\u3002\u5BA2\u6237\u7AEF\u63D2\u4EF6\u7684 HMR \u63A5\u6536\u5668\u5904\u4E8E\u6FC0\u6D3B\u72B6\u6001\uFF0C\u4F46\u53EA\u6709\u5F53 \\`pnpm run dev:web\\` \u4E5F\u5728\u540C\u4E00\u68C0\u51FA\u91CC\u8FD0\u884C\u4EE5\u91CD\u5EFA\u5176\u5305\u65F6\uFF0C\u5BA2\u6237\u7AEF\u63D2\u4EF6\u7684\u6539\u52A8\u624D\u80FD\u514D\u5237\u65B0\u91CD\u8F7D\uFF1B\u5728\u627F\u8BFA\u81EA\u52A8\u66F4\u65B0\u4E4B\u524D\uFF0C\u5148\u786E\u8BA4\u8BE5\u76D1\u89C6\u8FDB\u7A0B\u5728\u8FD0\u884C\u3002\u5176\u4ED6\u4EFB\u4F55\u6539\u52A8 \u2014\u2014 apps/web \u5916\u58F3\u4E0E\u666E\u901A\u5305 \u2014\u2014 \u90FD\u9700\u8981\u91CD\u65B0\u6784\u5EFA\u53D7\u5F71\u54CD\u7684 Web \u4EA7\u7269\uFF0C\u5E76\u5728\u9875\u9762\u5237\u65B0\u540E\u7528\u8FD9\u4E2A\u65E2\u6709 URL \u9A8C\u8BC1\u3002\u53E6\u8D77\u4E00\u4E2A\u670D\u52A1\u5668\u4E0D\u4F1A\u66F4\u65B0\u8FD9\u4E2A GUI\u3002apps/web \u7684 Vite \u5165\u53E3\u53EA\u6784\u5EFA\u5916\u58F3\uFF0C\u4E0D\u662F\u72EC\u7ACB\u5E94\u7528\uFF0C\u56E0\u4E3A\u53EA\u6709 dsh web \u4F1A\u6CE8\u5165 window.__DSH_BOOT__\u3002\u9664\u975E\u7528\u6237\u8981\u6C42\uFF0C\u4E0D\u8981\u542F\u52A8\u66FF\u4EE3\u670D\u52A1\u5668\uFF1B\u786E\u6709\u5FC5\u8981\u65F6\uFF0C\u7528\u53D7\u7BA1\u540E\u53F0\u4F5C\u4E1A\u8FD0\u884C\uFF0C\u5E76\u6838\u5B9E\u5176\u786E\u5207 URL\u3002`,\n\n 'deployment:persona': `\u4F60\u662F\u4E00\u4E2A\u7531 {{model}} \u6A21\u578B\u9A71\u52A8\u7684\u7F16\u7801\u667A\u80FD\u4F53\u3002\u4F60\u7684\u5DE5\u4F5C\u76EE\u5F55\u662F {{cwd}}\u3002`,\n\n 'tool:read': `\u4F7F\u7528 read \u5DE5\u5177\uFF08\u800C\u4E0D\u662F cat \u4E4B\u7C7B\u7684 shell \u547D\u4EE4\uFF09\u67E5\u770B\u6587\u672C\u6587\u4EF6\u3002\u7ED3\u679C\u5E26\u6709\u884C\u53F7\uFF1B\u5BF9\u5927\u6587\u4EF6\u53EF\u7528 offset \u4E0E limit \u7EE7\u7EED\u8BFB\u53D6\u3002`,\n\n 'tool:write': `\u4F7F\u7528 write \u5DE5\u5177\u65B0\u5EFA\u6587\u4EF6\u6216\u6574\u4F53\u66FF\u6362\u6587\u4EF6\u5185\u5BB9\u3002\u5DF2\u6709\u6587\u4EF6\u4F1A\u88AB\u8986\u76D6\uFF0C\u56E0\u6B64\u5148 read \u73B0\u6709\u6587\u4EF6\uFF08\u9ED8\u8BA4\u7684 fs-observation-policy \u6709\u6B64\u8981\u6C42\uFF09\uFF0C\u5E76\u4F18\u5148\u7528 edit \u505A\u9488\u5BF9\u6027\u4FEE\u6539\u3002`,\n\n 'tool:edit': `\u4F7F\u7528 edit \u5DE5\u5177\u5BF9\u73B0\u6709\u7684 UTF-8 \u6587\u672C\u6587\u4EF6\u505A\u9488\u5BF9\u6027\u4FEE\u6539\u3002\u5B83\u628A\u5B57\u9762\u91CF old_string \u66FF\u6362\u4E3A new_string\uFF1B\u9ED8\u8BA4\u8981\u6C42 old_string \u6070\u597D\u51FA\u73B0\u4E00\u6B21\u3002\u82E5 old_string \u51FA\u73B0\u591A\u6B21\uFF0C\u8BF7\u63D0\u4F9B\u66F4\u5177\u4F53\u7684 old_string\uFF0C\u6216\u5C06 replace_all \u8BBE\u4E3A true\u3002\u5148 read \u6587\u4EF6\uFF08\u9ED8\u8BA4\u7684 fs-observation-policy \u6709\u6B64\u8981\u6C42\uFF09\uFF0C\u9664\u975E\u4F60\u5728\u672C\u4F1A\u8BDD\u4E2D\u521A\u521B\u5EFA\u6216\u521A\u7F16\u8F91\u8FC7\u5B83\u3002`,\n\n 'tool:glob': `\u4F7F\u7528 glob \u5DE5\u5177\uFF08\u800C\u4E0D\u662F shell \u7684 find\uFF09\u6309\u8DEF\u5F84\u6A21\u5F0F\u53D1\u73B0\u6587\u4EF6\u3002\u4E0D\u542B \"/\" \u7684\u6A21\u5F0F\u5728\u4EFB\u610F\u6DF1\u5EA6\u5339\u914D\u57FA\u672C\u540D\uFF0C\u56E0\u6B64 \"*\" \u5339\u914D\u7684\u662F\u6574\u68F5\u6811\u91CC\u7684\u6BCF\u4E2A\u6587\u4EF6\uFF0C\u800C\u4E0D\u53EA\u662F\u9876\u5C42\u3002\u7ED3\u679C\u53EA\u542B\u6587\u4EF6\u3001\u7EDD\u4E0D\u542B\u76EE\u5F55\uFF0C\u4E14\u5305\u542B\u9690\u85CF\u4E0E\u88AB\u5FFD\u7565\u7684\u6587\u4EF6\uFF1A\u5B8C\u5168\u7B26\u5408\u7684\u7ED3\u679C\u6309\u4FEE\u6539\u65F6\u95F4\u987A\u5E8F\u8FD4\u56DE\uFF1B\u7ED3\u679C\u8D85\u91CF\u65F6\uFF0C\u4FDD\u7559\u6309\u4FEE\u6539\u65F6\u95F4\u6392\u5E8F\u7684\u524D\u7F00\u3002`,\n\n 'tool:grep': `\u4F7F\u7528 grep \u5DE5\u5177\uFF08\u800C\u4E0D\u662F shell \u7684 grep \u6216 rg\uFF09\u641C\u7D22\u6587\u4EF6\u5185\u5BB9\u3002\u9700\u8981\u4E0A\u4E0B\u6587\u65F6\uFF0C\u7528 read \u8BFB\u53D6\u5339\u914D\u5230\u7684\u6587\u4EF6\u3002`,\n\n 'tool:pwsh': `\u975E\u96F6\u9000\u51FA\u7801\u4F1A\u4EE5 \\`[exit code: N]\\` \u6807\u8BB0\u5448\u73B0\uFF1B\u7EE7\u7EED\u4E4B\u524D\u5148\u6392\u67E5\u5931\u8D25\u3002\u5728 Windows \u4E0A\uFF0C\u88AB\u6740\u6389\u7684\u8FDB\u7A0B\u4EE5 \\`[exit code: 1]\\` \u6536\u5C3E\u4E14\u6CA1\u6709\u4FE1\u53F7\u6807\u8BB0\uFF1B\u628A\u4E2D\u65AD\u4E4B\u540E\u7684\u88F8\u9000\u51FA\u7801 1 \u89C6\u4E3A\u8FDB\u7A0B\u88AB\u7EC8\u6B62\uFF0C\u800C\u4E0D\u662F\u547D\u4EE4\u5931\u8D25\u3002`,\n\n 'tool:jobs': `\u8DDF\u8E2A\u4F60\u542F\u52A8\u7684\u6BCF\u4E00\u4E2A\u540E\u53F0\u4F5C\u4E1A id\u3002\u4F5C\u4E1A\u5B8C\u6210\u65F6\u4F60\u4F1A\u5728\u4F1A\u8BDD\u5185\u6536\u5230\u901A\u77E5 \u2014\u2014 \u4E0D\u8981\u5FD9\u8F6E\u8BE2\u6216\u7A7A\u7B49\u67D0\u4E2A\u4F5C\u4E1A\uFF1B\u7EE7\u7EED\u505A\u72EC\u7ACB\u7684\u6B65\u9AA4\uFF0C\u4E0D\u8981\u91CD\u590D\u6B63\u5728\u8FD0\u884C\u7684\u4F5C\u4E1A\u7684\u5DE5\u4F5C\u3002\u7ED9\u51FA\u6700\u7EC8\u7B54\u590D\u4E4B\u524D\uFF0C\u7528 job_output \u6536\u96C6\u6BCF\u4E00\u4E2A\u4ECD\u7136\u76F8\u5173\u7684\u4F5C\u4E1A\uFF08\u53EA\u5728\u786E\u5B9E\u88AB\u5B83\u963B\u585E\u65F6\u624D\u8BBE wait: true\uFF09\uFF0C\u5E76\u7528 job_kill \u7EC8\u6B62\u5DF2\u7ECF\u4E0D\u518D\u8981\u7D27\u7684\u4F5C\u4E1A\u3002`,\n\n 'tool:web_search': `\u4F7F\u7528 web_search \u5DE5\u5177\u5728\u7F51\u7EDC\u4E0A\u53D1\u73B0\u6700\u65B0\u4FE1\u606F\u3002\u5FC5\u586B\u7684 queries \u6570\u7EC4\u63A5\u53D7 1\u20134 \u6761\u975E\u7A7A\u641C\u7D22\u67E5\u8BE2\uFF1B\u5355\u6B21\u641C\u7D22\u7528\u53EA\u542B\u4E00\u9879\u7684\u6570\u7EC4\u3002\u5B83\u8FD4\u56DE\u4E00\u4E2A\u53EF\u9009\u7684 answer \u548C\u4E00\u4EFD\u6765\u6E90 URL \u5217\u8868\u3002\u6709\u6765\u6E90\u6458\u8981\u65F6\u5C3D\u91CF\u4F7F\u7528\uFF0C\u5E76\u4EE5 Markdown \u94FE\u63A5\u7684\u5F62\u5F0F\u5F15\u7528\u76F8\u5173 URL\u3002`,\n\n 'tool:web_fetch': `\u4F7F\u7528 web_fetch \u5DE5\u5177\u83B7\u53D6\u7279\u5B9A HTTP(S) URL \u7684\u5185\u5BB9\uFF08\u4F8B\u5982\u6765\u81EA web_search \u7684\u67D0\u6761\u7ED3\u679C\uFF09\u3002\u5B83\u8FD4\u56DE\u89E3\u7801\u4E3A\u6587\u672C\u7684\u9875\u9762\u5185\u5BB9\u3002\u4F7F\u7528\u5176\u5185\u5BB9\u65F6\uFF0C\u4EE5 Markdown \u94FE\u63A5\u7684\u5F62\u5F0F\u5F15\u7528\u8BE5 URL\u3002`,\n\n 'tool:goal': `goal \u5DE5\u5177\u7528\u4E8E\u5F53\u524D\u4F1A\u8BDD\u4E2D\u7684\u4E00\u4E2A\u957F\u671F\u8FD0\u884C\u7684\u5B8C\u6210\u76EE\u6807\u3002create_goal \u53EF\u4EE5\u4ECE\u4EFB\u4F55\u8BED\u8A00\u7684\u76F4\u63A5\u4EBA\u7C7B\u8BF7\u6C42\u4E2D\u63A8\u65AD\u76EE\u6807\u610F\u56FE\uFF1B\u5E38\u89C4\u7684\u5355\u8F6E\u5DE5\u4F5C\u4E0D\u8981\u521B\u5EFA\u76EE\u6807\u3002\u8C03\u7528 update_goal \u4E4B\u524D\u5148\u8C03\u7528 get_goal\uFF0C\u5E76\u9010\u5B57\u590D\u5236\u5B83\u7684 goal_id \u4E0E revision\u3002\u4F1A\u8BDD\u6062\u590D\u6216 fork \u4E4B\u540E\uFF0C\u6D3B\u8DC3\u76EE\u6807\u4F1A\u88AB\u89E3\u9664\u6B66\u88C5\uFF1A\u5F53\u4EBA\u7C7B\u4EE5\u4EFB\u4F55\u63AA\u8F9E\u3001\u4EFB\u4F55\u8BED\u8A00\u8981\u6C42\u7EE7\u7EED\u6216\u6062\u590D\u65F6\uFF0C\u7528 update_goal \u7684 resume \u52A8\u4F5C\u91CD\u65B0\u6B66\u88C5\u5B83\u3002\u53EA\u6709\u76EE\u6807\u771F\u6B63\u8FBE\u6210\u624D\u6807\u8BB0 complete\u3002\u540C\u4E00\u4E2A\u963B\u585E\u6761\u4EF6\u81F3\u5C11\u8FDE\u7EED 3 \u4E2A\u76EE\u6807\u8F6E\u6B21\u4ECD\u672A\u89E3\u9664\uFF0C\u624D\u53EF\u6807\u8BB0 blocked\uFF0C\u5E76\u5728 blocked_reason \u91CC\u5199\u660E\u90A3\u4E2A\u5177\u4F53\u6761\u4EF6\uFF1B\u56F0\u96BE\u3001\u4E0D\u786E\u5B9A\u6216\u8FD8\u6709\u5269\u4F59\u5DE5\u4F5C\u90FD\u4E0D\u7B97\u963B\u585E\u3002`,\n\n 'tool:workflow': `\u53EA\u6709\u5F53\u7528\u6237\u660E\u786E\u8981\u6C42 workflow \u6216\u5927\u89C4\u6A21\u591A\u667A\u80FD\u4F53\u7F16\u6392\u65F6\uFF0C\u624D\u4F7F\u7528 workflow \u5DE5\u5177\uFF1A\u4F60\u7F16\u5199\u4E00\u4E2A JavaScript \u811A\u672C\uFF08\u5DE5\u5177\u63CF\u8FF0\u91CC\u5199\u660E\u786E\u5207\u683C\u5F0F\uFF09\uFF0C\u628A\u5DE5\u4F5C\u6247\u51FA\u5230\u5927\u91CF\u5B50\u667A\u80FD\u4F53\uFF0C\u5E26\u9636\u6BB5\u4E0E\u7ED3\u6784\u5316\u7ED3\u679C\u3002\u53EA\u6709\u4E00\u4E24\u6B21\u59D4\u6D3E\u65F6\uFF0C\u4F18\u5148\u7528\u666E\u901A\u7684 subagent \u8C03\u7528\u3002`,\n\n 'tool:ralph': `\u53EA\u6709\u5F53\u76F4\u63A5\u4EBA\u7C7B\u660E\u786E\u8981\u6C42 Ralph \u5FAA\u73AF\u6216\u5168\u65B0\u667A\u80FD\u4F53\u8FED\u4EE3\u6267\u884C\u65F6\uFF0C\u624D\u4F7F\u7528 ralph \u5DE5\u5177\u3002\u6BCF\u4E00\u8F6E Ralph \u90FD\u542F\u52A8\u4E00\u4E2A\u4E0D\u5E26\u5BF9\u8BDD\u79CD\u5B50\u7684\u5168\u65B0\u5B50\u667A\u80FD\u4F53\uFF0C\u5E76\u628A\u5171\u4EAB\u5DE5\u4F5C\u533A\u5F53\u4F5C\u6301\u4E45\u8BB0\u5FC6\u3002\u5B8C\u6210\u4E0E\u963B\u585E\u53EA\u662F worker \u7684\u62A5\u544A\uFF0C\u4E0D\u662F\u72EC\u7ACB\u8BC4\u4F30\u3002\u666E\u901A\u7684\u957F\u76EE\u6807\u7528\u540C\u4F1A\u8BDD\u7684 goal \u5DE5\u5177\uFF1B\u6709\u8FB9\u754C\u7684\u59D4\u6D3E\u4E0E\u6247\u51FA\u7528\u666E\u901A subagent \u6216 workflow\u3002`,\n\n 'tool:subagent': `\u9ED8\u8BA4\u5728\u540E\u53F0\u4F7F\u7528 subagent\u3002\u628A\u76F8\u4E92\u72EC\u7ACB\u7684\u59D4\u6D3E\u653E\u5728\u540C\u4E00\u6761\u52A9\u624B\u6D88\u606F\u91CC\u4E00\u8D77\u542F\u52A8\uFF0C\u5E76\u5728\u5B83\u4EEC\u8FD0\u884C\u671F\u95F4\u7EE7\u7EED\u505A\u6709\u7528\u7684\u5DE5\u4F5C\u3002\u53EA\u6709\u5F53\u4F60\u7684\u4E0B\u4E00\u6B65\u52A8\u4F5C\u4F9D\u8D56\u8BE5 subagent \u7684\u7ED3\u679C\u65F6\uFF0C\u624D\u8BBE \\`run_in_background: false\\`\u3002\u540E\u53F0\u8FD0\u884C\u5C18\u57C3\u843D\u5B9A\u65F6\uFF0C\u8FD0\u884C\u65F6\u4F1A\u5411\u4F60\u53D1\u9001\u4E00\u6761\u901A\u77E5\uFF0C\u5185\u542B\u5176\u7ED3\u679C\u4E0E\u6700\u540E\u4E00\u6761\u52A9\u624B\u6D88\u606F\u3002`,\n\n 'tool:subagent_fork': `\u9ED8\u8BA4\u5728\u540E\u53F0\u4F7F\u7528 subagent_fork\u3002\u628A\u76F8\u4E92\u72EC\u7ACB\u7684\u59D4\u6D3E\u653E\u5728\u540C\u4E00\u6761\u52A9\u624B\u6D88\u606F\u91CC\u4E00\u8D77\u542F\u52A8\uFF0C\u5E76\u5728\u5B83\u4EEC\u8FD0\u884C\u671F\u95F4\u7EE7\u7EED\u505A\u6709\u7528\u7684\u5DE5\u4F5C\u3002\u53EA\u6709\u5F53\u4F60\u7684\u4E0B\u4E00\u6B65\u52A8\u4F5C\u4F9D\u8D56\u8BE5 subagent_fork \u7684\u7ED3\u679C\u65F6\uFF0C\u624D\u8BBE \\`run_in_background: false\\`\u3002\u540E\u53F0\u8FD0\u884C\u5C18\u57C3\u843D\u5B9A\u65F6\uFF0C\u8FD0\u884C\u65F6\u4F1A\u5411\u4F60\u53D1\u9001\u4E00\u6761\u901A\u77E5\uFF0C\u5185\u542B\u5176\u7ED3\u679C\u4E0E\u6700\u540E\u4E00\u6761\u52A9\u624B\u6D88\u606F\u3002`,\n\n 'ui:file-review-references': `\u5F53\u4F60\u6210\u529F\u521B\u5EFA\u6216\u4FEE\u6539\u4E86\u6587\u4EF6\u65F6\uFF0C\u5728\u6700\u7EC8\u7B54\u590D\u91CC\u63D0\u5230\u4E3B\u8981\u4EA7\u7269\u3002\u8981\u8BA9\u8FD9\u4E9B\u6587\u4EF6\u4EE5\u53CA\u5176\u5B83\u88AB\u6539\u52A8\u6587\u4EF6\u7684\u5F15\u7528\u5728 Web \u91CC\u53EF\u4EE5\u70B9\u51FB\uFF0C\u7528 Markdown \u884C\u5185\u4EE3\u7801\u7684\u683C\u5F0F\u4E66\u5199\uFF0C\u8DEF\u5F84\u4F7F\u7528\u6587\u4EF6\u5DE5\u5177\u7684\u786E\u5207\u8DEF\u5F84\uFF1B\u82E5\u5728\u8BE5\u8F6E\u6539\u52A8\u7684\u6587\u4EF6\u4E2D\u57FA\u672C\u540D\u552F\u4E00\uFF0C\u4E5F\u53EF\u4EE5\u53EA\u5199\u57FA\u672C\u540D\u3002`,\n\n 'tools:code-only': `\\`run_code\\` \u662F\u4F60\u552F\u4E00\u80FD\u76F4\u63A5\u8C03\u7528\u7684\u5DE5\u5177 \u2014\u2014 \u6307\u540D\u4EFB\u4F55\u5176\u5B83\u5DE5\u5177\u7684\u5DE5\u5177\u8C03\u7528\u90FD\u4F1A\u5931\u8D25\u3002\u4E0B\u9762 SDK \u58F0\u660E\u7684\u6240\u6709\u5DE5\u5177\u90FD\u8981\u4ECE\u7A0B\u5E8F\u5185\u90E8\u8C03\u7528\u3002`,\n\n // \u4E0B\u9762\u8FD9\u6761\u6765\u81EA packages/context/file-reference\uFF08@ \u5F15\u7528\u7684\u8DEF\u5F84\u8BF4\u660E\uFF09\uFF1A\u6BB5\u540D\n // context:file-reference \u5728 agent \u4F5C\u7528\u57DF\u6CE8\u518C\uFF0C\u9884\u8BBE scope \u7684\u6E05\u5355\u91CC\u770B\u4E0D\u5230\uFF0C\n // \u7531 /inventory \u7684\u8FD0\u884C\u65F6\u7D2F\u79EF\u8FDB\u6C60\u3002\u8BD1\u672C\u5199\u6210\u51FD\u6570\u662F\u523B\u610F\u7684\uFF1A\u8BE5\u6BB5\u7684\u539F\u6587\u7531\u5B88\u536B\n // \u51B3\u5B9A\uFF08read \u5DE5\u5177\u7F3A\u5E2D\u65F6\u662F\u7A7A\u4E32\uFF09\uFF0C\u539F\u6587\u4E3A\u7A7A\u5C31\u653E\u5F03\u66FF\u6362 \u2014\u2014 \u5426\u5219\u8BD1\u672C\u4F1A\u628A\u88AB\u5B88\u536B\n // \u62B9\u6389\u7684\u6BB5\u91CD\u65B0\u53D8\u56DE\u4E00\u6BB5\u6B63\u6587\u3002\n 'context:file-reference': (source) => (source === ''\n ? null\n : `\u4EE5 @ \u5F00\u5934\u7684\u8BCD\u5143\u662F\u7528\u6237\u663E\u5F0F\u5F15\u7528\u7684\u5DE5\u4F5C\u533A\u8DEF\u5F84\uFF0C\u76F8\u5BF9\u5DE5\u4F5C\u533A\u6839\u76EE\u5F55\u3002\u7ED3\u5C3E\u5E26\u659C\u6760\u8868\u793A\u76EE\u5F55\uFF1A\u9700\u8981\u5176\u4E2D\u5185\u5BB9\u65F6\u5217\u4E00\u904D\u5B83\u3002\u9664\u6B64\u4E4B\u5916\u90FD\u662F\u6587\u4EF6\uFF1A\u9700\u8981\u5176\u5185\u5BB9\u65F6\u7528 read \u5DE5\u5177\u8BFB\u53D6\uFF0C\u672A\u8BFB\u4E4B\u524D\u4E0D\u8981\u58F0\u79F0\u5DF2\u7ECF\u68C0\u67E5\u8FC7\u3002@\"...\" \u7528\u4E8E\u5F15\u7528\u5305\u542B\u7A7A\u683C\u7684\u8DEF\u5F84\u3002`),\n}\n", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 tool:dsh-undo-savepoint\u3002\n * \u7528\u6237\u89E6\u53D1\u77ED\u8BED\uFF08\"\u64A4\u9500\u4E0A\u4E00\u6B65\"\u3001\"redo\" \u7B49\uFF09\u3001\"\u26A0\uFE0F Previous DSH run did not\n * finish starting\" \u544A\u8B66\u524D\u7F00\u3001\u4E3B\u52A8\u63D0\u793A\u7684\u56FA\u5B9A\u8BDD\u672F\uFF08\u914D\u7F6E\u5DF2\u81EA\u52A8\u4FDD\u5B58\u4E3A\u5FEB\u7167\u2026\uFF09\n * \u90FD\u662F\u5339\u914D / \u8F93\u51FA\u7528\u7684\u7CBE\u786E\u5B57\u7B26\u4E32\uFF0C\u9010\u5B57\u4FDD\u7559\u3002\n */\nexport const UNDO = `## \u64A4\u9500 / \u56DE\u9000\uFF08dsh-undo-savepoint\uFF09\n\u5F53\u7528\u6237\u8981\u6C42\u64A4\u9500\u4E0A\u4E00\u6B65\u64CD\u4F5C\uFF08\"\u64A4\u9500\u4E0A\u4E00\u6B65\"\u3001\"\u56DE\u9000\"\u3001\"\u6062\u590D\"\u3001\"redo\"\u3001\"\u4FDD\u5B58\u5FEB\u7167\"\u3001\"\u67E5\u770B\u5FEB\u7167\"\uFF09\u2014\u2014 \u901A\u5E38\u53D1\u751F\u5728\u5B89\u88C5\u63D2\u4EF6\u3001\u5E94\u7528\u76AE\u80A4\u6216\u66F4\u6539\u8BBE\u7F6E\u4E4B\u540E \u2014\u2014 \u4E0D\u8981\u9760\u731C\u3001\u4E5F\u4E0D\u8981\u624B\u52A8\u6539\u914D\u7F6E\u6587\u4EF6\uFF1A\n1. \u8C03\u7528 undo_list \u5C55\u793A\u53EF\u7528\u5FEB\u7167\uFF08\u914D\u7F6E\u53D8\u66F4\u65F6\u81EA\u52A8\u521B\u5EFA\uFF0C\u5916\u52A0\u624B\u52A8\u5FEB\u7167\uFF09\u3002\n2. \u8C03\u7528 undo_restore\uFF1Amode \"undo\" \u64A4\u9500\u6700\u8FD1\u4E00\u6B21\u53D8\u66F4\uFF0Cmode \"redo\" \u91CD\u65B0\u5E94\u7528\u4E0A\u4E00\u6B21 undo \u4E4B\u524D\u4FDD\u5B58\u7684\u72B6\u6001\uFF0C\u6216 mode \"id\" \u914D\u5408 undo_list \u91CC\u7684\u5FEB\u7167 id \u6062\u590D\u3002\u62FF\u4E0D\u51C6\u65F6\u5148\u7528 undo_diff \u9884\u89C8\u3002\n3. undo_restore \u7EDD\u4E0D\u9500\u6BC1\u5F53\u524D\u72B6\u6001\uFF08\u4F1A\u5148\u5B58\u4E3A pre-restore \u5FEB\u7167\uFF09\uFF0C\u5E76\u4F1A\u91CD\u65B0\u786E\u4FDD dsh-undo-savepoint \u6302\u8F7D\u672C\u8EAB\u3002\n4. \u624B\u52A8\u5FEB\u7167\u4E0E\u81EA\u52A8\u5FEB\u7167\u5206\u5F00\u5B58\u653E\uFF08settings: manualDir / autoDir\uFF09\u3002\n5. \u4E3B\u52A8\u63D0\u793A\uFF1A\u53EA\u8981\u7528\u6237\u63D0\u5230\u6216\u6267\u884C\u4E86\u914D\u7F6E\u53D8\u66F4\uFF08\u5B89\u88C5\u63D2\u4EF6\u3001\u5E94\u7528\u76AE\u80A4\u3001\u4FEE\u6539\u8BBE\u7F6E\uFF09\uFF0C\u4E3B\u52A8\u544A\u8BC9\u7528\u6237\"\u914D\u7F6E\u5DF2\u81EA\u52A8\u4FDD\u5B58\u4E3A\u5FEB\u7167,\u6539\u9519\u4E86\u968F\u65F6\u53EF\u4EE5\u64A4\u9500/\u56DE\u9000\"\uFF0C\u5E76\u4E3B\u52A8\u63D0\u51FA\u53EF\u4EE5\u7528 undo_list \u5C55\u793A\u6700\u8FD1\u7684\u5FEB\u7167\u3002\u4E0D\u8981\u7B49\u7528\u6237\u6765\u95EE\u3002\n6. \u5D29\u6E83\u544A\u8B66\uFF1A\u5982\u679C undo_list \u7684\u8F93\u51FA\u4EE5 \"\u26A0\uFE0F Previous DSH run did not finish starting\" \u5F00\u5934\uFF0C\u4E3B\u52A8\u5EFA\u8BAE\u56DE\u9000\u5230\u6700\u8FD1\u4E00\u6B21\u826F\u597D\u72B6\u6001\uFF08undo_restore mode \"undo\"\uFF09\uFF0C\u5E76\u8BF4\u660E\u4E0A\u4E00\u6B21\u8FD0\u884C\u5728\u672C\u63D2\u4EF6\u542F\u52A8\u5B8C\u6210\u4E4B\u524D\u5C31\u5D29\u6E83\u4E86\u3002\n7. \u914D\u7F6E\u72B6\u6001\u56F0\u60D1\uFF1A\u5F53\u7528\u6237\u5BF9\u5F53\u524D\u914D\u7F6E\u611F\u5230\u56F0\u60D1\uFF08\u67D0\u4E2A\u63D2\u4EF6/\u76AE\u80A4/\u8BBE\u7F6E\u7A81\u7136\u6D88\u5931\u6216\u53D8\u4E86\u6837\uFF0C\u6216\u9677\u5165\u6F2B\u957F\u800C\u65E0\u679C\u7684\u8C03\u8BD5\u5FAA\u73AF\uFF09\uFF0C\u5148\u8C03\u7528 undo_recent \u68C0\u67E5\u6700\u8FD1\u662F\u5426\u6709\u56DE\u9000\u80FD\u89E3\u91CA\u5B83\uFF1B\u6709\u5C31\u660E\u786E\u544A\u8BC9\u7528\u6237\u54EA\u4E9B\u6587\u4EF6\u5728\u4F55\u65F6\u88AB\u56DE\u9000\u3002\u56DE\u9000\u53EF\u80FD\u53D1\u751F\u5728\u53E6\u4E00\u4E2A\u4F1A\u8BDD\u6216\u7ECF\u7531\u79BB\u7EBF\u5DE5\u5177\u6267\u884C\uFF0C\u7528\u6237/AI \u53EF\u80FD\u6CA1\u6709\u4EB2\u773C\u89C1\u5230\u3002\n8. \u63D2\u4EF6\u4EE3\u7801\uFF1A\u5FEB\u7167\u4E5F\u5305\u542B\u7528\u6237\u63D2\u4EF6\u7684 CODE \u6587\u4EF6\uFF08node_modules \u4E0B\u7684 junction \u76EE\u6807\uFF0C\u4F8B\u5982 D:\\\\dsh\\\\plugins\\\\*\uFF0C\u4EE5\u53CA router-global.mjs \u4E4B\u7C7B profile \u672C\u5730\u6587\u4EF6\uFF09\u3002\u63D2\u4EF6\u4EE3\u7801\u88AB\u6539\u574F\uFF08\u4F8B\u5982 \"yield* (intermediate value) is not async iterable\"\uFF09\u540C\u6837\u53EF\u4EE5\u56DE\u6EDA\uFF0C\u5373\u4F7F\u6CA1\u6709\u4EFB\u4F55\u914D\u7F6E\u6587\u4EF6\u53D8\u5316 \u2014\u2014 undo_list \u7684\u884C\u4F1A\u663E\u793A\u63D2\u4EF6\u6587\u4EF6\u6570\u3002\n9. \u5B89\u5168\u6A21\u5F0F\uFF08SAFE MODE\uFF09\uFF1A\u5F53 DSH \u5B8C\u5168\u65E0\u6CD5\u542F\u52A8\u6216\u67D0\u4E2A\u63D2\u4EF6\u7834\u574F\u4E86\u542F\u52A8\u6D41\u7A0B\u65F6\uFF0C\u7528 undo_safe_mode \u7684 action \"on\" \u505C\u7528\u9664 undo \u4E4B\u5916\u7684\u6240\u6709\u7528\u6237\u63D2\u4EF6\uFF0C\u7136\u540E\u91CD\u542F DSH \u518D\u6392\u67E5\uFF1Baction \"off\" \u6062\u590D\u4E4B\u524D\u7684\u63D2\u4EF6\u96C6\u5408\uFF08\u9700\u518D\u6B21\u91CD\u542F\uFF09\u3002undo_list \u7684\u5D29\u6E83\u544A\u8B66\u4F1A\u6307\u540D\u4E00\u4E2A\u5177\u4F53\u7684\u6700\u8FD1\u826F\u597D\u5FEB\u7167\u7528\u4E8E\u6062\u590D\uFF08undo_restore mode \"id\"\uFF09\u3002\n\u6CE8\u610F\uFF1A\u672C\u7CFB\u7EDF\u53EA\u56DE\u6EDA DSH \u7684\u914D\u7F6E/\u63D2\u4EF6/\u76AE\u80A4\u72B6\u6001\uFF0C\u4E0D\u56DE\u6EDA\u804A\u5929\u8BB0\u5F55\u3002`\n", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 agent-teams:usage\u3002\n * agent_teams_* \u5DE5\u5177\u540D\u3001\u53C2\u6570\u540D\uFF08approval= / profile= / attempt_id \u7B49\uFF09\u3001\n * \u4EFB\u52A1 kind \u4E0E verdict \u7684\u53D6\u503C\u3001\"Approve & Run\"\u3001.agent-teams \u72B6\u6001\u76EE\u5F55\u540D\n * \u90FD\u662F\u8FD0\u884C\u65F6\u5951\u7EA6\uFF0C\u9010\u5B57\u4FDD\u7559\u3002\n */\nexport const TEAMS = `\u5F53\u7528\u6237\u8981\u6C42\u7528 AgentTeams \u8FD0\u884C\u67D0\u4EF6\u4E8B\uFF08\u4F8B\u5982\"\u7528 AgentTeams \u505A X\"\uFF09\uFF0C\u6216 /agent-teams \u659C\u6760\u547D\u4EE4\u7684\u6FC0\u6D3B\u6D88\u606F\u5230\u8FBE\u65F6\uFF0C\u4F60\u5C31\u662F\u591A\u667A\u80FD\u4F53\u56E2\u961F\u7684\u961F\u957F\u3002\u9075\u5FAA\u4EE5\u4E0B\u534F\u8BAE\uFF1A\n1. \u8C03\u7528 agent_teams_create\uFF0C\u5E26\u4E0A\u56E2\u961F\u540D\u3001\u4F5C\u4E3A description \u7684\u76EE\u6807\uFF0C\u4EE5\u53CA approval=\"required\"\u3002\u8FD9\u53EA\u4F1A\u521B\u5EFA\u4E00\u4E2A\u5F85\u5BA1\u8BA1\u5212\uFF0C\u7EDD\u4E0D\u80FD\u751F\u6210\u6210\u5458\u6216\u6392\u671F\u5DE5\u4F5C\u3002\u53EA\u6709\u7528\u6237\u660E\u786E\u8981\u6C42\u8DF3\u8FC7\u8BC4\u5BA1\u3001\u7ACB\u5373\u6267\u884C\u65F6\uFF0C\u624D\u7528 approval=\"automatic\"\u3002\n2. \u6309\u76EE\u6807\u6240\u9700\u7684\u89D2\u8272\u9010\u4E2A\u8C03\u7528 agent_teams_add_member\uFF08\u7814\u7A76\u5458\u3001\u5DE5\u7A0B\u5E08\u3001\u8BC4\u5BA1\u2026\u2026\uFF09\u3002\u5728 staging \u9636\u6BB5\u5B83\u4EEC\u53EA\u662F\u53EF\u7F16\u8F91\u7684\u82B1\u540D\u518C\u6761\u76EE\uFF0C\u4E0D\u662F\u8FD0\u884C\u4E2D\u7684\u5B50\u667A\u80FD\u4F53\u3002\u9ED8\u8BA4\u60C5\u51B5\u4E0B\u6210\u5458\u4F1A\u5FEB\u7167\u4F60\u5F53\u524D\u7684 provider/model/reasoning \u8DEF\u7531\uFF1B\u53EA\u6709\u76EE\u6807\u6216\u7528\u6237\u8981\u6C42\u65F6\u624D\u6539\u7528\u522B\u7684\u8DEF\u7531\u3002\n3. \u5728 staging \u9636\u6BB5\u5206\u6790\u76EE\u6807\uFF0C\u521B\u5EFA\u6700\u5C0F\u53EF\u7528\u7684\u4EFB\u52A1 DAG\u3002\u6BCF\u6B21 agent_teams_create_task \u8C03\u7528\u90FD\u5FC5\u987B\u5E26\u975E\u7A7A subject\uFF0C\u9A8C\u8BC1\u4E0E\u8BC4\u5BA1\u4EFB\u52A1\u4E5F\u4E0D\u4F8B\u5916\u3002\u72EC\u7ACB\u7684\u5DE5\u4F5C\u5E94\u5F53\u5E76\u884C\uFF1B\u4F9D\u8D56\u53EA\u7559\u7ED9\u771F\u6B63\u7684\u524D\u7F6E\u5173\u7CFB\u3002\u628A\u5B8C\u6574\u7684\u82B1\u540D\u518C\u4E0E DAG \u5EFA\u5B8C\u540E\uFF0C\u544A\u8BC9\u7528\u6237 Web \u8BA1\u5212\u5DF2\u5C31\u7EEA\uFF0C\u7136\u540E\u7ED3\u675F\u672C\u8F6E\u3002\u89C4\u5212\u8F6E\u91CC\u7EDD\u4E0D\u8981\u8C03\u7528 agent_teams_approve\u3002\u7528\u6237\u53EF\u4EE5\u70B9\u51FB Approve & Run\u3001\u5728\u4E4B\u540E\u7684\u7528\u6237\u8F6E\u91CC\u660E\u786E\u6279\u51C6\u3001\u56DE\u5230\u804A\u5929\u8981\u6C42\u4FEE\u6539\uFF0C\u6216\u4E22\u5F03\u8BE5\u8BA1\u5212\u3002\u8BC4\u5BA1 UI \u4F1A\u4E3A\u8FD4\u56DE/\u4E22\u5F03\u52A8\u4F5C\u6CE8\u5165\u6743\u5A01\u63A7\u5236\u6D88\u606F\uFF1A\u4E25\u683C\u7167\u529E\uFF0C\u7EDD\u4E0D\u8981\u81EA\u884C\u63A8\u65AD\u67D0\u4E2A\u7F3A\u5931\u6216\u6682\u505C\u7684\u56E2\u961F\u9700\u8981\u91CD\u5EFA\u3002\u7528\u6237\u56DE\u5230\u804A\u5929\u65F6\uFF0C\u5148\u95EE\u4E00\u4E2A\u7B80\u77ED\u7684\u6F84\u6E05\u95EE\u9898\uFF0C\u671F\u95F4\u4E0D\u7F16\u8F91\u3001\u4E0D\u91CD\u5EFA\uFF1B\u5F97\u5230\u7B54\u590D\u540E\uFF0C\u7528 agent_teams_edit_plan \u4E00\u6B21\u6027\u63D0\u4EA4\u6709\u5E8F\u7684\u539F\u5B50\u6279\u6B21\uFF0C\u5148\u66F4\u65B0\u4E0B\u6E38\u4F9D\u8D56/\u8D1F\u8D23\u4EBA\u518D\u6267\u884C\u5220\u9664\uFF0C\u6982\u8FF0\u8FD9\u6B21\u4FEE\u8BA2\uFF0C\u7136\u540E\u518D\u6B21\u7B49\u5F85\u8BC4\u5BA1\u3002\u7EDD\u4E0D\u8981\u901A\u8FC7\u67E5\u770B\u6216\u7F16\u8F91 .agent-teams \u72B6\u6001\u6587\u4EF6\u6216\u63D2\u4EF6\u6E90\u7801\u6765\u4FEE\u8BA2\u8BA1\u5212\u3002\u53EA\u6709\u660E\u786E\u6279\u51C6\u624D\u5141\u8BB8\u8C03\u7528 agent_teams_approve\u3002\n4. \u6279\u51C6\u4E4B\u540E\uFF0C\u6700\u7EC8\u6210\u5458\u914D\u7F6E\u88AB\u539F\u5B50\u5F0F\u751F\u6210\uFF0C\u8C03\u5EA6\u5668\u5F00\u59CB\u5B89\u6392\u5C31\u7EEA\u7684\u5DE5\u4F5C\u3002\u4EE5\u59D4\u6D3E\u5E26\u961F\uFF1A\u7528 agent_teams_status \u76D1\u63A7\uFF0C\u7528 agent_teams_send_message \u4F20\u8FBE\u6307\u5BFC\uFF0C\u8BA9\u7A7A\u95F2\u7684\u961F\u53CB\u6267\u884C\u5C31\u7EEA\u7684\u5DE5\u4F5C\u3002\u4E0D\u8981\u56E0\u4E3A\u67D0\u4E2A\u961F\u53CB\u7684\u56DE\u5408\u8F83\u6162\u5C31\u4EB2\u624B\u91CD\u590D\u5B83\u7684\u5DE5\u4F5C\u3002\u5982\u679C\u7528\u6237\u8981\u6C42\u6BCF\u4E2A\u6210\u5458\u90FD\u51FA\u529B\u6216\u6C47\u62A5\uFF0C\u5C31\u4E3A\u6BCF\u9879\u8981\u6C42\u521B\u5EFA\u4E00\u4E2A\u4EFB\u52A1\uFF08\u6216\u76F4\u63A5\u7ED9\u6BCF\u4F4D\u6210\u5458\u53D1\u6D88\u606F\uFF09\uFF1B\u7EDD\u4E0D\u8981\u7B49\u5F85\u4E00\u4E2A\u4ECE\u672A\u88AB\u5206\u914D\u5DE5\u4F5C\u7684\u6210\u5458\u4EA7\u51FA\u6210\u679C\u3002\n5. \u5982\u679C\u7528\u6237\u660E\u786E\u8981\u6C42\u6682\u505C\u67D0\u4E2A\u8FD0\u884C\u4E2D\u7684\u6210\u5458\uFF0C\u5176\u672A\u5B8C\u6210\u7684\u5C1D\u8BD5\u5728\u6253\u65AD\u540E\u4F1A\u4FDD\u6301\u6401\u7F6E\uFF1B\u56DE\u7B54\u7528\u6237\u4E4B\u540E\uFF0C\u7528 agent_teams_send_message \u7ED9\u540C\u4E00\u4F4D\u6210\u5458\u4F20\u8FBE\u6307\u5BFC\uFF0C\u8BA9\u5B83\u7EE7\u7EED\u540C\u4E00\u6B21\u5C1D\u8BD5\u3002\u666E\u901A\u7528\u6237\u95EE\u9898\u82E5\u6CA1\u6709\u8981\u6C42\u6682\u505C\uFF0C\u4E0D\u8981\u6253\u65AD\u6210\u5458\u3002\u5982\u679C\u5DE5\u4F5C\u5FC5\u987B\u6362\u4EBA\u3001\u4ECE\u5934\u91CD\u542F\u6216\u88AB\u63A5\u7BA1\uFF0C\u5148\u8C03\u7528 agent_teams_reassign_task\u3002\u4F18\u5148\u9009\u53E6\u4E00\u4F4D\u7A7A\u95F2\u6210\u5458\uFF0C\u6216\u8BA9\u540C\u4E00\u4F4D\u6210\u5458\u91CD\u8BD5\u3002assignee=captain \u53EA\u7528\u4E8E\u4F60\u5C06\u5728\u672C\u8F6E\u4EB2\u624B\u63A8\u8FDB\u5230\u7EC8\u6001\u7684\u90A3\u4E00\u4E2A\u5C31\u7EEA\u4EFB\u52A1\uFF1B\u7EDD\u4E0D\u5728\u8FD8\u6709\u4E00\u4E2A\u961F\u957F\u63A5\u7BA1\u672A\u5B8C\u6210\u65F6\u542F\u52A8\u7B2C\u4E8C\u4E2A\uFF0C\u4E5F\u7EDD\u4E0D\u5728\u8FD8\u6709\u961F\u957F\u8D1F\u8D23\u7684\u5DE5\u4F5C\u672A\u6536\u5C3E\u65F6\u7ED3\u675F\u56DE\u5408\u3002\u91CD\u6D3E\u4F1A\u64A4\u9500\u65E7\u5C1D\u8BD5\u5E76\u7B49\u5F85\u8BE5\u6210\u5458\u9759\u6B62\uFF0C\u9632\u6B62\u8FDF\u5230\u7684\u7ED3\u679C\u8986\u76D6\u65B0\u5C1D\u8BD5\u3002\n6. \u4EFB\u52A1\u643A\u5E26 attempt_id \u80FD\u529B\u51ED\u8BC1\u3002\u6210\u5458\u66F4\u65B0\u65F6\u5FC5\u987B\u4F7F\u7528\u5F53\u524D attempt_id\uFF1Bstale-attempt \u9519\u8BEF\u8BF4\u660E\u6240\u6709\u6743\u5DF2\u53D8\u66F4\u3002\u6536\u5230\u8FDB\u5EA6\u901A\u77E5\u540E\u6301\u7EED\u68C0\u67E5\u72B6\u6001\uFF0C\u76F4\u5230\u6BCF\u9879\u8981\u6C42\u7684\u4EFB\u52A1\u90FD\u5230\u7EC8\u6001\u3001\u6BCF\u4F4D\u6210\u5458\u90FD\u7A7A\u95F2/\u5C31\u7EEA\uFF1B\u4E0D\u8981\u5FD9\u8F6E\u8BE2\uFF0C\u4E5F\u4E0D\u8981\u5411\u6CA1\u6709\u88AB\u5206\u914D\u5DE5\u4F5C\u7684\u6210\u5458\u7D22\u8981\u6C47\u62A5\u3002\n7. \u5982\u679C\u7528\u6237\u70B9\u540D\u4E86\u67D0\u4E2A\u5DF2\u914D\u7F6E\u7684 profile / template / \u56FA\u5B9A\u82B1\u540D\u518C\uFF0C\u628A\u8BE5\u540D\u5B57\u4F5C\u4E3A profile= \u4F20\u7ED9 agent_teams_create\u3002\u7528 profile \u6210\u529F\u521B\u5EFA\u540E\uFF0C\u4E0D\u8981\u91CD\u5EFA\u76F8\u540C\u7684\u6210\u5458\u3002\u79CD\u5B50 profile \u81EA\u5E26\u6A21\u677F\u4EFB\u52A1\uFF1B\u961F\u957F\u89C4\u5212 profile \u53EA\u63D0\u4F9B\u82B1\u540D\u518C\u4E0E\u62A4\u680F\uFF0CDAG \u8981\u4F60\u5728 staging \u9636\u6BB5\u81EA\u884C\u8BBE\u8BA1\u3002\u8BC4\u5BA1/\u6D4B\u8BD5\u5931\u8D25\u65F6\u6DFB\u52A0\u4FEE\u590D\u6216\u91CD\u8BD5\u4EFB\u52A1\uFF0C\u4F46\u7EDD\u4E0D\u8BA9\u65B0\u4EFB\u52A1\u4F9D\u8D56\u5931\u8D25\u7684\u4EFB\u52A1\u3002\u4E0D\u8981\u7528 send_message \u53BB\u542F\u52A8\u4E0B\u4E00\u9636\u6BB5\uFF1B\u6279\u51C6\u540E\u8C03\u5EA6\u5668\u4F1A\u5206\u914D\u5C31\u7EEA\u7684\u5DE5\u4F5C\u3002\u5220\u9664\u56E2\u961F\u4E4B\u524D\uFF0C\u76EF\u5230\u6BCF\u9879\u8981\u6C42\u7684\u4EFB\u52A1\u90FD\u5230\u7EC8\u6001\u3002\u672A\u7ECF\u7528\u6237\u660E\u786E\u786E\u8BA4\uFF0C\u7EDD\u4E0D\u8981\u6267\u884C\u771F\u5B9E\u7684\u90E8\u7F72\u3002\n8. \u8D28\u91CF\u7C7B\u4EFB\u52A1\uFF08requirements\u3001implementation\u3001verification\u3001review\u3001repair\u3001integration\uFF09\u5FC5\u987B\u5E26\u5951\u7EA6\uFF1A\u975E\u7A7A objective \u4E0E acceptance\uFF1Bimplementation/repair \u8FD8\u9700\u8981 inScope \u4E0E verify\u3002review/requirements \u53EA\u6709 verdict=pass \u624D\u80FD\u5B8C\u6210\uFF1Bneeds_revision/reject \u5FC5\u987B\u5E26 findings \u5931\u8D25\u6536\u573A\u3002\u7CFB\u7EDF\u968F\u540E\u4F1A\u6253\u5F00\u4F9D\u8D56\u6210\u529F\u6765\u6E90\uFF08\u7EDD\u4E0D\u4F9D\u8D56\u5931\u8D25\u7684\u8BC4\u5BA1\uFF09\u7684\u4FEE\u590D + \u4E0B\u4E00\u6B21\u8BC4\u5BA1\u3002\u4E0D\u8981\u6279\u51C6\u4F60\u81EA\u5DF1\u7684\u5B9E\u73B0\u3002create_task \u4E0D\u518D\u9759\u9ED8\u6062\u590D\u5DF2\u505C\u6446\uFF08halted\uFF09\u7684\u56E2\u961F \u2014\u2014 \u8C03\u7528 agent_teams_resume \u5E76\u9644\u539F\u56E0\uFF0C\u6216 create_task({resume:true, resumeReason})\u3002\n9. \u5F53\u7528\u6237\u660E\u786E\u8981\u6C42\u5B8C\u6574\u7684\u8D28\u91CF\u6A21\u5F0F\u89C4\u5212\u65F6\uFF0C\u9664\u975E\u7EA6\u675F\u7981\u6B62\u67D0\u4E2A\u9636\u6BB5\uFF0C\u6309\u6B64\u987A\u5E8F\uFF1Arequirements \u2192 implementation \u2192 verification \u2192 review \u2192 integration\u3002\u5728\u56E2\u961F\u8FD8\u5904\u4E8E staging \u65F6\u5C31\u628A\u6574\u5F20 DAG \u5EFA\u597D\uFF1A\u5F53\u67D0\u4E2A\u5B9E\u73B0\u7684\u4F9D\u8D56\u94FE\u5305\u542B\u90A3\u4E2A requirements \u4EFB\u52A1\u65F6\uFF0C\u5141\u8BB8\u5B83\u5728 requirements \u5B8C\u6210\u524D\u521B\u5EFA\u3002\u8FD9\u662F\u53D7\u652F\u6301\u7684\u884C\u4E3A\uFF1B\u4E0D\u8981\u7B49 requirements \u8DD1\u5B8C\uFF0C\u4E5F\u4E0D\u8981\u9760\u67E5\u770B\u63D2\u4EF6\u6E90\u7801\u6765\u786E\u8BA4\u3002staged \u7684 integration \u4EFB\u52A1\u53EF\u4EE5\u4F9D\u8D56\u7B2C 1 \u8F6E review\u3002\u82E5\u8BE5\u8BC4\u5BA1\u968F\u540E\u8FD4\u56DE needs_revision\uFF0C\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u628A\u4ECD\u672A\u5F00\u59CB\u7684\u4E0B\u6E38\u4F9D\u8D56\u6539\u63A5\u5230\u751F\u6210\u7684\u4FEE\u590D + \u4E0B\u4E00\u6B21\u8BC4\u5BA1\u95E8\u4E0A\uFF0C\u6240\u4EE5\u628A integration \u7559\u5728\u539F\u8BA1\u5212\u91CC\uFF0C\u4E0D\u8981\u7701\u7565\u6216\u624B\u5DE5\u91CD\u5EFA\u3002\u4ECE\u771F\u5B9E\u5DE5\u4F5C\u533A\u6216\u660E\u786E\u7684 profile \u63A8\u5BFC inScope \u4E0E\u9A8C\u8BC1\u547D\u4EE4\uFF1B\u7EDD\u4E0D\u8981\u5047\u8BBE src/ \u6216 pnpm test\u3002\u7ED9\u6BCF\u4E2A\u8D28\u91CF\u4EFB\u52A1\u5951\u7EA6\u3002\u8BC4\u5BA1\u7684 acceptance \u8981\u8BC4\u5224\u6700\u65B0\u7684\u5B9E\u73B0\uFF0C\u800C\u4E0D\u662F\u95E8\u4F1A\u4E0D\u4F1A\u62D2\u6389 needs_revision\u3002\u4E0D\u8981\u628A\u5192\u70DF\u6D4B\u8BD5\u811A\u672C\u5199\u8FDB\u4EFB\u52A1\u3002\u4E0D\u8981\u8BA9\u8BC4\u5BA1\u8005\u6545\u610F\u63D0\u4EA4 needs_revision\u3002\u9664\u975E\u7528\u6237\u8981\u6C42\u961F\u957F\u63A5\u7BA1\uFF0C\u4E0D\u8981\u81EA\u79F0\u5B9E\u73B0\u6216\u8BC4\u5BA1\u3002\u8BC4\u5BA1\u5931\u8D25\u540E\uFF0C\u7B49\u5F85\u81EA\u52A8\u4FEE\u590D + \u4E0B\u4E00\u6B21\u8BC4\u5BA1\uFF0C\u4E0D\u8981\u624B\u5DE5\u91CD\u5EFA\u8FD9\u4E2A\u5FAA\u73AF\u3002halted \u8868\u793A\u4EBA\u7C7B\u505C\u6B62\u4E86\u56E2\u961F\uFF1B\u521B\u5EFA\u66F4\u591A\u5DE5\u4F5C\u524D\u5148\u8C03\u7528 agent_teams_resume\u3002escalated \u8868\u793A\u81EA\u52A8\u8BC4\u5BA1\u5FAA\u73AF\u649E\u5230\u4E86\u4E0A\u9650\uFF1B\u90A3\u4E0D\u662F halt\u3002\n10. \u628A\u56E2\u961F\u6210\u679C\u5448\u73B0\u7ED9\u7528\u6237\uFF0C\u7136\u540E agent_teams_delete \u8BE5\u56E2\u961F\uFF0C\u9664\u975E\u7528\u6237\u8FD8\u60F3\u7EE7\u7EED\u7528\u5B83\u3002\u505C\u6B62\u56E2\u961F\u4F1A\u540C\u65F6\u4E2D\u6B62\u961F\u957F\u7684\u5F53\u524D\u56DE\u5408\u548C\u6210\u5458\u7684\u5DE5\u4F5C\uFF1B\u53EA\u6709\u4E4B\u540E\u660E\u786E\u7684\u7528\u6237\u8F6E\u624D\u80FD\u6062\u590D\u3002\n\n\u5DE5\u5177\uFF1Aagent_teams_create, agent_teams_approve, agent_teams_edit_plan, agent_teams_add_member, agent_teams_remove_member, agent_teams_create_task, agent_teams_reassign_task, agent_teams_claim_task, agent_teams_update_task, agent_teams_send_message, agent_teams_status, agent_teams_resume, agent_teams_delete`\n", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 tool:cordis\u3002\n * cordis_* \u5DE5\u5177\u540D\u3001pluginId / packageId / pluginRunId / currentPackageId /\n * nextPackageId \u7B49\u8FD0\u884C\u65F6\u6807\u8BC6\u3001@pluginId \u5F15\u7528\u8BED\u6CD5\u3001\u793A\u4F8B\u4EE3\u7801\u5757\u9010\u5B57\u4FDD\u7559\u3002\n */\nexport const CORDIS = `# \u52A8\u6001 Cordis \u63D2\u4EF6\n\n\u52A8\u6001 Cordis \u63D2\u4EF6\u4E34\u65F6\u6269\u5C55\u5F53\u524D DSH \u8FDB\u7A0B\u3002\u63D2\u4EF6\u7528 apply(ctx) \u6D88\u8D39\u670D\u52A1\u3001\u76D1\u542C\u4E8B\u4EF6\u3001\u63D0\u4F9B\u670D\u52A1\u3001\u6CE8\u518C\u6A21\u578B\u5DE5\u5177\uFF0C\u6216\u5728\u69FD\u4F4D\uFF08Slot\uFF09\u4E2D\u6CE8\u518C\u6D4F\u89C8\u5668 UI\u3002\n\n- \u63D2\u4EF6\u4E0E\u5305\uFF08Package\uFF09\u7684\u5B9A\u4E49\u53EA\u5B58\u5728\u4E8E\u5F53\u524D\u8FDB\u7A0B\u3002define \u672C\u8EAB\u4E0D\u4FEE\u6539\u4ED3\u5E93\u6E90\u7801\u3001\u914D\u7F6E\u6216\u78C1\u76D8\uFF0C\u5B9A\u4E49\u4E5F\u4E0D\u4F1A\u5728\u8FDB\u7A0B\u91CD\u542F\u540E\u4FDD\u7559\u3002\n- \u53D7\u9650\u6267\u884C\u73AF\u5883\u9632\u7684\u662F\u8BEF\u7528\uFF0C\u4E0D\u662F\u9488\u5BF9\u6076\u610F\u4EE3\u7801\u7684\u5B89\u5168\u8FB9\u754C\u3002\u52A8\u6001\u4EE3\u7801\u53D6\u5F97\u7684\u670D\u52A1\u8FDE\u63A5\u7684\u662F\u771F\u5B9E\u8FD0\u884C\u65F6\u3002\n\n## \u5148\u628A\u9762\u5411\u7528\u6237\u7684\u8BA1\u5212\u8BF4\u6E05\u695A\n\n- \u52A8\u6001 Cordis \u63D2\u4EF6\u662F\u53EF\u9009\u7684\u5B9E\u73B0\u673A\u5236\u4E4B\u4E00\uFF0C\u4E0D\u662F\u6240\u6709\u8BF7\u6C42\u7684\u9ED8\u8BA4\u9009\u9879\u3002\u53EA\u6709\u5F53\u7528\u6237\u6253\u7B97\u8BBE\u8BA1\u6216\u521B\u9020\u67D0\u6837\u4E1C\u897F\uFF0C\u6216\u4E00\u4E2A\u4E34\u65F6\u754C\u9762\u80FD\u5B9E\u8D28\u6027\u5E2E\u52A9\u5F53\u524D\u5DE5\u4F5C\u65F6\uFF0C\u624D\u8003\u8651\u7528\u5B83\u3002\u8FD9\u4E9B\u6307\u4EE4\u6216\u76F8\u5173\u5DE5\u5177\u7684\u5B58\u5728\uFF0C\u4EE5\u53CA\u5173\u4E8E Cordis \u672C\u8EAB\u7684\u8BA8\u8BBA\uFF0C\u90FD\u4E0D\u610F\u5473\u7740\u8BF7\u6C42\u5C31\u662F\u52A8\u6001\u63D2\u4EF6\u4EFB\u52A1\u3002\n- \u5F53 Cordis \u53EF\u80FD\u5408\u9002\u65F6\uFF0C\u4ECE\u8BF7\u6C42\u4E0E\u5BF9\u8BDD\u63A8\u65AD\u610F\u56FE\u4E2D\u7684\u5DE5\u4F5C\u76EE\u6807\u4E0E\u751F\u547D\u5468\u671F\u3002\u53EA\u6709\u5F53\u6210\u679C\u5C5E\u4E8E\u5F53\u524D\u8FD0\u884C\u4E2D\u7684 Harness\u3001\u4E14\u5E94\u4F5C\u4E3A\u4E34\u65F6\u8FD0\u884C\u65F6\u6269\u5C55\u4EA4\u4ED8\u65F6\u624D\u4F7F\u7528\u5B83\u3002\u5982\u679C\u8FD9\u4E2A\u533A\u5206\u5B9E\u8D28\u6027\u5730\u6A21\u7CCA\uFF0C\u6700\u591A\u95EE\u4E00\u4E2A\u5173\u4E8E\u9884\u671F\u7ED3\u679C\u6216\u751F\u547D\u5468\u671F\u7684\u7B80\u77ED\u95EE\u9898\uFF1B\u5426\u5219\u6309\u5339\u914D\u7684\u5DE5\u4F5C\u6D41\u7EE7\u7EED\uFF0C\u4E0D\u8981\u8981\u6C42\u7528\u6237\u4E86\u89E3\u6216\u9009\u62E9 Cordis \u4F5C\u4E3A\u5B9E\u73B0\u673A\u5236\u3002\n- \u4E00\u65E6\u786E\u5B9A\u52A8\u6001\u63D2\u4EF6\u5408\u9002\uFF0C\u5224\u65AD\u4EFB\u52A1\u662F\u521B\u5EFA\u65B0\u63D2\u4EF6\uFF0C\u8FD8\u662F\u7528 @pluginId \u4FEE\u6539\u7528\u6237\u6307\u540D\u7684\u63D2\u4EF6\u3002\u76EE\u6807\u660E\u786E\u65F6\u76F4\u63A5\u8FDB\u884C\uFF0C\u4E0D\u8981\u53CD\u590D\u8BF7\u6C42\u786E\u8BA4\u3002\n- \u4ECE\u8BF7\u6C42\u7684\u6210\u679C\u51FA\u53D1\u9009\u62E9\u5BBF\u4E3B\uFF08Host\uFF09\u3001\u5BA2\u6237\u7AEF\uFF08Client\uFF09\u6216\u4E24\u8005\u3002\u4EFB\u52A1\u4E0D\u9700\u8981\u53EF\u89C1\u7684\u9875\u9762\u884C\u4E3A\u65F6\uFF0C\u4E0D\u8981\u63D0\u8BAE\u5BA2\u6237\u7AEF/\u6D4F\u89C8\u5668 UI\uFF1B\u5F53\u8BF7\u6C42\u7684\u6210\u679C\u662F\u53EF\u89C6\u5316\u3001\u53EF\u4EA4\u4E92\u6216\u4F9D\u8D56\u9875\u9762\u72B6\u6001\u65F6\uFF0C\u4E5F\u4E0D\u8981\u56DE\u907F\u5BA2\u6237\u7AEF\u3002\u5BBF\u4E3B\u8FD8\u662F\u5BA2\u6237\u7AEF\u662F\u5B9E\u73B0\u9009\u62E9\uFF0C\u4E0D\u8981\u8BA9\u7528\u6237\u53BB\u9009\u3002\n- \u5F53\u8BBE\u8BA1\u65B9\u5411\u6216\u4E00\u4E2A\u6F5C\u5728\u6709\u7528\u7684\u754C\u9762\u4F1A\u5B9E\u8D28\u6027\u5F71\u54CD\u7ED3\u679C\u65F6\uFF0C\u6700\u591A\u95EE\u4E00\u4E2A\u5173\u4E8E\u6210\u679C\u6216\u521B\u4F5C\u504F\u597D\u7684\u7B80\u77ED\u95EE\u9898\uFF0C\u5E76\u7ED9\u51FA\u51E0\u4E2A\u5019\u9009\u65B9\u5411\uFF1B\u5426\u5219\u76F4\u63A5\u8FDB\u884C\uFF0C\u4E0D\u8981\u641E\u591A\u8F6E\u8BBF\u8C08\u6216\u590D\u6742\u95EE\u5377\u3002\n- cordis_define \u53EA\u5B9A\u4E49\u5E76\u5448\u73B0\u4EE3\u7801\uFF0C\u4E0D\u4F1A\u8FD0\u884C\u5B83\u3002\u5B9A\u4E49\u4E4B\u540E\uFF0C\u8BF4\u660E\u5BBF\u4E3B\u8FD4\u56DE\u7684 pluginId \u4E0E packageId\uFF0C\u4EE5\u53CA\u4E0B\u4E00\u6B65\u662F run \u8FD8\u662F update\u3002\n- cordis_run \u53EF\u80FD\u9700\u8981\u7528\u6237\u6279\u51C6\u3002\u8FD4\u56DE awaiting-approval \u65F6\uFF0C\u8BF4\u660E\u7528\u6237\u9700\u8981\u5728 UI \u91CC\u5141\u8BB8\u6216\u62D2\u7EDD\u3002\u4E0D\u8981\u7B49\u5F85\u3001\u91CD\u8BD5\u6216\u58F0\u79F0\u5B83\u5DF2\u5728\u8FD0\u884C\u3002\n- \u8FD4\u56DE starting \u65F6\uFF0C\u8BF4\u660E\u8BF7\u6C42\u5DF2\u8FDB\u5165\u5F02\u6B65\u6D41\u7A0B\uFF0C\u5BA2\u6237\u7AEF\u4ECD\u5728\u6FC0\u6D3B\u3002starting \u4E0D\u4EE3\u8868\u6210\u529F\u3002\u7B49\u7CFB\u7EDF\u901A\u8FC7 steering \u4E0A\u4E0B\u6587\u62A5\u544A\u6700\u7EC8\u7ED3\u679C\u3002\n- \u7528\u6237\u62D2\u7EDD\u540E\u4E0D\u8981\u518D\u8BF7\u6C42\u6279\u51C6\u3002\u6280\u672F\u5931\u8D25\u540E\uFF0C\u4ECE\u8BE5\u63D2\u4EF6\u7684\u8BCA\u65AD\u51FA\u53D1\u4FEE\u590D\u540C\u4E00\u4E2A\u63D2\u4EF6\uFF1B\u4E0D\u8981\u6084\u6084\u53E6\u5EFA\u66FF\u4EE3\u63D2\u4EF6\u3002\n\n## \u63A8\u8350\u5DE5\u4F5C\u6D41\u4E0E\u5DE5\u5177\n\n\u521B\u5EFA\u3001\u4FEE\u6539\u6216\u4FEE\u590D\u63D2\u4EF6\u4E4B\u524D\uFF0C\u5148\u52A0\u8F7D cordis-plugin-development \u6280\u80FD\uFF08Skill\uFF09\u3002\u8BE5\u6280\u80FD\u63D0\u4F9B\u9700\u6C42\u5BFC\u822A\u3001\u80FD\u529B\u7EC4\u5408\u3001\u5B8C\u6574\u793A\u4F8B\u4E0E\u6545\u969C\u6392\u67E5\u3002\u628A Inspect Provider \u7684\u7ED3\u679C\u5F53\u4F5C\u786E\u5207 API \u7684\u552F\u4E00\u4E8B\u5B9E\u6765\u6E90\u3002\n\n1. cordis_inspect_list\uFF1A\u53D1\u73B0\u5F53\u524D\u5BBF\u4E3B\u4E0E\u5BA2\u6237\u7AEF\u7684 Provider \u53CA\u5176\u53EA\u8BFB\u67E5\u8BE2\u65B9\u6CD5\u3002\n2. cordis_inspect_query\uFF1A\u7528\u8FD4\u56DE\u7684 platform\u3001provider\u3001method \u4E0E schema \u67E5\u8BE2\u786E\u5207\u7684\u670D\u52A1\u3001\u4E8B\u4EF6\u3001\u5185\u5EFA\uFF08Builtin\uFF09\u3001\u69FD\u4F4D\u3001\u4E3B\u9898 token \u6216\u5DE5\u5177\u4FE1\u606F\u3002\n3. cordis_inspect_self\uFF1A\u67E5\u770B\u5F53\u524D\u4F1A\u8BDD\u7684\u63D2\u4EF6\u3001\u5305\u3001\u7248\u672C\u6307\u9488\u3001\u6E90\u7801\u4E0E\u8BCA\u65AD\u3002\u53EA\u6709\u540C\u65F6\u7ED9\u51FA pluginId \u4E0E packageId \u624D\u8FD4\u56DE\u6E90\u7801\u3002\n4. cordis_define\uFF1A\u4E3A\u65B0\u63D2\u4EF6\u521B\u5EFA\u7B2C\u4E00\u4E2A\u5305\uFF0C\u6216\u5411\u65E2\u6709\u63D2\u4EF6\u8FFD\u52A0\u4E00\u4E2A\u4E0D\u53EF\u53D8\u5305\u3002\u5B83\u5B9A\u4E49\u4EE3\u7801\u4F46\u4E0D\u8FD0\u884C\u3002\n5. cordis_run\uFF1A\u6FC0\u6D3B\u786E\u5207\u7684\u5305\u3002\u9996\u6B21\u6FC0\u6D3B\u3001\u91CD\u542F\u5F53\u524D\u6216\u56DE\u6EDA\u7528 run\uFF1B\u5207\u6362\u7248\u672C\u7528 update\u3002\n6. cordis_stop\uFF1A\u79FB\u9664\u5F53\u524D Run \u4E0E\u5F85\u6279\u51C6\u8BF7\u6C42\uFF0C\u4F46\u4FDD\u7559\u5B9A\u4E49\u3001\u6388\u6743\u4E0E\u7248\u672C\u6307\u9488\u3002\n7. cordis_undefine\uFF1A\u6C38\u4E45\u505C\u7528\u5E76\u5220\u9664\u4E00\u4E2A\u63D2\u4EF6\u53CA\u5176\u6240\u6709\u5305\u3002\u53EA\u5728\u786E\u8BA4\u7528\u6237\u4E0D\u518D\u9700\u8981\u540E\u4F7F\u7528\u3002\n\n- \u5728\u5199\u4EE3\u7801\u4E4B\u524D\uFF0CInspect \u4E0E\u76EE\u5F55\uFF08Catalog\uFF09\u6570\u636E\u53EA\u7528\u4E8E\u786E\u8BA4\u80FD\u529B\u3001\u540D\u5B57\u3001\u7B7E\u540D\u3001\u7C7B\u578B\u4E0E\u6CE8\u518C\u534F\u8BAE\uFF1B\u5B83\u4EEC\u4E0D\u66FF\u4EE3\u4E1A\u52A1 API\u3002\n- \u4E0D\u5E26\u8F93\u5165\u8C03\u7528 Service.listService \u4E0E Event.listEvents\uFF0C\u4ECE\u7D27\u51D1\u7684\u7B7E\u540D\u76EE\u5F55\u91CC\u6311\u9009\uFF0C\u7136\u540E\u518D\u7CBE\u786E\u67E5\u8BE2\u76EE\u6807\u670D\u52A1\u6216\u4E8B\u4EF6\u3002\u7CBE\u786E\u67E5\u8BE2\u8FD4\u56DE\u7ED3\u6784\u5316\u5951\u7EA6\u53CA\u5176\u5F15\u7528\u7684\u7C7B\u578B\u3002\n- \u8FD0\u884C\u65F6\uFF0C\u63D2\u4EF6\u5FC5\u987B\u8C03\u7528\u771F\u5B9E\u670D\u52A1\u3001\u76D1\u542C\u771F\u5B9E\u4E8B\u4EF6\u3002\u4E0D\u8981\u7F13\u5B58\u3001\u5C55\u793A Inspect \u7ED3\u679C\uFF0C\u4E5F\u4E0D\u8981\u628A\u5B83\u5F53\u4E1A\u52A1\u6570\u636E\u4F9D\u8D56\u3002\n\n## \u8EAB\u4EFD\u3001\u7248\u672C\u4E0E\u6279\u51C6\n\n- pluginId \u6807\u8BC6\u4E00\u4E2A\u53EF\u4EE5\u968F\u65F6\u95F4\u4FEE\u6539\u7684\u63D2\u4EF6\u3002\u65B0\u5EFA\u63D2\u4EF6\u53EA\u63D0\u4EA4 3\u20136 \u4E2A\u5C0F\u5199\u82F1\u6587\u5B57\u6BCD\u7684\u8BED\u4E49\u5316 idPrefix\uFF1B\u6700\u7EC8 ID \u7531\u5BBF\u4E3B\u5206\u914D\u3002\n- packageId \u6807\u8BC6\u63D2\u4EF6\u4E0B\u4E00\u4E2A\u4E0D\u53EF\u53D8\u7684\u5BBF\u4E3B/\u5BA2\u6237\u7AEF\u6E90\u7801\u7248\u672C\u3002\u8981\u6539\u4EE3\u7801\u5C31\u5B9A\u4E49\u65B0\u5305\uFF0C\u7EDD\u4E0D\u8986\u76D6\u65E7\u7248\u672C\u3002\n- pluginRunId \u6807\u8BC6\u4E00\u6B21\u6FC0\u6D3B\u5C1D\u8BD5\uFF0C\u5173\u8054\u5176\u6279\u51C6\u3001\u5BBF\u4E3B/\u5BA2\u6237\u7AEF\u52A0\u8F7D\u3001\u79C1\u6709 RPC\u3001Run \u5361\u7247\u4E0E\u9519\u8BEF\u3002\n- currentPackageId \u662F\u6700\u8FD1\u4E00\u6B21\u5B8C\u5168\u6210\u529F\u7684\u5305\u3002\u505C\u6B62\u3001\u542F\u52A8\u66F4\u65B0\u6216\u66F4\u65B0\u5931\u8D25\u90FD\u4E0D\u4F1A\u6E05\u9664\u5B83\u3002\n- nextPackageId \u662F\u7B49\u5F85\u6279\u51C6\u3001\u6B63\u5728\u5C1D\u8BD5\u3001\u7B49\u5F85\u5BA2\u6237\u7AEF\u6FC0\u6D3B\u6216\u6700\u8FD1\u5931\u8D25\u7684\u76EE\u6807\u5305\u3002\n- \u5355\u4E2A\u5BF9\u52FE\u53EA\u6279\u51C6\u5F53\u524D\u5305\uFF1B\u53CC\u5BF9\u52FE\u6279\u51C6\u540C\u4E00\u63D2\u4EF6\u672A\u6765\u7684\u7248\u672C\u3002\u6280\u672F\u5931\u8D25\u540E\u6388\u6743\u4ECD\u7136\u6709\u6548\u3002\n- \u66F4\u65B0\u4F1A\u5728\u542F\u52A8\u76EE\u6807\u5305\u4E4B\u524D\u505C\u6B62\u65E7 Run\u3002\u5931\u8D25\u4E0D\u4F1A\u81EA\u52A8\u91CD\u542F\u65E7\u7248\u672C\uFF1B\u4E4B\u540E\u7528 update \u91CD\u8BD5\uFF0C\u6216\u7528 run \u56DE\u6EDA\u5230 current\u3002\n\n\u5F53\u7528\u6237\u8F93\u5165 @pluginId \u65F6\uFF0C\u7CFB\u7EDF\u6CE8\u5165\u8EAB\u4EFD\u3001\u9ED8\u8BA4\u57FA\u7840\u5305\u3001\u7248\u672C\u6307\u9488\u4E0E\u8FD0\u884C\u72B6\u6001\uFF0C\u4F46\u4E0D\u6CE8\u5165\u6E90\u7801\uFF1A\n\n1. \u8C03\u7528 cordis_inspect_self(pluginId, packageId) \u8BFB\u53D6\u76EE\u6807\u6E90\u7801\u3002\n2. \u4EE5\u65E2\u6709\u6A21\u5F0F\u4F7F\u7528 cordis_define\uFF0C\u5411\u540C\u4E00\u63D2\u4EF6\u8FFD\u52A0\u5305\u3002\n3. \u6309\u7248\u672C\u5173\u7CFB\u4EE5 run \u6216 update \u6A21\u5F0F\u8C03\u7528 cordis_run\u3002\n\n\u7EDD\u4E0D\u4E3A @pluginId \u6084\u6084\u53E6\u5EFA\u63D2\u4EF6\u3002\u5982\u679C\u8BE5\u5F15\u7528\u56E0\u4E3A\u88AB\u5220\u9664\u3001\u5C5E\u4E8E\u522B\u7684\u4F1A\u8BDD\u6216\u968F\u8FDB\u7A0B\u91CD\u542F\u4E22\u5931\u800C\u4E0D\u53EF\u7528\uFF0C\u76F4\u63A5\u544A\u8BC9\u7528\u6237\u3002\n\n## \u5FC5\u987B\u907F\u514D\u7684\u9AD8\u9891\u9519\u8BEF\n\n### \u670D\u52A1\uFF1Actx.get \u4E0E inject\n\n- \u9ED8\u8BA4\u7528 ctx.get('serviceName') \u8BFB\u53D6\u53EF\u9009\u670D\u52A1\uFF0C\u5E76\u5904\u7406 undefined\u3002\n- \u53EA\u6709\u5F53\u8BE5\u670D\u52A1\u662F\u786C\u4F9D\u8D56\u3001\u4E14\u63D2\u4EF6\u5FC5\u987B\u8FDB\u5165\u7B49\u5F85\uFF08\u76F4\u5230 Cordis \u5728\u670D\u52A1\u51FA\u73B0\u540E\u91CD\u65B0\u6FC0\u6D3B\u5B83\uFF09\u65F6\uFF0C\u624D\u5728\u8FD4\u56DE\u7684\u63D2\u4EF6\u5BF9\u8C61\u4E0A\u58F0\u660E inject: ['serviceName']\u3002\n- \u53EA\u6709\u5728 inject \u91CC\u58F0\u660E\u8FC7\u67D0\u670D\u52A1\u540E\uFF0C\u624D\u80FD\u4EE5 ctx.serviceName \u5C5E\u6027\u65B9\u5F0F\u8BFB\u53D6\u3002\u7EDD\u4E0D\u8981\u4EE5 ctx \u5C5E\u6027\u8BBF\u95EE\u672A\u58F0\u660E\u7684\u670D\u52A1\u3002\n\n\\`\\`\\`js\nreturn {\n inject: ['requiredService'],\n apply(ctx) {\n ctx.requiredService.someMethod()\n const optionalService = ctx.get('optionalService')\n if (optionalService !== undefined) optionalService.someMethod()\n },\n}\n\\`\\`\\`\n\n### \u4EE3\u7801\uFF1A\u53EA\u7528\u666E\u901A JavaScript\n\n- \u5BBF\u4E3B\u4E0E\u5BA2\u6237\u7AEF\u4EE3\u7801\u4E0D\u7ECF TypeScript\u3001JSX \u6216\u6253\u5305\u5668\u8F6C\u6362\u3002\n- \u4E0D\u8981\u7528 TypeScript \u7C7B\u578B\u3001as\u3001\u88C5\u9970\u5668\u3001import\u3001require \u6216 JSX\u3002\n- \u5BA2\u6237\u7AEF React \u4EE3\u7801\u5FC5\u987B\u7528 React.createElement(...)\uFF1B\u7EDD\u4E0D\u5199 <Component />\u3002\n- \u4E0D\u8981\u5047\u8BBE process\u3001Buffer\u3001window\u3001document\u3001fetch\u3001\u539F\u751F\u5B9A\u65F6\u5668\u6216\u4EFB\u4F55\u5176\u5B83\u5168\u5C40\u53EF\u7528\u3002\u5148\u67E5\u8BE2\u5BF9\u5E94\u5E73\u53F0\u7684 Builtins \u4E0E\u670D\u52A1\u3002\n\n### \u6570\u636E\uFF1A\u4E0D\u8981\u5E8F\u5217\u5316\u6D3B\u6570\u636E\n\n- \u670D\u52A1\u3001\u4E8B\u4EF6\u3001\u69FD\u4F4D\u3001\u4F1A\u8BDD\u53CA\u5176\u884D\u751F\u7684 Cordis/DSH \u5BF9\u8C61\u662F\u5185\u90E8\u6D3B\u6570\u636E\uFF0C\u4E0D\u662F\u53EF\u4EE5\u503E\u5012\u7684\u666E\u901A JSON\u3002\n- \u4E0D\u8981\u5BF9\u6D3B\u6570\u636E\u4F7F\u7528 JSON.stringify\u3001structuredClone\u3001\u9012\u5F52\u679A\u4E3E\u3001\u6574\u4F53\u590D\u5236\u6216\u6574\u5BF9\u8C61\u5C55\u793A\u3002\n- \u53EA\u8BFB\u53D6\u4EFB\u52A1\u6240\u9700\u7684\u53F6\u5B50\u5B57\u6BB5\uFF0C\u7136\u540E\u6784\u9020\u4E0D\u5E26\u5BBF\u4E3B\u5F15\u7528\u7684\u6700\u5C0F\u81EA\u6709\u6570\u636E\u5BF9\u8C61\u3002\n\n### \u751F\u547D\u5468\u671F\uFF1A\u6BCF\u4E2A\u526F\u4F5C\u7528\u90FD\u5FC5\u987B\u53EF\u9006\n\n- \u670D\u52A1\u3001\u4E8B\u4EF6\u3001\u5DE5\u5177\u3001\u5904\u7406\u5668\u3001\u5B9A\u65F6\u5668\u3001\u69FD\u4F4D\u3001\u6837\u5F0F\u4E0E\u4E3B\u9898\u8986\u76D6\u90FD\u5FC5\u987B\u5C5E\u4E8E\u5F53\u524D Fiber\u3002\n- \u7528 ctx.effect()\u3001ctx.on() \u6216\u8FD4\u56DE disposer \u7684\u5B98\u65B9 API\uFF0C\u4FDD\u8BC1 stop\u3001update \u6216 undefine \u80FD\u79FB\u9664\u6BCF\u4E2A\u526F\u4F5C\u7528\u3002\n- cordis-plugin-development \u6280\u80FD\u5305\u542B\u5B9A\u65F6\u5668\u3001\u7011\u5E03\u6D41\u3001\u69FD\u4F4D\u3001\u4E3B\u9898\u3001\u5DE5\u5177\u3001RPC \u4E0E React \u7684\u5B8C\u6574\u793A\u4F8B\u4E0E\u6545\u969C\u6392\u67E5\u3002\n\n## \u5BBF\u4E3B\u4E0E\u5BA2\u6237\u7AEF\n\n- \u5BBF\u4E3B\u8FD0\u884C\u5728 DSH \u7684 Node.js \u8FDB\u7A0B\u91CC\uFF0C\u9002\u5408\u6587\u4EF6\u3001\u7F51\u7EDC\u3001\u547D\u4EE4\u3001Agent/\u4F1A\u8BDD\u8BBF\u95EE\u3001\u5BBF\u4E3B\u4E8B\u4EF6\u3001\u670D\u52A1\u3001\u6A21\u578B\u5DE5\u5177\uFF0C\u4EE5\u53CA\u53EF\u88AB\u5BA2\u6237\u7AEF\u8C03\u7528\u7684 JSON \u65B9\u6CD5\u3002\n- \u5BA2\u6237\u7AEF\u8FD0\u884C\u5728\u6D4F\u89C8\u5668\u9875\u9762\u91CC\uFF0C\u9002\u5408\u4E3B\u9898\u3001\u5E03\u5C40\u3001\u5F53\u524D\u9875\u9762\u72B6\u6001\u3001\u5DE5\u5177\u5361\u7247\u4E0E\u69FD\u4F4D UI\u3002\n- \u5BBF\u4E3B\u4E0E\u5BA2\u6237\u7AEF\u901A\u8FC7\u5305\u79C1\u6709\u7684 JSON \u65B9\u6CD5\u901A\u4FE1\uFF1A\u5BBF\u4E3B\u7528 harness.handle(method, handler)\uFF0C\u5BA2\u6237\u7AEF\u7528 host.call(method, args)\u3002\u65B9\u5411\u662F\u5BA2\u6237\u7AEF\u2192\u5BBF\u4E3B\uFF0C\u4E14\u53EA\u6709\u65E0\u635F JSON \u53EF\u4EE5\u8DE8\u8D8A\u5B83\u3002\n- \u5BA2\u6237\u7AEF UI \u5FC5\u987B\u6CE8\u518C\u5728\u67E5\u8BE2\u5230\u7684\u69FD\u4F4D\u91CC\uFF1Bapply() \u4E0D\u80FD\u76F4\u63A5\u8FD4\u56DE React Element\u3002\u4E0D\u5E26 root \u67E5\u8BE2 Slots.listSubTree\uFF0C\u4ECE\u7D27\u51D1\u7684\u76EE\u7684/\u62D3\u6251\u6811\u91CC\u6311\u9009\uFF0C\u7136\u540E\u518D\u7CBE\u786E\u67E5\u8BE2\u76EE\u6807 root \u7684\u5B8C\u6574\u6CE8\u518C\u5951\u7EA6\u4E0E props\uFF0C\u4E4B\u540E\u624D\u5199\u4EE3\u7801\u3002\n- Run \u4E13\u5C5E\u9762\u677F\u4E0E\u786E\u5207\u7684\u69FD\u4F4D\u6CE8\u518C\u6A21\u5F0F\u89C1\u6280\u80FD\u4E0E Inspect Provider\u3002\n\n## \u5F02\u6B65\u7ED3\u679C\u4E0E\u6062\u590D\n\n- \u4E0D\u8981\u5728\u5DE5\u5177\u91CC\u7B49\u5F85\u53EA\u6709\u5F53\u524D\u56DE\u5408\u7ED3\u675F\u540E\u624D\u53EF\u80FD\u53D1\u751F\u7684\u6279\u51C6\u6216\u6D4F\u89C8\u5668\u5DE5\u4F5C\u3002\n- \u5F02\u6B65\u6210\u529F\u3001\u62D2\u7EDD\u4E0E\u8FD0\u884C\u65F6\u9519\u8BEF\u4F1A\u66F4\u65B0 Run \u72B6\u6001\uFF0C\u5E76\u901A\u8FC7 steering \u4E0A\u4E0B\u6587\u901A\u77E5\u4F60\u3002\n- \u6280\u672F\u5931\u8D25\u540E\uFF0C\u7528 cordis_inspect_self \u8BFB\u53D6\u786E\u5207\u5305\u6E90\u7801\u53CA\u5176 message/stack\u3002\u5728\u540C\u4E00\u63D2\u4EF6\u4E0B\u5B9A\u4E49\u4E00\u4E2A\u4FEE\u6B63\u540E\u7684\u5305\u5E76\u81EA\u4E3B\u91CD\u8BD5\u3002\n- \u5176\u5B83\u5931\u8D25\u539F\u56E0\u3001\u4FEE\u590D\u6D41\u7A0B\u4E0E\u5B8C\u6574\u6269\u5C55\u6A21\u5F0F\uFF0C\u4F7F\u7528 cordis-plugin-development \u6280\u80FD\u3002`\n", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 tools:sdk\u3002\n * \u8BE5\u6BB5 95% \u662F TS \u7C7B\u578B\u58F0\u660E\u4EE3\u7801\u5757\uFF08\u5DE5\u5177\u7B7E\u540D\u5951\u7EA6\uFF09\uFF0C\u9010\u5B57\u7FFB\u8BD1\u65E2\u65E0\u610F\u4E49\u53C8\u6709\u6284\u5199\n * \u98CE\u9669 \u2014\u2014 \u8BD1\u672C\u56E0\u6B64\u662F**\u51FD\u6570\u5F62\u6001**\uFF1A\u53EA\u66FF\u6362\u524D\u5BFC\u6563\u6587\uFF0C\u4EE3\u7801\u5757\u4ECE\u539F\u6587\u7684 \\`\\`\\`ts\n * \u56F4\u680F\u8D77\u9010\u5B57\u8282\u4FDD\u7559\uFF08\u8FD0\u884C\u65F6\u53D6\u81EA\u539F\u6587\uFF0C\u7EDD\u4E0D\u624B\u6284\uFF09\u3002\u5F15\u64CE\u7EA6\u5B9A\uFF1A\u51FD\u6570\u8FD4\u56DE\n * null/undefined = \u653E\u5F03\u66FF\u6362\u3001\u4FDD\u6301\u539F\u6587\u3002\n * ponytail: \u4F9D\u8D56 \\`\\`\\`ts \u56F4\u680F\u6807\u8BB0\u5B58\u5728\uFF1B\u5BBF\u4E3B\u82E5\u6539\u6389\u56F4\u680F\u98CE\u683C\uFF0C\u51FD\u6570\u8FD4\u56DE null\n * \u81EA\u52A8\u9000\u56DE\u82F1\u6587\u539F\u6587\uFF0C\u5347\u7EA7\u8DEF\u5F84\u662F\u628A\u6574\u6BB5\u6539\u6210\u7EAF\u9759\u6001\u8BD1\u672C\u3002\n */\nexport const SDK_ZH = (original) => {\n const at = String(original ?? '').indexOf('\\`\\`\\`ts')\n if (at < 0) return null\n const head = `## \u4E3A run_code \u7F16\u5199\u4EE3\u7801\n\n\\`run_code\\` \u63A5\u53D7\u4E24\u4E2A\u5FC5\u586B\u53C2\u6570\uFF1A\\`code\\` \u2014\u2014 \u4E00\u4E2A\u5F02\u6B65 TypeScript \u51FD\u6570\u7684\u51FD\u6570\u4F53\uFF08\u53EA\u5141\u8BB8\u53EF\u64E6\u9664\u8BED\u6CD5 \u2014\u2014 \u4E0D\u7528 \\`enum\\` \u4E0E\u547D\u540D\u7A7A\u95F4\uFF1B\u7C7B\u578B\u6CE8\u89E3\u4EC5\u4F9B\u53C2\u8003\uFF0C\u8FD0\u884C\u65F6\u4F1A\u5265\u79BB\u7C7B\u578B\uFF09\u2014\u2014 \u548C \\`description\\`\uFF0C\u4E00\u6BB5\u8BF4\u660E\u8BE5\u7A0B\u5E8F\u505A\u4EC0\u4E48\u7684\u7B80\u77ED\u6458\u8981\u3002\u5728\u7A0B\u5E8F\u5185\u90E8\uFF1A\n\n- \u7528 \\`await tools.name(args)\\` \u8C03\u7528\u5DE5\u5177 \u2014\u2014 \u540D\u79F0\u53E4\u602A\u65F6\u7528\u5F15\u53F7\u8BBF\u95EE\uFF1A\\`tools[\"my-tool\"](args)\\`\u3002\u6BCF\u6B21\u8C03\u7528\u90FD\u4F1A\u89E3\u6790\u4E3A\u8BE5\u5DE5\u5177\u7684\u89C4\u8303\u5316 JSON \u503C\u3002\u5DE5\u5177\u53C2\u6570\u5FC5\u987B\u662F\u65E0\u635F JSON\u3002\n- \u5931\u8D25\u7684\u5DE5\u5177\u8C03\u7528\u4F1A\u4EE5 \\`ToolCallError\\` reject\uFF0C\u5176 \\`toolName\\` \u6807\u8BC6\u5931\u8D25\u7684\u5DE5\u5177\uFF0C\\`message\\` \u4EBA\u7C7B\u53EF\u8BFB \u2014\u2014 \u7528 \\`try/catch\\` \u6355\u83B7\u540E\u7EE7\u7EED\u3002\n- \u76F8\u4E92\u72EC\u7ACB\u7684\u53EA\u8BFB\u8C03\u7528\u53EF\u4EE5\u5728 \\`Promise.all\\` \u4E0B\u5E76\u884C\uFF08\u5B89\u5168\u8C03\u7528\u5E76\u53D1\u6267\u884C\uFF1B\u4F1A\u6539\u52A8\u72B6\u6001\u7684\u8C03\u7528\u5355\u72EC\u6309\u63D0\u4EA4\u987A\u5E8F\u6267\u884C\uFF09\u3002\u6709\u4F9D\u8D56\u7684\u5DE5\u4F5C\u7528 \\`await\\` \u4E32\u884C\u3002\n- \u7528 \\`return\\` \u548C/\u6216 \\`console.log(...)\\` \u8F93\u51FA\u7ED3\u679C\u3002\u53EA\u6709\u4F60\u6253\u5370\u6216\u8FD4\u56DE\u7684\u5185\u5BB9\u624D\u7B97\u7A0B\u5E8F\u8F93\u51FA\u3002\u5305\u542B\u56FE\u7247\u7684\u6210\u529F\u5DE5\u5177\u7ED3\u679C\u4F1A\u5728\u8FD0\u884C\u7ED3\u675F\u540E\u9644\u4E0A\uFF0C\u4F9B\u4F60\u4E0B\u4E00\u6B65\u67E5\u770B\uFF1B\u5176\u5B83\u6240\u6709\u4E2D\u95F4\u7ED3\u679C\u90FD\u4E0D\u4F1A\u8FDB\u5165\u5BF9\u8BDD\uFF0C\u56E0\u6B64\u53EA\u63D0\u53D6\u4F60\u9700\u8981\u7684\u90E8\u5206\u3002`\n return head + '\\n\\n\u53EF\u7528\u5DE5\u5177\uFF1A\\n\\n' + original.slice(at)\n}\n", "/**\n * \u4E2D\u6587\u6BB5\u8BD1\u672C\uFF08\u4E13\u5C5E\u5B9A\u5236\uFF09\u2014\u2014 \u6C47\u603B\u5165\u53E3\u3002\n * \u5F15\u64CE\uFF08lib/effective.js \u7684 applySectionPolicy\uFF09\u5728 zhSections \u5F00\u542F\u65F6\u6309\u6BB5\u540D\n * \u7CBE\u786E\u5339\u914D\u66FF\u6362\u6587\u672C\uFF1A\u5BF9\u5F97\u4E0A\u53F7\u7684\u6BB5\u6574\u6BB5\u6362\u6210\u8BD1\u672C\uFF0C\u5BF9\u4E0D\u4E0A\u7684\u6BB5\u4FDD\u6301\u539F\u6587 \u2014\u2014 \u6BB5\u6570\n * \u4E0E\u6CE8\u5165\u4E0D\u589E\u4E0D\u51CF\u3002\u53D6\u503C\u662F\u5B57\u7B26\u4E32\uFF08\u6574\u6BB5\u66FF\u6362\uFF09\u6216\u51FD\u6570\uFF08(\u539F\u6587) => \u8BD1\u672C | null\uFF0C\n * \u89C1 sdk.mjs\uFF1B\u8FD4\u56DE null = \u653E\u5F03\u66FF\u6362\uFF09\u3002\n * \u5B89\u5168\u8FB9\u754C\uFF1A{{...}} \u63D0\u793A\u8BCD\u53D8\u91CF\uFF08deployment:persona \u7684 {{model}} / {{cwd}}\u3001\n * env_* \u7B49\uFF09\u7531\u5BBF\u4E3B\u5728\u88C5\u914D\u540E\u6E32\u67D3\uFF0C\u8BD1\u672C\u91CC\u9010\u5B57\u4FDD\u7559\uFF1B\u9ED1\u540D\u5355\u6321\u4E0B\u7684\u5BC6\u94A5\u7C7B env \u53D8\u91CF\n * \u672C\u6765\u5C31\u4E0D\u4F1A\u88AB\u6CE8\u518C\uFF0C\u66FF\u6362\u6587\u672C\u4E0D\u5F15\u5165\u4EFB\u4F55\u65B0\u7684\u53D8\u91CF\u5F15\u7528\u3002\n */\nimport { CORE } from './core.mjs'\nimport { UNDO } from './undo.mjs'\nimport { TEAMS } from './teams.mjs'\nimport { CORDIS } from './cordis.mjs'\nimport { SDK_ZH } from './sdk.mjs'\n\nexport const ZH_SECTIONS = {\n ...CORE,\n 'tool:dsh-undo-savepoint': UNDO,\n 'agent-teams:usage': TEAMS,\n 'tool:cordis': CORDIS,\n 'tools:sdk': SDK_ZH,\n}\n", "/**\n * SectionsPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u5DE6\u680F\uFF08\u63D0\u793A\u8BCD\u6A21\u5F0F\uFF09\u3002\n *\n * \u9876\u90E8\u4E09\u4E2A\u9636\u6BB5 Tab\uFF08\u5F15\u5BFC\u671F / \u5E38\u9A7B\u671F / \u538B\u7F29\u53D7\u63A7\u671F\uFF0C\u6052\u5B9A\u5168\u90E8\u53EF\u9009\uFF09\uFF0C\u4E0E\u53F3\u680F\n * \u9884\u89C8\u7684\u9636\u6BB5\u6309\u94AE**\u8054\u52A8**\uFF1A\u4E24\u8FB9\u5207\u7684\u662F\u540C\u4E00\u4E2A\u9636\u6BB5\uFF0C\u7F16\u8F91\u54EA\u4E2A\u9636\u6BB5\u5C31\u770B\u54EA\u4E2A\u9636\u6BB5\u7684\n * \u88C5\u914D\u3002\u6BCF\u4E2A\u9636\u6BB5\u5217\u51FA\u8BE5\u9636\u6BB5\u88C5\u914D\u91CC\u7684\u6BB5\uFF1A\u52FE\u9009\u6846 = \u8BE5\u9636\u6BB5\u662F\u5426\u6CE8\u5165\u6A21\u578B\uFF08\u52FE\u4E0A =\n * \u542F\u7528\uFF09\uFF0C\u88AB\u505C\u7528\u7684\u884C\u534A\u900F\u660E\u539F\u4F4D\u4FDD\u7559\u3001\u968F\u65F6\u53EF\u52FE\u56DE\u3002\u884C\u5185\uFF1A\u6293\u624B\u62D6\u52A8\u6392\u5E8F / \u2191\u2193 \u91CD\u6392\u3001\n * \u7F16\u8F91\uFF08\u6309\u9636\u6BB5\u66FF\u6362\u6587\u672C\uFF09\u3001\u8FD8\u539F\u3001\u5220\u9664\uFF08\u4EC5\u81EA\u5B9A\u4E49\u6BB5\uFF09\uFF1B\u300C+ \u6CE8\u5165\u300D\u5C55\u5F00\u6CE8\u5165\u65B0\u6BB5\u8868\u5355\u3002\n *\n * \u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 / \u5DF2\u505C\u7528\uFF09\u2014\u2014\u50CF\u5BBF\u4E3B\u80FD\u529B\u7BA1\u7406\u9875\u4E00\u6837\u6309\n * \u52FE\u9009\u72B6\u6001\u7B5B\u9009\u5F53\u524D\u9636\u6BB5\u7684\u5217\u8868\u3002\n *\n * \u62D6\u62FD\uFF08\u89C1 dnd.ts\uFF09\uFF1A\u884C\u6293\u624B\u4E0A\u4E0B\u62D6 = \u5728\u672C\u9636\u6BB5\u6392\u5E8F\uFF1B\u628A\u884C\u62D6\u56DE\u672B\u5C3E\u7684\u300C\u672C\u7CFB\u7EDF\u5168\u90E8\n * \u63D0\u793A\u8BCD\u300D\u6C60 = \u4ECE\u672C\u9636\u6BB5\u79FB\u9664\uFF1B\u628A\u6C60\u91CC\u7684\u6BB5\u62D6\u8FDB\u5217\u8868 = \u52A0\u5165\u672C\u9636\u6BB5\uFF08\u5E26\u6C60\u91CC\u539F\u6587\uFF09\uFF1B\n * \u628A\u884C\u62D6\u5230\u5934\u90E8\u67D0\u4E2A\u9636\u6BB5 Tab = \u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\u3002\u70B9\u6309\u8DEF\u5F84\u7167\u65E7\uFF1A\u6C60\u91CC\u6BCF\u884C\u4E09\u4E2A\u5C0F\u6309\u94AE\n * \u4E5F\u80FD\u52A0\u5165\u5BF9\u5E94\u9636\u6BB5\uFF08\u8FD0\u884C\u65F6\u52A8\u6001\u6BB5\u52A0\u4E0D\u8FDB\uFF0C\u4F1A\u7ED9\u51FA\u8BF4\u660E\uFF09\u3002\n *\n * \u4E09\u6001\u540C\u6B65\uFF08syncAll\uFF0C\u9ED8\u8BA4\u5173\uFF09\uFF1A\u4E09\u4E2A\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u300C\u5E76\u96C6\u884C\u96C6\u300D\u2014\u2014 \u5E38\u9A7B\u671F\u884C\u5E8F\u4E3A\n * \u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8\uFF0C\u540C\u540D\u6BB5\u4EE5\u539F\u751F\u90A3\u4E00\u9636\u6BB5\u7684\u884C\u4E3A\u51C6\uFF1B\u589E\u5220 / \u6392\u5E8F /\n * \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u4E00\u5F8B\u7ECF persistRows \u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08inject + \u4E09\u4EFD\u5C4F\u853D\u540D\u5355\uFF09\uFF0C\n * \u6240\u4EE5\u4E09\u6001\u5217\u8868\u4E0E\u6587\u672C\u6052\u7B49\uFF0C\u4E0D\u518D\u9010\u9636\u6BB5\u5404\u5199\u4E00\u4EFD\u3002\n *\n * \u5168\u90E8\u9636\u6BB5\u72B6\u6001\u903B\u8F91\u6765\u81EA lib/sectionOps.mjs\uFF08\u7EAF\u51FD\u6570\uFF0Cnode --test \u5355\u6D4B\u76F4\u63A5\n * \u8986\u76D6\u540C\u4E00\u4EFD\u4EE3\u7801\uFF09\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type ChangeEvent, type DragEvent as ReactDragEvent, type ReactElement } from 'react'\nimport type { Config, Inventory, PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { PART_ORDER } from './presets.ts'\nimport { injectPhaseOf, deniedNames, blockPatch, phaseInjectEntries, phaseRows, reorderInsert, injectedAt, mirroredRows, mirrorPhaseInjectEntries, mirroredDeniedLists, mirrorSkippedNames } from '../../../vendor/prompt-customizer/sectionOps.mjs'\nimport { acceptsDrop, beginDrag, dropOnPhase, finishDrag, payloadOf, setPhaseDropHandler, type DragPayload } from './dnd.ts'\nimport { useDragAutoScroll } from './drag-scroll.ts'\nimport { s } from './styles.ts'\n\n/** Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\u3002 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** \u5C4F\u5E55\u4E0A\u4E00\u6761\u53EF\u4EA4\u4E92\u7684\u6BB5\u884C\u3002 */\ninterface PartRow {\n name: string\n text: string\n replaced: boolean\n custom: boolean\n /** \u672C\u9636\u6BB5\u7684\u7528\u6237\u66FF\u6362\u6587\u672C\uFF08\u7A7A\u4E32 = \u672C\u9636\u6BB5\u6CA1\u6539\u8FC7\u6587\u672C\uFF09\u2014\u2014 \u4E09\u4E2A\u9636\u6BB5\u5404\u4E00\u4EFD\uFF0C\u4E92\u4E0D\u5F71\u54CD\u3002 */\n override: string\n /** \u8BE5\u9636\u6BB5\u81EA\u5DF1\u7684\u5C4F\u853D\u540D\u5355\u662F\u5426\u5C4F\u853D\u4E86\u6B64\u6BB5\uFF1A\u52FE\u9009\u6846 = \u672A\u5C4F\u853D\uFF08\u6CE8\u5165\u6A21\u578B\uFF09\u3002 */\n blocked: boolean\n}\n\n/** \u4E09\u6001\u8FC7\u6EE4\uFF1A\u5168\u90E8 / \u5DF2\u542F\u7528\uFF08\u672A\u5C4F\u853D\uFF09/ \u5DF2\u505C\u7528\uFF08\u88AB\u5C4F\u853D\uFF09\u3002 */\nexport type TriState = 'all' | 'on' | 'off'\n\n/** \u7F16\u8F91\u6001\u7684\u952E\uFF1A\u6BB5\u540D\u4E4B\u5916\u8FD8\u8981\u5E26\u9636\u6BB5\uFF0C\u5426\u5219\u4E09\u4E2A\u90E8\u5206\u91CC\u540C\u540D\u7684\u884C\u4F1A\u540C\u65F6\u5C55\u5F00\u7F16\u8F91\u5668\u3002 */\nconst editKey = (key: PhaseViewKey, name: string): string => `${key}:${name}`\n\nexport function SectionsPane({ cfg, inv, phases, phase, syncAll, t, poolText, write }: {\n cfg: Config\n inv: Inventory | null\n phases: PhaseViews | null\n /** \u5F53\u524D\u9636\u6BB5\uFF08\u72B6\u6001\u5728 Panel \u6301\u6709\uFF0C\u5934\u90E8\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u5207\u6362\uFF09\u3002 */\n phase: PhaseViewKey\n /** \u4E09\u6001\u540C\u6B65\uFF08\u9ED8\u8BA4\u5173\uFF09\uFF1A\u4E09\u4E2A\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u5E76\u96C6\u884C\u96C6\uFF0C\u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u4E00\u6B21\u5199\u5168\u4E09\u6001\u3002 */\n syncAll?: boolean\n t: Translate\n /** \u4ECE\u6C60\u52A0\u5165\u65F6\u7684\u6587\u672C\u53D6\u503C\uFF08\u7F3A\u7701\u7528\u6C60\u539F\u6587\uFF1BPanel \u5728\u300C\u4E2D\u6587\u63D0\u793A\u8BCD\u300D\u5F00\u542F\u65F6\u6362\u6210\u8BD1\u672C\uFF09\u3002 */\n poolText?: (name: string, fallback: string) => string\n write: (field: 'sections' | 'sectionsBootstrap' | 'sectionsCompaction' | 'replace' | 'inject' | 'tools', value: unknown) => void\n}): ReactElement {\n const [filter, setFilter] = useState<TriState>('all')\n const [editing, setEditing] = useState<string | null>(null)\n const [draft, setDraft] = useState('')\n // \u300C\u6CE8\u5165\u65B0\u6BB5\u300D\u8868\u5355\u5C55\u5F00\u6001\uFF08\u5F53\u524D\u9636\u6BB5\u5206\u7EC4\u5185\uFF09\u3002\n const [addOpen, setAddOpen] = useState(false)\n // \u9762\u677F\u5185\u77ED\u63D0\u793A\uFF08\u4F8B\u5982\uFF1A\u52A8\u6001\u6BB5\u52A0\u4E0D\u8FDB\u67D0\u4E2A\u9636\u6BB5\u65F6\u8BF4\u660E\u539F\u56E0\uFF09\u3002\n const [notice, setNotice] = useState<string | null>(null)\n // \u62D6\u62FD\uFF1A\u6B63\u5728\u62D6\u7684\u884C\u540D\uFF0C\u6295\u653E\u4F4D\u7F6E\u6807\u8BB0\uFF08`<\u884C\u540D>:above|below` / `list` / `pool`\uFF09\u3002\n const [dragName, setDragName] = useState<string | null>(null)\n const [dropMark, setDropMark] = useState<string | null>(null)\n // \u5217\u8868\u6EDA\u52A8\u5BB9\u5668\uFF1A\u62D6\u5230\u4E0A\u4E0B\u8FB9\u7F18\u65F6\u81EA\u52A8\u6EDA\uFF08\u957F\u5217\u8868\u91CC\u624B\u62D6\u591F\u4E0D\u5230\u89C6\u53E3\u5916\u7684\u4F4D\u7F6E\uFF09\u3002\n const scrollRef = useRef<HTMLDivElement | null>(null)\n useDragAutoScroll(scrollRef)\n\n // \u2500\u2500 \u4E09\u6001\u540C\u6B65\uFF08syncAll\uFF09\uFF1A\u4E09\u6001\u5171\u7528\u540C\u4E00\u4EFD\u5E76\u96C6\u884C\u96C6 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** \u8BE5\u6BB5\u662F\u5426\u5728\u76EE\u6807\u9636\u6BB5\u7684\u88C5\u914D\u8F93\u5165\uFF08base \u89C6\u56FE\uFF09\u91CC\uFF1A\u955C\u50CF\u65F6\u636E\u6B64\u51B3\u5B9A\u300C\u53EA\u5199 order\u300D\n * \u8FD8\u662F\u300C\u5FC5\u987B\u5E26\u6B63\u6587\u300D\u3002null = \u8BE5\u9636\u6BB5\u89C6\u56FE\u672A\u5C31\u7EEA\uFF08\u955C\u50CF\u6574\u6BB5\u8DF3\u8FC7\uFF0C\u7EDD\u4E0D\u628A\u7F3A\u5931\u7684\n * \u9636\u6BB5\u5F53\u7A7A\u96C6\u5199\u6389\uFF09\u3002 */\n const nativeIn = (key: PhaseViewKey, name: string): boolean | null => {\n const view = phases?.[key]\n if (view === undefined || view === null) return null\n return (view.baseSections ?? []).some((sec) => sec.name === name)\n }\n /** \u4E09\u9636\u6BB5\u88C5\u914D\u662F\u5426\u90FD\u5C31\u7EEA\uFF08\u7F3A\u4E00\u6001\u5C31\u4E0D\u505A\u955C\u50CF\uFF09\u3002 */\n const mirrorReady = (): boolean => PART_ORDER.every((key) => nativeIn(key, '') !== null)\n /** \u5E76\u96C6\u884C\u96C6\uFF1A\u5E38\u9A7B\u671F\u884C\u5E8F\u4E3A\u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8\uFF08\u540C\u540D\u6BB5\u4EE5\u539F\u751F\u90A3\u9636\u6BB5\u4E3A\u51C6\uFF09\u3002 */\n const mirrorRows = (): PartRow[] => mirroredRows(cfg, phases, nativeIn)\n const rowsOf = (key: PhaseViewKey): PartRow[] =>\n syncAll === true ? mirrorRows() : phaseRows(cfg, phases?.[key] ?? null, key)\n\n // \u5C4F\u853D / \u6062\u590D\u4E00\u4E2A\u6BB5\uFF08blockPatch \u53EA\u52A8\u672C\u9636\u6BB5\u81EA\u5DF1\u7684\u540D\u5355\uFF09\u3002\u5199\u5165\u4E25\u683C\u843D\u5728\u5F53\u524D\n // \u7F16\u8F91\u76EE\u6807\u7684\u8349\u7A3F\u91CC \u2014\u2014 \u9884\u8BBE\u4E4B\u95F4\u4E92\u76F8\u72EC\u7ACB\uFF1A\u5728 A \u9884\u8BBE\u91CC\u7684\u4EFB\u4F55\u6539\u52A8\u5BF9 B \u9884\u8BBE\u4E0E\n // \u5168\u5C40\u9ED8\u8BA4\u96F6\u5F71\u54CD\u3002\n const applyBlock = (key: PhaseViewKey, name: string, blocked: boolean): void => {\n const patch = blockPatch(cfg, key, name, blocked)\n for (const [field, value] of Object.entries(patch)) {\n write(field as 'sections' | 'sectionsBootstrap' | 'sectionsCompaction', value)\n }\n }\n\n /** \u4E09\u6001\u540C\u6B65\u843D\u76D8\uFF1A\u5E76\u96C6\u884C\u96C6\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08inject + \u4E09\u4EFD\u5C4F\u853D\u540D\u5355\uFF09\u2014\u2014 \u9010\u9636\u6BB5\n * \u5404\u5199\u4E00\u6B21\u4F1A\u4E92\u76F8\u8986\u76D6\uFF08edit \u5BF9 inject \u662F\u6574\u4F53\u66FF\u6362\uFF09\uFF0C\u5FC5\u987B\u4E00\u6B21\u5199\u5168\u3002 */\n const persistMirror = (rows: PartRow[]): void => {\n if (!mirrorReady()) {\n setNotice(t('syncNotReady'))\n return\n }\n write('inject', mirrorPhaseInjectEntries(cfg, rows, nativeIn))\n const denied = mirroredDeniedLists(rows)\n write('sections', denied.sections)\n write('sectionsBootstrap', denied.sectionsBootstrap)\n write('sectionsCompaction', denied.sectionsCompaction)\n }\n\n // \u8BE5\u9636\u6BB5\u4E2D\u67D0\u540D\u5B57\u662F\u5426\u5728\u8BE5\u9636\u6BB5\u7684\u88C5\u914D\u8F93\u5165\u91CC\uFF08\u5224\u65AD\u52A0\u5165\u662F\u300C\u89E3\u9664\u5C4F\u853D\u300D\u8FD8\u662F\u300C\u51ED\u7A7A\u6CE8\u5165\u300D\uFF09\u3002\n const inBaseOf = (key: PhaseViewKey, name: string): boolean => nativeIn(key, name) === true\n\n // \u6301\u4E45\u5316\u4E00\u4E2A\u9636\u6BB5\u7684\u6709\u5E8F\u5217\u8868\uFF08\u5199\u56DE inject\uFF09\uFF1A\u6BCF\u884C\u4E00\u6761\u6CE8\u5165\u9879\u3001order \u4E3A\u8FDE\u7EED\u6574\u6570\uFF1B\n // \u7CFB\u7EDF\u884C\u7A7A\u6587\u672C\uFF08\u4EC5 order \u8986\u76D6\uFF09\uFF0Ccustom \u884C\u4FDD\u7559\u6587\u672C\uFF1B\u5176\u5B83\u9636\u6BB5\u7684\u6CE8\u5165\u9879\u539F\u6837\u4FDD\u7559\u3002\n const persistPhase = (key: PhaseViewKey, rows: PartRow[]): void => {\n write('inject', phaseInjectEntries(cfg, key, rows))\n }\n\n /** \u6301\u4E45\u5316\u4E00\u4EFD\u6709\u5E8F\u884C\u96C6\uFF1A\u4E09\u6001\u540C\u6B65 = \u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF0C\u5426\u5219\u53EA\u5199\u5F53\u524D\u9636\u6BB5\u3002 */\n const persistRows = (key: PhaseViewKey, rows: PartRow[]): void => {\n if (syncAll === true) persistMirror(rows)\n else persistPhase(key, rows)\n }\n\n const toggleBlocked = (key: PhaseViewKey, name: string): void => {\n if (syncAll === true) {\n const rows = rowsOf(key)\n const row = rows.find((item) => item.name === name)\n if (row === undefined) return\n persistMirror(rows.map((item) => (item.name === name ? { ...item, blocked: !item.blocked } : item)))\n return\n }\n applyBlock(key, name, !deniedNames(cfg, key).includes(name))\n }\n\n // \u4E0A\u79FB/\u4E0B\u79FB\u4E00\u683C\uFF08\u6570\u7EC4\u4EA4\u6362\u540E\u91CD\u6392\u6574\u4E2A\u9636\u6BB5\uFF09\u3002\n const moveRow = (key: PhaseViewKey, index: number, dir: -1 | 1): void => {\n const rows = rowsOf(key)\n const target = index + dir\n if (target < 0 || target >= rows.length) return\n const next = rows.slice()\n const [item] = next.splice(index, 1)\n next.splice(target, 0, item)\n persistRows(key, next)\n }\n\n // \u4ECE\u8BE5\u9636\u6BB5\u79FB\u9664\u4E00\u4E2A\u6BB5\uFF1A\u5220\u6389\u5B83\u5728\u672C\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\uFF0C\u4EE5\u53CA\u8DE8\u9636\u6BB5\u751F\u6548\uFF08always\uFF09\u7684\n // \u6761\u76EE \u2014\u2014 \u9884\u8BBE\u5E94\u7528 / \u5BFC\u5165\u4EA7\u751F\u7684\u81EA\u5B9A\u4E49\u6BB5\u5C31\u662F always\u3002\u968F\u540E\u89E3\u9664\u8BE5\u9636\u6BB5\u5C4F\u853D\u3002\n const removeFromPart = (key: PhaseViewKey, name: string): void => {\n if (syncAll === true) {\n persistMirror(rowsOf(key).filter((row) => row.name !== name))\n return\n }\n const phaseOfItem = injectPhaseOf(key)\n const inject = (cfg.inject ?? []).filter((x) => {\n if (x.name !== name) return true\n const itemPhase = x.phase ?? 'always'\n return !(itemPhase === phaseOfItem || itemPhase === 'always')\n })\n write('inject', inject)\n applyBlock(key, name, false)\n }\n\n // \u6587\u672C\u7F16\u8F91\u6309\u9636\u6BB5\u751F\u6548\uFF1A\u7F16\u8F91\u6001\u7684\u952E\u662F\u300C\u9636\u6BB5 + \u6BB5\u540D\u300D\u3002\u5199\u5165\u8D70 persistPhase\n //\uFF08\u672C\u9636\u6BB5\u7684\u6CE8\u5165\u6761\u76EE\u5E26 text\uFF09\uFF0C\u7EDD\u4E0D\u78B0\u5168\u5C40 replace \u5B57\u5178\u3002\n const startReplace = (key: PhaseViewKey, row: PartRow): void => {\n setEditing(editKey(key, row.name))\n setDraft(row.override || row.text)\n }\n const commitReplace = (key: PhaseViewKey, row: PartRow): void => {\n const patchRow = (r: PartRow): PartRow => (r.name !== row.name ? r : { ...r, override: draft, text: draft })\n // \u4E09\u6001\u540C\u6B65\uFF1A\u66FF\u6362\u6587\u672C\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF08\u540C\u540D\u884C = \u540C\u4E00\u4EFD\u6587\u672C\uFF09\u3002\n persistRows(key, rowsOf(key).map(patchRow))\n setEditing(null)\n }\n const restoreReplace = (key: PhaseViewKey, row: PartRow): void => {\n const next = rowsOf(key).map((r) =>\n r.name !== row.name ? r : { ...r, override: '', text: r.custom ? r.text : '' },\n )\n persistRows(key, next)\n // \u9057\u7559\u7684\u5168\u5C40\u66FF\u6362\u6761\u76EE\uFF08\u65E7\u7248 UI \u7684\u4EA7\u7269\uFF09\uFF1A\u53EA\u5728\u672C\u90E8\u5206\u8FD8\u539F\u65F6\u4E00\u5E76\u6E05\u9664\u3002\n if (!row.custom && Object.hasOwn(cfg.replace ?? {}, row.name)) {\n const rest = { ...(cfg.replace ?? {}) }\n delete rest[row.name]\n write('replace', rest)\n }\n }\n\n const addSection = (name: string, text: string, phase: PhaseViewKey): void => {\n if (syncAll === true) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u65B0\u6BB5\u4E00\u6B21\u5EFA\u8FDB\u4E09\u4E2A\u9636\u6BB5\uFF08\u5E76\u96C6\u884C\u96C6\u5C3E\u90E8\uFF0C\u5E26\u81EA\u64B0\u6B63\u6587\uFF09\u3002\n persistMirror([...rowsOf(phase), { name, text, replaced: false, custom: true, override: text, blocked: false }])\n return\n }\n const inject = (cfg.inject ?? []).slice()\n inject.push({ name, order: 120 + inject.length, text, phase, custom: true })\n write('inject', inject)\n }\n\n // \u4ECE\u300C\u5168\u90E8\u300D\u6C60\u628A\u4E00\u4E2A\u6BB5\u52A0\u5165\u67D0\u9636\u6BB5\uFF08\u62D6\u52A8\u6216\u70B9\u6309\u6C60\u91CC\u7684\u5C0F\u6309\u94AE\uFF09\u3002\u8BE5\u9636\u6BB5\u5DF2\u6709\u7684\n // \u6BB5\u53EA\u662F\u79FB\u5230\u672B\u5C3E\uFF1B\u65B0\u6BB5\u5E26\u4E0A\u6C60\u91CC\u7684\u539F\u6587\uFF08\u6CE8\u5165\u6761\u76EE\u5E26\u6587\u672C\uFF0C\u670D\u52A1\u7AEF\u624D\u4F1A\u628A\u5B83\u771F\u6B63\n // \u5EFA\u51FA\u6765\uFF09\u3002\u52A8\u6001\u6BB5\u6CA1\u6709\u53EF\u5E26\u7684\u539F\u6587\uFF0C\u7ED9\u51FA\u8BF4\u660E\u3002`copiedFrom` \u975E\u7A7A = \u4ECE\u522B\u7684\u9636\u6BB5\n // \u590D\u5236\u8FC7\u6765\u7684\uFF0C\u7ED9\u4E00\u6761\u300C\u5DF2\u590D\u5236\u300D\u53CD\u9988\u3002\n const addFromPool = (key: PhaseViewKey, name: string, text: string, copiedFrom?: string): void => {\n if (text === '' || text.startsWith('<')) {\n setNotice(t('sectionDynamicNoAdd', { name }))\n return\n }\n // \u300C\u4E2D\u6587\u63D0\u793A\u8BCD\u300D\u5F00\u542F\u65F6\uFF0C\u6C60\u91CC\u7684\u6BB5\u4F18\u5148\u7528\u8BD1\u672C\u6587\u672C \u2014\u2014 \u4E00\u952E\u628A\u6CA1\u8FDB\u8FC7\u5B9A\u5236\u9762\u677F\u7684\n // \u6BB5\uFF08\u5982 agent \u4F5C\u7528\u57DF\u6CE8\u518C\u7684 tool:subagent\uFF09\u63A5\u7BA1\u6210\u4E2D\u6587\u3002\n const body = poolText === undefined ? text : poolText(name, text)\n setNotice(null)\n const rows = rowsOf(key)\n const existing = rows.find((row) => row.name === name)\n // \u4E09\u6001\u540C\u6B65\u4E0B\u300C\u52A0\u5165\u300D= \u4E09\u6001\u90FD\u51FA\u73B0\u4E14\u90FD\u5F00\u542F\uFF08\u5E76\u96C6\u884C\u96C6\u91CC\u91CD\u6392\u5230\u5C3E\u90E8 / \u8FFD\u52A0\u65B0\u884C\uFF09\u3002\n const next = existing !== undefined\n ? [...rows.filter((row) => row.name !== name), syncAll === true ? { ...existing, blocked: false } : existing]\n : [...rows, {\n name,\n text: '',\n replaced: Object.hasOwn(cfg.replace ?? {}, name),\n custom: false,\n override: body,\n blocked: false,\n }]\n if (syncAll !== true && existing === undefined && inBaseOf(key, name) && deniedNames(cfg, key).includes(name)) {\n applyBlock(key, name, false)\n }\n persistRows(key, next)\n if (copiedFrom !== undefined) setNotice(t('sectionCopied', { name, to: stageLabel(key), from: copiedFrom }))\n }\n\n // \u2500\u2500 \u62D6\u62FD\u843D\u5730\uFF08\u624B\u52BF\u5B9A\u4E49\u89C1 dnd.ts\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** \u4ECE\u672C\u9636\u6BB5\u62FF\u6389\u4E00\u6BB5\uFF1A\u6CE8\u5165\u8FDB\u6765\u7684\u64A4\u9500\u6CE8\u5165\uFF0C\u539F\u751F\u6BB5\u5219\u5C4F\u853D\u6389\uFF08\u7B49\u4EF7\u4E8E\u53D6\u6D88\u52FE\u9009\uFF09\u3002 */\n const removeFromPhase = (name: string): void => {\n const rows = rowsOf(phase)\n const row = rows.find((item) => item.name === name)\n if (row === undefined) return\n if (syncAll === true) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u539F\u751F\u6BB5\u4E09\u6001\u4E00\u8D77\u5C4F\u853D\uFF1B\u53EA\u9760\u6CE8\u5165\u5B58\u5728\u7684\u6BB5\u4E09\u6001\u4E00\u8D77\u64A4\u9500\u6CE8\u5165\u3002\n const native = PART_ORDER.some((key) => nativeIn(key, name) === true)\n persistMirror(row.custom || !native\n ? rows.filter((item) => item.name !== name)\n : rows.map((item) => (item.name === name ? { ...item, blocked: true } : item)))\n } else if (row.custom || row.override !== '' || injectedNames.has(name)) {\n removeFromPart(phase, name)\n } else {\n applyBlock(phase, name, true)\n }\n setNotice(t('sectionRemoved', { name, from: stageLabel(phase) }))\n }\n\n /** \u884C\u4E0A\u6295\u653E\uFF1A\u540C\u9636\u6BB5 = \u6392\u5E8F\uFF1B\u522B\u7684\u9636\u6BB5 / \u6C60\u91CC\u6765\u7684 = \u590D\u5236\u8FDB\u672C\u9636\u6BB5\uFF08\u6E90\u4E0D\u52A8\uFF09\u3002 */\n const dropOnRow = (event: ReactDragEvent, target: PartRow): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n if (payload.name === target.name) return\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\n const pos = event.clientY < rect.top + rect.height / 2 ? 'above' : 'below'\n if (payload.from === phase) {\n const next = reorderInsert(rowsOf(phase), payload.name, target.name, pos)\n if (next !== null) { persistRows(phase, next); setNotice(null) }\n return\n }\n addFromPool(phase, payload.name, payload.text ?? '', payload.from === 'pool' ? undefined : stageLabel(payload.from))\n }\n\n /** \u5217\u8868\u7A7A\u767D\u5904\u6295\u653E\uFF1A\u8FFD\u52A0\u5230\u672C\u9636\u6BB5\u672B\u5C3E\uFF1B\u6C60\u91CC\u62D6\u6765\u7684 = \u52A0\u5165\u672C\u9636\u6BB5\u3002 */\n const dropOnList = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section') return\n event.preventDefault()\n setDropMark(null)\n if (payload.from !== phase) {\n addFromPool(phase, payload.name, payload.text ?? '', payload.from === 'pool' ? undefined : stageLabel(payload.from))\n return\n }\n const list = rowsOf(phase)\n const last = list[list.length - 1]\n if (last === undefined || last.name === payload.name) return\n const next = reorderInsert(list, payload.name, last.name, 'below')\n if (next !== null) persistRows(phase, next)\n }\n\n /** \u6C60\u4E0A\u6295\u653E\uFF1A\u628A\u884C\u4ECE\u672C\u9636\u6BB5\u62FF\u6389\uFF08\u62D6\u56DE\u300C\u5168\u90E8\u300D\u7684\u624B\u52BF\uFF09\u3002 */\n const dropOnPool = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n if (payload.from !== phase) return\n removeFromPhase(payload.name)\n }\n\n // \u5934\u90E8\u9636\u6BB5 Tab \u4E0A\u7684\u6295\u653E\uFF1A\u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u6362 Tab / \u6362\u6A21\u5F0F\u65F6\u65E7\u5217\u8868\u5378\u8F7D\u3001\n // \u65B0\u5217\u8868\u6CE8\u518C \u2014\u2014 \u4EFB\u4F55\u65F6\u523B\u53EA\u6709\u4E00\u4E2A\u5904\u7406\u8005\uFF09\u3002\n useEffect(() => {\n setPhaseDropHandler((key, payload) => {\n if (payload.kind !== 'section' || key === phase) return\n // \u4E09\u6001\u540C\u6B65\uFF1A\u6BB5\u5DF2\u7ECF\u5728\u4E09\u4E2A\u9636\u6BB5\u91CC\u4E86\uFF0C\u62D6\u5230\u522B\u7684\u9636\u6BB5 Tab \u4E0D\u518D\u590D\u5236\uFF08\u53EA\u6709\u6C60\u91CC\u6765\u7684\u8981\u52A0\u5165\uFF09\u3002\n if (syncAll === true && payload.from !== 'pool') return\n addFromPool(key, payload.name, payload.text ?? '', stageLabel(phase))\n })\n return () => setPhaseDropHandler(null)\n })\n\n const stageLabel = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('phaseStageGuide') : key === 'compaction' ? t('phaseStageControlled') : t('phaseStageResident')\n\n // \u8BE5\u9636\u6BB5\u7684\u300C\u6BB5\u7EA7\u5B9A\u5236\u6CA1\u8FDB\u6700\u7EC8\u63D0\u793A\u8BCD\u300D\u8B66\u793A\uFF08forceSections \u5173\u95ED\u6216\u5931\u6548\u65F6\uFF09\u3002\n const partNote = (key: PhaseViewKey): ReactElement | null => {\n const view = phases?.[key]\n if (view === undefined || view === null) return null\n if (cfg.forceSections !== false) return null\n if (view.takenOverBy !== undefined) {\n return h('div', { style: s.noticeWarn }, t('sectionsTakenOver', { name: view.takenOverBy }))\n }\n const lost = view.lostSections\n if (lost !== undefined) {\n return h('div', { style: s.noticeWarn }, t('sectionsLost', { emitted: lost.emitted, survived: lost.survived }))\n }\n return null\n }\n\n const isEditing = (key: PhaseViewKey, row: PartRow): boolean => editing === editKey(key, row.name)\n\n const renderRow = (key: PhaseViewKey, row: PartRow, index: number, total: number): ReactElement | null => {\n if (!rowVisible(row)) return null\n const mark = dropMark !== null && dropMark.startsWith(`${row.name}:`) ? dropMark.slice(row.name.length + 1) : null\n return h('div', {\n key: row.name,\n style: {\n ...s.row,\n ...(row.blocked ? s.rowBlocked : {}),\n ...(mark === 'above' ? s.dropAbove : {}),\n ...(mark === 'below' ? s.dropBelow : {}),\n ...(dragName === row.name ? s.dragging : {}),\n },\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'section')) return\n event.preventDefault()\n event.stopPropagation()\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect()\n setDropMark(`${row.name}:${event.clientY < rect.top + rect.height / 2 ? 'above' : 'below'}`)\n },\n onDrop: (event: ReactDragEvent) => dropOnRow(event, row),\n }, [\n // \u62D6\u62FD\u6293\u624B\uFF1A\u6574\u884C draggable \u4F1A\u628A\u52FE\u9009\u6846 / \u6587\u672C\u57DF\u7684\u9009\u62E9\u624B\u52BF\u4E00\u8D77\u5403\u6389\u3002\n h('span', {\n draggable: true,\n title: t('drag'),\n style: s.dragHandle,\n onDragStart: (event: ReactDragEvent) => {\n setDragName(row.name)\n beginDrag(event, { kind: 'section', name: row.name, from: key, text: row.override || row.text })\n },\n onDragEnd: () => { setDragName(null); setDropMark(null); finishDrag() },\n }, '\u283F'),\n h('input', {\n type: 'checkbox',\n checked: !row.blocked,\n onChange: () => toggleBlocked(key, row.name),\n title: row.blocked ? t('blockedOn') : t('blockedOff'),\n style: { margin: 0, cursor: 'pointer', flex: 'none' },\n }),\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, row.name),\n h('span', { style: s.orderTag }, '#' + index),\n h('span', { style: row.custom ? s.badgeCustom : s.badgeSystem }, row.custom ? t('manual') : t('system')),\n // \u4F1A\u8BDD\u7EA7\uFF1A\u53EA\u5728 agent \u81EA\u5DF1\u7684\u4F5C\u7528\u57DF\u91CC\u6CE8\u518C\uFF08\u9884\u8BBE scope \u7684\u6CE8\u518C\u8868\u6CA1\u6709\u5B83\uFF0C\n // \u4F46\u771F\u5B9E\u4F1A\u8BDD\u88C5\u914D\u4E00\u5B9A\u6709\uFF09\u2014\u2014 \u9884\u89C8\u5DF2\u628A\u5B83\u5E76\u8FDB\u5217\u8868\uFF0C\u8FD9\u91CC\u6807\u51FA\u6765\u514D\u5F97\u8BEF\u4F1A\u3002\n agentScoped.has(row.name) ? h('span', { style: s.badgeSystem, title: t('agentScopedHint') }, t('agentScoped')) : null,\n row.replaced ? h('span', { style: s.badgeReplaced }, t('replaced')) : null,\n row.blocked ? h('span', { style: s.badgeBlocked }, t('blockedOn')) : null,\n ]),\n isEditing(key, row)\n ? h('div', { style: s.editBox }, [\n h('textarea', { style: s.editInput, value: draft, onChange: (e: ChangeEvent<HTMLTextAreaElement>) => setDraft(e.target.value), rows: 3 }),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => commitReplace(key, row) }, t('save')),\n h('button', { style: s.mini, onClick: () => setDraft('') }, t('clearInput')),\n !row.custom && (row.override || Object.hasOwn(cfg.replace ?? {}, row.name))\n ? h('button', { style: s.mini, onClick: () => restoreReplace(key, row) }, t('restore'))\n : null,\n ]),\n ])\n : h('div', { style: s.preview }, String(row.override || row.text || '').slice(0, 140) || (row.custom ? t('empty') : t('dynamic'))),\n ]),\n h('div', { style: s.arrowCol }, [\n h('button', { style: s.arrow, disabled: index === 0, onClick: () => moveRow(key, index, -1), title: t('moveUp') }, '\u2191'),\n h('button', { style: s.arrow, disabled: index === total - 1, onClick: () => moveRow(key, index, 1), title: t('moveDown') }, '\u2193'),\n ]),\n isEditing(key, row) ? null : h('button', { style: s.mini, onClick: () => startReplace(key, row) }, t('replace')),\n !isEditing(key, row) && !row.custom && (row.override || Object.hasOwn(cfg.replace ?? {}, row.name))\n ? h('button', { style: s.mini, onClick: () => restoreReplace(key, row) }, t('restore'))\n : null,\n row.custom ? h('button', { style: s.mini, onClick: () => removeFromPart(key, row.name), title: t('delete') }, t('delete')) : null,\n ])\n }\n\n // \u5F53\u524D\u9636\u6BB5\u7684\u884C + \u4E09\u6001\u8FC7\u6EE4\u3002\n const rows = rowsOf(phase)\n /** \u4E09\u6001\u540C\u6B65\u4E0B\u5EFA\u4E0D\u5230\u5176\u5B83\u9636\u6BB5\u7684\u52A8\u6001\u6BB5\uFF08\u884C\u96C6\u91CC\u663E\u793A\u3001\u88C5\u914D\u91CC\u6CA1\u6709\uFF09\uFF1A\u7ED9\u51FA\u8BF4\u660E\u3002 */\n const mirrorSkipped = syncAll === true && mirrorReady() ? mirrorSkippedNames(rows, nativeIn) : []\n /** \u672C\u9636\u6BB5\u6709\u6CE8\u5165\u6761\u76EE\uFF08= \u88AB\u663E\u5F0F\u52A0\u8FDB\u6765\u8FC7\uFF09\u7684\u6BB5\u540D\uFF1A\u62D6\u56DE\u6C60\u65F6\u7528\u6765\u81EA\u52A8\u9009\u300C\u64A4\u9500\u6CE8\u5165\u300D\u8FD8\u662F\u300C\u5C4F\u853D\u300D\u3002 */\n const injectedNames = injectedAt(cfg, phase).names\n /** \u53EA\u5728 agent \u4F5C\u7528\u57DF\u6CE8\u518C\u7684\u6BB5\u540D\uFF08\u9884\u89C8\u628A\u5B83\u4EEC\u5E76\u8FDB\u6765\u4E86\uFF0C\u5E26 scope \u6807\u8BB0\uFF09\uFF1A\u884C\u4E0A\u6807\u300C\u4F1A\u8BDD\u7EA7\u300D\u3002 */\n const agentScoped = new Set<string>()\n for (const view of Object.values(phases ?? {})) {\n for (const section of view?.baseSections ?? []) {\n if (section.scope === 'agent') agentScoped.add(section.name)\n }\n }\n const onCount = rows.filter((row) => !row.blocked).length\n const offCount = rows.length - onCount\n const rowVisible = (row: PartRow): boolean =>\n filter === 'all' || (filter === 'on' ? !row.blocked : row.blocked)\n\n const poolSections = inv?.sections ?? []\n\n return h('div', { style: s.colLeft }, [\n h('div', {\n ref: scrollRef,\n style: { ...s.colScroll, ...(dropMark === 'list' ? s.dropZone : {}) },\n // \u5217\u8868\u7A7A\u767D\u5904 = \u300C\u672C\u9636\u6BB5\u672B\u5C3E\u300D\u7684\u6295\u653E\u70B9\uFF08\u6C60\u91CC\u62D6\u8FDB\u6765\u7684\u6BB5\u4E5F\u4ECE\u8FD9\u91CC\u8FDB\uFF09\u3002\n onDragOver: (event: ReactDragEvent) => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'section' || payload.from === phase) return\n event.preventDefault()\n setDropMark('list')\n },\n onDrop: dropOnList,\n }, [\n notice ? h('div', { style: s.noticeWarn }, notice) : null,\n mirrorSkipped.length > 0\n ? h('div', { style: s.noticeWarn }, t('syncSkippedDynamic', { names: mirrorSkipped.join('\u3001') }))\n : null,\n partNote(phase),\n rows.map((row, i) => renderRow(phase, row, i, rows.length)),\n rows.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n addOpen\n ? h(InjectForm, {\n onAdd: (name, text) => { addSection(name, text, injectPhaseOf(phase)); setAddOpen(false) },\n phaseLabel: stageLabel(phase),\n t,\n })\n : null,\n // \u672C\u7CFB\u7EDF\u5168\u90E8\u63D0\u793A\u8BCD\uFF1A\u8DE8\u9884\u8BBE\u7D2F\u79EF\u7684\u53EA\u8BFB\u6C60\uFF08\u6298\u53E0\u533A\uFF09\u3002\u52A0\u5165\u67D0\u4E2A\u9636\u6BB5\u9760\u62D6\u62FD\uFF1A\n // \u628A\u884C\u62D6\u8FDB\u4E0A\u9762\u7684\u9636\u6BB5\u5217\u8868 = \u52A0\u5165\u672C\u9636\u6BB5\uFF0C\u62D6\u5230\u5934\u90E8\u9636\u6BB5 Tab = \u52A0\u5165\u90A3\u4E2A\u9636\u6BB5\n // \uFF08\u884C\u4E0A\u4E0D\u518D\u653E\u4E09\u4E2A\u6309\u94AE \u2014\u2014 \u62D6\u62FD\u662F\u552F\u4E00\u8DEF\u5F84\uFF0C\u6C60\u540C\u65F6\u662F\u300C\u4ECE\u9636\u6BB5\u62FF\u6389\u300D\u7684\u6295\u653E\u70B9\uFF09\u3002\n h('details', {\n style: { ...s.injectBox, ...(dropMark === 'pool' ? s.dropZoneActive : {}) },\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'section')) return\n event.preventDefault()\n event.stopPropagation()\n setDropMark('pool')\n },\n onDrop: dropOnPool,\n }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } },\n `${t('allSectionsTitle')} (${poolSections.length})`),\n h('div', { style: { ...s.muted, marginBottom: 4 } }, t('sectionsFourHint')),\n poolSections.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n poolSections.map((sec) => h('div', {\n key: sec.name,\n style: { ...s.row, opacity: 0.92 },\n draggable: true,\n title: t('drag'),\n onDragStart: (event: ReactDragEvent) => beginDrag(event, { kind: 'section', name: sec.name, from: 'pool', text: sec.text ?? '' }),\n onDragEnd: finishDrag,\n }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, sec.name)),\n h('div', { style: s.preview }, String(sec.text ?? '').slice(0, 140) || t('dynamic')),\n ]),\n ])),\n ]),\n // \u300C+ \u6CE8\u5165\u300D\u5165\u53E3\u653E\u5728\u6EDA\u52A8\u533A\u672B\u5C3E\uFF1A\u65B0\u6BB5\u901A\u5E38\u8FFD\u52A0\u5728\u5F53\u524D\u9636\u6BB5\u5217\u8868\u5C3E\u90E8\u3002\n h('div', { style: { ...s.injectRow, marginTop: 8 } }, [\n h('button', { style: s.mini, onClick: () => setAddOpen(!addOpen), title: t('injectNew') },\n addOpen ? `\u00D7 ${t('clearInput')}` : `+ ${t('injectNew')}`),\n ]),\n ]),\n // \u5DE6\u680F\u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 / \u5DF2\u505C\u7528\uFF09\uFF0C\u53EA\u7EDF\u8BA1\u5F53\u524D\u9636\u6BB5\u3002\n h('div', { style: s.colFoot }, [\n h('div', { style: s.seg }, [\n h('button', { style: filter === 'all' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('all') },\n `${t('filterAll')} ${rows.length}`),\n h('button', { style: filter === 'on' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('on') },\n `${t('filterOn')} ${onCount}`),\n h('button', { style: filter === 'off' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('off') },\n `${t('filterOff')} ${offCount}`),\n ]),\n ]),\n ])\n}\n\n/** \u6CE8\u5165\u65B0\u6BB5\u8868\u5355\uFF1A\u300C+ \u6CE8\u5165\u300D\u5C55\u5F00\uFF0C\u9636\u6BB5\u9501\u5B9A\u4E3A\u5F53\u524D Tab \u7684\u9636\u6BB5\u3002 */\nfunction InjectForm({ onAdd, phaseLabel, t }: {\n onAdd: (name: string, text: string) => void\n phaseLabel: string\n t: Translate\n}): ReactElement {\n const [name, setName] = useState('')\n const [text, setText] = useState('')\n const submit = (): void => {\n if (!name.trim()) return\n onAdd(name.trim(), text)\n setName(''); setText('')\n }\n return h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, width: '30%' }, placeholder: t('name'), value: name, onChange: (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value) }),\n h('input', { style: { ...s.input, flex: 1 }, placeholder: `${t('text')}\uFF08${phaseLabel}\uFF09`, value: text, onChange: (e: ChangeEvent<HTMLInputElement>) => setText(e.target.value) }),\n h('button', { style: s.mini, onClick: submit }, t('add')),\n ])\n}\n", "/**\r\n * drag-scroll \u2014\u2014 \u62D6\u62FD\u65F6\u8D34\u8FB9\u81EA\u52A8\u6EDA\u52A8\u3002\r\n *\r\n * \u5217\u8868\u6BD4\u89C6\u53E3\u957F\u7684\u65F6\u5019\uFF0C\u9760\u624B\u62D6\u6839\u672C\u5230\u4E0D\u4E86\u89C6\u53E3\u5916\u7684\u6295\u653E\u4F4D\u7F6E\uFF08\u628A\u884C\u62D6\u5230\u4E0A\u9762\u7684\u7B2C\r\n * 3 \u4E2A\u4F4D\u7F6E\u3001\u6216\u4ECE\u5E95\u90E8\u300C\u5168\u90E8\u300D\u6C60\u62D6\u5230\u9876\u90E8\uFF0C\u90FD\u8981\u5148\u505C\u4E0B\u6765\u6EDA\u4E00\u6EDA \u2014\u2014 \u800C\u62D6\u62FD\u4E2D\r\n * \u662F\u6EDA\u4E0D\u4E86\u7684\uFF09\u3002\u8FD9\u91CC\u5728\u6307\u9488\u8FDB\u5165\u5BB9\u5668\u4E0A/\u4E0B\u8FB9\u7F18\u5E26\u65F6\u6301\u7EED\u6EDA\u52A8\uFF1A\u8D8A\u9760\u8FB9\u8D8A\u5FEB\uFF0C\u6307\u9488\r\n * \u56DE\u5230\u4E2D\u95F4\u5C31\u505C\u3002\r\n *\r\n * \u4E24\u4E2A\u5B9E\u73B0\u8981\u70B9\uFF1A\r\n * - HTML5 \u62D6\u62FD\u53EA\u5728\u6307\u9488\u79FB\u52A8\u65F6\u7ED9 `dragover`\uFF0C\u9760\u5B83\u4E00\u6B21\u6EDA\u4E00\u5C4F\u4F1A\u4E00\u987F\u4E00\u987F\uFF0C\u6240\u4EE5\r\n * \u8FB9\u7F18\u5185\u6539\u7528 requestAnimationFrame \u9010\u5E27\u6EDA\uFF08\u6BCF\u5E27\u6700\u591A MAX_STEP \u50CF\u7D20\uFF09\uFF1B\r\n * - \u884C\u4E0A\u7684\u6295\u653E\u5904\u7406\u4F1A\u5728\u5192\u6CE1\u9636\u6BB5 `stopPropagation`\uFF0C\u6240\u4EE5\u8FD9\u91CC\u7528**\u6355\u83B7**\u9636\u6BB5\r\n * \u7684\u539F\u751F\u76D1\u542C\u6302\u5728\u6EDA\u52A8\u5BB9\u5668\u4E0A \u2014\u2014 \u6355\u83B7\u5148\u4E8E\u5192\u6CE1\u6267\u884C\uFF0C\u4E0D\u53D7\u884C\u5904\u7406\u5F71\u54CD\u3002\r\n */\r\nimport { useEffect, type RefObject } from 'react'\r\nimport { isPanelDrag } from './dnd.ts'\r\n\r\n/** \u8FDB\u5165\u8FD9\u4E2A\u50CF\u7D20\u5E26\u5F00\u59CB\u6EDA\u3002 */\r\nconst EDGE = 56\r\n/** \u6BCF\u5E27\u6700\u5927\u6EDA\u52A8\u50CF\u7D20\uFF08\u8D8A\u9760\u8FB9\u8D8A\u63A5\u8FD1\u5B83\uFF09\u3002 */\r\nconst MAX_STEP = 18\r\n\r\n/**\r\n * \u7ED9\u6EDA\u52A8\u5BB9\u5668\u6302\u4E0A\u300C\u62D6\u62FD\u8D34\u8FB9\u81EA\u52A8\u6EDA\u300D\u3002\r\n *\r\n * \u4F20\u5165\u7684 ref \u6307\u5411\u771F\u6B63 overflow-y:auto \u7684\u90A3\u4E00\u5C42\uFF08\u5217\u8868 + \u6C60\u90FD\u5728\u91CC\u9762\uFF0C\u6240\u4EE5\u6EDA\u52A8\r\n * \u5B83\u5C31\u80FD\u628A\u4EFB\u4E00\u6295\u653E\u4F4D\u7F6E\u5E26\u8FDB\u89C6\u53E3\uFF09\u3002\u53EA\u5728\u6307\u9488\u5904\u4E8E\u5BB9\u5668\u5782\u76F4\u8303\u56F4\u5185\u4E14\u8D34\u7740\u4E0A/\u4E0B\u8FB9\r\n * \u7F18\u65F6\u6EDA\uFF0C\u6A2A\u5411\u4E0D\u53C2\u4E0E\u3002\r\n */\r\nexport function useDragAutoScroll(ref: RefObject<HTMLElement | null>): void {\r\n useEffect(() => {\r\n const el = ref.current\r\n if (el === null) return undefined\r\n\r\n let frame = 0\r\n let step = 0\r\n let pendingY: number | null = null\r\n\r\n const stopScroll = (): void => {\r\n step = 0\r\n pendingY = null\r\n if (frame !== 0) {\r\n cancelAnimationFrame(frame)\r\n frame = 0\r\n }\r\n }\r\n\r\n const stepFrame = (): void => {\r\n frame = 0\r\n if (step === 0) return\r\n const before = el.scrollTop\r\n el.scrollTop += step\r\n // \u6EDA\u5230\u5934\uFF08\u6D4F\u89C8\u5668\u628A scrollTop \u5939\u4F4F\uFF09\u5C31\u505C\uFF0C\u522B\u7A7A\u8F6C rAF\u3002\r\n if (el.scrollTop === before) {\r\n step = 0\r\n return\r\n }\r\n frame = requestAnimationFrame(stepFrame)\r\n }\r\n\r\n const measure = (clientY: number): void => {\r\n const rect = el.getBoundingClientRect()\r\n const fromTop = clientY - rect.top\r\n const fromBottom = rect.bottom - clientY\r\n step = fromTop < EDGE\r\n ? -Math.ceil(((EDGE - fromTop) / EDGE) * MAX_STEP)\r\n : fromBottom < EDGE\r\n ? Math.ceil(((EDGE - fromBottom) / EDGE) * MAX_STEP)\r\n : 0\r\n if (step === 0) {\r\n stopScroll()\r\n return\r\n }\r\n if (frame === 0) frame = requestAnimationFrame(stepFrame)\r\n }\r\n\r\n const onDragOver = (event: DragEvent): void => {\r\n // \u53EA\u8BA4\u672C\u9762\u677F\u81EA\u5DF1\u7684\u62D6\u62FD\uFF1A\u5916\u90E8\u62D6\u5165\uFF08\u6BD4\u5982\u5F80\u6280\u80FD\u9762\u677F\u4E22\u6587\u4EF6\uFF09\u4E0D\u6EDA\u3002\r\n if (!isPanelDrag(event)) {\r\n stopScroll()\r\n return\r\n }\r\n pendingY = event.clientY\r\n measure(event.clientY)\r\n }\r\n\r\n // \u6307\u9488\u53EA\u662F\u4ECE\u5BB9\u5668\u632A\u8FDB\u5B50\u5143\u7D20\u65F6\u4E5F\u4F1A\u6765\u4E00\u6761 dragleave\uFF0C\u522B\u628A\u5B83\u5F53\u6210\u300C\u79BB\u5F00\u300D\u3002\r\n const onDragLeave = (event: DragEvent): void => {\r\n const to = event.relatedTarget as Node | null\r\n if (to !== null && el.contains(to)) return\r\n stopScroll()\r\n }\r\n\r\n const onEnd = (): void => stopScroll()\r\n\r\n el.addEventListener('dragover', onDragOver, true)\r\n el.addEventListener('dragleave', onDragLeave, true)\r\n el.addEventListener('drop', onEnd, true)\r\n // dragend \u53EA\u53D1\u7ED9\u62D6\u8D77\u5143\u7D20\uFF08\u53EF\u80FD\u5728\u522B\u7684\u5BB9\u5668\u91CC\uFF09\uFF0C\u6302 window \u6700\u7A33\u3002\r\n window.addEventListener('dragend', onEnd)\r\n // \u6307\u9488\u5728\u8FB9\u7F18\u5E26\u91CC\u9759\u6B62\u65F6\u6D4F\u89C8\u5668\u4ECD\u4F1A\u7ED9\u96F6\u661F\u7684 dragover\uFF1B\u82E5\u4E00\u6B21\u90FD\u6CA1\u6709\uFF08\u79BB\u5F00\r\n // \u5BB9\u5668\u524D\u7684\u6700\u540E\u4E00\u6B21\uFF09\uFF0C\u4E0B\u4E00\u6B21\u62D6\u62FD\u5F00\u59CB\u524D\u628A\u72B6\u6001\u6E05\u5E72\u51C0\u3002\r\n window.addEventListener('dragstart', onEnd)\r\n\r\n return () => {\r\n stopScroll()\r\n el.removeEventListener('dragover', onDragOver, true)\r\n el.removeEventListener('dragleave', onDragLeave, true)\r\n el.removeEventListener('drop', onEnd, true)\r\n window.removeEventListener('dragend', onEnd)\r\n window.removeEventListener('dragstart', onEnd)\r\n // pendingY \u53EA\u5728\u62D6\u62FD\u671F\u95F4\u6709\u610F\u4E49\uFF1B\u9000\u51FA\u65F6\u6E05\u6389\uFF0C\u907F\u514D\u9648\u65E7\u5F15\u7528\u3002\r\n pendingY = null\r\n }\r\n }, [ref])\r\n}\r\n", "/**\n * ToolsPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u5DE6\u680F\uFF08\u5DE5\u5177\u6A21\u5F0F\uFF09\u3002\n *\n * \u9876\u90E8\u4E09\u4E2A\u9636\u6BB5 Tab\uFF08\u5F15\u5BFC\u671F / \u5E38\u9A7B\u671F / \u538B\u7F29\u53D7\u63A7\u671F\uFF09\uFF0C\u4E0E\u53F3\u680F\u9884\u89C8\u7684\u9636\u6BB5\u6309\u94AE\n * **\u8054\u52A8**\u3002\u6BCF\u4E2A\u9636\u6BB5\u5217\u51FA\u8BE5\u9636\u6BB5\u8FDB\u5165\u8FC7\u6EE4\u7684\u76EE\u5F55 \u222A \u7528\u6237\u52A0\u56DE\u7684\u5DE5\u5177\uFF1A\u52FE\u9009\u6846 =\n * \u8BE5\u9636\u6BB5\u5BF9\u6A21\u578B\u53EF\u89C1\uFF1B\u9690\u85CF\u540E\u4ECD\u5728\u5217\u8868\u53EF\u53CD\u9009\u3002\u4E09\u4EFD\u540D\u5355\u4E92\u4E0D\u7EE7\u627F\u3002\n *\n * \u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 = \u53EF\u89C1 / \u5DF2\u505C\u7528 = \u9690\u85CF\uFF09\uFF0C\u53EA\u7EDF\u8BA1\u5F53\u524D\n * \u9636\u6BB5\u3002\n *\n * \u62D6\u62FD\uFF08\u89C1 dnd.ts\uFF09\uFF1A\u628A\u300C\u672C\u7CFB\u7EDF\u5168\u90E8\u5DE5\u5177\u300D\u91CC\u7684\u884C\u62D6\u8FDB\u4E0A\u9762\u7684\u5217\u8868 = \u8BA9\u8BE5\u5DE5\u5177\u5728\u672C\n * \u9636\u6BB5\u51FA\u73B0\uFF08\u5199\u8FDB add \u540D\u5355\u52A0\u56DE\uFF0C\u6216\u4ECE\u9ED1\u540D\u5355\u91CC\u653E\u51FA\u6765\uFF09\uFF1B\u628A\u884C\u62D6\u56DE\u6C60 = \u4ECE\u672C\u9636\u6BB5\u62FF\n * \u6389\uFF08\u64A4\u9500\u52A0\u56DE / \u8FDB\u9ED1\u540D\u5355\uFF09\uFF1B\u628A\u884C\u62D6\u5230\u5934\u90E8\u67D0\u4E2A\u9636\u6BB5 Tab = \u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u9690\u85CF\n * \u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\uFF0C\u6E90\u9636\u6BB5\u4E0D\u52A8\uFF09\u3002\u70B9\u6309\u8DEF\u5F84\u7167\u65E7\uFF1A\u6C60\u91CC\u6BCF\u884C\u4E09\u4E2A\u5C0F\u6309\u94AE\u4E5F\u80FD\u52A0\u5165\u5BF9\u5E94\n * \u9636\u6BB5 \u2014\u2014 \u6CE8\u518C\u8868\u91CC\u6839\u672C\u6CA1\u6709\u7684\uFF08\u522B\u7684\u9884\u8BBE\u72EC\u6709\uFF09\u52A0\u4E0D\u8FDB\u6765\uFF0C\u754C\u9762\u660E\u786E\u8BF4\u660E\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type DragEvent as ReactDragEvent, type ReactElement } from 'react'\nimport type { Config, Inventory, PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { PART_ORDER, withPhaseAdd, withPhaseExclude } from './presets.ts'\nimport { acceptsDrop, beginDrag, finishDrag, payloadOf, setPhaseDropHandler, type DragPayload } from './dnd.ts'\nimport { useDragAutoScroll } from './drag-scroll.ts'\nimport { s } from './styles.ts'\nimport type { TriState } from './SectionsPane.tsx'\n\n/** Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\u3002 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\n/** \u4E00\u6B21\u52A0\u56DE\u64CD\u4F5C\u7684\u53CD\u9988\uFF08ok = \u5DF2\u5199\u5165\uFF0Cwarn = \u4EC0\u4E48\u90FD\u6CA1\u6539\u5E76\u8BF4\u660E\u539F\u56E0\uFF09\u3002 */\ntype Notice = { kind: 'ok' | 'warn'; text: string }\n\nexport function ToolsPane({ cfg, inv, phases, phase, syncAll, t, write }: {\n cfg: Config\n inv: Inventory | null\n phases: PhaseViews | null\n /** \u5F53\u524D\u9636\u6BB5\uFF08\u72B6\u6001\u5728 Panel \u6301\u6709\uFF0C\u5934\u90E8\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u5207\u6362\uFF09\u3002 */\n phase: PhaseViewKey\n /** \u4E09\u6001\u540C\u6B65\uFF08\u9ED8\u8BA4\u5173\uFF09\uFF1A\u52FE\u9009\u540E\u9690\u85CF / \u663E\u793A\u4E0E\u52A0\u56DE\u5BF9\u4E09\u4E2A\u9636\u6BB5\u4E00\u8D77\u751F\u6548\uFF08\u53EA\u4F5C\u7528\u4E8E\u540C\u540D\u5DE5\u5177\uFF09\u3002 */\n syncAll?: boolean\n t: Translate\n write: (field: 'sections' | 'replace' | 'inject' | 'tools', value: unknown) => void\n}): ReactElement {\n const [filter, setFilter] = useState<TriState>('all')\n const [notice, setNotice] = useState<Notice | null>(null)\n // \u62D6\u62FD\uFF1A\u6B63\u5728\u62D6\u7684\u5DE5\u5177\u540D\uFF0C\u6295\u653E\u4F4D\u7F6E\u6807\u8BB0\uFF08\u884C\u540D / `list` / `pool`\uFF09\u3002\n const [dragName, setDragName] = useState<string | null>(null)\n const [dropMark, setDropMark] = useState<string | null>(null)\n // \u5217\u8868\u6EDA\u52A8\u5BB9\u5668\uFF1A\u62D6\u5230\u4E0A\u4E0B\u8FB9\u7F18\u65F6\u81EA\u52A8\u6EDA\uFF08\u957F\u5217\u8868\u91CC\u624B\u62D6\u591F\u4E0D\u5230\u89C6\u53E3\u5916\u7684\u4F4D\u7F6E\uFF09\u3002\n const scrollRef = useRef<HTMLDivElement | null>(null)\n useDragAutoScroll(scrollRef)\n\n // \u67D0\u9636\u6BB5\u81EA\u5DF1\u7684\u9ED1\u540D\u5355 / \u52A0\u56DE\u540D\u5355\uFF08\u4E09\u4EFD\u4E92\u4E0D\u7EE7\u627F\uFF09\u3002\n const excludeOf = (key: PhaseViewKey): string[] => {\n const tools = cfg.tools ?? {}\n const list = key === 'bootstrap' ? tools.bootstrap?.exclude : key === 'compaction' ? tools.compaction?.exclude : tools.exclude\n return list ?? []\n }\n const addOf = (key: PhaseViewKey): string[] => {\n const tools = cfg.tools ?? {}\n const list = key === 'bootstrap' ? tools.bootstrap?.add : key === 'compaction' ? tools.compaction?.add : tools.add\n return list ?? []\n }\n // \u4E00\u6B21\u5199\u5165\u540C\u65F6\u843D\u8BE5\u9636\u6BB5\u7684 exclude \u4E0E add\uFF08\u5728\u540C\u4E00\u4EFD tools \u4E0A\u53E0\u5B8C\u518D\u5199\u4E00\u6B21\uFF09\u3002\n const writeLists = (key: PhaseViewKey, exclude: string[], add: string[]): void => {\n write('tools', withPhaseAdd(withPhaseExclude(cfg.tools ?? {}, key, exclude), key, add))\n }\n\n // \u4E09\u6001\u540C\u6B65\u5199\u5165\uFF08syncAll \u5F00\u542F\u65F6\uFF09\uFF1A\u5BF9\u4E09\u4E2A\u9636\u6BB5\u5404\u81EA\u7684 exclude / add \u540D\u5355\u505A\u540C\u4E00\n // \u53D8\u6362\uFF0C\u53E0\u8FDB\u4E00\u4EFD tools \u540E\u4E00\u6B21\u5199\u5165\u3002\u53D8\u6362\u8FD4\u56DE null = \u8BE5\u9636\u6BB5\u65E0\u53EF\u505A\u7684\u6539\u52A8\uFF0C\u8DF3\u8FC7\u3002\n const writeSynced = (\n apply: (key: PhaseViewKey, exclude: string[], add: string[]) => { exclude: string[]; add: string[] } | null,\n ): void => {\n let tools = cfg.tools\n for (const k of PART_ORDER) {\n const next = apply(k, excludeOf(k), addOf(k))\n if (next === null) continue\n tools = withPhaseExclude(withPhaseAdd(tools, k, next.add), k, next.exclude)\n }\n write('tools', tools)\n }\n\n // \u8BE5\u9636\u6BB5\u7684\u88C5\u914D\u76EE\u5F55\uFF08\u8FDB\u5165\u672C\u63D2\u4EF6\u8FC7\u6EE4\u7684\u5DE5\u5177\u539F\u6587\uFF09\u4E0E\u8BE5\u9884\u8BBE\u6CE8\u518C\u8868\uFF08\u80FD\u52A0\u56DE\u7684\u6765\u6E90\uFF09\u3002\n const catalogOf = (key: PhaseViewKey): string[] => (phases?.[key]?.baseTools ?? []).map((tool) => tool.name)\n const isInCatalog = (key: PhaseViewKey, name: string): boolean => catalogOf(key).includes(name)\n // \u6CE8\u518C\u8868\u4E09\u4E2A\u9636\u6BB5\u5171\u4EAB\u540C\u4E00 scope\uFF0C\u53D6\u7B2C\u4E00\u4E2A\u975E\u7A7A\u7684\u5373\u53EF\u3002\n const registry: Set<string> = (() => {\n const list = PART_ORDER.map((key) => phases?.[key]?.registryTools).find((x) => Array.isArray(x) && x.length > 0) ?? []\n return new Set(list)\n })()\n\n // \u628A\u4E00\u4E2A\u5DE5\u5177\u653E\u8FDB\u67D0\u9636\u6BB5\uFF08\u590D\u5236\u8BED\u4E49\uFF0C\u7EDD\u4E0D\u6539\u52A8\u5176\u5B83\u9636\u6BB5\uFF09\uFF1A\u4E0D\u5728\u8BE5\u9636\u6BB5\u76EE\u5F55\u91CC\u5C31\n // \u52A0\u8FDB add \u540D\u5355\uFF1Bhidden \u51B3\u5B9A\u5B83\u5728\u76EE\u6807\u9636\u6BB5\u662F\u53EF\u89C1\u8FD8\u662F\u9690\u85CF\u3002\n const addToPhase = (key: PhaseViewKey, name: string, hidden: boolean): void => {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (!isInCatalog(key, name) && !add.includes(name)) add = [...add, name]\n exclude = hidden\n ? (exclude.includes(name) ? exclude : [...exclude, name])\n : exclude.filter((x) => x !== name)\n writeLists(key, exclude, add)\n }\n\n // \u9636\u6BB5\u5206\u7EC4\u91CC\u7684\u884C = \u8BE5\u9636\u6BB5\u8FDB\u5165\u8FC7\u6EE4\u7684\u76EE\u5F55 \u222A \u5DF2\u52A0\u56DE\uFF08\u4F46\u5C1A\u672A\u51FA\u73B0\u5728\u88C5\u914D\u91CC\uFF09\u7684\u5DE5\u5177\u3002\n const rowsOf = (key: PhaseViewKey): Array<{ name: string; description: string; hidden: boolean; added: boolean }> => {\n const exclude = excludeOf(key)\n const catalog = (phases?.[key]?.baseTools ?? []).map((tool) => ({\n name: tool.name,\n description: tool.description ?? '',\n hidden: exclude.includes(tool.name),\n added: false,\n }))\n const names = new Set(catalog.map((row) => row.name))\n const added = addOf(key)\n .filter((name) => !names.has(name))\n .map((name) => ({ name, description: '', hidden: false, added: true }))\n return [...catalog, ...added]\n }\n\n // \u52FE\u9009 / \u53D6\u6D88\u52FE\u9009\uFF1A\u53EA\u52A8\u8FD9\u4E00\u4E2A\u5DE5\u5177\u5728\u672C\u9636\u6BB5\u7684\u53EF\u89C1\u6027\u3002\n const toggleHide = (key: PhaseViewKey, name: string, currentlyHidden: boolean): void => {\n if (syncAll) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u663E\u793A = \u5404\u9636\u6BB5 exclude \u79FB\u9664\uFF08\u7EDD\u4E0D\u987A\u624B\u628A\u6CA1\u52A0\u56DE\u7684\u5DE5\u5177\u52A0\u8FDB add\uFF09\uFF1B\n // \u9690\u85CF = \u5DF2\u52A0\u56DE\u7684\u64A4\u9500\u52A0\u56DE\u3001\u539F\u751F\u7684\u8FDB\u8BE5\u9636\u6BB5 exclude\u3002\n writeSynced((_k, exclude, add) => {\n if (currentlyHidden) return { exclude: exclude.filter((x) => x !== name), add }\n if (add.includes(name)) return { exclude, add: add.filter((x) => x !== name) }\n return exclude.includes(name) ? null : { exclude: [...exclude, name], add }\n })\n setNotice(null)\n return\n }\n if (currentlyHidden) {\n addToPhase(key, name, false)\n } else {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (add.includes(name)) add = add.filter((x) => x !== name)\n else if (!exclude.includes(name)) exclude = [...exclude, name]\n writeLists(key, exclude, add)\n }\n setNotice(null)\n }\n\n // \u4ECE\u6C60\u52A0\u5165\u67D0\u9636\u6BB5\uFF08\u66FF\u4EE3\u65E7\u7248\u62D6\u62FD\uFF1A\u6C60 \u2192 \u9636\u6BB5\uFF09\u3002\u6CE8\u518C\u8868\u91CC\u6CA1\u6709\u7684\u52A0\u4E0D\u8FDB\u6765\u3002\n const addFromPool = (key: PhaseViewKey, name: string): void => {\n if (!isInCatalog(key, name) && !registry.has(name)) {\n setNotice({ kind: 'warn', text: t('toolNotInRegistry', { name }) })\n return\n }\n if (syncAll) {\n // \u4E09\u6001\u540C\u6B65\uFF1A\u4E09\u4E2A\u9636\u6BB5\u90FD\u8BA9\u5B83\u51FA\u73B0\uFF08\u8BE5\u9636\u6BB5\u76EE\u5F55\u91CC\u6CA1\u6709\u7684\u5C31\u5199\u8FDB\u5404\u81EA\u7684 add \u540D\u5355\uFF09\u3002\n writeSynced((k, exclude, add) => ({\n exclude: exclude.filter((x) => x !== name),\n add: !isInCatalog(k, name) && !add.includes(name) ? [...add, name] : add,\n }))\n setNotice({ kind: 'ok', text: t('toolSyncShown', { name }) })\n return\n }\n addToPhase(key, name, false)\n setNotice({ kind: 'ok', text: isInCatalog(key, name) ? t('toolShown', { name, to: stageLabel(key) }) : t('toolAdded', { name, phase: stageLabel(key) }) })\n }\n\n // \u2500\u2500 \u62D6\u62FD\u843D\u5730\uFF08\u624B\u52BF\u5B9A\u4E49\u89C1 dnd.ts\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n /** \u4ECE\u67D0\u9636\u6BB5\u62FF\u6389\u4E00\u4E2A\u5DE5\u5177\uFF08\u62D6\u56DE\u300C\u5168\u90E8\u300D\u7684\u624B\u52BF\uFF09\uFF1A\u5DF2\u52A0\u56DE\u7684\u64A4\u9500\u52A0\u56DE\uFF08\u56DE\u5230\u8BE5\u9636\u6BB5\n * \u539F\u751F\u72B6\u6001\uFF09\uFF0C\u539F\u751F\u5DE5\u5177\u5219\u8FDB\u8BE5\u9636\u6BB5\u9ED1\u540D\u5355\uFF08= \u8BE5\u9636\u6BB5\u9690\u85CF\uFF09\u3002 */\n const removeFromPhase = (key: PhaseViewKey, name: string): void => {\n let exclude = excludeOf(key)\n let add = addOf(key)\n if (add.includes(name)) add = add.filter((item) => item !== name)\n else if (!exclude.includes(name)) exclude = [...exclude, name]\n writeLists(key, exclude, add)\n setNotice({ kind: 'ok', text: t('toolRemovedFromPhase', { name, from: stageLabel(key) }) })\n }\n\n /** \u4E00\u6B21\u300C\u653E\u8FDB\u76EE\u6807\u9636\u6BB5\u300D\u7684\u843D\u5730\uFF1A\u6C60\u91CC\u6765\u7684 = \u52A0\u56DE / \u663E\u793A\uFF1B\u522B\u7684\u9636\u6BB5\u6765\u7684 = \u590D\u5236\n * \uFF08\u9690\u85CF\u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\uFF0C\u6E90\u9636\u6BB5\u4E0D\u52A8\uFF09\uFF1B\u540C\u9636\u6BB5 = \u4EC0\u4E48\u90FD\u4E0D\u505A\u3002 */\n const dropToolInto = (key: PhaseViewKey, payload: DragPayload): void => {\n if (payload.kind !== 'tool' || payload.from === key) return\n if (payload.from === 'pool') { addFromPool(key, payload.name); return }\n addToPhase(key, payload.name, payload.hidden === true)\n setNotice({ kind: 'ok', text: t('toolCopied', { name: payload.name, to: stageLabel(key), from: stageLabel(payload.from) }) })\n }\n\n /** \u884C / \u5217\u8868\u4E0A\u7684\u6295\u653E\uFF1A\u628A\u624B\u91CC\u7684\u5DE5\u5177\u653E\u8FDB\u672C\u9636\u6BB5\uFF08\u6C60\u6765\u7684\u52A0\u56DE\u3001\u522B\u7684\u9636\u6BB5\u6765\u7684\u590D\u5236\uFF09\u3002 */\n const dropOnPane = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'tool') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n dropToolInto(phase, payload)\n }\n\n /** \u6C60\u4E0A\u7684\u6295\u653E\uFF1A\u628A\u884C\u4ECE\u672C\u9636\u6BB5\u62FF\u6389\u3002 */\n const dropOnPool = (event: ReactDragEvent): void => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'tool') return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(null)\n if (payload.from === phase) removeFromPhase(phase, payload.name)\n }\n\n // \u5934\u90E8\u9636\u6BB5 Tab \u4E0A\u7684\u6295\u653E\uFF1A\u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\uFF08\u6362 Tab / \u6362\u6A21\u5F0F\u65F6\u65E7\u5217\u8868\u5378\u8F7D\u3001\u65B0\n // \u5217\u8868\u6CE8\u518C \u2014\u2014 \u4EFB\u4F55\u65F6\u523B\u53EA\u6709\u4E00\u4E2A\u5904\u7406\u8005\uFF09\u3002\n useEffect(() => {\n setPhaseDropHandler((key, payload) => dropToolInto(key, payload))\n return () => setPhaseDropHandler(null)\n })\n\n const stageLabel = (key: PhaseViewKey): string =>\n key === 'bootstrap' ? t('phaseStageGuide') : key === 'compaction' ? t('phaseStageControlled') : t('phaseStageResident')\n\n // \u5F53\u524D\u9636\u6BB5\u7684\u884C + \u4E09\u6001\u8FC7\u6EE4\uFF08\u5DF2\u542F\u7528 = \u5BF9\u6A21\u578B\u53EF\u89C1\uFF09\u3002\n const rows = rowsOf(phase)\n const onCount = rows.filter((row) => !row.hidden).length\n const offCount = rows.length - onCount\n const rowVisible = (row: { hidden: boolean }): boolean =>\n filter === 'all' || (filter === 'on' ? !row.hidden : row.hidden)\n\n const renderRow = (row: { name: string; description: string; hidden: boolean; added: boolean }): ReactElement | null => {\n if (!rowVisible(row)) return null\n return h('div', {\n key: row.name,\n style: {\n ...s.row,\n ...(row.hidden ? s.rowBlocked : {}),\n ...(dropMark === row.name ? s.dropZoneActive : {}),\n ...(dragName === row.name ? s.dragging : {}),\n },\n title: row.description.slice(0, 120),\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'tool')) return\n event.preventDefault()\n event.stopPropagation()\n setDropMark(row.name)\n },\n onDrop: dropOnPane,\n }, [\n // \u62D6\u62FD\u6293\u624B\uFF1A\u6574\u884C draggable \u4F1A\u628A\u52FE\u9009\u6846\u7684\u624B\u52BF\u4E00\u8D77\u5403\u6389\u3002\n h('span', {\n draggable: true,\n title: t('drag'),\n style: s.dragHandle,\n onDragStart: (event: ReactDragEvent) => {\n setDragName(row.name)\n beginDrag(event, { kind: 'tool', name: row.name, from: phase, hidden: row.hidden })\n },\n onDragEnd: () => { setDragName(null); setDropMark(null); finishDrag() },\n }, '\u283F'),\n h('input', {\n type: 'checkbox',\n checked: !row.hidden,\n onChange: () => toggleHide(phase, row.name, row.hidden),\n title: row.hidden ? t('hiddenOn') : t('hiddenOff'),\n style: { margin: 0, cursor: 'pointer', flex: 'none' },\n }),\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, row.name),\n row.added ? h('span', { style: s.badgeCustom }, t('toolAddedTag')) : null,\n row.hidden ? h('span', { style: s.badgeBlocked }, t('hiddenOn')) : null,\n ]),\n row.description !== '' ? h('div', { style: s.preview }, row.description.slice(0, 120)) : null,\n ]),\n ])\n }\n\n const allTools = (inv?.tools ?? []).map((tool) => ({\n name: tool.name,\n description: typeof tool === 'string' ? '' : (tool.description ?? ''),\n }))\n\n return h('div', { style: s.colLeft }, [\n h('div', {\n ref: scrollRef,\n style: { ...s.colScroll, ...(dropMark === 'list' ? s.dropZone : {}) },\n // \u5217\u8868\u7A7A\u767D\u5904\u6295\u653E\uFF1A\u6C60\u91CC / \u522B\u7684\u9636\u6BB5\u62D6\u6765\u7684\u5DE5\u5177\u653E\u8FDB\u672C\u9636\u6BB5\u3002\n onDragOver: (event: ReactDragEvent) => {\n const payload = payloadOf(event)\n if (payload === null || payload.kind !== 'tool' || payload.from === phase) return\n event.preventDefault()\n setDropMark('list')\n },\n onDrop: dropOnPane,\n }, [\n h('div', { style: s.muted }, t('toolsFourHint')),\n notice ? h('div', { style: notice.kind === 'ok' ? s.noticeOk : s.noticeWarn }, notice.text) : null,\n rows.map(renderRow),\n rows.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n // \u672C\u7CFB\u7EDF\u5168\u90E8\u5DE5\u5177\uFF1A\u6CE8\u518C\u8868\u7684\u5B8C\u6574\u76EE\u5F55\uFF0C\u53EA\u8BFB\u6C60\u3002\u52A0\u5165\u67D0\u4E2A\u9636\u6BB5\u9760\u62D6\u62FD\uFF1A\u628A\u884C\u62D6\u8FDB\n // \u4E0A\u9762\u7684\u9636\u6BB5\u5217\u8868 = \u52A0\u5165\u672C\u9636\u6BB5\uFF0C\u62D6\u5230\u5934\u90E8\u9636\u6BB5 Tab = \u52A0\u5165\u90A3\u4E2A\u9636\u6BB5\uFF08\u884C\u4E0A\u4E0D\u518D\n // \u653E\u4E09\u4E2A\u6309\u94AE \u2014\u2014 \u62D6\u62FD\u662F\u552F\u4E00\u8DEF\u5F84\uFF0C\u6C60\u540C\u65F6\u662F\u300C\u4ECE\u9636\u6BB5\u62FF\u6389\u300D\u7684\u6295\u653E\u70B9\uFF09\u3002\n h('details', {\n style: { ...s.injectBox, ...(dropMark === 'pool' ? s.dropZoneActive : {}) },\n onDragOver: (event: ReactDragEvent) => {\n if (!acceptsDrop(event, 'tool')) return\n event.preventDefault()\n event.stopPropagation()\n setDropMark('pool')\n },\n onDrop: dropOnPool,\n }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } },\n `${t('allToolsTitle')} (${allTools.length})`),\n allTools.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n allTools.map((tool) => h('div', {\n key: tool.name,\n style: { ...s.row, opacity: 0.92 },\n draggable: true,\n title: t('dragHint'),\n onDragStart: (event: ReactDragEvent) => beginDrag(event, { kind: 'tool', name: tool.name, from: 'pool' }),\n onDragEnd: finishDrag,\n }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, tool.name)),\n h('div', { style: s.preview }, tool.description.slice(0, 120)),\n ]),\n ])),\n ]),\n ]),\n // \u5DE6\u680F\u5E95\u90E8\u56FA\u5B9A\u6761\uFF1A\u4E09\u6001\u8FC7\u6EE4\uFF08\u5168\u90E8 / \u5DF2\u542F\u7528 = \u53EF\u89C1 / \u5DF2\u505C\u7528 = \u9690\u85CF\uFF09\u3002\n h('div', { style: s.colFoot }, [\n h('div', { style: s.seg }, [\n h('button', { style: filter === 'all' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('all') },\n `${t('filterAll')} ${rows.length}`),\n h('button', { style: filter === 'on' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('on') },\n `${t('filterOn')} ${onCount}`),\n h('button', { style: filter === 'off' ? s.segBtnActive : s.segBtn, onClick: () => setFilter('off') },\n `${t('filterOff')} ${offCount}`),\n ]),\n ]),\n ])\n}\n", "/**\n * PresetsPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u9884\u8BBE\u6A21\u5F0F\uFF08\u5DE6\u53F3\u53CC\u680F\uFF09\u3002\n *\n * \u4E24\u79CD\u300C\u9884\u8BBE\u300D\u5206\u5F00\uFF0C\u5404\u5360\u4E00\u680F\uFF1A\n * - \u5DE6\u680F\uFF08PresetsPane\uFF09\uFF1A\u914D\u7F6E\u5FEB\u7167\u5E93 \u2014\u2014 \u4FDD\u5B58\u5F53\u524D\u914D\u7F6E / \u5BFC\u5165 / \u5E94\u7528 / \u5BFC\u51FA /\n * \u5220\u9664\u3002\u5FEB\u7167\u53EA\u6539\u672C\u63D2\u4EF6\u5185\u7684 presets \u5E93\uFF0C\u4E0D\u4F1A\u53D8\u6210\u53EF\u9009\u7684 agent \u9884\u8BBE\uFF1B\n * - \u53F3\u680F\uFF08SettingsPane\uFF09\uFF1A\u5B58\u4E3A agent \u9884\u8BBE\uFF08\u6574\u4F53 fork \u5F53\u524D\u7F16\u8F91\u76EE\u6807\u7684\u9884\u8BBE\u76EE\u5F55\uFF0C\n * \u5E76\u628A\u5F53\u524D\u5B9A\u5236\u5199\u8FDB\u5B83\u7684\u8986\u76D6\u9879\uFF09+ \u5168\u5C40\u8BBE\u7F6E\uFF08\u5F3A\u5236\u8986\u76D6\u5F00\u5173\u3001\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\u3001\n * \u63D0\u793A\u8BCD\u53D8\u91CF\u53C2\u8003\u3001\u6062\u590D\u521D\u59CB\u72B6\u6001\uFF09\u3002\n *\n * \u5BFC\u5165\u5BFC\u51FA\u7ECF preset-io \u53CC\u7AEF\u9002\u914D\uFF1ATauri 2 \u684C\u9762\u8D70\u539F\u751F\u5BF9\u8BDD\u6846\uFF0CWeb \u8D70\u4E0B\u8F7D /\n * \u6587\u4EF6\u9009\u62E9\uFF1B\u6210\u529F / \u5931\u8D25 / \u53D6\u6D88\u90FD\u6709\u9762\u677F\u5185\u6D88\u606F\u6761\u63D0\u793A\u3002\n */\nimport { createElement as h, useEffect, useRef, useState, type ReactElement, type ChangeEvent } from 'react'\nimport type { Config, Inventory, PhaseViewKey, Preview, Preset } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { addImportedPresets, applyPresetData, buildPresetData, genId, mergeSections, PART_ORDER, removePreset, type ConfigPatch } from './presets.ts'\nimport { decodePresetExport, exportPresetFile, importPresetFile } from './preset-io.ts'\nimport { s } from './styles.ts'\n\n/** \u4E00\u6B21\u6027\u64CD\u4F5C\u63D0\u793A\uFF1Akind \u51B3\u5B9A\u914D\u8272\uFF0C\u51E0\u79D2\u540E\u81EA\u52A8\u6D88\u5931\u3002 */\ninterface Notice {\n kind: 'ok' | 'error'\n text: string\n}\n\n/** 4 \u79D2\u81EA\u52A8\u6D88\u5931\u7684\u9762\u677F\u5185\u6D88\u606F\u6761\uFF08\u5DE6\u53F3\u4E24\u680F\u5171\u7528\u884C\u4E3A\uFF09\u3002 */\nfunction useNotice(): { notice: Notice | null; show: (kind: Notice['kind'], text: string) => void } {\n const [notice, setNotice] = useState<Notice | null>(null)\n const noticeTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n useEffect(() => () => {\n if (noticeTimer.current !== null) clearTimeout(noticeTimer.current)\n }, [])\n const show = (kind: Notice['kind'], text: string): void => {\n if (noticeTimer.current !== null) clearTimeout(noticeTimer.current)\n setNotice({ kind, text })\n noticeTimer.current = setTimeout(() => setNotice(null), 4000)\n }\n return { notice, show }\n}\n\nexport function PresetsPane({ cfg, inv, phases, t, writePatch, writeGlobal, envBlocklist }: {\n cfg: Config\n inv: Inventory | null\n /** Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\uFF1A\u5FEB\u7167\u53EA\u6355\u83B7\u5F53\u524D\u88C5\u914D\u91CC\u771F\u5B9E\u5B58\u5728\u7684\u6BB5\u3002 */\n phases: Record<PhaseViewKey, Preview | null> | null\n t: Translate\n /** \u5E94\u7528\u9884\u8BBE\uFF1A\u5B8C\u6574\u8865\u4E01\u4E00\u6B21\u843D\u76D8\uFF08\u663E\u5F0F\u610F\u56FE\uFF0C\u4E0D\u7ECF\u8349\u7A3F\uFF09\u3002 */\n writePatch: (patch: ConfigPatch) => void\n /** \u9884\u8BBE\u5E93\u4E13\u7528\uFF1A\u6C38\u8FDC\u5199\u5728\u5168\u5C40\u5B57\u6BB5\uFF08presets / activePreset \u4E0D\u5206\u4F5C\u7528\u57DF\uFF09\u3002 */\n writeGlobal: (field: string, value: unknown) => void\n /** \u5168\u5C40\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF08\u6C38\u8FDC\u9876\u5C42\u5B57\u6BB5\uFF0C\u4E0D\u5206\u4F5C\u7528\u57DF\uFF09\uFF1B\u5BFC\u51FA\u968F\u884C\u3001\u5BFC\u5165\u5E76\u96C6\u3002 */\n envBlocklist: string[]\n}): ReactElement {\n const presets = cfg.presets ?? []\n const [name, setName] = useState('')\n const { notice, show } = useNotice()\n // Web \u56DE\u9000\u7528\u7684\u9690\u85CF\u6587\u4EF6\u8F93\u5165\uFF08tauri \u4E0D\u53EF\u7528\u65F6\u624D\u70B9\u5B83\uFF09\u3002\n const fileRef = useRef<HTMLInputElement | null>(null)\n\n const blockedNames = new Set(cfg.sections ?? [])\n // \u5FEB\u7167\u7684\u6355\u83B7\u5B87\u5B99 = \u5F53\u524D\u9884\u8BBE\u4E09\u4E2A\u9636\u6BB5\u88C5\u914D\u91CC\u771F\u5B9E\u5B58\u5728\u7684\u6BB5\u540D\u3002\u300C\u672C\u7CFB\u7EDF\u5168\u90E8\u63D0\u793A\u8BCD\u300D\n // \u662F\u8DE8\u9884\u8BBE\u53EA\u589E\u4E0D\u51CF\u7684\u5E76\u96C6\u6C60\uFF0C\u76F4\u63A5\u62FF\u5B83\u5F53\u6355\u83B7\u96C6\u5408\u4F1A\u628A\u522B\u7684\u9884\u8BBE\u72EC\u6709\u6BB5\u540D\u704C\u8FDB\u5FEB\u7167\uFF0C\n // \u5E94\u7528\u56DE\u6765\u5C31\u662F\u4E00\u6761\u6761\u7A7A\u767D\u5E7D\u7075\u6BB5\u3002\u88C5\u914D\u6570\u636E\u672A\u5C31\u7EEA\uFF08\u5B87\u5B99\u4E3A\u7A7A\uFF09\u65F6\u4E0D\u8FC7\u6EE4\uFF0C\u907F\u514D\u6355\u83B7\u6210\u7A7A\u3002\n const assemblyNames = new Set<string>()\n for (const key of PART_ORDER) {\n for (const sec of phases?.[key]?.baseSections ?? []) assemblyNames.add(sec.name)\n }\n const mergedAll = mergeSections(inv, cfg, blockedNames)\n const merged = assemblyNames.size === 0\n ? mergedAll\n : mergedAll.filter((sec) => sec.source === 'custom' || assemblyNames.has(sec.name))\n const currentNames = new Set(merged.map((sec) => sec.name))\n\n // \u628A\u5F53\u524D\u5B9A\u5236\u6355\u83B7\u4E3A\u65B0\u9884\u8BBE\uFF08\u5B8C\u6574\u5FEB\u7167\uFF09\u3002\u7EDD\u5BF9\u987A\u5E8F\u4F1A\u88AB\u8F6C\u6210\u76F8\u5BF9\u5F62\u5F0F\n //\uFF08\u6BCF\u6BB5\u8BB0\u5F55\u5B83\u5E94\u8DDF\u968F\u7684\u524D\u4E00\u6BB5\uFF09\uFF0C\u56E0\u6B64\u9884\u8BBE\u53EF\u4EE5\u8DE8\u4E0D\u540C\u63D0\u793A\u8BCD\u79FB\u690D\u3002\n const saveCurrent = (): void => {\n const presetName = name.trim() || `${t('preset')} ${presets.length + 1}`\n const data = buildPresetData(cfg, merged)\n writeGlobal('presets', [...presets, { id: genId(), name: presetName, data }])\n setName('')\n }\n\n // \u5E94\u7528\u9884\u8BBE\u3002\u8865\u4E01\u7531\u7EAF\u51FD\u6570\u52A9\u624B\u8BA1\u7B97\uFF08\u540C\u540D\u6BB5\u8986\u76D6\u3001\u5339\u914D\u4E0D\u4E0A\u7684\u8DF3\u8FC7\u3001\u4E0D\u5728\u9884\u8BBE\n // \u5217\u8868\u4E2D\u7684\u5F53\u524D\u6BB5\u88AB\u5C4F\u853D\u3001\u53EA\u6709\u9884\u8BBE\u7684\u300C\u6FC0\u6D3B\u6BB5\u300D\u88AB\u89E3\u9664\u5C4F\u853D\uFF09\u3002\u56DB\u4E2A\u5B9A\u5236\u5B57\u6BB5\u4EE5\n // \u4E00\u4E2A\u8865\u4E01\u5199\u5165\u5F53\u524D\u7F16\u8F91\u76EE\u6807\uFF1B\u5FEB\u7167\u5E93\uFF08presets / activePreset\uFF09\u6C38\u8FDC\u4FDD\u6301\u5728\u5168\u5C40\u3002\n const applyPreset = (preset: Preset): void => {\n writePatch(applyPresetData(preset.data, cfg, currentNames))\n writeGlobal('activePreset', preset.id)\n }\n\n const deletePreset = (id: string): void => {\n const next = removePreset(presets, id, cfg.activePreset)\n writeGlobal('presets', next.presets)\n if (next.activeId === undefined && cfg.activePreset === id) writeGlobal('activePreset', undefined)\n }\n\n // \u5BFC\u51FA\u4E00\u4E2A\u9884\u8BBE\uFF1ATauri \u684C\u9762\u8D70\u539F\u751F\u4FDD\u5B58\u5BF9\u8BDD\u6846\uFF0CWeb\uFF08\u6216 tauri \u63D2\u4EF6\u4E0D\u53EF\u7528\n // \u65F6\uFF09\u56DE\u9000\u4E3A\u4E0B\u8F7D\u3002saved/downloaded = \u6210\u529F\uFF1B\u7528\u6237\u53D6\u6D88\u5355\u72EC\u63D0\u793A\uFF0C\u4E0D\u7B97\u5931\u8D25\u3002\n const exportPreset = async (preset: Preset): Promise<void> => {\n try {\n const res = await exportPresetFile(preset, undefined, envBlocklist)\n if (res.ok) show('ok', t('exportOk'))\n else if (res.cancelled) show('ok', t('exportCancel'))\n else show('error', `${t('exportFail')}${res.message ? ': ' + res.message : ''}`)\n } catch (e) {\n show('error', `${t('exportFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // \u89E3\u6790\u5BFC\u5165\u6587\u672C \u2192 \u53BB\u91CD\u8FFD\u52A0 \u2192 \u63D0\u793A\u65B0\u589E\u6570\u91CF\u3002\u89E3\u6790\u5931\u8D25\u63D0\u793A\u9519\u8BEF\u3002\n // \u5355\u5BF9\u8C61\u683C\u5F0F\u7684\u6587\u4EF6\u8FD8\u53EF\u80FD\u968F\u884C\u643A\u5E26\u5168\u5C40\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF1A\u4E0E\u5F53\u524D\u540D\u5355\u5E76\u96C6\u5408\u5E76\u3002\n const importParsed = (text: string): void => {\n try {\n const parsed = decodePresetExport(text)\n const next = addImportedPresets(presets, parsed, genId)\n const added = next.length - presets.length\n const fileBlock = parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)\n && Array.isArray((parsed as { envBlocklist?: unknown }).envBlocklist)\n ? ((parsed as { envBlocklist?: unknown[] }).envBlocklist ?? []).filter((e): e is string => typeof e === 'string')\n : []\n const fresh = fileBlock.filter((e) => !envBlocklist.includes(e))\n if (fresh.length > 0) writeGlobal('envBlocklist', [...envBlocklist, ...fresh])\n const mergedNote = fresh.length > 0 ? t('importBlockMerge', { count: fresh.length }) : ''\n if (added <= 0) show('ok', t('importNone') + mergedNote)\n else {\n writeGlobal('presets', next)\n show('ok', `${t('importOk')} (+${added})${mergedNote}`)\n }\n } catch (e) {\n show('error', `${t('importFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // \u5BFC\u5165\u9884\u8BBE\uFF1A\u4F18\u5148 Tauri \u539F\u751F\u6253\u5F00\u5BF9\u8BDD\u6846\uFF1Bunavailable\uFF08Web \u6216\u684C\u9762\u7AEF\u7F3A\n // dialog/fs \u63D2\u4EF6\uFF09\u65F6\u70B9\u9690\u85CF file input \u56DE\u9000\u5230\u6587\u4EF6\u9009\u62E9\u5668\u3002\u53D6\u6D88\u5355\u72EC\u63D0\u793A\u3002\n const importPreset = async (): Promise<void> => {\n try {\n const res = await importPresetFile()\n if (res.kind === 'text') { importParsed(res.text); return }\n if (res.kind === 'cancelled') { show('ok', t('importCancel')); return }\n fileRef.current?.click()\n } catch (e) {\n show('error', `${t('importFail')}: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // Web \u56DE\u9000\u8DEF\u5F84\uFF1A\u6587\u4EF6\u9009\u62E9\u5668\u7684 onChange\u3002\u7528\u6237\u53D6\u6D88\uFF08\u65E0\u6587\u4EF6\uFF09\u9759\u9ED8\u8FD4\u56DE\u3002\n const onImportFile = (e: ChangeEvent<HTMLInputElement>): void => {\n const file = e.target.files?.[0]\n e.target.value = ''\n if (!file) return\n const reader = new FileReader()\n reader.onload = () => importParsed(String(reader.result))\n reader.onerror = () => show('error', t('importFail'))\n reader.readAsText(file)\n }\n\n return h('div', { style: s.colLeft }, [\n h('div', { style: s.colScroll }, [\n notice ? h('div', { style: notice.kind === 'ok' ? s.noticeOk : s.error }, notice.text) : null,\n h('div', { style: s.groupHead }, t('libraryTitle')),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, flex: 1 }, placeholder: t('presetName'), value: name, onChange: (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value) }),\n h('button', { style: s.mini, onClick: saveCurrent }, t('save')),\n ]),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => { void importPreset() } }, t('import')),\n h('input', { ref: fileRef, type: 'file', accept: '.json,application/json', style: { display: 'none' }, onChange: onImportFile }),\n ]),\n ]),\n presets.length === 0 ? h('div', { style: s.muted }, t('empty')) : null,\n presets.map((preset) => {\n const active = cfg.activePreset === preset.id\n return h('div', { key: preset.id, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.code }, preset.name),\n active ? h('span', { style: s.badgeOk }, t('active')) : null,\n ]),\n ]),\n h('button', { style: s.mini, onClick: () => applyPreset(preset) }, t('apply')),\n h('button', { style: s.mini, onClick: () => { void exportPreset(preset) } }, t('export')),\n h('button', { style: s.mini, onClick: () => deletePreset(preset.id) }, t('delete')),\n ])\n }),\n ]),\n ])\n}\n\nexport function SettingsPane({ cfg, inv, t, writeGlobal, saveAsPreset, forkSource, onReset, envBlocklist }: {\n cfg: Config\n inv: Inventory | null\n t: Translate\n /** \u5168\u5C40\u5B57\u6BB5\u4E13\u7528\u5199\u901A\u9053\uFF08forceSections / envBlocklist\uFF0C\u4E0D\u7ECF\u8349\u7A3F\uFF09\u3002 */\n writeGlobal: (field: string, value: unknown) => void\n /** \u5B58\u4E3A agent \u9884\u8BBE\uFF1Afork \u5F53\u524D\u7F16\u8F91\u76EE\u6807\u7684\u9884\u8BBE\u76EE\u5F55\u5E76\u5199\u5165 overrides[\u65B0\u540D]\u3002 */\n saveAsPreset: (name: string) => Promise<boolean>\n /** fork \u6765\u6E90\u7684\u663E\u793A\u540D\uFF08\u5F53\u524D\u7F16\u8F91\u76EE\u6807\u9884\u8BBE\uFF09\uFF1Bundefined = \u5168\u5C40\u76EE\u6807\uFF0C\u7531\u670D\u52A1\u7AEF\u56DE\u843D\u9ED8\u8BA4\u9884\u8BBE\u3002 */\n forkSource: string | undefined\n /** \u6062\u590D\u521D\u59CB\u72B6\u6001\uFF1A\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\u5E76\u5173\u95ED forceSections\uFF08\u4E0E\u4E0D\u88C5\u63D2\u4EF6\u7B49\u6548\uFF09\u3002 */\n onReset: () => void\n envBlocklist: string[]\n}): ReactElement {\n // \u300C\u5B58\u4E3A agent \u9884\u8BBE\u300D\u7684\u540D\u5B57\u4E0E\u5728\u9014\u6807\u8BB0\uFF08\u4E0E\u670D\u52A1\u7AEF\u5F80\u8FD4\u671F\u95F4\u7981\u7528\u6309\u94AE\uFF09\u3002\n const [agentName, setAgentName] = useState('')\n const [creating, setCreating] = useState(false)\n // \u9ED1\u540D\u5355\u300C\u6DFB\u52A0\u300D\u8F93\u5165\u6846\u7684\u6682\u5B58\u503C\u3002\n const [blockInput, setBlockInput] = useState('')\n\n // \u5B58\u4E3A agent \u9884\u8BBE\uFF1A\u6210\u8D25\u7531\u670D\u52A1\u7AEF\u8FD4\u56DE\uFF0C\u63D0\u793A\u7EDF\u4E00\u8D70\u9762\u677F\u9876\u90E8\u7684\u6D88\u606F\u6761\uFF08Panel\n // \u7684 flash\uFF09\uFF0C\u8FD9\u91CC\u53EA\u5728\u6210\u529F\u65F6\u6E05\u7A7A\u8F93\u5165\u6846\uFF0C\u907F\u514D\u540C\u4E00\u6761\u6D88\u606F\u663E\u793A\u4E24\u904D\u3002\n const createAgentPreset = async (): Promise<void> => {\n const trimmed = agentName.trim()\n if (trimmed.length === 0 || creating) return\n setCreating(true)\n if (await saveAsPreset(trimmed)) setAgentName('')\n setCreating(false)\n }\n\n // \u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF1A\u5168\u5C40\u5B57\u6BB5\uFF0C\u6539\u52A8\u5373\u5199\uFF08\u4E0E forceSections \u540C\u4E00\u901A\u9053\uFF0C\u4E0D\u7ECF\u8349\u7A3F\uFF09\u3002\n const removeBlockEntry = (entry: string): void => {\n writeGlobal('envBlocklist', envBlocklist.filter((e) => e !== entry))\n }\n const addBlockEntry = (): void => {\n const entry = blockInput.trim()\n setBlockInput('')\n if (entry === '' || envBlocklist.includes(entry)) return\n writeGlobal('envBlocklist', [...envBlocklist, entry])\n }\n\n return h('div', { style: s.colRight }, [\n h('div', { style: s.colRightScroll }, [\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('saveAsPresetCard')),\n h('div', { style: s.muted }, t('saveAsPresetHint', { name: forkSource ?? t('forkSourceDefault') })),\n h('div', { style: s.injectRow }, [\n h('input', { style: { ...s.input, flex: 1 }, placeholder: t('agentPresetName'), value: agentName, onChange: (e: ChangeEvent<HTMLInputElement>) => setAgentName(e.target.value) }),\n h('button', { style: s.mini, disabled: creating || agentName.trim().length === 0, onClick: () => { void createAgentPreset() } }, t('saveAsPreset')),\n ]),\n ]),\n h('div', { style: s.groupHead }, t('settingsTitle')),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('forceTitle')),\n h('div', { style: s.muted }, t('forceHint')),\n h('div', { style: s.injectRow }, [\n h('label', { style: s.switchWrap }, [\n h('input', {\n type: 'checkbox',\n checked: cfg.forceSections !== false,\n // forceSections \u662F\u5168\u5C40\u5B57\u6BB5\uFF0C\u4E0E presets/activePreset \u4E00\u6837\u6C38\u8FDC\u5199\u9876\u5C42\u3002\n onChange: (e: ChangeEvent<HTMLInputElement>) => writeGlobal('forceSections', e.target.checked),\n }),\n h('span', { style: cfg.forceSections !== false ? s.badgeOk : s.badgeBlocked },\n cfg.forceSections !== false ? t('forceOn') : t('forceOff')),\n ]),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('envBlockTitle')),\n h('div', { style: s.muted }, t('envBlockHint')),\n h('div', { style: { ...s.toolWrap, marginTop: 6 } }, envBlocklist.map((entry) => h('span', {\n key: entry,\n style: { ...s.toolChip, display: 'inline-flex', alignItems: 'center', gap: 4 },\n }, [\n entry,\n h('span', { style: { cursor: 'pointer' }, title: t('delete'), onClick: () => removeBlockEntry(entry) }, '\u00D7'),\n ]))),\n envBlocklist.length === 0 ? h('div', { style: s.muted }, t('envBlockEmpty')) : null,\n h('div', { style: { ...s.injectRow, marginTop: 6 } }, [\n h('input', {\n style: { ...s.input, flex: 1 },\n placeholder: t('envBlockAdd'),\n value: blockInput,\n onChange: (e: ChangeEvent<HTMLInputElement>) => setBlockInput(e.target.value),\n }),\n h('button', { style: s.mini, disabled: blockInput.trim() === '', onClick: addBlockEntry }, t('envBlockAddAction')),\n ]),\n h('details', { style: { marginTop: 6 } }, [\n h('summary', { style: { ...s.muted, cursor: 'pointer' } }, `${t('envVarsTitle')} (${inv?.variables?.length ?? 0})`),\n h('div', { style: { ...s.muted, marginTop: 4 } }, t('envVarsHint')),\n h('div', { style: { ...s.toolWrap, marginTop: 4 } }, (inv?.variables ?? []).map((varName) => h('span', { key: varName, style: s.toolChip }, `{{${varName}}}`))),\n ]),\n ]),\n h('div', { style: s.injectBox }, [\n h('div', { style: s.rowTitle }, t('resetTitle')),\n h('div', { style: s.muted }, t('resetHint')),\n h('div', { style: s.injectRow }, [\n h('button', { style: s.mini, onClick: () => {\n // \u4E8C\u6B21\u786E\u8BA4\uFF1A\u6E05\u7A7A\u4E0D\u53EF\u64A4\u9500\uFF0C\u5FC5\u987B\u660E\u786E\u70B9\u5934\u624D\u52A8\u624B\u3002\n if (window.confirm(t('resetConfirm'))) onReset()\n } }, t('resetAction')),\n ]),\n ]),\n ]),\n ])\n}\n", "/**\n * preset-io.ts \u2014\u2014 \u8DE8\u73AF\u5883\uFF08Tauri 2 \u684C\u9762 / Web\uFF09\u7684\u9884\u8BBE\u5BFC\u5165\u5BFC\u51FA\u9002\u914D\u5C42\u3002\n *\n * \u6D4F\u89C8\u5668\u7AEF\u6700\u521D\u8DD1\u5728\u666E\u901A\u7F51\u9875\u91CC\uFF1A\u5BFC\u51FA\u7528 Blob + <a download>\uFF0C\u5BFC\u5165\u7528\u9690\u85CF\u7684\n * <input type=\"file\"> + FileReader\u3002\u5BBF\u4E3B\u73B0\u5728\u53EF\u80FD\u5305\u5728 Tauri \u684C\u9762 WebView\n * \u91CC\uFF0C\u684C\u9762\u7AEF\u7684\u9884\u671F\u4EA4\u4E92\u662F\u300C\u539F\u751F\u4FDD\u5B58 / \u6253\u5F00\u5BF9\u8BDD\u6846 + \u771F\u5B9E\u6587\u4EF6\u8BFB\u5199\u300D\u3002\n *\n * \u672C\u6A21\u5757\u4FDD\u6301\u6587\u4EF6\u683C\u5F0F\u7EAF\u51C0\uFF08encode/decode \u4E3A\u7EAF\u51FD\u6570\uFF09\uFF0C\u628A\u771F\u6B63\u7684 I/O \u8DEF\u7531\u5230\n * \u4E00\u4E2A\u5C0F\u578B\u7684\u53EF\u6CE8\u5165 `PresetIoEnv`\uFF1A\n *\n * - Tauri v2\uFF1A\u901A\u8FC7 window.__TAURI_INTERNALS__.invoke \u8C03\u7528\u539F\u751F\u7684\n * `plugin:dialog|save` / `plugin:dialog|open` \u4E0E\n * `plugin:fs|write_text_file` / `plugin:fs|read_text_file` \u547D\u4EE4 \u2014\u2014 \u4F46\n * \u4EC5\u5F53\u5BBF\u4E3B\u5E94\u7528\u6CE8\u518C\u4E86 dialog / fs \u63D2\u4EF6\u3001\u4E14\u5176 capability ACL \u653E\u884C\u8FD9\u4E9B\n * \u547D\u4EE4\u65F6\u624D\u53EF\u7528\u3002\u4EFB\u4F55\u62D2\u7EDD\uFF08\u63D2\u4EF6\u672A\u6CE8\u518C\u3001ACL \"not allowed\"\uFF09\u90FD\u5F52\u4E3A\n * `unavailable`\uFF0C\u7531\u8C03\u7528\u65B9\u56DE\u9000\u5230 Web \u8DEF\u5F84 \u2014\u2014 \u6240\u4EE5\u5373\u4F7F Tauri \u5BBF\u4E3B\u5C1A\u672A\n * \u5E26 dialog/fs \u63D2\u4EF6\uFF0C\u672C\u63D2\u4EF6\u4E5F\u7167\u5E38\u5DE5\u4F5C\u3002\n * - Web\uFF08\u4EE5\u53CA tauri \u56DE\u9000\uFF09\uFF1ABlob + \u951A\u70B9\u4E0B\u8F7D / \u9690\u85CF\u6587\u4EF6\u8F93\u5165\uFF0C\u4E0E\u65E7\u884C\u4E3A\n * \u5B8C\u5168\u4E00\u81F4\u3002\u5728 WebView2 \u91CC\u951A\u70B9\u4E0B\u8F7D\u4F1A\u9000\u5316\u4E3A WebView \u9ED8\u8BA4\u7684\u4E0B\u8F7D\u5904\u7406\uFF0C\n * \u6587\u4EF6\u8F93\u5165\u4ECD\u4F1A\u6253\u5F00\u7CFB\u7EDF\u9009\u62E9\u5668\u3002\n *\n * \u672C\u6A21\u5757\u5728\u6A21\u5757\u4F5C\u7528\u57DF\u4E0D\u89E6\u78B0 DOM \u2014\u2014 \u6BCF\u4E2A\u5206\u652F\u90FD\u63A5\u53D7\u6CE8\u5165\u7684\u5047\u5B9E\u73B0 \u2014\u2014 \u56E0\u6B64\n * \u53EF\u4EE5\u5728 Node \u4E0B\u52A0\u8F7D\uFF0Cweb / tauri \u5DF2\u4FDD\u5B58 / tauri \u5DF2\u53D6\u6D88 / tauri \u4E0D\u53EF\u7528\n * \u7684\u6574\u4E2A\u77E9\u9635\u90FD\u80FD\u5355\u6D4B\u8986\u76D6\u3002\n */\nimport type { Preset } from './types.ts'\nimport { presetExportFilename } from './presets.ts'\n\n// \u2500\u2500 \u73AF\u5883\u68C0\u6D4B \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Tauri v2 \u539F\u59CB IPC \u6865\uFF08window.__TAURI_INTERNALS__\uFF09\u3002 */\nexport interface TauriInvoke {\n (cmd: string, args?: Record<string, unknown>, options?: unknown): Promise<unknown>\n}\n\n/** \u9875\u9762\u662F\u5426\u8FD0\u884C\u5728 Tauri\uFF08v1 \u6807\u8BB0\u6216 v2 \u6865\uFF09webview \u5185\u3002 */\nexport function isTauriEnv(win: unknown): boolean {\n if (win === null || win === undefined) return false\n const w = win as { __TAURI_INTERNALS__?: unknown; __TAURI__?: unknown }\n return w.__TAURI_INTERNALS__ !== undefined || w.__TAURI__ !== undefined\n}\n\n/** \u53D6\u53EF\u7528\u7684 Tauri v2 invoke \u6865\uFF1B\u4E0D\u53EF\u7528\u65F6\u8FD4\u56DE null\u3002 */\nfunction invokeOf(win: unknown): TauriInvoke | null {\n if (!isTauriEnv(win)) return null\n const internals = (win as { __TAURI_INTERNALS__?: { invoke?: unknown } }).__TAURI_INTERNALS__\n return internals && typeof internals.invoke === 'function' ? (internals.invoke as TauriInvoke) : null\n}\n\n// \u2500\u2500 \u539F\u751F\uFF08tauri\uFF09\u539F\u8BED \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type SaveOutcome = { kind: 'saved' } | { kind: 'cancelled' } | { kind: 'unavailable' }\nexport type OpenOutcome = { kind: 'text'; text: string } | { kind: 'cancelled' } | { kind: 'unavailable' }\n\nconst JSON_FILTERS = [{ name: 'JSON', extensions: ['json'] }]\n\n/**\n * \u539F\u751F\u4FDD\u5B58\u5BF9\u8BDD\u6846 + \u5199\u6587\u4EF6\u3002`cancelled` = \u7528\u6237\u5173\u95ED\u4E86\u5BF9\u8BDD\u6846\uFF08\u8C03\u7528\u65B9\u7EDD\u4E0D\n * \u5F97\u518D\u56DE\u9000\u5230\u4E0B\u8F7D\uFF09\uFF1B`unavailable` = \u5BBF\u4E3B\u65E0\u6CD5\u63D0\u4F9B dialog/fs \u63D2\u4EF6\uFF08\u63D2\u4EF6\n * \u7F3A\u5931\u6216\u88AB ACL \u62E6\u622A\uFF09\uFF0C\u8C03\u7528\u65B9\u5E94\u5F53\u56DE\u9000\u3002\n */\nexport async function tauriSaveText(invoke: TauriInvoke, defaultName: string, text: string): Promise<SaveOutcome> {\n try {\n const path = await invoke('plugin:dialog|save', { defaultPath: defaultName, filters: JSON_FILTERS })\n if (typeof path !== 'string' || path === '') return { kind: 'cancelled' }\n await invoke('plugin:fs|write_text_file', { path, contents: text })\n return { kind: 'saved' }\n } catch {\n return { kind: 'unavailable' }\n }\n}\n\n/** \u539F\u751F\u6253\u5F00\u5BF9\u8BDD\u6846 + \u8BFB\u6587\u4EF6\u3002`cancelled` = \u7528\u6237\u5173\u95ED\u4E86\u5BF9\u8BDD\u6846\u3002 */\nexport async function tauriOpenText(invoke: TauriInvoke): Promise<OpenOutcome> {\n try {\n const picked = await invoke('plugin:dialog|open', { multiple: false, directory: false, filters: JSON_FILTERS })\n const path = Array.isArray(picked) ? picked[0] : picked\n if (typeof path !== 'string' || path === '') return { kind: 'cancelled' }\n const text = await invoke('plugin:fs|read_text_file', { path })\n if (typeof text !== 'string') return { kind: 'unavailable' }\n return { kind: 'text', text }\n } catch {\n return { kind: 'unavailable' }\n }\n}\n\n// \u2500\u2500 Web \u56DE\u9000\u539F\u8BED \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u951A\u70B9\u4E0B\u8F7D\u7684\u76EE\u6807\u63A5\u53E3\uFF1B\u4F9D\u8D56\u5168\u90E8\u6CE8\u5165\u4EE5\u4FBF Node \u91CC\u4F2A\u9020\u3002 */\nexport interface BrowserDownloadTarget {\n makeAnchor(): { href: string; download: string; click(): void }\n makeBlob(text: string): unknown\n objectUrl(blob: unknown): string\n revoke(url: string): void\n}\n\n/** Web \u56DE\u9000\u5BFC\u51FA\uFF1ABlob + object URL + <a download> + revoke\u3002 */\nexport function webDownload(target: BrowserDownloadTarget, filename: string, text: string): void {\n const blob = target.makeBlob(text)\n const url = target.objectUrl(blob)\n const anchor = target.makeAnchor()\n anchor.href = url\n anchor.download = filename\n anchor.click()\n target.revoke(url)\n}\n\n/** FileReader \u5F62\u72B6\u7684\u8BFB\u53D6\u5668\uFF08\u6D4F\u89C8\u5668\u6CE8\u5165\u771F FileReader\uFF0C\u6D4B\u8BD5\u6CE8\u5165\u5047\u5B9E\u73B0\uFF09\u3002\n * \u56DE\u8C03\u7C7B\u578B\u5E26\u53EF\u9009\u7684\u4E8B\u4EF6\u53C2\u6570\uFF0C\u8BA9 DOM FileReader \u7684\n * `(this: FileReader, ev: ProgressEvent) => any` \u5904\u7406\u5668\u80FD\u5E72\u51C0\u8D4B\u503C\u3002 */\nexport interface FileReaderLike {\n readAsText(file: unknown): void\n onload: ((ev?: unknown) => void) | null\n onerror: ((ev?: unknown) => void) | null\n result: string | ArrayBuffer | null\n}\n\n/** Web \u56DE\u9000\u5BFC\u5165\uFF1A\u7ECF FileReader \u5F62\u72B6\u7684\u8BFB\u53D6\u5668\u89E3\u6790\u6240\u9009\u6587\u4EF6\u7684\u6587\u672C\u3002 */\nexport function readPickedFile(reader: FileReaderLike, file: unknown): Promise<string> {\n return new Promise((resolve, reject) => {\n reader.onload = () => {\n const r = reader.result\n resolve(typeof r === 'string' ? r : String(r ?? ''))\n }\n reader.onerror = () => reject(new Error('FREAD'))\n reader.readAsText(file)\n })\n}\n\n// \u2500\u2500 \u7EAF\u6587\u4EF6\u683C\u5F0F \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u628A\u5355\u4E2A\u9884\u8BBE\u7F16\u7801\u4E3A\u5BFC\u51FA\u6587\u4EF6\u7684 JSON \u683C\u5F0F\uFF08\u5355\u5BF9\u8C61\u683C\u5F0F\uFF09\u3002`envBlocklist`\n * \u662F\u5168\u5C40\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\u7684\u968F\u884C\u5FEB\u7167\uFF1A\u5BFC\u5165\u7AEF\u6309\u5E76\u96C6\u5E76\u5165\uFF08\u89C1 PresetsTab\uFF09\u3002 */\nexport function encodePresetExport(preset: Preset, envBlocklist?: string[]): string {\n return JSON.stringify({ name: preset.name, data: preset.data, ...(Array.isArray(envBlocklist) ? { envBlocklist } : {}) }, null, 2)\n}\n\n/**\n * \u89E3\u6790\u5BFC\u51FA\u7684\u9884\u8BBE\u6587\u4EF6\uFF1A\u5355\u4E2A { name, data } \u5BF9\u8C61\u6216\u5BF9\u8C61\u6570\u7EC4\u3002\u7A7A\u5185\u5BB9 /\n * \u975E\u6CD5 JSON \u629B\u666E\u901A Error\uFF0C\u7531\u8C03\u7528\u65B9\u7ED9\u51FA\u53CB\u597D\u63D0\u793A\uFF1B\u6761\u76EE\u7EA7\u7684\u8FC7\u6EE4\u5728\n * addImportedPresets \u91CC\u8FDB\u884C\u3002\n */\nexport function decodePresetExport(text: string): unknown {\n const trimmed = String(text).trim()\n if (trimmed === '') throw new Error('EMPTY_EXPORT')\n return JSON.parse(trimmed)\n}\n\n// \u2500\u2500 \u73AF\u5883\u95E8\u9762 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** \u8C03\u7528\u65B9\uFF08UI \u6216\u6D4B\u8BD5\uFF09\u9A71\u52A8\u7684 I/O \u9762\u3002 */\nexport interface PresetIoEnv {\n readonly tauri: boolean\n saveText(defaultName: string, text: string): Promise<SaveOutcome>\n openText(): Promise<OpenOutcome>\n download(name: string, text: string): void\n}\n\nfunction browserDownloadTarget(): BrowserDownloadTarget {\n const g = globalThis as { document?: Document; URL?: { createObjectURL(b: Blob): string; revokeObjectURL(u: string): void } }\n const doc = g.document!\n const url = g.URL!\n return {\n makeAnchor: () => doc.createElement('a'),\n makeBlob: (text) => new Blob([text], { type: 'application/json' }),\n objectUrl: (blob) => url.createObjectURL(blob as Blob),\n revoke: (u) => url.revokeObjectURL(u),\n }\n}\n\n/** \u4E3A\u5F53\u524D window \u6784\u5EFA\u771F\u5B9E\u73AF\u5883\uFF08\u5728 Node \u91CC\u8C03\u7528\u4E5F\u5B89\u5168\uFF09\u3002 */\nexport function makeIoEnv(win?: unknown): PresetIoEnv {\n const w = win !== undefined ? win : typeof window !== 'undefined' ? window : undefined\n const invoke = invokeOf(w)\n const tauri = invoke !== null\n return {\n tauri,\n saveText: (name, text) => (tauri ? tauriSaveText(invoke!, name, text) : Promise.resolve({ kind: 'unavailable' })),\n openText: () => (tauri ? tauriOpenText(invoke!) : Promise.resolve({ kind: 'unavailable' })),\n download: (name, text) => webDownload(browserDownloadTarget(), name, text),\n }\n}\n\nexport type ExportResult = { ok: boolean; via: 'tauri' | 'browser'; cancelled?: boolean; message?: string }\n\n/**\n * \u5BFC\u51FA\u4E00\u4E2A\u9884\u8BBE\uFF1A\u5BBF\u4E3B\u80FD\u63D0\u4F9B\u539F\u751F\u5BF9\u8BDD\u6846\u65F6\u8D70 tauri \u4FDD\u5B58\uFF08cancelled = \u7528\u6237\n * \u62D2\u7EDD\uFF0C\u7EDD\u4E0D\u56DE\u9000\u4E0B\u8F7D\uFF09\uFF1B\u5426\u5219\u8D70 Web \u4E0B\u8F7D\u3002\n */\nexport async function exportPresetFile(preset: Preset, io?: PresetIoEnv, envBlocklist?: string[]): Promise<ExportResult> {\n const env = io ?? makeIoEnv()\n try {\n const text = encodePresetExport(preset, envBlocklist)\n const filename = presetExportFilename(preset.name)\n if (env.tauri) {\n const out = await env.saveText(filename, text)\n if (out.kind === 'saved') return { ok: true, via: 'tauri' }\n if (out.kind === 'cancelled') return { ok: false, via: 'tauri', cancelled: true }\n // unavailable -> \u7EE7\u7EED\u8D70 Web \u4E0B\u8F7D\n }\n env.download(filename, text)\n return { ok: true, via: 'browser' }\n } catch (e) {\n return { ok: false, via: 'browser', message: e instanceof Error ? e.message : String(e) }\n }\n}\n\nexport type ImportResult = { kind: 'text'; text: string; via: 'tauri' } | { kind: 'cancelled' } | { kind: 'unavailable' }\n\n/**\n * \u7ECF\u539F\u751F tauri \u6253\u5F00\u5BF9\u8BDD\u6846\u5BFC\u5165\u4E00\u4E2A\u9884\u8BBE\uFF1B\u8FD4\u56DE `unavailable` \u65F6\u7531\u8C03\u7528\u65B9\n * \u70B9\u51FB\u81EA\u5DF1\u7684\u9690\u85CF\u6587\u4EF6\u8F93\u5165\uFF08Web \u56DE\u9000\uFF09\u3002\n */\nexport async function importPresetFile(io?: PresetIoEnv): Promise<ImportResult> {\n const env = io ?? makeIoEnv()\n try {\n if (env.tauri) {\n const out = await env.openText()\n if (out.kind === 'text') return { kind: 'text', text: out.text, via: 'tauri' }\n if (out.kind === 'cancelled') return { kind: 'cancelled' }\n }\n } catch {\n /* \u843D\u5230\u4E0B\u9762\u7684\u9009\u62E9\u5668\u56DE\u9000 */\n }\n return { kind: 'unavailable' }\n}\n", "/**\n * PreviewPane \u2014 \u72EC\u7ACB\u9762\u677F\u7684\u53F3\u680F\uFF08\u63D0\u793A\u8BCD / \u5DE5\u5177\u6A21\u5F0F\u5E38\u9A7B\uFF09\u3002\n *\n * \u53EA\u8BFB\u9884\u89C8\uFF0C\u6CA1\u6709\u4EFB\u4F55\u5207\u6362\u63A7\u4EF6\uFF1A\u770B\u63D0\u793A\u8BCD\u8FD8\u662F\u5DE5\u5177\u7531\u9876\u90E8\u6A21\u5F0F\u51B3\u5B9A\uFF08\u9009\u300C\u63D0\u793A\u8BCD\u300D\n * = \u63D0\u793A\u8BCD\u7F16\u8F91 + \u63D0\u793A\u8BCD\u9884\u89C8\uFF1B\u9009\u300C\u5DE5\u5177\u300D= \u5DE5\u5177\u7F16\u8F91 + \u5DE5\u5177\u9884\u89C8\uFF09\uFF0C\u9636\u6BB5\u7531\u5934\u90E8\n * \u7684\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u63A7\u5236\uFF08\u4E0E\u5DE6\u680F\u8054\u52A8\uFF09\u3002\u6570\u636E\u6765\u81EA Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\uFF0C\n * \u7F16\u8F91\u8349\u7A3F\u540E\u7531 Panel \u9632\u6296\u53E0\u52A0\u540C\u6B65 \u2014\u2014 \u6240\u89C1\u5373\u6A21\u578B\u6240\u89C1\u3002\u672C\u89C6\u56FE\u7EDD\u4E0D\u4FEE\u6539\u914D\u7F6E\u3002\n */\nimport { createElement as h, type ReactElement } from 'react'\nimport type { PhaseViewKey, Preview } from './types.ts'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\nimport { PreviewTools } from './PreviewTools.tsx'\n\n/** Panel \u5E76\u884C\u62C9\u53D6\u7684\u4E09\u9636\u6BB5\u88C5\u914D\u3002 */\ntype PhaseViews = Record<PhaseViewKey, Preview | null>\n\nexport function PreviewPane({ t, phases, phase, sub }: {\n t: Translate\n phases: PhaseViews | null\n /** \u5F53\u524D\u9636\u6BB5\uFF08\u72B6\u6001\u5728 Panel \u6301\u6709\uFF0C\u5934\u90E8\u9636\u6BB5\u6309\u94AE\u7EDF\u4E00\u5207\u6362\uFF09\u3002 */\n phase: PhaseViewKey\n /** \u63D0\u793A\u8BCD / \u5DE5\u5177\u5B50\u89C6\u56FE\uFF1A\u8DDF\u968F\u9876\u90E8\u6A21\u5F0F\uFF08\u65E0\u624B\u52A8\u5207\u6362\uFF09\u3002 */\n sub: 'prompt' | 'tools'\n}): ReactElement {\n const data = phases?.[phase] ?? null\n // \u6309\u5F53\u524D\u6240\u9009\u9636\u6BB5\u5224\u5B9A\u300C\u6BB5\u7EA7\u5B9A\u5236\u6CA1\u8FDB\u6700\u7EC8\u63D0\u793A\u8BCD\u300D\uFF1A\u6709 complete \u6BB5\u6574\u6BB5\u63A5\u7BA1\u5C31\u8BF4\n // \u63A5\u7BA1\uFF0C\u5426\u5219\u63A2\u6D4B\u672C\u63D2\u4EF6\u4EA7\u51FA\u7684\u6BB5\u662F\u5426\u88AB\u4E0B\u6E38\u4E22\u5F03\uFF08\u4E22\u5F03\u89C4\u5219\u4E0D\u6B62\u4E00\u79CD\uFF09\u3002\n const lossNote = data === null || data === undefined ? null\n : data.takenOverBy !== undefined\n ? t('sectionsTakenOver', { name: data.takenOverBy })\n : data.lostSections !== undefined\n ? t('sectionsLost', { emitted: data.lostSections.emitted, survived: data.lostSections.survived })\n : null\n\n return h('div', { style: s.colRight }, [\n h('div', { style: s.colRightScroll }, [\n // \u8BE5\u9636\u6BB5\u7684\u672C\u63D2\u4EF6\u6BB5\u7EA7\u4EA7\u51FA\u6CA1\u8FDB\u6700\u7EC8\u63D0\u793A\u8BCD\uFF08\u6574\u6BB5\u63A5\u7BA1\u6216\u88AB\u4E0B\u6E38\u4E22\u5F03\uFF09\u3002\n lossNote !== null ? h('div', { style: s.noticeWarn }, lossNote) : null,\n // scope \u6302\u8F7D\u5931\u8D25\u56DE\u9000\u5168\u5C40\u5C42\u65F6\u660E\u786E\u8B66\u793A\uFF1A\u8FD9\u4E0D\u662F\u8BE5\u9884\u8BBE\u7684\u539F\u751F\u88C5\u914D\u3002\n data !== null && data.scopeResolved === false\n ? h('div', { style: s.noticeWarn }, t('scopeFallback'))\n : null,\n phases === null ? h('div', { style: s.muted }, t('loading')) : null,\n phases !== null && data === null\n ? h('div', { style: s.error }, t('previewFail'))\n : null,\n data ? h('div', { style: s.muted }, t('previewPreset')) : null,\n data?.diagnostics?.length ? h('div', { style: s.noticeWarn }, t('previewUnresolved', {\n names: [...new Set(data.diagnostics.map(item => `{{${item.variable}}}`))].join(', '),\n })) : null,\n sub === 'prompt'\n ? data\n ? [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.muted }, t('previewHint')),\n h('span', { style: s.orderTag }, `${data.sections.length} ${t('previewSections')}`),\n ]),\n h('pre', { style: s.previewText }, data.text || t('empty')),\n h('div', { style: s.rowTitle }, t('runtimeContexts')),\n ...(data.contexts ?? []).map(context => h('div', { key: context.name }, [\n h('div', { style: s.muted }, context.name),\n h('pre', { style: s.previewText }, context.text || t('empty')),\n ])),\n ]\n : null\n : data\n ? [\n // \u6A21\u578B\u89C6\u89D2 vs \u6CE8\u518C\u8868\u89C6\u89D2\u7684\u5BF9\u7167\uFF1A\u9884\u89C8\u6309\u6240\u9009\u9636\u6BB5\u8FD0\u884C\u5168\u90E8\u88C5\u914D\u89C4\u5219\n //\uFF08\u542B\u9884\u8BBE\u539F\u751F\u7684\u9636\u6BB5\u88C1\u526A\uFF09\uFF0C\u67D0\u4E9B\u9884\u8BBE\uFF08\u5982 PTC / Code Mode\uFF09\u4F1A\u628A\n // \u5B8C\u6574\u76EE\u5F55\u5305\u88C5\u6210\u5355\u4E00\u5DE5\u5177\uFF0C\u6CE8\u518C\u8868\u539F\u59CB\u76EE\u5F55\u4ECD\u5217\u5728\u5DE5\u5177\u5B50\u89C6\u56FE\u3002\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.muted }, t('previewToolsHint')),\n h('span', { style: s.orderTag },\n `${data.tools.length} / ${data.registryTotal ?? '?'} ${t('previewToolsCount')}`),\n ]),\n h(PreviewTools, { tools: data.tools, t }),\n ]\n : null,\n ]),\n ])\n}\n", "/** \u5DE5\u5177\u9884\u89C8\uFF1A\u5F53\u524D\u5B9A\u5236\uFF08\u9ED1\u540D\u5355\u8FC7\u6EE4\u4E4B\u540E\uFF09\u6700\u7EC8\u5BF9\u6A21\u578B\u53EF\u89C1\u7684\u5DE5\u5177\u76EE\u5F55\uFF0C\n * \u53EA\u8BFB\u3001\u6E05\u5355\u5F0F\u5448\u73B0\uFF1A\u5217\u51FA\u5373\u4EE3\u8868\u6A21\u578B\u770B\u5F97\u89C1 \u2014\u2014 \u8FD9\u91CC\u6CA1\u6709\u300C\u5DF2\u5C4F\u853D\u300D\u72B6\u6001\u3002\n * \u672C\u89C6\u56FE\u7EDD\u4E0D\u4FEE\u6539\u9ED1\u540D\u5355\u914D\u7F6E\u3002 */\nimport { createElement as h, type ReactElement } from 'react'\nimport type { Translate } from './locales.ts'\nimport { s } from './styles.ts'\n\n/** \u9884\u89C8\u5DE5\u5177\u6761\u76EE\uFF1A\u5BF9\u8C61\u5F62\u6001\u6216\u7EAF\u5B57\u7B26\u4E32\u5DE5\u5177\u540D\uFF08\u7EDF\u4E00\u5F52\u4E00\u5316\u4E3A\u5BF9\u8C61\uFF09\u3002 */\nexport type PreviewTool = { name: string; description: string } | string\n\n/** \u628A\u5B57\u7B26\u4E32\u5F62\u6001\u7684\u6761\u76EE\u8865\u5168\u4E3A { name, description: '' }\u3002 */\n\nfunction norm(tool: PreviewTool): { name: string; description: string } {\n return typeof tool === 'string' ? { name: tool, description: '' } : tool\n}\n\nexport function PreviewTools({ tools, t }: { tools: PreviewTool[]; t: Translate }): ReactElement {\n if (tools.length === 0) return h('div', { style: s.muted }, t('empty'))\n return h('div', { style: s.list }, [\n h('div', { style: s.rowTitle }, [\n h('span', { style: s.orderTag }, `${tools.length} ${t('previewToolCount')}`),\n ]),\n tools.map((tool) => {\n const { name, description } = norm(tool)\n return h('div', { key: name, style: s.row }, [\n h('div', { style: s.rowBody }, [\n h('div', { style: s.rowTitle }, h('span', { style: s.code }, name)),\n h('div', { style: s.preview }, String(description ?? '').slice(0, 140)),\n ]),\n ])\n }),\n ])\n}\n", "/** Locale dictionaries for the prompt-customizer panel. */\nexport const DICT = {\n zh: {\n nav: '\u63D0\u793A\u8BCD\u5B9A\u5236',\n previewPreset: '\u6765\u6E90\uFF1A\u5F53\u524D\u6A21\u5F0F\u9884\u8BBE\u3002\u63D0\u793A\u8BCD\u3001\u5DE5\u5177\u53CA\u987A\u5E8F\u6309\u6B64\u9884\u8BBE\u72EC\u7ACB\u88C5\u914D\uFF0C\u4E0D\u5339\u914D\u6216\u66F4\u6539\u5DF2\u6709\u5BF9\u8BDD\u3002',\n previewUnresolved: '\u4F1A\u8BDD\u53D8\u91CF {names} \u5C1A\u672A\u7ED1\u5B9A\uFF0C\u4FDD\u7559\u6A21\u677F\u5F15\u7528\uFF1B\u63D0\u793A\u8BCD\u4E0E\u5DE5\u5177\u76EE\u5F55\u4ECD\u53EF\u67E5\u770B\u548C\u7F16\u8F91\u3002',\n runtimeContexts: '\u8FD0\u884C\u65F6\u4E0A\u4E0B\u6587\uFF08user-role \u5FEB\u7167\uFF0C\u53EA\u8BFB\uFF0C\u4E0D\u5C5E\u4E8E system \u63D0\u793A\u8BCD\u6BB5\uFF09',\n loading: '\u52A0\u8F7D\u4E2D\u2026',\n unavailable: '\u5F53\u524D\u73AF\u5883\u672A\u542F\u7528\u672C\u547D\u540D\u7A7A\u95F4\u3002',\n tabsSections: '\u63D0\u793A\u8BCD',\n tabsTools: '\u5DE5\u5177',\n tabsPresets: '\u914D\u7F6E',\n tabsPreview: '\u9884\u89C8',\n refresh: '\u5237\u65B0',\n blockedOff: '\u672A\u5C4F\u853D',\n blockedOn: '\u5DF2\u5C4F\u853D',\n replaced: '\u5DF2\u66FF\u6362',\n manual: '\u624B\u52A8',\n system: '\u7CFB\u7EDF',\n replace: '\u7F16\u8F91',\n clearReplace: '\u6E05\u9664',\n clearInput: '\u6E05\u7A7A',\n injectNew: '\u6CE8\u5165\u65B0\u6BB5',\n name: '\u540D\u79F0',\n order: '\u987A\u5E8F',\n text: '\u6587\u672C',\n add: '\u6DFB\u52A0',\n hiddenOff: '\u53EF\u89C1',\n hiddenOn: '\u5DF2\u9690\u85CF',\n selectAll: '\u5168\u9009',\n selectNone: '\u5168\u4E0D\u9009',\n empty: '\uFF08\u7A7A\uFF09',\n dynamic: '<\u52A8\u6001\u751F\u6210>',\n drag: '\u62D6\u52A8\u6392\u5E8F',\n moveUp: '\u4E0A\u79FB',\n moveDown: '\u4E0B\u79FB',\n previewHint: '\u4EE5\u4E0B\u4E3A\u5C4F\u853D/\u66FF\u6362/\u6CE8\u5165\u540E\u7684\u6700\u7EC8\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF1A',\n previewPrompt: '\u63D0\u793A\u8BCD\u9884\u89C8',\n previewSections: '\u6BB5',\n previewTools: '\u5DE5\u5177\u9884\u89C8',\n previewToolCount: '\u4E2A\u5DE5\u5177',\n savePreset: '\u4FDD\u5B58\u5F53\u524D\u914D\u7F6E',\n presetName: '\u914D\u7F6E\u540D\u79F0',\n saveAsPresetCard: '\u5B58\u4E3A agent \u9884\u8BBE',\n saveAsPresetHint: '\u6574\u4F53\u590D\u5236\u300C{name}\u300D\u8FD9\u4E2A\u9884\u8BBE\u7684\u7EC4\u6210\u4E3A\u65B0\u9884\u8BBE\uFF08\u7EC4\u6210\u6587\u4EF6\u4E0E\u4F34\u751F\u811A\u672C\u4E00\u5E76\u5E26\u8D70\uFF09\uFF0C\u518D\u628A\u5F53\u524D\u5B9A\u5236\u5199\u8FDB\u5B83\u7684\u8986\u76D6\u9879 \u2014\u2014 \u65B0\u9884\u8BBE\u51FA\u73B0\u5728\u9876\u90E8\u7F16\u8F91\u76EE\u6807\u91CC\u3002',\n agentPresetName: '\u65B0\u9884\u8BBE\u540D',\n forkSourceDefault: '\u9ED8\u8BA4\u9884\u8BBE',\n saveAsPresetOk: '\u9884\u8BBE\u5DF2\u521B\u5EFA\uFF0C\u53EF\u5728\u9876\u90E8\u7684\u7F16\u8F91\u76EE\u6807\u9009\u62E9\u5668\u91CC\u9009\u5230\u5B83',\n saveAsPresetFail: '\u4FDD\u5B58\u9884\u8BBE\u5931\u8D25',\n save: '\u4FDD\u5B58',\n importPreset: '\u5BFC\u5165\u914D\u7F6E',\n import: '\u5BFC\u5165',\n apply: '\u5E94\u7528',\n export: '\u5BFC\u51FA',\n delete: '\u5220\u9664',\n restore: '\u8FD8\u539F',\n active: '\u4F7F\u7528\u4E2D',\n preset: '\u9884\u8BBE',\n ioFailed: '\u5BFC\u5165/\u5BFC\u51FA\u5931\u8D25',\n importInvalid: '\u65E0\u6548\u7684\u914D\u7F6E\u6587\u4EF6',\n targetGlobal: '\u76EE\u6807\uFF1A\u5168\u5C40\u9ED8\u8BA4',\n targetHint: '\u9009\u62E9\u8981\u5B9A\u5236\u7684 agent \u9884\u8BBE \u2014\u2014 \u63D0\u793A\u8BCD\u5FC5\u987B\u6309\u5177\u4F53\u9884\u8BBE\u4FEE\u6539\uFF1A\u672A\u5B9A\u5236\u7684\u5B57\u6BB5 = \u5B98\u65B9\u9ED8\u8BA4\uFF0C\u6539\u52A8\u53EA\u5BF9\u8BE5\u9884\u8BBE\u751F\u6548\uFF080.9.0 \u8D77\u300C\u5168\u90E8 Agent\u300D\u5168\u5C40\u5C42\u5DF2\u505C\u7528\uFF09\u3002',\n syncAllPhases: '\u4E09\u6001\u540C\u6B65',\n syncAllPhasesHint: '\u52FE\u9009\u540E\u4E09\u4E2A\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u6BB5\u5217\u8868\uFF08\u5E38\u9A7B\u671F\u4E3A\u9AA8\u67B6\uFF0C\u5176\u4F59\u4E24\u6001\u72EC\u6709\u7684\u6BB5\u8FFD\u52A0\u5728\u5C3E\u90E8\uFF0C\u540C\u540D\u6BB5\u4EE5\u539F\u751F\u90A3\u9636\u6BB5\u4E3A\u51C6\uFF09\uFF0C\u589E\u5220 / \u6392\u5E8F / \u52FE\u9009 / \u6587\u672C\u7F16\u8F91\u4E00\u6B21\u5199\u5168\u4E09\u4E2A\u9636\u6BB5\uFF1B\u52FE\u9009\u77AC\u95F4\u5373\u6309\u5E38\u9A7B\u671F\u8986\u5199\u53E6\u5916\u4E24\u6001\uFF08\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF0C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF09\u3002\u5DE5\u5177\u680F\u7684\u9690\u85CF / \u663E\u793A\u4E0E\u52A0\u56DE\u540C\u6837\u5BF9\u4E09\u6001\u4E00\u8D77\u751F\u6548\u3002\u9ED8\u8BA4\u5173\u95ED\uFF1A\u4E09\u4E2A\u9636\u6BB5\u5404\u7BA1\u5404\u7684\u3002',\n syncApplied: '\u5DF2\u6309\u5E38\u9A7B\u671F\u8986\u5199\u53E6\u5916\u4E24\u6001\uFF1A\u4E09\u9636\u6BB5\u5171\u7528\u540C\u4E00\u4EFD\u6BB5\u5217\u8868\u4E0E\u6587\u672C\uFF08\u5199\u5165\u8349\u7A3F\uFF0C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF09\u3002',\n syncNotReady: '\u4E09\u9636\u6BB5\u88C5\u914D\u672A\u5C31\u7EEA\uFF08\u6216\u4E3A\u7A7A\uFF09\uFF0C\u65E0\u6CD5\u6267\u884C\u4E09\u6001\u540C\u6B65 \u2014\u2014 \u8BF7\u70B9\u300C\u5237\u65B0\u300D\u91CD\u8BD5\u3002',\n syncSkippedDynamic: '\u300C{names}\u300D\u662F\u8FD0\u884C\u65F6\u52A8\u6001\u6BB5\uFF0C\u65E0\u6CD5\u52A0\u5165\u5176\u5B83\u9636\u6BB5\uFF08\u5B83\u7684\u5185\u5BB9\u53EA\u6709\u88C5\u914D\u65F6\u624D\u77E5\u9053\uFF09\u3002',\n broken: '\u635F\u574F',\n brokenPreset: '\u8BE5 agent \u9884\u8BBE\u5F53\u524D\u65E0\u6CD5\u6302\u8F7D\uFF0C\u4ECD\u53EF\u7F16\u8F91\u5176\u5B9A\u5236\uFF08\u4FEE\u590D\u9884\u8BBE\u540E\u81EA\u52A8\u751F\u6548\uFF09\u3002',\n phaseBootstrap: '\u4EC5\u5F15\u5BFC\u9636\u6BB5',\n phaseActive: '\u664B\u7EA7\u540E',\n phaseCompaction: '\u538B\u7F29\u540E',\n // agent \u5468\u671F\u4E09\u9636\u6BB5\u7684\u5C55\u793A\u547D\u540D\uFF08\u5F15\u5BFC\u671F \u2192 \u5E38\u9A7B\u671F \u2192 \u538B\u7F29\u53D7\u63A7\u671F\uFF09\u3002\n phaseStageGuide: '\u5F15\u5BFC\u671F',\n phaseStageResident: '\u5E38\u9A7B\u671F',\n phaseStageControlled: '\u538B\u7F29\u53D7\u63A7\u671F',\n toolsPartGuide: '\u5F15\u5BFC\u671F\u5DE5\u5177',\n toolsPartResident: '\u5E38\u9A7B\u671F\u5DE5\u5177',\n toolsPartControlled: '\u538B\u7F29\u53D7\u63A7\u671F\u5DE5\u5177',\n allToolsTitle: '\u672C\u7CFB\u7EDF\u5168\u90E8\u5DE5\u5177',\n sectionsPartGuide: '\u5F15\u5BFC\u671F\u63D0\u793A\u8BCD',\n sectionsPartResident: '\u5E38\u9A7B\u671F\u63D0\u793A\u8BCD',\n sectionsPartControlled: '\u538B\u7F29\u53D7\u63A7\u671F\u63D0\u793A\u8BCD',\n allSectionsTitle: '\u672C\u7CFB\u7EDF\u5168\u90E8\u63D0\u793A\u8BCD',\n toolsFourHint: '\u4E09\u4E2A\u9636\u6BB5\u5404\u4E00\u4EFD\u540D\u5355\uFF0C\u4E92\u4E0D\u7EE7\u627F\uFF1A\u52FE\u9009 = \u8BE5\u9636\u6BB5\u662F\u5426\u5BF9\u6A21\u578B\u53EF\u89C1\uFF1B\u4ECE\u300C\u5168\u90E8\u300D\u62D6\u5165\u67D0\u9636\u6BB5 = \u8BA9\u8FD9\u4E00\u4E2A\u5DE5\u5177\u5728\u8BE5\u9636\u6BB5\u51FA\u73B0\uFF08\u82E5\u8BE5\u9636\u6BB5\u9ED8\u8BA4\u88C1\u6389\u4E86\u5B83\uFF0C\u5C31\u52A0\u56DE\u53BB\uFF09\uFF1B\u5728\u4E24\u4E2A\u9636\u6BB5\u4E4B\u95F4\u62D6\u52A8\uFF08\u62D6\u5230\u4E0A\u65B9\u9636\u6BB5\u6309\u94AE\uFF09= \u590D\u5236\uFF08\u6E90\u9636\u6BB5\u4E0D\u52A8\uFF0C\u76EE\u6807\u9636\u6BB5\u591A\u4E00\u4EFD\uFF0C\u9690\u85CF/\u542F\u7528\u72B6\u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\uFF09\uFF1B\u62D6\u56DE\u300C\u5168\u90E8\u300D= \u4ECE\u8BE5\u9636\u6BB5\u62FF\u6389\u5B83\u3002\u6BCF\u4E2A\u52A8\u4F5C\u53EA\u5F71\u54CD\u88AB\u62D6\u7684\u90A3\u4E00\u4E2A\u5DE5\u5177\u3002',\n sectionsFourHint: '\u62D6\u62FD\u53CC\u5411\uFF1A\u628A\u300C\u5168\u90E8\u300D\u91CC\u7684\u6BB5\u62D6\u8FDB\u4E0A\u65B9\u5217\u8868 = \u52A0\u5165\u8BE5\u9636\u6BB5\u5E76\u9ED8\u8BA4\u5F00\u542F\uFF1B\u4ECE\u9636\u6BB5\u62D6\u56DE\u300C\u5168\u90E8\u300D= \u4ECE\u8BE5\u9636\u6BB5\u79FB\u9664\uFF08\u539F\u751F\u6BB5\u8F6C\u4E3A\u5C4F\u853D\uFF09\u3002\u540C\u4E00\u4E2A\u9636\u6BB5\u91CC\u62D6\u52A8\u884C\u6293\u624B = \u6392\u5E8F\uFF1B\u62D6\u5230\u4E0A\u65B9\u7684\u9636\u6BB5\u6309\u94AE = \u590D\u5236\u5230\u90A3\u4E2A\u9636\u6BB5\u3002\u5C4F\u853D\u6BB5\u4E0E\u666E\u901A\u6BB5\u5B8C\u5168\u4E00\u6837\u53EF\u62D6\u62FD / \u7F16\u8F91\uFF0C\u53EA\u662F\u4E0D\u6CE8\u5165\u6A21\u578B\u3002',\n dragHint: '\u62D6\u5165 = \u8BA9\u8BE5\u5DE5\u5177\u5728\u8FD9\u4E2A\u9636\u6BB5\u51FA\u73B0',\n poolMarksHint: '\u6BCF\u4E2A\u540D\u5B57\u540E\u7684\u4E09\u4E2A\u6807\u8BB0 = \u8BE5\u5DE5\u5177\u5728\u5F15\u5BFC\u671F / \u5E38\u9A7B\u671F / \u538B\u7F29\u53D7\u63A7\u671F\u7684\u72B6\u6001\uFF1A\u7EFF=\u8BE5\u9636\u6BB5\u53EF\u89C1\uFF08\u6216\u5DF2\u52A0\u56DE\uFF09\uFF0C\u7070=\u8BE5\u9636\u6BB5\u5DF2\u9690\u85CF\uFF0C\u6697=\u4E0D\u5728\u8BE5\u9636\u6BB5\u3001\u4E5F\u6CA1\u52A0\u56DE\u3002',\n toolAddedTag: '\u52A0\u56DE',\n toolAdded: '\u5DF2\u628A\u300C{name}\u300D\u52A0\u56DE{phase}\uFF1A\u8BE5\u9636\u6BB5\u9ED8\u8BA4\u88C1\u6389\u4E86\u5B83\uFF0C\u4FDD\u5B58\u540E\u5B83\u4F1A\u91CD\u65B0\u51FA\u73B0\u5728\u8BE5\u9636\u6BB5\uFF08\u5F53\u524D\u9884\u8BBE\u6CE8\u518C\u8868\u91CC\u6709\u5B83\uFF09\u3002',\n toolNotInRegistry: '\u300C{name}\u300D\u4E0D\u5728\u672C\u9884\u8BBE\u7684\u6CE8\u518C\u8868\u91CC\uFF08\u5B83\u662F\u522B\u7684\u9884\u8BBE\u72EC\u6709\u7684\u5DE5\u5177\uFF09\uFF0C\u5F53\u524D\u9884\u8BBE\u6CA1\u6709\u5B83\u7684\u5B9A\u4E49\uFF0C\u52A0\u4E0D\u8FDB\u6765\u3002',\n toolCopied: '\u5DF2\u628A\u300C{name}\u300D\u590D\u5236\u5230{to}\uFF1A{from}\u90A3\u4EFD\u4FDD\u6301\u4E0D\u52A8\uFF0C\u9690\u85CF/\u542F\u7528\u72B6\u6001\u4E00\u8D77\u5E26\u8FC7\u53BB\u3002',\n toolRemovedFromPhase: '\u5DF2\u628A\u300C{name}\u300D\u4ECE{from}\u62FF\u6389\uFF1A\u5DF2\u52A0\u56DE\u7684\u64A4\u9500\u52A0\u56DE\uFF0C\u539F\u751F\u5DE5\u5177\u5219\u5728\u8BE5\u9636\u6BB5\u9690\u85CF\uFF08\u4ECD\u53EF\u5728\u8FD9\u91CC\u53CD\u9009\u56DE\u6765\uFF09\u3002',\n sectionCopied: '\u5DF2\u628A\u300C{name}\u300D\u590D\u5236\u5230{to}\uFF08\u6E90{from}\u4FDD\u6301\u4E0D\u52A8\uFF09\uFF1A\u65B0\u9636\u6BB5\u91CC\u5B83\u662F\u5F00\u542F\u7684\uFF0C\u53EF\u7EE7\u7EED\u7F16\u8F91\u6587\u672C\u6216\u62D6\u52A8\u6392\u5E8F\u3002',\n sectionRemoved: '\u5DF2\u628A\u300C{name}\u300D\u4ECE{from}\u62FF\u6389\uFF1A\u65B0\u52A0\u5165\u7684\u64A4\u9500\u52A0\u5165\uFF0C\u539F\u751F\u6BB5\u5219\u8F6C\u4E3A\u5C4F\u853D\uFF08\u53EF\u52FE\u9009\u56DE\u6765\uFF09\u3002',\n toolShown: '\u300C{name}\u300D\u5DF2\u5728{to}\u663E\u793A\u3002',\n toolHiddenIn: '\u300C{name}\u300D\u5DF2\u5728{to}\u9690\u85CF\u3002',\n toolSyncShown: '\u300C{name}\u300D\u5DF2\u5728\u4E09\u4E2A\u9636\u6BB5\u663E\u793A\uFF08\u8BE5\u9636\u6BB5\u76EE\u5F55\u91CC\u6CA1\u6709\u7684\u5DF2\u5199\u8FDB\u5404\u81EA\u7684\u52A0\u56DE\u540D\u5355\uFF09\u3002',\n toolSyncHidden: '\u300C{name}\u300D\u5DF2\u5728\u4E09\u4E2A\u9636\u6BB5\u9690\u85CF / \u79FB\u9664\u3002',\n sectionsTakenOver: '\u300C{name}\u300D\u6BB5\u58F0\u660E\u4E86 complete \u6574\u6BB5\u63A5\u7BA1\uFF08\u5BBF\u4E3B\u5728\u88C5\u914D\u7011\u5E03\u6D41\u4E4B\u540E\u5F3A\u5236\u8FD8\u539F\u4E3A\u90A3\u4E00\u6761\u6BB5\uFF09\u3002\u672C\u63D2\u4EF6\u9ED8\u8BA4\u7684 forceSections \u5DF2\u7ED5\u5F00\u8BE5\u673A\u5236\uFF0C\u6BB5\u7EA7\u5C4F\u853D / \u66FF\u6362 / \u6CE8\u5165 / \u6392\u5E8F\u7167\u5E38\u751F\u6548\uFF1B\u6B64\u63D0\u793A\u53EA\u4F1A\u5728 forceSections \u5173\u95ED\u6216\u5F3A\u5236\u8986\u76D6\u5931\u6548\u65F6\u51FA\u73B0\uFF0C\u5F00\u542F forceSections \u5373\u53EF\u6062\u590D\u3002',\n sectionsLost: '\u672C\u63D2\u4EF6\u5728\u8BE5\u9636\u6BB5\u4EA7\u51FA\u7684 {emitted} \u4E2A\u6BB5\u91CC\uFF0C\u53EA\u6709 {survived} \u4E2A\u8FDB\u5165\u6700\u7EC8\u63D0\u793A\u8BCD\uFF1A\u5176\u4F59\u88AB\u4E0B\u6E38\u88C5\u914D\u89C4\u5219\u4E22\u5F03\uFF0C\u6BB5\u7EA7\u5B9A\u5236\u4E0D\u4F1A\u5B8C\u5168\u751F\u6548\uFF08\u5DE5\u5177\u8FC7\u6EE4\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002',\n sectionBlockedStrip: '\uFF08\u672C\u9636\u6BB5\u5DF2\u5C4F\u853D\uFF0C\u6A21\u578B\u4E0D\u53EF\u89C1\uFF09',\n phaseSuppressed: '\u88AB\u6291\u5236\uFF08\u4E0D\u5728\u4EFB\u4F55\u9636\u6BB5\u7684\u88C5\u914D\u4E2D\uFF09',\n sectionDynamicNoAdd: '\u300C{name}\u300D\u662F\u8FD0\u884C\u65F6\u624D\u751F\u6210\u7684\u52A8\u6001\u6BB5\uFF0C\u6CA1\u6CD5\u9884\u5148\u52A0\u8FDB\u67D0\u4E2A\u9636\u6BB5\uFF08\u5B83\u7684\u5185\u5BB9\u53EA\u6709\u88C5\u914D\u65F6\u624D\u77E5\u9053\uFF09\u3002',\n exportOk: '\u5BFC\u51FA\u6210\u529F',\n exportCancel: '\u5DF2\u53D6\u6D88\u5BFC\u51FA',\n exportFail: '\u5BFC\u51FA\u5931\u8D25',\n importOk: '\u5BFC\u5165\u5B8C\u6210',\n importNone: '\u6CA1\u6709\u65B0\u589E\u9884\u8BBE\uFF08\u540C\u540D\u5DF2\u5B58\u5728\u6216\u6587\u4EF6\u4E3A\u7A7A\uFF09',\n importCancel: '\u5DF2\u53D6\u6D88\u5BFC\u5165',\n importFail: '\u5BFC\u5165\u5931\u8D25',\n saveOk: '\u5DF2\u4FDD\u5B58',\n saveFail: '\u4FDD\u5B58\u5931\u8D25',\n discardConfirm: '\u6709\u672A\u4FDD\u5B58\u7684\u66F4\u6539\uFF0C\u79BB\u5F00\u5C06\u4E22\u5F03\u3002\u786E\u5B9A\u79BB\u5F00\u5417\uFF1F',\n forceTitle: '\u5F3A\u5236\u8986\u76D6\uFF08forceSections\uFF09',\n forceHint: '\u5F00\u542F\u540E\u6240\u6709\u9884\u8BBE\u7684\u63D0\u793A\u8BCD\u6BB5\u4E00\u5F8B\u4EE5\u672C\u63D2\u4EF6\u4E3A\u51C6\uFF08\u7ED5\u8FC7 complete \u6574\u6BB5\u63A5\u7BA1\u4E0E\u9884\u8BBE\u9636\u6BB5\u88C1\u6BB5\uFF09\uFF1B\u5173\u95ED\u540E\u9000\u56DE\u7011\u5E03\u6D41\u5185\u8FC7\u6EE4\uFF0C\u9884\u8BBE\u53EF\u80FD\u538B\u8FC7\u5B9A\u5236\u3002\u300C\u6062\u590D\u521D\u59CB\u72B6\u6001\u300D\u4F1A\u81EA\u52A8\u5173\u95ED\u5B83\u3002',\n forceOn: '\u5DF2\u5F00\u542F',\n forceOff: '\u5DF2\u5173\u95ED',\n zhSwitch: '\u4E2D\u6587\u63D0\u793A\u8BCD',\n zhHint: '\u5F00\u5173\u3002\u5F00\u542F\uFF1A\u628A\u540D\u5B57\u5BF9\u5F97\u4E0A\u8BD1\u672C\u7684\u6BB5\u4E00\u6B21\u6027\u8986\u76D6\u4E3A\u4E2D\u6587\uFF08\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF0C\u4FDD\u5B58\u540E\u751F\u6548\uFF09\uFF1B\u5173\u95ED\uFF1A\u6E05\u9664\u8FD9\u4E9B\u6BB5\u7684\u66FF\u6362\u6587\u672C\uFF0C\u56DE\u5F52\u82F1\u6587\u539F\u6587\u3002\u81EA\u5B9A\u4E49\u6BB5\u4E0E\u5BF9\u4E0D\u4E0A\u540D\u5B57\u7684\u6BB5\u4E0D\u53D7\u5F71\u54CD\u3002',\n zhApplied: '\u5DF2\u628A\u4E2D\u6587\u5199\u5165\u7F16\u8F91\u8349\u7A3F\uFF1A\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\uFF1B\u5BF9\u4E0D\u4E0A\u540D\u5B57\u7684\u6BB5\u4FDD\u6301\u539F\u6837\u3002',\n zhReverted: '\u5DF2\u628A\u82F1\u6587\u539F\u6587\u5199\u56DE\u7F16\u8F91\u8349\u7A3F\uFF08\u6E05\u9664\u4E2D\u6587\u66FF\u6362\uFF09\uFF0C\u70B9\u300C\u4FDD\u5B58\u300D\u751F\u6548\u3002',\n zhNotReady: '\u4E09\u9636\u6BB5\u88C5\u914D\u5C1A\u672A\u52A0\u8F7D\u5B8C\u6210\uFF0C\u8BF7\u5148\u70B9\u300C\u5237\u65B0\u300D\u6216\u7A0D\u540E\u518D\u8BD5\u3002',\n envBlockTitle: '\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\uFF08envBlocklist\uFF09',\n envBlockHint: '\u7CFB\u7EDF\u73AF\u5883\u53D8\u91CF\uFF08process.env\uFF09\u5DF2\u5168\u91CF\u6CE8\u518C\u4E3A\u63D0\u793A\u8BCD\u53D8\u91CF\uFF1A\u6BB5\u6587\u672C\u91CC\u5199 {{env_\u952E\u540D\u5C0F\u5199}} \u5F15\u7528\uFF08\u5982 {{env_path}}\uFF09\uFF1B\u547D\u4E2D\u9ED1\u540D\u5355\u7684\u952E\u4E0D\u6CE8\u518C\u2014\u2014env \u91CC\u5E38\u6709\u5BC6\u94A5\uFF0C\u8FDB\u4E86\u63D0\u793A\u8BCD\u5C31\u4F1A\u968F\u8BF7\u6C42\u53D1\u7ED9\u6A21\u578B\u3002\u6761\u76EE\u652F\u6301 * \u901A\u914D\u3001\u5927\u5C0F\u5199\u4E0D\u654F\u611F\u3002\u5185\u7F6E\u53D8\u91CF {{date}} {{time}} {{datetime}} {{weekday}} {{hostname}} {{platform}} {{arch}} {{username}} {{home}} {{shell}} {{locale}} {{node_version}} \u6052\u53EF\u7528\u3002',\n envBlockAdd: '\u952E\u540D\u6216\u901A\u914D\uFF0C\u5982 GITHUB_TOKEN \u6216 *_KEY*',\n envBlockAddAction: '\u6DFB\u52A0',\n envBlockEmpty: '\u9ED1\u540D\u5355\u4E3A\u7A7A\uFF1A\u6240\u6709\u73AF\u5883\u53D8\u91CF\u90FD\u4F1A\u88AB\u6CE8\u518C',\n envVarsTitle: '\u5DF2\u6CE8\u518C\u7684\u63D0\u793A\u8BCD\u53D8\u91CF',\n envVarsHint: '\u6BB5\u6587\u672C\u91CC\u5F15\u7528 {{\u53D8\u91CF\u540D}}\uFF1B\u5F15\u7528\u672A\u6CE8\u518C\u7684\u540D\u5B57\u4F1A\u8BA9\u6574\u6B21\u6E32\u67D3\u62A5\u9519\uFF08\u5BBF\u4E3B\u4E25\u683C\u6A21\u5F0F\uFF09\u3002',\n importBlockMerge: '\uFF0C\u6587\u4EF6\u4E2D\u7684\u73AF\u5883\u53D8\u91CF\u9ED1\u540D\u5355\u5DF2\u5E76\u5165\uFF08+{count} \u6761\uFF09',\n resetTitle: '\u6062\u590D\u521D\u59CB\u72B6\u6001',\n resetHint: '\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\uFF08\u5C4F\u853D / \u66FF\u6362 / \u6CE8\u5165 / \u6392\u5E8F\u3001\u9636\u6BB5\u5DE5\u5177\u76EE\u5F55\u3001\u914D\u7F6E\u5FEB\u7167\u3001agent \u9884\u8BBE\u8986\u76D6\uFF09\uFF0C\u5E76\u5173\u95ED forceSections \u2014\u2014 \u4E4B\u540E\u6240\u6709 AI \u5BF9\u8BDD\u4E0D\u518D\u53D7\u672C\u63D2\u4EF6\u5F71\u54CD\uFF0C\u4E0E\u5378\u8F7D\u63D2\u4EF6\u7B49\u6548\uFF0C\u65E0\u9700\u5378\u8F7D\u6216\u91CD\u542F\u3002\u6B64\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\uFF1B\u8981\u91CD\u65B0\u542F\u7528\u5B9A\u5236\uFF0C\u5728\u4E0A\u65B9\u6253\u5F00\u300C\u5F3A\u5236\u8986\u76D6\u300D\u5F00\u5173\u5373\u53EF\u3002',\n resetConfirm: '\u786E\u5B9A\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236\u5E76\u6062\u590D\u521D\u59CB\u72B6\u6001\u5417\uFF1F\\n\\n\u5C06\u5220\u9664\uFF1A\u5C4F\u853D\u540D\u5355\u3001\u6BB5\u66FF\u6362\u3001\u6CE8\u5165\u6BB5\u3001\u9636\u6BB5\u5DE5\u5177\u76EE\u5F55\u3001\u914D\u7F6E\u5FEB\u7167\u3001agent \u9884\u8BBE\u8986\u76D6\uFF1B\u5E76\u5173\u95ED forceSections\u3002\\n\u4E4B\u540E\u6240\u6709 AI \u5BF9\u8BDD\u90FD\u4E0D\u518D\u53D7\u672C\u63D2\u4EF6\u5F71\u54CD\uFF08\u4E0E\u5378\u8F7D\u63D2\u4EF6\u7B49\u6548\uFF09\u3002\\n\u6B64\u64CD\u4F5C\u4E0D\u53EF\u64A4\u9500\u3002',\n resetAction: '\u6E05\u7A7A\u5168\u90E8\u5B9A\u5236',\n resetOk: '\u5DF2\u6062\u590D\u521D\u59CB\u72B6\u6001\uFF1A\u6240\u6709 AI \u5BF9\u8BDD\u4E0D\u518D\u53D7\u672C\u63D2\u4EF6\u5F71\u54CD',\n resetFail: '\u6062\u590D\u521D\u59CB\u72B6\u6001\u5931\u8D25',\n scopeFallback: '\u8BE5 agent \u9884\u8BBE\u7684\u5E38\u9A7B scope \u672A\u80FD\u6302\u8F7D\uFF0C\u4EE5\u4E0B\u663E\u793A\u7684\u662F\u5168\u5C40\u5C42\u5185\u5BB9\uFF08\u5E76\u975E\u8BE5\u9884\u8BBE\u7684\u539F\u751F\u6BB5\u4E0E\u5DE5\u5177\uFF09\u3002',\n previewFail: '\u8BE5\u9636\u6BB5\u88C5\u914D\u5931\u8D25\uFF08scope \u6302\u8F7D\u5931\u8D25\u6216\u9884\u8BBE\u63D2\u4EF6\u5F02\u5E38\uFF09\uFF0C\u8BF7\u5207\u6362\u76EE\u6807\u6216\u67E5\u770B\u670D\u52A1\u65E5\u5FD7\u3002',\n phaseVisible: '\u9636\u6BB5\u53EF\u89C1',\n previewToolsHint: '\u6A21\u578B\u5B9E\u9645\u53EF\u89C1\u7684\u5DE5\u5177\u76EE\u5F55\uFF08\u6309\u6240\u9009\u9636\u6BB5\u8FD0\u884C\u9884\u8BBE\u7684\u5168\u90E8\u88C5\u914D\u89C4\u5219\uFF0C\u542B\u539F\u751F\u9636\u6BB5\u88C1\u526A\uFF09\uFF1A',\n previewToolsCount: '\u6CE8\u518C\u8868',\n saveAsPreset: '\u5B58\u4E3A\u9884\u8BBE',\n // \u72EC\u7ACB\u9762\u677F\uFF08\u4FA7\u8FB9\u680F\u5165\u53E3 + \u62BD\u5C49\u5206\u680F\uFF09\u65B0\u589E\u3002\n navShort: '\u63D0\u793A\u8BCD',\n close: '\u5173\u95ED',\n filterAll: '\u5168\u90E8',\n filterOn: '\u5DF2\u542F\u7528',\n filterOff: '\u5DF2\u505C\u7528',\n targetLabel: '\u7F16\u8F91\u76EE\u6807\uFF08Agent \u9884\u8BBE\uFF09',\n targetCustomized: '\u8BE5\u9884\u8BBE {n} \u9879\u5B9A\u5236',\n agentScoped: '\u4F1A\u8BDD\u7EA7',\n agentScopedHint: '\u8FD9\u4E00\u6BB5\u7531\u63D2\u4EF6\u5728 agent \u81EA\u5DF1\u7684\u4F5C\u7528\u57DF\u91CC\u6CE8\u518C\uFF08\u4E0D\u662F\u672C\u9884\u8BBE scope \u7684\u6CE8\u518C\u8868\u9879\uFF09\uFF1A\u9762\u677F\u7684\u9884\u89C8\u88C5\u914D\u770B\u4E0D\u5230\u5B83\uFF0C\u4F46\u6BCF\u4E2A\u771F\u5B9E\u4F1A\u8BDD\u7684\u63D0\u793A\u8BCD\u91CC\u90FD\u6709\u5B83\u3002\u5B83\u9ED8\u8BA4\u5C31\u5728\u63D0\u793A\u8BCD\u91CC\uFF0C\u6240\u4EE5\u53EF\u4EE5\u50CF\u666E\u901A\u6BB5\u4E00\u6837\u5C4F\u853D / \u66FF\u6362 / \u6392\u5E8F \u2014\u2014 \u60F3\u8BA9\u5B83\u53D8\u4E2D\u6587\uFF0C\u7528\u300C\u4E2D\u6587\u63D0\u793A\u8BCD\u300D\u5F00\u5173\u6216\u624B\u52A8\u66FF\u6362\u90FD\u884C\u3002',\n settingsTitle: '\u5168\u5C40\u8BBE\u7F6E',\n libraryTitle: '\u914D\u7F6E\u5FEB\u7167\u5E93',\n draftBadge: '\u9884\u89C8\u542B\u672A\u4FDD\u5B58\u8349\u7A3F',\n previewSyncFail: '\u5B9E\u65F6\u9884\u89C8\u540C\u6B65\u5931\u8D25\uFF08\u4E0B\u6B21\u7F16\u8F91\u4F1A\u81EA\u52A8\u91CD\u8BD5\uFF0C\u6216\u70B9\u300C\u5237\u65B0\u300D\uFF09',\n },\n en: {\n nav: 'Prompt Customizer',\n previewPreset: 'Source: selected mode preset. Sections, tools and ordering are assembled independently; existing conversations are neither matched nor changed.',\n previewUnresolved: 'Session variables {names} are not bound and remain template references. Sections and tools are still available for editing.',\n runtimeContexts: 'Runtime context (read-only user-role snapshot, separate from system sections)',\n loading: 'Loading\u2026',\n unavailable: 'Namespace unavailable in this environment.',\n tabsSections: 'Sections',\n tabsTools: 'Tools',\n tabsPresets: 'Presets',\n tabsPreview: 'Preview',\n refresh: 'Refresh',\n blockedOff: 'Active',\n blockedOn: 'Blocked',\n replaced: 'Replaced',\n manual: 'Manual',\n system: 'System',\n replace: 'Replace',\n clearReplace: 'Clear',\n clearInput: 'Clear',\n injectNew: 'Inject section',\n name: 'Name',\n order: 'Order',\n text: 'Text',\n add: 'Add',\n hiddenOff: 'Visible',\n hiddenOn: 'Hidden',\n selectAll: 'Select all',\n selectNone: 'Select none',\n empty: '(empty)',\n dynamic: '<dynamic>',\n drag: 'Drag to reorder',\n moveUp: 'Move up',\n moveDown: 'Move down',\n previewHint: 'Final system prompt after block/replace/inject:',\n previewPrompt: 'Prompt preview',\n previewSections: 'sections',\n previewTools: 'Tools preview',\n previewToolCount: 'tools',\n savePreset: 'Save current config',\n presetName: 'Config name',\n saveAsPresetCard: 'Save as agent preset',\n saveAsPresetHint: 'Copy the whole \"{name}\" preset into a new one (composition plus its companion scripts), then write the current customization into its override \u2014 the new preset shows up in the target selector above.',\n agentPresetName: 'New preset name',\n forkSourceDefault: 'the default preset',\n saveAsPresetOk: 'Preset created \u2014 pick it in the target selector above',\n saveAsPresetFail: 'Failed to save preset',\n save: 'Save',\n importPreset: 'Import preset',\n import: 'Import',\n apply: 'Apply',\n export: 'Export',\n delete: 'Delete',\n restore: 'Restore',\n active: 'Active',\n preset: 'Preset',\n ioFailed: 'Import/export failed',\n importInvalid: 'Invalid preset file',\n targetGlobal: 'Target: global default',\n targetHint: 'Pick an agent preset to customize \u2014 prompts are edited per preset: untouched fields stay official defaults, and changes apply only to that preset (the \u201CAll agents\u201D global layer is retired since 0.9.0).',\n syncAllPhases: 'Sync phases',\n syncAllPhasesHint: 'When checked, the three phases share one section list (the resident period is the backbone; sections only the other two phases have are appended at the end, and a same-named row follows the phase where it natively exists), and add / remove / reorder / check / text edits are written to all three phases at once. Ticking the box immediately overwrites the other two phases with the resident-period content (written to the edit draft; press Save to apply). Tool hiding / showing and adding back also apply to all three phases. Unchecked (default): handle each phase separately.',\n syncApplied: 'The other two phases were overwritten from the resident period: all three phases now share one section list and text (written to the draft; press Save to apply).',\n syncNotReady: 'The three phase assemblies are not ready (or are empty); cannot sync phases \u2014 press Refresh and retry.',\n syncSkippedDynamic: '\"{names}\" is a runtime-generated dynamic section and cannot be added to the other phases (its content is only known during assembly).',\n broken: 'broken',\n brokenPreset: 'This agent preset cannot mount right now; its customization is still editable and applies once fixed.',\n phaseBootstrap: 'Bootstrap only',\n phaseActive: 'After promotion',\n phaseCompaction: 'Post-compaction',\n // agent \u5468\u671F\u4E09\u9636\u6BB5\u7684\u5C55\u793A\u547D\u540D\uFF08\u5F15\u5BFC\u671F \u2192 \u5E38\u9A7B\u671F \u2192 \u538B\u7F29\u53D7\u63A7\u671F\uFF09\u3002\n phaseStageGuide: 'Guide period',\n phaseStageResident: 'Resident period',\n phaseStageControlled: 'Compaction-controlled period',\n toolsPartGuide: 'Guide-period tools',\n toolsPartResident: 'Resident-period tools',\n toolsPartControlled: 'Compaction-controlled tools',\n allToolsTitle: 'All system tools',\n sectionsPartGuide: 'Guide-period sections',\n sectionsPartResident: 'Resident-period sections',\n sectionsPartControlled: 'Compaction-controlled sections',\n allSectionsTitle: 'All system sections',\n toolsFourHint: 'Each of the three periods keeps its own list, with no inheritance: the checkbox = visible to the model in that period; dragging a tool from \"All\" into a period makes it appear there (if the period trims it by default, it is added back); dragging between two periods copies it (the source is untouched, the target gains one, and the hidden/enabled state carries over); dragging it back to \"All\" removes it from that period. Every action touches only the tool you dragged.',\n sectionsFourHint: 'Drag both ways: drop a section from \"All\" onto a period part to enable it there; drag from a part back to \"All\" to remove it from that period. Blocked sections stay fully operable \u2014 they are just not injected.',\n dragHint: 'Drag in to make this tool appear in this period',\n poolMarksHint: 'The three marks after each name = this tool\u2019s state in the guide / resident / compaction-controlled periods: green = visible there (or added back), grey = hidden there, dim = not present and not added.',\n toolAddedTag: 'added',\n toolAdded: 'Added \"{name}\" back to {phase}: the period trims it by default, so it will reappear there once saved (it exists in this preset\u2019s registry).',\n toolNotInRegistry: '\"{name}\" is not in this preset\u2019s registry (it belongs to another preset). There is no definition for it here, so it cannot be added.',\n toolCopied: 'Copied \"{name}\" to {to}: the copy in {from} is left untouched, and its hidden/enabled state carries over.',\n toolRemovedFromPhase: 'Removed \"{name}\" from {from}: an add-back is reverted, a native tool is hidden in that period (still selectable back here).',\n sectionCopied: 'Copied \"{name}\" to {to} (the source {from} is untouched): it is enabled there and can be edited or dragged to reorder.',\n sectionRemoved: 'Removed \"{name}\" from {from}: an added-in section is reverted, a native section becomes blocked (tick it to restore).',\n toolShown: '\"{name}\" is now visible in {to}.',\n toolHiddenIn: '\"{name}\" is now hidden in {to}.',\n toolSyncShown: '\"{name}\" is now visible in all three phases (periods without it in their catalog got it added back).',\n toolSyncHidden: '\"{name}\" is now hidden / removed in all three phases.',\n sectionsTakenOver: 'The \"{name}\" section declares a complete takeover (the host restores that single section after the assembly waterfall). This plugin\u2019s forceSections (default on) bypasses that mechanism, so section-level blocking / replacement / injection / ordering still applies; this notice only appears when forceSections is off or the override fails \u2014 enable it to restore.',\n sectionsLost: 'Only {survived} of the {emitted} sections this plugin emitted for this phase reach the final prompt \u2014 the rest are dropped by downstream assembly rules, so section-level customization cannot fully apply (tool filtering is unaffected).',\n sectionBlockedStrip: ' (blocked in this period; invisible to the model)',\n phaseSuppressed: 'Suppressed (absent from every phase assembly)',\n sectionDynamicNoAdd: '\"{name}\" is generated at runtime \u2014 it cannot be added to a phase ahead of time (its content is only known during assembly).',\n exportOk: 'Exported',\n exportCancel: 'Export cancelled',\n exportFail: 'Export failed',\n importOk: 'Import complete',\n importNone: 'Nothing imported (duplicate names or empty file)',\n importCancel: 'Import cancelled',\n importFail: 'Import failed',\n saveOk: 'Saved',\n saveFail: 'Save failed',\n discardConfirm: 'You have unsaved changes; leaving will discard them. Leave anyway?',\n forceTitle: 'Force override (forceSections)',\n forceHint: 'When on, every preset\u2019s prompt sections always follow this plugin (bypassing complete takeover and preset phase pruning); when off, filtering falls back to the waterfall, where presets may override your customization. \"Restore initial state\" turns this off automatically.',\n forceOn: 'On',\n forceOff: 'Off',\n zhSwitch: 'Chinese sections',\n zhHint: 'Toggle. On: overwrite sections matching the bundled translation with Chinese (written to the edit draft, applies on save). Off: clear those replacements, restoring the English originals. Custom sections and unmatched names are untouched.',\n zhApplied: 'Chinese written to the edit draft \u2014 press Save to apply; unmatched sections stay as-is.',\n zhReverted: 'English originals written back to the edit draft (Chinese replacements cleared) \u2014 press Save to apply.',\n zhNotReady: 'Phase assemblies are not loaded yet \u2014 press Refresh or try again shortly.',\n envBlockTitle: 'Environment variable blocklist (envBlocklist)',\n envBlockHint: 'All system environment variables (process.env) are registered as prompt variables: reference them in section text as {{env_lowercase_key}} (e.g. {{env_path}}); keys hit by the blocklist are not registered \u2014 env often carries secrets, and anything in the prompt is sent to the model. Entries support * wildcards, case-insensitive. Built-ins {{date}} {{time}} {{datetime}} {{weekday}} {{hostname}} {{platform}} {{arch}} {{username}} {{home}} {{shell}} {{locale}} {{node_version}} are always available.',\n envBlockAdd: 'Key or wildcard, e.g. GITHUB_TOKEN or *_KEY*',\n envBlockAddAction: 'Add',\n envBlockEmpty: 'Blocklist is empty: every environment variable gets registered',\n envVarsTitle: 'Registered prompt variables',\n envVarsHint: 'Reference {{name}} in section text; an unregistered name fails the whole render (host strict mode).',\n importBlockMerge: ', the file\u2019s env-variable blocklist was merged in (+{count} entries)',\n resetTitle: 'Restore initial state',\n resetHint: 'Clears all customization (blocking / replacement / injection / ordering, per-phase tool catalogs, config snapshots, agent-preset overrides) and turns forceSections off \u2014 every AI conversation goes back to being unaffected by this plugin, equivalent to uninstalling it, without uninstalling or restarting. This cannot be undone; to re-enable customization, turn the \"Force override\" switch above back on.',\n resetConfirm: 'Clear all customization and restore the initial state?\\n\\nThis will delete: block lists, section replacements, injected sections, per-phase tool catalogs, config snapshots, and agent-preset overrides; forceSections will be turned off.\\nAfterwards no AI conversation is affected by this plugin (equivalent to uninstalling).\\nThis cannot be undone.',\n resetAction: 'Clear all customization',\n resetOk: 'Initial state restored: no AI conversation is affected by this plugin anymore',\n resetFail: 'Failed to restore initial state',\n scopeFallback: \"This agent preset's standing scope could not be mounted; what you see is the global layer (not the preset's native sections/tools).\",\n previewFail: 'Assembly for this phase failed (scope mount error or a preset plugin threw); switch target or check the server log.',\n phaseVisible: 'visible in phase',\n previewToolsHint: 'Tool catalog as the model actually sees it (all assembly rules run for the selected phase, including native phase narrowing):',\n previewToolsCount: 'of registry',\n saveAsPreset: 'Save as preset',\n // \u72EC\u7ACB\u9762\u677F\uFF08\u4FA7\u8FB9\u680F\u5165\u53E3 + \u62BD\u5C49\u5206\u680F\uFF09\u65B0\u589E\u3002\n navShort: 'Prompts',\n close: 'Close',\n filterAll: 'All',\n filterOn: 'Enabled',\n filterOff: 'Disabled',\n targetLabel: 'Edit target (agent preset)',\n targetCustomized: '{n} overridden field(s)',\n agentScoped: 'session-level',\n agentScopedHint: 'This section is registered by a plugin in the agent\u2019s own scope (it is not in this preset scope\u2019s registry): the panel\u2019s preview assembly cannot see it, but every real session\u2019s prompt has it. It is in the prompt by default, and it can be blocked / replaced / reordered like any other row \u2014 use the \u201CChinese prompt\u201D toggle or a manual replacement to translate it.',\n settingsTitle: 'Global settings',\n libraryTitle: 'Config snapshots',\n draftBadge: 'Preview includes unsaved draft',\n previewSyncFail: 'Live preview sync failed (retries on next edit, or press Refresh)',\n },\n} as const\n\nexport type Translate = (key: string, params?: Record<string, string | number>) => string\n", "/**\n * prompt \u2014 \u63D0\u793A\u8BCD\u7BA1\u7406\uFF08\u4E0A\u6E38 dsh-prompt-customizer v0.5.1 \u7684\u6D4F\u89C8\u5668\u534A\u8EAB\uFF09\u3002\n *\n * \u8FC1\u79FB\u8303\u56F4\uFF1A\u53EA\u4FDD\u7559\u9762\u677F\u672C\u4F53\uFF08Panel \u4E0E\u5B83\u7684\u5206\u680F / \u9884\u89C8 / \u5FEB\u7167\u5E93\uFF09\u3002\u4E0A\u6E38\u7684\n * \u4FA7\u8FB9\u680F\u5165\u53E3\u4E0E\u62BD\u5C49\u5916\u58F3\uFF08nav.tsx / shell.tsx\uFF09\u7531 triad \u7684\u300C\u63D0\u793A\u8BCD\u300D\u9876\u5C42 tab\n * \u53D6\u4EE3\uFF1B\u5BBF\u4E3B\u8DEF\u7531\u4ECD\u662F /api/prompt-customizer/*\uFF08\u89C1 vendor/prompt-customizer\uFF09\u3002\n *\n * \u4E0E\u4E0A\u6E38\u7684\u552F\u4E00\u5DEE\u5F02\uFF1A\u9762\u677F\u4E0D\u518D\u81EA\u5DF1\u5F00\u7A97\uFF08\u65E0\u5173\u95ED\u6309\u94AE\u3001\u65E0\u906E\u7F69\u4E0E\u4FA7\u680F\u51E0\u4F55\u63A8\u7B97\uFF09\u3002\n */\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport { DICT, type Translate } from './locales.ts'\n\n/** \u6587\u6848\u547D\u540D\u7A7A\u95F4\uFF08\u4E0E\u4E0A\u6E38\u4E00\u81F4\uFF0C\u907F\u514D\u4E24\u4EFD\u5B57\u5178\uFF09\u3002 */\nconst NS = 'prompt-customizer'\n\n/** triad \u5BA2\u6237\u7AEF\u4E0A\u4E0B\u6587\u91CC\u672C\u6A21\u5757\u7528\u5230\u7684\u90E8\u5206\u3002 */\ninterface PromptLocaleHost {\n register(namespace: string, dicts: { zh: Record<string, string>; en: Record<string, string> }): unknown\n bind(namespace: string): Translate\n}\n\n/** apply \u65F6\u7ED1\u5B9A\u7684\u7FFB\u8BD1\u51FD\u6570\uFF08\u8DDF\u968F DSH \u5F53\u524D\u8BED\u8A00\uFF09\u3002 */\nlet bound: Translate | undefined\n\n/** \u9762\u677F\u6587\u6848\u51FD\u6570\uFF1AapplyPrompt \u4E4B\u524D\u56DE\u843D\u5230\u4E2D\u6587\u8868\uFF08\u9762\u677F\u4E0D\u4F1A\u56E0\u7F3A\u5C11 locale \u670D\u52A1\u53D8\u7A7A\u767D\uFF09\u3002 */\nexport function promptT(): Translate {\n if (bound !== undefined) return bound\n return (key, params) => {\n let text = (DICT.zh as Record<string, string>)[key] ?? key\n if (params !== undefined) {\n for (const name of Object.keys(params)) text = text.split(`{${name}}`).join(String(params[name]))\n }\n return text\n }\n}\n\n/** \u6CE8\u518C\u6587\u6848\u547D\u540D\u7A7A\u95F4\uFF1B\u9762\u677F\u672C\u4F53\u7531\u300C\u63D0\u793A\u8BCD\u300Dtab \u6E32\u67D3\uFF08\u8FD9\u91CC\u4E0D\u5EFA\u4EFB\u4F55\u5165\u53E3\uFF09\u3002 */\nexport function applyPrompt(ctx: ClientContext): void {\n const locale = (ctx as unknown as { locale?: PromptLocaleHost }).locale\n if (locale === undefined || typeof locale.bind !== 'function') {\n console.warn('[dsh-prompt-customizer] prompt locale unavailable: \u63D0\u793A\u8BCD\u9762\u677F\u56DE\u843D\u4E2D\u6587\u6587\u6848')\n return\n }\n // \u547D\u540D\u7A7A\u95F4\u662F\u63D2\u4EF6\u81EA\u5DF1\u7684\uFF08'prompt-customizer'\uFF09\u3002\u6CE8\u518C\u5931\u8D25\u7EDD\u4E0D\u80FD\u62D6\u57AE\u6574\u6761\u5BA2\u6237\u7AEF\n // \u63D2\u4EF6\u52A0\u8F7D\u94FE\uFF08\u540C\u540D\u6CE8\u518C\u4F1A\u629B\u9519\uFF0C\u4E14\u8C01\u5148\u6CE8\u518C\u8C01\u8BA9\u540E\u6765\u8005\u629B\uFF09\u2014\u2014\u5931\u8D25\u5C31\u56DE\u843D\u63D2\u4EF6\u5185\n // \u81EA\u5E26\u7684 zh \u6587\u6848\uFF0C\u9762\u677F\u7167\u5E38\u80FD\u7528\u3002\n ctx.effect(() => {\n try {\n return locale.register(NS, DICT)\n } catch (error) {\n console.error('[dsh-prompt-customizer] prompt locale register failed:', error)\n return () => {}\n }\n }, 'prompt-customizer: prompt locale')\n try {\n bound = locale.bind(NS)\n } catch (error) {\n console.warn('[dsh-prompt-customizer] prompt locale bind failed, \u56DE\u843D\u4E2D\u6587\u6587\u6848:', error)\n }\n}\n", "/**\r\n * PromptView \u2014 \u300C\u63D0\u793A\u8BCD\u300D\u9876\u5C42 tab \u7684\u5185\u5BB9\u3002\r\n *\r\n * \u76F4\u63A5\u590D\u7528\u4E0A\u6E38\u9762\u677F\u672C\u4F53\uFF08Panel\uFF09\uFF1A\u5934\u90E8\u6A21\u5F0F\u5207\u6362 / \u4FDD\u5B58 / \u5237\u65B0\u3001agent \u9884\u8BBE\u7F16\u8F91\u76EE\u6807\u3001\r\n * \u5DE6\u680F\u52FE\u9009 + \u53F3\u680F\u88C5\u914D\u9884\u89C8\uFF0C\u5168\u90E8\u4FDD\u6301\u539F\u6837\uFF1B\u8FD9\u91CC\u53EA\u63D0\u4F9B\u6491\u6EE1 tab \u7684\u5BB9\u5668\u4E0E\u6587\u6848\u51FD\u6570\u3002\r\n */\r\nimport { Panel } from './Panel.tsx'\r\nimport { promptT } from './index.ts'\r\n\r\nexport function PromptView(): JSX.Element {\r\n return (\r\n <div style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\r\n <Panel t={promptT()} />\r\n </div>\r\n )\r\n}\r\n", "/**\n * skills/api \u2014 /api/skill-manager \u4E0E /api/skill-toggles \u7684\u7C7B\u578B\u5316\u8BF7\u6C42\u5C01\u88C5\u3002\n */\nimport type {\n HealthReport, HealthView, InstallInput, PresetStatus, SkillSnapshot, ToggleStatus,\n} from './types.js'\n/** ---------------------------------------------------------------- API */\n\nexport const SKILL_API_BASE = '/api/skill-manager'\n\nexport async function skillRequest<T>(path: string, options?: RequestInit): Promise<T> {\n const response = await fetch(SKILL_API_BASE + path, options)\n const body = (await response.json().catch(() => ({}))) as T & { error?: string }\n if (!response.ok) throw new Error(body.error || 'request failed (' + String(response.status) + ')')\n return body\n}\n\nexport const skillApi = {\n list: (): Promise<SkillSnapshot> => skillRequest<SkillSnapshot>('/list', { headers: { accept: 'application/json' } }),\n toggleStatus: (): Promise<ToggleStatus> =>\n fetch('/api/skill-toggles/status', { headers: { accept: 'application/json' } })\n .then((response) => response.json() as Promise<ToggleStatus & { error?: string }>)\n .then((body) => {\n if (typeof body !== 'object' || body === null || body.skills === undefined) {\n throw new Error('toggle status unavailable')\n }\n return body as ToggleStatus\n }),\n setSkillEnabled: (name: string, enabled: boolean): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/skills/${encodeURIComponent(name)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n setBundleEnabled: (bundleId: string, enabled: boolean): Promise<{ ok: boolean; handled?: number }> =>\n fetch(`/api/skill-toggles/bundles/${encodeURIComponent(bundleId)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string; handled?: number }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n /** \u9884\u8BBE\u540D\u5355 + \u5404\u9884\u8BBE\u8986\u76D6 + \u5168\u5C40\u5C42\u72B6\u6001(\u4E00\u6B21\u62C9\u9F50)\u3002 */\n presetStatus: (): Promise<PresetStatus> =>\n fetch('/api/skill-toggles/presets', { headers: { accept: 'application/json' } })\n .then((response) => response.json() as Promise<PresetStatus & { error?: string }>)\n .then((body) => {\n if (typeof body !== 'object' || body === null || !Array.isArray(body.presets)) {\n throw new Error('preset status unavailable')\n }\n return body as PresetStatus\n }),\n setPresetSkillEnabled: (presetId: string, name: string, enabled: boolean): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/presets/${encodeURIComponent(presetId)}/skills/${encodeURIComponent(name)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n setPresetBundleEnabled: (presetId: string, bundleId: string, enabled: boolean): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/presets/${encodeURIComponent(presetId)}/bundles/${encodeURIComponent(bundleId)}`, {\n method: 'PUT',\n headers: { accept: 'application/json', 'content-type': 'application/json' },\n body: JSON.stringify({ enabled }),\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'toggle failed')\n return body\n }),\n resetPreset: (presetId: string): Promise<{ ok: boolean }> =>\n fetch(`/api/skill-toggles/presets/${encodeURIComponent(presetId)}/reset`, {\n method: 'POST',\n headers: { accept: 'application/json' },\n }).then((response) => response.json() as Promise<{ ok: boolean; error?: string }>)\n .then((body) => {\n if (!body.ok) throw new Error(body.error || 'reset failed')\n return body\n }),\n createBundle: (name: string, categories: string[] = []): Promise<Record<string, never>> =>\n skillRequest('/bundles', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ name, categories }) }),\n renameBundle: (bundleId: string, name: string): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}`, { method: 'PATCH', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ name }) }),\n /** \u53EA\u6539\u5206\u7C7B\u7684 PATCH\uFF1Ahost \u4FA7 name \u7F3A\u7701\u5373\u4FDD\u6301\u539F\u503C\uFF0C\u4E0D\u5FC5\u56DE\u4F20\u5305\u540D\u3002 */\n setBundleCategories: (bundleId: string, categories: string[]): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}`, { method: 'PATCH', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ categories }) }),\n deleteBundle: (bundleId: string): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}`, { method: 'DELETE', headers: { accept: 'application/json' } }),\n setBundleSkills: (bundleId: string, skillNames: string[]): Promise<Record<string, never>> =>\n skillRequest(`/bundles/${encodeURIComponent(bundleId)}/skills`, { method: 'PUT', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify({ skillNames }) }),\n deleteSkill: (name: string): Promise<Record<string, never>> =>\n skillRequest(`/skills/${encodeURIComponent(name)}`, { method: 'DELETE', headers: { accept: 'application/json' } }),\n installSkill: (input: InstallInput): Promise<{ name?: string; dir?: string; renamed?: boolean }> =>\n skillRequest('/skills', { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json' }, body: JSON.stringify(input) }),\n /** \u6280\u80FD\u76EE\u5F55\u5065\u5EB7\u68C0\u67E5\uFF1A\u53EA\u8BFB\u626B\u63CF\uFF08\u7F3A SKILL.md / frontmatter \u65E0\u6548 / \u540D\u79F0\u4E0D\u4E00\u81F4 / \u8D26\u672C\u60AC\u6302\u5F15\u7528\uFF09\u3002 */\n health: (): Promise<HealthReport> =>\n fetch('/api/skill-health', { headers: { accept: 'application/json' } })\n .then((response) => response.json() as Promise<HealthReport & { error?: string }>)\n .then((body) => {\n if (typeof body !== 'object' || body === null || !Array.isArray(body.issues)) {\n throw new Error('health unavailable')\n }\n return body as HealthReport\n }),\n}\n", "/**\n * skills/files \u2014 \u6280\u80FD\u6587\u4EF6\u5939/\u538B\u7F29\u5305\u6536\u96C6\uFF08webkitGetAsEntry \u9012\u5F52\u76EE\u5F55 + base64 \u7F16\u7801\uFF09\u3002\n */\nimport type { CollectedFile } from './types.js'\n/** ---------------------------------------------------------------- \u6587\u4EF6\u6536\u96C6 */\n\nexport function readEntryFile(entry: FileSystemFileEntry): Promise<File> {\n return new Promise((resolve, reject) => {\n entry.file(resolve, reject)\n })\n}\n\nexport async function collectEntry(entry: FileSystemEntry, prefix: string, out: CollectedFile[]): Promise<void> {\n if (entry.isFile) {\n const fileEntry = entry as FileSystemFileEntry\n const file = await readEntryFile(fileEntry)\n const path = prefix === '' ? entry.name : `${prefix}/${entry.name}`\n out.push({ path, file })\n return\n }\n if (entry.isDirectory) {\n const dirEntry = entry as FileSystemDirectoryEntry\n const reader = dirEntry.createReader()\n const all: FileSystemEntry[] = []\n while (true) {\n const batch = await new Promise<FileSystemEntry[]>((resolve, reject) => {\n reader.readEntries(resolve, reject)\n })\n if (batch.length === 0) break\n all.push(...batch)\n }\n const nextPrefix = prefix === '' ? entry.name : `${prefix}/${entry.name}`\n for (const child of all) await collectEntry(child, nextPrefix, out)\n }\n}\n\nexport function fileToBase64(file: File): Promise<string> {\n return file.arrayBuffer().then((buffer) => {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n const chunkSize = 32768\n for (let index = 0; index < bytes.length; index += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize))\n }\n return btoa(binary)\n })\n}\n", "/**\n * skills/GuidePanel \u2014 \u53F3\u4FA7\u300C\u5FEB\u901F\u4E0A\u624B\u300D\u6D6E\u5C42\u5361\uFF08portal \u5230 body\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF09\u3002\n */\nimport { createPortal } from 'react-dom'\nimport {\n IconChevronRightOutlineRegular, IconCloseOutlineRegular, IconSkillOutlineRegular,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { ArrowRightIcon, CheckIcon, GuideArtIcon, GuideArtIconSmall } from './icons.js'\nimport { css } from './styles.js'\n/** ---------------------------------------------------------------- \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u9762\u677F\uFF08\u53F3\u4FA7\u680F\uFF09 */\n\n/** \u80FD\u529B\u5C0F\u5361\u56FE\u6807\uFF08stroke currentColor\uFF09\u3002 */\nexport function CapIcon({ kind, size = 17 }: { kind: 'ui' | 'code' | 'doc' | 'data' | 'tool'; size?: number }): JSX.Element {\n const common = { width: size, height: size, viewBox: '0 0 24 24', 'aria-hidden': true } as const\n const s = { fill: 'none', stroke: 'currentColor', strokeWidth: 1.5, strokeLinecap: 'round', strokeLinejoin: 'round' } as const\n if (kind === 'ui') {\n return (\n <svg {...common} {...s}><rect x=\"4\" y=\"4\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /><rect x=\"13.5\" y=\"4\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /><rect x=\"4\" y=\"13.5\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /><rect x=\"13.5\" y=\"13.5\" width=\"6.5\" height=\"6.5\" rx=\"1.4\" /></svg>\n )\n }\n if (kind === 'code') {\n return (\n <svg {...common} {...s}><path d=\"M9 7.5 5.5 12 9 16.5M15 7.5 18.5 12 15 16.5\" /></svg>\n )\n }\n if (kind === 'doc') {\n return (\n <svg {...common} {...s}><path d=\"M6.5 4.5h7l4 4v11h-11Z\" /><path d=\"M13.5 4.5v4h4M9 13h6M9 16h4.5\" /></svg>\n )\n }\n if (kind === 'data') {\n return (\n <svg {...common} {...s}><path d=\"M5 19h14M7 16v-5M12 16V8M17 16v-8.5\" /></svg>\n )\n }\n return (\n <svg {...common} {...s}><path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" /></svg>\n )\n}\n\n/** \u53F3\u4FA7\u6307\u5357\u6D6E\u5C42\u5361\uFF08\u70B9\u51FB\u300C\u5F00\u59CB\u5B66\u4E60\u300D\u51FA\u73B0\uFF0C\u4E0D\u538B\u7F29\u9762\u677F\uFF1B\u53C2\u8003\u8BBE\u8BA1\u7A3F\u7A84\u680F\u5185\u5BB9\uFF09\u3002 */\nexport function GuidePanel({ t, onClose, left, top, height }: {\n t: (key: string) => string\n onClose: () => void\n left: number\n top: number\n height: number\n}): JSX.Element {\n const caps: Array<[string, 'ui' | 'code' | 'doc' | 'data' | 'tool']> = [\n [t('guideCapUi'), 'ui'], [t('guideCapCode'), 'code'], [t('guideCapDoc'), 'doc'],\n [t('guideCapData'), 'data'], [t('guideCapTool'), 'tool'],\n ]\n const steps: Array<[number, string, string]> = [\n [1, t('guideStep1'), t('guideStep1Desc')],\n [2, t('guideStep2'), t('guideStep2Desc')],\n [3, t('guideStep3'), t('guideStep3Desc')],\n [4, t('guideStep4'), t('guideStep4Desc')],\n ]\n const bests = [t('guideBest1'), t('guideBest2'), t('guideBest3'), t('guideBest4')]\n return createPortal(\n <aside\n className={css.guidePanel}\n role=\"complementary\"\n aria-label={t('guidePanelTitle')}\n style={{ left, top, height }}\n >\n <div className={css.guidePanelHead}>\n <span className={css.guidePanelLogo}><GuideArtIconSmall /></span>\n <span className={css.guidePanelTitle}>{t('guidePanelTitle')}</span>\n <button type=\"button\" className={css.guidePanelClose} aria-label={t('guideClose')} onClick={onClose}>\n <IconCloseOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </div>\n\n <div className={css.guidePanelBody}>\n {/* \u4EC0\u4E48\u662F Skill */}\n <section className={css.guideSec}>\n <div className={css.guideSecHead}>\n <span className={css.guideSecIcon}><IconSkillOutlineRegular size={14} aria-hidden=\"true\" /></span>\n <span className={css.guideSecTitle}>{t('guideWhat')}</span>\n </div>\n <p className={css.guideWhatDesc}>{t('guideWhatDesc')}</p>\n <div className={css.guideCaps}>\n {caps.map(([label, kind]) => (\n <span key={label} className={css.guideCap}>\n <span className={css.guideCapIcon}><CapIcon kind={kind} /></span>\n <span className={css.guideCapLabel}>{label}</span>\n </span>\n ))}\n </div>\n </section>\n\n {/* \u56DB\u6B65\u6D41\u7A0B */}\n <section className={css.guideSec}>\n {steps.map(([num, title, desc]) => (\n <div key={num} className={css.guideStep}>\n <span className={css.guideStepNum}>{num}</span>\n <div className={css.guideStepBody}>\n <div className={css.guideStepTitleRow}>\n <span className={css.guideStepTitle}>{title}</span>\n <IconChevronRightOutlineRegular className={css.guideStepArrow} size={12} aria-hidden=\"true\" />\n </div>\n <p className={css.guideStepDesc}>{desc}</p>\n </div>\n </div>\n ))}\n </section>\n\n {/* \u6700\u4F73\u5B9E\u8DF5 */}\n <section className={css.guideBest}>\n <div className={css.guideBestTitle}>{t('guideBest')}</div>\n <ul className={css.guideBestList}>\n {bests.map((item) => (\n <li key={item} className={css.guideBestItem}>\n <CheckIcon />\n {item}\n </li>\n ))}\n </ul>\n <button type=\"button\" className={css.guideMoreBtn} onClick={onClose}>\n <span>{t('guideMoreBest')}</span>\n <ArrowRightIcon size={12} />\n </button>\n <span className={css.guideBestArt} aria-hidden=\"true\"><GuideArtIcon /></span>\n </section>\n </div>\n </aside>,\n document.body,\n )\n}\n", "/**\n * skills/icons \u2014 \u9762\u677F\u81EA\u7ED8\u56FE\u6807\uFF1A\u7EDF\u8BA1\u5361\u5B9E\u5FC3\u56FE\u6807 + Skills Hub \u7EBF\u6027\u56FE\u6807\uFF08Feather \u98CE\uFF09\u3002\n */\n/** ---------------------------------------------------------------- \u7EDF\u8BA1\u5361\u56FE\u6807\uFF08\u5B9E\u5FC3\u6E10\u53D8\uFF0C\u4E0E\u8BBE\u8BA1\u7A3F\u4E00\u81F4\uFF09 */\n\n/** \u84DD\u8272\u5B9E\u5FC3\u7ACB\u65B9\u4F53\uFF08\u7BA1\u7406\u7684\u6280\u80FD\uFF09\u3002 */\nexport function StatCubeIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <path d=\"M12 3 20.4 7.4 12 11.8 3.6 7.4Z\" fill=\"#6C92FF\" />\n <path d=\"M12 11.8 20.4 7.4v9.2L12 21Z\" fill=\"#2A55F2\" />\n <path d=\"M12 11.8 3.6 7.4v9.2L12 21Z\" fill=\"#174BFC\" />\n <path d=\"M12 3 20.4 7.4 12 11.8 3.6 7.4Z\" fill=\"none\" stroke=\"#FFFFFF\" strokeWidth=\"0.9\" strokeLinejoin=\"round\" opacity=\".9\" />\n </svg>\n )\n}\n\n/** \u7EFF\u8272\u5B9E\u5FC3\u5706 + \u767D\u8272\u5BF9\u52FE\uFF08\u5168\u5C40\u542F\u7528\uFF09\u3002 */\nexport function StatCheckCircleIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9.4\" fill=\"#0FC566\" />\n <path d=\"M7.9 12.3 10.7 15.1 16.2 9.2\" fill=\"none\" stroke=\"#FFFFFF\" strokeWidth=\"2.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\n/** \u7D2B\u8272\u5B9E\u5FC3\u5706\u89D2\u65B9\u5757 + \u767D\u8272\u5185\u683C\uFF08\u6563\u88C5\u6280\u80FD\uFF09\u3002 */\nexport function StatSquareIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <rect x=\"4.2\" y=\"4.2\" width=\"15.6\" height=\"15.6\" rx=\"3.2\" fill=\"#6C33F2\" />\n <path d=\"M7.8 7.8h8.4v8.4H7.8Z\" fill=\"#FFFFFF\" opacity=\".92\" />\n <path d=\"M7.8 7.8h4.2v4.2H7.8ZM12 12h4.2v4.2H12Z\" fill=\"#6C33F2\" />\n </svg>\n )\n}\n\n/** \u6A59\u8272\u5B9E\u5FC3\u5FC3\u5F62 + \u767D\u8272\u9AD8\u5149\u70B9\uFF08\u6280\u80FD\u5065\u5EB7\uFF09\u3002 */\nexport function StatHeartIcon({ size = 20 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <path d=\"M12 20.6C7.2 17.2 3.9 14 3.9 10.2 3.9 7.3 6.2 5.2 8.8 5.2c1.4 0 2.6.6 3.2 1.6.6-1 1.8-1.6 3.2-1.6 2.6 0 4.9 2.1 4.9 5 0 3.8-3.3 7-8.1 10.4z\" fill=\"#F4502A\" />\n <circle cx=\"8.9\" cy=\"9.3\" r=\"1.6\" fill=\"#FFFFFF\" opacity=\".95\" />\n </svg>\n )\n}\n\n/** ---------------------------------------------------------------- \u5DE6\u680F/\u5DE5\u5177\u680F\u5C0F\u56FE\u6807\uFF08\u7EBF\u6846\u98CE\u683C currentColor\uFF09 */\n\nexport function catStroke(): { fill: 'none'; stroke: 'currentColor'; strokeWidth: number; strokeLinecap: 'round'; strokeLinejoin: 'round' } {\n return { fill: 'none', stroke: 'currentColor', strokeWidth: 1.5, strokeLinecap: 'round', strokeLinejoin: 'round' }\n}\n\n/** \u5168\u90E8\uFF1A\u84DD\u65B9\u5185\u767D\u56DB\u683C\uFF08active \u4E3B\u5BFC\u8272\uFF09\u3002 */\nexport function CatAllIcon({ size = 16 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"4.5\" fill=\"currentColor\" />\n <path d=\"M9.2 9.2h5.6v5.6H9.2Z\" fill=\"#FFFFFF\" opacity=\".92\" />\n </svg>\n )\n}\n\n/** \u5C0F\u9501\uFF1A\u8BE5\u5DE5\u5177\u5728\u300C\u5168\u90E8 Agent\u300D\u5C42\u88AB\u505C\u7528\uFF08\u5168\u5C40\u4E00\u7968\u5426\u51B3\uFF0C\u9884\u8BBE\u5C42\u4E0D\u53EF\u62E8\u52A8\uFF09\u3002 */\nexport function LockGlyph({ size = 10 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()} strokeWidth={2}>\n <rect x=\"5\" y=\"10.5\" width=\"14\" height=\"9\" rx=\"2.4\" />\n <path d=\"M8.2 10.5V8.4a3.8 3.8 0 0 1 7.6 0v2.1\" />\n </svg>\n )\n}\n\n/** \u62D6\u653E\u4E91\u56FE\u6807\u3002 */\nexport function CloudUpIcon({ size = 18 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()}>\n <path d=\"M17.7 9.5A5.2 5.2 0 0 0 7.6 8.2 4 4 0 0 0 6.5 16h10.9a3.8 3.8 0 0 0 .5-7.6Z\" />\n <path d=\"M12 17.5v-5M9.6 14.6 12 12.2l2.4 2.4\" />\n </svg>\n )\n}\n\n/** \u540D\u79F0\u6392\u5E8F\u7BAD\u5934\uFF08\u2191/\u2193\uFF09\u3002 */\nexport function SortDirIcon({ dir, size = 12 }: { dir: 'asc' | 'desc'; size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()}>\n {dir === 'asc' ? <path d=\"M12 19V5M5.8 10.8 12 4.6l6.2 6.2\" /> : <path d=\"M12 5v14M5.8 13.2 12 19.4l6.2-6.2\" />}\n </svg>\n )\n}\n\n/** \u5206\u7EC4\u884C\u84DD\u8272\u6587\u4EF6\u5939\uFF08\u5B9E\u5FC3\uFF09\u3002 */\nexport function FolderBlueIcon({ size = 17 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\">\n <path d=\"M3.5 7.2a2.2 2.2 0 0 1 2.2-2.2h4l2 2.1h6.6a2.2 2.2 0 0 1 2.2 2.2v7.5a2.2 2.2 0 0 1-2.2 2.2H5.7a2.2 2.2 0 0 1-2.2-2.2Z\" fill=\"var(--dsw-alias-state-business-primary,#3d6be5)\" />\n <path d=\"M3.5 9.5h17v1.6a2.2 2.2 0 0 0-2.2-2.2H5.7a2.2 2.2 0 0 0-2.2 2Z\" fill=\"#FFFFFF\" opacity=\".25\" />\n </svg>\n )\n}\n\n/** \u53F3\u7BAD\u5934\uFF08\u6307\u5357\u6309\u94AE\uFF09\u3002 */\nexport function ArrowRightIcon({ size = 13 }: { size?: number }): JSX.Element {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" {...catStroke()}>\n <path d=\"M5 12h14M13 6l6 6-6 6\" />\n </svg>\n )\n}\n\n\n/** \u5FEB\u901F\u4E0A\u624B\u6307\u5357\uFF1A\u5E95\u90E8 3D \u4E66\u672C\u63D2\u56FE + \u661F\u70B9\u88C5\u9970\u3002 */\nexport function GuideArtIcon(): JSX.Element {\n return (\n <svg width=\"150\" height=\"86\" viewBox=\"0 0 150 86\" aria-hidden=\"true\">\n <defs>\n <linearGradient id=\"skm-guide-book\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0\" stopColor=\"#9DB7F7\" />\n <stop offset=\"1\" stopColor=\"#6E8FF0\" />\n </linearGradient>\n <linearGradient id=\"skm-guide-page\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0\" stopColor=\"#FFFFFF\" />\n <stop offset=\"1\" stopColor=\"#D9E4FF\" />\n </linearGradient>\n </defs>\n {/* \u80CC\u9762\u4E66\u9875 (\u53F3) */}\n <path d=\"M96 34 L141 52 L120 66 L78 50 Z\" fill=\"url(#skm-guide-page)\" stroke=\"#C7D6F7\" strokeWidth=\"1\" />\n {/* \u80CC\u9762\u4E66\u9875 (\u5DE6) */}\n <path d=\"M84 32 L50 52 L28 44 L64 26 Z\" fill=\"url(#skm-guide-page)\" stroke=\"#C7D6F7\" strokeWidth=\"1\" />\n {/* \u4E66\u5C01\u9762\u5E95\u5EA7 */}\n <path d=\"M64 26 L96 34 L78 50 L50 52 Z\" fill=\"url(#skm-guide-book)\" stroke=\"var(--dsw-alias-state-business-primary,#5b82e5)\" strokeWidth=\"1\" />\n <path d=\"M50 52 L28 44 L30 56 L52 66 Z\" fill=\"#B7C9F5\" stroke=\"var(--dsw-alias-state-business-primary,#5b82e5)\" strokeWidth=\"1\" />\n <path d=\"M78 50 L120 66 L118 78 L76 62 Z\" fill=\"#A9BEF1\" stroke=\"var(--dsw-alias-state-business-primary,#5b82e5)\" strokeWidth=\"1\" />\n {/* \u5C01\u9762\u4E0A\u7684\u5706\u5F62\u5FBD\u7AE0 */}\n <circle cx=\"73\" cy=\"44\" r=\"9\" fill=\"#FFFFFF\" opacity=\".85\" />\n <circle cx=\"73\" cy=\"44\" r=\"5.5\" fill=\"#6E8FF0\" />\n {/* \u661F\u70B9\u88C5\u9970 */}\n <path d=\"M118 10c.6 2.6 1.6 3.6 4.2 4.2-2.6.6-3.6 1.6-4.2 4.2-.6-2.6-1.6-3.6-4.2-4.2 2.6-.6 3.6-1.6 4.2-4.2Z\" fill=\"#BCCFFF\" />\n <path d=\"M126 26c.4 1.7 1 2.3 2.7 2.7-1.7.4-2.3 1-2.7 2.7-.4-1.7-1-2.3-2.7-2.7 1.7-.4 2.3-1 2.7-2.7Z\" fill=\"#C9D9FF\" />\n <circle cx=\"111\" cy=\"24\" r=\"2\" fill=\"#C9D9FF\" />\n </svg>\n )\n}\n\n/** \u6307\u5357\u9762\u677F logo\uFF1A\u5C0F\u4E66\u5757\u3002 */\nexport function GuideArtIconSmall(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"13\" height=\"12\" rx=\"2.5\" fill=\"var(--dsw-alias-state-business-primary,#3d6be5)\" />\n <path d=\"M4.5 5h7M4.5 8h7M4.5 11h4.5\" stroke=\"#FFFFFF\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\n/** \u590D\u5236\u56FE\u6807\uFF08Feather copy\uFF0C\u7EBF\u6027\u63CF\u8FB9\uFF0C\u4E0E\u5BFC\u822A\u624B\u7ED8\u56FE\u6807\u540C\u98CE\uFF09\u3002 */\nexport function CopyIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )\n}\n\n/** \u5B8C\u6210\u52FE\u56FE\u6807\uFF08Feather check\uFF09\u3002 */\nexport function CheckIcon(): JSX.Element {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n/* \u2500\u2500 Skills Hub \u9875\u9762\u56FE\u6807\uFF08Feather \u7EBF\u6027\u98CE\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nexport function SearchIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n )\n}\n\nexport function TagIcon(): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\" />\n <line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\" />\n </svg>\n )\n}\n\nexport function BulbIcon(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M9 18h6\" />\n <path d=\"M10 22h4\" />\n <path d=\"M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.3h6c0-1 .4-1.8 1-2.3A7 7 0 0 0 12 2z\" />\n </svg>\n )\n}\n\n/** \u54C1\u724C\u5B57\u6807\uFF1A\u4FA7\u680F Logo \u533A\u52A0\u7C97\u300Cskill\u300D\u6587\u5B57 SVG\uFF08\u65E0\u5E95\u8272\uFF0CcurrentColor = \u54C1\u724C\u84DD\uFF09\u3002 */\nexport function HubWordmarkIcon(): JSX.Element {\n return (\n <svg width=\"26\" height=\"12\" viewBox=\"0 0 26 12\" aria-hidden=\"true\">\n <text\n x=\"13\"\n y=\"10\"\n textAnchor=\"middle\"\n fontSize=\"10.5\"\n fontWeight=\"800\"\n letterSpacing=\"-0.15\"\n fontFamily=\"ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif\"\n fill=\"currentColor\"\n >skill</text>\n </svg>\n )\n}\n\n/** \u6280\u80FD\u5B57\u6807\uFF1A\u74F7\u7247\u5185\u7684\u300Cskill\u300D\u6587\u5B57 SVG\uFF08\u66FF\u6362\u539F\u56FE\u6807\uFF0C\u968F\u74F7\u7247 currentColor \u7740\u8272\uFF09\u3002 */\nexport function SkillWordmarkIcon(): JSX.Element {\n return (\n <svg width=\"34\" height=\"15\" viewBox=\"0 0 34 15\" aria-hidden=\"true\">\n <text\n x=\"17\"\n y=\"12\"\n textAnchor=\"middle\"\n fontSize=\"12\"\n fontWeight=\"800\"\n letterSpacing=\"-0.2\"\n fontFamily=\"ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif\"\n fill=\"currentColor\"\n >skill</text>\n </svg>\n )\n}\n", "/**\n * skills/locales \u2014 \u9762\u677F\u6587\u6848\u8868\uFF08SKILL \u4E0E MCP \u5171\u7528\uFF09\u4E0E\u63D2\u503C\u51FD\u6570 skillT\u3002\n */\n/** ---------------------------------------------------------------- \u6587\u6848\u4E0E\u53C2\u6570 */\n\nexport const SKILL_ZH: Record<string, string> = {\n entry: '\u80FD\u529B', panelTitle: '\u80FD\u529B\u7BA1\u7406', close: '\u5173\u95ED', loading: '\u6B63\u5728\u8BFB\u53D6\u6280\u80FD\u2026',\n error: '\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u6280\u80FD\u3002', retry: '\u91CD\u8BD5', refresh: '\u5237\u65B0',\n uploadHint: '\u62D6\u5165\u6280\u80FD\u6587\u4EF6\u5939\u5B89\u88C5\uFF0C\u6216\u70B9\u51FB\u9009\u62E9', uploadMeta: '{n} \u4E2A\u6587\u4EF6 \u00B7 {folder}',\n fileCount: '{n} \u6587\u4EF6', expandSkillFiles: '\u5C55\u5F00\u6280\u80FD\u6587\u4EF6', previewLoading: '\u6B63\u5728\u52A0\u8F7D\u5185\u5BB9\u2026', viewSkillFiles: '\u67E5\u770B\u6280\u80FD\u6587\u4EF6', viewerNav: '\u6280\u80FD\u6587\u4EF6', viewerFont: '\u5B57\u53F7', viewerSmall: '\u5C0F\u5B57\u53F7', viewerNormal: '\u6807\u51C6\u5B57\u53F7', viewerLarge: '\u5927\u5B57\u53F7', viewerFull: '\u5168\u5C4F\u67E5\u770B', viewerExitFull: '\u9000\u51FA\u5168\u5C4F', viewerFilesCount: '{n} \u4E2A\u6587\u4EF6', assignToBundle: '\u5F52\u5165 Bundle', assignTitle: '\u5C06\u300C{name}\u300D\u5F52\u5165', assignEmpty: '\u8FD8\u6CA1\u6709\u6280\u80FD\u5305,\u5148\u70B9\u300C\u65B0\u5EFA Bundle\u300D\u521B\u5EFA\u4E00\u4E2A\u3002', deleteSkillBtn: '\u5220\u9664\u6280\u80FD',\n installName: '\u6280\u80FD\u540D\u79F0', installNamePlaceholder: '\u4F8B\u5982 my-skill', installDescription: '\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09',\n installNameFromArchive: '\u6280\u80FD\u540D\u53D6\u81EA\u538B\u7F29\u5305\u5185\u7684 SKILL.md',\n installNameInvalid: '\u6280\u80FD\u540D\u53EA\u80FD\u5305\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26\uFF08a-z 0-9 -\uFF09',\n installBundle: '\u5F52\u5165 Bundle', installLoose: '\u4E0D\u5F52\u7EC4\uFF08\u6563\u88C5\uFF09', installConfirm: '\u5B89\u88C5', installCancel: '\u53D6\u6D88',\n bundlesTitle: '\u6280\u80FD\u5305', bundlesEmpty: '\u8FD8\u6CA1\u6709\u6280\u80FD\u5305\uFF0C\u70B9\u300C\u65B0\u5EFA Bundle\u300D\u521B\u5EFA\u4E00\u4E2A\u3002',\n // \u6280\u80FD\u5305\u5206\u7C7B\n bundleCatTitle: '\u5206\u7C7B', bundleCatAll: '\u5168\u90E8\u5206\u7C7B', bundleCatNone: '\u672A\u5206\u7C7B', bundleCatFilterAria: '\u6309\u5206\u7C7B\u7B5B\u9009\u6280\u80FD\u5305',\n bundleCatEdit: '\u8BBE\u7F6E\u5206\u7C7B', bundleCatEditTitle: '\u300C{name}\u300D\u7684\u5206\u7C7B', bundleCatPlaceholder: '\u81EA\u5B9A\u4E49\u5206\u7C7B\uFF0C\u56DE\u8F66\u6DFB\u52A0',\n bundleCatSaved: '\u5DF2\u66F4\u65B0\u300C{name}\u300D\u7684\u5206\u7C7B', bundleCatTip: '\u53EA\u770B\u300C{name}\u300D\u5206\u7C7B \u00B7 \u518D\u70B9\u4E00\u6B21\u53D6\u6D88\u7B5B\u9009',\n bundleCatLimit: '\u4E00\u4E2A\u6280\u80FD\u5305\u6700\u591A {n} \u4E2A\u5206\u7C7B', bundleCatDone: '\u4FDD\u5B58', bundleCatAddPreset: '\u52A0\u5165\u300C{name}\u300D',\n bundleCatEmptyHint: '\u8FD8\u6CA1\u5206\u7C7B\u3002\u70B9\u4E0B\u9762\u7684\u5EFA\u8BAE\u5206\u7C7B\uFF0C\u6216\u81EA\u5DF1\u5199\u4E00\u4E2A \u2014\u2014 \u5206\u7C7B\u53EA\u5F71\u54CD\u8FD9\u91CC\u7684\u67E5\u627E\uFF0C\u4E0D\u6539\u53D8\u6280\u80FD\u672C\u8EAB\u3002',\n bundleCatRemove: '\u79FB\u9664\u5206\u7C7B\u300C{name}\u300D', bundleCatCustom: '\u81EA\u5B9A\u4E49\u5206\u7C7B',\n bundleNoSkills: '\u8FD8\u6CA1\u6709\u6280\u80FD\uFF0C\u53EF\u4E0A\u4F20\u6216\u4ECE\u6563\u88C5\u6280\u80FD\u4E2D\u5F52\u5165\u3002',\n newBundle: '\u65B0\u5EFA\u6280\u80FD\u5305', newBundlePlaceholder: '\u6280\u80FD\u5305\u540D\u79F0', create: '\u521B\u5EFA', cancel: '\u53D6\u6D88',\n renameBundlePlaceholder: '\u65B0\u7684 Bundle \u540D\u79F0', rename: '\u91CD\u547D\u540D', delete: '\u5220\u9664',\n skillsCount: '{n} \u4E2A\u6280\u80FD', removeSkill: '\u79FB\u51FA',\n looseTitle: '\u6563\u88C5\u6280\u80FD', looseEmpty: '\u6CA1\u6709\u6563\u88C5 Skill',\n deleteBundleConfirm: '\u5220\u9664 Bundle\u300C{name}\u300D\uFF1F\u5176\u4E2D\u7684\u6280\u80FD\u5C06\u53D8\u4E3A\u6563\u88C5\u3002',\n deleteSkillConfirm: '\u5220\u9664\u6280\u80FD\u300C{name}\u300D\uFF1F\u6B64\u64CD\u4F5C\u4F1A\u5220\u9664\u5B83\u7684\u6587\u4EF6\u3002',\n enableSkill: '\u542F\u7528', disableSkill: '\u7981\u7528',\n enableBundle: '\u542F\u7528\u5168\u90E8', disableBundle: '\u7981\u7528\u5168\u90E8',\n toggleFailed: '\u5207\u6362\u5931\u8D25\uFF1A{message}',\n presetAll: '\u5168\u90E8',\n presetAllName: '\u5168\u90E8 Agent',\n presetStripLabel: 'Agent \u9884\u8BBE',\n presetHintAll: '\u5F53\u524D\u7F16\u8F91\u300C\u5168\u90E8 Agent\u300D\uFF1A\u5F00\u5173\u76F4\u63A5\u6539\u6280\u80FD\u6587\u4EF6\uFF0C\u5BF9\u6240\u6709\u9884\u8BBE\u751F\u6548\u3002',\n presetHintScoped: '\u5F53\u524D\u7F16\u8F91\u300C{name}\u300D\uFF1A\u53EA\u5BF9\u8BE5 Agent \u9884\u8BBE\u751F\u6548\uFF0C\u5176\u5B83\u9884\u8BBE\u4E0D\u53D7\u5F71\u54CD\u3002',\n presetReset: '\u6E05\u7A7A\u8BE5\u9884\u8BBE\u7684\u5355\u72EC\u8BBE\u7F6E',\n presetDefaultTag: '\u9ED8\u8BA4',\n presetOverrideCount: '{n} \u9879\u5355\u72EC\u8BBE\u7F6E',\n presetLockedByGlobal: '\u300C\u5168\u90E8 Agent\u300D\u5C42\u5DF2\u7981\u7528\uFF0C\u9884\u8BBE\u5C42\u65E0\u6CD5\u6253\u5F00',\n // \u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\u6587\u6848\n copySkillName: '\u590D\u5236\u6280\u80FD\u540D', copiedSkillName: '\u5DF2\u590D\u5236', toolsLabel: '\u5DE5\u5177', scopeAll: '\u5168\u5C40', tagLoose: '\u6563\u88C5',\n // Skills Hub \u9875\u9762\u6587\u6848\n hubSubtitle: 'Skill \u7BA1\u7406\u5DE5\u4F5C\u533A', hubWorkspace: '\u5DE5\u4F5C\u533A', hubManage: '\u7BA1\u7406',\n hubMySkills: '\u6211\u7684\u6280\u80FD', hubAddSkills: '\u6DFB\u52A0\u6280\u80FD', hubBundles: '\u6280\u80FD\u5305', hubPresets: 'Agent \u9884\u8BBE', hubLoose: '\u6563\u88C5\u6280\u80FD',\n statManaged: '\u7BA1\u7406\u7684\u6280\u80FD', statEnabled: '\u5168\u5C40\u542F\u7528', statLoose: '\u6563\u88C5\u6280\u80FD', statSync: '\u6280\u80FD\u5065\u5EB7', statHealthy: '\u5168\u90E8\u5065\u5EB7',\n statManagedDesc: '\u60A8\u521B\u5EFA\u548C\u7BA1\u7406\u7684\u6280\u80FD\u603B\u6570', statEnabledDesc: '\u5728\u6240\u6709 Agent \u4E2D\u542F\u7528\u7684\u6280\u80FD',\n statLooseDesc: '\u672A\u5206\u7C7B\u7684\u6563\u88C5\u6280\u80FD', statSyncDesc: '\u6240\u6709\u6280\u80FD\u8FD0\u884C\u6B63\u5E38',\n statChecking: '\u68C0\u6D4B\u4E2D\u2026', statIssues: '{n} \u4E2A\u95EE\u9898', statUnknown: '\u68C0\u6D4B\u5931\u8D25', statPending: '\u5F85\u68C0\u6D4B',\n searchPlaceholder: '\u641C\u7D22\u6280\u80FD\u540D\u79F0\u3001\u63CF\u8FF0\u6216\u6807\u7B7E\u2026', filterAll: '\u5168\u90E8', filterBundles: '\u6280\u80FD\u5305', filterLoose: '\u6563\u88C5\u6280\u80FD', sortLabel: '\u540D\u79F0',\n presetSelect: 'Agent \u9884\u8BBE', viewList: '\u5217\u8868', viewGrid: '\u7F51\u683C',\n bannerTitle: '\u6DFB\u52A0\u6280\u80FD', bannerSub: '\u62D6\u5165\u6280\u80FD\u6587\u4EF6\u5939\u5B89\u88C5\uFF0C\u6216\u70B9\u51FB\u6D4F\u89C8\u9009\u62E9',\n bannerDiscovered: '\u53D1\u73B0\u5F85\u5BFC\u5165\u6280\u80FD', bannerFound: '\u53D1\u73B0 {n} \u4E2A\u6587\u4EF6\uFF08{folder}\uFF09\u5F85\u5BFC\u5165', bannerBtnBrowse: '\u6D4F\u89C8\u5E76\u5BFC\u5165', bannerBtnReview: '\u5BA1\u67E5\u5E76\u5BFC\u5165',\n noMatch: '\u6CA1\u6709\u7B26\u5408\u7B5B\u9009\u6761\u4EF6\u7684\u6280\u80FD',\n // \u5DE6\u680F\uFF1AAgent \u9884\u8BBE\u5206\u7C7B / \u5FEB\u6377\u7B5B\u9009 / \u6DFB\u52A0\u6280\u80FD\u5361\n presetCatTitle: 'Agent \u9884\u8BBE\u5206\u7C7B', quickFilter: '\u5FEB\u6377\u7B5B\u9009',\n catAll: '\u5168\u90E8', catStandard: '\u6807\u51C6\u6A21\u5F0F', catPtc: 'PTC \u6A21\u5F0F', catExtreme: '\u6781\u9650\u6A21\u5F0F', catCreative: '\u521B\u610F\u6A21\u5F0F',\n statusAll: '\u5168\u90E8', statusOn: '\u5DF2\u542F\u7528', statusOff: '\u5DF2\u505C\u7528',\n toolAll: '\u5168\u90E8\u5DE5\u5177', updatedAll: '\u6700\u8FD1\u66F4\u65B0', filterUpdated: '\u6700\u8FD1\u66F4\u65B0',\n addSkillsTitle: '\u6DFB\u52A0\u6280\u80FD', addSkillsSub: '\u62D6\u5165\u6280\u80FD\u6587\u4EF6\u5B89\u88C5\uFF0C\u6216\u70B9\u51FB\u6D4F\u89C8\u9009\u62E9',\n dropHere: '\u62D6\u62FD\u6587\u4EF6\u5230\u6B64\u5904', dropFormat: '\u652F\u6301 .zip .skill \u7B49\u683C\u5F0F', browseImport: '\u6D4F\u89C8\u5E76\u5BFC\u5165',\n // \u5FEB\u901F\u4E0A\u624B\u6307\u5357\u5361\n guideTitle: '\u5FEB\u901F\u4E0A\u624B\u6307\u5357',\n guideDesc1: '\u4E86\u89E3 Skill \u7684\u4F5C\u7528\u548C\u4F7F\u7528\u65B9\u6CD5',\n guideDesc2: '\u5FEB\u901F\u521B\u5EFA\u4F60\u7684\u7B2C\u4E00\u4E2A Skill',\n guideStart: '\u5F00\u59CB\u5B66\u4E60',\n guidePanelTitle: '\u5FEB\u901F\u4E0A\u624B',\n guideWhat: '\u4EC0\u4E48\u662F Skill?',\n guideWhatDesc: 'Skill \u662F Agent \u7684\u80FD\u529B\u6A21\u5757\uFF0C\u53EF\u4EE5\u8BA9 Agent \u5B66\u4F1A\u7279\u5B9A\u4EFB\u52A1\u3001\u6269\u5C55\u66F4\u591A\u80FD\u529B\u3002',\n guideCapUi: 'UI \u8BBE\u8BA1', guideCapCode: '\u4EE3\u7801\u751F\u6210', guideCapDoc: '\u6587\u6863\u5904\u7406', guideCapData: '\u6570\u636E\u5206\u6790', guideCapTool: '\u5DE5\u5177\u8C03\u7528',\n guideStep1: '\u521B\u5EFA Skill', guideStep1Desc: '\u901A\u8FC7\u4E0A\u4F20\u6587\u4EF6\u6216\u914D\u7F6E\u89C4\u5219\uFF0C\u521B\u5EFA\u65B0\u7684 Skill\uFF0C\u8BA9 Agent \u5B66\u4F1A\u65B0\u80FD\u529B\u3002',\n guideStep2: '\u914D\u7F6E Skill', guideStep2Desc: '\u8BBE\u7F6E\u8F93\u5165\u8F93\u51FA\u3001\u53C2\u6570\u548C\u6743\u9650\uFF0C\u786E\u4FDD Skill \u80FD\u6B63\u786E\u88AB Agent \u8C03\u7528\u3002',\n guideStep3: '\u542F\u7528\u7ED9 Agent', guideStep3Desc: '\u5C06 Skill \u542F\u7528\u5230 Agent \u4E2D\uFF0C\u8BA9 Agent \u5728\u5BF9\u8BDD\u4E2D\u81EA\u52A8\u4F7F\u7528\u3002',\n guideStep4: '\u67E5\u770B\u6548\u679C', guideStep4Desc: '\u5728\u5BF9\u8BDD\u4E2D\u6D4B\u8BD5 Skill \u7684\u6548\u679C\uFF0C\u6301\u7EED\u4F18\u5316\u6280\u80FD\u8868\u73B0\u3002',\n guideFull: '\u67E5\u770B\u5B8C\u6574\u6307\u5357',\n guideBest: '\u6700\u4F73\u5B9E\u8DF5',\n guideBest1: '\u4E00\u4E2A Skill \u4E13\u6CE8\u4E00\u4E2A\u80FD\u529B', guideBest2: '\u63CF\u8FF0\u6E05\u695A\u8F93\u5165\u548C\u8F93\u51FA',\n guideBest3: '\u5B9A\u671F\u66F4\u65B0\u6280\u80FD\u6587\u4EF6', guideBest4: '\u4E0D\u8981\u521B\u5EFA\u91CD\u590D\u80FD\u529B',\n guideMoreBest: '\u4E86\u89E3\u66F4\u591A\u6700\u4F73\u5B9E\u8DF5',\n guideClose: '\u6536\u8D77\u6307\u5357',\n // SKILL / MCP \u9876\u5C42 tab\n kindSkill: 'SKILL', kindPrompt: '\u63D0\u793A\u8BCD', kindMcp: 'MCP',\n // MCP \u89C6\u56FE\n mcpServer: 'MCP Server', mcpTools: '\u5DE5\u5177\u5217\u8868', mcpLog: '\u8FDE\u63A5\u65E5\u5FD7', mcpConfig: '\u914D\u7F6E\u6A21\u677F',\n mcpRecommendMenu: '\u63A8\u8350 MCP Server', mcpRecommendTitle: '\u63A8\u8350 MCP Server', mcpAdd: '\u6DFB\u52A0',\n // MCP Server \u9875\uFF08\u56FE\u4E00\u5934\u90E8 + \u7EDF\u8BA1\u5361\uFF09\n mcpTitle: 'MCP \u7BA1\u7406', mcpProtocol: 'Model Contest Protocol',\n mcpSubtitle: '\u7BA1\u7406 MCP Server\uFF0C\u6269\u5C55 Agent \u80FD\u529B\u8FB9\u754C',\n mcpMarketplace: 'MCP Marketplace', mcpAddServer: '\u6DFB\u52A0 MCP Server',\n mcpStatTotal: 'MCP Server \u603B\u6570', mcpStatTotalDesc: '\u5DF2\u6DFB\u52A0\u7684 MCP Server',\n mcpStatEnabled: '\u5DF2\u542F\u7528', mcpStatEnabledDesc: 'Agent \u53EF\u4F7F\u7528',\n mcpStatTools: '\u53EF\u7528\u5DE5\u5177', mcpStatToolsDesc: '\u901A\u8FC7 MCP \u63D0\u4F9B\u7684\u5DE5\u5177',\n mcpStatRunning: '\u8FD0\u884C\u4E2D', mcpStatRunningDesc: '\u5F53\u524D\u8FDE\u63A5\u6B63\u5E38',\n // \u63A8\u8350 Skill\n skillRecommendTitle: '\u63A8\u8350 Skill',\n // MCP Server \u5217\u8868\uFF08\u56FE\u4E8C\uFF09\n mcpListTitle: 'MCP Server \u5217\u8868', mcpEmptyList: '\u6682\u65E0 MCP Server\uFF0C\u70B9\u51FB\u53F3\u4E0A\u89D2\u300C\u6DFB\u52A0 MCP Server\u300D\u5F00\u59CB\u63A5\u5165\u3002',\n mcpViewAll: '\u67E5\u770B\u5168\u90E8 {n} \u4E2A MCP Server',\n mcpAdded: '\u5DF2\u6DFB\u52A0', mcpRemove: '\u79FB\u9664',\n mcpAddModalTitle: '\u6DFB\u52A0 MCP Server',\n mcpAddName: '\u540D\u79F0', mcpAddNamePlaceholder: '\u4F8B\u5982 My MCP',\n mcpAddDesc: '\u63CF\u8FF0\uFF08\u53EF\u9009\uFF09', mcpAddDescPlaceholder: '\u7B80\u5355\u63CF\u8FF0\u8FD9\u4E2A MCP \u7684\u7528\u9014',\n mcpAddType: '\u8FDE\u63A5\u7C7B\u578B', mcpAddTypeStdio: 'stdio', mcpAddTypeHttp: 'http', mcpAddTypeSse: 'sse',\n mcpAddCommand: '\u542F\u52A8\u547D\u4EE4', mcpAddCommandPlaceholder: '\u4F8B\u5982 npx -y @modelcontextprotocol/server-filesystem',\n mcpAddUrl: '\u63A5\u53E3\u5730\u5740', mcpAddUrlPlaceholder: '\u4F8B\u5982 https://example.com/mcp',\n mcpAddConfirm: '\u6DFB\u52A0', mcpAddCat: '\u81EA\u5B9A\u4E49',\n // \u5DE5\u5177\u5217\u8868\u9875\n mcpToolsTitle: '\u53EF\u7528\u5DE5\u5177 \u00B7 {n}',\n mcpToolsSearch: '\u641C\u7D22\u5DE5\u5177\u2026',\n mcpToolsEmpty: '\u6682\u65E0\u53EF\u7528\u5DE5\u5177\uFF1A\u5148\u6DFB\u52A0\u5E76\u542F\u7528 MCP Server',\n // \u63A8\u8350\u9875\u8054\u7F51\u641C\u7D22\n mcpSearchPlaceholder: '\u641C\u7D22 MCP Server\uFF0C\u5982 google / \u9489\u9489 / \u98DE\u4E66\u2026',\n mcpSearching: '\u6B63\u5728\u641C\u7D22\u5916\u90E8 MCP \u76EE\u5F55\u2026',\n mcpSearchResults: '\u641C\u7D22\u7ED3\u679C \u00B7 {n}',\n mcpSearchEmpty: '\u6CA1\u6709\u627E\u5230\u300C{q}\u300D\u76F8\u5173\u7684 MCP\uFF0C\u6362\u4E2A\u5173\u952E\u8BCD\u8BD5\u8BD5',\n mcpOpen: '\u6253\u5F00',\n mcpOpenGitHub: 'GitHub \u4ED3\u5E93',\n mcpOpenRegistry: 'MCP Registry',\n mcpResolving: '\u89E3\u6790\u4E2D\u2026',\n mcpResolveFailed: '\u672A\u80FD\u8BC6\u522B\u5B89\u88C5\u65B9\u5F0F\uFF0C\u8BF7\u6253\u5F00\u4ED3\u5E93\u67E5\u770B\u914D\u7F6E',\n // \u8FDE\u63A5\u65E5\u5FD7\u9875\n mcpLogTitle: '\u8FDE\u63A5\u65E5\u5FD7',\n mcpLogEmpty: '\u6682\u65E0\u8FDE\u63A5\u65E5\u5FD7\uFF0C\u63A5\u5165 MCP Server \u540E\u81EA\u52A8\u8BB0\u5F55',\n mcpLogClear: '\u6E05\u7A7A\u65E5\u5FD7',\n mcpLogAdd: '\u5DF2\u6DFB\u52A0', mcpLogEnable: '\u5DF2\u542F\u7528', mcpLogDisable: '\u5DF2\u7981\u7528', mcpLogRemove: '\u5DF2\u79FB\u9664',\n // \u914D\u7F6E\u6A21\u677F\u9875\n mcpConfigTitle: '\u914D\u7F6E\u6A21\u677F',\n mcpConfigCopy: '\u590D\u5236', copied: '\u5DF2\u590D\u5236',\n mcpTagOfficial: '\u5B98\u65B9', mcpTagCommunity: '\u793E\u533A',\n mcpStatusEnabled: '\u5DF2\u542F\u7528', mcpStatusDisabled: '\u5DF2\u7981\u7528',\n mcpAutostart: '\u81EA\u542F\u52A8',\n mcpAutostartTitle: '\u4F1A\u8BDD\u542F\u52A8\u65F6\u81EA\u52A8\u62C9\u8D77\u8BE5 MCP \u8FDB\u7A0B\uFF08\u5173\u95ED\u53EF\u8282\u7701\u5185\u5B58\uFF09',\n // \u771F\u5B9E\u6CE8\u518C\u72B6\u6001\uFF08mcp-client \u6865\u63A5\uFF09\n mcpLiveNote: '\u4EE5\u4E0B\u4E3A DSH \u5B9E\u9645\u6CE8\u518C\u7684 MCP Server\u00B7\u53F3\u4E0A\u5F00\u5173 = \u542F\u7528/\u7981\u7528\uFF08\u5B9E\u65F6\u751F\u6548\uFF09\u00B7\u62A5 Session not found \u65F6\u5F00\u5173\u5207\u4E00\u6B21\uFF08\u7981\u2192\u542F\uFF09\u5373\u91CD\u8FDE\uFF0C\u65E0\u9700\u91CD\u542F DSH',\n mcpLiveDisabled: '\u5DF2\u7981\u7528',\n mcpLiveToggleFailed: '\u5207\u6362\u5931\u8D25\uFF08\u914D\u7F6E\u5199\u4FDD\u62A4\u6216\u6761\u76EE\u7F3A\u5931\uFF09',\n mcpLiveEmpty: '\u672A\u68C0\u6D4B\u5230\u5DF2\u6CE8\u518C\u7684 MCP Server\uFF1A\u5728 cordis.patch.yml \u6DFB\u52A0 mcp-client \u6761\u76EE\u5E76\u91CD\u542F DSH \u540E\u5373\u53EF',\n mcpLiveUnavailable: '\u72B6\u6001\u63A5\u53E3\u672A\u5C31\u7EEA\uFF08host \u6539\u52A8\u9700\u91CD\u542F DSH \u670D\u52A1\uFF09\uFF1A\u6865\u63A5\u5DE5\u5177\u4ECD\u53EF\u7528\uFF0C\u6B64\u9875\u6682\u65E0\u6CD5\u8BFB\u53D6\u6CE8\u518C\u8868',\n mcpLiveRegistered: '\u5DF2\u6CE8\u518C',\n mcpLiveRegisteredTitle: '\u5DF2\u6865\u63A5',\n mcpLiveToolsOf: '\u5DE5\u5177',\n mcpLiveRefresh: '\u5237\u65B0',\n mcpConnStatus: '\u8FDE\u63A5\u72B6\u6001', mcpConnOk: '\u5DF2\u8FDE\u63A5', mcpConnDown: '\u4E0D\u53EF\u7528', mcpConnTip: '\u5B9E\u65F6\u8BFB\u53D6\u5230 {n} \u4E2A\u5168\u5C40 MCP Server',\n mcpLiveConfigHint: '\u6DFB\u52A0\uFF1A\u7F16\u8F91 cordis.patch.yml\uFF08\u6216\u4F7F\u7528\u300C\u6DFB\u52A0 MCP Server\u300D\u751F\u6210\u914D\u7F6E\u7247\u6BB5\uFF09',\n // \u9884\u8BBE\u7EF4\u5EA6\uFF080.1.6\uFF09\uFF1A\u5168\u5C40 / \u9884\u8BBE\u4E13\u5C5E / \u906E\u853D\n mcpScopeTitle: 'Agent \u9884\u8BBE\u8303\u56F4',\n mcpScopeHintAll: '\u5F53\u524D\u67E5\u770B\u5168\u5C40 Server\uFF08\u6240\u6709\u9884\u8BBE\u5171\u7528\uFF09\u3002\u9009\u62E9\u67D0\u4E2A\u9884\u8BBE\uFF0C\u53EF\u7BA1\u7406\u5B83\u4E13\u5C5E\u7684 Server \u4E0E\u906E\u853D\u3002',\n mcpPresetGlobalSection: '\u7EE7\u627F\u7684\u5168\u5C40 Server',\n mcpPresetOwnSection: '\u8BE5\u9884\u8BBE\u4E13\u5C5E Server',\n mcpPresetMasked: '\u5DF2\u906E\u853D',\n mcpPresetMaskState: '\u7EE7\u627F\u5168\u5C40\uFF08\u672A\u906E\u853D\uFF09',\n mcpPresetMaskHint: '\u5173\u6389\u5F00\u5173 = \u5BF9\u8BE5\u9884\u8BBE\u906E\u853D\uFF1A\u5DE5\u5177\u3001\u670D\u52A1\u5668\u6307\u4EE4\u4E0E\u8D44\u6E90\u8BFB\u53D6\u90FD\u9690\u85CF\uFF1B\u5168\u5C40\u8FDE\u63A5\u4FDD\u7559\uFF08\u8981\u300C\u4E0D\u8FDE\u63A5\u300D\u8BF7\u6539\u7528\u300C\u4E13\u5C5E Server\u300D\uFF09\u3002',\n mcpPresetCovered: '\u5DF2\u88AB\u672C\u9884\u8BBE\u540C\u540D Server \u8986\u76D6',\n mcpPresetOwnHint: '\u4E13\u5C5E Server \u5199\u8FDB\u8BE5\u9884\u8BBE\u58F0\u660E\u884C\u7684 plugins\uFF1A\u72EC\u7ACB\u8FDE\u63A5\uFF0C\u4EC5\u8BE5\u9884\u8BBE\u4E0E\u5176\u5B50\u4EE3\u7406\u53EF\u89C1\u3002',\n mcpAddServerGlobal: '\u6DFB\u52A0 MCP Server\uFF08\u5168\u5C40\uFF09',\n mcpAddGlobalHint: '\u5168\u5C40 Server \u5BF9\u6240\u6709\u9884\u8BBE\u751F\u6548\uFF1B\u53EA\u60F3\u7ED9\u5F53\u524D\u9884\u8BBE\u7528\uFF0C\u8BF7\u70B9\u5DE6\u4FA7\u7684\u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\u3002',\n mcpOwnRemoveConfirmTitle: '\u79FB\u9664\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\uFF1F',\n mcpOwnRemoveConfirmMsg: '\u5C06\u4ECE\u300C{name}\u300D\u7684\u58F0\u660E\u884C\u91CC\u5220\u6389\u8FD9\u4E00\u6761 mcp-client \u6761\u76EE\uFF08\u7531 DSH \u539F\u5B50\u5199\u56DE profile \u914D\u7F6E\uFF09\uFF0C\u5BF9\u8BE5\u9884\u8BBE\u7684\u65B0\u4F1A\u8BDD\u751F\u6548\uFF1B\u5168\u5C40\u7684\u540C\u540D Server \u4E0D\u53D7\u5F71\u54CD\u3002',\n // \u540C\u540D\u8986\u76D6\uFF1A\u9884\u8BBE\u81EA\u5E26\u540C\u540D Server \u65F6\u7684\u906E\u853D\u5F00\u5173\u4E0E\u63D0\u793A\n mcpPresetCoveredSwitchHint: '\u906E\u853D\u5168\u5C40\u8FD9\u4E00\u6761\u3002\u8BE5\u9884\u8BBE\u81EA\u5E26\u540C\u540D Server\uFF0C\u5DE5\u5177\u4ECD\u7531\u5B83\u63D0\u4F9B \u2014\u2014 \u8981\u4E00\u8D77\u5173\u6389\u8BF7\u79FB\u9664\u4E0B\u65B9\u300C\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\u300D\u3002',\n mcpPresetCoveredMasked: '\u5DF2\u906E\u853D\u5168\u5C40\u8FD9\u4E00\u6761 \u00B7 \u5DE5\u5177\u4ECD\u7531\u8BE5\u9884\u8BBE\u540C\u540D Server \u63D0\u4F9B',\n mcpPresetShadowGlobalTag: '\u540C\u540D\u5168\u5C40',\n mcpPresetShadowGlobalTip: '\u5168\u5C40\u4E5F\u6709\u4E00\u53F0\u540C\u540D Server\u3002\u672C\u9884\u8BBE\u7528\u81EA\u5E26\u7684\u8FD9\u53F0\uFF0C\u4E24\u8FB9\u7684\u5DE5\u5177\u5F00\u5173\u5404\u8BB0\u5404\u7684\u8D26\uFF08\u4E92\u4E0D\u5F71\u54CD\uFF09\u3002',\n mcpPresetOwnEmpty: '\u8BE5\u9884\u8BBE\u8FD8\u6CA1\u6709\u4E13\u5C5E Server',\n mcpPresetStorageHint: '\u8BE5\u9884\u8BBE\u7531\u968F\u5B89\u88C5\u7684 bundle \u58F0\u660E\uFF1A\u5199\u5165\u4F1A\u5728 profile \u5C42\u6574\u4EFD\u8986\u76D6\u5B83\u7684 plugins\uFF0C\u6B64\u540E\u8BE5\u9884\u8BBE\u4E0D\u518D\u8DDF\u968F DSH \u5347\u7EA7\u53D8\u5316\u3002',\n mcpPresetAddOwn: '\u6DFB\u52A0\u4E13\u5C5E Server',\n mcpPresetNewSession: '\u9884\u8BBE\u6539\u52A8\uFF08\u70ED\u91CD\u8F7D\uFF09\u5BF9\u65B0\u4F1A\u8BDD\u751F\u6548',\n mcpPresetFailed: '\u64CD\u4F5C\u5931\u8D25\uFF1A{message}',\n // MCP \u9875\uFF08\u4E0E\u6280\u80FD\u9875\u540C\u6784\uFF09\uFF1A\u7EDF\u8BA1\u5361 / \u63D0\u793A\u884C / \u5DE5\u5177\u6761\n mcpStatManaged: '\u7BA1\u7406\u7684 Server', mcpStatManagedDesc: '\u60A8\u63A5\u5165\u7684 MCP Server \u603B\u6570',\n mcpStatGlobal: '\u5168\u5C40 Server', mcpStatGlobalDesc: '\u6240\u6709 Agent \u9884\u8BBE\u5171\u7528',\n mcpStatOwn: '\u9884\u8BBE\u4E13\u5C5E', mcpStatOwnDesc: '\u53EA\u5728\u67D0\u4E2A\u9884\u8BBE\u5185\u751F\u6548',\n mcpStatHealth: '\u8FDE\u63A5\u72B6\u6001', mcpStatHealthDesc: '\u5DF2\u505C\u7528\u7684\u6761\u76EE\u4E0D\u8BA1\u5165\u5DE5\u5177',\n mcpHealthOk: '\u5168\u90E8\u8FD0\u884C\u4E2D', mcpHealthWarn: '{n} \u4E2A\u5DF2\u505C\u7528',\n mcpScopeAllTip: '\u5168\u90E8 Agent\uFF1A{n} \u4E2A\u5168\u5C40 Server\uFF08\u6240\u6709\u9884\u8BBE\u5171\u7528\uFF09',\n mcpScopePresetTip: '\u8BE5\u9884\u8BBE\u53EF\u89C1 {n} \u4E2A Server',\n mcpScopeOverrideCount: '{n} \u9879\u5355\u72EC\u8BBE\u7F6E',\n mcpScopeHintScoped: '\u5F53\u524D\u7F16\u8F91\u300C{name}\u300D\uFF1A\u4E13\u5C5E Server \u53EA\u5BF9\u8FD9\u4E2A\u9884\u8BBE\u751F\u6548\uFF1B\u5F00\u5173 = \u906E\u853D\u5B83\u7EE7\u627F\u7684\u5168\u5C40 Server\uFF0C\u5176\u5B83\u9884\u8BBE\u4E0D\u53D7\u5F71\u54CD\u3002',\n mcpWaitingTools: '\u6B63\u5728\u7B49\u5F85\u300C{names}\u300D\u8FDE\u63A5\u5E76\u6CE8\u518C\u5DE5\u5177\u2026\uFF08\u81EA\u52A8\u5237\u65B0\u4E2D\uFF0C\u65E0\u9700\u624B\u52A8\u70B9\u5237\u65B0\uFF09',\n mcpToolsPendingReg: '\u7B49\u5F85\u6CE8\u518C',\n mcpToolsPendingRegTip: '\u5DE5\u5177\u540D\u6765\u81EA\u5386\u53F2\u7F13\u5B58\uFF1A\u8FDB\u7A0B\u8FD8\u5728\u8FDE\u63A5\uFF0C\u6CE8\u518C\u5B8C\u6210\u540E\u6570\u91CF\u4F1A\u81EA\u52A8\u66F4\u65B0\u4E3A\u5B9E\u9645\u503C\u3002',\n // \u5168\u5C40\u4E00\u7968\u5426\u51B3\uFF08\u5DE5\u5177\u7EA7\uFF09\n mcpToolGlobalOff: '\u5168\u5C40\u5DF2\u505C\u7528',\n mcpToolGlobalOffTip: '\u5168\u5C40\u5DF2\u505C\u7528\uFF1A\u8BE5\u5DE5\u5177\u5728\u300C\u5168\u90E8 Agent\u300D\u5C42\u88AB\u5173\u95ED \u2014\u2014 \u4E00\u7968\u5426\u51B3\uFF0C\u6240\u6709\u9884\u8BBE\u90FD\u4E0D\u53EF\u89C1\u3001\u4E0D\u53EF\u8C03\u7528\uFF08\u9884\u8BBE\u5C42\u4E0D\u53EF\u62E8\u52A8\uFF09\u3002\u5404\u9884\u8BBE\u539F\u6709\u7684\u4E2A\u6027\u5316\u8BBE\u7F6E\u5DF2\u4FDD\u7559\uFF0C\u5168\u5C40\u6062\u590D\u540E\u81EA\u52A8\u8FD8\u539F\u3002',\n // \u4E00\u952E\u5168\u7981 / \u5168\u5F00\n mcpToolAllAria: '\u300C{name}\u300D\u7684\u5168\u90E8\u5DE5\u5177',\n mcpToolAllEnable: '\u5F00\u542F\u8BE5 MCP \u7684\u5168\u90E8\u5DE5\u5177',\n mcpToolAllDisable: '\u4E00\u952E\u7981\u7528\u8BE5 MCP \u7684\u5168\u90E8\u5DE5\u5177\uFF08\u53EA\u5173\u5DE5\u5177\uFF0C\u4FDD\u7559\u8FDE\u63A5\uFF09',\n mcpToolAllPartial: '\u90E8\u5206\u5DE5\u5177\u5DF2\u7981\u7528',\n // \u906E\u853D\u5B89\u88C5\u8BCA\u65AD\n mcpMaskInstallFailed: '\u906E\u853D\u672A\u5728\u8FD0\u884C\u671F\u751F\u6548\uFF1A{message}',\n mcpMaskNoAgent: '\u906E\u853D\u5DF2\u5199\u5165\uFF0C\u4F46\u8BE5\u9884\u8BBE\u5F53\u524D\u6CA1\u6709\u6D3B\u52A8\u4F1A\u8BDD \u2014\u2014 \u65B0\u4F1A\u8BDD\u8D77\u751F\u6548\u3002',\n mcpMaskNoDeny: '\u906E\u853D\u5DF2\u5199\u5165\uFF0C\u4F46\u8FD0\u884C\u671F\u8FD8\u6CA1\u62D2\u5230\u4EFB\u4F55\u5DE5\u5177\uFF08\u8BE5 MCP \u53EF\u80FD\u5C1A\u672A\u6CE8\u518C\u5DE5\u5177\uFF09\u3002\u82E5\u5BF9\u8BDD\u91CC\u4ECD\u80FD\u770B\u5230\u5B83\u7684\u5DE5\u5177\uFF0C\u8BF7\u91CD\u5F00\u4F1A\u8BDD\u6216\u91CD\u542F DSH\u3002',\n mcpSearchServers: '\u641C\u7D22 Server \u540D\u79F0\u6216\u5DE5\u5177\u2026',\n mcpListFilteredEmpty: '\u6CA1\u6709\u7B26\u5408\u7B5B\u9009\u6761\u4EF6\u7684 Server',\n mcpToolsUnavailable: '\u5DE5\u5177\u4E0D\u53EF\u7528',\n // \u5DE5\u5177\u7EA7\u542F\u505C\uFF08\u5361\u7247\u4E0A\u7684\u5DE5\u5177 chips\uFF09\n mcpToolsHint: '\u70B9\u51FB\u5DE5\u5177\u540D\u53EF\u5355\u72EC\u542F\u505C\uFF1A\u7EFF = \u542F\u7528\uFF0C\u7070 = \u7981\u7528\u3002',\n mcpToolChipsAria: '\u300C{name}\u300D\u63D0\u4F9B\u7684\u5DE5\u5177',\n mcpToolClickEnable: '\u70B9\u51FB\u542F\u7528\u8BE5\u5DE5\u5177',\n mcpToolClickDisable: '\u70B9\u51FB\u7981\u7528\u8BE5\u5DE5\u5177',\n mcpToolDisabledCount: '{n} \u4E2A\u5DE5\u5177\u5DF2\u7981\u7528',\n // \u7C98\u8D34\u6DFB\u52A0\uFF08JSON / DSH \u539F\u751F YAML\uFF09\n mcpPasteHint: '\u7C98\u8D34\u5176\u5B83 harness \u7684 JSON\uFF08.mcp.json \u7684 mcpServers \u6620\u5C04\uFF09\u6216 DSH \u539F\u751F YAML\uFF08\u4E5F\u63A5\u53D7 mcp-client \u884C\u7247\u6BB5\uFF09\uFF1B\u5199\u5165 {scope}\u3002',\n mcpPasteScopeGlobal: '\u5168\u5C40 profile patch\uFF08\u6240\u6709\u9884\u8BBE\u5171\u7528\uFF0C\u70ED\u91CD\u8F7D\u5373\u65F6\u751F\u6548\uFF09',\n mcpPasteScopePreset: '\u9884\u8BBE\u4E13\u5C5E',\n mcpPasteFormat: '\u7C98\u8D34\u683C\u5F0F',\n mcpPasteNative: '\u539F\u751F',\n mcpPasteParsed: '\u89E3\u6790\u51FA {n} \u4E2A server\uFF1A{names}',\n mcpPasteCheck: '\u6821\u9A8C\u5E76\u9884\u89C8',\n mcpPasteChecking: '\u6821\u9A8C\u4E2D\u2026',\n mcpPasteAdding: '\u5199\u5165\u4E2D\u2026',\n mcpPasteAdded: '\u5DF2\u6DFB\u52A0 {added} \u4E2A\uFF0C\u8DF3\u8FC7 {skipped} \u4E2A\u5DF2\u5B58\u5728',\n mcpPasteFailed: '\u6DFB\u52A0\u5931\u8D25',\n mcpRemoveConfirmTitle: '\u79FB\u9664 MCP Server',\n mcpRemoveConfirmMsg: '\u5C06\u4ECE cordis.patch.yml \u4E2D\u5220\u9664\u300C{name}\u300D\u6761\u76EE\uFF0C\u5176\u5DE5\u5177\u968F\u5373\u6CE8\u9500\u4E14\u4E0D\u53EF\u6062\u590D\uFF1B\u5982\u9700\u6062\u590D\u8BF7\u91CD\u65B0\u6DFB\u52A0\u3002',\n mcpLiveRemoveFailed: '\u79FB\u9664\u5931\u8D25\uFF08\u914D\u7F6E\u5199\u4FDD\u62A4\u6216\u6761\u76EE\u7F3A\u5931\uFF09',\n mcpCopyDone: '\u5DF2\u590D\u5236 \u2713',\n mcpCopyHint: '\u5DF2\u590D\u5236\u914D\u7F6E\u7247\u6BB5\uFF0C\u8BF7\u7C98\u8D34\u5230 cordis.patch.yml \u540E\u91CD\u542F DSH \u751F\u6548',\n mcpLogNewNote: '\u6865\u63A5\u5F0F MCP\uFF08cordis.patch.yml \u914D\u7F6E\uFF09\u65E0\u672C\u5730\u8FDE\u63A5\u65E5\u5FD7\uFF1A\u8FDE\u63A5\u72B6\u6001\u4EE5\u300CMCP Server\u300D\u9875\u771F\u5B9E\u6CE8\u518C\u4E3A\u51C6\uFF1B\u6B64\u9875\u4EC5\u5C55\u793A\u65E7\u7248\u9762\u677F\u7684\u672C\u5730\u8BB0\u5F55\u3002',\n // \u53F3\u4FA7\u4FE1\u606F\u680F\uFF08\u56FE\u4E09\uFF09\n mcpWhatTitle: '\u4EC0\u4E48\u662F MCP?',\n mcpWhatDesc: 'MCP (Model Contest Protocol) \u662F\u4E00\u4E2A\u5F00\u653E\u534F\u8BAE\uFF0C\u5B83\u6807\u51C6\u5316\u4E86\u5E94\u7528\u7A0B\u5E8F\u5411 LLM \u63D0\u4F9B\u4E0A\u4E0B\u6587\u548C\u5DE5\u5177\u7684\u65B9\u5F0F\u3002',\n mcpPoint1: '\u6807\u51C6\u5316', mcpPoint1Desc: '\u7EDF\u4E00\u7684\u534F\u8BAE\u89C4\u8303',\n mcpPoint2: '\u5B89\u5168\u53EF\u63A7', mcpPoint2Desc: '\u6743\u9650\u7BA1\u7406\uFF0C\u5B89\u5168\u8BBF\u95EE',\n mcpPoint3: '\u53EF\u6269\u5C55', mcpPoint3Desc: '\u8F7B\u677E\u96C6\u6210\u65B0\u7684\u5DE5\u5177\u548C\u670D\u52A1',\n mcpPoint4: '\u4E92\u64CD\u4F5C', mcpPoint4Desc: '\u8DE8\u5E73\u53F0\u3001\u8DE8\u670D\u52A1\u517C\u5BB9',\n mcpHowTitle: 'MCP \u5DE5\u4F5C\u539F\u7406',\n mcpAgent: 'Agent', mcpClient: 'MCP Client', mcpServerNode: 'MCP Server',\n mcpReq: '\u8BF7\u6C42', mcpResp: '\u54CD\u5E94', mcpCall: '\u8C03\u7528', mcpExt: '\u5916\u90E8\u5DE5\u5177 / \u6570\u636E\u5E93 / \u51FD\u6570',\n mcpStartTitle: '\u5FEB\u901F\u4E0A\u624B',\n mcpStep1: '\u6DFB\u52A0 MCP Server', mcpStep1Desc: '\u914D\u7F6E\u6216\u5BFC\u5165 MCP Server \u8FDE\u63A5\u4FE1\u606F',\n mcpStep2: '\u6388\u6743\u4E0E\u914D\u7F6E', mcpStep2Desc: '\u8BBE\u7F6E\u8BBF\u95EE\u6743\u9650\u548C\u5FC5\u8981\u7684\u914D\u7F6E',\n mcpStep3: '\u4F7F\u7528\u4E0E\u4F18\u5316', mcpStep3Desc: '\u5728\u5BF9\u8BDD\u4E2D\u8C03\u7528 MCP \u5DE5\u5177\uFF0C\u6301\u7EED\u4F18\u5316\u914D\u7F6E',\n mcpIntroTitle: 'MCP \u5FEB\u901F\u4E86\u89E3', mcpIntroDesc: '\u4E86\u89E3 MCP \u7684\u4F5C\u7528\u3001\u5DE5\u4F5C\u539F\u7406\u4E0E\u5FEB\u901F\u4E0A\u624B',\n mcpIntroBtn: '\u4E86\u89E3 MCP', mcpOverlayTitle: '\u4E86\u89E3 MCP',\n mcpNavTitle: 'MCP',\n mcpComingDesc: '\u529F\u80FD\u5F00\u53D1\u4E2D\uFF0C\u656C\u8BF7\u671F\u5F85',\n // \u5206\u7EC4\u884C / \u66F4\u591A\u83DC\u5355 / \u5206\u9875\n nameAsc: '\u5347\u5E8F', nameDesc: '\u964D\u5E8F', moreActions: '\u66F4\u591A\u64CD\u4F5C',\n totalItems: '\u5171 {n} \u6761', pageSize: '{n} \u6761/\u9875', pagePrev: '\u4E0A\u4E00\u9875', pageNext: '\u4E0B\u4E00\u9875',\n // \u7A7A\u6280\u80FD\u5305 / \u5931\u6548\u5F15\u7528 / \u64CD\u4F5C\u53CD\u9988\n bundleEmptyTitle: '\u8FD9\u4E2A\u6280\u80FD\u5305\u8FD8\u662F\u7A7A\u7684',\n bundleEmptyHint: '\u4E0A\u4F20\u6280\u80FD\u65F6\u5728\u8FD9\u91CC\u9009\u5B83\u5F52\u7EC4\uFF0C\u6216\u4ECE\u6563\u88C5\u6280\u80FD\u5361\u7247\u70B9\u300C+\u300D\u5F52\u5165\u3002',\n bundleUploadHere: '\u4E0A\u4F20\u6280\u80FD\u5230\u6B64\u5305',\n bundleMissingN: '\u8D26\u672C\u91CC\u6709 {n} \u4E2A\u6280\u80FD\u5DF2\u4E0D\u5B58\u5728',\n bundlePrune: '\u6E05\u7406\u5931\u6548\u5F15\u7528',\n pruned: '\u5DF2\u6E05\u7406\u5931\u6548\u5F15\u7528',\n installedOk: '\u5DF2\u5B89\u88C5\u6280\u80FD\u300C{name}\u300D',\n deletedOk: '\u5DF2\u5220\u9664\u6280\u80FD\u300C{name}\u300D',\n removedOk: '\u5DF2\u4ECE\u6280\u80FD\u5305\u79FB\u51FA\u300C{name}\u300D',\n assignOk: '\u5DF2\u628A\u300C{name}\u300D\u5F52\u5165\u6280\u80FD\u5305',\n bundleCreated: '\u5DF2\u521B\u5EFA\u6280\u80FD\u5305\u300C{name}\u300D\uFF0C\u4E0A\u4F20\u6280\u80FD\u65F6\u53EF\u76F4\u63A5\u5F52\u5165\u5B83',\n bundleDeleted: '\u5DF2\u5220\u9664\u6280\u80FD\u5305\u300C{name}\u300D\uFF0C\u5176\u4E2D\u7684\u6280\u80FD\u53D8\u4E3A\u6563\u88C5',\n opFailed: '\u64CD\u4F5C\u5931\u8D25\uFF1A{label} \u2014 {message}',\n installNameRewrite: 'SKILL.md \u91CC\u5199\u7684\u662F\u300C{meta}\u300D\uFF0C\u5B89\u88C5\u65F6\u4F1A\u7EDF\u4E00\u6539\u6210\u300C{name}\u300D\uFF08\u76EE\u5F55\u540D\u4E0E\u6280\u80FD\u540D\u4FDD\u6301\u4E00\u81F4\uFF09\u3002',\n deleteSkillDirNote: '\uFF08\u6280\u80FD\u76EE\u5F55\u300C{dir}\u300D\u4E0E\u6280\u80FD\u540D\u4E0D\u540C\uFF0C\u4F1A\u4E00\u5E76\u5220\u9664\uFF09',\n skillOffTag: '\u5DF2\u505C\u7528',\n presetCountTip: '\u8BE5\u9884\u8BBE\u4E0B\u5DF2\u542F\u7528 {n} \u4E2A / \u5171 {total} \u4E2A\u6280\u80FD',\n}\n\nexport function skillT(key: string, params?: Record<string, string | number>): string {\n let text = SKILL_ZH[key] ?? key\n if (params) {\n for (const k of Object.keys(params)) text = text.split(`{${k}}`).join(String(params[k]))\n }\n return text\n}\n", "/**\n * skills/McpAddModal \u2014 \u7C98\u8D34\u6DFB\u52A0 MCP Server\uFF08JSON / DSH \u539F\u751F YAML\uFF1A\u6821\u9A8C\u9884\u89C8 \u2192 \u843D\u76D8\uFF09\u3002\n */\nimport { useState } from 'react'\nimport { Button, Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { GuideArtIconSmall } from './icons.js'\nimport { css } from './styles.js'\n\n/**\n * \u7C98\u8D34\u6DFB\u52A0 MCP\uFF1AJSON\uFF08\u5176\u5B83 harness \u7684 `.mcp.json` \u5F62\u6001\uFF09\u6216 DSH \u539F\u751F YAML\uFF0C\n * \u5148\u300C\u6821\u9A8C\u5E76\u9884\u89C8\u300D\uFF08\u5BBF\u4E3B\u89E3\u6790\uFF0C\u5E26\u884C\u53F7\u62A5\u9519\uFF09\uFF0C\u786E\u8BA4\u540E\u5199\u5165\u76EE\u6807\uFF08\u5168\u5C40 patch / \u9884\u8BBE\uFF09\u3002\n * \u4E00\u6B21\u7C98\u8D34\u53EF\u542B\u591A\u4E2A server\uFF1B\u5DF2\u5B58\u5728\u7684 serverName \u81EA\u52A8\u8DF3\u8FC7\u3002\n */\nexport function McpPasteAdd({ t, presetId, onAdded, onCancel }: {\n t: (key: string, params?: Record<string, string | number>) => string\n /** \u76EE\u6807\u9884\u8BBE\uFF1Bundefined = \u5168\u5C40 profile patch\u3002 */\n presetId?: string\n /** \u6DFB\u52A0\u6210\u529F\u56DE\u8C03\uFF1A\u5E26\u4E0A\u672C\u6B21\u65B0\u589E\u7684 serverName\uFF08\u9762\u677F\u636E\u6B64\u81EA\u52A8\u7B49\u5DE5\u5177\u6CE8\u518C\uFF09\u3002 */\n onAdded: (added: string[]) => void\n onCancel: () => void\n}): JSX.Element {\n const [format, setFormat] = useState<'json' | 'yaml'>('json')\n const [text, setText] = useState('')\n const [busy, setBusy] = useState<'preview' | 'add' | null>(null)\n const [preview, setPreview] = useState<{ names: string[]; yaml: string } | null>(null)\n const [errors, setErrors] = useState<string[]>([])\n const [warnings, setWarnings] = useState<string[]>([])\n const [notice, setNotice] = useState<string | null>(null)\n const target = presetId === undefined ? 'global' : 'preset'\n const placeholder = format === 'json'\n ? '{ \"mcpServers\": { \"my-server\": { \"command\": \"npx\", \"args\": [\"-y\", \"@scope/mcp-server\"] } } }'\n : 'mcpServers:\\n my-server:\\n command: npx\\n args: [\"-y\", \"@scope/mcp-server\"]'\n const empty = text.trim() === ''\n\n const call = (path: string, payload: Record<string, unknown>): Promise<Record<string, unknown>> =>\n fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(payload),\n }).then(async (response) => {\n const body = await response.json().catch(() => null) as Record<string, unknown> | null\n return body ?? { ok: false, error: `HTTP ${response.status}` }\n })\n\n const reset = (): void => { setErrors([]); setWarnings([]); setNotice(null); setPreview(null) }\n\n const previewNow = (): void => {\n if (busy !== null || empty) return\n setBusy('preview'); reset()\n void call('/api/triad/mcp-preview', { format, text, target })\n .then((body) => {\n const list = Array.isArray(body.errors) ? (body.errors as string[]) : []\n setErrors(list)\n if (Array.isArray(body.warnings)) setWarnings(body.warnings as string[])\n if (typeof body.yaml === 'string') {\n const servers = Array.isArray(body.servers) ? (body.servers as Array<{ name?: unknown }>) : []\n setPreview({ names: servers.map(item => String(item.name ?? '')), yaml: body.yaml })\n }\n if (list.length === 0 && typeof body.error === 'string') setErrors([body.error])\n })\n .catch((error: unknown) => { setErrors([error instanceof Error ? error.message : String(error)]) })\n .finally(() => { setBusy(null) })\n }\n\n const addNow = (): void => {\n if (busy !== null || empty) return\n setBusy('add'); reset()\n const path = presetId === undefined\n ? '/api/triad/mcp-config'\n : `/api/triad/mcp-presets/${encodeURIComponent(presetId)}/servers`\n const payload = presetId === undefined ? { action: 'add', format, text } : { format, text }\n void call(path, payload)\n .then((body) => {\n const list = Array.isArray(body.errors) ? (body.errors as string[]) : []\n if (list.length > 0) {\n setErrors(list)\n if (Array.isArray(body.warnings)) setWarnings(body.warnings as string[])\n return\n }\n if (body.ok !== true) { setErrors([String(body.error ?? t('mcpPasteFailed'))]); return }\n const added = Array.isArray(body.added) ? (body.added as string[]) : []\n const skipped = Array.isArray(body.skipped) ? (body.skipped as number | string[]) : []\n setNotice(t('mcpPasteAdded', { added: added.length, skipped: Array.isArray(skipped) ? skipped.length : Number(skipped) }))\n if (Array.isArray(body.warnings)) setWarnings(body.warnings as string[])\n onAdded(added)\n })\n .catch((error: unknown) => { setErrors([error instanceof Error ? error.message : String(error)]) })\n .finally(() => { setBusy(null) })\n }\n\n return (\n <div className={css.mcpAddForm}>\n <p className={css.installHint}>\n {t('mcpPasteHint', { scope: presetId === undefined ? t('mcpPasteScopeGlobal') : `${t('mcpPasteScopePreset')} \u201C${presetId}\u201D` })}\n </p>\n <div className={css.installRow}>\n <div className={css.mcpAddTypeRow} role=\"group\" aria-label={t('mcpPasteFormat')}>\n {(['json', 'yaml'] as const).map(value => (\n <button\n key={value}\n type=\"button\"\n className={`${css.mcpAddTypeBtn} ${format === value ? css.mcpAddTypeActive : ''}`}\n data-active={format === value || undefined}\n aria-pressed={format === value}\n onClick={() => { setFormat(value); reset() }}\n >\n {value.toUpperCase()}{value === 'yaml' ? ` \u00B7 ${t('mcpPasteNative')}` : ''}\n </button>\n ))}\n </div>\n </div>\n <textarea\n className={css.inlineInput}\n value={text}\n placeholder={placeholder}\n aria-label={t('mcpPasteFormat')}\n rows={8}\n spellCheck={false}\n autoFocus\n style={{\n fontFamily: 'ui-monospace, SFMono-Regular, Consolas, monospace',\n fontSize: 12,\n lineHeight: '18px',\n minHeight: 120,\n resize: 'vertical',\n whiteSpace: 'pre',\n }}\n onChange={(event) => { setText(event.currentTarget.value); reset() }}\n />\n {errors.length > 0 && (\n <div className={css.error} role=\"alert\">\n {errors.map(item => <div key={item}>{item}</div>)}\n </div>\n )}\n {warnings.length > 0 && (\n <div className={css.installHint} role=\"status\">\n {warnings.map(item => <div key={item}>\u00B7 {item}</div>)}\n </div>\n )}\n {preview !== null && (\n <div>\n <p className={css.installHint}>{t('mcpPasteParsed', { n: preview.names.length, names: preview.names.join(', ') })}</p>\n <pre style={{\n margin: 0,\n maxHeight: 200,\n overflow: 'auto',\n fontFamily: 'ui-monospace, SFMono-Regular, Consolas, monospace',\n fontSize: 11,\n lineHeight: '16px',\n whiteSpace: 'pre-wrap',\n }}>{preview.yaml}</pre>\n </div>\n )}\n {notice !== null && <p className={css.mcpCopyHint} role=\"status\">{notice}</p>}\n <div className={css.inlineForm}>\n <Button variant=\"outline\" type=\"button\" disabled={busy !== null || empty} onClick={previewNow}>\n {busy === 'preview' ? t('mcpPasteChecking') : t('mcpPasteCheck')}\n </Button>\n <Button variant=\"primary\" type=\"button\" disabled={busy !== null || empty} onClick={addNow}>\n {busy === 'add' ? t('mcpPasteAdding') : t('mcpAddConfirm')}\n </Button>\n <Button variant=\"outline\" type=\"button\" onClick={onCancel}>{t('cancel')}</Button>\n </div>\n </div>\n )\n}\n\n/** \u6DFB\u52A0\u5168\u5C40 MCP Server \u5F39\u7A97\uFF1A\u7C98\u8D34 JSON / DSH \u539F\u751F YAML\uFF0C\u76F4\u63A5\u5199\u5165 profile patch\u3002 */\nexport function McpAddModal({ t, open, onClose, onAdded }: {\n t: (key: string) => string\n open: boolean\n onClose: () => void\n onAdded: (added: string[]) => void\n}): JSX.Element {\n return (\n <Modal open={open} onClose={onClose} closeLabel={t('close')} title={t('mcpAddModalTitle')}>\n <McpPasteAdd t={t} onAdded={onAdded} onCancel={onClose} />\n </Modal>\n )\n}\n\n/** \u6307\u5357\u9762\u677F logo\uFF1A\u5C0F\u4E66\u5757\u3002 */\nexport function GuideArtIconSmall(): JSX.Element {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"13\" height=\"12\" rx=\"2.5\" fill=\"var(--dsw-alias-state-business-primary,#3d6be5)\" />\n <path d=\"M4.5 5h7M4.5 8h7M4.5 11h4.5\" stroke=\"#FFFFFF\" strokeWidth=\"1.3\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\n", "/**\n * skills/McpView \u2014 MCP \u9875\u4E3B\u533A\uFF1A\u7F16\u8F91\u5C42\u63D0\u793A\u884C + Server \u5217\u8868\u3002\n *\n * \u641C\u7D22\u3001\u8BA1\u6570\u5206\u6BB5\u3001\u8FDE\u63A5\u72B6\u6001\u4E0E\u5237\u65B0/\u6DFB\u52A0\u6309\u94AE\u90FD\u5728\u9876\u680F\uFF08McpTopBar\uFF09\uFF1B\u8FD9\u91CC\u53EA\u8D1F\u8D23\n * \u4E24\u4E2A\u5217\u8868\u5757\uFF1A\u300C\u7EE7\u627F\u7684\u5168\u5C40 Server\u300D\uFF08\u9884\u8BBE\u5C42\u5F00\u5173 = \u906E\u853D\uFF09\u4E0E\u300C\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\u300D\uFF0C\n * \u6BCF\u5F20\u5361\u7247\u5E26\u5DE5\u5177\u7EA7 chips\uFF08\u7EFF = \u542F\u7528\u3001\u7070 = \u7981\u7528\uFF0C\u70B9\u4E00\u4E0B\u5373\u5207\u6362\uFF09\u3002\n */\nimport { useState } from 'react'\nimport {\n IconAgentPresetOutlineRegular, IconArchiveOutlineRegular, IconChevronDownOutlineRegular, IconTrashOutlineRegular, Modal, Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { ConfirmDialog } from '../confirm-dialog'\nimport { LockGlyph } from './icons.js'\nimport { McpPasteAdd } from './McpAddModal.js'\nimport { isToolRegistrationPending, type LiveMcpState, type LiveMcpStatus, type LiveMcpTool } from './mcp-live.js'\nimport { css } from './styles.js'\n/**\n * \u5DE5\u5177 chips\uFF1A\u5361\u7247\u4E0A\u5217\u51FA\u8BE5 MCP \u63D0\u4F9B\u7684**\u5168\u90E8**\u5DE5\u5177\u540D\uFF0C\u7EFF = \u542F\u7528\u3001\u7070 = \u7981\u7528\uFF0C\n * \u70B9\u51FB\u5373\u5207\u6362\uFF08\u5355\u4E2A\u5DE5\u5177\u7EA7 disabled\uFF0C\u89C1 host \u7684 mcp-tool-disable\uFF09\u3002\n *\n * \u540D\u5355 = \u6CE8\u518C\u5DE5\u5177 \u222A \u8D26\u672C\u7981\u7528\u540D\uFF1A\u88AB\u7981\u7528\u7684\u5DE5\u5177\u5728 agent \u4F5C\u7528\u57DF\u91CC\u5DF2\u88AB\u9690\u85CF\n * \uFF08restrict\uFF09\uFF0C\u4F46\u8D26\u672C\u4ECD\u7559\u7740\u540D\u5B57\uFF0C\u6240\u4EE5\u8FD8\u80FD\u70B9\u56DE\u6765\u3002\n */\n/** \u5361\u7247\u8981\u5217\u51FA\u7684\u5DE5\u5177\u5168\u540D\uFF1A\u6CE8\u518C\u5217\u8868 \u222A \u8D26\u672C\u7981\u7528\u540D\uFF08\u88AB\u9690\u85CF\u7684\u4E5F\u8981\u80FD\u70B9\u56DE\u6765\uFF09\u3002 */\nexport function mcpToolNames(tools: LiveMcpTool[], disabledTools: string[]): string[] {\n const known = new Set(tools.map(tool => tool.name))\n return [...tools.map(tool => tool.name), ...disabledTools.filter(name => !known.has(name))]\n}\n\nexport function McpToolChips({ t, serverName, tools, disabledTools, locked, busy, onToggle }: {\n t: (key: string, params?: Record<string, string | number>) => string\n serverName: string\n tools: LiveMcpTool[]\n disabledTools: string[]\n /** \u9884\u8BBE\u8303\u56F4\u4E0B\u300C\u5168\u5C40\u5C42\u5DF2\u7981\u7528\u300D\u7684\u540D\u5B57\uFF1A\u9884\u8BBE\u5C42\u53EA\u80FD\u52A0\u7981\uFF0C\u4E0D\u80FD\u6253\u5F00\u5B83\u4EEC\u3002 */\n locked?: ReadonlySet<string>\n busy: string | null\n onToggle: (fullName: string, enabled: boolean) => void\n}): JSX.Element | null {\n const prefix = `mcp__${serverName}__`\n const names = mcpToolNames(tools, disabledTools)\n if (names.length === 0) return null\n const off = new Set(disabledTools)\n return (\n <div className={css.mcpToolChips} role=\"group\" aria-label={t('mcpToolChipsAria', { name: serverName })}>\n {names.map((name) => {\n const disabled = off.has(name)\n const isLocked = locked?.has(name) === true\n const short = name.startsWith(prefix) ? name.slice(prefix.length) : name\n const description = tools.find(tool => tool.name === name)?.description ?? ''\n return (\n <button\n key={name}\n type=\"button\"\n className={css.mcpToolChip}\n data-on={disabled ? undefined : 'true'}\n data-locked={isLocked || undefined}\n data-busy={busy === name || undefined}\n disabled={busy !== null || isLocked}\n aria-pressed={!disabled}\n title={isLocked\n ? `${t('mcpToolGlobalOffTip')}\\n${name}`\n : `${disabled ? t('mcpToolClickEnable') : t('mcpToolClickDisable')}\\n${name}${description === '' ? '' : `\\n${description}`}`}\n onClick={() => { onToggle(name, disabled) }}\n >\n {isLocked && <LockGlyph size={9} />}\n {short}\n </button>\n )\n })}\n </div>\n )\n}\n\n/**\n * MCP \u9875\uFF08\u4E0E\u6280\u80FD\u9875\u540C\u6784\uFF09\uFF1A\u56DB\u5F20\u7EDF\u8BA1\u5361 + \u5F53\u524D\u7F16\u8F91\u5C42\u63D0\u793A\u884C + \u5DE5\u5177\u6761\uFF08\u641C\u7D22 / \u5237\u65B0 /\n * \u6DFB\u52A0\uFF09+ Server \u5217\u8868\u3002\u5217\u8868\u56FA\u5B9A\u4E24\u5757\u2014\u2014\u300C\u7EE7\u627F\u7684\u5168\u5C40 Server\u300D\uFF08\u9884\u8BBE\u5C42\u5F00\u5173 = \u906E\u853D\uFF09\n * \u4E0E\u300C\u8BE5\u9884\u8BBE\u4E13\u5C5E Server\u300D\uFF08\u5199\u8FDB\u8BE5\u9884\u8BBE\u7EC4\u5408\u6587\u4EF6\uFF09\uFF1B\u300C\u5168\u90E8 Agent\u300D\u5C42\u53EA\u6709\u524D\u8005\uFF0C\n * \u5F00\u5173\u76F4\u63A5\u542F\u7528/\u7981\u7528\u5168\u5C40\u6761\u76EE\u3002\n */\nexport function McpView({ t, live, scope, query, status, onRefresh, waitingTools, onWatchTools, addOwnOpen, onCloseAddOwn }: {\n t: (key: string, params?: Record<string, string | number>) => string\n live: LiveMcpStatus\n scope: string\n query: string\n status: 'all' | 'on' | 'off'\n onRefresh: () => void\n /** \u6B63\u5728\u7B49\u5F85\u6CE8\u518C\u5DE5\u5177\u7684 Server\uFF08\u9762\u677F\u5728\u8F6E\u8BE2\uFF0C\u65E0\u9700\u7528\u6237\u624B\u52A8\u5237\u65B0\uFF09\u3002 */\n waitingTools: string[]\n /** \u8BA9\u9762\u677F\u5F00\u59CB\u8F6E\u8BE2\u8FD9\u4E9B Server \u7684\u5DE5\u5177\u6CE8\u518C\uFF08\u542F\u7528\u540E\u81EA\u52A8\u7B49\uFF09\u3002 */\n onWatchTools: (names: string[]) => void\n /** \u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\u5F39\u7A97\u5F00\u5173\uFF1A\u6309\u94AE\u5728\u9876\u680F\uFF0C\u72B6\u6001\u7531\u9762\u677F\u6301\u6709\u3002 */\n addOwnOpen: boolean\n onCloseAddOwn: () => void\n}): JSX.Element {\n const [busy, setBusy] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n /** \u4E24\u4E2A\u5217\u8868\u5757\u7684\u6298\u53E0\u6001\uFF08\u9ED8\u8BA4\u5C55\u5F00\uFF0C\u70B9\u6807\u9898\u884C\u6536\u8D77\uFF09\u3002 */\n const [globalOpen, setGlobalOpen] = useState(true)\n const [ownOpen, setOwnOpen] = useState(true)\n /** \u6B63\u5728\u5207\u6362\u7684\u5DE5\u5177\u5168\u540D\uFF08\u9632\u8FDE\u70B9\uFF09\u3002 */\n const [toolBusy, setToolBusy] = useState<string | null>(null)\n /** \u5168\u5C40\u6761\u76EE\u5220\u9664\u786E\u8BA4\uFF08null=\u5173\u95ED\uFF09\u3002 */\n const [removeReq, setRemoveReq] = useState<string | null>(null)\n /** \u9884\u8BBE\u4E13\u5C5E\u884C\u79FB\u9664\u786E\u8BA4\uFF08null=\u5173\u95ED\uFF09\u3002 */\n const [removeOwnReq, setRemoveOwnReq] = useState<string | null>(null)\n\n const ready = live.state === 'ready' ? live.data : null\n const globals = ready?.servers ?? []\n const presets = ready?.presets ?? []\n const scoped = scope === '' ? undefined : presets.find(preset => preset.id === scope)\n const masked = new Set(Object.entries(ready?.masks?.[scope] ?? {})\n .filter(([, on]) => on === false).map(([name]) => name))\n const ownRows = scope === '' ? [] : (ready?.presetServers?.[scope] ?? [])\n const ownNames = new Set(ownRows.map(row => row.serverName))\n /* \u5DE5\u5177\u7EA7\u7981\u7528\u4E24\u5C42\u8D26\u672C\uFF1A\u6709\u6548\u7981\u7528 = \u5168\u5C40\u5C42 \u222A \u5F53\u524D\u9884\u8BBE\u5C42\uFF08\u9884\u8BBE\u5C42\u53EA\u52A0\u7981\uFF0C\u4E0D\u6253\u5F00\uFF09\u3002\n * \u9884\u8BBE\u81EA\u5E26\u7684\u5361\u53EA\u770B\u9884\u8BBE\u5C42 \u2014\u2014 \u4E0E\u7EE7\u627F\u6765\u7684\u5168\u5C40 Server \u5F7B\u5E95\u5206\u79BB\uFF08\u4E0D\u540C\u540D\u524D\u7F00\u4E5F\u4E0D\u4F1A\u4E92\u76F8\u7275\u8FDE\uFF09\u3002 */\n const globalOff = ready?.toolDisabled ?? {}\n const presetTables = ready?.toolDisabledByPreset ?? {}\n /**\n * \u67D0\u6761\u300C\u884C\u300D\u7684\u6709\u6548\u7981\u7528\u96C6\u5408\uFF08\u540C\u540D\u4E5F\u5F7B\u5E95\u72EC\u7ACB\uFF09\uFF1A\n * inherit\uFF08\u7EE7\u627F\u7684\u5168\u5C40\u884C\uFF09= \u5168\u5C40\u5C42 \u222A inherit \u6761\u76EE\uFF1Bown\uFF08\u9884\u8BBE\u81EA\u5E26\u884C\uFF09= \u4EC5 own \u6761\u76EE\u3002\n * \u4E24\u6761\u884C\u5404\u8BB0\u4E00\u4EFD\u8D26\uFF0C\u4E92\u4E0D\u7275\u8FDE \u2014\u2014 \u64A4\u6389\u5176\u4E2D\u4E00\u6761\u65F6\u53E6\u4E00\u6761\u7684\u8BBE\u7F6E\u5404\u81EA\u751F\u6548\u3002\n */\n const offOf = (serverName: string, owner: 'own' | 'inherit'): string[] => {\n const entry = presetTables[scope]?.[serverName]\n if (owner === 'own') return entry?.own ?? []\n if (scope === '') return globalOff[serverName] ?? []\n return [...new Set([...(globalOff[serverName] ?? []), ...(entry?.inherit ?? [])])]\n }\n /** \u5168\u5C40\u5C42\u5DF2\u7981\u7528\u7684\u540D\u5B57\uFF1A\u7EE7\u627F\u884C\u65E0\u6CD5\u5728\u9884\u8BBE\u5C42\u6253\u5F00\u5B83\uFF08\u4E0E\u6280\u80FD\u9762\u677F\u540C\u6A21\u578B\uFF09\u3002 */\n const lockedOf = (serverName: string): Set<string> => new Set(scope === '' ? [] : globalOff[serverName] ?? [])\n /**\n * \u906E\u853D\u8BCA\u65AD\uFF1A\u8D26\u672C\u91CC\u6807\u4E86\u300C\u5DF2\u906E\u853D\u300D\u4F46\u8FD0\u884C\u671F\u4E00\u4E2A\u5DE5\u5177\u90FD\u6CA1\u62D2\u5230\uFF08\u6216\u5B89\u88C5\u62A5\u9519\uFF09\u65F6\n * \u7ED9\u51FA\u8BF4\u660E \u2014\u2014 \u4EE5\u524D\u8FD9\u79CD\u60C5\u51B5\u662F\u9759\u9ED8\u7684\uFF0C\u9762\u677F\u770B\u7740\u300C\u5DF2\u906E\u853D\u300D\u4F46\u6A21\u578B\u7AEF\u5DE5\u5177\u7167\u65E7\u53EF\u89C1\u3002\n */\n const maskInstall = ready?.maskInstall?.[scope]\n const maskWarn: string | null = (() => {\n if (scope === '' || masked.size === 0 || maskInstall === undefined) return null\n if (maskInstall.errors.length > 0) return t('mcpMaskInstallFailed', { message: maskInstall.errors[0]! })\n if (maskInstall.agents === 0) return t('mcpMaskNoAgent')\n if (maskInstall.deniedAgents === 0) return t('mcpMaskNoDeny')\n return null\n })()\n\n /** \u7EDF\u4E00\u5199\u8BF7\u6C42\uFF1A\u6210\u529F\u5237\u65B0\u6570\u636E\uFF0C\u5931\u8D25\u6536\u96C6\u9519\u8BEF\u6587\u6848\u3002 */\n const write = (token: string, url: string, payload: Record<string, unknown>): void => {\n if (busy !== null) return\n setBusy(token)\n setError(null)\n void fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(payload),\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n const toggleGlobal = (serverName: string, disabled: boolean): void => {\n write(`toggle:${serverName}`, '/api/triad/mcp-config', { serverName, disabled })\n }\n const removeGlobal = (serverName: string): void => {\n write(`remove:${serverName}`, '/api/triad/mcp-config', { serverName, action: 'remove' })\n }\n const setMasked = (serverName: string, enabled: boolean): void => {\n if (busy !== null) return\n setBusy(`mask:${serverName}`)\n setError(null)\n void fetch(`/api/triad/mcp-masks/${encodeURIComponent(scope)}/${encodeURIComponent(serverName)}`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ enabled }),\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n /**\n * \u5DE5\u5177\u7EA7\u542F\u505C\uFF08\u5355\u6761\u6216\u591A\u6761\u4E00\u6279\uFF09\uFF1A`PUT /api/triad/mcp-tools/<server>`\n * `{ enabled, tools, preset?, source? }`\u3002\u8303\u56F4\u51B3\u5B9A\u5199\u54EA\u6761\u300C\u884C\u300D\uFF1A\n * \u300C\u5168\u90E8 Agent\u300D\u2192 \u5168\u5C40\u884C\uFF1B\u67D0\u4E2A\u9884\u8BBE \u2192 \u8BE5\u9884\u8BBE\u5C42\uFF08`source` \u6307\u5B9A\u54EA\u6761\u884C\uFF09\u3002\n */\n const putTools = (serverName: string, names: string[], enabled: boolean, source: 'own' | 'inherit'): void => {\n if (names.length === 0 || toolBusy !== null || busy !== null) return\n setToolBusy(names[0]!)\n setError(null)\n void fetch(`/api/triad/mcp-tools/${encodeURIComponent(serverName)}`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ enabled, tools: names, ...(scope === '' ? {} : { preset: scope, source }) }),\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setToolBusy(null) })\n }\n const toggleTool = (serverName: string, fullName: string, enabled: boolean, source: 'own' | 'inherit'): void => {\n putTools(serverName, [fullName], enabled, source)\n }\n const removeOwn = (serverName: string): void => {\n if (busy !== null) return\n setBusy(`own:${serverName}`)\n setError(null)\n void fetch(`/api/triad/mcp-presets/${encodeURIComponent(scope)}/servers/${encodeURIComponent(serverName)}`, {\n method: 'DELETE', headers: { accept: 'application/json' },\n })\n .then(async (response) => {\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (response.ok && body?.ok === true) { onRefresh(); return }\n throw new Error(body?.error ?? String(response.status))\n })\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n /** \u4E00\u952E\u6E05\u7A7A\u8BE5\u9884\u8BBE\u7684\u906E\u853D\uFF08\u987A\u5E8F\u9010\u4E2A\u53D6\u6D88\uFF0C\u907F\u514D\u5E76\u53D1\u5199\u8D26\u672C\u4E92\u76F8\u8986\u76D6\uFF09\u3002 */\n const clearMasks = (): void => {\n if (busy !== null || masked.size === 0) return\n setBusy('mask:__all__')\n setError(null)\n const names = [...masked]\n void (async () => {\n for (const serverName of names) {\n const response = await fetch(`/api/triad/mcp-masks/${encodeURIComponent(scope)}/${encodeURIComponent(serverName)}`, {\n method: 'PUT',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({ enabled: true }),\n })\n const body = await response.json().catch(() => null) as { ok?: boolean; error?: string } | null\n if (!(response.ok && body?.ok === true)) throw new Error(body?.error ?? String(response.status))\n }\n onRefresh()\n })()\n .catch((cause: unknown) => { setError(cause instanceof Error ? cause.message : String(cause)) })\n .finally(() => { setBusy(null) })\n }\n\n /* \u8FC7\u6EE4\uFF1A\u641C\u7D22\u547D\u4E2D serverName \u6216\u5DE5\u5177\u540D\uFF1B\u72B6\u6001\u6863\u5728\u5168\u5C40\u5C42\u770B\u542F\u7528\u72B6\u6001\u3001\u9884\u8BBE\u5C42\u770B\u906E\u853D\u3002 */\n const needle = query.trim().toLowerCase()\n const shownGlobals = globals.filter(server => (needle === ''\n || server.serverName.toLowerCase().includes(needle)\n || server.tools.some(tool => tool.name.toLowerCase().includes(needle)))\n && (status === 'all'\n || (scope === '' ? (status === 'off' ? server.config.disabled : !server.config.disabled)\n : (status === 'off' ? masked.has(server.serverName) : !masked.has(server.serverName)))))\n const shownOwn = ownRows.filter(row => needle === ''\n || row.serverName.toLowerCase().includes(needle)\n || row.summary.toLowerCase().includes(needle))\n\n return (\n <div className={css.mcpServerMain}>\n {/* \u5F53\u524D\u7F16\u8F91\u5C42\u63D0\u793A\u884C\uFF08\u4E0E\u6280\u80FD\u9875 hintRow \u540C\u6784\uFF09 */}\n <div className={css.hintRow}>\n <span className={css.hintRowText}>\n {scope === ''\n ? t('mcpScopeHintAll')\n : t('mcpScopeHintScoped', { name: scoped?.name ?? scope })}\n </span>\n {scope !== '' && masked.size > 0 && (\n <button type=\"button\" className={css.presetReset} disabled={busy !== null} onClick={clearMasks}>\n {t('presetReset')}\n </button>\n )}\n </div>\n\n {error !== null && <p className={css.error} role=\"alert\">{t('mcpPresetFailed', { message: error })}</p>}\n\n {/* \u906E\u853D\u8BCA\u65AD\uFF1A\u8D26\u672C\u5199\u4E86\u4F46\u8FD0\u884C\u671F\u6CA1\u62D2\u5230\u5DE5\u5177/\u5B89\u88C5\u62A5\u9519\u65F6\uFF0C\u660E\u786E\u8BF4\u51FA\u6765 */}\n {maskWarn !== null && <p className={css.error} role=\"alert\">{maskWarn}</p>}\n\n {/* \u6DFB\u52A0/\u542F\u7528\u540E\u7684\u81EA\u52A8\u7B49\u5F85\uFF1A\u9762\u677F\u5728\u8F6E\u8BE2\uFF0C\u7528\u6237\u4E0D\u7528\u518D\u624B\u52A8\u70B9\u300C\u5237\u65B0\u300D */}\n {waitingTools.length > 0 && (\n <p className={css.mcpEmptyList} role=\"status\">{t('mcpWaitingTools', { names: waitingTools.join('\u3001') })}</p>\n )}\n\n {live.state === 'unavailable' ? (\n <p className={css.mcpEmptyList}>{t('mcpLiveUnavailable')}</p>\n ) : (\n <>\n {/* \u2460 \u7EE7\u627F\u7684\u5168\u5C40 Server\uFF08\u9884\u8BBE\u5C42\u5F00\u5173 = \u906E\u853D\uFF09\uFF1B\u6807\u9898\u884C\u53EF\u6298\u53E0\uFF0C\u4E0E\u6280\u80FD\u9875\u6280\u80FD\u5305\u540C\u6784 */}\n <section className={css.hubSection} data-open={globalOpen ? 'true' : undefined}>\n <header className={css.bundleRowOuter} data-open={globalOpen ? 'true' : undefined}>\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={globalOpen}\n onClick={() => { setGlobalOpen((value) => !value) }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><IconArchiveOutlineRegular size={16} /></span>\n <span className={css.bundleName}>{scope === '' ? t('mcpListTitle') : t('mcpPresetGlobalSection')}</span>\n <span className={css.bundleCount}>{shownGlobals.length}</span>\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n </header>\n {globalOpen && (<>\n {scope !== '' && <p className={css.mcpEmptyList}>{t('mcpPresetMaskHint')}</p>}\n {shownGlobals.length === 0 ? (\n <p className={css.mcpEmptyList}>{globals.length === 0 ? t('mcpLiveEmpty') : t('mcpListFilteredEmpty')}</p>\n ) : (\n <div className={css.mcpRecGrid}>\n {shownGlobals.map((server) => {\n const isMasked = masked.has(server.serverName)\n const covered = ownNames.has(server.serverName)\n const offTools = offOf(server.serverName, 'inherit')\n const lockedTools = lockedOf(server.serverName)\n const listed = server.tools.length\n const pendingReg = isToolRegistrationPending(server.toolCount, listed)\n /** \u88AB\u300C\u5168\u90E8 Agent\u300D\u5C42\u4E00\u7968\u5426\u51B3\u7684\u5DE5\u5177\u6570\uFF08\u9884\u8BBE\u89C6\u56FE\u91CC\u624D\u53EF\u80FD > 0\uFF09\u3002 */\n const lockedCount = mcpToolNames(server.tools, offTools).filter(name => lockedTools.has(name)).length\n return (\n <section key={`global-${server.serverName}`} className={css.mcpRecCard}>\n <div className={css.mcpRecCardHead}>\n <span className={css.mcpRecCardTitleRow}>\n <span className={css.mcpRecCardName}>{server.serverName}</span>\n <span className={css.mcpRecCardTags}>\n {/* \u6570\u91CF\u8DDF\u968F\u5361\u7247\u5B9E\u9645\u5217\u51FA\u7684\u5DE5\u5177\uFF1A\u8FDB\u7A0B\u8FD8\u5728\u8FDE\u65F6\u5148\u6309\u540D\u5355\u7F13\u5B58\u663E\u793A\uFF0C\u5E76\u6807\u51FA\u300C\u7B49\u5F85\u6CE8\u518C\u300D */}\n <span className={css.mcpRecCatTag}>\n {server.toolCount > 0 ? server.toolCount : listed} {t('mcpLiveToolsOf')}\n </span>\n {pendingReg && (\n <span className={css.mcpRecCatTag} data-off=\"true\" title={t('mcpToolsPendingRegTip')}>\n {t('mcpToolsPendingReg')}\n </span>\n )}\n {/* \u5168\u5C40\u4E00\u7968\u5426\u51B3\uFF1A\u9884\u8BBE\u5C42\u8FD9\u4E9B\u5DE5\u5177\u88AB\u5F3A\u5236\u7F6E\u7070\u3001\u4E0D\u53EF\u62E8\u52A8 */}\n {lockedCount > 0 && (\n <span className={css.mcpRecCatTag} data-locked=\"true\" title={t('mcpToolGlobalOffTip')}>\n {t('mcpToolGlobalOff')}{lockedCount > 1 ? ` ${lockedCount}` : ''}\n </span>\n )}\n {offTools.length > 0 && (\n <span className={css.mcpRecCatTag} data-off=\"true\">{t('mcpToolDisabledCount', { n: offTools.length })}</span>\n )}\n {scope === ''\n ? (server.config.disabled ? <span className={css.mcpRecCatTag}>{t('mcpLiveDisabled')}</span> : null)\n : (isMasked ? <span className={css.mcpRecCatTag}>{t('mcpPresetMasked')}</span> : null)}\n </span>\n </span>\n <Tooltip\n label={scope === ''\n ? (server.config.disabled ? t('enableSkill') : t('mcpLiveDisabled'))\n : covered\n ? t('mcpPresetCoveredSwitchHint')\n : isMasked ? t('enableSkill') : t('mcpPresetMasked')}\n side=\"bottom\"\n delayMs={500}\n >\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={scope === '' ? !server.config.disabled : !isMasked}\n aria-label={scope === '' ? t('mcpLiveDisabled') : t('mcpPresetMasked')}\n className={`${css.toggle} ${(scope === '' ? server.config.disabled : isMasked) ? css.toggleOff : css.toggleOn}`}\n /* \u9884\u8BBE\u5C42\uFF1A\u5373\u4F7F\u8BE5\u9884\u8BBE\u81EA\u5E26\u540C\u540D Server\uFF0C\u4E5F\u5141\u8BB8\u906E\u853D\u5168\u5C40\u8FD9\u4E00\u6761 \u2014\u2014\n * \u906E\u853D\u662F\u300C\u672C\u9884\u8BBE\u4E0D\u8981\u5168\u5C40\u90A3\u4EFD\u300D\u7684\u6301\u4E45\u8868\u8FBE\uFF0C\u7B49\u81EA\u5E26\u7684\u88AB\u79FB\u9664\u540E\u5373\u523B\u751F\u6548\u3002 */\n disabled={busy !== null || (scope === '' && !server.config.editable)}\n onClick={() => {\n if (scope === '') {\n const nextDisabled = !server.config.disabled\n toggleGlobal(server.serverName, nextDisabled)\n // \u542F\u7528 = \u91CD\u65B0\u62C9\u8D77\u8FDB\u7A0B\u5E76\u6CE8\u518C\u5DE5\u5177\uFF1A\u5F00\u59CB\u8F6E\u8BE2\uFF0C\u522B\u8BA9\u7528\u6237\u7B49 / \u624B\u70B9\u5237\u65B0\u3002\n if (!nextDisabled) onWatchTools([server.serverName])\n } else setMasked(server.serverName, isMasked)\n }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n </div>\n <p className={css.mcpRecCardDesc}>\n {server.config.disabled && scope === '' && server.tools.length === 0\n ? `${t('mcpLiveDisabled')} \u00B7 ${t('mcpToolsUnavailable')}`\n : t('mcpToolsHint')}\n </p>\n <McpToolChips\n t={t}\n serverName={server.serverName}\n tools={server.tools}\n disabledTools={offTools}\n locked={lockedTools}\n busy={toolBusy}\n onToggle={(fullName, enabled) => { toggleTool(server.serverName, fullName, enabled, 'inherit') }}\n />\n <div className={css.mcpCardFoot}>\n <span className={css.mcpCardItem}>\n <span className={css.mcpCardItemLabel}>\n {scope === '' ? t('mcpLiveConfigHint')\n : covered\n ? (isMasked ? t('mcpPresetCoveredMasked') : t('mcpPresetCovered'))\n : isMasked ? t('mcpPresetMasked') : t('mcpPresetMaskState')}\n </span>\n </span>\n {scope === '' && server.config.editable ? (\n <button\n type=\"button\"\n className={css.mcpCardDelete}\n title={t('mcpRemove')}\n disabled={busy !== null}\n onClick={() => { setRemoveReq(server.serverName) }}\n >\n <IconTrashOutlineRegular size={13} aria-hidden=\"true\" />{t('mcpRemove')}\n </button>\n ) : null}\n </div>\n </section>\n )\n })}\n </div>\n )}\n </>)}\n </section>\n\n {/* \u2461 \u8BE5\u9884\u8BBE\u4E13\u5C5E Server\uFF08\u5199\u8FDB\u8BE5\u9884\u8BBE\u7EC4\u5408\u6587\u4EF6\uFF09\uFF1B\u6807\u9898\u884C\u540C\u6837\u53EF\u6298\u53E0 */}\n {scope !== '' && (\n <section className={css.hubSection} data-open={ownOpen ? 'true' : undefined}>\n <header className={css.bundleRowOuter} data-open={ownOpen ? 'true' : undefined}>\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={ownOpen}\n onClick={() => { setOwnOpen((value) => !value) }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><IconAgentPresetOutlineRegular size={16} /></span>\n <span className={css.bundleName}>{t('mcpPresetOwnSection')}</span>\n <span className={css.bundleCount}>{shownOwn.length}</span>\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n </header>\n {ownOpen && (<>\n <p className={css.mcpEmptyList}>{t('mcpPresetOwnHint')}</p>\n {scoped?.trust === 'system' && <p className={css.mcpEmptyList}>{t('mcpPresetStorageHint')}</p>}\n {shownOwn.length === 0 ? (\n <p className={css.mcpEmptyList}>{ownRows.length === 0 ? t('mcpPresetOwnEmpty') : t('mcpListFilteredEmpty')}</p>\n ) : (\n <div className={css.mcpRecGrid}>\n {shownOwn.map(row => {\n /* \u9884\u8BBE\u81EA\u5E26\u7684\u8FD9\u6761\u884C\u53EA\u8BA4 own \u6761\u76EE\uFF1A\u5168\u5C40\u884C/\u7EE7\u627F\u884C\u7684\u8BBE\u7F6E\u4E0E\u5B83\u4E92\u4E0D\u5F71\u54CD\u3002 */\n const offOwn = offOf(row.serverName, 'own')\n /** \u4E00\u952E\u5168\u7981/\u5168\u5F00\uFF1A\u4E00\u6B21\u8BF7\u6C42\u5E26\u4E0A\u8BE5\u884C\u7684\u5168\u90E8\u5DE5\u5177\u540D\u3002 */\n const ownToolNames = (row.tools ?? []).map(tool => tool.name)\n const allDisabled = ownToolNames.length > 0 && ownToolNames.every(name => offOwn.includes(name))\n return (\n <section key={`own-${row.serverName}`} className={css.mcpRecCard}>\n <div className={css.mcpRecCardHead}>\n <span className={css.mcpRecCardTitleRow}>\n <span className={css.mcpRecCardName}>{row.serverName}</span>\n <span className={css.mcpRecCardTags}>\n <span className={css.mcpRecCatTag}>{row.transport}</span>\n <span className={css.mcpRecCatTag}>\n {(row.registeredCount ?? 0) > 0 ? row.registeredCount : (row.tools?.length ?? 0)} {t('mcpLiveToolsOf')}\n </span>\n {isToolRegistrationPending(row.registeredCount ?? 0, row.tools?.length ?? 0) && (\n <span className={css.mcpRecCatTag} data-off=\"true\" title={t('mcpToolsPendingRegTip')}>\n {t('mcpToolsPendingReg')}\n </span>\n )}\n {globals.some(item => item.serverName === row.serverName) && (\n <span className={css.mcpRecCatTag} data-shadow=\"true\" title={t('mcpPresetShadowGlobalTip')}>\n {t('mcpPresetShadowGlobalTag')}\n </span>\n )}\n {offOwn.length > 0 && (\n <span className={css.mcpRecCatTag} data-off=\"true\">{t('mcpToolDisabledCount', { n: offOwn.length })}</span>\n )}\n </span>\n </span>\n {/* \u4E00\u952E\u5168\u7981/\u5168\u5F00\uFF1A\u9884\u8BBE\u81EA\u5E26\u8FD9\u53F0\u7684\u300C\u5FEB\u901F\u7981\u7528\u5168\u90E8\u5DE5\u5177\u300D\u6ED1\u5757 */}\n <Tooltip\n label={ownToolNames.length === 0\n ? t('mcpToolsPendingRegTip')\n : allDisabled\n ? t('mcpToolAllEnable')\n : offOwn.length > 0\n ? `${t('mcpToolAllPartial')} \u00B7 ${t('mcpToolAllDisable')}`\n : t('mcpToolAllDisable')}\n side=\"bottom\"\n delayMs={400}\n >\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!allDisabled}\n aria-label={t('mcpToolAllAria', { name: row.serverName })}\n className={`${css.toggle} ${allDisabled ? css.toggleOff : css.toggleOn}`}\n disabled={busy !== null || toolBusy !== null || ownToolNames.length === 0}\n onClick={() => { putTools(row.serverName, ownToolNames, allDisabled, 'own') }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n </div>\n <p className={css.mcpRecCardDesc}>{row.summary}</p>\n <McpToolChips\n t={t}\n serverName={row.serverName}\n tools={row.tools ?? []}\n disabledTools={offOwn}\n busy={toolBusy}\n onToggle={(fullName, enabled) => { toggleTool(row.serverName, fullName, enabled, 'own') }}\n />\n <div className={css.mcpCardFoot}>\n <span className={css.mcpCardItem}>\n <span className={css.mcpCardItemLabel}>{t('mcpPresetNewSession')}</span>\n </span>\n <button\n type=\"button\"\n className={css.mcpCardDelete}\n disabled={busy !== null}\n onClick={() => { setRemoveOwnReq(row.serverName) }}\n >\n <IconTrashOutlineRegular size={13} aria-hidden=\"true\" />{t('mcpRemove')}\n </button>\n </div>\n </section>\n )\n })}\n </div>\n )}\n </>)}\n </section>\n )}\n </>\n )}\n\n {/* \u9884\u8BBE\u4E13\u5C5E\u6DFB\u52A0\uFF1A\u7C98\u8D34 JSON / DSH \u539F\u751F YAML\uFF08\u6309\u94AE\u5728\u9876\u680F\uFF09 */}\n <Modal\n open={addOwnOpen}\n onClose={onCloseAddOwn}\n closeLabel={t('close')}\n title={`${t('mcpPresetAddOwn')} \u00B7 ${scoped?.name ?? scope}`}\n >\n <McpPasteAdd\n t={t}\n presetId={scope}\n onAdded={(added) => { onRefresh(); onWatchTools(added) }}\n onCancel={onCloseAddOwn}\n />\n </Modal>\n\n {/* \u5168\u5C40\u6761\u76EE\u5220\u9664\u786E\u8BA4 */}\n {removeReq !== null && (\n <ConfirmDialog\n open\n title={t('mcpRemoveConfirmTitle')}\n message={t('mcpRemoveConfirmMsg', { name: removeReq })}\n confirmLabel={t('mcpRemove')}\n cancelLabel={t('cancel')}\n danger\n onConfirm={() => { const name = removeReq; setRemoveReq(null); removeGlobal(name) }}\n onClose={() => { setRemoveReq(null) }}\n />\n )}\n\n {/* \u9884\u8BBE\u4E13\u5C5E\u884C\u79FB\u9664\u786E\u8BA4\uFF08\u540C\u540D\u5168\u5C40\u6761\u76EE\u4E0D\u53D7\u5F71\u54CD\uFF09 */}\n {removeOwnReq !== null && (\n <ConfirmDialog\n open\n title={t('mcpOwnRemoveConfirmTitle')}\n message={t('mcpOwnRemoveConfirmMsg', { name: removeOwnReq })}\n confirmLabel={t('mcpRemove')}\n cancelLabel={t('cancel')}\n danger\n onConfirm={() => { const name = removeOwnReq; setRemoveOwnReq(null); removeOwn(name) }}\n onClose={() => { setRemoveOwnReq(null) }}\n />\n )}\n </div>\n )\n}\n", "/**\n * ConfirmDialog \u2014 \u66FF\u4EE3 window.confirm \u7684\u4E3B\u9898\u5316\u786E\u8BA4\u5F39\u7A97\uFF08\u6280\u80FD\u9762\u677F\u7834\u574F\u6027\u64CD\u4F5C\u4E13\u7528\uFF09\u3002\n *\n * \u80CC\u666F\uFF1Awindow.confirm \u5728 Electron \u91CC\u662F\u7CFB\u7EDF\u6837\u5F0F\u7684\u7070\u5E95\u5F39\u7A97\uFF08\u6807\u9898\u8FD8\u662F\u7A97\u53E3\u540D\n * dsh-shell\uFF09\uFF0C\u8DDF DSH/\u63D2\u4EF6\u4E3B\u9898\u5B8C\u5168\u8131\u79BB\uFF0C\u4E14\u65E0\u6CD5\u5B9A\u5236\u3002\u672C\u7EC4\u4EF6\u63D0\u4F9B\u540C\u8BED\u4E49\u66FF\u4EE3\uFF1A\n *\n * - createPortal \u5230 body\uFF1A\u7956\u5148\u5BB9\u5668\uFF08\u73BB\u7483\u8D28\u611F backdrop-filter / transform\uFF09\n * \u4F1A\u628A position:fixed \u9489\u8FDB\u5C40\u90E8\u5750\u6807\u7CFB\uFF0C\u906E\u7F69\u5FC5\u987B\u6302\u5230 document.body\uFF1B\n * - z-index 1200\uFF1A\u5168\u5C4F\u5F39\u5C42\u60EF\u4F8B\uFF08\u9AD8\u4E8E popover-shell \u7684 mask 999 / card 1000\uFF09\uFF1B\n * - \u5F00\u5408\u52A8\u753B\u590D\u7528 modal-animation\uFF1Amask \u6DE1\u5165\u6DE1\u51FA + \u5361\u7247\u81EA\u5E95\u90E8 24px \u4E0A\u6ED1\u5F39\u51FA\u3001\n * \u53CD\u5411\u6536\u56DE\uFF0C\u5185\u5BB9\u65E0\u9519\u843D\uFF08\u786E\u8BA4\u5F39\u7A97\u5185\u5BB9\u77ED\uFF0C\u4E0D\u9700\u8981 stagger\uFF09\uFF0C\n * \u5E76\u9075\u5B88 prefers-reduced-motion\uFF1B\n * - \u4EA4\u4E92\uFF1AEsc / \u70B9\u906E\u7F69 = \u53D6\u6D88\uFF1B\u786E\u8BA4\u94AE autoFocus\uFF08\u56DE\u8F66\u5373\u786E\u8BA4\uFF09\uFF1B\u70B9\u786E\u8BA4\u540E\u5148\n * \u64AD\u6536\u56DE\u52A8\u753B\u3001240ms \u540E\u518D\u5378\u8F7D\uFF08onClose\uFF09\uFF0C\u6267\u884C\u52A8\u4F5C\u4E0E\u52A8\u753B\u5E76\u884C\u4E0D\u963B\u585E\uFF1B\n * - danger \u53D8\u4F53\uFF1A\u7834\u574F\u6027\u64CD\u4F5C\uFF08\u5220\u9664/\u6E05\u7A7A/\u56DE\u6EDA\uFF09\u786E\u8BA4\u6309\u94AE\u7528\u8B66\u793A\u7EA2\n * \uFF08--dsw-alias-state-error-primary\uFF09\uFF0C\u4E0E\u9762\u677F iconActionDanger \u540C\u6B3E\u8272\u3002\n *\n * \u6837\u5F0F\u72EC\u7ACB\u6CE8\u5165\uFF08STYLE_ID \u5E42\u7B49\uFF09\uFF0C\u7C7B\u540D\u524D\u7F00 mcd-\uFF0C\u4E0D\u4F9D\u8D56 popover-shell \u5185\u90E8\u7C7B\u3002\n */\n\nimport { useEffect } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives'\nimport {\n ensureModalAnimStyles,\n modalAnimClass,\n modalMaskAnimClass,\n useModalClose,\n} from './modal-animation.js'\nconst STYLE_ID = 'dsh-prompt-customizer-confirm-dialog-styles'\n\nconst SHEET = `\n/* \u2500\u2500 \u906E\u7F69\uFF1A\u56FA\u5B9A\u5168\u5C4F\uFF0C\u70B9\u51FB=\u53D6\u6D88 \u2500\u2500 */\n.mcd-mask{position:fixed;inset:0;z-index:1200;background:var(--dsw-alias-bg-mask-1,rgba(0,0,0,.45))}\n/* \u5C45\u4E2D\u5BB9\u5668\uFF1Aflex \u5B9A\u4F4D\uFF0C\u5361\u7247\u52A8\u753B\u7684 transform \u4E0D\u4E0E\u5176\u51B2\u7A81 */\n.mcd-wrap{position:fixed;inset:0;z-index:1201;display:flex;align-items:center;justify-content:center;pointer-events:none}\n/* \u2500\u2500 \u5361\u7247\uFF1A\u5B9E\u5E95\uFF08\u73BB\u7483\u6A21\u5F0F\u4E5F\u4E0D\u900F\uFF09\u3001\u5706\u89D2 14\u3001l3 \u6295\u5F71 \u2500\u2500 */\n.mcd-card{\n pointer-events:auto;display:flex;flex-direction:column;\n width:min(420px,calc(100vw - 48px));max-height:calc(100vh - 96px);\n box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.14));\n border-radius:14px;\n box-shadow:var(--dsw-shadow-lv3,0 8px 40px rgba(0,0,0,.5));\n overflow:hidden}\n/* \u5B9E\u5E95\uFF1A\u73BB\u7483\u8D28\u611F\u5F00\u542F\u65F6\u4E5F\u4FDD\u6301\u4E0D\u900F\u660E\u8868\u9762\uFF08\u540C popover-shell \u7684 data-solid \u89C4\u5219\uFF1A\n \u9759\u6001 token + html[data-dsh-glass] \u524D\u7F00\u538B\u8FC7 glass.ts \u7684 transparent \u89C4\u5219\uFF09 */\n.mcd-card,html[data-dsh-glass] .mcd-card{\n background:var(--dsw-static-neutral-bluish-00,#fff);\n backdrop-filter:none;-webkit-backdrop-filter:none}\nbody[data-ds-dark-theme] .mcd-card,html[data-dsh-glass] body[data-ds-dark-theme] .mcd-card{\n background:var(--dsw-static-neutral-bluish-850,#2c2c2e)}\n/* \u2500\u2500 \u5185\u5BB9 \u2500\u2500 */\n.mcd-title{flex:none;padding:14px 18px 8px;font-size:15px;font-weight:600;line-height:22px;color:var(--dsw-alias-label-primary,#eee)}\n.mcd-body{flex:none;min-height:0;padding:0 18px 16px;overflow-y:auto;font-size:13px;line-height:20px;color:var(--dsw-alias-label-secondary,#bbb);word-break:break-word}\n.mcd-actions{flex:none;display:flex;justify-content:flex-end;gap:8px;padding:12px 14px;border-top:1px solid var(--dsw-alias-border-l1,rgba(255,255,255,.06))}\n/* danger \u53D8\u4F53\uFF1A\u8B66\u793A\u7EA2\u786E\u8BA4\u6309\u94AE\uFF08outline \u5E95 + \u7EA2\u5B57\u7EA2\u6846\uFF0Chover \u52A0\u6DF1\uFF09 */\n.mcd-btn-danger{\n border-color:var(--dsw-alias-state-error-primary,#e0434b)!important;\n color:var(--dsw-alias-state-error-primary,#e0434b)!important}\n.mcd-btn-danger:hover{\n background:var(--dsw-alias-interactive-bg-hover-danger,rgba(224,67,75,.12))!important;\n border-color:var(--dsw-alias-state-error-primary,#e0434b)!important;\n color:var(--dsw-alias-state-error-primary,#e0434b)!important}\n@media (prefers-reduced-motion:reduce){\n .mcd-mask,.mcd-card{animation:none!important}\n}\n`\n\n/** \u6CE8\u5165\u786E\u8BA4\u5F39\u7A97\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nfunction ensureDialogStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.dataset.plugin = 'dsh-prompt-customizer'\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** ConfirmDialog \u5C5E\u6027\u3002 */\nexport interface ConfirmDialogProps {\n open: boolean\n /** \u6807\u9898\uFF08\u77ED\u540D\u8BCD\uFF0C\u5982\u300C\u8BF7\u786E\u8BA4\u300D\uFF09\u3002 */\n title: string\n /** \u8BF4\u660E\u6587\u6848\uFF08\u5DF2\u6E32\u67D3\u597D\u7684\u5B57\u7B26\u4E32\uFF0C\u542B\u53C2\u6570\u65F6\u7531\u8C03\u7528\u65B9 t() \u5C55\u5F00\uFF09\u3002 */\n message: string\n confirmLabel: string\n cancelLabel: string\n /** \u7834\u574F\u6027\u64CD\u4F5C\uFF1A\u786E\u8BA4\u6309\u94AE\u8B66\u793A\u7EA2\u3002 */\n danger?: boolean\n /** \u70B9\u786E\u8BA4\uFF1A\u7ACB\u5373\u6267\u884C\uFF08\u4E0E\u6536\u56DE\u52A8\u753B\u5E76\u884C\uFF09\u3002 */\n onConfirm: () => void\n /** \u771F\u6B63\u5173\u95ED\uFF08\u6536\u56DE\u52A8\u753B\u64AD\u5B8C\u540E\u89E6\u53D1\uFF1B\u8C03\u7528\u65B9\u5728\u6B64\u6E05 state\uFF09\u3002 */\n onClose: () => void\n}\n\n/**\n * \u4E3B\u9898\u5316\u786E\u8BA4\u5F39\u7A97\u3002\u8C03\u7528\u65B9\u4EE5 `open` \u63A7\u5236\u663E\u793A\uFF1A\n * \u6761\u4EF6\u6E32\u67D3 `{req !== null && <ConfirmDialog open ... />}` \u65F6\uFF0C\n * open \u6052\u4E3A true\uFF0C\u6302\u8F7D\u5373\u5F39\u5165\uFF1BonClose \u91CC\u628A req \u7F6E null \u5373\u5378\u8F7D\u3002\n */\nexport function ConfirmDialog({\n open, title, message, confirmLabel, cancelLabel, danger = false, onConfirm, onClose,\n}: ConfirmDialogProps): JSX.Element | null {\n ensureModalAnimStyles()\n ensureDialogStyles()\n const { closing, requestClose } = useModalClose(open, onClose)\n\n // Esc = \u53D6\u6D88\uFF08\u4E0E\u906E\u7F69\u70B9\u51FB\u7B49\u4EF7\uFF09\u3002\n useEffect(() => {\n if (!open) return undefined\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') requestClose()\n }\n document.addEventListener('keydown', onKey)\n return () => { document.removeEventListener('keydown', onKey) }\n }, [open, requestClose])\n\n if (!open) return null\n\n const handleConfirm = (): void => {\n onConfirm()\n requestClose()\n }\n const handleCancel = (): void => {\n requestClose()\n }\n\n return createPortal(\n <>\n <div className={`mcd-mask ${modalMaskAnimClass(closing)}`} aria-hidden=\"true\" onClick={handleCancel} />\n <div className=\"mcd-wrap\">\n <div className={`mcd-card ${modalAnimClass(closing)}`} role=\"dialog\" aria-modal=\"true\" aria-label={title}>\n <div className=\"mcd-title\">{title}</div>\n <div className=\"mcd-body\">{message}</div>\n <div className=\"mcd-actions\">\n <Button variant=\"outline\" size=\"sm\" onClick={handleCancel}>{cancelLabel}</Button>\n <Button\n variant={danger ? 'outline' : 'primary'}\n size=\"sm\"\n autoFocus\n className={danger ? 'mcd-btn-danger' : undefined}\n onClick={handleConfirm}\n >\n {confirmLabel}\n </Button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n )\n}\n", "/**\n * skills/mcp-live \u2014 /api/triad/mcp-status \u7684\u771F\u5B9E MCP \u72B6\u6001\u3002\n *\n * \u7C7B\u578B\uFF08\u5DE5\u5177/Server/\u9884\u8BBE\u884C/\u6574\u4EFD\u5FEB\u7167\uFF09+ \u62C9\u53D6 hook + \u300C\u5DE5\u5177\u662F\u5426\u5DF2\u6CE8\u518C\u300D\u5224\u5B9A\uFF1B\n * \u9762\u677F\u4E0E MCP \u89C6\u56FE\u5171\u7528\u3002\n */\nimport { useEffect, useState } from 'react'\nimport type { PresetRow } from './types.js'\n\n\n/** \u771F\u5B9E MCP \u72B6\u6001\uFF08host /api/triad/mcp-status\uFF1Actx.tools \u4E2D mcp__* \u5DE5\u5177\u5206\u7EC4\uFF09\u3002 */\nexport interface LiveMcpTool {\n name: string\n description: string\n}\nexport interface LiveMcpServer {\n serverName: string\n toolCount: number\n tools: LiveMcpTool[]\n /** \u914D\u7F6E\u6587\u4EF6\u6761\u76EE\u4FE1\u606F\uFF08\u542F\u7528/\u7981\u7528\u5F00\u5173\u7528\uFF09\u3002 */\n config: { entryId: string | null; disabled: boolean; editable: boolean }\n /** 0.1.6\uFF1A\u4F5C\u7528\u57DF\uFF08\u5F53\u524D\u6052\u4E3A global\uFF09\u3002 */\n scope?: string\n /** 0.1.6\uFF1A\u54EA\u4E9B Agent \u9884\u8BBE\u906E\u853D\u4E86\u5B83\uFF08\u8D26\u672C\u955C\u50CF\uFF09\u3002 */\n maskedBy?: string[]\n}\n/** \u9884\u8BBE\u81EA\u5E26\u7684 mcp-client \u884C\uFF08host \u4ECE\u9884\u8BBE\u7EC4\u5408\u6587\u672C\u89E3\u6790\uFF09\u3002 */\nexport interface PresetMcpRowWire {\n entryId: string\n serverName: string\n transport: string\n summary: string\n /** \u8BE5 server \u7684\u5DE5\u5177\uFF08\u6D3B\u52A8 agent \u4F5C\u7528\u57DF \u222A \u540D\u5355\u7F13\u5B58\uFF1B\u65E0\u6570\u636E\u65F6\u7F3A\u7701\uFF09\u3002 */\n tools?: LiveMcpTool[]\n}\nexport interface LiveMcpState {\n at: string\n serverCount: number\n toolCount: number\n servers: LiveMcpServer[]\n /** 0.1.6\uFF1AAgent \u9884\u8BBE\u540D\u5355\u3002 */\n presets?: PresetRow[]\n /** 0.1.6\uFF1ApresetId \u2192 { serverName: false }\uFF08\u663E\u5F0F\u906E\u853D\uFF1B\u7F3A\u7701 = \u7EE7\u627F\u5168\u5C40\uFF09\u3002 */\n masks?: Record<string, Record<string, boolean>>\n /** 0.1.6\uFF1ApresetId \u2192 \u8BE5\u9884\u8BBE\u81EA\u5E26\u7684 mcp-client \u884C\u3002 */\n presetServers?: Record<string, PresetMcpRowWire[]>\n /** \u5DE5\u5177\u7EA7\u7981\u7528\u00B7\u5168\u5C40\u5C42\u955C\u50CF\uFF1AserverName \u2192 \u7981\u7528\u5DE5\u5177\u5168\u540D\uFF08\u6240\u6709\u9884\u8BBE\u751F\u6548\uFF09\u3002 */\n toolDisabled?: Record<string, string[]>\n /** \u5DE5\u5177\u7EA7\u7981\u7528\u00B7\u9884\u8BBE\u5C42\u955C\u50CF\uFF08\u6309\u300C\u884C\u300D\u5206\u8D26\uFF09\uFF1ApresetId \u2192 serverName \u2192 { own, inherit }\u3002 */\n toolDisabledByPreset?: Record<string, Record<string, { own: string[]; inherit: string[] }>>\n /** \u906E\u853D\u8865\u4E01\u8FD0\u884C\u671F\u5B89\u88C5\u8BCA\u65AD\uFF1ApresetId \u2192 \u6D3B\u52A8 agent \u6570\u4E0E deny \u6570\u3001\u5931\u8D25\u539F\u56E0\u3002 */\n maskInstall?: Record<string, { agents: number; deniedAgents: number; denyTotal: number; errors: string[] }>\n}\nexport type LiveMcpStatus =\n | { state: 'loading'; data: null }\n | { state: 'ready'; data: LiveMcpState }\n | { state: 'unavailable'; data: null }\n\n/** \u6DFB\u52A0/\u542F\u7528\u540E\u81EA\u52A8\u7B49\u5DE5\u5177\u6CE8\u518C\u7684\u8F6E\u8BE2\u95F4\u9694\u4E0E\u603B\u65F6\u957F\u3002 */\nexport const MCP_TOOL_WATCH_INTERVAL_MS = 2000\n// npx \u9996\u6B21\u62C9\u5305\u53EF\u80FD\u8981\u4E00\u4E24\u5206\u949F\uFF0C\u7B49\u5F85\u7A97\u53E3\u7ED9\u8DB3\uFF1B\u671F\u95F4\u5361\u7247\u663E\u793A\u300C\u7B49\u5F85\u6CE8\u518C\u300D\uFF0C\u8D85\u65F6\u540E\n// \u7528\u6237\u4ECD\u53EF\u624B\u52A8\u5237\u65B0\uFF08\u4E0B\u4E00\u6B21\u6DFB\u52A0/\u542F\u7528\u4F1A\u91CD\u65B0\u5F00\u59CB\u7B49\u5F85\uFF09\u3002\nexport const MCP_TOOL_WATCH_TIMEOUT_MS = 150_000\n\n/**\n * \u72B6\u6001\u91CC\u67D0 Server **\u5B9E\u9645\u6CE8\u518C**\u7684\u5DE5\u5177\u6570\uFF08\u5168\u5C40\u6761\u76EE \u222A \u5404\u9884\u8BBE\u81EA\u5E26\u884C\uFF0C\u53D6\u6700\u5927\uFF09\u3002\n *\n * \u4E00\u5B9A\u8981\u7528\u6CE8\u518C\u6570\uFF08`toolCount` / `registeredCount`\uFF09\uFF0C\u4E0D\u80FD\u7528\u5361\u7247\u4E0A\u90A3\u4EFD\n * \u300C\u6CE8\u518C \u222A \u540D\u5355\u7F13\u5B58\u300D\u7684\u5217\u8868\u957F\u5EA6 \u2014\u2014 \u7F13\u5B58\u4F1A\u8BA9\u8FD8\u6CA1\u8FDE\u4E0A\u7684 Server \u770B\u8D77\u6765\u5DF2\u5C31\u7EEA\uFF0C\n * \u81EA\u52A8\u7B49\u5F85\u5C31\u4F1A\u63D0\u524D\u6536\u5DE5\uFF08\u8868\u73B0\u5C31\u662F\u5361\u5728\u300C0 \u5DE5\u5177\u300D\u8FD8\u5F97\u624B\u52A8\u5237\u65B0\uFF09\u3002\n */\nexport function mcpRegisteredToolCountOf(data: LiveMcpState, serverName: string): number {\n let count = data.servers.find(server => server.serverName === serverName)?.toolCount ?? 0\n for (const rows of Object.values(data.presetServers ?? {})) {\n const row = rows.find(item => item.serverName === serverName)\n if (row !== undefined) count = Math.max(count, row.registeredCount ?? 0)\n }\n return count\n}\n\n/** \u8BE5 Server \u662F\u5426\u8FD8\u6CA1\u6CE8\u518C\u51FA\u5DE5\u5177\uFF08\u5361\u7247\u7ED9\u300C\u7B49\u5F85\u6CE8\u518C\u300D\u6807\u8BB0\u7528\uFF09\u3002 */\nexport function isToolRegistrationPending(registered: number, listed: number): boolean {\n return registered === 0 && listed > 0\n}\n\n/** \u62C9\u53D6\u771F\u5B9E MCP \u6CE8\u518C\u72B6\u6001\uFF1B\u5931\u8D25\uFF08\u670D\u52A1\u7AEF\u672A\u91CD\u542F\u7B49\uFF09\u2192 unavailable\uFF08\u754C\u9762\u5F15\u5BFC\u91CD\u542F\uFF09\u3002 */\nexport function useMcpLiveState(): [LiveMcpStatus, () => void] {\n const [status, setStatus] = useState<LiveMcpStatus>({ state: 'loading', data: null })\n const load = (): void => {\n setStatus((current) => (current.state === 'ready' ? current : { state: 'loading', data: null }))\n void fetch('/api/triad/mcp-status', { headers: { accept: 'application/json' } })\n .then((response) => { if (!response.ok) throw new Error(String(response.status)); return response.json() })\n .then((body) => {\n if (typeof body !== 'object' || body === null || !Array.isArray((body as { servers?: unknown }).servers)) throw new Error('bad shape')\n const data = body as LiveMcpState\n setStatus({ state: 'ready', data })\n })\n .catch(() => { setStatus({ state: 'unavailable', data: null }) })\n }\n useEffect(() => { load() /* eslint-disable-next-line react-hooks/exhaustive-deps */ }, [])\n return [status, load]\n}\n", "/**\n * skills/SkillCard \u2014 \u6280\u80FD\u5361\uFF08\u7F51\u683C\u5355\u5143\uFF09\u4E0E\u6280\u80FD\u5305\u5206\u7C7B\u7F16\u8F91\u5668\u3002\n */\nimport { useEffect, useRef, useState, type CSSProperties } from 'react'\nimport {\n IconCloseOutlineRegular, IconPlusOutlineRegular, IconTrashOutlineRegular, Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CheckIcon, CopyIcon } from './icons.js'\nimport { skillT } from './locales.js'\nimport { css } from './styles.js'\nimport { MAX_BUNDLE_CATEGORIES, PRESET_BUNDLE_CATEGORIES, type SkillInfo } from './types.js'\n/**\n * \u6280\u80FD\u5361\u7247\uFF08Skills Hub \u98CE\u683C\uFF09\uFF1A\n * [\u56FE\u6807\u74F7\u7247] \u6807\u9898(\u7C97) [\u590D\u5236\u94AE] [\u7EFF\u8272\u5F00\u5173]\n * \u63CF\u8FF0\u4E00\u884C\uFF08\u7701\u7565\u53F7\uFF09\n * [\u6765\u6E90 pill][\u4F5C\u7528\u57DF pill] N \u6587\u4EF6\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * \u5DE5\u5177 [\u67E5\u770B] [\u67E5\u770B\u6587\u4EF6\u6309\u94AE] [\u5F52\u5165/\u79FB\u51FA] [\u5220\u9664]\n */\n/**\n * \u5206\u7C7B\u7F16\u8F91\u5668\uFF1A\u5DF2\u9009\u6807\u7B7E\uFF08\u53EF\u6458\uFF09+ \u5EFA\u8BAE\u5206\u7C7B\uFF08\u70B9\u52A0\uFF09+ \u81EA\u5B9A\u4E49\u8F93\u5165\uFF08\u56DE\u8F66\u52A0\uFF09\u3002\n * \u300C\u65B0\u5EFA\u6280\u80FD\u5305\u300D\u4E0E\u300C\u8BBE\u7F6E\u5206\u7C7B\u300D\u4E24\u5904\u5171\u7528\uFF0C\u503C\u7531\u7236\u7EA7\u6301\u6709\u3002\n */\nexport function CategoryEditor({ value, onChange, label }: {\n value: string[]\n onChange: (next: string[]) => void\n label: string\n}): JSX.Element {\n const [draft, setDraft] = useState('')\n const full = value.length >= MAX_BUNDLE_CATEGORIES\n const add = (raw: string): void => {\n const name = raw.trim().slice(0, 24)\n setDraft('')\n if (name === '' || value.includes(name) || full) return\n onChange([...value, name])\n }\n return (\n <div className={css.catEditor}>\n {value.length === 0 ? (\n <p className={css.catEmpty}>{skillT('bundleCatEmptyHint')}</p>\n ) : (\n <ul className={css.catSelected} aria-label={label}>\n {value.map((name) => (\n <li key={name} className={css.catSelectedTag}>\n <span className={css.catSelectedName}>{name}</span>\n <button\n type=\"button\"\n className={css.catRemove}\n aria-label={skillT('bundleCatRemove', { name })}\n onClick={() => { onChange(value.filter((item) => item !== name)) }}\n >\n <IconCloseOutlineRegular size={11} aria-hidden=\"true\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n <div className={css.catSuggest} role=\"group\" aria-label={skillT('bundleCatTitle')}>\n {PRESET_BUNDLE_CATEGORIES.filter((preset) => !value.includes(preset)).map((preset) => (\n <button\n type=\"button\"\n key={preset}\n className={css.catPreset}\n disabled={full}\n title={skillT('bundleCatAddPreset', { name: preset })}\n onClick={() => { add(preset) }}\n >\n <span className={css.catPresetPlus} aria-hidden=\"true\">+</span>{preset}\n </button>\n ))}\n </div>\n <input\n className={css.catInput}\n value={draft}\n placeholder={skillT('bundleCatPlaceholder')}\n aria-label={skillT('bundleCatCustom')}\n disabled={full}\n onChange={(event) => { setDraft(event.currentTarget.value) }}\n onKeyDown={(event) => { if (event.key === 'Enter') { event.preventDefault(); add(draft) } }}\n />\n {full && <p className={css.catLimit}>{skillT('bundleCatLimit', { n: MAX_BUNDLE_CATEGORIES })}</p>}\n </div>\n )\n}\n\nexport function SkillCard({ skill, bundleId, bundleName, enabled, lockedReason, scopeLabel, index, onToggle, onView, onAssign, onRemove, onDelete }: {\n skill: SkillInfo\n bundleId: string | null\n bundleName: string | null\n enabled: boolean\n /** \u975E\u7A7A\u65F6\u5F00\u5173\u88AB\u9501\u4F4F\uFF08\u5982\uFF1A\u5168\u5C40\u5C42\u5DF2\u7981\u7528\uFF0C\u9884\u8BBE\u5C42\u65E0\u6CD5\u6253\u5F00\uFF09\uFF0C\u5E76\u663E\u793A\u539F\u56E0\u3002 */\n lockedReason?: string\n /** \u5F53\u524D\u4F5C\u7528\u57DF pill \u6587\u6848\uFF08\u300C\u5168\u90E8 Agent\u300D= \u5168\u5C40\uFF09\u3002 */\n scopeLabel: string\n /** \u7F51\u683C\u5E8F\u53F7\uFF1A\u5165\u573A\u9519\u5CF0\u52A8\u753B\u5EF6\u65F6\u3002 */\n index: number\n onToggle: (skill: SkillInfo, enabled: boolean) => void\n onView: (skill: SkillInfo) => void\n onAssign?: (skill: SkillInfo) => void\n onRemove?: (skill: SkillInfo) => void\n onDelete?: (skill: SkillInfo) => void\n}): JSX.Element {\n const files = Array.isArray(skill.files) ? skill.files : []\n const description = skill.description ?? ''\n const [copied, setCopied] = useState(false)\n const copiedTimer = useRef<number | null>(null)\n useEffect(() => () => {\n if (copiedTimer.current !== null) window.clearTimeout(copiedTimer.current)\n }, [])\n\n const flashCopied = (): void => {\n setCopied(true)\n if (copiedTimer.current !== null) window.clearTimeout(copiedTimer.current)\n copiedTimer.current = window.setTimeout(() => { setCopied(false) }, 1200)\n }\n /** \u590D\u5236\u6280\u80FD\u540D\uFF1A\u4E3B\u7528 clipboard API\uFF0C\u56DE\u9000\u4E00\u4E2A\u9690\u85CF textarea + execCommand\u3002 */\n const copyName = (): void => {\n const fallback = (): void => {\n try {\n const textarea = document.createElement('textarea')\n textarea.value = skill.name\n textarea.style.position = 'fixed'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n document.execCommand('copy')\n document.body.removeChild(textarea)\n } catch {\n /* \u590D\u5236\u5931\u8D25\u9759\u9ED8\uFF1A\u6309\u94AE\u4ECD\u7ED9\u51FA\u5DF2\u590D\u5236\u53CD\u9988\uFF0C\u65E0\u526F\u4F5C\u7528\u3002 */\n }\n }\n try {\n if (navigator.clipboard !== undefined) {\n void navigator.clipboard.writeText(skill.name).then(flashCopied, () => { fallback(); flashCopied() })\n } else {\n fallback()\n flashCopied()\n }\n } catch {\n fallback()\n flashCopied()\n }\n }\n\n const toggleLabel = lockedReason ?? (enabled ? skillT('disableSkill') : skillT('enableSkill'))\n const fileMeta = typeof skill.fileCount === 'number' ? skill.fileCount : files.length\n return (\n <li\n className={css.skillCard}\n data-off={enabled ? undefined : 'true'}\n style={{ '--skm-i': index } as CSSProperties}\n >\n <div className={css.skillCardHead}>\n <span className={css.skillBadge} aria-hidden=\"true\">skill</span>\n <button\n type=\"button\"\n className={css.skillTitle}\n title={skill.name}\n onClick={() => { onView(skill) }}\n >\n {skill.name}\n </button>\n <span className={css.skillCardToggle}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={toggleLabel}\n title={toggleLabel}\n className={`${css.toggle} ${enabled ? css.toggleOn : css.toggleOff}`}\n disabled={lockedReason !== undefined}\n onClick={(event) => {\n event.stopPropagation()\n onToggle(skill, !enabled)\n }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </span>\n </div>\n {description !== '' && (\n <button type=\"button\" className={css.skillDesc} title={description} onClick={() => { onView(skill) }}>{description}</button>\n )}\n <div className={css.skillTags}>\n <span className={`${css.tag} ${css.tagSource}`}>{bundleName ?? skillT('tagLoose')}</span>\n <span className={`${css.tag} ${css.tagScope}`} data-off={enabled ? undefined : 'true'}>{scopeLabel}</span>\n {!enabled && <span className={`${css.tag} ${css.tagStatus}`}>{skillT('skillOffTag')}</span>}\n <span className={css.skillMeta}>{skillT('fileCount', { n: fileMeta })}</span>\n </div>\n <div className={css.skillCardFoot}>\n <span className={css.skillFootLabel}>{skillT('toolsLabel')}</span>\n <div className={css.skillCardActions}>\n <Tooltip label={skillT('copySkillName')} side=\"bottom\" delayMs={500}>\n <button\n type=\"button\"\n className={css.skillFootIcon}\n data-copied={copied ? 'true' : undefined}\n aria-label={copied ? skillT('copiedSkillName') : skillT('copySkillName')}\n title={copied ? skillT('copiedSkillName') : skillT('copySkillName')}\n onClick={copyName}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n </Tooltip>\n {bundleId !== null ? (\n <Tooltip label={skillT('removeSkill')} side=\"bottom\" delayMs={500}>\n <button type=\"button\" className={css.skillFootIcon} aria-label={skillT('removeSkill')}\n title={skillT('removeSkill')} onClick={() => { onRemove?.(skill) }}>\n <IconCloseOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n ) : (\n <Tooltip label={skillT('assignToBundle')} side=\"bottom\" delayMs={500}>\n <button type=\"button\" className={css.skillFootIcon} aria-label={skillT('assignToBundle')}\n title={skillT('assignToBundle')} onClick={() => { onAssign?.(skill) }}>\n <IconPlusOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n )}\n <Tooltip label={skillT('deleteSkillBtn')} side=\"bottom\" delayMs={500}>\n <button type=\"button\" className={`${css.skillFootIcon} ${css.skillFootIconDanger}`}\n aria-label={skillT('deleteSkillBtn')} title={skillT('deleteSkillBtn')}\n onClick={() => { onDelete?.(skill) }}>\n <IconTrashOutlineRegular size={14} aria-hidden=\"true\" />\n </button>\n </Tooltip>\n </div>\n </div>\n </li>\n )\n}\n", "/**\n * skills/types \u2014 \u9762\u677F\u62C6\u5206\u540E\u7684\u5171\u4EAB\u6570\u636E\u6A21\u578B\u4E0E\u5E38\u91CF\u3002\n *\n * \u542B\u5404\u9762\u677F\u5171\u7528\u7684\u89C6\u56FE\u72B6\u6001\u7C7B\u578B\u3001\u6280\u80FD/MCP \u7EBF\u534F\u8BAE\u5F62\u72B6\u3001\u6280\u80FD\u5305\u5206\u7C7B\u5E38\u91CF\uFF1B\n * \u53EA\u653E\u7C7B\u578B\u4E0E\u7EAF\u51FD\u6570\uFF0C\u4E0D\u5F15\u5165\u4EFB\u4F55\u8FD0\u884C\u65F6\u4F9D\u8D56\u3002\n */\n/** ---------------------------------------------------------------- \u6570\u636E\u6A21\u578B */\n\nexport interface SkillInfo {\n name: string\n description?: string\n files?: string[]\n fileCount?: number\n compatibility?: string\n /** \u6280\u80FD\u76EE\u5F55\u540D\uFF1A\u4E0E name \u53EF\u4EE5\u4E0D\u4E00\u81F4\uFF08\u624B\u5DE5\u62F7\u76EE\u5F55\u3001\u6539\u540D\u5BFC\u5165\uFF09\uFF0C\u5220\u9664/\u67E5\u770B\u8D70\u5B83\u3002 */\n dir?: string\n}\n\nexport interface BundleInfo {\n id: string\n name: string\n skillCount: number\n skills: SkillInfo[]\n /** \u8D26\u672C\u91CC\u6307\u5411\u5DF2\u6D88\u5931\u6280\u80FD\u7684\u6761\u76EE\uFF08\u9762\u677F\u7ED9\u300C\u6E05\u7406\u5931\u6548\u5F15\u7528\u300D\u5165\u53E3\uFF09\u3002 */\n missingSkills?: string[]\n /** \u6280\u80FD\u5305\u5206\u7C7B\uFF08\u4E00\u4E2A\u5305\u53EF\u6302\u591A\u4E2A\uFF09\uFF1B\u8001\u8D26\u672C\u6CA1\u6709\u8BE5\u5B57\u6BB5\u65F6\u6309\u672A\u5206\u7C7B\u5904\u7406\u3002 */\n categories?: string[]\n}\n\nexport interface SkillSnapshot {\n bundles: BundleInfo[]\n loose: SkillInfo[]\n}\n\nexport type PanelState =\n | { status: 'loading' }\n | { status: 'error' }\n | { status: 'ready'; snapshot: SkillSnapshot }\n/** ---------------------------------------------------------------- \u6280\u80FD\u5305\u5206\u7C7B */\n\n/** \u5EFA\u8BAE\u5206\u7C7B\uFF1A\u70B9\u4E00\u4E0B\u5C31\u6302\u4E0A\uFF1B\u4E5F\u5141\u8BB8\u81EA\u5DF1\u5199\uFF0C\u8D26\u672C\u91CC\u5B58\u7684\u5C31\u662F\u5B57\u7B26\u4E32\u672C\u8EAB\u3002 */\nexport const PRESET_BUNDLE_CATEGORIES = ['\u5F00\u53D1', '\u8BBE\u8BA1', '\u529E\u516C\u534F\u540C', '\u6587\u6863\u77E5\u8BC6', '\u6570\u636E', '\u81EA\u52A8\u5316', '\u8FD0\u7EF4', '\u5176\u4ED6']\n\n/** \u5206\u7C7B\u7B5B\u9009\u91CC\u4EE3\u8868\u300C\u6CA1\u6302\u4EFB\u4F55\u5206\u7C7B\u7684\u5305\u300D\u7684\u54E8\u5175\u503C\uFF08\u4E0D\u4F1A\u662F\u5408\u6CD5\u5206\u7C7B\u540D\uFF09\u3002 */\nexport const UNCATEGORIZED = '\\u0000none'\n\n/** \u4E00\u4E2A\u6280\u80FD\u5305\u6700\u591A\u6302\u51E0\u4E2A\u5206\u7C7B\uFF08\u4E0E host \u7684 CATEGORY_MAX_PER_BUNDLE \u5BF9\u9F50\uFF09\u3002 */\nexport const MAX_BUNDLE_CATEGORIES = 8\n\n/** \u5206\u7C7B\u4E0D\u505A\u9010\u7C7B\u914D\u8272\uFF1A\u4E00\u4E2A\u9762\u677F\u53EA\u6709\u4E3B\u9898\u84DD\u4E00\u628A\u5237\u5B50\uFF08\u5F69\u8679\u8272\u677F\u5B9E\u6D4B\u592A\u5435\uFF0C\u5DF2\u5426\uFF09\u3002 */\n\n/** \u5206\u7C7B\u540D\u5355\u6392\u5E8F\uFF1A\u6309\u6302\u8F7D\u7684\u5305\u6570\u4ECE\u591A\u5230\u5C11\uFF0C\u540C\u6570\u6309\u540D\u5B57\u3002 */\nexport function sortCategories(counts: Map<string, number>): string[] {\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0], 'zh'))\n .map((entry) => entry[0])\n}\n/** \u300C\u5168\u90E8 Agent\u300D\u865A\u62DF\u9884\u8BBE\u7684\u54E8\u5175 id\uFF08\u4E0D\u4F1A\u4E0E\u771F\u5B9E preset id \u51B2\u7A81\uFF1A\u771F\u5B9E id \u4E0D\u542B *\uFF09\u3002 */\nexport const ALL_PRESETS = '*'\nexport type ConfirmState =\n | { kind: 'bundle'; bundle: BundleInfo }\n | { kind: 'skill'; name: string; dir?: string }\nexport type InstallState =\n | { archive: true; name: string; data: string; folderName: string }\n | { archive?: false; files: CollectedFile[]; folderName: string }\nexport type ViewerState = { skill: SkillInfo; file: string; loading: boolean; error?: string; content?: string }\n/** \u6536\u96C6\u5230\u7684\u4E00\u4E2A\u5F85\u5B89\u88C5\u6587\u4EF6\uFF1A\u76F8\u5BF9\u6280\u80FD\u6839\u7684\u8DEF\u5F84 + \u6D4F\u89C8\u5668 File \u53E5\u67C4\u3002 */\nexport interface CollectedFile { path: string; file: File }\nexport type InstallInput =\n | { archive: string; description: string; bundleId?: string }\n | { skillName: string; description: string; bundleId?: string; files: Array<{ path: string; data: string }> }\n\n/** \u5065\u5EB7\u626B\u63CF\u7684\u5C55\u793A\u6A21\u578B\uFF08\u9876\u680F\u5065\u5EB7\u6307\u793A\u7684 tone / \u6587\u6848 / \u60AC\u505C\u8BE6\u60C5\uFF09\u3002 */\nexport interface HealthViewModel {\n tone: string\n label: string\n title: string\n}\n\n/** \u6280\u80FD\u76EE\u5F55\u5065\u5EB7\u68C0\u67E5\uFF08/api/skill-health \u54CD\u5E94\uFF0Chost \u53EA\u8BFB\u626B\u63CF\uFF09\u3002 */\nexport interface HealthIssue {\n level: 'error' | 'warn'\n code: string\n skill?: string\n bundle?: string\n message: string\n}\n\nexport interface HealthReport {\n ok: boolean\n healthy: number\n issues: HealthIssue[]\n}\n\n/** \u540C\u6B65\u72B6\u6001\u5361\u7684\u5C55\u793A\u6001\u3002 */\nexport type HealthView =\n | { state: 'loading' }\n | { state: 'ok'; report: HealthReport }\n | { state: 'issue'; report: HealthReport }\n | { state: 'unavailable' }\n\n/** \u6280\u80FD\u5F00\u5173\u72B6\u6001(/api/skill-toggles/status \u54CD\u5E94)\u3002 */\nexport interface ToggleStatus {\n skills: Record<string, boolean>\n bundles: Record<string, boolean>\n}\n\n/** \u4E00\u4E2A Agent \u9884\u8BBE(host \u4ECE ctx.agentPresets.list() \u6295\u5F71\u800C\u6765)\u3002 */\nexport interface PresetRow {\n id: string\n trust: 'system' | 'user'\n isDefault?: boolean\n name?: string\n description?: string\n order?: number\n}\n\n/** /api/skill-toggles/presets \u54CD\u5E94:\u540D\u5355 + \u5404\u9884\u8BBE\u8986\u76D6 + \u5168\u5C40\u5C42\u72B6\u6001\u3002 */\nexport interface PresetStatus extends ToggleStatus {\n presets: PresetRow[]\n /** presetId \u2192 { skillName: false } \u2014\u2014 \u53EA\u6709\u663E\u5F0F false \u624D\u662F\u300C\u8BE5\u9884\u8BBE\u4E0B\u5173\u95ED\u300D\u3002 */\n overrides: Record<string, Record<string, boolean>>\n}\n\n", "/**\n * skills/SkillViewer \u2014 \u6280\u80FD\u6587\u4EF6\u67E5\u770B\u5668\uFF08\u5927\u753B\u5E45 + \u4E09\u6863\u5B57\u53F7 + \u5168\u5C4F\uFF09\u53CA\u5176\u504F\u597D\u8BFB\u5199\u3002\n */\nimport { type CSSProperties } from 'react'\nimport { Modal } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { renderSkillMarkdown } from './markdown.js'\nimport { css } from './styles.js'\nimport type { ViewerState } from './types.js'\n/** ---------------------------------------------------------------- \u67E5\u770B\u5668\u504F\u597D */\n\n/** \u5B57\u53F7\u4E09\u6863\uFF08px\uFF09\uFF1A\u5C0F / \u6807\u51C6 / \u5927\u3002\u9ED8\u8BA4\u53D6\u4E2D\u95F4\u4E00\u6863\u3002 */\nexport const VIEWER_FONT_SIZES = [13.5, 15, 17]\nexport const VIEWER_PREF_KEY = 'dsh.triad.skillViewer'\n/** \u4E09\u6863\u5B57\u53F7\u7684\u60AC\u6D6E\u6587\u6848\uFF08\u4E0E VIEWER_FONT_SIZES \u4E00\u4E00\u5BF9\u5E94\uFF09\u3002 */\nexport const VIEWER_FONT_LABELS = ['\u5C0F\u5B57\u53F7', '\u6807\u51C6\u5B57\u53F7', '\u5927\u5B57\u53F7']\n\nexport interface ViewerPrefs { font: number; full: boolean }\n\n/** \u8BFB\u67E5\u770B\u5668\u504F\u597D\uFF08\u5B57\u53F7 + \u5168\u5C4F\uFF09\uFF1BlocalStorage \u4E0D\u53EF\u7528\u65F6\u56DE\u843D\u5230\u9ED8\u8BA4\u503C\u3002 */\nexport function readViewerPrefs(): ViewerPrefs {\n try {\n const raw = localStorage.getItem(VIEWER_PREF_KEY)\n if (typeof raw !== 'string' || raw === '') return { font: 1, full: false }\n const parsed = JSON.parse(raw) as Partial<ViewerPrefs>\n const font = typeof parsed.font === 'number' && parsed.font >= 0 && parsed.font < VIEWER_FONT_SIZES.length\n ? Math.trunc(parsed.font)\n : 1\n return { font, full: parsed.full === true }\n } catch {\n return { font: 1, full: false }\n }\n}\n\n/** \u5199\u67E5\u770B\u5668\u504F\u597D\uFF1B\u9690\u79C1\u6A21\u5F0F\u7B49\u5199\u5165\u5931\u8D25\u65F6\u9759\u9ED8\u964D\u7EA7\u4E3A\u300C\u53EA\u6D3B\u5230\u672C\u6B21\u5237\u65B0\u300D\u3002 */\nexport function writeViewerPrefs(prefs: ViewerPrefs): void {\n try { localStorage.setItem(VIEWER_PREF_KEY, JSON.stringify(prefs)) } catch { /* \u5FFD\u7565 */ }\n}\n\n/** \u5168\u5C4F / \u8FD8\u539F\uFF1A\u5BF9\u89D2\u7BAD\u5934\uFF0C\u72B6\u6001\u5207\u6362\u65F6\u9760 CSS \u8FC7\u6E21\u7FFB\u8F6C\u3002 */\nexport function ViewerExpandIcon({ full }: { full: boolean }): JSX.Element {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n {full\n ? <path d=\"M6.2 2.2v4h-4M9.8 2.2v4h4M6.2 13.8v-4h-4M9.8 13.8v-4h4\" />\n : <path d=\"M2.2 6.2v-4h4M13.8 6.2v-4h-4M2.2 9.8v4h4M13.8 9.8v4h-4\" />}\n </svg>\n )\n}\n\nexport interface ViewRow { kind: 'dir' | 'file'; path: string; depth: number; main: boolean }\n\nexport function skillFileRows(files: string[]): ViewRow[] {\n const rows: ViewRow[] = []\n const seenDirs = new Set<string>()\n for (const path of files) {\n const parts = path.split('/')\n let dirPath = ''\n for (let i = 0; i < parts.length - 1; i += 1) {\n dirPath = dirPath === '' ? parts[i] : dirPath + '/' + parts[i]\n if (!seenDirs.has(dirPath)) {\n seenDirs.add(dirPath)\n rows.push({ kind: 'dir', path: dirPath + '/', depth: i, main: false })\n }\n }\n rows.push({ kind: 'file', path, depth: parts.length - 1, main: path === 'SKILL.md' })\n }\n return rows\n}\n\n/**\n * \u67E5\u770B\u5668\u5F39\u7A97\uFF1A\u5DE6\u4FA7\u6587\u4EF6\u6811 + \u53F3\u4FA7\u6E32\u67D3\u5185\u5BB9\uFF1B\u5DE5\u5177\u6761\u5207\u4E09\u6863\u5B57\u53F7\u4E0E\u5168\u5C4F\u3002\n * viewer \u4E3A null \u65F6\u4E0D\u6E32\u67D3\uFF08\u8C03\u7528\u65B9\u6761\u4EF6\u6302\u8F7D\uFF09\u3002\n */\nexport function SkillViewer({\n t, viewer, viewerFont, viewerFull, onFontLevel, onToggleFull, onSelectFile, onClose,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n viewer: ViewerState | null\n viewerFont: number\n viewerFull: boolean\n onFontLevel: (level: number) => void\n onToggleFull: () => void\n onSelectFile: (filePath: string) => void\n onClose: () => void\n}): JSX.Element | null {\n if (viewer === null) return null\n return (\n <Modal\n open\n onClose={() => { onClose() }}\n closeLabel={t('close')}\n title={viewer.skill.name + (viewer.file === 'SKILL.md' ? '' : ' \u00B7 ' + viewer.file)}\n className={css.viewerModal + (viewerFull ? ' ' + css.viewerModalFull : '')}\n contentClassName={css.viewerBody}\n >\n {/* \u5DE5\u5177\u6761\uFF1A\u5F53\u524D\u6587\u4EF6 + \u5B57\u53F7\u4E09\u6863 + \u5168\u5C4F\u5207\u6362\uFF08\u504F\u597D\u6301\u4E45\u5316\uFF09 */}\n <div className={css.viewerToolbar}>\n <span className={css.viewerPath}>\n <b>{viewer.file}</b>\n <span>{t('viewerFilesCount', { n: Array.isArray(viewer.skill.files) ? viewer.skill.files.length : 0 })}</span>\n </span>\n <span className={css.viewerToolGroup} role=\"group\" aria-label={t('viewerFont')}>\n {VIEWER_FONT_SIZES.map((size, level) => (\n <button\n key={size}\n type=\"button\"\n className={css.viewerToolBtn + (level === 0 ? ' ' + css.viewerToolBtnA1 : level === 2 ? ' ' + css.viewerToolBtnA3 : '')}\n data-active={viewerFont === level ? 'true' : undefined}\n title={VIEWER_FONT_LABELS[level]}\n aria-label={VIEWER_FONT_LABELS[level]}\n aria-pressed={viewerFont === level}\n onClick={() => { onFontLevel(level) }}\n >A</button>\n ))}\n </span>\n <button\n type=\"button\"\n className={css.viewerToolBtn + ' ' + css.viewerToolBtnFrame}\n data-active={viewerFull ? 'true' : undefined}\n title={viewerFull ? t('viewerExitFull') : t('viewerFull')}\n aria-label={viewerFull ? t('viewerExitFull') : t('viewerFull')}\n aria-pressed={viewerFull}\n onClick={onToggleFull}\n >\n <ViewerExpandIcon full={viewerFull} />\n </button>\n </div>\n <div className={css.viewerLayout}>\n <nav className={css.viewerNav} aria-label={t('viewerNav')}>\n {skillFileRows(Array.isArray(viewer.skill.files) ? viewer.skill.files : []).map((row, index) => (\n <div\n key={row.path + '-' + String(index)}\n className={css.viewerNavItem + (row.kind === 'dir' ? ' ' + css.viewerNavDir : '')}\n data-active={row.kind === 'file' && row.path === viewer.file ? 'true' : undefined}\n data-dir={row.kind === 'dir' ? 'true' : undefined}\n style={{ paddingLeft: 8 + row.depth * 14 }}\n title={row.path}\n onClick={row.kind === 'file' ? () => { onSelectFile(row.path) } : undefined}\n >\n {row.kind === 'dir' ? '\uD83D\uDCC1 ' : '\uD83D\uDCC4 '}\n {row.path}\n </div>\n ))}\n </nav>\n <div className={css.viewerContent} style={{ '--skm-vfs': `${String(VIEWER_FONT_SIZES[viewerFont])}px` } as CSSProperties}>\n {viewer.loading === true\n ? t('previewLoading')\n : viewer.error !== undefined\n ? viewer.error\n : <div dangerouslySetInnerHTML={{ __html: renderSkillMarkdown(viewer.content ?? '') }} />}\n </div>\n </div>\n </Modal>\n )\n}\n", "/**\n * skills/markdown \u2014 \u6280\u80FD\u5185\u5BB9\u9884\u89C8\u7684\u6781\u7B80 markdown \u6E32\u67D3\uFF08\u96F6\u5916\u90E8\u4F9D\u8D56\uFF0C\u53EA\u62FC HTML \u5B57\u7B26\u4E32\uFF09\u3002\n */\n/** ---------------------------------------------------------------- markdown \u9884\u89C8 */\n\n// \u6280\u80FD\u5185\u5BB9\u9884\u89C8\uFF1A\u6781\u7B80 markdown \u6E32\u67D3\uFF08frontmatter \u9690\u85CF\uFF0C\u6807\u9898/\u5217\u8868/\u4EE3\u7801\u5757/\u7C97\u4F53/\u884C\u5185\u4EE3\u7801/\u94FE\u63A5\uFF09\u3002\nexport function escapeHtml(s: string): string {\n return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n}\n\nexport function inlineMd(s: string): string {\n return escapeHtml(s)\n .replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>')\n .replace(/`([^`]+)`/g, '<code>$1</code>')\n .replace(/\\[([^\\]]+)\\]\\((https?:[^)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noreferrer\">$1</a>')\n}\n\nexport function renderSkillMarkdown(text: string): string {\n const body = String(text).replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/, '')\n const lines = body.split('\\n')\n let html = ''\n let inCode = false\n let codeBuf: string[] = []\n let inList = false\n let inQuote = false\n const closeList = (): void => {\n if (inList) { html += '</ul>'; inList = false }\n }\n const closeQuote = (): void => {\n if (inQuote) { html += '</blockquote>'; inQuote = false }\n }\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed.startsWith('```')) {\n if (inCode) {\n html += '<pre>' + escapeHtml(codeBuf.join('\\n')) + '</pre>'\n codeBuf = []\n inCode = false\n } else {\n closeList(); closeQuote()\n inCode = true\n }\n continue\n }\n if (inCode) { codeBuf.push(line); continue }\n if (trimmed === '---' || trimmed === '***') {\n closeList(); closeQuote()\n html += '<hr>'\n continue\n }\n if (trimmed.startsWith('>')) {\n if (!inQuote) { closeList(); html += '<blockquote>'; inQuote = true }\n html += '<p>' + inlineMd(trimmed.replace(/^>\\s?/, '')) + '</p>'\n continue\n }\n const heading = /^(#{1,4})\\s+(.*)$/.exec(trimmed)\n if (heading !== null) {\n closeList(); closeQuote()\n // \u76F4\u63A5\u7528\u771F\u5B9E\u5C42\u7EA7\uFF08# \u2192 h1 \u2026\u2026 ###### \u2192 h6\uFF09\uFF1A\u67E5\u770B\u5668\u5B57\u53F7\u4E00\u6863\u4E00\u6863\u62C9\u5F97\u5F00\uFF0C\n // \u65E7\u5199\u6CD5\u628A # \u538B\u6210 h3\uFF0C\u4E00\u7EA7\u6807\u9898\u53EA\u6709 15px\uFF0C\u6574\u7BC7\u6587\u6863\u770B\u8D77\u6765\u50CF\u6CA1\u653E\u5927\u3002\n const level = Math.min(heading[1].length, 6)\n html += `<h${String(level)}>` + inlineMd(heading[2]) + `</h${String(level)}>`\n continue\n }\n const item = /^[-*]\\s+(.*)$/.exec(trimmed)\n if (item !== null) {\n if (!inList) { closeQuote(); html += '<ul>'; inList = true }\n html += '<li>' + inlineMd(item[1]) + '</li>'\n continue\n }\n closeList(); closeQuote()\n if (trimmed === '') { html += '<p></p>'; continue }\n html += '<p>' + inlineMd(trimmed) + '</p>'\n }\n closeList(); closeQuote()\n if (inCode) html += '<pre>' + escapeHtml(codeBuf.join('\\n')) + '</pre>'\n return html\n}\n", "/**\n * skills/SkillsView \u2014 SKILL \u9875\u4E3B\u533A\uFF1A\u540C\u6B65\u63D0\u793A\u3001\u9884\u8BBE\u63D0\u793A\u884C\u4E0E\u6280\u80FD\u5217\u8868\uFF08\u6280\u80FD\u5305 + \u6563\u88C5\u6280\u80FD\uFF09\u3002\n *\n * \u7EAF\u5C55\u793A\uFF1A\u72B6\u6001\u4E0E\u64CD\u4F5C\u5168\u90E8\u7531 SkillsPanel \u6301\u6709\uFF0Cprops \u6CE8\u5165\u3002\u641C\u7D22\u3001\u8BA1\u6570\u3001\u5237\u65B0\u4E0E\u6DFB\u52A0\n * \u5DF2\u4E0A\u79FB\u5230\u9876\u680F SkillTopBar\uFF0C\u8FD9\u91CC\u53EA\u8D1F\u8D23\u5217\u8868\u672C\u4F53\u3002\n */\nimport type { Dispatch, FormEvent, SetStateAction } from 'react'\nimport {\n Button, IconArchiveOutlineRegular, IconCheckOutlineRegular, IconChevronDownOutlineRegular, IconCloseOutlineRegular,\n IconEditOutlineRegular, IconEllipsisOutlineRegular, IconRefreshOutlineRegular, IconTrashOutlineRegular, Menu,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { modalStaggerClass } from '../modal-animation'\nimport { CloudUpIcon, FolderBlueIcon, TagIcon } from './icons.js'\nimport { SkillCard } from './SkillCard.js'\nimport { css } from './styles.js'\nimport { ALL_PRESETS } from './types.js'\nimport type { BundleInfo, ConfirmState, HealthView, PanelState, PresetRow, SkillInfo } from './types.js'\n\nexport function SkillsView({\n t, state, health, activePreset, presets, presetOverride, resetActivePreset, openMenu, setOpenMenu,\n refresh, noResults, visibleBundleAll, expanded, renameTarget, setRenameTarget, renaming, submitRename,\n bundleEnabledIn, toggling, viewMode, setCatFilter, activeCat, toggleExpanded, renamedFlash, openInstallFor,\n skillEnabledIn, skillLockedReason, scopeLabel, toggleSkill, toggleBundle, openViewer, removeFromBundle,\n pruneBundle, openCatEditor, setConfirm, setAssignTarget, looseOpen, setLooseExpanded, visibleLooseAll,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n state: PanelState\n health: HealthView\n activePreset: string\n presets: PresetRow[]\n presetOverride: Record<string, boolean>\n resetActivePreset: () => void\n openMenu: string | null\n setOpenMenu: Dispatch<SetStateAction<string | null>>\n refresh: () => void\n noResults: boolean\n visibleBundleAll: BundleInfo[]\n expanded: Set<string>\n renameTarget: { bundleId: string; name: string } | null\n setRenameTarget: Dispatch<SetStateAction<{ bundleId: string; name: string } | null>>\n renaming: boolean\n submitRename: (event: FormEvent<HTMLFormElement>) => Promise<void>\n bundleEnabledIn: (bundle: BundleInfo) => boolean\n toggling: Set<string>\n viewMode: 'grid' | 'list'\n setCatFilter: Dispatch<SetStateAction<string | null>>\n activeCat: string | null\n toggleExpanded: (bundleId: string) => void\n renamedFlash: string | null\n openInstallFor: (bundleId: string) => void\n skillEnabledIn: (name: string) => boolean\n skillLockedReason: (name: string) => string | undefined\n scopeLabel: string\n toggleSkill: (skill: SkillInfo, enabled: boolean) => void\n toggleBundle: (bundle: BundleInfo, enabled: boolean) => void\n openViewer: (skill: SkillInfo) => void\n removeFromBundle: (bundleId: string, name: string) => Promise<void>\n pruneBundle: (bundle: BundleInfo) => Promise<void>\n openCatEditor: (bundle: BundleInfo) => void\n setConfirm: Dispatch<SetStateAction<ConfirmState | null>>\n setAssignTarget: Dispatch<SetStateAction<SkillInfo | null>>\n looseOpen: boolean\n setLooseExpanded: Dispatch<SetStateAction<boolean>>\n visibleLooseAll: SkillInfo[]\n}): JSX.Element {\n return (\n <>\n {/* \u540C\u6B65\u95EE\u9898\u660E\u7EC6\uFF1A\u53EA\u8BFB\u5065\u5EB7\u626B\u63CF\u53D1\u73B0 error \u7EA7\u95EE\u9898\u65F6\u5C55\u793A\uFF08\u9876\u680F\u5065\u5EB7\u6307\u793A\u60AC\u505C\u770B\u5168\u91CF\uFF09 */}\n {health.state === 'issue' && (\n <div className={css.healthNotice} role=\"status\">\n <span className={css.healthNoticeTitle}>{t('statIssues', { n: health.report.issues.length })}</span>\n <ul>\n {health.report.issues.slice(0, 4).map((issue, index) => (\n <li key={`${issue.code}-${String(index)}`}>{issue.message}</li>\n ))}\n </ul>\n </div>\n )}\n\n {/* \u9884\u8BBE\u63D0\u793A\u884C\uFF1A\u5F53\u524D\u7F16\u8F91\u5C42\u8BF4\u660E + \u6E05\u7A7A\u8BE5\u9884\u8BBE\u7684\u5355\u72EC\u8BBE\u7F6E */}\n <div className={css.hintRow}>\n <span className={css.hintRowText}>\n {activePreset === ALL_PRESETS\n ? t('presetHintAll')\n : t('presetHintScoped', { name: presets.find((preset) => preset.id === activePreset)?.name ?? activePreset })}\n </span>\n {activePreset !== ALL_PRESETS && Object.keys(presetOverride).length > 0 && (\n <button type=\"button\" className={css.presetReset} onClick={resetActivePreset}>\n {t('presetReset')}\n </button>\n )}\n </div>\n\n {/* \u5206\u7C7B tabs \u5DF2\u79FB\u9664\uFF1A\u4E0E\u5DE6\u680F\u300CAgent \u9884\u8BBE\u5206\u7C7B\u300D\u91CD\u590D\uFF08\u5DE6\u680F\u63A7\u5236\u9884\u8BBE\u5207\u6362\uFF09 */}\n\n {/* \u5185\u5BB9\u533A\uFF1A\u6280\u80FD\u5305 sections + \u6563\u88C5\u6280\u80FD */}\n <div className={`${css.mainScroll} ${modalStaggerClass}`}>\n {state.status === 'loading' ? <p className={css.status}>{t('loading')}</p> : null}\n {state.status === 'error' ? (\n <div className={css.failure}>\n <p role=\"alert\">{t('error')}</p>\n <Button variant=\"outline\" onClick={refresh}><IconRefreshOutlineRegular size={14} /> {t('retry')}</Button>\n </div>\n ) : null}\n\n {state.status === 'ready' && (\n noResults ? (\n <p className={css.noResult}>{t('noMatch')}</p>\n ) : (\n <>\n {visibleBundleAll.map((bundle) => {\n const open2 = expanded.has(bundle.id)\n const renamingThis = renameTarget?.bundleId === bundle.id\n const bundleEnabled = bundleEnabledIn(bundle)\n const bundleToggling = toggling.has(`bundle:${bundle.id}`)\n const gridClass = viewMode === 'list' ? `${css.skillGrid} ${css.skillGridList}` : css.skillGrid\n const missing = bundle.missingSkills ?? []\n const bundleCats = bundle.categories ?? []\n const emptyBundle = bundle.skillCount === 0\n // \u7A7A\u5305\u9ED8\u8BA4\u5C55\u5F00\u663E\u793A\u5F15\u5BFC\uFF1A\u6298\u53E0\u7740\u53EA\u5269\u4E00\u884C\u6807\u9898\uFF0C\u7528\u6237\u4F1A\u4EE5\u4E3A\u5305\u4E22\u4E86\u3002\n const openView = open2 || emptyBundle\n return (\n <section key={bundle.id} className={css.hubSection} data-open={openView ? 'true' : undefined} data-empty={emptyBundle ? 'true' : undefined}>\n <header\n className={css.bundleRowOuter}\n data-open={openView ? 'true' : undefined}\n >\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={openView}\n onClick={(event) => {\n // \u6807\u9898\u884C\u91CC\u5D4C\u7740\u5206\u7C7B\u6807\u7B7E\uFF1A\u70B9\u5230\u6807\u7B7E\u5C31\u662F\u7B5B\u9009\uFF0C\u4E0D\u8BE5\u987A\u624B\u628A\u5305\u5C55\u5F00/\u6536\u8D77\u3002\n // \u6807\u7B7E\u672C\u8EAB\u662F span\uFF08\u6309\u94AE\u91CC\u4E0D\u80FD\u518D\u5957\u6309\u94AE\uFF09\uFF0C\u952E\u76D8\u8DEF\u5F84\u8D70\u9876\u680F\u5206\u7C7B\u80F6\u56CA\u3002\n const hit = (event.target as HTMLElement).closest('[data-skm-cat]') as HTMLElement | null\n if (hit !== null) {\n const cat = hit.dataset.skmCat ?? ''\n setCatFilter(activeCat === cat ? null : cat)\n return\n }\n toggleExpanded(bundle.id)\n }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><FolderBlueIcon size={17} /></span>\n <span className={css.bundleName} title={bundle.name}>{bundle.name}</span>\n <span className={css.bundleCount}>{t('skillsCount', { n: bundle.skillCount })}</span>\n {bundleCats.length > 0 && (\n <span className={css.bundleCats}>\n {bundleCats.map((cat) => (\n <span\n key={cat}\n className={css.bundleCatTag}\n data-skm-cat={cat}\n data-active={activeCat === cat || undefined}\n title={t('bundleCatTip', { name: cat })}\n >\n {cat}\n </span>\n ))}\n </span>\n )}\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n {/* \u6280\u80FD\u5305\u4E00\u952E\u5F00\u5173\uFF1A\u6574\u5305\u542F\u7528/\u7981\u7528 */}\n <span className={css.bundleToggle}>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={bundleEnabled}\n aria-label={bundleEnabled ? t('disableBundle') : t('enableBundle')}\n title={bundleEnabled ? t('disableBundle') : t('enableBundle')}\n className={`${css.toggle} ${bundleEnabled ? css.toggleOn : css.toggleOff}`}\n disabled={bundleToggling || bundle.skillCount === 0}\n onClick={(event) => {\n event.stopPropagation()\n toggleBundle(bundle, !bundleEnabled)\n }}\n >\n <span className={css.toggleKnob} aria-hidden=\"true\" />\n </button>\n </span>\n <div className={css.bundleMore}>\n <Menu\n open={openMenu === `bundle:${bundle.id}`}\n onClose={() => { setOpenMenu(null) }}\n onSelect={(id) => {\n setOpenMenu(null)\n if (id === 'enable') toggleBundle(bundle, true)\n else if (id === 'disable') toggleBundle(bundle, false)\n else if (id === 'rename') setRenameTarget({ bundleId: bundle.id, name: bundle.name })\n else if (id === 'cat') openCatEditor(bundle)\n else if (id === 'delete') setConfirm({ kind: 'bundle', bundle })\n }}\n portal\n items={[\n { id: 'enable', label: t('enableBundle'), icon: <IconCheckOutlineRegular size={14} /> },\n { id: 'disable', label: t('disableBundle'), icon: <IconCloseOutlineRegular size={14} /> },\n { type: 'separator', id: 'gap' },\n { id: 'rename', label: t('rename'), icon: <IconEditOutlineRegular size={14} /> },\n { id: 'cat', label: t('bundleCatEdit'), icon: <TagIcon /> },\n { id: 'delete', label: t('delete'), icon: <IconTrashOutlineRegular size={14} />, danger: true },\n ]}\n anchor={(\n <button\n type=\"button\"\n className={css.bundleMoreBtn}\n aria-label={t('moreActions')}\n aria-haspopup=\"menu\"\n aria-expanded={openMenu === `bundle:${bundle.id}` || undefined}\n onClick={(event) => {\n event.stopPropagation()\n setOpenMenu(openMenu === `bundle:${bundle.id}` ? null : `bundle:${bundle.id}`)\n }}\n >\n <IconEllipsisOutlineRegular size={15} aria-hidden=\"true\" />\n </button>\n )}\n />\n </div>\n </header>\n {renamingThis && renameTarget !== null && (\n <form className={`${css.inlineForm} ${css.inlineFormBlock}`} onSubmit={(event) => { void submitRename(event) }}>\n <input className={css.inlineInput} value={renameTarget.name} placeholder={t('renameBundlePlaceholder')}\n aria-label={t('renameBundlePlaceholder')} autoFocus disabled={renaming}\n onChange={(event) => {\n // \u5148\u628A\u503C\u53D6\u51FA\u518D\u8FDB setState \u56DE\u8C03\uFF1AReact \u5408\u6210\u4E8B\u4EF6\u5728\n // \u56DE\u8C03\u6267\u884C\u5B8C\u6BD5\u540E\u4F1A\u628A currentTarget \u7F6E\u7A7A\uFF0C\u82E5\u5728\u51FD\u6570\u5F0F\n // updater \u91CC\u624D\u8BFB event.currentTarget.value\uFF0C\u6E32\u67D3\u9636\u6BB5\n // \u4F1A\u629B Cannot read properties of null\uFF0C\u6574\u4E2A\u6280\u80FD\u9762\u677F\n // \u88AB ErrorBoundary \u6458\u6389\u2014\u2014\u8868\u73B0\u5C31\u662F\u300C\u6539\u540D\u65F6\u5361\u7247\u6D88\u5931\u300D\u3002\n const next = event.currentTarget.value\n setRenameTarget((current) => current === null ? current : { ...current, name: next })\n }} />\n <Button variant=\"primary\" type=\"submit\" disabled={renaming || renameTarget.name.trim() === ''}>{t('rename')}</Button>\n <Button variant=\"outline\" type=\"button\" disabled={renaming} onClick={() => { setRenameTarget(null) }}>{t('cancel')}</Button>\n </form>\n )}\n {missing.length > 0 && (\n <div className={css.bundleMissing} role=\"status\">\n <span>{t('bundleMissingN', { n: missing.length })}</span>\n <code>{missing.join('\u3001')}</code>\n <button type=\"button\" className={css.bundleMissingBtn} onClick={() => { void pruneBundle(bundle) }}>\n {t('bundlePrune')}\n </button>\n </div>\n )}\n {openView && (\n <ul className={gridClass} data-renamed={renamedFlash === bundle.id ? 'true' : undefined}>\n {bundle.skills.length === 0 ? (\n <li className={css.bundleEmpty}>\n <span className={css.bundleEmptyTitle}>{t('bundleEmptyTitle')}</span>\n <span className={css.bundleEmptyHint}>{t('bundleEmptyHint')}</span>\n <button type=\"button\" className={css.bundleEmptyBtn} onClick={() => { openInstallFor(bundle.id) }}>\n <CloudUpIcon size={14} />\n {t('bundleUploadHere')}\n </button>\n </li>\n ) : bundle.skills.map((skill, index) => (\n <SkillCard key={skill.name} skill={skill} bundleId={bundle.id} bundleName={bundle.name}\n enabled={skillEnabledIn(skill.name)}\n lockedReason={skillLockedReason(skill.name)}\n scopeLabel={scopeLabel}\n index={index}\n onToggle={toggleSkill}\n onView={openViewer}\n onRemove={(s) => { void removeFromBundle(bundle.id, s.name) }}\n onDelete={(s) => { setConfirm({ kind: 'skill', name: s.name, dir: s.dir }) }} />\n ))}\n </ul>\n )}\n </section>\n )\n })}\n\n {visibleLooseAll.length > 0 && (\n <section className={css.hubSection} data-open={looseOpen ? 'true' : undefined}>\n <header\n className={css.bundleRowOuter}\n data-open={looseOpen ? 'true' : undefined}\n >\n <button\n type=\"button\"\n className={css.bundleRow}\n aria-expanded={looseOpen}\n onClick={() => { setLooseExpanded((value) => !value) }}\n >\n <span className={css.bundleIcon} aria-hidden=\"true\"><IconArchiveOutlineRegular size={16} /></span>\n <span className={css.bundleName}>{t('looseTitle')}</span>\n <span className={css.bundleCount}>{t('skillsCount', { n: visibleLooseAll.length })}</span>\n <IconChevronDownOutlineRegular className={css.chevron} size={13} aria-hidden=\"true\" />\n </button>\n </header>\n {looseOpen && (\n <ul className={viewMode === 'list' ? `${css.skillGrid} ${css.skillGridList}` : css.skillGrid}>\n {visibleLooseAll.map((skill, index) => (\n <SkillCard key={skill.name} skill={skill} bundleId={null} bundleName={null}\n enabled={skillEnabledIn(skill.name)}\n lockedReason={skillLockedReason(skill.name)}\n scopeLabel={scopeLabel}\n index={index}\n onToggle={toggleSkill}\n onView={openViewer}\n onAssign={(s) => { setAssignTarget(s) }}\n onDelete={(s) => { setConfirm({ kind: 'skill', name: s.name, dir: s.dir }) }} />\n ))}\n </ul>\n )}\n </section>\n )}\n\n {/* \u65B0\u5EFA\u6280\u80FD\u5305\u5165\u53E3\u5DF2\u79FB\u81F3\u5DE6\u680F\uFF08newBundleBtn\uFF09 */}\n </>\n )\n )}\n </div>\n </>\n )\n}\n", "/**\n * skills/TopBar \u2014 \u9762\u677F\u9876\u680F\u3002\n *\n * \u300C\u80FD\u529B\u7BA1\u7406\u300D\u6807\u9898 + SKILL/MCP \u9876\u5C42 tab\uFF08PanelHead\uFF09\uFF0C\u4EE5\u53CA\u4E24\u4E2A\u9875\u7B7E\u5404\u81EA\u7684\n * Agent \u9884\u8BBE chips \u4E0E\u542F\u7528\u72B6\u6001\u5206\u6BB5\uFF08SkillTopBar / McpTopBar\uFF09\u3002\n */\nimport type { Dispatch, DragEvent, RefObject, SetStateAction } from 'react'\nimport {\n IconAgentPresetOutlineRegular, IconChevronDownOutlineRegular, IconPlusOutlineRegular, IconRefreshOutlineRegular,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CatAllIcon, CloudUpIcon, SearchIcon, SortDirIcon } from './icons.js'\nimport type { LiveMcpStatus } from './mcp-live.js'\nimport { css } from './styles.js'\nimport { ALL_PRESETS, UNCATEGORIZED, type HealthViewModel, type PresetRow } from './types.js'\n\n/** \u9762\u677F\u5934\u90E8\uFF1A\u6807\u9898\uFF08\u80FD\u529B\u7BA1\u7406\uFF09+ \u7D27\u8D34\u6587\u5B57\u53F3\u4FA7\u7684 SKILL / MCP / \u63D0\u793A\u8BCD \u9876\u5C42 tab\u3002 */\nexport function PanelHead({ t, kind, onKind }: {\n t: (key: string, params?: Record<string, string | number>) => string\n kind: 'skill' | 'mcp' | 'prompt'\n onKind: (value: 'skill' | 'mcp' | 'prompt') => void\n}): JSX.Element {\n return (\n <div className=\"psh-head\">\n <span className=\"psh-title\" style={{ flex: 'none' }}>{t('panelTitle')}</span>\n <div className={css.kindTabs} role=\"tablist\" aria-label=\"SKILL / MCP / \u63D0\u793A\u8BCD\">\n {([\n ['skill', t('kindSkill')],\n ['mcp', t('kindMcp')],\n ['prompt', t('kindPrompt')],\n ] as const).map(([value, label]) => (\n <button\n key={value}\n type=\"button\"\n role=\"tab\"\n aria-selected={kind === value}\n className={`${css.kindTab} ${kind === value ? css.kindTabActive : ''}`}\n data-active={kind === value || undefined}\n onClick={() => { onKind(value) }}\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n )\n}\n\n/**\n * SKILL \u9876\u680F\uFF1AAgent \u9884\u8BBE chips\uFF08\u6570\u5B57 = \u8BE5\u5C42\u542F\u7528\u6280\u80FD\u6570\uFF09+ \u6280\u80FD\u5305\u5206\u7C7B\u80F6\u56CA\uFF0C\n * \u4E0B\u4E00\u884C\u662F\u64CD\u4F5C\u884C\u2014\u2014\u641C\u7D22 / \u540D\u79F0\u6392\u5E8F / \u4E09\u6863\u8BA1\u6570\u5206\u6BB5 / \u6280\u80FD\u5065\u5EB7 / \u5237\u65B0 \u00B7 \u65B0\u5EFA \u00B7 \u6DFB\u52A0\u3002\n * \u6574\u5757\u540C\u65F6\u662F\u6280\u80FD\u6587\u4EF6\u5939\u62D6\u653E\u533A\u3002\n */\nexport function SkillTopBar({\n t, dropActive, setDropActive, onDrop, activePreset, setActivePreset, presets, overrides,\n enabledCountFor, totalSkills, enabledCount, disabledCount, healthView, hasCategories, activeCat, setCatFilter,\n categoryList, categoryCounts, bundleCount, statusFilter, setStatusFilter, query, setQuery, openMenu,\n setOpenMenu, sortAsc, setSortAsc, newBundleOpen, onNewBundle, onAdd, onRefresh, fileInput, acceptFiles,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n dropActive: boolean\n setDropActive: Dispatch<SetStateAction<boolean>>\n onDrop: (event: DragEvent<HTMLDivElement>) => Promise<void>\n activePreset: string\n setActivePreset: Dispatch<SetStateAction<string>>\n presets: PresetRow[]\n overrides: Record<string, Record<string, boolean>>\n enabledCountFor: (presetId: string) => number\n totalSkills: number\n enabledCount: number\n disabledCount: number\n /** \u5065\u5EB7\u626B\u63CF\u5C55\u793A\u6A21\u578B\uFF08tone \u51B3\u5B9A\u5706\u70B9\u989C\u8272\uFF09\u3002 */\n healthView: HealthViewModel\n hasCategories: boolean\n activeCat: string | null\n setCatFilter: Dispatch<SetStateAction<string | null>>\n categoryList: string[]\n categoryCounts: Map<string, number>\n bundleCount: number\n statusFilter: 'all' | 'on' | 'off'\n setStatusFilter: Dispatch<SetStateAction<'all' | 'on' | 'off'>>\n query: string\n setQuery: Dispatch<SetStateAction<string>>\n openMenu: string | null\n setOpenMenu: Dispatch<SetStateAction<string | null>>\n sortAsc: boolean\n setSortAsc: Dispatch<SetStateAction<boolean>>\n newBundleOpen: boolean\n onNewBundle: () => void\n onAdd: () => void\n onRefresh: () => void\n /** \u9690\u85CF\u7684\u76EE\u5F55\u9009\u62E9\u6846\uFF1A\u6DFB\u52A0\u6280\u80FD\u5F39\u7A97\u4E0E\u9876\u680F\u62D6\u653E\u5171\u7528\u3002 */\n fileInput: RefObject<HTMLInputElement | null>\n acceptFiles: (files: File[] | null) => void\n}): JSX.Element {\n return (\n <div\n className={css.topbar}\n data-drop={dropActive || undefined}\n onDragOver={(event) => { event.preventDefault(); setDropActive(true) }}\n onDragLeave={() => { setDropActive(false) }}\n onDrop={(event) => { void onDrop(event) }}\n >\n <div className={css.chipRow} role=\"group\" aria-label={t('presetCatTitle')}>\n <button\n type=\"button\"\n className={`${css.catItem} ${activePreset === ALL_PRESETS ? css.catItemActive : ''}`}\n data-active={activePreset === ALL_PRESETS || undefined}\n onClick={() => { setActivePreset(ALL_PRESETS) }}\n >\n <span className={css.catIcon} data-active={activePreset === ALL_PRESETS || undefined}><CatAllIcon size={16} /></span>\n <span className={css.catLabel}>{t('presetAll')}</span>\n <span className={css.catCount} title={t('presetCountTip', { n: enabledCountFor(ALL_PRESETS), total: totalSkills })}>{enabledCountFor(ALL_PRESETS)}</span>\n </button>\n {presets.map((preset) => {\n const overrideCount = Object.values(overrides[preset.id] ?? {}).filter((state2) => state2 === false).length\n return (\n <button\n key={preset.id}\n type=\"button\"\n className={`${css.catItem} ${activePreset === preset.id ? css.catItemActive : ''}`}\n data-active={activePreset === preset.id || undefined}\n onClick={() => { setActivePreset(preset.id) }}\n >\n <span className={css.catIcon} data-active={activePreset === preset.id || undefined}><IconAgentPresetOutlineRegular size={15} /></span>\n <span className={css.catLabel}>{preset.name ?? preset.id}</span>\n <span className={css.catCount} data-warn={overrideCount > 0 || undefined}\n title={t('presetCountTip', { n: enabledCountFor(preset.id), total: totalSkills })\n + (overrideCount > 0 ? ` \u00B7 ${t('presetOverrideCount', { n: overrideCount })}` : '')}>\n {enabledCountFor(preset.id)}\n </span>\n </button>\n )\n })}\n </div>\n\n {/* \u6280\u80FD\u5305\u5206\u7C7B\uFF1A\u80F6\u56CA\u5373\u7B5B\u9009\uFF08\u518D\u70B9\u4E00\u6B21\u53D6\u6D88\uFF09\u3002\u6CA1\u6709\u4E00\u4E2A\u771F\u5206\u7C7B\u65F6\u4E0D\u5360\u8FD9\u4E00\u884C\u3002 */}\n {hasCategories && (\n <div className={css.catChipRow} role=\"group\" aria-label={t('bundleCatFilterAria')}>\n <span className={css.catChipLabel}>{t('bundleCatTitle')}</span>\n <button\n type=\"button\"\n className={css.catChip}\n data-active={activeCat === null || undefined}\n aria-pressed={activeCat === null}\n onClick={() => { setCatFilter(null) }}\n >\n {t('bundleCatAll')}\n <span className={css.catChipCount}>{bundleCount}</span>\n </button>\n {categoryList.map((cat) => {\n const none = cat === UNCATEGORIZED\n const active = activeCat === cat\n return (\n <button\n type=\"button\"\n key={cat}\n className={css.catChip}\n data-active={active || undefined}\n aria-pressed={active}\n onClick={() => { setCatFilter(active ? null : cat) }}\n >\n {none ? t('bundleCatNone') : cat}\n <span className={css.catChipCount}>{categoryCounts.get(cat) ?? 0}</span>\n </button>\n )\n })}\n </div>\n )}\n\n {/* \u64CD\u4F5C\u884C\uFF1A\u641C\u7D22 / \u540D\u79F0\u6392\u5E8F / \u4E09\u6863\u8BA1\u6570\u5206\u6BB5 / \u6280\u80FD\u5065\u5EB7 / \u5237\u65B0 \u00B7 \u65B0\u5EFA \u00B7 \u6DFB\u52A0 */}\n <div className={css.topbarActions}>\n <div className={css.searchBox}>\n <SearchIcon />\n <input\n className={css.searchInput}\n value={query}\n placeholder={t('searchPlaceholder')}\n aria-label={t('searchPlaceholder')}\n onChange={(event) => { setQuery(event.currentTarget.value) }}\n />\n </div>\n <div className={css.dropWrap}>\n <button\n type=\"button\"\n className={css.toolButton}\n style={{ height: 36 }}\n aria-haspopup=\"menu\"\n aria-expanded={openMenu === 'sort' || undefined}\n onClick={() => { setOpenMenu((value) => value === 'sort' ? null : 'sort') }}\n >\n {t('sortLabel')}\n <SortDirIcon dir={sortAsc ? 'asc' : 'desc'} size={12} />\n <IconChevronDownOutlineRegular size={11} aria-hidden=\"true\" />\n </button>\n {openMenu === 'sort' && (\n <>\n <button type=\"button\" className={css.bulkOverlay} aria-label={t('close')} onClick={() => { setOpenMenu(null) }} />\n <div className={css.dropMenu} role=\"menu\">\n <button type=\"button\" role=\"menuitemradio\" className={css.dropItem} aria-checked={sortAsc}\n onClick={() => { setSortAsc(true); setOpenMenu(null) }}>\n <span className={css.dropCheck} data-on={sortAsc || undefined} aria-hidden=\"true\">{sortAsc ? '\u2713' : ''}</span>\n {t('nameAsc')}\n </button>\n <button type=\"button\" role=\"menuitemradio\" className={css.dropItem} aria-checked={!sortAsc}\n onClick={() => { setSortAsc(false); setOpenMenu(null) }}>\n <span className={css.dropCheck} data-on={!sortAsc || undefined} aria-hidden=\"true\">{!sortAsc ? '\u2713' : ''}</span>\n {t('nameDesc')}\n </button>\n </div>\n </>\n )}\n </div>\n <div className={css.statusSeg} role=\"group\" aria-label={t('statusAll')}>\n {([\n ['all', t('statusAll'), enabledCount + disabledCount],\n ['on', t('statusOn'), enabledCount],\n ['off', t('statusOff'), disabledCount],\n ] as const).map(([value, label, count]) => (\n <button\n key={value}\n type=\"button\"\n className={`${css.statusSegBtn} ${statusFilter === value ? css.statusSegActive : ''}`}\n data-active={statusFilter === value || undefined}\n aria-pressed={statusFilter === value}\n onClick={() => { setStatusFilter(value) }}\n >\n {label}\n <span className={css.statusSegCount}>{count}</span>\n </button>\n ))}\n </div>\n <span className={css.healthInline} data-tone={healthView.tone} title={healthView.title === '' ? undefined : healthView.title}>\n {t('statSync')} \u00B7 {healthView.label}\n </span>\n <span className={css.toolbarSpacer} />\n <button\n type=\"button\"\n className={css.toolButton}\n style={{ height: 34, alignSelf: 'center' }}\n onClick={onRefresh}\n >\n <IconRefreshOutlineRegular size={14} aria-hidden=\"true\" />\n {t('refresh')}\n </button>\n <button\n type=\"button\"\n className={`${css.newBundleBtn} ${newBundleOpen ? css.newBundleBtnOpen : ''}`}\n style={{ width: 'auto', marginTop: 0, height: 34, fontSize: 12 }}\n aria-expanded={newBundleOpen || undefined}\n onClick={onNewBundle}\n >\n <IconPlusOutlineRegular size={14} aria-hidden=\"true\" />\n {t('newBundle')}\n </button>\n <button\n type=\"button\"\n className={css.addBtn}\n style={{ height: 34, alignSelf: 'center' }}\n aria-label={t('addSkillsTitle')}\n title={t('addSkillsSub')}\n onClick={onAdd}\n >\n <CloudUpIcon size={15} aria-hidden=\"true\" />\n {t('addSkillsTitle')}\n </button>\n <input\n ref={fileInput}\n type=\"file\"\n className={css.hiddenInput}\n multiple\n {...{ webkitdirectory: '' }}\n onChange={(event) => {\n acceptFiles(event.currentTarget.files === null ? null : Array.from(event.currentTarget.files))\n }}\n />\n </div>\n\n </div>\n )\n}\n/**\n * MCP \u9876\u680F\uFF1A\u4E0E\u6280\u80FD\u9875\u540C\u6784\u7684\u9884\u8BBE chips\uFF08\u5168\u90E8 + \u5404\u9884\u8BBE\uFF0C\u6570\u5B57 = \u8BE5\u5C42\u53EF\u89C1 Server \u6570\uFF09\n * + \u542F\u7528\u72B6\u6001\u5206\u6BB5\u3002\u6446\u5728\u4E3B\u533A\u4E4B\u4E0A\uFF0C\u4E0E\u6280\u80FD\u9875\u540C\u4E00\u4F4D\u7F6E\u3001\u540C\u4E00\u5957\u7C7B\u540D\u3002\n */\nexport function McpTopBar({\n t, live, scope, onScope, status, onStatus, query, onQuery, onRefresh, onAddOwn, onAddCustom,\n}: {\n t: (key: string, params?: Record<string, string | number>) => string\n live: LiveMcpStatus\n scope: string\n onScope: (value: string) => void\n status: 'all' | 'on' | 'off'\n onStatus: (value: 'all' | 'on' | 'off') => void\n query: string\n onQuery: (value: string) => void\n onRefresh: () => void\n /** \u6253\u5F00\u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\uFF08\u53EA\u5728\u9884\u8BBE\u8303\u56F4\u663E\u793A\u8FD9\u4E2A\u6309\u94AE\uFF09\u3002 */\n onAddOwn: () => void\n onAddCustom: () => void\n}): JSX.Element {\n const data = live.state === 'ready' ? live.data : null\n const presets = data?.presets ?? []\n const globals = data?.servers ?? []\n const offCount = globals.filter(server => server.config.disabled).length\n const maskedOf = (presetId: string): Set<string> => new Set(\n Object.entries(data?.masks?.[presetId] ?? {}).filter(([, on]) => on === false).map(([name]) => name),\n )\n /** \u8BE5\u9884\u8BBE\u53EF\u89C1\u7684 Server \u6570 = \u672A\u88AB\u5B83\u906E\u853D\u7684\u5168\u5C40 + \u5B83\u81EA\u5E26\u7684\u884C\u3002 */\n const visibleCount = (presetId: string): number => {\n const masked = maskedOf(presetId)\n return globals.filter(server => !masked.has(server.serverName)).length + (data?.presetServers?.[presetId] ?? []).length\n }\n const chips: Array<{ id: string; label: string; count: number; overrides: number; icon: JSX.Element }> = [\n { id: '', label: t('presetAll'), count: globals.length, overrides: 0, icon: <CatAllIcon size={16} /> },\n ...presets.map(preset => ({\n id: preset.id,\n label: preset.name ?? preset.id,\n count: visibleCount(preset.id),\n overrides: maskedOf(preset.id).size,\n icon: <IconAgentPresetOutlineRegular size={15} />,\n })),\n ]\n /** \u8FDE\u63A5\u72B6\u6001\uFF08\u66FF\u4EE3\u539F\u300C\u8FDE\u63A5\u72B6\u6001\u300D\u7EDF\u8BA1\u5361\uFF09\uFF1A\u6307\u793A\u5B9E\u65F6\u72B6\u6001\u63A5\u53E3\u80FD\u5426\u8BFB\u5230\u6CE8\u518C\u8868\u3002 */\n const conn = live.state === 'ready'\n ? { tone: 'ok', label: t('mcpConnOk'), title: t('mcpConnTip', { n: globals.length }) }\n : live.state === 'loading'\n ? { tone: 'pending', label: t('statChecking'), title: '' }\n : { tone: 'warn', label: t('mcpConnDown'), title: t('mcpLiveUnavailable') }\n return (\n <div className={css.topbar}>\n {presets.length > 0 && (\n <div className={css.chipRow} role=\"group\" aria-label={t('mcpScopeTitle')}>\n {chips.map(chip => (\n <button\n key={chip.id === '' ? '__all__' : chip.id}\n type=\"button\"\n className={`${css.catItem} ${scope === chip.id ? css.catItemActive : ''}`}\n data-active={scope === chip.id || undefined}\n onClick={() => { onScope(chip.id) }}\n >\n <span className={css.catIcon} data-active={scope === chip.id || undefined}>{chip.icon}</span>\n <span className={css.catLabel}>{chip.label}</span>\n <span\n className={css.catCount}\n data-warn={chip.overrides > 0 || undefined}\n title={chip.id === ''\n ? t('mcpScopeAllTip', { n: chip.count })\n : t('mcpScopePresetTip', { n: chip.count })\n + (chip.overrides > 0 ? ` \u00B7 ${t('mcpScopeOverrideCount', { n: chip.overrides })}` : '')}\n >\n {chip.count}\n </span>\n </button>\n ))}\n </div>\n )}\n\n {/* \u64CD\u4F5C\u884C\uFF1A\u641C\u7D22 / \u4E09\u6863\u8BA1\u6570\u5206\u6BB5 / \u8FDE\u63A5\u72B6\u6001 / \u5237\u65B0 \u00B7 \u6DFB\u52A0\uFF08\u4E0E\u6280\u80FD\u9875\u540C\u6784\uFF09 */}\n <div className={css.topbarActions}>\n <div className={css.searchBox}>\n <SearchIcon />\n <input\n className={css.searchInput}\n value={query}\n placeholder={t('mcpSearchServers')}\n aria-label={t('mcpSearchServers')}\n onChange={(event) => { onQuery(event.currentTarget.value) }}\n />\n </div>\n <div className={css.statusSeg} role=\"group\" aria-label={t('statusAll')}>\n {([\n ['all', t('statusAll'), globals.length],\n ['on', t('statusOn'), globals.length - offCount],\n ['off', t('statusOff'), offCount],\n ] as const).map(([value, label, count]) => (\n <button\n key={value}\n type=\"button\"\n className={`${css.statusSegBtn} ${status === value ? css.statusSegActive : ''}`}\n data-active={status === value || undefined}\n aria-pressed={status === value}\n onClick={() => { onStatus(value) }}\n >\n {label}\n <span className={css.statusSegCount}>{count}</span>\n </button>\n ))}\n </div>\n <span className={css.healthInline} data-tone={conn.tone} title={conn.title === '' ? undefined : conn.title}>\n {t('mcpConnStatus')} \u00B7 {conn.label}\n </span>\n <span className={css.toolbarSpacer} />\n <button\n type=\"button\"\n className={css.toolButton}\n style={{ height: 34, alignSelf: 'center' }}\n onClick={onRefresh}\n >\n {t('mcpLiveRefresh')}\n </button>\n {scope !== '' && (\n <button\n type=\"button\"\n className={css.newBundleBtn}\n style={{ width: 'auto', marginTop: 0, height: 34, fontSize: 12 }}\n onClick={onAddOwn}\n >\n <IconPlusOutlineRegular size={14} aria-hidden=\"true\" />\n {t('mcpPresetAddOwn')}\n </button>\n )}\n <button\n type=\"button\"\n className={css.addBtn}\n style={{ height: 34, alignSelf: 'center' }}\n aria-label={t('mcpAddServer')}\n title={scope === '' ? undefined : t('mcpAddGlobalHint')}\n onClick={onAddCustom}\n >\n <IconPlusOutlineRegular size={15} aria-hidden=\"true\" />\n {/* \u9884\u8BBE\u8303\u56F4\u4E0B\u5199\u660E\u8FD9\u4E00\u6761\u662F\u5168\u5C40\u7684\uFF1A\u53EA\u60F3\u7ED9\u5F53\u524D\u9884\u8BBE\u7528\u8BF7\u8D70\u5DE6\u4FA7\u7684\u300C\u6DFB\u52A0\u4E13\u5C5E Server\u300D\u3002 */}\n {scope === '' ? t('mcpAddServer') : t('mcpAddServerGlobal')}\n </button>\n </div>\n </div>\n )\n}\n\n/** ---------------------------------------------------------------- \u9884\u8BBE\u5706\u7403\uFF08\u5386\u53F2\u4FDD\u7559\u7EC4\u4EF6\uFF0C\u5F53\u524D\u9762\u677F\u7528 chips\uFF09 */\n\n/** \u7403\u5185\u6587\u5B57\uFF1A\u4E2D\u6587\u53D6\u9996\u5B57\uFF0C\u62C9\u4E01\u53D6\u9996\u5B57\u6BCD\u3002 */\nexport function ballInitial(label: string): string {\n const trimmed = label.trim()\n if (trimmed === '') return '?'\n return [...trimmed][0] ?? '?'\n}\n\n/** \u4E00\u4E2A\u9884\u8BBE\u5706\u7403\uFF08\u65E0\u5E95\u8272\uFF0C\u4EC5\u63CF\u8FB9\u8F6E\u5ED3\uFF1B\u6709\u5355\u72EC\u8BBE\u7F6E\u65F6\u53F3\u4E0B\u89D2\u70B9\u4EAE\u5C0F\u5706\u70B9\uFF09\u3002 */\nexport function PresetBall({ id, label, active, dot, title, onSelect }: {\n id: string\n label: string\n active: boolean\n dot: boolean\n title: string\n onSelect: () => void\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n className={css.presetBallWrap}\n data-active={active ? 'true' : undefined}\n aria-pressed={active}\n title={title}\n onClick={onSelect}\n >\n <span className={css.presetBall} data-dot={dot ? 'true' : undefined}>\n {id === ALL_PRESETS ? <IconAgentPresetOutlineRegular size={18} aria-hidden=\"true\" /> : ballInitial(label)}\n </span>\n <span className={css.presetBallLabel}>{label}</span>\n </button>\n )\n}\n", "/**\n * error-boundary \u2014 \u628A\u300C\u9762\u677F\u6E32\u67D3\u5D29\u6E83\u300D\u5173\u8FDB\u7B3C\u5B50\u3002\n *\n * \u4E3A\u4EC0\u4E48\u5FC5\u987B\u8981\u6709\uFF1A\u4FA7\u8FB9\u680F\u5165\u53E3\u662F `createRoot` \u6302\u51FA\u6765\u7684\u72EC\u7ACB React \u6839\uFF0CReact 18\n * \u5BF9\u6E32\u67D3\u671F\u5F02\u5E38\u7684\u9ED8\u8BA4\u5904\u7406\u662F**\u5378\u8F7D\u6574\u4E2A\u6839**\u2014\u2014\u9762\u677F\u91CC\u4E00\u4E2A\u7EC4\u4EF6\u629B\u9519\uFF0C\u5BFC\u822A\u884C\u6309\u94AE\n * \u4F1A\u8DDF\u7740\u4E00\u8D77\u6D88\u5931\uFF0C\u800C\u4E14\u4E0D\u7559\u75D5\u8FF9\uFF08\u5BBF\u4E3B DOM \u8FD8\u5728\u3001\u53EA\u662F\u7A7A\u4E86\uFF0C\u770B\u8D77\u6765\u5C31\u50CF\u300C\u69FD\u4F4D\n * \u6CA1\u4E86\u300D\uFF09\u3002`ctx.effect` \u5916\u7684 `safe()` \u53EA\u80FD\u5305\u4F4F\u540C\u6B65\u7684 apply()\uFF0C\u62E6\u4E0D\u5230\u6E32\u67D3\u671F\n * \u5F02\u5E38\u3002\n *\n * \u56E0\u6B64\u6BCF\u4E2A\u5F39\u5C42\u9762\u677F\u90FD\u8981\u5355\u72EC\u5305\u4E00\u5C42\uFF1A\u5D29\u4E86\u53EA\u6536\u8D77\u90A3\u4E00\u4E2A\u9762\u677F\uFF0C\u5BFC\u822A\u6309\u94AE\u7167\u5E38\u7559\u7740\uFF0C\n * \u540C\u65F6\u628A\u771F\u5B9E\u9519\u8BEF\u548C\u7EC4\u4EF6\u6808\u6253\u5230\u63A7\u5236\u53F0\uFF0C\u4FBF\u4E8E\u5B9A\u4F4D\u3002\n */\n\nimport { Component, type ErrorInfo, type ReactNode } from 'react'\n\n/** \u8FB9\u754C\u5C5E\u6027\u3002 */\nexport interface ErrorBoundaryProps {\n /** \u51FA\u9519\u65F6\u6253\u5728\u65E5\u5FD7\u91CC\u7684\u540D\u5B57\u3002 */\n label: string\n /** \u5D29\u6E83\u540E\u7684\u66FF\u4EE3\u5185\u5BB9\uFF08\u5BFC\u822A\u884C\u573A\u666F\u4F20 null\uFF0C\u53EA\u6536\u9762\u677F\uFF09\u3002 */\n fallback?: ReactNode\n /** \u6355\u83B7\u5230\u9519\u8BEF\u65F6\u7684\u56DE\u8C03\uFF08\u7528\u4E8E\u987A\u624B\u628A\u9762\u677F\u5173\u6389\uFF09\u3002 */\n onError?: (error: Error) => void\n children: ReactNode\n}\n\ninterface ErrorBoundaryState {\n error: Error | null\n}\n\n/** \u53EA\u515C\u6E32\u67D3/\u751F\u547D\u5468\u671F\u5F02\u5E38\u7684\u9519\u8BEF\u8FB9\u754C\uFF08\u4E0D\u515C\u4E8B\u4EF6\u56DE\u8C03\u4E0E\u5F02\u6B65\uFF09\u3002 */\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n override state: ErrorBoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error }\n }\n\n override componentDidCatch(error: Error, info: ErrorInfo): void {\n // \u6253\u51FA\u7EC4\u4EF6\u6808\uFF1A\u6CA1\u6709\u5B83\uFF0C\u5D29\u6E83\u53EA\u4F1A\u8868\u73B0\u4E3A\u300C\u754C\u9762\u5C11\u4E86\u4E00\u5757\u300D\uFF0C\u65E0\u4ECE\u4E0B\u624B\u3002\n console.error(`[dsh-prompt-customizer] ${this.props.label} \u6E32\u67D3\u5D29\u6E83\uFF1A`, error, info.componentStack ?? '')\n try {\n this.props.onError?.(error)\n } catch (callbackError) {\n console.error('[dsh-prompt-customizer] \u9519\u8BEF\u8FB9\u754C\u56DE\u8C03\u5931\u8D25\uFF1A', callbackError)\n }\n }\n\n override render(): ReactNode {\n if (this.state.error !== null) return this.props.fallback ?? null\n return this.props.children\n }\n}\n", "/**\n * sidebar-nav \u2014 \u4FA7\u8FB9\u680F\u5BFC\u822A\u533A\u5171\u4EAB\u6302\u8F7D\u5668\u3002\n *\n * \u5728 sidebar \u7684\u6D4F\u89C8\u533A\u5BB9\u5668\uFF08`[data-slot=\"sidebar.workspaces\"]`\uFF09\u6B63\u4E0A\u65B9\u63D2\n * \u4E00\u4E2A host\uFF0Chost \u5185\u6309\u56FA\u5B9A\u987A\u5E8F\uFF08\u5F53\u524D\u53EA\u6709 skills\uFF09\u653E `data-nav-slot` \u69FD\u4F4D\u5BB9\u5668\uFF1B\n * \u5404\u5165\u53E3\uFF08\u80FD\u529B\u5165\u53E3 React \u7EC4\u4EF6\uFF0C\u4EE5\u53CA\u5C06\u6765\u53EF\u80FD\u65B0\u589E\u7684\u5165\u53E3\uFF09\u7ECF `useNavSlot` \u8F6E\u8BE2\n * \u62FF\u5230\u81EA\u5DF1\u7684\u69FD\u4F4D\u540E `createPortal` \u8FDB\u53BB\u2014\u2014\u987A\u5E8F\u786E\u5B9A\u3001\u4E92\u4E0D\u8986\u76D6\u3001\u8DDF React \u9996\u6B21\n * \u63D0\u4EA4\u4E0D\u7ADE\u6001\u3002\n *\n * rail \u6298\u53E0\u6001\u7531 `useRail` \u89C2\u5BDF `data-shell-overlay` \u6846\u67B6\u5BB9\u5668\u7684\n * `data-sidebar-collapsed` \u5C5E\u6027\u5207\u6362\uFF0Crail \u4E0B\u5BFC\u822A\u884C\u6536\u7F29\u4E3A\u56FE\u6807\u94AE\u3002\n */\n\nimport { useEffect, useState, type MouseEvent, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { PopoverAnchor } from './popover-shell.js'\n\n/** nav host id\uFF08\u672C\u6A21\u5757\u521B\u5EFA\uFF09\u3002 */\nconst HOST_ID = 'dsh-prompt-customizer-nav-host'\n/** slots \u6E32\u67D3\u5668\u7684\u7A33\u5B9A\u951A\u70B9\uFF08SidebarRoot \u66B4\u9732\u7684 `sidebar.workspaces` slot\uFF09\u3002 */\nconst ANCHOR_SELECTOR = '[data-slot=\"sidebar.workspaces\"]'\n/** \u4FA7\u8FB9\u680F\u6298\u53E0\u89C2\u5BDF\uFF1A\u6846\u67B6\u5BB9\u5668\u9009\u62E9\u5728\u6240\u6709 sidebar \u72B6\u6001\uFF08wide/rail\uFF09\u4E0B\u90FD\u552F\u4E00\u3002 */\nconst FRAME_SELECTOR = 'div:has(> [data-shell-overlay])'\n\n/**\n * nav host \u7684\u884C\u5E03\u5C40\uFF1A\u6BCF\u4E2A\u6570\u7EC4\u5143\u7D20\u662F\u4E00\u884C\uFF0C\u884C\u5185\u6570\u7EC4\u662F\u5E76\u6392\u7684\u69FD\u4F4D\u3002\n *\n * [skills]\n *\n * \u5386\u53F2\uFF1A\u8BB0\u5FC6 / \u7528\u91CF / \u81EA\u52A8\u5316\u4E09\u4E2A\u5165\u53E3\u79FB\u9664\u540E\u53EA\u5269\u80FD\u529B\uFF08\u6280\u80FD + MCP\uFF09\u5165\u53E3\uFF0C\n * \u884C\u5185\u4E0D\u518D\u9700\u8981\u5E76\u6392\u5BB9\u5668\uFF0C\u6309\u94AE\u76F4\u63A5\u6491\u6EE1\u6574\u884C\uFF08\u4E0E\u539F\u751F\u5BFC\u822A\u884C\u540C\u6B3E\u51E0\u4F55\uFF09\u3002\n */\nconst SLOT_LAYOUT = [\n ['skills'],\n] as const\n\n/** \u69FD\u4F4D\u540D\uFF08\u5E03\u5C40\u8868\u5C55\u5E73\uFF09\u3002 */\nconst SLOT_NAMES = SLOT_LAYOUT.flat() as readonly string[]\n\n/** \u69FD\u4F4D\u540D\u3002 */\nexport type NavSlotName = (typeof SLOT_LAYOUT)[number][number]\n\n/** \u5EFA\u4E00\u4E2A\u69FD\u4F4D\u5BB9\u5668\uFF08portal \u76EE\u6807\uFF09\u3002 */\nfunction makeSlot(name: string): HTMLDivElement {\n const slot = document.createElement('div')\n slot.dataset.navSlot = name\n return slot\n}\n\nlet started = false\nlet pollTimer = 0\nlet hostObserver: MutationObserver | undefined\n\n/** \u786E\u4FDD host \u5DF2\u521B\u5EFA\u5E76\u63D2\u5230 `sidebar.workspaces` slot \u4E4B\u524D\uFF08\u5E42\u7B49\uFF09\u3002 */\nfunction ensureHostPlaced(): boolean {\n const anchor = document.querySelector(ANCHOR_SELECTOR)\n if (anchor === null) return false\n const parent = anchor.parentElement\n if (parent === null) return false\n let host = document.getElementById(HOST_ID) as HTMLDivElement | null\n if (host === null) {\n host = document.createElement('div')\n host.id = HOST_ID\n host.dataset.plugin = 'dsh-prompt-customizer'\n for (const row of SLOT_LAYOUT) {\n for (const name of row) host.appendChild(makeSlot(name))\n }\n }\n // \u5C31\u4F4D\u5224\u5B9A\uFF1Ahost \u4E0E\u951A\u70B9\u540C\u7236\u3001\u4E14\u5728\u951A\u70B9\u4E4B\u524D\u3002\n const inPlace = host.parentElement === parent\n && (anchor.compareDocumentPosition(host) & Node.DOCUMENT_POSITION_PRECEDING) !== 0\n if (!inPlace) {\n parent.insertBefore(host, anchor)\n }\n return true\n}\n\n/**\n * \u76EF\u4F4F\u5BBF\u4E3B\u7684\u76F4\u63A5\u7236\u8282\u70B9\uFF0C\u5BBF\u4E3B\u4E00\u88AB\u6458\u6389\u7ACB\u523B\u8865\u4F4D\u3002\n *\n * host \u662F\u6211\u4EEC\u624B\u5DE5 `insertBefore` \u8FDB DSH \u81EA\u6709 React \u6811\u7684\u88F8\u8282\u70B9\u2014\u2014React \u4E0D\u8BA4\u8BC6\n * \u5B83\uFF0C\u4FA7\u8FB9\u680F\u4EFB\u4F55\u4E00\u6B21 children \u91CD\u6392\u90FD\u53EF\u80FD\u628A\u5B83\u56DE\u6536\u6389\u3002\u53EA\u9760 1.5s \u8F6E\u8BE2\u4F1A\u7559\u4E0B\n * \u6700\u957F 1.5s \u7684\u7A7A\u7A97\uFF08\u89C6\u89C9\u4E0A\u5C31\u662F\u5165\u53E3\u95EA\u4E00\u4E0B\u518D\u56DE\u6765\uFF09\u3002\u8FD9\u91CC\u53EA\u89C2\u5BDF\u7236\u8282\u70B9\u7684\n * childList\uFF08\u4E0D\u5F00 subtree\uFF09\uFF1A\u4FA7\u8FB9\u680F\u81EA\u8EAB\u7684 DOM \u53D8\u52A8\u9891\u7387\u5F88\u4F4E\uFF0C\u800C\u5F39\u5C42\u9762\u677F\u5DF2\u7ECF\n * portal \u5230 body\uFF0C\u4E0D\u4F1A\u5728\u8FD9\u91CC\u4EA7\u751F\u566A\u97F3\u3002\n *\n * \u6536\u655B\u6027\uFF1A\u8865\u4F4D\u540E host \u5DF2\u5C31\u4F4D\uFF0C`ensureHostPlaced` \u4E0D\u518D\u6539\u52A8 DOM\uFF0C\u4E0D\u4F1A\u81EA\u6FC0\u3002\n * \u7236\u8282\u70B9\u6574\u4F53\u88AB\u66FF\u6362\u65F6\u89C2\u5BDF\u4F1A\u5931\u8054\uFF0C\u7531\u8F6E\u8BE2\u515C\u5E95\u91CD\u6302\u3002\n */\nfunction watchHostParent(): void {\n const parent = document.getElementById(HOST_ID)?.parentElement\n if (parent === undefined) return\n hostObserver?.disconnect()\n hostObserver = new MutationObserver(() => {\n const before = document.getElementById(HOST_ID)?.parentElement\n ensureHostPlaced()\n if (document.getElementById(HOST_ID)?.parentElement !== before) watchHostParent()\n })\n hostObserver.observe(parent, { childList: true })\n}\n\n/**\n * \u6302\u8F7D\u5BFC\u822A\u533A host\uFF08\u5E42\u7B49\u5355\u4F8B\uFF09\u3002\u9996\u6B21\u8C03\u7528\u8005\u6301\u6709\u6E05\u7406\u6743\uFF08\u505C\u8F6E\u8BE2\u3001\u79FB\u9664 host\uFF09\uFF0C\n * \u540E\u7EED\u8C03\u7528\u8FD4\u56DE no-op\u3002\n */\nexport function ensureNavMount(): () => void {\n if (typeof document === 'undefined') return () => {}\n if (started) return () => {}\n started = true\n ensureHostPlaced()\n watchHostParent()\n // \u4F4E\u9891\u8F6E\u8BE2\u515C\u5E95\uFF1A\u4FA7\u8FB9\u680F\u5BB9\u5668\u6574\u4F53\u88AB\u66FF\u6362\uFF08\u89C2\u5BDF\u5931\u8054\uFF09\u65F6\u91CD\u6302\uFF08HMR\u3001React \u91CD\u5EFA\u7B49\uFF09\u3002\n pollTimer = window.setInterval(() => {\n ensureHostPlaced()\n if (hostObserver === undefined) watchHostParent()\n }, 1500)\n return () => {\n window.clearInterval(pollTimer)\n pollTimer = 0\n hostObserver?.disconnect()\n hostObserver = undefined\n started = false\n document.getElementById(HOST_ID)?.remove()\n }\n}\n\n/** \u8F6E\u8BE2\u83B7\u53D6\u6307\u5B9A\u69FD\u4F4D\u5BB9\u5668\uFF08\u672A\u5C31\u4F4D\u65F6\u8FD4\u56DE null\uFF0C\u7EC4\u4EF6\u636E\u6B64\u6682\u4E0D\u6E32\u67D3\uFF09\u3002\n *\n * \u69FD\u4F4D\u76F4\u63A5\u6302\u5728 nav host \u4E0B\uFF0C\u56E0\u6B64\u5168\u5C40\u6309 data-nav-slot \u67E5\u627E\u2014\u2014\u69FD\u4F4D\u540D\u7531\u672C\u6A21\u5757\n * \u7EDF\u4E00\u521B\u5EFA\uFF0C\u552F\u4E00\u3002\n *\n * **\u6C38\u4E0D\u505C\u6B62**\uFF1A\u672A\u5C31\u4F4D\u65F6 100ms \u9636\u68AF\u5FEB\u67E5\uFF0810 \u6B21\u540E\u9000 400ms\uFF09\uFF1B\u627E\u5230\u540E\u9000\u5316\u4E3A\n * 800ms \u6162\u901F\u6821\u9A8C\u2014\u2014\u540C\u4E00\u8282\u70B9 setSlot \u88AB React \u76F4\u63A5\u8DF3\u8FC7\uFF0C\u96F6\u6E32\u67D3\u5F00\u9500\u3002\u8FD9\u6837\n * \u69FD\u4F4D\u4E00\u65E6\u88AB\u79FB\u9664/\u66FF\u6362\uFF08HMR\u3001React \u91CD\u5EFA host\u3001\u7ADE\u6001\u6E05\u7A7A\u7B49\uFF09\uFF0Cportal \u4F1A\u81EA\u52A8\n * \u8FC1\u5230\u65B0\u69FD\uFF1B\u5426\u5219\u4F1A\u6525\u7740\u6E38\u79BB\u7684\u65E7\u69FD\u5F15\u7528\u628A\u5165\u53E3\u300C\u5F04\u4E22\u300D\u4E14\u4E0D\u518D\u6062\u590D\u3002\n */\nexport function useNavSlot(name: NavSlotName): HTMLElement | null {\n const [slot, setSlot] = useState<HTMLElement | null>(null)\n useEffect(() => {\n let timer = 0\n let tries = 0\n const poll = (): void => {\n const found = document.querySelector<HTMLElement>(`[data-nav-slot='${name}']`)\n if (found !== null) tries = 0\n else tries += 1\n setSlot(found)\n timer = window.setTimeout(poll, found !== null ? 800 : tries <= 10 ? 100 : 400)\n }\n poll()\n return () => { window.clearTimeout(timer) }\n }, [name])\n return slot\n}\n\n/** \u4FA7\u8FB9\u680F\u6298\u53E0\u6001\uFF08rail = \u53EA\u663E\u793A\u56FE\u6807\uFF09\u3002\n *\n * \u89C2\u5BDF\u6302\u5728 body \u5B50\u6811\u4E0A\uFF08attributeFilter \u9650\u5B9A data-sidebar-collapsed\uFF09\uFF1A\n * \u6846\u67B6\u5BB9\u5668\u53EF\u80FD\u5728\u6298\u53E0\u65F6\u88AB React \u91CD\u6302\uFF0C\u76EF\u5355\u8282\u70B9\u4F1A\u5931\u8054\uFF1Bbody \u7EA7\u89C2\u5BDF + \u4F4E\u9891\n * \u515C\u5E95\u91CD\u8BFB\u5BF9\u300C\u6846\u67B6\u8FDF\u5230 / \u8282\u70B9\u66FF\u6362 / \u5C5E\u6027\u65F6\u5E8F\u300D\u90FD\u514D\u75AB\u3002\u503C\u4E0D\u53D8\u65F6 React \u81EA\u52A8\n * \u8DF3\u8FC7\u6E32\u67D3\uFF0C\u8F6E\u8BE2\u65E0\u989D\u5916\u5F00\u9500\u3002\n */\nexport function useRail(): boolean {\n const [rail, setRail] = useState(() =>\n document.querySelector(FRAME_SELECTOR)?.hasAttribute('data-sidebar-collapsed') ?? false)\n useEffect(() => {\n const read = (): void => {\n setRail(document.querySelector(FRAME_SELECTOR)?.hasAttribute('data-sidebar-collapsed') ?? false)\n }\n read()\n const observer = new MutationObserver(read)\n observer.observe(document.body, { attributes: true, attributeFilter: ['data-sidebar-collapsed'], subtree: true })\n const timer = window.setInterval(read, 1500)\n return () => {\n observer.disconnect()\n window.clearInterval(timer)\n }\n }, [])\n return rail\n}\n\nconst STYLE_ID = 'dsh-prompt-customizer-nav-styles'\n\nconst SHEET = `\n/* \u5BFC\u822A\u884C\uFF1A\u4E0E\u539F\u751F\u5BFC\u822A\u884C\u540C\u6B3E\u51E0\u4F55\uFF08\u900F\u660E\u5E95 + hover \u9AD8\u4EAE + \u6587\u5B57\u7701\u7565\uFF09 */\n.dsh-nav-btn{position:relative;display:flex;align-items:center;gap:8px;width:calc(100% - 4px);height:34px;padding:0 10px;margin:0 2px 4px;box-sizing:border-box;border:none;border-radius:8px;background:transparent;color:var(--dsw-alias-label-primary,#eee);font-size:14px;line-height:20px;font-family:inherit;cursor:pointer;text-align:left;user-select:none;overflow:hidden;transition:background 120ms ease}\n.dsh-nav-btn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.dsh-nav-btn[data-open='true']{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}\n.dsh-nav-btn>svg{flex:none;color:var(--dsw-alias-label-secondary,#bbb)}\n.dsh-nav-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n/* \u6298\u53E0 rail \u6001\uFF1A\u53EA\u7559\u56FE\u6807 */\n.dsh-nav-btn[data-rail='true']{width:36px;height:36px;padding:0;margin:0 0 8px;justify-content:center;border-radius:8px}\n/* nav host\uFF1A\u5404\u884C\u7EB5\u5411\u5806\u53E0\uFF1B\u69FD\u4F4D display:contents\uFF0C\u6309\u94AE\u76F4\u63A5\u6491\u6EE1\u6574\u884C\u3002 */\n#dsh-prompt-customizer-nav-host{display:flex;flex-direction:column;align-items:stretch;width:100%}\n#dsh-prompt-customizer-nav-host>[data-nav-slot]{display:contents}\n`\n\n/** \u6CE8\u5165\u5BFC\u822A\u884C\u6837\u5F0F\uFF08\u5E42\u7B49\uFF09\u3002 */\nexport function ensureNavStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(STYLE_ID) !== null) return\n const tag = document.createElement('style')\n tag.id = STYLE_ID\n tag.dataset.plugin = 'dsh-prompt-customizer'\n tag.textContent = SHEET\n document.head.appendChild(tag)\n}\n\n/** NavButton \u5C5E\u6027\u3002 */\nexport interface NavButtonProps {\n /** \u884C\u56FE\u6807\uFF08svg \u5143\u7D20\uFF0C\u989C\u8272\u7531\u6837\u5F0F\u8868\u7EDF\u4E00\u7740\u8272\uFF09\u3002 */\n icon: ReactNode\n /** \u884C\u6587\u5B57\uFF08rail \u6001\u4E0D\u6E32\u67D3\uFF09\u3002 */\n label: string\n /** \u6298\u53E0\u6001\uFF08\u53EA\u7559\u56FE\u6807\uFF09\u3002 */\n rail?: boolean\n /** \u9762\u677F\u5C55\u5F00\u6001\uFF08\u9AD8\u4EAE\u5E95\u8272\uFF09\u3002 */\n expanded?: boolean\n /** \u65E0\u969C\u788D\u540D\uFF08\u7F3A\u7701\u7528 label\uFF09\u3002 */\n ariaLabel?: string\n /** \u60AC\u505C\uFF1A\u6ED1\u51FA\u5361\u7247\uFF08hover \u6A21\u5F0F\uFF09\u3002 */\n onMouseEnter?: (e: MouseEvent<HTMLButtonElement>) => void\n /** \u79FB\u51FA\u6309\u94AE\uFF1A\u542F\u52A8\u81EA\u52A8\u6536\u56DE\u8BA1\u65F6\uFF08hover \u6A21\u5F0F\uFF09\u3002 */\n onMouseLeave?: () => void\n /** \u70B9\u51FB\uFF08hover \u6A21\u5F0F = \u5207\u6362\u9489\u4F4F\uFF09\u3002 */\n onClick: (e: MouseEvent<HTMLButtonElement>) => void\n}\n\n/** \u6E32\u67D3\u4E00\u6761\u5BFC\u822A\u884C\u6309\u94AE\uFF08\u4E0E auto-nav \u540C\u6B3E\u89C2\u611F\uFF09\u3002 */\nexport function NavButton({\n icon, label, rail = false, expanded = false, ariaLabel,\n onMouseEnter, onMouseLeave, onClick,\n}: NavButtonProps): JSX.Element {\n return (\n <button\n type=\"button\"\n className=\"dsh-nav-btn\"\n data-rail={rail || undefined}\n data-open={expanded || undefined}\n aria-label={ariaLabel ?? label}\n aria-expanded={expanded}\n title={rail ? (ariaLabel ?? label) : undefined}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onClick}\n >\n {icon}\n {!rail && <span className=\"dsh-nav-label\">{label}</span>}\n </button>\n )\n}\n\n/** \u4FBF\u6377\u7EC4\u5408\uFF1Aportal \u5230\u6307\u5B9A\u69FD\u4F4D\uFF08slot \u672A\u5C31\u4F4D\u65F6\u4E0D\u6E32\u67D3\uFF09\u3002 */\nexport function NavPortal({ name, children }: { name: NavSlotName; children: ReactNode }): JSX.Element | null {\n const slot = useNavSlot(name)\n if (slot === null) return null\n return createPortal(children, slot)\n}\n\n/** \u9762\u677F\u4E92\u65A5 + \u5207\u4F1A\u8BDD\u81EA\u52A8\u6536\uFF1A\u5165\u53E3\u5171\u7528\u7684\u9762\u677F\u884C\u4E3A hook\u3002\n *\n * - \u4E92\u65A5\uFF1A\u4EFB\u4E00\u9762\u677F\u6253\u5F00\u65F6\u5E7F\u64AD\uFF0C\u5176\u4F59\u5DF2\u6253\u5F00\u7684\u9762\u677F\u81EA\u52A8\u6536\u56DE\uFF08\u591A\u4E2A\u5165\u53E3\u540C\u65F6\u53EA\u5360\u4F4F\n * \u4E00\u4E2A\u4E3B\u533A\uFF0C\u4E0D\u53E0\u7F57\u6C49\uFF1B\u5F53\u524D\u53EA\u6709\u300C\u80FD\u529B\u300D\u4E00\u4E2A\u5165\u53E3\uFF0C\u5E7F\u64AD\u540C\u65F6\u662F\u65B0\u589E\u5165\u53E3\u7684\u63A5\u7F1D\uFF09\uFF1B\n * - \u5207\u4F1A\u8BDD\u81EA\u52A8\u6536\uFF1A\u9762\u677F\u76D6\u4F4F\u4F1A\u8BDD\u4E3B\u533A\u3001\u65E0\u906E\u7F69\uFF0C\u4FA7\u680F\u4FDD\u6301\u53EF\u70B9\uFF1B\u4FA7\u680F\u4F1A\u8BDD\u533A\u5185\n * \u7684\u70B9\u51FB\uFF08\u4F1A\u8BDD\u884C/\u65B0\u4F1A\u8BDD/\u8BBE\u7F6E\u7B49\uFF0C\u81EA\u5DF1\u5BFC\u822A\u884C\u4E0E\u9762\u677F\u5185\u90E8\u9664\u5916\uFF09\u76F4\u63A5\u6536\u9762\u677F\uFF0C\n * \u8DDF\u300C\u70B9\u4F1A\u8BDD\u56DE\u5230\u4F1A\u8BDD\u300D\u7684\u76F4\u89C9\u4E00\u81F4\u3002\n */\nexport type TriadPanelName = 'skills'\n\nconst PANEL_OPEN_EVENT = 'dsh-prompt-customizer:panel-open'\n\n/** \u70B9\u51FB\u662F\u5426\u843D\u5728\u4FA7\u680F\u5217\u5185\uFF08\u6309\u51E0\u4F55\u5224\u5B9A\uFF0C\u4E0D\u4F9D\u8D56\u5BBF\u4E3B\u7684\u54C8\u5E0C\u7C7B\u540D\uFF09\u3002\n *\n * \u8BA4\u300C\u53C8\u9AD8\u53C8\u7A84\u3001\u8D34\u5DE6\u300D\u7684\u5217\u5BB9\u5668\uFF1A\u6574\u9875\u7EA7\u7956\u5148\uFF08frame/root\uFF0C\u5BBD\u5360\u6EE1\u89C6\u53E3\uFF09\u4E0D\u7B97\uFF0C\n * \u5426\u5219\u4E3B\u533A\u70B9\u51FB\u987A\u7740\u5192\u6CE1\u94FE\u4E5F\u4F1A\u8BEF\u5224\u6210\u4FA7\u680F\u3002 */\nfunction clickInSidebar(target: Element): boolean {\n let node: Element | null = target\n while (node !== null && node !== document.body) {\n const rect = node.getBoundingClientRect()\n if (\n rect.height >= window.innerHeight * 0.7\n && rect.left <= 8\n && rect.right <= window.innerWidth * 0.6\n ) return true\n node = node.parentElement\n }\n return false\n}\n\nexport function usePanelAutoClose(name: TriadPanelName, open: boolean, requestClose: () => void): void {\n // \u6253\u5F00\u65F6\u5E7F\u64AD\uFF0C\u6324\u6389\u522B\u7684\u9762\u677F\u3002\n useEffect(() => {\n if (!open) return\n window.dispatchEvent(new CustomEvent(PANEL_OPEN_EVENT, { detail: name }))\n }, [open, name])\n // \u542C\u522B\u4EBA\u7684\u5E7F\u64AD + \u4FA7\u680F\u4F1A\u8BDD\u533A\u70B9\u51FB\u3002\n useEffect(() => {\n if (!open) return undefined\n const onSiblingOpen = (event: Event): void => {\n if ((event as CustomEvent<TriadPanelName>).detail !== name) requestClose()\n }\n const onDocClick = (event: globalThis.MouseEvent): void => {\n const target = event.target\n if (!(target instanceof Element)) return\n // \u81EA\u5DF1\u5BFC\u822A\u884C\u3001\u9762\u677F\u672C\u4F53\uFF08\u542B\u9762\u677F\u5185\u5F39\u5230 body \u7684\u4E8C\u7EA7\u5F39\u7A97\uFF09\u4E0D\u6536\u3002\n if (target.closest(`#${HOST_ID}, .psh-card`) !== null) return\n if (clickInSidebar(target)) requestClose()\n }\n window.addEventListener(PANEL_OPEN_EVENT, onSiblingOpen)\n document.addEventListener('click', onDocClick, true)\n return () => {\n window.removeEventListener(PANEL_OPEN_EVENT, onSiblingOpen)\n document.removeEventListener('click', onDocClick, true)\n }\n }, [open, name, requestClose])\n}\n\n/** \u300C\u5BFC\u822A\u884C\u53F3\u7F18\u300D\u6ED1\u51FA\u951A\u70B9\uFF08\u517C\u5BB9\u4FDD\u7559\uFF1A\u53F3\u4FA7\u62BD\u5C49\u4E0D\u518D\u8DDF\u968F\u6309\u94AE\u5B9A\u4F4D\uFF09\u3002\n *\n * \u53D6\u6309\u94AE\u6240\u5728\u884C\u5BB9\u5668\uFF08dsh-prompt-customizer \u7684 nav host\uFF09\u7684\u53F3\u7F18 +8 \u4F5C\u6C34\u5E73\u4F4D\uFF1Btop \u53D6\u6309\u94AE\n * \u9876\u7F18 -6\u3002nav host \u662F\u7EDF\u4E00\u7684\u884C\u5BB9\u5668\uFF0C\u4E09\u4E2A\u5165\u53E3\u5171\u7528\u3002 */\nexport function navAnchorFrom(el: Element | null): PopoverAnchor | null {\n if (el === null) return null\n const row = el.closest(`#${HOST_ID}`)\n if (row === null) return null\n const rowRect = row.getBoundingClientRect()\n const btnRect = el.getBoundingClientRect()\n return { left: Math.round(rowRect.right + 8), top: Math.round(btnRect.top - 6) }\n}\n"],
5
+ "mappings": "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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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",
6
+ "names": ["apply", "import_react", "import_react", "import_dsh_client_ui_primitives", "import_react", "STYLE_ID", "SHEET", "import_react", "STYLE_ID", "SHEET", "inject", "import_react", "import_react", "rows", "inject", "phase", "h", "import_react", "apply", "h", "import_react", "h", "import_react", "import_react", "h", "h", "phase", "error", "current", "h", "view", "import_jsx_runtime", "import_react_dom", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_jsx_runtime", "s", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_react", "import_dsh_client_ui_primitives", "import_react", "import_react_dom", "import_dsh_client_ui_primitives", "import_jsx_runtime", "STYLE_ID", "SHEET", "import_react", "current", "import_jsx_runtime", "import_react", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_dsh_client_ui_primitives", "s", "import_jsx_runtime", "import_dsh_client_ui_primitives", "import_jsx_runtime", "current", "s", "import_dsh_client_ui_primitives", "import_jsx_runtime", "import_jsx_runtime", "current", "s", "import_react", "import_react", "import_react_dom", "import_jsx_runtime", "STYLE_ID", "SHEET", "import_jsx_runtime", "apply"]
7
+ }