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