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.
- package/dist/2019-D2OG2idw.js +6680 -0
- package/dist/2019-D2OG2idw.js.map +1 -0
- package/dist/2019-EION3wKo.cjs +8 -0
- package/dist/2019-EION3wKo.cjs.map +1 -0
- package/dist/_commonjsHelpers-C37NGDzP.cjs +2 -0
- package/dist/_commonjsHelpers-C37NGDzP.cjs.map +1 -0
- package/dist/_commonjsHelpers-CUmg6egw.js +7 -0
- package/dist/_commonjsHelpers-CUmg6egw.js.map +1 -0
- package/dist/browser-BSniCNqO.js +3058 -0
- package/dist/browser-BSniCNqO.js.map +1 -0
- package/dist/browser-Cq59Ij19.cjs +2 -0
- package/dist/browser-Cq59Ij19.cjs.map +1 -0
- package/dist/cjs/holosphere.cjs +2 -0
- package/dist/cjs/holosphere.cjs.map +1 -0
- package/dist/esm/holosphere.js +53 -0
- package/dist/esm/holosphere.js.map +1 -0
- package/dist/index-BB_vVJgv.cjs +5 -0
- package/dist/index-BB_vVJgv.cjs.map +1 -0
- package/dist/index-CBitK71M.cjs +12 -0
- package/dist/index-CBitK71M.cjs.map +1 -0
- package/dist/index-CV0eOogK.js +37423 -0
- package/dist/index-CV0eOogK.js.map +1 -0
- package/dist/index-Cz-PLCUR.js +15104 -0
- package/dist/index-Cz-PLCUR.js.map +1 -0
- package/dist/indexeddb-storage-CRsZyB2f.cjs +2 -0
- package/dist/indexeddb-storage-CRsZyB2f.cjs.map +1 -0
- package/dist/indexeddb-storage-DZaGlY_a.js +132 -0
- package/dist/indexeddb-storage-DZaGlY_a.js.map +1 -0
- package/dist/memory-storage-BkUi6sZG.js +51 -0
- package/dist/memory-storage-BkUi6sZG.js.map +1 -0
- package/dist/memory-storage-C0DuUsdY.cjs +2 -0
- package/dist/memory-storage-C0DuUsdY.cjs.map +1 -0
- package/dist/secp256k1-0kPdAVkK.cjs +12 -0
- package/dist/secp256k1-0kPdAVkK.cjs.map +1 -0
- package/dist/secp256k1-DN4FVXcv.js +1890 -0
- package/dist/secp256k1-DN4FVXcv.js.map +1 -0
- package/docs/CONTRACTS.md +797 -0
- package/docs/FOSDEM_PROPOSAL.md +388 -0
- package/docs/LOCALFIRST.md +266 -0
- package/docs/contracts/api-interface.md +793 -0
- package/docs/data-model.md +476 -0
- package/docs/gun-async-usage.md +338 -0
- package/docs/plan.md +349 -0
- package/docs/quickstart.md +674 -0
- package/docs/research.md +362 -0
- package/docs/spec.md +244 -0
- package/docs/storage-backends.md +326 -0
- package/docs/tasks.md +947 -0
- package/examples/demo.html +47 -0
- package/package.json +10 -5
- package/src/contracts/abis/Appreciative.json +1280 -0
- package/src/contracts/abis/AppreciativeFactory.json +101 -0
- package/src/contracts/abis/Bundle.json +1435 -0
- package/src/contracts/abis/BundleFactory.json +106 -0
- package/src/contracts/abis/Holon.json +881 -0
- package/src/contracts/abis/Holons.json +330 -0
- package/src/contracts/abis/Managed.json +1262 -0
- package/src/contracts/abis/ManagedFactory.json +149 -0
- package/src/contracts/abis/Membrane.json +261 -0
- package/src/contracts/abis/Splitter.json +1624 -0
- package/src/contracts/abis/SplitterFactory.json +220 -0
- package/src/contracts/abis/TestToken.json +321 -0
- package/src/contracts/abis/Zoned.json +1461 -0
- package/src/contracts/abis/ZonedFactory.json +154 -0
- package/src/contracts/chain-manager.js +375 -0
- package/src/contracts/deployer.js +443 -0
- package/src/contracts/event-listener.js +507 -0
- package/src/contracts/holon-contracts.js +344 -0
- package/src/contracts/index.js +83 -0
- package/src/contracts/networks.js +224 -0
- package/src/contracts/operations.js +670 -0
- package/src/contracts/queries.js +589 -0
- package/src/core/holosphere.js +453 -1
- package/src/crypto/nostr-utils.js +263 -0
- package/src/federation/handshake.js +455 -0
- package/src/federation/hologram.js +1 -1
- package/src/hierarchical/upcast.js +6 -5
- package/src/index.js +463 -1939
- package/src/lib/ai-methods.js +308 -0
- package/src/lib/contract-methods.js +293 -0
- package/src/lib/errors.js +23 -0
- package/src/lib/federation-methods.js +238 -0
- package/src/lib/index.js +26 -0
- package/src/spatial/h3-operations.js +2 -2
- package/src/storage/backends/gundb-backend.js +377 -46
- package/src/storage/global-tables.js +28 -1
- package/src/storage/gun-auth.js +303 -0
- package/src/storage/gun-federation.js +776 -0
- package/src/storage/gun-references.js +198 -0
- package/src/storage/gun-schema.js +291 -0
- package/src/storage/gun-wrapper.js +347 -31
- package/src/storage/indexeddb-storage.js +49 -11
- package/src/storage/memory-storage.js +5 -0
- package/src/storage/nostr-async.js +45 -23
- package/src/storage/nostr-client.js +11 -5
- package/src/storage/persistent-storage.js +6 -1
- package/src/storage/unified-storage.js +119 -0
- package/src/subscriptions/manager.js +1 -1
- package/types/index.d.ts +133 -0
- package/tests/unit/ai/aggregation.test.js +0 -295
- package/tests/unit/ai/breakdown.test.js +0 -446
- package/tests/unit/ai/classifier.test.js +0 -294
- package/tests/unit/ai/council.test.js +0 -262
- package/tests/unit/ai/embeddings.test.js +0 -384
- package/tests/unit/ai/federation-ai.test.js +0 -344
- package/tests/unit/ai/h3-ai.test.js +0 -458
- package/tests/unit/ai/index.test.js +0 -304
- package/tests/unit/ai/json-ops.test.js +0 -307
- package/tests/unit/ai/llm-service.test.js +0 -390
- package/tests/unit/ai/nl-query.test.js +0 -383
- package/tests/unit/ai/relationships.test.js +0 -311
- package/tests/unit/ai/schema-extractor.test.js +0 -384
- package/tests/unit/ai/spatial.test.js +0 -279
- package/tests/unit/ai/tts.test.js +0 -279
- package/tests/unit/content.test.js +0 -332
- package/tests/unit/contract/core.test.js +0 -88
- package/tests/unit/contract/crypto.test.js +0 -198
- package/tests/unit/contract/data.test.js +0 -223
- package/tests/unit/contract/federation.test.js +0 -181
- package/tests/unit/contract/hierarchical.test.js +0 -113
- package/tests/unit/contract/schema.test.js +0 -114
- package/tests/unit/contract/social.test.js +0 -217
- package/tests/unit/contract/spatial.test.js +0 -110
- package/tests/unit/contract/subscriptions.test.js +0 -128
- package/tests/unit/contract/utils.test.js +0 -159
- package/tests/unit/core.test.js +0 -152
- package/tests/unit/crypto.test.js +0 -328
- package/tests/unit/federation.test.js +0 -234
- package/tests/unit/gun-async.test.js +0 -252
- package/tests/unit/hierarchical.test.js +0 -399
- package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
- package/tests/unit/integration/scenario-02-federation.test.js +0 -76
- package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
- package/tests/unit/integration/scenario-04-validation.test.js +0 -129
- package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
- package/tests/unit/integration/scenario-06-social.test.js +0 -135
- package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
- package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
- package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
- package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
- package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
- package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
- package/tests/unit/performance/benchmark.test.js +0 -85
- package/tests/unit/schema.test.js +0 -213
- package/tests/unit/spatial.test.js +0 -158
- package/tests/unit/storage.test.js +0 -195
- package/tests/unit/subscriptions.test.js +0 -328
- package/tests/unit/test-data-permanence-debug.js +0 -197
- package/tests/unit/test-data-permanence.js +0 -340
- package/tests/unit/test-key-persistence-fixed.js +0 -148
- package/tests/unit/test-key-persistence.js +0 -172
- package/tests/unit/test-relay-permanence.js +0 -376
- package/tests/unit/test-second-node.js +0 -95
- 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;
|
package/src/lib/index.js
ADDED
|
@@ -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
|
-
|
|
96
|
-
|
|
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
|
|