@lemoncat7/dsh-knowledge 0.6.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +184 -0
- package/cordis.patch.yml +12 -0
- package/docs/architecture.md +107 -0
- package/docs/document-knowledge-design.zh-CN.md +329 -0
- package/docs/requirements.md +86 -0
- package/lib/api.d.ts +4 -0
- package/lib/api.d.ts.map +1 -0
- package/lib/api.js +497 -0
- package/lib/api.js.map +1 -0
- package/lib/client.js +420 -0
- package/lib/client.js.map +7 -0
- package/lib/config.d.ts +38 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +84 -0
- package/lib/config.js.map +1 -0
- package/lib/connection.d.ts +15 -0
- package/lib/connection.d.ts.map +1 -0
- package/lib/connection.js +95 -0
- package/lib/connection.js.map +1 -0
- package/lib/control.d.ts +26 -0
- package/lib/control.d.ts.map +1 -0
- package/lib/control.js +149 -0
- package/lib/control.js.map +1 -0
- package/lib/domain.d.ts +207 -0
- package/lib/domain.d.ts.map +1 -0
- package/lib/domain.js +122 -0
- package/lib/domain.js.map +1 -0
- package/lib/extraction.d.ts +27 -0
- package/lib/extraction.d.ts.map +1 -0
- package/lib/extraction.js +367 -0
- package/lib/extraction.js.map +1 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +198 -0
- package/lib/index.js.map +1 -0
- package/lib/local-provider.d.ts +60 -0
- package/lib/local-provider.d.ts.map +1 -0
- package/lib/local-provider.js +1096 -0
- package/lib/local-provider.js.map +1 -0
- package/lib/provider-router.d.ts +19 -0
- package/lib/provider-router.d.ts.map +1 -0
- package/lib/provider-router.js +83 -0
- package/lib/provider-router.js.map +1 -0
- package/lib/provider.d.ts +38 -0
- package/lib/provider.d.ts.map +1 -0
- package/lib/provider.js +2 -0
- package/lib/provider.js.map +1 -0
- package/lib/recall.d.ts +8 -0
- package/lib/recall.d.ts.map +1 -0
- package/lib/recall.js +76 -0
- package/lib/recall.js.map +1 -0
- package/lib/remote-provider.d.ts +51 -0
- package/lib/remote-provider.d.ts.map +1 -0
- package/lib/remote-provider.js +216 -0
- package/lib/remote-provider.js.map +1 -0
- package/lib/retrieval.d.ts +35 -0
- package/lib/retrieval.d.ts.map +1 -0
- package/lib/retrieval.js +206 -0
- package/lib/retrieval.js.map +1 -0
- package/lib/runtime.d.ts +147 -0
- package/lib/runtime.d.ts.map +1 -0
- package/lib/runtime.js +26 -0
- package/lib/runtime.js.map +1 -0
- package/lib/tools.d.ts +6 -0
- package/lib/tools.d.ts.map +1 -0
- package/lib/tools.js +99 -0
- package/lib/tools.js.map +1 -0
- package/lib/web.d.ts +3 -0
- package/lib/web.d.ts.map +1 -0
- package/lib/web.js +71 -0
- package/lib/web.js.map +1 -0
- package/package.json +79 -0
- package/web/app.js +1686 -0
- package/web/index.html +19 -0
- package/web/styles.css +786 -0
package/lib/client.js
ADDED
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
window.__ModuleLoader__.load({ id: "@lemoncat7/dsh-knowledge", factory: (require) => { var module = { exports: {} }; var exports = module.exports;
|
|
2
|
+
"use strict";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/client.tsx
|
|
22
|
+
var client_exports = {};
|
|
23
|
+
__export(client_exports, {
|
|
24
|
+
apply: () => apply,
|
|
25
|
+
inject: () => inject
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(client_exports);
|
|
28
|
+
var import_react = require("react");
|
|
29
|
+
var import_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
30
|
+
|
|
31
|
+
// src/client.css
|
|
32
|
+
var client_default = ".dsh-knowledge-trigger {\n flex: none;\n display: flex;\n align-items: center;\n gap: 8px;\n width: calc(100% + 8px);\n height: 34px;\n margin: 4px -4px;\n padding: 6px 2px 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}\n\n.dsh-knowledge-trigger:hover {\n background: var(--dsw-alias-interactive-bg-hover);\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.dsh-knowledge-overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n box-sizing: border-box;\n}\n\n.dsh-knowledge-mask {\n position: absolute;\n inset: 0;\n background: var(--dsw-alias-bg-mask-1);\n backdrop-filter: var(--dsw-mask-blur);\n}\n\n.dsh-knowledge-panel {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n width: min(1180px, calc(100vw - 48px));\n height: min(860px, calc(100vh - 48px));\n min-width: min(1040px, calc(100vw - 32px));\n min-height: 460px;\n max-width: calc(100vw - 32px);\n max-height: calc(100vh - 32px);\n border-radius: 24px;\n overflow: hidden;\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n resize: both;\n}\n\n.dsh-knowledge-panel--maximized {\n width: calc(100vw - 32px);\n height: calc(100vh - 32px);\n resize: none;\n}\n\n.dsh-knowledge-header {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n min-height: 68px;\n padding: 10px 16px 10px 24px;\n box-sizing: border-box;\n border-bottom: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .18));\n}\n\n.dsh-knowledge-window-actions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.dsh-knowledge-header h2,\n.dsh-knowledge-header p {\n margin: 0;\n}\n\n.dsh-knowledge-header h2 {\n color: var(--dsw-alias-label-primary);\n font-size: 17px;\n line-height: 26px;\n font-weight: 600;\n}\n\n.dsh-knowledge-header p {\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 18px;\n}\n\n.dsh-knowledge-window-button {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n.dsh-knowledge-window-button:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.dsh-knowledge-window-button:focus-visible {\n outline: 2px solid var(--dsw-alias-interactive-primary, #335cff);\n outline-offset: 2px;\n}\n\n.dsh-knowledge-resize-grip {\n position: absolute;\n right: 3px;\n bottom: 3px;\n width: 20px;\n height: 20px;\n pointer-events: none;\n background: repeating-linear-gradient(135deg, transparent 0 4px, var(--dsw-alias-divider-primary, rgba(128, 128, 128, .42)) 4px 6px);\n clip-path: polygon(100% 0, 100% 100%, 0 100%);\n}\n\n.dsh-knowledge-frame {\n flex: 1;\n width: 100%;\n min-height: 0;\n border: 0;\n background: var(--dsw-alias-bg-layer-1, #fff);\n}\n\n@media (max-width: 760px) {\n .dsh-knowledge-overlay {\n padding: 0;\n }\n\n .dsh-knowledge-panel {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n max-width: none;\n max-height: none;\n border-radius: 0;\n resize: none;\n }\n\n .dsh-knowledge-window-actions > :first-child,\n .dsh-knowledge-resize-grip { display: none; }\n}\n\n.dsh-knowledge-settings-card {\n list-style: none;\n overflow: hidden;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .18));\n border-radius: 18px;\n background: var(--dsw-alias-bg-layer-2, #fff);\n color: var(--dsw-alias-label-primary, #171719);\n}\n\n.dsh-knowledge-settings-card--open {\n box-shadow: 0 10px 32px rgba(0, 0, 0, .07);\n}\n\n.dsh-knowledge-settings-header {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n padding: 18px 20px;\n border: 0;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.dsh-knowledge-settings-header:hover { background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, .08)); }\n.dsh-knowledge-settings-header:focus-visible,\n.dsh-knowledge-settings-actions button:focus-visible,\n.dsh-knowledge-settings-load-error button:focus-visible {\n outline: 2px solid var(--dsw-alias-interactive-primary, #335cff);\n outline-offset: 2px;\n}\n.dsh-knowledge-settings-header > span:first-child { display: grid; gap: 3px; }\n.dsh-knowledge-settings-header strong { font-size: 15px; font-weight: 600; }\n.dsh-knowledge-settings-header small,\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 { flex: none; color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n\n.dsh-knowledge-settings-body {\n display: grid;\n gap: 18px;\n padding: 4px 20px 20px;\n border-top: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .14));\n}\n\n.dsh-knowledge-source-picker {\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; 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(--dsw-alias-interactive-primary, #335cff);\n background: color-mix(in srgb, var(--dsw-alias-interactive-primary, #335cff) 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(--dsw-alias-interactive-primary, #335cff);\n outline-offset: 2px;\n}\n.dsh-knowledge-source-picker input { margin-top: 2px; accent-color: var(--dsw-alias-interactive-primary, #335cff); }\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 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(--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(--dsw-alias-interactive-primary, #335cff); box-shadow: 0 0 0 3px rgba(51, 92, 255, .12); }\n.dsh-knowledge-timeout-field { max-width: 240px; }\n.dsh-knowledge-field-error { color: #c9362b !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: #15803d; }\n.dsh-knowledge-settings-message.is-error { color: #c9362b; }\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, #c9362b 8%, transparent);\n color: #c9362b;\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(--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(--dsw-alias-interactive-primary, #335cff); color: #fff; }\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}\n";
|
|
33
|
+
|
|
34
|
+
// src/client.tsx
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var PLUGIN_ID = "@lemoncat7/dsh-knowledge";
|
|
37
|
+
var STYLE_ID = `${PLUGIN_ID}/client`;
|
|
38
|
+
var PANEL_SIZE_KEY = `${PLUGIN_ID}/panel-size`;
|
|
39
|
+
var CONNECTION_CONTROL_PATH = "/knowledge-control/v1/connection";
|
|
40
|
+
var inject = ["slots"];
|
|
41
|
+
function apply(ctx) {
|
|
42
|
+
ctx.effect(installStyles, "dsh-knowledge: client styles");
|
|
43
|
+
ctx.slots.inject("sidebar.footer.action", () => ctx.slots.register({
|
|
44
|
+
name: "sidebar.footer.action",
|
|
45
|
+
id: "knowledge",
|
|
46
|
+
order: -10
|
|
47
|
+
}, KnowledgeLauncher));
|
|
48
|
+
ctx.slots.inject("settings.plugin.item", () => ctx.slots.register({
|
|
49
|
+
name: "settings.plugin.item",
|
|
50
|
+
id: "dsh-knowledge-connection",
|
|
51
|
+
order: 25
|
|
52
|
+
}, KnowledgeConnectionCard));
|
|
53
|
+
}
|
|
54
|
+
function KnowledgeConnectionCard() {
|
|
55
|
+
const [current, setCurrent] = (0, import_react.useState)();
|
|
56
|
+
const [loadState, setLoadState] = (0, import_react.useState)("loading");
|
|
57
|
+
const [loadError, setLoadError] = (0, import_react.useState)("");
|
|
58
|
+
const [open, setOpen] = (0, import_react.useState)(false);
|
|
59
|
+
const [backend, setBackend] = (0, import_react.useState)("local");
|
|
60
|
+
const [remoteUrl, setRemoteUrl] = (0, import_react.useState)("");
|
|
61
|
+
const [remoteToken, setRemoteToken] = (0, import_react.useState)("");
|
|
62
|
+
const [timeout, setTimeoutValue] = (0, import_react.useState)("10000");
|
|
63
|
+
const [dirty, setDirty] = (0, import_react.useState)(false);
|
|
64
|
+
const [saving, setSaving] = (0, import_react.useState)(false);
|
|
65
|
+
const [message, setMessage] = (0, import_react.useState)();
|
|
66
|
+
const load = (0, import_react.useCallback)(async (signal) => {
|
|
67
|
+
setLoadState("loading");
|
|
68
|
+
setLoadError("");
|
|
69
|
+
try {
|
|
70
|
+
const value = await requestConnection("GET", void 0, signal);
|
|
71
|
+
setCurrent(value);
|
|
72
|
+
setLoadState("ready");
|
|
73
|
+
} catch (error) {
|
|
74
|
+
if (signal?.aborted) return;
|
|
75
|
+
setLoadError(connectionErrorMessage(error));
|
|
76
|
+
setLoadState("error");
|
|
77
|
+
}
|
|
78
|
+
}, []);
|
|
79
|
+
(0, import_react.useEffect)(() => {
|
|
80
|
+
const controller = new AbortController();
|
|
81
|
+
void load(controller.signal);
|
|
82
|
+
return () => {
|
|
83
|
+
controller.abort();
|
|
84
|
+
};
|
|
85
|
+
}, [load]);
|
|
86
|
+
(0, import_react.useEffect)(() => {
|
|
87
|
+
if (dirty || current === void 0) return;
|
|
88
|
+
setBackend(current.backend);
|
|
89
|
+
setRemoteUrl(current.remoteUrl ?? "");
|
|
90
|
+
setTimeoutValue(String(current.remoteTimeoutMs ?? 1e4));
|
|
91
|
+
}, [current, dirty]);
|
|
92
|
+
const timeoutNumber = Number(timeout);
|
|
93
|
+
const urlError = backend === "remote" ? validateRemoteUrl(remoteUrl) : void 0;
|
|
94
|
+
const tokenError = backend === "remote" && !current?.tokenConfigured && remoteToken.trim().length === 0 ? "\u9996\u6B21\u8FDE\u63A5\u5FC5\u987B\u586B\u5199\u5BA2\u6237\u7AEF\u4EE4\u724C\u3002" : remoteToken.length > 0 && remoteToken.trim().length < 24 ? "\u4EE4\u724C\u81F3\u5C11\u9700\u8981 24 \u4E2A\u5B57\u7B26\u3002" : void 0;
|
|
95
|
+
const timeoutError = !Number.isInteger(timeoutNumber) || timeoutNumber < 100 || timeoutNumber > 12e4 ? "\u8D85\u65F6\u5FC5\u987B\u662F 100 \u5230 120000 \u6BEB\u79D2\u4E4B\u95F4\u7684\u6574\u6570\u3002" : void 0;
|
|
96
|
+
const invalid = urlError !== void 0 || tokenError !== void 0 || timeoutError !== void 0;
|
|
97
|
+
const edit = (action) => {
|
|
98
|
+
action();
|
|
99
|
+
setDirty(true);
|
|
100
|
+
setMessage(void 0);
|
|
101
|
+
};
|
|
102
|
+
const reset = () => {
|
|
103
|
+
setBackend(current?.backend ?? "local");
|
|
104
|
+
setRemoteUrl(current?.remoteUrl ?? "");
|
|
105
|
+
setRemoteToken("");
|
|
106
|
+
setTimeoutValue(String(current?.remoteTimeoutMs ?? 1e4));
|
|
107
|
+
setDirty(false);
|
|
108
|
+
setMessage(void 0);
|
|
109
|
+
};
|
|
110
|
+
const save = async () => {
|
|
111
|
+
if (!dirty || invalid || !current?.writable || saving) return;
|
|
112
|
+
setSaving(true);
|
|
113
|
+
setMessage(void 0);
|
|
114
|
+
try {
|
|
115
|
+
const next = await requestConnection("PUT", {
|
|
116
|
+
backend,
|
|
117
|
+
remoteTimeoutMs: timeoutNumber,
|
|
118
|
+
...backend === "remote" ? { remoteUrl: remoteUrl.trim() } : {},
|
|
119
|
+
...backend === "remote" && remoteToken.trim().length > 0 ? { remoteToken: remoteToken.trim() } : {}
|
|
120
|
+
});
|
|
121
|
+
setCurrent(next);
|
|
122
|
+
setRemoteToken("");
|
|
123
|
+
setDirty(false);
|
|
124
|
+
setMessage({
|
|
125
|
+
kind: "success",
|
|
126
|
+
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"
|
|
127
|
+
});
|
|
128
|
+
} catch (error) {
|
|
129
|
+
setMessage({ kind: "error", text: connectionErrorMessage(error) });
|
|
130
|
+
} finally {
|
|
131
|
+
setSaving(false);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { className: `dsh-knowledge-settings-card${open ? " dsh-knowledge-settings-card--open" : ""}`, children: [
|
|
135
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", { type: "button", className: "dsh-knowledge-settings-header", "aria-expanded": open, onClick: () => {
|
|
136
|
+
setOpen((value) => !value);
|
|
137
|
+
}, children: [
|
|
138
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
|
|
139
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u77E5\u8BC6\u5E93\u8FDE\u63A5" }),
|
|
140
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u9009\u62E9\u672C\u673A\u77E5\u8BC6\u5E93\uFF0C\u6216\u8FDE\u63A5\u4E00\u53F0\u4E2D\u592E DSH \u77E5\u8BC6\u5E93" })
|
|
141
|
+
] }),
|
|
142
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "dsh-knowledge-settings-summary", children: [
|
|
143
|
+
loadState === "loading" ? "\u8BFB\u53D6\u4E2D" : loadState === "error" ? "\u8FDE\u63A5\u5165\u53E3" : current?.backend === "remote" ? "\u8FDC\u7A0B" : "\u672C\u5730",
|
|
144
|
+
" \xB7 ",
|
|
145
|
+
open ? "\u6536\u8D77" : "\u8BBE\u7F6E"
|
|
146
|
+
] })
|
|
147
|
+
] }),
|
|
148
|
+
open && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-knowledge-settings-body", children: loadState === "loading" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-knowledge-settings-note", role: "status", children: "\u6B63\u5728\u8BFB\u53D6\u8FDE\u63A5\u914D\u7F6E\u2026" }) : loadState === "error" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-knowledge-settings-load-error", role: "alert", children: [
|
|
149
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: loadError }),
|
|
150
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: () => {
|
|
151
|
+
void load();
|
|
152
|
+
}, children: "\u91CD\u65B0\u8BFB\u53D6" })
|
|
153
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
154
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("fieldset", { className: "dsh-knowledge-source-picker", children: [
|
|
155
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("legend", { children: "\u77E5\u8BC6\u5E93\u6765\u6E90" }),
|
|
156
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: backend === "local" ? "is-selected" : "", children: [
|
|
157
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { type: "radio", name: "dsh-knowledge-backend", checked: backend === "local", onChange: () => edit(() => {
|
|
158
|
+
setBackend("local");
|
|
159
|
+
}) }),
|
|
160
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
|
|
161
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u672C\u5730" }),
|
|
162
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u6570\u636E\u4FDD\u5B58\u5728\u5F53\u524D DSH \u7684 SQLite \u4E2D" })
|
|
163
|
+
] })
|
|
164
|
+
] }),
|
|
165
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: `${backend === "remote" ? "is-selected" : ""}${!current?.canSwitchRemote ? " is-disabled" : ""}`, children: [
|
|
166
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { type: "radio", name: "dsh-knowledge-backend", checked: backend === "remote", disabled: !current?.canSwitchRemote, onChange: () => edit(() => {
|
|
167
|
+
setBackend("remote");
|
|
168
|
+
}) }),
|
|
169
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
|
|
170
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { children: "\u8FDC\u7A0B" }),
|
|
171
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { children: "\u53EC\u56DE\u548C\u56DE\u5199\u7EDF\u4E00\u4F7F\u7528\u4E2D\u592E\u77E5\u8BC6\u5E93" })
|
|
172
|
+
] })
|
|
173
|
+
] })
|
|
174
|
+
] }),
|
|
175
|
+
!current?.canSwitchRemote && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-knowledge-settings-note", children: "\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" }),
|
|
176
|
+
backend === "remote" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-knowledge-remote-fields", children: [
|
|
177
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { htmlFor: "dsh-knowledge-remote-url", children: [
|
|
178
|
+
"\u670D\u52A1\u5668\u5730\u5740",
|
|
179
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { id: "dsh-knowledge-remote-url", type: "url", value: remoteUrl, placeholder: "https://example.com/knowledge-api/v1", autoComplete: "url", onChange: (event) => edit(() => {
|
|
180
|
+
setRemoteUrl(event.target.value);
|
|
181
|
+
}), "aria-invalid": urlError !== void 0, "aria-describedby": urlError ? "dsh-knowledge-url-error" : void 0 }),
|
|
182
|
+
urlError && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { id: "dsh-knowledge-url-error", className: "dsh-knowledge-field-error", children: urlError })
|
|
183
|
+
] }),
|
|
184
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { htmlFor: "dsh-knowledge-remote-token", children: [
|
|
185
|
+
"\u5BA2\u6237\u7AEF\u4EE4\u724C",
|
|
186
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("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(() => {
|
|
187
|
+
setRemoteToken(event.target.value);
|
|
188
|
+
}), "aria-invalid": tokenError !== void 0, "aria-describedby": "dsh-knowledge-token-help" }),
|
|
189
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { id: "dsh-knowledge-token-help", className: tokenError ? "dsh-knowledge-field-error" : void 0, children: 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") })
|
|
190
|
+
] })
|
|
191
|
+
] }),
|
|
192
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", { className: "dsh-knowledge-timeout-field", htmlFor: "dsh-knowledge-timeout", children: [
|
|
193
|
+
"\u8BF7\u6C42\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09",
|
|
194
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", { id: "dsh-knowledge-timeout", type: "number", min: "100", max: "120000", step: "100", value: timeout, onChange: (event) => edit(() => {
|
|
195
|
+
setTimeoutValue(event.target.value);
|
|
196
|
+
}), "aria-invalid": timeoutError !== void 0 }),
|
|
197
|
+
timeoutError && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("small", { className: "dsh-knowledge-field-error", children: timeoutError })
|
|
198
|
+
] }),
|
|
199
|
+
!current?.writable && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "dsh-knowledge-settings-note", children: "\u5F53\u524D\u63D2\u4EF6\u6CA1\u6709\u914D\u7F6E\u6301\u4E45\u5316\u8DEF\u5F84\uFF0C\u65E0\u6CD5\u4FDD\u5B58\u8FDE\u63A5\u3002" }),
|
|
200
|
+
message && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: `dsh-knowledge-settings-message is-${message.kind}`, role: message.kind === "error" ? "alert" : "status", "aria-live": "polite", children: message.text }),
|
|
201
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-knowledge-settings-actions", children: [
|
|
202
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: reset, disabled: !dirty || saving, children: "\u653E\u5F03\u66F4\u6539" }),
|
|
203
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "is-primary", onClick: () => {
|
|
204
|
+
void save();
|
|
205
|
+
}, disabled: !dirty || invalid || saving || !current?.writable, children: saving ? "\u6B63\u5728\u9A8C\u8BC1\u2026" : "\u9A8C\u8BC1\u5E76\u8FDE\u63A5" })
|
|
206
|
+
] })
|
|
207
|
+
] }) })
|
|
208
|
+
] });
|
|
209
|
+
}
|
|
210
|
+
function validateRemoteUrl(value) {
|
|
211
|
+
try {
|
|
212
|
+
const url = new URL(value.trim());
|
|
213
|
+
const loopback = url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "::1";
|
|
214
|
+
if (url.protocol !== "https:" && !(url.protocol === "http:" && loopback)) return "\u8FDC\u7A0B\u77E5\u8BC6\u5E93\u5FC5\u987B\u4F7F\u7528 HTTPS\u3002";
|
|
215
|
+
return void 0;
|
|
216
|
+
} catch {
|
|
217
|
+
return "\u8BF7\u8F93\u5165\u5B8C\u6574\u7684\u77E5\u8BC6\u5E93 API \u5730\u5740\u3002";
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function connectionErrorMessage(error) {
|
|
221
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
222
|
+
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";
|
|
223
|
+
return message || "\u8FDE\u63A5\u914D\u7F6E\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5730\u5740\u3001\u4EE4\u724C\u548C DSH \u65E5\u5FD7\u3002";
|
|
224
|
+
}
|
|
225
|
+
async function requestConnection(method, body, signal) {
|
|
226
|
+
const response = await fetch(CONNECTION_CONTROL_PATH, {
|
|
227
|
+
method,
|
|
228
|
+
headers: { accept: "application/json", ...body === void 0 ? {} : { "content-type": "application/json" } },
|
|
229
|
+
...body === void 0 ? {} : { body: JSON.stringify(body) },
|
|
230
|
+
...signal === void 0 ? {} : { signal }
|
|
231
|
+
});
|
|
232
|
+
const payload = await response.json().catch(() => void 0);
|
|
233
|
+
if (!response.ok) {
|
|
234
|
+
const message = payload !== null && typeof payload === "object" && typeof payload.error === "string" ? payload.error : `\u8FDE\u63A5\u63A5\u53E3\u8FD4\u56DE HTTP ${response.status}`;
|
|
235
|
+
throw new Error(message);
|
|
236
|
+
}
|
|
237
|
+
if (!isConnectionView(payload)) throw new Error("\u63D2\u4EF6\u8FDE\u63A5\u63A5\u53E3\u8FD4\u56DE\u4E86\u65E0\u6548\u6570\u636E\u3002");
|
|
238
|
+
return payload;
|
|
239
|
+
}
|
|
240
|
+
function isConnectionView(value) {
|
|
241
|
+
if (value === null || typeof value !== "object") return false;
|
|
242
|
+
const item = value;
|
|
243
|
+
return (item.backend === "local" || item.backend === "remote") && Number.isInteger(item.remoteTimeoutMs) && typeof item.tokenConfigured === "boolean" && typeof item.canSwitchRemote === "boolean" && typeof item.writable === "boolean";
|
|
244
|
+
}
|
|
245
|
+
function KnowledgeLauncher({ wide, useSessions }) {
|
|
246
|
+
const [open, setOpen] = (0, import_react.useState)(false);
|
|
247
|
+
const [maximized, setMaximized] = (0, import_react.useState)(false);
|
|
248
|
+
const close = (0, import_react.useCallback)(() => {
|
|
249
|
+
setOpen(false);
|
|
250
|
+
}, []);
|
|
251
|
+
const sessionId = useSessions((state) => state.current);
|
|
252
|
+
const projectId = useSessions((state) => sessionId === void 0 ? void 0 : state.byId[sessionId]?.cwd);
|
|
253
|
+
const knowledgeUrl = knowledgePanelUrl(sessionId, projectId);
|
|
254
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
255
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
256
|
+
"button",
|
|
257
|
+
{
|
|
258
|
+
type: "button",
|
|
259
|
+
className: `dsh-knowledge-trigger${wide ? "" : " dsh-knowledge-trigger--rail"}`,
|
|
260
|
+
"aria-label": "\u77E5\u8BC6\u5E93",
|
|
261
|
+
"aria-haspopup": "dialog",
|
|
262
|
+
"aria-expanded": open,
|
|
263
|
+
title: wide ? void 0 : "\u77E5\u8BC6\u5E93",
|
|
264
|
+
onClick: () => {
|
|
265
|
+
setOpen(true);
|
|
266
|
+
},
|
|
267
|
+
children: [
|
|
268
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconDataOutline16, { size: wide ? 16 : 18 }),
|
|
269
|
+
wide && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "\u77E5\u8BC6\u5E93" })
|
|
270
|
+
]
|
|
271
|
+
}
|
|
272
|
+
),
|
|
273
|
+
open && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
274
|
+
KnowledgePanel,
|
|
275
|
+
{
|
|
276
|
+
src: knowledgeUrl,
|
|
277
|
+
maximized,
|
|
278
|
+
onToggleMaximized: () => {
|
|
279
|
+
setMaximized((value) => !value);
|
|
280
|
+
},
|
|
281
|
+
onClose: close
|
|
282
|
+
}
|
|
283
|
+
)
|
|
284
|
+
] });
|
|
285
|
+
}
|
|
286
|
+
function KnowledgePanel({
|
|
287
|
+
src,
|
|
288
|
+
maximized,
|
|
289
|
+
onToggleMaximized,
|
|
290
|
+
onClose
|
|
291
|
+
}) {
|
|
292
|
+
const closeButton = (0, import_react.useRef)(null);
|
|
293
|
+
const panel = (0, import_react.useRef)(null);
|
|
294
|
+
const panelSize = (0, import_react.useRef)(readPanelSize());
|
|
295
|
+
(0, import_react.useEffect)(() => {
|
|
296
|
+
const onKeyDown = (event) => {
|
|
297
|
+
if (event.key === "Escape") onClose();
|
|
298
|
+
};
|
|
299
|
+
document.addEventListener("keydown", onKeyDown);
|
|
300
|
+
closeButton.current?.focus();
|
|
301
|
+
return () => {
|
|
302
|
+
document.removeEventListener("keydown", onKeyDown);
|
|
303
|
+
};
|
|
304
|
+
}, [onClose]);
|
|
305
|
+
(0, import_react.useEffect)(() => {
|
|
306
|
+
const target = panel.current;
|
|
307
|
+
if (target === null || typeof ResizeObserver === "undefined") return;
|
|
308
|
+
const minimumWidth = desktopPanelMinimumWidth();
|
|
309
|
+
const observer = new ResizeObserver((entries) => {
|
|
310
|
+
if (target.classList.contains("dsh-knowledge-panel--maximized") || window.innerWidth <= 760) return;
|
|
311
|
+
const rect = entries[0]?.contentRect;
|
|
312
|
+
if (rect === void 0 || rect.width < minimumWidth || rect.height < 460) return;
|
|
313
|
+
panelSize.current = { width: Math.round(rect.width), height: Math.round(rect.height) };
|
|
314
|
+
try {
|
|
315
|
+
localStorage.setItem(PANEL_SIZE_KEY, JSON.stringify(panelSize.current));
|
|
316
|
+
} catch {
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
observer.observe(target);
|
|
320
|
+
return () => {
|
|
321
|
+
observer.disconnect();
|
|
322
|
+
};
|
|
323
|
+
}, []);
|
|
324
|
+
const restoredSize = !maximized && window.innerWidth > 760 ? panelSize.current : void 0;
|
|
325
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-knowledge-overlay", role: "presentation", children: [
|
|
326
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "dsh-knowledge-mask", "aria-hidden": "true", onClick: onClose }),
|
|
327
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
328
|
+
"section",
|
|
329
|
+
{
|
|
330
|
+
ref: panel,
|
|
331
|
+
className: `dsh-knowledge-panel${maximized ? " dsh-knowledge-panel--maximized" : ""}`,
|
|
332
|
+
style: restoredSize,
|
|
333
|
+
role: "dialog",
|
|
334
|
+
"aria-modal": "true",
|
|
335
|
+
"aria-labelledby": "dsh-knowledge-panel-title",
|
|
336
|
+
children: [
|
|
337
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { className: "dsh-knowledge-header", onDoubleClick: (event) => {
|
|
338
|
+
if (!event.target.closest("button")) onToggleMaximized();
|
|
339
|
+
}, children: [
|
|
340
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
341
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { id: "dsh-knowledge-panel-title", children: "\u77E5\u8BC6\u5E93" }),
|
|
342
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: "\u7BA1\u7406\u77E5\u8BC6\u3001AI \u5019\u9009\u548C\u5BA2\u6237\u7AEF\u8BBF\u95EE\u4EE4\u724C" })
|
|
343
|
+
] }),
|
|
344
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "dsh-knowledge-window-actions", children: [
|
|
345
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
346
|
+
"button",
|
|
347
|
+
{
|
|
348
|
+
type: "button",
|
|
349
|
+
className: "dsh-knowledge-window-button",
|
|
350
|
+
"aria-label": maximized ? "\u8FD8\u539F\u77E5\u8BC6\u5E93\u7A97\u53E3" : "\u6700\u5927\u5316\u77E5\u8BC6\u5E93\u7A97\u53E3",
|
|
351
|
+
title: maximized ? "\u8FD8\u539F" : "\u6700\u5927\u5316",
|
|
352
|
+
onClick: (event) => {
|
|
353
|
+
event.stopPropagation();
|
|
354
|
+
onToggleMaximized();
|
|
355
|
+
},
|
|
356
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { "aria-hidden": "true", children: maximized ? "\u2199" : "\u2197" })
|
|
357
|
+
}
|
|
358
|
+
),
|
|
359
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
360
|
+
"button",
|
|
361
|
+
{
|
|
362
|
+
ref: closeButton,
|
|
363
|
+
type: "button",
|
|
364
|
+
className: "dsh-knowledge-window-button",
|
|
365
|
+
"aria-label": "\u5173\u95ED\u77E5\u8BC6\u5E93",
|
|
366
|
+
onClick: onClose,
|
|
367
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconCloseOutline16, { size: 16 })
|
|
368
|
+
}
|
|
369
|
+
)
|
|
370
|
+
] })
|
|
371
|
+
] }),
|
|
372
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("iframe", { className: "dsh-knowledge-frame", src, title: "\u77E5\u8BC6\u5E93\u7BA1\u7406\u53F0" }),
|
|
373
|
+
!maximized && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "dsh-knowledge-resize-grip", "aria-hidden": "true" })
|
|
374
|
+
]
|
|
375
|
+
}
|
|
376
|
+
)
|
|
377
|
+
] });
|
|
378
|
+
}
|
|
379
|
+
function readPanelSize() {
|
|
380
|
+
const minimumWidth = desktopPanelMinimumWidth();
|
|
381
|
+
const fallback = {
|
|
382
|
+
width: Math.min(1180, Math.max(minimumWidth, window.innerWidth - 48)),
|
|
383
|
+
height: Math.min(860, Math.max(460, window.innerHeight - 48))
|
|
384
|
+
};
|
|
385
|
+
try {
|
|
386
|
+
const value = JSON.parse(localStorage.getItem(PANEL_SIZE_KEY) || "{}");
|
|
387
|
+
const width = Number(value.width);
|
|
388
|
+
const height = Number(value.height);
|
|
389
|
+
return {
|
|
390
|
+
width: Number.isFinite(width) ? Math.min(window.innerWidth - 32, Math.max(minimumWidth, width)) : fallback.width,
|
|
391
|
+
height: Number.isFinite(height) ? Math.min(window.innerHeight - 32, Math.max(460, height)) : fallback.height
|
|
392
|
+
};
|
|
393
|
+
} catch {
|
|
394
|
+
return fallback;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
function desktopPanelMinimumWidth() {
|
|
398
|
+
return Math.min(1040, Math.max(320, window.innerWidth - 32));
|
|
399
|
+
}
|
|
400
|
+
function knowledgePanelUrl(sessionId, projectId) {
|
|
401
|
+
const params = new URLSearchParams();
|
|
402
|
+
if (sessionId !== void 0) params.set("sessionId", sessionId);
|
|
403
|
+
if (projectId !== void 0) params.set("projectId", projectId);
|
|
404
|
+
const query = params.toString();
|
|
405
|
+
return query.length === 0 ? "/knowledge" : `/knowledge?${query}`;
|
|
406
|
+
}
|
|
407
|
+
function installStyles() {
|
|
408
|
+
const previous = document.querySelector(`style[data-plugin-css="${STYLE_ID}"]`);
|
|
409
|
+
previous?.remove();
|
|
410
|
+
const style = document.createElement("style");
|
|
411
|
+
style.dataset.plugin = PLUGIN_ID;
|
|
412
|
+
style.dataset.pluginCss = STYLE_ID;
|
|
413
|
+
style.textContent = client_default;
|
|
414
|
+
document.head.appendChild(style);
|
|
415
|
+
return () => {
|
|
416
|
+
style.remove();
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
return module.exports; } });
|
|
420
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/client.tsx", "../src/client.css"],
|
|
4
|
+
"sourcesContent": ["import { useCallback, useEffect, useRef, useState } from 'react'\nimport {\n IconCloseOutline16,\n IconDataOutline16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport cssText from './client.css'\n\nconst PLUGIN_ID = '@lemoncat7/dsh-knowledge'\nconst STYLE_ID = `${PLUGIN_ID}/client`\nconst PANEL_SIZE_KEY = `${PLUGIN_ID}/panel-size`\n\ninterface SidebarActionProps {\n wide: boolean\n useSessions<T>(selector: (state: {\n current?: string\n byId: Record<string, { cwd?: string }>\n }) => T): T\n}\n\ninterface SlotService {\n inject(name: string, register: () => unknown): unknown\n register(options: Record<string, unknown>, component: (props: SidebarActionProps) => JSX.Element): unknown\n}\n\ninterface ClientContext {\n slots: SlotService\n effect(setup: () => void | (() => void), label?: string): unknown\n}\n\ninterface KnowledgeConnectionView {\n backend: 'local' | 'remote'\n remoteUrl?: string\n remoteTimeoutMs: number\n tokenConfigured: boolean\n canSwitchRemote: boolean\n writable: boolean\n}\n\nconst CONNECTION_CONTROL_PATH = '/knowledge-control/v1/connection'\n\n/** Cordis services needed by the browser half. */\nexport const inject = ['slots']\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 ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action',\n id: 'knowledge',\n order: -10,\n }, KnowledgeLauncher))\n\n ctx.slots.inject('settings.plugin.item', () => ctx.slots.register({\n name: 'settings.plugin.item',\n id: 'dsh-knowledge-connection',\n order: 25,\n }, KnowledgeConnectionCard))\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>\n <strong>\u77E5\u8BC6\u5E93\u8FDE\u63A5</strong>\n <small>\u9009\u62E9\u672C\u673A\u77E5\u8BC6\u5E93\uFF0C\u6216\u8FDE\u63A5\u4E00\u53F0\u4E2D\u592E DSH \u77E5\u8BC6\u5E93</small>\n </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'} \u00B7 {open ? '\u6536\u8D77' : '\u8BBE\u7F6E'}</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 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}\n\nfunction KnowledgeLauncher({ wide, useSessions }: SidebarActionProps) {\n const [open, setOpen] = useState(false)\n const [maximized, setMaximized] = useState(false)\n const close = useCallback(() => { setOpen(false) }, [])\n const sessionId = useSessions(state => state.current)\n const projectId = useSessions(state => sessionId === undefined ? undefined : state.byId[sessionId]?.cwd)\n const knowledgeUrl = knowledgePanelUrl(sessionId, projectId)\n\n return (\n <>\n <button\n type=\"button\"\n className={`dsh-knowledge-trigger${wide ? '' : ' dsh-knowledge-trigger--rail'}`}\n aria-label=\"\u77E5\u8BC6\u5E93\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n title={wide ? undefined : '\u77E5\u8BC6\u5E93'}\n onClick={() => { setOpen(true) }}\n >\n <IconDataOutline16 size={wide ? 16 : 18} />\n {wide && <span>\u77E5\u8BC6\u5E93</span>}\n </button>\n {open && <KnowledgePanel\n src={knowledgeUrl}\n maximized={maximized}\n onToggleMaximized={() => { setMaximized(value => !value) }}\n onClose={close}\n />}\n </>\n )\n}\n\nfunction KnowledgePanel({\n src,\n maximized,\n onToggleMaximized,\n onClose,\n}: {\n src: string\n maximized: boolean\n onToggleMaximized: () => void\n onClose: () => void\n}) {\n const closeButton = useRef<HTMLButtonElement | null>(null)\n const panel = useRef<HTMLElement | null>(null)\n const panelSize = useRef(readPanelSize())\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', onKeyDown)\n closeButton.current?.focus()\n return () => { document.removeEventListener('keydown', onKeyDown) }\n }, [onClose])\n\n useEffect(() => {\n const target = panel.current\n if (target === null || typeof ResizeObserver === 'undefined') return\n const minimumWidth = desktopPanelMinimumWidth()\n const observer = new ResizeObserver(entries => {\n if (target.classList.contains('dsh-knowledge-panel--maximized') || window.innerWidth <= 760) return\n const rect = entries[0]?.contentRect\n if (rect === undefined || rect.width < minimumWidth || rect.height < 460) return\n panelSize.current = { width: Math.round(rect.width), height: Math.round(rect.height) }\n try { localStorage.setItem(PANEL_SIZE_KEY, JSON.stringify(panelSize.current)) } catch {}\n })\n observer.observe(target)\n return () => { observer.disconnect() }\n }, [])\n\n const restoredSize = !maximized && window.innerWidth > 760 ? panelSize.current : undefined\n\n return (\n <div className=\"dsh-knowledge-overlay\" role=\"presentation\">\n <div className=\"dsh-knowledge-mask\" aria-hidden=\"true\" onClick={onClose} />\n <section\n ref={panel}\n className={`dsh-knowledge-panel${maximized ? ' dsh-knowledge-panel--maximized' : ''}`}\n style={restoredSize}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"dsh-knowledge-panel-title\"\n >\n <header className=\"dsh-knowledge-header\" onDoubleClick={(event) => {\n if (!(event.target as HTMLElement).closest('button')) onToggleMaximized()\n }}>\n <div>\n <h2 id=\"dsh-knowledge-panel-title\">\u77E5\u8BC6\u5E93</h2>\n <p>\u7BA1\u7406\u77E5\u8BC6\u3001AI \u5019\u9009\u548C\u5BA2\u6237\u7AEF\u8BBF\u95EE\u4EE4\u724C</p>\n </div>\n <div className=\"dsh-knowledge-window-actions\">\n <button\n type=\"button\"\n className=\"dsh-knowledge-window-button\"\n aria-label={maximized ? '\u8FD8\u539F\u77E5\u8BC6\u5E93\u7A97\u53E3' : '\u6700\u5927\u5316\u77E5\u8BC6\u5E93\u7A97\u53E3'}\n title={maximized ? '\u8FD8\u539F' : '\u6700\u5927\u5316'}\n onClick={(event) => { event.stopPropagation(); onToggleMaximized() }}\n >\n <span aria-hidden=\"true\">{maximized ? '\u2199' : '\u2197'}</span>\n </button>\n <button\n ref={closeButton}\n type=\"button\"\n className=\"dsh-knowledge-window-button\"\n aria-label=\"\u5173\u95ED\u77E5\u8BC6\u5E93\"\n onClick={onClose}\n >\n <IconCloseOutline16 size={16} />\n </button>\n </div>\n </header>\n <iframe className=\"dsh-knowledge-frame\" src={src} title=\"\u77E5\u8BC6\u5E93\u7BA1\u7406\u53F0\" />\n {!maximized && <span className=\"dsh-knowledge-resize-grip\" aria-hidden=\"true\" />}\n </section>\n </div>\n )\n}\n\nfunction readPanelSize(): { width: number; height: number } {\n const minimumWidth = desktopPanelMinimumWidth()\n const fallback = {\n width: Math.min(1180, Math.max(minimumWidth, window.innerWidth - 48)),\n height: Math.min(860, Math.max(460, window.innerHeight - 48)),\n }\n try {\n const value = JSON.parse(localStorage.getItem(PANEL_SIZE_KEY) || '{}') as { width?: unknown; height?: unknown }\n const width = Number(value.width)\n const height = Number(value.height)\n return {\n width: Number.isFinite(width) ? Math.min(window.innerWidth - 32, Math.max(minimumWidth, width)) : fallback.width,\n height: Number.isFinite(height) ? Math.min(window.innerHeight - 32, Math.max(460, height)) : fallback.height,\n }\n } catch { return fallback }\n}\n\nfunction desktopPanelMinimumWidth(): number {\n return Math.min(1040, Math.max(320, window.innerWidth - 32))\n}\n\nfunction knowledgePanelUrl(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 ? '/knowledge' : `/knowledge?${query}`\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", ".dsh-knowledge-trigger {\n flex: none;\n display: flex;\n align-items: center;\n gap: 8px;\n width: calc(100% + 8px);\n height: 34px;\n margin: 4px -4px;\n padding: 6px 2px 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}\n\n.dsh-knowledge-trigger:hover {\n background: var(--dsw-alias-interactive-bg-hover);\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.dsh-knowledge-overlay {\n position: fixed;\n inset: 0;\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n box-sizing: border-box;\n}\n\n.dsh-knowledge-mask {\n position: absolute;\n inset: 0;\n background: var(--dsw-alias-bg-mask-1);\n backdrop-filter: var(--dsw-mask-blur);\n}\n\n.dsh-knowledge-panel {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n width: min(1180px, calc(100vw - 48px));\n height: min(860px, calc(100vh - 48px));\n min-width: min(1040px, calc(100vw - 32px));\n min-height: 460px;\n max-width: calc(100vw - 32px);\n max-height: calc(100vh - 32px);\n border-radius: 24px;\n overflow: hidden;\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n resize: both;\n}\n\n.dsh-knowledge-panel--maximized {\n width: calc(100vw - 32px);\n height: calc(100vh - 32px);\n resize: none;\n}\n\n.dsh-knowledge-header {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n min-height: 68px;\n padding: 10px 16px 10px 24px;\n box-sizing: border-box;\n border-bottom: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .18));\n}\n\n.dsh-knowledge-window-actions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.dsh-knowledge-header h2,\n.dsh-knowledge-header p {\n margin: 0;\n}\n\n.dsh-knowledge-header h2 {\n color: var(--dsw-alias-label-primary);\n font-size: 17px;\n line-height: 26px;\n font-weight: 600;\n}\n\n.dsh-knowledge-header p {\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n line-height: 18px;\n}\n\n.dsh-knowledge-window-button {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n background: transparent;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n.dsh-knowledge-window-button:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.dsh-knowledge-window-button:focus-visible {\n outline: 2px solid var(--dsw-alias-interactive-primary, #335cff);\n outline-offset: 2px;\n}\n\n.dsh-knowledge-resize-grip {\n position: absolute;\n right: 3px;\n bottom: 3px;\n width: 20px;\n height: 20px;\n pointer-events: none;\n background: repeating-linear-gradient(135deg, transparent 0 4px, var(--dsw-alias-divider-primary, rgba(128, 128, 128, .42)) 4px 6px);\n clip-path: polygon(100% 0, 100% 100%, 0 100%);\n}\n\n.dsh-knowledge-frame {\n flex: 1;\n width: 100%;\n min-height: 0;\n border: 0;\n background: var(--dsw-alias-bg-layer-1, #fff);\n}\n\n@media (max-width: 760px) {\n .dsh-knowledge-overlay {\n padding: 0;\n }\n\n .dsh-knowledge-panel {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n max-width: none;\n max-height: none;\n border-radius: 0;\n resize: none;\n }\n\n .dsh-knowledge-window-actions > :first-child,\n .dsh-knowledge-resize-grip { display: none; }\n}\n\n.dsh-knowledge-settings-card {\n list-style: none;\n overflow: hidden;\n border: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .18));\n border-radius: 18px;\n background: var(--dsw-alias-bg-layer-2, #fff);\n color: var(--dsw-alias-label-primary, #171719);\n}\n\n.dsh-knowledge-settings-card--open {\n box-shadow: 0 10px 32px rgba(0, 0, 0, .07);\n}\n\n.dsh-knowledge-settings-header {\n display: flex;\n width: 100%;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n padding: 18px 20px;\n border: 0;\n background: transparent;\n color: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.dsh-knowledge-settings-header:hover { background: var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, .08)); }\n.dsh-knowledge-settings-header:focus-visible,\n.dsh-knowledge-settings-actions button:focus-visible,\n.dsh-knowledge-settings-load-error button:focus-visible {\n outline: 2px solid var(--dsw-alias-interactive-primary, #335cff);\n outline-offset: 2px;\n}\n.dsh-knowledge-settings-header > span:first-child { display: grid; gap: 3px; }\n.dsh-knowledge-settings-header strong { font-size: 15px; font-weight: 600; }\n.dsh-knowledge-settings-header small,\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 { flex: none; color: var(--dsw-alias-label-secondary, #68686f); font-size: 12px; }\n\n.dsh-knowledge-settings-body {\n display: grid;\n gap: 18px;\n padding: 4px 20px 20px;\n border-top: 1px solid var(--dsw-alias-divider-primary, rgba(128, 128, 128, .14));\n}\n\n.dsh-knowledge-source-picker {\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; 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(--dsw-alias-interactive-primary, #335cff);\n background: color-mix(in srgb, var(--dsw-alias-interactive-primary, #335cff) 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(--dsw-alias-interactive-primary, #335cff);\n outline-offset: 2px;\n}\n.dsh-knowledge-source-picker input { margin-top: 2px; accent-color: var(--dsw-alias-interactive-primary, #335cff); }\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 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(--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(--dsw-alias-interactive-primary, #335cff); box-shadow: 0 0 0 3px rgba(51, 92, 255, .12); }\n.dsh-knowledge-timeout-field { max-width: 240px; }\n.dsh-knowledge-field-error { color: #c9362b !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: #15803d; }\n.dsh-knowledge-settings-message.is-error { color: #c9362b; }\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, #c9362b 8%, transparent);\n color: #c9362b;\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(--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(--dsw-alias-interactive-primary, #335cff); color: #fff; }\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}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAyD;AACzD,sCAGO;;;ACJP;;;ADsJQ;AA/IR,IAAM,YAAY;AAClB,IAAM,WAAW,GAAG,SAAS;AAC7B,IAAM,iBAAiB,GAAG,SAAS;AA6BnC,IAAM,0BAA0B;AAGzB,IAAM,SAAS,CAAC,OAAO;AAGvB,SAAS,MAAM,KAA0B;AAC9C,MAAI,OAAO,eAAe,8BAA8B;AACxD,MAAI,MAAM,OAAO,yBAAyB,MAAM,IAAI,MAAM,SAAS;AAAA,IACjE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,EACT,GAAG,iBAAiB,CAAC;AAErB,MAAI,MAAM,OAAO,wBAAwB,MAAM,IAAI,MAAM,SAAS;AAAA,IAChE,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,EACT,GAAG,uBAAuB,CAAC;AAC7B;AAEA,SAAS,0BAA0B;AACjC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAkC;AAChE,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAwC,SAAS;AACnF,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,EAAE;AAC7C,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,KAAK;AACtC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAA6B,OAAO;AAClE,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,EAAE;AAC7C,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAS,EAAE;AACjD,QAAM,CAAC,SAAS,eAAe,QAAI,uBAAS,OAAO;AACnD,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,KAAK;AACxC,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAC1C,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAsD;AAEpF,QAAM,WAAO,0BAAY,OAAO,WAAwC;AACtE,iBAAa,SAAS;AACtB,iBAAa,EAAE;AACf,QAAI;AACF,YAAM,QAAQ,MAAM,kBAAkB,OAAO,QAAW,MAAM;AAC9D,iBAAW,KAAK;AAChB,mBAAa,OAAO;AAAA,IACtB,SAAS,OAAO;AACd,UAAI,QAAQ,QAAS;AACrB,mBAAa,uBAAuB,KAAK,CAAC;AAC1C,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACd,UAAM,aAAa,IAAI,gBAAgB;AACvC,SAAK,KAAK,WAAW,MAAM;AAC3B,WAAO,MAAM;AAAE,iBAAW,MAAM;AAAA,IAAE;AAAA,EACpC,GAAG,CAAC,IAAI,CAAC;AAET,8BAAU,MAAM;AACd,QAAI,SAAS,YAAY,OAAW;AACpC,eAAW,QAAQ,OAAO;AAC1B,iBAAa,QAAQ,aAAa,EAAE;AACpC,oBAAgB,OAAO,QAAQ,mBAAmB,GAAK,CAAC;AAAA,EAC1D,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,gBAAgB,OAAO,OAAO;AACpC,QAAM,WAAW,YAAY,WAAW,kBAAkB,SAAS,IAAI;AACvE,QAAM,aAAa,YAAY,YAAY,CAAC,SAAS,mBAAmB,YAAY,KAAK,EAAE,WAAW,IAClG,yFACA,YAAY,SAAS,KAAK,YAAY,KAAK,EAAE,SAAS,KAAK,qEAAmB;AAClF,QAAM,eAAe,CAAC,OAAO,UAAU,aAAa,KAAK,gBAAgB,OAAO,gBAAgB,OAC5F,sGACA;AACJ,QAAM,UAAU,aAAa,UAAa,eAAe,UAAa,iBAAiB;AAEvF,QAAM,OAAO,CAAC,WAA6B;AACzC,WAAO;AACP,aAAS,IAAI;AACb,eAAW,MAAS;AAAA,EACtB;AACA,QAAM,QAAQ,MAAY;AACxB,eAAW,SAAS,WAAW,OAAO;AACtC,iBAAa,SAAS,aAAa,EAAE;AACrC,mBAAe,EAAE;AACjB,oBAAgB,OAAO,SAAS,mBAAmB,GAAK,CAAC;AACzD,aAAS,KAAK;AACd,eAAW,MAAS;AAAA,EACtB;AACA,QAAM,OAAO,YAA2B;AACtC,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,YAAY,OAAQ;AACvD,cAAU,IAAI;AACd,eAAW,MAAS;AACpB,QAAI;AACF,YAAM,OAAO,MAAM,kBAAkB,OAAO;AAAA,QAC1C;AAAA,QACA,iBAAiB;AAAA,QACjB,GAAG,YAAY,WAAW,EAAE,WAAW,UAAU,KAAK,EAAE,IAAI,CAAC;AAAA,QAC7D,GAAG,YAAY,YAAY,YAAY,KAAK,EAAE,SAAS,IAAI,EAAE,aAAa,YAAY,KAAK,EAAE,IAAI,CAAC;AAAA,MACpG,CAAC;AACD,iBAAW,IAAI;AACf,qBAAe,EAAE;AACjB,eAAS,KAAK;AACd,iBAAW;AAAA,QACT,MAAM;AAAA,QACN,MAAM,YAAY,WAAW,mFAAkB;AAAA,MACjD,CAAC;AAAA,IACH,SAAS,OAAO;AACd,iBAAW,EAAE,MAAM,SAAS,MAAM,uBAAuB,KAAK,EAAE,CAAC;AAAA,IACnE,UAAE;AACA,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAEA,SACE,6CAAC,QAAG,WAAW,8BAA8B,OAAO,uCAAuC,EAAE,IAC3F;AAAA,iDAAC,YAAO,MAAK,UAAS,WAAU,iCAAgC,iBAAe,MAAM,SAAS,MAAM;AAAE,cAAQ,WAAS,CAAC,KAAK;AAAA,IAAE,GAC7H;AAAA,mDAAC,UACC;AAAA,oDAAC,YAAO,4CAAK;AAAA,QACb,4CAAC,WAAM,+HAAuB;AAAA,SAChC;AAAA,MACA,6CAAC,UAAK,WAAU,kCAAkC;AAAA,sBAAc,YAAY,uBAAQ,cAAc,UAAU,6BAAS,SAAS,YAAY,WAAW,iBAAO;AAAA,QAAK;AAAA,QAAI,OAAO,iBAAO;AAAA,SAAK;AAAA,OAC1L;AAAA,IACC,QAAQ,4CAAC,SAAI,WAAU,+BACrB,wBAAc,YAAY,4CAAC,OAAE,WAAU,+BAA8B,MAAK,UAAS,oEAAS,IACzF,cAAc,UAAU,6CAAC,SAAI,WAAU,qCAAoC,MAAK,SAChF;AAAA,kDAAC,OAAG,qBAAU;AAAA,MACd,4CAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAE,aAAK,KAAK;AAAA,MAAE,GAAG,sCAAI;AAAA,OAC5D,IAAS,4EACT;AAAA,mDAAC,cAAS,WAAU,+BAClB;AAAA,oDAAC,YAAO,4CAAK;AAAA,QACb,6CAAC,WAAM,WAAW,YAAY,UAAU,gBAAgB,IACtD;AAAA,sDAAC,WAAM,MAAK,SAAQ,MAAK,yBAAwB,SAAS,YAAY,SAAS,UAAU,MAAM,KAAK,MAAM;AAAE,uBAAW,OAAO;AAAA,UAAE,CAAC,GAAG;AAAA,UACpI,6CAAC,UAAK;AAAA,wDAAC,YAAO,0BAAE;AAAA,YAAS,4CAAC,WAAM,iFAAsB;AAAA,aAAQ;AAAA,WAChE;AAAA,QACA,6CAAC,WAAM,WAAW,GAAG,YAAY,WAAW,gBAAgB,EAAE,GAAG,CAAC,SAAS,kBAAkB,iBAAiB,EAAE,IAC9G;AAAA,sDAAC,WAAM,MAAK,SAAQ,MAAK,yBAAwB,SAAS,YAAY,UAAU,UAAU,CAAC,SAAS,iBAAiB,UAAU,MAAM,KAAK,MAAM;AAAE,uBAAW,QAAQ;AAAA,UAAE,CAAC,GAAG;AAAA,UAC3K,6CAAC,UAAK;AAAA,wDAAC,YAAO,0BAAE;AAAA,YAAS,4CAAC,WAAM,kGAAc;AAAA,aAAQ;AAAA,WACxD;AAAA,SACF;AAAA,MACC,CAAC,SAAS,mBAAmB,4CAAC,OAAE,WAAU,+BAA8B,gLAA2B;AAAA,MACnG,YAAY,YAAY,6CAAC,SAAI,WAAU,+BACtC;AAAA,qDAAC,WAAM,SAAQ,4BAA2B;AAAA;AAAA,UACxC,4CAAC,WAAM,IAAG,4BAA2B,MAAK,OAAM,OAAO,WAAW,aAAY,wCAAuC,cAAa,OAAM,UAAU,WAAS,KAAK,MAAM;AAAE,yBAAa,MAAM,OAAO,KAAK;AAAA,UAAE,CAAC,GAAG,gBAAc,aAAa,QAAW,oBAAkB,WAAW,4BAA4B,QAAW;AAAA,UACtT,YAAY,4CAAC,WAAM,IAAG,2BAA0B,WAAU,6BAA6B,oBAAS;AAAA,WACnG;AAAA,QACA,6CAAC,WAAM,SAAQ,8BAA6B;AAAA;AAAA,UAC1C,4CAAC,WAAM,IAAG,8BAA6B,MAAK,YAAW,OAAO,aAAa,aAAa,SAAS,kBAAkB,uEAAgB,8CAAW,cAAa,gBAAe,UAAU,WAAS,KAAK,MAAM;AAAE,2BAAe,MAAM,OAAO,KAAK;AAAA,UAAE,CAAC,GAAG,gBAAc,eAAe,QAAW,oBAAiB,4BAA2B;AAAA,UACrU,4CAAC,WAAM,IAAG,4BAA2B,WAAW,aAAa,8BAA8B,QAAY,yBAAe,SAAS,kBAAkB,qJAA6B,+FAAmB;AAAA,WACnM;AAAA,SACF;AAAA,MACA,6CAAC,WAAM,WAAU,+BAA8B,SAAQ,yBAAwB;AAAA;AAAA,QAC7E,4CAAC,WAAM,IAAG,yBAAwB,MAAK,UAAS,KAAI,OAAM,KAAI,UAAS,MAAK,OAAM,OAAO,SAAS,UAAU,WAAS,KAAK,MAAM;AAAE,0BAAgB,MAAM,OAAO,KAAK;AAAA,QAAE,CAAC,GAAG,gBAAc,iBAAiB,QAAW;AAAA,QACnN,gBAAgB,4CAAC,WAAM,WAAU,6BAA6B,wBAAa;AAAA,SAC9E;AAAA,MACC,CAAC,SAAS,YAAY,4CAAC,OAAE,WAAU,+BAA8B,4IAAqB;AAAA,MACtF,WAAW,4CAAC,OAAE,WAAW,qCAAqC,QAAQ,IAAI,IAAI,MAAM,QAAQ,SAAS,UAAU,UAAU,UAAU,aAAU,UAAU,kBAAQ,MAAK;AAAA,MACrK,6CAAC,SAAI,WAAU,kCACb;AAAA,oDAAC,YAAO,MAAK,UAAS,SAAS,OAAO,UAAU,CAAC,SAAS,QAAQ,sCAAI;AAAA,QACtE,4CAAC,YAAO,MAAK,UAAS,WAAU,cAAa,SAAS,MAAM;AAAE,eAAK,KAAK;AAAA,QAAE,GAAG,UAAU,CAAC,SAAS,WAAW,UAAU,CAAC,SAAS,UAAW,mBAAS,mCAAU,kCAAQ;AAAA,SACxK;AAAA,OACF,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,kBAAkB,OAAmC;AAC5D,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,MAAM,KAAK,CAAC;AAChC,UAAM,WAAW,IAAI,aAAa,eAAe,IAAI,aAAa,eAAe,IAAI,aAAa;AAClG,QAAI,IAAI,aAAa,YAAY,EAAE,IAAI,aAAa,WAAW,UAAW,QAAO;AACjF,WAAO;AAAA,EACT,QAAQ;AAAE,WAAO;AAAA,EAAoB;AACvC;AAEA,SAAS,uBAAuB,OAAwB;AACtD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,MAAI,QAAQ,SAAS,iBAAiB,EAAG,QAAO;AAChD,SAAO,WAAW;AACpB;AAEA,eAAe,kBACb,QACA,MACA,QACkC;AAClC,QAAM,WAAW,MAAM,MAAM,yBAAyB;AAAA,IACpD;AAAA,IACA,SAAS,EAAE,QAAQ,oBAAoB,GAAG,SAAS,SAAY,CAAC,IAAI,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,IAC3G,GAAG,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IAC1D,GAAG,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,EAC1C,CAAC;AACD,QAAM,UAAU,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,MAAS;AAC3D,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,UAAU,YAAY,QAAQ,OAAO,YAAY,YAAY,OAAQ,QAAgC,UAAU,WAChH,QAA8B,QAC/B,6CAAe,SAAS,MAAM;AAClC,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AACA,MAAI,CAAC,iBAAiB,OAAO,EAAG,OAAM,IAAI,MAAM,sFAAgB;AAChE,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAkD;AAC1E,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,QAAM,OAAO;AACb,UAAQ,KAAK,YAAY,WAAW,KAAK,YAAY,aAChD,OAAO,UAAU,KAAK,eAAe,KACrC,OAAO,KAAK,oBAAoB,aAChC,OAAO,KAAK,oBAAoB,aAChC,OAAO,KAAK,aAAa;AAChC;AAEA,SAAS,kBAAkB,EAAE,MAAM,YAAY,GAAuB;AACpE,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAS,KAAK;AACtC,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAS,KAAK;AAChD,QAAM,YAAQ,0BAAY,MAAM;AAAE,YAAQ,KAAK;AAAA,EAAE,GAAG,CAAC,CAAC;AACtD,QAAM,YAAY,YAAY,WAAS,MAAM,OAAO;AACpD,QAAM,YAAY,YAAY,WAAS,cAAc,SAAY,SAAY,MAAM,KAAK,SAAS,GAAG,GAAG;AACvG,QAAM,eAAe,kBAAkB,WAAW,SAAS;AAE3D,SACE,4EACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,wBAAwB,OAAO,KAAK,8BAA8B;AAAA,QAC7E,cAAW;AAAA,QACX,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,OAAO,OAAO,SAAY;AAAA,QAC1B,SAAS,MAAM;AAAE,kBAAQ,IAAI;AAAA,QAAE;AAAA,QAE/B;AAAA,sDAAC,qDAAkB,MAAM,OAAO,KAAK,IAAI;AAAA,UACxC,QAAQ,4CAAC,UAAK,gCAAG;AAAA;AAAA;AAAA,IACpB;AAAA,IACC,QAAQ;AAAA,MAAC;AAAA;AAAA,QACR,KAAK;AAAA,QACL;AAAA,QACA,mBAAmB,MAAM;AAAE,uBAAa,WAAS,CAAC,KAAK;AAAA,QAAE;AAAA,QACzD,SAAS;AAAA;AAAA,IACX;AAAA,KACF;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,kBAAc,qBAAiC,IAAI;AACzD,QAAM,YAAQ,qBAA2B,IAAI;AAC7C,QAAM,gBAAY,qBAAO,cAAc,CAAC;AAExC,8BAAU,MAAM;AACd,UAAM,YAAY,CAAC,UAA+B;AAChD,UAAI,MAAM,QAAQ,SAAU,SAAQ;AAAA,IACtC;AACA,aAAS,iBAAiB,WAAW,SAAS;AAC9C,gBAAY,SAAS,MAAM;AAC3B,WAAO,MAAM;AAAE,eAAS,oBAAoB,WAAW,SAAS;AAAA,IAAE;AAAA,EACpE,GAAG,CAAC,OAAO,CAAC;AAEZ,8BAAU,MAAM;AACd,UAAM,SAAS,MAAM;AACrB,QAAI,WAAW,QAAQ,OAAO,mBAAmB,YAAa;AAC9D,UAAM,eAAe,yBAAyB;AAC9C,UAAM,WAAW,IAAI,eAAe,aAAW;AAC7C,UAAI,OAAO,UAAU,SAAS,gCAAgC,KAAK,OAAO,cAAc,IAAK;AAC7F,YAAM,OAAO,QAAQ,CAAC,GAAG;AACzB,UAAI,SAAS,UAAa,KAAK,QAAQ,gBAAgB,KAAK,SAAS,IAAK;AAC1E,gBAAU,UAAU,EAAE,OAAO,KAAK,MAAM,KAAK,KAAK,GAAG,QAAQ,KAAK,MAAM,KAAK,MAAM,EAAE;AACrF,UAAI;AAAE,qBAAa,QAAQ,gBAAgB,KAAK,UAAU,UAAU,OAAO,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAC;AAAA,IACzF,CAAC;AACD,aAAS,QAAQ,MAAM;AACvB,WAAO,MAAM;AAAE,eAAS,WAAW;AAAA,IAAE;AAAA,EACvC,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,CAAC,aAAa,OAAO,aAAa,MAAM,UAAU,UAAU;AAEjF,SACE,6CAAC,SAAI,WAAU,yBAAwB,MAAK,gBAC1C;AAAA,gDAAC,SAAI,WAAU,sBAAqB,eAAY,QAAO,SAAS,SAAS;AAAA,IACzE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAW,sBAAsB,YAAY,oCAAoC,EAAE;AAAA,QACnF,OAAO;AAAA,QACP,MAAK;AAAA,QACL,cAAW;AAAA,QACX,mBAAgB;AAAA,QAEhB;AAAA,uDAAC,YAAO,WAAU,wBAAuB,eAAe,CAAC,UAAU;AACjE,gBAAI,CAAE,MAAM,OAAuB,QAAQ,QAAQ,EAAG,mBAAkB;AAAA,UAC1E,GACE;AAAA,yDAAC,SACC;AAAA,0DAAC,QAAG,IAAG,6BAA4B,gCAAG;AAAA,cACtC,4CAAC,OAAE,2GAAkB;AAAA,eACvB;AAAA,YACA,6CAAC,SAAI,WAAU,gCACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,cAAY,YAAY,+CAAY;AAAA,kBACpC,OAAO,YAAY,iBAAO;AAAA,kBAC1B,SAAS,CAAC,UAAU;AAAE,0BAAM,gBAAgB;AAAG,sCAAkB;AAAA,kBAAE;AAAA,kBAEnE,sDAAC,UAAK,eAAY,QAAQ,sBAAY,WAAM,UAAI;AAAA;AAAA,cAClD;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,cAAW;AAAA,kBACX,SAAS;AAAA,kBAET,sDAAC,sDAAmB,MAAM,IAAI;AAAA;AAAA,cAChC;AAAA,eACF;AAAA,aACF;AAAA,UACA,4CAAC,YAAO,WAAU,uBAAsB,KAAU,OAAM,wCAAS;AAAA,UAChE,CAAC,aAAa,4CAAC,UAAK,WAAU,6BAA4B,eAAY,QAAO;AAAA;AAAA;AAAA,IAChF;AAAA,KACF;AAEJ;AAEA,SAAS,gBAAmD;AAC1D,QAAM,eAAe,yBAAyB;AAC9C,QAAM,WAAW;AAAA,IACf,OAAO,KAAK,IAAI,MAAM,KAAK,IAAI,cAAc,OAAO,aAAa,EAAE,CAAC;AAAA,IACpE,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,OAAO,cAAc,EAAE,CAAC;AAAA,EAC9D;AACA,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,aAAa,QAAQ,cAAc,KAAK,IAAI;AACrE,UAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,UAAM,SAAS,OAAO,MAAM,MAAM;AAClC,WAAO;AAAA,MACL,OAAO,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI,OAAO,aAAa,IAAI,KAAK,IAAI,cAAc,KAAK,CAAC,IAAI,SAAS;AAAA,MAC3G,QAAQ,OAAO,SAAS,MAAM,IAAI,KAAK,IAAI,OAAO,cAAc,IAAI,KAAK,IAAI,KAAK,MAAM,CAAC,IAAI,SAAS;AAAA,IACxG;AAAA,EACF,QAAQ;AAAE,WAAO;AAAA,EAAS;AAC5B;AAEA,SAAS,2BAAmC;AAC1C,SAAO,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,OAAO,aAAa,EAAE,CAAC;AAC7D;AAEA,SAAS,kBAAkB,WAAoB,WAA4B;AACzE,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,cAAc,OAAW,QAAO,IAAI,aAAa,SAAS;AAC9D,MAAI,cAAc,OAAW,QAAO,IAAI,aAAa,SAAS;AAC9D,QAAM,QAAQ,OAAO,SAAS;AAC9B,SAAO,MAAM,WAAW,IAAI,eAAe,cAAc,KAAK;AAChE;AAEA,SAAS,gBAA4B;AACnC,QAAM,WAAW,SAAS,cAAgC,0BAA0B,QAAQ,IAAI;AAChG,YAAU,OAAO;AACjB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,QAAQ,SAAS;AACvB,QAAM,QAAQ,YAAY;AAC1B,QAAM,cAAc;AACpB,WAAS,KAAK,YAAY,KAAK;AAC/B,SAAO,MAAM;AAAE,UAAM,OAAO;AAAA,EAAE;AAChC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import Schema from '@deepseek-ai/schemastery';
|
|
2
|
+
export interface Config {
|
|
3
|
+
backend: 'local' | 'remote';
|
|
4
|
+
databasePath?: string;
|
|
5
|
+
remoteUrl?: string;
|
|
6
|
+
remoteToken?: string;
|
|
7
|
+
remoteTimeoutMs: number;
|
|
8
|
+
connectionPath?: string;
|
|
9
|
+
exposeApi: boolean;
|
|
10
|
+
apiToken?: string;
|
|
11
|
+
apiPrefix: string;
|
|
12
|
+
exposeWeb: boolean;
|
|
13
|
+
webPath: string;
|
|
14
|
+
extractionEnabled: boolean;
|
|
15
|
+
extractionProvider?: string;
|
|
16
|
+
extractionModel?: string;
|
|
17
|
+
extractionMaxTokens: number;
|
|
18
|
+
extractionTimeoutMs: number;
|
|
19
|
+
extractionMaxInputChars: number;
|
|
20
|
+
defaultScope: 'project' | 'global';
|
|
21
|
+
autoRecallLimit: number;
|
|
22
|
+
recallMaxChars: number;
|
|
23
|
+
}
|
|
24
|
+
export declare const Config: Schema<Config>;
|
|
25
|
+
export interface ResolvedConfig extends Config {
|
|
26
|
+
remoteTimeoutMs: number;
|
|
27
|
+
apiPrefix: string;
|
|
28
|
+
exposeWeb: boolean;
|
|
29
|
+
webPath: string;
|
|
30
|
+
extractionMaxTokens: number;
|
|
31
|
+
extractionTimeoutMs: number;
|
|
32
|
+
extractionMaxInputChars: number;
|
|
33
|
+
defaultScope: 'project' | 'global';
|
|
34
|
+
autoRecallLimit: number;
|
|
35
|
+
recallMaxChars: number;
|
|
36
|
+
}
|
|
37
|
+
export declare function resolveConfig(config: Config): ResolvedConfig;
|
|
38
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAE7C,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,OAAO,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,uBAAuB,EAAE,MAAM,CAAA;IAC/B,YAAY,EAAE,SAAS,GAAG,QAAQ,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,CAqBhC,CAAA;AAEF,MAAM,WAAW,cAAe,SAAQ,MAAM;IAC5C,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,mBAAmB,EAAE,MAAM,CAAA;IAC3B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,uBAAuB,EAAE,MAAM,CAAA;IAC/B,YAAY,EAAE,SAAS,GAAG,QAAQ,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CA8C5D"}
|