@traqr/memory 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth.d.ts +18 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +31 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/auto-derive.d.ts +35 -0
- package/dist/lib/auto-derive.js +261 -0
- package/dist/lib/auto-derive.js.map +1 -0
- package/dist/lib/borderline.d.ts +26 -0
- package/dist/lib/borderline.js +121 -0
- package/dist/lib/borderline.js.map +1 -0
- package/dist/lib/client.d.ts +28 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +60 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/context.d.ts +38 -0
- package/dist/lib/context.d.ts.map +1 -0
- package/dist/lib/context.js +334 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/embeddings.d.ts +60 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +229 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/entity-pipeline.d.ts +23 -0
- package/dist/lib/entity-pipeline.js +151 -0
- package/dist/lib/entity-pipeline.js.map +1 -0
- package/dist/lib/formatting.d.ts +13 -0
- package/dist/lib/formatting.d.ts.map +1 -0
- package/dist/lib/formatting.js +60 -0
- package/dist/lib/formatting.js.map +1 -0
- package/dist/lib/learning-extractor.d.ts +144 -0
- package/dist/lib/learning-extractor.d.ts.map +1 -0
- package/dist/lib/learning-extractor.js +921 -0
- package/dist/lib/learning-extractor.js.map +1 -0
- package/dist/lib/lifecycle.d.ts +45 -0
- package/dist/lib/lifecycle.js +84 -0
- package/dist/lib/lifecycle.js.map +1 -0
- package/dist/lib/memory.d.ts +128 -0
- package/dist/lib/memory.d.ts.map +1 -0
- package/dist/lib/memory.js +590 -0
- package/dist/lib/memory.js.map +1 -0
- package/dist/lib/quality-gate.d.ts +32 -0
- package/dist/lib/quality-gate.js +158 -0
- package/dist/lib/quality-gate.js.map +1 -0
- package/dist/lib/quality-gate.test.d.ts +7 -0
- package/dist/lib/quality-gate.test.js +75 -0
- package/dist/lib/quality-gate.test.js.map +1 -0
- package/dist/lib/rerank.d.ts +22 -0
- package/dist/lib/rerank.js +61 -0
- package/dist/lib/rerank.js.map +1 -0
- package/dist/lib/retrieval.d.ts +75 -0
- package/dist/lib/retrieval.js +380 -0
- package/dist/lib/retrieval.js.map +1 -0
- package/dist/migrate.d.ts +17 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +81 -0
- package/dist/migrate.js.map +1 -0
- package/dist/routes/analyze-codebase.d.ts +9 -0
- package/dist/routes/analyze-codebase.d.ts.map +1 -0
- package/dist/routes/analyze-codebase.js +70 -0
- package/dist/routes/analyze-codebase.js.map +1 -0
- package/dist/routes/analyze-voice.d.ts +9 -0
- package/dist/routes/analyze-voice.d.ts.map +1 -0
- package/dist/routes/analyze-voice.js +63 -0
- package/dist/routes/analyze-voice.js.map +1 -0
- package/dist/routes/assemble-context.d.ts +9 -0
- package/dist/routes/assemble-context.d.ts.map +1 -0
- package/dist/routes/assemble-context.js +68 -0
- package/dist/routes/assemble-context.js.map +1 -0
- package/dist/routes/bootstrap.d.ts +12 -0
- package/dist/routes/bootstrap.d.ts.map +1 -0
- package/dist/routes/bootstrap.js +102 -0
- package/dist/routes/bootstrap.js.map +1 -0
- package/dist/routes/browse.d.ts +11 -0
- package/dist/routes/browse.js +85 -0
- package/dist/routes/browse.js.map +1 -0
- package/dist/routes/capture-thought.d.ts +13 -0
- package/dist/routes/capture-thought.d.ts.map +1 -0
- package/dist/routes/capture-thought.js +178 -0
- package/dist/routes/capture-thought.js.map +1 -0
- package/dist/routes/capture.d.ts +13 -0
- package/dist/routes/capture.d.ts.map +1 -0
- package/dist/routes/capture.js +86 -0
- package/dist/routes/capture.js.map +1 -0
- package/dist/routes/cite.d.ts +9 -0
- package/dist/routes/cite.d.ts.map +1 -0
- package/dist/routes/cite.js +49 -0
- package/dist/routes/cite.js.map +1 -0
- package/dist/routes/crud.d.ts +11 -0
- package/dist/routes/crud.d.ts.map +1 -0
- package/dist/routes/crud.js +176 -0
- package/dist/routes/crud.js.map +1 -0
- package/dist/routes/dashboard.d.ts +9 -0
- package/dist/routes/dashboard.d.ts.map +1 -0
- package/dist/routes/dashboard.js +85 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/entity-cron.d.ts +8 -0
- package/dist/routes/entity-cron.js +31 -0
- package/dist/routes/entity-cron.js.map +1 -0
- package/dist/routes/export.d.ts +8 -0
- package/dist/routes/export.d.ts.map +1 -0
- package/dist/routes/export.js +69 -0
- package/dist/routes/export.js.map +1 -0
- package/dist/routes/extract-pr-learnings.d.ts +12 -0
- package/dist/routes/extract-pr-learnings.d.ts.map +1 -0
- package/dist/routes/extract-pr-learnings.js +127 -0
- package/dist/routes/extract-pr-learnings.js.map +1 -0
- package/dist/routes/forget-cron.d.ts +9 -0
- package/dist/routes/forget-cron.js +30 -0
- package/dist/routes/forget-cron.js.map +1 -0
- package/dist/routes/learnings.d.ts +9 -0
- package/dist/routes/learnings.d.ts.map +1 -0
- package/dist/routes/learnings.js +237 -0
- package/dist/routes/learnings.js.map +1 -0
- package/dist/routes/pulse.d.ts +9 -0
- package/dist/routes/pulse.d.ts.map +1 -0
- package/dist/routes/pulse.js +133 -0
- package/dist/routes/pulse.js.map +1 -0
- package/dist/routes/search.d.ts +8 -0
- package/dist/routes/search.d.ts.map +1 -0
- package/dist/routes/search.js +107 -0
- package/dist/routes/search.js.map +1 -0
- package/dist/routes/store.d.ts +8 -0
- package/dist/routes/store.d.ts.map +1 -0
- package/dist/routes/store.js +89 -0
- package/dist/routes/store.js.map +1 -0
- package/dist/routes/sync.d.ts +12 -0
- package/dist/routes/sync.d.ts.map +1 -0
- package/dist/routes/sync.js +83 -0
- package/dist/routes/sync.js.map +1 -0
- package/dist/routes/voice-profile.d.ts +9 -0
- package/dist/routes/voice-profile.d.ts.map +1 -0
- package/dist/routes/voice-profile.js +124 -0
- package/dist/routes/voice-profile.js.map +1 -0
- package/dist/server.d.ts +37 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +99 -0
- package/dist/server.js.map +1 -0
- package/dist/vectordb/index.d.ts +17 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +39 -0
- package/dist/vectordb/index.js.map +1 -0
- package/dist/vectordb/supabase.d.ts +62 -0
- package/dist/vectordb/supabase.d.ts.map +1 -0
- package/dist/vectordb/supabase.js +711 -0
- package/dist/vectordb/supabase.js.map +1 -0
- package/dist/vectordb/types.d.ts +217 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +28 -0
- package/dist/vectordb/types.js.map +1 -0
- package/package.json +49 -0
- package/setup.sql +1037 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Search Route
|
|
3
|
+
*
|
|
4
|
+
* GET /search?q=<query>&limit=10&category=gotcha&threshold=0.3
|
|
5
|
+
*/
|
|
6
|
+
import { Hono } from 'hono';
|
|
7
|
+
import { searchMemories } from '../lib/memory.js';
|
|
8
|
+
import { searchMemoriesV2 } from '../lib/retrieval.js';
|
|
9
|
+
const VALID_CATEGORIES = ['gotcha', 'pattern', 'fix', 'insight', 'question', 'preference', 'convention'];
|
|
10
|
+
const MAX_LIMIT = 50;
|
|
11
|
+
const DEFAULT_LIMIT = 10;
|
|
12
|
+
const DEFAULT_THRESHOLD = 0.35;
|
|
13
|
+
const app = new Hono();
|
|
14
|
+
app.get('/', async (c) => {
|
|
15
|
+
try {
|
|
16
|
+
const query = c.req.query('q');
|
|
17
|
+
if (!query || query.trim().length === 0) {
|
|
18
|
+
return c.json({ success: false, error: 'Query parameter "q" is required' }, 400);
|
|
19
|
+
}
|
|
20
|
+
let limit = DEFAULT_LIMIT;
|
|
21
|
+
const limitParam = c.req.query('limit');
|
|
22
|
+
if (limitParam) {
|
|
23
|
+
const parsed = parseInt(limitParam, 10);
|
|
24
|
+
if (isNaN(parsed) || parsed < 1) {
|
|
25
|
+
return c.json({ success: false, error: 'limit must be a positive integer' }, 400);
|
|
26
|
+
}
|
|
27
|
+
limit = Math.min(parsed, MAX_LIMIT);
|
|
28
|
+
}
|
|
29
|
+
let category;
|
|
30
|
+
const categoryParam = c.req.query('category');
|
|
31
|
+
if (categoryParam) {
|
|
32
|
+
if (!VALID_CATEGORIES.includes(categoryParam)) {
|
|
33
|
+
return c.json({ success: false, error: `category must be one of: ${VALID_CATEGORIES.join(', ')}` }, 400);
|
|
34
|
+
}
|
|
35
|
+
category = categoryParam;
|
|
36
|
+
}
|
|
37
|
+
let tags;
|
|
38
|
+
const tagsParam = c.req.query('tags');
|
|
39
|
+
if (tagsParam) {
|
|
40
|
+
tags = tagsParam.split(',').map(t => t.trim()).filter(Boolean);
|
|
41
|
+
}
|
|
42
|
+
const includeArchived = c.req.query('includeArchived') === 'true';
|
|
43
|
+
let threshold = DEFAULT_THRESHOLD;
|
|
44
|
+
const thresholdParam = c.req.query('threshold');
|
|
45
|
+
if (thresholdParam) {
|
|
46
|
+
const parsed = parseFloat(thresholdParam);
|
|
47
|
+
if (isNaN(parsed) || parsed < 0 || parsed > 1) {
|
|
48
|
+
return c.json({ success: false, error: 'threshold must be a number between 0 and 1' }, 400);
|
|
49
|
+
}
|
|
50
|
+
threshold = parsed;
|
|
51
|
+
}
|
|
52
|
+
let durability;
|
|
53
|
+
const durabilityParam = c.req.query('durability');
|
|
54
|
+
if (durabilityParam) {
|
|
55
|
+
if (!['permanent', 'temporary', 'session'].includes(durabilityParam)) {
|
|
56
|
+
return c.json({ success: false, error: 'durability must be one of: permanent, temporary, session' }, 400);
|
|
57
|
+
}
|
|
58
|
+
durability = durabilityParam;
|
|
59
|
+
}
|
|
60
|
+
// Cross-project search: project=<slug> filters, crossProject=true includes all
|
|
61
|
+
const projectParam = c.req.query('project');
|
|
62
|
+
const crossProject = c.req.query('crossProject') === 'true';
|
|
63
|
+
// v2: lifecycle filters
|
|
64
|
+
const latestOnly = c.req.query('latestOnly') !== 'false';
|
|
65
|
+
const memoryType = c.req.query('memoryType');
|
|
66
|
+
const options = {
|
|
67
|
+
limit,
|
|
68
|
+
category,
|
|
69
|
+
tags,
|
|
70
|
+
includeArchived,
|
|
71
|
+
similarityThreshold: threshold,
|
|
72
|
+
durability,
|
|
73
|
+
excludeExpired: true,
|
|
74
|
+
sourceProject: projectParam || undefined,
|
|
75
|
+
includeUniversal: crossProject || !!projectParam,
|
|
76
|
+
latestOnly,
|
|
77
|
+
memoryType: memoryType || undefined,
|
|
78
|
+
};
|
|
79
|
+
// Fetch more results than requested if domain filter is active (post-filter)
|
|
80
|
+
const domainParam = c.req.query('domain');
|
|
81
|
+
if (domainParam) {
|
|
82
|
+
options.limit = Math.min(limit * 3, MAX_LIMIT); // over-fetch for post-filter
|
|
83
|
+
}
|
|
84
|
+
// v2: multi-strategy fusion (semantic + BM25 + temporal + graph via RRF)
|
|
85
|
+
const useFusion = c.req.query('fusion') !== 'false';
|
|
86
|
+
const entityIds = c.req.query('entityIds')?.split(',').filter(Boolean);
|
|
87
|
+
let results = useFusion
|
|
88
|
+
? await searchMemoriesV2(query.trim(), { ...options, entityIds })
|
|
89
|
+
: await searchMemories(query.trim(), options);
|
|
90
|
+
// Post-filter by domain (column not in RPC)
|
|
91
|
+
if (domainParam) {
|
|
92
|
+
results = results.filter((r) => r.domain === domainParam).slice(0, limit);
|
|
93
|
+
}
|
|
94
|
+
return c.json({
|
|
95
|
+
success: true,
|
|
96
|
+
query: query.trim(),
|
|
97
|
+
count: results.length,
|
|
98
|
+
results,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error('[Memory Search] Error:', error);
|
|
103
|
+
return c.json({ success: false, error: error instanceof Error ? error.message : 'Unknown error searching memories' }, 500);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
export default app;
|
|
107
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/routes/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/routes/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAQ3B,QAAA,MAAM,GAAG,4EAAa,CAAA;AAkEtB,eAAe,GAAG,CAAA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Store Route
|
|
3
|
+
*
|
|
4
|
+
* POST /store
|
|
5
|
+
*/
|
|
6
|
+
import { Hono } from 'hono';
|
|
7
|
+
import { storeMemory } from '../lib/memory.js';
|
|
8
|
+
import { passesIngestionGate } from '../lib/quality-gate.js';
|
|
9
|
+
import { deriveAll } from '../lib/auto-derive.js';
|
|
10
|
+
const VALID_CATEGORIES = ['gotcha', 'pattern', 'fix', 'insight', 'question', 'preference', 'convention'];
|
|
11
|
+
const VALID_SOURCE_TYPES = ['pr', 'manual', 'extracted', 'bootstrap', 'advisor_session', 'plan', 'web_research', 'session', 'codebase_analysis'];
|
|
12
|
+
const VALID_DURABILITIES = ['permanent', 'temporary', 'session'];
|
|
13
|
+
const app = new Hono();
|
|
14
|
+
app.post('/', async (c) => {
|
|
15
|
+
try {
|
|
16
|
+
const body = await c.req.json();
|
|
17
|
+
if (!body.content || typeof body.content !== 'string') {
|
|
18
|
+
return c.json({ success: false, error: 'content is required and must be a string' }, 400);
|
|
19
|
+
}
|
|
20
|
+
if (!body.skipQualityGate) {
|
|
21
|
+
const gate = passesIngestionGate(body.content.trim());
|
|
22
|
+
if (!gate.passes) {
|
|
23
|
+
return c.json({ success: false, error: `Quality gate rejected: ${gate.reason}` }, 400);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (!body.sourceType) {
|
|
27
|
+
body.sourceType = 'manual';
|
|
28
|
+
}
|
|
29
|
+
else if (!VALID_SOURCE_TYPES.includes(body.sourceType)) {
|
|
30
|
+
return c.json({ success: false, error: `sourceType must be one of: ${VALID_SOURCE_TYPES.join(', ')}` }, 400);
|
|
31
|
+
}
|
|
32
|
+
if (body.category && !VALID_CATEGORIES.includes(body.category)) {
|
|
33
|
+
return c.json({ success: false, error: `category must be one of: ${VALID_CATEGORIES.join(', ')}` }, 400);
|
|
34
|
+
}
|
|
35
|
+
if (body.confidence !== undefined) {
|
|
36
|
+
const conf = Number(body.confidence);
|
|
37
|
+
if (isNaN(conf) || conf < 0 || conf > 1) {
|
|
38
|
+
return c.json({ success: false, error: 'confidence must be a number between 0 and 1' }, 400);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (body.durability && !VALID_DURABILITIES.includes(body.durability)) {
|
|
42
|
+
return c.json({ success: false, error: `durability must be one of: ${VALID_DURABILITIES.join(', ')}` }, 400);
|
|
43
|
+
}
|
|
44
|
+
if (body.expiresAt) {
|
|
45
|
+
const parsed = new Date(body.expiresAt);
|
|
46
|
+
if (isNaN(parsed.getTime())) {
|
|
47
|
+
return c.json({ success: false, error: 'expiresAt must be a valid ISO date string' }, 400);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Auto-derive missing fields from content
|
|
51
|
+
const content = body.content.trim();
|
|
52
|
+
const derived = deriveAll(content, {
|
|
53
|
+
category: body.category || undefined,
|
|
54
|
+
tags: Array.isArray(body.tags) && body.tags.length > 0 ? body.tags : undefined,
|
|
55
|
+
summary: body.summary?.trim() || undefined,
|
|
56
|
+
domain: body.domain?.trim() || undefined,
|
|
57
|
+
topic: body.topic?.trim() || undefined,
|
|
58
|
+
memoryType: body.memoryType || undefined,
|
|
59
|
+
sourceTool: body.sourceTool?.trim() || 'http-store',
|
|
60
|
+
});
|
|
61
|
+
const input = {
|
|
62
|
+
content,
|
|
63
|
+
summary: derived.summary,
|
|
64
|
+
category: derived.category,
|
|
65
|
+
tags: derived.tags,
|
|
66
|
+
contextTags: Array.isArray(body.contextTags) ? body.contextTags.filter(Boolean) : [],
|
|
67
|
+
sourceType: body.sourceType,
|
|
68
|
+
sourceRef: body.sourceRef?.trim(),
|
|
69
|
+
sourceProject: body.sourceProject?.trim() || 'default',
|
|
70
|
+
confidence: body.confidence,
|
|
71
|
+
relatedTo: Array.isArray(body.relatedTo) ? body.relatedTo : [],
|
|
72
|
+
isContradiction: body.isContradiction || false,
|
|
73
|
+
durability: body.durability || 'permanent',
|
|
74
|
+
expiresAt: body.expiresAt ? new Date(body.expiresAt) : undefined,
|
|
75
|
+
domain: derived.domain,
|
|
76
|
+
topic: derived.topic,
|
|
77
|
+
memoryType: derived.memoryType,
|
|
78
|
+
sourceTool: derived.sourceTool,
|
|
79
|
+
};
|
|
80
|
+
const memory = await storeMemory(input);
|
|
81
|
+
return c.json({ success: true, memory });
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error('[Memory Store] Error:', error);
|
|
85
|
+
return c.json({ success: false, error: error instanceof Error ? error.message : 'Unknown error storing memory' }, 500);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
export default app;
|
|
89
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/routes/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Sync Route (Portable)
|
|
3
|
+
*
|
|
4
|
+
* GET /sync?since=<timestamp>&limit=50
|
|
5
|
+
* Returns new learnings since the given timestamp
|
|
6
|
+
*
|
|
7
|
+
* POST /sync
|
|
8
|
+
* Returns recent learnings (simplified from NookTraqr's broadcast system)
|
|
9
|
+
*/
|
|
10
|
+
import { Hono } from 'hono';
|
|
11
|
+
declare const app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
12
|
+
export default app;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/routes/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,QAAA,MAAM,GAAG,4EAAa,CAAA;AAsFtB,eAAe,GAAG,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Sync Route (Portable)
|
|
3
|
+
*
|
|
4
|
+
* GET /sync?since=<timestamp>&limit=50
|
|
5
|
+
* Returns new learnings since the given timestamp
|
|
6
|
+
*
|
|
7
|
+
* POST /sync
|
|
8
|
+
* Returns recent learnings (simplified from NookTraqr's broadcast system)
|
|
9
|
+
*/
|
|
10
|
+
import { Hono } from 'hono';
|
|
11
|
+
import { getMemoryClient, getTableName } from '../lib/client.js';
|
|
12
|
+
const app = new Hono();
|
|
13
|
+
app.get('/', async (c) => {
|
|
14
|
+
try {
|
|
15
|
+
const sinceParam = c.req.query('since');
|
|
16
|
+
const limit = parseInt(c.req.query('limit') || '50', 10);
|
|
17
|
+
let sinceTimestamp;
|
|
18
|
+
if (sinceParam) {
|
|
19
|
+
sinceTimestamp = parseInt(sinceParam, 10);
|
|
20
|
+
if (isNaN(sinceTimestamp)) {
|
|
21
|
+
return c.json({ success: false, error: 'Invalid since timestamp' }, 400);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
sinceTimestamp = Date.now() - 60 * 60 * 1000;
|
|
26
|
+
}
|
|
27
|
+
const sinceDate = new Date(sinceTimestamp).toISOString();
|
|
28
|
+
const client = getMemoryClient();
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
+
const { data, error } = await client.from(getTableName())
|
|
31
|
+
.select('id, content, category, tags, source_type, created_at, original_confidence')
|
|
32
|
+
.eq('is_archived', false)
|
|
33
|
+
.gte('created_at', sinceDate)
|
|
34
|
+
.order('created_at', { ascending: false })
|
|
35
|
+
.limit(limit);
|
|
36
|
+
if (error) {
|
|
37
|
+
throw new Error(error.message);
|
|
38
|
+
}
|
|
39
|
+
return c.json({
|
|
40
|
+
success: true,
|
|
41
|
+
learnings: data || [],
|
|
42
|
+
total: (data || []).length,
|
|
43
|
+
syncedAt: Date.now(),
|
|
44
|
+
since: sinceTimestamp,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error('[memory/sync] GET error:', error);
|
|
49
|
+
return c.json({ success: false, error: error instanceof Error ? error.message : 'Unknown error' }, 500);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
app.post('/', async (c) => {
|
|
53
|
+
try {
|
|
54
|
+
const body = await c.req.json();
|
|
55
|
+
const since = body.since || Date.now() - 60 * 60 * 1000;
|
|
56
|
+
const limit = body.limit || 50;
|
|
57
|
+
const sinceDate = new Date(since).toISOString();
|
|
58
|
+
const client = getMemoryClient();
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
+
const { data, error } = await client.from(getTableName())
|
|
61
|
+
.select('id, content, category, tags, source_type, created_at, original_confidence')
|
|
62
|
+
.eq('is_archived', false)
|
|
63
|
+
.gte('created_at', sinceDate)
|
|
64
|
+
.order('created_at', { ascending: false })
|
|
65
|
+
.limit(limit);
|
|
66
|
+
if (error) {
|
|
67
|
+
throw new Error(error.message);
|
|
68
|
+
}
|
|
69
|
+
return c.json({
|
|
70
|
+
success: true,
|
|
71
|
+
learnings: data || [],
|
|
72
|
+
total: (data || []).length,
|
|
73
|
+
syncedAt: Date.now(),
|
|
74
|
+
previousSync: since,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error('[memory/sync] POST error:', error);
|
|
79
|
+
return c.json({ success: false, error: error instanceof Error ? error.message : 'Unknown error' }, 500);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
export default app;
|
|
83
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/routes/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice Profile Route (Portable)
|
|
3
|
+
*
|
|
4
|
+
* GET /voice-profile?audience=user-facing|business|technical|social
|
|
5
|
+
* Aggregates voice-tagged memories into a structured voice profile.
|
|
6
|
+
*/
|
|
7
|
+
import { Hono } from 'hono';
|
|
8
|
+
declare const app: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
|
|
9
|
+
export default app;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-profile.d.ts","sourceRoot":"","sources":["../../src/routes/voice-profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAyB3B,QAAA,MAAM,GAAG,4EAAa,CAAA;AAkJtB,eAAe,GAAG,CAAA"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voice Profile Route (Portable)
|
|
3
|
+
*
|
|
4
|
+
* GET /voice-profile?audience=user-facing|business|technical|social
|
|
5
|
+
* Aggregates voice-tagged memories into a structured voice profile.
|
|
6
|
+
*/
|
|
7
|
+
import { Hono } from 'hono';
|
|
8
|
+
import { searchMemories } from '../lib/memory.js';
|
|
9
|
+
const AUDIENCE_TYPES = ['user-facing', 'business', 'technical', 'social', 'brand'];
|
|
10
|
+
const app = new Hono();
|
|
11
|
+
app.get('/', async (c) => {
|
|
12
|
+
try {
|
|
13
|
+
const audienceFilter = c.req.query('audience');
|
|
14
|
+
if (audienceFilter && !AUDIENCE_TYPES.includes(audienceFilter)) {
|
|
15
|
+
return c.json({ success: false, error: `Invalid audience: ${audienceFilter}. Must be one of: ${AUDIENCE_TYPES.join(', ')}` }, 400);
|
|
16
|
+
}
|
|
17
|
+
const queries = [
|
|
18
|
+
'voice writing style tone',
|
|
19
|
+
'voice communication pattern',
|
|
20
|
+
'voice signature phrase sign-off',
|
|
21
|
+
'voice audience adaptation',
|
|
22
|
+
'voice vocabulary emoji',
|
|
23
|
+
];
|
|
24
|
+
const allMemories = new Map();
|
|
25
|
+
for (const query of queries) {
|
|
26
|
+
const results = await searchMemories(query, {
|
|
27
|
+
limit: 30,
|
|
28
|
+
tags: ['voice'],
|
|
29
|
+
similarityThreshold: 0.2,
|
|
30
|
+
});
|
|
31
|
+
for (const r of results) {
|
|
32
|
+
if (!allMemories.has(r.id)) {
|
|
33
|
+
allMemories.set(r.id, {
|
|
34
|
+
id: r.id,
|
|
35
|
+
content: r.content,
|
|
36
|
+
confidence: r.relevanceScore,
|
|
37
|
+
category: r.category || 'preference',
|
|
38
|
+
tags: r.tags || [],
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const memories = Array.from(allMemories.values());
|
|
44
|
+
const profile = {
|
|
45
|
+
audiences: {},
|
|
46
|
+
universal: [],
|
|
47
|
+
totalVoiceMemories: memories.length,
|
|
48
|
+
promptContext: '',
|
|
49
|
+
};
|
|
50
|
+
for (const memory of memories) {
|
|
51
|
+
let matched = false;
|
|
52
|
+
for (const audience of AUDIENCE_TYPES) {
|
|
53
|
+
const hasAudienceTag = memory.tags.some(t => t === `audience:${audience}` ||
|
|
54
|
+
t === audience ||
|
|
55
|
+
t === audience.replace('-', '_'));
|
|
56
|
+
if (hasAudienceTag) {
|
|
57
|
+
if (audienceFilter && audience !== audienceFilter)
|
|
58
|
+
continue;
|
|
59
|
+
if (!profile.audiences[audience]) {
|
|
60
|
+
profile.audiences[audience] = { traits: [], count: 0 };
|
|
61
|
+
}
|
|
62
|
+
profile.audiences[audience].traits.push({
|
|
63
|
+
content: memory.content,
|
|
64
|
+
confidence: memory.confidence,
|
|
65
|
+
category: memory.category,
|
|
66
|
+
tags: memory.tags,
|
|
67
|
+
});
|
|
68
|
+
profile.audiences[audience].count++;
|
|
69
|
+
matched = true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!matched && !audienceFilter) {
|
|
73
|
+
profile.universal.push({
|
|
74
|
+
content: memory.content,
|
|
75
|
+
confidence: memory.confidence,
|
|
76
|
+
category: memory.category,
|
|
77
|
+
tags: memory.tags,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
for (const audience of AUDIENCE_TYPES) {
|
|
82
|
+
if (profile.audiences[audience]) {
|
|
83
|
+
profile.audiences[audience].traits.sort((a, b) => b.confidence - a.confidence);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
profile.universal.sort((a, b) => b.confidence - a.confidence);
|
|
87
|
+
profile.promptContext = buildPromptContext(profile, audienceFilter);
|
|
88
|
+
return c.json({ success: true, ...profile });
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error('[Voice Profile] Error:', error);
|
|
92
|
+
return c.json({ success: false, error: error instanceof Error ? error.message : 'Unknown error building voice profile' }, 500);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
function buildPromptContext(profile, audienceFilter) {
|
|
96
|
+
const lines = [];
|
|
97
|
+
lines.push('=== VOICE PROFILE ===');
|
|
98
|
+
lines.push('');
|
|
99
|
+
if (profile.totalVoiceMemories === 0) {
|
|
100
|
+
lines.push('No voice profile data available. Run /voice to analyze writing samples first.');
|
|
101
|
+
return lines.join('\n');
|
|
102
|
+
}
|
|
103
|
+
for (const audience of AUDIENCE_TYPES) {
|
|
104
|
+
const section = profile.audiences[audience];
|
|
105
|
+
if (!section || section.traits.length === 0)
|
|
106
|
+
continue;
|
|
107
|
+
lines.push(`## ${audience.toUpperCase()} Voice`);
|
|
108
|
+
for (const trait of section.traits) {
|
|
109
|
+
lines.push(`- ${trait.content}`);
|
|
110
|
+
}
|
|
111
|
+
lines.push('');
|
|
112
|
+
}
|
|
113
|
+
if (profile.universal.length > 0 && !audienceFilter) {
|
|
114
|
+
lines.push('## UNIVERSAL Traits (across all audiences)');
|
|
115
|
+
for (const trait of profile.universal) {
|
|
116
|
+
lines.push(`- ${trait.content}`);
|
|
117
|
+
}
|
|
118
|
+
lines.push('');
|
|
119
|
+
}
|
|
120
|
+
lines.push('=== END VOICE PROFILE ===');
|
|
121
|
+
return lines.join('\n');
|
|
122
|
+
}
|
|
123
|
+
export default app;
|
|
124
|
+
//# sourceMappingURL=voice-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-profile.js","sourceRoot":"","sources":["../../src/routes/voice-profile.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @traqr/memory — Standalone Hono HTTP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides 11 memory API routes as a standalone server.
|
|
5
|
+
* Drop-in replacement for NookTraqr's Next.js memory API routes.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* SUPABASE_URL=... SUPABASE_SERVICE_ROLE_KEY=... OPENAI_API_KEY=... \
|
|
9
|
+
* node --loader ts-node/esm packages/memory/src/server.ts
|
|
10
|
+
*
|
|
11
|
+
* Routes:
|
|
12
|
+
* GET /search — Semantic memory search
|
|
13
|
+
* POST /store — Store a new memory
|
|
14
|
+
* GET /get — Get memory by ID
|
|
15
|
+
* PATCH /update — Update a memory
|
|
16
|
+
* GET /verify — System health check
|
|
17
|
+
* POST /verify — Full round-trip verification
|
|
18
|
+
* GET /export — Export all memories
|
|
19
|
+
* POST /cite — Record memory citations
|
|
20
|
+
* GET /dashboard — Memory stats dashboard
|
|
21
|
+
* GET /sync — Get recent learnings
|
|
22
|
+
* POST /sync — Sync learnings
|
|
23
|
+
* GET /bootstrap — Bootstrap usage info
|
|
24
|
+
* POST /bootstrap — Import markdown sections
|
|
25
|
+
* POST /capture-session — Store captured session learnings
|
|
26
|
+
* POST /pulse — Batched capture + search + update
|
|
27
|
+
* POST /assemble-context — Session context assembly
|
|
28
|
+
* GET /learnings — Domain-organized learning query
|
|
29
|
+
* POST /extract-pr-learnings — On-demand PR learning extraction
|
|
30
|
+
* GET /voice-profile — Voice profile aggregation
|
|
31
|
+
* POST /analyze-voice — Voice analysis extraction
|
|
32
|
+
* POST /analyze-codebase — Codebase convention analysis
|
|
33
|
+
* POST /capture — Passive knowledge capture
|
|
34
|
+
* GET /capture — List recent captures
|
|
35
|
+
*/
|
|
36
|
+
import { Hono } from 'hono';
|
|
37
|
+
export declare function createMemoryServer(): Hono;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAqB3B,wBAAgB,kBAAkB,IAAI,IAAI,CA4BzC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @traqr/memory — Standalone Hono HTTP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides 11 memory API routes as a standalone server.
|
|
5
|
+
* Drop-in replacement for NookTraqr's Next.js memory API routes.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* SUPABASE_URL=... SUPABASE_SERVICE_ROLE_KEY=... OPENAI_API_KEY=... \
|
|
9
|
+
* node --loader ts-node/esm packages/memory/src/server.ts
|
|
10
|
+
*
|
|
11
|
+
* Routes:
|
|
12
|
+
* GET /search — Semantic memory search
|
|
13
|
+
* POST /store — Store a new memory
|
|
14
|
+
* GET /get — Get memory by ID
|
|
15
|
+
* PATCH /update — Update a memory
|
|
16
|
+
* GET /verify — System health check
|
|
17
|
+
* POST /verify — Full round-trip verification
|
|
18
|
+
* GET /export — Export all memories
|
|
19
|
+
* POST /cite — Record memory citations
|
|
20
|
+
* GET /dashboard — Memory stats dashboard
|
|
21
|
+
* GET /sync — Get recent learnings
|
|
22
|
+
* POST /sync — Sync learnings
|
|
23
|
+
* GET /bootstrap — Bootstrap usage info
|
|
24
|
+
* POST /bootstrap — Import markdown sections
|
|
25
|
+
* POST /capture-session — Store captured session learnings
|
|
26
|
+
* POST /pulse — Batched capture + search + update
|
|
27
|
+
* POST /assemble-context — Session context assembly
|
|
28
|
+
* GET /learnings — Domain-organized learning query
|
|
29
|
+
* POST /extract-pr-learnings — On-demand PR learning extraction
|
|
30
|
+
* GET /voice-profile — Voice profile aggregation
|
|
31
|
+
* POST /analyze-voice — Voice analysis extraction
|
|
32
|
+
* POST /analyze-codebase — Codebase convention analysis
|
|
33
|
+
* POST /capture — Passive knowledge capture
|
|
34
|
+
* GET /capture — List recent captures
|
|
35
|
+
*/
|
|
36
|
+
import { Hono } from 'hono';
|
|
37
|
+
import { serve } from '@hono/node-server';
|
|
38
|
+
import searchRoutes from './routes/search.js';
|
|
39
|
+
import storeRoutes from './routes/store.js';
|
|
40
|
+
import crudRoutes from './routes/crud.js';
|
|
41
|
+
import exportRoutes from './routes/export.js';
|
|
42
|
+
import citeRoutes from './routes/cite.js';
|
|
43
|
+
import dashboardRoutes from './routes/dashboard.js';
|
|
44
|
+
import syncRoutes from './routes/sync.js';
|
|
45
|
+
import bootstrapRoutes from './routes/bootstrap.js';
|
|
46
|
+
import captureSessionRoutes from './routes/capture.js';
|
|
47
|
+
import pulseRoutes from './routes/pulse.js';
|
|
48
|
+
import assembleContextRoutes from './routes/assemble-context.js';
|
|
49
|
+
import learningsRoutes from './routes/learnings.js';
|
|
50
|
+
import extractPrLearningsRoutes from './routes/extract-pr-learnings.js';
|
|
51
|
+
import voiceProfileRoutes from './routes/voice-profile.js';
|
|
52
|
+
import analyzeVoiceRoutes from './routes/analyze-voice.js';
|
|
53
|
+
import analyzeCodebaseRoutes from './routes/analyze-codebase.js';
|
|
54
|
+
import captureThoughtRoutes from './routes/capture-thought.js';
|
|
55
|
+
import browseRoutes from './routes/browse.js';
|
|
56
|
+
import forgetCronRoutes from './routes/forget-cron.js';
|
|
57
|
+
import entityCronRoutes from './routes/entity-cron.js';
|
|
58
|
+
export function createMemoryServer() {
|
|
59
|
+
const app = new Hono();
|
|
60
|
+
// Health check
|
|
61
|
+
app.get('/health', (c) => c.json({ status: 'ok', service: '@traqr/memory' }));
|
|
62
|
+
// Core routes (existing)
|
|
63
|
+
app.route('/search', searchRoutes);
|
|
64
|
+
app.route('/store', storeRoutes);
|
|
65
|
+
app.route('/', crudRoutes); // /get, /update, /verify
|
|
66
|
+
app.route('/export', exportRoutes);
|
|
67
|
+
app.route('/cite', citeRoutes);
|
|
68
|
+
app.route('/dashboard', dashboardRoutes);
|
|
69
|
+
app.route('/sync', syncRoutes);
|
|
70
|
+
app.route('/bootstrap', bootstrapRoutes);
|
|
71
|
+
app.route('/capture-session', captureSessionRoutes);
|
|
72
|
+
// New portable routes (Phase 1)
|
|
73
|
+
app.route('/pulse', pulseRoutes);
|
|
74
|
+
app.route('/assemble-context', assembleContextRoutes);
|
|
75
|
+
app.route('/learnings', learningsRoutes);
|
|
76
|
+
app.route('/extract-pr-learnings', extractPrLearningsRoutes);
|
|
77
|
+
app.route('/voice-profile', voiceProfileRoutes);
|
|
78
|
+
app.route('/analyze-voice', analyzeVoiceRoutes);
|
|
79
|
+
app.route('/analyze-codebase', analyzeCodebaseRoutes);
|
|
80
|
+
app.route('/capture', captureThoughtRoutes);
|
|
81
|
+
app.route('/browse', browseRoutes);
|
|
82
|
+
app.route('/forget-cron', forgetCronRoutes);
|
|
83
|
+
app.route('/entity-cron', entityCronRoutes);
|
|
84
|
+
return app;
|
|
85
|
+
}
|
|
86
|
+
// Start server if run directly
|
|
87
|
+
const isMain = process.argv[1]?.endsWith('server.ts') || process.argv[1]?.endsWith('server.js');
|
|
88
|
+
if (isMain) {
|
|
89
|
+
const port = parseInt(process.env.PORT || '4100', 10);
|
|
90
|
+
const app = createMemoryServer();
|
|
91
|
+
console.log(`@traqr/memory server starting on port ${port}...`);
|
|
92
|
+
serve({
|
|
93
|
+
fetch: app.fetch,
|
|
94
|
+
port,
|
|
95
|
+
}, (info) => {
|
|
96
|
+
console.log(`@traqr/memory server running at http://localhost:${info.port}`);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|