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/README.md +56 -13
- package/cordis.patch.yml +0 -1
- package/lib/bailian-client.js +8 -3
- package/lib/bailian-client.js.map +1 -1
- package/lib/client/controller.d.ts +32 -0
- package/lib/client/controller.js +91 -0
- package/lib/client/controller.js.map +1 -0
- package/lib/client/index.d.ts +5 -0
- package/lib/client/index.js +16 -0
- package/lib/client/index.js.map +1 -0
- package/lib/client/page.d.ts +5 -0
- package/lib/client/page.js +19 -0
- package/lib/client/page.js.map +1 -0
- package/lib/client.js +274 -0
- package/lib/client.js.map +7 -0
- package/lib/config.d.ts +59 -1
- package/lib/config.js +27 -4
- package/lib/config.js.map +1 -1
- package/lib/index.d.ts +3 -3
- package/lib/index.js +5 -2
- package/lib/index.js.map +1 -1
- package/lib/model-parameters.d.ts +7 -0
- package/lib/model-parameters.js +38 -0
- package/lib/model-parameters.js.map +1 -0
- package/lib/orchestrator.js +1 -1
- package/lib/orchestrator.js.map +1 -1
- package/lib/retrieval-service.d.ts +12 -3
- package/lib/retrieval-service.js +25 -13
- package/lib/retrieval-service.js.map +1 -1
- package/package.json +124 -27
- package/src/bailian-client.ts +7 -3
- package/src/client/controller.ts +81 -0
- package/src/client/index.ts +21 -0
- package/src/client/page.tsx +68 -0
- package/src/config.ts +35 -4
- package/src/index.ts +9 -5
- package/src/model-parameters.ts +32 -0
- package/src/orchestrator.ts +1 -1
- package/src/retrieval-service.ts +27 -14
package/README.md
CHANGED
|
@@ -2,25 +2,62 @@
|
|
|
2
2
|
|
|
3
3
|
TypeScript 编写的 DSH 插件,为长期陪伴和个人数字分身保存日记、延续情感与自我反思。支持百炼 Embedding + Rerank、SQLite 本地记忆、自动召回,以及 DSH 原生安全压缩。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
兼容范围:**DSH `>=0.2.1-rc.2 <0.3.0`**。运行时声明和 DSH SDK 的 peer 依赖均使用这个范围。开发构建使用 `0.2.1-rc.3` SDK;接口依据 [DeepSeek Harness 官方仓库](https://github.com/deepseek-ai/deepseek-harness)。
|
|
6
6
|
|
|
7
7
|
## 安装与开始使用
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
2. 在 DSH 的插件管理器中安装本地组合包,目标选择这个项目目录或生成的 `dsh-diary-memory-0.1.0.tgz`。也可以让 DSH 的插件管理工具执行:
|
|
9
|
+
### 通过 npm 安装(推荐)
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
{ "action": "install_bundle", "target": "E:\\Project\\dsh-diary-memory" }
|
|
14
|
-
```
|
|
11
|
+
插件已发布到 [npm:dsh-diary-memory](https://www.npmjs.com/package/dsh-diary-memory),可直接用 DSH 命令安装,无需克隆源码或编译。
|
|
15
12
|
|
|
16
|
-
|
|
13
|
+
**DSH 桌面端:**先至少启动一次桌面端以初始化 profile,再完全退出应用,使用桌面端附带的 `dsh` 命令执行:
|
|
17
14
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
```powershell
|
|
16
|
+
dsh plugin --profile desktop add dsh-diary-memory
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
安装完成后重新打开 DSH。管理 `desktop` profile 应使用桌面端附带的命令;通过 npm 单独安装的 DSH CLI 不能修改这个 profile。桌面端的命令与 profile 归属见 [官方说明](https://github.com/deepseek-ai/deepseek-harness/blob/main/apps/desktop/README.zh.md#bundled-command-runtime)。
|
|
20
|
+
|
|
21
|
+
**Web 或其他 CLI profile:**将 `--profile` 设为实际使用的 profile 名称。例如,安装到 `web`:
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
dsh plugin --profile web add dsh-diary-memory
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
插件按 profile 安装;安装到 `web` 不会同时装入 `desktop`。如需固定当前版本,将包名写为 `dsh-diary-memory@0.1.1`。由 DSH 管理对应 profile 的依赖与组合包配置;安装结果提示 `restart-required` 时重启对应的 DSH 进程。
|
|
28
|
+
|
|
29
|
+
图形设置页从 **0.1.1** 开始提供。若 npm 上暂未提供该版本,可先使用 Releases 中的 `0.1.1` 安装包。
|
|
30
|
+
|
|
31
|
+
### 首次配置
|
|
32
|
+
|
|
33
|
+
1. 打开 DSH **设置 → 陪伴日记**,在密码输入框中填写百炼 **API Key**。Embedding 与 Rerank 的模型名可直接手填;向量维度、召回数量和各自的 JSON 参数也在此页配置。点击 **保存配置** 后,下一次请求使用新配置。日记生成仍使用已配置的 DSH 模型,本页不添加日记生成模型的参数。
|
|
34
|
+
2. 新建会话,选择 **“陪伴日记”**(preset ID `diary-companion`),并配置正常的 DSH 会话模型。日记默认使用该模型生成;百炼负责向量与重排。
|
|
35
|
+
3. 默认完成 20 轮后,在下一次 `agent/pre-step` 触发日记压缩,保留最近 2 个用户输入及其后续消息。`/compact` 手动压缩和原生上下文溢出恢复也会先保存日记。
|
|
36
|
+
|
|
37
|
+
密钥只写入,不回显;留空保存其他字段会保留原 Key。修改只提交编辑过的字段,避免覆盖未回传的密钥。保存失败或出现版本冲突时保留草稿。也可以给 **DSH 进程**设置 `DSH_DIARY_BAILIAN_API_KEY` / `DASHSCOPE_API_KEY` 环境变量。
|
|
21
38
|
|
|
22
39
|
安装包会新增预设,不会给现有的工作型预设添加记忆。已有会话保留原先的预设组合;要用于已有的自定义数字分身,应在其预设的原生 compaction 隔离组中,把 `@deepseek-ai/dsh-compaction-basic` 替换为 `dsh-diary-memory/compaction`,并在预设中加入 `dsh-diary-memory/tools`。保留自己的 persona 与其他工具。**不要在同一隔离组同时启用两个 compaction 提供方。**
|
|
23
40
|
|
|
41
|
+
### 从本地安装或开发
|
|
42
|
+
|
|
43
|
+
也可从 [GitHub Releases](https://github.com/cyhddyx/dsh-diary-memory/releases) 下载已编译的 `.tgz` 安装包,在下载目录执行:
|
|
44
|
+
|
|
45
|
+
```powershell
|
|
46
|
+
dsh plugin --profile desktop add ./dsh-diary-memory-0.1.1.tgz
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
桌面端仍需先完全退出。若从源码开始,先生成安装包,再用上面的命令安装:
|
|
50
|
+
|
|
51
|
+
```powershell
|
|
52
|
+
git clone https://github.com/cyhddyx/dsh-diary-memory.git
|
|
53
|
+
cd dsh-diary-memory
|
|
54
|
+
npm ci
|
|
55
|
+
npm run build
|
|
56
|
+
npm pack
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
也可以在 DSH 的插件管理器中添加 npm 包名 `dsh-diary-memory`、本地 `.tgz` 或已构建的源码目录。
|
|
60
|
+
|
|
24
61
|
`better-sqlite3` 是本机原生模块。安装器若提示它的构建脚本待处理,应按 DSH 的提示处理;其二进制必须匹配 DSH **宿主 Node.js** 的 ABI。开发时如果 npm 禁用了安装脚本,可针对这个依赖执行 `npm rebuild better-sqlite3 --ignore-scripts=false`。无需改用 Electron 渲染进程的 ABI。
|
|
25
62
|
|
|
26
63
|
## 配置
|
|
@@ -36,7 +73,9 @@ TypeScript 编写的 DSH 插件,为长期陪伴和个人数字分身保存日
|
|
|
36
73
|
namespace: companion
|
|
37
74
|
embeddingModel: text-embedding-v4
|
|
38
75
|
embeddingDimensions: 1024
|
|
76
|
+
embeddingParameters: {}
|
|
39
77
|
rerankModel: gte-rerank-v2
|
|
78
|
+
rerankParameters: {}
|
|
40
79
|
autoRecall: true
|
|
41
80
|
```
|
|
42
81
|
|
|
@@ -50,7 +89,9 @@ DSH 的 `config` 覆盖会替换该行的整个配置;未写出的插件字段
|
|
|
50
89
|
| `namespace` | `companion` | 数字分身的独立记忆空间;同一空间跨会话共享 |
|
|
51
90
|
| `databasePath` | 当前 profile 的 `diary-memory/memories.sqlite3` | SQLite 文件;使用 `DSH_PROFILE_DIR`,否则回退到 DSH home 中的 profile 目录 |
|
|
52
91
|
| `embeddingModel` / `embeddingDimensions` | `text-embedding-v4` / `1024` | 文档和查询使用同一向量空间 |
|
|
92
|
+
| `embeddingParameters` | `{}` | 原样传给 Embedding API 的额外 `parameters` JSON 对象 |
|
|
53
93
|
| `rerankModel` | `gte-rerank-v2` | 候选日记的重排模型 |
|
|
94
|
+
| `rerankParameters` | `{}` | 原样传给 Rerank API 的额外 `parameters` JSON 对象 |
|
|
54
95
|
| `candidateCount` / `recallCount` | `30` / `6` | 余弦候选数量 / 重排后返回数量 |
|
|
55
96
|
| `diaryProvider` / `diaryModel` | 空 / 空 | 同时设置可指定 DSH 日记模型,否则继承会话路由 |
|
|
56
97
|
| `diaryMaxTokens` | `3000` | 日记生成输出预算;截断输出不入库 |
|
|
@@ -61,7 +102,9 @@ DSH 的 `config` 覆盖会替换该行的整个配置;未写出的插件字段
|
|
|
61
102
|
|
|
62
103
|
轮次计数来自 `sessionProjections` 对 `turn/end` 的增量折叠:成功完成的 turn 计一次,多个工具步骤不额外计数。写入压缩 checkpoint 后重新计数。轮次阈值之外,DSH 原生 token 压力与溢出保护仍然启用。
|
|
63
104
|
|
|
64
|
-
|
|
105
|
+
模型参数编辑器接收 JSON **对象**,例如 Embedding 的 `{"output_type":"dense"}`,以及 Rerank 的 `{"return_documents":false}`。只应填写所选模型支持的参数。`dimension` 由“向量维度”控制,`top_n` 由“召回条数”控制,`text_type` 由入库和召回自动设置,不能在额外参数中覆盖。本地索引只支持 dense 向量。
|
|
106
|
+
|
|
107
|
+
不同 `namespace` 不会相互检索。默认新预设里的会话共享 `companion` 空间;不同人物或用途应配置不同的空间与组合。修改 Embedding 的端点、模型、维度或额外参数后,旧向量不会被拿来混算;如需继续使用旧记忆,应恢复原配置。额外参数按规范化 JSON 参与向量空间标识;空参数保留 `0.1.0` 的标识,升级不会使默认配置的旧向量失效。当前版本不提供自动重建向量索引。
|
|
65
108
|
|
|
66
109
|
## 日记与情感连续性
|
|
67
110
|
|
|
@@ -139,9 +182,9 @@ npm run build
|
|
|
139
182
|
npm pack
|
|
140
183
|
```
|
|
141
184
|
|
|
142
|
-
`src/` 为 TypeScript,`lib/`
|
|
185
|
+
`src/` 为 TypeScript,`lib/` 包含 Host ESM、声明、source map 与 DSH 模块工厂格式的 `client.js`。浏览器页面复用 DSH 的原生设置组件和 `configForms` 读写服务。开发依赖固定使用官方 `0.2.1-rc.3` SDK 作为构建基线;分发包的兼容范围为 `>=0.2.1-rc.2 <0.3.0`,依赖 DSH 提供的原生模块,不附带一套 DSH。
|
|
143
186
|
|
|
144
|
-
|
|
187
|
+
41 项测试分别在 `0.2.1-rc.2` 和 `0.2.1-rc.3` SDK 下通过。测试使用真实的 Cordis、Session、sessionProjections、TokenMeter 和 BasicCompactionEngine;LLM 与百炼使用测试提供方,另外通过本地 HTTP 服务器验证原生 fetch 请求结构。覆盖工具边界、向量隔离、rerank、同会话并发、手动/自动/溢出压缩、失败重试、取消、SQLite 重开与日志重放恢复,也覆盖原生设置服务的持久化与密钥脱敏、运行中的配置更新、表单冲突保留草稿、手填模型与参数,以及浏览器模块注册。没有使用真实 Key,也没有把真实个人会话传给云服务。
|
|
145
188
|
|
|
146
189
|
参考:
|
|
147
190
|
|
package/cordis.patch.yml
CHANGED
package/lib/bailian-client.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { setTimeout as delay } from 'node:timers/promises';
|
|
2
|
+
import { stableParameters } from './model-parameters.js';
|
|
2
3
|
export class BailianError extends Error {
|
|
3
4
|
status;
|
|
4
5
|
requestId;
|
|
@@ -29,7 +30,11 @@ export class BailianClient {
|
|
|
29
30
|
this.fetch = fetchImpl;
|
|
30
31
|
this.signal = signal;
|
|
31
32
|
// Model names alone do not identify the vector space across endpoints/dimensions.
|
|
32
|
-
|
|
33
|
+
const space = [config.baseUrl, config.embeddingModel, config.embeddingDimensions];
|
|
34
|
+
// Keep the original vector-space key when no extra parameters were chosen.
|
|
35
|
+
if (Object.keys(config.embeddingParameters).length)
|
|
36
|
+
space.push(stableParameters(config.embeddingParameters));
|
|
37
|
+
this.embeddingKey = JSON.stringify(space);
|
|
33
38
|
}
|
|
34
39
|
async request(path, body, callerSignal) {
|
|
35
40
|
const { config } = this;
|
|
@@ -88,7 +93,7 @@ export class BailianClient {
|
|
|
88
93
|
const output = await this.request('/api/v1/services/embeddings/text-embedding/text-embedding', {
|
|
89
94
|
model: embeddingModel,
|
|
90
95
|
input: { texts: [text] },
|
|
91
|
-
parameters: { text_type: textType, dimension: embeddingDimensions },
|
|
96
|
+
parameters: { ...this.config.embeddingParameters, text_type: textType, dimension: embeddingDimensions },
|
|
92
97
|
}, signal);
|
|
93
98
|
if (output.embeddings?.length !== 1 || output.embeddings[0].text_index !== 0)
|
|
94
99
|
throw new BailianError('百炼 embedding 的 text_index 无效');
|
|
@@ -104,7 +109,7 @@ export class BailianClient {
|
|
|
104
109
|
const output = await this.request('/api/v1/services/rerank/text-rerank/text-rerank', {
|
|
105
110
|
model: this.config.rerankModel,
|
|
106
111
|
input: { query, documents },
|
|
107
|
-
parameters: {
|
|
112
|
+
parameters: { return_documents: false, ...this.config.rerankParameters, top_n: topN },
|
|
108
113
|
}, signal);
|
|
109
114
|
if (!Array.isArray(output.results) || output.results.length !== topN)
|
|
110
115
|
throw new BailianError('百炼 rerank 结果数量无效');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bailian-client.js","sourceRoot":"","sources":["../src/bailian-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"bailian-client.js","sourceRoot":"","sources":["../src/bailian-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { SettingsFormModel } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
2
|
+
import type { SettingsFieldState, SettingsFormScope, SettingsFormShell } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
3
|
+
import type { SnapshotStore } from '@deepseek-ai/dsh-client-store';
|
|
4
|
+
import type { DiaryConfig } from '../config.js';
|
|
5
|
+
export declare const editableFields: readonly ["apiKey", "baseUrl", "embeddingModel", "embeddingDimensions", "embeddingParameters", "rerankModel", "rerankParameters", "candidateCount", "recallCount", "compressionRounds", "retainRounds", "autoRecall"];
|
|
6
|
+
export type EditableField = typeof editableFields[number];
|
|
7
|
+
export type FormValues = Partial<Pick<DiaryConfig, EditableField>>;
|
|
8
|
+
export interface DiarySettingsState extends SettingsFormShell {
|
|
9
|
+
fields: Record<EditableField, SettingsFieldState>;
|
|
10
|
+
keyConfigured: boolean;
|
|
11
|
+
error: string | null;
|
|
12
|
+
}
|
|
13
|
+
/** Native staged form: only edited paths are sent, preserving undisclosed secrets. */
|
|
14
|
+
export declare class DiarySettingsController {
|
|
15
|
+
private readonly scope;
|
|
16
|
+
private readonly keyConfigured;
|
|
17
|
+
readonly form: SettingsFormModel<FormValues>;
|
|
18
|
+
readonly store: SnapshotStore<DiarySettingsState>;
|
|
19
|
+
constructor(scope: SettingsFormScope<FormValues>, keyConfigured?: () => boolean);
|
|
20
|
+
private projection;
|
|
21
|
+
save(): Promise<void>;
|
|
22
|
+
inject(): {
|
|
23
|
+
save: () => void;
|
|
24
|
+
edit: (field: string, text: string) => void;
|
|
25
|
+
resetField: (field: string) => void;
|
|
26
|
+
discard: () => void;
|
|
27
|
+
hooks: {
|
|
28
|
+
diarySettings: SnapshotStore<DiarySettingsState>;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
dispose(): void;
|
|
32
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { SettingsFormModel, settingsTextField } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
2
|
+
import { validateModelParameters } from '../model-parameters.js';
|
|
3
|
+
export const editableFields = ['apiKey', 'baseUrl', 'embeddingModel', 'embeddingDimensions', 'embeddingParameters', 'rerankModel', 'rerankParameters', 'candidateCount', 'recallCount', 'compressionRounds', 'retainRounds', 'autoRecall'];
|
|
4
|
+
function numberField(field, min, max) {
|
|
5
|
+
return {
|
|
6
|
+
field, format: value => typeof value === 'number' ? String(value) : '',
|
|
7
|
+
parse: text => !text.trim() ? { kind: 'clear' }
|
|
8
|
+
: Number.isSafeInteger(Number(text)) && Number(text) >= min && Number(text) <= max ? { kind: 'set', value: Number(text) } : undefined,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function parametersField(field, kind) {
|
|
12
|
+
return {
|
|
13
|
+
field, format: value => value && typeof value === 'object' ? JSON.stringify(value, null, 2) : '{}',
|
|
14
|
+
parse: text => {
|
|
15
|
+
if (!text.trim())
|
|
16
|
+
return { kind: 'clear' };
|
|
17
|
+
try {
|
|
18
|
+
return { kind: 'set', value: validateModelParameters(JSON.parse(text), kind) };
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const specs = [
|
|
27
|
+
...['apiKey', 'baseUrl', 'embeddingModel', 'rerankModel'].map(settingsTextField),
|
|
28
|
+
numberField('embeddingDimensions', 1, 4096), numberField('candidateCount', 1, 100), numberField('recallCount', 1, 100),
|
|
29
|
+
numberField('compressionRounds', 2, 1000000), numberField('retainRounds', 1, 1000000),
|
|
30
|
+
parametersField('embeddingParameters', 'embedding'), parametersField('rerankParameters', 'rerank'),
|
|
31
|
+
{ field: 'autoRecall', format: value => String(value ?? true), parse: text => text === 'true' || text === 'false' ? { kind: 'set', value: text === 'true' } : undefined },
|
|
32
|
+
];
|
|
33
|
+
/** Native staged form: only edited paths are sent, preserving undisclosed secrets. */
|
|
34
|
+
export class DiarySettingsController {
|
|
35
|
+
scope;
|
|
36
|
+
keyConfigured;
|
|
37
|
+
form;
|
|
38
|
+
store;
|
|
39
|
+
constructor(scope, keyConfigured = () => false) {
|
|
40
|
+
this.scope = scope;
|
|
41
|
+
this.keyConfigured = keyConfigured;
|
|
42
|
+
this.form = new SettingsFormModel(scope, specs);
|
|
43
|
+
this.store = this.form.bind(() => this.projection());
|
|
44
|
+
}
|
|
45
|
+
projection() {
|
|
46
|
+
const fields = Object.fromEntries(editableFields.map(field => [field, this.form.field(field)]));
|
|
47
|
+
const base = this.scope.getSnapshot().base;
|
|
48
|
+
const number = (field, fallback) => fields[field].text.trim() ? Number(fields[field].text) : base?.[field] ?? fallback;
|
|
49
|
+
let error = null;
|
|
50
|
+
if (number('compressionRounds', 20) <= number('retainRounds', 2))
|
|
51
|
+
error = '压缩轮次必须大于保留轮次。';
|
|
52
|
+
if (number('recallCount', 6) > number('candidateCount', 30))
|
|
53
|
+
error = '召回条数不能大于候选数量。';
|
|
54
|
+
for (const kind of ['embedding', 'rerank']) {
|
|
55
|
+
const text = fields[`${kind}Parameters`].text.trim();
|
|
56
|
+
try {
|
|
57
|
+
validateModelParameters(JSON.parse(text || '{}'), kind);
|
|
58
|
+
}
|
|
59
|
+
catch (failure) {
|
|
60
|
+
error = failure instanceof SyntaxError ? `${kind} 参数需要合法的 JSON 对象。` : failure.message;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const endpoint = fields.baseUrl.text.trim();
|
|
64
|
+
try {
|
|
65
|
+
if (endpoint) {
|
|
66
|
+
const url = new URL(endpoint);
|
|
67
|
+
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)))
|
|
68
|
+
throw new Error();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
fields.baseUrl.invalid = true;
|
|
73
|
+
error = '百炼端点需要 HTTPS origin,例如 https://dashscope.aliyuncs.com。';
|
|
74
|
+
}
|
|
75
|
+
for (const field of ['embeddingModel', 'rerankModel']) {
|
|
76
|
+
if (fields[field].text.trim().length > 200) {
|
|
77
|
+
fields[field].invalid = true;
|
|
78
|
+
error = '模型名不能超过 200 字符。';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const shell = this.form.shell();
|
|
82
|
+
return { ...shell, invalid: shell.invalid || Boolean(error) || !shell.writable, fields, keyConfigured: this.keyConfigured(), error };
|
|
83
|
+
}
|
|
84
|
+
async save() { if (!this.projection().invalid)
|
|
85
|
+
await this.form.save(); }
|
|
86
|
+
inject() {
|
|
87
|
+
return { hooks: { diarySettings: this.store }, ...this.form.actions(), save: () => { void this.save(); } };
|
|
88
|
+
}
|
|
89
|
+
dispose() { this.form.dispose(); }
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/client/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAI5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAEhE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,CAAU,CAAA;AASnP,SAAS,WAAW,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IAC1D,OAAO;QACL,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;QACtE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;YAC7C,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;KACxI,CAAA;AACH,CAAC;AACD,SAAS,eAAe,CAAC,KAAa,EAAE,IAA4B;IAClE,OAAO;QACL,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAClG,KAAK,EAAE,IAAI,CAAC,EAAE;YACZ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;YAC1C,IAAI,CAAC;gBAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,SAAS,CAAA;YAAC,CAAC;QACnH,CAAC;KACF,CAAA;AACH,CAAC;AACD,MAAM,KAAK,GAAwB;IACjC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAChF,WAAW,CAAC,qBAAqB,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,gBAAgB,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,WAAW,CAAC,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC;IACtH,WAAW,CAAC,mBAAmB,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,CAAC,EAAE,OAAO,CAAC;IACrF,eAAe,CAAC,qBAAqB,EAAE,WAAW,CAAC,EAAE,eAAe,CAAC,kBAAkB,EAAE,QAAQ,CAAC;IAClG,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE;CAC1K,CAAA;AAED,sFAAsF;AACtF,MAAM,OAAO,uBAAuB;IAIL;IAAuD;IAH3E,IAAI,CAA+B;IACnC,KAAK,CAAmC;IAEjD,YAA6B,KAAoC,EAAmB,gBAA+B,GAAG,EAAE,CAAC,KAAK;QAAjG,UAAK,GAAL,KAAK,CAA+B;QAAmB,kBAAa,GAAb,aAAa,CAA6B;QAC5H,IAAI,CAAC,IAAI,GAAG,IAAI,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IACtD,CAAC;IAEO,UAAU;QAChB,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAiC,CAAA;QAC/H,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAA8B,CAAA;QACpE,MAAM,MAAM,GAAG,CAAC,KAA8E,EAAE,QAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAA;QACvM,IAAI,KAAK,GAAkB,IAAI,CAAA;QAC/B,IAAI,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YAAE,KAAK,GAAG,eAAe,CAAA;QACzF,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAAE,KAAK,GAAG,eAAe,CAAA;QACpF,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAU,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YACpD,IAAI,CAAC;gBAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;YAAC,CAAC;YAC/D,OAAO,OAAO,EAAE,CAAC;gBAAC,KAAK,GAAG,OAAO,YAAY,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC,CAAE,OAAiB,CAAC,OAAO,CAAA;YAAC,CAAC;QACtH,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3C,IAAI,CAAC;YACH,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;gBAC7B,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,EAAE,CAAA;YACjO,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YAAC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YAAC,KAAK,GAAG,wDAAwD,CAAA;QAAC,CAAC;QAC3G,KAAK,MAAM,KAAK,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAU,EAAE,CAAC;YAC/D,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;gBAAC,KAAK,GAAG,iBAAiB,CAAA;YAAC,CAAC;QACzG,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QAC/B,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAA;IACtI,CAAC;IAED,KAAK,CAAC,IAAI,KAAoB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO;QAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA,CAAC,CAAC;IACtF,MAAM;QACJ,OAAO,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,IAAI,EAAE,CAAA,CAAC,CAAC,EAAE,CAAA;IAC3G,CAAC;IACD,OAAO,KAAW,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA,CAAC,CAAC;CACxC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DiarySettingsController } from './controller.js';
|
|
2
|
+
import { DiarySettingsPage } from './page.js';
|
|
3
|
+
export { DiarySettingsController } from './controller.js';
|
|
4
|
+
export { DiarySettingsPage } from './page.js';
|
|
5
|
+
export const inject = ['slots', 'configForms'];
|
|
6
|
+
export function apply(ctx) {
|
|
7
|
+
const controller = new DiarySettingsController(ctx.configForms.get('diary-memory'), () => {
|
|
8
|
+
const entry = ctx.configForms.describe().getSnapshot().view?.namespaces.find(item => item.ns === 'diary-memory');
|
|
9
|
+
return entry?.secrets?.some(item => item.path.length === 1 && item.path[0] === 'apiKey' && item.set) ?? false;
|
|
10
|
+
});
|
|
11
|
+
ctx.effect(() => () => controller.dispose(), 'diary-memory: settings form');
|
|
12
|
+
ctx.effect(() => ctx.configForms.whileServed(['diary-memory'], () => ctx.slots.inject('settings.section', () => ctx.slots.register({
|
|
13
|
+
name: 'settings.section', id: 'diary-memory', order: 65, label: '陪伴日记', inject: () => controller.inject(),
|
|
14
|
+
}, DiarySettingsPage))), 'diary-memory: settings page');
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;AAE9C,MAAM,UAAU,KAAK,CAAC,GAAY;IAChC,MAAM,UAAU,GAAG,IAAI,uBAAuB,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAa,cAAc,CAAC,EAAE,GAAG,EAAE;QACnG,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,cAAc,CAAC,CAAA;QAChH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAA;IAC/G,CAAC,CAAC,CAAA;IACF,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,6BAA6B,CAAC,CAAA;IAC3E,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjI,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE;KAC1G,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,6BAA6B,CAAC,CAAA;AACzD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots';
|
|
2
|
+
import type { DiarySettingsController } from './controller.js';
|
|
3
|
+
type PageProps = InjectFace<ReturnType<DiarySettingsController['inject']>>;
|
|
4
|
+
export declare function DiarySettingsPage(props: PageProps): import("react").JSX.Element;
|
|
5
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { SettingsForm, SettingsSecretField, SettingsValueField, Switch } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
3
|
+
const card = { border: '1px solid var(--dsw-alias-border-l2)', borderRadius: 14, padding: '16px 20px', marginTop: 16, minWidth: 0 };
|
|
4
|
+
const hint = { fontSize: 12, lineHeight: 1.6, color: 'var(--dsw-alias-label-tertiary)', margin: '8px 0 0' };
|
|
5
|
+
const 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' };
|
|
6
|
+
function Group({ title, children }) {
|
|
7
|
+
return _jsxs("section", { "aria-label": title, style: card, children: [_jsx("h3", { style: { fontSize: 14, margin: '0 0 8px' }, children: title }), children] });
|
|
8
|
+
}
|
|
9
|
+
export function DiarySettingsPage(props) {
|
|
10
|
+
const state = props.useDiarySettings(value => value);
|
|
11
|
+
const disabled = !state.writable || state.saving;
|
|
12
|
+
const valueField = (field, label, description, numeric = false) => _jsx(SettingsValueField, { id: `diary-${field}`, label: label, hint: description, numeric: numeric, ...state.fields[field], disabled: disabled, overriddenLabel: "\u5DF2\u81EA\u5B9A\u4E49", resetLabel: "\u6062\u590D\u9ED8\u8BA4", invalidLabel: numeric ? '请填写范围内的整数。' : '请检查填写的内容。', onEdit: text => props.edit(field, text), onReset: () => props.resetField(field) }, field);
|
|
13
|
+
const parameters = (field, description) => _jsxs("div", { style: { padding: '12px 0' }, children: [_jsx("label", { htmlFor: `diary-${field}`, style: { display: 'block', fontSize: 13, fontWeight: 500, marginBottom: 8 }, children: "\u989D\u5916\u53C2\u6570\uFF08JSON\uFF09" }), _jsx("textarea", { id: `diary-${field}`, "aria-describedby": `diary-${field}-hint`, "aria-invalid": state.fields[field].invalid || undefined, value: state.fields[field].text, onChange: event => props.edit(field, event.target.value), disabled: disabled, spellCheck: false, rows: 5, style: textarea }), _jsx("p", { id: `diary-${field}-hint`, style: hint, children: description })] });
|
|
14
|
+
return _jsxs("div", { "data-diary-settings": true, style: { color: 'var(--dsw-alias-label-primary)', paddingBottom: 16 }, children: [_jsx("h2", { style: { fontSize: 18, margin: '0 0 8px' }, children: "\u966A\u4F34\u65E5\u8BB0" }), _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" }), _jsxs(SettingsForm, { state: state, onSave: props.save, onDiscard: props.discard, labels: {
|
|
15
|
+
unavailable: '正在加载配置;若持续不可用,请检查陪伴日记插件是否已启用。', readOnly: '当前配置只读。',
|
|
16
|
+
saveFailed: '保存失败或配置已在其他窗口修改。输入已保留,请检查后重试。', save: '保存配置', saving: '正在保存…',
|
|
17
|
+
}, children: [_jsxs(Group, { title: "\u767E\u70BC\u8FDE\u63A5", children: [_jsx(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", text: state.fields.apiKey.text, configured: state.keyConfigured, stateLabel: state.keyConfigured ? '已保存(不回显)' : '尚未保存', disabled: disabled, onEdit: text => props.edit('apiKey', text) }), valueField('baseUrl', '百炼 API 地址', '需要与 API Key 的地域一致,例如 https://dashscope.aliyuncs.com。')] }), _jsxs(Group, { title: "Embedding \u00B7 \u5411\u91CF\u53EC\u56DE", children: [valueField('embeddingModel', 'Embedding 模型名', '可手动填写百炼支持的文本向量模型,例如 text-embedding-v4。'), valueField('embeddingDimensions', '向量维度', '1–4096;请填写所选模型支持的维度。', true), parameters('embeddingParameters', '填写该模型支持的 parameters,例如 {"output_type":"dense"}。dimension 在上方填写,text_type 由入库与召回自动设置。'), _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" })] }), _jsxs(Group, { title: "Rerank \u00B7 \u56DE\u5FC6\u6392\u5E8F", children: [valueField('rerankModel', 'Rerank 模型名', '可手动填写百炼支持的重排模型,例如 gte-rerank-v2。'), valueField('candidateCount', '候选数量', '1–100;先由向量检索选出这些日记交给 Rerank。', true), valueField('recallCount', '召回条数(top_n)', '1–100,且不大于候选数量。', true), parameters('rerankParameters', '填写该模型支持的 parameters,例如 {"return_documents":false}。top_n 由上方的召回条数设置。')] }), _jsxs(Group, { title: "\u65E5\u8BB0\u4E0E\u966A\u4F34", children: [valueField('compressionRounds', '触发压缩的轮次', '完成多少轮后保存日记并安全压缩;须大于保留轮次。', true), valueField('retainRounds', '保留最近轮次', '至少保留最近多少个用户输入及后续消息。', true), _jsxs("div", { style: { display: 'flex', gap: 10, justifyContent: 'space-between', alignItems: 'center', padding: '12px 0', fontSize: 13 }, children: [_jsx("span", { children: "\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0" }), _jsx(Switch, { label: "\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0", checked: state.fields.autoRecall.text === 'true', disabled: disabled, onChange: value => props.edit('autoRecall', String(value)) })] })] }), state.error ? _jsx("p", { role: "alert", style: { ...hint, color: 'var(--dsw-alias-label-error)' }, children: state.error }) : null] })] });
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/client/page.tsx"],"names":[],"mappings":"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"}
|