@klarkxy/dsh-memory 0.1.2 → 0.1.4

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 CHANGED
@@ -1,33 +1,35 @@
1
1
  # @klarkxy/dsh-memory
2
2
 
3
- Default-enabled Memory with idle Dream consolidation. Stores long-term preferences, project facts, decisions, and lessons. Novel canon stays in author-confirmed worldbook files, not here.
3
+ Descriptive context for DeepSeek Harness: scoped vocabulary, explicit preferences, project facts, decisions and recent activity. Dream observes human context and consolidates it. The shared store can hold procedural lessons, but Self Improve owns their creation and injection. Novel canon stays in authoritative worldbook files.
4
4
 
5
- [简体中文](https://github.com/klarkxy/dsh-editor/blob/main/packages/dsh-memory/docs/README.zh-CN.md)
5
+ [简体中文](docs/README.zh-CN.md)
6
6
 
7
- ## Install
7
+ ## Standalone DSH Web
8
8
 
9
- Requires Node.js ≥22 and DSH `0.1.7-alpha.1`. The bundle entry starts enabled, but loading it does not start inference or load `@klarkxy/dsh-ai-services`.
10
-
11
- Standalone DSH must load the shared service explicitly before this feature can start:
9
+ Requires Node.js ≥22 and DSH `0.1.7-rc.2`. Install and load the shared service explicitly:
12
10
 
13
11
  ```sh
14
12
  dsh plugin --profile web add @klarkxy/dsh-ai-services
15
13
  dsh plugin --profile web add @klarkxy/dsh-memory
16
14
  ```
17
15
 
18
- Idle Dream is on by default and needs no confirmation: once a session has been idle for 15 minutes, at least 24 hours have passed since the last attempt, and at least 3 records were added or changed since then (deletions count), it runs once and applies automatically — at most once a day. Apply writes candidates only and never overwrites active records; failures back off for the same 24 hours. Turn it off under **Settings → 记忆**, or run the full flow manually via **Organize now**. Memory itself remains independently switchable in plugin settings.
16
+ No Editor packages or Self Improve are required. The bundle starts enabled; merely opening its UI does not call a model. Use Settings → Memory to manage records, prompt injection and the Dream observation/consolidation switch. Editor preinstalls the same public plugin, not a second implementation.
17
+
18
+ ## Context, not procedures
19
19
 
20
- ## Behaviour
20
+ `ctx.aiMemory` implements the shared `MemoryService`. New `vocabulary` and `activity` records may carry subject, domain, term/topic key, aliases, host observation time, literal event-time text and activity status. Project scope comes from the native session cwd, never an arbitrary client path. Automatic observation without a cwd is skipped rather than promoted to global.
21
21
 
22
- `ctx.aiMemory` implements the frozen `MemoryService`. Project identity is the shared untruncated `projectIdFromCwd(session.meta.cwd)` (DSH also exposes it as `session.header.cwd`). RPC derives that path from the live session id; clients cannot submit an arbitrary directory. Record ids are UUID-backed and cannot reuse a tombstone after restart. Durable writes are one typed aggregate snapshot.
22
+ At turn end, Dream observes original human messages only. A new session contributes its latest message; later batches include at most four new messages, each capped at 2000 characters. Accepted output requires exact quoted evidence from real human events. Pure continuation acknowledgements do not trigger inference. The `memory.observe-context` purpose uses the normal model role and shared budgets.
23
23
 
24
- Recall injects at most 3–5 active records (~800 tokens) at Host `agent/pre-step`, exact project scope plus explicit global records. Lessons are not injected here (self-improvement owns them). Candidates, rejected, revoked, deleted, expired, and superseded records stay out of prompts.
24
+ Activity has a default seven-day freshness bound. Expiry removes it from recall; it does not prove completion. A new explicit update supersedes the previous matching subject/domain/topic while preserving history. Stable vocabulary has no automatic activity expiry. Existing authoritative task records and project documents remain authoritative.
25
25
 
26
- Human preference and project-fact candidates need evidence or an explicit manual add. Global writes require the global checkbox. Dream produces merge/dedup candidates and applies them automatically under the idle gates above; apply writes candidates only, never overwrites active records or expands project scope to global. Corrections and deletions win over in-flight runs. Deleted ids cannot be resurrected.
26
+ Idle Dream runs after roughly 15 minutes of inactivity, at least 24 hours after the previous attempt, with at least three changes. It never consolidates lessons, crosses kinds or identities, extends source expiry, refreshes observation dates, or confirms candidate sources. Only all-active sources produce active replacements; otherwise the result stays candidate. Old manual records without referenceable evidence are left unchanged rather than assigned invented provenance. Corrections, deletion and lifecycle cancellation invalidate stale results.
27
27
 
28
- Disabling the plugin or injection/Dream switches cancels pending results and injection. Stored records remain.
28
+ Recall contains at most five active records, about 800 tokens including the wrapper. Lessons are omitted. For a continuation request, recent in-scope activity can restore the task context. Candidates, revoked, rejected, deleted, superseded and expired records are not injected. Current instructions and permissions take precedence.
29
29
 
30
- From the repository root:
30
+ Observation cursors are persisted across restart and deletion. The 512-session cursor bound fails closed for new sessions instead of evicting deletion protection. Disabling Dream stops observation and idle consolidation, not Memory storage or Self Improve. Disabling the plugin preserves stored data.
31
+
32
+ Existing records remain readable without synthetic metadata. Update the shared service and both learning packages together when testing these new fields; merging source does not publish an npm release.
31
33
 
32
34
  ```sh
33
35
  pnpm --filter @klarkxy/dsh-memory typecheck
@@ -35,6 +37,4 @@ pnpm exec vitest run packages/dsh-memory/src
35
37
  pnpm --filter @klarkxy/dsh-memory build
36
38
  ```
37
39
 
38
- [Publishing](https://github.com/klarkxy/dsh-editor/blob/main/packages/PUBLISHING.md) · [License](https://github.com/klarkxy/dsh-editor/blob/main/packages/dsh-memory/LICENSE)
39
-
40
- The Editor preinstalls this feature enabled. In the Editor, use Settings → Plugins to switch it without restarting. Standalone DSH must load `@klarkxy/dsh-ai-services` before this package; installation or removal may require a restart when the host asks for one.
40
+ [Design and limits](../../docs/portable-learning.md) · [Publishing](../PUBLISHING.md) · [License](LICENSE)
package/cordis.patch.yml CHANGED
@@ -1,4 +1,4 @@
1
- # Enabled when installed. Memory still does not enable Dream idle processing or load ai-services.
1
+ # Enabled when installed. Dream uses its own persisted switch; load ai-services explicitly.
2
2
  - insert:
3
3
  - id: memory
4
4
  name: '@klarkxy/dsh-memory'
@@ -1,9 +1,30 @@
1
1
  # @klarkxy/dsh-memory
2
2
 
3
- 默认启用的记忆与闲时梦境整理。保存长期偏好、项目事实、决策和教训。小说设定仍只存在于作者确认的世界书,不写入本插件。
3
+ Dream 负责“怎样理解用户和当前项目”:作者用语、偏好、项目事实、决策与近期状态。Self Improve 负责行动经验;共享存储允许保存 lesson,但 Dream 不整理、不注入 lesson。小说设定仍以世界书等权威文件为准。
4
4
 
5
- [English](https://github.com/klarkxy/dsh-editor/blob/main/packages/dsh-memory/README.md)
5
+ [English](../README.md)
6
6
 
7
- 需要 Node.js ≥22、DSH `0.1.7-alpha.1`。安装条目默认启用,但不会自行推理,也不会自动加载共享服务 bundle `@klarkxy/dsh-ai-services`。独立部署须先显式加载该共享服务。
7
+ ## 独立 DSH Web 安装
8
8
 
9
- 闲时梦境默认开启,无需确认:会话闲置 15 分钟、距上次整理尝试满 24 小时、且自上次以来新增或变更不少于 3 条记录(含删除)时,自动做一次整理并直接生效,每天至多一次;应用只写入候选条目,不覆盖已生效记录,失败同样计入 24 小时退避。可在「设置 → 记忆」关闭自动整理,或点击「立即整理」手动运行完整流程。关闭插件会取消进行中的整理和注入,已存数据保留。
9
+ 需要 Node.js ≥22 和 DSH `0.1.7-rc.2`。不依赖任何 Editor 私有包,也不要求安装 Self Improve。
10
+
11
+ ```sh
12
+ dsh plugin --profile web add @klarkxy/dsh-ai-services
13
+ dsh plugin --profile web add @klarkxy/dsh-memory
14
+ ```
15
+
16
+ 宿主需明确加载共享服务。插件安装后默认启用,单纯打开界面不发起推理。在「设置 → 记忆」管理条目、提示注入和 Dream 观察与整理开关;Editor 预装的也是同一个公开包。
17
+
18
+ ## 行为
19
+
20
+ 用语按 subject、domain、词条 key 和别名描述,近期状态另带记录时间、原话中的事件时间、状态和默认 7 天新鲜度上限。时间到期只停止回忆,不表示任务完成;新报告可替代同一事项,旧记录保留历史。项目范围来自原生会话 cwd,缺少 cwd 不自动写全局。当前指令、任务记录和权威项目资料优先。
21
+
22
+ 回合结束后只观察原始人类消息。首次启用取最新一条;随后每批最多 4 条、每条 2000 字符。结果必须引用实际 seq 和逐字原话,不用助手自述、工具结果或插件注入作为作者发言。纯“继续”等确认不调用模型。`memory.observe-context` 默认使用 normal 模型角色,通过共享服务限额和取消。
23
+
24
+ 闲置约 15 分钟、距上次尝试至少 24 小时且有至少 3 项变更时整理一次。Dream 不合并不同类型、作者或领域,不把近期状态写成永久词条,不延长来源有效期。只有全部来源已生效时,替代条目才自动生效;包含候选来源时仍为候选。没有可引用依据的旧手动条目保持原样,不伪造来源。
25
+
26
+ 注入最多 5 条、含包装约 800 tokens,仅使用当前项目及明确全局的 active 条目;候选、过期、被替代或撤回内容不注入。删除墓碑与持久化观察游标阻止重启后重放旧消息。游标最多 512 个会话,满后停止新会话观察,不淘汰删除保护。关闭 Dream 不关闭存储或 Self Improve;关闭插件保留数据。
27
+
28
+ 旧记录不强制补造结构化字段。测试新能力时使用同一源码构建的共享服务与学习插件;源码合入不代表已经发布新版 npm 包。
29
+
30
+ [设计与限制](../../../docs/portable-learning.md) · [发布维护](../../PUBLISHING.md) · [许可证](../LICENSE)
@@ -180,8 +180,14 @@ function candidateAvailabilityLabel(count, locale) {
180
180
  return locale === "en" ? "No candidates" : "暂无候选";
181
181
  }
182
182
  function kindLabel(kind, locale) {
183
- if (locale === "en") return kind === "preference" ? "Preference" : kind === "project-fact" ? "Project fact" : kind === "decision" ? "Decision" : "Lesson";
184
- return kind === "preference" ? "偏好" : kind === "project-fact" ? "项目事实" : kind === "decision" ? "决策" : "教训";
183
+ return {
184
+ preference: ["偏好", "Preference"],
185
+ "project-fact": ["项目事实", "Project fact"],
186
+ decision: ["决策", "Decision"],
187
+ vocabulary: ["用语释义", "Vocabulary"],
188
+ activity: ["近期状态", "Recent activity"],
189
+ lesson: ["行动经验", "Method"]
190
+ }[kind][locale === "en" ? 1 : 0];
185
191
  }
186
192
  function statusLabel(status, locale) {
187
193
  return locale === "en" ? {
@@ -401,58 +407,33 @@ function MemorySettingsPanel({ client, sessionId, locale }) {
401
407
  }),
402
408
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("article", {
403
409
  className: "dsh-memory-card",
404
- children: [
405
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: t(locale, "闲时梦境", "Idle Dream") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
406
- className: "dsh-memory-meta",
407
- children: t(locale, "闲时自动整理记忆(每天至多一次,自动生效)。", "Auto-organizes memory while idle (at most once a day, applies automatically).")
408
- })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
409
- type: "button",
410
- role: "switch",
411
- className: `dsh-memory-switch${draft.dreamIdleEnabled ? " is-on" : ""}`,
412
- "aria-checked": draft.dreamIdleEnabled,
413
- "aria-label": draft.dreamIdleEnabled ? t(locale, "关闭闲时整理", "Disable idle Dream") : t(locale, "启用闲时整理", "Enable idle Dream"),
414
- disabled: busy,
415
- onClick: () => void action(async () => {
416
- await rpc("settings.update", {
417
- expectedRevision: draft.revision,
418
- settings: {
419
- ...editable(draft),
420
- dreamIdleEnabled: !draft.dreamIdleEnabled
421
- }
422
- });
423
- }),
424
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
425
- className: "dsh-memory-switch-thumb",
426
- "aria-hidden": "true"
427
- })
428
- })] }),
429
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [t(locale, "空闲间隔(分钟)", "Idle interval (minutes)"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
430
- type: "number",
431
- min: 1,
432
- max: 180,
433
- step: 1,
434
- disabled: busy,
435
- value: Math.round(draft.idleMs / 6e4),
436
- onChange: (event) => {
437
- settingsDirty.current = true;
438
- setDraft({
439
- ...draft,
440
- idleMs: Math.round(Number(event.target.value) * 6e4)
441
- });
442
- }
443
- })] }),
444
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
445
- type: "button",
446
- disabled: busy,
447
- onClick: () => void action(async () => {
448
- await rpc("settings.update", {
449
- expectedRevision: draft.revision,
450
- settings: editable(draft)
451
- });
452
- }),
453
- children: t(locale, "保存", "Save")
410
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: t(locale, "Dream 语境记忆", "Dream context memory") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
411
+ className: "dsh-memory-meta",
412
+ children: t(locale, "从原始用户消息记录用语与近期状态,闲时整理已有语境。行动方法由自我改进负责。", "Records vocabulary and recent activity from original user messages, then consolidates context while idle. Self Improve owns methods.")
413
+ })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
414
+ type: "button",
415
+ role: "switch",
416
+ className: `dsh-memory-switch${draft.dreamIdleEnabled ? " is-on" : ""}`,
417
+ "aria-checked": draft.dreamIdleEnabled,
418
+ "aria-label": draft.dreamIdleEnabled ? t(locale, "关闭 Dream 观察与整理", "Disable Dream observation and consolidation") : t(locale, "启用 Dream 观察与整理", "Enable Dream observation and consolidation"),
419
+ disabled: busy,
420
+ onClick: () => void action(async () => {
421
+ await rpc("settings.update", {
422
+ expectedRevision: draft.revision,
423
+ settings: {
424
+ ...editable(draft),
425
+ dreamIdleEnabled: !draft.dreamIdleEnabled
426
+ }
427
+ });
428
+ }),
429
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
430
+ className: "dsh-memory-switch-thumb",
431
+ "aria-hidden": "true"
454
432
  })
