@lemoncat7/dsh-knowledge 2.2.8 → 2.2.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAgE3E,kDAAkD;AAClD,eAAO,MAAM,MAAM,UAAqB,CAAA;AAExC,gFAAgF;AAChF,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAoB9C"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAuE3E,kDAAkD;AAClD,eAAO,MAAM,MAAM,UAAqB,CAAA;AAExC,gFAAgF;AAChF,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAoB9C"}
package/lib/client.js CHANGED
@@ -47,7 +47,7 @@ function observePluginWorkspace(pluginId, close) {
47
47
  var import_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
48
48
 
49
49
  // src/client.css
50
- var client_default = '.dsh-knowledge-trigger,\n.dsh-knowledge-workspace,\n.dsh-knowledge-settings-card,\n.dsh-knowledge-writeback-status {\n --knowledge-accent: #3a3a3c;\n --knowledge-on-accent: #fff;\n --knowledge-danger: #d70015;\n --knowledge-success: #248a3d;\n --knowledge-pane: rgb(242 243 247 / 78%);\n --knowledge-raised: #fff;\n --knowledge-control: rgb(255 255 255 / 82%);\n --knowledge-border: rgb(60 60 67 / 14%);\n --knowledge-text: #1d1d1f;\n --knowledge-text-secondary: #515154;\n --knowledge-hover: rgba(118, 118, 128, .1);\n --knowledge-glare-light: rgb(255 255 255 / 82%);\n --knowledge-glare-rim: rgb(60 60 67 / 15%);\n --knowledge-glass-filter: saturate(1.18) contrast(1.025) blur(28px);\n --knowledge-glass-shadow: inset 0 1px 0 rgb(255 255 255 / 58%), inset 0 -1px 0 rgb(60 60 67 / 12%);\n}\n\nbody[data-ds-dark-theme] :is(\n .dsh-knowledge-trigger,\n .dsh-knowledge-workspace,\n .dsh-knowledge-settings-card,\n .dsh-knowledge-writeback-status\n) {\n --knowledge-accent: #e5e5ea;\n --knowledge-on-accent: #1d1d1f;\n --knowledge-danger: #ff453a;\n --knowledge-success: #30d158;\n --knowledge-pane: rgb(8 10 12 / 19%);\n --knowledge-raised: rgb(10 12 15 / 44%);\n --knowledge-control: rgb(255 255 255 / 7%);\n --knowledge-border: rgb(255 255 255 / 10%);\n --knowledge-text: #f5f5f7;\n --knowledge-text-secondary: #d1d1d6;\n --knowledge-hover: rgb(255 255 255 / 8%);\n --knowledge-glare-light: rgb(255 255 255 / 42%);\n --knowledge-glare-rim: rgb(0 0 0 / 24%);\n --knowledge-glass-shadow: inset 0 1px 0 rgb(255 255 255 / 18%), inset 0 -1px 0 rgb(0 0 0 / 30%);\n}\n\n.dsh-knowledge-trigger,\n.dsh-knowledge-panel-state button,\n.dsh-knowledge-settings-card button,\n.dsh-knowledge-writeback-status button {\n -webkit-appearance: none;\n appearance: none;\n margin: 0;\n}\n\n.dsh-knowledge-trigger {\n position: relative;\n flex: none;\n min-width: 0;\n max-width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n height: 34px;\n margin: 4px 0;\n padding: 6px 8px 6px 10px;\n box-sizing: border-box;\n border: 0;\n border-radius: 12px;\n overflow: hidden;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n white-space: nowrap;\n isolation: isolate;\n transition:\n color 120ms ease,\n background-color 120ms ease,\n box-shadow 160ms ease;\n}\n\n.dsh-knowledge-trigger:hover {\n background: var(--knowledge-hover);\n}\n\n.dsh-knowledge-trigger > * {\n position: relative;\n z-index: 1;\n}\n\n.dsh-knowledge-trigger::before {\n position: absolute;\n z-index: 0;\n top: -55%;\n bottom: -55%;\n left: -64%;\n width: 52%;\n border-radius: 45%;\n background: linear-gradient(\n 90deg,\n transparent,\n color-mix(in srgb, var(--knowledge-glare-light) 76%, transparent) 50%,\n color-mix(in srgb, var(--knowledge-glare-rim) 18%, transparent) 63%,\n transparent\n );\n opacity: 0;\n transform: skewX(-18deg) translate3d(0, 0, 0);\n pointer-events: none;\n transition:\n opacity 150ms ease-out,\n transform 720ms cubic-bezier(.2, .72, .2, 1);\n content: "";\n}\n\n.dsh-knowledge-trigger:hover::before {\n opacity: .96;\n transform: skewX(-18deg) translate3d(320%, 0, 0);\n}\n\n.dsh-knowledge-trigger:focus-visible,\n.dsh-knowledge-writeback-status button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n\n.dsh-knowledge-trigger.is-active {\n background: var(--knowledge-control);\n color: var(--knowledge-text);\n box-shadow: 0 1px 2px rgb(0 0 0 / 7%), inset 0 1px 0 rgb(255 255 255 / 28%);\n}\n\n.dsh-knowledge-trigger--rail {\n width: 36px;\n height: 36px;\n margin: 8px 0 4px;\n padding: 0;\n justify-content: center;\n gap: 0;\n border-radius: 50%;\n}\n\n/* Rail (collapsed) mode: the host footer seat is a horizontal row sized for a\n single 36px circle per entry; with several entries it overflows the 56px\n rail and the circles drift off the settings axis. Stack the entries\n vertically, centered on the same axis as the settings circle. The --rail\n class on the knowledge trigger is the collapsed-mode signal, so wide mode\n is untouched. */\ndiv:has(> div[data-slot="sidebar.footer.action"] .dsh-knowledge-trigger--rail) {\n flex-direction: column;\n align-items: center;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-knowledge-trigger,\n .dsh-knowledge-trigger::before { transition: none; }\n .dsh-knowledge-trigger::before { display: none; }\n}\n\n.dsh-knowledge-workspace {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: transparent;\n}\n\n.dsh-knowledge-workspace-header {\n position: relative;\n z-index: 2;\n flex: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n min-height: 52px;\n margin: 8px 10px 0;\n padding: 7px 14px;\n box-sizing: border-box;\n border: 1px solid var(--knowledge-border);\n border-radius: 14px 14px 11px 11px;\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--knowledge-glare-light) 20%, transparent), transparent 58%),\n var(--knowledge-pane);\n box-shadow: var(--knowledge-glass-shadow);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n}\n\n.dsh-knowledge-workspace-header > div {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close] {\n -webkit-appearance: none;\n appearance: none;\n display: grid;\n place-items: center;\n box-sizing: border-box;\n flex: none;\n width: 30px;\n height: 30px;\n margin: 0;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 9px;\n color: var(--knowledge-text-secondary);\n background: transparent;\n font: inherit;\n line-height: 1;\n -webkit-tap-highlight-color: transparent;\n cursor: pointer;\n transition: color 140ms ease, background 140ms ease, border-color 140ms ease, transform 140ms ease;\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:hover {\n border-color: var(--knowledge-border);\n color: var(--knowledge-text);\n background: var(--knowledge-control);\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:active { transform: scale(.96); }\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close] > svg {\n display: block;\n pointer-events: none;\n}\n\n.dsh-knowledge-workspace-header > div > span {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.dsh-knowledge-workspace-header h2,\n.dsh-knowledge-workspace-header p {\n margin: 0;\n}\n\n.dsh-knowledge-workspace-header h2 {\n color: var(--knowledge-text);\n font-size: 15px;\n line-height: 22px;\n font-weight: 600;\n}\n\n.dsh-knowledge-workspace-header p {\n color: var(--knowledge-text-secondary);\n font-size: 11px;\n line-height: 16px;\n}\n\n.dsh-knowledge-frame {\n flex: 1;\n display: block;\n width: 100%;\n min-height: 0;\n margin: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n}\n\n.dsh-knowledge-panel-state {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n min-height: 0;\n margin: 8px 10px 10px;\n padding: 32px;\n box-sizing: border-box;\n border: 1px solid var(--knowledge-border);\n border-radius: 15px;\n background: var(--knowledge-pane);\n box-shadow: var(--knowledge-glass-shadow);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n color: var(--dsw-alias-label-primary, #171719);\n}\n\n.dsh-knowledge-panel-state-icon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: 12px;\n background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, .1));\n color: var(--dsw-alias-label-secondary, #68686f);\n font-size: 18px;\n font-weight: 600;\n}\n\n.dsh-knowledge-panel-state > div { max-width: 560px; }\n.dsh-knowledge-panel-state h3 { margin: 0 0 6px; font-size: 17px; line-height: 24px; font-weight: 600; }\n.dsh-knowledge-panel-state p { margin: 0; color: var(--dsw-alias-label-secondary, #68686f); font-size: 13px; line-height: 20px; }\n.dsh-knowledge-panel-state button {\n min-width: 72px;\n min-height: 32px;\n margin-top: 16px;\n padding: 6px 14px;\n border: 0;\n border-radius: 10px;\n background: var(--knowledge-accent);\n color: var(--knowledge-on-accent);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-panel-state button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n\n.dsh-knowledge-settings-card {\n list-style: none;\n overflow: hidden;\n border: 1px solid var(--knowledge-border);\n border-radius: 14px;\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--knowledge-glare-light) 16%, transparent), transparent 58%),\n var(--knowledge-pane);\n color: var(--dsw-alias-label-primary, #171719);\n box-shadow: var(--knowledge-glass-shadow), 0 8px 24px rgb(0 0 0 / 5%);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n transition: border-color .16s, background .16s, box-shadow .2s, transform .2s cubic-bezier(.22, 1, .36, 1);\n}\n.dsh-knowledge-settings-card:hover {\n border-color: color-mix(in srgb, var(--knowledge-border) 68%, var(--knowledge-text-secondary));\n box-shadow: var(--knowledge-glass-shadow), 0 12px 30px rgb(0 0 0 / 8%);\n transform: translateY(-1px);\n}\n.dsh-knowledge-settings-card--open {\n border-color: color-mix(in srgb, var(--knowledge-border) 68%, var(--knowledge-text-secondary));\n background: var(--knowledge-pane);\n}\n.dsh-knowledge-settings-header { display: flex; width: 100%; align-items: center; gap: 12px; padding: 14px 16px; border: 0; border-radius: 12px; background: transparent; color: inherit; text-align: left; cursor: pointer; font: inherit; }\n.dsh-knowledge-settings-header:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: -2px;\n}\n.dsh-knowledge-settings-actions button:focus-visible,\n.dsh-knowledge-settings-load-error button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-settings-header > span:first-child { display: flex; min-width: 0; flex: 1; flex-direction: column; gap: 4px; }\n.dsh-knowledge-settings-header strong { font-size: 15px; font-weight: 600; line-height: 1.4; }\n.dsh-knowledge-settings-header small { color: var(--dsw-alias-label-tertiary); font-size: 13px; line-height: 1.5; }\n.dsh-knowledge-source-picker small,\n.dsh-knowledge-remote-fields small { color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-settings-summary { display: flex; flex: none; align-items: center; gap: 10px; color: var(--dsw-alias-label-tertiary); font-size: 12px; }\n.dsh-knowledge-settings-summary i { width: 8px; height: 8px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: rotate(45deg); transition: transform 160ms ease; }\n.dsh-knowledge-settings-card--open .dsh-knowledge-settings-summary i { transform: rotate(225deg); }\n\n.dsh-knowledge-settings-body {\n display: grid;\n gap: 18px;\n margin: 0 16px;\n padding-bottom: 8px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n}\n\n.dsh-knowledge-source-picker {\n min-width: 0;\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n margin: 18px 0 0;\n padding: 0;\n border: 0;\n}\n\n.dsh-knowledge-source-picker legend { margin-bottom: 8px; padding: 0; color: inherit; font-size: 13px; font-weight: 600; }\n.dsh-knowledge-source-picker label {\n display: flex;\n gap: 10px;\n padding: 13px;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .2));\n border-radius: 14px;\n cursor: pointer;\n}\n.dsh-knowledge-source-picker label.is-selected {\n border-color: var(--knowledge-accent);\n background: color-mix(in srgb, var(--knowledge-accent) 7%, transparent);\n}\n.dsh-knowledge-source-picker label.is-disabled {\n cursor: default;\n opacity: .55;\n}\n.dsh-knowledge-source-picker label:focus-within {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-source-picker input {\n -webkit-appearance: none;\n appearance: none;\n width: 16px;\n height: 16px;\n display: inline-grid;\n place-content: center;\n flex: none;\n margin: 2px 0 0;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .34));\n border-radius: 50%;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff));\n color: var(--knowledge-on-accent);\n cursor: pointer;\n transition: border-color .15s ease, background-color .15s ease;\n}\n.dsh-knowledge-source-picker input::before {\n content: "";\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n opacity: 0;\n transform: scale(.55);\n transition: opacity .12s ease, transform .15s cubic-bezier(.2, .8, .2, 1);\n}\n.dsh-knowledge-source-picker input:checked { border-color: var(--knowledge-accent); background: var(--knowledge-accent); }\n.dsh-knowledge-source-picker input:checked::before { opacity: 1; transform: scale(1); }\n.dsh-knowledge-source-picker input:disabled { cursor: default; }\n.dsh-knowledge-source-picker span { display: grid; gap: 3px; }\n\n.dsh-knowledge-remote-fields { display: grid; grid-template-columns: 1.25fr 1fr; gap: 12px; }\n.dsh-knowledge-remote-fields label,\n.dsh-knowledge-timeout-field { display: grid; gap: 6px; color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-remote-fields input,\n.dsh-knowledge-timeout-field input {\n -webkit-appearance: none;\n appearance: none;\n min-height: 38px;\n box-sizing: border-box;\n padding: 8px 11px;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .25));\n border-radius: 10px;\n outline: none;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff));\n color: var(--dsw-alias-label-primary, #171719);\n font: inherit;\n}\n.dsh-knowledge-remote-fields input:focus,\n.dsh-knowledge-timeout-field input:focus { border-color: var(--knowledge-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--knowledge-accent) 16%, transparent); }\n.dsh-knowledge-remote-fields input:-webkit-autofill,\n.dsh-knowledge-remote-fields input:-webkit-autofill:hover,\n.dsh-knowledge-remote-fields input:-webkit-autofill:focus {\n -webkit-text-fill-color: var(--dsw-alias-label-primary, #171719);\n box-shadow: 0 0 0 1000px var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff)) inset;\n caret-color: var(--dsw-alias-label-primary, #171719);\n}\n.dsh-knowledge-timeout-field input::-webkit-inner-spin-button,\n.dsh-knowledge-timeout-field input::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }\n.dsh-knowledge-timeout-field { max-width: 240px; }\n.dsh-knowledge-field-error { color: var(--knowledge-danger) !important; }\n\n.dsh-knowledge-settings-message,\n.dsh-knowledge-settings-note { margin: 0; color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-settings-message.is-success { color: var(--knowledge-success); }\n.dsh-knowledge-settings-message.is-error { color: var(--knowledge-danger); }\n.dsh-knowledge-settings-load-error {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-top: 18px;\n padding: 12px 14px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--knowledge-danger) 8%, transparent);\n color: var(--knowledge-danger);\n font-size: 13px;\n}\n.dsh-knowledge-settings-load-error p { margin: 0; }\n.dsh-knowledge-settings-load-error button {\n flex: none;\n min-height: 30px;\n padding: 5px 10px;\n border: 0;\n border-radius: 9px;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-2, #fff));\n color: var(--dsw-alias-label-primary, #171719);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-settings-actions { display: flex; justify-content: flex-end; gap: 8px; }\n.dsh-knowledge-settings-actions button {\n min-height: 34px;\n padding: 7px 13px;\n border: 0;\n border-radius: 10px;\n background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, .1));\n color: var(--dsw-alias-label-primary, #171719);\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n}\n.dsh-knowledge-settings-actions button.is-primary { background: var(--knowledge-accent); color: var(--knowledge-on-accent); }\n.dsh-knowledge-settings-actions button:disabled { cursor: default; opacity: .45; }\n\n@media (max-width: 720px) {\n .dsh-knowledge-source-picker,\n .dsh-knowledge-remote-fields { grid-template-columns: 1fr; }\n .dsh-knowledge-settings-summary { font-size: 0; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-knowledge-settings-card,\n .dsh-knowledge-settings-header,\n .dsh-knowledge-settings-summary i { transition: none; }\n}\n\n.dsh-knowledge-writeback-status {\n display: grid;\n gap: 5px;\n min-width: 0;\n color: var(--dsw-alias-label-tertiary, #6b7280);\n font-size: 12px;\n line-height: 1.5;\n}\n.dsh-knowledge-writeback-summary {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n min-width: 0;\n}\n.dsh-knowledge-writeback-status strong {\n color: var(--dsw-alias-label-secondary, #374151);\n font-weight: 600;\n}\n.dsh-knowledge-writeback-status button {\n min-height: 24px;\n padding: 0 9px;\n border: 1px solid var(--dsw-alias-separator, #d1d5db);\n border-radius: 7px;\n color: var(--dsw-alias-label-secondary, #374151);\n background: var(--dsw-alias-button-elevated-fill, #fff);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-writeback-status button:disabled { cursor: default; opacity: .5; }\n.dsh-knowledge-writeback-destinations {\n display: flex;\n flex-wrap: wrap;\n gap: 5px 8px;\n min-width: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.dsh-knowledge-writeback-destinations li {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n max-width: 100%;\n padding: 2px 7px;\n border: 1px solid var(--knowledge-border);\n border-radius: 7px;\n background: var(--knowledge-control);\n}\n.dsh-knowledge-writeback-destinations li > span::after {\n margin-left: 5px;\n color: var(--dsw-alias-label-quaternary, #9ca3af);\n content: "/";\n}\n.dsh-knowledge-writeback-destinations strong {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.dsh-knowledge-writeback-destinations small {\n flex: none;\n color: var(--dsw-alias-label-secondary, #374151);\n font: inherit;\n white-space: nowrap;\n}\n.dsh-knowledge-writeback-destinations small[data-disposition="written"] { color: var(--knowledge-success); }\n.dsh-knowledge-writeback-error {\n max-width: min(720px, 100%);\n margin: 0;\n color: var(--knowledge-danger);\n overflow-wrap: anywhere;\n}\n';
50
+ var client_default = '.dsh-knowledge-trigger,\n.dsh-knowledge-workspace,\n.dsh-knowledge-settings-card,\n.dsh-knowledge-writeback-status {\n --knowledge-accent: #3a3a3c;\n --knowledge-on-accent: #fff;\n --knowledge-danger: #d70015;\n --knowledge-success: #248a3d;\n --knowledge-pane: rgb(242 243 247 / 78%);\n --knowledge-raised: #fff;\n --knowledge-control: rgb(255 255 255 / 82%);\n --knowledge-border: rgb(60 60 67 / 14%);\n --knowledge-text: #1d1d1f;\n --knowledge-text-secondary: #515154;\n --knowledge-hover: rgba(118, 118, 128, .1);\n --knowledge-glare-light: rgb(255 255 255 / 82%);\n --knowledge-glare-rim: rgb(60 60 67 / 15%);\n --knowledge-glass-filter: saturate(1.18) contrast(1.025) blur(28px);\n --knowledge-glass-shadow: inset 0 1px 0 rgb(255 255 255 / 58%), inset 0 -1px 0 rgb(60 60 67 / 12%);\n}\n\nbody[data-ds-dark-theme] :is(\n .dsh-knowledge-trigger,\n .dsh-knowledge-workspace,\n .dsh-knowledge-settings-card,\n .dsh-knowledge-writeback-status\n) {\n --knowledge-accent: #e5e5ea;\n --knowledge-on-accent: #1d1d1f;\n --knowledge-danger: #ff453a;\n --knowledge-success: #30d158;\n --knowledge-pane: rgb(8 10 12 / 19%);\n --knowledge-raised: rgb(10 12 15 / 44%);\n --knowledge-control: rgb(255 255 255 / 7%);\n --knowledge-border: rgb(255 255 255 / 10%);\n --knowledge-text: #f5f5f7;\n --knowledge-text-secondary: #d1d1d6;\n --knowledge-hover: rgb(255 255 255 / 8%);\n --knowledge-glare-light: rgb(255 255 255 / 42%);\n --knowledge-glare-rim: rgb(0 0 0 / 24%);\n --knowledge-glass-shadow: inset 0 1px 0 rgb(255 255 255 / 18%), inset 0 -1px 0 rgb(0 0 0 / 30%);\n}\n\n.dsh-knowledge-trigger,\n.dsh-knowledge-panel-state button,\n.dsh-knowledge-settings-card button,\n.dsh-knowledge-writeback-status button {\n -webkit-appearance: none;\n appearance: none;\n margin: 0;\n}\n\n.dsh-knowledge-trigger {\n position: relative;\n flex: none;\n min-width: 0;\n max-width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n height: 34px;\n margin: 4px 0;\n padding: 6px 8px 6px 10px;\n box-sizing: border-box;\n border: 0;\n border-radius: 12px;\n overflow: hidden;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n white-space: nowrap;\n isolation: isolate;\n transition:\n color 120ms ease,\n background-color 120ms ease,\n box-shadow 160ms ease;\n}\n\n.dsh-knowledge-trigger:hover {\n background: var(--knowledge-hover);\n}\n\n.dsh-knowledge-trigger > * {\n position: relative;\n z-index: 1;\n}\n\n.dsh-knowledge-trigger::before {\n position: absolute;\n z-index: 0;\n top: -55%;\n bottom: -55%;\n left: -64%;\n width: 52%;\n border-radius: 45%;\n background: linear-gradient(\n 90deg,\n transparent,\n color-mix(in srgb, var(--knowledge-glare-light) 76%, transparent) 50%,\n color-mix(in srgb, var(--knowledge-glare-rim) 18%, transparent) 63%,\n transparent\n );\n opacity: 0;\n transform: skewX(-18deg) translate3d(0, 0, 0);\n pointer-events: none;\n transition:\n opacity 150ms ease-out,\n transform 720ms cubic-bezier(.2, .72, .2, 1);\n content: "";\n}\n\n.dsh-knowledge-trigger:hover::before {\n opacity: .96;\n transform: skewX(-18deg) translate3d(320%, 0, 0);\n}\n\n.dsh-knowledge-trigger:focus-visible,\n.dsh-knowledge-writeback-status button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n\n.dsh-knowledge-trigger.is-active {\n background: var(--knowledge-control);\n color: var(--knowledge-text);\n box-shadow: 0 1px 2px rgb(0 0 0 / 7%), inset 0 1px 0 rgb(255 255 255 / 28%);\n}\n\n.dsh-knowledge-trigger--rail {\n width: 36px;\n height: 36px;\n margin: 8px 0 4px;\n padding: 0;\n justify-content: center;\n gap: 0;\n border-radius: 50%;\n}\n\n/* Rail (collapsed) mode: the host footer seat is a horizontal row sized for a\n single 36px circle per entry; with several entries it overflows the 56px\n rail and the circles drift off the settings axis. Stack the entries\n vertically, centered on the same axis as the settings circle. The --rail\n class on the knowledge trigger is the collapsed-mode signal, so wide mode\n is untouched. */\ndiv:has(> div[data-slot="sidebar.footer.action"] .dsh-knowledge-trigger--rail) {\n flex-direction: column;\n align-items: center;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-knowledge-trigger,\n .dsh-knowledge-trigger::before { transition: none; }\n .dsh-knowledge-trigger::before { display: none; }\n}\n\n.dsh-knowledge-workspace {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: transparent;\n}\n\n.dsh-knowledge-workspace-header {\n position: relative;\n z-index: 2;\n flex: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n min-height: 52px;\n margin: 8px 10px 0;\n padding: 7px 14px;\n box-sizing: border-box;\n border: 1px solid var(--knowledge-border);\n border-radius: 14px 14px 11px 11px;\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--knowledge-glare-light) 20%, transparent), transparent 58%),\n var(--knowledge-pane);\n box-shadow: var(--knowledge-glass-shadow);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n}\n\n.dsh-knowledge-workspace-header > div {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close] {\n -webkit-appearance: none;\n appearance: none;\n display: grid;\n place-items: center;\n box-sizing: border-box;\n flex: none;\n width: 30px;\n height: 30px;\n margin: 0;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 9px;\n color: var(--knowledge-text-secondary);\n background: transparent;\n font: inherit;\n line-height: 1;\n -webkit-tap-highlight-color: transparent;\n cursor: pointer;\n transition: color 140ms ease, background 140ms ease, border-color 140ms ease, transform 140ms ease;\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:hover {\n border-color: var(--knowledge-border);\n color: var(--knowledge-text);\n background: var(--knowledge-control);\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:active { transform: scale(.96); }\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close] > svg {\n display: block;\n pointer-events: none;\n}\n\n.dsh-knowledge-workspace-header > div > span {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.dsh-knowledge-workspace-header h2,\n.dsh-knowledge-workspace-header p {\n margin: 0;\n}\n\n.dsh-knowledge-workspace-header h2 {\n color: var(--knowledge-text);\n font-size: 15px;\n line-height: 22px;\n font-weight: 600;\n}\n\n.dsh-knowledge-workspace-header p {\n color: var(--knowledge-text-secondary);\n font-size: 11px;\n line-height: 16px;\n}\n\n.dsh-knowledge-frame {\n flex: 1;\n display: block;\n width: 100%;\n min-height: 0;\n margin: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n}\n\n.dsh-knowledge-panel-state {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n min-height: 0;\n margin: 8px 10px 10px;\n padding: 32px;\n box-sizing: border-box;\n border: 1px solid var(--knowledge-border);\n border-radius: 15px;\n background: var(--knowledge-pane);\n box-shadow: var(--knowledge-glass-shadow);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n color: var(--dsw-alias-label-primary, #171719);\n}\n\n.dsh-knowledge-panel-state-icon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: 12px;\n background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, .1));\n color: var(--dsw-alias-label-secondary, #68686f);\n font-size: 18px;\n font-weight: 600;\n}\n\n.dsh-knowledge-panel-state > div { max-width: 560px; }\n.dsh-knowledge-panel-state h3 { margin: 0 0 6px; font-size: 17px; line-height: 24px; font-weight: 600; }\n.dsh-knowledge-panel-state p { margin: 0; color: var(--dsw-alias-label-secondary, #68686f); font-size: 13px; line-height: 20px; }\n.dsh-knowledge-panel-state button {\n min-width: 72px;\n min-height: 32px;\n margin-top: 16px;\n padding: 6px 14px;\n border: 0;\n border-radius: 10px;\n background: var(--knowledge-accent);\n color: var(--knowledge-on-accent);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-panel-state button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n\n.dsh-knowledge-settings-card {\n list-style: none;\n overflow: hidden;\n border: 1px solid var(--knowledge-border);\n border-radius: 14px;\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--knowledge-glare-light) 16%, transparent), transparent 58%),\n var(--knowledge-pane);\n color: var(--dsw-alias-label-primary, #171719);\n box-shadow: var(--knowledge-glass-shadow), 0 8px 24px rgb(0 0 0 / 5%);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n transition: border-color .16s, background .16s, box-shadow .2s, transform .2s cubic-bezier(.22, 1, .36, 1);\n}\n.dsh-knowledge-settings-card:hover {\n border-color: color-mix(in srgb, var(--knowledge-border) 68%, var(--knowledge-text-secondary));\n box-shadow: var(--knowledge-glass-shadow), 0 12px 30px rgb(0 0 0 / 8%);\n transform: translateY(-1px);\n}\n.dsh-knowledge-settings-card--open {\n border-color: color-mix(in srgb, var(--knowledge-border) 68%, var(--knowledge-text-secondary));\n background: var(--knowledge-pane);\n}\n.dsh-knowledge-settings-header { display: flex; width: 100%; align-items: center; gap: 12px; padding: 14px 16px; border: 0; border-radius: 12px; background: transparent; color: inherit; text-align: left; cursor: pointer; font: inherit; }\n.dsh-knowledge-settings-header:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: -2px;\n}\n.dsh-knowledge-settings-actions button:focus-visible,\n.dsh-knowledge-settings-load-error button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-settings-header > span:first-child { display: flex; min-width: 0; flex: 1; flex-direction: column; gap: 4px; }\n.dsh-knowledge-settings-header strong { font-size: 15px; font-weight: 600; line-height: 1.4; }\n.dsh-knowledge-settings-header small { color: var(--dsw-alias-label-tertiary); font-size: 13px; line-height: 1.5; }\n.dsh-knowledge-source-picker small,\n.dsh-knowledge-remote-fields small { color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-settings-summary { display: flex; flex: none; align-items: center; gap: 10px; color: var(--dsw-alias-label-tertiary); font-size: 12px; }\n.dsh-knowledge-settings-summary i { width: 8px; height: 8px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: rotate(45deg); transition: transform 160ms ease; }\n.dsh-knowledge-settings-card--open .dsh-knowledge-settings-summary i { transform: rotate(225deg); }\n\n.dsh-knowledge-settings-body {\n display: grid;\n gap: 18px;\n margin: 0 16px;\n padding-bottom: 8px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n}\n\n.dsh-knowledge-source-picker {\n min-width: 0;\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n margin: 18px 0 0;\n padding: 0;\n border: 0;\n}\n\n.dsh-knowledge-source-picker legend { margin-bottom: 8px; padding: 0; color: inherit; font-size: 13px; font-weight: 600; }\n.dsh-knowledge-source-picker label {\n display: flex;\n gap: 10px;\n padding: 13px;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .2));\n border-radius: 14px;\n cursor: pointer;\n}\n.dsh-knowledge-source-picker label.is-selected {\n border-color: var(--knowledge-accent);\n background: color-mix(in srgb, var(--knowledge-accent) 7%, transparent);\n}\n.dsh-knowledge-source-picker label.is-disabled {\n cursor: default;\n opacity: .55;\n}\n.dsh-knowledge-source-picker label:focus-within {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-source-picker input {\n -webkit-appearance: none;\n appearance: none;\n width: 16px;\n height: 16px;\n display: inline-grid;\n place-content: center;\n flex: none;\n margin: 2px 0 0;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .34));\n border-radius: 50%;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff));\n color: var(--knowledge-on-accent);\n cursor: pointer;\n transition: border-color .15s ease, background-color .15s ease;\n}\n.dsh-knowledge-source-picker input::before {\n content: "";\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n opacity: 0;\n transform: scale(.55);\n transition: opacity .12s ease, transform .15s cubic-bezier(.2, .8, .2, 1);\n}\n.dsh-knowledge-source-picker input:checked { border-color: var(--knowledge-accent); background: var(--knowledge-accent); }\n.dsh-knowledge-source-picker input:checked::before { opacity: 1; transform: scale(1); }\n.dsh-knowledge-source-picker input:disabled { cursor: default; }\n.dsh-knowledge-source-picker span { display: grid; gap: 3px; }\n\n.dsh-knowledge-remote-fields { display: grid; grid-template-columns: 1.25fr 1fr; gap: 12px; }\n.dsh-knowledge-remote-fields label,\n.dsh-knowledge-timeout-field { display: grid; gap: 6px; color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-remote-fields input,\n.dsh-knowledge-timeout-field input {\n -webkit-appearance: none;\n appearance: none;\n min-height: 38px;\n box-sizing: border-box;\n padding: 8px 11px;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .25));\n border-radius: 10px;\n outline: none;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff));\n color: var(--dsw-alias-label-primary, #171719);\n font: inherit;\n}\n.dsh-knowledge-remote-fields input:focus,\n.dsh-knowledge-timeout-field input:focus { border-color: var(--knowledge-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--knowledge-accent) 16%, transparent); }\n.dsh-knowledge-remote-fields input:-webkit-autofill,\n.dsh-knowledge-remote-fields input:-webkit-autofill:hover,\n.dsh-knowledge-remote-fields input:-webkit-autofill:focus {\n -webkit-text-fill-color: var(--dsw-alias-label-primary, #171719);\n box-shadow: 0 0 0 1000px var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff)) inset;\n caret-color: var(--dsw-alias-label-primary, #171719);\n}\n.dsh-knowledge-timeout-field input::-webkit-inner-spin-button,\n.dsh-knowledge-timeout-field input::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }\n.dsh-knowledge-timeout-field { max-width: 240px; }\n.dsh-knowledge-field-error { color: var(--knowledge-danger) !important; }\n\n.dsh-knowledge-settings-message,\n.dsh-knowledge-settings-note { margin: 0; color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-settings-message.is-success { color: var(--knowledge-success); }\n.dsh-knowledge-settings-message.is-error { color: var(--knowledge-danger); }\n.dsh-knowledge-settings-load-error {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-top: 18px;\n padding: 12px 14px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--knowledge-danger) 8%, transparent);\n color: var(--knowledge-danger);\n font-size: 13px;\n}\n.dsh-knowledge-settings-load-error p { margin: 0; }\n.dsh-knowledge-settings-load-error button {\n flex: none;\n min-height: 30px;\n padding: 5px 10px;\n border: 0;\n border-radius: 9px;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-2, #fff));\n color: var(--dsw-alias-label-primary, #171719);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-settings-actions { display: flex; justify-content: flex-end; gap: 8px; }\n.dsh-knowledge-settings-actions button {\n min-height: 34px;\n padding: 7px 13px;\n border: 0;\n border-radius: 10px;\n background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, .1));\n color: var(--dsw-alias-label-primary, #171719);\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n}\n.dsh-knowledge-settings-actions button.is-primary { background: var(--knowledge-accent); color: var(--knowledge-on-accent); }\n.dsh-knowledge-settings-actions button:disabled { cursor: default; opacity: .45; }\n\n@media (max-width: 720px) {\n .dsh-knowledge-source-picker,\n .dsh-knowledge-remote-fields { grid-template-columns: 1fr; }\n .dsh-knowledge-settings-summary { font-size: 0; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-knowledge-settings-card,\n .dsh-knowledge-settings-header,\n .dsh-knowledge-settings-summary i { transition: none; }\n}\n\n.dsh-knowledge-writeback-status {\n display: grid;\n gap: 5px;\n min-width: 0;\n color: var(--dsw-alias-label-tertiary, #6b7280);\n font-size: 12px;\n line-height: 1.5;\n}\n.dsh-knowledge-writeback-summary {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n min-width: 0;\n}\n.dsh-knowledge-writeback-status strong {\n color: var(--dsw-alias-label-secondary, #374151);\n font-weight: 600;\n}\n.dsh-knowledge-writeback-status button {\n min-height: 24px;\n padding: 0 9px;\n border: 1px solid var(--dsw-alias-separator, #d1d5db);\n border-radius: 7px;\n color: var(--dsw-alias-label-secondary, #374151);\n background: var(--dsw-alias-button-elevated-fill, #fff);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-writeback-status button:disabled { cursor: default; opacity: .5; }\n.dsh-knowledge-writeback-destinations {\n display: flex;\n flex-wrap: wrap;\n gap: 2px 12px;\n min-width: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.dsh-knowledge-writeback-destinations li {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n}\n.dsh-knowledge-writeback-base,\n.dsh-knowledge-writeback-separator {\n flex: none;\n}\n.dsh-knowledge-writeback-separator {\n color: var(--dsw-alias-label-quaternary, #9ca3af);\n}\n.dsh-knowledge-writeback-destinations strong {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.dsh-knowledge-writeback-status .dsh-knowledge-writeback-document {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n min-height: 24px;\n padding: 0 3px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #374151);\n text-decoration: underline;\n text-decoration-color: transparent;\n text-underline-offset: 3px;\n transition: color 120ms ease, background-color 120ms ease, text-decoration-color 120ms ease;\n}\n.dsh-knowledge-writeback-status .dsh-knowledge-writeback-document:hover {\n background: var(--knowledge-hover);\n color: var(--dsw-alias-label-primary, #171719);\n text-decoration-color: currentColor;\n}\n.dsh-knowledge-writeback-document strong { color: inherit; }\n.dsh-knowledge-writeback-destinations small {\n flex: none;\n color: var(--dsw-alias-label-secondary, #374151);\n font: inherit;\n white-space: nowrap;\n}\n.dsh-knowledge-writeback-destinations small[data-disposition="written"] { color: var(--knowledge-success); }\n.dsh-knowledge-writeback-error {\n max-width: min(720px, 100%);\n margin: 0;\n color: var(--knowledge-danger);\n overflow-wrap: anywhere;\n}\n';
51
51
 
52
52
  // src/constants.ts
53
53
  var KNOWLEDGE_SETTINGS_NAMESPACE = "dsh-knowledge-connection";
@@ -141,9 +141,13 @@ function apply(ctx) {
141
141
  ctx.slots.inject("conversation.chat.turnTail", () => ctx.slots.register({
142
142
  name: "conversation.chat.turnTail",
143
143
  select: (owner) => ({ turn: owner.turn.turn })
144
- }, (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(KnowledgeWritebackStatus, { sessionId: String(props.sessionId), turn: props.matched.turn })));
144
+ }, (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(KnowledgeWritebackStatus, { sessionId: String(props.sessionId), turn: props.matched.turn, workspace })));
145
145
  }
