@klarkxy/dsh-memory 0.1.3 → 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 小时退避。可在「设置 → 记忆」关闭自动整理,或点击「立即整理」手动运行完整流程。关闭插件会取消进行中的整理和注入,已存数据保留。自我改进启用时,教训与 Skill 草稿也在本页查看、撤回和导出。
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,15 +407,15 @@ function MemorySettingsPanel({ client, sessionId, locale }) {
401
407
  }),
402
408
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("article", {
403
409
  className: "dsh-memory-card",
404
- 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, "闲时梦境", "Idle Dream") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
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", {
405
411
  className: "dsh-memory-meta",
406
- children: t(locale, "闲时自动整理记忆(每天至多一次,自动生效)。", "Auto-organizes memory while idle (at most once a day, applies automatically).")
412
+ children: t(locale, "从原始用户消息记录用语与近期状态,闲时整理已有语境。行动方法由自我改进负责。", "Records vocabulary and recent activity from original user messages, then consolidates context while idle. Self Improve owns methods.")
407
413
  })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
408
414
  type: "button",
409
415
  role: "switch",
410
416
  className: `dsh-memory-switch${draft.dreamIdleEnabled ? " is-on" : ""}`,
411
417
  "aria-checked": draft.dreamIdleEnabled,
412
- "aria-label": draft.dreamIdleEnabled ? t(locale, "关闭闲时整理", "Disable idle Dream") : t(locale, "启用闲时整理", "Enable idle Dream"),
418
+ "aria-label": draft.dreamIdleEnabled ? t(locale, "关闭 Dream 观察与整理", "Disable Dream observation and consolidation") : t(locale, "启用 Dream 观察与整理", "Enable Dream observation and consolidation"),
413
419
  disabled: busy,
414
420
  onClick: () => void action(async () => {
415
421
  await rpc("settings.update", {
@@ -691,6 +697,14 @@ function MemoryChatPanel({ client, sessionId, locale }) {
691
697
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
692
698
  value: "decision",
693
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)
694
708
  })
695
709
  ]
696
710
  })] }),
@@ -789,6 +803,26 @@ function MemoryRow(props) {
789
803
  scope
790
804
  ]
791
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
+ }),
792
826
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: record.content }),
793
827
  record.evidence.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
794
828
  className: "dsh-memory-meta",
@@ -879,7 +913,7 @@ function DreamPanel(props) {
879
913
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h4", { children: t(locale, "梦境整理", "Dream") }),
880
914
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
881
915
  className: "dsh-memory-meta",
882
- 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.")
883
917
  }),
884
918
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
885
919
  className: "dsh-memory-row-actions",