455
- ]
433
+ })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
434
+ className: "dsh-memory-meta",
435
+ children: t(locale, "闲时整理在会话空闲约 15 分钟后尝试。", "Idle organization waits about 15 minutes of inactivity.")
436
+ })]
456
437
  })
457
438
  ]
458
439
  });
@@ -716,6 +697,14 @@ function MemoryChatPanel({ client, sessionId, locale }) {
716
697
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
717
698
  value: "decision",
718
699
  children: kindLabel("decision", locale)
700
+ }),
701
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
702
+ value: "vocabulary",
703
+ children: kindLabel("vocabulary", locale)
704
+ }),
705
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
706
+ value: "activity",
707
+ children: kindLabel("activity", locale)
719
708
  })
720
709
  ]
721
710
  })] }),
@@ -814,6 +803,26 @@ function MemoryRow(props) {
814
803
  scope
815
804
  ]
816
805
  }),
806
+ record.context && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
807
+ className: "dsh-memory-meta",
808
+ children: [
809
+ record.context.subject,
810
+ " · ",
811
+ record.context.domain,
812
+ " · ",
813
+ record.context.key,
814
+ " · ",
815
+ t(locale, "记录于", "Observed"),
816
+ " ",
817
+ new Date(record.context.observedAt).toLocaleString(locale === "en" ? "en-US" : "zh-CN"),
818
+ record.context.activityStatus && ` · ${record.context.activityStatus}`,
819
+ record.context.eventTime && ` · ${record.context.eventTime}`
820
+ ]
821
+ }),
822
+ record.kind === "activity" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
823
+ className: "dsh-memory-meta",
824
+ children: t(locale, "仅表示上次报告的状态;到期不代表任务已完成。", "Last reported state only; expiry never means completion.")
825
+ }),
817
826
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: record.content }),
818
827
  record.evidence.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
