holosphere 2.0.0-alpha1 → 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 (87) hide show
  1. package/dist/cjs/holosphere.cjs +2 -0
  2. package/dist/cjs/holosphere.cjs.map +1 -0
  3. package/dist/esm/holosphere.js +56 -0
  4. package/dist/esm/holosphere.js.map +1 -0
  5. package/dist/index-CDfIuXew.js +15974 -0
  6. package/dist/index-CDfIuXew.js.map +1 -0
  7. package/dist/index-ifOgtDvd.cjs +3 -0
  8. package/dist/index-ifOgtDvd.cjs.map +1 -0
  9. package/dist/indexeddb-storage-CMW4qRQS.js +96 -0
  10. package/dist/indexeddb-storage-CMW4qRQS.js.map +1 -0
  11. package/dist/indexeddb-storage-DLZOgetM.cjs +2 -0
  12. package/dist/indexeddb-storage-DLZOgetM.cjs.map +1 -0
  13. package/dist/memory-storage-DQzcAZlf.js +47 -0
  14. package/dist/memory-storage-DQzcAZlf.js.map +1 -0
  15. package/dist/memory-storage-DmePEP2q.cjs +2 -0
  16. package/dist/memory-storage-DmePEP2q.cjs.map +1 -0
  17. package/dist/secp256k1-CP0ZkpAx.cjs +13 -0
  18. package/dist/secp256k1-CP0ZkpAx.cjs.map +1 -0
  19. package/dist/secp256k1-vOXp40Fx.js +2281 -0
  20. package/dist/secp256k1-vOXp40Fx.js.map +1 -0
  21. package/docs/FOSDEM_PROPOSAL.md +388 -0
  22. package/docs/LOCALFIRST.md +266 -0
  23. package/docs/contracts/api-interface.md +793 -0
  24. package/docs/data-model.md +476 -0
  25. package/docs/gun-async-usage.md +338 -0
  26. package/docs/plan.md +349 -0
  27. package/docs/quickstart.md +674 -0
  28. package/docs/research.md +362 -0
  29. package/docs/spec.md +244 -0
  30. package/docs/storage-backends.md +326 -0
  31. package/docs/tasks.md +947 -0
  32. package/package.json +1 -1
  33. package/tests/unit/ai/aggregation.test.js +0 -295
  34. package/tests/unit/ai/breakdown.test.js +0 -446
  35. package/tests/unit/ai/classifier.test.js +0 -294
  36. package/tests/unit/ai/council.test.js +0 -262
  37. package/tests/unit/ai/embeddings.test.js +0 -384
  38. package/tests/unit/ai/federation-ai.test.js +0 -344
  39. package/tests/unit/ai/h3-ai.test.js +0 -458
  40. package/tests/unit/ai/index.test.js +0 -304
  41. package/tests/unit/ai/json-ops.test.js +0 -307
  42. package/tests/unit/ai/llm-service.test.js +0 -390
  43. package/tests/unit/ai/nl-query.test.js +0 -383
  44. package/tests/unit/ai/relationships.test.js +0 -311
  45. package/tests/unit/ai/schema-extractor.test.js +0 -384
  46. package/tests/unit/ai/spatial.test.js +0 -279
  47. package/tests/unit/ai/tts.test.js +0 -279
  48. package/tests/unit/content.test.js +0 -332
  49. package/tests/unit/contract/core.test.js +0 -88
  50. package/tests/unit/contract/crypto.test.js +0 -198
  51. package/tests/unit/contract/data.test.js +0 -223
  52. package/tests/unit/contract/federation.test.js +0 -181
  53. package/tests/unit/contract/hierarchical.test.js +0 -113
  54. package/tests/unit/contract/schema.test.js +0 -114
  55. package/tests/unit/contract/social.test.js +0 -217
  56. package/tests/unit/contract/spatial.test.js +0 -110
  57. package/tests/unit/contract/subscriptions.test.js +0 -128
  58. package/tests/unit/contract/utils.test.js +0 -159
  59. package/tests/unit/core.test.js +0 -152
  60. package/tests/unit/crypto.test.js +0 -328
  61. package/tests/unit/federation.test.js +0 -234
  62. package/tests/unit/gun-async.test.js +0 -252
  63. package/tests/unit/hierarchical.test.js +0 -399
  64. package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
  65. package/tests/unit/integration/scenario-02-federation.test.js +0 -76
  66. package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
  67. package/tests/unit/integration/scenario-04-validation.test.js +0 -129
  68. package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
  69. package/tests/unit/integration/scenario-06-social.test.js +0 -135
  70. package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
  71. package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
  72. package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
  73. package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
  74. package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
  75. package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
  76. package/tests/unit/performance/benchmark.test.js +0 -85
  77. package/tests/unit/schema.test.js +0 -213
  78. package/tests/unit/spatial.test.js +0 -158
  79. package/tests/unit/storage.test.js +0 -195
  80. package/tests/unit/subscriptions.test.js +0 -328
  81. package/tests/unit/test-data-permanence-debug.js +0 -197
  82. package/tests/unit/test-data-permanence.js +0 -340
  83. package/tests/unit/test-key-persistence-fixed.js +0 -148
  84. package/tests/unit/test-key-persistence.js +0 -172
  85. package/tests/unit/test-relay-permanence.js +0 -376
  86. package/tests/unit/test-second-node.js +0 -95
  87. package/tests/unit/test-simple-write.js +0 -89
