@traqr/memory 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth.d.ts +18 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +31 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/auto-derive.d.ts +35 -0
- package/dist/lib/auto-derive.js +261 -0
- package/dist/lib/auto-derive.js.map +1 -0
- package/dist/lib/borderline.d.ts +26 -0
- package/dist/lib/borderline.js +121 -0
- package/dist/lib/borderline.js.map +1 -0
- package/dist/lib/client.d.ts +28 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +60 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/context.d.ts +38 -0
- package/dist/lib/context.d.ts.map +1 -0
- package/dist/lib/context.js +334 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/embeddings.d.ts +60 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +229 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/entity-pipeline.d.ts +23 -0
- package/dist/lib/entity-pipeline.js +151 -0
- package/dist/lib/entity-pipeline.js.map +1 -0
- package/dist/lib/formatting.d.ts +13 -0
- package/dist/lib/formatting.d.ts.map +1 -0
- package/dist/lib/formatting.js +60 -0
- package/dist/lib/formatting.js.map +1 -0
- package/dist/lib/learning-extractor.d.ts +144 -0
- package/dist/lib/learning-extractor.d.ts.map +1 -0
- package/dist/lib/learning-extractor.js +921 -0
- package/dist/lib/learning-extractor.js.map +1 -0
- package/dist/lib/lifecycle.d.ts +45 -0
- package/dist/lib/lifecycle.js +84 -0
- package/dist/lib/lifecycle.js.map +1 -0
- package/dist/lib/memory.d.ts +128 -0
- package/dist/lib/memory.d.ts.map +1 -0
- package/dist/lib/memory.js +590 -0
- package/dist/lib/memory.js.map +1 -0
- package/dist/lib/quality-gate.d.ts +32 -0
- package/dist/lib/quality-gate.js +158 -0
- package/dist/lib/quality-gate.js.map +1 -0
- package/dist/lib/quality-gate.test.d.ts +7 -0
- package/dist/lib/quality-gate.test.js +75 -0
- package/dist/lib/quality-gate.test.js.map +1 -0
- package/dist/lib/rerank.d.ts +22 -0
- package/dist/lib/rerank.js +61 -0
- package/dist/lib/rerank.js.map +1 -0
- package/dist/lib/retrieval.d.ts +75 -0
- package/dist/lib/retrieval.js +380 -0
- package/dist/lib/retrieval.js.map +1 -0
- package/dist/migrate.d.ts +17 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +81 -0
- package/dist/migrate.js.map +1 -0
- package/dist/routes/analyze-codebase.d.ts +9 -0
- package/dist/routes/analyze-codebase.d.ts.map +1 -0
- package/dist/routes/analyze-codebase.js +70 -0
- package/dist/routes/analyze-codebase.js.map +1 -0
- package/dist/routes/analyze-voice.d.ts +9 -0
- package/dist/routes/analyze-voice.d.ts.map +1 -0
- package/dist/routes/analyze-voice.js +63 -0
- package/dist/routes/analyze-voice.js.map +1 -0
- package/dist/routes/assemble-context.d.ts +9 -0
- package/dist/routes/assemble-context.d.ts.map +1 -0
- package/dist/routes/assemble-context.js +68 -0
- package/dist/routes/assemble-context.js.map +1 -0
- package/dist/routes/bootstrap.d.ts +12 -0
- package/dist/routes/bootstrap.d.ts.map +1 -0
- package/dist/routes/bootstrap.js +102 -0
- package/dist/routes/bootstrap.js.map +1 -0
- package/dist/routes/browse.d.ts +11 -0
- package/dist/routes/browse.js +85 -0
- package/dist/routes/browse.js.map +1 -0
- package/dist/routes/capture-thought.d.ts +13 -0
- package/dist/routes/capture-thought.d.ts.map +1 -0
- package/dist/routes/capture-thought.js +178 -0
- package/dist/routes/capture-thought.js.map +1 -0
- package/dist/routes/capture.d.ts +13 -0
- package/dist/routes/capture.d.ts.map +1 -0
- package/dist/routes/capture.js +86 -0
- package/dist/routes/capture.js.map +1 -0
- package/dist/routes/cite.d.ts +9 -0
- package/dist/routes/cite.d.ts.map +1 -0
- package/dist/routes/cite.js +49 -0
- package/dist/routes/cite.js.map +1 -0
- package/dist/routes/crud.d.ts +11 -0
- package/dist/routes/crud.d.ts.map +1 -0
- package/dist/routes/crud.js +176 -0
- package/dist/routes/crud.js.map +1 -0
- package/dist/routes/dashboard.d.ts +9 -0
- package/dist/routes/dashboard.d.ts.map +1 -0
- package/dist/routes/dashboard.js +85 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/entity-cron.d.ts +8 -0
- package/dist/routes/entity-cron.js +31 -0
- package/dist/routes/entity-cron.js.map +1 -0
- package/dist/routes/export.d.ts +8 -0
- package/dist/routes/export.d.ts.map +1 -0
- package/dist/routes/export.js +69 -0
- package/dist/routes/export.js.map +1 -0
- package/dist/routes/extract-pr-learnings.d.ts +12 -0
- package/dist/routes/extract-pr-learnings.d.ts.map +1 -0
- package/dist/routes/extract-pr-learnings.js +127 -0
- package/dist/routes/extract-pr-learnings.js.map +1 -0
- package/dist/routes/forget-cron.d.ts +9 -0
- package/dist/routes/forget-cron.js +30 -0
- package/dist/routes/forget-cron.js.map +1 -0
- package/dist/routes/learnings.d.ts +9 -0
- package/dist/routes/learnings.d.ts.map +1 -0
- package/dist/routes/learnings.js +237 -0
- package/dist/routes/learnings.js.map +1 -0
- package/dist/routes/pulse.d.ts +9 -0
- package/dist/routes/pulse.d.ts.map +1 -0
- package/dist/routes/pulse.js +133 -0
- package/dist/routes/pulse.js.map +1 -0
- package/dist/routes/search.d.ts +8 -0
- package/dist/routes/search.d.ts.map +1 -0
- package/dist/routes/search.js +107 -0
- package/dist/routes/search.js.map +1 -0
- package/dist/routes/store.d.ts +8 -0
- package/dist/routes/store.d.ts.map +1 -0
- package/dist/routes/store.js +89 -0
- package/dist/routes/store.js.map +1 -0
- package/dist/routes/sync.d.ts +12 -0
- package/dist/routes/sync.d.ts.map +1 -0
- package/dist/routes/sync.js +83 -0
- package/dist/routes/sync.js.map +1 -0
- package/dist/routes/voice-profile.d.ts +9 -0
- package/dist/routes/voice-profile.d.ts.map +1 -0
- package/dist/routes/voice-profile.js +124 -0
- package/dist/routes/voice-profile.js.map +1 -0
- package/dist/server.d.ts +37 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +99 -0
- package/dist/server.js.map +1 -0
- package/dist/vectordb/index.d.ts +17 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +39 -0
- package/dist/vectordb/index.js.map +1 -0
- package/dist/vectordb/supabase.d.ts +62 -0
- package/dist/vectordb/supabase.d.ts.map +1 -0
- package/dist/vectordb/supabase.js +711 -0
- package/dist/vectordb/supabase.js.map +1 -0
- package/dist/vectordb/types.d.ts +217 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +28 -0
- package/dist/vectordb/types.js.map +1 -0
- package/package.json +49 -0
- package/setup.sql +1037 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Borderline Decision Module
|
|
3
|
+
*
|
|
4
|
+
* When cosine triage hits Zone 3 (0.60-0.90 similarity),
|
|
5
|
+
* this module uses GPT-4o-mini to decide: ADD, UPDATE, or NOOP.
|
|
6
|
+
* UUID masking prevents the LLM from hallucinating memory IDs.
|
|
7
|
+
*
|
|
8
|
+
* Fallback: if LLM fails for ANY reason, caller uses I-M6 heuristic.
|
|
9
|
+
*/
|
|
10
|
+
import OpenAI from 'openai';
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// OpenAI Client (singleton, same pattern as embeddings.ts)
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
let client = null;
|
|
15
|
+
function getClient() {
|
|
16
|
+
if (client)
|
|
17
|
+
return client;
|
|
18
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
19
|
+
if (!apiKey)
|
|
20
|
+
throw new Error('OPENAI_API_KEY not set');
|
|
21
|
+
client = new OpenAI({ apiKey });
|
|
22
|
+
return client;
|
|
23
|
+
}
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Prompt
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
const LABELS = ['MEMORY_A', 'MEMORY_B', 'MEMORY_C'];
|
|
28
|
+
function buildPrompt(newContent, existing, memoryType) {
|
|
29
|
+
const typeGuidance = {
|
|
30
|
+
fact: 'Facts have one truth. If the new memory contradicts an existing fact, UPDATE.',
|
|
31
|
+
preference: 'Preferences change over time. If the new memory expresses a different preference on the same topic, UPDATE.',
|
|
32
|
+
pattern: 'Patterns compound. Usually ADD alongside existing. Only UPDATE if directly contradicted.',
|
|
33
|
+
}[memoryType] || 'Use your best judgment based on content overlap and contradiction.';
|
|
34
|
+
const existingBlock = existing
|
|
35
|
+
.map((m) => `${m.label}: ${m.content}`)
|
|
36
|
+
.join('\n\n');
|
|
37
|
+
return `You are a memory deduplication classifier for a personal knowledge system.
|
|
38
|
+
|
|
39
|
+
Given a NEW memory and EXISTING similar memories, decide:
|
|
40
|
+
- ADD: genuinely new information that should be stored alongside existing memories
|
|
41
|
+
- UPDATE: new memory supersedes or contradicts an existing memory — the old one should be replaced
|
|
42
|
+
- NOOP: existing memory already covers this content — skip storing the new one
|
|
43
|
+
|
|
44
|
+
Memory type: ${memoryType.toUpperCase()}
|
|
45
|
+
${typeGuidance}
|
|
46
|
+
|
|
47
|
+
NEW MEMORY:
|
|
48
|
+
${newContent}
|
|
49
|
+
|
|
50
|
+
EXISTING MEMORIES:
|
|
51
|
+
${existingBlock}
|
|
52
|
+
|
|
53
|
+
Respond with JSON only.`;
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// JSON Schema for structured output
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
const RESPONSE_SCHEMA = {
|
|
59
|
+
type: 'json_schema',
|
|
60
|
+
json_schema: {
|
|
61
|
+
name: 'borderline_decision',
|
|
62
|
+
strict: true,
|
|
63
|
+
schema: {
|
|
64
|
+
type: 'object',
|
|
65
|
+
properties: {
|
|
66
|
+
action: { type: 'string', enum: ['add', 'update', 'noop'] },
|
|
67
|
+
target: { type: ['string', 'null'], description: 'Label of the existing memory to update (e.g., MEMORY_A). Null for add/noop.' },
|
|
68
|
+
reasoning: { type: 'string', description: 'Brief explanation of the decision.' },
|
|
69
|
+
},
|
|
70
|
+
required: ['action', 'target', 'reasoning'],
|
|
71
|
+
additionalProperties: false,
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Core Decision Function
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
/**
|
|
79
|
+
* Ask GPT-4o-mini to classify a borderline memory.
|
|
80
|
+
* Returns null on any failure — caller should fall back to heuristic.
|
|
81
|
+
*/
|
|
82
|
+
export async function borderlineDecision(newContent, existingMemories, memoryType) {
|
|
83
|
+
try {
|
|
84
|
+
const openai = getClient();
|
|
85
|
+
const prompt = buildPrompt(newContent, existingMemories.slice(0, 3), memoryType);
|
|
86
|
+
const response = await openai.chat.completions.create({
|
|
87
|
+
model: 'gpt-4o-mini',
|
|
88
|
+
messages: [{ role: 'user', content: prompt }],
|
|
89
|
+
response_format: RESPONSE_SCHEMA,
|
|
90
|
+
temperature: 0,
|
|
91
|
+
max_tokens: 200,
|
|
92
|
+
});
|
|
93
|
+
const content = response.choices[0]?.message?.content;
|
|
94
|
+
if (!content)
|
|
95
|
+
return null;
|
|
96
|
+
const parsed = JSON.parse(content);
|
|
97
|
+
// Validate action
|
|
98
|
+
if (!['add', 'update', 'noop'].includes(parsed.action))
|
|
99
|
+
return null;
|
|
100
|
+
// Validate target label if update
|
|
101
|
+
if (parsed.action === 'update' && parsed.target) {
|
|
102
|
+
if (!LABELS.includes(parsed.target))
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
// Map action to edge type
|
|
106
|
+
const edgeType = parsed.action === 'update' ? 'updates' :
|
|
107
|
+
parsed.action === 'add' ? 'related' :
|
|
108
|
+
null;
|
|
109
|
+
return {
|
|
110
|
+
action: parsed.action,
|
|
111
|
+
target: parsed.target || undefined,
|
|
112
|
+
edgeType,
|
|
113
|
+
reasoning: parsed.reasoning || '',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
console.warn('[borderline] LLM decision failed, falling back to heuristic:', err instanceof Error ? err.message : err);
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=borderline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"borderline.js","sourceRoot":"","sources":["../../src/lib/borderline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase Client for @traqr/memory
|
|
3
|
+
*
|
|
4
|
+
* Configurable Supabase client for the memory system.
|
|
5
|
+
* Uses generic env vars (SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY)
|
|
6
|
+
* instead of NookTraqr-specific ones.
|
|
7
|
+
*/
|
|
8
|
+
import { SupabaseClient } from '@supabase/supabase-js';
|
|
9
|
+
export interface MemoryClientConfig {
|
|
10
|
+
supabaseUrl?: string;
|
|
11
|
+
supabaseKey?: string;
|
|
12
|
+
userId?: string;
|
|
13
|
+
projectId?: string;
|
|
14
|
+
tableName?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const DEFAULT_USER_ID = "a0000000-0000-0000-0000-000000000001";
|
|
17
|
+
export declare const DEFAULT_PROJECT_ID = "b0000000-0000-0000-0000-000000000001";
|
|
18
|
+
export declare function getMemoryClient(config?: MemoryClientConfig): SupabaseClient;
|
|
19
|
+
export declare function getUserId(): string;
|
|
20
|
+
export declare function getProjectId(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Configure the memory system in one shot.
|
|
23
|
+
* Resets the singleton so next getMemoryClient() uses the new config.
|
|
24
|
+
*/
|
|
25
|
+
export declare function configureMemory(config: MemoryClientConfig): void;
|
|
26
|
+
export declare function getTableName(): string;
|
|
27
|
+
/** Reset singleton (for testing) */
|
|
28
|
+
export declare function resetMemoryClient(): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAIpE,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAGD,eAAO,MAAM,eAAe,yCAAyC,CAAA;AACrE,eAAO,MAAM,kBAAkB,yCAAyC,CAAA;AAMxE,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,cAAc,CAwB3E;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAIhE;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,oCAAoC;AACpC,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase Client for @traqr/memory
|
|
3
|
+
*
|
|
4
|
+
* Configurable Supabase client for the memory system.
|
|
5
|
+
* Uses generic env vars (SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY)
|
|
6
|
+
* instead of NookTraqr-specific ones.
|
|
7
|
+
*/
|
|
8
|
+
import { createClient } from '@supabase/supabase-js';
|
|
9
|
+
let clientInstance = null;
|
|
10
|
+
// Default IDs for single-user mode
|
|
11
|
+
export const DEFAULT_USER_ID = 'a0000000-0000-0000-0000-000000000001';
|
|
12
|
+
export const DEFAULT_PROJECT_ID = 'b0000000-0000-0000-0000-000000000001';
|
|
13
|
+
let _userId = DEFAULT_USER_ID;
|
|
14
|
+
let _projectId = DEFAULT_PROJECT_ID;
|
|
15
|
+
let _tableName = 'traqr_memories';
|
|
16
|
+
export function getMemoryClient(config) {
|
|
17
|
+
if (clientInstance)
|
|
18
|
+
return clientInstance;
|
|
19
|
+
const url = config?.supabaseUrl || process.env.SUPABASE_URL || process.env.TRAQR_SUPABASE_URL;
|
|
20
|
+
const key = config?.supabaseKey || process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.TRAQR_SUPABASE_SERVICE_ROLE_KEY;
|
|
21
|
+
if (!url || !key) {
|
|
22
|
+
throw new Error('SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are required. ' +
|
|
23
|
+
'Set these environment variables to connect to your Supabase instance.');
|
|
24
|
+
}
|
|
25
|
+
if (config?.userId)
|
|
26
|
+
_userId = config.userId;
|
|
27
|
+
if (config?.projectId)
|
|
28
|
+
_projectId = config.projectId;
|
|
29
|
+
clientInstance = createClient(url, key, {
|
|
30
|
+
auth: {
|
|
31
|
+
autoRefreshToken: false,
|
|
32
|
+
persistSession: false,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
return clientInstance;
|
|
36
|
+
}
|
|
37
|
+
export function getUserId() {
|
|
38
|
+
return _userId;
|
|
39
|
+
}
|
|
40
|
+
export function getProjectId() {
|
|
41
|
+
return _projectId;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Configure the memory system in one shot.
|
|
45
|
+
* Resets the singleton so next getMemoryClient() uses the new config.
|
|
46
|
+
*/
|
|
47
|
+
export function configureMemory(config) {
|
|
48
|
+
clientInstance = null;
|
|
49
|
+
if (config.tableName)
|
|
50
|
+
_tableName = config.tableName;
|
|
51
|
+
getMemoryClient(config);
|
|
52
|
+
}
|
|
53
|
+
export function getTableName() {
|
|
54
|
+
return _tableName;
|
|
55
|
+
}
|
|
56
|
+
/** Reset singleton (for testing) */
|
|
57
|
+
export function resetMemoryClient() {
|
|
58
|
+
clientInstance = null;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAA;AAEpE,IAAI,cAAc,GAA0B,IAAI,CAAA;AAUhD,mCAAmC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,sCAAsC,CAAA;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,sCAAsC,CAAA;AAExE,IAAI,OAAO,GAAG,eAAe,CAAA;AAC7B,IAAI,UAAU,GAAG,kBAAkB,CAAA;AACnC,IAAI,UAAU,GAAG,gBAAgB,CAAA;AAEjC,MAAM,UAAU,eAAe,CAAC,MAA2B;IACzD,IAAI,cAAc;QAAE,OAAO,cAAc,CAAA;IAEzC,MAAM,GAAG,GAAG,MAAM,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;IAC7F,MAAM,GAAG,GAAG,MAAM,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAA;IAEvH,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,2DAA2D;YAC3D,uEAAuE,CACxE,CAAA;IACH,CAAC;IAED,IAAI,MAAM,EAAE,MAAM;QAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAA;IAC3C,IAAI,MAAM,EAAE,SAAS;QAAE,UAAU,GAAG,MAAM,CAAC,SAAS,CAAA;IAEpD,cAAc,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE;QACtC,IAAI,EAAE;YACJ,gBAAgB,EAAE,KAAK;YACvB,cAAc,EAAE,KAAK;SACtB;KACF,CAAC,CAAA;IAEF,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,cAAc,GAAG,IAAI,CAAA;IACrB,IAAI,MAAM,CAAC,SAAS;QAAE,UAAU,GAAG,MAAM,CAAC,SAAS,CAAA;IACnD,eAAe,CAAC,MAAM,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,iBAAiB;IAC/B,cAAc,GAAG,IAAI,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Context Assembly — Portable
|
|
3
|
+
*
|
|
4
|
+
* Single function that replaces 5+ serial HTTP calls in /startup.
|
|
5
|
+
* Runs parallel vector searches and assembles a formatted context block
|
|
6
|
+
* for injection into agent sessions.
|
|
7
|
+
*/
|
|
8
|
+
import type { MemorySearchResult } from '../vectordb/types.js';
|
|
9
|
+
export interface SessionContextParams {
|
|
10
|
+
slotName: string;
|
|
11
|
+
taskDescription?: string;
|
|
12
|
+
filesExpected?: string[];
|
|
13
|
+
sourceProject?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface MemoryWithShortCode extends MemorySearchResult {
|
|
16
|
+
shortCode: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SessionContext {
|
|
19
|
+
principles: MemoryWithShortCode[];
|
|
20
|
+
taskRelevant: MemoryWithShortCode[];
|
|
21
|
+
gotchas: MemoryWithShortCode[];
|
|
22
|
+
preferences: MemoryWithShortCode[];
|
|
23
|
+
voiceTraits: MemoryWithShortCode[];
|
|
24
|
+
identity: MemoryWithShortCode[];
|
|
25
|
+
recentLearnings: MemoryWithShortCode[];
|
|
26
|
+
learningsLoaded: {
|
|
27
|
+
id: string;
|
|
28
|
+
shortCode: string;
|
|
29
|
+
content: string;
|
|
30
|
+
}[];
|
|
31
|
+
totalFound: number;
|
|
32
|
+
promptContext: string;
|
|
33
|
+
searchTimings: {
|
|
34
|
+
query: string;
|
|
35
|
+
ms: number;
|
|
36
|
+
}[];
|
|
37
|
+
}
|
|
38
|
+
export declare function assembleSessionContext(params: SessionContextParams): Promise<SessionContext>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/lib/context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAM9D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,mBAAmB,EAAE,CAAA;IACjC,YAAY,EAAE,mBAAmB,EAAE,CAAA;IACnC,OAAO,EAAE,mBAAmB,EAAE,CAAA;IAC9B,WAAW,EAAE,mBAAmB,EAAE,CAAA;IAClC,WAAW,EAAE,mBAAmB,EAAE,CAAA;IAClC,QAAQ,EAAE,mBAAmB,EAAE,CAAA;IAC/B,eAAe,EAAE,mBAAmB,EAAE,CAAA;IACtC,eAAe,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACrE,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC/C;AAsFD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAoHzB"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Context Assembly — Portable
|
|
3
|
+
*
|
|
4
|
+
* Single function that replaces 5+ serial HTTP calls in /startup.
|
|
5
|
+
* Runs parallel vector searches and assembles a formatted context block
|
|
6
|
+
* for injection into agent sessions.
|
|
7
|
+
*/
|
|
8
|
+
import { searchMemories } from './memory.js';
|
|
9
|
+
import { CATEGORY_EMOJI } from './formatting.js';
|
|
10
|
+
import { getMemoryClient } from './client.js';
|
|
11
|
+
// ============================================================
|
|
12
|
+
// Domain Classification
|
|
13
|
+
// ============================================================
|
|
14
|
+
const DOMAIN_KEYWORDS = {
|
|
15
|
+
technical: [
|
|
16
|
+
'api', 'endpoint', 'database', 'supabase', 'firebase', 'vercel',
|
|
17
|
+
'posthog', 'linear', 'slack', 'webhook', 'cron', 'auth', 'sync',
|
|
18
|
+
'slot', 'daemon', 'deploy', 'build', 'type', 'schema', 'migration',
|
|
19
|
+
'query', 'index', 'cache', 'embedding', 'vector', 'openai',
|
|
20
|
+
],
|
|
21
|
+
user: [
|
|
22
|
+
'sean', 'user', 'ux', 'onboarding', 'feedback', 'preference',
|
|
23
|
+
'visual', 'demo', 'pitch', 'aws', 'product', 'mvp', 'bar',
|
|
24
|
+
'non-technical', 'easy', 'simple',
|
|
25
|
+
],
|
|
26
|
+
process: [
|
|
27
|
+
'workflow', 'process', 'ship', 'merge', 'pr', 'commit', 'review',
|
|
28
|
+
'test', 'verify', 'debug', 'slot', 'sync', 'dispatch', 'plan',
|
|
29
|
+
'audit', 'error message', 'diagnostic',
|
|
30
|
+
],
|
|
31
|
+
meta: [
|
|
32
|
+
'learning', 'memory', 'compound', 'reference', 'capture', 'bootstrap',
|
|
33
|
+
'startup', 'session', 'loop', 'self-improving', 'system',
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
function classifyDomain(content) {
|
|
37
|
+
const lower = content.toLowerCase();
|
|
38
|
+
const scores = { technical: 0, user: 0, process: 0, meta: 0 };
|
|
39
|
+
for (const [domain, keywords] of Object.entries(DOMAIN_KEYWORDS)) {
|
|
40
|
+
for (const kw of keywords) {
|
|
41
|
+
if (lower.includes(kw)) {
|
|
42
|
+
scores[domain]++;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
let best = 'technical';
|
|
47
|
+
let bestScore = 0;
|
|
48
|
+
for (const [domain, score] of Object.entries(scores)) {
|
|
49
|
+
if (score > bestScore) {
|
|
50
|
+
best = domain;
|
|
51
|
+
bestScore = score;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return best;
|
|
55
|
+
}
|
|
56
|
+
async function timedSearch(label, query, options = {}) {
|
|
57
|
+
const start = Date.now();
|
|
58
|
+
try {
|
|
59
|
+
const results = await searchMemories(query, options);
|
|
60
|
+
return {
|
|
61
|
+
results,
|
|
62
|
+
timing: { query: label, ms: Date.now() - start },
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.warn(`[memory-context] Search "${label}" failed:`, error);
|
|
67
|
+
return {
|
|
68
|
+
results: [],
|
|
69
|
+
timing: { query: `${label} (FAILED)`, ms: Date.now() - start },
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ============================================================
|
|
74
|
+
// Core Assembly
|
|
75
|
+
// ============================================================
|
|
76
|
+
export async function assembleSessionContext(params) {
|
|
77
|
+
const { slotName, taskDescription, filesExpected } = params;
|
|
78
|
+
const searches = await Promise.all([
|
|
79
|
+
timedSearch('principles', 'critical rules conventions best practices gotchas', {
|
|
80
|
+
limit: 5,
|
|
81
|
+
similarityThreshold: 0.45,
|
|
82
|
+
}),
|
|
83
|
+
taskDescription
|
|
84
|
+
? timedSearch('task-relevant', taskDescription, {
|
|
85
|
+
limit: 7,
|
|
86
|
+
similarityThreshold: 0.4,
|
|
87
|
+
})
|
|
88
|
+
: Promise.resolve({ results: [], timing: { query: 'task-relevant (skipped)', ms: 0 } }),
|
|
89
|
+
filesExpected && filesExpected.length > 0
|
|
90
|
+
? timedSearch('gotchas', filesExpected.join(' '), {
|
|
91
|
+
limit: 3,
|
|
92
|
+
category: 'gotcha',
|
|
93
|
+
similarityThreshold: 0.4,
|
|
94
|
+
})
|
|
95
|
+
: timedSearch('gotchas', `${slotName} common gotchas pitfalls`, {
|
|
96
|
+
limit: 3,
|
|
97
|
+
category: 'gotcha',
|
|
98
|
+
similarityThreshold: 0.4,
|
|
99
|
+
}),
|
|
100
|
+
timedSearch('preferences', 'design preference convention style naming file structure', {
|
|
101
|
+
limit: 3,
|
|
102
|
+
similarityThreshold: 0.4,
|
|
103
|
+
}),
|
|
104
|
+
timedSearch('voice', 'writing voice tone style audience', {
|
|
105
|
+
limit: 2,
|
|
106
|
+
tags: ['voice'],
|
|
107
|
+
similarityThreshold: 0.4,
|
|
108
|
+
}),
|
|
109
|
+
timedSearch('identity', 'Sean preferences priorities values target audience decision-making style', {
|
|
110
|
+
limit: 3,
|
|
111
|
+
tags: ['identity'],
|
|
112
|
+
similarityThreshold: 0.35,
|
|
113
|
+
}),
|
|
114
|
+
]);
|
|
115
|
+
const [principlesSearch, taskSearch, gotchasSearch, preferencesSearch, voiceSearch, identitySearch] = searches;
|
|
116
|
+
const seen = new Set();
|
|
117
|
+
const addShortCode = (r) => ({
|
|
118
|
+
...r,
|
|
119
|
+
shortCode: `MEM-${r.id.slice(0, 6)}`,
|
|
120
|
+
});
|
|
121
|
+
const dedup = (results) => {
|
|
122
|
+
return results
|
|
123
|
+
.filter((r) => {
|
|
124
|
+
if (seen.has(r.id))
|
|
125
|
+
return false;
|
|
126
|
+
seen.add(r.id);
|
|
127
|
+
return true;
|
|
128
|
+
})
|
|
129
|
+
.map(addShortCode);
|
|
130
|
+
};
|
|
131
|
+
const RELEVANCE_FLOOR = 0.35;
|
|
132
|
+
const principles = dedup(principlesSearch.results).filter(r => r.relevanceScore >= RELEVANCE_FLOOR);
|
|
133
|
+
const taskRelevant = dedup(taskSearch.results).filter(r => r.relevanceScore >= RELEVANCE_FLOOR);
|
|
134
|
+
const gotchas = dedup(gotchasSearch.results).filter(r => r.relevanceScore >= RELEVANCE_FLOOR);
|
|
135
|
+
const preferences = dedup(preferencesSearch.results).filter(r => r.relevanceScore >= RELEVANCE_FLOOR);
|
|
136
|
+
const voiceTraits = dedup(voiceSearch.results).filter(r => r.relevanceScore >= RELEVANCE_FLOOR);
|
|
137
|
+
const identity = dedup(identitySearch.results).filter(r => r.relevanceScore >= RELEVANCE_FLOOR);
|
|
138
|
+
const allResults = [...principles, ...taskRelevant, ...gotchas, ...preferences, ...voiceTraits, ...identity];
|
|
139
|
+
const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
|
|
140
|
+
const recentLearnings = allResults.filter((r) => new Date(r.createdAt) > sevenDaysAgo);
|
|
141
|
+
const totalFound = allResults.length;
|
|
142
|
+
const learningsLoaded = allResults.map((r) => ({
|
|
143
|
+
id: r.id,
|
|
144
|
+
shortCode: r.shortCode,
|
|
145
|
+
content: r.content.slice(0, 100),
|
|
146
|
+
}));
|
|
147
|
+
const searchTimings = searches.map((s) => s.timing);
|
|
148
|
+
// Fire-and-forget: track which memories were returned
|
|
149
|
+
if (allResults.length > 0) {
|
|
150
|
+
const memoryIds = allResults.map(r => r.id);
|
|
151
|
+
trackMemoryReturns(memoryIds).catch(() => {
|
|
152
|
+
// Silently ignore — tracking is best-effort
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
const promptContext = formatPromptContext({
|
|
156
|
+
principles,
|
|
157
|
+
taskRelevant,
|
|
158
|
+
gotchas,
|
|
159
|
+
preferences,
|
|
160
|
+
voiceTraits,
|
|
161
|
+
identity,
|
|
162
|
+
taskDescription,
|
|
163
|
+
});
|
|
164
|
+
return {
|
|
165
|
+
principles,
|
|
166
|
+
taskRelevant,
|
|
167
|
+
gotchas,
|
|
168
|
+
preferences,
|
|
169
|
+
voiceTraits,
|
|
170
|
+
identity,
|
|
171
|
+
recentLearnings,
|
|
172
|
+
learningsLoaded,
|
|
173
|
+
totalFound,
|
|
174
|
+
promptContext,
|
|
175
|
+
searchTimings,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function formatPromptContext(params) {
|
|
179
|
+
const { principles, taskRelevant, gotchas, preferences, voiceTraits, identity, taskDescription } = params;
|
|
180
|
+
const lines = [];
|
|
181
|
+
const HARD_CAP = 15;
|
|
182
|
+
let totalShown = 0;
|
|
183
|
+
const byDomain = {
|
|
184
|
+
technical: [],
|
|
185
|
+
user: [],
|
|
186
|
+
process: [],
|
|
187
|
+
meta: [],
|
|
188
|
+
};
|
|
189
|
+
for (const p of principles) {
|
|
190
|
+
const domain = classifyDomain(p.content);
|
|
191
|
+
byDomain[domain].push(p);
|
|
192
|
+
}
|
|
193
|
+
lines.push('RELEVANT LEARNINGS FROM VECTOR DB');
|
|
194
|
+
lines.push('='.repeat(50));
|
|
195
|
+
lines.push('');
|
|
196
|
+
if (byDomain.technical.length > 0 && totalShown < HARD_CAP) {
|
|
197
|
+
lines.push('TECHNICAL');
|
|
198
|
+
lines.push('-'.repeat(30));
|
|
199
|
+
for (const m of byDomain.technical.slice(0, 3)) {
|
|
200
|
+
if (totalShown >= HARD_CAP)
|
|
201
|
+
break;
|
|
202
|
+
const emoji = CATEGORY_EMOJI[m.category || ''] || '';
|
|
203
|
+
const summary = extractSummary(m.content);
|
|
204
|
+
lines.push(` [${m.shortCode}] ${emoji} [${m.category}] ${summary}`);
|
|
205
|
+
totalShown++;
|
|
206
|
+
}
|
|
207
|
+
lines.push('');
|
|
208
|
+
}
|
|
209
|
+
if (byDomain.user.length > 0 && totalShown < HARD_CAP) {
|
|
210
|
+
lines.push('USER/SEAN');
|
|
211
|
+
lines.push('-'.repeat(30));
|
|
212
|
+
for (const m of byDomain.user.slice(0, 2)) {
|
|
213
|
+
if (totalShown >= HARD_CAP)
|
|
214
|
+
break;
|
|
215
|
+
const emoji = CATEGORY_EMOJI[m.category || ''] || '';
|
|
216
|
+
const summary = extractSummary(m.content);
|
|
217
|
+
lines.push(` [${m.shortCode}] ${emoji} [${m.category}] ${summary}`);
|
|
218
|
+
totalShown++;
|
|
219
|
+
}
|
|
220
|
+
lines.push('');
|
|
221
|
+
}
|
|
222
|
+
if (byDomain.process.length > 0 && totalShown < HARD_CAP) {
|
|
223
|
+
lines.push('PROCESS');
|
|
224
|
+
lines.push('-'.repeat(30));
|
|
225
|
+
for (const m of byDomain.process.slice(0, 2)) {
|
|
226
|
+
if (totalShown >= HARD_CAP)
|
|
227
|
+
break;
|
|
228
|
+
const emoji = CATEGORY_EMOJI[m.category || ''] || '';
|
|
229
|
+
const summary = extractSummary(m.content);
|
|
230
|
+
lines.push(` [${m.shortCode}] ${emoji} [${m.category}] ${summary}`);
|
|
231
|
+
totalShown++;
|
|
232
|
+
}
|
|
233
|
+
lines.push('');
|
|
234
|
+
}
|
|
235
|
+
if (byDomain.meta.length > 0 && totalShown < HARD_CAP) {
|
|
236
|
+
lines.push('META');
|
|
237
|
+
lines.push('-'.repeat(30));
|
|
238
|
+
for (const m of byDomain.meta.slice(0, 2)) {
|
|
239
|
+
if (totalShown >= HARD_CAP)
|
|
240
|
+
break;
|
|
241
|
+
const emoji = CATEGORY_EMOJI[m.category || ''] || '';
|
|
242
|
+
const summary = extractSummary(m.content);
|
|
243
|
+
lines.push(` [${m.shortCode}] ${emoji} [${m.category}] ${summary}`);
|
|
244
|
+
totalShown++;
|
|
245
|
+
}
|
|
246
|
+
lines.push('');
|
|
247
|
+
}
|
|
248
|
+
if (taskDescription && taskRelevant.length > 0 && totalShown < HARD_CAP) {
|
|
249
|
+
lines.push('RELEVANT TO YOUR TASK');
|
|
250
|
+
lines.push('-'.repeat(30));
|
|
251
|
+
for (const m of taskRelevant.slice(0, 4)) {
|
|
252
|
+
if (totalShown >= HARD_CAP)
|
|
253
|
+
break;
|
|
254
|
+
const emoji = CATEGORY_EMOJI[m.category || ''] || '';
|
|
255
|
+
const pct = Math.round(m.relevanceScore * 100);
|
|
256
|
+
const summary = extractSummary(m.content);
|
|
257
|
+
lines.push(` [${m.shortCode}] ${emoji} [${pct}%] ${summary}`);
|
|
258
|
+
totalShown++;
|
|
259
|
+
}
|
|
260
|
+
lines.push('');
|
|
261
|
+
}
|
|
262
|
+
if (gotchas.length > 0) {
|
|
263
|
+
lines.push('GOTCHAS / WARNINGS');
|
|
264
|
+
lines.push('-'.repeat(30));
|
|
265
|
+
for (const m of gotchas) {
|
|
266
|
+
const summary = extractSummary(m.content);
|
|
267
|
+
lines.push(` [${m.shortCode}] ${CATEGORY_EMOJI.gotcha} ${summary}`);
|
|
268
|
+
}
|
|
269
|
+
lines.push('');
|
|
270
|
+
}
|
|
271
|
+
if (preferences.length > 0) {
|
|
272
|
+
lines.push('DESIGN PREFERENCES & CONVENTIONS');
|
|
273
|
+
lines.push('-'.repeat(30));
|
|
274
|
+
for (const m of preferences) {
|
|
275
|
+
const emoji = CATEGORY_EMOJI[m.category || ''] || '';
|
|
276
|
+
const summary = extractSummary(m.content);
|
|
277
|
+
lines.push(` [${m.shortCode}] ${emoji} ${summary}`);
|
|
278
|
+
}
|
|
279
|
+
lines.push('');
|
|
280
|
+
}
|
|
281
|
+
if (voiceTraits.length > 0) {
|
|
282
|
+
lines.push('VOICE PROFILE');
|
|
283
|
+
lines.push('-'.repeat(30));
|
|
284
|
+
for (const m of voiceTraits) {
|
|
285
|
+
const summary = extractSummary(m.content);
|
|
286
|
+
lines.push(` [${m.shortCode}] ${summary}`);
|
|
287
|
+
}
|
|
288
|
+
lines.push('');
|
|
289
|
+
}
|
|
290
|
+
if (identity.length > 0) {
|
|
291
|
+
lines.push('IDENTITY & CONTEXT');
|
|
292
|
+
lines.push('-'.repeat(30));
|
|
293
|
+
for (const m of identity) {
|
|
294
|
+
const emoji = CATEGORY_EMOJI[m.category || ''] || '';
|
|
295
|
+
const summary = extractSummary(m.content);
|
|
296
|
+
lines.push(` [${m.shortCode}] ${emoji} ${summary}`);
|
|
297
|
+
}
|
|
298
|
+
lines.push('');
|
|
299
|
+
}
|
|
300
|
+
lines.push('='.repeat(50));
|
|
301
|
+
const total = principles.length + taskRelevant.length + gotchas.length + preferences.length + voiceTraits.length + identity.length;
|
|
302
|
+
lines.push(`Total: ${total} learnings loaded from vector DB`);
|
|
303
|
+
return lines.join('\n');
|
|
304
|
+
}
|
|
305
|
+
function extractSummary(content) {
|
|
306
|
+
const lines = content.split('\n');
|
|
307
|
+
for (const line of lines) {
|
|
308
|
+
const trimmed = line.trim();
|
|
309
|
+
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('```'))
|
|
310
|
+
continue;
|
|
311
|
+
if (trimmed.length > 150)
|
|
312
|
+
return trimmed.slice(0, 147) + '...';
|
|
313
|
+
return trimmed;
|
|
314
|
+
}
|
|
315
|
+
return content.slice(0, 100) + '...';
|
|
316
|
+
}
|
|
317
|
+
// ============================================================
|
|
318
|
+
// Citation Tracking
|
|
319
|
+
// ============================================================
|
|
320
|
+
async function trackMemoryReturns(memoryIds) {
|
|
321
|
+
if (memoryIds.length === 0)
|
|
322
|
+
return;
|
|
323
|
+
try {
|
|
324
|
+
const client = getMemoryClient();
|
|
325
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
326
|
+
await client.rpc('increment_memory_returns', {
|
|
327
|
+
p_memory_ids: memoryIds,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
console.warn('[memory-context] Failed to track memory returns:', err);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/lib/context.ts"],"names":[],"mappings":"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"}
|