819
828
  className: "dsh-memory-meta",
@@ -904,7 +913,7 @@ function DreamPanel(props) {
904
913
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h4", { children: t(locale, "梦境整理", "Dream") }),
905
914
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
906
915
  className: "dsh-memory-meta",
907
- children: t(locale, "闲置且新材料足够时每天至多自动整理一次,结果自动生效。", "Runs at most once a day when idle with enough new material; results apply automatically.")
916
+ children: t(locale, "每天至多闲时整理一次;不把候选升级为事实,不延长近期状态的有效期。", "Consolidates at most once a day while idle, without confirming candidates or extending activity freshness.")
908
917
  }),
909
918
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
910
919
  className: "dsh-memory-row-actions",
@@ -939,23 +948,53 @@ function DreamPanel(props) {
939
948
  ]
940
949
  });
941
950
  }
942
- function MemorySettings({ client, props }) {
951
+ function readSelfImprovementReview(host) {
952
+ if (!host || typeof host !== "object") return void 0;
953
+ const context = host;
954
+ if (typeof context.get !== "function") return void 0;
955
+ let row;
956
+ try {
957
+ row = context.get("dshSelfImprovementReview");
958
+ } catch {
959
+ return;
960
+ }
961
+ if (!row || typeof row !== "object") return void 0;
962
+ const render = row.render;
963
+ if (typeof render !== "function") return void 0;
964
+ return { render };
965
+ }
966
+ function MemorySettings({ client, host, props }) {
943
967
  const seat = useNativeSeat(client, props);
968
+ const review = readSelfImprovementReview(host);
944
969
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
945
970
  className: "dsh-memory-settings-root",
946
971
  "data-testid": "memory-settings-root",
947
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(MemorySettingsPanel, {
948
- client,
949
- sessionId: seat.sessionId,
950
- locale: seat.locale
951
- }, `settings:${memoryPanelKey(seat.sessionId, seat.locale)}`), seat.sessionId && !seat.hidden ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MemoryChatPanel, {
952
- client,
953
- sessionId: seat.sessionId,
954
- locale: seat.locale
955
- }, `manage:${memoryPanelKey(seat.sessionId, seat.locale)}`) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
956
- className: "dsh-memory-meta",
957
- children: t(seat.locale, "选择一个会话后可以管理该会话的记忆。", "Select a session to manage its memory.")
958
- })]
972
+ children: [
973
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MemorySettingsPanel, {
974
+ client,
975
+ sessionId: seat.sessionId,
976
+ locale: seat.locale
977
+ }, `settings:${memoryPanelKey(seat.sessionId, seat.locale)}`),
978
+ review && seat.sessionId && !seat.hidden ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("details", {
979
+ className: "dsh-memory-si",
980
+ "data-testid": "self-improvement-entry",
981
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("summary", { children: t(seat.locale, "自我改进", "Self-improvement") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
982
+ className: "dsh-memory-si-body",
983
+ children: review.render({
984
+ sessionId: seat.sessionId,
985
+ locale: seat.locale
986
+ })
987
+ })]
988
+ }) : null,
989
+ seat.sessionId && !seat.hidden ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MemoryChatPanel, {
990
+ client,
991
+ sessionId: seat.sessionId,
992
+ locale: seat.locale
993
+ }, `manage:${memoryPanelKey(seat.sessionId, seat.locale)}`) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
994
+ className: "dsh-memory-meta",
995
+ children: t(seat.locale, "选择一个会话后可以管理该会话的记忆。", "Select a session to manage its memory.")
996
+ })
997
+ ]
959
998
  });
