holosphere 2.0.0-alpha0 → 2.0.0-alpha2
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 +162 -38
- package/dist/cjs/holosphere.cjs +2 -0
- package/dist/cjs/holosphere.cjs.map +1 -0
- package/dist/esm/holosphere.js +56 -0
- package/dist/esm/holosphere.js.map +1 -0
- package/dist/index-CDfIuXew.js +15974 -0
- package/dist/index-CDfIuXew.js.map +1 -0
- package/dist/index-ifOgtDvd.cjs +3 -0
- package/dist/index-ifOgtDvd.cjs.map +1 -0
- package/dist/indexeddb-storage-CMW4qRQS.js +96 -0
- package/dist/indexeddb-storage-CMW4qRQS.js.map +1 -0
- package/dist/indexeddb-storage-DLZOgetM.cjs +2 -0
- package/dist/indexeddb-storage-DLZOgetM.cjs.map +1 -0
- package/dist/memory-storage-DQzcAZlf.js +47 -0
- package/dist/memory-storage-DQzcAZlf.js.map +1 -0
- package/dist/memory-storage-DmePEP2q.cjs +2 -0
- package/dist/memory-storage-DmePEP2q.cjs.map +1 -0
- package/dist/secp256k1-CP0ZkpAx.cjs +13 -0
- package/dist/secp256k1-CP0ZkpAx.cjs.map +1 -0
- package/dist/secp256k1-vOXp40Fx.js +2281 -0
- package/dist/secp256k1-vOXp40Fx.js.map +1 -0
- package/docs/FOSDEM_PROPOSAL.md +388 -0
- package/docs/LOCALFIRST.md +266 -0
- package/docs/contracts/api-interface.md +793 -0
- package/docs/data-model.md +476 -0
- package/docs/gun-async-usage.md +338 -0
- package/docs/plan.md +349 -0
- package/docs/quickstart.md +674 -0
- package/docs/research.md +362 -0
- package/docs/spec.md +244 -0
- package/docs/storage-backends.md +326 -0
- package/docs/tasks.md +947 -0
- package/package.json +1 -1
- package/tests/unit/ai/aggregation.test.js +0 -295
- package/tests/unit/ai/breakdown.test.js +0 -446
- package/tests/unit/ai/classifier.test.js +0 -294
- package/tests/unit/ai/council.test.js +0 -262
- package/tests/unit/ai/embeddings.test.js +0 -384
- package/tests/unit/ai/federation-ai.test.js +0 -344
- package/tests/unit/ai/h3-ai.test.js +0 -458
- package/tests/unit/ai/index.test.js +0 -304
- package/tests/unit/ai/json-ops.test.js +0 -307
- package/tests/unit/ai/llm-service.test.js +0 -390
- package/tests/unit/ai/nl-query.test.js +0 -383
- package/tests/unit/ai/relationships.test.js +0 -311
- package/tests/unit/ai/schema-extractor.test.js +0 -384
- package/tests/unit/ai/spatial.test.js +0 -279
- package/tests/unit/ai/tts.test.js +0 -279
- package/tests/unit/content.test.js +0 -332
- package/tests/unit/contract/core.test.js +0 -88
- package/tests/unit/contract/crypto.test.js +0 -198
- package/tests/unit/contract/data.test.js +0 -223
- package/tests/unit/contract/federation.test.js +0 -181
- package/tests/unit/contract/hierarchical.test.js +0 -113
- package/tests/unit/contract/schema.test.js +0 -114
- package/tests/unit/contract/social.test.js +0 -217
- package/tests/unit/contract/spatial.test.js +0 -110
- package/tests/unit/contract/subscriptions.test.js +0 -128
- package/tests/unit/contract/utils.test.js +0 -159
- package/tests/unit/core.test.js +0 -152
- package/tests/unit/crypto.test.js +0 -328
- package/tests/unit/federation.test.js +0 -234
- package/tests/unit/gun-async.test.js +0 -252
- package/tests/unit/hierarchical.test.js +0 -399
- package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
- package/tests/unit/integration/scenario-02-federation.test.js +0 -76
- package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
- package/tests/unit/integration/scenario-04-validation.test.js +0 -129
- package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
- package/tests/unit/integration/scenario-06-social.test.js +0 -135
- package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
- package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
- package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
- package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
- package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
- package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
- package/tests/unit/performance/benchmark.test.js +0 -85
- package/tests/unit/schema.test.js +0 -213
- package/tests/unit/spatial.test.js +0 -158
- package/tests/unit/storage.test.js +0 -195
- package/tests/unit/subscriptions.test.js +0 -328
- package/tests/unit/test-data-permanence-debug.js +0 -197
- package/tests/unit/test-data-permanence.js +0 -340
- package/tests/unit/test-key-persistence-fixed.js +0 -148
- package/tests/unit/test-key-persistence.js +0 -172
- package/tests/unit/test-relay-permanence.js +0 -376
- package/tests/unit/test-second-node.js +0 -95
- package/tests/unit/test-simple-write.js +0 -89
package/package.json
CHANGED
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
2
|
-
import { SmartAggregation } from '../../../src/ai/aggregation.js';
|
|
3
|
-
|
|
4
|
-
// Mock h3-js
|
|
5
|
-
vi.mock('h3-js', () => ({
|
|
6
|
-
getResolution: vi.fn().mockReturnValue(5),
|
|
7
|
-
cellToParent: vi.fn().mockReturnValue('parent_holon'),
|
|
8
|
-
cellToChildren: vi.fn().mockReturnValue(['child1', 'child2', 'child3'])
|
|
9
|
-
}));
|
|
10
|
-
|
|
11
|
-
describe('Unit: SmartAggregation', () => {
|
|
12
|
-
let aggregation;
|
|
13
|
-
let mockLLM;
|
|
14
|
-
let mockHolosphere;
|
|
15
|
-
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
vi.clearAllMocks();
|
|
18
|
-
|
|
19
|
-
mockLLM = {
|
|
20
|
-
getJSON: vi.fn()
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
mockHolosphere = {
|
|
24
|
-
getAll: vi.fn().mockResolvedValue([]),
|
|
25
|
-
put: vi.fn().mockResolvedValue({ success: true })
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
aggregation = new SmartAggregation(mockLLM, mockHolosphere);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
describe('Constructor', () => {
|
|
32
|
-
it('should initialize with LLM service', () => {
|
|
33
|
-
const a = new SmartAggregation(mockLLM);
|
|
34
|
-
expect(a.llm).toBe(mockLLM);
|
|
35
|
-
expect(a.holosphere).toBeNull();
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('should accept optional HoloSphere instance', () => {
|
|
39
|
-
expect(aggregation.holosphere).toBe(mockHolosphere);
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
describe('setHoloSphere', () => {
|
|
44
|
-
it('should set HoloSphere instance', () => {
|
|
45
|
-
const a = new SmartAggregation(mockLLM);
|
|
46
|
-
a.setHoloSphere(mockHolosphere);
|
|
47
|
-
expect(a.holosphere).toBe(mockHolosphere);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
describe('smartUpcast', () => {
|
|
52
|
-
it('should generate summary and upcast to parent', async () => {
|
|
53
|
-
mockHolosphere.getAll.mockResolvedValue([
|
|
54
|
-
{ id: 1, title: 'Item 1' },
|
|
55
|
-
{ id: 2, title: 'Item 2' }
|
|
56
|
-
]);
|
|
57
|
-
|
|
58
|
-
mockLLM.getJSON.mockResolvedValue({
|
|
59
|
-
text: 'Two items in region',
|
|
60
|
-
stats: { count: 2 },
|
|
61
|
-
notable: ['Item 1'],
|
|
62
|
-
themes: ['development']
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
const result = await aggregation.smartUpcast('holon1', 'projects');
|
|
66
|
-
|
|
67
|
-
expect(result.holon).toBe('holon1');
|
|
68
|
-
expect(result.lens).toBe('projects');
|
|
69
|
-
expect(result.summary).toBeDefined();
|
|
70
|
-
expect(result.dataCount).toBe(2);
|
|
71
|
-
expect(result.parent).toBeDefined();
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('should throw error if HoloSphere not available', async () => {
|
|
75
|
-
const a = new SmartAggregation(mockLLM);
|
|
76
|
-
|
|
77
|
-
await expect(a.smartUpcast('holon', 'lens'))
|
|
78
|
-
.rejects.toThrow('HoloSphere instance required');
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('should store summary at parent level when storeResults is true', async () => {
|
|
82
|
-
mockHolosphere.getAll.mockResolvedValue([{ id: 1 }]);
|
|
83
|
-
mockLLM.getJSON.mockResolvedValue({ text: 'Summary' });
|
|
84
|
-
|
|
85
|
-
await aggregation.smartUpcast('holon1', 'projects', { storeResults: true });
|
|
86
|
-
|
|
87
|
-
expect(mockHolosphere.put).toHaveBeenCalledWith(
|
|
88
|
-
'parent_holon',
|
|
89
|
-
'projects_summaries',
|
|
90
|
-
expect.objectContaining({
|
|
91
|
-
childHolon: 'holon1',
|
|
92
|
-
summary: expect.any(Object)
|
|
93
|
-
})
|
|
94
|
-
);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('should respect maxLevels option', async () => {
|
|
98
|
-
mockHolosphere.getAll.mockResolvedValue([{ id: 1 }]);
|
|
99
|
-
mockLLM.getJSON.mockResolvedValue({ text: 'Summary' });
|
|
100
|
-
|
|
101
|
-
const result = await aggregation.smartUpcast('holon1', 'projects', { maxLevels: 1 });
|
|
102
|
-
|
|
103
|
-
// Should only go up one level
|
|
104
|
-
expect(result.parent).toBeDefined();
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
describe('_generateSummary', () => {
|
|
109
|
-
it('should generate summary for data', async () => {
|
|
110
|
-
mockLLM.getJSON.mockResolvedValue({
|
|
111
|
-
text: 'Active region',
|
|
112
|
-
stats: { count: 5 },
|
|
113
|
-
notable: ['Project A'],
|
|
114
|
-
themes: ['sustainability']
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
const data = [{ id: 1 }, { id: 2 }];
|
|
118
|
-
const result = await aggregation._generateSummary(data, 'holon1', 'projects');
|
|
119
|
-
|
|
120
|
-
expect(result.text).toBe('Active region');
|
|
121
|
-
expect(result.stats.count).toBe(5);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it('should return empty summary for empty data', async () => {
|
|
125
|
-
const result = await aggregation._generateSummary([], 'holon1', 'lens');
|
|
126
|
-
|
|
127
|
-
expect(result.text).toBe('No data in this region');
|
|
128
|
-
expect(result.stats.count).toBe(0);
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
describe('generateHolonSummary', () => {
|
|
133
|
-
it('should generate comprehensive holon summary', async () => {
|
|
134
|
-
mockHolosphere.getAll
|
|
135
|
-
.mockResolvedValueOnce([{ id: 1 }]) // projects
|
|
136
|
-
.mockResolvedValueOnce([{ id: 2 }]) // quests
|
|
137
|
-
.mockResolvedValueOnce([]) // events
|
|
138
|
-
.mockResolvedValueOnce([]) // resources
|
|
139
|
-
.mockResolvedValueOnce([{ id: 3 }]); // default
|
|
140
|
-
|
|
141
|
-
mockLLM.getJSON.mockResolvedValue({
|
|
142
|
-
title: 'Region Summary',
|
|
143
|
-
executive_summary: 'Active region',
|
|
144
|
-
highlights: ['Growth'],
|
|
145
|
-
activities: { count: 2, summary: 'Various activities' },
|
|
146
|
-
community: { engagement_level: 'high', notes: 'Active community' },
|
|
147
|
-
resources: ['Local resources'],
|
|
148
|
-
challenges: ['Coordination'],
|
|
149
|
-
opportunities: ['Expansion'],
|
|
150
|
-
health_score: 0.8,
|
|
151
|
-
recommendations: ['Focus on coordination']
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
const result = await aggregation.generateHolonSummary('holon1');
|
|
155
|
-
|
|
156
|
-
expect(result.holon).toBe('holon1');
|
|
157
|
-
expect(result.summary.title).toBe('Region Summary');
|
|
158
|
-
expect(result.lensesAnalyzed).toBeDefined();
|
|
159
|
-
expect(result.totalItems).toBeGreaterThan(0);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it('should throw error if HoloSphere not available', async () => {
|
|
163
|
-
const a = new SmartAggregation(mockLLM);
|
|
164
|
-
|
|
165
|
-
await expect(a.generateHolonSummary('holon'))
|
|
166
|
-
.rejects.toThrow('HoloSphere instance required');
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
it('should skip unavailable lenses', async () => {
|
|
170
|
-
mockHolosphere.getAll
|
|
171
|
-
.mockResolvedValueOnce([{ id: 1 }])
|
|
172
|
-
.mockRejectedValueOnce(new Error('Lens not found'))
|
|
173
|
-
.mockResolvedValueOnce([])
|
|
174
|
-
.mockResolvedValueOnce([])
|
|
175
|
-
.mockResolvedValueOnce([]);
|
|
176
|
-
|
|
177
|
-
mockLLM.getJSON.mockResolvedValue({ title: 'Summary' });
|
|
178
|
-
|
|
179
|
-
const result = await aggregation.generateHolonSummary('holon1');
|
|
180
|
-
|
|
181
|
-
expect(result).toBeDefined();
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
describe('aggregateChildren', () => {
|
|
186
|
-
it('should aggregate summaries from child holons', async () => {
|
|
187
|
-
mockHolosphere.getAll
|
|
188
|
-
.mockResolvedValueOnce([{ id: 1 }])
|
|
189
|
-
.mockResolvedValueOnce([{ id: 2 }])
|
|
190
|
-
.mockResolvedValueOnce([{ id: 3 }]);
|
|
191
|
-
|
|
192
|
-
mockLLM.getJSON.mockResolvedValue({
|
|
193
|
-
text: 'Summary',
|
|
194
|
-
stats: { count: 1 }
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
const result = await aggregation.aggregateChildren('parent_holon', 'projects');
|
|
198
|
-
|
|
199
|
-
expect(result.holon).toBe('parent_holon');
|
|
200
|
-
expect(result.lens).toBe('projects');
|
|
201
|
-
expect(result.childCount).toBeGreaterThan(0);
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
it('should throw error if HoloSphere not available', async () => {
|
|
205
|
-
const a = new SmartAggregation(mockLLM);
|
|
206
|
-
|
|
207
|
-
await expect(a.aggregateChildren('parent', 'lens'))
|
|
208
|
-
.rejects.toThrow('HoloSphere instance required');
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
it('should return message when no child data found', async () => {
|
|
212
|
-
mockHolosphere.getAll.mockResolvedValue([]);
|
|
213
|
-
|
|
214
|
-
const result = await aggregation.aggregateChildren('parent_holon', 'projects');
|
|
215
|
-
|
|
216
|
-
expect(result.message).toBe('No child data found');
|
|
217
|
-
expect(result.summary).toBeNull();
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
describe('comparePeriods', () => {
|
|
222
|
-
it('should compare data across time periods', async () => {
|
|
223
|
-
mockHolosphere.getAll.mockResolvedValue([
|
|
224
|
-
{ id: 1, timestamp: '2024-01-15' },
|
|
225
|
-
{ id: 2, timestamp: '2024-06-15' },
|
|
226
|
-
{ id: 3, timestamp: '2024-08-15' }
|
|
227
|
-
]);
|
|
228
|
-
|
|
229
|
-
mockLLM.getJSON.mockResolvedValue({
|
|
230
|
-
growth_rate: 50,
|
|
231
|
-
direction: 'growth',
|
|
232
|
-
new_themes: ['sustainability'],
|
|
233
|
-
disappeared: ['legacy'],
|
|
234
|
-
key_changes: ['Focus shift'],
|
|
235
|
-
summary: 'Growing activity'
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
const result = await aggregation.comparePeriods(
|
|
239
|
-
'holon1',
|
|
240
|
-
'projects',
|
|
241
|
-
{ start: '2024-01-01', end: '2024-03-31' },
|
|
242
|
-
{ start: '2024-07-01', end: '2024-09-30' }
|
|
243
|
-
);
|
|
244
|
-
|
|
245
|
-
expect(result.growth_rate).toBe(50);
|
|
246
|
-
expect(result.direction).toBe('growth');
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
it('should throw error if HoloSphere not available', async () => {
|
|
250
|
-
const a = new SmartAggregation(mockLLM);
|
|
251
|
-
|
|
252
|
-
await expect(a.comparePeriods('h', 'l', {}, {}))
|
|
253
|
-
.rejects.toThrow('HoloSphere instance required');
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
it('should filter items by period', async () => {
|
|
257
|
-
mockHolosphere.getAll.mockResolvedValue([
|
|
258
|
-
{ id: 1, timestamp: '2024-01-15' },
|
|
259
|
-
{ id: 2, timestamp: '2024-02-15' },
|
|
260
|
-
{ id: 3, timestamp: '2024-06-15' }
|
|
261
|
-
]);
|
|
262
|
-
|
|
263
|
-
mockLLM.getJSON.mockResolvedValue({ growth_rate: 0 });
|
|
264
|
-
|
|
265
|
-
await aggregation.comparePeriods(
|
|
266
|
-
'holon1',
|
|
267
|
-
'lens',
|
|
268
|
-
{ start: '2024-01-01', end: '2024-03-31' },
|
|
269
|
-
{ start: '2024-06-01', end: '2024-06-30' }
|
|
270
|
-
);
|
|
271
|
-
|
|
272
|
-
const call = mockLLM.getJSON.mock.calls[0];
|
|
273
|
-
expect(call[1]).toContain('Period 1 data');
|
|
274
|
-
expect(call[1]).toContain('Period 2 data');
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
it('should handle items with created_at field', async () => {
|
|
278
|
-
mockHolosphere.getAll.mockResolvedValue([
|
|
279
|
-
{ id: 1, created_at: '2024-01-15' },
|
|
280
|
-
{ id: 2, created_at: '2024-06-15' }
|
|
281
|
-
]);
|
|
282
|
-
|
|
283
|
-
mockLLM.getJSON.mockResolvedValue({ growth_rate: 100 });
|
|
284
|
-
|
|
285
|
-
await aggregation.comparePeriods(
|
|
286
|
-
'holon1',
|
|
287
|
-
'lens',
|
|
288
|
-
{ start: '2024-01-01', end: '2024-03-31' },
|
|
289
|
-
{ start: '2024-06-01', end: '2024-06-30' }
|
|
290
|
-
);
|
|
291
|
-
|
|
292
|
-
expect(mockLLM.getJSON).toHaveBeenCalled();
|
|
293
|
-
});
|
|
294
|
-
});
|
|
295
|
-
});
|