holosphere 2.0.0-alpha1 → 2.0.0-alpha4

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 (154) hide show
  1. package/dist/2019-D2OG2idw.js +6680 -0
  2. package/dist/2019-D2OG2idw.js.map +1 -0
  3. package/dist/2019-EION3wKo.cjs +8 -0
  4. package/dist/2019-EION3wKo.cjs.map +1 -0
  5. package/dist/_commonjsHelpers-C37NGDzP.cjs +2 -0
  6. package/dist/_commonjsHelpers-C37NGDzP.cjs.map +1 -0
  7. package/dist/_commonjsHelpers-CUmg6egw.js +7 -0
  8. package/dist/_commonjsHelpers-CUmg6egw.js.map +1 -0
  9. package/dist/browser-BSniCNqO.js +3058 -0
  10. package/dist/browser-BSniCNqO.js.map +1 -0
  11. package/dist/browser-Cq59Ij19.cjs +2 -0
  12. package/dist/browser-Cq59Ij19.cjs.map +1 -0
  13. package/dist/cjs/holosphere.cjs +2 -0
  14. package/dist/cjs/holosphere.cjs.map +1 -0
  15. package/dist/esm/holosphere.js +53 -0
  16. package/dist/esm/holosphere.js.map +1 -0
  17. package/dist/index-BB_vVJgv.cjs +5 -0
  18. package/dist/index-BB_vVJgv.cjs.map +1 -0
  19. package/dist/index-CBitK71M.cjs +12 -0
  20. package/dist/index-CBitK71M.cjs.map +1 -0
  21. package/dist/index-CV0eOogK.js +37423 -0
  22. package/dist/index-CV0eOogK.js.map +1 -0
  23. package/dist/index-Cz-PLCUR.js +15104 -0
  24. package/dist/index-Cz-PLCUR.js.map +1 -0
  25. package/dist/indexeddb-storage-CRsZyB2f.cjs +2 -0
  26. package/dist/indexeddb-storage-CRsZyB2f.cjs.map +1 -0
  27. package/dist/indexeddb-storage-DZaGlY_a.js +132 -0
  28. package/dist/indexeddb-storage-DZaGlY_a.js.map +1 -0
  29. package/dist/memory-storage-BkUi6sZG.js +51 -0
  30. package/dist/memory-storage-BkUi6sZG.js.map +1 -0
  31. package/dist/memory-storage-C0DuUsdY.cjs +2 -0
  32. package/dist/memory-storage-C0DuUsdY.cjs.map +1 -0
  33. package/dist/secp256k1-0kPdAVkK.cjs +12 -0
  34. package/dist/secp256k1-0kPdAVkK.cjs.map +1 -0
  35. package/dist/secp256k1-DN4FVXcv.js +1890 -0
  36. package/dist/secp256k1-DN4FVXcv.js.map +1 -0
  37. package/docs/CONTRACTS.md +797 -0
  38. package/docs/FOSDEM_PROPOSAL.md +388 -0
  39. package/docs/LOCALFIRST.md +266 -0
  40. package/docs/contracts/api-interface.md +793 -0
  41. package/docs/data-model.md +476 -0
  42. package/docs/gun-async-usage.md +338 -0
  43. package/docs/plan.md +349 -0
  44. package/docs/quickstart.md +674 -0
  45. package/docs/research.md +362 -0
  46. package/docs/spec.md +244 -0
  47. package/docs/storage-backends.md +326 -0
  48. package/docs/tasks.md +947 -0
  49. package/examples/demo.html +47 -0
  50. package/package.json +10 -5
  51. package/src/contracts/abis/Appreciative.json +1280 -0
  52. package/src/contracts/abis/AppreciativeFactory.json +101 -0
  53. package/src/contracts/abis/Bundle.json +1435 -0
  54. package/src/contracts/abis/BundleFactory.json +106 -0
  55. package/src/contracts/abis/Holon.json +881 -0
  56. package/src/contracts/abis/Holons.json +330 -0
  57. package/src/contracts/abis/Managed.json +1262 -0
  58. package/src/contracts/abis/ManagedFactory.json +149 -0
  59. package/src/contracts/abis/Membrane.json +261 -0
  60. package/src/contracts/abis/Splitter.json +1624 -0
  61. package/src/contracts/abis/SplitterFactory.json +220 -0
  62. package/src/contracts/abis/TestToken.json +321 -0
  63. package/src/contracts/abis/Zoned.json +1461 -0
  64. package/src/contracts/abis/ZonedFactory.json +154 -0
  65. package/src/contracts/chain-manager.js +375 -0
  66. package/src/contracts/deployer.js +443 -0
  67. package/src/contracts/event-listener.js +507 -0
  68. package/src/contracts/holon-contracts.js +344 -0
  69. package/src/contracts/index.js +83 -0
  70. package/src/contracts/networks.js +224 -0
  71. package/src/contracts/operations.js +670 -0
  72. package/src/contracts/queries.js +589 -0
  73. package/src/core/holosphere.js +453 -1
  74. package/src/crypto/nostr-utils.js +263 -0
  75. package/src/federation/handshake.js +455 -0
  76. package/src/federation/hologram.js +1 -1
  77. package/src/hierarchical/upcast.js +6 -5
  78. package/src/index.js +463 -1939
  79. package/src/lib/ai-methods.js +308 -0
  80. package/src/lib/contract-methods.js +293 -0
  81. package/src/lib/errors.js +23 -0
  82. package/src/lib/federation-methods.js +238 -0
  83. package/src/lib/index.js +26 -0
  84. package/src/spatial/h3-operations.js +2 -2
  85. package/src/storage/backends/gundb-backend.js +377 -46
  86. package/src/storage/global-tables.js +28 -1
  87. package/src/storage/gun-auth.js +303 -0
  88. package/src/storage/gun-federation.js +776 -0
  89. package/src/storage/gun-references.js +198 -0
  90. package/src/storage/gun-schema.js +291 -0
  91. package/src/storage/gun-wrapper.js +347 -31
  92. package/src/storage/indexeddb-storage.js +49 -11
  93. package/src/storage/memory-storage.js +5 -0
  94. package/src/storage/nostr-async.js +45 -23
  95. package/src/storage/nostr-client.js +11 -5
  96. package/src/storage/persistent-storage.js +6 -1
  97. package/src/storage/unified-storage.js +119 -0
  98. package/src/subscriptions/manager.js +1 -1
  99. package/types/index.d.ts +133 -0
  100. package/tests/unit/ai/aggregation.test.js +0 -295
  101. package/tests/unit/ai/breakdown.test.js +0 -446
  102. package/tests/unit/ai/classifier.test.js +0 -294
  103. package/tests/unit/ai/council.test.js +0 -262
  104. package/tests/unit/ai/embeddings.test.js +0 -384
  105. package/tests/unit/ai/federation-ai.test.js +0 -344
  106. package/tests/unit/ai/h3-ai.test.js +0 -458
  107. package/tests/unit/ai/index.test.js +0 -304
  108. package/tests/unit/ai/json-ops.test.js +0 -307
  109. package/tests/unit/ai/llm-service.test.js +0 -390
  110. package/tests/unit/ai/nl-query.test.js +0 -383
  111. package/tests/unit/ai/relationships.test.js +0 -311
  112. package/tests/unit/ai/schema-extractor.test.js +0 -384
  113. package/tests/unit/ai/spatial.test.js +0 -279
  114. package/tests/unit/ai/tts.test.js +0 -279
  115. package/tests/unit/content.test.js +0 -332
  116. package/tests/unit/contract/core.test.js +0 -88
  117. package/tests/unit/contract/crypto.test.js +0 -198
  118. package/tests/unit/contract/data.test.js +0 -223
  119. package/tests/unit/contract/federation.test.js +0 -181
  120. package/tests/unit/contract/hierarchical.test.js +0 -113
  121. package/tests/unit/contract/schema.test.js +0 -114
  122. package/tests/unit/contract/social.test.js +0 -217
  123. package/tests/unit/contract/spatial.test.js +0 -110
  124. package/tests/unit/contract/subscriptions.test.js +0 -128
  125. package/tests/unit/contract/utils.test.js +0 -159
  126. package/tests/unit/core.test.js +0 -152
  127. package/tests/unit/crypto.test.js +0 -328
  128. package/tests/unit/federation.test.js +0 -234
  129. package/tests/unit/gun-async.test.js +0 -252
  130. package/tests/unit/hierarchical.test.js +0 -399
  131. package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
  132. package/tests/unit/integration/scenario-02-federation.test.js +0 -76
  133. package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
  134. package/tests/unit/integration/scenario-04-validation.test.js +0 -129
  135. package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
  136. package/tests/unit/integration/scenario-06-social.test.js +0 -135
  137. package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
  138. package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
  139. package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
  140. package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
  141. package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
  142. package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
  143. package/tests/unit/performance/benchmark.test.js +0 -85
  144. package/tests/unit/schema.test.js +0 -213
  145. package/tests/unit/spatial.test.js +0 -158
  146. package/tests/unit/storage.test.js +0 -195
  147. package/tests/unit/subscriptions.test.js +0 -328
  148. package/tests/unit/test-data-permanence-debug.js +0 -197
  149. package/tests/unit/test-data-permanence.js +0 -340
  150. package/tests/unit/test-key-persistence-fixed.js +0 -148
  151. package/tests/unit/test-key-persistence.js +0 -172
  152. package/tests/unit/test-relay-permanence.js +0 -376
  153. package/tests/unit/test-second-node.js +0 -95
  154. 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
- });