@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
package/README.md ADDED
@@ -0,0 +1,135 @@
1
+ # TraqrDB — Memory-as-a-Service for AI Agents
2
+
3
+ A schema + intelligence layer on top of Postgres + pgvector. Store memories, search by meaning, track entity relationships, manage memory lifecycle — all via 10 MCP tools.
4
+
5
+ ## Quick Start (10 minutes)
6
+
7
+ ### 1. Set Up Your Database
8
+
9
+ **Option A: Supabase (easiest, free tier)**
10
+ 1. Create a project at [supabase.com](https://supabase.com)
11
+ 2. Go to SQL Editor, paste contents of `setup.sql`, run
12
+ 3. Copy your project URL + service role key from Settings > API
13
+
14
+ **Option B: AWS RDS / Aurora**
15
+ 1. Create RDS Postgres 15+ instance
16
+ 2. Enable pgvector: `CREATE EXTENSION vector;`
17
+ 3. Run setup.sql via psql: `psql $DATABASE_URL -f setup.sql`
18
+
19
+ **Option C: Docker (local dev)**
20
+ ```bash
21
+ docker run -d --name traqrdb \
22
+ -e POSTGRES_PASSWORD=postgres \
23
+ -p 5432:5432 \
24
+ pgvector/pgvector:pg16
25
+ psql postgresql://postgres:postgres@localhost:5432/postgres -f setup.sql
26
+ ```
27
+
28
+ ### 2. Configure Environment
29
+
30
+ ```bash
31
+ # Required: Postgres connection
32
+ export DATABASE_URL="postgresql://user:pass@host:5432/dbname"
33
+ # OR for Supabase:
34
+ export SUPABASE_URL="https://xxx.supabase.co"
35
+ export SUPABASE_SERVICE_ROLE_KEY="eyJ..."
36
+
37
+ # Embedding provider (choose one)
38
+ export OPENAI_API_KEY="sk-..." # OpenAI ($0.02/1M tokens)
39
+ export GOOGLE_API_KEY="AIza..." # Gemini Embedding 2 (free tier)
40
+ # OR neither — entities use name matching, no semantic search
41
+
42
+ # Optional
43
+ export COHERE_API_KEY="..." # Cohere Rerank v3.5
44
+ ```
45
+
46
+ ### 3. Connect to Your AI Agent
47
+
48
+ Add to your MCP client config (Claude Code, Cursor, etc.):
49
+ ```json
50
+ {
51
+ "traqr-memory": {
52
+ "command": "npx",
53
+ "args": ["traqr-memory-mcp"],
54
+ "env": {
55
+ "DATABASE_URL": "postgresql://...",
56
+ "OPENAI_API_KEY": "sk-..."
57
+ }
58
+ }
59
+ }
60
+ ```
61
+
62
+ ### 4. Verify
63
+
64
+ Use `memory_audit` to check health, then `memory_store` to create your first memory.
65
+
66
+ ---
67
+
68
+ ## 10 MCP Tools
69
+
70
+ | Tool | Description |
71
+ |------|-------------|
72
+ | `memory_store` | Remember something. Only content required — everything else auto-derived. |
73
+ | `memory_search` | Search memories by meaning. Returns summaries. |
74
+ | `memory_read` | Expand a memory by ID. Full content + version history. |
75
+ | `memory_enhance` | Deepen understanding. Creates connected memories via triage pipeline. |
76
+ | `memory_browse` | Navigate by facet. Domain > category > summaries. Zero embedding cost. |
77
+ | `memory_context` | Load task-relevant context — principles, preferences, gotchas. |
78
+ | `memory_pulse` | Batch: capture multiple learnings + search + update in one call. |
79
+ | `memory_audit` | System health, stats, quality metrics. |
80
+ | `memory_archive` | Archive stale content that was once correct. |
81
+ | `memory_forget` | Forget incorrect or harmful content permanently. |
82
+
83
+ ## What's Inside
84
+
85
+ **Schema** (created by `setup.sql`):
86
+ - `traqr_memories` — content, embeddings, lifecycle, dual tsvectors
87
+ - `memory_relationships` — graph edges between memories
88
+ - `memory_entities` — extracted entities with embeddings
89
+ - `memory_entity_links` — memory-to-entity junction table
90
+ - 12+ indexes including partial HNSW, BM25 GIN, lifecycle
91
+ - 10+ RPC functions for search, BM25, temporal, graph, confidence decay
92
+
93
+ **Intelligence** (in the TypeScript package):
94
+ - Multi-strategy retrieval: semantic + BM25 > RRF fusion > optional Cohere rerank
95
+ - 3-zone cosine triage: NOOP (>=0.90), ADD (<0.60), borderline (GPT-4o-mini decision)
96
+ - Type-aware lifecycle: facts invalidate, preferences supersede, patterns coexist
97
+ - Entity extraction: multi-signal canonicalization (name > ILIKE > embedding)
98
+ - Quality gate: 3-layer ingestion filter prevents noise
99
+
100
+ ## Graceful Degradation
101
+
102
+ | Missing | Behavior |
103
+ |---------|----------|
104
+ | No embedding API key | Entities use name matching. BM25 keyword search works. No vector search. |
105
+ | No COHERE_API_KEY | Search uses RRF scores instead of Cohere rerank. |
106
+
107
+ ## TypeScript Library API
108
+
109
+ ```typescript
110
+ import { storeMemory, searchMemories, triageAndStore } from '@traqr/memory'
111
+
112
+ // Store a memory
113
+ await storeMemory({ content: 'Always use bun', sourceType: 'manual' })
114
+
115
+ // Search by meaning
116
+ const results = await searchMemories('package manager', { limit: 5 })
117
+
118
+ // Store with triage (dedup + edges + LLM borderline)
119
+ const result = await triageAndStore({ content: '...', sourceType: 'session' })
120
+ // result.zone: 'noop' | 'add' | 'borderline'
121
+ ```
122
+
123
+ ## Environment Variables
124
+
125
+ | Variable | Required | Description |
126
+ |----------|----------|-------------|
127
+ | `DATABASE_URL` or `SUPABASE_URL` | Yes | Postgres connection |
128
+ | `SUPABASE_SERVICE_ROLE_KEY` | Supabase only | Service role key |
129
+ | `OPENAI_API_KEY` | Recommended | OpenAI embeddings |
130
+ | `GOOGLE_API_KEY` | Alternative | Gemini Embedding 2 (free) |
131
+ | `COHERE_API_KEY` | No | Cohere Rerank (quality boost) |
132
+
133
+ ## License
134
+
135
+ Apache-2.0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @traqr/memory — Public API
3
+ *
4
+ * Vector DB client, memory operations, and standalone HTTP server
5
+ * for the Traqr memory system.
6
+ */
7
+ export { createMemoryServer } from './server.js';
8
+ export { getVectorDB, resetVectorDB } from './vectordb/index.js';
9
+ export type { VectorDBProvider, Memory, MemoryInput, MemorySearchResult, MemoryUpdate, MemoryExport, MemoryDomain, SearchOptions, MemoryCategory, MemorySourceType, MemoryDurability, MemoryType, BM25SearchResult, TemporalSearchResult, GraphSearchResult, ProviderConfig, } from './vectordb/types.js';
10
+ export { BOOTSTRAP_CONFIDENCE, DECAY_CONFIG } from './vectordb/types.js';
11
+ export { deriveAll, deriveDomain, deriveCategory, deriveTopic, deriveSummary, deriveTags, deriveMemoryType, deriveForgetAfter, extractEntityCandidates, } from './lib/auto-derive.js';
12
+ export type { DeriveResult, EntityCandidate } from './lib/auto-derive.js';
13
+ export { borderlineDecision } from './lib/borderline.js';
14
+ export type { BorderlineDecision, BorderlineAction, MaskedMemory } from './lib/borderline.js';
15
+ export { cohereRerank } from './lib/rerank.js';
16
+ export type { RerankResult, RerankDocument } from './lib/rerank.js';
17
+ export { storeMemory, searchMemories, getMemory, updateMemory, deleteMemory, validateMemory, archiveMemory, unarchiveMemory, exportAllMemories, importMemories, storeWithDedup, triageAndStore, createRelationship, invalidateMemory, supersedeMemory, remember, recall, isMemoryHealthy, getMemoryStats, getDetailedStats, getSystemHealth, verifyRoundTrip, formatMemory, formatSearchResults, } from './lib/memory.js';
18
+ export { getVersionChain, getMemoryHistory, getMemoryRelationships, } from './lib/lifecycle.js';
19
+ export type { MemoryHistoryResult, MemoryRelationship } from './lib/lifecycle.js';
20
+ export { processEntitiesForMemory } from './lib/entity-pipeline.js';
21
+ export type { EntityExtractionResult } from './lib/entity-pipeline.js';
22
+ export type { StoreWithDedupResult, TriageResult, TriageZone, TriageAction, TriageOptions, RoundTripResult, DetailedStats, SystemHealth, } from './lib/memory.js';
23
+ export { searchMemoriesV2, reciprocalRankFusion, detectStrategies, parseTemporalRange, findEntitiesInQuery, } from './lib/retrieval.js';
24
+ export type { SearchV2Options, SearchStrategy, FusedItem, StrategyResult, DetectedStrategies, } from './lib/retrieval.js';
25
+ export { generateEmbedding, generateEmbeddingsBatch, cosineSimilarity, formatEmbeddingForPgVector, parseEmbeddingFromPgVector, needsReembedding, checkEmbeddingHealth, EMBEDDING_CONFIG, } from './lib/embeddings.js';
26
+ export type { EmbeddingResult, EmbeddingHealthStatus } from './lib/embeddings.js';
27
+ export { CATEGORY_EMOJI, CATEGORY_EMOJI_SLACK, CATEGORY_EMOJI_TEXT, SOURCE_TYPE_EMOJI, getCategoryEmoji, } from './lib/formatting.js';
28
+ export { getMemoryClient, resetMemoryClient, getUserId, getProjectId, configureMemory, getTableName } from './lib/client.js';
29
+ export type { MemoryClientConfig } from './lib/client.js';
30
+ export { verifyAuth, requireAuth, getInternalSecret } from './lib/auth.js';
31
+ export { assembleSessionContext } from './lib/context.js';
32
+ export type { SessionContextParams, SessionContext, MemoryWithShortCode } from './lib/context.js';
33
+ export { extractLearningsFromPR, batchExtractLearnings, submitManualLearning, extractFromConversation, extractFromSessionDiff, extractLearningsFromPlan, extractFromCodebaseAnalysis, extractVoiceTraits, detectContradictions, formatExtractionResult, getSourceProject, } from './lib/learning-extractor.js';
34
+ export type { PRContext, ExtractedLearning, ExtractionResult, SuggestedLayer, SessionDiffContext, SessionExtractionResult, PlanContext, CodebaseAnalysisContext, CodebaseAnalysisResult, ContradictionResult, VoiceAnalysisType, VoiceAnalysisContext, VoiceAnalysisResult, } from './lib/learning-extractor.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGhD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAChE,YAAY,EACV,gBAAgB,EAChB,MAAM,EACN,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGxE,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,QAAQ,EACR,MAAM,EACN,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGzG,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,0BAA0B,EAC1B,0BAA0B,EAC1B,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAGjF,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC5H,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGzD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAG1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAGjG,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,6BAA6B,CAAA;AACpC,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,6BAA6B,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @traqr/memory — Public API
3
+ *
4
+ * Vector DB client, memory operations, and standalone HTTP server
5
+ * for the Traqr memory system.
6
+ */
7
+ // Server
8
+ export { createMemoryServer } from './server.js';
9
+ // VectorDB layer
10
+ export { getVectorDB, resetVectorDB } from './vectordb/index.js';
11
+ export { BOOTSTRAP_CONFIDENCE, DECAY_CONFIG } from './vectordb/types.js';
12
+ // Auto-derive v2
13
+ export { deriveAll, deriveDomain, deriveCategory, deriveTopic, deriveSummary, deriveTags, deriveMemoryType, deriveForgetAfter, extractEntityCandidates, } from './lib/auto-derive.js';
14
+ // LLM borderline decision
15
+ export { borderlineDecision } from './lib/borderline.js';
16
+ // Cohere rerank
17
+ export { cohereRerank } from './lib/rerank.js';
18
+ // High-level memory operations
19
+ export { storeMemory, searchMemories, getMemory, updateMemory, deleteMemory, validateMemory, archiveMemory, unarchiveMemory, exportAllMemories, importMemories, storeWithDedup, triageAndStore, createRelationship, invalidateMemory, supersedeMemory, remember, recall, isMemoryHealthy, getMemoryStats, getDetailedStats, getSystemHealth, verifyRoundTrip, formatMemory, formatSearchResults, } from './lib/memory.js';
20
+ // Lifecycle utilities
21
+ export { getVersionChain, getMemoryHistory, getMemoryRelationships, } from './lib/lifecycle.js';
22
+ // Entity extraction pipeline
23
+ export { processEntitiesForMemory } from './lib/entity-pipeline.js';
24
+ // Multi-strategy retrieval (v2)
25
+ export { searchMemoriesV2, reciprocalRankFusion, detectStrategies, parseTemporalRange, findEntitiesInQuery, } from './lib/retrieval.js';
26
+ // Embeddings
27
+ export { generateEmbedding, generateEmbeddingsBatch, cosineSimilarity, formatEmbeddingForPgVector, parseEmbeddingFromPgVector, needsReembedding, checkEmbeddingHealth, EMBEDDING_CONFIG, } from './lib/embeddings.js';
28
+ // Formatting
29
+ export { CATEGORY_EMOJI, CATEGORY_EMOJI_SLACK, CATEGORY_EMOJI_TEXT, SOURCE_TYPE_EMOJI, getCategoryEmoji, } from './lib/formatting.js';
30
+ // Client configuration
31
+ export { getMemoryClient, resetMemoryClient, getUserId, getProjectId, configureMemory, getTableName } from './lib/client.js';
32
+ // Auth middleware
33
+ export { verifyAuth, requireAuth, getInternalSecret } from './lib/auth.js';
34
+ // Context assembly
35
+ export { assembleSessionContext } from './lib/context.js';
36
+ // Learning extractor
37
+ export { extractLearningsFromPR, batchExtractLearnings, submitManualLearning, extractFromConversation, extractFromSessionDiff, extractLearningsFromPlan, extractFromCodebaseAnalysis, extractVoiceTraits, detectContradictions, formatExtractionResult, getSourceProject, } from './lib/learning-extractor.js';
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,SAAS;AACT,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEhD,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAmBhE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAExE,iBAAiB;AACjB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,sBAAsB,CAAA;AAG7B,0BAA0B;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAGxD,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9C,+BAA+B;AAC/B,OAAO,EACL,WAAW,EACX,cAAc,EACd,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,MAAM,EACN,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,mBAAmB,GACpB,MAAM,iBAAiB,CAAA;AAExB,sBAAsB;AACtB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,oBAAoB,CAAA;AAG3B,6BAA6B;AAC7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAA;AAcnE,gCAAgC;AAChC,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,oBAAoB,CAAA;AAS3B,aAAa;AACb,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,0BAA0B,EAC1B,0BAA0B,EAC1B,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAG5B,aAAa;AACb,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAE5B,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG5H,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAE1E,mBAAmB;AACnB,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAGzD,qBAAqB;AACrB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,6BAA6B,CAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Portable Auth Middleware for @traqr/memory
3
+ *
4
+ * Bearer token auth using INTERNAL_API_KEY or CRON_SECRET env vars.
5
+ * If neither is set, auth is skipped (dev mode).
6
+ */
7
+ import type { Context, Next } from 'hono';
8
+ export declare function getInternalSecret(): string | undefined;
9
+ /**
10
+ * Verify Bearer token auth on a Hono context.
11
+ * Returns true if auth passes or no secret is configured.
12
+ */
13
+ export declare function verifyAuth(c: Context): boolean;
14
+ /**
15
+ * Hono middleware that enforces internal auth.
16
+ * Returns 401 if auth fails.
17
+ */
18
+ export declare function requireAuth(c: Context, next: Next): Promise<Response | void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAEzC,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAK9C;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAKlF"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Portable Auth Middleware for @traqr/memory
3
+ *
4
+ * Bearer token auth using INTERNAL_API_KEY or CRON_SECRET env vars.
5
+ * If neither is set, auth is skipped (dev mode).
6
+ */
7
+ export function getInternalSecret() {
8
+ return process.env.INTERNAL_API_KEY || process.env.CRON_SECRET;
9
+ }
10
+ /**
11
+ * Verify Bearer token auth on a Hono context.
12
+ * Returns true if auth passes or no secret is configured.
13
+ */
14
+ export function verifyAuth(c) {
15
+ const secret = getInternalSecret();
16
+ if (!secret)
17
+ return true; // No secret = dev mode, skip auth
18
+ const auth = c.req.header('authorization');
19
+ return auth === `Bearer ${secret}`;
20
+ }
21
+ /**
22
+ * Hono middleware that enforces internal auth.
23
+ * Returns 401 if auth fails.
24
+ */
25
+ export async function requireAuth(c, next) {
26
+ if (!verifyAuth(c)) {
27
+ return c.json({ error: 'Unauthorized' }, 401);
28
+ }
29
+ await next();
30
+ }
31
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAA;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA,CAAC,kCAAkC;IAC3D,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IAC1C,OAAO,IAAI,KAAK,UAAU,MAAM,EAAE,CAAA;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAU,EAAE,IAAU;IACtD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAA;IAC/C,CAAC;IACD,MAAM,IAAI,EAAE,CAAA;AACd,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Auto-Derive v2 — Consolidated field derivation module
3
+ *
4
+ * Infers domain, category, topic, summary, tags, memoryType, and more
5
+ * from memory content. Single source of truth — imported by MCP server,
6
+ * pulse route, store route, and any future ingestion path.
7
+ *
8
+ * ADR: [[MCP Redesign — Auto-Derive Module]]
9
+ */
10
+ import type { MemoryType } from '../vectordb/types.js';
11
+ export interface EntityCandidate {
12
+ name: string;
13
+ type: string;
14
+ }
15
+ export interface DeriveResult {
16
+ domain: string;
17
+ category: string;
18
+ topic?: string;
19
+ summary: string;
20
+ tags: string[];
21
+ memoryType: MemoryType;
22
+ forgetAfter?: Date;
23
+ sourceTool?: string;
24
+ entityCandidates: EntityCandidate[];
25
+ }
26
+ export declare function deriveDomain(content: string): string;
27
+ export declare function deriveCategory(content: string): string;
28
+ export declare function deriveTopic(content: string): string | undefined;
29
+ export declare function deriveSummary(content: string): string;
30
+ export declare function deriveTags(content: string, category: string): string[];
31
+ export declare function deriveMemoryType(content: string, category: string): MemoryType;
32
+ export declare function deriveForgetAfter(content: string): Date | undefined;
33
+ export declare function deriveSourceTool(explicit?: string): string | undefined;
34
+ export declare function extractEntityCandidates(content: string): EntityCandidate[];
35
+ export declare function deriveAll(content: string, overrides?: Partial<DeriveResult>): DeriveResult;
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Auto-Derive v2 — Consolidated field derivation module
3
+ *
4
+ * Infers domain, category, topic, summary, tags, memoryType, and more
5
+ * from memory content. Single source of truth — imported by MCP server,
6
+ * pulse route, store route, and any future ingestion path.
7
+ *
8
+ * ADR: [[MCP Redesign — Auto-Derive Module]]
9
+ */
10
+ // ============================================================
11
+ // 1. deriveDomain — detect domain from content
12
+ // ============================================================
13
+ export function deriveDomain(content) {
14
+ const c = content.toLowerCase();
15
+ if (/\bsean\b/.test(c) || /\b(prefer|personality|background|vibe.cod|credit.card|llc|traqr enterprises)/i.test(c))
16
+ return 'sean';
17
+ if (/\b(traqr|worktree|guardian|slot.system|daemon|memory.*(system|db)|\.traqr\/|traqr-init)/i.test(c))
18
+ return 'traqr';
19
+ if (/\b(nooktraqr|animal.crossing|villager|island.profile|turnip)/i.test(c))
20
+ return 'nooktraqr';
21
+ if (/\b(pokotraqr|pokopia|pokop)/i.test(c))
22
+ return 'pokotraqr';
23
+ if (/\b(poketraqr|pokemon)/i.test(c))
24
+ return 'poketraqr';
25
+ if (/\b(milestraqr|miles.voyager)/i.test(c))
26
+ return 'milestraqr';
27
+ if (/\b(jiggy|capital|portfolio|earnings|koyfin)/i.test(c))
28
+ return 'jiggy';
29
+ if (/\b(supabase|vercel|cloudflare|openai|linear|slack|github|firebase|clerk|resend|posthog)/i.test(c))
30
+ return 'tooling';
31
+ return 'universal';
32
+ }
33
+ // ============================================================
34
+ // 2. deriveCategory — detect category from content
35
+ // ============================================================
36
+ export function deriveCategory(content) {
37
+ const c = content.toLowerCase();
38
+ if (/\b(gotcha|critical|never\s+trust|always\s+check|warning|silently.fail|broke\b)/i.test(c))
39
+ return 'gotcha';
40
+ if (/\b(fix|bug|root.cause|resolved|patch|was.broken|caused.by)/i.test(c))
41
+ return 'fix';
42
+ if (/\b(prefer|values?|wants?|hates?|loves?|style|personality|blunt|direct)/i.test(c))
43
+ return 'preference';
44
+ if (/\b(pattern|approach|technique|strategy|method|architecture|flywheel)/i.test(c))
45
+ return 'pattern';
46
+ if (/\b(convention|rule|naming|structure|format|must.be|required)/i.test(c))
47
+ return 'convention';
48
+ if (/\b(question|unclear|investigate|explore|wonder|unsolved)/i.test(c))
49
+ return 'question';
50
+ return 'insight';
51
+ }
52
+ // ============================================================
53
+ // 3. deriveTopic — 18-topic scoring algorithm
54
+ // ============================================================
55
+ const TOPIC_KEYWORDS = {
56
+ supabase: ['supabase', 'rpc', 'pgvector', 'rls', 'migration'],
57
+ git: ['git', 'rebase', 'merge', 'commit', 'branch', 'push', 'stash'],
58
+ vercel: ['vercel', 'serverless', 'edge function', 'hobby tier'],
59
+ cloudflare: ['cloudflare', 'workers', 'cron trigger', 'd1'],
60
+ linear: ['linear', 'ticket', 'issue', 'agent-ready'],
61
+ slack: ['slack', 'channel', 'webhook', 'thread'],
62
+ auth: ['auth', 'login', 'session', 'token', 'clerk', 'firebase auth'],
63
+ deployment: ['deploy', 'production', 'build', 'ci/cd', 'ship'],
64
+ design: ['design', 'ui', 'ux', 'dark mode', 'component', 'layout'],
65
+ architecture: ['architecture', 'monorepo', 'package', 'platform', 'system design'],
66
+ business: ['llc', 'business', 'revenue', 'pricing', 'saas'],
67
+ 'personal-finance': ['credit card', 'points', 'miles', 'amex', 'chase', 'capital one', 'sign-up bonus'],
68
+ 'product-strategy': ['product', 'roadmap', 'mvp', 'launch', 'users', 'growth'],
69
+ 'memory-system': ['memory', 'vector', 'embedding', 'pgvector', 'learning'],
70
+ testing: ['test', 'e2e', 'verify', 'assertion'],
71
+ seo: ['seo', 'sitemap', 'indexing', 'google search', 'gsc'],
72
+ personality: ['personality', 'communication', 'decision-making', 'values'],
73
+ workflow: ['workflow', 'process', 'shipping', 'velocity', 'bottleneck'],
74
+ };
75
+ export function deriveTopic(content) {
76
+ const c = content.toLowerCase();
77
+ let bestTopic;
78
+ let bestScore = 0;
79
+ for (const [topic, keywords] of Object.entries(TOPIC_KEYWORDS)) {
80
+ const score = keywords.filter(kw => c.includes(kw)).length;
81
+ if (score > bestScore) {
82
+ bestScore = score;
83
+ bestTopic = topic;
84
+ }
85
+ }
86
+ return bestTopic;
87
+ }
88
+ // ============================================================
89
+ // 4. deriveSummary — first meaningful sentence, max 120 chars
90
+ // ============================================================
91
+ export function deriveSummary(content) {
92
+ const lines = content.split(/\n/);
93
+ for (const line of lines) {
94
+ const trimmed = line.trim();
95
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('```'))
96
+ continue;
97
+ const firstSentence = trimmed.split(/(?<=[.!?])\s/)[0];
98
+ if (firstSentence && firstSentence.length <= 120)
99
+ return firstSentence;
100
+ return trimmed.slice(0, 117) + '...';
101
+ }
102
+ return content.slice(0, 117) + '...';
103
+ }
104
+ // ============================================================
105
+ // 5. deriveTags — provenance, lifecycle, importance
106
+ // ============================================================
107
+ export function deriveTags(content, category) {
108
+ const tags = [];
109
+ const c = content.toLowerCase();
110
+ // Provenance
111
+ if (/\b(broke|incident|failure|crashed|lost.data|silently|wipe)/i.test(c))
112
+ tags.push('from-incident');
113
+ else if (/\b(decided|chose|opted|picked|ruled.out|went.with)/i.test(c))
114
+ tags.push('from-decision');
115
+ else
116
+ tags.push('from-observation');
117
+ // Lifecycle
118
+ if (/\b(always|never|every.time|mandatory|non-negotiable|universal)/i.test(c))
119
+ tags.push('evergreen');
120
+ else
121
+ tags.push('active');
122
+ // Importance
123
+ if (category === 'gotcha' || /\bcritical\b/i.test(c))
124
+ tags.push('critical');
125
+ else if (category === 'preference' || category === 'convention')
126
+ tags.push('important');
127
+ else
128
+ tags.push('nice-to-know');
129
+ return tags;
130
+ }
131
+ // ============================================================
132
+ // 6. deriveMemoryType — classify fact/preference/pattern (v2)
133
+ // ============================================================
134
+ export function deriveMemoryType(content, category) {
135
+ // Preference: category already detected, or strong preference signals
136
+ if (category === 'preference')
137
+ return 'preference';
138
+ if (/\b(prefers?|prioritizes?|values?|avoids?|hates?|loves?|style|personality)\b/i.test(content))
139
+ return 'preference';
140
+ // Fact: assertions with numbers, dates, proper nouns + copula
141
+ if (/\b(is|are|was|has|have|costs?|weighs?|measures?)\s+\d/i.test(content))
142
+ return 'fact';
143
+ if (/\b(born|founded|created|established|started)\s+(in|on|at)\s+\d/i.test(content))
144
+ return 'fact';
145
+ if (/\b(located|based|headquartered)\s+(in|at)\b/i.test(content))
146
+ return 'fact';
147
+ if (/\bblood.type\b/i.test(content))
148
+ return 'fact';
149
+ // Default: pattern
150
+ return 'pattern';
151
+ }
152
+ // ============================================================
153
+ // 7. deriveForgetAfter — detect temporal content (v2)
154
+ // ============================================================
155
+ export function deriveForgetAfter(content) {
156
+ const c = content.toLowerCase();
157
+ // "this week/month/sprint" -> 7/30/14 days from now + buffer
158
+ if (/\bthis\s+week\b/i.test(c)) {
159
+ const d = new Date();
160
+ d.setDate(d.getDate() + 14); // end of week + 7 day buffer
161
+ return d;
162
+ }
163
+ if (/\bthis\s+sprint\b/i.test(c)) {
164
+ const d = new Date();
165
+ d.setDate(d.getDate() + 21); // ~2 week sprint + 7 day buffer
166
+ return d;
167
+ }
168
+ if (/\bthis\s+month\b/i.test(c)) {
169
+ const d = new Date();
170
+ d.setDate(d.getDate() + 37); // end of month + 7 day buffer
171
+ return d;
172
+ }
173
+ // "by <day>" or "deadline <day>" -> attempt to parse
174
+ const deadlineMatch = c.match(/\b(?:by|deadline|due|before)\s+(\w+\s+\d{1,2}(?:,?\s+\d{4})?)/i);
175
+ if (deadlineMatch) {
176
+ const parsed = new Date(deadlineMatch[1]);
177
+ if (!isNaN(parsed.getTime())) {
178
+ parsed.setDate(parsed.getDate() + 7); // 7 day buffer
179
+ return parsed;
180
+ }
181
+ }
182
+ return undefined;
183
+ }
184
+ // ============================================================
185
+ // 8. deriveSourceTool — explicit, not auto-detected (v2)
186
+ // ============================================================
187
+ // Callers pass their own identity: 'mcp-store', 'mcp-pulse', 'http-store', etc.
188
+ // This function exists for consistency in the deriveAll interface.
189
+ export function deriveSourceTool(explicit) {
190
+ return explicit || undefined;
191
+ }
192
+ // ============================================================
193
+ // 9. extractEntityCandidates — regex NER (v2)
194
+ // ============================================================
195
+ export function extractEntityCandidates(content) {
196
+ const candidates = [];
197
+ const seen = new Set();
198
+ // Capitalized multi-word names (e.g., "Sean Fitzsimons", "Animal Crossing")
199
+ const nameMatches = content.match(/\b[A-Z][a-z]+(?:\s+[A-Z][a-z]+)+\b/g);
200
+ if (nameMatches) {
201
+ for (const name of nameMatches) {
202
+ const key = name.toLowerCase();
203
+ if (!seen.has(key)) {
204
+ seen.add(key);
205
+ candidates.push({ name, type: 'person' }); // default to person, can be reclassified
206
+ }
207
+ }
208
+ }
209
+ // ALL_CAPS acronyms 2+ chars (e.g., AWS, API, SQL, BMI)
210
+ const acronymMatches = content.match(/\b[A-Z]{2,}\b/g);
211
+ if (acronymMatches) {
212
+ const skipAcronyms = new Set(['OR', 'AND', 'NOT', 'THE', 'FOR', 'BUT', 'NOR', 'YET', 'IF', 'AS', 'IN', 'ON', 'AT', 'TO', 'IS', 'IT', 'BY', 'OF', 'NO', 'DO', 'SO', 'UP', 'AM', 'PM', 'OK', 'VS']);
213
+ for (const acr of acronymMatches) {
214
+ if (!skipAcronyms.has(acr) && !seen.has(acr.toLowerCase())) {
215
+ seen.add(acr.toLowerCase());
216
+ candidates.push({ name: acr, type: 'technology' }); // default to technology
217
+ }
218
+ }
219
+ }
220
+ // Known technology patterns (PascalCase single words like React, Supabase, TypeScript)
221
+ const techMatches = content.match(/\b(?:React|Supabase|Vercel|Cloudflare|TypeScript|JavaScript|PostgreSQL?|Redis|Docker|Kubernetes|NextJS|Node|Python|Rust|GraphQL|Prisma|Drizzle)\b/g);
222
+ if (techMatches) {
223
+ for (const tech of techMatches) {
224
+ const key = tech.toLowerCase();
225
+ if (!seen.has(key)) {
226
+ seen.add(key);
227
+ candidates.push({ name: tech, type: 'technology' });
228
+ }
229
+ }
230
+ }
231
+ // Known company patterns
232
+ const companyMatches = content.match(/\b(?:Google|Apple|Amazon|Microsoft|Meta|Netflix|Anthropic|OpenAI|GitHub|Linear|Slack|Stripe|Twilio)\b/g);
233
+ if (companyMatches) {
234
+ for (const company of companyMatches) {
235
+ const key = company.toLowerCase();
236
+ if (!seen.has(key)) {
237
+ seen.add(key);
238
+ candidates.push({ name: company, type: 'company' });
239
+ }
240
+ }
241
+ }
242
+ return candidates;
243
+ }
244
+ // ============================================================
245
+ // Orchestrator — derive all fields, respecting explicit overrides
246
+ // ============================================================
247
+ export function deriveAll(content, overrides = {}) {
248
+ const category = overrides.category || deriveCategory(content);
249
+ return {
250
+ domain: overrides.domain || deriveDomain(content),
251
+ category,
252
+ topic: overrides.topic || deriveTopic(content),
253
+ summary: overrides.summary || deriveSummary(content),
254
+ tags: overrides.tags?.length ? overrides.tags : deriveTags(content, category),
255
+ memoryType: overrides.memoryType || deriveMemoryType(content, category),
256
+ forgetAfter: overrides.forgetAfter || deriveForgetAfter(content),
257
+ sourceTool: overrides.sourceTool,
258
+ entityCandidates: extractEntityCandidates(content),
259
+ };
260
+ }
261
+ //# sourceMappingURL=auto-derive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-derive.js","sourceRoot":"","sources":["../../src/lib/auto-derive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
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
+ export type BorderlineAction = 'add' | 'update' | 'noop';
11
+ export interface BorderlineDecision {
12
+ action: BorderlineAction;
13
+ target?: string;
14
+ edgeType: 'updates' | 'extends' | 'related' | null;
15
+ reasoning: string;
16
+ }
17
+ export interface MaskedMemory {
18
+ label: string;
19
+ content: string;
20
+ memoryType?: string;
21
+ }
22
+ /**
23
+ * Ask GPT-4o-mini to classify a borderline memory.
24
+ * Returns null on any failure — caller should fall back to heuristic.
25
+ */
26
+ export declare function borderlineDecision(newContent: string, existingMemories: MaskedMemory[], memoryType: string): Promise<BorderlineDecision | null>;