@cmdoss/memwal-sdk 0.6.2 → 0.8.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/ARCHITECTURE.md +547 -547
- package/BENCHMARKS.md +238 -238
- package/README.md +310 -181
- package/dist/ai-sdk/tools.d.ts +2 -2
- package/dist/ai-sdk/tools.js +2 -2
- package/dist/client/ClientMemoryManager.js +2 -2
- package/dist/client/ClientMemoryManager.js.map +1 -1
- package/dist/client/PersonalDataWallet.d.ts.map +1 -1
- package/dist/client/SimplePDWClient.d.ts +29 -1
- package/dist/client/SimplePDWClient.d.ts.map +1 -1
- package/dist/client/SimplePDWClient.js +45 -13
- package/dist/client/SimplePDWClient.js.map +1 -1
- package/dist/client/namespaces/EmbeddingsNamespace.d.ts +1 -1
- package/dist/client/namespaces/EmbeddingsNamespace.js +1 -1
- package/dist/client/namespaces/MemoryNamespace.d.ts +31 -0
- package/dist/client/namespaces/MemoryNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/MemoryNamespace.js +272 -39
- package/dist/client/namespaces/MemoryNamespace.js.map +1 -1
- package/dist/client/namespaces/consolidated/AINamespace.d.ts +2 -2
- package/dist/client/namespaces/consolidated/AINamespace.js +2 -2
- package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts +12 -2
- package/dist/client/namespaces/consolidated/BlockchainNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/consolidated/BlockchainNamespace.js +62 -4
- package/dist/client/namespaces/consolidated/BlockchainNamespace.js.map +1 -1
- package/dist/client/namespaces/consolidated/StorageNamespace.d.ts +67 -2
- package/dist/client/namespaces/consolidated/StorageNamespace.d.ts.map +1 -1
- package/dist/client/namespaces/consolidated/StorageNamespace.js +549 -16
- package/dist/client/namespaces/consolidated/StorageNamespace.js.map +1 -1
- package/dist/config/ConfigurationHelper.js +61 -61
- package/dist/config/defaults.js +2 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/graph/GraphService.js +21 -21
- package/dist/graph/GraphService.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/seal/EncryptionService.d.ts +9 -5
- package/dist/infrastructure/seal/EncryptionService.d.ts.map +1 -1
- package/dist/infrastructure/seal/EncryptionService.js +37 -15
- package/dist/infrastructure/seal/EncryptionService.js.map +1 -1
- package/dist/infrastructure/seal/SealService.d.ts +13 -5
- package/dist/infrastructure/seal/SealService.d.ts.map +1 -1
- package/dist/infrastructure/seal/SealService.js +36 -34
- package/dist/infrastructure/seal/SealService.js.map +1 -1
- package/dist/langchain/createPDWRAG.js +30 -30
- package/dist/retrieval/MemoryDecryptionPipeline.d.ts.map +1 -1
- package/dist/retrieval/MemoryDecryptionPipeline.js +2 -1
- package/dist/retrieval/MemoryDecryptionPipeline.js.map +1 -1
- package/dist/retrieval/MemoryRetrievalService.d.ts +31 -0
- package/dist/retrieval/MemoryRetrievalService.d.ts.map +1 -1
- package/dist/retrieval/MemoryRetrievalService.js +44 -4
- package/dist/retrieval/MemoryRetrievalService.js.map +1 -1
- package/dist/services/CapabilityService.d.ts.map +1 -1
- package/dist/services/CapabilityService.js +30 -14
- package/dist/services/CapabilityService.js.map +1 -1
- package/dist/services/CrossContextPermissionService.d.ts.map +1 -1
- package/dist/services/CrossContextPermissionService.js +9 -7
- package/dist/services/CrossContextPermissionService.js.map +1 -1
- package/dist/services/EmbeddingService.d.ts +28 -1
- package/dist/services/EmbeddingService.d.ts.map +1 -1
- package/dist/services/EmbeddingService.js +54 -0
- package/dist/services/EmbeddingService.js.map +1 -1
- package/dist/services/EncryptionService.d.ts.map +1 -1
- package/dist/services/EncryptionService.js +6 -5
- package/dist/services/EncryptionService.js.map +1 -1
- package/dist/services/GeminiAIService.js +309 -309
- package/dist/services/IndexManager.d.ts +5 -1
- package/dist/services/IndexManager.d.ts.map +1 -1
- package/dist/services/IndexManager.js +17 -40
- package/dist/services/IndexManager.js.map +1 -1
- package/dist/services/QueryService.js +1 -1
- package/dist/services/QueryService.js.map +1 -1
- package/dist/services/StorageService.d.ts +11 -0
- package/dist/services/StorageService.d.ts.map +1 -1
- package/dist/services/StorageService.js +73 -10
- package/dist/services/StorageService.js.map +1 -1
- package/dist/services/TransactionService.d.ts +20 -0
- package/dist/services/TransactionService.d.ts.map +1 -1
- package/dist/services/TransactionService.js +43 -0
- package/dist/services/TransactionService.js.map +1 -1
- package/dist/services/ViewService.js +2 -2
- package/dist/services/ViewService.js.map +1 -1
- package/dist/services/storage/QuiltBatchManager.d.ts +101 -1
- package/dist/services/storage/QuiltBatchManager.d.ts.map +1 -1
- package/dist/services/storage/QuiltBatchManager.js +410 -20
- package/dist/services/storage/QuiltBatchManager.js.map +1 -1
- package/dist/services/storage/index.d.ts +1 -1
- package/dist/services/storage/index.d.ts.map +1 -1
- package/dist/services/storage/index.js.map +1 -1
- package/dist/utils/LRUCache.d.ts +106 -0
- package/dist/utils/LRUCache.d.ts.map +1 -0
- package/dist/utils/LRUCache.js +281 -0
- package/dist/utils/LRUCache.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/memoryIndexOnChain.d.ts +212 -0
- package/dist/utils/memoryIndexOnChain.d.ts.map +1 -0
- package/dist/utils/memoryIndexOnChain.js +312 -0
- package/dist/utils/memoryIndexOnChain.js.map +1 -0
- package/dist/utils/rebuildIndexNode.d.ts +29 -0
- package/dist/utils/rebuildIndexNode.d.ts.map +1 -1
- package/dist/utils/rebuildIndexNode.js +366 -98
- package/dist/utils/rebuildIndexNode.js.map +1 -1
- package/dist/vector/HnswWasmService.d.ts +20 -5
- package/dist/vector/HnswWasmService.d.ts.map +1 -1
- package/dist/vector/HnswWasmService.js +73 -40
- package/dist/vector/HnswWasmService.js.map +1 -1
- package/dist/vector/IHnswService.d.ts +10 -1
- package/dist/vector/IHnswService.d.ts.map +1 -1
- package/dist/vector/IHnswService.js.map +1 -1
- package/dist/vector/NodeHnswService.d.ts +16 -0
- package/dist/vector/NodeHnswService.d.ts.map +1 -1
- package/dist/vector/NodeHnswService.js +84 -5
- package/dist/vector/NodeHnswService.js.map +1 -1
- package/dist/vector/createHnswService.d.ts +1 -1
- package/dist/vector/createHnswService.js +1 -1
- package/dist/vector/index.d.ts +1 -1
- package/dist/vector/index.js +1 -1
- package/package.json +157 -157
- package/src/access/PermissionService.ts +635 -635
- package/src/aggregation/AggregationService.ts +389 -389
- package/src/ai-sdk/PDWVectorStore.ts +715 -715
- package/src/ai-sdk/index.ts +65 -65
- package/src/ai-sdk/tools.ts +460 -460
- package/src/ai-sdk/types.ts +404 -404
- package/src/batch/BatchManager.ts +597 -597
- package/src/batch/BatchingService.ts +429 -429
- package/src/batch/MemoryProcessingCache.ts +492 -492
- package/src/batch/index.ts +30 -30
- package/src/browser.ts +200 -200
- package/src/client/ClientMemoryManager.ts +987 -987
- package/src/client/PersonalDataWallet.ts +345 -345
- package/src/client/SimplePDWClient.ts +1289 -1222
- package/src/client/factory.ts +154 -154
- package/src/client/namespaces/AnalyticsNamespace.ts +377 -377
- package/src/client/namespaces/BatchNamespace.ts +356 -356
- package/src/client/namespaces/CacheNamespace.ts +123 -123
- package/src/client/namespaces/CapabilityNamespace.ts +217 -217
- package/src/client/namespaces/ClassifyNamespace.ts +169 -169
- package/src/client/namespaces/ContextNamespace.ts +297 -297
- package/src/client/namespaces/EmbeddingsNamespace.ts +99 -99
- package/src/client/namespaces/EncryptionNamespace.ts +221 -221
- package/src/client/namespaces/GraphNamespace.ts +468 -468
- package/src/client/namespaces/IndexNamespace.ts +361 -361
- package/src/client/namespaces/MemoryNamespace.ts +1422 -1135
- package/src/client/namespaces/PermissionsNamespace.ts +254 -254
- package/src/client/namespaces/PipelineNamespace.ts +220 -220
- package/src/client/namespaces/SearchNamespace.ts +1049 -1049
- package/src/client/namespaces/StorageNamespace.ts +458 -458
- package/src/client/namespaces/TxNamespace.ts +260 -260
- package/src/client/namespaces/WalletNamespace.ts +243 -243
- package/src/client/namespaces/consolidated/AINamespace.ts +449 -449
- package/src/client/namespaces/consolidated/BlockchainNamespace.ts +607 -546
- package/src/client/namespaces/consolidated/SecurityNamespace.ts +648 -648
- package/src/client/namespaces/consolidated/StorageNamespace.ts +1141 -497
- package/src/client/namespaces/consolidated/index.ts +39 -39
- package/src/client/signers/KeypairSigner.ts +108 -108
- package/src/client/signers/UnifiedSigner.ts +110 -110
- package/src/client/signers/WalletAdapterSigner.ts +159 -159
- package/src/client/signers/index.ts +26 -26
- package/src/config/ConfigurationHelper.ts +412 -412
- package/src/config/defaults.ts +51 -51
- package/src/config/index.ts +8 -8
- package/src/config/validation.ts +70 -70
- package/src/core/index.ts +14 -14
- package/src/core/interfaces/IService.ts +307 -307
- package/src/core/interfaces/index.ts +8 -8
- package/src/core/types/capability.ts +297 -297
- package/src/core/types/index.ts +870 -870
- package/src/core/types/wallet.ts +270 -270
- package/src/core/types.ts +9 -9
- package/src/core/wallet.ts +222 -222
- package/src/embedding/index.ts +19 -19
- package/src/embedding/types.ts +357 -357
- package/src/errors/index.ts +602 -602
- package/src/errors/recovery.ts +461 -461
- package/src/errors/validation.ts +567 -567
- package/src/generated/pdw/capability.ts +319 -319
- package/src/graph/GraphService.ts +887 -887
- package/src/graph/KnowledgeGraphManager.ts +728 -728
- package/src/graph/index.ts +25 -25
- package/src/index.ts +498 -474
- package/src/infrastructure/index.ts +22 -22
- package/src/infrastructure/seal/EncryptionService.ts +628 -603
- package/src/infrastructure/seal/SealService.ts +613 -615
- package/src/infrastructure/seal/index.ts +9 -9
- package/src/infrastructure/sui/BlockchainManager.ts +627 -627
- package/src/infrastructure/sui/SuiService.ts +888 -888
- package/src/infrastructure/sui/index.ts +9 -9
- package/src/infrastructure/walrus/StorageManager.ts +604 -604
- package/src/infrastructure/walrus/WalrusStorageService.ts +612 -612
- package/src/infrastructure/walrus/index.ts +9 -9
- package/src/langchain/PDWEmbeddings.ts +145 -145
- package/src/langchain/PDWVectorStore.ts +456 -456
- package/src/langchain/createPDWRAG.ts +303 -303
- package/src/langchain/index.ts +47 -47
- package/src/permissions/ConsentRepository.browser.ts +249 -249
- package/src/permissions/ConsentRepository.ts +364 -364
- package/src/pipeline/MemoryPipeline.ts +862 -862
- package/src/pipeline/PipelineManager.ts +683 -683
- package/src/pipeline/index.ts +26 -26
- package/src/retrieval/AdvancedSearchService.ts +629 -629
- package/src/retrieval/MemoryAnalyticsService.ts +711 -711
- package/src/retrieval/MemoryDecryptionPipeline.ts +825 -824
- package/src/retrieval/MemoryRetrievalService.ts +904 -830
- package/src/retrieval/index.ts +42 -42
- package/src/services/BatchService.ts +352 -352
- package/src/services/CapabilityService.ts +464 -448
- package/src/services/ClassifierService.ts +465 -465
- package/src/services/CrossContextPermissionService.ts +486 -484
- package/src/services/EmbeddingService.ts +771 -706
- package/src/services/EncryptionService.ts +712 -711
- package/src/services/GeminiAIService.ts +753 -753
- package/src/services/IndexManager.ts +977 -1004
- package/src/services/MemoryIndexService.ts +1003 -1003
- package/src/services/MemoryService.ts +369 -369
- package/src/services/QueryService.ts +890 -890
- package/src/services/StorageService.ts +1182 -1111
- package/src/services/TransactionService.ts +838 -790
- package/src/services/VectorService.ts +462 -462
- package/src/services/ViewService.ts +484 -484
- package/src/services/index.ts +25 -25
- package/src/services/storage/BlobAttributesManager.ts +333 -333
- package/src/services/storage/KnowledgeGraphManager.ts +425 -425
- package/src/services/storage/MemorySearchManager.ts +387 -387
- package/src/services/storage/QuiltBatchManager.ts +1130 -660
- package/src/services/storage/WalrusMetadataManager.ts +268 -268
- package/src/services/storage/WalrusStorageManager.ts +287 -287
- package/src/services/storage/index.ts +57 -52
- package/src/types/index.ts +13 -13
- package/src/utils/LRUCache.ts +378 -0
- package/src/utils/index.ts +76 -68
- package/src/utils/memoryIndexOnChain.ts +507 -0
- package/src/utils/rebuildIndex.ts +290 -290
- package/src/utils/rebuildIndexNode.ts +771 -424
- package/src/vector/BrowserHnswIndexService.ts +758 -758
- package/src/vector/HnswWasmService.ts +731 -679
- package/src/vector/IHnswService.ts +233 -224
- package/src/vector/NodeHnswService.ts +833 -735
- package/src/vector/VectorManager.ts +478 -478
- package/src/vector/createHnswService.ts +135 -135
- package/src/vector/index.ts +56 -56
- package/src/wallet/ContextWalletService.ts +656 -656
- package/src/wallet/MainWalletService.ts +317 -317
|
@@ -1,377 +1,377 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Analytics Namespace - Memory Analytics & Insights
|
|
3
|
-
*
|
|
4
|
-
* Pure delegation to MemoryAnalyticsService for comprehensive analytics.
|
|
5
|
-
* Provides insights, trends, clustering, and recommendations.
|
|
6
|
-
*
|
|
7
|
-
* @module client/namespaces
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { ServiceContainer } from '../SimplePDWClient';
|
|
11
|
-
import type {
|
|
12
|
-
MemoryAnalytics,
|
|
13
|
-
UsagePattern,
|
|
14
|
-
SimilarityCluster,
|
|
15
|
-
MemoryInsights
|
|
16
|
-
} from '../../retrieval/MemoryAnalyticsService';
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Analytics options
|
|
20
|
-
*/
|
|
21
|
-
export interface AnalyticsOptions {
|
|
22
|
-
periodStart?: Date;
|
|
23
|
-
periodEnd?: Date;
|
|
24
|
-
includeForecasting?: boolean;
|
|
25
|
-
includeClustering?: boolean;
|
|
26
|
-
includeInsights?: boolean;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Category distribution
|
|
31
|
-
*/
|
|
32
|
-
export interface CategoryDistribution {
|
|
33
|
-
category: string;
|
|
34
|
-
count: number;
|
|
35
|
-
percentage: number;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Trend data
|
|
40
|
-
*/
|
|
41
|
-
export interface TrendData {
|
|
42
|
-
direction: 'up' | 'down' | 'stable' | 'volatile';
|
|
43
|
-
strength: number;
|
|
44
|
-
forecast?: Array<{ date: Date; predicted: number; confidence: number }>;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Analytics Namespace
|
|
49
|
-
*
|
|
50
|
-
* Handles memory analytics, insights, and visualization data
|
|
51
|
-
*/
|
|
52
|
-
export class AnalyticsNamespace {
|
|
53
|
-
constructor(private services: ServiceContainer) {}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Generate comprehensive analytics report
|
|
57
|
-
*
|
|
58
|
-
* Delegates to: MemoryAnalyticsService.generateMemoryAnalytics()
|
|
59
|
-
*
|
|
60
|
-
* @param options - Analytics options
|
|
61
|
-
* @returns Complete analytics report
|
|
62
|
-
*/
|
|
63
|
-
async generate(options?: AnalyticsOptions): Promise<MemoryAnalytics> {
|
|
64
|
-
if (!this.services.analytics) {
|
|
65
|
-
throw new Error('Analytics service not configured.');
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Get user's memories first
|
|
69
|
-
const memoriesResult = await this.services.viewService?.getUserMemories(
|
|
70
|
-
this.services.config.userAddress
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
const memories = memoriesResult?.data || [];
|
|
74
|
-
|
|
75
|
-
// Convert to UnifiedMemoryResult format
|
|
76
|
-
const unifiedMemories = memories.map((m: any) => ({
|
|
77
|
-
id: m.id,
|
|
78
|
-
category: m.category,
|
|
79
|
-
created: new Date(m.createdAt || Date.now()),
|
|
80
|
-
metadata: {
|
|
81
|
-
size: 0,
|
|
82
|
-
importance: m.importance || 5,
|
|
83
|
-
contentType: 'text',
|
|
84
|
-
tags: m.tags || []
|
|
85
|
-
},
|
|
86
|
-
analytics: {
|
|
87
|
-
viewCount: 0
|
|
88
|
-
}
|
|
89
|
-
}));
|
|
90
|
-
|
|
91
|
-
return await this.services.analytics.generateMemoryAnalytics(
|
|
92
|
-
this.services.config.userAddress,
|
|
93
|
-
unifiedMemories as any,
|
|
94
|
-
options
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Get category distribution
|
|
100
|
-
*
|
|
101
|
-
* Delegates to: MemoryAnalyticsService.generateMemoryAnalytics() → topCategories
|
|
102
|
-
*
|
|
103
|
-
* @returns Category distribution data
|
|
104
|
-
*/
|
|
105
|
-
async categories(): Promise<CategoryDistribution[]> {
|
|
106
|
-
const analytics = await this.generate({ includeInsights: false, includeClustering: false });
|
|
107
|
-
return analytics.topCategories;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Get temporal trends
|
|
112
|
-
*
|
|
113
|
-
* Delegates to: MemoryAnalyticsService.generateMemoryAnalytics() → temporalTrends
|
|
114
|
-
*
|
|
115
|
-
* @returns Trend analysis data
|
|
116
|
-
*/
|
|
117
|
-
async trends(): Promise<{
|
|
118
|
-
creation: TrendData;
|
|
119
|
-
access: TrendData;
|
|
120
|
-
size: TrendData;
|
|
121
|
-
}> {
|
|
122
|
-
const analytics = await this.generate({ includeForecasting: true });
|
|
123
|
-
|
|
124
|
-
return {
|
|
125
|
-
creation: {
|
|
126
|
-
direction: analytics.temporalTrends.creationTrend.direction,
|
|
127
|
-
strength: analytics.temporalTrends.creationTrend.strength,
|
|
128
|
-
forecast: analytics.temporalTrends.creationTrend.forecast
|
|
129
|
-
},
|
|
130
|
-
access: {
|
|
131
|
-
direction: analytics.temporalTrends.accessTrend.direction,
|
|
132
|
-
strength: analytics.temporalTrends.accessTrend.strength,
|
|
133
|
-
forecast: analytics.temporalTrends.accessTrend.forecast
|
|
134
|
-
},
|
|
135
|
-
size: {
|
|
136
|
-
direction: analytics.temporalTrends.sizeTrend.direction,
|
|
137
|
-
strength: analytics.temporalTrends.sizeTrend.strength,
|
|
138
|
-
forecast: analytics.temporalTrends.sizeTrend.forecast
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Get importance distribution
|
|
145
|
-
*
|
|
146
|
-
* Analyzes how memories are distributed by importance level
|
|
147
|
-
*
|
|
148
|
-
* @returns Importance analysis
|
|
149
|
-
*/
|
|
150
|
-
async importance(): Promise<{
|
|
151
|
-
average: number;
|
|
152
|
-
distribution: Record<number, number>;
|
|
153
|
-
highImportance: number;
|
|
154
|
-
lowImportance: number;
|
|
155
|
-
}> {
|
|
156
|
-
const analytics = await this.generate({ includeInsights: false });
|
|
157
|
-
|
|
158
|
-
// Calculate distribution from memories
|
|
159
|
-
const memoriesResult = await this.services.viewService?.getUserMemories(
|
|
160
|
-
this.services.config.userAddress
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
const memories = memoriesResult?.data || [];
|
|
164
|
-
|
|
165
|
-
const distribution: Record<number, number> = {};
|
|
166
|
-
let highCount = 0;
|
|
167
|
-
let lowCount = 0;
|
|
168
|
-
|
|
169
|
-
memories.forEach((m: any) => {
|
|
170
|
-
const imp = m.importance || 5;
|
|
171
|
-
distribution[imp] = (distribution[imp] || 0) + 1;
|
|
172
|
-
|
|
173
|
-
if (imp >= 8) highCount++;
|
|
174
|
-
if (imp <= 3) lowCount++;
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
return {
|
|
178
|
-
average: analytics.averageImportance,
|
|
179
|
-
distribution,
|
|
180
|
-
highImportance: highCount,
|
|
181
|
-
lowImportance: lowCount
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Get temporal patterns
|
|
187
|
-
*
|
|
188
|
-
* Delegates to: MemoryAnalyticsService.analyzeUsagePatterns()
|
|
189
|
-
*
|
|
190
|
-
* @returns Usage patterns by time
|
|
191
|
-
*/
|
|
192
|
-
async temporal(): Promise<UsagePattern[]> {
|
|
193
|
-
const analytics = await this.generate({ includeInsights: false });
|
|
194
|
-
return analytics.usagePatterns;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Get AI-generated insights
|
|
199
|
-
*
|
|
200
|
-
* Delegates to: MemoryAnalyticsService.generateKnowledgeInsights()
|
|
201
|
-
*
|
|
202
|
-
* @returns Knowledge insights and recommendations
|
|
203
|
-
*/
|
|
204
|
-
async insights(): Promise<MemoryInsights> {
|
|
205
|
-
const analytics = await this.generate({ includeInsights: true });
|
|
206
|
-
return analytics.knowledgeInsights;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Detect anomalies in memory patterns
|
|
211
|
-
*
|
|
212
|
-
* Finds unusual patterns or outliers
|
|
213
|
-
*
|
|
214
|
-
* @returns Array of detected anomalies
|
|
215
|
-
*/
|
|
216
|
-
async anomalies(): Promise<Array<{
|
|
217
|
-
date: Date;
|
|
218
|
-
type: 'spike' | 'drop' | 'outlier';
|
|
219
|
-
severity: number;
|
|
220
|
-
description: string;
|
|
221
|
-
}>> {
|
|
222
|
-
const analytics = await this.generate();
|
|
223
|
-
|
|
224
|
-
// Extract anomalies from usage patterns
|
|
225
|
-
const anomalies: Array<{
|
|
226
|
-
date: Date;
|
|
227
|
-
type: 'spike' | 'drop' | 'outlier';
|
|
228
|
-
severity: number;
|
|
229
|
-
description: string;
|
|
230
|
-
}> = [];
|
|
231
|
-
|
|
232
|
-
analytics.usagePatterns.forEach(pattern => {
|
|
233
|
-
pattern.anomalies.forEach(anomaly => {
|
|
234
|
-
anomalies.push({
|
|
235
|
-
date: anomaly.date,
|
|
236
|
-
type: anomaly.type,
|
|
237
|
-
severity: anomaly.severity,
|
|
238
|
-
description: anomaly.possibleCauses?.join(', ') || 'Unknown cause'
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
return anomalies;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Analyze correlations between categories/topics
|
|
248
|
-
*
|
|
249
|
-
* Finds relationships between different memory types
|
|
250
|
-
*
|
|
251
|
-
* @returns Correlation data
|
|
252
|
-
*/
|
|
253
|
-
async correlations(): Promise<Array<{
|
|
254
|
-
concept1: string;
|
|
255
|
-
concept2: string;
|
|
256
|
-
strength: number;
|
|
257
|
-
memoryCount: number;
|
|
258
|
-
}>> {
|
|
259
|
-
const analytics = await this.generate({ includeInsights: true });
|
|
260
|
-
|
|
261
|
-
// Extract from conceptual connections
|
|
262
|
-
return analytics.knowledgeInsights.conceptualConnections.map(conn => ({
|
|
263
|
-
concept1: conn.concept1,
|
|
264
|
-
concept2: conn.concept2,
|
|
265
|
-
strength: conn.connectionStrength,
|
|
266
|
-
memoryCount: conn.bridgeMemories.length
|
|
267
|
-
}));
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Analyze a single memory
|
|
272
|
-
*
|
|
273
|
-
* Get detailed analytics for one memory
|
|
274
|
-
*
|
|
275
|
-
* @param memoryId - Memory ID to analyze
|
|
276
|
-
* @returns Memory-specific analytics
|
|
277
|
-
*/
|
|
278
|
-
async analyze(memoryId: string): Promise<{
|
|
279
|
-
memoryId: string;
|
|
280
|
-
importance: number;
|
|
281
|
-
category: string;
|
|
282
|
-
relatedCount: number;
|
|
283
|
-
clusterInfo?: {
|
|
284
|
-
clusterId: string;
|
|
285
|
-
similarity: number;
|
|
286
|
-
};
|
|
287
|
-
}> {
|
|
288
|
-
// Get memory details
|
|
289
|
-
const memory = await this.services.storage.retrieveMemoryPackage(memoryId);
|
|
290
|
-
|
|
291
|
-
// Decode content if it's Uint8Array
|
|
292
|
-
const content = typeof memory.content === 'string'
|
|
293
|
-
? memory.content
|
|
294
|
-
: new TextDecoder().decode(memory.content);
|
|
295
|
-
|
|
296
|
-
// Related memories search requires vector service
|
|
297
|
-
// For now return basic analysis without related count
|
|
298
|
-
return {
|
|
299
|
-
memoryId,
|
|
300
|
-
importance: memory.metadata.importance || 5,
|
|
301
|
-
category: memory.metadata.category,
|
|
302
|
-
relatedCount: 0, // Would require vector search
|
|
303
|
-
clusterInfo: undefined // Would require full clustering analysis
|
|
304
|
-
};
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
/**
|
|
308
|
-
* Get visualization-ready data
|
|
309
|
-
*
|
|
310
|
-
* Formats analytics for charts and graphs
|
|
311
|
-
*
|
|
312
|
-
* @returns Chart-ready data
|
|
313
|
-
*/
|
|
314
|
-
async visualizationData(): Promise<{
|
|
315
|
-
categoryChart: Array<{ name: string; value: number }>;
|
|
316
|
-
importanceChart: Array<{ level: number; count: number }>;
|
|
317
|
-
timelineChart: Array<{ date: string; count: number }>;
|
|
318
|
-
clusterChart: Array<{ id: string; size: number; coherence: number }>;
|
|
319
|
-
}> {
|
|
320
|
-
const analytics = await this.generate({ includeClustering: true });
|
|
321
|
-
|
|
322
|
-
// Category chart data
|
|
323
|
-
const categoryChart = analytics.topCategories.map(c => ({
|
|
324
|
-
name: c.category,
|
|
325
|
-
value: c.count
|
|
326
|
-
}));
|
|
327
|
-
|
|
328
|
-
// Importance chart data
|
|
329
|
-
const importanceData = await this.importance();
|
|
330
|
-
const importanceChart = Object.entries(importanceData.distribution).map(([level, count]) => ({
|
|
331
|
-
level: parseInt(level),
|
|
332
|
-
count
|
|
333
|
-
}));
|
|
334
|
-
|
|
335
|
-
// Timeline chart data - aggregate memories by date
|
|
336
|
-
const timelineChart: Array<{ date: string; count: number }> = [];
|
|
337
|
-
try {
|
|
338
|
-
const memoriesResult = await this.services.viewService?.getUserMemories(
|
|
339
|
-
this.services.config.userAddress,
|
|
340
|
-
{ limit: 1000 }
|
|
341
|
-
);
|
|
342
|
-
const memories = memoriesResult?.data || [];
|
|
343
|
-
|
|
344
|
-
// Group memories by date (YYYY-MM-DD)
|
|
345
|
-
const dateCountMap = new Map<string, number>();
|
|
346
|
-
memories.forEach((m: any) => {
|
|
347
|
-
const timestamp = m.createdAt || m.updatedAt || Date.now();
|
|
348
|
-
const dateStr = new Date(timestamp).toISOString().split('T')[0];
|
|
349
|
-
dateCountMap.set(dateStr, (dateCountMap.get(dateStr) || 0) + 1);
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
// Sort by date and convert to array
|
|
353
|
-
const sortedDates = Array.from(dateCountMap.entries())
|
|
354
|
-
.sort((a, b) => a[0].localeCompare(b[0]));
|
|
355
|
-
|
|
356
|
-
sortedDates.forEach(([date, count]) => {
|
|
357
|
-
timelineChart.push({ date, count });
|
|
358
|
-
});
|
|
359
|
-
} catch (error) {
|
|
360
|
-
console.warn('Failed to generate timeline chart data:', error);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// Cluster chart data
|
|
364
|
-
const clusterChart = analytics.similarityClusters.map(c => ({
|
|
365
|
-
id: c.id,
|
|
366
|
-
size: c.size,
|
|
367
|
-
coherence: c.coherence
|
|
368
|
-
}));
|
|
369
|
-
|
|
370
|
-
return {
|
|
371
|
-
categoryChart,
|
|
372
|
-
importanceChart,
|
|
373
|
-
timelineChart,
|
|
374
|
-
clusterChart
|
|
375
|
-
};
|
|
376
|
-
}
|
|
377
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Namespace - Memory Analytics & Insights
|
|
3
|
+
*
|
|
4
|
+
* Pure delegation to MemoryAnalyticsService for comprehensive analytics.
|
|
5
|
+
* Provides insights, trends, clustering, and recommendations.
|
|
6
|
+
*
|
|
7
|
+
* @module client/namespaces
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { ServiceContainer } from '../SimplePDWClient';
|
|
11
|
+
import type {
|
|
12
|
+
MemoryAnalytics,
|
|
13
|
+
UsagePattern,
|
|
14
|
+
SimilarityCluster,
|
|
15
|
+
MemoryInsights
|
|
16
|
+
} from '../../retrieval/MemoryAnalyticsService';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Analytics options
|
|
20
|
+
*/
|
|
21
|
+
export interface AnalyticsOptions {
|
|
22
|
+
periodStart?: Date;
|
|
23
|
+
periodEnd?: Date;
|
|
24
|
+
includeForecasting?: boolean;
|
|
25
|
+
includeClustering?: boolean;
|
|
26
|
+
includeInsights?: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Category distribution
|
|
31
|
+
*/
|
|
32
|
+
export interface CategoryDistribution {
|
|
33
|
+
category: string;
|
|
34
|
+
count: number;
|
|
35
|
+
percentage: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Trend data
|
|
40
|
+
*/
|
|
41
|
+
export interface TrendData {
|
|
42
|
+
direction: 'up' | 'down' | 'stable' | 'volatile';
|
|
43
|
+
strength: number;
|
|
44
|
+
forecast?: Array<{ date: Date; predicted: number; confidence: number }>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Analytics Namespace
|
|
49
|
+
*
|
|
50
|
+
* Handles memory analytics, insights, and visualization data
|
|
51
|
+
*/
|
|
52
|
+
export class AnalyticsNamespace {
|
|
53
|
+
constructor(private services: ServiceContainer) {}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Generate comprehensive analytics report
|
|
57
|
+
*
|
|
58
|
+
* Delegates to: MemoryAnalyticsService.generateMemoryAnalytics()
|
|
59
|
+
*
|
|
60
|
+
* @param options - Analytics options
|
|
61
|
+
* @returns Complete analytics report
|
|
62
|
+
*/
|
|
63
|
+
async generate(options?: AnalyticsOptions): Promise<MemoryAnalytics> {
|
|
64
|
+
if (!this.services.analytics) {
|
|
65
|
+
throw new Error('Analytics service not configured.');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Get user's memories first
|
|
69
|
+
const memoriesResult = await this.services.viewService?.getUserMemories(
|
|
70
|
+
this.services.config.userAddress
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const memories = memoriesResult?.data || [];
|
|
74
|
+
|
|
75
|
+
// Convert to UnifiedMemoryResult format
|
|
76
|
+
const unifiedMemories = memories.map((m: any) => ({
|
|
77
|
+
id: m.id,
|
|
78
|
+
category: m.category,
|
|
79
|
+
created: new Date(m.createdAt || Date.now()),
|
|
80
|
+
metadata: {
|
|
81
|
+
size: 0,
|
|
82
|
+
importance: m.importance || 5,
|
|
83
|
+
contentType: 'text',
|
|
84
|
+
tags: m.tags || []
|
|
85
|
+
},
|
|
86
|
+
analytics: {
|
|
87
|
+
viewCount: 0
|
|
88
|
+
}
|
|
89
|
+
}));
|
|
90
|
+
|
|
91
|
+
return await this.services.analytics.generateMemoryAnalytics(
|
|
92
|
+
this.services.config.userAddress,
|
|
93
|
+
unifiedMemories as any,
|
|
94
|
+
options
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Get category distribution
|
|
100
|
+
*
|
|
101
|
+
* Delegates to: MemoryAnalyticsService.generateMemoryAnalytics() → topCategories
|
|
102
|
+
*
|
|
103
|
+
* @returns Category distribution data
|
|
104
|
+
*/
|
|
105
|
+
async categories(): Promise<CategoryDistribution[]> {
|
|
106
|
+
const analytics = await this.generate({ includeInsights: false, includeClustering: false });
|
|
107
|
+
return analytics.topCategories;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Get temporal trends
|
|
112
|
+
*
|
|
113
|
+
* Delegates to: MemoryAnalyticsService.generateMemoryAnalytics() → temporalTrends
|
|
114
|
+
*
|
|
115
|
+
* @returns Trend analysis data
|
|
116
|
+
*/
|
|
117
|
+
async trends(): Promise<{
|
|
118
|
+
creation: TrendData;
|
|
119
|
+
access: TrendData;
|
|
120
|
+
size: TrendData;
|
|
121
|
+
}> {
|
|
122
|
+
const analytics = await this.generate({ includeForecasting: true });
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
creation: {
|
|
126
|
+
direction: analytics.temporalTrends.creationTrend.direction,
|
|
127
|
+
strength: analytics.temporalTrends.creationTrend.strength,
|
|
128
|
+
forecast: analytics.temporalTrends.creationTrend.forecast
|
|
129
|
+
},
|
|
130
|
+
access: {
|
|
131
|
+
direction: analytics.temporalTrends.accessTrend.direction,
|
|
132
|
+
strength: analytics.temporalTrends.accessTrend.strength,
|
|
133
|
+
forecast: analytics.temporalTrends.accessTrend.forecast
|
|
134
|
+
},
|
|
135
|
+
size: {
|
|
136
|
+
direction: analytics.temporalTrends.sizeTrend.direction,
|
|
137
|
+
strength: analytics.temporalTrends.sizeTrend.strength,
|
|
138
|
+
forecast: analytics.temporalTrends.sizeTrend.forecast
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Get importance distribution
|
|
145
|
+
*
|
|
146
|
+
* Analyzes how memories are distributed by importance level
|
|
147
|
+
*
|
|
148
|
+
* @returns Importance analysis
|
|
149
|
+
*/
|
|
150
|
+
async importance(): Promise<{
|
|
151
|
+
average: number;
|
|
152
|
+
distribution: Record<number, number>;
|
|
153
|
+
highImportance: number;
|
|
154
|
+
lowImportance: number;
|
|
155
|
+
}> {
|
|
156
|
+
const analytics = await this.generate({ includeInsights: false });
|
|
157
|
+
|
|
158
|
+
// Calculate distribution from memories
|
|
159
|
+
const memoriesResult = await this.services.viewService?.getUserMemories(
|
|
160
|
+
this.services.config.userAddress
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
const memories = memoriesResult?.data || [];
|
|
164
|
+
|
|
165
|
+
const distribution: Record<number, number> = {};
|
|
166
|
+
let highCount = 0;
|
|
167
|
+
let lowCount = 0;
|
|
168
|
+
|
|
169
|
+
memories.forEach((m: any) => {
|
|
170
|
+
const imp = m.importance || 5;
|
|
171
|
+
distribution[imp] = (distribution[imp] || 0) + 1;
|
|
172
|
+
|
|
173
|
+
if (imp >= 8) highCount++;
|
|
174
|
+
if (imp <= 3) lowCount++;
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
average: analytics.averageImportance,
|
|
179
|
+
distribution,
|
|
180
|
+
highImportance: highCount,
|
|
181
|
+
lowImportance: lowCount
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Get temporal patterns
|
|
187
|
+
*
|
|
188
|
+
* Delegates to: MemoryAnalyticsService.analyzeUsagePatterns()
|
|
189
|
+
*
|
|
190
|
+
* @returns Usage patterns by time
|
|
191
|
+
*/
|
|
192
|
+
async temporal(): Promise<UsagePattern[]> {
|
|
193
|
+
const analytics = await this.generate({ includeInsights: false });
|
|
194
|
+
return analytics.usagePatterns;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Get AI-generated insights
|
|
199
|
+
*
|
|
200
|
+
* Delegates to: MemoryAnalyticsService.generateKnowledgeInsights()
|
|
201
|
+
*
|
|
202
|
+
* @returns Knowledge insights and recommendations
|
|
203
|
+
*/
|
|
204
|
+
async insights(): Promise<MemoryInsights> {
|
|
205
|
+
const analytics = await this.generate({ includeInsights: true });
|
|
206
|
+
return analytics.knowledgeInsights;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Detect anomalies in memory patterns
|
|
211
|
+
*
|
|
212
|
+
* Finds unusual patterns or outliers
|
|
213
|
+
*
|
|
214
|
+
* @returns Array of detected anomalies
|
|
215
|
+
*/
|
|
216
|
+
async anomalies(): Promise<Array<{
|
|
217
|
+
date: Date;
|
|
218
|
+
type: 'spike' | 'drop' | 'outlier';
|
|
219
|
+
severity: number;
|
|
220
|
+
description: string;
|
|
221
|
+
}>> {
|
|
222
|
+
const analytics = await this.generate();
|
|
223
|
+
|
|
224
|
+
// Extract anomalies from usage patterns
|
|
225
|
+
const anomalies: Array<{
|
|
226
|
+
date: Date;
|
|
227
|
+
type: 'spike' | 'drop' | 'outlier';
|
|
228
|
+
severity: number;
|
|
229
|
+
description: string;
|
|
230
|
+
}> = [];
|
|
231
|
+
|
|
232
|
+
analytics.usagePatterns.forEach(pattern => {
|
|
233
|
+
pattern.anomalies.forEach(anomaly => {
|
|
234
|
+
anomalies.push({
|
|
235
|
+
date: anomaly.date,
|
|
236
|
+
type: anomaly.type,
|
|
237
|
+
severity: anomaly.severity,
|
|
238
|
+
description: anomaly.possibleCauses?.join(', ') || 'Unknown cause'
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
return anomalies;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Analyze correlations between categories/topics
|
|
248
|
+
*
|
|
249
|
+
* Finds relationships between different memory types
|
|
250
|
+
*
|
|
251
|
+
* @returns Correlation data
|
|
252
|
+
*/
|
|
253
|
+
async correlations(): Promise<Array<{
|
|
254
|
+
concept1: string;
|
|
255
|
+
concept2: string;
|
|
256
|
+
strength: number;
|
|
257
|
+
memoryCount: number;
|
|
258
|
+
}>> {
|
|
259
|
+
const analytics = await this.generate({ includeInsights: true });
|
|
260
|
+
|
|
261
|
+
// Extract from conceptual connections
|
|
262
|
+
return analytics.knowledgeInsights.conceptualConnections.map(conn => ({
|
|
263
|
+
concept1: conn.concept1,
|
|
264
|
+
concept2: conn.concept2,
|
|
265
|
+
strength: conn.connectionStrength,
|
|
266
|
+
memoryCount: conn.bridgeMemories.length
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Analyze a single memory
|
|
272
|
+
*
|
|
273
|
+
* Get detailed analytics for one memory
|
|
274
|
+
*
|
|
275
|
+
* @param memoryId - Memory ID to analyze
|
|
276
|
+
* @returns Memory-specific analytics
|
|
277
|
+
*/
|
|
278
|
+
async analyze(memoryId: string): Promise<{
|
|
279
|
+
memoryId: string;
|
|
280
|
+
importance: number;
|
|
281
|
+
category: string;
|
|
282
|
+
relatedCount: number;
|
|
283
|
+
clusterInfo?: {
|
|
284
|
+
clusterId: string;
|
|
285
|
+
similarity: number;
|
|
286
|
+
};
|
|
287
|
+
}> {
|
|
288
|
+
// Get memory details
|
|
289
|
+
const memory = await this.services.storage.retrieveMemoryPackage(memoryId);
|
|
290
|
+
|
|
291
|
+
// Decode content if it's Uint8Array
|
|
292
|
+
const content = typeof memory.content === 'string'
|
|
293
|
+
? memory.content
|
|
294
|
+
: new TextDecoder().decode(memory.content);
|
|
295
|
+
|
|
296
|
+
// Related memories search requires vector service
|
|
297
|
+
// For now return basic analysis without related count
|
|
298
|
+
return {
|
|
299
|
+
memoryId,
|
|
300
|
+
importance: memory.metadata.importance || 5,
|
|
301
|
+
category: memory.metadata.category,
|
|
302
|
+
relatedCount: 0, // Would require vector search
|
|
303
|
+
clusterInfo: undefined // Would require full clustering analysis
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Get visualization-ready data
|
|
309
|
+
*
|
|
310
|
+
* Formats analytics for charts and graphs
|
|
311
|
+
*
|
|
312
|
+
* @returns Chart-ready data
|
|
313
|
+
*/
|
|
314
|
+
async visualizationData(): Promise<{
|
|
315
|
+
categoryChart: Array<{ name: string; value: number }>;
|
|
316
|
+
importanceChart: Array<{ level: number; count: number }>;
|
|
317
|
+
timelineChart: Array<{ date: string; count: number }>;
|
|
318
|
+
clusterChart: Array<{ id: string; size: number; coherence: number }>;
|
|
319
|
+
}> {
|
|
320
|
+
const analytics = await this.generate({ includeClustering: true });
|
|
321
|
+
|
|
322
|
+
// Category chart data
|
|
323
|
+
const categoryChart = analytics.topCategories.map(c => ({
|
|
324
|
+
name: c.category,
|
|
325
|
+
value: c.count
|
|
326
|
+
}));
|
|
327
|
+
|
|
328
|
+
// Importance chart data
|
|
329
|
+
const importanceData = await this.importance();
|
|
330
|
+
const importanceChart = Object.entries(importanceData.distribution).map(([level, count]) => ({
|
|
331
|
+
level: parseInt(level),
|
|
332
|
+
count
|
|
333
|
+
}));
|
|
334
|
+
|
|
335
|
+
// Timeline chart data - aggregate memories by date
|
|
336
|
+
const timelineChart: Array<{ date: string; count: number }> = [];
|
|
337
|
+
try {
|
|
338
|
+
const memoriesResult = await this.services.viewService?.getUserMemories(
|
|
339
|
+
this.services.config.userAddress,
|
|
340
|
+
{ limit: 1000 }
|
|
341
|
+
);
|
|
342
|
+
const memories = memoriesResult?.data || [];
|
|
343
|
+
|
|
344
|
+
// Group memories by date (YYYY-MM-DD)
|
|
345
|
+
const dateCountMap = new Map<string, number>();
|
|
346
|
+
memories.forEach((m: any) => {
|
|
347
|
+
const timestamp = m.createdAt || m.updatedAt || Date.now();
|
|
348
|
+
const dateStr = new Date(timestamp).toISOString().split('T')[0];
|
|
349
|
+
dateCountMap.set(dateStr, (dateCountMap.get(dateStr) || 0) + 1);
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
// Sort by date and convert to array
|
|
353
|
+
const sortedDates = Array.from(dateCountMap.entries())
|
|
354
|
+
.sort((a, b) => a[0].localeCompare(b[0]));
|
|
355
|
+
|
|
356
|
+
sortedDates.forEach(([date, count]) => {
|
|
357
|
+
timelineChart.push({ date, count });
|
|
358
|
+
});
|
|
359
|
+
} catch (error) {
|
|
360
|
+
console.warn('Failed to generate timeline chart data:', error);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Cluster chart data
|
|
364
|
+
const clusterChart = analytics.similarityClusters.map(c => ({
|
|
365
|
+
id: c.id,
|
|
366
|
+
size: c.size,
|
|
367
|
+
coherence: c.coherence
|
|
368
|
+
}));
|
|
369
|
+
|
|
370
|
+
return {
|
|
371
|
+
categoryChart,
|
|
372
|
+
importanceChart,
|
|
373
|
+
timelineChart,
|
|
374
|
+
clusterChart
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
}
|