@cartisien/engram-mcp 0.2.0 → 0.3.1
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/LICENSE +21 -0
- package/dist/analysis/emotions.d.ts +16 -0
- package/dist/analysis/emotions.js +130 -0
- package/dist/analysis/emotions.js.map +1 -0
- package/dist/analysis/entities.d.ts +15 -0
- package/dist/analysis/entities.js +182 -0
- package/dist/analysis/entities.js.map +1 -0
- package/dist/analysis/themes.d.ts +11 -0
- package/dist/analysis/themes.js +151 -0
- package/dist/analysis/themes.js.map +1 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.js +31 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.js +20 -0
- package/dist/config.js.map +1 -0
- package/dist/response.d.ts +17 -0
- package/dist/response.js +17 -0
- package/dist/response.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.js +104 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/consolidate.d.ts +41 -0
- package/dist/tools/consolidate.js +53 -0
- package/dist/tools/consolidate.js.map +1 -0
- package/dist/tools/context.d.ts +44 -0
- package/dist/tools/context.js +186 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/detect_changes.d.ts +35 -0
- package/dist/tools/detect_changes.js +178 -0
- package/dist/tools/detect_changes.js.map +1 -0
- package/dist/tools/forget.d.ts +38 -0
- package/dist/tools/forget.js +38 -0
- package/dist/tools/forget.js.map +1 -0
- package/dist/tools/graph.d.ts +40 -0
- package/dist/tools/graph.js +74 -0
- package/dist/tools/graph.js.map +1 -0
- package/dist/tools/impact.d.ts +39 -0
- package/dist/tools/impact.js +143 -0
- package/dist/tools/impact.js.map +1 -0
- package/dist/tools/process_detect.d.ts +49 -0
- package/dist/tools/process_detect.js +218 -0
- package/dist/tools/process_detect.js.map +1 -0
- package/dist/tools/recall.d.ts +81 -0
- package/dist/tools/recall.js +134 -0
- package/dist/tools/recall.js.map +1 -0
- package/dist/tools/remember.d.ts +47 -0
- package/dist/tools/remember.js +79 -0
- package/dist/tools/remember.js.map +1 -0
- package/dist/tools/search.d.ts +72 -0
- package/dist/tools/search.js +96 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/stats.d.ts +23 -0
- package/dist/tools/stats.js +47 -0
- package/dist/tools/stats.js.map +1 -0
- package/package.json +29 -14
- package/README.md +0 -114
- package/dist/engram.d.ts +0 -99
- package/dist/engram.js +0 -283
- package/dist/src/index.d.ts +0 -2
- package/dist/src/index.js +0 -322
- package/engram.ts +0 -385
- package/src/index.ts +0 -336
- package/tests/mcp.test.ts +0 -274
- package/tsconfig.json +0 -17
- package/tsconfig.test.json +0 -5
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Cartisien Interactive
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Word-list based emotion scoring (VADER-inspired, no ML required).
|
|
3
|
+
* Returns an emotional tone label with confidence.
|
|
4
|
+
*/
|
|
5
|
+
export type EmotionalTone = 'excited' | 'proud' | 'curious' | 'frustrated' | 'anxious' | 'neutral_positive' | 'neutral' | 'neutral_negative';
|
|
6
|
+
export interface EmotionScore {
|
|
7
|
+
tone: EmotionalTone;
|
|
8
|
+
confidence: number;
|
|
9
|
+
valence: number;
|
|
10
|
+
arousal: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function scoreEmotion(text: string): EmotionScore;
|
|
13
|
+
/**
|
|
14
|
+
* Summarize emotional trajectory across a sequence of memories (oldest → newest)
|
|
15
|
+
*/
|
|
16
|
+
export declare function emotionalTrajectory(tones: EmotionalTone[]): string;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Word-list based emotion scoring (VADER-inspired, no ML required).
|
|
3
|
+
* Returns an emotional tone label with confidence.
|
|
4
|
+
*/
|
|
5
|
+
// Word lists with weights
|
|
6
|
+
const EXCITED_WORDS = new Map([
|
|
7
|
+
['excited', 0.9], ['amazing', 0.85], ['awesome', 0.85], ['fantastic', 0.85],
|
|
8
|
+
['thrilled', 0.9], ['pumped', 0.8], ['love it', 0.8], ['can\'t wait', 0.85],
|
|
9
|
+
['incredible', 0.85], ['wow', 0.8], ['🔥', 0.9], ['🚀', 0.85], ['launching', 0.6],
|
|
10
|
+
['shipped', 0.7], ['finally', 0.5], ['working', 0.3],
|
|
11
|
+
]);
|
|
12
|
+
const PROUD_WORDS = new Map([
|
|
13
|
+
['proud', 0.95], ['achieved', 0.85], ['accomplished', 0.85], ['nailed it', 0.9],
|
|
14
|
+
['success', 0.8], ['successful', 0.8], ['won', 0.75], ['milestone', 0.7],
|
|
15
|
+
['completed', 0.65], ['shipped', 0.65], ['released', 0.6], ['launched', 0.65],
|
|
16
|
+
['working great', 0.8], ['beats', 0.7],
|
|
17
|
+
]);
|
|
18
|
+
const CURIOUS_WORDS = new Map([
|
|
19
|
+
['interesting', 0.8], ['curious', 0.9], ['wonder', 0.75], ['explore', 0.7],
|
|
20
|
+
['investigate', 0.75], ['research', 0.65], ['question', 0.6], ['how does', 0.7],
|
|
21
|
+
['what if', 0.75], ['i wonder', 0.85], ['thinking about', 0.6], ['considering', 0.55],
|
|
22
|
+
['maybe', 0.4], ['perhaps', 0.4],
|
|
23
|
+
]);
|
|
24
|
+
const FRUSTRATED_WORDS = new Map([
|
|
25
|
+
['frustrated', 0.95], ['annoying', 0.85], ['broken', 0.8], ['failing', 0.8],
|
|
26
|
+
['doesn\'t work', 0.9], ['not working', 0.9], ['stuck', 0.75], ['hate', 0.85],
|
|
27
|
+
['terrible', 0.85], ['awful', 0.85], ['mess', 0.7], ['wrong', 0.65],
|
|
28
|
+
['bug', 0.55], ['error', 0.55], ['failed', 0.75], ['can\'t', 0.45],
|
|
29
|
+
['won\'t', 0.4], ['damn', 0.7], ['ugh', 0.8],
|
|
30
|
+
]);
|
|
31
|
+
const ANXIOUS_WORDS = new Map([
|
|
32
|
+
['anxious', 0.95], ['worried', 0.9], ['nervous', 0.9], ['scared', 0.85],
|
|
33
|
+
['fear', 0.8], ['uncertain', 0.75], ['unsure', 0.7], ['risk', 0.6],
|
|
34
|
+
['concern', 0.65], ['deadline', 0.55], ['pressure', 0.65], ['overwhelmed', 0.85],
|
|
35
|
+
['stress', 0.75], ['stressed', 0.8], ['panic', 0.9], ['losing', 0.6],
|
|
36
|
+
]);
|
|
37
|
+
const POSITIVE_WORDS = new Map([
|
|
38
|
+
['good', 0.6], ['great', 0.7], ['nice', 0.6], ['happy', 0.75], ['glad', 0.7],
|
|
39
|
+
['pleased', 0.7], ['well', 0.4], ['helpful', 0.6], ['useful', 0.55],
|
|
40
|
+
['progress', 0.65], ['better', 0.6], ['improved', 0.65],
|
|
41
|
+
]);
|
|
42
|
+
const NEGATIVE_WORDS = new Map([
|
|
43
|
+
['bad', 0.65], ['poor', 0.6], ['issue', 0.5], ['problem', 0.6],
|
|
44
|
+
['difficult', 0.55], ['hard', 0.45], ['slow', 0.5], ['delay', 0.55],
|
|
45
|
+
['fail', 0.7], ['stop', 0.4], ['block', 0.55],
|
|
46
|
+
]);
|
|
47
|
+
function scoreWordList(text, wordList) {
|
|
48
|
+
let score = 0;
|
|
49
|
+
for (const [word, weight] of wordList) {
|
|
50
|
+
if (text.includes(word))
|
|
51
|
+
score += weight;
|
|
52
|
+
}
|
|
53
|
+
return Math.min(score, 3.0); // cap
|
|
54
|
+
}
|
|
55
|
+
export function scoreEmotion(text) {
|
|
56
|
+
const lower = text.toLowerCase();
|
|
57
|
+
const scores = {
|
|
58
|
+
excited: scoreWordList(lower, EXCITED_WORDS),
|
|
59
|
+
proud: scoreWordList(lower, PROUD_WORDS),
|
|
60
|
+
curious: scoreWordList(lower, CURIOUS_WORDS),
|
|
61
|
+
frustrated: scoreWordList(lower, FRUSTRATED_WORDS),
|
|
62
|
+
anxious: scoreWordList(lower, ANXIOUS_WORDS),
|
|
63
|
+
positive: scoreWordList(lower, POSITIVE_WORDS),
|
|
64
|
+
negative: scoreWordList(lower, NEGATIVE_WORDS),
|
|
65
|
+
};
|
|
66
|
+
// Compute valence (-1 to +1)
|
|
67
|
+
const totalPositive = scores.excited + scores.proud + scores.curious + scores.positive;
|
|
68
|
+
const totalNegative = scores.frustrated + scores.anxious + scores.negative;
|
|
69
|
+
const valence = totalPositive > 0 || totalNegative > 0
|
|
70
|
+
? (totalPositive - totalNegative) / (totalPositive + totalNegative + 0.001)
|
|
71
|
+
: 0;
|
|
72
|
+
// Arousal (0 to 1)
|
|
73
|
+
const arousal = Math.min(1.0, (scores.excited + scores.frustrated + scores.anxious) / 3);
|
|
74
|
+
// Determine dominant tone
|
|
75
|
+
const candidates = [
|
|
76
|
+
['excited', scores.excited],
|
|
77
|
+
['proud', scores.proud],
|
|
78
|
+
['curious', scores.curious],
|
|
79
|
+
['frustrated', scores.frustrated],
|
|
80
|
+
['anxious', scores.anxious],
|
|
81
|
+
];
|
|
82
|
+
const [bestTone, bestScore] = candidates.reduce((best, curr) => curr[1] > best[1] ? curr : best, ['neutral', 0]);
|
|
83
|
+
const THRESHOLD = 0.5;
|
|
84
|
+
let tone;
|
|
85
|
+
let confidence;
|
|
86
|
+
if (bestScore >= THRESHOLD) {
|
|
87
|
+
tone = bestTone;
|
|
88
|
+
confidence = Math.min(0.95, bestScore / 3);
|
|
89
|
+
}
|
|
90
|
+
else if (valence > 0.2) {
|
|
91
|
+
tone = 'neutral_positive';
|
|
92
|
+
confidence = 0.4 + valence * 0.3;
|
|
93
|
+
}
|
|
94
|
+
else if (valence < -0.2) {
|
|
95
|
+
tone = 'neutral_negative';
|
|
96
|
+
confidence = 0.4 + Math.abs(valence) * 0.3;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
tone = 'neutral';
|
|
100
|
+
confidence = 0.5;
|
|
101
|
+
}
|
|
102
|
+
return { tone, confidence, valence, arousal };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Summarize emotional trajectory across a sequence of memories (oldest → newest)
|
|
106
|
+
*/
|
|
107
|
+
export function emotionalTrajectory(tones) {
|
|
108
|
+
if (tones.length === 0)
|
|
109
|
+
return 'unknown';
|
|
110
|
+
if (tones.length === 1)
|
|
111
|
+
return tones[0];
|
|
112
|
+
const positiveSet = new Set(['excited', 'proud', 'neutral_positive']);
|
|
113
|
+
const negativeSet = new Set(['frustrated', 'anxious', 'neutral_negative']);
|
|
114
|
+
const scores = tones.map(t => positiveSet.has(t) ? 1 : negativeSet.has(t) ? -1 : 0);
|
|
115
|
+
const first = scores.slice(0, Math.ceil(scores.length / 2));
|
|
116
|
+
const last = scores.slice(Math.floor(scores.length / 2));
|
|
117
|
+
const avgFirst = first.reduce((a, b) => a + b, 0) / first.length;
|
|
118
|
+
const avgLast = last.reduce((a, b) => a + b, 0) / last.length;
|
|
119
|
+
const delta = avgLast - avgFirst;
|
|
120
|
+
if (delta > 0.3)
|
|
121
|
+
return 'positive_trend';
|
|
122
|
+
if (delta < -0.3)
|
|
123
|
+
return 'negative_trend';
|
|
124
|
+
if (avgLast > 0.3)
|
|
125
|
+
return 'consistently_positive';
|
|
126
|
+
if (avgLast < -0.3)
|
|
127
|
+
return 'consistently_negative';
|
|
128
|
+
return 'mixed';
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=emotions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emotions.js","sourceRoot":"","sources":["../../src/analysis/emotions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,0BAA0B;AAC1B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAiB;IAC5C,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC;IAC3E,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC;IAC3E,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC;IACjF,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC;CACrD,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAiB;IAC1C,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC;IAC/E,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC;IACxE,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;IAC7E,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAiB;IAC5C,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC;IAC1E,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC;IAC/E,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC;IACrF,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC;CACjC,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAiB;IAC/C,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC;IAC3E,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC;IAC7E,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;IACnE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IAClE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC;CAC7C,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAiB;IAC5C,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACvE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC;IAClE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC;IAChF,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC;CACrE,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAiB;IAC7C,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC;IAC5E,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACnE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;CACxD,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAiB;IAC7C,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC;IAC9D,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;IACnE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;CAC9C,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,IAAY,EAAE,QAA6B;IAChE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,MAAM,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAEjC,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC;QAC5C,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC;QACxC,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC;QAC5C,UAAU,EAAE,aAAa,CAAC,KAAK,EAAE,gBAAgB,CAAC;QAClD,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC;QAC5C,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC;QAC9C,QAAQ,EAAE,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC;KAC/C,CAAC;IAEF,6BAA6B;IAC7B,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;IACvF,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3E,MAAM,OAAO,GAAG,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC;QACpD,CAAC,CAAC,CAAC,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,GAAG,aAAa,GAAG,KAAK,CAAC;QAC3E,CAAC,CAAC,CAAC,CAAC;IAEN,mBAAmB;IACnB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAEzF,0BAA0B;IAC1B,MAAM,UAAU,GAAmC;QACjD,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC;QAC3B,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;QACvB,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC;QAC3B,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC;QACjC,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC;KAC5B,CAAC;IAEF,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,UAAU,CAAC,MAAM,CAC7C,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAC/C,CAAC,SAAS,EAAE,CAAC,CAAwC,CACtD,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,CAAC;IAEtB,IAAI,IAAmB,CAAC;IACxB,IAAI,UAAkB,CAAC;IAEvB,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,GAAG,QAAyB,CAAC;QACjC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;QACzB,IAAI,GAAG,kBAAkB,CAAC;QAC1B,UAAU,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC;IACnC,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC;QAC1B,IAAI,GAAG,kBAAkB,CAAC;QAC1B,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,SAAS,CAAC;QACjB,UAAU,GAAG,GAAG,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAsB;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAE,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACrF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAgB,CAAC,YAAY,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAE1F,MAAM,MAAM,GAAa,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACrC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACrD,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAEzD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAE9D,MAAM,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IAEjC,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,gBAAgB,CAAC;IACzC,IAAI,KAAK,GAAG,CAAC,GAAG;QAAE,OAAO,gBAAgB,CAAC;IAC1C,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,uBAAuB,CAAC;IAClD,IAAI,OAAO,GAAG,CAAC,GAAG;QAAE,OAAO,uBAAuB,CAAC;IACnD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight regex-based NER — no LLM required.
|
|
3
|
+
* Extracts entities with type classification and confidence scores.
|
|
4
|
+
*/
|
|
5
|
+
export interface ExtractedEntity {
|
|
6
|
+
name: string;
|
|
7
|
+
type: EntityType;
|
|
8
|
+
confidence: number;
|
|
9
|
+
}
|
|
10
|
+
export type EntityType = 'person' | 'project' | 'technology' | 'concept' | 'location' | 'unknown';
|
|
11
|
+
export declare function extractEntities(text: string): ExtractedEntity[];
|
|
12
|
+
/**
|
|
13
|
+
* Map entity type to a relation name for graph storage
|
|
14
|
+
*/
|
|
15
|
+
export declare function entityRelation(type: EntityType): string;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight regex-based NER — no LLM required.
|
|
3
|
+
* Extracts entities with type classification and confidence scores.
|
|
4
|
+
*/
|
|
5
|
+
// Words that appear capitalized but are not entities
|
|
6
|
+
const STOP_WORDS = new Set([
|
|
7
|
+
'I', 'The', 'A', 'An', 'It', 'This', 'That', 'These', 'Those', 'My', 'Your',
|
|
8
|
+
'His', 'Her', 'Our', 'Their', 'We', 'You', 'He', 'She', 'They', 'Is', 'Are',
|
|
9
|
+
'Was', 'Were', 'Be', 'Been', 'Being', 'Have', 'Has', 'Had', 'Do', 'Does', 'Did',
|
|
10
|
+
'Will', 'Would', 'Could', 'Should', 'May', 'Might', 'Must', 'Can', 'Shall',
|
|
11
|
+
'Not', 'No', 'Yes', 'Ok', 'Okay', 'So', 'But', 'And', 'Or', 'If', 'When',
|
|
12
|
+
'Where', 'What', 'Which', 'Who', 'Whose', 'How', 'Why', 'Then', 'Now', 'Just',
|
|
13
|
+
'Also', 'Both', 'Each', 'Few', 'More', 'Most', 'Other', 'Some', 'Such', 'Than',
|
|
14
|
+
'Too', 'Very', 'With', 'As', 'At', 'By', 'For', 'From', 'In', 'Of', 'On',
|
|
15
|
+
'To', 'Up', 'After', 'Before', 'Between', 'Into', 'Through', 'During', 'Above',
|
|
16
|
+
'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday',
|
|
17
|
+
'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
|
|
18
|
+
'September', 'October', 'November', 'December',
|
|
19
|
+
]);
|
|
20
|
+
// Heuristics for person names: common English name patterns
|
|
21
|
+
const PERSON_CONTEXT_WORDS = ['said', 'told', 'asked', 'mentioned', 'wants', 'needs',
|
|
22
|
+
'thinks', 'believes', 'loves', 'hates', 'created', 'built', 'wrote', 'emailed',
|
|
23
|
+
'called', 'texted', 'messaged'];
|
|
24
|
+
// Tech/project signal words
|
|
25
|
+
const TECH_SUFFIXES = ['js', 'ts', 'py', 'db', 'ai', 'ml', 'ui', 'api', 'sdk', 'cli',
|
|
26
|
+
'mcp', 'gpt', 'llm'];
|
|
27
|
+
const TECH_CONTEXT_WORDS = ['using', 'built with', 'runs on', 'framework', 'library',
|
|
28
|
+
'package', 'repo', 'github', 'npm', 'deployed', 'version', 'model'];
|
|
29
|
+
// Location signals
|
|
30
|
+
const LOCATION_CONTEXT = ['in', 'at', 'from', 'near', 'to', 'city', 'state', 'country'];
|
|
31
|
+
export function extractEntities(text) {
|
|
32
|
+
const entities = new Map();
|
|
33
|
+
const lower = text.toLowerCase();
|
|
34
|
+
// --- Pass 1: CamelCase identifiers (GovScout, GitNexus, OpenAI, MemoryDB) ---
|
|
35
|
+
const camelPattern = /\b([A-Z][a-z]+(?:[A-Z][a-z0-9]+)+)\b/g;
|
|
36
|
+
let m;
|
|
37
|
+
while ((m = camelPattern.exec(text)) !== null) {
|
|
38
|
+
const name = m[1];
|
|
39
|
+
if (!STOP_WORDS.has(name)) {
|
|
40
|
+
const type = classifyCamel(name, lower);
|
|
41
|
+
upsert(entities, name, type, 0.90);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// --- Pass 2: Multi-word proper nouns (Jeff Smith, New York, Federal Aviation) ---
|
|
45
|
+
const multiWordPattern = /\b([A-Z][a-z]{1,20}(?:\s[A-Z][a-z]{1,20}){1,3})\b/g;
|
|
46
|
+
while ((m = multiWordPattern.exec(text)) !== null) {
|
|
47
|
+
const name = m[1];
|
|
48
|
+
const words = name.split(' ');
|
|
49
|
+
if (words.every(w => !STOP_WORDS.has(w))) {
|
|
50
|
+
const type = classifyMultiWord(name, lower);
|
|
51
|
+
upsert(entities, name, type, 0.88);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// --- Pass 3: Single capitalized proper nouns (not at sentence start) ---
|
|
55
|
+
const singlePattern = /(?<=[.!?]\s{1,2}|^|\n)(?![A-Z]).*?\b([A-Z][a-z]{2,15})\b/g;
|
|
56
|
+
// Simpler: find capitalized words that aren't the first word of a sentence
|
|
57
|
+
const sentences = text.split(/(?<=[.!?])\s+/);
|
|
58
|
+
for (const sentence of sentences) {
|
|
59
|
+
// Skip first word of each sentence, check the rest
|
|
60
|
+
const words = sentence.trim().split(/\s+/);
|
|
61
|
+
for (let i = 1; i < words.length; i++) {
|
|
62
|
+
const word = words[i].replace(/[^A-Za-z]/g, '');
|
|
63
|
+
if (word.length >= 3 && /^[A-Z][a-z]{2,}$/.test(word) && !STOP_WORDS.has(word)) {
|
|
64
|
+
const type = classifySingle(word, lower);
|
|
65
|
+
if (type !== 'unknown') {
|
|
66
|
+
upsert(entities, word, type, 0.70);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// --- Pass 4: @mentions and #tags ---
|
|
72
|
+
const mentionPattern = /@([A-Za-z][A-Za-z0-9_-]{1,30})/g;
|
|
73
|
+
while ((m = mentionPattern.exec(text)) !== null) {
|
|
74
|
+
upsert(entities, m[1], 'person', 0.92);
|
|
75
|
+
}
|
|
76
|
+
const tagPattern = /#([A-Za-z][A-Za-z0-9_-]{1,30})/g;
|
|
77
|
+
while ((m = tagPattern.exec(text)) !== null) {
|
|
78
|
+
upsert(entities, m[1], 'concept', 0.85);
|
|
79
|
+
}
|
|
80
|
+
// --- Pass 5: Version strings (v1.2.3, v0.7.0-alpha) ---
|
|
81
|
+
const versionPattern = /\b(v\d+\.\d+(?:\.\d+)?(?:-[a-z]+)?)\b/gi;
|
|
82
|
+
while ((m = versionPattern.exec(text)) !== null) {
|
|
83
|
+
upsert(entities, m[1].toLowerCase(), 'technology', 0.80);
|
|
84
|
+
}
|
|
85
|
+
// Boost confidence for entities that appear multiple times
|
|
86
|
+
for (const [name, entity] of entities) {
|
|
87
|
+
const count = countOccurrences(lower, name.toLowerCase());
|
|
88
|
+
if (count > 1) {
|
|
89
|
+
entities.set(name, { ...entity, confidence: Math.min(0.99, entity.confidence + count * 0.02) });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return Array.from(entities.values())
|
|
93
|
+
.sort((a, b) => b.confidence - a.confidence)
|
|
94
|
+
.slice(0, 20); // cap at 20 entities per memory
|
|
95
|
+
}
|
|
96
|
+
function upsert(map, name, type, confidence) {
|
|
97
|
+
const existing = map.get(name);
|
|
98
|
+
if (!existing || existing.confidence < confidence) {
|
|
99
|
+
map.set(name, { name, type, confidence });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function classifyCamel(name, context) {
|
|
103
|
+
const lower = name.toLowerCase();
|
|
104
|
+
// Common tech suffixes
|
|
105
|
+
if (TECH_SUFFIXES.some(s => lower.endsWith(s)) || lower.includes('db') || lower.includes('api')) {
|
|
106
|
+
return 'technology';
|
|
107
|
+
}
|
|
108
|
+
// Common project patterns
|
|
109
|
+
if (lower.includes('scout') || lower.includes('nexus') || lower.includes('gram') ||
|
|
110
|
+
lower.includes('claw') || lower.includes('brain') || lower.includes('hub')) {
|
|
111
|
+
return 'project';
|
|
112
|
+
}
|
|
113
|
+
// If mentioned near tech context words
|
|
114
|
+
if (TECH_CONTEXT_WORDS.some(w => context.includes(w)))
|
|
115
|
+
return 'technology';
|
|
116
|
+
return 'project'; // CamelCase is most likely a project/product
|
|
117
|
+
}
|
|
118
|
+
function classifyMultiWord(name, context) {
|
|
119
|
+
const lower = name.toLowerCase();
|
|
120
|
+
const idx = context.indexOf(lower);
|
|
121
|
+
if (idx === -1)
|
|
122
|
+
return 'unknown';
|
|
123
|
+
const before = context.slice(Math.max(0, idx - 30), idx);
|
|
124
|
+
const after = context.slice(idx + lower.length, idx + lower.length + 30);
|
|
125
|
+
const window = before + ' ' + after;
|
|
126
|
+
if (PERSON_CONTEXT_WORDS.some(w => window.includes(w)))
|
|
127
|
+
return 'person';
|
|
128
|
+
if (LOCATION_CONTEXT.some(w => before.trim().endsWith(w)))
|
|
129
|
+
return 'location';
|
|
130
|
+
if (TECH_CONTEXT_WORDS.some(w => window.includes(w)))
|
|
131
|
+
return 'technology';
|
|
132
|
+
// Two capitalized words with common first names = person
|
|
133
|
+
const words = name.split(' ');
|
|
134
|
+
if (words.length === 2 && isLikelyFirstName(words[0]))
|
|
135
|
+
return 'person';
|
|
136
|
+
return 'concept';
|
|
137
|
+
}
|
|
138
|
+
function classifySingle(word, context) {
|
|
139
|
+
const lower = word.toLowerCase();
|
|
140
|
+
const idx = context.indexOf(lower);
|
|
141
|
+
if (idx === -1)
|
|
142
|
+
return 'unknown';
|
|
143
|
+
const before = context.slice(Math.max(0, idx - 20), idx);
|
|
144
|
+
const after = context.slice(idx + lower.length, idx + lower.length + 20);
|
|
145
|
+
const window = before + ' ' + after;
|
|
146
|
+
if (PERSON_CONTEXT_WORDS.some(w => window.includes(w)))
|
|
147
|
+
return 'person';
|
|
148
|
+
if (LOCATION_CONTEXT.some(w => before.trim().endsWith(w)))
|
|
149
|
+
return 'location';
|
|
150
|
+
// Known tech names
|
|
151
|
+
if (['react', 'sqlite', 'postgres', 'docker', 'redis', 'python', 'typescript',
|
|
152
|
+
'claude', 'openai', 'ollama', 'qdrant'].includes(lower))
|
|
153
|
+
return 'technology';
|
|
154
|
+
return 'unknown'; // single words are too ambiguous without stronger signals
|
|
155
|
+
}
|
|
156
|
+
function isLikelyFirstName(word) {
|
|
157
|
+
// Very basic - common short English first names pattern
|
|
158
|
+
return word.length >= 2 && word.length <= 12 && /^[A-Z][a-z]+$/.test(word);
|
|
159
|
+
}
|
|
160
|
+
function countOccurrences(text, term) {
|
|
161
|
+
let count = 0;
|
|
162
|
+
let pos = 0;
|
|
163
|
+
while ((pos = text.indexOf(term, pos)) !== -1) {
|
|
164
|
+
count++;
|
|
165
|
+
pos += term.length;
|
|
166
|
+
}
|
|
167
|
+
return count;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Map entity type to a relation name for graph storage
|
|
171
|
+
*/
|
|
172
|
+
export function entityRelation(type) {
|
|
173
|
+
switch (type) {
|
|
174
|
+
case 'person': return 'involves_person';
|
|
175
|
+
case 'project': return 'mentions_project';
|
|
176
|
+
case 'technology': return 'uses_technology';
|
|
177
|
+
case 'location': return 'located_in';
|
|
178
|
+
case 'concept': return 'relates_to_concept';
|
|
179
|
+
default: return 'related_to';
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=entities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/analysis/entities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyword-based theme detection.
|
|
3
|
+
* Scores text against ~25 predefined theme categories.
|
|
4
|
+
*/
|
|
5
|
+
export interface DetectedTheme {
|
|
6
|
+
name: string;
|
|
7
|
+
score: number;
|
|
8
|
+
matched_keywords: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function detectThemes(text: string, topN?: number): DetectedTheme[];
|
|
11
|
+
export declare function themeNames(text: string, topN?: number): string[];
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyword-based theme detection.
|
|
3
|
+
* Scores text against ~25 predefined theme categories.
|
|
4
|
+
*/
|
|
5
|
+
const THEMES = [
|
|
6
|
+
{
|
|
7
|
+
name: 'product_development',
|
|
8
|
+
keywords: ['feature', 'roadmap', 'sprint', 'release', 'launch', 'v1', 'mvp',
|
|
9
|
+
'product', 'backlog', 'milestone', 'prototype', 'beta', 'alpha', 'iterate',
|
|
10
|
+
'user story', 'requirement', 'scope', 'build', 'ship'],
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'federal_contracting',
|
|
14
|
+
keywords: ['sam.gov', 'gsa', 'solicitation', 'proposal', 'far', 'dfars', 'naics',
|
|
15
|
+
'rfp', 'rfi', 'sources sought', 'contract', 'federal', 'government', 'dod',
|
|
16
|
+
'cage code', 'uei', 'set-aside', 'small business', 'prime contractor'],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'technical_infrastructure',
|
|
20
|
+
keywords: ['deploy', 'server', 'database', 'api', 'docker', 'kubernetes', 'cloud',
|
|
21
|
+
'aws', 'gcp', 'azure', 'ci/cd', 'pipeline', 'devops', 'infrastructure',
|
|
22
|
+
'microservice', 'nginx', 'redis', 'postgres', 'sqlite', 'migration'],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'ai_ml',
|
|
26
|
+
keywords: ['model', 'llm', 'embedding', 'fine-tune', 'inference', 'training',
|
|
27
|
+
'prompt', 'rag', 'vector', 'semantic', 'claude', 'gpt', 'openai', 'anthropic',
|
|
28
|
+
'transformer', 'neural', 'dataset', 'benchmark', 'evaluation', 'agent'],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'competitive_analysis',
|
|
32
|
+
keywords: ['competitor', 'competition', 'market', 'pricing', 'alternative',
|
|
33
|
+
'comparison', 'vs', 'versus', 'better than', 'advantage', 'disadvantage',
|
|
34
|
+
'feature gap', 'differentiate', 'moat', 'positioning'],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'personal_growth',
|
|
38
|
+
keywords: ['learn', 'improve', 'goal', 'habit', 'practice', 'skill', 'growth',
|
|
39
|
+
'develop', 'progress', 'achieve', 'challenge', 'overcome', 'mindset',
|
|
40
|
+
'discipline', 'focus', 'productivity', 'routine'],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'business_strategy',
|
|
44
|
+
keywords: ['strategy', 'vision', 'mission', 'kpi', 'revenue', 'monetize',
|
|
45
|
+
'customer', 'market fit', 'pivot', 'scale', 'growth', 'acquisition',
|
|
46
|
+
'retention', 'churn', 'ltv', 'cac', 'burn rate', 'runway', 'fundraise'],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'relationships',
|
|
50
|
+
keywords: ['friend', 'family', 'partner', 'colleague', 'team', 'client',
|
|
51
|
+
'conversation', 'meeting', 'call', 'email', 'message', 'relationship',
|
|
52
|
+
'trust', 'conflict', 'collaboration', 'work with'],
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'health_wellness',
|
|
56
|
+
keywords: ['health', 'exercise', 'workout', 'diet', 'sleep', 'stress',
|
|
57
|
+
'mental health', 'wellness', 'keto', 'nutrition', 'calories', 'weight',
|
|
58
|
+
'anxiety', 'therapy', 'medication', 'doctor', 'energy'],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'financial',
|
|
62
|
+
keywords: ['money', 'budget', 'expense', 'income', 'invoice', 'payment',
|
|
63
|
+
'invest', 'savings', 'debt', 'tax', 'profit', 'loss', 'cash flow',
|
|
64
|
+
'cost', 'price', 'fee', 'rate', 'salary'],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'research',
|
|
68
|
+
keywords: ['research', 'study', 'paper', 'arxiv', 'publication', 'experiment',
|
|
69
|
+
'hypothesis', 'data', 'analysis', 'finding', 'result', 'benchmark',
|
|
70
|
+
'literature', 'review', 'investigate', 'explore'],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'creative_work',
|
|
74
|
+
keywords: ['design', 'write', 'create', 'art', 'music', 'photo', 'video',
|
|
75
|
+
'creative', 'story', 'content', 'brand', 'figma', 'ui', 'ux',
|
|
76
|
+
'visual', 'aesthetic', 'prototype'],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'planning',
|
|
80
|
+
keywords: ['plan', 'schedule', 'calendar', 'deadline', 'timeline', 'next week',
|
|
81
|
+
'tomorrow', 'today', 'priority', 'todo', 'task', 'agenda', 'prepare',
|
|
82
|
+
'organize', 'session', 'meeting'],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'learning',
|
|
86
|
+
keywords: ['read', 'book', 'course', 'tutorial', 'video', 'podcast', 'article',
|
|
87
|
+
'documentation', 'learn', 'understand', 'study', 'knowledge', 'educate'],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'emotional_processing',
|
|
91
|
+
keywords: ['feel', 'feeling', 'emotion', 'frustrated', 'happy', 'sad', 'anxious',
|
|
92
|
+
'excited', 'worried', 'overwhelmed', 'proud', 'disappointed', 'grateful',
|
|
93
|
+
'stressed', 'relieved', 'angry', 'upset', 'calm'],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'debugging',
|
|
97
|
+
keywords: ['bug', 'error', 'fix', 'issue', 'problem', 'crash', 'fail', 'broken',
|
|
98
|
+
'debug', 'trace', 'log', 'exception', 'stack trace', 'reproduce', 'patch'],
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'knowledge_management',
|
|
102
|
+
keywords: ['note', 'memory', 'remember', 'document', 'obsidian', 'notion',
|
|
103
|
+
'wiki', 'knowledge base', 'archive', 'organize', 'tag', 'search',
|
|
104
|
+
'recall', 'retrieve', 'store'],
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'mcp_integration',
|
|
108
|
+
keywords: ['mcp', 'model context protocol', 'tool', 'server', 'client',
|
|
109
|
+
'stdio', 'sse', 'plugin', 'integration', 'connect', 'invoke'],
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'security',
|
|
113
|
+
keywords: ['auth', 'authentication', 'authorization', 'token', 'secret',
|
|
114
|
+
'credential', 'password', 'oauth', 'jwt', 'permission', 'rbac',
|
|
115
|
+
'vulnerability', 'security', 'encrypt', 'ssl', 'https'],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: 'bootstrapped',
|
|
119
|
+
keywords: ['bootstrap', 'indie', 'solo', 'self-funded', 'founder', 'startup',
|
|
120
|
+
'side project', 'saas', 'launch', 'revenue', 'customer'],
|
|
121
|
+
},
|
|
122
|
+
];
|
|
123
|
+
const MIN_THEME_SCORE = 0.15;
|
|
124
|
+
export function detectThemes(text, topN = 3) {
|
|
125
|
+
const lower = text.toLowerCase();
|
|
126
|
+
const wordCount = lower.split(/\s+/).length;
|
|
127
|
+
const scored = [];
|
|
128
|
+
for (const theme of THEMES) {
|
|
129
|
+
const matched = [];
|
|
130
|
+
for (const kw of theme.keywords) {
|
|
131
|
+
if (lower.includes(kw))
|
|
132
|
+
matched.push(kw);
|
|
133
|
+
}
|
|
134
|
+
if (matched.length === 0)
|
|
135
|
+
continue;
|
|
136
|
+
// Score = matched / total keywords, boosted by keyword density
|
|
137
|
+
const rawScore = matched.length / theme.keywords.length;
|
|
138
|
+
const density = matched.length / Math.max(wordCount / 10, 1);
|
|
139
|
+
const score = Math.min(1.0, rawScore * 0.6 + density * 0.4);
|
|
140
|
+
if (score >= MIN_THEME_SCORE) {
|
|
141
|
+
scored.push({ name: theme.name, score, matched_keywords: matched });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return scored
|
|
145
|
+
.sort((a, b) => b.score - a.score)
|
|
146
|
+
.slice(0, topN);
|
|
147
|
+
}
|
|
148
|
+
export function themeNames(text, topN = 3) {
|
|
149
|
+
return detectThemes(text, topN).map(t => t.name);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=themes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"themes.js","sourceRoot":"","sources":["../../src/analysis/themes.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
package/dist/client.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Engram } from '@cartisien/engram';
|
|
2
|
+
import { mkdir } from 'fs/promises';
|
|
3
|
+
import { dirname } from 'path';
|
|
4
|
+
import { loadConfig } from './config.js';
|
|
5
|
+
let instance = null;
|
|
6
|
+
export async function getEngram() {
|
|
7
|
+
if (instance)
|
|
8
|
+
return instance;
|
|
9
|
+
const config = loadConfig();
|
|
10
|
+
// Ensure DB directory exists
|
|
11
|
+
if (config.dbPath !== ':memory:') {
|
|
12
|
+
await mkdir(dirname(config.dbPath), { recursive: true });
|
|
13
|
+
}
|
|
14
|
+
instance = new Engram({
|
|
15
|
+
dbPath: config.dbPath,
|
|
16
|
+
embeddingUrl: config.embeddingUrl,
|
|
17
|
+
embeddingModel: config.embeddingModel,
|
|
18
|
+
maxContextLength: config.maxContextLength,
|
|
19
|
+
dedupThreshold: config.dedupThreshold,
|
|
20
|
+
enableWAL: config.enableWAL,
|
|
21
|
+
graphMemory: true,
|
|
22
|
+
enableFTS5: true,
|
|
23
|
+
semanticSearch: config.semanticSearch,
|
|
24
|
+
});
|
|
25
|
+
await instance.init();
|
|
26
|
+
return instance;
|
|
27
|
+
}
|
|
28
|
+
export function defaultSession() {
|
|
29
|
+
return loadConfig().sessionId;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,IAAI,QAAQ,GAAkB,IAAI,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,6BAA6B;IAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,QAAQ,GAAG,IAAI,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC,CAAC;IAEH,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,EAAE,CAAC,SAAS,CAAC;AAChC,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface McpConfig {
|
|
2
|
+
dbPath: string;
|
|
3
|
+
sessionId: string;
|
|
4
|
+
embeddingUrl: string;
|
|
5
|
+
embeddingModel: string;
|
|
6
|
+
embeddingProvider: string;
|
|
7
|
+
maxContextLength: number;
|
|
8
|
+
dedupThreshold: number;
|
|
9
|
+
enableWAL: boolean;
|
|
10
|
+
graphMemory: boolean;
|
|
11
|
+
semanticSearch: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function loadConfig(): McpConfig;
|