dsh-diary-memory 0.1.0 → 0.1.1

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/lib/client.js ADDED
@@ -0,0 +1,274 @@
1
+ window.__ModuleLoader__.load({ id: "dsh-diary-memory", 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/index.ts
22
+ var index_exports = {};
23
+ __export(index_exports, {
24
+ DiarySettingsController: () => DiarySettingsController,
25
+ DiarySettingsPage: () => DiarySettingsPage,
26
+ apply: () => apply,
27
+ inject: () => inject
28
+ });
29
+ module.exports = __toCommonJS(index_exports);
30
+
31
+ // src/client/controller.ts
32
+ var import_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
33
+
34
+ // src/model-parameters.ts
35
+ function validateModelParameters(value, kind) {
36
+ if (!value || typeof value !== "object" || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value))) throw new Error(`${kind} \u53C2\u6570\u5FC5\u987B\u4E3A JSON \u5BF9\u8C61`);
37
+ const visit = (item, depth = 0) => {
38
+ if (depth > 16) throw new Error(`${kind} \u53C2\u6570\u5D4C\u5957\u8FC7\u6DF1`);
39
+ if (item === null || typeof item === "boolean" || typeof item === "string") return item;
40
+ if (typeof item === "number" && Number.isFinite(item)) return item;
41
+ if (Array.isArray(item)) return Object.freeze(item.map((child) => visit(child, depth + 1)));
42
+ if (item && typeof item === "object" && [Object.prototype, null].includes(Object.getPrototypeOf(item))) {
43
+ return Object.freeze(Object.fromEntries(Object.entries(item).map(([key, child]) => [key, visit(child, depth + 1)])));
44
+ }
45
+ throw new Error(`${kind} \u53C2\u6570\u53EA\u80FD\u5305\u542B JSON \u503C`);
46
+ };
47
+ const parameters = visit(value);
48
+ if (JSON.stringify(parameters).length > 16e3) throw new Error(`${kind} \u53C2\u6570\u4E0D\u80FD\u8D85\u8FC7 16000 \u5B57\u7B26`);
49
+ const reserved = kind === "embedding" ? ["dimension", "text_type"] : ["top_n"];
50
+ if (reserved.some((key) => Object.hasOwn(parameters, key))) throw new Error(kind === "embedding" ? "dimension \u8BF7\u5728\u5411\u91CF\u7EF4\u5EA6\u4E2D\u586B\u5199\uFF1Btext_type \u7531\u5165\u5E93\u548C\u53EC\u56DE\u81EA\u52A8\u8BBE\u7F6E" : "top_n \u8BF7\u5728\u53EC\u56DE\u6761\u6570\u4E2D\u586B\u5199");
51
+ if (kind === "embedding" && parameters.output_type !== void 0 && parameters.output_type !== "dense") throw new Error("\u672C\u5730\u5411\u91CF\u68C0\u7D22\u9700\u8981 dense \u5411\u91CF\uFF0Coutput_type \u4EC5\u652F\u6301 dense");
52
+ if (kind === "rerank" && parameters.return_documents !== void 0 && typeof parameters.return_documents !== "boolean") throw new Error("return_documents \u5FC5\u987B\u662F\u5E03\u5C14\u503C");
53
+ return parameters;
54
+ }
55
+
56
+ // src/client/controller.ts
57
+ var editableFields = ["apiKey", "baseUrl", "embeddingModel", "embeddingDimensions", "embeddingParameters", "rerankModel", "rerankParameters", "candidateCount", "recallCount", "compressionRounds", "retainRounds", "autoRecall"];
58
+ function numberField(field, min, max) {
59
+ return {
60
+ field,
61
+ format: (value) => typeof value === "number" ? String(value) : "",
62
+ parse: (text) => !text.trim() ? { kind: "clear" } : Number.isSafeInteger(Number(text)) && Number(text) >= min && Number(text) <= max ? { kind: "set", value: Number(text) } : void 0
63
+ };
64
+ }
65
+ function parametersField(field, kind) {
66
+ return {
67
+ field,
68
+ format: (value) => value && typeof value === "object" ? JSON.stringify(value, null, 2) : "{}",
69
+ parse: (text) => {
70
+ if (!text.trim()) return { kind: "clear" };
71
+ try {
72
+ return { kind: "set", value: validateModelParameters(JSON.parse(text), kind) };
73
+ } catch {
74
+ return void 0;
75
+ }
76
+ }
77
+ };
78
+ }
79
+ var specs = [
80
+ ...["apiKey", "baseUrl", "embeddingModel", "rerankModel"].map(import_dsh_client_ui_primitives.settingsTextField),
81
+ numberField("embeddingDimensions", 1, 4096),
82
+ numberField("candidateCount", 1, 100),
83
+ numberField("recallCount", 1, 100),
84
+ numberField("compressionRounds", 2, 1e6),
85
+ numberField("retainRounds", 1, 1e6),
86
+ parametersField("embeddingParameters", "embedding"),
87
+ parametersField("rerankParameters", "rerank"),
88
+ { field: "autoRecall", format: (value) => String(value ?? true), parse: (text) => text === "true" || text === "false" ? { kind: "set", value: text === "true" } : void 0 }
89
+ ];
90
+ var DiarySettingsController = class {
91
+ constructor(scope, keyConfigured = () => false) {
92
+ this.scope = scope;
93
+ this.keyConfigured = keyConfigured;
94
+ this.form = new import_dsh_client_ui_primitives.SettingsFormModel(scope, specs);
95
+ this.store = this.form.bind(() => this.projection());
96
+ }
97
+ scope;
98
+ keyConfigured;
99
+ form;
100
+ store;
101
+ projection() {
102
+ const fields = Object.fromEntries(editableFields.map((field) => [field, this.form.field(field)]));
103
+ const base = this.scope.getSnapshot().base;
104
+ const number = (field, fallback) => fields[field].text.trim() ? Number(fields[field].text) : base?.[field] ?? fallback;
105
+ let error = null;
106
+ if (number("compressionRounds", 20) <= number("retainRounds", 2)) error = "\u538B\u7F29\u8F6E\u6B21\u5FC5\u987B\u5927\u4E8E\u4FDD\u7559\u8F6E\u6B21\u3002";
107
+ if (number("recallCount", 6) > number("candidateCount", 30)) error = "\u53EC\u56DE\u6761\u6570\u4E0D\u80FD\u5927\u4E8E\u5019\u9009\u6570\u91CF\u3002";
108
+ for (const kind of ["embedding", "rerank"]) {
109
+ const text = fields[`${kind}Parameters`].text.trim();
110
+ try {
111
+ validateModelParameters(JSON.parse(text || "{}"), kind);
112
+ } catch (failure) {
113
+ error = failure instanceof SyntaxError ? `${kind} \u53C2\u6570\u9700\u8981\u5408\u6CD5\u7684 JSON \u5BF9\u8C61\u3002` : failure.message;
114
+ }
115
+ }
116
+ const endpoint = fields.baseUrl.text.trim();
117
+ try {
118
+ if (endpoint) {
119
+ const url = new URL(endpoint);
120
+ if (url.username || url.password || url.search || url.hash || url.pathname !== "/" || url.protocol !== "https:" && !(url.protocol === "http:" && ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname))) throw new Error();
121
+ }
122
+ } catch {
123
+ fields.baseUrl.invalid = true;
124
+ error = "\u767E\u70BC\u7AEF\u70B9\u9700\u8981 HTTPS origin\uFF0C\u4F8B\u5982 https://dashscope.aliyuncs.com\u3002";
125
+ }
126
+ for (const field of ["embeddingModel", "rerankModel"]) {
127
+ if (fields[field].text.trim().length > 200) {
128
+ fields[field].invalid = true;
129
+ error = "\u6A21\u578B\u540D\u4E0D\u80FD\u8D85\u8FC7 200 \u5B57\u7B26\u3002";
130
+ }
131
+ }
132
+ const shell = this.form.shell();
133
+ return { ...shell, invalid: shell.invalid || Boolean(error) || !shell.writable, fields, keyConfigured: this.keyConfigured(), error };
134
+ }
135
+ async save() {
136
+ if (!this.projection().invalid) await this.form.save();
137
+ }
138
+ inject() {
139
+ return { hooks: { diarySettings: this.store }, ...this.form.actions(), save: () => {
140
+ void this.save();
141
+ } };
142
+ }
143
+ dispose() {
144
+ this.form.dispose();
145
+ }
146
+ };
147
+
148
+ // src/client/page.tsx
149
+ var import_dsh_client_ui_primitives2 = require("@deepseek-ai/dsh-client-ui-primitives");
150
+ var import_jsx_runtime = require("react/jsx-runtime");
151
+ var card = { border: "1px solid var(--dsw-alias-border-l2)", borderRadius: 14, padding: "16px 20px", marginTop: 16, minWidth: 0 };
152
+ var hint = { fontSize: 12, lineHeight: 1.6, color: "var(--dsw-alias-label-tertiary)", margin: "8px 0 0" };
153
+ var textarea = { display: "block", width: "100%", boxSizing: "border-box", minHeight: 110, padding: 12, borderRadius: 8, border: "1px solid var(--dsw-alias-border-l2)", background: "var(--dsw-alias-bg-layer-3)", color: "var(--dsw-alias-label-primary)", fontFamily: "var(--dsw-font-mono, monospace)", fontSize: 12, lineHeight: 1.6, resize: "vertical" };
154
+ function Group({ title, children }) {
155
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { "aria-label": title, style: card, children: [
156
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { style: { fontSize: 14, margin: "0 0 8px" }, children: title }),
157
+ children
158
+ ] });
159
+ }
160
+ function DiarySettingsPage(props) {
161
+ const state = props.useDiarySettings((value) => value);
162
+ const disabled = !state.writable || state.saving;
163
+ const valueField = (field, label, description, numeric = false) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
164
+ import_dsh_client_ui_primitives2.SettingsValueField,
165
+ {
166
+ id: `diary-${field}`,
167
+ label,
168
+ hint: description,
169
+ numeric,
170
+ ...state.fields[field],
171
+ disabled,
172
+ overriddenLabel: "\u5DF2\u81EA\u5B9A\u4E49",
173
+ resetLabel: "\u6062\u590D\u9ED8\u8BA4",
174
+ invalidLabel: numeric ? "\u8BF7\u586B\u5199\u8303\u56F4\u5185\u7684\u6574\u6570\u3002" : "\u8BF7\u68C0\u67E5\u586B\u5199\u7684\u5185\u5BB9\u3002",
175
+ onEdit: (text) => props.edit(field, text),
176
+ onReset: () => props.resetField(field)
177
+ },
178
+ field
179
+ );
180
+ const parameters = (field, description) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { padding: "12px 0" }, children: [
181
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", { htmlFor: `diary-${field}`, style: { display: "block", fontSize: 13, fontWeight: 500, marginBottom: 8 }, children: "\u989D\u5916\u53C2\u6570\uFF08JSON\uFF09" }),
182
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
183
+ "textarea",
184
+ {
185
+ id: `diary-${field}`,
186
+ "aria-describedby": `diary-${field}-hint`,
187
+ "aria-invalid": state.fields[field].invalid || void 0,
188
+ value: state.fields[field].text,
189
+ onChange: (event) => props.edit(field, event.target.value),
190
+ disabled,
191
+ spellCheck: false,
192
+ rows: 5,
193
+ style: textarea
194
+ }
195
+ ),
196
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { id: `diary-${field}-hint`, style: hint, children: description })
197
+ ] });
198
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { "data-diary-settings": true, style: { color: "var(--dsw-alias-label-primary)", paddingBottom: 16 }, children: [
199
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { style: { fontSize: 18, margin: "0 0 8px" }, children: "\u966A\u4F34\u65E5\u8BB0" }),
200
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: hint, children: "\u8BBE\u7F6E\u767E\u70BC\u8FDE\u63A5\u3001\u56DE\u5FC6\u6A21\u578B\u4E0E\u65E5\u8BB0\u538B\u7F29\u65B9\u5F0F\u3002\u586B\u5199\u540E\u70B9\u51FB\u4FDD\u5B58\u3002" }),
201
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dsh_client_ui_primitives2.SettingsForm, { state, onSave: props.save, onDiscard: props.discard, labels: {
202
+ unavailable: "\u6B63\u5728\u52A0\u8F7D\u914D\u7F6E\uFF1B\u82E5\u6301\u7EED\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5\u966A\u4F34\u65E5\u8BB0\u63D2\u4EF6\u662F\u5426\u5DF2\u542F\u7528\u3002",
203
+ readOnly: "\u5F53\u524D\u914D\u7F6E\u53EA\u8BFB\u3002",
204
+ saveFailed: "\u4FDD\u5B58\u5931\u8D25\u6216\u914D\u7F6E\u5DF2\u5728\u5176\u4ED6\u7A97\u53E3\u4FEE\u6539\u3002\u8F93\u5165\u5DF2\u4FDD\u7559\uFF0C\u8BF7\u68C0\u67E5\u540E\u91CD\u8BD5\u3002",
205
+ save: "\u4FDD\u5B58\u914D\u7F6E",
206
+ saving: "\u6B63\u5728\u4FDD\u5B58\u2026"
207
+ }, children: [
208
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Group, { title: "\u767E\u70BC\u8FDE\u63A5", children: [
209
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
210
+ import_dsh_client_ui_primitives2.SettingsSecretField,
211
+ {
212
+ id: "diary-apiKey",
213
+ label: "\u767E\u70BC API Key",
214
+ hint: "\u5BC6\u94A5\u4E0D\u4F1A\u56DE\u663E\uFF1B\u7559\u7A7A\u4FDD\u7559\u5DF2\u4FDD\u5B58\u7684 Key\u3002\u4E5F\u53EF\u901A\u8FC7 DSH \u7684\u73AF\u5883\u53D8\u91CF\u63D0\u4F9B\u3002",
215
+ text: state.fields.apiKey.text,
216
+ configured: state.keyConfigured,
217
+ stateLabel: state.keyConfigured ? "\u5DF2\u4FDD\u5B58\uFF08\u4E0D\u56DE\u663E\uFF09" : "\u5C1A\u672A\u4FDD\u5B58",
218
+ disabled,
219
+ onEdit: (text) => props.edit("apiKey", text)
220
+ }
221
+ ),
222
+ valueField("baseUrl", "\u767E\u70BC API \u5730\u5740", "\u9700\u8981\u4E0E API Key \u7684\u5730\u57DF\u4E00\u81F4\uFF0C\u4F8B\u5982 https://dashscope.aliyuncs.com\u3002")
223
+ ] }),
224
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Group, { title: "Embedding \xB7 \u5411\u91CF\u53EC\u56DE", children: [
225
+ valueField("embeddingModel", "Embedding \u6A21\u578B\u540D", "\u53EF\u624B\u52A8\u586B\u5199\u767E\u70BC\u652F\u6301\u7684\u6587\u672C\u5411\u91CF\u6A21\u578B\uFF0C\u4F8B\u5982 text-embedding-v4\u3002"),
226
+ valueField("embeddingDimensions", "\u5411\u91CF\u7EF4\u5EA6", "1\u20134096\uFF1B\u8BF7\u586B\u5199\u6240\u9009\u6A21\u578B\u652F\u6301\u7684\u7EF4\u5EA6\u3002", true),
227
+ parameters("embeddingParameters", '\u586B\u5199\u8BE5\u6A21\u578B\u652F\u6301\u7684 parameters\uFF0C\u4F8B\u5982 {"output_type":"dense"}\u3002dimension \u5728\u4E0A\u65B9\u586B\u5199\uFF0Ctext_type \u7531\u5165\u5E93\u4E0E\u53EC\u56DE\u81EA\u52A8\u8BBE\u7F6E\u3002'),
228
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: hint, children: "\u66F4\u6539 Embedding \u6A21\u578B\u3001\u7EF4\u5EA6\u6216\u53C2\u6570\u540E\uFF0C\u65E7\u5411\u91CF\u4E0D\u4F1A\u53C2\u4E0E\u65B0\u914D\u7F6E\u7684\u68C0\u7D22\u3002" })
229
+ ] }),
230
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Group, { title: "Rerank \xB7 \u56DE\u5FC6\u6392\u5E8F", children: [
231
+ valueField("rerankModel", "Rerank \u6A21\u578B\u540D", "\u53EF\u624B\u52A8\u586B\u5199\u767E\u70BC\u652F\u6301\u7684\u91CD\u6392\u6A21\u578B\uFF0C\u4F8B\u5982 gte-rerank-v2\u3002"),
232
+ valueField("candidateCount", "\u5019\u9009\u6570\u91CF", "1\u2013100\uFF1B\u5148\u7531\u5411\u91CF\u68C0\u7D22\u9009\u51FA\u8FD9\u4E9B\u65E5\u8BB0\u4EA4\u7ED9 Rerank\u3002", true),
233
+ valueField("recallCount", "\u53EC\u56DE\u6761\u6570\uFF08top_n\uFF09", "1\u2013100\uFF0C\u4E14\u4E0D\u5927\u4E8E\u5019\u9009\u6570\u91CF\u3002", true),
234
+ parameters("rerankParameters", '\u586B\u5199\u8BE5\u6A21\u578B\u652F\u6301\u7684 parameters\uFF0C\u4F8B\u5982 {"return_documents":false}\u3002top_n \u7531\u4E0A\u65B9\u7684\u53EC\u56DE\u6761\u6570\u8BBE\u7F6E\u3002')
235
+ ] }),
236
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Group, { title: "\u65E5\u8BB0\u4E0E\u966A\u4F34", children: [
237
+ valueField("compressionRounds", "\u89E6\u53D1\u538B\u7F29\u7684\u8F6E\u6B21", "\u5B8C\u6210\u591A\u5C11\u8F6E\u540E\u4FDD\u5B58\u65E5\u8BB0\u5E76\u5B89\u5168\u538B\u7F29\uFF1B\u987B\u5927\u4E8E\u4FDD\u7559\u8F6E\u6B21\u3002", true),
238
+ valueField("retainRounds", "\u4FDD\u7559\u6700\u8FD1\u8F6E\u6B21", "\u81F3\u5C11\u4FDD\u7559\u6700\u8FD1\u591A\u5C11\u4E2A\u7528\u6237\u8F93\u5165\u53CA\u540E\u7EED\u6D88\u606F\u3002", true),
239
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", gap: 10, justifyContent: "space-between", alignItems: "center", padding: "12px 0", fontSize: 13 }, children: [
240
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0" }),
241
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
242
+ import_dsh_client_ui_primitives2.Switch,
243
+ {
244
+ label: "\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0",
245
+ checked: state.fields.autoRecall.text === "true",
246
+ disabled,
247
+ onChange: (value) => props.edit("autoRecall", String(value))
248
+ }
249
+ )
250
+ ] })
251
+ ] }),
252
+ state.error ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { role: "alert", style: { ...hint, color: "var(--dsw-alias-label-error)" }, children: state.error }) : null
253
+ ] })
254
+ ] });
255
+ }
256
+
257
+ // src/client/index.ts
258
+ var inject = ["slots", "configForms"];
259
+ function apply(ctx) {
260
+ const controller = new DiarySettingsController(ctx.configForms.get("diary-memory"), () => {
261
+ const entry = ctx.configForms.describe().getSnapshot().view?.namespaces.find((item) => item.ns === "diary-memory");
262
+ return entry?.secrets?.some((item) => item.path.length === 1 && item.path[0] === "apiKey" && item.set) ?? false;
263
+ });
264
+ ctx.effect(() => () => controller.dispose(), "diary-memory: settings form");
265
+ ctx.effect(() => ctx.configForms.whileServed(["diary-memory"], () => ctx.slots.inject("settings.section", () => ctx.slots.register({
266
+ name: "settings.section",
267
+ id: "diary-memory",
268
+ order: 65,
269
+ label: "\u966A\u4F34\u65E5\u8BB0",
270
+ inject: () => controller.inject()
271
+ }, DiarySettingsPage))), "diary-memory: settings page");
272
+ }
273
+ return module.exports; } });
274
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/client/index.ts", "../src/client/controller.ts", "../src/model-parameters.ts", "../src/client/page.tsx"],
4
+ "sourcesContent": ["import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport { DiarySettingsController } from './controller.js'\nimport type { FormValues } from './controller.js'\nimport { DiarySettingsPage } from './page.js'\n\nexport { DiarySettingsController } from './controller.js'\nexport { DiarySettingsPage } from './page.js'\nexport const inject = ['slots', 'configForms']\n\nexport function apply(ctx: Context): void {\n const controller = new DiarySettingsController(ctx.configForms.get<FormValues>('diary-memory'), () => {\n const entry = ctx.configForms.describe().getSnapshot().view?.namespaces.find(item => item.ns === 'diary-memory')\n return entry?.secrets?.some(item => item.path.length === 1 && item.path[0] === 'apiKey' && item.set) ?? false\n })\n ctx.effect(() => () => controller.dispose(), 'diary-memory: settings form')\n ctx.effect(() => ctx.configForms.whileServed(['diary-memory'], () => ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section', id: 'diary-memory', order: 65, label: '\u966A\u4F34\u65E5\u8BB0', inject: () => controller.inject(),\n }, DiarySettingsPage))), 'diary-memory: settings page')\n}\n", "import { SettingsFormModel, settingsTextField } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SettingsFieldSpec, SettingsFieldState, SettingsFormScope, SettingsFormShell } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SnapshotStore } from '@deepseek-ai/dsh-client-store'\nimport type { DiaryConfig } from '../config.js'\nimport { validateModelParameters } from '../model-parameters.js'\n\nexport const editableFields = ['apiKey', 'baseUrl', 'embeddingModel', 'embeddingDimensions', 'embeddingParameters', 'rerankModel', 'rerankParameters', 'candidateCount', 'recallCount', 'compressionRounds', 'retainRounds', 'autoRecall'] as const\nexport type EditableField = typeof editableFields[number]\nexport type FormValues = Partial<Pick<DiaryConfig, EditableField>>\nexport interface DiarySettingsState extends SettingsFormShell {\n fields: Record<EditableField, SettingsFieldState>\n keyConfigured: boolean\n error: string | null\n}\n\nfunction numberField(field: string, min: number, max: number): SettingsFieldSpec {\n return {\n field, format: value => typeof value === 'number' ? String(value) : '',\n parse: text => !text.trim() ? { kind: 'clear' }\n : Number.isSafeInteger(Number(text)) && Number(text) >= min && Number(text) <= max ? { kind: 'set', value: Number(text) } : undefined,\n }\n}\nfunction parametersField(field: string, kind: 'embedding' | 'rerank'): SettingsFieldSpec {\n return {\n field, format: value => value && typeof value === 'object' ? JSON.stringify(value, null, 2) : '{}',\n parse: text => {\n if (!text.trim()) return { kind: 'clear' }\n try { return { kind: 'set', value: validateModelParameters(JSON.parse(text), kind) } } catch { return undefined }\n },\n }\n}\nconst specs: SettingsFieldSpec[] = [\n ...['apiKey', 'baseUrl', 'embeddingModel', 'rerankModel'].map(settingsTextField),\n numberField('embeddingDimensions', 1, 4096), numberField('candidateCount', 1, 100), numberField('recallCount', 1, 100),\n numberField('compressionRounds', 2, 1000000), numberField('retainRounds', 1, 1000000),\n parametersField('embeddingParameters', 'embedding'), parametersField('rerankParameters', 'rerank'),\n { field: 'autoRecall', format: value => String(value ?? true), parse: text => text === 'true' || text === 'false' ? { kind: 'set', value: text === 'true' } : undefined },\n]\n\n/** Native staged form: only edited paths are sent, preserving undisclosed secrets. */\nexport class DiarySettingsController {\n readonly form: SettingsFormModel<FormValues>\n readonly store: SnapshotStore<DiarySettingsState>\n\n constructor(private readonly scope: SettingsFormScope<FormValues>, private readonly keyConfigured: () => boolean = () => false) {\n this.form = new SettingsFormModel(scope, specs)\n this.store = this.form.bind(() => this.projection())\n }\n\n private projection(): DiarySettingsState {\n const fields = Object.fromEntries(editableFields.map(field => [field, this.form.field(field)])) as DiarySettingsState['fields']\n const base = this.scope.getSnapshot().base as FormValues | undefined\n const number = (field: 'compressionRounds' | 'retainRounds' | 'recallCount' | 'candidateCount', fallback: number) => fields[field].text.trim() ? Number(fields[field].text) : base?.[field] ?? fallback\n let error: string | null = null\n if (number('compressionRounds', 20) <= number('retainRounds', 2)) error = '\u538B\u7F29\u8F6E\u6B21\u5FC5\u987B\u5927\u4E8E\u4FDD\u7559\u8F6E\u6B21\u3002'\n if (number('recallCount', 6) > number('candidateCount', 30)) error = '\u53EC\u56DE\u6761\u6570\u4E0D\u80FD\u5927\u4E8E\u5019\u9009\u6570\u91CF\u3002'\n for (const kind of ['embedding', 'rerank'] as const) {\n const text = fields[`${kind}Parameters`].text.trim()\n try { validateModelParameters(JSON.parse(text || '{}'), kind) }\n catch (failure) { error = failure instanceof SyntaxError ? `${kind} \u53C2\u6570\u9700\u8981\u5408\u6CD5\u7684 JSON \u5BF9\u8C61\u3002` : (failure as Error).message }\n }\n const endpoint = fields.baseUrl.text.trim()\n try {\n if (endpoint) {\n const url = new URL(endpoint)\n if (url.username || url.password || url.search || url.hash || url.pathname !== '/' || url.protocol !== 'https:' && !(url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname))) throw new Error()\n }\n } catch { fields.baseUrl.invalid = true; error = '\u767E\u70BC\u7AEF\u70B9\u9700\u8981 HTTPS origin\uFF0C\u4F8B\u5982 https://dashscope.aliyuncs.com\u3002' }\n for (const field of ['embeddingModel', 'rerankModel'] as const) {\n if (fields[field].text.trim().length > 200) { fields[field].invalid = true; error = '\u6A21\u578B\u540D\u4E0D\u80FD\u8D85\u8FC7 200 \u5B57\u7B26\u3002' }\n }\n const shell = this.form.shell()\n return { ...shell, invalid: shell.invalid || Boolean(error) || !shell.writable, fields, keyConfigured: this.keyConfigured(), error }\n }\n\n async save(): Promise<void> { if (!this.projection().invalid) await this.form.save() }\n inject() {\n return { hooks: { diarySettings: this.store }, ...this.form.actions(), save: () => { void this.save() } }\n }\n dispose(): void { this.form.dispose() }\n}\n", "export type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue }\nexport type ModelParameters = Readonly<Record<string, JsonValue>>\n\n/** Shared by the native configuration reader and the browser parameter editors. */\nexport function validateModelParameters(value: unknown, kind: 'embedding' | 'rerank'): ModelParameters {\n if (!value || typeof value !== 'object' || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value))) throw new Error(`${kind} \u53C2\u6570\u5FC5\u987B\u4E3A JSON \u5BF9\u8C61`)\n const visit = (item: unknown, depth = 0): JsonValue => {\n if (depth > 16) throw new Error(`${kind} \u53C2\u6570\u5D4C\u5957\u8FC7\u6DF1`)\n if (item === null || typeof item === 'boolean' || typeof item === 'string') return item\n if (typeof item === 'number' && Number.isFinite(item)) return item\n if (Array.isArray(item)) return Object.freeze(item.map(child => visit(child, depth + 1))) as unknown as JsonValue[]\n if (item && typeof item === 'object' && [Object.prototype, null].includes(Object.getPrototypeOf(item))) {\n return Object.freeze(Object.fromEntries(Object.entries(item).map(([key, child]) => [key, visit(child, depth + 1)])))\n }\n throw new Error(`${kind} \u53C2\u6570\u53EA\u80FD\u5305\u542B JSON \u503C`)\n }\n const parameters = visit(value) as ModelParameters\n if (JSON.stringify(parameters).length > 16000) throw new Error(`${kind} \u53C2\u6570\u4E0D\u80FD\u8D85\u8FC7 16000 \u5B57\u7B26`)\n const reserved = kind === 'embedding' ? ['dimension', 'text_type'] : ['top_n']\n if (reserved.some(key => Object.hasOwn(parameters, key))) throw new Error(kind === 'embedding'\n ? 'dimension \u8BF7\u5728\u5411\u91CF\u7EF4\u5EA6\u4E2D\u586B\u5199\uFF1Btext_type \u7531\u5165\u5E93\u548C\u53EC\u56DE\u81EA\u52A8\u8BBE\u7F6E'\n : 'top_n \u8BF7\u5728\u53EC\u56DE\u6761\u6570\u4E2D\u586B\u5199')\n if (kind === 'embedding' && parameters.output_type !== undefined && parameters.output_type !== 'dense') throw new Error('\u672C\u5730\u5411\u91CF\u68C0\u7D22\u9700\u8981 dense \u5411\u91CF\uFF0Coutput_type \u4EC5\u652F\u6301 dense')\n if (kind === 'rerank' && parameters.return_documents !== undefined && typeof parameters.return_documents !== 'boolean') throw new Error('return_documents \u5FC5\u987B\u662F\u5E03\u5C14\u503C')\n return parameters\n}\n\nexport function stableParameters(value: ModelParameters): string {\n const ordered = (item: JsonValue): JsonValue => Array.isArray(item) ? item.map(ordered)\n : item !== null && typeof item === 'object' ? Object.fromEntries(Object.keys(item).sort().map(key => [key, ordered(item[key])])) : item\n return JSON.stringify(ordered(value as JsonValue))\n}\n", "import { SettingsForm, SettingsSecretField, SettingsValueField, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { CSSProperties, ReactNode } from 'react'\nimport type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { DiarySettingsController, EditableField } from './controller.js'\n\ntype PageProps = InjectFace<ReturnType<DiarySettingsController['inject']>>\nconst card: CSSProperties = { border: '1px solid var(--dsw-alias-border-l2)', borderRadius: 14, padding: '16px 20px', marginTop: 16, minWidth: 0 }\nconst hint: CSSProperties = { fontSize: 12, lineHeight: 1.6, color: 'var(--dsw-alias-label-tertiary)', margin: '8px 0 0' }\nconst textarea: CSSProperties = { display: 'block', width: '100%', boxSizing: 'border-box', minHeight: 110, padding: 12, borderRadius: 8, border: '1px solid var(--dsw-alias-border-l2)', background: 'var(--dsw-alias-bg-layer-3)', color: 'var(--dsw-alias-label-primary)', fontFamily: 'var(--dsw-font-mono, monospace)', fontSize: 12, lineHeight: 1.6, resize: 'vertical' }\n\nfunction Group({ title, children }: { title: string; children: ReactNode }) {\n return <section aria-label={title} style={card}><h3 style={{ fontSize: 14, margin: '0 0 8px' }}>{title}</h3>{children}</section>\n}\n\nexport function DiarySettingsPage(props: PageProps) {\n const state = props.useDiarySettings(value => value)\n const disabled = !state.writable || state.saving\n const valueField = (field: EditableField, label: string, description: string, numeric = false) => <SettingsValueField\n key={field} id={`diary-${field}`} label={label} hint={description} numeric={numeric}\n {...state.fields[field]} disabled={disabled} overriddenLabel=\"\u5DF2\u81EA\u5B9A\u4E49\" resetLabel=\"\u6062\u590D\u9ED8\u8BA4\"\n invalidLabel={numeric ? '\u8BF7\u586B\u5199\u8303\u56F4\u5185\u7684\u6574\u6570\u3002' : '\u8BF7\u68C0\u67E5\u586B\u5199\u7684\u5185\u5BB9\u3002'}\n onEdit={text => props.edit(field, text)} onReset={() => props.resetField(field)}\n />\n const parameters = (field: 'embeddingParameters' | 'rerankParameters', description: string) => <div style={{ padding: '12px 0' }}>\n <label htmlFor={`diary-${field}`} style={{ display: 'block', fontSize: 13, fontWeight: 500, marginBottom: 8 }}>\u989D\u5916\u53C2\u6570\uFF08JSON\uFF09</label>\n <textarea id={`diary-${field}`} aria-describedby={`diary-${field}-hint`} aria-invalid={state.fields[field].invalid || undefined}\n value={state.fields[field].text} onChange={event => props.edit(field, event.target.value)} disabled={disabled}\n spellCheck={false} rows={5} style={textarea} />\n <p id={`diary-${field}-hint`} style={hint}>{description}</p>\n </div>\n return <div data-diary-settings style={{ color: 'var(--dsw-alias-label-primary)', paddingBottom: 16 }}>\n <h2 style={{ fontSize: 18, margin: '0 0 8px' }}>\u966A\u4F34\u65E5\u8BB0</h2>\n <p style={hint}>\u8BBE\u7F6E\u767E\u70BC\u8FDE\u63A5\u3001\u56DE\u5FC6\u6A21\u578B\u4E0E\u65E5\u8BB0\u538B\u7F29\u65B9\u5F0F\u3002\u586B\u5199\u540E\u70B9\u51FB\u4FDD\u5B58\u3002</p>\n <SettingsForm state={state} onSave={props.save} onDiscard={props.discard} labels={{\n unavailable: '\u6B63\u5728\u52A0\u8F7D\u914D\u7F6E\uFF1B\u82E5\u6301\u7EED\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5\u966A\u4F34\u65E5\u8BB0\u63D2\u4EF6\u662F\u5426\u5DF2\u542F\u7528\u3002', readOnly: '\u5F53\u524D\u914D\u7F6E\u53EA\u8BFB\u3002',\n saveFailed: '\u4FDD\u5B58\u5931\u8D25\u6216\u914D\u7F6E\u5DF2\u5728\u5176\u4ED6\u7A97\u53E3\u4FEE\u6539\u3002\u8F93\u5165\u5DF2\u4FDD\u7559\uFF0C\u8BF7\u68C0\u67E5\u540E\u91CD\u8BD5\u3002', save: '\u4FDD\u5B58\u914D\u7F6E', saving: '\u6B63\u5728\u4FDD\u5B58\u2026',\n }}>\n <Group title=\"\u767E\u70BC\u8FDE\u63A5\">\n <SettingsSecretField id=\"diary-apiKey\" label=\"\u767E\u70BC API Key\" hint=\"\u5BC6\u94A5\u4E0D\u4F1A\u56DE\u663E\uFF1B\u7559\u7A7A\u4FDD\u7559\u5DF2\u4FDD\u5B58\u7684 Key\u3002\u4E5F\u53EF\u901A\u8FC7 DSH \u7684\u73AF\u5883\u53D8\u91CF\u63D0\u4F9B\u3002\"\n text={state.fields.apiKey.text} configured={state.keyConfigured} stateLabel={state.keyConfigured ? '\u5DF2\u4FDD\u5B58\uFF08\u4E0D\u56DE\u663E\uFF09' : '\u5C1A\u672A\u4FDD\u5B58'}\n disabled={disabled} onEdit={text => props.edit('apiKey', text)} />\n {valueField('baseUrl', '\u767E\u70BC API \u5730\u5740', '\u9700\u8981\u4E0E API Key \u7684\u5730\u57DF\u4E00\u81F4\uFF0C\u4F8B\u5982 https://dashscope.aliyuncs.com\u3002')}\n </Group>\n <Group title=\"Embedding \u00B7 \u5411\u91CF\u53EC\u56DE\">\n {valueField('embeddingModel', 'Embedding \u6A21\u578B\u540D', '\u53EF\u624B\u52A8\u586B\u5199\u767E\u70BC\u652F\u6301\u7684\u6587\u672C\u5411\u91CF\u6A21\u578B\uFF0C\u4F8B\u5982 text-embedding-v4\u3002')}\n {valueField('embeddingDimensions', '\u5411\u91CF\u7EF4\u5EA6', '1\u20134096\uFF1B\u8BF7\u586B\u5199\u6240\u9009\u6A21\u578B\u652F\u6301\u7684\u7EF4\u5EA6\u3002', true)}\n {parameters('embeddingParameters', '\u586B\u5199\u8BE5\u6A21\u578B\u652F\u6301\u7684 parameters\uFF0C\u4F8B\u5982 {\"output_type\":\"dense\"}\u3002dimension \u5728\u4E0A\u65B9\u586B\u5199\uFF0Ctext_type \u7531\u5165\u5E93\u4E0E\u53EC\u56DE\u81EA\u52A8\u8BBE\u7F6E\u3002')}\n <p style={hint}>\u66F4\u6539 Embedding \u6A21\u578B\u3001\u7EF4\u5EA6\u6216\u53C2\u6570\u540E\uFF0C\u65E7\u5411\u91CF\u4E0D\u4F1A\u53C2\u4E0E\u65B0\u914D\u7F6E\u7684\u68C0\u7D22\u3002</p>\n </Group>\n <Group title=\"Rerank \u00B7 \u56DE\u5FC6\u6392\u5E8F\">\n {valueField('rerankModel', 'Rerank \u6A21\u578B\u540D', '\u53EF\u624B\u52A8\u586B\u5199\u767E\u70BC\u652F\u6301\u7684\u91CD\u6392\u6A21\u578B\uFF0C\u4F8B\u5982 gte-rerank-v2\u3002')}\n {valueField('candidateCount', '\u5019\u9009\u6570\u91CF', '1\u2013100\uFF1B\u5148\u7531\u5411\u91CF\u68C0\u7D22\u9009\u51FA\u8FD9\u4E9B\u65E5\u8BB0\u4EA4\u7ED9 Rerank\u3002', true)}\n {valueField('recallCount', '\u53EC\u56DE\u6761\u6570\uFF08top_n\uFF09', '1\u2013100\uFF0C\u4E14\u4E0D\u5927\u4E8E\u5019\u9009\u6570\u91CF\u3002', true)}\n {parameters('rerankParameters', '\u586B\u5199\u8BE5\u6A21\u578B\u652F\u6301\u7684 parameters\uFF0C\u4F8B\u5982 {\"return_documents\":false}\u3002top_n \u7531\u4E0A\u65B9\u7684\u53EC\u56DE\u6761\u6570\u8BBE\u7F6E\u3002')}\n </Group>\n <Group title=\"\u65E5\u8BB0\u4E0E\u966A\u4F34\">\n {valueField('compressionRounds', '\u89E6\u53D1\u538B\u7F29\u7684\u8F6E\u6B21', '\u5B8C\u6210\u591A\u5C11\u8F6E\u540E\u4FDD\u5B58\u65E5\u8BB0\u5E76\u5B89\u5168\u538B\u7F29\uFF1B\u987B\u5927\u4E8E\u4FDD\u7559\u8F6E\u6B21\u3002', true)}\n {valueField('retainRounds', '\u4FDD\u7559\u6700\u8FD1\u8F6E\u6B21', '\u81F3\u5C11\u4FDD\u7559\u6700\u8FD1\u591A\u5C11\u4E2A\u7528\u6237\u8F93\u5165\u53CA\u540E\u7EED\u6D88\u606F\u3002', true)}\n <div style={{ display: 'flex', gap: 10, justifyContent: 'space-between', alignItems: 'center', padding: '12px 0', fontSize: 13 }}>\n <span>\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0</span>\n <Switch label=\"\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0\" checked={state.fields.autoRecall.text === 'true'} disabled={disabled}\n onChange={value => props.edit('autoRecall', String(value))} />\n </div>\n </Group>\n {state.error ? <p role=\"alert\" style={{ ...hint, color: 'var(--dsw-alias-label-error)' }}>{state.error}</p> : null}\n </SettingsForm>\n </div>\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_dsh_client_ui_primitives"]
7
+ }
package/lib/config.d.ts CHANGED
@@ -1,10 +1,13 @@
1
1
  import z from '@deepseek-ai/schemastery';
