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.
Files changed (86) hide show
  1. package/.eslintrc.json +22 -0
  2. package/.github/workflows/ci.yml +57 -0
  3. package/.prettierrc +8 -0
  4. package/README.md +197 -0
  5. package/dist/config.d.ts +20 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +41 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/contextBuilder.d.ts +16 -0
  10. package/dist/contextBuilder.d.ts.map +1 -0
  11. package/dist/contextBuilder.js +139 -0
  12. package/dist/contextBuilder.js.map +1 -0
  13. package/dist/index.d.ts +45 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +88 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/licensing.d.ts +45 -0
  18. package/dist/licensing.d.ts.map +1 -0
  19. package/dist/licensing.js +99 -0
  20. package/dist/licensing.js.map +1 -0
  21. package/dist/memoryManager.d.ts +35 -0
  22. package/dist/memoryManager.d.ts.map +1 -0
  23. package/dist/memoryManager.js +265 -0
  24. package/dist/memoryManager.js.map +1 -0
  25. package/dist/metadataStore.d.ts +24 -0
  26. package/dist/metadataStore.d.ts.map +1 -0
  27. package/dist/metadataStore.js +247 -0
  28. package/dist/metadataStore.js.map +1 -0
  29. package/dist/planManager.d.ts +80 -0
  30. package/dist/planManager.d.ts.map +1 -0
  31. package/dist/planManager.js +327 -0
  32. package/dist/planManager.js.map +1 -0
  33. package/dist/rateLimiter.d.ts +49 -0
  34. package/dist/rateLimiter.d.ts.map +1 -0
  35. package/dist/rateLimiter.js +142 -0
  36. package/dist/rateLimiter.js.map +1 -0
  37. package/dist/storage/index.d.ts +3 -0
  38. package/dist/storage/index.d.ts.map +1 -0
  39. package/dist/storage/index.js +3 -0
  40. package/dist/storage/index.js.map +1 -0
  41. package/dist/storage/postgres.d.ts +31 -0
  42. package/dist/storage/postgres.d.ts.map +1 -0
  43. package/dist/storage/postgres.js +171 -0
  44. package/dist/storage/postgres.js.map +1 -0
  45. package/dist/storage/redis.d.ts +34 -0
  46. package/dist/storage/redis.d.ts.map +1 -0
  47. package/dist/storage/redis.js +101 -0
  48. package/dist/storage/redis.js.map +1 -0
  49. package/dist/types.d.ts +95 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +2 -0
  52. package/dist/types.js.map +1 -0
  53. package/dist/usageTracker.d.ts +63 -0
  54. package/dist/usageTracker.d.ts.map +1 -0
  55. package/dist/usageTracker.js +238 -0
  56. package/dist/usageTracker.js.map +1 -0
  57. package/dist/vectorStore.d.ts +18 -0
  58. package/dist/vectorStore.d.ts.map +1 -0
  59. package/dist/vectorStore.js +97 -0
  60. package/dist/vectorStore.js.map +1 -0
  61. package/examples/advanced.ts +164 -0
  62. package/examples/basic.ts +87 -0
  63. package/package.json +60 -0
  64. package/src/config.ts +65 -0
  65. package/src/contextBuilder.ts +184 -0
  66. package/src/index.ts +209 -0
  67. package/src/licensing.ts +138 -0
  68. package/src/memoryManager.ts +340 -0
  69. package/src/metadataStore.ts +298 -0
  70. package/src/planManager.ts +417 -0
  71. package/src/rateLimiter.ts +186 -0
  72. package/src/storage/index.ts +2 -0
  73. package/src/storage/postgres.ts +209 -0
  74. package/src/storage/redis.ts +117 -0
  75. package/src/types.ts +114 -0
  76. package/src/usageTracker.ts +325 -0
  77. package/src/vectorStore.ts +116 -0
  78. package/tests/aibrain.test.ts +171 -0
  79. package/tests/contextBuilder.test.ts +138 -0
  80. package/tests/memoryManager.test.ts +205 -0
  81. package/tests/metadataStore.test.ts +131 -0
  82. package/tests/rateLimiter.test.ts +57 -0
  83. package/tests/usageTracker.test.ts +62 -0
  84. package/tests/vectorStore.test.ts +106 -0
  85. package/tsconfig.json +25 -0
  86. package/vitest.config.ts +12 -0
@@ -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":"AAAA,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,UAAU,GAClB,cAAc,GACd,MAAM,GACN,YAAY,GACZ,aAAa,GACb,SAAS,GACT,QAAQ,CAAC;AAEb,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,OAAO,CAAC;KAC5B,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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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"}