960
999
  }
961
1000
  const styles = `
@@ -965,7 +1004,7 @@ const styles = `
965
1004
  .dsh-memory-settings p,.dsh-memory-chat p{margin:0;line-height:1.5}
966
1005
  .dsh-memory-meta,.dsh-memory-chat small{font-size:var(--font-size-1,13px);color:var(--gray-11,inherit)}
967
1006
  .dsh-memory-error{color:var(--red-11,#b42318)}
968
- .dsh-memory-card,.dsh-memory-dream,.dsh-memory-add{display:grid;gap:10px;padding:14px 16px;border:1px solid var(--gray-6,color-mix(in srgb,currentColor 15%,transparent));border-radius:12px}
1007
+ .dsh-memory-card,.dsh-memory-dream,.dsh-memory-add,.dsh-memory-si{display:grid;gap:10px;padding:14px 16px;border:1px solid var(--gray-6,color-mix(in srgb,currentColor 15%,transparent));border-radius:12px}
969
1008
  .dsh-memory-card header,.dsh-memory-chat-body header{display:flex;justify-content:space-between;gap:12px;align-items:center}
970
1009
  .dsh-memory-card h3,.dsh-memory-add h4,.dsh-memory-dream h4{margin:0;font-size:var(--font-size-3,16px);font-weight:600}
971
1010
  .dsh-memory-settings input,.dsh-memory-chat input,.dsh-memory-chat textarea,.dsh-memory-chat select{box-sizing:border-box;width:100%;min-width:0;padding:8px 10px;border:1px solid var(--gray-6,color-mix(in srgb,currentColor 22%,transparent));border-radius:8px;background:var(--color-surface,transparent);color:inherit;font:inherit;transition:border-color 150ms ease,box-shadow 150ms ease}
@@ -985,7 +1024,8 @@ const styles = `
985
1024
  .dsh-memory-row-actions{display:flex;flex-wrap:wrap;gap:8px}
986
1025
  .dsh-memory-check{display:flex;gap:8px;align-items:center}
987
1026
  .dsh-memory-check input{width:auto}
988
- .dsh-memory-chat>summary{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:baseline;cursor:pointer;min-height:34px;list-style:revert}
1027
+ .dsh-memory-chat>summary,.dsh-memory-si>summary{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:baseline;cursor:pointer;min-height:34px;list-style:revert}
1028
+ .dsh-memory-si-body{margin-top:8px}
989
1029
  @media(prefers-reduced-motion:reduce){.dsh-memory-switch-thumb{transition:none}.dsh-memory-settings button:not([role="switch"]),.dsh-memory-chat button:not([role="switch"]),.dsh-memory-settings input,.dsh-memory-chat input,.dsh-memory-chat textarea,.dsh-memory-chat select{transition:none}}
990
1030
  `;
991
1031
  function apply(ctx) {
@@ -1005,6 +1045,7 @@ function apply(ctx) {
1005
1045
  label: "记忆"
1006
1046
  }, (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MemorySettings, {
1007
1047
  client,
1048
+ host: ctx,
1008
1049
  props
1009
1050
  }))), "dsh-memory.settings");
1010
1051
  }