aimemory-core 1.0.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/.eslintrc.json +22 -0
- package/.github/workflows/ci.yml +57 -0
- package/.prettierrc +8 -0
- package/README.md +197 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +41 -0
- package/dist/config.js.map +1 -0
- package/dist/contextBuilder.d.ts +16 -0
- package/dist/contextBuilder.d.ts.map +1 -0
- package/dist/contextBuilder.js +139 -0
- package/dist/contextBuilder.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/licensing.d.ts +45 -0
- package/dist/licensing.d.ts.map +1 -0
- package/dist/licensing.js +99 -0
- package/dist/licensing.js.map +1 -0
- package/dist/memoryManager.d.ts +35 -0
- package/dist/memoryManager.d.ts.map +1 -0
- package/dist/memoryManager.js +265 -0
- package/dist/memoryManager.js.map +1 -0
- package/dist/metadataStore.d.ts +24 -0
- package/dist/metadataStore.d.ts.map +1 -0
- package/dist/metadataStore.js +247 -0
- package/dist/metadataStore.js.map +1 -0
- package/dist/planManager.d.ts +80 -0
- package/dist/planManager.d.ts.map +1 -0
- package/dist/planManager.js +327 -0
- package/dist/planManager.js.map +1 -0
- package/dist/rateLimiter.d.ts +49 -0
- package/dist/rateLimiter.d.ts.map +1 -0
- package/dist/rateLimiter.js +142 -0
- package/dist/rateLimiter.js.map +1 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/postgres.d.ts +31 -0
- package/dist/storage/postgres.d.ts.map +1 -0
- package/dist/storage/postgres.js +171 -0
- package/dist/storage/postgres.js.map +1 -0
- package/dist/storage/redis.d.ts +34 -0
- package/dist/storage/redis.d.ts.map +1 -0
- package/dist/storage/redis.js +101 -0
- package/dist/storage/redis.js.map +1 -0
- package/dist/types.d.ts +95 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/usageTracker.d.ts +63 -0
- package/dist/usageTracker.d.ts.map +1 -0
- package/dist/usageTracker.js +238 -0
- package/dist/usageTracker.js.map +1 -0
- package/dist/vectorStore.d.ts +18 -0
- package/dist/vectorStore.d.ts.map +1 -0
- package/dist/vectorStore.js +97 -0
- package/dist/vectorStore.js.map +1 -0
- package/examples/advanced.ts +164 -0
- package/examples/basic.ts +87 -0
- package/package.json +60 -0
- package/src/config.ts +65 -0
- package/src/contextBuilder.ts +184 -0
- package/src/index.ts +209 -0
- package/src/licensing.ts +138 -0
- package/src/memoryManager.ts +340 -0
- package/src/metadataStore.ts +298 -0
- package/src/planManager.ts +417 -0
- package/src/rateLimiter.ts +186 -0
- package/src/storage/index.ts +2 -0
- package/src/storage/postgres.ts +209 -0
- package/src/storage/redis.ts +117 -0
- package/src/types.ts +114 -0
- package/src/usageTracker.ts +325 -0
- package/src/vectorStore.ts +116 -0
- package/tests/aibrain.test.ts +171 -0
- package/tests/contextBuilder.test.ts +138 -0
- package/tests/memoryManager.test.ts +205 -0
- package/tests/metadataStore.test.ts +131 -0
- package/tests/rateLimiter.test.ts +57 -0
- package/tests/usageTracker.test.ts +62 -0
- package/tests/vectorStore.test.ts +106 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +12 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export interface Memory {
|
|
2
|
+
id: string;
|
|
3
|
+
content: string;
|
|
4
|
+
embedding?: number[];
|
|
5
|
+
timestamp: number;
|
|
6
|
+
metadata: MemoryMetadata;
|
|
7
|
+
}
|
|
8
|
+
export interface MemoryMetadata {
|
|
9
|
+
type: MemoryType;
|
|
10
|
+
importance: number;
|
|
11
|
+
tags: string[];
|
|
12
|
+
userId?: string;
|
|
13
|
+
sessionId?: string;
|
|
14
|
+
source?: string;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export type MemoryType = 'conversation' | 'fact' | 'preference' | 'instruction' | 'context' | 'custom';
|
|
18
|
+
export interface SearchResult {
|
|
19
|
+
memory: Memory;
|
|
20
|
+
score: number;
|
|
21
|
+
}
|
|
22
|
+
export interface MemoryQuery {
|
|
23
|
+
text?: string;
|
|
24
|
+
embedding?: number[];
|
|
25
|
+
filter?: MemoryFilter;
|
|
26
|
+
limit?: number;
|
|
27
|
+
threshold?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface MemoryFilter {
|
|
30
|
+
types?: MemoryType[];
|
|
31
|
+
tags?: string[];
|
|
32
|
+
userId?: string;
|
|
33
|
+
sessionId?: string;
|
|
34
|
+
startDate?: number;
|
|
35
|
+
endDate?: number;
|
|
36
|
+
minImportance?: number;
|
|
37
|
+
maxImportance?: number;
|
|
38
|
+
metadata?: Record<string, unknown>;
|
|
39
|
+
}
|
|
40
|
+
export interface MemoryStats {
|
|
41
|
+
totalMemories: number;
|
|
42
|
+
memoriesByType: Record<MemoryType, number>;
|
|
43
|
+
memoriesByTag: Record<string, number>;
|
|
44
|
+
oldestMemory: number;
|
|
45
|
+
newestMemory: number;
|
|
46
|
+
}
|
|
47
|
+
export interface ContextConfig {
|
|
48
|
+
maxTokens: number;
|
|
49
|
+
includeSystemPrompt: boolean;
|
|
50
|
+
systemPrompt?: string;
|
|
51
|
+
relevanceThreshold: number;
|
|
52
|
+
includeMetadata: boolean;
|
|
53
|
+
memoryTypes: MemoryType[];
|
|
54
|
+
maxMemories: number;
|
|
55
|
+
}
|
|
56
|
+
export interface ContextMessage {
|
|
57
|
+
role: 'system' | 'user' | 'assistant';
|
|
58
|
+
content: string;
|
|
59
|
+
}
|
|
60
|
+
export interface ContextResult {
|
|
61
|
+
messages: ContextMessage[];
|
|
62
|
+
memories: Memory[];
|
|
63
|
+
stats: {
|
|
64
|
+
memoriesUsed: number;
|
|
65
|
+
tokensEstimated: number;
|
|
66
|
+
truncationApplied: boolean;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export interface EmbeddingFunction {
|
|
70
|
+
(text: string): Promise<number[]>;
|
|
71
|
+
}
|
|
72
|
+
export interface StorageAdapter {
|
|
73
|
+
save(key: string, data: unknown): Promise<void>;
|
|
74
|
+
load(key: string): Promise<unknown | null>;
|
|
75
|
+
delete(key: string): Promise<void>;
|
|
76
|
+
exists(key: string): Promise<boolean>;
|
|
77
|
+
list(prefix: string): Promise<string[]>;
|
|
78
|
+
}
|
|
79
|
+
export interface VectorStoreAdapter {
|
|
80
|
+
add(vectors: VectorEntry[]): Promise<void>;
|
|
81
|
+
search(query: number[], options: SearchOptions): Promise<SearchResult[]>;
|
|
82
|
+
delete(ids: string[]): Promise<void>;
|
|
83
|
+
getById(id: string): Promise<VectorEntry | null>;
|
|
84
|
+
}
|
|
85
|
+
export interface VectorEntry {
|
|
86
|
+
id: string;
|
|
87
|
+
vector: number[];
|
|
88
|
+
metadata: Record<string, unknown>;
|
|
89
|
+
}
|
|
90
|
+
export interface SearchOptions {
|
|
91
|
+
limit: number;
|
|
92
|
+
threshold?: number;
|
|
93
|
+
filter?: Record<string, unknown>;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export type UsageMetric = 'memories_added' | 'memories_searched' | 'context_built' | 'api_calls' | 'storage_used';
|
|
2
|
+
export interface UsageRecord {
|
|
3
|
+
userId: string;
|
|
4
|
+
date: string;
|
|
5
|
+
metrics: Record<UsageMetric, number>;
|
|
6
|
+
}
|
|
7
|
+
export interface UsageSummary {
|
|
8
|
+
userId: string;
|
|
9
|
+
period: 'daily' | 'monthly' | 'yearly';
|
|
10
|
+
startDate: Date;
|
|
11
|
+
endDate: Date;
|
|
12
|
+
metrics: Record<UsageMetric, number>;
|
|
13
|
+
totalOperations: number;
|
|
14
|
+
}
|
|
15
|
+
export interface UsageLimits {
|
|
16
|
+
maxMemories: number;
|
|
17
|
+
maxSearchPerDay: number;
|
|
18
|
+
maxContextPerDay: number;
|
|
19
|
+
maxApiCallsPerDay: number;
|
|
20
|
+
maxStorageMB: number;
|
|
21
|
+
}
|
|
22
|
+
export interface UsageCheckResult {
|
|
23
|
+
allowed: boolean;
|
|
24
|
+
metric: UsageMetric;
|
|
25
|
+
current: number;
|
|
26
|
+
limit: number;
|
|
27
|
+
remaining: number;
|
|
28
|
+
resetDate: Date;
|
|
29
|
+
}
|
|
30
|
+
export interface UsageStore {
|
|
31
|
+
get(userId: string, date: string): Promise<UsageRecord | null>;
|
|
32
|
+
set(userId: string, date: string, record: UsageRecord): Promise<void>;
|
|
33
|
+
increment(userId: string, metric: UsageMetric, amount?: number): Promise<void>;
|
|
34
|
+
getRange(userId: string, startDate: string, endDate: string): Promise<UsageRecord[]>;
|
|
35
|
+
reset(userId: string, date: string): Promise<void>;
|
|
36
|
+
deleteUser(userId: string): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
export declare class InMemoryUsageStore implements UsageStore {
|
|
39
|
+
private store;
|
|
40
|
+
private getKey;
|
|
41
|
+
get(userId: string, date: string): Promise<UsageRecord | null>;
|
|
42
|
+
set(userId: string, date: string, record: UsageRecord): Promise<void>;
|
|
43
|
+
increment(userId: string, metric: UsageMetric, amount?: number): Promise<void>;
|
|
44
|
+
getRange(userId: string, startDate: string, endDate: string): Promise<UsageRecord[]>;
|
|
45
|
+
reset(userId: string, date: string): Promise<void>;
|
|
46
|
+
deleteUser(userId: string): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
export declare class UsageTracker {
|
|
49
|
+
private store;
|
|
50
|
+
private limits;
|
|
51
|
+
constructor(limits: UsageLimits, store?: UsageStore);
|
|
52
|
+
checkLimit(userId: string, metric: UsageMetric): Promise<UsageCheckResult>;
|
|
53
|
+
recordUsage(userId: string, metric: UsageMetric, amount?: number): Promise<UsageCheckResult>;
|
|
54
|
+
getUsageSummary(userId: string, period: 'daily' | 'monthly' | 'yearly'): Promise<UsageSummary>;
|
|
55
|
+
getAllUsage(userId: string): Promise<Record<UsageMetric, number>>;
|
|
56
|
+
private getLimitForMetric;
|
|
57
|
+
updateLimits(limits: Partial<UsageLimits>): void;
|
|
58
|
+
resetUser(userId: string): Promise<void>;
|
|
59
|
+
resetDay(userId: string): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
export declare const DEFAULT_USAGE_LIMITS: Record<string, UsageLimits>;
|
|
62
|
+
export declare function createUsageTracker(plan?: string, store?: UsageStore): UsageTracker;
|
|
63
|
+
//# sourceMappingURL=usageTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usageTracker.d.ts","sourceRoot":"","sources":["../src/usageTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
export class InMemoryUsageStore {
|
|
2
|
+
store = new Map();
|
|
3
|
+
getKey(userId, date) {
|
|
4
|
+
return `${userId}:${date}`;
|
|
5
|
+
}
|
|
6
|
+
async get(userId, date) {
|
|
7
|
+
const userMap = this.store.get(userId);
|
|
8
|
+
if (!userMap)
|
|
9
|
+
return null;
|
|
10
|
+
return userMap.get(date) || null;
|
|
11
|
+
}
|
|
12
|
+
async set(userId, date, record) {
|
|
13
|
+
if (!this.store.has(userId)) {
|
|
14
|
+
this.store.set(userId, new Map());
|
|
15
|
+
}
|
|
16
|
+
this.store.get(userId).set(date, record);
|
|
17
|
+
}
|
|
18
|
+
async increment(userId, metric, amount = 1) {
|
|
19
|
+
const today = new Date().toISOString().split('T')[0];
|
|
20
|
+
if (!this.store.has(userId)) {
|
|
21
|
+
this.store.set(userId, new Map());
|
|
22
|
+
}
|
|
23
|
+
const userMap = this.store.get(userId);
|
|
24
|
+
let record = userMap.get(today);
|
|
25
|
+
if (!record) {
|
|
26
|
+
record = {
|
|
27
|
+
userId,
|
|
28
|
+
date: today,
|
|
29
|
+
metrics: {
|
|
30
|
+
memories_added: 0,
|
|
31
|
+
memories_searched: 0,
|
|
32
|
+
context_built: 0,
|
|
33
|
+
api_calls: 0,
|
|
34
|
+
storage_used: 0,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
record.metrics[metric] = (record.metrics[metric] || 0) + amount;
|
|
39
|
+
userMap.set(today, record);
|
|
40
|
+
}
|
|
41
|
+
async getRange(userId, startDate, endDate) {
|
|
42
|
+
const userMap = this.store.get(userId);
|
|
43
|
+
if (!userMap)
|
|
44
|
+
return [];
|
|
45
|
+
const results = [];
|
|
46
|
+
const start = new Date(startDate);
|
|
47
|
+
const end = new Date(endDate);
|
|
48
|
+
for (const record of userMap.values()) {
|
|
49
|
+
const recordDate = new Date(record.date);
|
|
50
|
+
if (recordDate >= start && recordDate <= end) {
|
|
51
|
+
results.push(record);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return results;
|
|
55
|
+
}
|
|
56
|
+
async reset(userId, date) {
|
|
57
|
+
const userMap = this.store.get(userId);
|
|
58
|
+
if (userMap) {
|
|
59
|
+
userMap.delete(date);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async deleteUser(userId) {
|
|
63
|
+
this.store.delete(userId);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export class UsageTracker {
|
|
67
|
+
store;
|
|
68
|
+
limits;
|
|
69
|
+
constructor(limits, store) {
|
|
70
|
+
this.limits = limits;
|
|
71
|
+
this.store = store || new InMemoryUsageStore();
|
|
72
|
+
}
|
|
73
|
+
async checkLimit(userId, metric) {
|
|
74
|
+
const today = new Date().toISOString().split('T')[0];
|
|
75
|
+
const record = await this.store.get(userId, today);
|
|
76
|
+
const current = record?.metrics[metric] || 0;
|
|
77
|
+
const limit = this.getLimitForMetric(metric);
|
|
78
|
+
const remaining = Math.max(0, limit - current);
|
|
79
|
+
const now = new Date();
|
|
80
|
+
const resetDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1);
|
|
81
|
+
return {
|
|
82
|
+
allowed: current < limit,
|
|
83
|
+
metric,
|
|
84
|
+
current,
|
|
85
|
+
limit,
|
|
86
|
+
remaining,
|
|
87
|
+
resetDate,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async recordUsage(userId, metric, amount = 1) {
|
|
91
|
+
const checkResult = await this.checkLimit(userId, metric);
|
|
92
|
+
if (!checkResult.allowed) {
|
|
93
|
+
return checkResult;
|
|
94
|
+
}
|
|
95
|
+
await this.store.increment(userId, metric, amount);
|
|
96
|
+
return this.checkLimit(userId, metric);
|
|
97
|
+
}
|
|
98
|
+
async getUsageSummary(userId, period) {
|
|
99
|
+
const now = new Date();
|
|
100
|
+
let startDate;
|
|
101
|
+
let endDate = now;
|
|
102
|
+
switch (period) {
|
|
103
|
+
case 'daily':
|
|
104
|
+
startDate = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
105
|
+
break;
|
|
106
|
+
case 'monthly':
|
|
107
|
+
startDate = new Date(now.getFullYear(), now.getMonth(), 1);
|
|
108
|
+
break;
|
|
109
|
+
case 'yearly':
|
|
110
|
+
startDate = new Date(now.getFullYear(), 0, 1);
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
const records = await this.store.getRange(userId, startDate.toISOString().split('T')[0], endDate.toISOString().split('T')[0]);
|
|
114
|
+
const metrics = {
|
|
115
|
+
memories_added: 0,
|
|
116
|
+
memories_searched: 0,
|
|
117
|
+
context_built: 0,
|
|
118
|
+
api_calls: 0,
|
|
119
|
+
storage_used: 0,
|
|
120
|
+
};
|
|
121
|
+
let totalOperations = 0;
|
|
122
|
+
for (const record of records) {
|
|
123
|
+
for (const [key, value] of Object.entries(record.metrics)) {
|
|
124
|
+
metrics[key] += value;
|
|
125
|
+
totalOperations += value;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
userId,
|
|
130
|
+
period,
|
|
131
|
+
startDate,
|
|
132
|
+
endDate,
|
|
133
|
+
metrics,
|
|
134
|
+
totalOperations,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
async getAllUsage(userId) {
|
|
138
|
+
const summary = await this.getUsageSummary(userId, 'monthly');
|
|
139
|
+
return summary.metrics;
|
|
140
|
+
}
|
|
141
|
+
getLimitForMetric(metric) {
|
|
142
|
+
switch (metric) {
|
|
143
|
+
case 'memories_added':
|
|
144
|
+
return this.limits.maxMemories;
|
|
145
|
+
case 'memories_searched':
|
|
146
|
+
return this.limits.maxSearchPerDay;
|
|
147
|
+
case 'context_built':
|
|
148
|
+
return this.limits.maxContextPerDay;
|
|
149
|
+
case 'api_calls':
|
|
150
|
+
return this.limits.maxApiCallsPerDay;
|
|
151
|
+
case 'storage_used':
|
|
152
|
+
return this.limits.maxStorageMB;
|
|
153
|
+
default:
|
|
154
|
+
return 0;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
updateLimits(limits) {
|
|
158
|
+
this.limits = { ...this.limits, ...limits };
|
|
159
|
+
}
|
|
160
|
+
async resetUser(userId) {
|
|
161
|
+
await this.store.deleteUser(userId);
|
|
162
|
+
}
|
|
163
|
+
async resetDay(userId) {
|
|
164
|
+
const today = new Date().toISOString().split('T')[0];
|
|
165
|
+
await this.store.reset(userId, today);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
export const DEFAULT_USAGE_LIMITS = {
|
|
169
|
+
// NPM & Extension Free
|
|
170
|
+
free: {
|
|
171
|
+
maxMemories: 5000,
|
|
172
|
+
maxSearchPerDay: 500,
|
|
173
|
+
maxContextPerDay: 200,
|
|
174
|
+
maxApiCallsPerDay: 5000,
|
|
175
|
+
maxStorageMB: 50,
|
|
176
|
+
},
|
|
177
|
+
// Extension Starter
|
|
178
|
+
starter: {
|
|
179
|
+
maxMemories: 30000,
|
|
180
|
+
maxSearchPerDay: 1000,
|
|
181
|
+
maxContextPerDay: 500,
|
|
182
|
+
maxApiCallsPerDay: 10000,
|
|
183
|
+
maxStorageMB: 100,
|
|
184
|
+
},
|
|
185
|
+
// NPM Pro
|
|
186
|
+
pro: {
|
|
187
|
+
maxMemories: 50000,
|
|
188
|
+
maxSearchPerDay: 10000,
|
|
189
|
+
maxContextPerDay: 5000,
|
|
190
|
+
maxApiCallsPerDay: 100000,
|
|
191
|
+
maxStorageMB: 500,
|
|
192
|
+
},
|
|
193
|
+
// Extension Plus
|
|
194
|
+
plus: {
|
|
195
|
+
maxMemories: 150000,
|
|
196
|
+
maxSearchPerDay: 5000,
|
|
197
|
+
maxContextPerDay: 2000,
|
|
198
|
+
maxApiCallsPerDay: 50000,
|
|
199
|
+
maxStorageMB: 250,
|
|
200
|
+
},
|
|
201
|
+
// Extension Premium
|
|
202
|
+
premium: {
|
|
203
|
+
maxMemories: -1,
|
|
204
|
+
maxSearchPerDay: -1,
|
|
205
|
+
maxContextPerDay: -1,
|
|
206
|
+
maxApiCallsPerDay: -1,
|
|
207
|
+
maxStorageMB: -1,
|
|
208
|
+
},
|
|
209
|
+
// Team
|
|
210
|
+
team: {
|
|
211
|
+
maxMemories: 500000,
|
|
212
|
+
maxSearchPerDay: 100000,
|
|
213
|
+
maxContextPerDay: 50000,
|
|
214
|
+
maxApiCallsPerDay: 1000000,
|
|
215
|
+
maxStorageMB: 5000,
|
|
216
|
+
},
|
|
217
|
+
// Business
|
|
218
|
+
business: {
|
|
219
|
+
maxMemories: 2000000,
|
|
220
|
+
maxSearchPerDay: 500000,
|
|
221
|
+
maxContextPerDay: 200000,
|
|
222
|
+
maxApiCallsPerDay: 5000000,
|
|
223
|
+
maxStorageMB: 20000,
|
|
224
|
+
},
|
|
225
|
+
// Enterprise
|
|
226
|
+
enterprise: {
|
|
227
|
+
maxMemories: -1,
|
|
228
|
+
maxSearchPerDay: -1,
|
|
229
|
+
maxContextPerDay: -1,
|
|
230
|
+
maxApiCallsPerDay: -1,
|
|
231
|
+
maxStorageMB: -1,
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
export function createUsageTracker(plan = 'free', store) {
|
|
235
|
+
const limits = DEFAULT_USAGE_LIMITS[plan] || DEFAULT_USAGE_LIMITS.free;
|
|
236
|
+
return new UsageTracker(limits, store);
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=usageTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usageTracker.js","sourceRoot":"","sources":["../src/usageTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { VectorStoreAdapter, VectorEntry, SearchOptions, SearchResult } from './types.js';
|
|
2
|
+
export declare class InMemoryVectorStore implements VectorStoreAdapter {
|
|
3
|
+
private vectors;
|
|
4
|
+
private dimension;
|
|
5
|
+
constructor(dimension?: number);
|
|
6
|
+
add(entries: VectorEntry[]): Promise<void>;
|
|
7
|
+
search(query: number[], options: SearchOptions): Promise<SearchResult[]>;
|
|
8
|
+
delete(ids: string[]): Promise<void>;
|
|
9
|
+
getById(id: string): Promise<VectorEntry | null>;
|
|
10
|
+
getAll(): Promise<VectorEntry[]>;
|
|
11
|
+
clear(): Promise<void>;
|
|
12
|
+
size(): Promise<number>;
|
|
13
|
+
private cosineSimilarity;
|
|
14
|
+
}
|
|
15
|
+
export declare class VectorStoreFactory {
|
|
16
|
+
static create(dimension?: number): VectorStoreAdapter;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=vectorStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorStore.d.ts","sourceRoot":"","sources":["../src/vectorStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAU,MAAM,YAAY,CAAC;AAElG,qBAAa,mBAAoB,YAAW,kBAAkB;IAC5D,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,GAAE,MAAa;IAI9B,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAqCxE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAUhD,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAQhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAI7B,OAAO,CAAC,gBAAgB;CAiBzB;AAED,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,MAAM,CAAC,SAAS,GAAE,MAAa,GAAG,kBAAkB;CAG5D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export class InMemoryVectorStore {
|
|
2
|
+
vectors = new Map();
|
|
3
|
+
dimension;
|
|
4
|
+
constructor(dimension = 1536) {
|
|
5
|
+
this.dimension = dimension;
|
|
6
|
+
}
|
|
7
|
+
async add(entries) {
|
|
8
|
+
for (const entry of entries) {
|
|
9
|
+
if (!entry.vector || entry.vector.length !== this.dimension) {
|
|
10
|
+
throw new Error(`Invalid vector dimension. Expected ${this.dimension}, got ${entry.vector?.length || 0}`);
|
|
11
|
+
}
|
|
12
|
+
this.vectors.set(entry.id, {
|
|
13
|
+
id: entry.id,
|
|
14
|
+
vector: [...entry.vector],
|
|
15
|
+
metadata: { ...entry.metadata },
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async search(query, options) {
|
|
20
|
+
if (query.length !== this.dimension) {
|
|
21
|
+
throw new Error(`Invalid query dimension. Expected ${this.dimension}, got ${query.length}`);
|
|
22
|
+
}
|
|
23
|
+
const results = [];
|
|
24
|
+
const { limit, threshold, filter } = options;
|
|
25
|
+
for (const entry of this.vectors.values()) {
|
|
26
|
+
if (filter) {
|
|
27
|
+
const matchesFilter = Object.entries(filter).every(([key, value]) => entry.metadata[key] === value);
|
|
28
|
+
if (!matchesFilter)
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const score = this.cosineSimilarity(query, entry.vector);
|
|
32
|
+
if (threshold !== undefined && score < threshold) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
results.push({
|
|
36
|
+
memory: {
|
|
37
|
+
id: entry.id,
|
|
38
|
+
content: entry.metadata.content || '',
|
|
39
|
+
timestamp: entry.metadata.timestamp || Date.now(),
|
|
40
|
+
metadata: entry.metadata,
|
|
41
|
+
},
|
|
42
|
+
score,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
results.sort((a, b) => b.score - a.score);
|
|
46
|
+
return results.slice(0, limit);
|
|
47
|
+
}
|
|
48
|
+
async delete(ids) {
|
|
49
|
+
for (const id of ids) {
|
|
50
|
+
this.vectors.delete(id);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async getById(id) {
|
|
54
|
+
const entry = this.vectors.get(id);
|
|
55
|
+
if (!entry)
|
|
56
|
+
return null;
|
|
57
|
+
return {
|
|
58
|
+
id: entry.id,
|
|
59
|
+
vector: [...entry.vector],
|
|
60
|
+
metadata: { ...entry.metadata },
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
async getAll() {
|
|
64
|
+
return Array.from(this.vectors.values()).map(entry => ({
|
|
65
|
+
id: entry.id,
|
|
66
|
+
vector: [...entry.vector],
|
|
67
|
+
metadata: { ...entry.metadata },
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
async clear() {
|
|
71
|
+
this.vectors.clear();
|
|
72
|
+
}
|
|
73
|
+
async size() {
|
|
74
|
+
return this.vectors.size;
|
|
75
|
+
}
|
|
76
|
+
cosineSimilarity(a, b) {
|
|
77
|
+
if (a.length !== b.length)
|
|
78
|
+
return 0;
|
|
79
|
+
let dotProduct = 0;
|
|
80
|
+
let normA = 0;
|
|
81
|
+
let normB = 0;
|
|
82
|
+
for (let i = 0; i < a.length; i++) {
|
|
83
|
+
dotProduct += a[i] * b[i];
|
|
84
|
+
normA += a[i] * a[i];
|
|
85
|
+
normB += b[i] * b[i];
|
|
86
|
+
}
|
|
87
|
+
if (normA === 0 || normB === 0)
|
|
88
|
+
return 0;
|
|
89
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export class VectorStoreFactory {
|
|
93
|
+
static create(dimension = 1536) {
|
|
94
|
+
return new InMemoryVectorStore(dimension);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=vectorStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorStore.js","sourceRoot":"","sources":["../src/vectorStore.ts"],"names":[],"mappings":"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"}
|