@@ -0,0 +1,476 @@
1
+ # Data Model: HoloSphere
2
+
3
+ **Feature**: HoloSphere - Holonic Geospatial Communication Infrastructure
4
+ **Date**: 2025-10-07
5
+ **Status**: Complete
6
+
7
+ ## Overview
8
+ This document defines the core data entities and their relationships for HoloSphere. The model supports both geographic and noospheric organization with decentralized storage via GunDB.
9
+
10
+ ---
11
+
12
+ ## Core Entities
13
+
14
+ ### 1. Holon
15
+ **Definition**: A location in either geographic space (H3 hexagonal cell) or noospheric space (URI/URL identified concept).
16
+
17
+ **Geographic Holon**:
18
+ ```javascript
19
+ {
20
+ id: string, // H3 cell ID (15+ chars, starts with '8')
21
+ type: 'geographic', // Discriminator
22
+ resolution: number, // H3 resolution level (0-15)
23
+ center: { // Optional: lat/lng of cell center
24
+ lat: number,
25
+ lng: number
26
+ },
27
+ parents: string[], // Parent H3 cells (derived from hierarchy)
28
+ children: string[] // Child H3 cells (derived from hierarchy)
29
+ }
30
+ ```
31
+
32
+ **Noospheric Holon**:
33
+ ```javascript
34
+ {
35
+ id: string, // URI/URL (e.g., "nostr://topic/123", "ap://community/abc")
36
+ type: 'noospheric', // Discriminator
37
+ scheme: string, // Protocol/namespace (e.g., "nostr", "ap", "concept")
38
+ namespace: string, // Namespace/domain
39
+ identifier: string // Unique ID within namespace
40
+ }
41
+ ```
42
+
43
+ **Validation Rules**:
44
+ - Geographic: ID must be valid H3 format (validated via h3-js `h3IsValid()`)
45
+ - Noospheric: ID must be valid URI per RFC 3986
46
+ - Both types support identical federation and lens operations
47
+
48
+ **State Transitions**: Immutable structure (holons are location identifiers, not mutable entities)
49
+
50
+ **Storage Path**: Holons themselves are identifiers, not stored objects. Data is stored within holon/lens paths.
51
+
52
+ ---
53
+
54
+ ### 2. Lens
55
+ **Definition**: A categorical data collection within a holon (e.g., "temperature", "events", "social").
56
+
57
+ **Structure**:
58
+ ```javascript
59
+ {
60
+ name: string, // Unique lens identifier within holon
61
+ schemaUri?: string, // Optional: URI to JSON Schema for validation
62
+ strict?: boolean, // Validation mode: true = blocking, false = logging
63
+ federation?: { // Optional: Federation configuration
64
+ inbound: string[], // Holons to receive data from
65
+ outbound: string[] // Holons to send data to
66
+ },
67
+ _meta?: {
68
+ created: timestamp,
69
+ updated: timestamp,
70
+ itemCount: number // Optional: Cached count
71
+ }
72
+ }
73
+ ```
74
+
75
+ **Validation Rules**:
76
+ - Name must be non-empty string
77
+ - Schema validation only occurs if `schemaUri` is set
78
+ - Federation arrays contain valid holon IDs (H3 or URIs)
79
+
80
+ **State Transitions**:
81
+ - Created: When first data item written to holon/lens path
82
+ - Updated: When schema or federation config changes
83
+ - No deletion (lenses persist even if empty)
84
+
85
+ **Storage Path**: `{appname}/{holonId}/{lensName}/_config`
86
+
87
+ ---
88
+
89
+ ### 3. Data Object
90
+ **Definition**: Individual data record within a lens.
91
+
92
+ **Structure**:
93
+ ```javascript
94
+ {
95
+ id: string, // Required: Unique identifier (auto-generated if not provided)
96
+ [customFields]: any, // User-defined fields (validated against schema if present)
97
+ _meta?: { // Optional: System metadata
98
+ timestamp: number, // Creation/update timestamp (Unix epoch ms)
99
+ resolution?: number, // H3 resolution (geographic holons only)
100
+ source?: string, // Originating holon (for federated data)
101
+ hologram?: boolean // True if this is a reference, not original data
102
+ }
103
+ }
104
+ ```
105
+
106
+ **Validation Rules**:
107
+ - `id` is required (generated via crypto.randomUUID() if missing)
108
+ - Custom fields validated against lens schema if strict mode enabled
109
+ - `_meta` fields are reserved and managed by system
110
+
111
+ **State Transitions**:
112
+ - Created: Written to Gun at path `{appname}/{holonId}/{lensName}/{id}`
113
+ - Updated: Modified in place (Gun handles conflict resolution)
114
+ - Deleted: Marked as null in Gun (tombstone for sync)
115
+
116
+ **Storage Path**: `{appname}/{holonId}/{lensName}/{id}`
117
+
118
+ ---
119
+
120
+ ### 4. Hologram
121
+ **Definition**: Lightweight reference to data stored in another holon/lens.
122
+
123
+ **Structure**:
124
+ ```javascript
125
+ {
126
+ id: string, // Reference ID (unique within current lens)
127
+ hologram: true, // Discriminator flag
128
+ soul: string, // Gun soul path to original data
129
+ target: { // Parsed reference components
130
+ appname: string,
131
+ holonId: string,
132
+ lensName: string,
133
+ dataId: string
134
+ },
135
+ _meta: {
136
+ created: timestamp,
137
+ sourceHolon: string // Holon where original data lives
138
+ }
139
+ }
140
+ ```
141
+
142
+ **Validation Rules**:
143
+ - `soul` must be valid Gun path format
144
+ - Target components must parse from soul
145
+ - Circular reference detection during resolution
146
+
147
+ **State Transitions**:
148
+ - Created: When federation propagates data as reference
149
+ - Resolved: Dereferenced to actual data on read
150
+ - Deleted: When original data is deleted
151
+
152
+ **Resolution Algorithm**:
153
+ ```
154
+ 1. Check if hologram flag is true
155
+ 2. Parse soul path to target components
156
+ 3. Track visited souls to prevent infinite loops
157
+ 4. Fetch data from Gun at soul path
158
+ 5. If result is also hologram, recurse (max depth: 10)
159
+ 6. Return final resolved data or null
160
+ ```
161
+
162
+ **Storage Path**: Same as data objects (stored in lens, distinguished by `hologram: true` flag)
163
+
164
+ ---
165
+
166
+ ### 5. Federation
167
+ **Definition**: Bidirectional data sharing relationship between two holons.
168
+
169
+ **Structure**:
170
+ ```javascript
171
+ {
172
+ id: string, // Federation relationship ID
173
+ sourceHolon: string, // Sending holon ID
174
+ targetHolon: string, // Receiving holon ID
175
+ lenses: { // Per-lens configuration
176
+ [lensName]: {
177
+ direction: 'inbound' | 'outbound' | 'bidirectional',
178
+ mode: 'reference' | 'copy', // Default: reference
179
+ filter?: Function, // Optional: Custom filter for selective propagation
180
+ transform?: Function // Optional: Transform data during federation
181
+ }
182
+ },
183
+ _meta: {
184
+ established: timestamp,
185
+ lastSync: timestamp
186
+ }
187
+ }
188
+ ```
189
+
190
+ **Validation Rules**:
191
+ - Source and target must be valid holon IDs
192
+ - Cannot federate holon with itself
193
+ - Lens names must exist in source holon
194
+
195
+ **State Transitions**:
196
+ - Established: Configuration created
197
+ - Active: Data propagating based on rules
198
+ - Suspended: Temporarily disabled (federation config exists but inactive)
199
+ - Terminated: Removed (holograms persist but no new propagation)
200
+
201
+ **Behavior**:
202
+ - **Reference mode (default)**: Creates hologram in target, original data in source
203
+ - **Copy mode**: Duplicates data to target (used when target must be self-sufficient)
204
+ - **Bidirectional**: Both holons have inbound and outbound configured for same lens
205
+
206
+ **Storage Path**: `{appname}/_federation/{federationId}`
207
+
208
+ ---
209
+
210
+ ### 6. Schema
211
+ **Definition**: JSON Schema (2019 draft) validation rules for a lens.
212
+
213
+ **Structure**:
214
+ ```javascript
215
+ {
216
+ uri: string, // Unique schema identifier (URI format)
217
+ lensName: string, // Associated lens
218
+ schema: object, // JSON Schema 2019 object
219
+ strict: boolean, // Validation mode
220
+ _cache: { // Cached compiled validator
221
+ validator: Function, // Ajv compiled validator
222
+ cachedAt: timestamp, // Cache timestamp
223
+ ttl: number // Time-to-live (default: 3600000ms = 1 hour)
224
+ }
225
+ }
226
+ ```
227
+
228
+ **Validation Rules**:
229
+ - Schema must be valid JSON Schema 2019 format
230
+ - URI must be unique across application
231
+ - TTL must be positive integer (milliseconds)
232
+
233
+ **State Transitions**:
234
+ - Defined: Schema created and stored
235
+ - Cached: Validator compiled and cached
236
+ - Expired: Cache TTL exceeded, recompile on next use
237
+ - Updated: Schema modified, cache invalidated
238
+
239
+ **Storage Path**: `{appname}/_schemas/{schemaUri}`
240
+
241
+ ---
242
+
243
+ ### 7. Subscription
244
+ **Definition**: Real-time change notification for a holon/lens combination.
245
+
246
+ **Structure** (runtime only, not persisted):
247
+ ```javascript
248
+ {
249
+ id: string, // Subscription ID (generated)
250
+ holonId: string, // Holon to monitor
251
+ lensName: string, // Lens to monitor
252
+ callback: Function, // User-provided callback(data, key)
253
+ options: {
254
+ includeFederated?: boolean, // Include data from federated holons
255
+ filter?: Function, // Optional filter predicate
256
+ throttle?: number // Milliseconds between updates
257
+ },
258
+ _internal: {
259
+ gunListener: Function, // Gun .on() reference for cleanup
260
+ active: boolean, // Subscription state
261
+ createdAt: timestamp
262
+ }
263
+ }
264
+ ```
265
+
266
+ **Validation Rules**:
267
+ - Holon ID must be valid
268
+ - Lens name must be non-empty
269
+ - Callback must be a function
270
+ - Throttle must be ≥0
271
+
272
+ **State Transitions**:
273
+ - Subscribed: Listener attached to Gun path
274
+ - Active: Receiving and invoking callbacks
275
+ - Unsubscribed: Listener removed, no longer active
276
+
277
+ **Lifecycle**:
278
+ ```javascript
279
+ // Subscribe
280
+ const subscription = holosphere.subscribe(holonId, lensName, (data, key) => {
281
+ console.log('Data changed:', data);
282
+ });
283
+
284
+ // Unsubscribe
285
+ subscription.unsubscribe();
286
+ ```
287
+
288
+ **Storage**: Not persisted (runtime only)
289
+
290
+ ---
291
+
292
+ ### 8. Capability Token
293
+ **Definition**: Cryptographic authorization token for permissions.
294
+
295
+ **Structure**:
296
+ ```javascript
297
+ {
298
+ id: string, // Token ID (generated)
299
+ issuer: string, // Public key of issuer
300
+ recipient: string, // Public key of recipient
301
+ permissions: string[], // Array: 'read', 'write', 'delete', 'modify'
302
+ scope: { // What this token grants access to
303
+ holonId?: string, // Specific holon (or wildcard '*')
304
+ lensName?: string // Specific lens (or wildcard '*')
305
+ },
306
+ expires: timestamp, // Expiration timestamp
307
+ signature: string, // secp256k1 signature of token
308
+ _meta: {
309
+ issued: timestamp,
310
+ nonce: string // Prevents replay attacks
311
+ }
312
+ }
313
+ ```
314
+
315
+ **Validation Rules**:
316
+ - Issuer and recipient must be valid secp256k1 public keys
317
+ - Permissions must be from allowed set
318
+ - Expires must be future timestamp
319
+ - Signature must verify against issuer's public key
320
+ - Nonce must be unique (prevents replay)
321
+
322
+ **State Transitions**:
323
+ - Issued: Token created and signed
324
+ - Active: Within validity period
325
+ - Expired: Past expiration timestamp
326
+ - Revoked: Manually invalidated (requires revocation list)
327
+
328
+ **Verification Algorithm**:
329
+ ```
330
+ 1. Check token.expires > Date.now()
331
+ 2. Verify signature against issuer public key
332
+ 3. Check nonce hasn't been used (replay protection)
333
+ 4. Validate scope matches requested operation
334
+ 5. Confirm permissions include required permission
335
+ ```
336
+
337
+ **Storage Path**: `{appname}/_capabilities/{tokenId}` (optional, tokens can be passed directly)
338
+
339
+ ---
340
+
341
+ ### 9. Social Content
342
+ **Definition**: Protocol-agnostic social data (Nostr events, ActivityPub objects).
343
+
344
+ **Nostr Event**:
345
+ ```javascript
346
+ {
347
+ id: string, // Nostr event ID (hex)
348
+ pubkey: string, // Author public key (hex)
349
+ created_at: number, // Unix timestamp
350
+ kind: number, // Nostr event kind (e.g., 1 = text note)
351
+ tags: string[][], // Nostr tags
352
+ content: string, // Event content
353
+ sig: string, // secp256k1 signature
354
+ _holosphere: { // HoloSphere metadata
355
+ holonId: string, // Geographic/noospheric location
356
+ lensName: string, // Storage lens
357
+ accessLevel: 'public' | 'protected' | 'private'
358
+ }
359
+ }
360
+ ```
361
+
362
+ **ActivityPub Object**:
363
+ ```javascript
364
+ {
365
+ "@context": string | string[],
366
+ id: string, // ActivityPub object URI
367
+ type: string, // Object type (e.g., "Note", "Article")
368
+ actor: string, // Actor URI
369
+ published: string, // ISO 8601 timestamp
370
+ content: string, // Object content
371
+ signature: object, // JSON-LD signature
372
+ _holosphere: { // HoloSphere metadata
373
+ holonId: string,
374
+ lensName: string,
375
+ accessLevel: 'public' | 'protected' | 'private'
376
+ }
377
+ }
378
+ ```
379
+
380
+ **Validation Rules**:
381
+ - Nostr: Signature must verify per NIP-01
382
+ - ActivityPub: JSON-LD signature must verify
383
+ - Access level determines visibility in queries
384
+
385
+ **State Transitions**:
386
+ - Published: Created with valid signature
387
+ - Federated: Propagated to other holons
388
+ - Deleted: Marked with deletion event (protocol-specific)
389
+
390
+ **Storage Path**: `{appname}/{holonId}/social/{eventId}` (default lens: "social")
391
+
392
+ ---
393
+
394
+ ## Entity Relationships
395
+
396
+ ```
397
+ Holon (1) ──── (N) Lens
398
+ │ │
399
+ │ │
400
+ │ └──── (N) Data Object
401
+ │ │
402
+ │ └──── (N) Hologram (references Data Object)
403
+
404
+ └──── (N) Federation ──── (N) Holon
405
+
406
+ └──── configures ──── (N) Lens
407
+
408
+ Schema (1) ──── validates ──── (N) Lens
409
+
410
+ Subscription ──── monitors ──── (1) Holon + (1) Lens
411
+
412
+ Capability Token ──── grants access to ──── Holon/Lens scope
413
+
414
+ Social Content ──── stored as ──── Data Object in Lens
415
+ ```
416
+
417
+ ---
418
+
419
+ ## Storage Patterns
420
+
421
+ ### Gun Graph Structure
422
+ ```
423
+ {appname}
424
+ ├── {holonId}
425
+ │ ├── {lensName}
426
+ │ │ ├── {dataId} # Data objects
427
+ │ │ ├── {dataId} # More data objects
428
+ │ │ └── _config # Lens configuration
429
+ │ └── {anotherLens}
430
+ │ └── ...
431
+ ├── _federation
432
+ │ └── {federationId} # Federation configs
433
+ ├── _schemas
434
+ │ └── {schemaUri} # Schema definitions
435
+ └── _capabilities
436
+ └── {tokenId} # Capability tokens (optional)
437
+ ```
438
+
439
+ ### Path Examples
440
+ ```
441
+ // Geographic data
442
+ "myapp/8928342e20fffff/temperature/sensor-001"
443
+
444
+ // Noospheric data
445
+ "myapp/nostr:~2Ftopic~2F123/discussions/thread-456"
446
+
447
+ // Federation config
448
+ "myapp/_federation/geo-to-concept-link"
449
+
450
+ // Schema
451
+ "myapp/_schemas/https:~2F~2Fschema.example.com~2Ftemperature.json"
452
+ ```
453
+
454
+ **Note**: Gun encodes special characters in paths (e.g., `/` → `~2F`, `:` → `~3A`)
455
+
456
+ ---
457
+
458
+ ## Validation Summary
459
+
460
+ | Entity | Required Fields | Unique Constraints | References |
461
+ |--------|----------------|-------------------|------------|
462
+ | Holon | id, type | id | - |
463
+ | Lens | name | name within holon | Holon |
464
+ | Data Object | id | id within lens | Lens, optionally Schema |
465
+ | Hologram | id, soul, target | id within lens | Data Object (target) |
466
+ | Federation | id, sourceHolon, targetHolon | id | Holon (source & target) |
467
+ | Schema | uri, schema | uri | Lens |
468
+ | Subscription | id, holonId, lensName, callback | - | Holon, Lens |
469
+ | Capability Token | id, issuer, recipient, expires | id | - |
470
+ | Social Content | (protocol-specific) | id/event ID | Data Object, Lens |
471
+
472
+ ---
473
+
474
+ ## Next Steps
475
+ ✅ Data model complete with all entities, relationships, and validation rules
476
+ ➡️ Proceed to API contract generation