2
+ import type { ModelParameters } from './model-parameters.js';
2
3
  export interface DiaryConfig {
3
4
  apiKey: string;
4
5
  baseUrl: string;
5
6
  embeddingModel: string;
6
7
  embeddingDimensions: number;
8
+ embeddingParameters: ModelParameters;
7
9
  rerankModel: string;
10
+ rerankParameters: ModelParameters;
8
11
  compressionRounds: number;
9
12
  retainRounds: number;
10
13
  namespace: string;
@@ -26,7 +29,9 @@ export declare const defaults: Readonly<{
26
29
  baseUrl: "https://dashscope.aliyuncs.com";
27
30
  embeddingModel: "text-embedding-v4";
28
31
  embeddingDimensions: 1024;
32
+ embeddingParameters: Readonly<{}>;
29
33
  rerankModel: "gte-rerank-v2";
34
+ rerankParameters: Readonly<{}>;
30
35
  compressionRounds: 20;
31
36
  retainRounds: 2;
32
37
  namespace: "companion";
@@ -42,5 +47,58 @@ export declare const defaults: Readonly<{
42
47
  recentDiaryCount: 3;
43
48
  autoRecall: true;
44
49
  }>;
45
- export declare const Config: z<DiaryConfig>;
50
+ export declare const liveConfigFields: readonly ["apiKey", "baseUrl", "embeddingModel", "embeddingDimensions", "embeddingParameters", "rerankModel", "rerankParameters", "compressionRounds", "retainRounds", "candidateCount", "recallCount", "autoRecall"];
51
+ export type LiveConfigField = typeof liveConfigFields[number];
52
+ export type PluginConfig = {
53
+ [K in keyof DiaryConfig]: K extends LiveConfigField ? DiaryConfig[K] | {
54
+ get(): DiaryConfig[K] | undefined;
55
+ } : DiaryConfig[K];
56
+ };
57
+ /** DSH only exposes volatile fields to its settings transport. */
58
+ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
59
+ apiKey: z<string, string, "volatile">;
60
+ baseUrl: z<string, string, "defined">;
61
+ embeddingModel: z<string, string, "defined">;
62
+ embeddingDimensions: z<number, number, "defined">;
63
+ embeddingParameters: z<import("@deepseek-ai/cosmokit").Dict<any, string>, import("@deepseek-ai/cosmokit").Dict<any, string>, "defined">;
64
+ rerankModel: z<string, string, "defined">;
65
+ rerankParameters: z<import("@deepseek-ai/cosmokit").Dict<any, string>, import("@deepseek-ai/cosmokit").Dict<any, string>, "defined">;
66
+ compressionRounds: z<number, number, "defined">;
67
+ retainRounds: z<number, number, "defined">;
68
+ namespace: z<string, string, "defined">;
69
+ databasePath: z<string, string, "defined">;
70
+ candidateCount: z<number, number, "defined">;
71
+ recallCount: z<number, number, "defined">;
72
+ timeoutMs: z<number, number, "defined">;
73
+ retries: z<number, number, "defined">;
74
+ diaryProvider: z<string, string, "defined">;
75
+ diaryModel: z<string, string, "defined">;
76
+ diaryMaxTokens: z<number, number, "defined">;
77
+ diaryInputMaxChars: z<number, number, "defined">;
78
+ recentDiaryCount: z<number, number, "defined">;
79
+ autoRecall: z<boolean, boolean, "defined">;
80
+ }>>, Schemastery.ObjectT<NoInfer<{
81
+ apiKey: z<string, string, "volatile">;
82
+ baseUrl: z<string, string, "defined">;
83
+ embeddingModel: z<string, string, "defined">;
84
+ embeddingDimensions: z<number, number, "defined">;
85
+ embeddingParameters: z<import("@deepseek-ai/cosmokit").Dict<any, string>, import("@deepseek-ai/cosmokit").Dict<any, string>, "defined">;
86
+ rerankModel: z<string, string, "defined">;
87
+ rerankParameters: z<import("@deepseek-ai/cosmokit").Dict<any, string>, import("@deepseek-ai/cosmokit").Dict<any, string>, "defined">;
88
+ compressionRounds: z<number, number, "defined">;
89
+ retainRounds: z<number, number, "defined">;
90
+ namespace: z<string, string, "defined">;
91
+ databasePath: z<string, string, "defined">;
92
+ candidateCount: z<number, number, "defined">;
93
+ recallCount: z<number, number, "defined">;
94
+ timeoutMs: z<number, number, "defined">;
95
+ retries: z<number, number, "defined">;
96
+ diaryProvider: z<string, string, "defined">;
97
+ diaryModel: z<string, string, "defined">;
98
+ diaryMaxTokens: z<number, number, "defined">;
99
+ diaryInputMaxChars: z<number, number, "defined">;
100
+ recentDiaryCount: z<number, number, "defined">;
101
+ autoRecall: z<boolean, boolean, "defined">;
102
+ }>>, "plain">;
103
+ export declare function resolvePluginConfig(input?: Partial<PluginConfig>, env?: NodeJS.ProcessEnv): ResolvedConfig;
46
104
  export declare function resolveConfig(input?: Partial<DiaryConfig>, env?: NodeJS.ProcessEnv): ResolvedConfig;
package/lib/config.js CHANGED
@@ -1,12 +1,15 @@
1
1
  import z from '@deepseek-ai/schemastery';
2
2
  import { homedir } from 'node:os';
3
3
  import { join, resolve } from 'node:path';
4
+ import { validateModelParameters } from './model-parameters.js';
4
5
  export const defaults = Object.freeze({
5
6
  apiKey: '',
6
7
  baseUrl: 'https://dashscope.aliyuncs.com',
7
8
  embeddingModel: 'text-embedding-v4',
8
9
  embeddingDimensions: 1024,
10
+ embeddingParameters: Object.freeze({}),
9
11
  rerankModel: 'gte-rerank-v2',
12
+ rerankParameters: Object.freeze({}),
10
13
  compressionRounds: 20,
11
14
  retainRounds: 2,
12
15
  namespace: 'companion',
@@ -22,13 +25,14 @@ export const defaults = Object.freeze({
22
25
  recentDiaryCount: 3,
23
26
  autoRecall: true,
24
27
  });
25
- // DSH reads this schema for its native plugin configuration form.
26
- export const Config = z.object({
28
+ const fields = {
27
29
  apiKey: z.string().role('secret').default('').description('百炼 API Key;留空读取 DSH_DIARY_BAILIAN_API_KEY 或 DASHSCOPE_API_KEY。'),
28
30
  baseUrl: z.string().default(defaults.baseUrl).description('百炼地域端点;须与 API Key 的地域一致。'),
29
31
  embeddingModel: z.string().default(defaults.embeddingModel),
30
32
  embeddingDimensions: z.number().step(1).min(1).max(4096).default(defaults.embeddingDimensions),
33
+ embeddingParameters: z.dict(z.any()).default({}).description('Embedding API 的额外 parameters JSON;dimension 和 text_type 由插件设置。'),
31
34
  rerankModel: z.string().default(defaults.rerankModel),
35
+ rerankParameters: z.dict(z.any()).default({}).description('Rerank API 的额外 parameters JSON;top_n 由召回条数设置。'),
32
36
  compressionRounds: z.number().step(1).min(2).default(defaults.compressionRounds).description('累计完成多少个会话轮次后,在下一次安全的 pre-step 压缩。工具调用不额外计轮次。'),
33
37
  retainRounds: z.number().step(1).min(1).default(defaults.retainRounds).description('至少保留最近多少个用户输入及其后续消息。'),
34
38
  namespace: z.string().default(defaults.namespace).description('数字分身的记忆空间。只有使用同一空间的会话共享日记与自我演化。'),
@@ -42,14 +46,31 @@ export const Config = z.object({
42
46
  diaryMaxTokens: z.number().step(1).min(256).max(16000).default(defaults.diaryMaxTokens),
43
47
  diaryInputMaxChars: z.number().step(1).min(1000).default(defaults.diaryInputMaxChars),
44
48
  recentDiaryCount: z.number().step(1).min(0).max(10).default(defaults.recentDiaryCount),
45
- autoRecall: z.boolean().default(true).description('每个新用户输入自动检索日记,并通过 agent.inject 写入可重放的上下文。'),
49
+ autoRecall: z.boolean().default(true).description('每个新用户输入自动检索日记,接纳到当前步骤并写入可重放的上下文。'),
50
+ };
51
+ const ValueConfig = z.object(fields);
52
+ export const liveConfigFields = ['apiKey', 'baseUrl', 'embeddingModel', 'embeddingDimensions', 'embeddingParameters', 'rerankModel', 'rerankParameters', 'compressionRounds', 'retainRounds', 'candidateCount', 'recallCount', 'autoRecall'];
53
+ /** DSH only exposes volatile fields to its settings transport. */
54
+ export const Config = z.object({
55
+ ...fields,
56
+ ...Object.fromEntries(liveConfigFields.map(key => [key, fields[key].volatile()])),
57
+ // No empty default on the write-only credential: the secret sidecar can report absence.
58
+ apiKey: z.string().role('secret').volatile().description('百炼 API Key;留空保留当前密钥。'),
46
59
  });
60
+ export function resolvePluginConfig(input = {}, env = process.env) {
61
+ const values = Object.fromEntries(Object.entries(input).map(([key, value]) => [key,
62
+ liveConfigFields.includes(key) && value !== null && typeof value === 'object' && 'get' in value && typeof value.get === 'function' ? value.get() : value,
63
+ ]));
64
+ // Missing optional volatile values inherit the ordinary defaults.
65
+ return resolveConfig(Object.fromEntries(Object.entries(values).filter(([, value]) => value !== undefined)), env);
66
+ }
47
67
  export function resolveConfig(input = {}, env = process.env) {
48
68
  for (const key of Object.keys(input)) {
49
69
  if (!(key in defaults))
50
70
  throw new Error(`未知日记配置项:${key}`);
51
71
  }
52
- const config = Config({ ...defaults, ...input });
72
+ // Schemastery normalizes dictionaries in place; live references are immutable.
73
+ const config = ValueConfig(structuredClone({ ...defaults, ...input }));
53
74
  const ranges = [
54
75
  ['embeddingDimensions', 1, 4096], ['compressionRounds', 2, 1000000],
55
76
  ['retainRounds', 1, 1000000], ['candidateCount', 1, 100], ['recallCount', 1, 100],
@@ -80,6 +101,8 @@ export function resolveConfig(input = {}, env = process.env) {
80
101
  if (endpoint.protocol !== 'https:' && !(endpoint.protocol === 'http:' && ['127.0.0.1', '[::1]', 'localhost'].includes(endpoint.hostname)))
81
102
  throw new Error('baseUrl 需要 HTTPS;本地测试可以使用 loopback HTTP');
82
103
  config.baseUrl = endpoint.origin;
104
+ config.embeddingParameters = validateModelParameters(config.embeddingParameters, 'embedding');
105
+ config.rerankParameters = validateModelParameters(config.rerankParameters, 'rerank');
83
106
  config.apiKey = config.apiKey.trim() || env.DSH_DIARY_BAILIAN_API_KEY?.trim() || env.DASHSCOPE_API_KEY?.trim() || '';
84
107
  const profileDir = env.DSH_PROFILE_DIR?.trim() || join(env.DSH_HOME?.trim() || join(homedir(), '.dsh'), 'profiles', env.DSH_PROFILE?.trim() || 'default');
85
108
  config.databasePath = config.databasePath || join(profileDir, 'diary-memory', 'memories.sqlite3');
package/lib/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { Context } from '@deepseek-ai/cordis';
2
- import type { DiaryConfig } from './config.js';
2
+ import type { PluginConfig } from './config.js';
3
3
  export { Config, defaults, resolveConfig } from './config.js';
4
- export type { DiaryConfig, ResolvedConfig } from './config.js';
4
+ export type { DiaryConfig, PluginConfig, ResolvedConfig } from './config.js';
5
5
  export { BailianClient, BailianError } from './bailian-client.js';
6
6
  export { MemoryStore } from './memory-store.js';
7
7
  export { RetrievalService } from './retrieval-service.js';
@@ -10,4 +10,4 @@ export type { RecallHit, RecallOptions } from './retrieval-service.js';
10
10
  export type { Diary } from './diary.js';
11
11
  export declare const name = "diary-memory";
12
12
  export declare const inject: string[];
13
- export declare function apply(ctx: Context, input?: Partial<DiaryConfig>): Promise<void>;
13
+ export declare function apply(ctx: Context, input?: Partial<PluginConfig>): Promise<void>;
package/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { resolveConfig } from './config.js';
1
+ import { resolvePluginConfig } from './config.js';
2
2
  import { RetrievalService } from './retrieval-service.js';
3
3
  export { Config, defaults, resolveConfig } from './config.js';
4
4
  export { BailianClient, BailianError } from './bailian-client.js';
@@ -8,7 +8,10 @@ export { DiaryOrchestrator } from './orchestrator.js';
8
8
  export const name = 'diary-memory';
9
9
  export const inject = ['sessions', 'sessionProjections'];
10
10
  export async function apply(ctx, input = {}) {
11
- const memory = new RetrievalService(ctx, resolveConfig(input));
11
+ const memory = new RetrievalService(ctx, () => resolvePluginConfig(input));
12
12
  await memory.initialize();
13
+ ctx.inject(['settings'], (settingsCtx) => {
14
+ settingsCtx.effect(() => settingsCtx.settings.configure({ auto: false }, ctx.fiber), 'diary-memory: custom settings page');
15
+ });
13
16
  }
14
17
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEzD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE7D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAIrD,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAA;AAClC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAA;AAExD,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY,EAAE,QAA8B,EAAE;IACxE,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9D,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;AAC3B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAGzD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE7D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAIrD,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAA;AAClC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAA;AAExD,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY,EAAE,QAA+B,EAAE;IACzE,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1E,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;IACzB,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE;QACvC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,oCAAoC,CAAC,CAAA;IAC5H,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type JsonValue = null | boolean | number | string | JsonValue[] | {
2
+ [key: string]: JsonValue;
3
+ };
4
+ export type ModelParameters = Readonly<Record<string, JsonValue>>;
5
+ /** Shared by the native configuration reader and the browser parameter editors. */
6
+ export declare function validateModelParameters(value: unknown, kind: 'embedding' | 'rerank'): ModelParameters;
7
+ export declare function stableParameters(value: ModelParameters): string;
@@ -0,0 +1,38 @@
1
+ /** Shared by the native configuration reader and the browser parameter editors. */
2
+ export function validateModelParameters(value, kind) {
3
+ if (!value || typeof value !== 'object' || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value)))
4
+ throw new Error(`${kind} 参数必须为 JSON 对象`);
5
+ const visit = (item, depth = 0) => {
6
+ if (depth > 16)
7
+ throw new Error(`${kind} 参数嵌套过深`);
8
+ if (item === null || typeof item === 'boolean' || typeof item === 'string')
9
+ return item;
10
+ if (typeof item === 'number' && Number.isFinite(item))
11
+ return item;
12
+ if (Array.isArray(item))
13
+ return Object.freeze(item.map(child => visit(child, depth + 1)));
14
+ if (item && typeof item === 'object' && [Object.prototype, null].includes(Object.getPrototypeOf(item))) {
15
+ return Object.freeze(Object.fromEntries(Object.entries(item).map(([key, child]) => [key, visit(child, depth + 1)])));
16
+ }
17
+ throw new Error(`${kind} 参数只能包含 JSON 值`);
18
+ };
19
+ const parameters = visit(value);
20
+ if (JSON.stringify(parameters).length > 16000)
21
+ throw new Error(`${kind} 参数不能超过 16000 字符`);
22
+ const reserved = kind === 'embedding' ? ['dimension', 'text_type'] : ['top_n'];
23
+ if (reserved.some(key => Object.hasOwn(parameters, key)))
24
+ throw new Error(kind === 'embedding'
25
+ ? 'dimension 请在向量维度中填写;text_type 由入库和召回自动设置'
26
+ : 'top_n 请在召回条数中填写');
27
+ if (kind === 'embedding' && parameters.output_type !== undefined && parameters.output_type !== 'dense')
28
+ throw new Error('本地向量检索需要 dense 向量,output_type 仅支持 dense');
29
+ if (kind === 'rerank' && parameters.return_documents !== undefined && typeof parameters.return_documents !== 'boolean')
30
+ throw new Error('return_documents 必须是布尔值');
31
+ return parameters;
32
+ }
33
+ export function stableParameters(value) {
34
+ const ordered = (item) => Array.isArray(item) ? item.map(ordered)
35
+ : item !== null && typeof item === 'object' ? Object.fromEntries(Object.keys(item).sort().map(key => [key, ordered(item[key])])) : item;
36
+ return JSON.stringify(ordered(value));
37
+ }
38
+ //# sourceMappingURL=model-parameters.js.map