dsh-memory-gate 0.2.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/CHANGELOG.md +32 -0
- package/LICENSE +21 -0
- package/README.md +126 -0
- package/cordis.patch.yml +14 -0
- package/docs/architecture.md +142 -0
- package/docs/benchmark.md +41 -0
- package/lib/authority.d.ts +9 -0
- package/lib/authority.d.ts.map +1 -0
- package/lib/authority.js +71 -0
- package/lib/authority.js.map +1 -0
- package/lib/commands.d.ts +7 -0
- package/lib/commands.d.ts.map +1 -0
- package/lib/commands.js +225 -0
- package/lib/commands.js.map +1 -0
- package/lib/config.d.ts +19 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +33 -0
- package/lib/config.js.map +1 -0
- package/lib/contracts.d.ts +94 -0
- package/lib/contracts.d.ts.map +1 -0
- package/lib/contracts.js +2 -0
- package/lib/contracts.js.map +1 -0
- package/lib/extractor.d.ts +8 -0
- package/lib/extractor.d.ts.map +1 -0
- package/lib/extractor.js +44 -0
- package/lib/extractor.js.map +1 -0
- package/lib/harness.d.ts +19 -0
- package/lib/harness.d.ts.map +1 -0
- package/lib/harness.js +85 -0
- package/lib/harness.js.map +1 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +44 -0
- package/lib/index.js.map +1 -0
- package/lib/message-text.d.ts +3 -0
- package/lib/message-text.d.ts.map +1 -0
- package/lib/message-text.js +21 -0
- package/lib/message-text.js.map +1 -0
- package/lib/redaction.d.ts +7 -0
- package/lib/redaction.d.ts.map +1 -0
- package/lib/redaction.js +23 -0
- package/lib/redaction.js.map +1 -0
- package/lib/repository.d.ts +39 -0
- package/lib/repository.d.ts.map +1 -0
- package/lib/repository.js +492 -0
- package/lib/repository.js.map +1 -0
- package/lib/scope.d.ts +4 -0
- package/lib/scope.d.ts.map +1 -0
- package/lib/scope.js +26 -0
- package/lib/scope.js.map +1 -0
- package/lib/service.d.ts +42 -0
- package/lib/service.d.ts.map +1 -0
- package/lib/service.js +157 -0
- package/lib/service.js.map +1 -0
- package/package.json +74 -0
package/lib/commands.js
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { readableScopeKey, sessionScopeKey, workspaceScopeKey } from './scope.js';
|
|
2
|
+
import { MemoryService, parseClaimKind, parseClaimScope } from './service.js';
|
|
3
|
+
const USAGE = [
|
|
4
|
+
'/memory status',
|
|
5
|
+
'/memory list [limit]',
|
|
6
|
+
'/memory remember [--scope session|workspace|global] [--kind preference|constraint|fact|procedure|warning] <text>',
|
|
7
|
+
'/memory search <query>',
|
|
8
|
+
'/memory explain <claim-id>',
|
|
9
|
+
'/memory forget <claim-id>',
|
|
10
|
+
'/memory feedback <claim-id> <helped|harmful|stale|conflict|unknown> [detail]',
|
|
11
|
+
'/memory mode <shadow|assist|enforce>',
|
|
12
|
+
].join('\n');
|
|
13
|
+
export function registerMemoryCommand(commands, service) {
|
|
14
|
+
return commands.register({
|
|
15
|
+
name: 'memory',
|
|
16
|
+
description: 'Manage local long-term memory and CBDC authority policy',
|
|
17
|
+
input: { hint: 'status | remember | search | explain | forget | feedback | mode' },
|
|
18
|
+
recordInput: false,
|
|
19
|
+
handler: ({ agent, rawInput }) => executeMemoryCommand(service, agent, rawInput),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function registerUnavailableMemoryCommand(commands) {
|
|
23
|
+
return commands.register({
|
|
24
|
+
name: 'memory',
|
|
25
|
+
description: 'Report unavailable local long-term memory',
|
|
26
|
+
input: { hint: 'status' },
|
|
27
|
+
recordInput: false,
|
|
28
|
+
handler: ({ rawInput }) => {
|
|
29
|
+
const operation = rawInput.trim().toLocaleLowerCase();
|
|
30
|
+
return operation === '' || operation === 'status'
|
|
31
|
+
? success('Memory Gate: unavailable. Agent execution continues without long-term memory; inspect the memory-gate startup log.')
|
|
32
|
+
: error('Memory Gate is unavailable; no memory operation was performed.');
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export function executeMemoryCommand(service, agent, rawInput) {
|
|
37
|
+
try {
|
|
38
|
+
const tokens = tokenize(rawInput.trim());
|
|
39
|
+
const operation = tokens.shift()?.toLocaleLowerCase() ?? 'status';
|
|
40
|
+
const context = commandContext(agent);
|
|
41
|
+
const scopeKeys = [context.sessionKey, ...(context.workspaceKey ? [context.workspaceKey] : []), 'global'];
|
|
42
|
+
switch (operation) {
|
|
43
|
+
case 'help':
|
|
44
|
+
return success(USAGE);
|
|
45
|
+
case 'status': {
|
|
46
|
+
const health = service.repository.health();
|
|
47
|
+
const stats = service.repository.stats();
|
|
48
|
+
return success([
|
|
49
|
+
`Memory Gate: healthy=${health.ok}, schema=${health.schemaVersion}, fts=${health.ftsAvailable}`,
|
|
50
|
+
`Mode: ${service.mode} (runtime value; configure the profile to persist it)`,
|
|
51
|
+
`Claims: ${stats.activeClaims} active, ${stats.tombstonedClaims} forgotten`,
|
|
52
|
+
`Audit: ${stats.decisions} decisions, ${stats.injections} injections, ${stats.consumptions} feedback records`,
|
|
53
|
+
].join('\n'));
|
|
54
|
+
}
|
|
55
|
+
case 'list': {
|
|
56
|
+
const requested = tokens[0] === undefined ? 10 : Number(tokens[0]);
|
|
57
|
+
if (!Number.isInteger(requested) || requested < 1 || requested > 50)
|
|
58
|
+
return error('Usage: /memory list [1-50]');
|
|
59
|
+
const results = service.list(scopeKeys, requested);
|
|
60
|
+
if (!results.length)
|
|
61
|
+
return success('No active memory in the current scopes.');
|
|
62
|
+
return success(results
|
|
63
|
+
.map((candidate, index) => {
|
|
64
|
+
const belief = candidate.belief.alpha / (candidate.belief.alpha + candidate.belief.beta);
|
|
65
|
+
return `${index + 1}. ${candidate.claim.id} [${candidate.claim.kind}, ${readableScopeKey(candidate.claim.scopeKey)}, belief=${belief.toFixed(2)}] ${truncate(candidate.claim.content, 180)}`;
|
|
66
|
+
})
|
|
67
|
+
.join('\n'));
|
|
68
|
+
}
|
|
69
|
+
case 'mode': {
|
|
70
|
+
const mode = tokens[0];
|
|
71
|
+
if (!mode || !['shadow', 'assist', 'enforce'].includes(mode))
|
|
72
|
+
return error('Usage: /memory mode <shadow|assist|enforce>');
|
|
73
|
+
service.setMode(mode);
|
|
74
|
+
return success(`Memory mode is now ${mode}. This runtime override resets when Harness restarts.`);
|
|
75
|
+
}
|
|
76
|
+
case 'remember': {
|
|
77
|
+
const parsed = parseRemember(tokens);
|
|
78
|
+
if (!parsed.text)
|
|
79
|
+
return error('Memory text is required.\n' + USAGE);
|
|
80
|
+
const scope = parsed.scope ?? (context.workspaceKey ? 'workspace' : 'session');
|
|
81
|
+
const scopeKey = resolveScopeKey(scope, context);
|
|
82
|
+
if (!scopeKey)
|
|
83
|
+
return error('Workspace memory requires a session working directory.');
|
|
84
|
+
const result = service.remember(parsed.text, {
|
|
85
|
+
scope,
|
|
86
|
+
scopeKey,
|
|
87
|
+
...(parsed.kind === undefined ? {} : { kind: parsed.kind }),
|
|
88
|
+
...(parsed.tags.length ? { tags: parsed.tags } : {}),
|
|
89
|
+
origin: 'explicit',
|
|
90
|
+
sourceSessionId: String(agent.session.id),
|
|
91
|
+
});
|
|
92
|
+
return success(`${result.created ? 'Remembered' : 'Already remembered'} ${result.claim.id} (${scope}/${result.claim.kind}).`);
|
|
93
|
+
}
|
|
94
|
+
case 'search': {
|
|
95
|
+
const query = tokens.join(' ').trim();
|
|
96
|
+
if (!query)
|
|
97
|
+
return error('Usage: /memory search <query>');
|
|
98
|
+
const results = service.search(query, scopeKeys, 10);
|
|
99
|
+
if (!results.length)
|
|
100
|
+
return success('No matching active memory.');
|
|
101
|
+
return success(results
|
|
102
|
+
.map((candidate, index) => {
|
|
103
|
+
const belief = candidate.belief.alpha / (candidate.belief.alpha + candidate.belief.beta);
|
|
104
|
+
return `${index + 1}. ${candidate.claim.id} [${candidate.claim.kind}, ${readableScopeKey(candidate.claim.scopeKey)}, belief=${belief.toFixed(2)}] ${truncate(candidate.claim.content, 180)}`;
|
|
105
|
+
})
|
|
106
|
+
.join('\n'));
|
|
107
|
+
}
|
|
108
|
+
case 'explain': {
|
|
109
|
+
const claimId = tokens[0];
|
|
110
|
+
if (!claimId)
|
|
111
|
+
return error('Usage: /memory explain <claim-id>');
|
|
112
|
+
const claim = service.repository.getClaim(claimId, scopeKeys);
|
|
113
|
+
const belief = claim ? service.repository.getBelief(claim.id) : undefined;
|
|
114
|
+
if (!claim || !belief)
|
|
115
|
+
return error('Memory claim not found in the current session/workspace/global scopes.');
|
|
116
|
+
const evidence = service.repository.getEvidence(claim.id);
|
|
117
|
+
return success([
|
|
118
|
+
`${claim.id}: ${claim.content}`,
|
|
119
|
+
`scope=${readableScopeKey(claim.scopeKey)}, kind=${claim.kind}, state=${claim.state}, origin=${claim.origin}`,
|
|
120
|
+
`belief=${(belief.alpha / (belief.alpha + belief.beta)).toFixed(3)} (alpha=${belief.alpha}, beta=${belief.beta}, harmful=${belief.harmfulCount})`,
|
|
121
|
+
`evidence=${evidence.length}; latest=${evidence[0]?.kind ?? 'none'}`,
|
|
122
|
+
].join('\n'));
|
|
123
|
+
}
|
|
124
|
+
case 'forget': {
|
|
125
|
+
const claimId = tokens[0];
|
|
126
|
+
if (!claimId)
|
|
127
|
+
return error('Usage: /memory forget <claim-id>');
|
|
128
|
+
return service.forget(claimId, scopeKeys)
|
|
129
|
+
? success(`Forgotten ${claimId}. The record is tombstoned and will no longer be retrieved.`)
|
|
130
|
+
: error('Active memory claim not found in the current scopes.');
|
|
131
|
+
}
|
|
132
|
+
case 'feedback': {
|
|
133
|
+
const claimId = tokens.shift();
|
|
134
|
+
const outcome = tokens.shift();
|
|
135
|
+
if (!claimId || !outcome || !['helped', 'harmful', 'stale', 'conflict', 'unknown'].includes(outcome)) {
|
|
136
|
+
return error('Usage: /memory feedback <claim-id> <helped|harmful|stale|conflict|unknown> [detail]');
|
|
137
|
+
}
|
|
138
|
+
const claim = service.repository.getClaim(claimId, scopeKeys);
|
|
139
|
+
if (!claim)
|
|
140
|
+
return error('Memory claim not found in the current scopes.');
|
|
141
|
+
const detail = tokens.join(' ').trim();
|
|
142
|
+
const belief = service.feedback(claimId, outcome, String(agent.session.id), detail || undefined);
|
|
143
|
+
return success(`Feedback recorded for ${claimId}; belief=${(belief.alpha / (belief.alpha + belief.beta)).toFixed(3)}.`);
|
|
144
|
+
}
|
|
145
|
+
default:
|
|
146
|
+
return error(`Unknown memory operation: ${operation}\n${USAGE}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (cause) {
|
|
150
|
+
return error(cause instanceof Error ? cause.message : String(cause));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function commandContext(agent) {
|
|
154
|
+
const sessionKey = sessionScopeKey(String(agent.session.id));
|
|
155
|
+
const workspaceKey = workspaceScopeKey(agent.session.header.cwd);
|
|
156
|
+
return { sessionKey, ...(workspaceKey === undefined ? {} : { workspaceKey }) };
|
|
157
|
+
}
|
|
158
|
+
function resolveScopeKey(scope, context) {
|
|
159
|
+
if (scope === 'global')
|
|
160
|
+
return 'global';
|
|
161
|
+
if (scope === 'workspace')
|
|
162
|
+
return context.workspaceKey;
|
|
163
|
+
return context.sessionKey;
|
|
164
|
+
}
|
|
165
|
+
function parseRemember(tokens) {
|
|
166
|
+
let scope;
|
|
167
|
+
let kind;
|
|
168
|
+
const tags = [];
|
|
169
|
+
const text = [];
|
|
170
|
+
for (let index = 0; index < tokens.length; index += 1) {
|
|
171
|
+
const token = tokens[index];
|
|
172
|
+
if (token === '--global' || token === '--workspace' || token === '--session') {
|
|
173
|
+
scope = token.slice(2);
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (token === '--scope') {
|
|
177
|
+
const value = parseClaimScope(tokens[index + 1]);
|
|
178
|
+
if (!value)
|
|
179
|
+
throw new Error('--scope must be session, workspace, or global');
|
|
180
|
+
scope = value;
|
|
181
|
+
index += 1;
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (token === '--kind') {
|
|
185
|
+
const value = parseClaimKind(tokens[index + 1]);
|
|
186
|
+
if (!value)
|
|
187
|
+
throw new Error('--kind must be preference, constraint, fact, procedure, or warning');
|
|
188
|
+
kind = value;
|
|
189
|
+
index += 1;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (token === '--tag') {
|
|
193
|
+
const value = tokens[index + 1]?.trim();
|
|
194
|
+
if (!value)
|
|
195
|
+
throw new Error('--tag requires a value');
|
|
196
|
+
tags.push(value);
|
|
197
|
+
index += 1;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
text.push(token ?? '');
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
text: text.join(' ').trim(),
|
|
204
|
+
tags,
|
|
205
|
+
...(scope === undefined ? {} : { scope }),
|
|
206
|
+
...(kind === undefined ? {} : { kind }),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function tokenize(value) {
|
|
210
|
+
const tokens = [];
|
|
211
|
+
const pattern = /"((?:\\.|[^"\\])*)"|'((?:\\.|[^'\\])*)'|(\S+)/g;
|
|
212
|
+
for (const match of value.matchAll(pattern))
|
|
213
|
+
tokens.push((match[1] ?? match[2] ?? match[3] ?? '').replace(/\\([\\"'])/g, '$1'));
|
|
214
|
+
return tokens;
|
|
215
|
+
}
|
|
216
|
+
function truncate(value, length) {
|
|
217
|
+
return value.length <= length ? value : `${value.slice(0, length - 1)}…`;
|
|
218
|
+
}
|
|
219
|
+
function success(text) {
|
|
220
|
+
return { kind: 'success', text };
|
|
221
|
+
}
|
|
222
|
+
function error(text) {
|
|
223
|
+
return { kind: 'error', text };
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import Schema from '@deepseek-ai/schemastery';
|
|
2
|
+
import type { MemoryMode } from './contracts.js';
|
|
3
|
+
export interface Config {
|
|
4
|
+
databasePath: string;
|
|
5
|
+
mode: MemoryMode;
|
|
6
|
+
automaticExtraction: boolean;
|
|
7
|
+
candidateLimit: number;
|
|
8
|
+
capsuleLimit: number;
|
|
9
|
+
injectionLimit: number;
|
|
10
|
+
maxInjectionChars: number;
|
|
11
|
+
auditRetentionRuns: number;
|
|
12
|
+
minUseBelief: number;
|
|
13
|
+
maxUseRisk: number;
|
|
14
|
+
harmfulQuarantineThreshold: number;
|
|
15
|
+
freshnessHalfLifeDays: number;
|
|
16
|
+
}
|
|
17
|
+
export declare const Config: Schema<Config>;
|
|
18
|
+
export declare function validateConfig(config: Config): Config;
|
|
19
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEhD,MAAM,WAAW,MAAM;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,UAAU,CAAA;IAChB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,0BAA0B,EAAE,MAAM,CAAA;IAClC,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,CAmBhC,CAAA;AAEF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CASrD"}
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import Schema from '@deepseek-ai/schemastery';
|
|
2
|
+
export const Config = Schema.object({
|
|
3
|
+
databasePath: Schema.string()
|
|
4
|
+
.description('Absolute or profile-relative path to the private SQLite database.')
|
|
5
|
+
.required(),
|
|
6
|
+
mode: Schema.union(['shadow', 'assist', 'enforce'])
|
|
7
|
+
.description('shadow audits only; assist labels uncertain memory; enforce injects only use decisions.')
|
|
8
|
+
.default('assist'),
|
|
9
|
+
automaticExtraction: Schema.boolean()
|
|
10
|
+
.description('Extract conservative memory claims from completed user turns.')
|
|
11
|
+
.default(true),
|
|
12
|
+
candidateLimit: Schema.number().min(1).max(100).step(1).default(16),
|
|
13
|
+
capsuleLimit: Schema.number().min(0).max(5).step(1).default(2),
|
|
14
|
+
injectionLimit: Schema.number().min(1).max(20).step(1).default(3),
|
|
15
|
+
maxInjectionChars: Schema.number().min(256).max(16_000).step(1).default(1200),
|
|
16
|
+
auditRetentionRuns: Schema.number().min(100).max(100_000).step(1).default(5000),
|
|
17
|
+
minUseBelief: Schema.number().min(0).max(1).default(0.7),
|
|
18
|
+
maxUseRisk: Schema.number().min(0).max(1).default(0.45),
|
|
19
|
+
harmfulQuarantineThreshold: Schema.number().min(1).max(20).step(1).default(2),
|
|
20
|
+
freshnessHalfLifeDays: Schema.number().min(1).max(3650).default(180),
|
|
21
|
+
});
|
|
22
|
+
export function validateConfig(config) {
|
|
23
|
+
if (!config.databasePath.trim())
|
|
24
|
+
throw new Error('databasePath cannot be empty');
|
|
25
|
+
if (config.injectionLimit > config.candidateLimit) {
|
|
26
|
+
throw new Error('injectionLimit cannot exceed candidateLimit');
|
|
27
|
+
}
|
|
28
|
+
if (config.capsuleLimit > config.candidateLimit) {
|
|
29
|
+
throw new Error('capsuleLimit cannot exceed candidateLimit');
|
|
30
|
+
}
|
|
31
|
+
return config;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAmB7C,MAAM,CAAC,MAAM,MAAM,GAAmB,MAAM,CAAC,MAAM,CAAC;IAClD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;SAC1B,WAAW,CAAC,mEAAmE,CAAC;SAChF,QAAQ,EAAE;IACb,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;SAChD,WAAW,CAAC,yFAAyF,CAAC;SACtG,OAAO,CAAC,QAAQ,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC,OAAO,EAAE;SAClC,WAAW,CAAC,+DAA+D,CAAC;SAC5E,OAAO,CAAC,IAAI,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACnE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7E,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/E,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACxD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACvD,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;CACrE,CAAC,CAAA;AAEF,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAChF,IAAI,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAC9D,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export type MemoryMode = 'shadow' | 'assist' | 'enforce';
|
|
2
|
+
export type ClaimScope = 'session' | 'workspace' | 'global';
|
|
3
|
+
export type ClaimKind = 'preference' | 'constraint' | 'fact' | 'procedure' | 'warning';
|
|
4
|
+
export type ClaimState = 'active' | 'superseded' | 'tombstoned';
|
|
5
|
+
export type ClaimOrigin = 'explicit' | 'heuristic';
|
|
6
|
+
export type AuthorityAction = 'use' | 'verify' | 'ignore';
|
|
7
|
+
export type ConsumptionOutcome = 'helped' | 'harmful' | 'stale' | 'conflict' | 'unknown';
|
|
8
|
+
export interface Claim {
|
|
9
|
+
id: string;
|
|
10
|
+
scope: ClaimScope;
|
|
11
|
+
scopeKey: string;
|
|
12
|
+
kind: ClaimKind;
|
|
13
|
+
content: string;
|
|
14
|
+
tags: string[];
|
|
15
|
+
state: ClaimState;
|
|
16
|
+
origin: ClaimOrigin;
|
|
17
|
+
sensitivity: 'normal' | 'private';
|
|
18
|
+
contentHash: string;
|
|
19
|
+
sourceSessionId?: string;
|
|
20
|
+
sourceEventSeq?: number;
|
|
21
|
+
validFrom: number;
|
|
22
|
+
validUntil?: number;
|
|
23
|
+
createdAt: number;
|
|
24
|
+
updatedAt: number;
|
|
25
|
+
}
|
|
26
|
+
export interface NewClaim {
|
|
27
|
+
scope: ClaimScope;
|
|
28
|
+
scopeKey: string;
|
|
29
|
+
kind: ClaimKind;
|
|
30
|
+
content: string;
|
|
31
|
+
tags?: string[];
|
|
32
|
+
origin: ClaimOrigin;
|
|
33
|
+
sensitivity?: 'normal' | 'private';
|
|
34
|
+
sourceSessionId?: string;
|
|
35
|
+
sourceEventSeq?: number;
|
|
36
|
+
validFrom?: number;
|
|
37
|
+
validUntil?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface Belief {
|
|
40
|
+
claimId: string;
|
|
41
|
+
alpha: number;
|
|
42
|
+
beta: number;
|
|
43
|
+
harmfulCount: number;
|
|
44
|
+
updatedAt: number;
|
|
45
|
+
}
|
|
46
|
+
export interface Evidence {
|
|
47
|
+
id: string;
|
|
48
|
+
claimId: string;
|
|
49
|
+
kind: 'asserted' | 'helped' | 'harmful' | 'stale' | 'conflict';
|
|
50
|
+
weight: number;
|
|
51
|
+
detail?: string;
|
|
52
|
+
sessionId?: string;
|
|
53
|
+
createdAt: number;
|
|
54
|
+
}
|
|
55
|
+
export interface SearchCandidate {
|
|
56
|
+
claim: Claim;
|
|
57
|
+
belief: Belief;
|
|
58
|
+
recallChannel: 'trigger' | 'capsule';
|
|
59
|
+
lexicalScore: number;
|
|
60
|
+
freshnessScore: number;
|
|
61
|
+
rankScore: number;
|
|
62
|
+
}
|
|
63
|
+
export interface AuthorityDecision {
|
|
64
|
+
claimId: string;
|
|
65
|
+
action: AuthorityAction;
|
|
66
|
+
reasonCodes: string[];
|
|
67
|
+
beliefScore: number;
|
|
68
|
+
relevanceScore: number;
|
|
69
|
+
freshnessScore: number;
|
|
70
|
+
riskScore: number;
|
|
71
|
+
}
|
|
72
|
+
export interface RetrievalResult {
|
|
73
|
+
runId: string;
|
|
74
|
+
query: string;
|
|
75
|
+
decisions: AuthorityDecision[];
|
|
76
|
+
candidates: SearchCandidate[];
|
|
77
|
+
}
|
|
78
|
+
export interface MemoryStats {
|
|
79
|
+
activeClaims: number;
|
|
80
|
+
tombstonedClaims: number;
|
|
81
|
+
decisions: number;
|
|
82
|
+
injections: number;
|
|
83
|
+
consumptions: number;
|
|
84
|
+
}
|
|
85
|
+
export interface RememberOptions {
|
|
86
|
+
scope: ClaimScope;
|
|
87
|
+
scopeKey: string;
|
|
88
|
+
kind?: ClaimKind;
|
|
89
|
+
tags?: string[];
|
|
90
|
+
origin?: ClaimOrigin;
|
|
91
|
+
sourceSessionId?: string;
|
|
92
|
+
sourceEventSeq?: number;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"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"}
|
package/lib/contracts.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ClaimKind } from './contracts.js';
|
|
2
|
+
export interface ExtractedClaim {
|
|
3
|
+
content: string;
|
|
4
|
+
kind: ClaimKind;
|
|
5
|
+
tags: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function extractDurableClaims(text: string): ExtractedClaim[];
|
|
8
|
+
//# sourceMappingURL=extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAG/C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,SAAS,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAgBD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAUnE"}
|
package/lib/extractor.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { normalizeContent } from './repository.js';
|
|
2
|
+
const MEMORY_CUES = [
|
|
3
|
+
/^(?:请)?记住[:,:,\s]*/u,
|
|
4
|
+
/^以后(?:请)?[:,:,\s]*/u,
|
|
5
|
+
/^请始终[:,:,\s]*/u,
|
|
6
|
+
/^我(?:的)?偏好是[:,:,\s]*/u,
|
|
7
|
+
/^我喜欢[:,:,\s]*/u,
|
|
8
|
+
/^不要再[:,:,\s]*/u,
|
|
9
|
+
/^(?:please\s+)?remember(?:\s+that)?[,:\s]*/iu,
|
|
10
|
+
/^from now on[,:\s]*/iu,
|
|
11
|
+
/^i prefer[,:\s]*/iu,
|
|
12
|
+
/^(?:please\s+)?always[,:\s]*/iu,
|
|
13
|
+
/^(?:please\s+)?(?:do not|don't|never)[,:\s]*/iu,
|
|
14
|
+
];
|
|
15
|
+
export function extractDurableClaims(text) {
|
|
16
|
+
const normalized = normalizeContent(text);
|
|
17
|
+
if (normalized.length < 4 || normalized.length > 1000 || looksLikeQuestion(normalized))
|
|
18
|
+
return [];
|
|
19
|
+
const cue = MEMORY_CUES.find((pattern) => pattern.test(normalized));
|
|
20
|
+
if (!cue)
|
|
21
|
+
return [];
|
|
22
|
+
const stripped = normalizeContent(normalized.replace(cue, ''));
|
|
23
|
+
if (stripped.length < 2)
|
|
24
|
+
return [];
|
|
25
|
+
const content = stripped.length > 500 ? stripped.slice(0, 500) : stripped;
|
|
26
|
+
const kind = classify(content, normalized);
|
|
27
|
+
return [{ content, kind, tags: ['auto-extracted'] }];
|
|
28
|
+
}
|
|
29
|
+
function looksLikeQuestion(value) {
|
|
30
|
+
return /[??]\s*$/u.test(value);
|
|
31
|
+
}
|
|
32
|
+
function classify(content, original) {
|
|
33
|
+
const combined = `${original} ${content}`.toLocaleLowerCase();
|
|
34
|
+
if (/(偏好|喜欢|prefer|格式|风格)/u.test(combined))
|
|
35
|
+
return 'preference';
|
|
36
|
+
if (/(不要|禁止|必须|始终|always|never|do not|don't|must)/u.test(combined))
|
|
37
|
+
return 'constraint';
|
|
38
|
+
if (/(步骤|流程|先.+再|procedure|workflow)/u.test(combined))
|
|
39
|
+
return 'procedure';
|
|
40
|
+
if (/(警告|风险|危险|warning|risk)/u.test(combined))
|
|
41
|
+
return 'warning';
|
|
42
|
+
return 'fact';
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../src/extractor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAQlD,MAAM,WAAW,GAAG;IAClB,qBAAqB;IACrB,qBAAqB;IACrB,gBAAgB;IAChB,uBAAuB;IACvB,gBAAgB;IAChB,gBAAgB;IAChB,8CAA8C;IAC9C,uBAAuB;IACvB,oBAAoB;IACpB,gCAAgC;IAChC,gDAAgD;CACjD,CAAA;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;IACzC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI,IAAI,iBAAiB,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAA;IACjG,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;IACnE,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAA;IACnB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;IAC9D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IACzE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAC1C,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;AACtD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,QAAgB;IACjD,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC,iBAAiB,EAAE,CAAA;IAC7D,IAAI,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,YAAY,CAAA;IAC/D,IAAI,+CAA+C,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,YAAY,CAAA;IACvF,IAAI,kCAAkC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,WAAW,CAAA;IACzE,IAAI,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAA;IAC/D,OAAO,MAAM,CAAA;AACf,CAAC"}
|
package/lib/harness.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { Agent, PreStepDecision } from '@deepseek-ai/dsh-agent';
|
|
3
|
+
import { type UserMessage } from '@deepseek-ai/dsh-llm';
|
|
4
|
+
import type { Session, SessionEvent } from '@deepseek-ai/dsh-session';
|
|
5
|
+
import { MemoryService } from './service.js';
|
|
6
|
+
interface OpenTurn {
|
|
7
|
+
turn: number;
|
|
8
|
+
messages: Array<{
|
|
9
|
+
text: string;
|
|
10
|
+
eventSeq: number;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
export declare function attachHarness(ctx: Context, service: MemoryService): void;
|
|
14
|
+
export declare function observeSessionEvent(service: MemoryService, openTurns: Map<string, OpenTurn>, session: Session, event: SessionEvent, onError?: (cause: unknown) => void): void;
|
|
15
|
+
export declare function injectRecall(service: MemoryService, agent: Agent, messages: UserMessage[], logger?: {
|
|
16
|
+
warn(format: unknown, ...params: unknown[]): void;
|
|
17
|
+
}): PreStepDecision;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../src/harness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAKrE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACpD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAqBxE;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAsB,GAClD,IAAI,CA6BN;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,GAAE;IAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAA8B,GACxF,eAAe,CAuBjB"}
|
package/lib/harness.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createUserMessage } from '@deepseek-ai/dsh-llm';
|
|
2
|
+
import { registerMemoryCommand } from './commands.js';
|
|
3
|
+
import { isHumanUserMessage, messageText } from './message-text.js';
|
|
4
|
+
import { sessionScopeKey, workspaceScopeKey } from './scope.js';
|
|
5
|
+
import { MemoryService } from './service.js';
|
|
6
|
+
export function attachHarness(ctx, service) {
|
|
7
|
+
const logger = ctx.logger('memory-gate');
|
|
8
|
+
const openTurns = new Map();
|
|
9
|
+
ctx.effect(() => registerMemoryCommand(ctx.commands, service), 'memory-gate: command');
|
|
10
|
+
ctx.on('session/disposed', (session) => openTurns.delete(String(session.id)));
|
|
11
|
+
ctx.on('session/event', (session, event) => {
|
|
12
|
+
if (!service.config.automaticExtraction)
|
|
13
|
+
return;
|
|
14
|
+
observeSessionEvent(service, openTurns, session, event, (cause) => {
|
|
15
|
+
logger.warn('automatic extraction omitted: %s', cause instanceof Error ? cause.message : String(cause));
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
ctx.on('agent/pre-step', async (payload, next) => {
|
|
19
|
+
const decision = await next();
|
|
20
|
+
if (decision.kind !== 'enter' || payload.signal.aborted || payload.step !== 1)
|
|
21
|
+
return decision;
|
|
22
|
+
return injectRecall(service, payload.agent, decision.messages, logger);
|
|
23
|
+
}, { prepend: true });
|
|
24
|
+
}
|
|
25
|
+
export function observeSessionEvent(service, openTurns, session, event, onError = () => undefined) {
|
|
26
|
+
const sessionId = String(session.id);
|
|
27
|
+
try {
|
|
28
|
+
if (event.type === 'turn/start') {
|
|
29
|
+
openTurns.set(sessionId, { turn: event.data.turn, messages: [] });
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const open = openTurns.get(sessionId);
|
|
33
|
+
if (!open)
|
|
34
|
+
return;
|
|
35
|
+
if (event.type === 'user/message' && isHumanUserMessage(event.data)) {
|
|
36
|
+
const text = messageText(event.data);
|
|
37
|
+
if (text)
|
|
38
|
+
open.messages.push({ text, eventSeq: event.seq });
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (event.type === 'turn/end' && event.data.turn === open.turn) {
|
|
42
|
+
openTurns.delete(sessionId);
|
|
43
|
+
const workspaceKey = workspaceScopeKey(session.header.cwd);
|
|
44
|
+
for (const message of open.messages) {
|
|
45
|
+
service.extractAndRemember(message.text, {
|
|
46
|
+
sessionId,
|
|
47
|
+
sessionScopeKey: sessionScopeKey(sessionId),
|
|
48
|
+
...(workspaceKey === undefined ? {} : { workspaceKey }),
|
|
49
|
+
sourceEventSeq: message.eventSeq,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (cause) {
|
|
55
|
+
onError(cause);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function injectRecall(service, agent, messages, logger = { warn: () => undefined }) {
|
|
59
|
+
try {
|
|
60
|
+
const query = messages.filter(isHumanUserMessage).map(messageText).filter(Boolean).join('\n').trim();
|
|
61
|
+
if (!query)
|
|
62
|
+
return { kind: 'enter', messages };
|
|
63
|
+
const sessionId = String(agent.session.id);
|
|
64
|
+
const workspaceKey = workspaceScopeKey(agent.session.header.cwd);
|
|
65
|
+
const recall = service.prepareRecall({
|
|
66
|
+
query,
|
|
67
|
+
sessionId,
|
|
68
|
+
sessionScopeKey: sessionScopeKey(sessionId),
|
|
69
|
+
...(workspaceKey === undefined ? {} : { workspaceKey }),
|
|
70
|
+
});
|
|
71
|
+
if (!recall)
|
|
72
|
+
return { kind: 'enter', messages };
|
|
73
|
+
const memoryMessage = createUserMessage({
|
|
74
|
+
content: [{ type: 'text', text: recall.text }],
|
|
75
|
+
source: { kind: 'plugin', plugin: 'dsh-memory-gate', form: 'recall' },
|
|
76
|
+
});
|
|
77
|
+
service.repository.recordInjection(recall.runId, sessionId, service.mode, recall.claimIds, String(memoryMessage.id));
|
|
78
|
+
return { kind: 'enter', messages: [...messages, memoryMessage] };
|
|
79
|
+
}
|
|
80
|
+
catch (cause) {
|
|
81
|
+
logger.warn('memory retrieval omitted: %s', cause instanceof Error ? cause.message : String(cause));
|
|
82
|
+
return { kind: 'enter', messages };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../src/harness.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import { Config, type Config as MemoryConfig } from './config.js';
|
|
3
|
+
export declare const name = "dsh-memory-gate";
|
|
4
|
+
export declare const inject: string[];
|
|
5
|
+
export { Config };
|
|
6
|
+
export declare function apply(ctx: Context, config: MemoryConfig): void;
|
|
7
|
+
export type * from './contracts.js';
|
|
8
|
+
export { decideAuthority } from './authority.js';
|
|
9
|
+
export { extractDurableClaims } from './extractor.js';
|
|
10
|
+
export { injectRecall, observeSessionEvent } from './harness.js';
|
|
11
|
+
export { inspectForSecrets, redactForLog } from './redaction.js';
|
|
12
|
+
export { MemoryRepository } from './repository.js';
|
|
13
|
+
export { sessionScopeKey, workspaceScopeKey } from './scope.js';
|
|
14
|
+
export { MemoryService } from './service.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,IAAI,YAAY,EAAkB,MAAM,aAAa,CAAA;AAKjF,eAAO,MAAM,IAAI,oBAAoB,CAAA;AACrC,eAAO,MAAM,MAAM,UAAe,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,CAAA;AAEjB,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAiC9D;AAED,mBAAmB,gBAAgB,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
|