@lemoncat7/dsh-partner 1.11.2 → 1.12.0

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.
Files changed (115) hide show
  1. package/README.md +13 -1
  2. package/docs/memory-quality.md +115 -0
  3. package/docs/releases/1.12.0.md +25 -0
  4. package/lib/agent-runtime.d.ts +1 -1
  5. package/lib/agent-runtime.d.ts.map +1 -1
  6. package/lib/agent-runtime.js +16 -11
  7. package/lib/agent-runtime.js.map +1 -1
  8. package/lib/api/features/memory-layers-api.d.ts +5 -0
  9. package/lib/api/features/memory-layers-api.d.ts.map +1 -0
  10. package/lib/api/features/memory-layers-api.js +42 -0
  11. package/lib/api/features/memory-layers-api.js.map +1 -0
  12. package/lib/api.d.ts.map +1 -1
  13. package/lib/api.js +5 -1
  14. package/lib/api.js.map +1 -1
  15. package/lib/client-api.d.ts +2 -0
  16. package/lib/client-api.d.ts.map +1 -1
  17. package/lib/client.d.ts.map +1 -1
  18. package/lib/client.js +2894 -2553
  19. package/lib/client.js.map +4 -4
  20. package/lib/concern-store.d.ts +1 -0
  21. package/lib/concern-store.d.ts.map +1 -1
  22. package/lib/concern-store.js +17 -0
  23. package/lib/concern-store.js.map +1 -1
  24. package/lib/daily-review.d.ts +1 -0
  25. package/lib/daily-review.d.ts.map +1 -1
  26. package/lib/daily-review.js +14 -3
  27. package/lib/daily-review.js.map +1 -1
  28. package/lib/index.d.ts.map +1 -1
  29. package/lib/index.js +13 -0
  30. package/lib/index.js.map +1 -1
  31. package/lib/memory-artifacts.d.ts +42 -0
  32. package/lib/memory-artifacts.d.ts.map +1 -0
  33. package/lib/memory-artifacts.js +120 -0
  34. package/lib/memory-artifacts.js.map +1 -0
  35. package/lib/memory-domain.d.ts +10 -0
  36. package/lib/memory-domain.d.ts.map +1 -1
  37. package/lib/memory-journal.d.ts +16 -0
  38. package/lib/memory-journal.d.ts.map +1 -0
  39. package/lib/memory-journal.js +51 -0
  40. package/lib/memory-journal.js.map +1 -0
  41. package/lib/memory-prompt-context.d.ts.map +1 -1
  42. package/lib/memory-prompt-context.js +2 -1
  43. package/lib/memory-prompt-context.js.map +1 -1
  44. package/lib/memory-quality.d.ts +4 -0
  45. package/lib/memory-quality.d.ts.map +1 -0
  46. package/lib/memory-quality.js +16 -0
  47. package/lib/memory-quality.js.map +1 -0
  48. package/lib/memory-reflection.d.ts +15 -2
  49. package/lib/memory-reflection.d.ts.map +1 -1
  50. package/lib/memory-reflection.js +101 -17
  51. package/lib/memory-reflection.js.map +1 -1
  52. package/lib/memory-retrieval.d.ts +5 -0
  53. package/lib/memory-retrieval.d.ts.map +1 -0
  54. package/lib/memory-retrieval.js +20 -0
  55. package/lib/memory-retrieval.js.map +1 -0
  56. package/lib/memory-store.d.ts +26 -2
  57. package/lib/memory-store.d.ts.map +1 -1
  58. package/lib/memory-store.js +142 -50
  59. package/lib/memory-store.js.map +1 -1
  60. package/lib/memory-worker.d.ts +25 -0
  61. package/lib/memory-worker.d.ts.map +1 -0
  62. package/lib/memory-worker.js +42 -0
  63. package/lib/memory-worker.js.map +1 -0
  64. package/lib/profile-domain.d.ts.map +1 -1
  65. package/lib/profile-domain.js +12 -4
  66. package/lib/profile-domain.js.map +1 -1
  67. package/lib/ui/memory/automation-settings.d.ts +8 -0
  68. package/lib/ui/memory/automation-settings.d.ts.map +1 -0
  69. package/lib/ui/memory/automation-settings.js +60 -0
  70. package/lib/ui/memory/automation-settings.js.map +1 -0
  71. package/lib/ui/memory/concern-board.d.ts +12 -0
  72. package/lib/ui/memory/concern-board.d.ts.map +1 -0
  73. package/lib/ui/memory/concern-board.js +129 -0
  74. package/lib/ui/memory/concern-board.js.map +1 -0
  75. package/lib/ui/memory/concern-panel.d.ts +7 -0
  76. package/lib/ui/memory/concern-panel.d.ts.map +1 -0
  77. package/lib/ui/memory/concern-panel.js +62 -0
  78. package/lib/ui/memory/concern-panel.js.map +1 -0
  79. package/lib/ui/memory/experience-view.d.ts +8 -0
  80. package/lib/ui/memory/experience-view.d.ts.map +1 -0
  81. package/lib/ui/memory/experience-view.js +52 -0
  82. package/lib/ui/memory/experience-view.js.map +1 -0
  83. package/lib/ui/memory/history-view.d.ts +6 -0
  84. package/lib/ui/memory/history-view.d.ts.map +1 -0
  85. package/lib/ui/memory/history-view.js +40 -0
  86. package/lib/ui/memory/history-view.js.map +1 -0
  87. package/lib/ui/memory/memory-cards.d.ts +14 -0
  88. package/lib/ui/memory/memory-cards.d.ts.map +1 -0
  89. package/lib/ui/memory/memory-cards.js +17 -0
  90. package/lib/ui/memory/memory-cards.js.map +1 -0
  91. package/lib/ui/memory/memory-detail.d.ts +8 -0
  92. package/lib/ui/memory/memory-detail.d.ts.map +1 -0
  93. package/lib/ui/memory/memory-detail.js +45 -0
  94. package/lib/ui/memory/memory-detail.js.map +1 -0
  95. package/lib/ui/memory/memory-graph.d.ts +8 -0
  96. package/lib/ui/memory/memory-graph.d.ts.map +1 -0
  97. package/lib/ui/memory/memory-graph.js +43 -0
  98. package/lib/ui/memory/memory-graph.js.map +1 -0
  99. package/lib/ui/memory/memory-library.d.ts +9 -0
  100. package/lib/ui/memory/memory-library.d.ts.map +1 -0
  101. package/lib/ui/memory/memory-library.js +38 -0
  102. package/lib/ui/memory/memory-library.js.map +1 -0
  103. package/lib/ui/memory/memory-panel.d.ts +10 -0
  104. package/lib/ui/memory/memory-panel.d.ts.map +1 -0
  105. package/lib/ui/memory/memory-panel.js +48 -0
  106. package/lib/ui/memory/memory-panel.js.map +1 -0
  107. package/lib/ui/memory/types.d.ts +44 -0
  108. package/lib/ui/memory/types.d.ts.map +1 -0
  109. package/lib/ui/memory/types.js +2 -0
  110. package/lib/ui/memory/types.js.map +1 -0
  111. package/lib/ui/memory/use-memory-resource.d.ts +9 -0
  112. package/lib/ui/memory/use-memory-resource.d.ts.map +1 -0
  113. package/lib/ui/memory/use-memory-resource.js +65 -0
  114. package/lib/ui/memory/use-memory-resource.js.map +1 -0
  115. package/package.json +3 -1
