@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
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
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/lib/auth.js
ADDED
|
@@ -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>;
|