audrey 0.17.0 → 0.21.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 +15 -0
- package/README.md +180 -370
- package/dist/mcp-server/config.d.ts +44 -0
- package/dist/mcp-server/config.d.ts.map +1 -0
- package/dist/mcp-server/config.js +210 -0
- package/dist/mcp-server/config.js.map +1 -0
- package/dist/mcp-server/index.d.ts +181 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +1530 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/src/adaptive.d.ts +7 -0
- package/dist/src/adaptive.d.ts.map +1 -0
- package/dist/src/adaptive.js +49 -0
- package/dist/src/adaptive.js.map +1 -0
- package/dist/src/affect.d.ts +19 -0
- package/dist/src/affect.d.ts.map +1 -0
- package/dist/src/affect.js +72 -0
- package/dist/src/affect.js.map +1 -0
- package/dist/src/audrey.d.ts +144 -0
- package/dist/src/audrey.d.ts.map +1 -0
- package/dist/src/audrey.js +576 -0
- package/dist/src/audrey.js.map +1 -0
- package/dist/src/capsule.d.ts +68 -0
- package/dist/src/capsule.d.ts.map +1 -0
- package/dist/src/capsule.js +311 -0
- package/dist/src/capsule.js.map +1 -0
- package/dist/src/causal.d.ts +28 -0
- package/dist/src/causal.d.ts.map +1 -0
- package/dist/src/causal.js +65 -0
- package/dist/src/causal.js.map +1 -0
- package/dist/src/confidence.d.ts +12 -0
- package/dist/src/confidence.d.ts.map +1 -0
- package/dist/src/confidence.js +63 -0
- package/dist/src/confidence.js.map +1 -0
- package/dist/src/consolidate.d.ts +8 -0
- package/dist/src/consolidate.d.ts.map +1 -0
- package/dist/src/consolidate.js +218 -0
- package/dist/src/consolidate.js.map +1 -0
- package/dist/src/context.d.ts +3 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +19 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/db.d.ts +12 -0
- package/dist/src/db.d.ts.map +1 -0
- package/dist/src/db.js +380 -0
- package/dist/src/db.js.map +1 -0
- package/dist/src/decay.d.ts +7 -0
- package/dist/src/decay.d.ts.map +1 -0
- package/dist/src/decay.js +68 -0
- package/dist/src/decay.js.map +1 -0
- package/dist/src/embedding.d.ts +57 -0
- package/dist/src/embedding.d.ts.map +1 -0
- package/dist/src/embedding.js +254 -0
- package/dist/src/embedding.js.map +1 -0
- package/dist/src/encode.d.ts +15 -0
- package/dist/src/encode.d.ts.map +1 -0
- package/dist/src/encode.js +36 -0
- package/dist/src/encode.js.map +1 -0
- package/dist/src/events.d.ts +69 -0
- package/dist/src/events.d.ts.map +1 -0
- package/dist/src/events.js +149 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/export.d.ts +3 -0
- package/dist/src/export.d.ts.map +1 -0
- package/dist/src/export.js +46 -0
- package/dist/src/export.js.map +1 -0
- package/dist/src/forget.d.ts +11 -0
- package/dist/src/forget.d.ts.map +1 -0
- package/dist/src/forget.js +105 -0
- package/dist/src/forget.js.map +1 -0
- package/dist/src/fts.d.ts +34 -0
- package/dist/src/fts.d.ts.map +1 -0
- package/dist/src/fts.js +117 -0
- package/dist/src/fts.js.map +1 -0
- package/dist/src/hybrid-recall.d.ts +37 -0
- package/dist/src/hybrid-recall.d.ts.map +1 -0
- package/dist/src/hybrid-recall.js +213 -0
- package/dist/src/hybrid-recall.js.map +1 -0
- package/dist/src/import.d.ts +4 -0
- package/dist/src/import.d.ts.map +1 -0
- package/dist/src/import.js +127 -0
- package/dist/src/import.js.map +1 -0
- package/dist/src/index.d.ts +26 -0
- package/dist/src/index.d.ts.map +1 -0
- package/{src → dist/src}/index.js +7 -13
- package/dist/src/index.js.map +1 -0
- package/dist/src/interference.d.ts +13 -0
- package/dist/src/interference.d.ts.map +1 -0
- package/dist/src/interference.js +45 -0
- package/dist/src/interference.js.map +1 -0
- package/dist/src/introspect.d.ts +4 -0
- package/dist/src/introspect.d.ts.map +1 -0
- package/dist/src/introspect.js +40 -0
- package/dist/src/introspect.js.map +1 -0
- package/dist/src/llm.d.ts +38 -0
- package/dist/src/llm.d.ts.map +1 -0
- package/dist/src/llm.js +167 -0
- package/dist/src/llm.js.map +1 -0
- package/dist/src/migrate.d.ts +6 -0
- package/dist/src/migrate.d.ts.map +1 -0
- package/dist/src/migrate.js +51 -0
- package/dist/src/migrate.js.map +1 -0
- package/dist/src/preflight.d.ts +51 -0
- package/dist/src/preflight.d.ts.map +1 -0
- package/dist/src/preflight.js +201 -0
- package/dist/src/preflight.js.map +1 -0
- package/dist/src/promote.d.ts +40 -0
- package/dist/src/promote.d.ts.map +1 -0
- package/dist/src/promote.js +200 -0
- package/dist/src/promote.js.map +1 -0
- package/dist/src/prompts.d.ts +16 -0
- package/dist/src/prompts.d.ts.map +1 -0
- package/{src → dist/src}/prompts.js +172 -203
- package/dist/src/prompts.js.map +1 -0
- package/dist/src/recall.d.ts +9 -0
- package/dist/src/recall.d.ts.map +1 -0
- package/dist/src/recall.js +432 -0
- package/dist/src/recall.js.map +1 -0
- package/dist/src/redact.d.ts +27 -0
- package/dist/src/redact.d.ts.map +1 -0
- package/dist/src/redact.js +228 -0
- package/dist/src/redact.js.map +1 -0
- package/dist/src/reflexes.d.ts +35 -0
- package/dist/src/reflexes.d.ts.map +1 -0
- package/dist/src/reflexes.js +87 -0
- package/dist/src/reflexes.js.map +1 -0
- package/dist/src/rollback.d.ts +8 -0
- package/dist/src/rollback.d.ts.map +1 -0
- package/dist/src/rollback.js +33 -0
- package/dist/src/rollback.js.map +1 -0
- package/dist/src/routes.d.ts +7 -0
- package/dist/src/routes.d.ts.map +1 -0
- package/dist/src/routes.js +303 -0
- package/dist/src/routes.js.map +1 -0
- package/dist/src/rules-compiler.d.ts +20 -0
- package/dist/src/rules-compiler.d.ts.map +1 -0
- package/dist/src/rules-compiler.js +143 -0
- package/dist/src/rules-compiler.js.map +1 -0
- package/dist/src/server.d.ts +12 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +22 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/tool-trace.d.ts +37 -0
- package/dist/src/tool-trace.d.ts.map +1 -0
- package/dist/src/tool-trace.js +142 -0
- package/dist/src/tool-trace.js.map +1 -0
- package/dist/src/types.d.ts +446 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/ulid.d.ts +3 -0
- package/dist/src/ulid.d.ts.map +1 -0
- package/dist/src/ulid.js +11 -0
- package/dist/src/ulid.js.map +1 -0
- package/dist/src/utils.d.ts +10 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +41 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/src/validate.d.ts +22 -0
- package/dist/src/validate.d.ts.map +1 -0
- package/dist/src/validate.js +109 -0
- package/dist/src/validate.js.map +1 -0
- package/docs/assets/audrey-feature-grid.jpg +0 -0
- package/docs/assets/audrey-logo.svg +45 -0
- package/docs/assets/audrey-wordmark.png +0 -0
- package/docs/audrey-for-dummies.md +670 -0
- package/docs/future-of-llm-memory.md +452 -0
- package/docs/mcp-hosts.md +206 -0
- package/docs/ollama-local-agents.md +128 -0
- package/docs/production-readiness.md +37 -5
- package/examples/fintech-ops-demo.js +1 -1
- package/examples/healthcare-ops-demo.js +1 -1
- package/examples/ollama-memory-agent.js +326 -0
- package/examples/stripe-demo.js +1 -1
- package/package.json +54 -14
- package/benchmarks/baselines.js +0 -169
- package/benchmarks/cases.js +0 -421
- package/benchmarks/reference-results.js +0 -70
- package/benchmarks/report.js +0 -255
- package/benchmarks/run.js +0 -514
- package/mcp-server/config.js +0 -133
- package/mcp-server/index.js +0 -1265
- package/mcp-server/serve.js +0 -482
- package/src/adaptive.js +0 -53
- package/src/affect.js +0 -64
- package/src/audrey.js +0 -642
- package/src/causal.js +0 -95
- package/src/confidence.js +0 -120
- package/src/consolidate.js +0 -281
- package/src/context.js +0 -15
- package/src/db.js +0 -391
- package/src/decay.js +0 -84
- package/src/embedding.js +0 -260
- package/src/encode.js +0 -69
- package/src/export.js +0 -67
- package/src/forget.js +0 -111
- package/src/fts.js +0 -134
- package/src/import.js +0 -273
- package/src/interference.js +0 -51
- package/src/introspect.js +0 -48
- package/src/llm.js +0 -249
- package/src/migrate.js +0 -58
- package/src/recall.js +0 -573
- package/src/rollback.js +0 -42
- package/src/ulid.js +0 -18
- package/src/utils.js +0 -63
- package/src/validate.js +0 -172
- package/types/index.d.ts +0 -434
package/dist/src/llm.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { describeHttpError, requireApiKey } from './utils.js';
|
|
2
|
+
function extractJSON(text) {
|
|
3
|
+
const fenced = text.match(/```(?:json)?\s*\n?([\s\S]*?)```/);
|
|
4
|
+
return fenced ? fenced[1].trim() : text.trim();
|
|
5
|
+
}
|
|
6
|
+
const PROMPT_TYPE_KEYS = [
|
|
7
|
+
'principleExtraction',
|
|
8
|
+
'contradictionDetection',
|
|
9
|
+
'causalArticulation',
|
|
10
|
+
'contextResolution',
|
|
11
|
+
];
|
|
12
|
+
export class MockLLMProvider {
|
|
13
|
+
responses;
|
|
14
|
+
modelName;
|
|
15
|
+
modelVersion;
|
|
16
|
+
constructor({ responses = {} } = {}) {
|
|
17
|
+
this.responses = (responses ?? {});
|
|
18
|
+
this.modelName = 'mock-llm';
|
|
19
|
+
this.modelVersion = '1.0.0';
|
|
20
|
+
}
|
|
21
|
+
_matchPromptType(messages) {
|
|
22
|
+
const systemMsg = messages.find(m => m.role === 'system')?.content || '';
|
|
23
|
+
for (const key of PROMPT_TYPE_KEYS) {
|
|
24
|
+
if (systemMsg.includes(key))
|
|
25
|
+
return key;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
async complete(messages) {
|
|
30
|
+
const promptType = this._matchPromptType(messages);
|
|
31
|
+
const cannedResponse = promptType ? this.responses[promptType] : undefined;
|
|
32
|
+
return { content: cannedResponse !== undefined ? JSON.stringify(cannedResponse) : '{}' };
|
|
33
|
+
}
|
|
34
|
+
async json(messages) {
|
|
35
|
+
const promptType = this._matchPromptType(messages);
|
|
36
|
+
const cannedResponse = promptType ? this.responses[promptType] : undefined;
|
|
37
|
+
return cannedResponse !== undefined ? cannedResponse : {};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class AnthropicLLMProvider {
|
|
41
|
+
apiKey;
|
|
42
|
+
model;
|
|
43
|
+
maxTokens;
|
|
44
|
+
timeout;
|
|
45
|
+
modelName;
|
|
46
|
+
modelVersion;
|
|
47
|
+
constructor({ apiKey, model = 'claude-sonnet-4-6', maxTokens = 1024, timeout = 30000 } = {}) {
|
|
48
|
+
this.apiKey = apiKey || process.env.ANTHROPIC_API_KEY;
|
|
49
|
+
this.model = model ?? 'claude-sonnet-4-6';
|
|
50
|
+
this.maxTokens = maxTokens ?? 1024;
|
|
51
|
+
this.timeout = timeout ?? 30000;
|
|
52
|
+
this.modelName = this.model;
|
|
53
|
+
this.modelVersion = 'latest';
|
|
54
|
+
}
|
|
55
|
+
async complete(messages, options = {}) {
|
|
56
|
+
requireApiKey(this.apiKey, 'Anthropic LLM', 'ANTHROPIC_API_KEY');
|
|
57
|
+
const systemMsg = messages.find(m => m.role === 'system')?.content;
|
|
58
|
+
const nonSystemMsgs = messages.filter(m => m.role !== 'system');
|
|
59
|
+
const body = {
|
|
60
|
+
model: this.model,
|
|
61
|
+
max_tokens: options.maxTokens || this.maxTokens,
|
|
62
|
+
messages: nonSystemMsgs,
|
|
63
|
+
};
|
|
64
|
+
if (systemMsg)
|
|
65
|
+
body.system = systemMsg;
|
|
66
|
+
const controller = new AbortController();
|
|
67
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
68
|
+
try {
|
|
69
|
+
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
headers: {
|
|
72
|
+
'x-api-key': this.apiKey,
|
|
73
|
+
'anthropic-version': '2023-06-01',
|
|
74
|
+
'content-type': 'application/json',
|
|
75
|
+
},
|
|
76
|
+
body: JSON.stringify(body),
|
|
77
|
+
signal: controller.signal,
|
|
78
|
+
});
|
|
79
|
+
if (!response.ok) {
|
|
80
|
+
throw new Error(`Anthropic API error: ${await describeHttpError(response)}`);
|
|
81
|
+
}
|
|
82
|
+
const data = await response.json();
|
|
83
|
+
const text = data.content?.[0]?.text || '';
|
|
84
|
+
return { content: text };
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
clearTimeout(timer);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async json(messages, options = {}) {
|
|
91
|
+
const result = await this.complete(messages, options);
|
|
92
|
+
try {
|
|
93
|
+
return JSON.parse(extractJSON(result.content));
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
throw new Error(`Failed to parse LLM response as JSON: ${result.content.slice(0, 200)}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export class OpenAILLMProvider {
|
|
101
|
+
apiKey;
|
|
102
|
+
model;
|
|
103
|
+
maxTokens;
|
|
104
|
+
timeout;
|
|
105
|
+
modelName;
|
|
106
|
+
modelVersion;
|
|
107
|
+
constructor({ apiKey, model = 'gpt-4o', maxTokens = 1024, timeout = 30000 } = {}) {
|
|
108
|
+
this.apiKey = apiKey || process.env.OPENAI_API_KEY;
|
|
109
|
+
this.model = model ?? 'gpt-4o';
|
|
110
|
+
this.maxTokens = maxTokens ?? 1024;
|
|
111
|
+
this.timeout = timeout ?? 30000;
|
|
112
|
+
this.modelName = this.model;
|
|
113
|
+
this.modelVersion = 'latest';
|
|
114
|
+
}
|
|
115
|
+
async complete(messages, options = {}) {
|
|
116
|
+
requireApiKey(this.apiKey, 'OpenAI LLM', 'OPENAI_API_KEY');
|
|
117
|
+
const body = {
|
|
118
|
+
model: this.model,
|
|
119
|
+
max_tokens: options.maxTokens || this.maxTokens,
|
|
120
|
+
messages,
|
|
121
|
+
};
|
|
122
|
+
const controller = new AbortController();
|
|
123
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
124
|
+
try {
|
|
125
|
+
const response = await fetch('https://api.openai.com/v1/chat/completions', {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
headers: {
|
|
128
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
129
|
+
'Content-Type': 'application/json',
|
|
130
|
+
},
|
|
131
|
+
body: JSON.stringify(body),
|
|
132
|
+
signal: controller.signal,
|
|
133
|
+
});
|
|
134
|
+
if (!response.ok) {
|
|
135
|
+
throw new Error(`OpenAI API error: ${await describeHttpError(response)}`);
|
|
136
|
+
}
|
|
137
|
+
const data = await response.json();
|
|
138
|
+
const text = data.choices?.[0]?.message?.content || '';
|
|
139
|
+
return { content: text };
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
clearTimeout(timer);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async json(messages, options = {}) {
|
|
146
|
+
const result = await this.complete(messages, options);
|
|
147
|
+
try {
|
|
148
|
+
return JSON.parse(extractJSON(result.content));
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
throw new Error(`Failed to parse LLM response as JSON: ${result.content.slice(0, 200)}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export function createLLMProvider(config) {
|
|
156
|
+
switch (config.provider) {
|
|
157
|
+
case 'mock':
|
|
158
|
+
return new MockLLMProvider(config);
|
|
159
|
+
case 'anthropic':
|
|
160
|
+
return new AnthropicLLMProvider(config);
|
|
161
|
+
case 'openai':
|
|
162
|
+
return new OpenAILLMProvider(config);
|
|
163
|
+
default:
|
|
164
|
+
throw new Error(`Unknown LLM provider: ${config.provider}. Valid: mock, anthropic, openai`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import type { EmbeddingProvider, ReembedCounts } from './types.js';
|
|
3
|
+
export declare function reembedAll(db: Database.Database, embeddingProvider: EmbeddingProvider, { dropAndRecreate }?: {
|
|
4
|
+
dropAndRecreate?: boolean;
|
|
5
|
+
}): Promise<ReembedCounts>;
|
|
6
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAsBnE,wBAAsB,UAAU,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,iBAAiB,EAAE,iBAAiB,EACpC,EAAE,eAAuB,EAAE,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,OAAO,CAAC,aAAa,CAAC,CAuDxB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { dropVec0Tables, createVec0Tables } from './db.js';
|
|
2
|
+
export async function reembedAll(db, embeddingProvider, { dropAndRecreate = false } = {}) {
|
|
3
|
+
if (dropAndRecreate) {
|
|
4
|
+
dropVec0Tables(db);
|
|
5
|
+
createVec0Tables(db, embeddingProvider.dimensions);
|
|
6
|
+
}
|
|
7
|
+
const episodes = db.prepare('SELECT id, content, source, consolidated FROM episodes').all();
|
|
8
|
+
const semantics = db.prepare('SELECT id, content, state FROM semantics').all();
|
|
9
|
+
const procedures = db.prepare('SELECT id, content, state FROM procedures').all();
|
|
10
|
+
const episodeVectors = episodes.length > 0
|
|
11
|
+
? await embeddingProvider.embedBatch(episodes.map(ep => ep.content))
|
|
12
|
+
: [];
|
|
13
|
+
const semanticVectors = semantics.length > 0
|
|
14
|
+
? await embeddingProvider.embedBatch(semantics.map(s => s.content))
|
|
15
|
+
: [];
|
|
16
|
+
const procedureVectors = procedures.length > 0
|
|
17
|
+
? await embeddingProvider.embedBatch(procedures.map(p => p.content))
|
|
18
|
+
: [];
|
|
19
|
+
const updateEpLegacy = db.prepare('UPDATE episodes SET embedding = ? WHERE id = ?');
|
|
20
|
+
const deleteVecEp = db.prepare('DELETE FROM vec_episodes WHERE id = ?');
|
|
21
|
+
const insertVecEp = db.prepare('INSERT INTO vec_episodes(id, embedding, source, consolidated) VALUES (?, ?, ?, ?)');
|
|
22
|
+
const updateSemLegacy = db.prepare('UPDATE semantics SET embedding = ? WHERE id = ?');
|
|
23
|
+
const deleteVecSem = db.prepare('DELETE FROM vec_semantics WHERE id = ?');
|
|
24
|
+
const insertVecSem = db.prepare('INSERT INTO vec_semantics(id, embedding, state) VALUES (?, ?, ?)');
|
|
25
|
+
const updateProcLegacy = db.prepare('UPDATE procedures SET embedding = ? WHERE id = ?');
|
|
26
|
+
const deleteVecProc = db.prepare('DELETE FROM vec_procedures WHERE id = ?');
|
|
27
|
+
const insertVecProc = db.prepare('INSERT INTO vec_procedures(id, embedding, state) VALUES (?, ?, ?)');
|
|
28
|
+
const writeTx = db.transaction(() => {
|
|
29
|
+
for (let i = 0; i < episodes.length; i++) {
|
|
30
|
+
const buf = embeddingProvider.vectorToBuffer(episodeVectors[i]);
|
|
31
|
+
updateEpLegacy.run(buf, episodes[i].id);
|
|
32
|
+
deleteVecEp.run(episodes[i].id);
|
|
33
|
+
insertVecEp.run(episodes[i].id, buf, episodes[i].source, BigInt(episodes[i].consolidated ?? 0));
|
|
34
|
+
}
|
|
35
|
+
for (let i = 0; i < semantics.length; i++) {
|
|
36
|
+
const buf = embeddingProvider.vectorToBuffer(semanticVectors[i]);
|
|
37
|
+
updateSemLegacy.run(buf, semantics[i].id);
|
|
38
|
+
deleteVecSem.run(semantics[i].id);
|
|
39
|
+
insertVecSem.run(semantics[i].id, buf, semantics[i].state);
|
|
40
|
+
}
|
|
41
|
+
for (let i = 0; i < procedures.length; i++) {
|
|
42
|
+
const buf = embeddingProvider.vectorToBuffer(procedureVectors[i]);
|
|
43
|
+
updateProcLegacy.run(buf, procedures[i].id);
|
|
44
|
+
deleteVecProc.run(procedures[i].id);
|
|
45
|
+
insertVecProc.run(procedures[i].id, buf, procedures[i].state);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
writeTx();
|
|
49
|
+
return { episodes: episodes.length, semantics: semantics.length, procedures: procedures.length };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Audrey } from './audrey.js';
|
|
2
|
+
import type { CapsuleMode, MemoryCapsule } from './capsule.js';
|
|
3
|
+
import type { FailurePattern } from './events.js';
|
|
4
|
+
import type { MemoryStatusResult } from './types.js';
|
|
5
|
+
export type PreflightDecision = 'go' | 'caution' | 'block';
|
|
6
|
+
export type PreflightSeverity = 'info' | 'low' | 'medium' | 'high';
|
|
7
|
+
export type PreflightWarningType = 'recent_failure' | 'must_follow' | 'risk' | 'procedure' | 'contradiction' | 'uncertain' | 'memory_health';
|
|
8
|
+
export interface PreflightOptions {
|
|
9
|
+
tool?: string;
|
|
10
|
+
sessionId?: string;
|
|
11
|
+
cwd?: string;
|
|
12
|
+
files?: string[];
|
|
13
|
+
strict?: boolean;
|
|
14
|
+
limit?: number;
|
|
15
|
+
budgetChars?: number;
|
|
16
|
+
mode?: CapsuleMode;
|
|
17
|
+
recentFailureWindowHours?: number;
|
|
18
|
+
recentChangeWindowHours?: number;
|
|
19
|
+
includeCapsule?: boolean;
|
|
20
|
+
includeStatus?: boolean;
|
|
21
|
+
recordEvent?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface PreflightWarning {
|
|
24
|
+
type: PreflightWarningType;
|
|
25
|
+
severity: PreflightSeverity;
|
|
26
|
+
message: string;
|
|
27
|
+
reason: string;
|
|
28
|
+
evidence_id?: string;
|
|
29
|
+
recommended_action?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface MemoryPreflight {
|
|
32
|
+
action: string;
|
|
33
|
+
query: string;
|
|
34
|
+
tool?: string;
|
|
35
|
+
cwd?: string;
|
|
36
|
+
generated_at: string;
|
|
37
|
+
decision: PreflightDecision;
|
|
38
|
+
verdict: 'clear' | 'caution' | 'blocked';
|
|
39
|
+
ok_to_proceed: boolean;
|
|
40
|
+
risk_score: number;
|
|
41
|
+
summary: string;
|
|
42
|
+
warnings: PreflightWarning[];
|
|
43
|
+
recent_failures: FailurePattern[];
|
|
44
|
+
status?: MemoryStatusResult;
|
|
45
|
+
recommended_actions: string[];
|
|
46
|
+
evidence_ids: string[];
|
|
47
|
+
preflight_event_id?: string;
|
|
48
|
+
capsule?: MemoryCapsule;
|
|
49
|
+
}
|
|
50
|
+
export declare function buildPreflight(audrey: Audrey, action: string, options?: PreflightOptions): Promise<MemoryPreflight>;
|
|
51
|
+
//# sourceMappingURL=preflight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAgB,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;AAC3D,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AACnE,MAAM,MAAM,oBAAoB,GAC5B,gBAAgB,GAChB,aAAa,GACb,MAAM,GACN,WAAW,GACX,eAAe,GACf,WAAW,GACX,eAAe,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AA+FD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAmK1B"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
const SEVERITY_SCORE = {
|
|
2
|
+
info: 0.1,
|
|
3
|
+
low: 0.25,
|
|
4
|
+
medium: 0.55,
|
|
5
|
+
high: 0.85,
|
|
6
|
+
};
|
|
7
|
+
function isNonEmptyText(value) {
|
|
8
|
+
return value.trim().length > 0;
|
|
9
|
+
}
|
|
10
|
+
function shorten(value, max = 320) {
|
|
11
|
+
const text = value.replace(/\s+/g, ' ').trim();
|
|
12
|
+
if (text.length <= max)
|
|
13
|
+
return text;
|
|
14
|
+
return `${text.slice(0, max - 1)}...`;
|
|
15
|
+
}
|
|
16
|
+
function matchesToolOrAction(action, requestedTool, failedTool) {
|
|
17
|
+
if (!failedTool)
|
|
18
|
+
return false;
|
|
19
|
+
const failed = failedTool.toLowerCase();
|
|
20
|
+
const tool = requestedTool?.toLowerCase();
|
|
21
|
+
const actionText = action.toLowerCase();
|
|
22
|
+
return Boolean((tool && (failed === tool || failed.includes(tool) || tool.includes(failed)))
|
|
23
|
+
|| actionText.includes(failed));
|
|
24
|
+
}
|
|
25
|
+
function warningFromEntry(type, severity, entry, fallbackAction) {
|
|
26
|
+
return {
|
|
27
|
+
type,
|
|
28
|
+
severity,
|
|
29
|
+
message: shorten(entry.content),
|
|
30
|
+
reason: entry.reason,
|
|
31
|
+
evidence_id: entry.memory_id,
|
|
32
|
+
recommended_action: entry.recommended_action ?? fallbackAction,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function addWarning(warnings, seen, warning) {
|
|
36
|
+
const key = `${warning.type}:${warning.evidence_id ?? warning.message}`;
|
|
37
|
+
if (seen.has(key))
|
|
38
|
+
return;
|
|
39
|
+
seen.add(key);
|
|
40
|
+
warnings.push(warning);
|
|
41
|
+
}
|
|
42
|
+
function recommendationFromWarning(warning) {
|
|
43
|
+
if (warning.recommended_action)
|
|
44
|
+
return warning.recommended_action;
|
|
45
|
+
switch (warning.type) {
|
|
46
|
+
case 'recent_failure':
|
|
47
|
+
return 'Review the prior failure before running the same tool again.';
|
|
48
|
+
case 'must_follow':
|
|
49
|
+
return 'Apply the must-follow memory before acting.';
|
|
50
|
+
case 'risk':
|
|
51
|
+
return 'Mitigate the remembered risk before proceeding.';
|
|
52
|
+
case 'procedure':
|
|
53
|
+
return 'Use the remembered procedure as the execution path.';
|
|
54
|
+
case 'contradiction':
|
|
55
|
+
return 'Resolve or scope the contradiction before relying on either claim.';
|
|
56
|
+
case 'uncertain':
|
|
57
|
+
return 'Treat the low-confidence memory as a check, not as settled truth.';
|
|
58
|
+
case 'memory_health':
|
|
59
|
+
return 'Repair memory health before relying on recall-sensitive decisions.';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function buildSummary(decision, warnings) {
|
|
63
|
+
if (warnings.length === 0) {
|
|
64
|
+
return 'No relevant memory risks, prior failures, or must-follow procedures were found.';
|
|
65
|
+
}
|
|
66
|
+
const high = warnings.filter(w => w.severity === 'high').length;
|
|
67
|
+
const medium = warnings.filter(w => w.severity === 'medium').length;
|
|
68
|
+
const parts = [`${warnings.length} memory signal${warnings.length === 1 ? '' : 's'}`];
|
|
69
|
+
if (high > 0)
|
|
70
|
+
parts.push(`${high} high severity`);
|
|
71
|
+
if (medium > 0)
|
|
72
|
+
parts.push(`${medium} medium severity`);
|
|
73
|
+
return `${decision === 'block' ? 'Blocked' : 'Caution'}: ${parts.join(', ')} found before acting.`;
|
|
74
|
+
}
|
|
75
|
+
export async function buildPreflight(audrey, action, options = {}) {
|
|
76
|
+
if (!isNonEmptyText(action)) {
|
|
77
|
+
throw new Error('action must be a non-empty string');
|
|
78
|
+
}
|
|
79
|
+
const queryParts = [
|
|
80
|
+
action.trim(),
|
|
81
|
+
options.tool ? `tool:${options.tool}` : '',
|
|
82
|
+
options.cwd ? `cwd:${options.cwd}` : '',
|
|
83
|
+
].filter(Boolean);
|
|
84
|
+
const query = queryParts.join('\n');
|
|
85
|
+
const capsule = await audrey.capsule(query, {
|
|
86
|
+
limit: options.limit ?? 12,
|
|
87
|
+
budgetChars: options.budgetChars ?? 3000,
|
|
88
|
+
mode: options.mode ?? 'conservative',
|
|
89
|
+
recentChangeWindowHours: options.recentChangeWindowHours ?? 72,
|
|
90
|
+
includeRisks: true,
|
|
91
|
+
includeContradictions: true,
|
|
92
|
+
});
|
|
93
|
+
const warnings = [];
|
|
94
|
+
const seen = new Set();
|
|
95
|
+
const includeStatus = options.includeStatus ?? true;
|
|
96
|
+
const status = includeStatus ? audrey.memoryStatus() : undefined;
|
|
97
|
+
if (status && !status.healthy) {
|
|
98
|
+
addWarning(warnings, seen, {
|
|
99
|
+
type: 'memory_health',
|
|
100
|
+
severity: 'high',
|
|
101
|
+
message: 'Audrey memory index is unhealthy; recall may be incomplete or stale.',
|
|
102
|
+
reason: 'memoryStatus().healthy is false.',
|
|
103
|
+
recommended_action: 'Run npx audrey status and npx audrey reembed before depending on memory.',
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
else if (status?.reembed_recommended) {
|
|
107
|
+
addWarning(warnings, seen, {
|
|
108
|
+
type: 'memory_health',
|
|
109
|
+
severity: 'medium',
|
|
110
|
+
message: 'Audrey recommends re-embedding before recall-sensitive work.',
|
|
111
|
+
reason: 'memoryStatus().reembed_recommended is true.',
|
|
112
|
+
recommended_action: 'Run npx audrey reembed during a safe maintenance window.',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const since = new Date(Date.now() - (options.recentFailureWindowHours ?? 168) * 60 * 60 * 1000).toISOString();
|
|
116
|
+
const recentFailures = audrey.recentFailures({ since, limit: 20 });
|
|
117
|
+
const matchingFailures = [];
|
|
118
|
+
for (const failure of recentFailures) {
|
|
119
|
+
if (!matchesToolOrAction(action, options.tool, failure.tool_name))
|
|
120
|
+
continue;
|
|
121
|
+
matchingFailures.push(failure);
|
|
122
|
+
const toolLabel = failure.tool_name || options.tool || 'tool';
|
|
123
|
+
addWarning(warnings, seen, {
|
|
124
|
+
type: 'recent_failure',
|
|
125
|
+
severity: failure.failure_count >= 3 ? 'high' : 'medium',
|
|
126
|
+
message: failure.last_error_summary
|
|
127
|
+
? `${toolLabel} failed ${failure.failure_count}x recently: ${shorten(failure.last_error_summary, 220)}`
|
|
128
|
+
: `${toolLabel} failed ${failure.failure_count}x recently.`,
|
|
129
|
+
reason: 'Matched a recent failed tool event for this action.',
|
|
130
|
+
evidence_id: `failure:${toolLabel}:${failure.last_failed_at}`,
|
|
131
|
+
recommended_action: `Before re-running ${toolLabel}, check what changed since the last failure.`,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
for (const entry of capsule.sections.must_follow) {
|
|
135
|
+
addWarning(warnings, seen, warningFromEntry('must_follow', 'high', entry, 'Apply this must-follow rule before acting.'));
|
|
136
|
+
}
|
|
137
|
+
for (const entry of capsule.sections.risks) {
|
|
138
|
+
addWarning(warnings, seen, warningFromEntry(entry.memory_type === 'tool_failure' ? 'recent_failure' : 'risk', entry.memory_type === 'tool_failure' ? 'medium' : 'high', entry, 'Mitigate this remembered risk before proceeding.'));
|
|
139
|
+
}
|
|
140
|
+
for (const entry of capsule.sections.procedures) {
|
|
141
|
+
addWarning(warnings, seen, warningFromEntry('procedure', 'info', entry, 'Use this remembered procedure as guidance.'));
|
|
142
|
+
}
|
|
143
|
+
for (const entry of capsule.sections.contradictions) {
|
|
144
|
+
addWarning(warnings, seen, warningFromEntry('contradiction', 'high', entry, 'Resolve or scope this contradiction before acting.'));
|
|
145
|
+
}
|
|
146
|
+
for (const entry of capsule.sections.uncertain_or_disputed) {
|
|
147
|
+
addWarning(warnings, seen, warningFromEntry('uncertain', 'medium', entry, 'Treat this as uncertain context and verify before relying on it.'));
|
|
148
|
+
}
|
|
149
|
+
warnings.sort((a, b) => SEVERITY_SCORE[b.severity] - SEVERITY_SCORE[a.severity]);
|
|
150
|
+
const riskScore = warnings.reduce((score, warning) => Math.max(score, SEVERITY_SCORE[warning.severity]), 0);
|
|
151
|
+
const hasHigh = warnings.some(w => w.severity === 'high');
|
|
152
|
+
const hasMedium = warnings.some(w => w.severity === 'medium');
|
|
153
|
+
const decision = options.strict && hasHigh
|
|
154
|
+
? 'block'
|
|
155
|
+
: hasHigh || hasMedium
|
|
156
|
+
? 'caution'
|
|
157
|
+
: 'go';
|
|
158
|
+
const verdict = decision === 'go' ? 'clear' : decision === 'block' ? 'blocked' : 'caution';
|
|
159
|
+
const recommendedActions = [...new Set(warnings.map(recommendationFromWarning))];
|
|
160
|
+
if (decision === 'block') {
|
|
161
|
+
recommendedActions.unshift('Do not proceed until the high-severity memory warning is addressed.');
|
|
162
|
+
}
|
|
163
|
+
const preflightEvent = options.recordEvent && options.tool
|
|
164
|
+
? audrey.observeTool({
|
|
165
|
+
event: 'PreToolUse',
|
|
166
|
+
tool: options.tool,
|
|
167
|
+
sessionId: options.sessionId,
|
|
168
|
+
input: { action: action.trim(), tool: options.tool },
|
|
169
|
+
outcome: 'unknown',
|
|
170
|
+
cwd: options.cwd,
|
|
171
|
+
files: options.files,
|
|
172
|
+
metadata: {
|
|
173
|
+
preflight_decision: decision,
|
|
174
|
+
preflight_warning_count: warnings.length,
|
|
175
|
+
},
|
|
176
|
+
}).event
|
|
177
|
+
: undefined;
|
|
178
|
+
return {
|
|
179
|
+
action: action.trim(),
|
|
180
|
+
query,
|
|
181
|
+
tool: options.tool,
|
|
182
|
+
cwd: options.cwd,
|
|
183
|
+
generated_at: new Date().toISOString(),
|
|
184
|
+
decision,
|
|
185
|
+
verdict,
|
|
186
|
+
ok_to_proceed: decision !== 'block',
|
|
187
|
+
risk_score: Number(riskScore.toFixed(2)),
|
|
188
|
+
summary: buildSummary(decision, warnings),
|
|
189
|
+
warnings,
|
|
190
|
+
recent_failures: matchingFailures,
|
|
191
|
+
...(status ? { status } : {}),
|
|
192
|
+
recommended_actions: recommendedActions,
|
|
193
|
+
evidence_ids: [...new Set([
|
|
194
|
+
...capsule.evidence_ids,
|
|
195
|
+
...warnings.map(w => w.evidence_id).filter((id) => Boolean(id)),
|
|
196
|
+
])],
|
|
197
|
+
...(preflightEvent ? { preflight_event_id: preflightEvent.id } : {}),
|
|
198
|
+
...(options.includeCapsule === false ? {} : { capsule }),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory-to-Behavior promotion — candidate scoring.
|
|
3
|
+
*
|
|
4
|
+
* A "candidate" is a memory (usually procedural, sometimes high-confidence
|
|
5
|
+
* semantic) that has earned the right to become an enforced project rule:
|
|
6
|
+
* - repeated occurrence (multiple supporting episodes)
|
|
7
|
+
* - low contradiction (active state, not disputed)
|
|
8
|
+
* - durable (not recently superseded)
|
|
9
|
+
* - not already promoted to this target
|
|
10
|
+
*
|
|
11
|
+
* Tool-failure context also boosts candidates: if the Bash tool has failed
|
|
12
|
+
* 3 times this week with errors mentioning "sqlite extension", a procedural
|
|
13
|
+
* memory about "initialize sqlite extension before tests" gets a
|
|
14
|
+
* failure_prevented score, which bubbles it up in the ranked list.
|
|
15
|
+
*/
|
|
16
|
+
import type Database from 'better-sqlite3';
|
|
17
|
+
export type PromotionTarget = 'claude-rules' | 'agents-md' | 'playbook' | 'hook' | 'checklist';
|
|
18
|
+
export interface PromotionCandidate {
|
|
19
|
+
candidate_id: string;
|
|
20
|
+
memory_id: string;
|
|
21
|
+
memory_type: 'semantic' | 'procedural';
|
|
22
|
+
content: string;
|
|
23
|
+
scope?: string;
|
|
24
|
+
confidence: number;
|
|
25
|
+
evidence_count: number;
|
|
26
|
+
usage_count: number;
|
|
27
|
+
failure_prevented: number;
|
|
28
|
+
tags: string[];
|
|
29
|
+
score: number;
|
|
30
|
+
reason: string;
|
|
31
|
+
}
|
|
32
|
+
export interface FindCandidatesOptions {
|
|
33
|
+
minConfidence?: number;
|
|
34
|
+
minEvidence?: number;
|
|
35
|
+
limit?: number;
|
|
36
|
+
target?: PromotionTarget;
|
|
37
|
+
since?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function findPromotionCandidates(db: Database.Database, options?: FindCandidatesOptions): PromotionCandidate[];
|
|
40
|
+
//# sourceMappingURL=promote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/promote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,WAAW,CAAC;AAE/F,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,UAAU,GAAG,YAAY,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2GD,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,GAAE,qBAA0B,GAClC,kBAAkB,EAAE,CA+HtB"}
|