@lemoncat7/dsh-partner 0.1.0-alpha.21 → 1.0.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 +4 -3
- package/lib/agent-runtime.d.ts +9 -4
- package/lib/agent-runtime.d.ts.map +1 -1
- package/lib/agent-runtime.js +56 -14
- package/lib/agent-runtime.js.map +1 -1
- package/lib/api.d.ts +4 -2
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +38 -7
- package/lib/api.js.map +1 -1
- package/lib/client-api.d.ts +52 -7
- package/lib/client-api.d.ts.map +1 -1
- package/lib/client-api.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +863 -108
- package/lib/client.js.map +2 -2
- package/lib/daily-review.d.ts +26 -0
- package/lib/daily-review.d.ts.map +1 -0
- package/lib/daily-review.js +86 -0
- package/lib/daily-review.js.map +1 -0
- package/lib/domain.d.ts +6 -2
- package/lib/domain.d.ts.map +1 -1
- package/lib/domain.js +14 -6
- package/lib/domain.js.map +1 -1
- package/lib/heartbeat.d.ts +1 -3
- package/lib/heartbeat.d.ts.map +1 -1
- package/lib/heartbeat.js +1 -7
- package/lib/heartbeat.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +18 -7
- package/lib/index.js.map +1 -1
- package/lib/memory-domain.d.ts +85 -0
- package/lib/memory-domain.d.ts.map +1 -0
- package/lib/memory-domain.js +2 -0
- package/lib/memory-domain.js.map +1 -0
- package/lib/memory-reflection.d.ts +22 -0
- package/lib/memory-reflection.d.ts.map +1 -0
- package/lib/memory-reflection.js +158 -0
- package/lib/memory-reflection.js.map +1 -0
- package/lib/memory-store.d.ts +50 -0
- package/lib/memory-store.d.ts.map +1 -0
- package/lib/memory-store.js +519 -0
- package/lib/memory-store.js.map +1 -0
- package/lib/store.js +29 -2
- package/lib/store.js.map +1 -1
- package/package.json +1 -1
- package/lib/journal.d.ts +0 -23
- package/lib/journal.d.ts.map +0 -1
- package/lib/journal.js +0 -93
- package/lib/journal.js.map +0 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { createUserMessage } from '@deepseek-ai/dsh-llm';
|
|
2
|
+
export class MemoryReflectionService {
|
|
3
|
+
ctx;
|
|
4
|
+
store;
|
|
5
|
+
queues = new Map();
|
|
6
|
+
constructor(ctx, store) {
|
|
7
|
+
this.ctx = ctx;
|
|
8
|
+
this.store = store;
|
|
9
|
+
}
|
|
10
|
+
async reflect(companion, turn) {
|
|
11
|
+
const key = `${companion.id}:${turn.scopeId}`;
|
|
12
|
+
const previous = this.queues.get(key) ?? Promise.resolve();
|
|
13
|
+
const current = previous.catch(() => { }).then(() => this.run(companion, turn));
|
|
14
|
+
this.queues.set(key, current);
|
|
15
|
+
try {
|
|
16
|
+
await current;
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
if (this.queues.get(key) === current)
|
|
20
|
+
this.queues.delete(key);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async reviewDay(companion, target) {
|
|
24
|
+
const context = await this.store.dailyReviewContext(target);
|
|
25
|
+
const selection = modelSelection(this.ctx, companion);
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
const timeout = setTimeout(() => controller.abort(), 90_000);
|
|
28
|
+
let output = '';
|
|
29
|
+
try {
|
|
30
|
+
for await (const chunk of this.ctx.llm.stream({
|
|
31
|
+
...selection,
|
|
32
|
+
messages: [createUserMessage({ content: [{ type: 'text', text: JSON.stringify({ date: target.date, ...context }) }], source: { kind: 'plugin', plugin: '@lemoncat7/dsh-partner', form: 'notice', summary: '伙伴每日记忆终审' } })],
|
|
33
|
+
system: DAILY_REVIEW_SYSTEM, temperature: 0.05, maxTokens: 3000, signal: controller.signal,
|
|
34
|
+
})) {
|
|
35
|
+
if (chunk.type === 'text-delta')
|
|
36
|
+
output += chunk.text;
|
|
37
|
+
if (chunk.type === 'finish' && chunk.reason.kind !== 'stop')
|
|
38
|
+
throw new Error(`daily review failed: ${chunk.reason.kind}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
clearTimeout(timeout);
|
|
43
|
+
}
|
|
44
|
+
await this.store.completeDailyReview(target, parseDailyReview(output));
|
|
45
|
+
}
|
|
46
|
+
async run(companion, turn) {
|
|
47
|
+
await this.store.archive(turn);
|
|
48
|
+
const existing = await this.store.recall(companion.id, turn.scopeId, turn.user, 16);
|
|
49
|
+
const diaries = await this.store.recentReflectionsForScope(companion.id, turn.scopeId, 1);
|
|
50
|
+
const selection = modelSelection(this.ctx, companion);
|
|
51
|
+
const controller = new AbortController();
|
|
52
|
+
const timeout = setTimeout(() => controller.abort(), 60_000);
|
|
53
|
+
let output = '';
|
|
54
|
+
try {
|
|
55
|
+
for await (const chunk of this.ctx.llm.stream({
|
|
56
|
+
...selection,
|
|
57
|
+
messages: [createUserMessage({ content: [{ type: 'text', text: reflectionInput(this.store.day(turn.at), turn, existing, diaries.find(item => item.date === this.store.day(turn.at))) }], source: { kind: 'plugin', plugin: '@lemoncat7/dsh-partner', form: 'notice', summary: '伙伴记忆提炼' } })],
|
|
58
|
+
system: REFLECTION_SYSTEM,
|
|
59
|
+
temperature: 0.1,
|
|
60
|
+
maxTokens: 1800,
|
|
61
|
+
signal: controller.signal,
|
|
62
|
+
})) {
|
|
63
|
+
if (chunk.type === 'text-delta')
|
|
64
|
+
output += chunk.text;
|
|
65
|
+
if (chunk.type === 'finish' && chunk.reason.kind !== 'stop')
|
|
66
|
+
throw new Error(`memory reflection failed: ${chunk.reason.kind}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
clearTimeout(timeout);
|
|
71
|
+
}
|
|
72
|
+
await this.store.consolidate(turn, parseReflection(output));
|
|
73
|
+
await this.store.prune(companion.id, companion.automation.memory.retentionDays);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function modelSelection(ctx, companion) {
|
|
77
|
+
return {
|
|
78
|
+
...ctx.agentDefaultModel.currentSelection(),
|
|
79
|
+
...(companion.provider ? { provider: companion.provider } : {}), ...(companion.model ? { model: companion.model } : {}),
|
|
80
|
+
...(companion.automation.memory.provider ? { provider: companion.automation.memory.provider } : {}),
|
|
81
|
+
...(companion.automation.memory.model ? { model: companion.automation.memory.model } : {}),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const REFLECTION_SYSTEM = `你是长期伙伴的记忆整理器。你不回答用户,只从有证据的对话中维护每日回顾和结构化记忆。
|
|
85
|
+
只输出一个 JSON 对象,不要 Markdown。格式:
|
|
86
|
+
{"daily":{"summary":"当天截至当前的简洁总结","events":[],"openTasks":[],"completedTasks":[],"learnings":[]},"memories":[{"kind":"profile|preference|task|event|relationship|emotion","subject":"稳定且简短的索引主题","content":"带场景边界的准确内容","confidence":0.0,"importance":0.0,"operation":"upsert|complete|remove","expiresInDays":3}]}
|
|
87
|
+
规则:
|
|
88
|
+
1. 不把寒暄、模型猜测、助手自述当成用户事实;没有长期价值时 memories 返回空数组。
|
|
89
|
+
2. 偏好必须保留适用场景和例外;任务只记录用户明确提出或双方明确承诺的事项。
|
|
90
|
+
3. emotion 只是短期信号,必须设置 1-7 天过期,不做心理诊断。
|
|
91
|
+
4. 与已有记忆同主题时沿用 subject;用户纠正旧理解时用 upsert 更新,撤销时 remove,任务完成时 complete。
|
|
92
|
+
5. daily 应综合已有当日日记与新对话,不能只复述最后一句。数组每类最多 20 条,记忆候选最多 12 条。`;
|
|
93
|
+
const DAILY_REVIEW_SYSTEM = `你是长期伙伴的每日记忆终审器。根据当天完整对话、滚动回顾和已有记忆,输出一次最终整理,不回答用户。
|
|
94
|
+
只输出 JSON:{"daily":{"summary":"","events":[],"openTasks":[],"completedTasks":[],"learnings":[]},"memories":[与逐轮提炼相同的候选格式],"relations":[{"sourceSubject":"必须等于已有或候选记忆主题","targetSubject":"必须等于已有或候选记忆主题","kind":"supports|depends_on|about|conflicts_with|follows","label":"简短关系说明","confidence":0.0}]}
|
|
95
|
+
要求:合并重复理解;以完整对话纠正逐轮偏差;明确任务完成状态;不创造对话中没有的事实;关系必须有证据且最多 80 条;无可靠关系时返回空数组。`;
|
|
96
|
+
function reflectionInput(date, turn, memories, diary) {
|
|
97
|
+
return JSON.stringify({ date, existingDailyReflection: diary ?? null, existingRelevantMemories: memories, newTurn: { id: turn.id, user: turn.user, assistant: turn.assistant } });
|
|
98
|
+
}
|
|
99
|
+
export function parseReflection(raw) {
|
|
100
|
+
const match = raw.trim().match(/\{[\s\S]*\}/);
|
|
101
|
+
if (!match)
|
|
102
|
+
throw new Error('memory reflection returned no JSON object');
|
|
103
|
+
const value = JSON.parse(match[0]);
|
|
104
|
+
const daily = record(value.daily);
|
|
105
|
+
const memories = Array.isArray(value.memories) ? value.memories.map(parseCandidate).filter((item) => item !== undefined).slice(0, 12) : [];
|
|
106
|
+
return {
|
|
107
|
+
daily: {
|
|
108
|
+
summary: string(daily.summary, 1200), events: stringArray(daily.events), openTasks: stringArray(daily.openTasks),
|
|
109
|
+
completedTasks: stringArray(daily.completedTasks), learnings: stringArray(daily.learnings),
|
|
110
|
+
},
|
|
111
|
+
memories,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function parseDailyReview(raw) {
|
|
115
|
+
const base = parseReflection(raw);
|
|
116
|
+
const match = raw.trim().match(/\{[\s\S]*\}/);
|
|
117
|
+
const value = match ? JSON.parse(match[0]) : {};
|
|
118
|
+
const relations = Array.isArray(value.relations) ? value.relations.flatMap(item => {
|
|
119
|
+
const relation = record(item);
|
|
120
|
+
const kind = relation.kind;
|
|
121
|
+
if (!isRelationKind(kind))
|
|
122
|
+
return [];
|
|
123
|
+
const sourceSubject = string(relation.sourceSubject, 120);
|
|
124
|
+
const targetSubject = string(relation.targetSubject, 120);
|
|
125
|
+
if (!sourceSubject || !targetSubject)
|
|
126
|
+
return [];
|
|
127
|
+
return [{ sourceSubject, targetSubject, kind, label: string(relation.label, 120), confidence: number(relation.confidence) }];
|
|
128
|
+
}).slice(0, 80) : [];
|
|
129
|
+
return { ...base, relations };
|
|
130
|
+
}
|
|
131
|
+
function isRelationKind(value) { return value === 'supports' || value === 'depends_on' || value === 'about' || value === 'conflicts_with' || value === 'follows'; }
|
|
132
|
+
function parseCandidate(value) {
|
|
133
|
+
const item = record(value);
|
|
134
|
+
const kind = item.kind;
|
|
135
|
+
const operation = item.operation;
|
|
136
|
+
if (!isKind(kind) || (operation !== 'upsert' && operation !== 'complete' && operation !== 'remove'))
|
|
137
|
+
return undefined;
|
|
138
|
+
const subject = string(item.subject, 120);
|
|
139
|
+
const content = string(item.content, 800);
|
|
140
|
+
if (!subject || (operation === 'upsert' && !content))
|
|
141
|
+
return undefined;
|
|
142
|
+
const candidate = {
|
|
143
|
+
kind, operation, subject, content,
|
|
144
|
+
confidence: number(item.confidence), importance: number(item.importance),
|
|
145
|
+
};
|
|
146
|
+
if (kind === 'emotion')
|
|
147
|
+
candidate.expiresInDays = Math.min(7, Math.max(1, Math.round(finite(item.expiresInDays, 3))));
|
|
148
|
+
else if (typeof item.expiresInDays === 'number' && item.expiresInDays > 0)
|
|
149
|
+
candidate.expiresInDays = Math.min(3650, Math.round(item.expiresInDays));
|
|
150
|
+
return candidate;
|
|
151
|
+
}
|
|
152
|
+
function isKind(value) { return value === 'profile' || value === 'preference' || value === 'task' || value === 'event' || value === 'relationship' || value === 'emotion'; }
|
|
153
|
+
function record(value) { return typeof value === 'object' && value !== null && !Array.isArray(value) ? value : {}; }
|
|
154
|
+
function string(value, max) { const text = typeof value === 'string' ? value.replace(/\s+/g, ' ').trim() : ''; return text.slice(0, max); }
|
|
155
|
+
function stringArray(value) { return Array.isArray(value) ? [...new Set(value.map(item => string(item, 240)).filter(Boolean))].slice(0, 20) : []; }
|
|
156
|
+
function number(value) { return typeof value === 'number' && Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 0.5; }
|
|
157
|
+
function finite(value, fallback) { return typeof value === 'number' && Number.isFinite(value) ? value : fallback; }
|
|
158
|
+
//# sourceMappingURL=memory-reflection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-reflection.js","sourceRoot":"","sources":["../src/memory-reflection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ConversationTurn, DailyReflection, DailyReviewResult, DailyReviewTarget, MemoryCandidate, MemoryRelation, PartnerMemory } from './memory-domain.js';
|
|
2
|
+
type ReflectionResultLike = {
|
|
3
|
+
daily: Omit<DailyReflection, 'date' | 'companionId' | 'scopeId' | 'updatedAt' | 'turnCount'>;
|
|
4
|
+
memories: MemoryCandidate[];
|
|
5
|
+
};
|
|
6
|
+
export declare class PartnerMemoryStore {
|
|
7
|
+
private readonly root;
|
|
8
|
+
private readonly timeZone;
|
|
9
|
+
private readonly writes;
|
|
10
|
+
constructor(root: string, timeZone?: string);
|
|
11
|
+
day(at: number): string;
|
|
12
|
+
archive(turn: ConversationTurn): Promise<void>;
|
|
13
|
+
consolidate(turn: ConversationTurn, result: ReflectionResultLike): Promise<void>;
|
|
14
|
+
recall(companionId: string, scopeId: string, query: string, limit?: number): Promise<PartnerMemory[]>;
|
|
15
|
+
recentMemories(companionId: string, limit?: number): Promise<PartnerMemory[]>;
|
|
16
|
+
updateMemory(companionId: string, memoryId: string, subject: string, content: string): Promise<PartnerMemory>;
|
|
17
|
+
deleteMemory(companionId: string, memoryId: string): Promise<void>;
|
|
18
|
+
recentReflections(companionId: string, limit?: number): Promise<DailyReflection[]>;
|
|
19
|
+
recentReflectionsForScope(companionId: string, scopeId: string, limit?: number): Promise<DailyReflection[]>;
|
|
20
|
+
pendingDailyReviews(companionId: string, date: string, now?: number): Promise<DailyReviewTarget[]>;
|
|
21
|
+
dailyReviewContext(target: DailyReviewTarget): Promise<{
|
|
22
|
+
reflection: DailyReflection;
|
|
23
|
+
memories: PartnerMemory[];
|
|
24
|
+
turns: ConversationTurn[];
|
|
25
|
+
}>;
|
|
26
|
+
completeDailyReview(target: DailyReviewTarget, result: DailyReviewResult): Promise<void>;
|
|
27
|
+
failDailyReview(target: DailyReviewTarget, error: string): Promise<void>;
|
|
28
|
+
relations(companionId: string, limit?: number): Promise<{
|
|
29
|
+
memories: PartnerMemory[];
|
|
30
|
+
relations: MemoryRelation[];
|
|
31
|
+
}>;
|
|
32
|
+
clear(companionId: string): Promise<void>;
|
|
33
|
+
migrateLegacy(companionId: string): Promise<number>;
|
|
34
|
+
prune(companionId: string, retentionDays: number): Promise<void>;
|
|
35
|
+
private open;
|
|
36
|
+
private memoriesForScope;
|
|
37
|
+
private upsertMemory;
|
|
38
|
+
private migrateJson;
|
|
39
|
+
private upsertReflection;
|
|
40
|
+
private migrateJournal;
|
|
41
|
+
private scopeDirectories;
|
|
42
|
+
private memoryRoot;
|
|
43
|
+
private databasePath;
|
|
44
|
+
private scopeDirectory;
|
|
45
|
+
private serial;
|
|
46
|
+
private serialValue;
|
|
47
|
+
}
|
|
48
|
+
export declare function localMemoryDay(value: number, timeZone?: string): string;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=memory-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"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"}
|