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
@@ -1,344 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { FederationAdvisor } from '../../../src/ai/federation-ai.js';
3
-
4
- describe('Unit: FederationAdvisor', () => {
5
- let advisor;
6
- let mockLLM;
7
- let mockHolosphere;
8
- let mockEmbeddings;
9
-
10
- beforeEach(() => {
11
- vi.clearAllMocks();
12
-
13
- mockLLM = {
14
- getJSON: vi.fn()
15
- };
16
-
17
- mockHolosphere = {
18
- getAll: vi.fn().mockResolvedValue([]),
19
- getFederation: vi.fn().mockResolvedValue(null)
20
- };
21
-
22
- mockEmbeddings = {
23
- embed: vi.fn(),
24
- cosineSimilarity: vi.fn()
25
- };
26
-
27
- advisor = new FederationAdvisor(mockLLM, mockHolosphere, mockEmbeddings);
28
- });
29
-
30
- describe('Constructor', () => {
31
- it('should initialize with LLM service', () => {
32
- const a = new FederationAdvisor(mockLLM);
33
- expect(a.llm).toBe(mockLLM);
34
- expect(a.holosphere).toBeNull();
35
- expect(a.embeddings).toBeNull();
36
- });
37
-
38
- it('should accept optional HoloSphere and Embeddings', () => {
39
- expect(advisor.holosphere).toBe(mockHolosphere);
40
- expect(advisor.embeddings).toBe(mockEmbeddings);
41
- });
42
- });
43
-
44
- describe('setHoloSphere', () => {
45
- it('should set HoloSphere instance', () => {
46
- const a = new FederationAdvisor(mockLLM);
47
- a.setHoloSphere(mockHolosphere);
48
- expect(a.holosphere).toBe(mockHolosphere);
49
- });
50
- });
51
-
52
- describe('setEmbeddings', () => {
53
- it('should set Embeddings instance', () => {
54
- const a = new FederationAdvisor(mockLLM);
55
- a.setEmbeddings(mockEmbeddings);
56
- expect(a.embeddings).toBe(mockEmbeddings);
57
- });
58
- });
59
-
60
- describe('suggestFederations', () => {
61
- it('should suggest federations based on content similarity', async () => {
62
- mockHolosphere.getAll
63
- .mockResolvedValueOnce([{ id: 1, title: 'Source Project' }])
64
- .mockResolvedValueOnce([{ id: 2, title: 'Candidate Project' }]);
65
-
66
- mockLLM.getJSON.mockResolvedValue([
67
- {
68
- holon: 'candidate1',
69
- score: 0.85,
70
- reasoning: 'Similar topics',
71
- benefits: ['Knowledge sharing'],
72
- type: 'similarity'
73
- }
74
- ]);
75
-
76
- const result = await advisor.suggestFederations('source_holon', {
77
- candidateHolons: ['candidate1'],
78
- lens: 'projects'
79
- });
80
-
81
- expect(result.holon).toBe('source_holon');
82
- expect(result.suggestions).toHaveLength(1);
83
- expect(result.suggestions[0].score).toBe(0.85);
84
- });
85
-
86
- it('should throw error if HoloSphere not available', async () => {
87
- const a = new FederationAdvisor(mockLLM);
88
-
89
- await expect(a.suggestFederations('holon'))
90
- .rejects.toThrow('HoloSphere instance required');
91
- });
92
-
93
- it('should return empty suggestions if source has no data', async () => {
94
- mockHolosphere.getAll.mockResolvedValue([]);
95
-
96
- const result = await advisor.suggestFederations('holon', {
97
- candidateHolons: ['c1']
98
- });
99
-
100
- expect(result.suggestions).toEqual([]);
101
- expect(result.message).toBe('No data in source holon');
102
- });
103
-
104
- it('should return empty suggestions if no candidates have data', async () => {
105
- mockHolosphere.getAll
106
- .mockResolvedValueOnce([{ id: 1 }]) // source has data
107
- .mockResolvedValue([]); // candidates empty
108
-
109
- const result = await advisor.suggestFederations('holon', {
110
- candidateHolons: ['c1', 'c2']
111
- });
112
-
113
- expect(result.suggestions).toEqual([]);
114
- expect(result.message).toBe('No candidate holons with data');
115
- });
116
-
117
- it('should skip source holon in candidates', async () => {
118
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }]);
119
- mockLLM.getJSON.mockResolvedValue([]);
120
-
121
- await advisor.suggestFederations('holon1', {
122
- candidateHolons: ['holon1', 'holon2']
123
- });
124
-
125
- expect(mockHolosphere.getAll).toHaveBeenCalledTimes(2);
126
- });
127
-
128
- it('should respect maxSuggestions option', async () => {
129
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }]);
130
- mockLLM.getJSON.mockResolvedValue([
131
- { holon: 'c1', score: 0.9 },
132
- { holon: 'c2', score: 0.8 },
133
- { holon: 'c3', score: 0.7 }
134
- ]);
135
-
136
- const result = await advisor.suggestFederations('holon', {
137
- candidateHolons: ['c1', 'c2', 'c3'],
138
- maxSuggestions: 2
139
- });
140
-
141
- expect(result.suggestions).toHaveLength(2);
142
- });
143
- });
144
-
145
- describe('analyzeFederationHealth', () => {
146
- it('should analyze federation health', async () => {
147
- mockHolosphere.getFederation.mockResolvedValue({
148
- federation: ['fed1', 'fed2']
149
- });
150
-
151
- mockHolosphere.getAll
152
- .mockResolvedValueOnce([{ id: 1 }])
153
- .mockResolvedValueOnce([]);
154
-
155
- mockLLM.getJSON.mockResolvedValue({
156
- health_score: 0.7,
157
- status: 'degraded',
158
- active_count: 1,
159
- inactive_count: 1,
160
- issues: ['One federation is inactive'],
161
- recommendations: ['Reactivate fed2'],
162
- summary: 'Partially healthy federation'
163
- });
164
-
165
- const result = await advisor.analyzeFederationHealth('holon1');
166
-
167
- expect(result.holon).toBe('holon1');
168
- expect(result.federation).toEqual(['fed1', 'fed2']);
169
- expect(result.analysis.health_score).toBe(0.7);
170
- });
171
-
172
- it('should throw error if HoloSphere not available', async () => {
173
- const a = new FederationAdvisor(mockLLM);
174
-
175
- await expect(a.analyzeFederationHealth('holon'))
176
- .rejects.toThrow('HoloSphere instance required');
177
- });
178
-
179
- it('should return none health if no federation configured', async () => {
180
- mockHolosphere.getFederation.mockResolvedValue(null);
181
-
182
- const result = await advisor.analyzeFederationHealth('holon1');
183
-
184
- expect(result.health).toBe('none');
185
- expect(result.score).toBe(0);
186
- });
187
-
188
- it('should return none health for empty federation array', async () => {
189
- mockHolosphere.getFederation.mockResolvedValue({ federation: [] });
190
-
191
- const result = await advisor.analyzeFederationHealth('holon1');
192
-
193
- expect(result.health).toBe('none');
194
- });
195
-
196
- it('should handle federation partner errors', async () => {
197
- mockHolosphere.getFederation.mockResolvedValue({
198
- federation: ['fed1']
199
- });
200
-
201
- mockHolosphere.getAll.mockRejectedValue(new Error('Connection failed'));
202
-
203
- mockLLM.getJSON.mockResolvedValue({
204
- health_score: 0.3,
205
- status: 'unhealthy'
206
- });
207
-
208
- const result = await advisor.analyzeFederationHealth('holon1');
209
-
210
- expect(result.analysis).toBeDefined();
211
- });
212
- });
213
-
214
- describe('optimizeFederation', () => {
215
- it('should suggest federation optimizations', async () => {
216
- mockHolosphere.getFederation.mockResolvedValue({
217
- federation: ['fed1']
218
- });
219
-
220
- mockHolosphere.getAll.mockResolvedValue([{ id: 1 }]);
221
-
222
- mockLLM.getJSON
223
- .mockResolvedValueOnce({
224
- health_score: 0.7,
225
- status: 'degraded'
226
- })
227
- .mockResolvedValueOnce({
228
- strengthen: ['fed1'],
229
- reconsider: [],
230
- new_potential: ['Similar region nearby'],
231
- improvements: ['Increase sync frequency'],
232
- priority: 'medium'
233
- });
234
-
235
- const result = await advisor.optimizeFederation('holon1');
236
-
237
- expect(result.strengthen).toBeDefined();
238
- expect(result.improvements).toBeDefined();
239
- });
240
-
241
- it('should return initial suggestion for no federation', async () => {
242
- mockHolosphere.getFederation.mockResolvedValue(null);
243
-
244
- const result = await advisor.optimizeFederation('holon1');
245
-
246
- expect(result.suggestions).toContain('Consider establishing initial federations');
247
- });
248
- });
249
-
250
- describe('analyzeDataFlow', () => {
251
- it('should analyze data flow patterns', async () => {
252
- mockHolosphere.getFederation.mockResolvedValue({
253
- federation: ['fed1', 'fed2'],
254
- notify: ['notify1']
255
- });
256
-
257
- mockLLM.getJSON.mockResolvedValue({
258
- flow_type: 'mixed',
259
- topology: 'hub',
260
- propagation_depth: 2,
261
- bottlenecks: ['Central hub overload'],
262
- recommendations: ['Add redundant paths']
263
- });
264
-
265
- const result = await advisor.analyzeDataFlow('holon1');
266
-
267
- expect(result.flow_type).toBe('mixed');
268
- expect(result.topology).toBe('hub');
269
- });
270
-
271
- it('should throw error if HoloSphere not available', async () => {
272
- const a = new FederationAdvisor(mockLLM);
273
-
274
- await expect(a.analyzeDataFlow('holon'))
275
- .rejects.toThrow('HoloSphere instance required');
276
- });
277
-
278
- it('should return message if no federation', async () => {
279
- mockHolosphere.getFederation.mockResolvedValue(null);
280
-
281
- const result = await advisor.analyzeDataFlow('holon1');
282
-
283
- expect(result.message).toBe('No federation configured');
284
- });
285
- });
286
-
287
- describe('findBridges', () => {
288
- it('should find bridge holons in network', async () => {
289
- mockHolosphere.getFederation
290
- .mockResolvedValueOnce({ federation: ['h2'], notify: [] })
291
- .mockResolvedValueOnce({ federation: ['h1', 'h3'], notify: [] })
292
- .mockResolvedValueOnce({ federation: ['h2'], notify: [] });
293
-
294
- mockLLM.getJSON.mockResolvedValue({
295
- bridges: [{ holon: 'h2', connects: ['cluster1', 'cluster2'] }],
296
- isolated: [],
297
- hubs: [{ holon: 'h2', connections: 2 }],
298
- clusters: [['h1', 'h2'], ['h2', 'h3']],
299
- network_health: 0.8
300
- });
301
-
302
- const result = await advisor.findBridges(['h1', 'h2', 'h3']);
303
-
304
- expect(result.bridges).toBeDefined();
305
- expect(result.bridges[0].holon).toBe('h2');
306
- });
307
-
308
- it('should throw error if HoloSphere not available', async () => {
309
- const a = new FederationAdvisor(mockLLM);
310
-
311
- await expect(a.findBridges(['h1']))
312
- .rejects.toThrow('HoloSphere instance required');
313
- });
314
-
315
- it('should skip holons with errors', async () => {
316
- mockHolosphere.getFederation
317
- .mockResolvedValueOnce({ federation: ['h2'] })
318
- .mockRejectedValueOnce(new Error('Not found'));
319
-
320
- mockLLM.getJSON.mockResolvedValue({
321
- bridges: [],
322
- isolated: ['h1'],
323
- hubs: [],
324
- clusters: [],
325
- network_health: 0.5
326
- });
327
-
328
- const result = await advisor.findBridges(['h1', 'h2']);
329
-
330
- expect(result).toBeDefined();
331
- });
332
-
333
- it('should limit holons analyzed', async () => {
334
- const manyHolons = Array(30).fill('').map((_, i) => `h${i}`);
335
- mockHolosphere.getFederation.mockResolvedValue({ federation: [] });
336
- mockLLM.getJSON.mockResolvedValue({ bridges: [] });
337
-
338
- await advisor.findBridges(manyHolons);
339
-
340
- // Should only query first 20 holons
341
- expect(mockHolosphere.getFederation.mock.calls.length).toBeLessThanOrEqual(20);
342
- });
343
- });
344
- });