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
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Federation Methods Mixin
3
+ * Cross-Holosphere federation and Nostr discovery operations
4
+ */
5
+
6
+ import * as registry from '../federation/registry.js';
7
+ import * as discovery from '../federation/discovery.js';
8
+ import * as federation from '../federation/hologram.js';
9
+ import * as storage from '../storage/unified-storage.js';
10
+ import * as nostrAsync from '../storage/nostr-async.js';
11
+ import * as crypto from '../crypto/secp256k1.js';
12
+ import { ValidationError, AuthorizationError } from './errors.js';
13
+ import { sha256 } from '@noble/hashes/sha256';
14
+ import { bytesToHex } from '@noble/hashes/utils';
15
+
16
+ /**
17
+ * Mixin that adds federation methods to a HoloSphere class
18
+ * @param {Class} Base - Base class to extend
19
+ * @returns {Class} Extended class with federation methods
20
+ */
21
+ export function withFederationMethods(Base) {
22
+ return class extends Base {
23
+ // === Cross-Holosphere Federation ===
24
+
25
+ async addFederatedHolosphere(pubKey, options = {}) {
26
+ if (!pubKey || typeof pubKey !== 'string') {
27
+ throw new ValidationError('pubKey must be a valid public key string');
28
+ }
29
+ return registry.addFederatedPartner(
30
+ this.client,
31
+ this.config.appName,
32
+ pubKey,
33
+ options
34
+ );
35
+ }
36
+
37
+ async removeFederatedHolosphere(pubKey) {
38
+ return registry.removeFederatedPartner(
39
+ this.client,
40
+ this.config.appName,
41
+ pubKey
42
+ );
43
+ }
44
+
45
+ async getFederatedHolospheres() {
46
+ return registry.getFederatedAuthors(
47
+ this.client,
48
+ this.config.appName
49
+ );
50
+ }
51
+
52
+ async getFederationRegistry() {
53
+ return registry.getFederationRegistry(
54
+ this.client,
55
+ this.config.appName
56
+ );
57
+ }
58
+
59
+ async storeInboundCapability(partnerPubKey, capabilityInfo) {
60
+ return registry.storeInboundCapability(
61
+ this.client,
62
+ this.config.appName,
63
+ partnerPubKey,
64
+ capabilityInfo
65
+ );
66
+ }
67
+
68
+ async readFromFederatedSource(sourcePubKey, holonId, lensName, dataId = null) {
69
+ const capabilityEntry = await registry.getCapabilityForAuthor(
70
+ this.client,
71
+ this.config.appName,
72
+ sourcePubKey,
73
+ { holonId, lensName, dataId }
74
+ );
75
+
76
+ if (!capabilityEntry) {
77
+ throw new AuthorizationError('No valid capability for federated source', 'read');
78
+ }
79
+
80
+ const isValid = await this.verifyCapability(
81
+ capabilityEntry.token,
82
+ 'read',
83
+ { holonId, lensName, dataId }
84
+ );
85
+
86
+ if (!isValid) {
87
+ throw new AuthorizationError('Capability verification failed', 'read');
88
+ }
89
+
90
+ if (dataId) {
91
+ const path = storage.buildPath(this.config.appName, holonId, lensName, dataId);
92
+ return nostrAsync.nostrGet(this.client, path, 30000, {
93
+ authors: [sourcePubKey],
94
+ includeAuthor: true,
95
+ });
96
+ } else {
97
+ const path = storage.buildPath(this.config.appName, holonId, lensName);
98
+ return nostrAsync.nostrGetAll(this.client, path, 30000, {
99
+ authors: [sourcePubKey],
100
+ includeAuthor: true,
101
+ });
102
+ }
103
+ }
104
+
105
+ async createCrossHolosphereHologram(sourcePubKey, sourceHolon, lensName, dataId, targetHolon, options = {}) {
106
+ const { embedCapability = true } = options;
107
+
108
+ const capabilityEntry = await registry.getCapabilityForAuthor(
109
+ this.client,
110
+ this.config.appName,
111
+ sourcePubKey,
112
+ { holonId: sourceHolon, lensName, dataId }
113
+ );
114
+
115
+ if (!capabilityEntry) {
116
+ throw new AuthorizationError('No valid capability for cross-holosphere hologram', 'read');
117
+ }
118
+
119
+ const hologram = federation.createHologram(
120
+ sourceHolon,
121
+ targetHolon,
122
+ lensName,
123
+ dataId,
124
+ this.config.appName,
125
+ {
126
+ authorPubKey: sourcePubKey,
127
+ capability: embedCapability ? capabilityEntry.token : null,
128
+ }
129
+ );
130
+
131
+ const targetPath = storage.buildPath(this.config.appName, targetHolon, lensName, dataId);
132
+ await storage.write(this.client, targetPath, hologram);
133
+
134
+ return hologram;
135
+ }
136
+
137
+ async issueCapabilityForFederation(targetPubKey, scope, permissions, options = {}) {
138
+ const { expiresIn = 3600000, trackInRegistry = true } = options;
139
+
140
+ const token = await crypto.issueCapability(
141
+ permissions,
142
+ scope,
143
+ targetPubKey,
144
+ {
145
+ expiresIn,
146
+ issuerKey: this.client.privateKey,
147
+ }
148
+ );
149
+
150
+ if (trackInRegistry) {
151
+ const partner = await registry.getFederatedPartner(
152
+ this.client,
153
+ this.config.appName,
154
+ targetPubKey
155
+ );
156
+
157
+ if (!partner) {
158
+ await registry.addFederatedPartner(
159
+ this.client,
160
+ this.config.appName,
161
+ targetPubKey,
162
+ { addedVia: 'capability_issued' }
163
+ );
164
+ }
165
+
166
+ await registry.storeOutboundCapability(
167
+ this.client,
168
+ this.config.appName,
169
+ targetPubKey,
170
+ {
171
+ tokenHash: await this._hashToken(token),
172
+ scope,
173
+ permissions,
174
+ expires: Date.now() + expiresIn,
175
+ }
176
+ );
177
+ }
178
+
179
+ return token;
180
+ }
181
+
182
+ async _hashToken(token) {
183
+ const encoder = new TextEncoder();
184
+ return bytesToHex(sha256(encoder.encode(token)));
185
+ }
186
+
187
+ // === Nostr Discovery Protocol ===
188
+
189
+ async sendFederationRequest(targetPubKey, options = {}) {
190
+ return discovery.sendFederationRequest(
191
+ this.client,
192
+ this.config.appName,
193
+ targetPubKey,
194
+ options
195
+ );
196
+ }
197
+
198
+ async subscribeFederationRequests(callback) {
199
+ return discovery.subscribeFederationRequests(this.client, callback);
200
+ }
201
+
202
+ async acceptFederationRequest(request, options = {}) {
203
+ return discovery.acceptFederationRequest(
204
+ this.client,
205
+ this.config.appName,
206
+ request,
207
+ options
208
+ );
209
+ }
210
+
211
+ async declineFederationRequest(request, reason = '') {
212
+ return discovery.declineFederationRequest(
213
+ this.client,
214
+ this.config.appName,
215
+ request,
216
+ reason
217
+ );
218
+ }
219
+
220
+ async subscribeFederationAcceptances(callback) {
221
+ return discovery.subscribeFederationAcceptances(
222
+ this.client,
223
+ this.config.appName,
224
+ callback
225
+ );
226
+ }
227
+
228
+ async subscribeFederationDeclines(callback) {
229
+ return discovery.subscribeFederationDeclines(this.client, callback);
230
+ }
231
+
232
+ async getPendingFederationRequests(options = {}) {
233
+ return discovery.getPendingFederationRequests(this.client, options);
234
+ }
235
+ };
236
+ }
237
+
238
+ export default withFederationMethods;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * HoloSphere Library Modules
3
+ * Mixins for extending the base HoloSphere class
4
+ */
5
+
6
+ export { withAIMethods } from './ai-methods.js';
7
+ export { withContractMethods } from './contract-methods.js';
8
+ export { withFederationMethods } from './federation-methods.js';
9
+ export { AuthorizationError, ValidationError } from './errors.js';
10
+
11
+ /**
12
+ * Compose multiple mixins into a single class
13
+ * @param {Class} BaseClass - Base class to extend
14
+ * @param {...Function} mixins - Mixin functions to apply
15
+ * @returns {Class} Composed class
16
+ */
17
+ export function compose(BaseClass, ...mixins) {
18
+ return mixins.reduce((acc, mixin) => mixin(acc), BaseClass);
19
+ }
20
+
21
+ export default {
22
+ withAIMethods,
23
+ withContractMethods,
24
+ withFederationMethods,
25
+ compose
26
+ };
@@ -92,8 +92,8 @@ export function getChildren(holonId) {
92
92
  */
93
93
  export function isValidH3(holonId) {
94
94
  if (typeof holonId !== 'string') return false;
95
- if (holonId.length < 15) return false;
96
- if (!holonId.startsWith('8')) return false;
95
+ // H3 indexes are 15-character hex strings, but can vary slightly
96
+ // Use h3-js isValidCell for proper validation
97
97
  return isValidCell(holonId);
98
98
  }
99
99