holosphere 2.0.0-alpha1 → 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.
Files changed (87) hide show
  1. package/dist/cjs/holosphere.cjs +2 -0
  2. package/dist/cjs/holosphere.cjs.map +1 -0
  3. package/dist/esm/holosphere.js +56 -0
  4. package/dist/esm/holosphere.js.map +1 -0
  5. package/dist/index-CDfIuXew.js +15974 -0
  6. package/dist/index-CDfIuXew.js.map +1 -0
  7. package/dist/index-ifOgtDvd.cjs +3 -0
  8. package/dist/index-ifOgtDvd.cjs.map +1 -0
  9. package/dist/indexeddb-storage-CMW4qRQS.js +96 -0
  10. package/dist/indexeddb-storage-CMW4qRQS.js.map +1 -0
  11. package/dist/indexeddb-storage-DLZOgetM.cjs +2 -0
  12. package/dist/indexeddb-storage-DLZOgetM.cjs.map +1 -0
  13. package/dist/memory-storage-DQzcAZlf.js +47 -0
  14. package/dist/memory-storage-DQzcAZlf.js.map +1 -0
  15. package/dist/memory-storage-DmePEP2q.cjs +2 -0
  16. package/dist/memory-storage-DmePEP2q.cjs.map +1 -0
  17. package/dist/secp256k1-CP0ZkpAx.cjs +13 -0
  18. package/dist/secp256k1-CP0ZkpAx.cjs.map +1 -0
  19. package/dist/secp256k1-vOXp40Fx.js +2281 -0
  20. package/dist/secp256k1-vOXp40Fx.js.map +1 -0
  21. package/docs/FOSDEM_PROPOSAL.md +388 -0
  22. package/docs/LOCALFIRST.md +266 -0
  23. package/docs/contracts/api-interface.md +793 -0
  24. package/docs/data-model.md +476 -0
  25. package/docs/gun-async-usage.md +338 -0
  26. package/docs/plan.md +349 -0
  27. package/docs/quickstart.md +674 -0
  28. package/docs/research.md +362 -0
  29. package/docs/spec.md +244 -0
  30. package/docs/storage-backends.md +326 -0
  31. package/docs/tasks.md +947 -0
  32. package/package.json +1 -1
  33. package/tests/unit/ai/aggregation.test.js +0 -295
  34. package/tests/unit/ai/breakdown.test.js +0 -446
  35. package/tests/unit/ai/classifier.test.js +0 -294
  36. package/tests/unit/ai/council.test.js +0 -262
  37. package/tests/unit/ai/embeddings.test.js +0 -384
  38. package/tests/unit/ai/federation-ai.test.js +0 -344
  39. package/tests/unit/ai/h3-ai.test.js +0 -458
  40. package/tests/unit/ai/index.test.js +0 -304
  41. package/tests/unit/ai/json-ops.test.js +0 -307
  42. package/tests/unit/ai/llm-service.test.js +0 -390
  43. package/tests/unit/ai/nl-query.test.js +0 -383
  44. package/tests/unit/ai/relationships.test.js +0 -311
  45. package/tests/unit/ai/schema-extractor.test.js +0 -384
  46. package/tests/unit/ai/spatial.test.js +0 -279
  47. package/tests/unit/ai/tts.test.js +0 -279
  48. package/tests/unit/content.test.js +0 -332
  49. package/tests/unit/contract/core.test.js +0 -88
  50. package/tests/unit/contract/crypto.test.js +0 -198
  51. package/tests/unit/contract/data.test.js +0 -223
  52. package/tests/unit/contract/federation.test.js +0 -181
  53. package/tests/unit/contract/hierarchical.test.js +0 -113
  54. package/tests/unit/contract/schema.test.js +0 -114
  55. package/tests/unit/contract/social.test.js +0 -217
  56. package/tests/unit/contract/spatial.test.js +0 -110
  57. package/tests/unit/contract/subscriptions.test.js +0 -128
  58. package/tests/unit/contract/utils.test.js +0 -159
  59. package/tests/unit/core.test.js +0 -152
  60. package/tests/unit/crypto.test.js +0 -328
  61. package/tests/unit/federation.test.js +0 -234
  62. package/tests/unit/gun-async.test.js +0 -252
  63. package/tests/unit/hierarchical.test.js +0 -399
  64. package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
  65. package/tests/unit/integration/scenario-02-federation.test.js +0 -76
  66. package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
  67. package/tests/unit/integration/scenario-04-validation.test.js +0 -129
  68. package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
  69. package/tests/unit/integration/scenario-06-social.test.js +0 -135
  70. package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
  71. package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
  72. package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
  73. package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
  74. package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
  75. package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
  76. package/tests/unit/performance/benchmark.test.js +0 -85
  77. package/tests/unit/schema.test.js +0 -213
  78. package/tests/unit/spatial.test.js +0 -158
  79. package/tests/unit/storage.test.js +0 -195
  80. package/tests/unit/subscriptions.test.js +0 -328
  81. package/tests/unit/test-data-permanence-debug.js +0 -197
  82. package/tests/unit/test-data-permanence.js +0 -340
  83. package/tests/unit/test-key-persistence-fixed.js +0 -148
  84. package/tests/unit/test-key-persistence.js +0 -172
  85. package/tests/unit/test-relay-permanence.js +0 -376
  86. package/tests/unit/test-second-node.js +0 -95
  87. package/tests/unit/test-simple-write.js +0 -89
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "holosphere",
3
- "version": "2.0.0-alpha1",
3
+ "version": "2.0.0-alpha2",
4
4
  "description": "Holonic geospatial communication infrastructure combining H3 hexagonal indexing with GunDB distributed P2P storage",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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
- });