146
- function KnowledgeWritebackStatus({ sessionId, turn }) {
146
+ function KnowledgeWritebackStatus({
147
+ sessionId,
148
+ turn,
149
+ workspace
150
+ }) {
147
151
  const [state, setState] = (0, import_react.useState)();
148
152
  const [retrying, setRetrying] = (0, import_react.useState)(false);
149
153
  (0, import_react.useEffect)(() => {
@@ -217,8 +221,21 @@ function KnowledgeWritebackStatus({ sessionId, turn }) {
217
221
  }, children: retrying ? "\u91CD\u8BD5\u4E2D\u2026" : "\u91CD\u8BD5" })
218
222
  ] }),
219
223
  destinations.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { className: "dsh-knowledge-writeback-destinations", "aria-label": "\u56DE\u5199\u76EE\u6807", children: destinations.map((destination, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { children: [
220
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: destination.knowledgeBaseName }),
221
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { title: destination.documentPath ?? destination.documentTitle, children: destination.documentPath ?? `\u62DF\u65B0\u5EFA\uFF1A${destination.documentTitle}` }),
224
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dsh-knowledge-writeback-base", children: destination.knowledgeBaseName }),
225
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dsh-knowledge-writeback-separator", "aria-hidden": "true", children: "/" }),
226
+ destination.documentId ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
227
+ "button",
228
+ {
229
+ type: "button",
230
+ className: "dsh-knowledge-writeback-document",
231
+ title: `\u6253\u5F00 ${destination.documentPath ?? destination.documentTitle}`,
232
+ "aria-label": `\u5728\u77E5\u8BC6\u5E93\u4E2D\u6253\u5F00 ${destination.documentTitle}`,
233
+ onClick: () => {
234
+ workspace.openDocument({ knowledgeBaseId: destination.knowledgeBaseId, documentId: destination.documentId });
235
+ },
236
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: destination.documentPath ?? destination.documentTitle })
237
+ }
238
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { title: destination.documentTitle, children: `\u62DF\u65B0\u5EFA\uFF1A${destination.documentTitle}` }),
222
239
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { "data-disposition": destination.disposition, children: destination.disposition === "written" ? "\u5DF2\u5199\u5165" : "\u5F85\u5BA1\u6838" })
223
240
  ] }, `${destination.knowledgeBaseId}:${destination.documentId ?? destination.documentTitle}:${index}`)) }),
