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.
- package/LICENSE +162 -38
- package/dist/cjs/holosphere.cjs +2 -0
- package/dist/cjs/holosphere.cjs.map +1 -0
- package/dist/esm/holosphere.js +56 -0
- package/dist/esm/holosphere.js.map +1 -0
- package/dist/index-CDfIuXew.js +15974 -0
- package/dist/index-CDfIuXew.js.map +1 -0
- package/dist/index-ifOgtDvd.cjs +3 -0
- package/dist/index-ifOgtDvd.cjs.map +1 -0
- package/dist/indexeddb-storage-CMW4qRQS.js +96 -0
- package/dist/indexeddb-storage-CMW4qRQS.js.map +1 -0
- package/dist/indexeddb-storage-DLZOgetM.cjs +2 -0
- package/dist/indexeddb-storage-DLZOgetM.cjs.map +1 -0
- package/dist/memory-storage-DQzcAZlf.js +47 -0
- package/dist/memory-storage-DQzcAZlf.js.map +1 -0
- package/dist/memory-storage-DmePEP2q.cjs +2 -0
- package/dist/memory-storage-DmePEP2q.cjs.map +1 -0
- package/dist/secp256k1-CP0ZkpAx.cjs +13 -0
- package/dist/secp256k1-CP0ZkpAx.cjs.map +1 -0
- package/dist/secp256k1-vOXp40Fx.js +2281 -0
- package/dist/secp256k1-vOXp40Fx.js.map +1 -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/package.json +1 -1
- 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,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
|