@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.
Files changed (156) hide show
  1. package/README.md +135 -0
  2. package/dist/index.d.ts +34 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +38 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/auth.d.ts +18 -0
  7. package/dist/lib/auth.d.ts.map +1 -0
  8. package/dist/lib/auth.js +31 -0
  9. package/dist/lib/auth.js.map +1 -0
  10. package/dist/lib/auto-derive.d.ts +35 -0
  11. package/dist/lib/auto-derive.js +261 -0
  12. package/dist/lib/auto-derive.js.map +1 -0
  13. package/dist/lib/borderline.d.ts +26 -0
  14. package/dist/lib/borderline.js +121 -0
  15. package/dist/lib/borderline.js.map +1 -0
  16. package/dist/lib/client.d.ts +28 -0
  17. package/dist/lib/client.d.ts.map +1 -0
  18. package/dist/lib/client.js +60 -0
  19. package/dist/lib/client.js.map +1 -0
  20. package/dist/lib/context.d.ts +38 -0
  21. package/dist/lib/context.d.ts.map +1 -0
  22. package/dist/lib/context.js +334 -0
  23. package/dist/lib/context.js.map +1 -0
  24. package/dist/lib/embeddings.d.ts +60 -0
  25. package/dist/lib/embeddings.d.ts.map +1 -0
  26. package/dist/lib/embeddings.js +229 -0
  27. package/dist/lib/embeddings.js.map +1 -0
  28. package/dist/lib/entity-pipeline.d.ts +23 -0
  29. package/dist/lib/entity-pipeline.js +151 -0
  30. package/dist/lib/entity-pipeline.js.map +1 -0
  31. package/dist/lib/formatting.d.ts +13 -0
  32. package/dist/lib/formatting.d.ts.map +1 -0
  33. package/dist/lib/formatting.js +60 -0
  34. package/dist/lib/formatting.js.map +1 -0
  35. package/dist/lib/learning-extractor.d.ts +144 -0
  36. package/dist/lib/learning-extractor.d.ts.map +1 -0
  37. package/dist/lib/learning-extractor.js +921 -0
  38. package/dist/lib/learning-extractor.js.map +1 -0
  39. package/dist/lib/lifecycle.d.ts +45 -0
  40. package/dist/lib/lifecycle.js +84 -0
  41. package/dist/lib/lifecycle.js.map +1 -0
  42. package/dist/lib/memory.d.ts +128 -0
  43. package/dist/lib/memory.d.ts.map +1 -0
  44. package/dist/lib/memory.js +590 -0
  45. package/dist/lib/memory.js.map +1 -0
  46. package/dist/lib/quality-gate.d.ts +32 -0
  47. package/dist/lib/quality-gate.js +158 -0
  48. package/dist/lib/quality-gate.js.map +1 -0
  49. package/dist/lib/quality-gate.test.d.ts +7 -0
  50. package/dist/lib/quality-gate.test.js +75 -0
  51. package/dist/lib/quality-gate.test.js.map +1 -0
  52. package/dist/lib/rerank.d.ts +22 -0
  53. package/dist/lib/rerank.js +61 -0
  54. package/dist/lib/rerank.js.map +1 -0
  55. package/dist/lib/retrieval.d.ts +75 -0
  56. package/dist/lib/retrieval.js +380 -0
  57. package/dist/lib/retrieval.js.map +1 -0
  58. package/dist/migrate.d.ts +17 -0
  59. package/dist/migrate.d.ts.map +1 -0
  60. package/dist/migrate.js +81 -0
  61. package/dist/migrate.js.map +1 -0
  62. package/dist/routes/analyze-codebase.d.ts +9 -0
  63. package/dist/routes/analyze-codebase.d.ts.map +1 -0
  64. package/dist/routes/analyze-codebase.js +70 -0
  65. package/dist/routes/analyze-codebase.js.map +1 -0
  66. package/dist/routes/analyze-voice.d.ts +9 -0
  67. package/dist/routes/analyze-voice.d.ts.map +1 -0
  68. package/dist/routes/analyze-voice.js +63 -0
  69. package/dist/routes/analyze-voice.js.map +1 -0
  70. package/dist/routes/assemble-context.d.ts +9 -0
  71. package/dist/routes/assemble-context.d.ts.map +1 -0
  72. package/dist/routes/assemble-context.js +68 -0
  73. package/dist/routes/assemble-context.js.map +1 -0
  74. package/dist/routes/bootstrap.d.ts +12 -0
  75. package/dist/routes/bootstrap.d.ts.map +1 -0
  76. package/dist/routes/bootstrap.js +102 -0
  77. package/dist/routes/bootstrap.js.map +1 -0
  78. package/dist/routes/browse.d.ts +11 -0
  79. package/dist/routes/browse.js +85 -0
  80. package/dist/routes/browse.js.map +1 -0
  81. package/dist/routes/capture-thought.d.ts +13 -0
  82. package/dist/routes/capture-thought.d.ts.map +1 -0
  83. package/dist/routes/capture-thought.js +178 -0
  84. package/dist/routes/capture-thought.js.map +1 -0
  85. package/dist/routes/capture.d.ts +13 -0
  86. package/dist/routes/capture.d.ts.map +1 -0
  87. package/dist/routes/capture.js +86 -0
  88. package/dist/routes/capture.js.map +1 -0
  89. package/dist/routes/cite.d.ts +9 -0
  90. package/dist/routes/cite.d.ts.map +1 -0
  91. package/dist/routes/cite.js +49 -0
  92. package/dist/routes/cite.js.map +1 -0
  93. package/dist/routes/crud.d.ts +11 -0
  94. package/dist/routes/crud.d.ts.map +1 -0
  95. package/dist/routes/crud.js +176 -0
  96. package/dist/routes/crud.js.map +1 -0
  97. package/dist/routes/dashboard.d.ts +9 -0
  98. package/dist/routes/dashboard.d.ts.map +1 -0
  99. package/dist/routes/dashboard.js +85 -0
  100. package/dist/routes/dashboard.js.map +1 -0
  101. package/dist/routes/entity-cron.d.ts +8 -0
  102. package/dist/routes/entity-cron.js +31 -0
  103. package/dist/routes/entity-cron.js.map +1 -0
  104. package/dist/routes/export.d.ts +8 -0
  105. package/dist/routes/export.d.ts.map +1 -0
  106. package/dist/routes/export.js +69 -0
  107. package/dist/routes/export.js.map +1 -0
  108. package/dist/routes/extract-pr-learnings.d.ts +12 -0
  109. package/dist/routes/extract-pr-learnings.d.ts.map +1 -0
  110. package/dist/routes/extract-pr-learnings.js +127 -0
  111. package/dist/routes/extract-pr-learnings.js.map +1 -0
  112. package/dist/routes/forget-cron.d.ts +9 -0
  113. package/dist/routes/forget-cron.js +30 -0
  114. package/dist/routes/forget-cron.js.map +1 -0
  115. package/dist/routes/learnings.d.ts +9 -0
  116. package/dist/routes/learnings.d.ts.map +1 -0
  117. package/dist/routes/learnings.js +237 -0
  118. package/dist/routes/learnings.js.map +1 -0
  119. package/dist/routes/pulse.d.ts +9 -0
  120. package/dist/routes/pulse.d.ts.map +1 -0
  121. package/dist/routes/pulse.js +133 -0
  122. package/dist/routes/pulse.js.map +1 -0
  123. package/dist/routes/search.d.ts +8 -0
  124. package/dist/routes/search.d.ts.map +1 -0
  125. package/dist/routes/search.js +107 -0
  126. package/dist/routes/search.js.map +1 -0
  127. package/dist/routes/store.d.ts +8 -0
  128. package/dist/routes/store.d.ts.map +1 -0
  129. package/dist/routes/store.js +89 -0
  130. package/dist/routes/store.js.map +1 -0
  131. package/dist/routes/sync.d.ts +12 -0
  132. package/dist/routes/sync.d.ts.map +1 -0
  133. package/dist/routes/sync.js +83 -0
  134. package/dist/routes/sync.js.map +1 -0
  135. package/dist/routes/voice-profile.d.ts +9 -0
  136. package/dist/routes/voice-profile.d.ts.map +1 -0
  137. package/dist/routes/voice-profile.js +124 -0
  138. package/dist/routes/voice-profile.js.map +1 -0
  139. package/dist/server.d.ts +37 -0
  140. package/dist/server.d.ts.map +1 -0
  141. package/dist/server.js +99 -0
  142. package/dist/server.js.map +1 -0
  143. package/dist/vectordb/index.d.ts +17 -0
  144. package/dist/vectordb/index.d.ts.map +1 -0
  145. package/dist/vectordb/index.js +39 -0
  146. package/dist/vectordb/index.js.map +1 -0
  147. package/dist/vectordb/supabase.d.ts +62 -0
  148. package/dist/vectordb/supabase.d.ts.map +1 -0
  149. package/dist/vectordb/supabase.js +711 -0
  150. package/dist/vectordb/supabase.js.map +1 -0
  151. package/dist/vectordb/types.d.ts +217 -0
  152. package/dist/vectordb/types.d.ts.map +1 -0
  153. package/dist/vectordb/types.js +28 -0
  154. package/dist/vectordb/types.js.map +1 -0
  155. package/package.json +49 -0
  156. 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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"}