@@ -1 +1 @@
1
- {"version":3,"file":"client.inner.cjs","names":["useSyncExternalStore","useCallback","useRef","captured","useRef","useState","useId"],"sources":["../../dsh-ai-services/src/client-utils.ts","../src/contracts.ts","../src/view-lifetime.ts","../src/client.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useSyncExternalStore } from 'react'\n\nexport interface NativeSurfaceClient {\n sessions: {\n binding?(sessionId: string): { eventSource: { subscribe(listener: () => void): () => void } } | undefined\n }\n uiWorkspace: { current?: { getSnapshot(): { sessionId: string } | undefined; subscribe(listener: () => void): () => void } }\n uiSession: { adapter: { current: { getSnapshot(): { key?: string }; subscribe(listener: () => void): () => void } } }\n locale: { getSnapshot(): { active: string }; subscribe(listener: () => void): () => void }\n connection?: { generation?: { subscribe(listener: () => void): () => void } }\n}\n\n/** The Editor retains its manuscript session separately; native DSH exposes the main-view binding. */\nexport function selectedSessionId(client: Pick<NativeSurfaceClient, 'uiWorkspace' | 'uiSession'>): string {\n return client.uiWorkspace.current\n ? client.uiWorkspace.current.getSnapshot()?.sessionId ?? ''\n : client.uiSession.adapter.current.getSnapshot().key ?? ''\n}\n\n/** Owner props win; native settings only supplies close, so resolve its selected session. */\nexport function useNativeSeat(client: NativeSurfaceClient, props: unknown) {\n const current = useSyncExternalStore(\n useCallback((fn: () => void) => (client.uiWorkspace.current ?? client.uiSession.adapter.current).subscribe(fn), [client]),\n useCallback(() => selectedSessionId(client), [client]),\n () => '',\n )\n const language = useSyncExternalStore(\n useCallback((fn: () => void) => client.locale.subscribe(fn), [client]),\n useCallback(() => client.locale.getSnapshot().active, [client]),\n () => 'en',\n )\n const row = props && typeof props === 'object' ? props as Record<string, unknown> : {}\n const owner = row.owner && typeof row.owner === 'object' ? row.owner as Record<string, unknown> : {}\n const sessionId = typeof row.sessionId === 'string' ? row.sessionId\n : typeof owner.sessionId === 'string' ? owner.sessionId : current\n const requestedLocale = row.locale ?? owner.locale ?? language\n return { sessionId, locale: (String(requestedLocale).startsWith('zh') ? 'zh' : 'en') as 'zh' | 'en',\n hidden: row.hidden === true || owner.hidden === true }\n}\n\n/** Refresh on native log boundaries/reconnect/focus. Read-only settling is bounded to an observed job. */\nexport function useFeatureRefresh(\n client: NativeSurfaceClient, sessionId: string, refresh: () => void,\n working = false, enabled = true,\n): void {\n const refreshRef = useRef(refresh)\n refreshRef.current = refresh\n useEffect(() => {\n if (!enabled) return\n let timer: ReturnType<typeof setTimeout> | undefined\n const queue = () => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') return\n clearTimeout(timer)\n timer = setTimeout(() => refreshRef.current(), 150)\n }\n const source = sessionId ? client.sessions.binding?.(sessionId)?.eventSource : undefined\n const stopEvents = source?.subscribe(queue)\n const stopConnection = client.connection?.generation?.subscribe(queue)\n const visibility = () => { if (document.visibilityState === 'visible') queue() }\n window.addEventListener('focus', queue)\n document.addEventListener('visibilitychange', visibility)\n // Details are collapsed by default; opening an existing panel must get current state.\n document.addEventListener('toggle', queue, true)\n return () => {\n clearTimeout(timer)\n stopEvents?.(); stopConnection?.()\n window.removeEventListener('focus', queue)\n document.removeEventListener('visibilitychange', visibility)\n document.removeEventListener('toggle', queue, true)\n }\n }, [client, sessionId, enabled])\n useEffect(() => {\n if (!enabled || !working) return\n let delay = 250\n const until = Date.now() + 300_000\n let timer: ReturnType<typeof setTimeout>\n const tick = () => {\n if (Date.now() >= until) return\n if (document.visibilityState !== 'hidden') refreshRef.current()\n delay = Math.min(delay * 2, 2000)\n timer = setTimeout(tick, delay)\n }\n timer = setTimeout(tick, delay)\n return () => clearTimeout(timer)\n }, [client, sessionId, working, enabled])\n}\n","/** Browser-safe contracts. MemoryRecord / MemoryService match frozen @klarkxy/dsh-ai-services. */\nimport {\n CHAT_EVENTS_SLOT as FROZEN_CHAT_EVENTS_SLOT,\n projectIdFromCwd as frozenProjectIdFromCwd,\n} from '@klarkxy/dsh-ai-services/contracts'\nimport type {\n AiFeatureScope,\n AiServices,\n AuxiliaryRequest,\n AuxiliaryResult,\n EvidenceRef,\n KnowledgeKind,\n KnowledgeScope,\n MemoryQuery,\n MemoryRecord,\n MemoryService,\n NewMemoryRecord,\n PurposeSpec,\n ProducerMessageSource,\n RpcResult,\n UsageReceipt,\n} from '@klarkxy/dsh-ai-services/contracts'\n\nexport type {\n AiFeatureScope,\n AiServices,\n AuxiliaryRequest,\n AuxiliaryResult,\n EvidenceRef,\n KnowledgeKind,\n KnowledgeScope,\n MemoryQuery,\n MemoryRecord,\n MemoryService,\n NewMemoryRecord,\n PurposeSpec,\n ProducerMessageSource,\n RpcResult,\n UsageReceipt,\n}\n\n/** Frozen shared chat-events seat. Must stay equal to @klarkxy/dsh-ai-services CHAT_EVENTS_SLOT. */\nexport const CHAT_EVENTS_SLOT = FROZEN_CHAT_EVENTS_SLOT\n/** Shared untruncated cwd identity. Drive roots (`/` / `C:/`) stay intact. */\nexport const projectIdFromCwd = frozenProjectIdFromCwd\nexport const MEMORY_PLUGIN = '@klarkxy/dsh-memory'\nexport const MEMORY_SOURCE_KIND = 'plugin:@klarkxy/dsh-memory' as const\nexport const MEMORY_RPC_CHANNEL = '/dsh-memory'\nexport const MEMORY_DREAM_PURPOSE = 'memory.dream'\nexport const MEMORY_INJECTION_SECTION = 'dsh-memory:recall'\n/** Frozen pluginName now accepts scoped ids. */\nexport const MEMORY_ACTIVATE_ID = MEMORY_PLUGIN\n\nexport const DEFAULT_IDLE_MS = 15 * 60 * 1000\nexport const MIN_IDLE_MS = 60_000\nexport const MAX_IDLE_MS = 180 * 60_000\nexport const DREAM_MIN_INTERVAL_MS = 24 * 60 * 60 * 1000\nexport const DREAM_MIN_MATERIAL = 3\nexport const MIN_RECALL_RECORDS = 1\nexport const MAX_RECALL_RECORDS = 5\nexport const MAX_RECALL_TOKENS = 800\nexport const MAX_PROJECT_ID_CHARS = 32_768\nexport const INJECT_KINDS: readonly KnowledgeKind[] = ['preference', 'project-fact', 'decision']\nexport const RECALL_EXCLUDED_STATUSES: readonly MemoryRecord['status'][] = [\n 'candidate', 'rejected', 'revoked', 'deleted', 'superseded',\n]\n\nexport interface MemorySettings {\n revision: number\n injectEnabled: boolean\n dreamIdleEnabled: boolean\n idleMs: number\n}\n\nexport const defaultSettings = (): MemorySettings => ({\n revision: 0,\n injectEnabled: true,\n dreamIdleEnabled: true,\n idleMs: DEFAULT_IDLE_MS,\n})\n\nexport type DreamPlanStatus = 'preview' | 'applied' | 'cancelled' | 'stale' | 'failed' | 'noop'\n\nexport interface DreamSnapshotEntry {\n id: string\n revision: number\n status: MemoryRecord['status']\n scope: KnowledgeScope\n expiresAt?: number\n}\n\nexport interface DreamProposal {\n title: string\n content: string\n kind: Exclude<KnowledgeKind, 'lesson'>\n tags: string[]\n exceptions: string[]\n evidence: EvidenceRef[]\n sourceIds: string[]\n scope: KnowledgeScope\n}\n\nexport interface DreamPlan {\n id: string\n revision: number\n sessionId: string\n projectId?: string\n status: DreamPlanStatus\n sourceVersion: string\n snapshot: DreamSnapshotEntry[]\n proposals: DreamProposal[]\n generation: number\n createdAt: number\n updatedAt: number\n error?: string\n}\n\nexport interface MemoryTombstone {\n id: string\n deletedAt: number\n lastRevision: number\n}\n\nexport interface MemoryPersistedState {\n settings: MemorySettings\n records: MemoryRecord[]\n tombstones: MemoryTombstone[]\n dreams: DreamPlan[]\n lastAttemptAt?: number\n}\n\nexport interface MemoryStatus {\n runningDreams?: string[]\n settings: MemorySettings\n records: MemoryRecord[]\n dreams: DreamPlan[]\n projectId?: string\n storageFailed: boolean\n aiAvailable: boolean\n}\n\n/** Matches frozen MemoryService optional mutation identity/lifetime guards. */\nexport interface MemoryMutationOptions { signal?: AbortSignal; isCurrent?: () => boolean }\n\nexport interface PreStepEnter {\n kind: 'enter'\n messages: unknown[]\n startsRequestSeries?: true\n}\nexport type PreStepDecision = { kind: 'reject' } | PreStepEnter\n\nexport interface InjectedMemoryMessage {\n content: Array<{ type: 'text'; text: string }>\n source: ProducerMessageSource & {\n kind: typeof MEMORY_SOURCE_KIND\n plugin: typeof MEMORY_PLUGIN\n form: 'snapshot'\n sections: Array<{ name: string; text: string }>\n }\n}\n\nexport function fail<T = never>(code: string, message: string): RpcResult<T> {\n return { ok: false, error: { code, message } }\n}\n\nexport function ok<T>(value: T): RpcResult<T> {\n return { ok: true, value }\n}\n\nexport function parseSessionId(payload: unknown): string | undefined {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return undefined\n const sessionId = (payload as { sessionId?: unknown }).sessionId\n return typeof sessionId === 'string' && sessionId.length > 0 && sessionId.length <= 200 ? sessionId : undefined\n}\n\nexport function sessionCwd(session: unknown): string | undefined {\n if (!session || typeof session !== 'object') return undefined\n const row = session as { meta?: { cwd?: unknown }; header?: { cwd?: unknown } }\n const cwd = row.meta?.cwd ?? row.header?.cwd\n return typeof cwd === 'string' ? cwd : undefined\n}\n\nexport function scopesEqual(left: KnowledgeScope, right: KnowledgeScope): boolean {\n if (left.kind === 'global') return right.kind === 'global'\n return right.kind === 'project' && left.projectId === right.projectId\n}\n\nexport function scopeKey(scope: KnowledgeScope): string {\n return scope.kind === 'global' ? 'global' : `project:${scope.projectId}`\n}\n\nexport function cloneRecord(record: MemoryRecord): MemoryRecord {\n return structuredClone(record)\n}\n","import type { MemoryStatus, RpcResult } from './contracts.ts'\n\nexport type MemoryGenerationGate = {\n current: () => number\n next: () => number\n isCurrent: (token: number) => boolean\n}\n\nexport function createMemoryGeneration(start = 0): MemoryGenerationGate {\n let current = start\n return {\n current: () => current,\n next: () => {\n current += 1\n return current\n },\n isCurrent: token => token === current,\n }\n}\n\nexport function memoryRequestStillCurrent(input: {\n token: number\n gate: Pick<MemoryGenerationGate, 'isCurrent'>\n signal: AbortSignal\n sessionId: string\n viewSessionId: string\n}): boolean {\n return input.gate.isCurrent(input.token)\n && !input.signal.aborted\n && input.sessionId === input.viewSessionId\n}\n\nexport type MemoryViewRequest = {\n sessionId: string\n token: number\n signal: AbortSignal\n controller: AbortController\n}\n\n/** Capture session, generation token, and abort lifetime before the first await. */\nexport function beginMemoryRequest(\n gate: MemoryGenerationGate,\n sessionId: string,\n previous?: AbortController | null,\n): MemoryViewRequest {\n previous?.abort()\n const controller = new AbortController()\n const captured = sessionId\n const token = gate.next()\n return { sessionId: captured, token, signal: controller.signal, controller }\n}\n\nexport function disposeMemoryRequest(gate: MemoryGenerationGate, controller: AbortController): void {\n controller.abort()\n gate.next()\n}\n\nexport type MemoryRpc = (endpoint: string, payload: unknown, signal?: AbortSignal) => Promise<unknown>\n\nexport function unwrapMemoryResult<T>(result: RpcResult<T>): T {\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n}\n\nexport function shouldSkipMemoryRefresh(input: { busy: boolean; editing: boolean }): boolean {\n return input.busy || input.editing\n}\n\nexport async function loadMemoryStatus(input: {\n rpc: MemoryRpc\n sessionId: string\n token: number\n gate: Pick<MemoryGenerationGate, 'isCurrent'>\n signal: AbortSignal\n viewSessionId: () => string\n}): Promise<MemoryStatus | undefined> {\n const captured = input.sessionId\n const raw = await input.rpc('status', captured ? { sessionId: captured } : {}, input.signal)\n if (!memoryRequestStillCurrent({\n token: input.token, gate: input.gate, signal: input.signal, sessionId: captured, viewSessionId: input.viewSessionId(),\n })) return undefined\n return unwrapMemoryResult(raw as RpcResult<MemoryStatus>)\n}\n\n/** Read-only status peek; uses an independent signal so it cannot abort an in-flight write. */\nexport async function peekMemoryStatus(input: {\n rpc: MemoryRpc\n sessionId: string\n token: number\n gate: Pick<MemoryGenerationGate, 'isCurrent'>\n viewSessionId: () => string\n busy: () => boolean\n editing?: () => boolean\n}): Promise<MemoryStatus | undefined> {\n if (shouldSkipMemoryRefresh({ busy: input.busy(), editing: input.editing?.() === true })) return undefined\n const token = input.token\n if (!input.gate.isCurrent(token) || token === 0) return undefined\n const next = await loadMemoryStatus({\n rpc: input.rpc,\n sessionId: input.sessionId,\n token,\n gate: input.gate,\n signal: new AbortController().signal,\n viewSessionId: input.viewSessionId,\n })\n if (!next) return undefined\n if (shouldSkipMemoryRefresh({ busy: input.busy(), editing: input.editing?.() === true })) return undefined\n return next\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport { useFeatureRefresh, useNativeSeat, type NativeSurfaceClient } from '@klarkxy/dsh-ai-services/client-utils'\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport {\n MEMORY_RPC_CHANNEL,\n type DreamPlan, type MemoryRecord, type MemorySettings, type MemoryStatus, type RpcResult,\n} from './contracts.ts'\nimport {\n beginMemoryRequest, createMemoryGeneration, disposeMemoryRequest, loadMemoryStatus, memoryRequestStillCurrent,\n peekMemoryStatus, shouldSkipMemoryRefresh, unwrapMemoryResult,\n} from './view-lifetime.ts'\n\nexport const name = 'dsh-memory-client'\nexport const inject = ['slots', 'connection', 'sessions', 'locale', 'uiWorkspace', 'uiSession'] as const\nexport {\n beginMemoryRequest, createMemoryGeneration, disposeMemoryRequest, loadMemoryStatus, memoryRequestStillCurrent,\n peekMemoryStatus, shouldSkipMemoryRefresh, unwrapMemoryResult,\n} from './view-lifetime.ts'\n\ntype Client = NativeSurfaceClient & {\n connection: {\n rpc: { call(channel: string, endpoint: string, payload: unknown, signal?: AbortSignal): Promise<unknown> }\n generation?: { subscribe(listener: () => void): () => void }\n }\n slots: {\n inject(key: string, callback: () => unknown): () => void\n register(spec: { name: string; id: string; label: string; order: number }, render: unknown): () => void\n }\n}\n\nexport type Locale = 'zh' | 'en'\nexport type SeatProps = { sessionId: string; locale: Locale; hidden: boolean }\n\nexport function parseSeatProps(props: unknown): SeatProps {\n const row = props && typeof props === 'object' ? props as Record<string, unknown> : {}\n const nested = row.owner && typeof row.owner === 'object' ? row.owner as Record<string, unknown> : undefined\n const sessionId = typeof row.sessionId === 'string' && row.sessionId\n ? row.sessionId\n : typeof nested?.sessionId === 'string' ? nested.sessionId : ''\n const locale = row.locale === 'en' || nested?.locale === 'en' ? 'en' : 'zh'\n const hidden = row.hidden === true || nested?.hidden === true\n return { sessionId, locale, hidden }\n}\n\nexport function memoryPanelKey(sessionId: string, locale: Locale): string {\n return `${sessionId}:${locale}`\n}\n\nexport function chatSummaryTitle(locale: Locale): string {\n return locale === 'en' ? 'Memory' : '记忆'\n}\n\nexport function candidateAvailabilityLabel(count: number, locale: Locale): string {\n if (count > 0) return locale === 'en' ? `${count} to review` : `${count} 条候选`\n return locale === 'en' ? 'No candidates' : '暂无候选'\n}\n\nexport function kindLabel(kind: MemoryRecord['kind'], locale: Locale): string {\n if (locale === 'en') {\n return kind === 'preference' ? 'Preference' : kind === 'project-fact' ? 'Project fact' : kind === 'decision' ? 'Decision' : 'Lesson'\n }\n return kind === 'preference' ? '偏好' : kind === 'project-fact' ? '项目事实' : kind === 'decision' ? '决策' : '教训'\n}\n\nexport function statusLabel(status: MemoryRecord['status'], locale: Locale): string {\n const zh: Record<MemoryRecord['status'], string> = {\n candidate: '候选', active: '已生效', rejected: '已拒绝', superseded: '已替代', revoked: '已撤销', deleted: '已删除',\n }\n const en: Record<MemoryRecord['status'], string> = {\n candidate: 'Candidate', active: 'Active', rejected: 'Rejected', superseded: 'Superseded', revoked: 'Revoked', deleted: 'Deleted',\n }\n return locale === 'en' ? en[status] : zh[status]\n}\n\nexport function canAccept(record: MemoryRecord): boolean { return record.status === 'candidate' }\nexport function canReject(record: MemoryRecord): boolean { return record.status === 'candidate' }\nexport function canRevoke(record: MemoryRecord): boolean { return record.status === 'active' }\n\nfunction t(locale: Locale, zh: string, en: string): string {\n return locale === 'en' ? en : zh\n}\n\nexport function MemoryChatShell(props: { locale: Locale; candidateCount: number; children?: ReactNode }) {\n return <details className=\"dsh-memory-chat\" data-testid=\"memory-chat\">\n <summary>\n <span>{chatSummaryTitle(props.locale)}</span>\n <span className=\"dsh-memory-meta\">{candidateAvailabilityLabel(props.candidateCount, props.locale)}</span>\n </summary>\n <div className=\"dsh-memory-chat-body\">{props.children}</div>\n </details>\n}\n\nfunction MemorySettingsPanel({ client, sessionId, locale }: { client: Client; sessionId: string; locale: Locale }) {\n const gate = useRef(createMemoryGeneration())\n const sessionRef = useRef(sessionId)\n const workRef = useRef<AbortController | null>(null)\n sessionRef.current = sessionId\n const [status, setStatus] = useState<MemoryStatus>()\n const [draft, setDraft] = useState<MemorySettings>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [note, setNote] = useState('')\n const busyRef = useRef(false)\n const settingsDirty = useRef(false)\n busyRef.current = busy\n\n async function rpc(endpoint: string, payload: unknown, signal?: AbortSignal): Promise<unknown> {\n const result = await client.connection.rpc.call(MEMORY_RPC_CHANNEL, endpoint, payload, signal)\n unwrapMemoryResult(result as RpcResult<unknown>)\n return result\n }\n\n useEffect(() => {\n const request = beginMemoryRequest(gate.current, sessionId, workRef.current)\n workRef.current = request.controller\n setError('')\n setNote('')\n void loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n }).then(next => {\n if (!next) return\n setStatus(next)\n setDraft(next.settings)\n settingsDirty.current = false\n }).catch(cause => {\n if (!memoryRequestStillCurrent({\n token: request.token, gate: gate.current, signal: request.signal,\n sessionId: request.sessionId, viewSessionId: sessionRef.current,\n })) return\n setError(cause instanceof Error ? cause.message : t(locale, '无法读取记忆设置。', 'Unable to load memory settings.'))\n })\n return () => disposeMemoryRequest(gate.current, workRef.current ?? request.controller)\n }, [client, sessionId, locale])\n\n useFeatureRefresh(client, sessionId, () => {\n void peekMemoryStatus({\n rpc, sessionId: sessionRef.current, token: gate.current.current(), gate: gate.current,\n viewSessionId: () => sessionRef.current, busy: () => busyRef.current, editing: () => settingsDirty.current,\n }).then(next => {\n if (next) { setStatus(next); setDraft(next.settings) }\n }).catch(() => {})\n }, false, true)\n\n async function action(run: (sessionId: string) => Promise<void>) {\n const request = beginMemoryRequest(gate.current, sessionId, workRef.current)\n workRef.current = request.controller\n setBusy(true); setNote(''); setError('')\n const still = () => memoryRequestStillCurrent({\n token: request.token, gate: gate.current, signal: request.signal,\n sessionId: request.sessionId, viewSessionId: sessionRef.current,\n })\n try {\n await run(request.sessionId)\n const next = await loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n })\n if (!next || !still()) return\n setStatus(next)\n setDraft(next.settings)\n settingsDirty.current = false\n setNote(t(locale, '已保存。', 'Saved.'))\n } catch (cause) {\n if (!still()) return\n setError(cause instanceof Error ? cause.message : t(locale, '操作失败。', 'Failed.'))\n const next = await loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n }).catch(() => undefined)\n if (next && still()) {\n setStatus(next)\n setDraft(next.settings)\n settingsDirty.current = false\n }\n } finally {\n if (still()) setBusy(false)\n }\n }\n\n if (!status || !draft) {\n return <section className=\"dsh-memory-settings\">\n <p role=\"status\">{error || t(locale, '正在读取设置…', 'Loading settings…')}</p>\n <button type=\"button\" onClick={() => void action(async () => {})}>{t(locale, '重新连接', 'Reconnect')}</button>\n </section>\n }\n\n return <section className=\"dsh-memory-settings\" data-testid=\"memory-settings\">\n {error && <p role=\"alert\" className=\"dsh-memory-error\">{error}</p>}\n {note && <p role=\"status\">{note}</p>}\n {status.storageFailed && <p role=\"alert\">{t(locale, '保存失败,已保留原内容。', 'Save failed; previous content was kept.')}</p>}\n {!status.aiAvailable && <p className=\"dsh-memory-meta\">{t(locale, '梦境整理需要单独加载 @klarkxy/dsh-ai-services。', 'Dream needs @klarkxy/dsh-ai-services loaded separately.')}</p>}\n <article className=\"dsh-memory-card\">\n <header>\n <div>\n <h3>{t(locale, '写入提示', 'Prompt injection')}</h3>\n <p className=\"dsh-memory-meta\">{t(locale, '关闭后不再注入记忆;存储保留。', 'Turns off injection; stored records remain.')}</p>\n </div>\n <button type=\"button\" role=\"switch\" className={`dsh-memory-switch${draft.injectEnabled ? ' is-on' : ''}`}\n aria-checked={draft.injectEnabled} aria-label={draft.injectEnabled ? t(locale, '关闭记忆注入', 'Disable memory injection') : t(locale, '启用记忆注入', 'Enable memory injection')}\n disabled={busy}\n onClick={() => void action(async () => {\n await rpc('settings.update', {\n expectedRevision: draft.revision,\n settings: { ...editable(draft), injectEnabled: !draft.injectEnabled },\n })\n })}>\n <span className=\"dsh-memory-switch-thumb\" aria-hidden=\"true\" />\n </button>\n </header>\n </article>\n <article className=\"dsh-memory-card\">\n <header>\n <div>\n <h3>{t(locale, '闲时梦境', 'Idle Dream')}</h3>\n <p className=\"dsh-memory-meta\">{t(locale, '闲时自动整理记忆(每天至多一次,自动生效)。', 'Auto-organizes memory while idle (at most once a day, applies automatically).')}</p>\n </div>\n <button type=\"button\" role=\"switch\" className={`dsh-memory-switch${draft.dreamIdleEnabled ? ' is-on' : ''}`}\n aria-checked={draft.dreamIdleEnabled} aria-label={draft.dreamIdleEnabled ? t(locale, '关闭闲时整理', 'Disable idle Dream') : t(locale, '启用闲时整理', 'Enable idle Dream')}\n disabled={busy}\n onClick={() => void action(async () => {\n await rpc('settings.update', {\n expectedRevision: draft.revision,\n settings: { ...editable(draft), dreamIdleEnabled: !draft.dreamIdleEnabled },\n })\n })}>\n <span className=\"dsh-memory-switch-thumb\" aria-hidden=\"true\" />\n </button>\n </header>\n <p className=\"dsh-memory-meta\">{t(locale, '闲时整理在会话空闲约 15 分钟后尝试。', 'Idle organization waits about 15 minutes of inactivity.')}</p>\n </article>\n </section>\n}\n\nfunction editable(settings: MemorySettings): Omit<MemorySettings, 'revision'> {\n const { revision: _revision, ...rest } = settings\n return rest\n}\n\nfunction MemoryChatPanel({ client, sessionId, locale }: { client: Client; sessionId: string; locale: Locale }) {\n const formId = useId()\n const gate = useRef(createMemoryGeneration())\n const sessionRef = useRef(sessionId)\n const workRef = useRef<AbortController | null>(null)\n sessionRef.current = sessionId\n const [status, setStatus] = useState<MemoryStatus>()\n const [query, setQuery] = useState('')\n const [title, setTitle] = useState('')\n const [content, setContent] = useState('')\n const [kind, setKind] = useState<MemoryRecord['kind']>('preference')\n const [global, setGlobal] = useState(false)\n const [evidence, setEvidence] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [note, setNote] = useState('')\n const [editing, setEditing] = useState(false)\n const busyRef = useRef(false)\n const editingRef = useRef(false)\n busyRef.current = busy\n editingRef.current = editing\n\n async function rpc(endpoint: string, payload: unknown, signal?: AbortSignal): Promise<unknown> {\n const result = await client.connection.rpc.call(MEMORY_RPC_CHANNEL, endpoint, payload, signal)\n unwrapMemoryResult(result as RpcResult<unknown>)\n return result\n }\n\n useEffect(() => {\n const request = beginMemoryRequest(gate.current, sessionId, workRef.current)\n workRef.current = request.controller\n setError('')\n setNote('')\n void loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n }).then(next => {\n if (!next) return\n setStatus(next)\n }).catch(cause => {\n if (!memoryRequestStillCurrent({\n token: request.token, gate: gate.current, signal: request.signal,\n sessionId: request.sessionId, viewSessionId: sessionRef.current,\n })) return\n setError(cause instanceof Error ? cause.message : t(locale, '无法读取记忆。', 'Unable to load memory.'))\n })\n return () => disposeMemoryRequest(gate.current, workRef.current ?? request.controller)\n }, [client, sessionId, locale])\n\n useFeatureRefresh(client, sessionId, () => {\n void peekMemoryStatus({\n rpc, sessionId: sessionRef.current, token: gate.current.current(), gate: gate.current,\n viewSessionId: () => sessionRef.current, busy: () => busyRef.current, editing: () => editingRef.current,\n }).then(next => { if (next) setStatus(next) }).catch(() => {})\n }, Boolean(status?.runningDreams?.length), Boolean(sessionId))\n\n async function action(run: (sessionId: string) => Promise<void>) {\n const request = beginMemoryRequest(gate.current, sessionId, workRef.current)\n workRef.current = request.controller\n setBusy(true); setNote(''); setError('')\n const still = () => memoryRequestStillCurrent({\n token: request.token, gate: gate.current, signal: request.signal,\n sessionId: request.sessionId, viewSessionId: sessionRef.current,\n })\n try {\n await run(request.sessionId)\n const next = await loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n })\n if (!next || !still()) return\n setStatus(next)\n } catch (cause) {\n if (!still()) return\n setError(cause instanceof Error ? cause.message : t(locale, '操作失败。', 'Failed.'))\n const next = await loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n }).catch(() => undefined)\n if (next && still()) setStatus(next)\n } finally {\n if (still()) setBusy(false)\n }\n }\n\n const records = (status?.records ?? []).filter(record => {\n if (!query.trim()) return true\n return `${record.title}\\n${record.content}`.toLowerCase().includes(query.trim().toLowerCase())\n })\n const dreams = (status?.dreams ?? []).slice().sort((a, b) => b.updatedAt - a.updatedAt).slice(0, 8)\n const candidateCount = (status?.records ?? []).filter(record => record.status === 'candidate').length\n\n const body = <>\n <header>\n <p className=\"dsh-memory-meta\">{status?.projectId\n ? t(locale, '当前项目', 'This project')\n : t(locale, '无项目目录;全局写入需勾选。', 'No project path; global write must be explicit.')}</p>\n </header>\n {error && <p role=\"alert\" className=\"dsh-memory-error\">{error}</p>}\n {note && <p role=\"status\">{note}</p>}\n <label className=\"dsh-memory-search\">{t(locale, '搜索', 'Search')}\n <input value={query} onChange={event => setQuery(event.target.value)} disabled={busy}\n aria-label={t(locale, '搜索记忆', 'Search memory')} />\n </label>\n <ul className=\"dsh-memory-list\">\n {records.length === 0 ? <li className=\"dsh-memory-meta\">{query.trim() ? t(locale, '没有匹配的条目。', 'No matching records.') : t(locale, '暂无条目。', 'No records.')}</li> : records.map(record => (\n <MemoryRow key={record.id} record={record} locale={locale} busy={busy}\n onEditingChange={setEditing}\n onAccept={() => void action(captured => rpc('records.accept', { sessionId: captured, id: record.id, expectedRevision: record.revision }).then(() => { if (sessionRef.current === captured) setNote(t(locale, '已采纳。', 'Accepted.')) }))}\n onReject={() => void action(captured => rpc('records.reject', { sessionId: captured, id: record.id, expectedRevision: record.revision }).then(() => { if (sessionRef.current === captured) setNote(t(locale, '已拒绝。', 'Rejected.')) }))}\n onRevoke={() => void action(captured => rpc('records.revoke', { sessionId: captured, id: record.id, expectedRevision: record.revision }).then(() => { if (sessionRef.current === captured) setNote(t(locale, '已撤销。', 'Revoked.')) }))}\n onDelete={() => void action(captured => rpc('records.remove', { sessionId: captured, id: record.id, expectedRevision: record.revision }).then(() => { if (sessionRef.current === captured) setNote(t(locale, '已删除。', 'Deleted.')) }))}\n onSave={(nextTitle, nextContent) => void action(captured => rpc('records.update', { sessionId: captured, id: record.id, expectedRevision: record.revision, title: nextTitle, content: nextContent }).then(() => { if (sessionRef.current === captured) setNote(t(locale, '已更新。', 'Updated.')) }))}\n />\n ))}\n </ul>\n <form className=\"dsh-memory-add\" onSubmit={event => {\n event.preventDefault()\n void action(async captured => {\n await rpc('records.create', {\n sessionId: captured, title, content, kind, global,\n evidence: evidence.trim() ? [{ sessionId: captured, seq: 0, kind: 'manual', excerpt: evidence.trim().slice(0, 400) }] : [],\n })\n if (sessionRef.current !== captured) return\n setTitle(''); setContent(''); setEvidence(''); setNote(t(locale, '已添加。', 'Added.'))\n })\n }}>\n <h4>{t(locale, '手动添加', 'Add')}</h4>\n <label htmlFor={formId + '-title'}>{t(locale, '标题', 'Title')}\n <input id={formId + '-title'} value={title} required maxLength={160} disabled={busy}\n onChange={event => setTitle(event.target.value)} />\n </label>\n <label htmlFor={formId + '-body'}>{t(locale, '内容', 'Content')}\n <textarea id={formId + '-body'} value={content} required maxLength={4000} disabled={busy} rows={3}\n onChange={event => setContent(event.target.value)} />\n </label>\n <label>{t(locale, '类型', 'Kind')}\n <select value={kind} disabled={busy} onChange={event => setKind(event.target.value as MemoryRecord['kind'])}>\n <option value=\"preference\">{kindLabel('preference', locale)}</option>\n <option value=\"project-fact\">{kindLabel('project-fact', locale)}</option>\n <option value=\"decision\">{kindLabel('decision', locale)}</option>\n </select>\n </label>\n <label htmlFor={formId + '-evidence'}>{t(locale, '依据(可选)', 'Evidence (optional)')}\n <input id={formId + '-evidence'} value={evidence} maxLength={400} disabled={busy}\n onChange={event => setEvidence(event.target.value)} />\n </label>\n <label className=\"dsh-memory-check\">\n <input type=\"checkbox\" checked={global} disabled={busy} onChange={event => setGlobal(event.target.checked)} />\n {t(locale, '写入全局(跨项目)', 'Write as global')}\n </label>\n <button type=\"submit\" disabled={busy}>{t(locale, '添加', 'Add')}</button>\n </form>\n <DreamPanel locale={locale} busy={busy} dreams={dreams} running={Boolean(status?.runningDreams?.length)}\n aiAvailable={status?.aiAvailable === true} action={action} rpc={rpc} />\n </>\n\n return <MemoryChatShell locale={locale} candidateCount={candidateCount}>{body}</MemoryChatShell>\n}\n\nfunction MemoryRow(props: {\n record: MemoryRecord; locale: Locale; busy: boolean\n onEditingChange?: (editing: boolean) => void\n onAccept(): void; onReject(): void; onRevoke(): void; onDelete(): void\n onSave(title: string, content: string): void\n}) {\n const { record, locale } = props\n const [editing, setEditing] = useState(false)\n const [title, setTitle] = useState(record.title)\n const [content, setContent] = useState(record.content)\n const scope = record.scope.kind === 'global' ? t(locale, '全局', 'Global') : t(locale, '项目', 'Project')\n function setRowEditing(next: boolean) {\n setEditing(next)\n props.onEditingChange?.(next)\n }\n if (editing) {\n return <li>\n <label>{t(locale, '标题', 'Title')}\n <input value={title} disabled={props.busy} onChange={event => setTitle(event.target.value)} />\n </label>\n <label>{t(locale, '内容', 'Content')}\n <textarea value={content} disabled={props.busy} rows={3} maxLength={4000} onChange={event => setContent(event.target.value)} />\n </label>\n <div className=\"dsh-memory-row-actions\">\n <button type=\"button\" disabled={props.busy} onClick={() => { props.onSave(title, content); setRowEditing(false) }}>{t(locale, '保存', 'Save')}</button>\n <button type=\"button\" disabled={props.busy} onClick={() => setRowEditing(false)}>{t(locale, '取消', 'Cancel')}</button>\n </div>\n </li>\n }\n return <li>\n <strong>{record.title}</strong>\n <p className=\"dsh-memory-meta\">{kindLabel(record.kind, locale)} · {statusLabel(record.status, locale)} · {scope}</p>\n <p>{record.content}</p>\n {record.evidence.length > 0 && <p className=\"dsh-memory-meta\">{t(locale, '依据', 'Evidence')}:{record.evidence.map(item => item.excerpt ?? `${item.kind}#${item.seq}`).join(';')}</p>}\n <div className=\"dsh-memory-row-actions\">\n {record.status !== 'deleted' && <button type=\"button\" disabled={props.busy} onClick={() => { setTitle(record.title); setContent(record.content); setRowEditing(true) }}>{t(locale, '编辑', 'Edit')}</button>}\n {canAccept(record) && <button type=\"button\" disabled={props.busy} onClick={props.onAccept}>{t(locale, '采纳', 'Accept')}</button>}\n {canReject(record) && <button type=\"button\" disabled={props.busy} onClick={props.onReject}>{t(locale, '拒绝', 'Reject')}</button>}\n {canRevoke(record) && <button type=\"button\" disabled={props.busy} onClick={props.onRevoke}>{t(locale, '撤销', 'Revoke')}</button>}\n <ConfirmButton disabled={props.busy} label={t(locale, '删除', 'Delete')} confirmLabel={t(locale, '确认删除?', 'Confirm delete?')} onConfirm={props.onDelete} />\n </div>\n </li>\n}\n\nfunction ConfirmButton(props: { label: string; confirmLabel: string; disabled?: boolean; onConfirm(): void }) {\n const [armed, setArmed] = useState(false)\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined)\n useEffect(() => () => clearTimeout(timer.current), [])\n function disarm() {\n clearTimeout(timer.current)\n setArmed(false)\n }\n return <button type=\"button\" className=\"dsh-memory-danger\" disabled={props.disabled}\n onClick={() => {\n if (!armed) {\n setArmed(true)\n timer.current = setTimeout(() => setArmed(false), 3000)\n return\n }\n disarm()\n props.onConfirm()\n }}\n onBlur={disarm}>{armed ? props.confirmLabel : props.label}</button>\n}\n\nexport function dreamStatusLabel(plan: DreamPlan, locale: Locale): string {\n if (plan.status === 'applied') return t(locale, '已应用', 'Applied')\n if (plan.status === 'noop') return t(locale, '无变化', 'No change')\n if (plan.status === 'failed' || plan.status === 'stale') return t(locale, '失败', 'Failed')\n if (plan.status === 'cancelled') return t(locale, '已取消', 'Cancelled')\n return plan.proposals.length ? t(locale, '未应用', 'Not applied') : t(locale, '无变化', 'No change')\n}\n\nfunction DreamPanel(props: {\n running: boolean\n locale: Locale; busy: boolean; dreams: DreamPlan[]; aiAvailable: boolean\n action(run: (sessionId: string) => Promise<void>): Promise<void>\n rpc(endpoint: string, payload: unknown, signal?: AbortSignal): Promise<unknown>\n}) {\n const locale = props.locale\n return <article className=\"dsh-memory-dream\">\n <h4>{t(locale, '梦境整理', 'Dream')}</h4>\n <p className=\"dsh-memory-meta\">{t(locale, '闲置且新材料足够时每天至多自动整理一次,结果自动生效。', 'Runs at most once a day when idle with enough new material; results apply automatically.')}</p>\n <div className=\"dsh-memory-row-actions\">\n <button type=\"button\" disabled={props.busy || props.running || !props.aiAvailable} onClick={() => void props.action(async captured => {\n await props.rpc('dream.run', { sessionId: captured })\n })}>{t(locale, '立即整理', 'Organize now')}</button>\n {props.running && <span className=\"dsh-memory-meta\">{t(locale, '整理中…', 'Organizing…')}</span>}\n </div>\n {props.dreams.length > 0 && <ul>\n {props.dreams.map(plan => (\n <li key={plan.id}>\n <strong>{dreamStatusLabel(plan, locale)}</strong>{' '}\n <span className=\"dsh-memory-meta\">{new Date(plan.createdAt).toLocaleString(locale === 'zh' ? 'zh-CN' : 'en-US')}</span>\n {plan.proposals.length > 0 && <p className=\"dsh-memory-meta\">{plan.proposals.map(proposal => proposal.title).join('、')}</p>}\n {plan.error && <p className=\"dsh-memory-error\">{plan.error}</p>}\n </li>\n ))}\n </ul>}\n </article>\n}\n\nfunction readSelfImprovementReview(host: unknown): { render(props: unknown): ReactNode } | undefined {\n if (!host || typeof host !== 'object') return undefined\n const context = host as { get?: (name: string) => unknown }\n if (typeof context.get !== 'function') return undefined\n let row: unknown\n try { row = context.get('dshSelfImprovementReview') } catch { return undefined }\n if (!row || typeof row !== 'object') return undefined\n const render = (row as { render?: unknown }).render\n if (typeof render !== 'function') return undefined\n return { render: render as (props: unknown) => ReactNode }\n}\n\nexport function MemorySettings({ client, host, props }: { client: Client; host?: unknown; props: unknown }) {\n const seat = useNativeSeat(client, props)\n const review = readSelfImprovementReview(host)\n return <div className=\"dsh-memory-settings-root\" data-testid=\"memory-settings-root\">\n <MemorySettingsPanel key={`settings:${memoryPanelKey(seat.sessionId, seat.locale)}`} client={client} sessionId={seat.sessionId} locale={seat.locale} />\n {review && seat.sessionId && !seat.hidden\n ? <details className=\"dsh-memory-si\" data-testid=\"self-improvement-entry\">\n <summary>{t(seat.locale, '自我改进', 'Self-improvement')}</summary>\n <div className=\"dsh-memory-si-body\">{review.render({ sessionId: seat.sessionId, locale: seat.locale })}</div>\n </details>\n : null}\n {seat.sessionId && !seat.hidden\n ? <MemoryChatPanel key={`manage:${memoryPanelKey(seat.sessionId, seat.locale)}`} client={client} sessionId={seat.sessionId} locale={seat.locale} />\n : <p className=\"dsh-memory-meta\">{t(seat.locale, '选择一个会话后可以管理该会话的记忆。', 'Select a session to manage its memory.')}</p>}\n </div>\n}\n\nconst styles = `\n.dsh-memory-settings-root,.dsh-memory-settings,.dsh-memory-chat{max-width:760px;color:inherit;font:400 var(--font-size-2,14px)/1.5 var(--default-font-family,system-ui,sans-serif)}\n.dsh-memory-settings-root,.dsh-memory-settings{display:grid;gap:16px}\n.dsh-memory-chat-body{display:grid;gap:12px;margin-top:8px}\n.dsh-memory-settings p,.dsh-memory-chat p{margin:0;line-height:1.5}\n.dsh-memory-meta,.dsh-memory-chat small{font-size:var(--font-size-1,13px);color:var(--gray-11,inherit)}\n.dsh-memory-error{color:var(--red-11,#b42318)}\n.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}\n.dsh-memory-card header,.dsh-memory-chat-body header{display:flex;justify-content:space-between;gap:12px;align-items:center}\n.dsh-memory-card h3,.dsh-memory-add h4,.dsh-memory-dream h4{margin:0;font-size:var(--font-size-3,16px);font-weight:600}\n.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}\n.dsh-memory-settings input:focus,.dsh-memory-chat input:focus,.dsh-memory-chat textarea:focus,.dsh-memory-chat select:focus{border-color:var(--accent-9,#3b82f6);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent-9,#3b82f6) 25%,transparent)}\n.dsh-memory-settings button:not([role=\"switch\"]),.dsh-memory-chat button:not([role=\"switch\"]){min-height:34px;padding:6px 12px;border:1px solid color-mix(in srgb,currentColor 25%,transparent);border-radius:8px;background:transparent;color:inherit;cursor:pointer;font:inherit;justify-self:start;transition:background-color 150ms ease,color 150ms ease,border-color 150ms ease,box-shadow 150ms ease,transform 150ms ease}\n.dsh-memory-settings button:not([role=\"switch\"]):hover:not(:disabled),.dsh-memory-chat button:not([role=\"switch\"]):hover:not(:disabled){background:var(--gray-3,color-mix(in srgb,currentColor 6%,transparent));border-color:color-mix(in srgb,currentColor 35%,transparent)}\n.dsh-memory-settings button:not([role=\"switch\"]):active:not(:disabled),.dsh-memory-chat button:not([role=\"switch\"]):active:not(:disabled){transform:scale(.97)}\n.dsh-memory-danger:hover:not(:disabled){border-color:var(--red-11,#b42318);color:var(--red-11,#b42318);background:color-mix(in srgb,var(--red-11,#b42318) 8%,transparent)}\n.dsh-memory-settings button:disabled,.dsh-memory-chat button:disabled{opacity:.45;cursor:not-allowed}\n.dsh-memory-settings .dsh-memory-switch,.dsh-memory-chat .dsh-memory-switch{all:unset;box-sizing:border-box;position:relative;display:inline-block;width:36px;height:20px;flex:none;border-radius:999px;background:var(--gray-7,color-mix(in srgb,currentColor 28%,transparent));cursor:pointer}\n.dsh-memory-switch.is-on{background:var(--accent-9,#3b82f6)}\n.dsh-memory-switch-thumb{position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:999px;background:#fff;transition:transform 150ms ease}\n.dsh-memory-switch.is-on .dsh-memory-switch-thumb{transform:translateX(16px)}\n.dsh-memory-settings :focus-visible,.dsh-memory-chat :focus-visible{outline:2px solid var(--accent-9,currentColor);outline-offset:3px}\n.dsh-memory-list{list-style:none;margin:0;padding:0;display:grid;gap:12px}\n.dsh-memory-list li{display:grid;gap:6px;padding:10px 4px;border-top:1px solid var(--gray-6,color-mix(in srgb,currentColor 15%,transparent));border-radius:10px;overflow-wrap:anywhere}\n.dsh-memory-row-actions{display:flex;flex-wrap:wrap;gap:8px}\n.dsh-memory-check{display:flex;gap:8px;align-items:center}\n.dsh-memory-check input{width:auto}\n.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}\n.dsh-memory-si-body{margin-top:8px}\n@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}}\n`\n\nexport function apply(ctx: Context): void {\n const client = ctx as unknown as Client\n ctx.effect(() => {\n if (typeof document === 'undefined') return () => {}\n const style = document.createElement('style')\n style.setAttribute('data-plugin', '@klarkxy/dsh-memory')\n style.textContent = styles\n document.head.appendChild(style)\n return () => style.remove()\n }, 'dsh-memory.styles')\n ctx.effect(() => client.slots.inject('settings.section', () => client.slots.register({\n name: 'settings.section', id: 'memory', order: 65, label: '记忆',\n }, (props: unknown) => <MemorySettings client={client} host={ctx} props={props} />)), 'dsh-memory.settings')\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.inner.cjs","names":["useSyncExternalStore","useCallback","useRef","captured","useRef","useState","useId"],"sources":["../../dsh-ai-services/src/client-utils.ts","../src/contracts.ts","../src/view-lifetime.ts","../src/client.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useSyncExternalStore } from 'react'\n\nexport interface NativeSurfaceClient {\n sessions: {\n binding?(sessionId: string): { eventSource: { subscribe(listener: () => void): () => void } } | undefined\n }\n uiWorkspace: { current?: { getSnapshot(): { sessionId: string } | undefined; subscribe(listener: () => void): () => void } }\n uiSession: { adapter: { current: { getSnapshot(): { key?: string }; subscribe(listener: () => void): () => void } } }\n locale: { getSnapshot(): { active: string }; subscribe(listener: () => void): () => void }\n connection?: { generation?: { subscribe(listener: () => void): () => void } }\n}\n\n/** The Editor retains its manuscript session separately; native DSH exposes the main-view binding. */\nexport function selectedSessionId(client: Pick<NativeSurfaceClient, 'uiWorkspace' | 'uiSession'>): string {\n return client.uiWorkspace.current\n ? client.uiWorkspace.current.getSnapshot()?.sessionId ?? ''\n : client.uiSession.adapter.current.getSnapshot().key ?? ''\n}\n\n/** Owner props win; native settings only supplies close, so resolve its selected session. */\nexport function useNativeSeat(client: NativeSurfaceClient, props: unknown) {\n const current = useSyncExternalStore(\n useCallback((fn: () => void) => (client.uiWorkspace.current ?? client.uiSession.adapter.current).subscribe(fn), [client]),\n useCallback(() => selectedSessionId(client), [client]),\n () => '',\n )\n const language = useSyncExternalStore(\n useCallback((fn: () => void) => client.locale.subscribe(fn), [client]),\n useCallback(() => client.locale.getSnapshot().active, [client]),\n () => 'en',\n )\n const row = props && typeof props === 'object' ? props as Record<string, unknown> : {}\n const owner = row.owner && typeof row.owner === 'object' ? row.owner as Record<string, unknown> : {}\n const sessionId = typeof row.sessionId === 'string' ? row.sessionId\n : typeof owner.sessionId === 'string' ? owner.sessionId : current\n const requestedLocale = row.locale ?? owner.locale ?? language\n return { sessionId, locale: (String(requestedLocale).startsWith('zh') ? 'zh' : 'en') as 'zh' | 'en',\n hidden: row.hidden === true || owner.hidden === true }\n}\n\n/** Refresh on native log boundaries/reconnect/focus. Read-only settling is bounded to an observed job. */\nexport function useFeatureRefresh(\n client: NativeSurfaceClient, sessionId: string, refresh: () => void,\n working = false, enabled = true,\n): void {\n const refreshRef = useRef(refresh)\n refreshRef.current = refresh\n useEffect(() => {\n if (!enabled) return\n let timer: ReturnType<typeof setTimeout> | undefined\n const queue = () => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') return\n clearTimeout(timer)\n timer = setTimeout(() => refreshRef.current(), 150)\n }\n const source = sessionId ? client.sessions.binding?.(sessionId)?.eventSource : undefined\n const stopEvents = source?.subscribe(queue)\n const stopConnection = client.connection?.generation?.subscribe(queue)\n const visibility = () => { if (document.visibilityState === 'visible') queue() }\n window.addEventListener('focus', queue)\n document.addEventListener('visibilitychange', visibility)\n // Details are collapsed by default; opening an existing panel must get current state.\n document.addEventListener('toggle', queue, true)\n return () => {\n clearTimeout(timer)\n stopEvents?.(); stopConnection?.()\n window.removeEventListener('focus', queue)\n document.removeEventListener('visibilitychange', visibility)\n document.removeEventListener('toggle', queue, true)\n }\n }, [client, sessionId, enabled])\n useEffect(() => {\n if (!enabled || !working) return\n let delay = 250\n const until = Date.now() + 300_000\n let timer: ReturnType<typeof setTimeout>\n const tick = () => {\n if (Date.now() >= until) return\n if (document.visibilityState !== 'hidden') refreshRef.current()\n delay = Math.min(delay * 2, 2000)\n timer = setTimeout(tick, delay)\n }\n timer = setTimeout(tick, delay)\n return () => clearTimeout(timer)\n }, [client, sessionId, working, enabled])\n}\n","/** Browser-safe contracts. MemoryRecord / MemoryService match frozen @klarkxy/dsh-ai-services. */\nimport {\n CHAT_EVENTS_SLOT as FROZEN_CHAT_EVENTS_SLOT,\n projectIdFromCwd as frozenProjectIdFromCwd,\n} from '@klarkxy/dsh-ai-services/contracts'\nimport type {\n AiFeatureScope,\n AiServices,\n AuxiliaryRequest,\n AuxiliaryResult,\n EvidenceRef,\n KnowledgeKind,\n KnowledgeScope,\n MemoryQuery,\n MemoryRecord,\n MemoryService,\n NewMemoryRecord,\n PurposeSpec,\n ProducerMessageSource,\n RpcResult,\n UsageReceipt,\n} from '@klarkxy/dsh-ai-services/contracts'\n\nexport type {\n AiFeatureScope,\n AiServices,\n AuxiliaryRequest,\n AuxiliaryResult,\n EvidenceRef,\n KnowledgeKind,\n KnowledgeScope,\n MemoryQuery,\n MemoryRecord,\n MemoryService,\n NewMemoryRecord,\n PurposeSpec,\n ProducerMessageSource,\n RpcResult,\n UsageReceipt,\n}\n\n/** Frozen shared chat-events seat. Must stay equal to @klarkxy/dsh-ai-services CHAT_EVENTS_SLOT. */\nexport const CHAT_EVENTS_SLOT = FROZEN_CHAT_EVENTS_SLOT\n/** Shared untruncated cwd identity. Drive roots (`/` / `C:/`) stay intact. */\nexport const projectIdFromCwd = frozenProjectIdFromCwd\nexport const MEMORY_PLUGIN = '@klarkxy/dsh-memory'\nexport const MEMORY_SOURCE_KIND = 'plugin:@klarkxy/dsh-memory' as const\nexport const MEMORY_RPC_CHANNEL = '/dsh-memory'\nexport const MEMORY_DREAM_PURPOSE = 'memory.dream'\nexport const MEMORY_INJECTION_SECTION = 'dsh-memory:recall'\n/** Frozen pluginName now accepts scoped ids. */\nexport const MEMORY_ACTIVATE_ID = MEMORY_PLUGIN\n\nexport const DEFAULT_IDLE_MS = 15 * 60 * 1000\nexport const MIN_IDLE_MS = 60_000\nexport const MAX_IDLE_MS = 180 * 60_000\nexport const DREAM_MIN_INTERVAL_MS = 24 * 60 * 60 * 1000\nexport const DREAM_MIN_MATERIAL = 3\nexport const MIN_RECALL_RECORDS = 1\nexport const MAX_RECALL_RECORDS = 5\nexport const MAX_RECALL_TOKENS = 800\nexport const MAX_PROJECT_ID_CHARS = 32_768\nexport const INJECT_KINDS: readonly KnowledgeKind[] = ['preference', 'project-fact', 'decision', 'vocabulary', 'activity']\nexport const RECALL_EXCLUDED_STATUSES: readonly MemoryRecord['status'][] = [\n 'candidate', 'rejected', 'revoked', 'deleted', 'superseded',\n]\n\nexport interface MemorySettings {\n revision: number\n injectEnabled: boolean\n dreamIdleEnabled: boolean\n idleMs: number\n}\n\nexport const defaultSettings = (): MemorySettings => ({\n revision: 0,\n injectEnabled: true,\n dreamIdleEnabled: true,\n idleMs: DEFAULT_IDLE_MS,\n})\n\nexport type DreamPlanStatus = 'preview' | 'applied' | 'cancelled' | 'stale' | 'failed' | 'noop'\n\nexport interface DreamSnapshotEntry {\n id: string\n revision: number\n status: MemoryRecord['status']\n scope: KnowledgeScope\n expiresAt?: number\n kind?: KnowledgeKind\n context?: MemoryRecord['context']\n}\n\nexport interface DreamProposal {\n title: string\n content: string\n kind: Exclude<KnowledgeKind, 'lesson'>\n tags: string[]\n exceptions: string[]\n evidence: EvidenceRef[]\n sourceIds: string[]\n scope: KnowledgeScope\n context?: MemoryRecord['context']\n}\n\nexport interface DreamPlan {\n id: string\n revision: number\n sessionId: string\n projectId?: string\n status: DreamPlanStatus\n sourceVersion: string\n snapshot: DreamSnapshotEntry[]\n proposals: DreamProposal[]\n generation: number\n createdAt: number\n updatedAt: number\n error?: string\n}\n\nexport interface MemoryTombstone {\n id: string\n deletedAt: number\n lastRevision: number\n}\n\nexport interface MemoryPersistedState {\n settings: MemorySettings\n records: MemoryRecord[]\n tombstones: MemoryTombstone[]\n dreams: DreamPlan[]\n lastAttemptAt?: number\n /** Bounded per-session source cursors; retained when a derived record is deleted. */\n observations?: Array<{ sessionId: string; seq: number; updatedAt: number }>\n}\n\nexport interface MemoryStatus {\n runningDreams?: string[]\n settings: MemorySettings\n records: MemoryRecord[]\n dreams: DreamPlan[]\n projectId?: string\n storageFailed: boolean\n aiAvailable: boolean\n}\n\n/** Matches frozen MemoryService optional mutation identity/lifetime guards. */\nexport interface MemoryMutationOptions { signal?: AbortSignal; isCurrent?: () => boolean }\n\nexport interface PreStepEnter {\n kind: 'enter'\n messages: unknown[]\n startsRequestSeries?: true\n}\nexport type PreStepDecision = { kind: 'reject' } | PreStepEnter\n\nexport interface InjectedMemoryMessage {\n content: Array<{ type: 'text'; text: string }>\n source: ProducerMessageSource & {\n kind: typeof MEMORY_SOURCE_KIND\n plugin: typeof MEMORY_PLUGIN\n form: 'snapshot'\n sections: Array<{ name: string; text: string }>\n }\n}\n\nexport function fail<T = never>(code: string, message: string): RpcResult<T> {\n return { ok: false, error: { code, message } }\n}\n\nexport function ok<T>(value: T): RpcResult<T> {\n return { ok: true, value }\n}\n\nexport function parseSessionId(payload: unknown): string | undefined {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return undefined\n const sessionId = (payload as { sessionId?: unknown }).sessionId\n return typeof sessionId === 'string' && sessionId.length > 0 && sessionId.length <= 200 ? sessionId : undefined\n}\n\nexport function sessionCwd(session: unknown): string | undefined {\n if (!session || typeof session !== 'object') return undefined\n const row = session as { meta?: { cwd?: unknown }; header?: { cwd?: unknown } }\n const cwd = row.meta?.cwd ?? row.header?.cwd\n return typeof cwd === 'string' ? cwd : undefined\n}\n\nexport function scopesEqual(left: KnowledgeScope, right: KnowledgeScope): boolean {\n if (left.kind === 'global') return right.kind === 'global'\n return right.kind === 'project' && left.projectId === right.projectId\n}\n\nexport function scopeKey(scope: KnowledgeScope): string {\n return scope.kind === 'global' ? 'global' : `project:${scope.projectId}`\n}\n\nexport function cloneRecord(record: MemoryRecord): MemoryRecord {\n return structuredClone(record)\n}\n","import type { MemoryStatus, RpcResult } from './contracts.ts'\n\nexport type MemoryGenerationGate = {\n current: () => number\n next: () => number\n isCurrent: (token: number) => boolean\n}\n\nexport function createMemoryGeneration(start = 0): MemoryGenerationGate {\n let current = start\n return {\n current: () => current,\n next: () => {\n current += 1\n return current\n },\n isCurrent: token => token === current,\n }\n}\n\nexport function memoryRequestStillCurrent(input: {\n token: number\n gate: Pick<MemoryGenerationGate, 'isCurrent'>\n signal: AbortSignal\n sessionId: string\n viewSessionId: string\n}): boolean {\n return input.gate.isCurrent(input.token)\n && !input.signal.aborted\n && input.sessionId === input.viewSessionId\n}\n\nexport type MemoryViewRequest = {\n sessionId: string\n token: number\n signal: AbortSignal\n controller: AbortController\n}\n\n/** Capture session, generation token, and abort lifetime before the first await. */\nexport function beginMemoryRequest(\n gate: MemoryGenerationGate,\n sessionId: string,\n previous?: AbortController | null,\n): MemoryViewRequest {\n previous?.abort()\n const controller = new AbortController()\n const captured = sessionId\n const token = gate.next()\n return { sessionId: captured, token, signal: controller.signal, controller }\n}\n\nexport function disposeMemoryRequest(gate: MemoryGenerationGate, controller: AbortController): void {\n controller.abort()\n gate.next()\n}\n\nexport type MemoryRpc = (endpoint: string, payload: unknown, signal?: AbortSignal) => Promise<unknown>\n\nexport function unwrapMemoryResult<T>(result: RpcResult<T>): T {\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n}\n\nexport function shouldSkipMemoryRefresh(input: { busy: boolean; editing: boolean }): boolean {\n return input.busy || input.editing\n}\n\nexport async function loadMemoryStatus(input: {\n rpc: MemoryRpc\n sessionId: string\n token: number\n gate: Pick<MemoryGenerationGate, 'isCurrent'>\n signal: AbortSignal\n viewSessionId: () => string\n}): Promise<MemoryStatus | undefined> {\n const captured = input.sessionId\n const raw = await input.rpc('status', captured ? { sessionId: captured } : {}, input.signal)\n if (!memoryRequestStillCurrent({\n token: input.token, gate: input.gate, signal: input.signal, sessionId: captured, viewSessionId: input.viewSessionId(),\n })) return undefined\n return unwrapMemoryResult(raw as RpcResult<MemoryStatus>)\n}\n\n/** Read-only status peek; uses an independent signal so it cannot abort an in-flight write. */\nexport async function peekMemoryStatus(input: {\n rpc: MemoryRpc\n sessionId: string\n token: number\n gate: Pick<MemoryGenerationGate, 'isCurrent'>\n viewSessionId: () => string\n busy: () => boolean\n editing?: () => boolean\n}): Promise<MemoryStatus | undefined> {\n if (shouldSkipMemoryRefresh({ busy: input.busy(), editing: input.editing?.() === true })) return undefined\n const token = input.token\n if (!input.gate.isCurrent(token) || token === 0) return undefined\n const next = await loadMemoryStatus({\n rpc: input.rpc,\n sessionId: input.sessionId,\n token,\n gate: input.gate,\n signal: new AbortController().signal,\n viewSessionId: input.viewSessionId,\n })\n if (!next) return undefined\n if (shouldSkipMemoryRefresh({ busy: input.busy(), editing: input.editing?.() === true })) return undefined\n return next\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport { useFeatureRefresh, useNativeSeat, type NativeSurfaceClient } from '@klarkxy/dsh-ai-services/client-utils'\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport {\n MEMORY_RPC_CHANNEL,\n type DreamPlan, type MemoryRecord, type MemorySettings, type MemoryStatus, type RpcResult,\n} from './contracts.ts'\nimport {\n beginMemoryRequest, createMemoryGeneration, disposeMemoryRequest, loadMemoryStatus, memoryRequestStillCurrent,\n peekMemoryStatus, shouldSkipMemoryRefresh, unwrapMemoryResult,\n} from './view-lifetime.ts'\n\nexport const name = 'dsh-memory-client'\nexport const inject = ['slots', 'connection', 'sessions', 'locale', 'uiWorkspace', 'uiSession'] as const\nexport {\n beginMemoryRequest, createMemoryGeneration, disposeMemoryRequest, loadMemoryStatus, memoryRequestStillCurrent,\n peekMemoryStatus, shouldSkipMemoryRefresh, unwrapMemoryResult,\n} from './view-lifetime.ts'\n\ntype Client = NativeSurfaceClient & {\n connection: {\n rpc: { call(channel: string, endpoint: string, payload: unknown, signal?: AbortSignal): Promise<unknown> }\n generation?: { subscribe(listener: () => void): () => void }\n }\n slots: {\n inject(key: string, callback: () => unknown): () => void\n register(spec: { name: string; id: string; label: string; order: number }, render: unknown): () => void\n }\n}\n\nexport type Locale = 'zh' | 'en'\nexport type SeatProps = { sessionId: string; locale: Locale; hidden: boolean }\n\nexport function parseSeatProps(props: unknown): SeatProps {\n const row = props && typeof props === 'object' ? props as Record<string, unknown> : {}\n const nested = row.owner && typeof row.owner === 'object' ? row.owner as Record<string, unknown> : undefined\n const sessionId = typeof row.sessionId === 'string' && row.sessionId\n ? row.sessionId\n : typeof nested?.sessionId === 'string' ? nested.sessionId : ''\n const locale = row.locale === 'en' || nested?.locale === 'en' ? 'en' : 'zh'\n const hidden = row.hidden === true || nested?.hidden === true\n return { sessionId, locale, hidden }\n}\n\nexport function memoryPanelKey(sessionId: string, locale: Locale): string {\n return `${sessionId}:${locale}`\n}\n\nexport function chatSummaryTitle(locale: Locale): string {\n return locale === 'en' ? 'Memory' : '记忆'\n}\n\nexport function candidateAvailabilityLabel(count: number, locale: Locale): string {\n if (count > 0) return locale === 'en' ? `${count} to review` : `${count} 条候选`\n return locale === 'en' ? 'No candidates' : '暂无候选'\n}\n\nexport function kindLabel(kind: MemoryRecord['kind'], locale: Locale): string {\n const labels: Record<MemoryRecord['kind'], [string, string]> = {\n preference: ['偏好', 'Preference'], 'project-fact': ['项目事实', 'Project fact'], decision: ['决策', 'Decision'],\n vocabulary: ['用语释义', 'Vocabulary'], activity: ['近期状态', 'Recent activity'], lesson: ['行动经验', 'Method'],\n }\n return labels[kind][locale === 'en' ? 1 : 0]\n}\n\nexport function statusLabel(status: MemoryRecord['status'], locale: Locale): string {\n const zh: Record<MemoryRecord['status'], string> = {\n candidate: '候选', active: '已生效', rejected: '已拒绝', superseded: '已替代', revoked: '已撤销', deleted: '已删除',\n }\n const en: Record<MemoryRecord['status'], string> = {\n candidate: 'Candidate', active: 'Active', rejected: 'Rejected', superseded: 'Superseded', revoked: 'Revoked', deleted: 'Deleted',\n }\n return locale === 'en' ? en[status] : zh[status]\n}\n\nexport function canAccept(record: MemoryRecord): boolean { return record.status === 'candidate' }\nexport function canReject(record: MemoryRecord): boolean { return record.status === 'candidate' }\nexport function canRevoke(record: MemoryRecord): boolean { return record.status === 'active' }\n\nfunction t(locale: Locale, zh: string, en: string): string {\n return locale === 'en' ? en : zh\n}\n\nexport function MemoryChatShell(props: { locale: Locale; candidateCount: number; children?: ReactNode }) {\n return <details className=\"dsh-memory-chat\" data-testid=\"memory-chat\">\n <summary>\n <span>{chatSummaryTitle(props.locale)}</span>\n <span className=\"dsh-memory-meta\">{candidateAvailabilityLabel(props.candidateCount, props.locale)}</span>\n </summary>\n <div className=\"dsh-memory-chat-body\">{props.children}</div>\n </details>\n}\n\nfunction MemorySettingsPanel({ client, sessionId, locale }: { client: Client; sessionId: string; locale: Locale }) {\n const gate = useRef(createMemoryGeneration())\n const sessionRef = useRef(sessionId)\n const workRef = useRef<AbortController | null>(null)\n sessionRef.current = sessionId\n const [status, setStatus] = useState<MemoryStatus>()\n const [draft, setDraft] = useState<MemorySettings>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [note, setNote] = useState('')\n const busyRef = useRef(false)\n const settingsDirty = useRef(false)\n busyRef.current = busy\n\n async function rpc(endpoint: string, payload: unknown, signal?: AbortSignal): Promise<unknown> {\n const result = await client.connection.rpc.call(MEMORY_RPC_CHANNEL, endpoint, payload, signal)\n unwrapMemoryResult(result as RpcResult<unknown>)\n return result\n }\n\n useEffect(() => {\n const request = beginMemoryRequest(gate.current, sessionId, workRef.current)\n workRef.current = request.controller\n setError('')\n setNote('')\n void loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n }).then(next => {\n if (!next) return\n setStatus(next)\n setDraft(next.settings)\n settingsDirty.current = false\n }).catch(cause => {\n if (!memoryRequestStillCurrent({\n token: request.token, gate: gate.current, signal: request.signal,\n sessionId: request.sessionId, viewSessionId: sessionRef.current,\n })) return\n setError(cause instanceof Error ? cause.message : t(locale, '无法读取记忆设置。', 'Unable to load memory settings.'))\n })\n return () => disposeMemoryRequest(gate.current, workRef.current ?? request.controller)\n }, [client, sessionId, locale])\n\n useFeatureRefresh(client, sessionId, () => {\n void peekMemoryStatus({\n rpc, sessionId: sessionRef.current, token: gate.current.current(), gate: gate.current,\n viewSessionId: () => sessionRef.current, busy: () => busyRef.current, editing: () => settingsDirty.current,\n }).then(next => {\n if (next) { setStatus(next); setDraft(next.settings) }\n }).catch(() => {})\n }, false, true)\n\n async function action(run: (sessionId: string) => Promise<void>) {\n const request = beginMemoryRequest(gate.current, sessionId, workRef.current)\n workRef.current = request.controller\n setBusy(true); setNote(''); setError('')\n const still = () => memoryRequestStillCurrent({\n token: request.token, gate: gate.current, signal: request.signal,\n sessionId: request.sessionId, viewSessionId: sessionRef.current,\n })\n try {\n await run(request.sessionId)\n const next = await loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n })\n if (!next || !still()) return\n setStatus(next)\n setDraft(next.settings)\n settingsDirty.current = false\n setNote(t(locale, '已保存。', 'Saved.'))\n } catch (cause) {\n if (!still()) return\n setError(cause instanceof Error ? cause.message : t(locale, '操作失败。', 'Failed.'))\n const next = await loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n }).catch(() => undefined)\n if (next && still()) {\n setStatus(next)\n setDraft(next.settings)\n settingsDirty.current = false\n }\n } finally {\n if (still()) setBusy(false)\n }\n }\n\n if (!status || !draft) {\n return <section className=\"dsh-memory-settings\">\n <p role=\"status\">{error || t(locale, '正在读取设置…', 'Loading settings…')}</p>\n <button type=\"button\" onClick={() => void action(async () => {})}>{t(locale, '重新连接', 'Reconnect')}</button>\n </section>\n }\n\n return <section className=\"dsh-memory-settings\" data-testid=\"memory-settings\">\n {error && <p role=\"alert\" className=\"dsh-memory-error\">{error}</p>}\n {note && <p role=\"status\">{note}</p>}\n {status.storageFailed && <p role=\"alert\">{t(locale, '保存失败,已保留原内容。', 'Save failed; previous content was kept.')}</p>}\n {!status.aiAvailable && <p className=\"dsh-memory-meta\">{t(locale, '梦境整理需要单独加载 @klarkxy/dsh-ai-services。', 'Dream needs @klarkxy/dsh-ai-services loaded separately.')}</p>}\n <article className=\"dsh-memory-card\">\n <header>\n <div>\n <h3>{t(locale, '写入提示', 'Prompt injection')}</h3>\n <p className=\"dsh-memory-meta\">{t(locale, '关闭后不再注入记忆;存储保留。', 'Turns off injection; stored records remain.')}</p>\n </div>\n <button type=\"button\" role=\"switch\" className={`dsh-memory-switch${draft.injectEnabled ? ' is-on' : ''}`}\n aria-checked={draft.injectEnabled} aria-label={draft.injectEnabled ? t(locale, '关闭记忆注入', 'Disable memory injection') : t(locale, '启用记忆注入', 'Enable memory injection')}\n disabled={busy}\n onClick={() => void action(async () => {\n await rpc('settings.update', {\n expectedRevision: draft.revision,\n settings: { ...editable(draft), injectEnabled: !draft.injectEnabled },\n })\n })}>\n <span className=\"dsh-memory-switch-thumb\" aria-hidden=\"true\" />\n </button>\n </header>\n </article>\n <article className=\"dsh-memory-card\">\n <header>\n <div>\n <h3>{t(locale, 'Dream 语境记忆', 'Dream context memory')}</h3>\n <p className=\"dsh-memory-meta\">{t(locale, '从原始用户消息记录用语与近期状态,闲时整理已有语境。行动方法由自我改进负责。', 'Records vocabulary and recent activity from original user messages, then consolidates context while idle. Self Improve owns methods.')}</p>\n </div>\n <button type=\"button\" role=\"switch\" className={`dsh-memory-switch${draft.dreamIdleEnabled ? ' is-on' : ''}`}\n aria-checked={draft.dreamIdleEnabled} aria-label={draft.dreamIdleEnabled ? t(locale, '关闭 Dream 观察与整理', 'Disable Dream observation and consolidation') : t(locale, '启用 Dream 观察与整理', 'Enable Dream observation and consolidation')}\n disabled={busy}\n onClick={() => void action(async () => {\n await rpc('settings.update', {\n expectedRevision: draft.revision,\n settings: { ...editable(draft), dreamIdleEnabled: !draft.dreamIdleEnabled },\n })\n })}>\n <span className=\"dsh-memory-switch-thumb\" aria-hidden=\"true\" />\n </button>\n </header>\n <p className=\"dsh-memory-meta\">{t(locale, '闲时整理在会话空闲约 15 分钟后尝试。', 'Idle organization waits about 15 minutes of inactivity.')}</p>\n </article>\n </section>\n}\n\nfunction editable(settings: MemorySettings): Omit<MemorySettings, 'revision'> {\n const { revision: _revision, ...rest } = settings\n return rest\n}\n\nfunction MemoryChatPanel({ client, sessionId, locale }: { client: Client; sessionId: string; locale: Locale }) {\n const formId = useId()\n const gate = useRef(createMemoryGeneration())\n const sessionRef = useRef(sessionId)\n const workRef = useRef<AbortController | null>(null)\n sessionRef.current = sessionId\n const [status, setStatus] = useState<MemoryStatus>()\n const [query, setQuery] = useState('')\n const [title, setTitle] = useState('')\n const [content, setContent] = useState('')\n const [kind, setKind] = useState<MemoryRecord['kind']>('preference')\n const [global, setGlobal] = useState(false)\n const [evidence, setEvidence] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [note, setNote] = useState('')\n const [editing, setEditing] = useState(false)\n const busyRef = useRef(false)\n const editingRef = useRef(false)\n busyRef.current = busy\n editingRef.current = editing\n\n async function rpc(endpoint: string, payload: unknown, signal?: AbortSignal): Promise<unknown> {\n const result = await client.connection.rpc.call(MEMORY_RPC_CHANNEL, endpoint, payload, signal)\n unwrapMemoryResult(result as RpcResult<unknown>)\n return result\n }\n\n useEffect(() => {\n const request = beginMemoryRequest(gate.current, sessionId, workRef.current)\n workRef.current = request.controller\n setError('')\n setNote('')\n void loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n }).then(next => {\n if (!next) return\n setStatus(next)\n }).catch(cause => {\n if (!memoryRequestStillCurrent({\n token: request.token, gate: gate.current, signal: request.signal,\n sessionId: request.sessionId, viewSessionId: sessionRef.current,\n })) return\n setError(cause instanceof Error ? cause.message : t(locale, '无法读取记忆。', 'Unable to load memory.'))\n })\n return () => disposeMemoryRequest(gate.current, workRef.current ?? request.controller)\n }, [client, sessionId, locale])\n\n useFeatureRefresh(client, sessionId, () => {\n void peekMemoryStatus({\n rpc, sessionId: sessionRef.current, token: gate.current.current(), gate: gate.current,\n viewSessionId: () => sessionRef.current, busy: () => busyRef.current, editing: () => editingRef.current,\n }).then(next => { if (next) setStatus(next) }).catch(() => {})\n }, Boolean(status?.runningDreams?.length), Boolean(sessionId))\n\n async function action(run: (sessionId: string) => Promise<void>) {\n const request = beginMemoryRequest(gate.current, sessionId, workRef.current)\n workRef.current = request.controller\n setBusy(true); setNote(''); setError('')\n const still = () => memoryRequestStillCurrent({\n token: request.token, gate: gate.current, signal: request.signal,\n sessionId: request.sessionId, viewSessionId: sessionRef.current,\n })\n try {\n await run(request.sessionId)\n const next = await loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n })\n if (!next || !still()) return\n setStatus(next)\n } catch (cause) {\n if (!still()) return\n setError(cause instanceof Error ? cause.message : t(locale, '操作失败。', 'Failed.'))\n const next = await loadMemoryStatus({\n rpc, sessionId: request.sessionId, token: request.token, gate: gate.current, signal: request.signal,\n viewSessionId: () => sessionRef.current,\n }).catch(() => undefined)\n if (next && still()) setStatus(next)\n } finally {\n if (still()) setBusy(false)\n }\n }\n\n const records = (status?.records ?? []).filter(record => {\n if (!query.trim()) return true\n return `${record.title}\\n${record.content}`.toLowerCase().includes(query.trim().toLowerCase())\n })\n const dreams = (status?.dreams ?? []).slice().sort((a, b) => b.updatedAt - a.updatedAt).slice(0, 8)\n const candidateCount = (status?.records ?? []).filter(record => record.status === 'candidate').length\n\n const body = <>\n <header>\n <p className=\"dsh-memory-meta\">{status?.projectId\n ? t(locale, '当前项目', 'This project')\n : t(locale, '无项目目录;全局写入需勾选。', 'No project path; global write must be explicit.')}</p>\n </header>\n {error && <p role=\"alert\" className=\"dsh-memory-error\">{error}</p>}\n {note && <p role=\"status\">{note}</p>}\n <label className=\"dsh-memory-search\">{t(locale, '搜索', 'Search')}\n <input value={query} onChange={event => setQuery(event.target.value)} disabled={busy}\n aria-label={t(locale, '搜索记忆', 'Search memory')} />\n </label>\n <ul className=\"dsh-memory-list\">\n {records.length === 0 ? <li className=\"dsh-memory-meta\">{query.trim() ? t(locale, '没有匹配的条目。', 'No matching records.') : t(locale, '暂无条目。', 'No records.')}</li> : records.map(record => (\n <MemoryRow key={record.id} record={record} locale={locale} busy={busy}\n onEditingChange={setEditing}\n onAccept={() => void action(captured => rpc('records.accept', { sessionId: captured, id: record.id, expectedRevision: record.revision }).then(() => { if (sessionRef.current === captured) setNote(t(locale, '已采纳。', 'Accepted.')) }))}\n onReject={() => void action(captured => rpc('records.reject', { sessionId: captured, id: record.id, expectedRevision: record.revision }).then(() => { if (sessionRef.current === captured) setNote(t(locale, '已拒绝。', 'Rejected.')) }))}\n onRevoke={() => void action(captured => rpc('records.revoke', { sessionId: captured, id: record.id, expectedRevision: record.revision }).then(() => { if (sessionRef.current === captured) setNote(t(locale, '已撤销。', 'Revoked.')) }))}\n onDelete={() => void action(captured => rpc('records.remove', { sessionId: captured, id: record.id, expectedRevision: record.revision }).then(() => { if (sessionRef.current === captured) setNote(t(locale, '已删除。', 'Deleted.')) }))}\n onSave={(nextTitle, nextContent) => void action(captured => rpc('records.update', { sessionId: captured, id: record.id, expectedRevision: record.revision, title: nextTitle, content: nextContent }).then(() => { if (sessionRef.current === captured) setNote(t(locale, '已更新。', 'Updated.')) }))}\n />\n ))}\n </ul>\n <form className=\"dsh-memory-add\" onSubmit={event => {\n event.preventDefault()\n void action(async captured => {\n await rpc('records.create', {\n sessionId: captured, title, content, kind, global,\n evidence: evidence.trim() ? [{ sessionId: captured, seq: 0, kind: 'manual', excerpt: evidence.trim().slice(0, 400) }] : [],\n })\n if (sessionRef.current !== captured) return\n setTitle(''); setContent(''); setEvidence(''); setNote(t(locale, '已添加。', 'Added.'))\n })\n }}>\n <h4>{t(locale, '手动添加', 'Add')}</h4>\n <label htmlFor={formId + '-title'}>{t(locale, '标题', 'Title')}\n <input id={formId + '-title'} value={title} required maxLength={160} disabled={busy}\n onChange={event => setTitle(event.target.value)} />\n </label>\n <label htmlFor={formId + '-body'}>{t(locale, '内容', 'Content')}\n <textarea id={formId + '-body'} value={content} required maxLength={4000} disabled={busy} rows={3}\n onChange={event => setContent(event.target.value)} />\n </label>\n <label>{t(locale, '类型', 'Kind')}\n <select value={kind} disabled={busy} onChange={event => setKind(event.target.value as MemoryRecord['kind'])}>\n <option value=\"preference\">{kindLabel('preference', locale)}</option>\n <option value=\"project-fact\">{kindLabel('project-fact', locale)}</option>\n <option value=\"decision\">{kindLabel('decision', locale)}</option>\n <option value=\"vocabulary\">{kindLabel('vocabulary', locale)}</option>\n <option value=\"activity\">{kindLabel('activity', locale)}</option>\n </select>\n </label>\n <label htmlFor={formId + '-evidence'}>{t(locale, '依据(可选)', 'Evidence (optional)')}\n <input id={formId + '-evidence'} value={evidence} maxLength={400} disabled={busy}\n onChange={event => setEvidence(event.target.value)} />\n </label>\n <label className=\"dsh-memory-check\">\n <input type=\"checkbox\" checked={global} disabled={busy} onChange={event => setGlobal(event.target.checked)} />\n {t(locale, '写入全局(跨项目)', 'Write as global')}\n </label>\n <button type=\"submit\" disabled={busy}>{t(locale, '添加', 'Add')}</button>\n </form>\n <DreamPanel locale={locale} busy={busy} dreams={dreams} running={Boolean(status?.runningDreams?.length)}\n aiAvailable={status?.aiAvailable === true} action={action} rpc={rpc} />\n </>\n\n return <MemoryChatShell locale={locale} candidateCount={candidateCount}>{body}</MemoryChatShell>\n}\n\nfunction MemoryRow(props: {\n record: MemoryRecord; locale: Locale; busy: boolean\n onEditingChange?: (editing: boolean) => void\n onAccept(): void; onReject(): void; onRevoke(): void; onDelete(): void\n onSave(title: string, content: string): void\n}) {\n const { record, locale } = props\n const [editing, setEditing] = useState(false)\n const [title, setTitle] = useState(record.title)\n const [content, setContent] = useState(record.content)\n const scope = record.scope.kind === 'global' ? t(locale, '全局', 'Global') : t(locale, '项目', 'Project')\n function setRowEditing(next: boolean) {\n setEditing(next)\n props.onEditingChange?.(next)\n }\n if (editing) {\n return <li>\n <label>{t(locale, '标题', 'Title')}\n <input value={title} disabled={props.busy} onChange={event => setTitle(event.target.value)} />\n </label>\n <label>{t(locale, '内容', 'Content')}\n <textarea value={content} disabled={props.busy} rows={3} maxLength={4000} onChange={event => setContent(event.target.value)} />\n </label>\n <div className=\"dsh-memory-row-actions\">\n <button type=\"button\" disabled={props.busy} onClick={() => { props.onSave(title, content); setRowEditing(false) }}>{t(locale, '保存', 'Save')}</button>\n <button type=\"button\" disabled={props.busy} onClick={() => setRowEditing(false)}>{t(locale, '取消', 'Cancel')}</button>\n </div>\n </li>\n }\n return <li>\n <strong>{record.title}</strong>\n <p className=\"dsh-memory-meta\">{kindLabel(record.kind, locale)} · {statusLabel(record.status, locale)} · {scope}</p>\n {record.context && <p className=\"dsh-memory-meta\">{record.context.subject} · {record.context.domain} · {record.context.key}\n {' · '}{t(locale, '记录于', 'Observed')} {new Date(record.context.observedAt).toLocaleString(locale === 'en' ? 'en-US' : 'zh-CN')}\n {record.context.activityStatus && ` · ${record.context.activityStatus}`}\n {record.context.eventTime && ` · ${record.context.eventTime}`}\n </p>}\n {record.kind === 'activity' && <p className=\"dsh-memory-meta\">{t(locale, '仅表示上次报告的状态;到期不代表任务已完成。', 'Last reported state only; expiry never means completion.')}</p>}\n <p>{record.content}</p>\n {record.evidence.length > 0 && <p className=\"dsh-memory-meta\">{t(locale, '依据', 'Evidence')}:{record.evidence.map(item => item.excerpt ?? `${item.kind}#${item.seq}`).join(';')}</p>}\n <div className=\"dsh-memory-row-actions\">\n {record.status !== 'deleted' && <button type=\"button\" disabled={props.busy} onClick={() => { setTitle(record.title); setContent(record.content); setRowEditing(true) }}>{t(locale, '编辑', 'Edit')}</button>}\n {canAccept(record) && <button type=\"button\" disabled={props.busy} onClick={props.onAccept}>{t(locale, '采纳', 'Accept')}</button>}\n {canReject(record) && <button type=\"button\" disabled={props.busy} onClick={props.onReject}>{t(locale, '拒绝', 'Reject')}</button>}\n {canRevoke(record) && <button type=\"button\" disabled={props.busy} onClick={props.onRevoke}>{t(locale, '撤销', 'Revoke')}</button>}\n <ConfirmButton disabled={props.busy} label={t(locale, '删除', 'Delete')} confirmLabel={t(locale, '确认删除?', 'Confirm delete?')} onConfirm={props.onDelete} />\n </div>\n </li>\n}\n\nfunction ConfirmButton(props: { label: string; confirmLabel: string; disabled?: boolean; onConfirm(): void }) {\n const [armed, setArmed] = useState(false)\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined)\n useEffect(() => () => clearTimeout(timer.current), [])\n function disarm() {\n clearTimeout(timer.current)\n setArmed(false)\n }\n return <button type=\"button\" className=\"dsh-memory-danger\" disabled={props.disabled}\n onClick={() => {\n if (!armed) {\n setArmed(true)\n timer.current = setTimeout(() => setArmed(false), 3000)\n return\n }\n disarm()\n props.onConfirm()\n }}\n onBlur={disarm}>{armed ? props.confirmLabel : props.label}</button>\n}\n\nexport function dreamStatusLabel(plan: DreamPlan, locale: Locale): string {\n if (plan.status === 'applied') return t(locale, '已应用', 'Applied')\n if (plan.status === 'noop') return t(locale, '无变化', 'No change')\n if (plan.status === 'failed' || plan.status === 'stale') return t(locale, '失败', 'Failed')\n if (plan.status === 'cancelled') return t(locale, '已取消', 'Cancelled')\n return plan.proposals.length ? t(locale, '未应用', 'Not applied') : t(locale, '无变化', 'No change')\n}\n\nfunction DreamPanel(props: {\n running: boolean\n locale: Locale; busy: boolean; dreams: DreamPlan[]; aiAvailable: boolean\n action(run: (sessionId: string) => Promise<void>): Promise<void>\n rpc(endpoint: string, payload: unknown, signal?: AbortSignal): Promise<unknown>\n}) {\n const locale = props.locale\n return <article className=\"dsh-memory-dream\">\n <h4>{t(locale, '梦境整理', 'Dream')}</h4>\n <p className=\"dsh-memory-meta\">{t(locale, '每天至多闲时整理一次;不把候选升级为事实,不延长近期状态的有效期。', 'Consolidates at most once a day while idle, without confirming candidates or extending activity freshness.')}</p>\n <div className=\"dsh-memory-row-actions\">\n <button type=\"button\" disabled={props.busy || props.running || !props.aiAvailable} onClick={() => void props.action(async captured => {\n await props.rpc('dream.run', { sessionId: captured })\n })}>{t(locale, '立即整理', 'Organize now')}</button>\n {props.running && <span className=\"dsh-memory-meta\">{t(locale, '整理中…', 'Organizing…')}</span>}\n </div>\n {props.dreams.length > 0 && <ul>\n {props.dreams.map(plan => (\n <li key={plan.id}>\n <strong>{dreamStatusLabel(plan, locale)}</strong>{' '}\n <span className=\"dsh-memory-meta\">{new Date(plan.createdAt).toLocaleString(locale === 'zh' ? 'zh-CN' : 'en-US')}</span>\n {plan.proposals.length > 0 && <p className=\"dsh-memory-meta\">{plan.proposals.map(proposal => proposal.title).join('、')}</p>}\n {plan.error && <p className=\"dsh-memory-error\">{plan.error}</p>}\n </li>\n ))}\n </ul>}\n </article>\n}\n\nfunction readSelfImprovementReview(host: unknown): { render(props: unknown): ReactNode } | undefined {\n if (!host || typeof host !== 'object') return undefined\n const context = host as { get?: (name: string) => unknown }\n if (typeof context.get !== 'function') return undefined\n let row: unknown\n try { row = context.get('dshSelfImprovementReview') } catch { return undefined }\n if (!row || typeof row !== 'object') return undefined\n const render = (row as { render?: unknown }).render\n if (typeof render !== 'function') return undefined\n return { render: render as (props: unknown) => ReactNode }\n}\n\nexport function MemorySettings({ client, host, props }: { client: Client; host?: unknown; props: unknown }) {\n const seat = useNativeSeat(client, props)\n const review = readSelfImprovementReview(host)\n return <div className=\"dsh-memory-settings-root\" data-testid=\"memory-settings-root\">\n <MemorySettingsPanel key={`settings:${memoryPanelKey(seat.sessionId, seat.locale)}`} client={client} sessionId={seat.sessionId} locale={seat.locale} />\n {review && seat.sessionId && !seat.hidden\n ? <details className=\"dsh-memory-si\" data-testid=\"self-improvement-entry\">\n <summary>{t(seat.locale, '自我改进', 'Self-improvement')}</summary>\n <div className=\"dsh-memory-si-body\">{review.render({ sessionId: seat.sessionId, locale: seat.locale })}</div>\n </details>\n : null}\n {seat.sessionId && !seat.hidden\n ? <MemoryChatPanel key={`manage:${memoryPanelKey(seat.sessionId, seat.locale)}`} client={client} sessionId={seat.sessionId} locale={seat.locale} />\n : <p className=\"dsh-memory-meta\">{t(seat.locale, '选择一个会话后可以管理该会话的记忆。', 'Select a session to manage its memory.')}</p>}\n </div>\n}\n\nconst styles = `\n.dsh-memory-settings-root,.dsh-memory-settings,.dsh-memory-chat{max-width:760px;color:inherit;font:400 var(--font-size-2,14px)/1.5 var(--default-font-family,system-ui,sans-serif)}\n.dsh-memory-settings-root,.dsh-memory-settings{display:grid;gap:16px}\n.dsh-memory-chat-body{display:grid;gap:12px;margin-top:8px}\n.dsh-memory-settings p,.dsh-memory-chat p{margin:0;line-height:1.5}\n.dsh-memory-meta,.dsh-memory-chat small{font-size:var(--font-size-1,13px);color:var(--gray-11,inherit)}\n.dsh-memory-error{color:var(--red-11,#b42318)}\n.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}\n.dsh-memory-card header,.dsh-memory-chat-body header{display:flex;justify-content:space-between;gap:12px;align-items:center}\n.dsh-memory-card h3,.dsh-memory-add h4,.dsh-memory-dream h4{margin:0;font-size:var(--font-size-3,16px);font-weight:600}\n.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}\n.dsh-memory-settings input:focus,.dsh-memory-chat input:focus,.dsh-memory-chat textarea:focus,.dsh-memory-chat select:focus{border-color:var(--accent-9,#3b82f6);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent-9,#3b82f6) 25%,transparent)}\n.dsh-memory-settings button:not([role=\"switch\"]),.dsh-memory-chat button:not([role=\"switch\"]){min-height:34px;padding:6px 12px;border:1px solid color-mix(in srgb,currentColor 25%,transparent);border-radius:8px;background:transparent;color:inherit;cursor:pointer;font:inherit;justify-self:start;transition:background-color 150ms ease,color 150ms ease,border-color 150ms ease,box-shadow 150ms ease,transform 150ms ease}\n.dsh-memory-settings button:not([role=\"switch\"]):hover:not(:disabled),.dsh-memory-chat button:not([role=\"switch\"]):hover:not(:disabled){background:var(--gray-3,color-mix(in srgb,currentColor 6%,transparent));border-color:color-mix(in srgb,currentColor 35%,transparent)}\n.dsh-memory-settings button:not([role=\"switch\"]):active:not(:disabled),.dsh-memory-chat button:not([role=\"switch\"]):active:not(:disabled){transform:scale(.97)}\n.dsh-memory-danger:hover:not(:disabled){border-color:var(--red-11,#b42318);color:var(--red-11,#b42318);background:color-mix(in srgb,var(--red-11,#b42318) 8%,transparent)}\n.dsh-memory-settings button:disabled,.dsh-memory-chat button:disabled{opacity:.45;cursor:not-allowed}\n.dsh-memory-settings .dsh-memory-switch,.dsh-memory-chat .dsh-memory-switch{all:unset;box-sizing:border-box;position:relative;display:inline-block;width:36px;height:20px;flex:none;border-radius:999px;background:var(--gray-7,color-mix(in srgb,currentColor 28%,transparent));cursor:pointer}\n.dsh-memory-switch.is-on{background:var(--accent-9,#3b82f6)}\n.dsh-memory-switch-thumb{position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:999px;background:#fff;transition:transform 150ms ease}\n.dsh-memory-switch.is-on .dsh-memory-switch-thumb{transform:translateX(16px)}\n.dsh-memory-settings :focus-visible,.dsh-memory-chat :focus-visible{outline:2px solid var(--accent-9,currentColor);outline-offset:3px}\n.dsh-memory-list{list-style:none;margin:0;padding:0;display:grid;gap:12px}\n.dsh-memory-list li{display:grid;gap:6px;padding:10px 4px;border-top:1px solid var(--gray-6,color-mix(in srgb,currentColor 15%,transparent));border-radius:10px;overflow-wrap:anywhere}\n.dsh-memory-row-actions{display:flex;flex-wrap:wrap;gap:8px}\n.dsh-memory-check{display:flex;gap:8px;align-items:center}\n.dsh-memory-check input{width:auto}\n.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}\n.dsh-memory-si-body{margin-top:8px}\n@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}}\n`\n\nexport function apply(ctx: Context): void {\n const client = ctx as unknown as Client\n ctx.effect(() => {\n if (typeof document === 'undefined') return () => {}\n const style = document.createElement('style')\n style.setAttribute('data-plugin', '@klarkxy/dsh-memory')\n style.textContent = styles\n document.head.appendChild(style)\n return () => style.remove()\n }, 'dsh-memory.styles')\n ctx.effect(() => client.slots.inject('settings.section', () => client.slots.register({\n name: 'settings.section', id: 'memory', order: 65, label: '记忆',\n }, (props: unknown) => <MemorySettings client={client} host={ctx} props={props} />)), 'dsh-memory.settings')\n}\n"],"mappings":"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"}