@hy-sde-org/dsh-memory-extraction 0.1.2-rc.1
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/LICENSE +21 -0
- package/README.i18n.yaml +6 -0
- package/README.md +148 -0
- package/README.zh.md +134 -0
- package/dist/control.d.ts +42 -0
- package/dist/control.d.ts.map +1 -0
- package/dist/control.js +125 -0
- package/dist/control.js.map +1 -0
- package/dist/engine.d.ts +78 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +411 -0
- package/dist/engine.js.map +1 -0
- package/dist/events.d.ts +19 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +76 -0
- package/dist/events.js.map +1 -0
- package/dist/evidence.d.ts +66 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +221 -0
- package/dist/evidence.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/memory-adapter.d.ts +44 -0
- package/dist/memory-adapter.d.ts.map +1 -0
- package/dist/memory-adapter.js +69 -0
- package/dist/memory-adapter.js.map +1 -0
- package/dist/proposal.d.ts +63 -0
- package/dist/proposal.d.ts.map +1 -0
- package/dist/proposal.js +309 -0
- package/dist/proposal.js.map +1 -0
- package/dist/runtime.d.ts +56 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +172 -0
- package/dist/runtime.js.map +1 -0
- package/dist/types.d.ts +196 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
package/dist/engine.js
ADDED
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The memory-extraction engine: a bounded, fail-open pipeline over frozen
|
|
3
|
+
* evidence. Ported from Maka `memory-extraction.ts` with the compaction-only
|
|
4
|
+
* surface (no `remember`/`extract` tools, no per-checkpoint policy denials,
|
|
5
|
+
* no range-splitting) and the same load-bearing rules:
|
|
6
|
+
*
|
|
7
|
+
* - evidence is user-authored text only, bounded and fail-closed on overflow;
|
|
8
|
+
* - proposal → admission → canonicalization → re-admission, with verbatim
|
|
9
|
+
* quote verification and deterministic secret rejection;
|
|
10
|
+
* - the per-session cursor only moves to a committed boundary; empty ranges
|
|
11
|
+
* still advance; a failed range becomes one pending record retried by the
|
|
12
|
+
* next trigger and then discarded;
|
|
13
|
+
* - every run is idempotent by deterministic operation id.
|
|
14
|
+
*
|
|
15
|
+
* The engine is pure (ports only, no cordis, no live session) so the whole
|
|
16
|
+
* state machine is unit-testable with fakes.
|
|
17
|
+
* @module @hy-sde-org/dsh-memory-extraction/engine
|
|
18
|
+
*/
|
|
19
|
+
import { createHash } from 'node:crypto';
|
|
20
|
+
import { evidenceByRef, fitMemoryExtractionEvidence, planMemoryCoverage, projectMemoryExtractionEvidence, renderMemoryLocalizationContext, searchSameSessionMemoryHistory, } from "./evidence.js";
|
|
21
|
+
import { admitMemoryProposalItem, buildFirstMemoryProposalPrompt, buildLocalizedMemoryProposalPrompt, buildMemoryCanonicalizationPrompt, deterministicMemoryPolicyRejection, parseLocalizedMemoryProposal, parseMemoryCanonicalization, parseMemoryProposal, } from "./proposal.js";
|
|
22
|
+
/** Max auxiliary model calls per range (Maka: 3). */
|
|
23
|
+
export const MAX_MEMORY_EXTRACTION_MODEL_CALLS = 3;
|
|
24
|
+
/** One later retry after a settled failure, then discard (Maka keeps more states). */
|
|
25
|
+
export const MAX_FAILURE_ATTEMPTS = 2;
|
|
26
|
+
export class MemoryExtractionEngine {
|
|
27
|
+
ports;
|
|
28
|
+
constructor(ports) {
|
|
29
|
+
this.ports = ports;
|
|
30
|
+
}
|
|
31
|
+
async execute(snapshot) {
|
|
32
|
+
if (!validSnapshot(snapshot))
|
|
33
|
+
return { status: 'unavailable', reason: 'invalid snapshot' };
|
|
34
|
+
const operationId = memoryExtractionOperationId(snapshot);
|
|
35
|
+
const gate = await this.ports.readGate(snapshot);
|
|
36
|
+
if (!gate.allowed)
|
|
37
|
+
return { status: 'unavailable', reason: `gate: ${gate.reason}` };
|
|
38
|
+
const existing = await this.ports.readReceipt(operationId);
|
|
39
|
+
if (existing) {
|
|
40
|
+
return existing.status === 'extracted'
|
|
41
|
+
? { status: 'extracted', items: existing.items }
|
|
42
|
+
: { status: 'skipped' };
|
|
43
|
+
}
|
|
44
|
+
const entries = await this.ports.readEvents(snapshot.sessionId, 0, snapshot.boundarySeq);
|
|
45
|
+
const cursor = await this.ports.readCursor(snapshot.sessionId);
|
|
46
|
+
const expectedCursor = cursor?.processedSeq ?? -1;
|
|
47
|
+
if (expectedCursor >= snapshot.boundarySeq)
|
|
48
|
+
return { status: 'no_range' };
|
|
49
|
+
const pendingFailure = await this.ports.readFailure(snapshot.sessionId);
|
|
50
|
+
if (pendingFailure && pendingFailure.throughSeq > snapshot.boundarySeq) {
|
|
51
|
+
return { status: 'unavailable', reason: 'pending failure outside trigger boundary' };
|
|
52
|
+
}
|
|
53
|
+
if (pendingFailure && pendingFailure.fromSeq !== expectedCursor + 1) {
|
|
54
|
+
// Stale pending (cursor advanced but the failure row was not removed).
|
|
55
|
+
await this.ports.deleteFailure(snapshot.sessionId);
|
|
56
|
+
}
|
|
57
|
+
else if (pendingFailure) {
|
|
58
|
+
const expectedHash = memoryCoverageHash(entries, expectedCursor, pendingFailure.throughSeq);
|
|
59
|
+
if (pendingFailure.coverageHash !== expectedHash) {
|
|
60
|
+
return { status: 'unavailable', reason: 'pending failure coverage changed' };
|
|
61
|
+
}
|
|
62
|
+
const retried = await this.processRange({
|
|
63
|
+
snapshot,
|
|
64
|
+
operationId: pendingFailure.operationId,
|
|
65
|
+
expectedCursor,
|
|
66
|
+
throughSeq: pendingFailure.throughSeq,
|
|
67
|
+
expectedCoverageHash: pendingFailure.coverageHash,
|
|
68
|
+
entries,
|
|
69
|
+
});
|
|
70
|
+
if (retried.kind === 'committed') {
|
|
71
|
+
await this.ports.deleteFailure(snapshot.sessionId);
|
|
72
|
+
return retried.committed.length > 0
|
|
73
|
+
? { status: 'extracted', items: retried.committed }
|
|
74
|
+
: { status: 'skipped' };
|
|
75
|
+
}
|
|
76
|
+
if (retried.kind === 'blocked') {
|
|
77
|
+
return { status: 'unavailable', reason: 'blocked' };
|
|
78
|
+
}
|
|
79
|
+
const settled = await this.settleCountedFailure({
|
|
80
|
+
snapshot,
|
|
81
|
+
operationId: pendingFailure.operationId,
|
|
82
|
+
expectedCursor,
|
|
83
|
+
throughSeq: pendingFailure.throughSeq,
|
|
84
|
+
coverageHash: pendingFailure.coverageHash,
|
|
85
|
+
failureClass: retried.failureClass,
|
|
86
|
+
priorAttempts: pendingFailure.attempts,
|
|
87
|
+
});
|
|
88
|
+
if (settled === 'discarded')
|
|
89
|
+
await this.ports.deleteFailure(snapshot.sessionId);
|
|
90
|
+
return { status: 'unavailable', reason: `failure: ${retried.failureClass}` };
|
|
91
|
+
}
|
|
92
|
+
const processed = await this.processRange({
|
|
93
|
+
snapshot,
|
|
94
|
+
operationId,
|
|
95
|
+
expectedCursor,
|
|
96
|
+
throughSeq: snapshot.boundarySeq,
|
|
97
|
+
entries,
|
|
98
|
+
});
|
|
99
|
+
if (processed.kind === 'committed') {
|
|
100
|
+
return processed.committed.length > 0
|
|
101
|
+
? { status: 'extracted', items: processed.committed }
|
|
102
|
+
: { status: 'skipped' };
|
|
103
|
+
}
|
|
104
|
+
if (processed.kind === 'blocked')
|
|
105
|
+
return { status: 'unavailable', reason: 'blocked' };
|
|
106
|
+
const settled = await this.settleCountedFailure({
|
|
107
|
+
snapshot,
|
|
108
|
+
operationId,
|
|
109
|
+
expectedCursor,
|
|
110
|
+
throughSeq: snapshot.boundarySeq,
|
|
111
|
+
coverageHash: memoryCoverageHash(entries, expectedCursor, snapshot.boundarySeq),
|
|
112
|
+
failureClass: processed.failureClass,
|
|
113
|
+
priorAttempts: 0,
|
|
114
|
+
});
|
|
115
|
+
if (settled === 'discarded')
|
|
116
|
+
await this.ports.deleteFailure(snapshot.sessionId);
|
|
117
|
+
return { status: 'unavailable', reason: `failure: ${processed.failureClass}` };
|
|
118
|
+
}
|
|
119
|
+
/* ── range processing ─────────────────────────────────────────────────── */
|
|
120
|
+
async processRange(input) {
|
|
121
|
+
const pendingEntries = input.entries.filter(entry => entry.seq > input.expectedCursor && entry.seq <= input.throughSeq);
|
|
122
|
+
const coverageHash = memoryCoverageHash(input.entries, input.expectedCursor, input.throughSeq);
|
|
123
|
+
if (input.expectedCoverageHash !== undefined && input.expectedCoverageHash !== coverageHash) {
|
|
124
|
+
return { kind: 'blocked' };
|
|
125
|
+
}
|
|
126
|
+
if (pendingEntries.length === 0) {
|
|
127
|
+
await this.commitEmpty(input.snapshot, input.operationId, input.expectedCursor, input.throughSeq);
|
|
128
|
+
return { kind: 'committed', committed: [] };
|
|
129
|
+
}
|
|
130
|
+
const coverage = planMemoryCoverage(pendingEntries);
|
|
131
|
+
if (!coverage)
|
|
132
|
+
return { kind: 'counted_failure', failureClass: 'evidence' };
|
|
133
|
+
// A range with events but no user evidence still advances: no model call.
|
|
134
|
+
if (coverage.evidence.length === 0) {
|
|
135
|
+
await this.commitEmpty(input.snapshot, input.operationId, input.expectedCursor, input.throughSeq);
|
|
136
|
+
return { kind: 'committed', committed: [] };
|
|
137
|
+
}
|
|
138
|
+
const budget = { remaining: MAX_MEMORY_EXTRACTION_MODEL_CALLS };
|
|
139
|
+
const now = this.now();
|
|
140
|
+
const result = await this.processCoverage({
|
|
141
|
+
snapshot: input.snapshot,
|
|
142
|
+
operationId: input.operationId,
|
|
143
|
+
expectedCursor: input.expectedCursor,
|
|
144
|
+
throughSeq: input.throughSeq,
|
|
145
|
+
coverage,
|
|
146
|
+
entries: input.entries,
|
|
147
|
+
budget,
|
|
148
|
+
now,
|
|
149
|
+
});
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
async processCoverage(input) {
|
|
153
|
+
const { coverage, budget } = input;
|
|
154
|
+
// Stage 1: proposal over the bounded evidence.
|
|
155
|
+
let proposals;
|
|
156
|
+
let localizedEvidence;
|
|
157
|
+
let interpretationContext;
|
|
158
|
+
const stageOne = await this.callModel(input.snapshot, buildFirstMemoryProposalPrompt({ now: input.now, evidence: coverage.evidence }), 'proposal', budget);
|
|
159
|
+
if (stageOne.kind !== 'ok')
|
|
160
|
+
return stageOne;
|
|
161
|
+
const first = parseMemoryProposal(stageOne.text);
|
|
162
|
+
if (!first)
|
|
163
|
+
return { kind: 'counted_failure', failureClass: 'schema' };
|
|
164
|
+
if (first.status === 'search_required') {
|
|
165
|
+
if (!(await this.allowed(input.snapshot)))
|
|
166
|
+
return { kind: 'blocked' };
|
|
167
|
+
const localizedEntries = searchSameSessionMemoryHistory(input.entries, input.throughSeq, first.search, input.expectedCursor);
|
|
168
|
+
if (localizedEntries.length === 0)
|
|
169
|
+
return { kind: 'counted_failure', failureClass: 'localization' };
|
|
170
|
+
interpretationContext = renderMemoryLocalizationContext(localizedEntries);
|
|
171
|
+
if (!interpretationContext)
|
|
172
|
+
return { kind: 'counted_failure', failureClass: 'localization' };
|
|
173
|
+
const projected = projectMemoryExtractionEvidence(localizedEntries.map(entry => entry.event));
|
|
174
|
+
const fitted = fitMemoryExtractionEvidence(projected);
|
|
175
|
+
if (!fitted)
|
|
176
|
+
return { kind: 'counted_failure', failureClass: 'evidence' };
|
|
177
|
+
localizedEvidence = fitted;
|
|
178
|
+
if (budget.remaining <= 0)
|
|
179
|
+
return { kind: 'counted_failure', failureClass: 'localization' };
|
|
180
|
+
const localizedCall = await this.callModel(input.snapshot, buildLocalizedMemoryProposalPrompt({
|
|
181
|
+
now: input.now,
|
|
182
|
+
evidence: fitted,
|
|
183
|
+
interpretationContext,
|
|
184
|
+
}), 'localized', budget);
|
|
185
|
+
if (localizedCall.kind !== 'ok')
|
|
186
|
+
return localizedCall;
|
|
187
|
+
const localized = parseLocalizedMemoryProposal(localizedCall.text);
|
|
188
|
+
if (!localized)
|
|
189
|
+
return { kind: 'counted_failure', failureClass: 'schema' };
|
|
190
|
+
if (localized.status === 'cannot_resolve') {
|
|
191
|
+
return { kind: 'counted_failure', failureClass: 'localization' };
|
|
192
|
+
}
|
|
193
|
+
proposals = localized.incidents;
|
|
194
|
+
}
|
|
195
|
+
else if (first.status === 'cannot_resolve') {
|
|
196
|
+
return { kind: 'counted_failure', failureClass: 'localization' };
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
proposals = first.incidents;
|
|
200
|
+
}
|
|
201
|
+
// Admission (incidental): skip policy-rejected or unverifiable items.
|
|
202
|
+
const evidenceMap = evidenceByRef(localizedEvidence ?? coverage.evidence);
|
|
203
|
+
const candidates = [];
|
|
204
|
+
for (const proposal of proposals) {
|
|
205
|
+
if (deterministicMemoryPolicyRejection(proposal))
|
|
206
|
+
continue;
|
|
207
|
+
const admitted = admitMemoryProposalItem(proposal, evidenceMap);
|
|
208
|
+
if (admitted === undefined)
|
|
209
|
+
continue;
|
|
210
|
+
candidates.push({
|
|
211
|
+
candidateId: `candidate_${candidates.length}`,
|
|
212
|
+
item: proposal,
|
|
213
|
+
admitted,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (candidates.length === 0) {
|
|
217
|
+
await this.commitEmpty(input.snapshot, input.operationId, input.expectedCursor, input.throughSeq);
|
|
218
|
+
return { kind: 'committed', committed: [] };
|
|
219
|
+
}
|
|
220
|
+
// Stage 2: canonicalization, then re-admission against the same evidence.
|
|
221
|
+
const writes = [];
|
|
222
|
+
const canonicalPrompt = buildMemoryCanonicalizationPrompt({
|
|
223
|
+
now: input.now,
|
|
224
|
+
candidates: candidates.map(candidate => ({
|
|
225
|
+
candidateId: candidate.candidateId,
|
|
226
|
+
evidence: candidate.item.evidence
|
|
227
|
+
.map(citation => ({
|
|
228
|
+
sourceRef: citation.sourceRef,
|
|
229
|
+
quote: citation.quote,
|
|
230
|
+
observedAt: Math.max(0, ...candidate.admitted.citedSeqs),
|
|
231
|
+
})),
|
|
232
|
+
})),
|
|
233
|
+
});
|
|
234
|
+
let byId;
|
|
235
|
+
let canonicalFailureClass = 'schema';
|
|
236
|
+
while (byId === undefined && budget.remaining > 0) {
|
|
237
|
+
const canonicalCall = await this.callModel(input.snapshot, canonicalPrompt, 'canonicalize', budget);
|
|
238
|
+
if (canonicalCall.kind === 'blocked')
|
|
239
|
+
return canonicalCall;
|
|
240
|
+
if (canonicalCall.kind !== 'ok') {
|
|
241
|
+
canonicalFailureClass = 'provider';
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
const parsed = parseMemoryCanonicalization(canonicalCall.text);
|
|
245
|
+
if (parsed === undefined || parsed.results.length !== candidates.length) {
|
|
246
|
+
canonicalFailureClass = 'schema';
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
const indexed = new Map(parsed.results.map(result => [result.candidateId, result]));
|
|
250
|
+
if (indexed.size !== candidates.length
|
|
251
|
+
|| candidates.some(candidate => !indexed.has(candidate.candidateId))) {
|
|
252
|
+
canonicalFailureClass = 'schema';
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
const entries = [];
|
|
256
|
+
for (const [id, result] of indexed) {
|
|
257
|
+
entries.push([
|
|
258
|
+
id,
|
|
259
|
+
{
|
|
260
|
+
status: result.status,
|
|
261
|
+
...result.content !== undefined ? { content: result.content } : {},
|
|
262
|
+
},
|
|
263
|
+
]);
|
|
264
|
+
}
|
|
265
|
+
byId = new Map(entries);
|
|
266
|
+
}
|
|
267
|
+
if (byId === undefined) {
|
|
268
|
+
return budget.remaining <= 0 && canonicalFailureClass === 'provider'
|
|
269
|
+
? { kind: 'counted_failure', failureClass: 'provider' }
|
|
270
|
+
: { kind: 'counted_failure', failureClass: canonicalFailureClass };
|
|
271
|
+
}
|
|
272
|
+
for (const candidate of candidates) {
|
|
273
|
+
const result = byId.get(candidate.candidateId);
|
|
274
|
+
if (result === undefined || result.status === 'rejected')
|
|
275
|
+
continue;
|
|
276
|
+
const content = result.content;
|
|
277
|
+
if (content === undefined)
|
|
278
|
+
continue;
|
|
279
|
+
const canonicalProposal = {
|
|
280
|
+
content,
|
|
281
|
+
evidence: candidate.item.evidence,
|
|
282
|
+
};
|
|
283
|
+
if (deterministicMemoryPolicyRejection(canonicalProposal))
|
|
284
|
+
continue;
|
|
285
|
+
const admitted = admitMemoryProposalItem(canonicalProposal, evidenceMap);
|
|
286
|
+
if (admitted === undefined)
|
|
287
|
+
continue;
|
|
288
|
+
writes.push(admitted);
|
|
289
|
+
}
|
|
290
|
+
if (writes.length === 0) {
|
|
291
|
+
await this.commitEmpty(input.snapshot, input.operationId, input.expectedCursor, input.throughSeq);
|
|
292
|
+
return { kind: 'committed', committed: [] };
|
|
293
|
+
}
|
|
294
|
+
if (!(await this.allowed(input.snapshot)))
|
|
295
|
+
return { kind: 'blocked' };
|
|
296
|
+
// Commit order: items first (dedupe is the cross-store idempotency
|
|
297
|
+
// backstop), then cursor, then receipt.
|
|
298
|
+
const committed = await this.ports.commitItems({
|
|
299
|
+
sessionId: input.snapshot.sessionId,
|
|
300
|
+
...input.snapshot.workspaceKey !== undefined
|
|
301
|
+
? { workspaceKey: input.snapshot.workspaceKey }
|
|
302
|
+
: {},
|
|
303
|
+
trigger: input.snapshot.trigger,
|
|
304
|
+
boundarySeq: input.throughSeq,
|
|
305
|
+
items: writes,
|
|
306
|
+
});
|
|
307
|
+
await this.ports.writeCursor({
|
|
308
|
+
sessionId: input.snapshot.sessionId,
|
|
309
|
+
processedSeq: input.throughSeq,
|
|
310
|
+
updatedAt: this.now(),
|
|
311
|
+
});
|
|
312
|
+
await this.ports.writeReceipt({
|
|
313
|
+
operationId: input.operationId,
|
|
314
|
+
sessionId: input.snapshot.sessionId,
|
|
315
|
+
status: 'extracted',
|
|
316
|
+
items: [...committed.committed],
|
|
317
|
+
committedAt: this.now(),
|
|
318
|
+
});
|
|
319
|
+
return { kind: 'committed', committed: committed.committed };
|
|
320
|
+
}
|
|
321
|
+
async commitEmpty(snapshot, operationId, expectedCursor, throughSeq) {
|
|
322
|
+
await this.ports.writeCursor({
|
|
323
|
+
sessionId: snapshot.sessionId,
|
|
324
|
+
processedSeq: Math.max(expectedCursor, throughSeq),
|
|
325
|
+
updatedAt: this.now(),
|
|
326
|
+
});
|
|
327
|
+
await this.ports.writeReceipt({
|
|
328
|
+
operationId,
|
|
329
|
+
sessionId: snapshot.sessionId,
|
|
330
|
+
status: 'skipped',
|
|
331
|
+
items: [],
|
|
332
|
+
committedAt: this.now(),
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
async settleCountedFailure(input) {
|
|
336
|
+
const attempts = input.priorAttempts + 1;
|
|
337
|
+
if (attempts >= MAX_FAILURE_ATTEMPTS) {
|
|
338
|
+
// Discard: advance the cursor and record the settlement. The range is
|
|
339
|
+
// intentionally dropped after one retry (never a third identical run).
|
|
340
|
+
await this.ports.writeCursor({
|
|
341
|
+
sessionId: input.snapshot.sessionId,
|
|
342
|
+
processedSeq: input.throughSeq,
|
|
343
|
+
updatedAt: this.now(),
|
|
344
|
+
});
|
|
345
|
+
await this.ports.writeReceipt({
|
|
346
|
+
operationId: input.operationId,
|
|
347
|
+
sessionId: input.snapshot.sessionId,
|
|
348
|
+
status: 'discarded',
|
|
349
|
+
items: [],
|
|
350
|
+
committedAt: this.now(),
|
|
351
|
+
});
|
|
352
|
+
return 'discarded';
|
|
353
|
+
}
|
|
354
|
+
await this.ports.writeFailure({
|
|
355
|
+
sessionId: input.snapshot.sessionId,
|
|
356
|
+
fromSeq: input.expectedCursor + 1,
|
|
357
|
+
throughSeq: input.throughSeq,
|
|
358
|
+
coverageHash: input.coverageHash,
|
|
359
|
+
operationId: input.operationId,
|
|
360
|
+
attempts,
|
|
361
|
+
failureClass: input.failureClass,
|
|
362
|
+
failedAt: this.now(),
|
|
363
|
+
});
|
|
364
|
+
return 'retry_later';
|
|
365
|
+
}
|
|
366
|
+
async callModel(snapshot, prompt, stage, budget) {
|
|
367
|
+
if (budget.remaining <= 0)
|
|
368
|
+
return { kind: 'counted_failure', failureClass: 'provider' };
|
|
369
|
+
if (!(await this.allowed(snapshot)))
|
|
370
|
+
return { kind: 'blocked' };
|
|
371
|
+
budget.remaining -= 1;
|
|
372
|
+
const result = await this.ports.generate({ snapshot, prompt, stage });
|
|
373
|
+
if (result.ok)
|
|
374
|
+
return { kind: 'ok', text: result.text };
|
|
375
|
+
if (!(await this.allowed(snapshot)))
|
|
376
|
+
return { kind: 'blocked' };
|
|
377
|
+
return result.errorClass === 'provider' || result.errorClass === 'timeout'
|
|
378
|
+
? { kind: 'counted_failure', failureClass: 'provider' }
|
|
379
|
+
: { kind: 'blocked' };
|
|
380
|
+
}
|
|
381
|
+
async allowed(snapshot) {
|
|
382
|
+
return (await this.ports.readGate(snapshot)).allowed;
|
|
383
|
+
}
|
|
384
|
+
now() {
|
|
385
|
+
if (this.ports.now === undefined)
|
|
386
|
+
return Date.now();
|
|
387
|
+
return this.ports.now();
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
/* ── helpers ─────────────────────────────────────────────────────────────── */
|
|
391
|
+
export function memoryExtractionOperationId(snapshot) {
|
|
392
|
+
return `memory_${createHash('sha256')
|
|
393
|
+
.update(JSON.stringify({
|
|
394
|
+
sessionId: snapshot.sessionId,
|
|
395
|
+
trigger: snapshot.trigger,
|
|
396
|
+
boundarySeq: snapshot.boundarySeq,
|
|
397
|
+
}))
|
|
398
|
+
.digest('hex')}`;
|
|
399
|
+
}
|
|
400
|
+
export function memoryCoverageHash(entries, fromSeq, throughSeq) {
|
|
401
|
+
return createHash('sha256')
|
|
402
|
+
.update(JSON.stringify(entries
|
|
403
|
+
.filter(entry => entry.seq > fromSeq && entry.seq <= throughSeq)
|
|
404
|
+
.map(entry => [entry.seq, `${entry.event.role}:${entry.event.author}:${entry.event.text?.length ?? 0}`])))
|
|
405
|
+
.digest('hex');
|
|
406
|
+
}
|
|
407
|
+
function validSnapshot(snapshot) {
|
|
408
|
+
return (typeof snapshot.sessionId === 'string' && snapshot.sessionId.length > 0
|
|
409
|
+
&& Number.isSafeInteger(snapshot.boundarySeq) && snapshot.boundarySeq >= 0);
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Projection of DSH session events into the portable text events the
|
|
3
|
+
* extraction pipeline reasons about. Deliberately lossy: only user-role text
|
|
4
|
+
* (evidence) and assistant-role text (interpretation context) carry `text`;
|
|
5
|
+
* tool calls/results, reasoning blocks, attachments, and runtime markers stay
|
|
6
|
+
* opaque (`role: 'other'`, no text) so nothing outside the memory domain can
|
|
7
|
+
* leak into prompts. Ported from Maka's `projectRuntimeConversation` /
|
|
8
|
+
* history-projection semantics.
|
|
9
|
+
* @module @hy-sde-org/dsh-memory-extraction/events
|
|
10
|
+
*/
|
|
11
|
+
import type { SessionEvent } from '@deepseek-ai/dsh-session';
|
|
12
|
+
import type { MemoryExtractionTextEvent } from './types.ts';
|
|
13
|
+
/**
|
|
14
|
+
* Project one session event window into portable text events. `turns` tracks
|
|
15
|
+
* the open `turn/start…turn/end` so `user/message` events (which carry no turn
|
|
16
|
+
* field) still get a turn identity for localization grouping.
|
|
17
|
+
*/
|
|
18
|
+
export declare function projectTextEvents(events: readonly SessionEvent[]): MemoryExtractionTextEvent[];
|
|
19
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAU3D;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,yBAAyB,EAAE,CAqD9F"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Projection of DSH session events into the portable text events the
|
|
3
|
+
* extraction pipeline reasons about. Deliberately lossy: only user-role text
|
|
4
|
+
* (evidence) and assistant-role text (interpretation context) carry `text`;
|
|
5
|
+
* tool calls/results, reasoning blocks, attachments, and runtime markers stay
|
|
6
|
+
* opaque (`role: 'other'`, no text) so nothing outside the memory domain can
|
|
7
|
+
* leak into prompts. Ported from Maka's `projectRuntimeConversation` /
|
|
8
|
+
* history-projection semantics.
|
|
9
|
+
* @module @hy-sde-org/dsh-memory-extraction/events
|
|
10
|
+
*/
|
|
11
|
+
/** Join visible text blocks only (reasoning and images are never text evidence). */
|
|
12
|
+
function textBlocks(content) {
|
|
13
|
+
return content
|
|
14
|
+
.filter(block => block.type === 'text')
|
|
15
|
+
.map(block => block.text)
|
|
16
|
+
.join('');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Project one session event window into portable text events. `turns` tracks
|
|
20
|
+
* the open `turn/start…turn/end` so `user/message` events (which carry no turn
|
|
21
|
+
* field) still get a turn identity for localization grouping.
|
|
22
|
+
*/
|
|
23
|
+
export function projectTextEvents(events) {
|
|
24
|
+
const projected = [];
|
|
25
|
+
let currentTurn;
|
|
26
|
+
for (const event of events) {
|
|
27
|
+
const seq = event.seq;
|
|
28
|
+
if (event.type === 'turn/start') {
|
|
29
|
+
currentTurn = event.data.turn;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (event.type === 'turn/end') {
|
|
33
|
+
currentTurn = undefined;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (event.type === 'user/message') {
|
|
37
|
+
const rawKind = event.data.source.kind;
|
|
38
|
+
const author = rawKind === 'user' || rawKind === 'plugin' || rawKind === 'model' || rawKind === 'tool'
|
|
39
|
+
? rawKind
|
|
40
|
+
: 'other';
|
|
41
|
+
const text = textBlocks(event.data.content);
|
|
42
|
+
projected.push({
|
|
43
|
+
seq,
|
|
44
|
+
role: 'user',
|
|
45
|
+
author,
|
|
46
|
+
...text.length > 0 ? { text } : {},
|
|
47
|
+
...currentTurn !== undefined ? { turn: currentTurn } : {},
|
|
48
|
+
time: event.time,
|
|
49
|
+
});
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (event.type === 'assistant/message') {
|
|
53
|
+
const text = textBlocks(event.data.message.content);
|
|
54
|
+
projected.push({
|
|
55
|
+
seq,
|
|
56
|
+
role: 'assistant',
|
|
57
|
+
author: 'model',
|
|
58
|
+
...text.length > 0 ? { text } : {},
|
|
59
|
+
...currentTurn !== undefined ? { turn: currentTurn } : {},
|
|
60
|
+
time: event.time,
|
|
61
|
+
});
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// Tool calls, tool results, checkpoints, compaction markers, headers, …
|
|
65
|
+
// carry no memory text: opaque, no text, never evidence.
|
|
66
|
+
projected.push({
|
|
67
|
+
seq,
|
|
68
|
+
role: 'other',
|
|
69
|
+
author: event.type === 'tool/call' || event.type === 'tool/result' ? 'tool' : 'other',
|
|
70
|
+
...currentTurn !== undefined ? { turn: currentTurn } : {},
|
|
71
|
+
time: event.time,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return projected;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence planning for automatic memory extraction: which session events are
|
|
3
|
+
* Memory evidence (user-authored text only), how the bounded evidence index is
|
|
4
|
+
* fitted, and the same-session history search that localizes elliptical
|
|
5
|
+
* assertions. Ported from Maka `memory-extraction-evidence.ts`; provider-prefix
|
|
6
|
+
* binding is dropped (the bounded evidence text is authoritative for both the
|
|
7
|
+
* model and admission — see the package README deviation note).
|
|
8
|
+
* @module @hy-sde-org/dsh-memory-extraction/evidence
|
|
9
|
+
*/
|
|
10
|
+
import type { MemoryCoveragePlan, MemoryEvidenceCitation, MemoryExtractionEventEntry, MemoryExtractionEvidence, MemoryExtractionTextEvent } from './types.ts';
|
|
11
|
+
export declare const MAX_MEMORY_EVIDENCE_JSON_CHARS = 12000;
|
|
12
|
+
export declare const MAX_EVIDENCE_TEXT_CHARS = 4000;
|
|
13
|
+
export declare const MIN_EVIDENCE_TEXT_CHARS = 64;
|
|
14
|
+
export declare const MAX_LOCALIZED_TURNS = 7;
|
|
15
|
+
export declare const MAX_LOCALIZED_CONTEXT_CHARS = 12000;
|
|
16
|
+
export declare const MAX_LOCALIZED_EVENT_CHARS = 2000;
|
|
17
|
+
/**
|
|
18
|
+
* Plan one complete trigger range. Tool and runtime-control events produce no
|
|
19
|
+
* evidence but stay in the range so the session cursor crosses them instead of
|
|
20
|
+
* reconsidering them. If every user evidence record cannot fit the bounded
|
|
21
|
+
* evidence index, fail closed instead of silently consuming part of the range.
|
|
22
|
+
*/
|
|
23
|
+
export declare function planMemoryCoverage(pendingEntries: readonly MemoryExtractionEventEntry[], options?: {
|
|
24
|
+
readonly maxEvidenceJsonChars?: number;
|
|
25
|
+
}): MemoryCoveragePlan | undefined;
|
|
26
|
+
/** Projects only stable user-authored text into Memory evidence. */
|
|
27
|
+
export declare function projectMemoryExtractionEvidence(events: readonly MemoryExtractionTextEvent[]): readonly MemoryExtractionEvidence[];
|
|
28
|
+
/**
|
|
29
|
+
* Keep every evidence record represented while shrinking supplemental text to
|
|
30
|
+
* the actual serialized JSON budget. `undefined` means even the record
|
|
31
|
+
* identities cannot fit and the cursor must not advance.
|
|
32
|
+
*/
|
|
33
|
+
export declare function fitMemoryExtractionEvidence(evidence: readonly MemoryExtractionEvidence[], maxJsonChars?: number): readonly MemoryExtractionEvidence[] | undefined;
|
|
34
|
+
export declare function memoryExtractionEvidenceJsonSize(evidence: readonly MemoryExtractionEvidence[]): number;
|
|
35
|
+
/** The bounded evidence index rendered into the pipeline prompts. */
|
|
36
|
+
export declare function renderMemoryExtractionEvidence(evidence: readonly MemoryExtractionEvidence[]): readonly {
|
|
37
|
+
readonly sourceRef: string;
|
|
38
|
+
readonly type: 'user_message';
|
|
39
|
+
readonly observedAt: number;
|
|
40
|
+
readonly text: string;
|
|
41
|
+
}[];
|
|
42
|
+
/**
|
|
43
|
+
* Rank matching turns by term coverage and recency, then add a one-turn
|
|
44
|
+
* neighborhood. Applies over the same bounded event window (`throughSeq`).
|
|
45
|
+
* A "turn" is the adapter-declared `turn` id when present (DSH turn numbers);
|
|
46
|
+
* otherwise each text event is its own group.
|
|
47
|
+
*/
|
|
48
|
+
export declare function searchSameSessionMemoryHistory(entries: readonly MemoryExtractionEventEntry[], throughSeq: number, search: {
|
|
49
|
+
readonly terms: readonly string[];
|
|
50
|
+
readonly roles?: readonly string[];
|
|
51
|
+
}, afterSeq?: number): readonly MemoryExtractionEventEntry[];
|
|
52
|
+
/** Bounded user/assistant text used only to interpret elliptical user evidence. */
|
|
53
|
+
export declare function renderMemoryLocalizationContext(entries: readonly MemoryExtractionEventEntry[]): string;
|
|
54
|
+
/** Resolve the admission evidence map for one coverage plan. */
|
|
55
|
+
export declare function evidenceByRef(evidence: readonly MemoryExtractionEvidence[]): ReadonlyMap<string, MemoryExtractionEvidence>;
|
|
56
|
+
/** Whether one citation's quote is verbatim inside its referenced evidence. */
|
|
57
|
+
export declare function evidenceContainsCitation(citation: MemoryEvidenceCitation, evidence: ReadonlyMap<string, MemoryExtractionEvidence>): boolean;
|
|
58
|
+
export declare function normalizeEvidenceText(value: string): string;
|
|
59
|
+
export declare function minuteTimestamp(value: number): number;
|
|
60
|
+
export declare function historyRole(event: MemoryExtractionTextEvent): 'user' | 'assistant';
|
|
61
|
+
export declare function sliceCodePoints(value: string, maximum: number): string;
|
|
62
|
+
/** Event identity of one entry, used by the coverage hash. */
|
|
63
|
+
export declare function coverageEntryIdentity(entry: MemoryExtractionEventEntry): [number, string];
|
|
64
|
+
/** Sort helper retained for tests and derived projections. */
|
|
65
|
+
export declare function sortEntriesBySeq(entries: readonly MemoryExtractionEventEntry[]): MemoryExtractionEventEntry[];
|
|
66
|
+
//# sourceMappingURL=evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,8BAA8B,QAAS,CAAA;AACpD,eAAO,MAAM,uBAAuB,OAAQ,CAAA;AAC5C,eAAO,MAAM,uBAAuB,KAAK,CAAA;AACzC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,2BAA2B,QAAS,CAAA;AACjD,eAAO,MAAM,yBAAyB,OAAQ,CAAA;AAE9C;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,SAAS,0BAA0B,EAAE,EACrD,OAAO,GAAE;IAAE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAAO,GACvD,kBAAkB,GAAG,SAAS,CAWhC;AAED,oEAAoE;AACpE,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,SAAS,yBAAyB,EAAE,GAC3C,SAAS,wBAAwB,EAAE,CAcrC;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,EAC7C,YAAY,SAAiC,GAC5C,SAAS,wBAAwB,EAAE,GAAG,SAAS,CAoBjD;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,GAAG,MAAM,CAEtG;AAED,qEAAqE;AACrE,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,SAAS,wBAAwB,EAAE,GAC5C,SAAS;IACV,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,EAAE,CAOF;AASD;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,SAAS,0BAA0B,EAAE,EAC9C,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EACjF,QAAQ,SAAI,GACX,SAAS,0BAA0B,EAAE,CAyCvC;AAED,mFAAmF;AACnF,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,SAAS,0BAA0B,EAAE,GAC7C,MAAM,CAcR;AAED,gEAAgE;AAChE,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,SAAS,wBAAwB,EAAE,GAC5C,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAE/C;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,sBAAsB,EAChC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,GACtD,OAAO,CAMT;AAsBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,yBAAyB,GAAG,MAAM,GAAG,WAAW,CAElF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,8DAA8D;AAC9D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAKzF;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,0BAA0B,EAAE,GAAG,0BAA0B,EAAE,CAE7G"}
|