topic-memory 0.1.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/dist/engine.js ADDED
@@ -0,0 +1,375 @@
1
+ import { MEMORY_SELECTOR_PROMPT_V1, TOPIC_WORKER_PROMPT_V1 } from './prompts.js';
2
+ const INTERNAL_BUBBLE_TAG_RE = /\[\[b_m(?:S|C|E)\]\]/g;
3
+ const ALLOWED_TOPIC_STATUSES = new Set(['open', 'provisional', 'finalized']);
4
+ export class MemoryEngine {
5
+ storage;
6
+ topicWorker;
7
+ selector;
8
+ now;
9
+ constructor(options) {
10
+ this.storage = options.storage;
11
+ const shared = options.llm;
12
+ if (!shared && (!options.topicWorker || !options.selector))
13
+ throw new Error('Provide llm, or provide both topicWorker and selector');
14
+ this.topicWorker = options.topicWorker ?? shared;
15
+ this.selector = options.selector ?? shared;
16
+ this.now = options.now ?? Date.now;
17
+ }
18
+ async begin(userText) { return this.beginExchange({ userText }); }
19
+ async beginExchange(input) {
20
+ const existing = await this.storage.listExchanges();
21
+ const sequence = existing.reduce((max, item) => Math.max(max, item.sequence), 0) + 1;
22
+ const userSentAt = input.userSentAt ?? this.now();
23
+ const exchange = {
24
+ id: `ce_${userSentAt}_${randomId()}`,
25
+ sequence,
26
+ userText: input.userText,
27
+ userSentAt,
28
+ assistantText: '',
29
+ assistantCompletedAt: null,
30
+ status: 'pending',
31
+ failureReason: null,
32
+ source: 'live',
33
+ };
34
+ await this.storage.putExchange(exchange);
35
+ return exchange;
36
+ }
37
+ async completeExchange(input) {
38
+ const exchange = await this.requireExchange(input.exchangeId);
39
+ const next = {
40
+ ...exchange,
41
+ assistantText: stripCanonicalAssistantProtocolTags(input.assistantText),
42
+ assistantCompletedAt: input.assistantCompletedAt ?? this.now(),
43
+ status: 'completed',
44
+ failureReason: null,
45
+ };
46
+ await this.storage.putExchange(next);
47
+ return next;
48
+ }
49
+ async failExchange(input) {
50
+ const exchange = await this.requireExchange(input.exchangeId);
51
+ const next = {
52
+ ...exchange,
53
+ assistantCompletedAt: input.assistantCompletedAt ?? this.now(),
54
+ status: 'failed',
55
+ failureReason: input.failureReason,
56
+ };
57
+ await this.storage.putExchange(next);
58
+ return next;
59
+ }
60
+ async maybeRunTopicWorker() {
61
+ const exchanges = await this.storage.listExchanges();
62
+ const completed = exchanges.filter((e) => e.status === 'completed' && e.source === 'live');
63
+ if (completed.length < 6)
64
+ return { ran: false, reason: 'completed_exchange_gate', run: null };
65
+ const previousTopics = await this.storage.listTopics();
66
+ const finalizedTopics = previousTopics.filter((topic) => topic.status === 'finalized');
67
+ const finalizedEnd = finalizedTopics.flatMap((topic) => topic.spans.map((span) => span.endSequence)).reduce((max, seq) => Math.max(max, seq), 0);
68
+ const activeTail = completed.filter((e) => e.sequence > finalizedEnd);
69
+ if (activeTail.length < 6)
70
+ return { ran: false, reason: 'active_tail_gate', run: null };
71
+ const inputText = buildWorkerInput(activeTail);
72
+ const inputTextBySequence = new Map(activeTail.map((e) => [e.sequence, `${e.userText}\n${stripCanonicalAssistantProtocolTags(e.assistantText)}`]));
73
+ const topicIdOffset = previousTopics.reduce((max, topic) => {
74
+ const match = /^T(\d+)$/.exec(topic.topicId);
75
+ return match ? Math.max(max, Number(match[1])) : max;
76
+ }, 0);
77
+ const runId = `twr_${this.now()}_${randomId()}`;
78
+ try {
79
+ const rawOutput = await this.topicWorker.complete({ system: TOPIC_WORKER_PROMPT_V1, user: inputText, maxTokens: 2200, temperature: 0.1, topP: 0.9 });
80
+ const validation = validateTopicWorkerOutput(rawOutput, activeTail.map((e) => e.sequence), topicIdOffset, inputTextBySequence);
81
+ const newTopics = validation.ok ? buildTopics(validation.topicDrafts, activeTail, this.now()) : [];
82
+ const acceptedTopics = validation.ok ? [...finalizedTopics, ...newTopics] : [];
83
+ const run = {
84
+ runId,
85
+ createdAt: this.now(),
86
+ inputText,
87
+ rawOutput,
88
+ validationStatus: validation.ok ? 'accepted' : 'rejected',
89
+ validationError: validation.ok ? null : validation.errors.join('\n'),
90
+ acceptedTopics,
91
+ requestModel: 'memory-llm',
92
+ };
93
+ await this.storage.saveLatestTopicWorkerRun(run);
94
+ if (!validation.ok)
95
+ return { ran: true, reason: 'rejected', run };
96
+ await this.storage.replaceTopics(acceptedTopics);
97
+ return { ran: true, reason: 'accepted', run };
98
+ }
99
+ catch (error) {
100
+ const message = error instanceof Error ? error.message : String(error);
101
+ const run = {
102
+ runId,
103
+ createdAt: this.now(),
104
+ inputText,
105
+ rawOutput: message,
106
+ validationStatus: 'failed',
107
+ validationError: message,
108
+ acceptedTopics: [],
109
+ requestModel: 'memory-llm',
110
+ };
111
+ await this.storage.saveLatestTopicWorkerRun(run).catch(() => undefined);
112
+ return { ran: true, reason: 'failed', run };
113
+ }
114
+ }
115
+ async retrieve(input) {
116
+ const now = input.now ?? this.now();
117
+ const exchanges = await this.storage.listExchanges();
118
+ const completed = exchanges.filter((e) => e.status === 'completed' && e.source === 'live');
119
+ const recentContext = completed.slice(-5);
120
+ const topics = await this.storage.listTopics();
121
+ const topicDirectory = buildTopicDirectory(topics, now);
122
+ const selectorInput = [
123
+ `Current time:\n${formatTopicTime(now)}`,
124
+ `Current user message:\n${input.userMessage}`,
125
+ `Recent 5 completed exchanges:\n${buildWorkerInput(recentContext) || '(none)'}`,
126
+ `Topic Directory:\n${topicDirectory || '(empty)'}`,
127
+ ].join('\n\n');
128
+ if (topics.length === 0)
129
+ return emptyRetrieve(recentContext, topicDirectory, selectorInput, '');
130
+ try {
131
+ const selectorRawOutput = await this.selector.complete({ system: MEMORY_SELECTOR_PROMPT_V1, user: selectorInput, maxTokens: 400, temperature: 0.1, topP: 0.9 });
132
+ const parsed = JSON.parse(selectorRawOutput);
133
+ const requestedIds = Array.isArray(parsed.topicIds) ? parsed.topicIds.filter((id) => typeof id === 'string').slice(0, 3) : [];
134
+ const selectedTopics = parsed.needsMemory === true
135
+ ? requestedIds.map((id) => topics.find((topic) => topic.topicId === id)).filter((topic) => Boolean(topic))
136
+ : [];
137
+ const needsTimeMetadata = (parsed.needsTimeMetadata === true || isTimeMetadataQuestion(input.userMessage)) && selectedTopics.length > 0;
138
+ const openedTopicPackets = selectedTopics.map((topic) => buildOpenedTopicPacket(topic, exchanges, now, needsTimeMetadata));
139
+ const memoryContext = openedTopicPackets.length
140
+ ? ['MEMORY_SECTION_FROM_TOPIC_STORE', "Use this restored older context only if it is relevant to the user's current message.", '', openedTopicPackets.join('\n\n---\n\n')].join('\n')
141
+ : '';
142
+ return {
143
+ recentContext,
144
+ topicDirectory,
145
+ selectedTopicIds: selectedTopics.map((topic) => topic.topicId),
146
+ openedTopicPackets,
147
+ memoryContext,
148
+ needsTimeMetadata,
149
+ trace: { selectorInput, selectorRawOutput, selectorError: null },
150
+ };
151
+ }
152
+ catch (error) {
153
+ return {
154
+ ...emptyRetrieve(recentContext, topicDirectory, selectorInput, ''),
155
+ trace: { selectorInput, selectorRawOutput: '', selectorError: error instanceof Error ? error.message : String(error) },
156
+ };
157
+ }
158
+ }
159
+ async listExchanges() { return this.storage.listExchanges(); }
160
+ async listTopics() { return this.storage.listTopics(); }
161
+ async getLatestTopicWorkerRun() { return this.storage.getLatestTopicWorkerRun(); }
162
+ async clear() {
163
+ await Promise.all([this.storage.clearExchanges(), this.storage.clearTopics(), this.storage.clearLatestTopicWorkerRun()]);
164
+ }
165
+ async requireExchange(id) {
166
+ const exchange = (await this.storage.listExchanges()).find((item) => item.id === id);
167
+ if (!exchange)
168
+ throw new Error(`Canonical exchange not found: ${id}`);
169
+ return exchange;
170
+ }
171
+ }
172
+ export function createMemory(options) { return new MemoryEngine(options); }
173
+ export function stripCanonicalAssistantProtocolTags(text) {
174
+ const cleaned = text.replace(INTERNAL_BUBBLE_TAG_RE, '');
175
+ return cleaned === text ? text : cleaned.trim();
176
+ }
177
+ function buildWorkerInput(exchanges) {
178
+ return exchanges.map((e) => `#${e.sequence}\nuser: ${e.userText}\nassistant: ${stripCanonicalAssistantProtocolTags(e.assistantText)}`).join('\n\n');
179
+ }
180
+ function validateTopicWorkerOutput(rawOutput, inputSequences, topicIdOffset, inputTextBySequence) {
181
+ const errors = [];
182
+ if (!rawOutput.trim())
183
+ return { ok: false, errors: ['raw output is empty'], topicDrafts: [] };
184
+ let parsed;
185
+ try {
186
+ parsed = JSON.parse(rawOutput);
187
+ }
188
+ catch (error) {
189
+ return { ok: false, errors: [`invalid JSON: ${error instanceof Error ? error.message : String(error)}`], topicDrafts: [] };
190
+ }
191
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
192
+ return { ok: false, errors: ['JSON root must be an object'], topicDrafts: [] };
193
+ const root = parsed;
194
+ const extraRootKeys = Object.keys(root).filter((key) => key !== 'topics');
195
+ if (extraRootKeys.length)
196
+ errors.push(`top-level keys are not allowed: ${extraRootKeys.join(', ')}`);
197
+ if (!Array.isArray(root.topics))
198
+ errors.push('topics must be an array');
199
+ const topics = Array.isArray(root.topics) ? root.topics : [];
200
+ const inputSet = new Set(inputSequences);
201
+ const assigned = new Map();
202
+ const maxSequence = inputSequences.length ? Math.max(...inputSequences) : 0;
203
+ const topicDrafts = [];
204
+ topics.forEach((value, index) => {
205
+ const topicLabel = `T${topicIdOffset + index + 1}`;
206
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
207
+ errors.push(`${topicLabel}: topic must be an object`);
208
+ return;
209
+ }
210
+ const topic = value;
211
+ const extraTopicKeys = Object.keys(topic).filter((key) => !['status', 'labelTerms', 'retrievalTerms', 'spans'].includes(key));
212
+ if (extraTopicKeys.length)
213
+ errors.push(`${topicLabel}: topic keys are not allowed: ${extraTopicKeys.join(', ')}`);
214
+ if (!ALLOWED_TOPIC_STATUSES.has(String(topic.status)))
215
+ errors.push(`${topicLabel}: status must be open, provisional, or finalized`);
216
+ const labelTerms = Array.isArray(topic.labelTerms) ? topic.labelTerms.filter((x) => typeof x === 'string' && Boolean(x.trim())).map((x) => x.trim()) : [];
217
+ const retrievalTerms = Array.isArray(topic.retrievalTerms) ? topic.retrievalTerms.filter((x) => typeof x === 'string' && Boolean(x.trim())).map((x) => x.trim()) : [];
218
+ if (!Array.isArray(topic.labelTerms) || labelTerms.length < 2 || labelTerms.length > 5)
219
+ errors.push(`${topicLabel}: labelTerms must contain 2–5 keyword phrases`);
220
+ if (!Array.isArray(topic.retrievalTerms) || retrievalTerms.length < 3 || retrievalTerms.length > 12)
221
+ errors.push(`${topicLabel}: retrievalTerms must contain 3–12 transcript-grounded phrases`);
222
+ const spansRaw = Array.isArray(topic.spans) ? topic.spans : [];
223
+ if (!spansRaw.length)
224
+ errors.push(`${topicLabel}: spans must be a non-empty array`);
225
+ const spans = [];
226
+ for (const [spanIndex, spanValue] of spansRaw.entries()) {
227
+ const span = spanValue && typeof spanValue === 'object' && !Array.isArray(spanValue) ? spanValue : {};
228
+ const extraSpanKeys = Object.keys(span).filter((key) => key !== 'startSequence' && key !== 'endSequence');
229
+ if (extraSpanKeys.length)
230
+ errors.push(`${topicLabel} span ${spanIndex + 1}: span keys are not allowed: ${extraSpanKeys.join(', ')}`);
231
+ const start = Number(span.startSequence);
232
+ const end = Number(span.endSequence);
233
+ if (!Number.isInteger(start) || !Number.isInteger(end)) {
234
+ errors.push(`${topicLabel} span ${spanIndex + 1}: startSequence/endSequence must be integers`);
235
+ continue;
236
+ }
237
+ if (start > end) {
238
+ errors.push(`${topicLabel} span ${spanIndex + 1}: startSequence must be <= endSequence`);
239
+ continue;
240
+ }
241
+ if (!inputSet.has(start) || !inputSet.has(end))
242
+ errors.push(`${topicLabel} span ${spanIndex + 1}: sequence endpoints must exist in worker input`);
243
+ for (let sequence = start; sequence <= end; sequence++) {
244
+ if (!inputSet.has(sequence))
245
+ continue;
246
+ const existing = assigned.get(sequence);
247
+ if (existing)
248
+ errors.push(`sequence ${sequence} overlaps between ${existing} and ${topicLabel}`);
249
+ else
250
+ assigned.set(sequence, topicLabel);
251
+ }
252
+ spans.push({ startSequence: start, endSequence: end });
253
+ }
254
+ topicDrafts.push({
255
+ topicId: topicLabel,
256
+ status: ALLOWED_TOPIC_STATUSES.has(String(topic.status)) ? String(topic.status) : 'provisional',
257
+ labelTerms,
258
+ retrievalTerms,
259
+ spans,
260
+ });
261
+ });
262
+ for (const sequence of inputSequences)
263
+ if (!assigned.has(sequence))
264
+ errors.push(`sequence ${sequence} is not assigned to any topic span`);
265
+ const singles = topicDrafts.filter((topic) => topic.spans.reduce((n, span) => n + span.endSequence - span.startSequence + 1, 0) === 1);
266
+ if (singles.length > 1)
267
+ errors.push('too many one-exchange topics; likely over-splitting');
268
+ const lowContent = /^[\s嗯啊哦哈好行对是的继续等等一下\.。!!??~~-]{1,8}$/;
269
+ for (const topic of singles) {
270
+ const seq = topic.spans[0]?.startSequence;
271
+ const text = seq ? inputTextBySequence.get(seq) ?? '' : '';
272
+ if (lowContent.test(text.trim()))
273
+ errors.push(`${topic.topicId}: low-content single-exchange topic must be merged into a neighboring substantive topic`);
274
+ }
275
+ for (const topic of topicDrafts) {
276
+ const latestEnd = topic.spans.length ? Math.max(...topic.spans.map((span) => span.endSequence)) : 0;
277
+ if (topic.status === 'finalized' && maxSequence - latestEnd < 4)
278
+ errors.push(`${topic.topicId}: finalized topic needs at least four later completed exchanges outside the topic`);
279
+ }
280
+ return { ok: errors.length === 0, errors, topicDrafts: errors.length === 0 ? topicDrafts : [] };
281
+ }
282
+ function buildTopics(drafts, exchanges, updatedAt) {
283
+ const bySequence = new Map(exchanges.map((e) => [e.sequence, e]));
284
+ return drafts.map((draft) => {
285
+ const records = draft.spans.flatMap((span) => {
286
+ const result = [];
287
+ for (let sequence = span.startSequence; sequence <= span.endSequence; sequence++) {
288
+ const exchange = bySequence.get(sequence);
289
+ if (exchange)
290
+ result.push(exchange);
291
+ }
292
+ return result;
293
+ }).sort((a, b) => a.sequence - b.sequence);
294
+ return {
295
+ topicId: draft.topicId,
296
+ status: draft.status,
297
+ labelTerms: draft.labelTerms,
298
+ retrievalTerms: draft.retrievalTerms,
299
+ spans: draft.spans,
300
+ startedAt: records[0]?.userSentAt ?? null,
301
+ endedAt: records.at(-1)?.assistantCompletedAt ?? null,
302
+ updatedAt,
303
+ source: 'topic_worker_v1',
304
+ };
305
+ });
306
+ }
307
+ function buildTopicDirectory(topics, now) {
308
+ const blocks = topics.map((topic) => [
309
+ `Topic ID: ${topic.topicId}`,
310
+ `Keywords: ${topic.labelTerms.join('|')}`,
311
+ `Includes: ${(topic.retrievalTerms.length ? topic.retrievalTerms : topic.labelTerms).join('|')}`,
312
+ `Started: ${formatTopicTime(topic.startedAt)}`,
313
+ `Ended: ${formatTopicTime(topic.endedAt)}`,
314
+ `Relative time: ${formatRelative(topic.endedAt, now)}`,
315
+ `Status: ${topic.status}`,
316
+ ].join('\n')).join('\n\n');
317
+ return [`Current time: ${formatTopicTime(now)}`, blocks].filter(Boolean).join('\n\n');
318
+ }
319
+ function buildOpenedTopicPacket(topic, exchanges, now, includeTimes) {
320
+ const bySequence = new Map(exchanges.map((e) => [e.sequence, e]));
321
+ const sequenceSet = new Set();
322
+ for (const span of topic.spans)
323
+ for (let sequence = span.startSequence; sequence <= span.endSequence; sequence++)
324
+ if (bySequence.has(sequence))
325
+ sequenceSet.add(sequence);
326
+ const transcript = [...sequenceSet].sort((a, b) => a - b).map((sequence) => bySequence.get(sequence)).map((exchange) => {
327
+ const lines = [`#${exchange.sequence}`];
328
+ if (includeTimes) {
329
+ lines.push(`userSentAt: ${formatTopicTime(exchange.userSentAt)}`);
330
+ lines.push(`assistantCompletedAt: ${formatTopicTime(exchange.assistantCompletedAt)}`);
331
+ }
332
+ lines.push(`user: ${exchange.userText}`);
333
+ lines.push(`assistant: ${stripCanonicalAssistantProtocolTags(exchange.assistantText)}`);
334
+ return lines.join('\n');
335
+ }).join('\n\n');
336
+ return [
337
+ `Current time: ${formatTopicTime(now)}`,
338
+ '',
339
+ `Topic ID: ${topic.topicId}`,
340
+ `Keywords: ${topic.labelTerms.join('|')}`,
341
+ `Includes: ${(topic.retrievalTerms.length ? topic.retrievalTerms : topic.labelTerms).join('|')}`,
342
+ `Started: ${formatTopicTime(topic.startedAt)}`,
343
+ `Ended: ${formatTopicTime(topic.endedAt)}`,
344
+ `Relative time: ${formatRelative(topic.endedAt, now)}`,
345
+ '',
346
+ transcript,
347
+ ].join('\n');
348
+ }
349
+ function formatTopicTime(value) { return value ? new Date(value).toISOString() : '—'; }
350
+ function formatRelative(value, now) {
351
+ if (!value)
352
+ return 'unknown';
353
+ const minutes = Math.floor(Math.max(0, now - value) / 60000);
354
+ if (minutes < 1)
355
+ return 'less than 1 minute ago';
356
+ if (minutes < 60)
357
+ return `${minutes} minute${minutes === 1 ? '' : 's'} ago`;
358
+ const hours = Math.floor(minutes / 60);
359
+ if (hours < 24)
360
+ return `${hours} hour${hours === 1 ? '' : 's'} ago`;
361
+ const days = Math.floor(hours / 24);
362
+ if (days < 30)
363
+ return `${days} day${days === 1 ? '' : 's'} ago`;
364
+ const months = Math.floor(days / 30);
365
+ if (months < 12)
366
+ return `${months} month${months === 1 ? '' : 's'} ago`;
367
+ const years = Math.floor(months / 12);
368
+ return `${years} year${years === 1 ? '' : 's'} ago`;
369
+ }
370
+ function isTimeMetadataQuestion(text) { return /几点|什么时候|当时|那时候|几分钟前|多久前|时间/.test(text); }
371
+ function emptyRetrieve(recentContext, topicDirectory, selectorInput, selectorRawOutput) {
372
+ return { recentContext, topicDirectory, selectedTopicIds: [], openedTopicPackets: [], memoryContext: '', needsTimeMetadata: false, trace: { selectorInput, selectorRawOutput, selectorError: null } };
373
+ }
374
+ function randomId() { return Math.random().toString(36).slice(2, 8); }
375
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { MemoryEngine, createMemory, stripCanonicalAssistantProtocolTags } from './engine.js';
2
+ export { createOpenAICompatibleMemoryLlm } from './llm.js';
3
+ export { InMemoryStorage } from './storage/in-memory.js';
4
+ export { IndexedDbMemoryStorage } from './storage/indexeddb.js';
5
+ export { MEMORY_SELECTOR_PROMPT_V1, TOPIC_WORKER_PROMPT_V1 } from './prompts.js';
6
+ export type { CanonicalExchange, CanonicalExchangeStatus, CanonicalTopic, CanonicalTopicSpan, CanonicalTopicStatus, LatestTopicWorkerRun, MemoryLlm, MemoryLlmRequest, MemoryStorage, RetrieveResult, TopicWorkerResult, TopicWorkerRunValidationStatus, } from './types.js';
7
+ export type { MemoryEngineOptions } from './engine.js';
8
+ export type { OpenAICompatibleMemoryLlmOptions } from './llm.js';
9
+ export type { IndexedDbMemoryStorageOptions } from './storage/indexeddb.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mCAAmC,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,+BAA+B,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACjF,YAAY,EACV,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,8BAA8B,GAC/B,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AACjE,YAAY,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { MemoryEngine, createMemory, stripCanonicalAssistantProtocolTags } from './engine.js';
2
+ export { createOpenAICompatibleMemoryLlm } from './llm.js';
3
+ export { InMemoryStorage } from './storage/in-memory.js';
4
+ export { IndexedDbMemoryStorage } from './storage/indexeddb.js';
5
+ export { MEMORY_SELECTOR_PROMPT_V1, TOPIC_WORKER_PROMPT_V1 } from './prompts.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mCAAmC,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,+BAA+B,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"}
package/dist/llm.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { MemoryLlm } from './types.js';
2
+ export interface OpenAICompatibleMemoryLlmOptions {
3
+ baseUrl: string;
4
+ model: string;
5
+ apiKey?: string;
6
+ headers?: Record<string, string>;
7
+ fetchImpl?: typeof fetch;
8
+ }
9
+ export declare function createOpenAICompatibleMemoryLlm(options: OpenAICompatibleMemoryLlmOptions): MemoryLlm;
10
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,gCAAgC,GAAG,SAAS,CAmCpG"}
package/dist/llm.js ADDED
@@ -0,0 +1,43 @@
1
+ export function createOpenAICompatibleMemoryLlm(options) {
2
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
3
+ if (!fetchImpl)
4
+ throw new Error('fetch is not available in this environment');
5
+ const endpoint = `${options.baseUrl.replace(/\/$/, '')}/chat/completions`;
6
+ return {
7
+ async complete(input) {
8
+ const response = await fetchImpl(endpoint, {
9
+ method: 'POST',
10
+ headers: {
11
+ 'Content-Type': 'application/json',
12
+ ...(options.apiKey ? { Authorization: `Bearer ${options.apiKey}` } : {}),
13
+ ...(options.headers ?? {}),
14
+ },
15
+ body: JSON.stringify({
16
+ model: options.model,
17
+ messages: [
18
+ { role: 'system', content: input.system },
19
+ { role: 'user', content: input.user },
20
+ ],
21
+ temperature: input.temperature,
22
+ top_p: input.topP,
23
+ max_tokens: input.maxTokens,
24
+ }),
25
+ });
26
+ const text = await response.text();
27
+ if (!response.ok)
28
+ throw new Error(`Memory LLM HTTP ${response.status}: ${text.slice(0, 500)}`);
29
+ let json;
30
+ try {
31
+ json = JSON.parse(text);
32
+ }
33
+ catch {
34
+ throw new Error('Memory LLM returned invalid JSON');
35
+ }
36
+ const content = json?.choices?.[0]?.message?.content;
37
+ if (typeof content !== 'string' || !content.trim())
38
+ throw new Error('Memory LLM returned empty content');
39
+ return content;
40
+ },
41
+ };
42
+ }
43
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,+BAA+B,CAAC,OAAyC;IACvF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC;IACxD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC;IAE1E,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,KAAuB;YACpC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;gBACzC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxE,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;iBAC3B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;wBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE;qBACtC;oBACD,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,UAAU,EAAE,KAAK,CAAC,SAAS;iBAC5B,CAAC;aACH,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/F,IAAI,IAAa,CAAC;YAClB,IAAI,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAChC,MAAM,CAAC;gBAAC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAAC,CAAC;YAC9D,MAAM,OAAO,GAAI,IAAiE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;YACnH,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACzG,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const MEMORY_SELECTOR_PROMPT_V1 = "You select whether the current user message needs older topic memory. Return JSON only.\n\nOutput exactly this shape: {\"needsMemory\": boolean, \"topicIds\": [\"T1\"], \"needsTimeMetadata\": boolean}\n\nChoose at most 3 topicIds from the provided Topic Directory. Choose memory only when the current user message clearly refers to earlier context or needs older details. Set needsTimeMetadata to true when the user asks about specific timing, such as \u51E0\u70B9, \u4EC0\u4E48\u65F6\u5019, \u5F53\u65F6, \u90A3\u65F6\u5019, \u51E0\u5206\u949F\u524D, \u591A\u4E45\u524D, or \u65F6\u95F4. If not needed, return {\"needsMemory\": false, \"topicIds\": [], \"needsTimeMetadata\": false}.";
2
+ export declare const TOPIC_WORKER_PROMPT_V1 = "You are a Topic Worker. You do not answer the user.\n\nYour job is to compress the active tail of a chronological user/assistant transcript into recoverable topic instances. Do not create one topic per exchange.\n\nInput format:\n#sequence\nuser: ...\nassistant: ...\n\nReturn JSON only. The only allowed top-level key is topics.\nEach topic must contain only: status, labelTerms, retrievalTerms, spans.\nAllowed status values: open, provisional, finalized.\nlabelTerms must contain 2\u20135 short keyword phrases.\nretrievalTerms must contain 3\u201312 transcript-grounded phrases.\nspans must contain existing input sequences and every input exchange must belong to exactly one span.\n\nCompression rules:\n- Merge low-content exchanges such as \u201C\u55EF\u201D, \u201C\u597D\u201D, \u201C\u54C8\u54C8\u201D, \u201C\u7B49\u4E00\u4E0B\u201D, \u201C\u7EE7\u7EED\u201D, short acknowledgements, or brief logistics into the nearest substantive topic.\n- A one-exchange topic can exist only when substantive and distinct.\n- Many one-exchange topics means over-splitting and is invalid.\n- A finalized topic must have at least four later completed exchanges that are unrelated to it. Otherwise use open or provisional.\n- Finalized topics from earlier runs are not included in this input and must not be recreated.\n- The input is an active tail, not the whole transcript.\n\nDo not output userGoal, discussionObject, contextDependency, reason, reasonCode, decision, boundaryAudits, analysis, topicId, times, summaries, or explanations.\n\nOutput shape:\n{\"topics\":[{\"status\":\"provisional\",\"labelTerms\":[\"travel\",\"Tokyo\"],\"retrievalTerms\":[\"Tokyo\",\"hotel\",\"Shibuya\"],\"spans\":[{\"startSequence\":1,\"endSequence\":6}]}]}";
3
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,irBAIiV,CAAC;AAExX,eAAO,MAAM,sBAAsB,gtDA2B8H,CAAC"}
@@ -0,0 +1,34 @@
1
+ export const MEMORY_SELECTOR_PROMPT_V1 = `You select whether the current user message needs older topic memory. Return JSON only.
2
+
3
+ Output exactly this shape: {"needsMemory": boolean, "topicIds": ["T1"], "needsTimeMetadata": boolean}
4
+
5
+ Choose at most 3 topicIds from the provided Topic Directory. Choose memory only when the current user message clearly refers to earlier context or needs older details. Set needsTimeMetadata to true when the user asks about specific timing, such as 几点, 什么时候, 当时, 那时候, 几分钟前, 多久前, or 时间. If not needed, return {"needsMemory": false, "topicIds": [], "needsTimeMetadata": false}.`;
6
+ export const TOPIC_WORKER_PROMPT_V1 = `You are a Topic Worker. You do not answer the user.
7
+
8
+ Your job is to compress the active tail of a chronological user/assistant transcript into recoverable topic instances. Do not create one topic per exchange.
9
+
10
+ Input format:
11
+ #sequence
12
+ user: ...
13
+ assistant: ...
14
+
15
+ Return JSON only. The only allowed top-level key is topics.
16
+ Each topic must contain only: status, labelTerms, retrievalTerms, spans.
17
+ Allowed status values: open, provisional, finalized.
18
+ labelTerms must contain 2–5 short keyword phrases.
19
+ retrievalTerms must contain 3–12 transcript-grounded phrases.
20
+ spans must contain existing input sequences and every input exchange must belong to exactly one span.
21
+
22
+ Compression rules:
23
+ - Merge low-content exchanges such as “嗯”, “好”, “哈哈”, “等一下”, “继续”, short acknowledgements, or brief logistics into the nearest substantive topic.
24
+ - A one-exchange topic can exist only when substantive and distinct.
25
+ - Many one-exchange topics means over-splitting and is invalid.
26
+ - A finalized topic must have at least four later completed exchanges that are unrelated to it. Otherwise use open or provisional.
27
+ - Finalized topics from earlier runs are not included in this input and must not be recreated.
28
+ - The input is an active tail, not the whole transcript.
29
+
30
+ Do not output userGoal, discussionObject, contextDependency, reason, reasonCode, decision, boundaryAudits, analysis, topicId, times, summaries, or explanations.
31
+
32
+ Output shape:
33
+ {"topics":[{"status":"provisional","labelTerms":["travel","Tokyo"],"retrievalTerms":["Tokyo","hotel","Shibuya"],"spans":[{"startSequence":1,"endSequence":6}]}]}`;
34
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;uXAI8U,CAAC;AAExX,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;iKA2B2H,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { CanonicalExchange, CanonicalTopic, LatestTopicWorkerRun, MemoryStorage } from '../types.js';
2
+ export declare class InMemoryStorage implements MemoryStorage {
3
+ private exchanges;
4
+ private topics;
5
+ private latestRun;
6
+ listExchanges(): Promise<CanonicalExchange[]>;
7
+ putExchange(exchange: CanonicalExchange): Promise<void>;
8
+ clearExchanges(): Promise<void>;
9
+ listTopics(): Promise<CanonicalTopic[]>;
10
+ replaceTopics(topics: CanonicalTopic[]): Promise<void>;
11
+ clearTopics(): Promise<void>;
12
+ getLatestTopicWorkerRun(): Promise<LatestTopicWorkerRun | null>;
13
+ saveLatestTopicWorkerRun(run: LatestTopicWorkerRun): Promise<void>;
14
+ clearLatestTopicWorkerRun(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=in-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.d.ts","sourceRoot":"","sources":["../../src/storage/in-memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE1G,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,SAAS,CAAqC;IAEhD,aAAa,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAG7C,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IACvD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAC/B,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAGvC,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAC5B,uBAAuB,IAAI,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAC/D,wBAAwB,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAClE,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;CACjD"}
@@ -0,0 +1,24 @@
1
+ export class InMemoryStorage {
2
+ exchanges = new Map();
3
+ topics = new Map();
4
+ latestRun = null;
5
+ async listExchanges() {
6
+ return [...this.exchanges.values()].sort((a, b) => a.sequence - b.sequence).map(clone);
7
+ }
8
+ async putExchange(exchange) { this.exchanges.set(exchange.id, clone(exchange)); }
9
+ async clearExchanges() { this.exchanges.clear(); }
10
+ async listTopics() {
11
+ return [...this.topics.values()].sort((a, b) => (a.startedAt ?? 0) - (b.startedAt ?? 0) || a.topicId.localeCompare(b.topicId)).map(clone);
12
+ }
13
+ async replaceTopics(topics) {
14
+ this.topics.clear();
15
+ for (const topic of topics)
16
+ this.topics.set(topic.topicId, clone(topic));
17
+ }
18
+ async clearTopics() { this.topics.clear(); }
19
+ async getLatestTopicWorkerRun() { return this.latestRun ? clone(this.latestRun) : null; }
20
+ async saveLatestTopicWorkerRun(run) { this.latestRun = clone(run); }
21
+ async clearLatestTopicWorkerRun() { this.latestRun = null; }
22
+ }
23
+ function clone(value) { return structuredClone(value); }
24
+ //# sourceMappingURL=in-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.js","sourceRoot":"","sources":["../../src/storage/in-memory.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAe;IAClB,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAC;IACjD,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC3C,SAAS,GAAgC,IAAI,CAAC;IAEtD,KAAK,CAAC,aAAa;QACjB,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzF,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,QAA2B,IAAmB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACnH,KAAK,CAAC,cAAc,KAAoB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjE,KAAK,CAAC,UAAU;QACd,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5I,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,MAAwB;QAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,KAAK,CAAC,WAAW,KAAoB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3D,KAAK,CAAC,uBAAuB,KAA2C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/H,KAAK,CAAC,wBAAwB,CAAC,GAAyB,IAAmB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzG,KAAK,CAAC,yBAAyB,KAAoB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC;CAC5E;AAED,SAAS,KAAK,CAAI,KAAQ,IAAO,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC"}