@@ -0,0 +1,129 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useId, useRef, useState } from 'react';
3
+ import { IconCheckOutline14, IconChevronDownOutline14, IconPlusOutline16, IconLinkOutline16, IconDataOutline16 } from '@deepseek-ai/dsh-client-ui-primitives';
4
+ import { api } from '../../client-api.js';
5
+ import { futureTime } from '../../time-format.js';
6
+ import { errorMessage as message } from '../workspace-components.js';
7
+ export function ConcernBoard({ companionId, activity, value, busy, onValue, onAdd, onCheck, onAct }) {
8
+ const visible = activity.concerns.filter(item => item.state !== 'archived');
9
+ const active = visible.filter(item => item.state !== 'resolved');
10
+ const resolved = visible.filter(item => item.state === 'resolved');
11
+ const latest = new Map([...activity.observations].reverse().map(item => [item.concernId, item]));
12
+ const [composing, setComposing] = useState(false);
13
+ const [expandedId, setExpandedId] = useState();
14
+ const [visibleCount, setVisibleCount] = useState(5);
15
+ const [mention, setMention] = useState();
16
+ const [sources, setSources] = useState([]);
17
+ const [sourcesLoading, setSourcesLoading] = useState(false);
18
+ const [sourceError, setSourceError] = useState();
19
+ const [activeSource, setActiveSource] = useState(0);
20
+ const inputRef = useRef(null);
21
+ const listboxId = useId();
22
+ const shown = active.slice(0, visibleCount);
23
+ const suggestionsOpen = composing && mention !== undefined;
24
+ useEffect(() => {
25
+ if (!suggestionsOpen || mention === undefined) {
26
+ setSources([]);
27
+ setSourcesLoading(false);
28
+ setSourceError(undefined);
29
+ return;
30
+ }
31
+ const controller = new AbortController();
32
+ const timer = window.setTimeout(() => {
33
+ setSourcesLoading(true);
34
+ setSourceError(undefined);
35
+ const params = new URLSearchParams({ q: mention.query });
36
+ void api(`/companions/${encodeURIComponent(companionId)}/concern-sources?${params}`, { signal: controller.signal }).then(result => {
37
+ if (!controller.signal.aborted) {
38
+ setSources(result.items);
39
+ setActiveSource(0);
40
+ }
41
+ }).catch(reason => {
42
+ if (!controller.signal.aborted) {
43
+ setSources([]);
44
+ setSourceError(message(reason));
45
+ }
46
+ }).finally(() => { if (!controller.signal.aborted)
47
+ setSourcesLoading(false); });
48
+ }, 150);
49
+ return () => { window.clearTimeout(timer); controller.abort(); };
50
+ }, [companionId, mention?.query, suggestionsOpen]);
51
+ const submit = (event) => { event.preventDefault(); onAdd(); setComposing(false); setMention(undefined); };
52
+ const chooseSource = (source) => {
53
+ if (mention === undefined)
54
+ return;
55
+ const next = `${value.slice(0, mention.start)}${source.token} ${value.slice(mention.end)}`;
56
+ const cursor = mention.start + source.token.length + 1;
57
+ onValue(next);
58
+ setMention(undefined);
59
+ setSources([]);
60
+ window.requestAnimationFrame(() => { inputRef.current?.focus(); inputRef.current?.setSelectionRange(cursor, cursor); });
61
+ };
62
+ return _jsxs("section", { className: "dsh-partner-concern-board", "aria-labelledby": "partner-concerns-title", children: [_jsxs("header", { children: [_jsxs("span", { children: [_jsxs("strong", { id: "partner-concerns-title", children: ["\u4F19\u4F34\u5728\u610F\u7684\u4E8B ", _jsx("b", { children: active.length })] }), _jsx("p", { children: "\u5C1A\u672A\u95ED\u73AF\u3001\u503C\u5F97\u7EE7\u7EED\u7559\u610F\u7684\u4E8B\u60C5" })] }), _jsxs("button", { type: "button", "aria-expanded": composing, onClick: () => setComposing(current => !current), children: [_jsx(IconPlusOutline16, { size: 14 }), "\u4EA4\u4EE3\u4E00\u4EF6\u4E8B"] })] }), composing && _jsxs("form", { className: "dsh-partner-concern-compose", onSubmit: submit, children: [_jsxs("label", { children: [_jsx("span", { children: "\u9700\u8981\u7559\u610F\u7684\u4E8B" }), _jsxs("div", { className: "dsh-partner-concern-input-wrap", children: [_jsx("input", { ref: inputRef, autoFocus: true, value: value, maxLength: 300, placeholder: "\u8F93\u5165 @ \u9009\u62E9\u6587\u4EF6\u6216\u77E5\u8BC6\u6587\u6863", role: "combobox", "aria-autocomplete": "list", "aria-expanded": suggestionsOpen, "aria-controls": suggestionsOpen ? listboxId : undefined, "aria-activedescendant": suggestionsOpen && sources[activeSource] ? `${listboxId}-option-${activeSource}` : undefined, onChange: event => { onValue(event.target.value); setMention(activeMention(event.target.value, event.target.selectionStart ?? event.target.value.length)); }, onClick: event => setMention(activeMention(event.currentTarget.value, event.currentTarget.selectionStart ?? event.currentTarget.value.length)), onKeyDown: event => {
63
+ if (!suggestionsOpen)
64
+ return;
65
+ if (event.key === 'ArrowDown') {
66
+ event.preventDefault();
67
+ setActiveSource(index => sources.length === 0 ? 0 : (index + 1) % sources.length);
68
+ }
69
+ else if (event.key === 'ArrowUp') {
70
+ event.preventDefault();
71
+ setActiveSource(index => sources.length === 0 ? 0 : (index - 1 + sources.length) % sources.length);
72
+ }
73
+ else if (event.key === 'Enter' && sources[activeSource]) {
74
+ event.preventDefault();
75
+ chooseSource(sources[activeSource]);
76
+ }
77
+ else if (event.key === 'Escape') {
78
+ event.preventDefault();
79
+ setMention(undefined);
80
+ }
81
+ } }), suggestionsOpen && _jsx("div", { id: listboxId, className: "dsh-partner-concern-sources", role: "listbox", "aria-label": "\u53EF\u5F15\u7528\u7684\u6587\u4EF6\u4E0E\u77E5\u8BC6\u6587\u6863", children: sourcesLoading ? _jsx("p", { role: "status", children: "\u6B63\u5728\u67E5\u627E\u53EF\u5F15\u7528\u5185\u5BB9\u2026" }) : sourceError ? _jsxs("p", { role: "status", children: ["\u5019\u9009\u52A0\u8F7D\u5931\u8D25\uFF1A", sourceError] }) : sources.length === 0 ? _jsx("p", { role: "status", children: "\u6CA1\u6709\u627E\u5230\u5339\u914D\u7684\u6587\u4EF6\u6216\u5DF2\u6302\u8F7D\u77E5\u8BC6\u6587\u6863" }) : _jsx(_Fragment, { children: sources.map((source, index) => _jsxs("button", { type: "button", role: "option", id: `${listboxId}-option-${index}`, "aria-selected": index === activeSource, "data-kind": source.kind, onMouseDown: event => event.preventDefault(), onMouseEnter: () => setActiveSource(index), onClick: () => chooseSource(source), children: [_jsx("span", { children: source.kind === 'file' ? _jsx(IconDataOutline16, { size: 15 }) : _jsx(IconLinkOutline16, { size: 15 }) }), _jsx("strong", { children: source.label }), _jsx("small", { children: source.detail })] }, `${source.kind}:${source.token}`)) }) })] }), _jsxs("small", { className: "dsh-partner-concern-compose-hint", children: ["\u8F93\u5165 ", _jsx("b", { children: "@" }), " \u4F1A\u5217\u51FA\u5F53\u524D\u4F1A\u8BDD\u6587\u4EF6\u548C\u5DF2\u6302\u8F7D\u7684\u77E5\u8BC6\u6587\u6863\uFF0C\u4E5F\u53EF\u4EE5\u7EE7\u7EED\u8F93\u5165\u5173\u952E\u8BCD\u7B5B\u9009\u3002"] })] }), _jsxs("div", { children: [_jsx("button", { type: "button", onClick: () => { setComposing(false); setMention(undefined); onValue(''); }, children: "\u53D6\u6D88" }), _jsx("button", { type: "submit", className: "is-primary", disabled: busy || !value.trim(), children: "\u8BA9\u4F19\u4F34\u8BB0\u7740" })] })] }), _jsx("div", { className: "dsh-partner-concern-list", role: "list", children: active.length === 0 ? _jsx("p", { className: "dsh-partner-concern-empty", children: "\u6700\u8FD1\u6CA1\u6709\u672A\u95ED\u73AF\u7684\u4E8B\u3002\u4F60\u4E5F\u53EF\u4EE5\u76F4\u63A5\u5BF9\u4F19\u4F34\u8BF4\u201C\u8FD9\u4E2A\u5E2E\u6211\u7559\u610F\u201D\u3002" }) : shown.map(item => {
82
+ const observation = latest.get(item.id);
83
+ const expanded = expandedId === item.id;
84
+ const status = observation ? concernObservationStatus(observation) : item.state === 'active' ? '正在留意' : '暂时记着';
85
+ return _jsxs("article", { role: "listitem", "data-state": item.state, "data-expanded": expanded, children: [_jsxs("button", { type: "button", className: "dsh-partner-concern-row", "aria-expanded": expanded, onClick: () => setExpandedId(current => current === item.id ? undefined : item.id), children: [_jsxs("span", { className: "dsh-partner-concern-state", children: [_jsx("i", {}), status] }), _jsxs("span", { className: "dsh-partner-concern-copy", children: [_jsx("strong", { children: item.subject }), _jsx("small", { children: observation ? observation.event : item.reason })] }), _jsxs("span", { className: "dsh-partner-concern-time", title: `计划于 ${new Date(item.nextCheckAt).toLocaleString()} 再次留意`, children: [_jsx("small", { children: "\u4E0B\u6B21\u7559\u610F" }), _jsx("strong", { children: futureTime(item.nextCheckAt) })] }), _jsx(IconChevronDownOutline14, { size: 14 })] }), expanded && _jsxs("div", { className: "dsh-partner-concern-detail", children: [_jsx("p", { children: item.reason }), observation && _jsxs(_Fragment, { children: [_jsx("blockquote", { children: observation.event }), _jsxs("div", { className: "dsh-partner-concern-decision", "data-decision": observation.decision, children: [_jsx("strong", { children: concernObservationStatus(observation) }), _jsx("span", { children: observation.decisionReason || concernObservationExplanation(observation) }), _jsxs("small", { children: ["\u6253\u6270\u5206\u6570 ", Math.round(observation.interruptScore * 100), observation.notificationRuleEffect !== 'auto' && observation.notificationRuleReason ? ` · 知识规则:${observation.notificationRuleReason}` : ''] })] })] }), item.resources.length > 0 && _jsx("div", { className: "dsh-partner-concern-resources", children: item.resources.map(resource => _jsxs("span", { children: [resource.kind === 'file' ? '文件' : '知识', " \u00B7 ", resource.label] }, `${resource.kind}:${resource.locator}`)) }), _jsxs("small", { children: [item.origin === 'explicit' ? '你明确交代' : '伙伴从对话中注意到', " \u00B7 ", watchKindLabel(item.watchKind)] }), _jsxs("div", { className: "dsh-partner-concern-actions", "aria-label": `${item.subject} 的操作`, children: [_jsx("button", { type: "button", disabled: busy, onClick: () => onCheck(item), children: "\u7ACB\u5373\u68C0\u67E5\u8FD9\u6761" }), _jsx("button", { type: "button", disabled: busy, onClick: () => onAct(item, 'watch'), children: "\u7EE7\u7EED\u7559\u610F" }), _jsx("button", { type: "button", disabled: busy, onClick: () => onAct(item, 'prioritize'), children: "\u63D0\u9AD8\u5173\u6CE8" }), _jsx("button", { type: "button", disabled: busy, onClick: () => onAct(item, 'resolve'), children: "\u5DF2\u7ECF\u89E3\u51B3" }), _jsx("button", { type: "button", className: "is-danger", disabled: busy, onClick: () => onAct(item, 'ignore'), children: "\u522B\u7BA1\u8FD9\u4E2A" })] })] })] }, item.id);
86
+ }) }), (active.length > shown.length || visibleCount > 5) && _jsx("div", { className: "dsh-partner-concern-more", children: active.length > shown.length ? _jsxs("button", { type: "button", onClick: () => setVisibleCount(count => Math.min(active.length, count + 20)), children: ["\u518D\u663E\u793A ", Math.min(20, active.length - shown.length), " \u6761"] }) : _jsx("button", { type: "button", onClick: () => setVisibleCount(5), children: "\u6536\u8D77\u5217\u8868" }) }), resolved.length > 0 && _jsxs("details", { className: "dsh-partner-concern-resolved", children: [_jsxs("summary", { children: ["\u5DF2\u7ECF\u89E3\u51B3 ", _jsx("b", { children: resolved.length })] }), _jsx("div", { children: resolved.slice(0, 30).map(item => _jsxs("article", { children: [_jsx("span", { children: _jsx(IconCheckOutline14, { size: 13 }) }), _jsx("strong", { children: item.subject }), _jsx("button", { type: "button", disabled: busy, onClick: () => onAct(item, 'watch'), children: "\u91CD\u65B0\u7559\u610F" })] }, item.id)) })] })] });
87
+ }
88
+ function activeMention(value, cursor) {
89
+ const prefix = value.slice(0, cursor);
90
+ const start = prefix.lastIndexOf('@');
91
+ if (start < 0 || (start > 0 && !/\s/u.test(prefix[start - 1] ?? '')))
92
+ return undefined;
93
+ const fragment = prefix.slice(start + 1);
94
+ if (fragment.startsWith('知识库[')) {
95
+ if (fragment.includes(']'))
96
+ return undefined;
97
+ return { start, end: cursor, query: fragment.slice(4) };
98
+ }
99
+ if (fragment.startsWith('"')) {
100
+ if (fragment.slice(1).includes('"'))
101
+ return undefined;
102
+ return { start, end: cursor, query: fragment.slice(1) };
103
+ }
104
+ if (/\s/u.test(fragment))
105
+ return undefined;
106
+ return { start, end: cursor, query: fragment };
107
+ }
108
+ function watchKindLabel(value) {
109
+ return value === 'knowledge' ? '知识库变化' : value === 'workspace' ? '项目变化' : value === 'web' ? '外部变化' : '按事情判断来源';
110
+ }
111
+ function concernObservationStatus(item) {
112
+ if (item.decision === 'notify')
113
+ return item.mentionedAt === undefined ? '待提醒' : '已提醒';
114
+ if (item.decision === 'feed')
115
+ return '伙伴动态';
116
+ if (item.decision === 'defer')
117
+ return item.mentionedAt === undefined ? '待顺带提' : '已顺带提';
118
+ return '静默记下';
119
+ }
120
+ function concernObservationExplanation(item) {
121
+ if (item.decision === 'notify')
122
+ return item.mentionedAt === undefined ? '达到主动提醒条件,等待渠道投递' : '已经通过批准的渠道主动提醒';
123
+ if (item.decision === 'feed')
124
+ return '只显示在伙伴动态,不会自动转成主动提醒';
125
+ if (item.decision === 'defer')
126
+ return item.mentionedAt === undefined ? '下次出现相关对话时顺带提及' : '已经在相关对话中顺带提及';
127
+ return '仅保留为观察记录,不打扰你';
128
+ }
129
+ //# sourceMappingURL=concern-board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern-board.js","sourceRoot":"","sources":["../../../src/ui/memory/concern-board.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type CompanionView, type PartnerSnapshot } from '../../client-api.js';
2
+ export declare function ConcernPanel({ companion, snapshot, onChanged }: {
3
+ companion: CompanionView;
4
+ snapshot: PartnerSnapshot;
5
+ onChanged(): Promise<void>;
6
+ }): JSX.Element;
7
+ //# sourceMappingURL=concern-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern-panel.d.ts","sourceRoot":"","sources":["../../../src/ui/memory/concern-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAM,KAAK,aAAa,EAAE,KAAK,eAAe,EAA6C,MAAM,qBAAqB,CAAA;AAO7H,wBAAgB,YAAY,CAAC,EAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAC,EAAE;IAAC,SAAS,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAC;IAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAC,GAAG,GAAG,CAAC,OAAO,CAsC7J"}
@@ -0,0 +1,62 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useRef, useState } from 'react';
3
+ import { IconRefreshOutline16 } from '@deepseek-ai/dsh-client-ui-primitives';
4
+ import { api } from '../../client-api.js';
5
+ import { WorkspaceHero, WorkspaceNotice, CollectionEmpty, errorMessage } from '../workspace-components.js';
6
+ import { relativeTime } from '../partner-components.js';
7
+ import { useMemoryResource } from './use-memory-resource.js';
8
+ import { AutomationSettings } from './automation-settings.js';
9
+ import { ConcernBoard } from './concern-board.js';
10
+ export function ConcernPanel({ companion, snapshot, onChanged }) {
11
+ const base = `/companions/${encodeURIComponent(companion.id)}`;
12
+ const resource = useMemoryResource(`${base}/concerns`, 15_000);
13
+ const [settings, setSettings] = useState(false);
14
+ const [value, setValue] = useState('');
15
+ const [busy, setBusy] = useState(false);
16
+ const lock = useRef(false);
17
+ const [notice, setNotice] = useState();
18
+ const [error, setError] = useState();
19
+ const heartbeat = snapshot.heartbeatStates.find(item => item.companionId === companion.id);
20
+ const run = async (action) => {
21
+ if (lock.current)
22
+ return;
23
+ lock.current = true;
24
+ setBusy(true);
25
+ setError(undefined);
26
+ setNotice(undefined);
27
+ try {
28
+ setNotice(await action());
29
+ await resource.reload();
30
+ }
31
+ catch (reason) {
32
+ setError(errorMessage(reason));
33
+ }
34
+ finally {
35
+ lock.current = false;
36
+ setBusy(false);
37
+ }
38
+ };
39
+ const check = (concernId) => {
40
+ void run(async () => {
41
+ const result = await api(`${base}/heartbeat/trigger`, { method: 'POST', body: JSON.stringify(concernId ? { concernId } : {}) });
42
+ await onChanged();
43
+ return result.sent ? '检查完成,已发送提醒' : result.reason ?? '检查完成';
44
+ });
45
+ };
46
+ const act = (item, action) => {
47
+ void run(async () => {
48
+ await api(`${base}/concerns/${encodeURIComponent(item.id)}/action`, { method: 'POST', body: JSON.stringify({ action }) });
49
+ return ({ watch: '已恢复留意', ignore: '不再关注这件事', prioritize: '已提高关注', resolve: '已标记解决' })[action];
50
+ });
51
+ };
52
+ return _jsxs("div", { className: "dsh-partner-memory-page is-concerns", children: [_jsx(WorkspaceHero, { eyebrow: "ONGOING WATCHES", title: "\u6301\u7EED\u5173\u6CE8", detail: "\u53EA\u7559\u610F\u9700\u8981\u7EE7\u7EED\u89C2\u5BDF\u7684\u4E8B\uFF0C\u6709\u503C\u5F97\u544A\u8BC9\u4F60\u7684\u53D8\u5316\u65F6\u518D\u51FA\u73B0\u3002", actions: _jsxs(_Fragment, { children: [_jsx("button", { type: "button", disabled: busy, onClick: () => check(), children: "\u68C0\u67E5\u5230\u671F\u9879" }), _jsx("button", { type: "button", onClick: () => setSettings(true), children: "\u5173\u6CE8\u8BBE\u7F6E" })] }) }), _jsxs("div", { className: "dsh-partner-memory-status", children: [_jsx("span", { children: companion.automation.heartbeat.enabled ? '持续感知已开启' : '持续感知已暂停' }), _jsxs("small", { children: ["\u6700\u8FD1\u68C0\u67E5\uFF1A", heartbeat?.lastCheckedAt ? relativeTime(heartbeat.lastCheckedAt) : '尚未', " \u00B7 \u4ECA\u65E5\u63D0\u9192 ", heartbeat?.sentCount ?? 0, " \u6B21"] }), _jsx("button", { type: "button", disabled: resource.loading, "aria-label": "\u5237\u65B0\u5173\u6CE8", onClick: () => { void resource.reload(); }, children: _jsx(IconRefreshOutline16, { size: 16 }) })] }), (error || resource.error || heartbeat?.lastError) && _jsx(WorkspaceNotice, { children: error || resource.error || heartbeat?.lastError }), notice && _jsx(WorkspaceNotice, { kind: "success", children: notice }), !resource.data ? _jsx(CollectionEmpty, { title: resource.error ? '关注读取失败' : '正在读取关注', action: resource.error ? _jsx("button", { type: "button", onClick: () => { void resource.reload(); }, children: "\u91CD\u8BD5" }) : undefined }) : _jsx(ConcernBoard, { companionId: companion.id, activity: resource.data, value: value, busy: busy, onValue: setValue, onCheck: item => check(item.id), onAct: act, onAdd: () => {
53
+ void run(async () => {
54
+ if (!value.trim())
55
+ return '请填写需要持续关注的事情';
56
+ await api(`${base}/concerns`, { method: 'POST', body: JSON.stringify({ subject: value.trim() }) });
57
+ setValue('');
58
+ return '已加入持续关注';
59
+ });
60
+ } }), settings && _jsx(AutomationSettings, { companion: companion, kind: "heartbeat", close: () => setSettings(false), onChanged: onChanged })] });
61
+ }
62
+ //# sourceMappingURL=concern-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concern-panel.js","sourceRoot":"","sources":["../../../src/ui/memory/concern-panel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ExperienceView as Draft } from './types.js';
2
+ export declare function ExperienceView({ items, base, scopeId, changed }: {
3
+ items: Draft[];
4
+ base: string;
5
+ scopeId: string;
6
+ changed(): Promise<void>;
7
+ }): JSX.Element;
8
+ //# sourceMappingURL=experience-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experience-view.d.ts","sourceRoot":"","sources":["../../../src/ui/memory/experience-view.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,cAAc,IAAI,KAAK,EAAC,MAAM,YAAY,CAAA;AAEvD,wBAAgB,cAAc,CAAC,EAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAC,EAAE;IAAC,KAAK,EAAE,KAAK,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAC,GAAG,GAAG,CAAC,OAAO,CAwCtJ"}
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useRef, useState } from 'react';
3
+ import { api } from '../../client-api.js';
4
+ import { WorkspaceDialog, WorkspaceNotice, CollectionEmpty, errorMessage } from '../workspace-components.js';
5
+ export function ExperienceView({ items, base, scopeId, changed }) {
6
+ const [selected, setSelected] = useState();
7
+ const [busy, setBusy] = useState(false);
8
+ const lock = useRef(false);
9
+ const [error, setError] = useState();
10
+ const [notice, setNotice] = useState();
11
+ const [filter, setFilter] = useState('draft');
12
+ const item = items.find(entry => entry.id === selected);
13
+ const review = async (action) => {
14
+ if (!item || lock.current)
15
+ return;
16
+ lock.current = true;
17
+ setBusy(true);
18
+ setError(undefined);
19
+ const path = `${base}/memory/experiences/${encodeURIComponent(item.id)}?${new URLSearchParams({ scopeId })}`;
20
+ try {
21
+ if (action === 'export') {
22
+ const { document } = await api(path);
23
+ const url = URL.createObjectURL(new Blob([document], { type: 'text/markdown;charset=utf-8' }));
24
+ const anchor = window.document.createElement('a');
25
+ anchor.href = url;
26
+ anchor.download = `${item.id}.md`;
27
+ window.document.body.append(anchor);
28
+ anchor.click();
29
+ anchor.remove();
30
+ setTimeout(() => URL.revokeObjectURL(url), 1000);
31
+ setNotice('已导出草稿;不会自动安装或授权给伙伴');
32
+ }
33
+ else {
34
+ await api(path, { method: 'POST', body: JSON.stringify({ action, version: item.version }) });
35
+ setSelected(undefined);
36
+ setNotice(action === 'approved' ? '已通过审核,可在已通过列表中导出' : '已拒绝此草稿');
37
+ await changed();
38
+ }
39
+ }
40
+ catch (reason) {
41
+ setError(errorMessage(reason));
42
+ await changed();
43
+ }
44
+ finally {
45
+ lock.current = false;
46
+ setBusy(false);
47
+ }
48
+ };
49
+ return _jsxs(_Fragment, { children: [_jsx("p", { className: "dsh-partner-memory-hint", children: "\u4ECE\u6709\u6210\u529F\u4F9D\u636E\u7684\u7ECF\u5386\u4E2D\u63D0\u70BC\u3002\u5BA1\u6838\u901A\u8FC7\u540E\u4EC5\u5141\u8BB8\u5BFC\u51FA\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u5B89\u88C5 Skill\u3002" }), notice && _jsx(WorkspaceNotice, { kind: "success", children: notice }), _jsx("div", { className: "dsh-partner-memory-segment", "aria-label": "\u7ECF\u9A8C\u72B6\u6001", children: ['draft', 'approved', 'rejected'].map(status => _jsxs("button", { type: "button", "aria-pressed": filter === status, onClick: () => setFilter(status), children: [({ draft: '待审核', approved: '已通过', rejected: '已拒绝' })[status], " ", _jsx("small", { children: items.filter(draft => draft.status === status).length })] }, status)) }), _jsx("div", { className: "dsh-partner-memory-rows", children: items.filter(draft => draft.status === filter).map(draft => _jsxs("button", { className: "dsh-partner-memory-row", type: "button", onClick: () => { setSelected(draft.id); setError(undefined); }, children: [_jsxs("span", { children: [_jsx("strong", { children: draft.title }), _jsxs("small", { children: [draft.steps.length, " \u4E2A\u6B65\u9AA4 \u00B7 ", draft.evidence.length, " \u5904\u4F9D\u636E"] })] }), _jsx("small", { children: "\u67E5\u770B" })] }, draft.id)) }), !items.some(draft => draft.status === filter) && _jsx(CollectionEmpty, { title: "\u6CA1\u6709\u6B64\u72B6\u6001\u7684\u7ECF\u9A8C\u8349\u7A3F", detail: "\u53EA\u6709\u660E\u786E\u6210\u529F\u4E14\u53EF\u590D\u7528\u7684\u7ECF\u5386\u624D\u4F1A\u6210\u4E3A\u5019\u9009\uFF1B\u9700\u8981\u5F00\u542F\u6BCF\u65E5\u7EC8\u5BA1\u3002" }), item && _jsxs(WorkspaceDialog, { title: item.title, detail: "\u8BF7\u6838\u5BF9\u9002\u7528\u8303\u56F4\u3001\u64CD\u4F5C\u6B65\u9AA4\u53CA\u6210\u529F\u4F9D\u636E\uFF1B\u5386\u53F2\u6210\u529F\u4E0D\u4EE3\u8868\u6BCF\u6B21\u90FD\u9002\u7528\u3002", close: () => { if (!busy)
50
+ setSelected(undefined); }, children: [error && _jsx(WorkspaceNotice, { children: error }), _jsx("ol", { className: "dsh-partner-memory-procedure", children: item.steps.map((step, index) => _jsx("li", { children: step }, index)) }), _jsxs("details", { className: "dsh-partner-memory-record", children: [_jsxs("summary", { children: ["\u6210\u529F\u4F9D\u636E \u00B7 ", item.evidence.length] }), _jsx("div", { children: item.evidence.map(source => _jsxs("blockquote", { children: [_jsx("p", { children: source.quote }), _jsx("small", { children: source.turnId })] }, `${source.turnId}:${source.quote}`)) })] }), _jsx("footer", { className: "dsh-partner-memory-actions", children: item.status === 'draft' ? _jsxs(_Fragment, { children: [_jsx("button", { type: "button", disabled: busy, onClick: () => { void review('rejected'); }, children: "\u62D2\u7EDD" }), _jsx("button", { className: "is-primary", type: "button", disabled: busy, onClick: () => { void review('approved'); }, children: busy ? '处理中…' : '通过审核' })] }) : item.status === 'approved' ? _jsx("button", { type: "button", disabled: busy, onClick: () => { void review('export'); }, children: busy ? '导出中…' : '导出 Markdown' }) : _jsx("span", { children: "\u6B64\u8349\u7A3F\u5DF2\u62D2\u7EDD\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u542F\u7528\u3002" }) })] })] });
51
+ }
52
+ //# sourceMappingURL=experience-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experience-view.js","sourceRoot":"","sources":["../../../src/ui/memory/experience-view.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function HistoryView({ base, scopeId, query }: {
2
+ base: string;
3
+ scopeId: string;
4
+ query: string;
5
+ }): JSX.Element;
6
+ //# sourceMappingURL=history-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-view.d.ts","sourceRoot":"","sources":["../../../src/ui/memory/history-view.tsx"],"names":[],"mappings":"AAKA,wBAAgB,WAAW,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAC,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,GAAG,GAAG,CAAC,OAAO,CA4B/G"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from 'react';
3
+ import { api } from '../../client-api.js';
4
+ import { CollectionEmpty, WorkspaceNotice, errorMessage } from '../workspace-components.js';
5
+ export function HistoryView({ base, scopeId, query }) {
6
+ const [turns, setTurns] = useState([]);
7
+ const [loading, setLoading] = useState(false);
8
+ const [error, setError] = useState();
9
+ const [more, setMore] = useState(true);
10
+ const [page, setPage] = useState(0);
11
+ const cursor = useRef();
12
+ useEffect(() => {
13
+ const controller = new AbortController();
14
+ setLoading(true);
15
+ setError(undefined);
16
+ const params = new URLSearchParams({ scopeId });
17
+ if (cursor.current) {
18
+ params.set('before', String(cursor.current.at));
19
+ params.set('beforeId', cursor.current.id);
20
+ }
21
+ void api(`${base}/memory/history?${params}`, { signal: controller.signal }).then(items => {
22
+ if (controller.signal.aborted)
23
+ return;
24
+ setTurns(existing => [...new Map([...existing, ...items].map(turn => [turn.id, turn])).values()]);
25
+ setMore(items.length === 30);
26
+ cursor.current = items.at(-1) ?? cursor.current;
27
+ }).catch(reason => { if (!controller.signal.aborted)
28
+ setError(errorMessage(reason)); })
29
+ .finally(() => { if (!controller.signal.aborted)
30
+ setLoading(false); });
31
+ return () => controller.abort();
32
+ }, [base, scopeId, page]);
33
+ const filtered = turns.filter(turn => !query || `${turn.user} ${turn.assistant}`.toLocaleLowerCase().includes(query));
34
+ return _jsxs("div", { className: "dsh-partner-memory-records", children: [_jsx("p", { className: "dsh-partner-memory-hint", children: "\u663E\u793A\u65B0\u7248\u8BB0\u5FC6\u6D41\u7A0B\u8BB0\u5F55\u7684\u5BF9\u8BDD\uFF1B\u65E7\u8BB0\u5F55\u4ECD\u4FDD\u7559\u5728\u539F\u4F1A\u8BDD\u4E2D\u3002\u641C\u7D22\u4EC5\u7B5B\u9009\u5DF2\u52A0\u8F7D\u7684\u5185\u5BB9\u3002" }), error && _jsx(WorkspaceNotice, { children: error }), !filtered.length && _jsx(CollectionEmpty, { title: loading ? '正在读取历史' : '暂无匹配的历史记录' }), filtered.map(turn => _jsx(HistoryRecord, { turn: turn }, turn.id)), (more || error) && _jsx("button", { type: "button", disabled: loading, onClick: () => setPage(value => value + 1), children: loading ? '读取中…' : error ? '重试读取' : '加载更早的 30 轮' })] });
35
+ }
36
+ function HistoryRecord({ turn }) {
37
+ const [open, setOpen] = useState(false);
38
+ return _jsxs("details", { className: "dsh-partner-memory-record", onToggle: event => setOpen(event.currentTarget.open), children: [_jsxs("summary", { children: [_jsx("time", { children: new Date(turn.at).toLocaleString() }), _jsx("strong", { children: turn.user.slice(0, 120) })] }), open && _jsxs("div", { children: [_jsx("h3", { children: "\u7528\u6237\u539F\u8BDD" }), _jsx("p", { children: turn.user }), _jsx("h3", { children: "\u52A9\u624B\u5F53\u65F6\u7684\u56DE\u7B54" }), _jsx("p", { children: turn.assistant }), _jsx("small", { children: "\u5386\u53F2\u56DE\u7B54\u4E0D\u4EE3\u8868\u5F53\u524D\u5DF2\u9A8C\u8BC1\u7684\u4E8B\u5B9E\u3002" })] })] });
39
+ }
40
+ //# sourceMappingURL=history-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-view.js","sourceRoot":"","sources":["../../../src/ui/memory/history-view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAA;AACjD,OAAO,EAAC,GAAG,EAAC,MAAM,qBAAqB,CAAA;AACvC,OAAO,EAAC,eAAe,EAAE,eAAe,EAAE,YAAY,EAAC,MAAM,4BAA4B,CAAA;AAGzF,MAAM,UAAU,WAAW,CAAC,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAiD;IAChG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,EAAE,CAAC,CAAA;IACrD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAU,CAAA;IAC5C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACnC,MAAM,MAAM,GAAG,MAAM,EAAe,CAAA;IACpC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,UAAU,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAC,OAAO,EAAC,CAAC,CAAA;QAC7C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAAA,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAAA,CAAC;QAChH,KAAK,GAAG,CAAgB,GAAG,IAAI,mBAAmB,MAAM,EAAE,EAAE,EAAC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACpG,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAM;YACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YACjG,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;YAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAA;QAC/E,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;YAAE,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA,CAAA,CAAC,CAAC;aACjF,OAAO,CAAC,GAAG,EAAE,GAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;YAAE,UAAU,CAAC,KAAK,CAAC,CAAA,CAAA,CAAC,CAAC,CAAA;QACrE,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;IACjC,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;IACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IACrH,OAAO,eAAK,SAAS,EAAC,4BAA4B,aAChD,YAAG,SAAS,EAAC,yBAAyB,qPAA2C,EAChF,KAAK,IAAI,KAAC,eAAe,cAAE,KAAK,GAAmB,EACnD,CAAC,QAAQ,CAAC,MAAM,IAAI,KAAC,eAAe,IAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,GAAI,EAChF,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAC,aAAa,IAAe,IAAI,EAAE,IAAI,IAAnB,IAAI,CAAC,EAAE,CAAgB,CAAC,EACjE,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,iBAAQ,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,YAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,GAAU,IAChK,CAAA;AACR,CAAC;AAED,SAAS,aAAa,CAAC,EAAC,IAAI,EAAsB;IAChD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvC,OAAO,mBAAS,SAAS,EAAC,2BAA2B,EAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,aAAE,8BAAS,yBAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,GAAQ,EAAA,2BAAS,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAU,IAAU,EAAC,IAAI,IAAI,0BAAK,oDAAa,EAAA,sBAAI,IAAI,CAAC,IAAI,GAAK,EAAA,sEAAgB,EAAA,sBAAI,IAAI,CAAC,SAAS,GAAK,EAAA,+HAA+B,IAAM,IAAW,CAAA;AAChW,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { MemoryView, DailyReflectionView } from '../../client-api.js';
2
+ export declare function DailyReflectionDetail({ entry }: {
3
+ entry: DailyReflectionView;
4
+ }): JSX.Element;
5
+ export declare function MemoryCard({ item, editing, busy, setEditing, save, remove }: {
6
+ item: MemoryView;
7
+ editing: MemoryView | undefined;
8
+ busy: boolean;
9
+ setEditing(value?: MemoryView): void;
10
+ save(): void;
11
+ remove(): void;
12
+ }): JSX.Element;
13
+ export declare function memoryKind(value: MemoryView['kind']): string;
14
+ //# sourceMappingURL=memory-cards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-cards.d.ts","sourceRoot":"","sources":["../../../src/ui/memory/memory-cards.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAE,mBAAmB,EAAC,MAAM,qBAAqB,CAAA;AAExE,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,mBAAmB,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAE5F;AAOD,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAAC,IAAI,IAAI,IAAI,CAAC;IAAC,MAAM,IAAI,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAYnO;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,MAAM,CAAsH"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { relativeTime } from '../partner-components.js';
4
+ export function DailyReflectionDetail({ entry }) {
5
+ return _jsxs("article", { className: "dsh-partner-diary-detail", children: [_jsxs("header", { children: [_jsx("time", { children: entry.date }), _jsxs("strong", { children: [entry.turnCount, " \u8F6E\u4EA4\u6D41\u540E\u7684\u7406\u89E3"] }), _jsxs("small", { children: ["\u66F4\u65B0\u4E8E ", new Date(entry.updatedAt).toLocaleString()] })] }), _jsx("p", { children: entry.summary }), _jsx(ReflectionGroup, { title: "\u5F85\u8DDF\u8FDB", items: entry.openTasks }), _jsx(ReflectionGroup, { title: "\u5F53\u5929\u4E8B\u4EF6", items: entry.events }), _jsx(ReflectionGroup, { title: "\u65B0\u7406\u89E3", items: entry.learnings }), _jsx(ReflectionGroup, { title: "\u5DF2\u5B8C\u6210", items: entry.completedTasks })] });
6
+ }
7
+ function ReflectionGroup({ title, items }) {
8
+ if (items.length === 0)
9
+ return null;
10
+ return _jsxs("section", { children: [_jsx("strong", { children: title }), _jsx("ul", { children: items.map(item => _jsx("li", { children: item }, item)) })] });
11
+ }
12
+ export function MemoryCard({ item, editing, busy, setEditing, save, remove }) {
13
+ const [confirmingRemove, setConfirmingRemove] = useState(false);
14
+ return _jsx("article", { "data-kind": item.kind, children: editing ? _jsxs("div", { className: "dsh-partner-memory-editor", children: [_jsx("input", { "aria-label": "\u8BB0\u5FC6\u4E3B\u9898", value: editing.subject, onChange: event => setEditing({ ...editing, subject: event.target.value }) }), _jsx("textarea", { "aria-label": "\u8BB0\u5FC6\u5185\u5BB9", value: editing.content, onChange: event => setEditing({ ...editing, content: event.target.value }) }), _jsxs("footer", { children: [_jsx("button", { type: "button", onClick: () => setEditing(undefined), children: "\u53D6\u6D88" }), _jsx("button", { type: "button", className: "is-primary", disabled: busy || !editing.subject.trim() || !editing.content.trim(), onClick: save, children: "\u4FDD\u5B58\u4FEE\u6B63" })] })] }) : _jsxs(_Fragment, { children: [_jsxs("header", { children: [_jsx("span", { children: memoryKind(item.kind) }), _jsx("div", { children: confirmingRemove ? _jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => setConfirmingRemove(false), children: "\u53D6\u6D88" }), _jsx("button", { type: "button", className: "is-danger", disabled: busy, onClick: remove, children: "\u786E\u8BA4\u5220\u9664" })] }) : _jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => setEditing({ ...item }), children: "\u7F16\u8F91" }), _jsx("button", { type: "button", onClick: () => setConfirmingRemove(true), children: "\u5220\u9664" })] }) })] }), _jsx("strong", { children: item.subject }), _jsx("p", { children: item.content }), _jsxs("footer", { children: [_jsx("progress", { max: 1, value: item.confidence, "aria-label": `置信度 ${Math.round(item.confidence * 100)}%` }), _jsxs("small", { children: [item.locked ? '手动确认' : `${Math.round(item.confidence * 100)}% 可信`, " \u00B7 ", relativeTime(item.updatedAt)] })] }), item.evidence.length > 0 && _jsxs("details", { className: "dsh-partner-memory-evidence", children: [_jsxs("summary", { children: ["\u67E5\u770B\u5BF9\u8BDD\u4F9D\u636E ", _jsx("b", { children: item.evidence.length })] }), _jsx("div", { children: [...item.evidence].reverse().map(evidence => _jsxs("blockquote", { children: [_jsx("p", { children: evidence.excerpt }), _jsx("time", { children: new Date(evidence.at).toLocaleString() })] }, `${evidence.turnId}:${evidence.at}`)) })] })] }) });
15
+ }
16
+ export function memoryKind(value) { return ({ profile: '画像', preference: '偏好', task: '任务', event: '事件', relationship: '关系', emotion: '情绪信号' })[value]; }
17
+ //# sourceMappingURL=memory-cards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-cards.js","sourceRoot":"","sources":["../../../src/ui/memory/memory-cards.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type MemoryView } from '../../client-api.js';
2
+ export declare function MemoryDetail({ companionId, item, close, changed }: {
3
+ companionId: string;
4
+ item: MemoryView;
5
+ close(): void;
6
+ changed(): Promise<void>;
7
+ }): JSX.Element;
8
+ //# sourceMappingURL=memory-detail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-detail.d.ts","sourceRoot":"","sources":["../../../src/ui/memory/memory-detail.tsx"],"names":[],"mappings":"AACA,OAAO,EAAM,KAAK,UAAU,EAAC,MAAM,qBAAqB,CAAA;AAKxD,wBAAgB,YAAY,CAAC,EAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAC,EAAE;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,IAAI,IAAI,CAAC;IAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAC,GAAG,GAAG,CAAC,OAAO,CAyB/J"}
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useRef, useState } from 'react';
3
+ import { api } from '../../client-api.js';
4
+ import { WorkspaceDialog, WorkspaceNotice, errorMessage } from '../workspace-components.js';
5
+ import { MemoryCard } from './memory-cards.js';
6
+ import { MEMORY_STATUS } from './types.js';
7
+ export function MemoryDetail({ companionId, item, close, changed }) {
8
+ const [current, setCurrent] = useState(item);
9
+ const [editing, setEditing] = useState();
10
+ const [busy, setBusy] = useState(false);
11
+ const [error, setError] = useState();
12
+ const [notice, setNotice] = useState();
13
+ const lock = useRef(false);
14
+ const run = async (remove = false) => {
15
+ if (lock.current || (!remove && !editing))
16
+ return;
17
+ lock.current = true;
18
+ setBusy(true);
19
+ setError(undefined);
20
+ try {
21
+ const path = `/companions/${encodeURIComponent(companionId)}/memory/${encodeURIComponent(current.id)}`;
22
+ if (remove) {
23
+ await api(path, { method: 'DELETE' });
24
+ close();
25
+ }
26
+ else {
27
+ const updated = await api(path, { method: 'PUT', body: JSON.stringify({ subject: editing.subject, content: editing.content }) });
28
+ setCurrent(updated);
29
+ setEditing(undefined);
30
+ setNotice('修正已保存,并锁定为用户确认的内容');
31
+ }
32
+ await changed();
33
+ }
34
+ catch (reason) {
35
+ setError(errorMessage(reason));
36
+ }
37
+ finally {
38
+ lock.current = false;
39
+ setBusy(false);
40
+ }
41
+ };
42
+ return _jsxs(WorkspaceDialog, { title: "\u8BB0\u5FC6\u8BE6\u60C5", detail: `${MEMORY_STATUS[current.status]} · 修改后的内容会优先保留;删除需要再次确认。`, close: () => { if (!busy)
43
+ close(); }, children: [error && _jsx(WorkspaceNotice, { children: error }), notice && _jsx(WorkspaceNotice, { kind: "success", children: notice }), _jsx("div", { className: "dsh-partner-library-detail", children: _jsx(MemoryCard, { item: current, editing: editing, busy: busy, setEditing: setEditing, save: () => { void run(); }, remove: () => { void run(true); } }, current.id) })] });
44
+ }
45
+ //# sourceMappingURL=memory-detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-detail.js","sourceRoot":"","sources":["../../../src/ui/memory/memory-detail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { MemoryView, MemoryGraphView, UserProfileSnapshotView } from '../../client-api.js';
2
+ export declare function MemoryGraph({ graph, profiles, query, inspect }: {
3
+ graph: MemoryGraphView;
4
+ profiles: UserProfileSnapshotView[];
5
+ query: string;
6
+ inspect(item: MemoryView): void;
7
+ }): JSX.Element;
8
+ //# sourceMappingURL=memory-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-graph.d.ts","sourceRoot":"","sources":["../../../src/ui/memory/memory-graph.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAsB,eAAe,EAAE,uBAAuB,EAAC,MAAM,qBAAqB,CAAA;AAMjH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAAE,KAAK,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CA0B7L"}
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { ContentState as State } from '../partner-components.js';
4
+ import { memoryKind } from './memory-cards.js';
5
+ const RELATION_FILTERS = ['all', 'conflicts_with', 'depends_on', 'supports', 'follows', 'about'];
6
+ export function MemoryGraph({ graph, profiles, query, inspect }) {
7
+ const byId = new Map(graph.memories.map(item => [item.id, item]));
8
+ const scopeIds = [...new Set(graph.relations.map(item => item.scopeId))];
9
+ const [requestedScopeId, setRequestedScopeId] = useState();
10
+ const scopeId = scopeIds.includes(requestedScopeId ?? '') ? requestedScopeId : scopeIds[0];
11
+ const [filter, setFilter] = useState('all');
12
+ const scoped = graph.relations.filter(item => item.scopeId === scopeId);
13
+ const visible = scoped.filter(item => {
14
+ if (filter !== 'all' && item.kind !== filter)
15
+ return false;
16
+ const source = byId.get(item.sourceMemoryId);
17
+ const target = byId.get(item.targetMemoryId);
18
+ return !query || `${source?.subject ?? ''} ${source?.content ?? ''} ${target?.subject ?? ''} ${target?.content ?? ''} ${item.label}`.toLocaleLowerCase().includes(query);
19
+ }).sort((left, right) => Number(right.kind === 'conflicts_with') - Number(left.kind === 'conflicts_with') || right.confidence - left.confidence);
20
+ const [selectedRelationId, setSelectedRelationId] = useState();
21
+ const selected = visible.find(item => item.id === selectedRelationId) ?? visible[0];
22
+ const source = selected ? byId.get(selected.sourceMemoryId) : undefined;
23
+ const target = selected ? byId.get(selected.targetMemoryId) : undefined;
24
+ const label = profiles.find(item => item.scopeId === scopeId)?.label ?? (scopeId ? `联系人 ${scopeId.slice(-6)}` : '当前联系人');
25
+ const conflictCount = scoped.filter(item => item.kind === 'conflicts_with').length;
26
+ if (graph.relations.length === 0)
27
+ return _jsx(State, { title: "\u8FD8\u6CA1\u6709\u53EF\u9760\u5173\u7CFB", detail: "\u6BCF\u65E5\u7EC8\u5BA1\u53EA\u4F1A\u4FDD\u5B58\u6709\u660E\u786E\u8BC1\u636E\u7684\u8BB0\u5FC6\u8054\u7CFB\uFF0C\u4E0D\u4F1A\u4E3A\u4E86\u586B\u6EE1\u56FE\u8C31\u800C\u731C\u6D4B\u3002" });
28
+ return _jsxs("div", { className: "dsh-partner-graph-audit", children: [_jsxs("header", { className: "dsh-partner-graph-toolbar", children: [_jsxs("span", { children: [_jsx("small", { children: "\u5173\u7CFB\u5BA1\u8BA1" }), _jsxs("strong", { children: [label, " \u7684\u7406\u89E3\u5173\u7CFB"] }), _jsxs("p", { children: [scoped.length, " \u6761\u53EF\u9760\u8054\u7CFB", conflictCount > 0 ? `,其中 ${conflictCount} 条需要确认` : ',暂无待确认冲突'] })] }), scopeIds.length > 1 && _jsxs("label", { children: [_jsx("span", { children: "\u8054\u7CFB\u4EBA" }), _jsx("select", { value: scopeId, onChange: event => { setRequestedScopeId(event.target.value); setSelectedRelationId(undefined); }, children: scopeIds.map(value => _jsx("option", { value: value, children: profiles.find(item => item.scopeId === value)?.label ?? `联系人 ${value.slice(-6)}` }, value)) })] })] }), _jsx("nav", { className: "dsh-partner-graph-filters", "aria-label": "\u5173\u7CFB\u7C7B\u578B", children: RELATION_FILTERS.map(value => { const count = value === 'all' ? scoped.length : scoped.filter(item => item.kind === value).length; return _jsxs("button", { type: "button", className: filter === value ? 'is-active' : '', "aria-pressed": filter === value, onClick: () => { setFilter(value); setSelectedRelationId(undefined); }, children: [value === 'all' ? '全部' : relationLabel(value), " ", _jsx("b", { children: count })] }, value); }) }), _jsxs("div", { className: "dsh-partner-graph-browser", children: [_jsx("div", { className: "dsh-partner-graph-index", role: "list", children: visible.length === 0 ? _jsx(State, { title: "\u6CA1\u6709\u5339\u914D\u7684\u5173\u7CFB", detail: "\u8C03\u6574\u5173\u7CFB\u7C7B\u578B\u6216\u641C\u7D22\u5173\u952E\u8BCD\u540E\u518D\u8BD5\u3002", compact: true }) : visible.map(item => { const from = byId.get(item.sourceMemoryId); const to = byId.get(item.targetMemoryId); return _jsxs("button", { type: "button", role: "listitem", "data-kind": item.kind, className: selected?.id === item.id ? 'is-active' : '', onClick: () => setSelectedRelationId(item.id), children: [_jsx("span", { children: relationLabel(item.kind) }), _jsxs("strong", { children: [from?.subject ?? '已删除记忆', " ", _jsx("i", { "aria-hidden": "true", children: "\u2192" }), " ", to?.subject ?? '已删除记忆'] }), _jsx("p", { children: item.label }), _jsxs("small", { children: [Math.round(item.confidence * 100), "% \u53EF\u4FE1"] })] }, item.id); }) }), _jsx("div", { className: "dsh-partner-graph-stage", children: selected && source && target ? _jsxs("article", { "data-kind": selected.kind, children: [_jsxs("header", { children: [_jsx("span", { children: relationLabel(selected.kind) }), _jsxs("strong", { children: [source.subject, " ", _jsx("i", { "aria-hidden": "true", children: "\u2192" }), " ", target.subject] }), _jsx("p", { children: selected.label }), _jsx("small", { children: relationGuidance(selected.kind) })] }), _jsxs("div", { className: "dsh-partner-graph-pair", children: [_jsx(GraphMemory, { item: source, side: "\u8D77\u70B9", inspect: inspect }), _jsxs("div", { "aria-hidden": "true", children: [_jsx("i", {}), _jsx("span", { children: relationLabel(selected.kind) }), _jsx("i", {})] }), _jsx(GraphMemory, { item: target, side: "\u5173\u8054\u9879", inspect: inspect })] }), _jsxs("footer", { children: [_jsxs("small", { children: ["\u6700\u8FD1\u7EC8\u5BA1\u4E8E ", new Date(selected.updatedAt).toLocaleString()] }), _jsxs("strong", { children: ["\u5173\u7CFB\u7F6E\u4FE1\u5EA6 ", Math.round(selected.confidence * 100), "%"] })] })] }) : _jsx(State, { title: "\u9009\u62E9\u4E00\u6761\u5173\u7CFB", detail: "\u5173\u7CFB\u4E24\u7AEF\u7684\u8BB0\u5FC6\u4E0E\u4F7F\u7528\u65B9\u5F0F\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002", compact: true }) })] })] });
29
+ }
30
+ function GraphMemory({ item, side, inspect }) {
31
+ return _jsxs("section", { children: [_jsxs("header", { children: [_jsxs("small", { children: [side, " \u00B7 ", memoryKind(item.kind)] }), _jsx("strong", { children: item.subject })] }), _jsx("p", { children: item.content }), _jsx("button", { type: "button", onClick: () => inspect(item), children: "\u67E5\u770B\u5E76\u4FEE\u6B63" })] });
32
+ }
33
+ function relationLabel(kind) { return ({ supports: '支持', depends_on: '依赖', about: '关于', conflicts_with: '冲突', follows: '后续' })[kind]; }
34
+ function relationGuidance(kind) {
35
+ return ({
36
+ supports: '回答涉及目标记忆时,可把起点作为明确支持依据,但不能据此补写新事实。',
37
+ depends_on: '处理起点事项时,应同时检查关联项是否成立或已经完成。',
38
+ about: '两条记忆属于同一上下文,召回其中一条时可以补充另一条帮助理解。',
39
+ conflicts_with: '两条理解暂时不能同时作为事实;伙伴应在相关话题出现时指出差异并请求确认。',
40
+ follows: '它们存在明确先后关系,后续判断需要保留这个顺序。',
41
+ })[kind];
42
+ }
43
+ //# sourceMappingURL=memory-graph.js.map