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.
Files changed (55) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/LICENSE +21 -0
  3. package/README.md +126 -0
  4. package/cordis.patch.yml +14 -0
  5. package/docs/architecture.md +142 -0
  6. package/docs/benchmark.md +41 -0
  7. package/lib/authority.d.ts +9 -0
  8. package/lib/authority.d.ts.map +1 -0
  9. package/lib/authority.js +71 -0
  10. package/lib/authority.js.map +1 -0
  11. package/lib/commands.d.ts +7 -0
  12. package/lib/commands.d.ts.map +1 -0
  13. package/lib/commands.js +225 -0
  14. package/lib/commands.js.map +1 -0
  15. package/lib/config.d.ts +19 -0
  16. package/lib/config.d.ts.map +1 -0
  17. package/lib/config.js +33 -0
  18. package/lib/config.js.map +1 -0
  19. package/lib/contracts.d.ts +94 -0
  20. package/lib/contracts.d.ts.map +1 -0
  21. package/lib/contracts.js +2 -0
  22. package/lib/contracts.js.map +1 -0
  23. package/lib/extractor.d.ts +8 -0
  24. package/lib/extractor.d.ts.map +1 -0
  25. package/lib/extractor.js +44 -0
  26. package/lib/extractor.js.map +1 -0
  27. package/lib/harness.d.ts +19 -0
  28. package/lib/harness.d.ts.map +1 -0
  29. package/lib/harness.js +85 -0
  30. package/lib/harness.js.map +1 -0
  31. package/lib/index.d.ts +15 -0
  32. package/lib/index.d.ts.map +1 -0
  33. package/lib/index.js +44 -0
  34. package/lib/index.js.map +1 -0
  35. package/lib/message-text.d.ts +3 -0
  36. package/lib/message-text.d.ts.map +1 -0
  37. package/lib/message-text.js +21 -0
  38. package/lib/message-text.js.map +1 -0
  39. package/lib/redaction.d.ts +7 -0
  40. package/lib/redaction.d.ts.map +1 -0
  41. package/lib/redaction.js +23 -0
  42. package/lib/redaction.js.map +1 -0
  43. package/lib/repository.d.ts +39 -0
  44. package/lib/repository.d.ts.map +1 -0
  45. package/lib/repository.js +492 -0
  46. package/lib/repository.js.map +1 -0
  47. package/lib/scope.d.ts +4 -0
  48. package/lib/scope.d.ts.map +1 -0
  49. package/lib/scope.js +26 -0
  50. package/lib/scope.js.map +1 -0
  51. package/lib/service.d.ts +42 -0
  52. package/lib/service.d.ts.map +1 -0
  53. package/lib/service.js +157 -0
  54. package/lib/service.js.map +1 -0
  55. package/package.json +74 -0
@@ -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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"}
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contracts.js.map
@@ -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"}
@@ -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"}
@@ -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":"AAEA,OAAO,EAAE,iBAAiB,EAAoB,MAAM,sBAAsB,CAAA;AAG1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAO5C,MAAM,UAAU,aAAa,CAAC,GAAY,EAAE,OAAsB;IAChE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACxC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAA;IAE7C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,sBAAsB,CAAC,CAAA;IACtF,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC7E,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB;YAAE,OAAM;QAC/C,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YAChE,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACzG,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,GAAG,CAAC,EAAE,CACJ,gBAAgB,EAChB,KAAK,EAAE,OAAO,EAAE,IAAI,EAA4B,EAAE;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAA;QAC7B,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAA;QAC9F,OAAO,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACxE,CAAC,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAsB,EACtB,SAAgC,EAChC,OAAgB,EAChB,KAAmB,EACnB,UAAoC,GAAG,EAAE,CAAC,SAAS;IAEnD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACpC,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;YACjE,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACrC,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACpC,IAAI,IAAI;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;YAC3D,OAAM;QACR,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/D,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAC3B,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC1D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,EAAE;oBACvC,SAAS;oBACT,eAAe,EAAE,eAAe,CAAC,SAAS,CAAC;oBAC3C,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;oBACvD,cAAc,EAAE,OAAO,CAAC,QAAQ;iBACjC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,CAAA;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAAsB,EACtB,KAAY,EACZ,QAAuB,EACvB,SAAgE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;IAEzF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;QACpG,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;QAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC1C,MAAM,YAAY,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YACnC,KAAK;YACL,SAAS;YACT,eAAe,EAAE,eAAe,CAAC,SAAS,CAAC;YAC3C,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;SACxD,CAAC,CAAA;QACF,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;QAC/C,MAAM,aAAa,GAAG,iBAAiB,CAAC;YACtC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE;SACtE,CAAC,CAAA;QACF,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA;QACpH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAA;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACnG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;IACpC,CAAC;AACH,CAAC"}
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"}