@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.
- package/README.md +13 -1
- package/docs/memory-quality.md +115 -0
- package/docs/releases/1.12.0.md +25 -0
- package/lib/agent-runtime.d.ts +1 -1
- package/lib/agent-runtime.d.ts.map +1 -1
- package/lib/agent-runtime.js +16 -11
- package/lib/agent-runtime.js.map +1 -1
- package/lib/api/features/memory-layers-api.d.ts +5 -0
- package/lib/api/features/memory-layers-api.d.ts.map +1 -0
- package/lib/api/features/memory-layers-api.js +42 -0
- package/lib/api/features/memory-layers-api.js.map +1 -0
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +5 -1
- package/lib/api.js.map +1 -1
- package/lib/client-api.d.ts +2 -0
- package/lib/client-api.d.ts.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +2894 -2553
- package/lib/client.js.map +4 -4
- package/lib/concern-store.d.ts +1 -0
- package/lib/concern-store.d.ts.map +1 -1
- package/lib/concern-store.js +17 -0
- package/lib/concern-store.js.map +1 -1
- package/lib/daily-review.d.ts +1 -0
- package/lib/daily-review.d.ts.map +1 -1
- package/lib/daily-review.js +14 -3
- package/lib/daily-review.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +13 -0
- package/lib/index.js.map +1 -1
- package/lib/memory-artifacts.d.ts +42 -0
- package/lib/memory-artifacts.d.ts.map +1 -0
- package/lib/memory-artifacts.js +120 -0
- package/lib/memory-artifacts.js.map +1 -0
- package/lib/memory-domain.d.ts +10 -0
- package/lib/memory-domain.d.ts.map +1 -1
- package/lib/memory-journal.d.ts +16 -0
- package/lib/memory-journal.d.ts.map +1 -0
- package/lib/memory-journal.js +51 -0
- package/lib/memory-journal.js.map +1 -0
- package/lib/memory-prompt-context.d.ts.map +1 -1
- package/lib/memory-prompt-context.js +2 -1
- package/lib/memory-prompt-context.js.map +1 -1
- package/lib/memory-quality.d.ts +4 -0
- package/lib/memory-quality.d.ts.map +1 -0
- package/lib/memory-quality.js +16 -0
- package/lib/memory-quality.js.map +1 -0
- package/lib/memory-reflection.d.ts +15 -2
- package/lib/memory-reflection.d.ts.map +1 -1
- package/lib/memory-reflection.js +101 -17
- package/lib/memory-reflection.js.map +1 -1
- package/lib/memory-retrieval.d.ts +5 -0
- package/lib/memory-retrieval.d.ts.map +1 -0
- package/lib/memory-retrieval.js +20 -0
- package/lib/memory-retrieval.js.map +1 -0
- package/lib/memory-store.d.ts +26 -2
- package/lib/memory-store.d.ts.map +1 -1
- package/lib/memory-store.js +142 -50
- package/lib/memory-store.js.map +1 -1
- package/lib/memory-worker.d.ts +25 -0
- package/lib/memory-worker.d.ts.map +1 -0
- package/lib/memory-worker.js +42 -0
- package/lib/memory-worker.js.map +1 -0
- package/lib/profile-domain.d.ts.map +1 -1
- package/lib/profile-domain.js +12 -4
- package/lib/profile-domain.js.map +1 -1
- package/lib/ui/memory/automation-settings.d.ts +8 -0
- package/lib/ui/memory/automation-settings.d.ts.map +1 -0
- package/lib/ui/memory/automation-settings.js +60 -0
- package/lib/ui/memory/automation-settings.js.map +1 -0
- package/lib/ui/memory/concern-board.d.ts +12 -0
- package/lib/ui/memory/concern-board.d.ts.map +1 -0
- package/lib/ui/memory/concern-board.js +129 -0
- package/lib/ui/memory/concern-board.js.map +1 -0
- package/lib/ui/memory/concern-panel.d.ts +7 -0
- package/lib/ui/memory/concern-panel.d.ts.map +1 -0
- package/lib/ui/memory/concern-panel.js +62 -0
- package/lib/ui/memory/concern-panel.js.map +1 -0
- package/lib/ui/memory/experience-view.d.ts +8 -0
- package/lib/ui/memory/experience-view.d.ts.map +1 -0
- package/lib/ui/memory/experience-view.js +52 -0
- package/lib/ui/memory/experience-view.js.map +1 -0
- package/lib/ui/memory/history-view.d.ts +6 -0
- package/lib/ui/memory/history-view.d.ts.map +1 -0
- package/lib/ui/memory/history-view.js +40 -0
- package/lib/ui/memory/history-view.js.map +1 -0
- package/lib/ui/memory/memory-cards.d.ts +14 -0
- package/lib/ui/memory/memory-cards.d.ts.map +1 -0
- package/lib/ui/memory/memory-cards.js +17 -0
- package/lib/ui/memory/memory-cards.js.map +1 -0
- package/lib/ui/memory/memory-detail.d.ts +8 -0
- package/lib/ui/memory/memory-detail.d.ts.map +1 -0
- package/lib/ui/memory/memory-detail.js +45 -0
- package/lib/ui/memory/memory-detail.js.map +1 -0
- package/lib/ui/memory/memory-graph.d.ts +8 -0
- package/lib/ui/memory/memory-graph.d.ts.map +1 -0
- package/lib/ui/memory/memory-graph.js +43 -0
- package/lib/ui/memory/memory-graph.js.map +1 -0
- package/lib/ui/memory/memory-library.d.ts +9 -0
- package/lib/ui/memory/memory-library.d.ts.map +1 -0
- package/lib/ui/memory/memory-library.js +38 -0
- package/lib/ui/memory/memory-library.js.map +1 -0
- package/lib/ui/memory/memory-panel.d.ts +10 -0
- package/lib/ui/memory/memory-panel.d.ts.map +1 -0
- package/lib/ui/memory/memory-panel.js +48 -0
- package/lib/ui/memory/memory-panel.js.map +1 -0
- package/lib/ui/memory/types.d.ts +44 -0
- package/lib/ui/memory/types.d.ts.map +1 -0
- package/lib/ui/memory/types.js +2 -0
- package/lib/ui/memory/types.js.map +1 -0
- package/lib/ui/memory/use-memory-resource.d.ts +9 -0
- package/lib/ui/memory/use-memory-resource.d.ts.map +1 -0
- package/lib/ui/memory/use-memory-resource.js +65 -0
- package/lib/ui/memory/use-memory-resource.js.map +1 -0
- 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":";AAAA,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAA;AACtC,OAAO,EAAC,oBAAoB,EAAC,MAAM,uCAAuC,CAAA;AAC1E,OAAO,EAAC,GAAG,EAAuF,MAAM,qBAAqB,CAAA;AAC7H,OAAO,EAAC,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAC,MAAM,4BAA4B,CAAA;AACxG,OAAO,EAAC,YAAY,EAAC,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,kBAAkB,EAAC,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAA;AAE/C,MAAM,UAAU,YAAY,CAAC,EAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAoF;IAC9I,MAAM,IAAI,GAAG,eAAe,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAA;IAC9D,MAAM,QAAQ,GAAG,iBAAiB,CAAsB,GAAG,IAAI,WAAW,EAAE,MAAM,CAAC,CAAA;IACnF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAU,CAAA;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAU,CAAA;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,EAAE,CAAC,CAAA;IAC1F,MAAM,GAAG,GAAG,KAAK,EAAE,MAA6B,EAAiB,EAAE;QACjE,IAAI,IAAI,CAAC,OAAO;YAAE,OAAM;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QAC7E,IAAI,CAAC;YAAA,SAAS,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC;YAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAA;QAAA,CAAC;QACxD,OAAO,MAAM,EAAE,CAAC;YAAA,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;QAAA,CAAC;gBACvC,CAAC;YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAAA,CAAC;IAChD,CAAC,CAAA;IACD,MAAM,KAAK,GAAG,CAAC,SAAkB,EAAQ,EAAE;QAAE,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAmC,GAAG,IAAI,oBAAoB,EAAE,EAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC,CAAA;YAC7J,MAAM,SAAS,EAAE,CAAA;YACjB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAA;QAC7D,CAAC,CAAC,CAAA;IAAA,CAAC,CAAA;IACH,MAAM,GAAG,GAAG,CAAC,IAAiB,EAAE,MAAqD,EAAQ,EAAE;QAAE,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;YACnH,MAAM,GAAG,CAAC,GAAG,IAAI,aAAa,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,EAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAC,CAAC,EAAC,CAAC,CAAA;YACrH,OAAO,CAAC,EAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAC7F,CAAC,CAAC,CAAA;IAAA,CAAC,CAAA;IACH,OAAO,eAAK,SAAS,EAAC,qCAAqC,aACzD,KAAC,aAAa,IAAC,OAAO,EAAC,iBAAiB,EAAC,KAAK,EAAC,0BAAM,EAAC,MAAM,EAAC,8JAA4B,EAAC,OAAO,EAAE,8BAAE,iBAAQ,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,+CAAgB,EAAA,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,yCAAe,IAAG,GAAI,EAC7P,eAAK,SAAS,EAAC,2BAA2B,aAAC,yBAAO,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAQ,EAAA,8DAAa,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,uCAAU,SAAS,EAAE,SAAS,IAAI,CAAC,eAAW,EAAA,iBAAQ,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,gBAAa,0BAAM,EAAC,OAAO,EAAE,GAAG,EAAE,GAAE,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAA,CAAA,CAAC,YAAE,KAAC,oBAAoB,IAAC,IAAI,EAAE,EAAE,GAAI,GAAS,IAAM,EACvZ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,IAAI,SAAS,EAAE,SAAS,CAAC,IAAI,KAAC,eAAe,cAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,IAAI,SAAS,EAAE,SAAS,GAAmB,EACzI,MAAM,IAAI,KAAC,eAAe,IAAC,IAAI,EAAC,SAAS,YAAE,MAAM,GAAmB,EACpE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAC,eAAe,IAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,GAAE,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAA,CAAA,CAAC,6BAAa,CAAC,CAAC,CAAC,SAAS,GAAI,CAAC,CAAC,CAAC,KAAC,YAAY,IAAC,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;oBAAE,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE;wBAClY,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;4BAAE,OAAO,cAAc,CAAA;wBACxC,MAAM,GAAG,CAAC,GAAG,IAAI,WAAW,EAAE,EAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,EAAC,CAAC,EAAC,CAAC,CAAA;wBAC9F,QAAQ,CAAC,EAAE,CAAC,CAAC;wBAAC,OAAO,SAAS,CAAA;oBAChC,CAAC,CAAC,CAAA;gBAAA,CAAC,GAAI,EACN,QAAQ,IAAI,KAAC,kBAAkB,IAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAC,WAAW,EAAC,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,SAAS,GAAI,IAC7H,CAAA;AACR,CAAC"}
|
|
@@ -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 @@
|
|
|
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":"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"}
|
|
@@ -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":";AAAA,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAA;AACtC,OAAO,EAAC,GAAG,EAAkB,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAC,eAAe,EAAE,eAAe,EAAE,YAAY,EAAC,MAAM,4BAA4B,CAAA;AACzF,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAC,aAAa,EAAC,MAAM,YAAY,CAAA;AAExC,MAAM,UAAU,YAAY,CAAC,EAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAmF;IAChJ,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAc,CAAA;IACpD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAU,CAAA;IAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAU,CAAA;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1B,MAAM,GAAG,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAiB,EAAE;QAClD,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC;YAAE,OAAM;QACjD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QACvD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,eAAe,kBAAkB,CAAC,WAAW,CAAC,WAAW,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAA;YACtG,IAAI,MAAM,EAAE,CAAC;gBAAA,MAAM,GAAG,CAAC,IAAI,EAAE,EAAC,MAAM,EAAE,QAAQ,EAAC,CAAC,CAAC;gBAAC,KAAK,EAAE,CAAA;YAAA,CAAC;iBACrD,CAAC;gBACJ,MAAM,OAAO,GAAG,MAAM,GAAG,CAAa,IAAI,EAAE,EAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAC,OAAO,EAAE,OAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAQ,CAAC,OAAO,EAAC,CAAC,EAAC,CAAC,CAAA;gBAC1I,UAAU,CAAC,OAAO,CAAC,CAAC;gBAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;YAC5E,CAAC;YACD,MAAM,OAAO,EAAE,CAAA;QACjB,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAAA,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;QAAA,CAAC;gBACzC,CAAC;YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAAA,CAAC;IAChD,CAAC,CAAA;IACD,OAAO,MAAC,eAAe,IAAC,KAAK,EAAC,0BAAM,EAAC,MAAM,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,IAAI,CAAC,IAAI;YAAE,KAAK,EAAE,CAAA,CAAA,CAAC,aACvI,KAAK,IAAI,KAAC,eAAe,cAAE,KAAK,GAAmB,EAAE,MAAM,IAAI,KAAC,eAAe,IAAC,IAAI,EAAC,SAAS,YAAE,MAAM,GAAmB,EAC1H,cAAK,SAAS,EAAC,4BAA4B,YAAC,KAAC,UAAU,IAAkB,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,KAAK,GAAG,EAAE,CAAA,CAAA,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAE,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA,CAAA,CAAC,IAAzI,OAAO,CAAC,EAAE,CAAmI,GAAM,IAChM,CAAA;AACpB,CAAC"}
|
|
@@ -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
|