224
241
  state.status === "failed" && state.error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-knowledge-writeback-error", role: "alert", children: state.error })
@@ -227,6 +244,7 @@ function KnowledgeWritebackStatus({ sessionId, turn }) {
227
244
  function createKnowledgeWorkspaceController(client) {
228
245
  const listeners = /* @__PURE__ */ new Set();
229
246
  let disposeWorkspace;
247
+ let target;
230
248
  const notify = () => {
231
249
  for (const listener of listeners) listener();
232
250
  };
@@ -237,15 +255,26 @@ function createKnowledgeWorkspaceController(client) {
237
255
  dispose();
238
256
  notify();
239
257
  };
240
- const controller = {
258
+ let controller;
259
+ const open = () => {
260
+ if (disposeWorkspace !== void 0) return;
261
+ activatePluginWorkspace(PLUGIN_ID);
262
+ disposeWorkspace = client.slots.register({ name: "conversation", priority: -1 }, (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(KnowledgeWorkspace, { ...props, client, workspace: controller }));
263
+ };
264
+ controller = {
241
265
  isOpen: () => disposeWorkspace !== void 0,
242
266
  toggle: () => {
243
267
  if (disposeWorkspace !== void 0) return close();
244
- activatePluginWorkspace(PLUGIN_ID);
245
- const dispose = client.slots.register({ name: "conversation", priority: -1 }, (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(KnowledgeWorkspace, { ...props, client, workspace: controller }));
246
- disposeWorkspace = dispose;
268
+ target = void 0;
269
+ open();
247
270
  notify();
248
271
  },
272
+ openDocument: (nextTarget) => {
273
+ target = nextTarget;
274
+ open();
275
+ notify();
276
+ },
277
+ currentTarget: () => target,
249
278
  close,
250
279
  subscribe: (listener) => {
251
280
  listeners.add(listener);
@@ -483,8 +512,9 @@ function KnowledgeWorkspace({
483
512
  const [panelState, setPanelState] = (0, import_react.useState)(cachedConnectionView === void 0 ? "loading" : cachedManagementPath === void 0 ? "unavailable" : "ready");
484
513
  const [managementPath, setManagementPath] = (0, import_react.useState)(cachedManagementPath);
485
514
  const [panelError, setPanelError] = (0, import_react.useState)("");
515
+ const [target, setTarget] = (0, import_react.useState)(workspace.currentTarget());
486
516
  const projectId = useSessions((state) => sessionId === void 0 ? void 0 : state.byId[sessionId]?.cwd);
487
- const knowledgeUrl = managementPath === void 0 ? void 0 : knowledgePanelUrl(managementPath, sessionId, projectId);
517
+ const knowledgeUrl = managementPath === void 0 ? void 0 : knowledgePanelUrl(managementPath, sessionId, projectId, target);
488
518
  const frame = (0, import_react.useRef)(null);
489
519
  const themeFrame = (0, import_react.useRef)(0);
490
520
  const loadManagement = (0, import_react.useCallback)(async (background = false) => {
@@ -508,13 +538,16 @@ function KnowledgeWorkspace({
508
538
  (0, import_react.useEffect)(() => {
509
539
  void loadManagement(cachedConnectionView !== void 0);
510
540
  }, [loadManagement]);
541
+ (0, import_react.useEffect)(() => workspace.subscribe(() => {
542
+ setTarget(workspace.currentTarget());
543
+ }), [workspace]);
511
544
  const sendTheme = (0, import_react.useCallback)(() => {
512
545
  const currentFrame = frame.current;
513
546
  if (currentFrame === null) return;
514
- const target = currentFrame.contentWindow;
515
- if (target === null) return;
547
+ const target2 = currentFrame.contentWindow;
548
+ if (target2 === null) return;
516
549
  const computed = getComputedStyle(document.body);
517
- target.postMessage(
550
+ target2.postMessage(
518
551
  createKnowledgeHostTheme(computed, client.theme.getTheme()),
519
552
  frameOrigin(currentFrame) ?? "*"
520
553
  );
@@ -565,10 +598,14 @@ function KnowledgeWorkspace({
565
598
  ] })
566
599
  ] });
567
600
  }
568
- function knowledgePanelUrl(managementPath, sessionId, projectId) {
601
+ function knowledgePanelUrl(managementPath, sessionId, projectId, target) {
569
602
  const params = new URLSearchParams();
570
603
  if (sessionId !== void 0) params.set("sessionId", sessionId);
571
604
  if (projectId !== void 0) params.set("projectId", projectId);
605
+ if (target !== void 0) {
606
+ params.set("knowledgeBaseId", target.knowledgeBaseId);
607
+ params.set("documentId", target.documentId);
608
+ }
572
609
  const query = params.toString();
573
610
  return query.length === 0 ? managementPath : `${managementPath}${managementPath.includes("?") ? "&" : "?"}${query}`;
574
611
  }
package/lib/client.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/client.tsx", "../src/workspace-ownership.ts", "../src/client.css", "../src/constants.ts", "../src/theme-bridge.ts"],
4
- "sourcesContent": ["import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-theme/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { activatePluginWorkspace, observePluginWorkspace } from './workspace-ownership.js'\nimport {\n IconChevronLeftOutline14, IconDataOutline16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport cssText from './client.css'\nimport { KNOWLEDGE_SETTINGS_NAMESPACE } from './constants.js'\nimport {\n createKnowledgeHostTheme,\n KNOWLEDGE_THEME_PROTOCOL_VERSION,\n KNOWLEDGE_THEME_READY_MESSAGE,\n type ThemeSnapshotLike,\n} from './theme-bridge.js'\n\nconst PLUGIN_ID = '@lemoncat7/dsh-knowledge'\nconst STYLE_ID = `${PLUGIN_ID}/client`\n\ntype SidebarActionProps = PropsRuntime<'sidebar.footer.action'>\ntype ConversationSlotProps = PropsRuntime<'conversation'>\n\ninterface KnowledgeConnectionView {\n backend: 'local' | 'remote'\n remoteUrl?: string\n remoteTimeoutMs: number\n tokenConfigured: boolean\n canSwitchRemote: boolean\n writable: boolean\n managementAvailable: boolean\n managementPath?: string\n}\n\ninterface KnowledgeWorkspaceController {\n isOpen(): boolean\n toggle(): void\n close(): void\n subscribe(listener: () => void): () => void\n}\n\ninterface WritebackDestinationView {\n knowledgeBaseId: string\n knowledgeBaseName: string\n documentId?: string\n documentTitle: string\n documentPath?: string\n disposition: 'written' | 'pending-review'\n}\n\ninterface WritebackStatusView {\n status: 'running' | 'completed' | 'failed'\n summary: string\n error?: string\n retryable: boolean\n destinations?: WritebackDestinationView[]\n}\n\nconst CONNECTION_CONTROL_PATH = '/knowledge-control/v1/connection'\nlet cachedConnectionView: KnowledgeConnectionView | undefined\n\n/** Cordis services needed by the browser half. */\nexport const inject = ['slots', 'theme']\n\n/** Register the knowledge launcher in the sidebar's official extension slot. */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(installStyles, 'dsh-knowledge: client styles')\n const workspace = createKnowledgeWorkspaceController(ctx)\n ctx.effect(() => observePluginWorkspace(PLUGIN_ID, workspace.close), 'dsh-knowledge: exclusive workspace')\n ctx.effect(() => () => { workspace.close() }, 'dsh-knowledge: workspace lifecycle')\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action',\n id: 'knowledge',\n order: -10,\n }, props => <KnowledgeLauncher {...props} workspace={workspace} />))\n\n ctx.slots.inject('settings.plugin.item', () => ctx.slots.register({\n name: 'settings.plugin.item',\n key: KNOWLEDGE_SETTINGS_NAMESPACE,\n }, KnowledgeConnectionCard))\n\n ctx.slots.inject('conversation.chat.turnTail', () => ctx.slots.register({\n name: 'conversation.chat.turnTail',\n select: owner => ({ turn: owner.turn.turn }),\n }, props => <KnowledgeWritebackStatus sessionId={String(props.sessionId)} turn={props.matched.turn} />))\n}\n\nfunction KnowledgeWritebackStatus({ sessionId, turn }: { sessionId: string; turn: number }) {\n const [state, setState] = useState<WritebackStatusView>()\n const [retrying, setRetrying] = useState(false)\n useEffect(() => {\n const controller = new AbortController()\n let timer: ReturnType<typeof setTimeout> | undefined\n let missingAttempts = 0\n const schedule = (delay: number): void => {\n if (!controller.signal.aborted) timer = setTimeout(() => { void load() }, delay)\n }\n const load = async (): Promise<void> => {\n try {\n const response = await fetch(`/knowledge-control/v1/writeback-status?sessionId=${encodeURIComponent(sessionId)}&turn=${turn}`, {\n headers: { accept: 'application/json', 'x-dsh-knowledge-client': 'conversation-web' }, signal: controller.signal,\n })\n if (response.ok) {\n const value = await response.json() as WritebackStatusView\n if (value.summary) setState(value)\n if (value.status === 'running') schedule(1_500)\n return\n }\n if (response.status === 404 && missingAttempts < 3) {\n missingAttempts += 1\n schedule(1_500)\n }\n } catch {\n if (!controller.signal.aborted && missingAttempts < 3) {\n missingAttempts += 1\n schedule(2_000)\n }\n }\n }\n void load()\n return () => { controller.abort(); if (timer !== undefined) clearTimeout(timer) }\n }, [sessionId, turn])\n if (state === undefined) return null\n const retry = async (): Promise<void> => {\n setRetrying(true)\n try {\n const response = await fetch(`/knowledge-control/v1/writeback-status?sessionId=${encodeURIComponent(sessionId)}&turn=${turn}`, {\n method: 'POST', headers: { accept: 'application/json', 'x-dsh-knowledge-client': 'conversation-web' },\n })\n const body = await response.json().catch(() => ({})) as WritebackStatusView & { error?: string }\n if (!response.ok) throw new Error(body.error ?? `retry failed with HTTP ${response.status}`)\n setState(body)\n } catch (error) {\n setState(previous => previous === undefined ? previous : {\n ...previous, error: error instanceof Error ? error.message : String(error), retryable: true,\n })\n } finally { setRetrying(false) }\n }\n const destinations = state.destinations ?? []\n const summary = state.summary.replace(/^\u77E5\u8BC6\u5E93\u56DE\u5199\\s*\u00B7\\s*/u, '')\n return <div className=\"dsh-knowledge-writeback-status\" data-status={state.status}>\n <div className=\"dsh-knowledge-writeback-summary\" role={state.status === 'running' ? 'status' : undefined} aria-atomic=\"true\">\n <span>\u77E5\u8BC6\u5E93\u56DE\u5199</span><strong>@lemoncat7/dsh-knowledge</strong><span title={state.error}>{summary}</span>\n {state.status === 'failed' && state.retryable && <button type=\"button\" disabled={retrying} onClick={() => { void retry() }}>{retrying ? '\u91CD\u8BD5\u4E2D\u2026' : '\u91CD\u8BD5'}</button>}\n </div>\n {destinations.length > 0 && <ul className=\"dsh-knowledge-writeback-destinations\" aria-label=\"\u56DE\u5199\u76EE\u6807\">\n {destinations.map((destination, index) => <li key={`${destination.knowledgeBaseId}:${destination.documentId ?? destination.documentTitle}:${index}`}>\n <span>{destination.knowledgeBaseName}</span>\n <strong title={destination.documentPath ?? destination.documentTitle}>{destination.documentPath ?? `\u62DF\u65B0\u5EFA\uFF1A${destination.documentTitle}`}</strong>\n <small data-disposition={destination.disposition}>{destination.disposition === 'written' ? '\u5DF2\u5199\u5165' : '\u5F85\u5BA1\u6838'}</small>\n </li>)}\n </ul>}\n {state.status === 'failed' && state.error && <p className=\"dsh-knowledge-writeback-error\" role=\"alert\">{state.error}</p>}\n </div>\n}\n\nfunction createKnowledgeWorkspaceController(client: ClientContext): KnowledgeWorkspaceController {\n const listeners = new Set<() => void>()\n let disposeWorkspace: (() => void) | undefined\n const notify = (): void => { for (const listener of listeners) listener() }\n const close = (): void => {\n if (disposeWorkspace === undefined) return\n const dispose = disposeWorkspace\n disposeWorkspace = undefined\n dispose()\n notify()\n }\n const controller: KnowledgeWorkspaceController = {\n isOpen: () => disposeWorkspace !== undefined,\n toggle: () => {\n if (disposeWorkspace !== undefined) return close()\n activatePluginWorkspace(PLUGIN_ID)\n const dispose = client.slots.register({ name: 'conversation', priority: -1 }, props => (\n <KnowledgeWorkspace {...props} client={client} workspace={controller} />\n ))\n disposeWorkspace = dispose\n notify()\n },\n close,\n subscribe: listener => {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n },\n }\n return controller\n}\n\nfunction KnowledgeConnectionCard() {\n const [current, setCurrent] = useState<KnowledgeConnectionView>()\n const [loadState, setLoadState] = useState<'loading' | 'ready' | 'error'>('loading')\n const [loadError, setLoadError] = useState('')\n const [open, setOpen] = useState(false)\n const [backend, setBackend] = useState<'local' | 'remote'>('local')\n const [remoteUrl, setRemoteUrl] = useState('')\n const [remoteToken, setRemoteToken] = useState('')\n const [timeout, setTimeoutValue] = useState('10000')\n const [dirty, setDirty] = useState(false)\n const [saving, setSaving] = useState(false)\n const [message, setMessage] = useState<{ kind: 'success' | 'error'; text: string }>()\n\n const load = useCallback(async (signal?: AbortSignal): Promise<void> => {\n setLoadState('loading')\n setLoadError('')\n try {\n const value = await requestConnection('GET', undefined, signal)\n setCurrent(value)\n setLoadState('ready')\n } catch (error) {\n if (signal?.aborted) return\n setLoadError(connectionErrorMessage(error))\n setLoadState('error')\n }\n }, [])\n\n useEffect(() => {\n const controller = new AbortController()\n void load(controller.signal)\n return () => { controller.abort() }\n }, [load])\n\n useEffect(() => {\n if (dirty || current === undefined) return\n setBackend(current.backend)\n setRemoteUrl(current.remoteUrl ?? '')\n setTimeoutValue(String(current.remoteTimeoutMs ?? 10000))\n }, [current, dirty])\n\n const timeoutNumber = Number(timeout)\n const urlError = backend === 'remote' ? validateRemoteUrl(remoteUrl) : undefined\n const tokenError = backend === 'remote' && !current?.tokenConfigured && remoteToken.trim().length === 0\n ? '\u9996\u6B21\u8FDE\u63A5\u5FC5\u987B\u586B\u5199\u5BA2\u6237\u7AEF\u4EE4\u724C\u3002'\n : remoteToken.length > 0 && remoteToken.trim().length < 24 ? '\u4EE4\u724C\u81F3\u5C11\u9700\u8981 24 \u4E2A\u5B57\u7B26\u3002' : undefined\n const timeoutError = !Number.isInteger(timeoutNumber) || timeoutNumber < 100 || timeoutNumber > 120000\n ? '\u8D85\u65F6\u5FC5\u987B\u662F 100 \u5230 120000 \u6BEB\u79D2\u4E4B\u95F4\u7684\u6574\u6570\u3002'\n : undefined\n const invalid = urlError !== undefined || tokenError !== undefined || timeoutError !== undefined\n\n const edit = (action: () => void): void => {\n action()\n setDirty(true)\n setMessage(undefined)\n }\n const reset = (): void => {\n setBackend(current?.backend ?? 'local')\n setRemoteUrl(current?.remoteUrl ?? '')\n setRemoteToken('')\n setTimeoutValue(String(current?.remoteTimeoutMs ?? 10000))\n setDirty(false)\n setMessage(undefined)\n }\n const save = async (): Promise<void> => {\n if (!dirty || invalid || !current?.writable || saving) return\n setSaving(true)\n setMessage(undefined)\n try {\n const next = await requestConnection('PUT', {\n backend,\n remoteTimeoutMs: timeoutNumber,\n ...backend === 'remote' ? { remoteUrl: remoteUrl.trim() } : {},\n ...backend === 'remote' && remoteToken.trim().length > 0 ? { remoteToken: remoteToken.trim() } : {},\n })\n setCurrent(next)\n setRemoteToken('')\n setDirty(false)\n setMessage({\n kind: 'success',\n text: backend === 'remote' ? '\u5DF2\u9A8C\u8BC1\u5E76\u5207\u6362\u81F3\u8FDC\u7A0B\u77E5\u8BC6\u5E93\u3002' : '\u5DF2\u5207\u6362\u81F3\u672C\u5730\u77E5\u8BC6\u5E93\u3002',\n })\n } catch (error) {\n setMessage({ kind: 'error', text: connectionErrorMessage(error) })\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <li className={`dsh-knowledge-settings-card${open ? ' dsh-knowledge-settings-card--open' : ''}`}>\n <button type=\"button\" className=\"dsh-knowledge-settings-header\" aria-expanded={open} onClick={() => { setOpen(value => !value) }}>\n <span><strong>\u77E5\u8BC6\u5E93\u8FDE\u63A5</strong><small>\u9009\u62E9\u672C\u673A\u77E5\u8BC6\u5E93\uFF0C\u6216\u8FDE\u63A5\u4E00\u53F0\u4E2D\u592E DSH \u77E5\u8BC6\u5E93</small></span>\n <span className=\"dsh-knowledge-settings-summary\">{loadState === 'loading' ? '\u8BFB\u53D6\u4E2D' : loadState === 'error' ? '\u8FDE\u63A5\u5165\u53E3' : current?.backend === 'remote' ? '\u8FDC\u7A0B' : '\u672C\u5730'}<i aria-hidden=\"true\" /></span>\n </button>\n {open && <div className=\"dsh-knowledge-settings-body\">\n {loadState === 'loading' ? <p className=\"dsh-knowledge-settings-note\" role=\"status\">\u6B63\u5728\u8BFB\u53D6\u8FDE\u63A5\u914D\u7F6E\u2026</p>\n : loadState === 'error' ? <div className=\"dsh-knowledge-settings-load-error\" role=\"alert\">\n <p>{loadError}</p>\n <button type=\"button\" onClick={() => { void load() }}>\u91CD\u65B0\u8BFB\u53D6</button>\n </div> : <>\n <fieldset className=\"dsh-knowledge-source-picker\">\n <legend>\u77E5\u8BC6\u5E93\u6765\u6E90</legend>\n <label className={backend === 'local' ? 'is-selected' : ''}>\n <input type=\"radio\" name=\"dsh-knowledge-backend\" checked={backend === 'local'} onChange={() => edit(() => { setBackend('local') })} />\n <span><strong>\u672C\u5730</strong><small>\u6570\u636E\u4FDD\u5B58\u5728\u5F53\u524D DSH \u7684 SQLite \u4E2D</small></span>\n </label>\n <label className={`${backend === 'remote' ? 'is-selected' : ''}${!current?.canSwitchRemote ? ' is-disabled' : ''}`}>\n <input type=\"radio\" name=\"dsh-knowledge-backend\" checked={backend === 'remote'} disabled={!current?.canSwitchRemote} onChange={() => edit(() => { setBackend('remote') })} />\n <span><strong>\u8FDC\u7A0B</strong><small>\u53EC\u56DE\u548C\u56DE\u5199\u7EDF\u4E00\u4F7F\u7528\u4E2D\u592E\u77E5\u8BC6\u5E93</small></span>\n </label>\n </fieldset>\n {!current?.canSwitchRemote && <p className=\"dsh-knowledge-settings-note\">\u5F53\u524D\u5B9E\u4F8B\u662F\u4E2D\u592E\u77E5\u8BC6\u5E93\u670D\u52A1\uFF0C\u4E0D\u80FD\u518D\u5207\u6362\u5230\u53E6\u4E00\u53F0\u8FDC\u7A0B\u670D\u52A1\u3002</p>}\n {backend === 'remote' && <div className=\"dsh-knowledge-remote-fields\">\n <label htmlFor=\"dsh-knowledge-remote-url\">\u670D\u52A1\u5668\u5730\u5740\n <input id=\"dsh-knowledge-remote-url\" type=\"url\" value={remoteUrl} placeholder=\"https://example.com/knowledge-api/v1\" autoComplete=\"url\" onChange={event => edit(() => { setRemoteUrl(event.target.value) })} aria-invalid={urlError !== undefined} aria-describedby={urlError ? 'dsh-knowledge-url-error' : undefined} />\n {urlError && <small id=\"dsh-knowledge-url-error\" className=\"dsh-knowledge-field-error\">{urlError}</small>}\n </label>\n <label htmlFor=\"dsh-knowledge-remote-token\">\u5BA2\u6237\u7AEF\u4EE4\u724C\n <input id=\"dsh-knowledge-remote-token\" type=\"password\" value={remoteToken} placeholder={current?.tokenConfigured ? '\u5DF2\u4FDD\u5B58\uFF1B\u7559\u7A7A\u5219\u4FDD\u6301\u4E0D\u53D8' : '\u7C98\u8D34\u5BA2\u6237\u7AEF\u4EE4\u724C'} autoComplete=\"new-password\" onChange={event => edit(() => { setRemoteToken(event.target.value) })} aria-invalid={tokenError !== undefined} aria-describedby=\"dsh-knowledge-token-help\" />\n <small id=\"dsh-knowledge-token-help\" className={tokenError ? 'dsh-knowledge-field-error' : undefined}>{tokenError ?? (current?.tokenConfigured ? '\u4EE4\u724C\u5DF2\u5B89\u5168\u4FDD\u5B58\uFF0C\u9875\u9762\u65E0\u6CD5\u8BFB\u53D6\uFF1B\u8F93\u5165\u65B0\u4EE4\u724C\u53EF\u8986\u76D6\u3002' : '\u4EE4\u724C\u4FDD\u5B58\u540E\u4E0D\u53EF\u8BFB\u53D6\uFF0C\u53EA\u80FD\u8986\u76D6\u3002')}</small>\n </label>\n </div>}\n <label className=\"dsh-knowledge-timeout-field\" htmlFor=\"dsh-knowledge-timeout\">\u8BF7\u6C42\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09\n <input id=\"dsh-knowledge-timeout\" type=\"number\" min=\"100\" max=\"120000\" step=\"100\" value={timeout} onChange={event => edit(() => { setTimeoutValue(event.target.value) })} aria-invalid={timeoutError !== undefined} />\n {timeoutError && <small className=\"dsh-knowledge-field-error\">{timeoutError}</small>}\n </label>\n {!current?.writable && <p className=\"dsh-knowledge-settings-note\">\u5F53\u524D\u63D2\u4EF6\u6CA1\u6709\u914D\u7F6E\u6301\u4E45\u5316\u8DEF\u5F84\uFF0C\u65E0\u6CD5\u4FDD\u5B58\u8FDE\u63A5\u3002</p>}\n {message && <p className={`dsh-knowledge-settings-message is-${message.kind}`} role={message.kind === 'error' ? 'alert' : 'status'} aria-live=\"polite\">{message.text}</p>}\n <div className=\"dsh-knowledge-settings-actions\">\n <button type=\"button\" onClick={reset} disabled={!dirty || saving}>\u653E\u5F03\u66F4\u6539</button>\n <button type=\"button\" className=\"is-primary\" onClick={() => { void save() }} disabled={!dirty || invalid || saving || !current?.writable}>{saving ? '\u6B63\u5728\u9A8C\u8BC1\u2026' : '\u9A8C\u8BC1\u5E76\u8FDE\u63A5'}</button>\n </div>\n </>}\n </div>}\n </li>\n )\n}\n\nfunction validateRemoteUrl(value: string): string | undefined {\n try {\n const url = new URL(value.trim())\n const loopback = url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '::1'\n if (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) return '\u8FDC\u7A0B\u77E5\u8BC6\u5E93\u5FC5\u987B\u4F7F\u7528 HTTPS\u3002'\n return undefined\n } catch { return '\u8BF7\u8F93\u5165\u5B8C\u6574\u7684\u77E5\u8BC6\u5E93 API \u5730\u5740\u3002' }\n}\n\nfunction connectionErrorMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error)\n if (message.includes('Failed to fetch')) return '\u65E0\u6CD5\u8BBF\u95EE\u63D2\u4EF6\u8FDE\u63A5\u63A5\u53E3\uFF0C\u8BF7\u786E\u8BA4\u63D2\u4EF6\u670D\u52A1\u5DF2\u52A0\u8F7D\u3002'\n return message || '\u8FDE\u63A5\u914D\u7F6E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5730\u5740\u3001\u4EE4\u724C\u548C DSH \u65E5\u5FD7\u3002'\n}\n\nasync function requestConnection(\n method: 'GET' | 'PUT',\n body?: Record<string, unknown>,\n signal?: AbortSignal,\n): Promise<KnowledgeConnectionView> {\n const response = await fetch(CONNECTION_CONTROL_PATH, {\n method,\n headers: { accept: 'application/json', ...body === undefined ? {} : { 'content-type': 'application/json' } },\n ...body === undefined ? {} : { body: JSON.stringify(body) },\n ...signal === undefined ? {} : { signal },\n })\n const payload = await response.json().catch(() => undefined) as unknown\n if (!response.ok) {\n const message = payload !== null && typeof payload === 'object' && typeof (payload as { error?: unknown }).error === 'string'\n ? (payload as { error: string }).error\n : `\u8FDE\u63A5\u63A5\u53E3\u8FD4\u56DE HTTP ${response.status}`\n throw new Error(message)\n }\n if (!isConnectionView(payload)) throw new Error('\u63D2\u4EF6\u8FDE\u63A5\u63A5\u53E3\u8FD4\u56DE\u4E86\u65E0\u6548\u6570\u636E\u3002')\n cachedConnectionView = payload\n return payload\n}\n\nfunction isConnectionView(value: unknown): value is KnowledgeConnectionView {\n if (value === null || typeof value !== 'object') return false\n const item = value as Partial<KnowledgeConnectionView>\n return (item.backend === 'local' || item.backend === 'remote')\n && Number.isInteger(item.remoteTimeoutMs)\n && typeof item.tokenConfigured === 'boolean'\n && typeof item.canSwitchRemote === 'boolean'\n && typeof item.writable === 'boolean'\n && typeof item.managementAvailable === 'boolean'\n && (!item.managementAvailable || isManagementPath(item.managementPath))\n}\n\nfunction isManagementPath(value: unknown): value is string {\n return typeof value === 'string' && value.startsWith('/') && !value.startsWith('//')\n}\n\nfunction KnowledgeLauncher({ wide, workspace }: SidebarActionProps & { workspace: KnowledgeWorkspaceController }) {\n const [open, setOpen] = useState(workspace.isOpen())\n\n useEffect(() => workspace.subscribe(() => { setOpen(workspace.isOpen()) }), [workspace])\n\n return (\n <button\n type=\"button\"\n className={`dsh-knowledge-trigger${wide ? '' : ' dsh-knowledge-trigger--rail'}${open ? ' is-active' : ''}`}\n aria-label={open ? '\u8FD4\u56DE\u5BF9\u8BDD' : '\u77E5\u8BC6\u5E93'}\n aria-pressed={open}\n title={wide ? undefined : open ? '\u8FD4\u56DE\u5BF9\u8BDD' : '\u77E5\u8BC6\u5E93'}\n onClick={() => { workspace.toggle() }}\n >\n <IconDataOutline16 size={wide ? 16 : 18} />\n {wide && <span>{open ? '\u8FD4\u56DE\u5BF9\u8BDD' : '\u77E5\u8BC6\u5E93'}</span>}\n </button>\n )\n}\n\nfunction KnowledgeWorkspace({\n sessionId,\n useSessions,\n client,\n workspace,\n}: ConversationSlotProps & { client: ClientContext; workspace: KnowledgeWorkspaceController }) {\n const cachedManagementPath = cachedConnectionView?.managementAvailable ? cachedConnectionView.managementPath : undefined\n const [panelState, setPanelState] = useState<'loading' | 'ready' | 'unavailable' | 'error'>(cachedConnectionView === undefined ? 'loading' : cachedManagementPath === undefined ? 'unavailable' : 'ready')\n const [managementPath, setManagementPath] = useState<string | undefined>(cachedManagementPath)\n const [panelError, setPanelError] = useState('')\n const projectId = useSessions(state => sessionId === undefined ? undefined : state.byId[sessionId]?.cwd)\n const knowledgeUrl = managementPath === undefined ? undefined : knowledgePanelUrl(managementPath, sessionId, projectId)\n const frame = useRef<HTMLIFrameElement | null>(null)\n const themeFrame = useRef(0)\n\n const loadManagement = useCallback(async (background = false): Promise<void> => {\n if (!background) setPanelState('loading')\n setPanelError('')\n try {\n const connection = await requestConnection('GET')\n if (!connection.managementAvailable || connection.managementPath === undefined) {\n setManagementPath(undefined)\n setPanelState('unavailable')\n return\n }\n setManagementPath(connection.managementPath)\n setPanelState('ready')\n } catch (error) {\n setManagementPath(undefined)\n setPanelError(connectionErrorMessage(error))\n setPanelState('error')\n }\n }, [])\n\n useEffect(() => {\n void loadManagement(cachedConnectionView !== undefined)\n }, [loadManagement])\n\n const sendTheme = useCallback((): void => {\n const currentFrame = frame.current\n if (currentFrame === null) return\n const target = currentFrame.contentWindow\n if (target === null) return\n const computed = getComputedStyle(document.body)\n target.postMessage(\n createKnowledgeHostTheme(computed, client.theme.getTheme()),\n frameOrigin(currentFrame) ?? '*',\n )\n }, [client])\n\n const scheduleTheme = useCallback((): void => {\n if (themeFrame.current !== 0) window.cancelAnimationFrame(themeFrame.current)\n themeFrame.current = window.requestAnimationFrame(() => {\n themeFrame.current = 0\n sendTheme()\n })\n }, [sendTheme])\n\n useEffect(() => {\n const off = client.on('theme/change', scheduleTheme)\n const onMessage = (event: MessageEvent): void => {\n const currentFrame = frame.current\n if (event.source !== currentFrame?.contentWindow) return\n const expectedOrigin = frameOrigin(currentFrame)\n if (expectedOrigin !== undefined && event.origin !== expectedOrigin) return\n const data = event.data as { type?: unknown; version?: unknown } | null\n if (data?.type === KNOWLEDGE_THEME_READY_MESSAGE && data.version === KNOWLEDGE_THEME_PROTOCOL_VERSION) sendTheme()\n }\n window.addEventListener('message', onMessage)\n scheduleTheme()\n return () => {\n off()\n window.removeEventListener('message', onMessage)\n if (themeFrame.current !== 0) window.cancelAnimationFrame(themeFrame.current)\n }\n }, [client, scheduleTheme, sendTheme])\n\n return (\n <section className=\"dsh-knowledge-workspace\" data-xiaohei-surface=\"plugin-workspace\" aria-labelledby=\"dsh-knowledge-workspace-title\">\n <header className=\"dsh-knowledge-workspace-header\">\n <div>\n <button type=\"button\" data-xiaohei-workspace-close onClick={workspace.close} aria-label=\"\u8FD4\u56DE\u4F1A\u8BDD\" title=\"\u8FD4\u56DE\u4F1A\u8BDD\"><IconChevronLeftOutline14 size={15} /></button>\n <IconDataOutline16 size={18} />\n <span><h2 id=\"dsh-knowledge-workspace-title\">\u77E5\u8BC6\u5E93</h2><p>\u6587\u6863\u3001\u5BA1\u6838\u3001\u6302\u8F7D\u4E0E\u8BBF\u95EE\u7BA1\u7406</p></span>\n </div>\n </header>\n {panelState === 'ready' && knowledgeUrl !== undefined\n ? <iframe ref={frame} className=\"dsh-knowledge-frame\" src={knowledgeUrl} title=\"\u77E5\u8BC6\u5E93\u7BA1\u7406\u53F0\" onLoad={sendTheme} />\n : <div className=\"dsh-knowledge-panel-state\" role={panelState === 'error' ? 'alert' : 'status'} aria-live=\"polite\">\n <span className=\"dsh-knowledge-panel-state-icon\" aria-hidden=\"true\">{panelState === 'loading' ? '\u00B7\u00B7\u00B7' : panelState === 'error' ? '!' : '\u2014'}</span>\n <div>\n <h3>{panelState === 'loading' ? '\u6B63\u5728\u6253\u5F00\u77E5\u8BC6\u5E93\u2026' : panelState === 'error' ? '\u6682\u65F6\u65E0\u6CD5\u6253\u5F00\u77E5\u8BC6\u5E93' : '\u8FD9\u53F0 DSH \u672A\u542F\u7528\u77E5\u8BC6\u5E93\u7BA1\u7406\u53F0'}</h3>\n <p>{panelState === 'loading'\n ? '\u6B63\u5728\u786E\u8BA4\u5F53\u524D\u5B9E\u4F8B\u662F\u5426\u63D0\u4F9B\u7BA1\u7406\u9875\u9762\u3002'\n : panelState === 'error'\n ? panelError\n : '\u672C\u5730\u53EC\u56DE\u548C\u56DE\u5199\u4ECD\u53EF\u4F7F\u7528\u3002\u5F53\u524D profile \u5DF2\u663E\u5F0F\u5173\u95ED exposeWeb\uFF1B\u91CD\u65B0\u542F\u7528\u540E\u5373\u53EF\u5728\u8FD9\u91CC\u7BA1\u7406\u3002\u4F7F\u7528\u8FDC\u7A0B\u77E5\u8BC6\u5E93\u65F6\uFF0C\u8BF7\u524D\u5F80\u4E2D\u592E DSH \u7684\u77E5\u8BC6\u5E93\u7BA1\u7406\u53F0\u3002'}</p>\n {panelState === 'error' && <button type=\"button\" onClick={() => { void loadManagement() }}>\u91CD\u8BD5</button>}\n </div>\n </div>}\n </section>\n )\n}\n\nfunction knowledgePanelUrl(managementPath: string, sessionId?: string, projectId?: string): string {\n const params = new URLSearchParams()\n if (sessionId !== undefined) params.set('sessionId', sessionId)\n if (projectId !== undefined) params.set('projectId', projectId)\n const query = params.toString()\n return query.length === 0 ? managementPath : `${managementPath}${managementPath.includes('?') ? '&' : '?'}${query}`\n}\n\nfunction frameOrigin(frame: HTMLIFrameElement): string | undefined {\n try {\n const origin = new URL(frame.src).origin\n return origin === 'null' ? undefined : origin\n } catch {\n return undefined\n }\n}\n\nfunction installStyles(): () => void {\n const previous = document.querySelector<HTMLStyleElement>(`style[data-plugin-css=\"${STYLE_ID}\"]`)\n previous?.remove()\n const style = document.createElement('style')\n style.dataset.plugin = PLUGIN_ID\n style.dataset.pluginCss = STYLE_ID\n style.textContent = cssText\n document.head.appendChild(style)\n return () => { style.remove() }\n}\n", "const WORKSPACE_ACTIVATE_EVENT = '@lemoncat7/dsh-plugin-ui/workspace-activate'\n\ninterface WorkspaceActivateDetail {\n pluginId: string\n}\n\n/** Claim the conversation workspace while remaining compatible with installed plugin versions. */\nexport function activatePluginWorkspace(pluginId: string): void {\n window.dispatchEvent(new CustomEvent<WorkspaceActivateDetail>(WORKSPACE_ACTIVATE_EVENT, {\n detail: { pluginId },\n }))\n}\n\n/** Close this workspace when another plugin claims the conversation area. */\nexport function observePluginWorkspace(pluginId: string, close: () => void): () => void {\n const onActivate = (event: Event): void => {\n const detail = (event as CustomEvent<WorkspaceActivateDetail>).detail\n if (detail?.pluginId !== pluginId) close()\n }\n window.addEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n return () => window.removeEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n}\n", ".dsh-knowledge-trigger,\n.dsh-knowledge-workspace,\n.dsh-knowledge-settings-card,\n.dsh-knowledge-writeback-status {\n --knowledge-accent: #3a3a3c;\n --knowledge-on-accent: #fff;\n --knowledge-danger: #d70015;\n --knowledge-success: #248a3d;\n --knowledge-pane: rgb(242 243 247 / 78%);\n --knowledge-raised: #fff;\n --knowledge-control: rgb(255 255 255 / 82%);\n --knowledge-border: rgb(60 60 67 / 14%);\n --knowledge-text: #1d1d1f;\n --knowledge-text-secondary: #515154;\n --knowledge-hover: rgba(118, 118, 128, .1);\n --knowledge-glare-light: rgb(255 255 255 / 82%);\n --knowledge-glare-rim: rgb(60 60 67 / 15%);\n --knowledge-glass-filter: saturate(1.18) contrast(1.025) blur(28px);\n --knowledge-glass-shadow: inset 0 1px 0 rgb(255 255 255 / 58%), inset 0 -1px 0 rgb(60 60 67 / 12%);\n}\n\nbody[data-ds-dark-theme] :is(\n .dsh-knowledge-trigger,\n .dsh-knowledge-workspace,\n .dsh-knowledge-settings-card,\n .dsh-knowledge-writeback-status\n) {\n --knowledge-accent: #e5e5ea;\n --knowledge-on-accent: #1d1d1f;\n --knowledge-danger: #ff453a;\n --knowledge-success: #30d158;\n --knowledge-pane: rgb(8 10 12 / 19%);\n --knowledge-raised: rgb(10 12 15 / 44%);\n --knowledge-control: rgb(255 255 255 / 7%);\n --knowledge-border: rgb(255 255 255 / 10%);\n --knowledge-text: #f5f5f7;\n --knowledge-text-secondary: #d1d1d6;\n --knowledge-hover: rgb(255 255 255 / 8%);\n --knowledge-glare-light: rgb(255 255 255 / 42%);\n --knowledge-glare-rim: rgb(0 0 0 / 24%);\n --knowledge-glass-shadow: inset 0 1px 0 rgb(255 255 255 / 18%), inset 0 -1px 0 rgb(0 0 0 / 30%);\n}\n\n.dsh-knowledge-trigger,\n.dsh-knowledge-panel-state button,\n.dsh-knowledge-settings-card button,\n.dsh-knowledge-writeback-status button {\n -webkit-appearance: none;\n appearance: none;\n margin: 0;\n}\n\n.dsh-knowledge-trigger {\n position: relative;\n flex: none;\n min-width: 0;\n max-width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n height: 34px;\n margin: 4px 0;\n padding: 6px 8px 6px 10px;\n box-sizing: border-box;\n border: 0;\n border-radius: 12px;\n overflow: hidden;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n white-space: nowrap;\n isolation: isolate;\n transition:\n color 120ms ease,\n background-color 120ms ease,\n box-shadow 160ms ease;\n}\n\n.dsh-knowledge-trigger:hover {\n background: var(--knowledge-hover);\n}\n\n.dsh-knowledge-trigger > * {\n position: relative;\n z-index: 1;\n}\n\n.dsh-knowledge-trigger::before {\n position: absolute;\n z-index: 0;\n top: -55%;\n bottom: -55%;\n left: -64%;\n width: 52%;\n border-radius: 45%;\n background: linear-gradient(\n 90deg,\n transparent,\n color-mix(in srgb, var(--knowledge-glare-light) 76%, transparent) 50%,\n color-mix(in srgb, var(--knowledge-glare-rim) 18%, transparent) 63%,\n transparent\n );\n opacity: 0;\n transform: skewX(-18deg) translate3d(0, 0, 0);\n pointer-events: none;\n transition:\n opacity 150ms ease-out,\n transform 720ms cubic-bezier(.2, .72, .2, 1);\n content: \"\";\n}\n\n.dsh-knowledge-trigger:hover::before {\n opacity: .96;\n transform: skewX(-18deg) translate3d(320%, 0, 0);\n}\n\n.dsh-knowledge-trigger:focus-visible,\n.dsh-knowledge-writeback-status button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n\n.dsh-knowledge-trigger.is-active {\n background: var(--knowledge-control);\n color: var(--knowledge-text);\n box-shadow: 0 1px 2px rgb(0 0 0 / 7%), inset 0 1px 0 rgb(255 255 255 / 28%);\n}\n\n.dsh-knowledge-trigger--rail {\n width: 36px;\n height: 36px;\n margin: 8px 0 4px;\n padding: 0;\n justify-content: center;\n gap: 0;\n border-radius: 50%;\n}\n\n/* Rail (collapsed) mode: the host footer seat is a horizontal row sized for a\n single 36px circle per entry; with several entries it overflows the 56px\n rail and the circles drift off the settings axis. Stack the entries\n vertically, centered on the same axis as the settings circle. The --rail\n class on the knowledge trigger is the collapsed-mode signal, so wide mode\n is untouched. */\ndiv:has(> div[data-slot=\"sidebar.footer.action\"] .dsh-knowledge-trigger--rail) {\n flex-direction: column;\n align-items: center;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-knowledge-trigger,\n .dsh-knowledge-trigger::before { transition: none; }\n .dsh-knowledge-trigger::before { display: none; }\n}\n\n.dsh-knowledge-workspace {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: transparent;\n}\n\n.dsh-knowledge-workspace-header {\n position: relative;\n z-index: 2;\n flex: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n min-height: 52px;\n margin: 8px 10px 0;\n padding: 7px 14px;\n box-sizing: border-box;\n border: 1px solid var(--knowledge-border);\n border-radius: 14px 14px 11px 11px;\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--knowledge-glare-light) 20%, transparent), transparent 58%),\n var(--knowledge-pane);\n box-shadow: var(--knowledge-glass-shadow);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n}\n\n.dsh-knowledge-workspace-header > div {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close] {\n -webkit-appearance: none;\n appearance: none;\n display: grid;\n place-items: center;\n box-sizing: border-box;\n flex: none;\n width: 30px;\n height: 30px;\n margin: 0;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 9px;\n color: var(--knowledge-text-secondary);\n background: transparent;\n font: inherit;\n line-height: 1;\n -webkit-tap-highlight-color: transparent;\n cursor: pointer;\n transition: color 140ms ease, background 140ms ease, border-color 140ms ease, transform 140ms ease;\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:hover {\n border-color: var(--knowledge-border);\n color: var(--knowledge-text);\n background: var(--knowledge-control);\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:active { transform: scale(.96); }\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close] > svg {\n display: block;\n pointer-events: none;\n}\n\n.dsh-knowledge-workspace-header > div > span {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.dsh-knowledge-workspace-header h2,\n.dsh-knowledge-workspace-header p {\n margin: 0;\n}\n\n.dsh-knowledge-workspace-header h2 {\n color: var(--knowledge-text);\n font-size: 15px;\n line-height: 22px;\n font-weight: 600;\n}\n\n.dsh-knowledge-workspace-header p {\n color: var(--knowledge-text-secondary);\n font-size: 11px;\n line-height: 16px;\n}\n\n.dsh-knowledge-frame {\n flex: 1;\n display: block;\n width: 100%;\n min-height: 0;\n margin: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n}\n\n.dsh-knowledge-panel-state {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n min-height: 0;\n margin: 8px 10px 10px;\n padding: 32px;\n box-sizing: border-box;\n border: 1px solid var(--knowledge-border);\n border-radius: 15px;\n background: var(--knowledge-pane);\n box-shadow: var(--knowledge-glass-shadow);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n color: var(--dsw-alias-label-primary, #171719);\n}\n\n.dsh-knowledge-panel-state-icon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: 12px;\n background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, .1));\n color: var(--dsw-alias-label-secondary, #68686f);\n font-size: 18px;\n font-weight: 600;\n}\n\n.dsh-knowledge-panel-state > div { max-width: 560px; }\n.dsh-knowledge-panel-state h3 { margin: 0 0 6px; font-size: 17px; line-height: 24px; font-weight: 600; }\n.dsh-knowledge-panel-state p { margin: 0; color: var(--dsw-alias-label-secondary, #68686f); font-size: 13px; line-height: 20px; }\n.dsh-knowledge-panel-state button {\n min-width: 72px;\n min-height: 32px;\n margin-top: 16px;\n padding: 6px 14px;\n border: 0;\n border-radius: 10px;\n background: var(--knowledge-accent);\n color: var(--knowledge-on-accent);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-panel-state button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n\n.dsh-knowledge-settings-card {\n list-style: none;\n overflow: hidden;\n border: 1px solid var(--knowledge-border);\n border-radius: 14px;\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--knowledge-glare-light) 16%, transparent), transparent 58%),\n var(--knowledge-pane);\n color: var(--dsw-alias-label-primary, #171719);\n box-shadow: var(--knowledge-glass-shadow), 0 8px 24px rgb(0 0 0 / 5%);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n transition: border-color .16s, background .16s, box-shadow .2s, transform .2s cubic-bezier(.22, 1, .36, 1);\n}\n.dsh-knowledge-settings-card:hover {\n border-color: color-mix(in srgb, var(--knowledge-border) 68%, var(--knowledge-text-secondary));\n box-shadow: var(--knowledge-glass-shadow), 0 12px 30px rgb(0 0 0 / 8%);\n transform: translateY(-1px);\n}\n.dsh-knowledge-settings-card--open {\n border-color: color-mix(in srgb, var(--knowledge-border) 68%, var(--knowledge-text-secondary));\n background: var(--knowledge-pane);\n}\n.dsh-knowledge-settings-header { display: flex; width: 100%; align-items: center; gap: 12px; padding: 14px 16px; border: 0; border-radius: 12px; background: transparent; color: inherit; text-align: left; cursor: pointer; font: inherit; }\n.dsh-knowledge-settings-header:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: -2px;\n}\n.dsh-knowledge-settings-actions button:focus-visible,\n.dsh-knowledge-settings-load-error button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-settings-header > span:first-child { display: flex; min-width: 0; flex: 1; flex-direction: column; gap: 4px; }\n.dsh-knowledge-settings-header strong { font-size: 15px; font-weight: 600; line-height: 1.4; }\n.dsh-knowledge-settings-header small { color: var(--dsw-alias-label-tertiary); font-size: 13px; line-height: 1.5; }\n.dsh-knowledge-source-picker small,\n.dsh-knowledge-remote-fields small { color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-settings-summary { display: flex; flex: none; align-items: center; gap: 10px; color: var(--dsw-alias-label-tertiary); font-size: 12px; }\n.dsh-knowledge-settings-summary i { width: 8px; height: 8px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: rotate(45deg); transition: transform 160ms ease; }\n.dsh-knowledge-settings-card--open .dsh-knowledge-settings-summary i { transform: rotate(225deg); }\n\n.dsh-knowledge-settings-body {\n display: grid;\n gap: 18px;\n margin: 0 16px;\n padding-bottom: 8px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n}\n\n.dsh-knowledge-source-picker {\n min-width: 0;\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n margin: 18px 0 0;\n padding: 0;\n border: 0;\n}\n\n.dsh-knowledge-source-picker legend { margin-bottom: 8px; padding: 0; color: inherit; font-size: 13px; font-weight: 600; }\n.dsh-knowledge-source-picker label {\n display: flex;\n gap: 10px;\n padding: 13px;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .2));\n border-radius: 14px;\n cursor: pointer;\n}\n.dsh-knowledge-source-picker label.is-selected {\n border-color: var(--knowledge-accent);\n background: color-mix(in srgb, var(--knowledge-accent) 7%, transparent);\n}\n.dsh-knowledge-source-picker label.is-disabled {\n cursor: default;\n opacity: .55;\n}\n.dsh-knowledge-source-picker label:focus-within {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-source-picker input {\n -webkit-appearance: none;\n appearance: none;\n width: 16px;\n height: 16px;\n display: inline-grid;\n place-content: center;\n flex: none;\n margin: 2px 0 0;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .34));\n border-radius: 50%;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff));\n color: var(--knowledge-on-accent);\n cursor: pointer;\n transition: border-color .15s ease, background-color .15s ease;\n}\n.dsh-knowledge-source-picker input::before {\n content: \"\";\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n opacity: 0;\n transform: scale(.55);\n transition: opacity .12s ease, transform .15s cubic-bezier(.2, .8, .2, 1);\n}\n.dsh-knowledge-source-picker input:checked { border-color: var(--knowledge-accent); background: var(--knowledge-accent); }\n.dsh-knowledge-source-picker input:checked::before { opacity: 1; transform: scale(1); }\n.dsh-knowledge-source-picker input:disabled { cursor: default; }\n.dsh-knowledge-source-picker span { display: grid; gap: 3px; }\n\n.dsh-knowledge-remote-fields { display: grid; grid-template-columns: 1.25fr 1fr; gap: 12px; }\n.dsh-knowledge-remote-fields label,\n.dsh-knowledge-timeout-field { display: grid; gap: 6px; color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-remote-fields input,\n.dsh-knowledge-timeout-field input {\n -webkit-appearance: none;\n appearance: none;\n min-height: 38px;\n box-sizing: border-box;\n padding: 8px 11px;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .25));\n border-radius: 10px;\n outline: none;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff));\n color: var(--dsw-alias-label-primary, #171719);\n font: inherit;\n}\n.dsh-knowledge-remote-fields input:focus,\n.dsh-knowledge-timeout-field input:focus { border-color: var(--knowledge-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--knowledge-accent) 16%, transparent); }\n.dsh-knowledge-remote-fields input:-webkit-autofill,\n.dsh-knowledge-remote-fields input:-webkit-autofill:hover,\n.dsh-knowledge-remote-fields input:-webkit-autofill:focus {\n -webkit-text-fill-color: var(--dsw-alias-label-primary, #171719);\n box-shadow: 0 0 0 1000px var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff)) inset;\n caret-color: var(--dsw-alias-label-primary, #171719);\n}\n.dsh-knowledge-timeout-field input::-webkit-inner-spin-button,\n.dsh-knowledge-timeout-field input::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }\n.dsh-knowledge-timeout-field { max-width: 240px; }\n.dsh-knowledge-field-error { color: var(--knowledge-danger) !important; }\n\n.dsh-knowledge-settings-message,\n.dsh-knowledge-settings-note { margin: 0; color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-settings-message.is-success { color: var(--knowledge-success); }\n.dsh-knowledge-settings-message.is-error { color: var(--knowledge-danger); }\n.dsh-knowledge-settings-load-error {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-top: 18px;\n padding: 12px 14px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--knowledge-danger) 8%, transparent);\n color: var(--knowledge-danger);\n font-size: 13px;\n}\n.dsh-knowledge-settings-load-error p { margin: 0; }\n.dsh-knowledge-settings-load-error button {\n flex: none;\n min-height: 30px;\n padding: 5px 10px;\n border: 0;\n border-radius: 9px;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-2, #fff));\n color: var(--dsw-alias-label-primary, #171719);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-settings-actions { display: flex; justify-content: flex-end; gap: 8px; }\n.dsh-knowledge-settings-actions button {\n min-height: 34px;\n padding: 7px 13px;\n border: 0;\n border-radius: 10px;\n background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, .1));\n color: var(--dsw-alias-label-primary, #171719);\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n}\n.dsh-knowledge-settings-actions button.is-primary { background: var(--knowledge-accent); color: var(--knowledge-on-accent); }\n.dsh-knowledge-settings-actions button:disabled { cursor: default; opacity: .45; }\n\n@media (max-width: 720px) {\n .dsh-knowledge-source-picker,\n .dsh-knowledge-remote-fields { grid-template-columns: 1fr; }\n .dsh-knowledge-settings-summary { font-size: 0; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-knowledge-settings-card,\n .dsh-knowledge-settings-header,\n .dsh-knowledge-settings-summary i { transition: none; }\n}\n\n.dsh-knowledge-writeback-status {\n display: grid;\n gap: 5px;\n min-width: 0;\n color: var(--dsw-alias-label-tertiary, #6b7280);\n font-size: 12px;\n line-height: 1.5;\n}\n.dsh-knowledge-writeback-summary {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n min-width: 0;\n}\n.dsh-knowledge-writeback-status strong {\n color: var(--dsw-alias-label-secondary, #374151);\n font-weight: 600;\n}\n.dsh-knowledge-writeback-status button {\n min-height: 24px;\n padding: 0 9px;\n border: 1px solid var(--dsw-alias-separator, #d1d5db);\n border-radius: 7px;\n color: var(--dsw-alias-label-secondary, #374151);\n background: var(--dsw-alias-button-elevated-fill, #fff);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-writeback-status button:disabled { cursor: default; opacity: .5; }\n.dsh-knowledge-writeback-destinations {\n display: flex;\n flex-wrap: wrap;\n gap: 5px 8px;\n min-width: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.dsh-knowledge-writeback-destinations li {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n max-width: 100%;\n padding: 2px 7px;\n border: 1px solid var(--knowledge-border);\n border-radius: 7px;\n background: var(--knowledge-control);\n}\n.dsh-knowledge-writeback-destinations li > span::after {\n margin-left: 5px;\n color: var(--dsw-alias-label-quaternary, #9ca3af);\n content: \"/\";\n}\n.dsh-knowledge-writeback-destinations strong {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.dsh-knowledge-writeback-destinations small {\n flex: none;\n color: var(--dsw-alias-label-secondary, #374151);\n font: inherit;\n white-space: nowrap;\n}\n.dsh-knowledge-writeback-destinations small[data-disposition=\"written\"] { color: var(--knowledge-success); }\n.dsh-knowledge-writeback-error {\n max-width: min(720px, 100%);\n margin: 0;\n color: var(--knowledge-danger);\n overflow-wrap: anywhere;\n}\n", "/** Host settings namespace that makes the knowledge connection card discoverable. */\nexport const KNOWLEDGE_SETTINGS_NAMESPACE = 'dsh-knowledge-connection'\n", "export const KNOWLEDGE_THEME_MESSAGE = '@lemoncat7/dsh-knowledge/host-theme'\nexport const KNOWLEDGE_THEME_READY_MESSAGE = '@lemoncat7/dsh-knowledge/host-theme-ready'\nexport const KNOWLEDGE_THEME_PROTOCOL_VERSION = 1\n\nexport type KnowledgeColorScheme = 'light' | 'dark'\n\nexport interface KnowledgeHostThemeMessage {\n type: typeof KNOWLEDGE_THEME_MESSAGE\n version: typeof KNOWLEDGE_THEME_PROTOCOL_VERSION\n colorScheme: KnowledgeColorScheme\n tokens: Record<string, string>\n}\n\nexport interface ThemeSnapshotLike {\n active: {\n colorScheme: KnowledgeColorScheme\n tokens: Readonly<Record<string, string>>\n }\n}\n\ninterface ComputedStyleLike {\n getPropertyValue(name: string): string\n}\n\n/**\n * The management console lives in its own iframe and therefore owns its\n * component palette. Only the host colour scheme crosses that boundary.\n * Keeping these tokens stable prevents a branded host accent from changing\n * editor selection, navigation and dialog hierarchy independently.\n */\nconst WORKSPACE_TOKENS: Record<KnowledgeColorScheme, Readonly<Record<string, string>>> = {\n light: {\n '--bg': '#e9e9ed', '--surface': '#f2f3f7', '--surface-raised': '#ffffff',\n '--surface-soft': '#eceef1', '--surface-hover': '#e5e5e7', '--dialog-surface': '#ffffff',\n '--text': '#1d1d1f', '--text-secondary': '#515154', '--text-tertiary': '#6e6e73',\n '--border': 'rgb(60 60 67 / 14%)', '--border-strong': 'rgb(60 60 67 / 24%)',\n '--accent': '#3a3a3c', '--accent-hover': '#1d1d1f', '--accent-soft': '#e2e2e5', '--on-accent': '#ffffff',\n '--success': '#248a3d', '--success-soft': '#e8f5eb', '--warning': '#c93400', '--warning-soft': '#fff1e8',\n '--danger': '#d70015', '--danger-soft': '#ffebed', '--shadow': '0 24px 64px rgb(0 0 0 / 20%)',\n },\n dark: {\n '--bg': 'transparent', '--surface': 'rgb(8 10 12 / 20%)', '--surface-raised': 'rgb(10 12 15 / 44%)',\n '--surface-soft': 'rgb(255 255 255 / 6%)', '--surface-hover': 'rgb(255 255 255 / 7.5%)', '--dialog-surface': 'rgb(10 12 15 / 72%)',\n '--text': '#f5f5f7', '--text-secondary': '#d1d1d6', '--text-tertiary': '#98989d',\n '--border': 'rgb(255 255 255 / 10%)', '--border-strong': 'rgb(255 255 255 / 18%)',\n '--accent': '#e5e5ea', '--accent-hover': '#ffffff', '--accent-soft': 'rgb(255 255 255 / 9%)', '--on-accent': '#1d1d1f',\n '--success': '#30d158', '--success-soft': 'rgb(48 209 88 / 13%)', '--warning': '#ff9f0a', '--warning-soft': 'rgb(255 159 10 / 13%)',\n '--danger': '#ff453a', '--danger-soft': 'rgb(255 69 58 / 14%)', '--shadow': '0 28px 72px rgb(0 0 0 / 42%)',\n },\n}\n\n/** Synchronise host light/dark mode while preserving one coherent workspace palette. */\nexport function createKnowledgeHostTheme(\n _computed: ComputedStyleLike,\n snapshot: ThemeSnapshotLike,\n): KnowledgeHostThemeMessage {\n return {\n type: KNOWLEDGE_THEME_MESSAGE,\n version: KNOWLEDGE_THEME_PROTOCOL_VERSION,\n colorScheme: snapshot.active.colorScheme,\n tokens: { ...WORKSPACE_TOKENS[snapshot.active.colorScheme] },\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type { PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-theme/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { activatePluginWorkspace, observePluginWorkspace } from './workspace-ownership.js'\nimport {\n IconChevronLeftOutline14, IconDataOutline16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport cssText from './client.css'\nimport { KNOWLEDGE_SETTINGS_NAMESPACE } from './constants.js'\nimport {\n createKnowledgeHostTheme,\n KNOWLEDGE_THEME_PROTOCOL_VERSION,\n KNOWLEDGE_THEME_READY_MESSAGE,\n type ThemeSnapshotLike,\n} from './theme-bridge.js'\n\nconst PLUGIN_ID = '@lemoncat7/dsh-knowledge'\nconst STYLE_ID = `${PLUGIN_ID}/client`\n\ntype SidebarActionProps = PropsRuntime<'sidebar.footer.action'>\ntype ConversationSlotProps = PropsRuntime<'conversation'>\n\ninterface KnowledgeConnectionView {\n backend: 'local' | 'remote'\n remoteUrl?: string\n remoteTimeoutMs: number\n tokenConfigured: boolean\n canSwitchRemote: boolean\n writable: boolean\n managementAvailable: boolean\n managementPath?: string\n}\n\ninterface KnowledgeWorkspaceController {\n isOpen(): boolean\n toggle(): void\n openDocument(target: KnowledgeDocumentTarget): void\n currentTarget(): KnowledgeDocumentTarget | undefined\n close(): void\n subscribe(listener: () => void): () => void\n}\n\ninterface KnowledgeDocumentTarget {\n knowledgeBaseId: string\n documentId: string\n}\n\ninterface WritebackDestinationView {\n knowledgeBaseId: string\n knowledgeBaseName: string\n documentId?: string\n documentTitle: string\n documentPath?: string\n disposition: 'written' | 'pending-review'\n}\n\ninterface WritebackStatusView {\n status: 'running' | 'completed' | 'failed'\n summary: string\n error?: string\n retryable: boolean\n destinations?: WritebackDestinationView[]\n}\n\nconst CONNECTION_CONTROL_PATH = '/knowledge-control/v1/connection'\nlet cachedConnectionView: KnowledgeConnectionView | undefined\n\n/** Cordis services needed by the browser half. */\nexport const inject = ['slots', 'theme']\n\n/** Register the knowledge launcher in the sidebar's official extension slot. */\nexport function apply(ctx: ClientContext): void {\n ctx.effect(installStyles, 'dsh-knowledge: client styles')\n const workspace = createKnowledgeWorkspaceController(ctx)\n ctx.effect(() => observePluginWorkspace(PLUGIN_ID, workspace.close), 'dsh-knowledge: exclusive workspace')\n ctx.effect(() => () => { workspace.close() }, 'dsh-knowledge: workspace lifecycle')\n ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action',\n id: 'knowledge',\n order: -10,\n }, props => <KnowledgeLauncher {...props} workspace={workspace} />))\n\n ctx.slots.inject('settings.plugin.item', () => ctx.slots.register({\n name: 'settings.plugin.item',\n key: KNOWLEDGE_SETTINGS_NAMESPACE,\n }, KnowledgeConnectionCard))\n\n ctx.slots.inject('conversation.chat.turnTail', () => ctx.slots.register({\n name: 'conversation.chat.turnTail',\n select: owner => ({ turn: owner.turn.turn }),\n }, props => <KnowledgeWritebackStatus sessionId={String(props.sessionId)} turn={props.matched.turn} workspace={workspace} />))\n}\n\nfunction KnowledgeWritebackStatus({\n sessionId,\n turn,\n workspace,\n}: { sessionId: string; turn: number; workspace: KnowledgeWorkspaceController }) {\n const [state, setState] = useState<WritebackStatusView>()\n const [retrying, setRetrying] = useState(false)\n useEffect(() => {\n const controller = new AbortController()\n let timer: ReturnType<typeof setTimeout> | undefined\n let missingAttempts = 0\n const schedule = (delay: number): void => {\n if (!controller.signal.aborted) timer = setTimeout(() => { void load() }, delay)\n }\n const load = async (): Promise<void> => {\n try {\n const response = await fetch(`/knowledge-control/v1/writeback-status?sessionId=${encodeURIComponent(sessionId)}&turn=${turn}`, {\n headers: { accept: 'application/json', 'x-dsh-knowledge-client': 'conversation-web' }, signal: controller.signal,\n })\n if (response.ok) {\n const value = await response.json() as WritebackStatusView\n if (value.summary) setState(value)\n if (value.status === 'running') schedule(1_500)\n return\n }\n if (response.status === 404 && missingAttempts < 3) {\n missingAttempts += 1\n schedule(1_500)\n }\n } catch {\n if (!controller.signal.aborted && missingAttempts < 3) {\n missingAttempts += 1\n schedule(2_000)\n }\n }\n }\n void load()\n return () => { controller.abort(); if (timer !== undefined) clearTimeout(timer) }\n }, [sessionId, turn])\n if (state === undefined) return null\n const retry = async (): Promise<void> => {\n setRetrying(true)\n try {\n const response = await fetch(`/knowledge-control/v1/writeback-status?sessionId=${encodeURIComponent(sessionId)}&turn=${turn}`, {\n method: 'POST', headers: { accept: 'application/json', 'x-dsh-knowledge-client': 'conversation-web' },\n })\n const body = await response.json().catch(() => ({})) as WritebackStatusView & { error?: string }\n if (!response.ok) throw new Error(body.error ?? `retry failed with HTTP ${response.status}`)\n setState(body)\n } catch (error) {\n setState(previous => previous === undefined ? previous : {\n ...previous, error: error instanceof Error ? error.message : String(error), retryable: true,\n })\n } finally { setRetrying(false) }\n }\n const destinations = state.destinations ?? []\n const summary = state.summary.replace(/^\u77E5\u8BC6\u5E93\u56DE\u5199\\s*\u00B7\\s*/u, '')\n return <div className=\"dsh-knowledge-writeback-status\" data-status={state.status}>\n <div className=\"dsh-knowledge-writeback-summary\" role={state.status === 'running' ? 'status' : undefined} aria-atomic=\"true\">\n <span>\u77E5\u8BC6\u5E93\u56DE\u5199</span><strong>@lemoncat7/dsh-knowledge</strong><span title={state.error}>{summary}</span>\n {state.status === 'failed' && state.retryable && <button type=\"button\" disabled={retrying} onClick={() => { void retry() }}>{retrying ? '\u91CD\u8BD5\u4E2D\u2026' : '\u91CD\u8BD5'}</button>}\n </div>\n {destinations.length > 0 && <ul className=\"dsh-knowledge-writeback-destinations\" aria-label=\"\u56DE\u5199\u76EE\u6807\">\n {destinations.map((destination, index) => <li key={`${destination.knowledgeBaseId}:${destination.documentId ?? destination.documentTitle}:${index}`}>\n <span className=\"dsh-knowledge-writeback-base\">{destination.knowledgeBaseName}</span>\n <span className=\"dsh-knowledge-writeback-separator\" aria-hidden=\"true\">/</span>\n {destination.documentId\n ? <button\n type=\"button\"\n className=\"dsh-knowledge-writeback-document\"\n title={`\u6253\u5F00 ${destination.documentPath ?? destination.documentTitle}`}\n aria-label={`\u5728\u77E5\u8BC6\u5E93\u4E2D\u6253\u5F00 ${destination.documentTitle}`}\n onClick={() => { workspace.openDocument({ knowledgeBaseId: destination.knowledgeBaseId, documentId: destination.documentId! }) }}\n ><strong>{destination.documentPath ?? destination.documentTitle}</strong></button>\n : <strong title={destination.documentTitle}>{`\u62DF\u65B0\u5EFA\uFF1A${destination.documentTitle}`}</strong>}\n <small data-disposition={destination.disposition}>{destination.disposition === 'written' ? '\u5DF2\u5199\u5165' : '\u5F85\u5BA1\u6838'}</small>\n </li>)}\n </ul>}\n {state.status === 'failed' && state.error && <p className=\"dsh-knowledge-writeback-error\" role=\"alert\">{state.error}</p>}\n </div>\n}\n\nfunction createKnowledgeWorkspaceController(client: ClientContext): KnowledgeWorkspaceController {\n const listeners = new Set<() => void>()\n let disposeWorkspace: (() => void) | undefined\n let target: KnowledgeDocumentTarget | undefined\n const notify = (): void => { for (const listener of listeners) listener() }\n const close = (): void => {\n if (disposeWorkspace === undefined) return\n const dispose = disposeWorkspace\n disposeWorkspace = undefined\n dispose()\n notify()\n }\n let controller: KnowledgeWorkspaceController\n const open = (): void => {\n if (disposeWorkspace !== undefined) return\n activatePluginWorkspace(PLUGIN_ID)\n disposeWorkspace = client.slots.register({ name: 'conversation', priority: -1 }, props => (\n <KnowledgeWorkspace {...props} client={client} workspace={controller} />\n ))\n }\n controller = {\n isOpen: () => disposeWorkspace !== undefined,\n toggle: () => {\n if (disposeWorkspace !== undefined) return close()\n target = undefined\n open()\n notify()\n },\n openDocument: nextTarget => {\n target = nextTarget\n open()\n notify()\n },\n currentTarget: () => target,\n close,\n subscribe: listener => {\n listeners.add(listener)\n return () => { listeners.delete(listener) }\n },\n }\n return controller\n}\n\nfunction KnowledgeConnectionCard() {\n const [current, setCurrent] = useState<KnowledgeConnectionView>()\n const [loadState, setLoadState] = useState<'loading' | 'ready' | 'error'>('loading')\n const [loadError, setLoadError] = useState('')\n const [open, setOpen] = useState(false)\n const [backend, setBackend] = useState<'local' | 'remote'>('local')\n const [remoteUrl, setRemoteUrl] = useState('')\n const [remoteToken, setRemoteToken] = useState('')\n const [timeout, setTimeoutValue] = useState('10000')\n const [dirty, setDirty] = useState(false)\n const [saving, setSaving] = useState(false)\n const [message, setMessage] = useState<{ kind: 'success' | 'error'; text: string }>()\n\n const load = useCallback(async (signal?: AbortSignal): Promise<void> => {\n setLoadState('loading')\n setLoadError('')\n try {\n const value = await requestConnection('GET', undefined, signal)\n setCurrent(value)\n setLoadState('ready')\n } catch (error) {\n if (signal?.aborted) return\n setLoadError(connectionErrorMessage(error))\n setLoadState('error')\n }\n }, [])\n\n useEffect(() => {\n const controller = new AbortController()\n void load(controller.signal)\n return () => { controller.abort() }\n }, [load])\n\n useEffect(() => {\n if (dirty || current === undefined) return\n setBackend(current.backend)\n setRemoteUrl(current.remoteUrl ?? '')\n setTimeoutValue(String(current.remoteTimeoutMs ?? 10000))\n }, [current, dirty])\n\n const timeoutNumber = Number(timeout)\n const urlError = backend === 'remote' ? validateRemoteUrl(remoteUrl) : undefined\n const tokenError = backend === 'remote' && !current?.tokenConfigured && remoteToken.trim().length === 0\n ? '\u9996\u6B21\u8FDE\u63A5\u5FC5\u987B\u586B\u5199\u5BA2\u6237\u7AEF\u4EE4\u724C\u3002'\n : remoteToken.length > 0 && remoteToken.trim().length < 24 ? '\u4EE4\u724C\u81F3\u5C11\u9700\u8981 24 \u4E2A\u5B57\u7B26\u3002' : undefined\n const timeoutError = !Number.isInteger(timeoutNumber) || timeoutNumber < 100 || timeoutNumber > 120000\n ? '\u8D85\u65F6\u5FC5\u987B\u662F 100 \u5230 120000 \u6BEB\u79D2\u4E4B\u95F4\u7684\u6574\u6570\u3002'\n : undefined\n const invalid = urlError !== undefined || tokenError !== undefined || timeoutError !== undefined\n\n const edit = (action: () => void): void => {\n action()\n setDirty(true)\n setMessage(undefined)\n }\n const reset = (): void => {\n setBackend(current?.backend ?? 'local')\n setRemoteUrl(current?.remoteUrl ?? '')\n setRemoteToken('')\n setTimeoutValue(String(current?.remoteTimeoutMs ?? 10000))\n setDirty(false)\n setMessage(undefined)\n }\n const save = async (): Promise<void> => {\n if (!dirty || invalid || !current?.writable || saving) return\n setSaving(true)\n setMessage(undefined)\n try {\n const next = await requestConnection('PUT', {\n backend,\n remoteTimeoutMs: timeoutNumber,\n ...backend === 'remote' ? { remoteUrl: remoteUrl.trim() } : {},\n ...backend === 'remote' && remoteToken.trim().length > 0 ? { remoteToken: remoteToken.trim() } : {},\n })\n setCurrent(next)\n setRemoteToken('')\n setDirty(false)\n setMessage({\n kind: 'success',\n text: backend === 'remote' ? '\u5DF2\u9A8C\u8BC1\u5E76\u5207\u6362\u81F3\u8FDC\u7A0B\u77E5\u8BC6\u5E93\u3002' : '\u5DF2\u5207\u6362\u81F3\u672C\u5730\u77E5\u8BC6\u5E93\u3002',\n })\n } catch (error) {\n setMessage({ kind: 'error', text: connectionErrorMessage(error) })\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <li className={`dsh-knowledge-settings-card${open ? ' dsh-knowledge-settings-card--open' : ''}`}>\n <button type=\"button\" className=\"dsh-knowledge-settings-header\" aria-expanded={open} onClick={() => { setOpen(value => !value) }}>\n <span><strong>\u77E5\u8BC6\u5E93\u8FDE\u63A5</strong><small>\u9009\u62E9\u672C\u673A\u77E5\u8BC6\u5E93\uFF0C\u6216\u8FDE\u63A5\u4E00\u53F0\u4E2D\u592E DSH \u77E5\u8BC6\u5E93</small></span>\n <span className=\"dsh-knowledge-settings-summary\">{loadState === 'loading' ? '\u8BFB\u53D6\u4E2D' : loadState === 'error' ? '\u8FDE\u63A5\u5165\u53E3' : current?.backend === 'remote' ? '\u8FDC\u7A0B' : '\u672C\u5730'}<i aria-hidden=\"true\" /></span>\n </button>\n {open && <div className=\"dsh-knowledge-settings-body\">\n {loadState === 'loading' ? <p className=\"dsh-knowledge-settings-note\" role=\"status\">\u6B63\u5728\u8BFB\u53D6\u8FDE\u63A5\u914D\u7F6E\u2026</p>\n : loadState === 'error' ? <div className=\"dsh-knowledge-settings-load-error\" role=\"alert\">\n <p>{loadError}</p>\n <button type=\"button\" onClick={() => { void load() }}>\u91CD\u65B0\u8BFB\u53D6</button>\n </div> : <>\n <fieldset className=\"dsh-knowledge-source-picker\">\n <legend>\u77E5\u8BC6\u5E93\u6765\u6E90</legend>\n <label className={backend === 'local' ? 'is-selected' : ''}>\n <input type=\"radio\" name=\"dsh-knowledge-backend\" checked={backend === 'local'} onChange={() => edit(() => { setBackend('local') })} />\n <span><strong>\u672C\u5730</strong><small>\u6570\u636E\u4FDD\u5B58\u5728\u5F53\u524D DSH \u7684 SQLite \u4E2D</small></span>\n </label>\n <label className={`${backend === 'remote' ? 'is-selected' : ''}${!current?.canSwitchRemote ? ' is-disabled' : ''}`}>\n <input type=\"radio\" name=\"dsh-knowledge-backend\" checked={backend === 'remote'} disabled={!current?.canSwitchRemote} onChange={() => edit(() => { setBackend('remote') })} />\n <span><strong>\u8FDC\u7A0B</strong><small>\u53EC\u56DE\u548C\u56DE\u5199\u7EDF\u4E00\u4F7F\u7528\u4E2D\u592E\u77E5\u8BC6\u5E93</small></span>\n </label>\n </fieldset>\n {!current?.canSwitchRemote && <p className=\"dsh-knowledge-settings-note\">\u5F53\u524D\u5B9E\u4F8B\u662F\u4E2D\u592E\u77E5\u8BC6\u5E93\u670D\u52A1\uFF0C\u4E0D\u80FD\u518D\u5207\u6362\u5230\u53E6\u4E00\u53F0\u8FDC\u7A0B\u670D\u52A1\u3002</p>}\n {backend === 'remote' && <div className=\"dsh-knowledge-remote-fields\">\n <label htmlFor=\"dsh-knowledge-remote-url\">\u670D\u52A1\u5668\u5730\u5740\n <input id=\"dsh-knowledge-remote-url\" type=\"url\" value={remoteUrl} placeholder=\"https://example.com/knowledge-api/v1\" autoComplete=\"url\" onChange={event => edit(() => { setRemoteUrl(event.target.value) })} aria-invalid={urlError !== undefined} aria-describedby={urlError ? 'dsh-knowledge-url-error' : undefined} />\n {urlError && <small id=\"dsh-knowledge-url-error\" className=\"dsh-knowledge-field-error\">{urlError}</small>}\n </label>\n <label htmlFor=\"dsh-knowledge-remote-token\">\u5BA2\u6237\u7AEF\u4EE4\u724C\n <input id=\"dsh-knowledge-remote-token\" type=\"password\" value={remoteToken} placeholder={current?.tokenConfigured ? '\u5DF2\u4FDD\u5B58\uFF1B\u7559\u7A7A\u5219\u4FDD\u6301\u4E0D\u53D8' : '\u7C98\u8D34\u5BA2\u6237\u7AEF\u4EE4\u724C'} autoComplete=\"new-password\" onChange={event => edit(() => { setRemoteToken(event.target.value) })} aria-invalid={tokenError !== undefined} aria-describedby=\"dsh-knowledge-token-help\" />\n <small id=\"dsh-knowledge-token-help\" className={tokenError ? 'dsh-knowledge-field-error' : undefined}>{tokenError ?? (current?.tokenConfigured ? '\u4EE4\u724C\u5DF2\u5B89\u5168\u4FDD\u5B58\uFF0C\u9875\u9762\u65E0\u6CD5\u8BFB\u53D6\uFF1B\u8F93\u5165\u65B0\u4EE4\u724C\u53EF\u8986\u76D6\u3002' : '\u4EE4\u724C\u4FDD\u5B58\u540E\u4E0D\u53EF\u8BFB\u53D6\uFF0C\u53EA\u80FD\u8986\u76D6\u3002')}</small>\n </label>\n </div>}\n <label className=\"dsh-knowledge-timeout-field\" htmlFor=\"dsh-knowledge-timeout\">\u8BF7\u6C42\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09\n <input id=\"dsh-knowledge-timeout\" type=\"number\" min=\"100\" max=\"120000\" step=\"100\" value={timeout} onChange={event => edit(() => { setTimeoutValue(event.target.value) })} aria-invalid={timeoutError !== undefined} />\n {timeoutError && <small className=\"dsh-knowledge-field-error\">{timeoutError}</small>}\n </label>\n {!current?.writable && <p className=\"dsh-knowledge-settings-note\">\u5F53\u524D\u63D2\u4EF6\u6CA1\u6709\u914D\u7F6E\u6301\u4E45\u5316\u8DEF\u5F84\uFF0C\u65E0\u6CD5\u4FDD\u5B58\u8FDE\u63A5\u3002</p>}\n {message && <p className={`dsh-knowledge-settings-message is-${message.kind}`} role={message.kind === 'error' ? 'alert' : 'status'} aria-live=\"polite\">{message.text}</p>}\n <div className=\"dsh-knowledge-settings-actions\">\n <button type=\"button\" onClick={reset} disabled={!dirty || saving}>\u653E\u5F03\u66F4\u6539</button>\n <button type=\"button\" className=\"is-primary\" onClick={() => { void save() }} disabled={!dirty || invalid || saving || !current?.writable}>{saving ? '\u6B63\u5728\u9A8C\u8BC1\u2026' : '\u9A8C\u8BC1\u5E76\u8FDE\u63A5'}</button>\n </div>\n </>}\n </div>}\n </li>\n )\n}\n\nfunction validateRemoteUrl(value: string): string | undefined {\n try {\n const url = new URL(value.trim())\n const loopback = url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '::1'\n if (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) return '\u8FDC\u7A0B\u77E5\u8BC6\u5E93\u5FC5\u987B\u4F7F\u7528 HTTPS\u3002'\n return undefined\n } catch { return '\u8BF7\u8F93\u5165\u5B8C\u6574\u7684\u77E5\u8BC6\u5E93 API \u5730\u5740\u3002' }\n}\n\nfunction connectionErrorMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error)\n if (message.includes('Failed to fetch')) return '\u65E0\u6CD5\u8BBF\u95EE\u63D2\u4EF6\u8FDE\u63A5\u63A5\u53E3\uFF0C\u8BF7\u786E\u8BA4\u63D2\u4EF6\u670D\u52A1\u5DF2\u52A0\u8F7D\u3002'\n return message || '\u8FDE\u63A5\u914D\u7F6E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5730\u5740\u3001\u4EE4\u724C\u548C DSH \u65E5\u5FD7\u3002'\n}\n\nasync function requestConnection(\n method: 'GET' | 'PUT',\n body?: Record<string, unknown>,\n signal?: AbortSignal,\n): Promise<KnowledgeConnectionView> {\n const response = await fetch(CONNECTION_CONTROL_PATH, {\n method,\n headers: { accept: 'application/json', ...body === undefined ? {} : { 'content-type': 'application/json' } },\n ...body === undefined ? {} : { body: JSON.stringify(body) },\n ...signal === undefined ? {} : { signal },\n })\n const payload = await response.json().catch(() => undefined) as unknown\n if (!response.ok) {\n const message = payload !== null && typeof payload === 'object' && typeof (payload as { error?: unknown }).error === 'string'\n ? (payload as { error: string }).error\n : `\u8FDE\u63A5\u63A5\u53E3\u8FD4\u56DE HTTP ${response.status}`\n throw new Error(message)\n }\n if (!isConnectionView(payload)) throw new Error('\u63D2\u4EF6\u8FDE\u63A5\u63A5\u53E3\u8FD4\u56DE\u4E86\u65E0\u6548\u6570\u636E\u3002')\n cachedConnectionView = payload\n return payload\n}\n\nfunction isConnectionView(value: unknown): value is KnowledgeConnectionView {\n if (value === null || typeof value !== 'object') return false\n const item = value as Partial<KnowledgeConnectionView>\n return (item.backend === 'local' || item.backend === 'remote')\n && Number.isInteger(item.remoteTimeoutMs)\n && typeof item.tokenConfigured === 'boolean'\n && typeof item.canSwitchRemote === 'boolean'\n && typeof item.writable === 'boolean'\n && typeof item.managementAvailable === 'boolean'\n && (!item.managementAvailable || isManagementPath(item.managementPath))\n}\n\nfunction isManagementPath(value: unknown): value is string {\n return typeof value === 'string' && value.startsWith('/') && !value.startsWith('//')\n}\n\nfunction KnowledgeLauncher({ wide, workspace }: SidebarActionProps & { workspace: KnowledgeWorkspaceController }) {\n const [open, setOpen] = useState(workspace.isOpen())\n\n useEffect(() => workspace.subscribe(() => { setOpen(workspace.isOpen()) }), [workspace])\n\n return (\n <button\n type=\"button\"\n className={`dsh-knowledge-trigger${wide ? '' : ' dsh-knowledge-trigger--rail'}${open ? ' is-active' : ''}`}\n aria-label={open ? '\u8FD4\u56DE\u5BF9\u8BDD' : '\u77E5\u8BC6\u5E93'}\n aria-pressed={open}\n title={wide ? undefined : open ? '\u8FD4\u56DE\u5BF9\u8BDD' : '\u77E5\u8BC6\u5E93'}\n onClick={() => { workspace.toggle() }}\n >\n <IconDataOutline16 size={wide ? 16 : 18} />\n {wide && <span>{open ? '\u8FD4\u56DE\u5BF9\u8BDD' : '\u77E5\u8BC6\u5E93'}</span>}\n </button>\n )\n}\n\nfunction KnowledgeWorkspace({\n sessionId,\n useSessions,\n client,\n workspace,\n}: ConversationSlotProps & { client: ClientContext; workspace: KnowledgeWorkspaceController }) {\n const cachedManagementPath = cachedConnectionView?.managementAvailable ? cachedConnectionView.managementPath : undefined\n const [panelState, setPanelState] = useState<'loading' | 'ready' | 'unavailable' | 'error'>(cachedConnectionView === undefined ? 'loading' : cachedManagementPath === undefined ? 'unavailable' : 'ready')\n const [managementPath, setManagementPath] = useState<string | undefined>(cachedManagementPath)\n const [panelError, setPanelError] = useState('')\n const [target, setTarget] = useState<KnowledgeDocumentTarget | undefined>(workspace.currentTarget())\n const projectId = useSessions(state => sessionId === undefined ? undefined : state.byId[sessionId]?.cwd)\n const knowledgeUrl = managementPath === undefined ? undefined : knowledgePanelUrl(managementPath, sessionId, projectId, target)\n const frame = useRef<HTMLIFrameElement | null>(null)\n const themeFrame = useRef(0)\n\n const loadManagement = useCallback(async (background = false): Promise<void> => {\n if (!background) setPanelState('loading')\n setPanelError('')\n try {\n const connection = await requestConnection('GET')\n if (!connection.managementAvailable || connection.managementPath === undefined) {\n setManagementPath(undefined)\n setPanelState('unavailable')\n return\n }\n setManagementPath(connection.managementPath)\n setPanelState('ready')\n } catch (error) {\n setManagementPath(undefined)\n setPanelError(connectionErrorMessage(error))\n setPanelState('error')\n }\n }, [])\n\n useEffect(() => {\n void loadManagement(cachedConnectionView !== undefined)\n }, [loadManagement])\n\n useEffect(() => workspace.subscribe(() => { setTarget(workspace.currentTarget()) }), [workspace])\n\n const sendTheme = useCallback((): void => {\n const currentFrame = frame.current\n if (currentFrame === null) return\n const target = currentFrame.contentWindow\n if (target === null) return\n const computed = getComputedStyle(document.body)\n target.postMessage(\n createKnowledgeHostTheme(computed, client.theme.getTheme()),\n frameOrigin(currentFrame) ?? '*',\n )\n }, [client])\n\n const scheduleTheme = useCallback((): void => {\n if (themeFrame.current !== 0) window.cancelAnimationFrame(themeFrame.current)\n themeFrame.current = window.requestAnimationFrame(() => {\n themeFrame.current = 0\n sendTheme()\n })\n }, [sendTheme])\n\n useEffect(() => {\n const off = client.on('theme/change', scheduleTheme)\n const onMessage = (event: MessageEvent): void => {\n const currentFrame = frame.current\n if (event.source !== currentFrame?.contentWindow) return\n const expectedOrigin = frameOrigin(currentFrame)\n if (expectedOrigin !== undefined && event.origin !== expectedOrigin) return\n const data = event.data as { type?: unknown; version?: unknown } | null\n if (data?.type === KNOWLEDGE_THEME_READY_MESSAGE && data.version === KNOWLEDGE_THEME_PROTOCOL_VERSION) sendTheme()\n }\n window.addEventListener('message', onMessage)\n scheduleTheme()\n return () => {\n off()\n window.removeEventListener('message', onMessage)\n if (themeFrame.current !== 0) window.cancelAnimationFrame(themeFrame.current)\n }\n }, [client, scheduleTheme, sendTheme])\n\n return (\n <section className=\"dsh-knowledge-workspace\" data-xiaohei-surface=\"plugin-workspace\" aria-labelledby=\"dsh-knowledge-workspace-title\">\n <header className=\"dsh-knowledge-workspace-header\">\n <div>\n <button type=\"button\" data-xiaohei-workspace-close onClick={workspace.close} aria-label=\"\u8FD4\u56DE\u4F1A\u8BDD\" title=\"\u8FD4\u56DE\u4F1A\u8BDD\"><IconChevronLeftOutline14 size={15} /></button>\n <IconDataOutline16 size={18} />\n <span><h2 id=\"dsh-knowledge-workspace-title\">\u77E5\u8BC6\u5E93</h2><p>\u6587\u6863\u3001\u5BA1\u6838\u3001\u6302\u8F7D\u4E0E\u8BBF\u95EE\u7BA1\u7406</p></span>\n </div>\n </header>\n {panelState === 'ready' && knowledgeUrl !== undefined\n ? <iframe ref={frame} className=\"dsh-knowledge-frame\" src={knowledgeUrl} title=\"\u77E5\u8BC6\u5E93\u7BA1\u7406\u53F0\" onLoad={sendTheme} />\n : <div className=\"dsh-knowledge-panel-state\" role={panelState === 'error' ? 'alert' : 'status'} aria-live=\"polite\">\n <span className=\"dsh-knowledge-panel-state-icon\" aria-hidden=\"true\">{panelState === 'loading' ? '\u00B7\u00B7\u00B7' : panelState === 'error' ? '!' : '\u2014'}</span>\n <div>\n <h3>{panelState === 'loading' ? '\u6B63\u5728\u6253\u5F00\u77E5\u8BC6\u5E93\u2026' : panelState === 'error' ? '\u6682\u65F6\u65E0\u6CD5\u6253\u5F00\u77E5\u8BC6\u5E93' : '\u8FD9\u53F0 DSH \u672A\u542F\u7528\u77E5\u8BC6\u5E93\u7BA1\u7406\u53F0'}</h3>\n <p>{panelState === 'loading'\n ? '\u6B63\u5728\u786E\u8BA4\u5F53\u524D\u5B9E\u4F8B\u662F\u5426\u63D0\u4F9B\u7BA1\u7406\u9875\u9762\u3002'\n : panelState === 'error'\n ? panelError\n : '\u672C\u5730\u53EC\u56DE\u548C\u56DE\u5199\u4ECD\u53EF\u4F7F\u7528\u3002\u5F53\u524D profile \u5DF2\u663E\u5F0F\u5173\u95ED exposeWeb\uFF1B\u91CD\u65B0\u542F\u7528\u540E\u5373\u53EF\u5728\u8FD9\u91CC\u7BA1\u7406\u3002\u4F7F\u7528\u8FDC\u7A0B\u77E5\u8BC6\u5E93\u65F6\uFF0C\u8BF7\u524D\u5F80\u4E2D\u592E DSH \u7684\u77E5\u8BC6\u5E93\u7BA1\u7406\u53F0\u3002'}</p>\n {panelState === 'error' && <button type=\"button\" onClick={() => { void loadManagement() }}>\u91CD\u8BD5</button>}\n </div>\n </div>}\n </section>\n )\n}\n\nfunction knowledgePanelUrl(managementPath: string, sessionId?: string, projectId?: string, target?: KnowledgeDocumentTarget): string {\n const params = new URLSearchParams()\n if (sessionId !== undefined) params.set('sessionId', sessionId)\n if (projectId !== undefined) params.set('projectId', projectId)\n if (target !== undefined) {\n params.set('knowledgeBaseId', target.knowledgeBaseId)\n params.set('documentId', target.documentId)\n }\n const query = params.toString()\n return query.length === 0 ? managementPath : `${managementPath}${managementPath.includes('?') ? '&' : '?'}${query}`\n}\n\nfunction frameOrigin(frame: HTMLIFrameElement): string | undefined {\n try {\n const origin = new URL(frame.src).origin\n return origin === 'null' ? undefined : origin\n } catch {\n return undefined\n }\n}\n\nfunction installStyles(): () => void {\n const previous = document.querySelector<HTMLStyleElement>(`style[data-plugin-css=\"${STYLE_ID}\"]`)\n previous?.remove()\n const style = document.createElement('style')\n style.dataset.plugin = PLUGIN_ID\n style.dataset.pluginCss = STYLE_ID\n style.textContent = cssText\n document.head.appendChild(style)\n return () => { style.remove() }\n}\n", "const WORKSPACE_ACTIVATE_EVENT = '@lemoncat7/dsh-plugin-ui/workspace-activate'\n\ninterface WorkspaceActivateDetail {\n pluginId: string\n}\n\n/** Claim the conversation workspace while remaining compatible with installed plugin versions. */\nexport function activatePluginWorkspace(pluginId: string): void {\n window.dispatchEvent(new CustomEvent<WorkspaceActivateDetail>(WORKSPACE_ACTIVATE_EVENT, {\n detail: { pluginId },\n }))\n}\n\n/** Close this workspace when another plugin claims the conversation area. */\nexport function observePluginWorkspace(pluginId: string, close: () => void): () => void {\n const onActivate = (event: Event): void => {\n const detail = (event as CustomEvent<WorkspaceActivateDetail>).detail\n if (detail?.pluginId !== pluginId) close()\n }\n window.addEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n return () => window.removeEventListener(WORKSPACE_ACTIVATE_EVENT, onActivate)\n}\n", ".dsh-knowledge-trigger,\n.dsh-knowledge-workspace,\n.dsh-knowledge-settings-card,\n.dsh-knowledge-writeback-status {\n --knowledge-accent: #3a3a3c;\n --knowledge-on-accent: #fff;\n --knowledge-danger: #d70015;\n --knowledge-success: #248a3d;\n --knowledge-pane: rgb(242 243 247 / 78%);\n --knowledge-raised: #fff;\n --knowledge-control: rgb(255 255 255 / 82%);\n --knowledge-border: rgb(60 60 67 / 14%);\n --knowledge-text: #1d1d1f;\n --knowledge-text-secondary: #515154;\n --knowledge-hover: rgba(118, 118, 128, .1);\n --knowledge-glare-light: rgb(255 255 255 / 82%);\n --knowledge-glare-rim: rgb(60 60 67 / 15%);\n --knowledge-glass-filter: saturate(1.18) contrast(1.025) blur(28px);\n --knowledge-glass-shadow: inset 0 1px 0 rgb(255 255 255 / 58%), inset 0 -1px 0 rgb(60 60 67 / 12%);\n}\n\nbody[data-ds-dark-theme] :is(\n .dsh-knowledge-trigger,\n .dsh-knowledge-workspace,\n .dsh-knowledge-settings-card,\n .dsh-knowledge-writeback-status\n) {\n --knowledge-accent: #e5e5ea;\n --knowledge-on-accent: #1d1d1f;\n --knowledge-danger: #ff453a;\n --knowledge-success: #30d158;\n --knowledge-pane: rgb(8 10 12 / 19%);\n --knowledge-raised: rgb(10 12 15 / 44%);\n --knowledge-control: rgb(255 255 255 / 7%);\n --knowledge-border: rgb(255 255 255 / 10%);\n --knowledge-text: #f5f5f7;\n --knowledge-text-secondary: #d1d1d6;\n --knowledge-hover: rgb(255 255 255 / 8%);\n --knowledge-glare-light: rgb(255 255 255 / 42%);\n --knowledge-glare-rim: rgb(0 0 0 / 24%);\n --knowledge-glass-shadow: inset 0 1px 0 rgb(255 255 255 / 18%), inset 0 -1px 0 rgb(0 0 0 / 30%);\n}\n\n.dsh-knowledge-trigger,\n.dsh-knowledge-panel-state button,\n.dsh-knowledge-settings-card button,\n.dsh-knowledge-writeback-status button {\n -webkit-appearance: none;\n appearance: none;\n margin: 0;\n}\n\n.dsh-knowledge-trigger {\n position: relative;\n flex: none;\n min-width: 0;\n max-width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n height: 34px;\n margin: 4px 0;\n padding: 6px 8px 6px 10px;\n box-sizing: border-box;\n border: 0;\n border-radius: 12px;\n overflow: hidden;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n line-height: 22px;\n white-space: nowrap;\n isolation: isolate;\n transition:\n color 120ms ease,\n background-color 120ms ease,\n box-shadow 160ms ease;\n}\n\n.dsh-knowledge-trigger:hover {\n background: var(--knowledge-hover);\n}\n\n.dsh-knowledge-trigger > * {\n position: relative;\n z-index: 1;\n}\n\n.dsh-knowledge-trigger::before {\n position: absolute;\n z-index: 0;\n top: -55%;\n bottom: -55%;\n left: -64%;\n width: 52%;\n border-radius: 45%;\n background: linear-gradient(\n 90deg,\n transparent,\n color-mix(in srgb, var(--knowledge-glare-light) 76%, transparent) 50%,\n color-mix(in srgb, var(--knowledge-glare-rim) 18%, transparent) 63%,\n transparent\n );\n opacity: 0;\n transform: skewX(-18deg) translate3d(0, 0, 0);\n pointer-events: none;\n transition:\n opacity 150ms ease-out,\n transform 720ms cubic-bezier(.2, .72, .2, 1);\n content: \"\";\n}\n\n.dsh-knowledge-trigger:hover::before {\n opacity: .96;\n transform: skewX(-18deg) translate3d(320%, 0, 0);\n}\n\n.dsh-knowledge-trigger:focus-visible,\n.dsh-knowledge-writeback-status button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n\n.dsh-knowledge-trigger.is-active {\n background: var(--knowledge-control);\n color: var(--knowledge-text);\n box-shadow: 0 1px 2px rgb(0 0 0 / 7%), inset 0 1px 0 rgb(255 255 255 / 28%);\n}\n\n.dsh-knowledge-trigger--rail {\n width: 36px;\n height: 36px;\n margin: 8px 0 4px;\n padding: 0;\n justify-content: center;\n gap: 0;\n border-radius: 50%;\n}\n\n/* Rail (collapsed) mode: the host footer seat is a horizontal row sized for a\n single 36px circle per entry; with several entries it overflows the 56px\n rail and the circles drift off the settings axis. Stack the entries\n vertically, centered on the same axis as the settings circle. The --rail\n class on the knowledge trigger is the collapsed-mode signal, so wide mode\n is untouched. */\ndiv:has(> div[data-slot=\"sidebar.footer.action\"] .dsh-knowledge-trigger--rail) {\n flex-direction: column;\n align-items: center;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-knowledge-trigger,\n .dsh-knowledge-trigger::before { transition: none; }\n .dsh-knowledge-trigger::before { display: none; }\n}\n\n.dsh-knowledge-workspace {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: transparent;\n}\n\n.dsh-knowledge-workspace-header {\n position: relative;\n z-index: 2;\n flex: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n min-height: 52px;\n margin: 8px 10px 0;\n padding: 7px 14px;\n box-sizing: border-box;\n border: 1px solid var(--knowledge-border);\n border-radius: 14px 14px 11px 11px;\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--knowledge-glare-light) 20%, transparent), transparent 58%),\n var(--knowledge-pane);\n box-shadow: var(--knowledge-glass-shadow);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n}\n\n.dsh-knowledge-workspace-header > div {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close] {\n -webkit-appearance: none;\n appearance: none;\n display: grid;\n place-items: center;\n box-sizing: border-box;\n flex: none;\n width: 30px;\n height: 30px;\n margin: 0;\n padding: 0;\n border: 1px solid transparent;\n border-radius: 9px;\n color: var(--knowledge-text-secondary);\n background: transparent;\n font: inherit;\n line-height: 1;\n -webkit-tap-highlight-color: transparent;\n cursor: pointer;\n transition: color 140ms ease, background 140ms ease, border-color 140ms ease, transform 140ms ease;\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:hover {\n border-color: var(--knowledge-border);\n color: var(--knowledge-text);\n background: var(--knowledge-control);\n}\n\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:active { transform: scale(.96); }\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close]:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-workspace-header [data-xiaohei-workspace-close] > svg {\n display: block;\n pointer-events: none;\n}\n\n.dsh-knowledge-workspace-header > div > span {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.dsh-knowledge-workspace-header h2,\n.dsh-knowledge-workspace-header p {\n margin: 0;\n}\n\n.dsh-knowledge-workspace-header h2 {\n color: var(--knowledge-text);\n font-size: 15px;\n line-height: 22px;\n font-weight: 600;\n}\n\n.dsh-knowledge-workspace-header p {\n color: var(--knowledge-text-secondary);\n font-size: 11px;\n line-height: 16px;\n}\n\n.dsh-knowledge-frame {\n flex: 1;\n display: block;\n width: 100%;\n min-height: 0;\n margin: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n}\n\n.dsh-knowledge-panel-state {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 16px;\n min-height: 0;\n margin: 8px 10px 10px;\n padding: 32px;\n box-sizing: border-box;\n border: 1px solid var(--knowledge-border);\n border-radius: 15px;\n background: var(--knowledge-pane);\n box-shadow: var(--knowledge-glass-shadow);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n color: var(--dsw-alias-label-primary, #171719);\n}\n\n.dsh-knowledge-panel-state-icon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: 12px;\n background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, .1));\n color: var(--dsw-alias-label-secondary, #68686f);\n font-size: 18px;\n font-weight: 600;\n}\n\n.dsh-knowledge-panel-state > div { max-width: 560px; }\n.dsh-knowledge-panel-state h3 { margin: 0 0 6px; font-size: 17px; line-height: 24px; font-weight: 600; }\n.dsh-knowledge-panel-state p { margin: 0; color: var(--dsw-alias-label-secondary, #68686f); font-size: 13px; line-height: 20px; }\n.dsh-knowledge-panel-state button {\n min-width: 72px;\n min-height: 32px;\n margin-top: 16px;\n padding: 6px 14px;\n border: 0;\n border-radius: 10px;\n background: var(--knowledge-accent);\n color: var(--knowledge-on-accent);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-panel-state button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n\n.dsh-knowledge-settings-card {\n list-style: none;\n overflow: hidden;\n border: 1px solid var(--knowledge-border);\n border-radius: 14px;\n background:\n linear-gradient(145deg, color-mix(in srgb, var(--knowledge-glare-light) 16%, transparent), transparent 58%),\n var(--knowledge-pane);\n color: var(--dsw-alias-label-primary, #171719);\n box-shadow: var(--knowledge-glass-shadow), 0 8px 24px rgb(0 0 0 / 5%);\n -webkit-backdrop-filter: var(--knowledge-glass-filter);\n backdrop-filter: var(--knowledge-glass-filter);\n transition: border-color .16s, background .16s, box-shadow .2s, transform .2s cubic-bezier(.22, 1, .36, 1);\n}\n.dsh-knowledge-settings-card:hover {\n border-color: color-mix(in srgb, var(--knowledge-border) 68%, var(--knowledge-text-secondary));\n box-shadow: var(--knowledge-glass-shadow), 0 12px 30px rgb(0 0 0 / 8%);\n transform: translateY(-1px);\n}\n.dsh-knowledge-settings-card--open {\n border-color: color-mix(in srgb, var(--knowledge-border) 68%, var(--knowledge-text-secondary));\n background: var(--knowledge-pane);\n}\n.dsh-knowledge-settings-header { display: flex; width: 100%; align-items: center; gap: 12px; padding: 14px 16px; border: 0; border-radius: 12px; background: transparent; color: inherit; text-align: left; cursor: pointer; font: inherit; }\n.dsh-knowledge-settings-header:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: -2px;\n}\n.dsh-knowledge-settings-actions button:focus-visible,\n.dsh-knowledge-settings-load-error button:focus-visible {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-settings-header > span:first-child { display: flex; min-width: 0; flex: 1; flex-direction: column; gap: 4px; }\n.dsh-knowledge-settings-header strong { font-size: 15px; font-weight: 600; line-height: 1.4; }\n.dsh-knowledge-settings-header small { color: var(--dsw-alias-label-tertiary); font-size: 13px; line-height: 1.5; }\n.dsh-knowledge-source-picker small,\n.dsh-knowledge-remote-fields small { color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-settings-summary { display: flex; flex: none; align-items: center; gap: 10px; color: var(--dsw-alias-label-tertiary); font-size: 12px; }\n.dsh-knowledge-settings-summary i { width: 8px; height: 8px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: rotate(45deg); transition: transform 160ms ease; }\n.dsh-knowledge-settings-card--open .dsh-knowledge-settings-summary i { transform: rotate(225deg); }\n\n.dsh-knowledge-settings-body {\n display: grid;\n gap: 18px;\n margin: 0 16px;\n padding-bottom: 8px;\n border-top: 1px solid var(--dsw-alias-border-l2);\n}\n\n.dsh-knowledge-source-picker {\n min-width: 0;\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n margin: 18px 0 0;\n padding: 0;\n border: 0;\n}\n\n.dsh-knowledge-source-picker legend { margin-bottom: 8px; padding: 0; color: inherit; font-size: 13px; font-weight: 600; }\n.dsh-knowledge-source-picker label {\n display: flex;\n gap: 10px;\n padding: 13px;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .2));\n border-radius: 14px;\n cursor: pointer;\n}\n.dsh-knowledge-source-picker label.is-selected {\n border-color: var(--knowledge-accent);\n background: color-mix(in srgb, var(--knowledge-accent) 7%, transparent);\n}\n.dsh-knowledge-source-picker label.is-disabled {\n cursor: default;\n opacity: .55;\n}\n.dsh-knowledge-source-picker label:focus-within {\n outline: 2px solid var(--knowledge-accent);\n outline-offset: 2px;\n}\n.dsh-knowledge-source-picker input {\n -webkit-appearance: none;\n appearance: none;\n width: 16px;\n height: 16px;\n display: inline-grid;\n place-content: center;\n flex: none;\n margin: 2px 0 0;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .34));\n border-radius: 50%;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff));\n color: var(--knowledge-on-accent);\n cursor: pointer;\n transition: border-color .15s ease, background-color .15s ease;\n}\n.dsh-knowledge-source-picker input::before {\n content: \"\";\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n opacity: 0;\n transform: scale(.55);\n transition: opacity .12s ease, transform .15s cubic-bezier(.2, .8, .2, 1);\n}\n.dsh-knowledge-source-picker input:checked { border-color: var(--knowledge-accent); background: var(--knowledge-accent); }\n.dsh-knowledge-source-picker input:checked::before { opacity: 1; transform: scale(1); }\n.dsh-knowledge-source-picker input:disabled { cursor: default; }\n.dsh-knowledge-source-picker span { display: grid; gap: 3px; }\n\n.dsh-knowledge-remote-fields { display: grid; grid-template-columns: 1.25fr 1fr; gap: 12px; }\n.dsh-knowledge-remote-fields label,\n.dsh-knowledge-timeout-field { display: grid; gap: 6px; color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-remote-fields input,\n.dsh-knowledge-timeout-field input {\n -webkit-appearance: none;\n appearance: none;\n min-height: 38px;\n box-sizing: border-box;\n padding: 8px 11px;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .25));\n border-radius: 10px;\n outline: none;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff));\n color: var(--dsw-alias-label-primary, #171719);\n font: inherit;\n}\n.dsh-knowledge-remote-fields input:focus,\n.dsh-knowledge-timeout-field input:focus { border-color: var(--knowledge-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--knowledge-accent) 16%, transparent); }\n.dsh-knowledge-remote-fields input:-webkit-autofill,\n.dsh-knowledge-remote-fields input:-webkit-autofill:hover,\n.dsh-knowledge-remote-fields input:-webkit-autofill:focus {\n -webkit-text-fill-color: var(--dsw-alias-label-primary, #171719);\n box-shadow: 0 0 0 1000px var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-1, #fff)) inset;\n caret-color: var(--dsw-alias-label-primary, #171719);\n}\n.dsh-knowledge-timeout-field input::-webkit-inner-spin-button,\n.dsh-knowledge-timeout-field input::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }\n.dsh-knowledge-timeout-field { max-width: 240px; }\n.dsh-knowledge-field-error { color: var(--knowledge-danger) !important; }\n\n.dsh-knowledge-settings-message,\n.dsh-knowledge-settings-note { margin: 0; color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n.dsh-knowledge-settings-message.is-success { color: var(--knowledge-success); }\n.dsh-knowledge-settings-message.is-error { color: var(--knowledge-danger); }\n.dsh-knowledge-settings-load-error {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-top: 18px;\n padding: 12px 14px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--knowledge-danger) 8%, transparent);\n color: var(--knowledge-danger);\n font-size: 13px;\n}\n.dsh-knowledge-settings-load-error p { margin: 0; }\n.dsh-knowledge-settings-load-error button {\n flex: none;\n min-height: 30px;\n padding: 5px 10px;\n border: 0;\n border-radius: 9px;\n background: var(--xiaohei-plugin-control-fill, var(--dsw-alias-bg-layer-2, #fff));\n color: var(--dsw-alias-label-primary, #171719);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-settings-actions { display: flex; justify-content: flex-end; gap: 8px; }\n.dsh-knowledge-settings-actions button {\n min-height: 34px;\n padding: 7px 13px;\n border: 0;\n border-radius: 10px;\n background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, .1));\n color: var(--dsw-alias-label-primary, #171719);\n cursor: pointer;\n font: inherit;\n font-size: 13px;\n}\n.dsh-knowledge-settings-actions button.is-primary { background: var(--knowledge-accent); color: var(--knowledge-on-accent); }\n.dsh-knowledge-settings-actions button:disabled { cursor: default; opacity: .45; }\n\n@media (max-width: 720px) {\n .dsh-knowledge-source-picker,\n .dsh-knowledge-remote-fields { grid-template-columns: 1fr; }\n .dsh-knowledge-settings-summary { font-size: 0; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .dsh-knowledge-settings-card,\n .dsh-knowledge-settings-header,\n .dsh-knowledge-settings-summary i { transition: none; }\n}\n\n.dsh-knowledge-writeback-status {\n display: grid;\n gap: 5px;\n min-width: 0;\n color: var(--dsw-alias-label-tertiary, #6b7280);\n font-size: 12px;\n line-height: 1.5;\n}\n.dsh-knowledge-writeback-summary {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n min-width: 0;\n}\n.dsh-knowledge-writeback-status strong {\n color: var(--dsw-alias-label-secondary, #374151);\n font-weight: 600;\n}\n.dsh-knowledge-writeback-status button {\n min-height: 24px;\n padding: 0 9px;\n border: 1px solid var(--dsw-alias-separator, #d1d5db);\n border-radius: 7px;\n color: var(--dsw-alias-label-secondary, #374151);\n background: var(--dsw-alias-button-elevated-fill, #fff);\n cursor: pointer;\n font: inherit;\n}\n.dsh-knowledge-writeback-status button:disabled { cursor: default; opacity: .5; }\n.dsh-knowledge-writeback-destinations {\n display: flex;\n flex-wrap: wrap;\n gap: 2px 12px;\n min-width: 0;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.dsh-knowledge-writeback-destinations li {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-width: 0;\n max-width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n}\n.dsh-knowledge-writeback-base,\n.dsh-knowledge-writeback-separator {\n flex: none;\n}\n.dsh-knowledge-writeback-separator {\n color: var(--dsw-alias-label-quaternary, #9ca3af);\n}\n.dsh-knowledge-writeback-destinations strong {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.dsh-knowledge-writeback-status .dsh-knowledge-writeback-document {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n min-height: 24px;\n padding: 0 3px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #374151);\n text-decoration: underline;\n text-decoration-color: transparent;\n text-underline-offset: 3px;\n transition: color 120ms ease, background-color 120ms ease, text-decoration-color 120ms ease;\n}\n.dsh-knowledge-writeback-status .dsh-knowledge-writeback-document:hover {\n background: var(--knowledge-hover);\n color: var(--dsw-alias-label-primary, #171719);\n text-decoration-color: currentColor;\n}\n.dsh-knowledge-writeback-document strong { color: inherit; }\n.dsh-knowledge-writeback-destinations small {\n flex: none;\n color: var(--dsw-alias-label-secondary, #374151);\n font: inherit;\n white-space: nowrap;\n}\n.dsh-knowledge-writeback-destinations small[data-disposition=\"written\"] { color: var(--knowledge-success); }\n.dsh-knowledge-writeback-error {\n max-width: min(720px, 100%);\n margin: 0;\n color: var(--knowledge-danger);\n overflow-wrap: anywhere;\n}\n", "/** Host settings namespace that makes the knowledge connection card discoverable. */\nexport const KNOWLEDGE_SETTINGS_NAMESPACE = 'dsh-knowledge-connection'\n", "export const KNOWLEDGE_THEME_MESSAGE = '@lemoncat7/dsh-knowledge/host-theme'\nexport const KNOWLEDGE_THEME_READY_MESSAGE = '@lemoncat7/dsh-knowledge/host-theme-ready'\nexport const KNOWLEDGE_THEME_PROTOCOL_VERSION = 1\n\nexport type KnowledgeColorScheme = 'light' | 'dark'\n\nexport interface KnowledgeHostThemeMessage {\n type: typeof KNOWLEDGE_THEME_MESSAGE\n version: typeof KNOWLEDGE_THEME_PROTOCOL_VERSION\n colorScheme: KnowledgeColorScheme\n tokens: Record<string, string>\n}\n\nexport interface ThemeSnapshotLike {\n active: {\n colorScheme: KnowledgeColorScheme\n tokens: Readonly<Record<string, string>>\n }\n}\n\ninterface ComputedStyleLike {\n getPropertyValue(name: string): string\n}\n\n/**\n * The management console lives in its own iframe and therefore owns its\n * component palette. Only the host colour scheme crosses that boundary.\n * Keeping these tokens stable prevents a branded host accent from changing\n * editor selection, navigation and dialog hierarchy independently.\n */\nconst WORKSPACE_TOKENS: Record<KnowledgeColorScheme, Readonly<Record<string, string>>> = {\n light: {\n '--bg': '#e9e9ed', '--surface': '#f2f3f7', '--surface-raised': '#ffffff',\n '--surface-soft': '#eceef1', '--surface-hover': '#e5e5e7', '--dialog-surface': '#ffffff',\n '--text': '#1d1d1f', '--text-secondary': '#515154', '--text-tertiary': '#6e6e73',\n '--border': 'rgb(60 60 67 / 14%)', '--border-strong': 'rgb(60 60 67 / 24%)',\n '--accent': '#3a3a3c', '--accent-hover': '#1d1d1f', '--accent-soft': '#e2e2e5', '--on-accent': '#ffffff',\n '--success': '#248a3d', '--success-soft': '#e8f5eb', '--warning': '#c93400', '--warning-soft': '#fff1e8',\n '--danger': '#d70015', '--danger-soft': '#ffebed', '--shadow': '0 24px 64px rgb(0 0 0 / 20%)',\n },\n dark: {\n '--bg': 'transparent', '--surface': 'rgb(8 10 12 / 20%)', '--surface-raised': 'rgb(10 12 15 / 44%)',\n '--surface-soft': 'rgb(255 255 255 / 6%)', '--surface-hover': 'rgb(255 255 255 / 7.5%)', '--dialog-surface': 'rgb(10 12 15 / 72%)',\n '--text': '#f5f5f7', '--text-secondary': '#d1d1d6', '--text-tertiary': '#98989d',\n '--border': 'rgb(255 255 255 / 10%)', '--border-strong': 'rgb(255 255 255 / 18%)',\n '--accent': '#e5e5ea', '--accent-hover': '#ffffff', '--accent-soft': 'rgb(255 255 255 / 9%)', '--on-accent': '#1d1d1f',\n '--success': '#30d158', '--success-soft': 'rgb(48 209 88 / 13%)', '--warning': '#ff9f0a', '--warning-soft': 'rgb(255 159 10 / 13%)',\n '--danger': '#ff453a', '--danger-soft': 'rgb(255 69 58 / 14%)', '--shadow': '0 28px 72px rgb(0 0 0 / 42%)',\n },\n}\n\n/** Synchronise host light/dark mode while preserving one coherent workspace palette. */\nexport function createKnowledgeHostTheme(\n _computed: ComputedStyleLike,\n snapshot: ThemeSnapshotLike,\n): KnowledgeHostThemeMessage {\n return {\n type: KNOWLEDGE_THEME_MESSAGE,\n version: KNOWLEDGE_THEME_PROTOCOL_VERSION,\n colorScheme: snapshot.active.colorScheme,\n tokens: { ...WORKSPACE_TOKENS[snapshot.active.colorScheme] },\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["target"]
7
7
  }
@@ -93,7 +93,9 @@ function clauseRequestsKnowledgeNote(text, operation, target) {
93
93
  if (!hasQualifiedTarget)
94
94
  return false;
95
95
  if (operation === 'inspect') {
96
- return /(?:查看|读取|读一下|打开|搜索|查找|找一下|列出|浏览|检查|内容|引用|关联|连接|绑定|创建|新建|建立|添加|写入|记录|修改|更新|编辑|追加|重命名|改名|移动|整理|删除|移除|read|open|search|find|list|browse|inspect|reference|link|attach|create|add|write|record|update|edit|append|rename|move|delete|remove)/iu.test(text);
96
+ const inspectIntent = /(?:查看|查询|检索|读取|读一下|打开|搜索|查找|找一下|列出|浏览|检查|看看|内容|引用|关联|连接|绑定|创建|新建|建立|添加|写入|记录|修改|更新|编辑|追加|重命名|改名|移动|整理|删除|移除|read|open|search|query|find|list|browse|inspect|reference|link|attach|create|add|write|record|update|edit|append|rename|move|delete|remove)/iu;
97
+ const clarification = /(?:我说的?是|我指的?是|指的是|说的是|就是|那个|这个).{0,32}(?:笔记|筆記|文档|文檔|markdown|md\s*文件|notes?|notebook|document)/iu;
98
+ return inspectIntent.test(text) || clarification.test(text);
97
99
  }
98
100
  if (deniesKnowledgeNoteMutation(text, operation))
99
101
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-authorization.js","sourceRoot":"","sources":["../src/tool-authorization.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-authorization.js","sourceRoot":"","sources":["../src/tool-authorization.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lemoncat7/dsh-knowledge",
3
- "version": "2.2.8",
3
+ "version": "2.2.9",
4
4
  "description": "Local and remote knowledge bases for DeepSeek Harness, with scoped recall, controlled write-back, and a Web management console",
5
5
  "keywords": [
6
6
  "deepseek-harness",
package/web/app.js CHANGED
@@ -25,6 +25,8 @@ const DOCUMENT_LAYOUT_KEY = 'dsh-knowledge.document-layout'
25
25
  const KNOWLEDGE_DOCUMENT_DRAG_TYPE = 'application/x-dsh-knowledge-document-id'
26
26
  const NOTE_MAX_FILE_SIZE = 64 * 1024 * 1024
27
27
  const pageParams = new URLSearchParams(location.search)
28
+ const initialKnowledgeBaseId = pageParams.get('knowledgeBaseId')?.trim() || ''
29
+ const initialDocumentId = pageParams.get('documentId')?.trim() || ''
28
30
  const mountContext = {
29
31
  sessionId: pageParams.get('sessionId')?.trim() || '',
30
32
  projectId: pageParams.get('projectId')?.trim() || '',
@@ -65,6 +67,8 @@ const state = {
65
67
  entryFilters: { query: '', type: '', status: 'active', projectId: '', knowledgeBaseId: '' },
66
68
  documents: [],
67
69
  documentView: createDocumentViewState({
70
+ knowledgeBaseId: initialKnowledgeBaseId,
71
+ documentId: initialDocumentId,
68
72
  sidebarHidden: savedDocumentLayout.sidebarHidden,
69
73
  sidebarWidth: savedDocumentLayout.sidebarWidth,
70
74
  }),
@@ -638,6 +642,19 @@ async function loadDocuments(signal, onPhase = () => {}) {
638
642
  view.expandedBases.add(view.knowledgeBaseId)
639
643
  await loadDocumentPage(workspace, view.knowledgeBaseId, { signal })
640
644
  }
645
+ if (view.documentId && !state.documents.some(document => document.id === view.documentId)) {
646
+ try {
647
+ const document = await api(`documents/${encodeURIComponent(view.documentId)}`, { signal })
648
+ if (visibleBaseIds.has(document.knowledgeBaseId)) {
649
+ view.knowledgeBaseId = document.knowledgeBaseId
650
+ view.expandedBases.add(document.knowledgeBaseId)
651
+ mergeDocumentSummaries(workspace, [documentSummary(document)], document.knowledgeBaseId, false)
652
+ } else view.documentId = ''
653
+ } catch (error) {
654
+ if (error.name === 'AbortError') throw error
655
+ view.documentId = ''
656
+ }
657
+ }
641
658
  selectDefaultDocument(workspace)
642
659
  if (view.documentId) {
643
660
  onPhase('正在打开最近文档', .82)