@web_of_trust/core 0.2.2

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 (141) hide show
  1. package/README.md +357 -0
  2. package/dist/adapters/authorization/InMemoryAuthorizationAdapter.d.ts +30 -0
  3. package/dist/adapters/authorization/InMemoryAuthorizationAdapter.d.ts.map +1 -0
  4. package/dist/adapters/crypto/WebCryptoAdapter.d.ts +30 -0
  5. package/dist/adapters/crypto/WebCryptoAdapter.d.ts.map +1 -0
  6. package/dist/adapters/crypto/index.d.ts +2 -0
  7. package/dist/adapters/crypto/index.d.ts.map +1 -0
  8. package/dist/adapters/discovery/HttpDiscoveryAdapter.d.ts +25 -0
  9. package/dist/adapters/discovery/HttpDiscoveryAdapter.d.ts.map +1 -0
  10. package/dist/adapters/discovery/InMemoryGraphCacheStore.d.ts +29 -0
  11. package/dist/adapters/discovery/InMemoryGraphCacheStore.d.ts.map +1 -0
  12. package/dist/adapters/discovery/InMemoryPublishStateStore.d.ts +13 -0
  13. package/dist/adapters/discovery/InMemoryPublishStateStore.d.ts.map +1 -0
  14. package/dist/adapters/discovery/OfflineFirstDiscoveryAdapter.d.ts +62 -0
  15. package/dist/adapters/discovery/OfflineFirstDiscoveryAdapter.d.ts.map +1 -0
  16. package/dist/adapters/index.d.ts +5 -0
  17. package/dist/adapters/index.d.ts.map +1 -0
  18. package/dist/adapters/interfaces/AuthorizationAdapter.d.ts +52 -0
  19. package/dist/adapters/interfaces/AuthorizationAdapter.d.ts.map +1 -0
  20. package/dist/adapters/interfaces/CryptoAdapter.d.ts +43 -0
  21. package/dist/adapters/interfaces/CryptoAdapter.d.ts.map +1 -0
  22. package/dist/adapters/interfaces/DiscoveryAdapter.d.ts +71 -0
  23. package/dist/adapters/interfaces/DiscoveryAdapter.d.ts.map +1 -0
  24. package/dist/adapters/interfaces/GraphCacheStore.d.ts +66 -0
  25. package/dist/adapters/interfaces/GraphCacheStore.d.ts.map +1 -0
  26. package/dist/adapters/interfaces/MessagingAdapter.d.ts +23 -0
  27. package/dist/adapters/interfaces/MessagingAdapter.d.ts.map +1 -0
  28. package/dist/adapters/interfaces/OutboxStore.d.ts +35 -0
  29. package/dist/adapters/interfaces/OutboxStore.d.ts.map +1 -0
  30. package/dist/adapters/interfaces/PublishStateStore.d.ts +23 -0
  31. package/dist/adapters/interfaces/PublishStateStore.d.ts.map +1 -0
  32. package/dist/adapters/interfaces/ReactiveStorageAdapter.d.ts +23 -0
  33. package/dist/adapters/interfaces/ReactiveStorageAdapter.d.ts.map +1 -0
  34. package/dist/adapters/interfaces/ReplicationAdapter.d.ts +57 -0
  35. package/dist/adapters/interfaces/ReplicationAdapter.d.ts.map +1 -0
  36. package/dist/adapters/interfaces/SpaceMetadataStorage.d.ts +46 -0
  37. package/dist/adapters/interfaces/SpaceMetadataStorage.d.ts.map +1 -0
  38. package/dist/adapters/interfaces/StorageAdapter.d.ts +32 -0
  39. package/dist/adapters/interfaces/StorageAdapter.d.ts.map +1 -0
  40. package/dist/adapters/interfaces/Subscribable.d.ts +22 -0
  41. package/dist/adapters/interfaces/Subscribable.d.ts.map +1 -0
  42. package/dist/adapters/interfaces/index.d.ts +12 -0
  43. package/dist/adapters/interfaces/index.d.ts.map +1 -0
  44. package/dist/adapters/messaging/AutomergeOutboxStore.d.ts +24 -0
  45. package/dist/adapters/messaging/AutomergeOutboxStore.d.ts.map +1 -0
  46. package/dist/adapters/messaging/InMemoryMessagingAdapter.d.ts +36 -0
  47. package/dist/adapters/messaging/InMemoryMessagingAdapter.d.ts.map +1 -0
  48. package/dist/adapters/messaging/InMemoryOutboxStore.d.ts +12 -0
  49. package/dist/adapters/messaging/InMemoryOutboxStore.d.ts.map +1 -0
  50. package/dist/adapters/messaging/OutboxMessagingAdapter.d.ts +61 -0
  51. package/dist/adapters/messaging/OutboxMessagingAdapter.d.ts.map +1 -0
  52. package/dist/adapters/messaging/TracedOutboxMessagingAdapter.d.ts +20 -0
  53. package/dist/adapters/messaging/TracedOutboxMessagingAdapter.d.ts.map +1 -0
  54. package/dist/adapters/messaging/WebSocketMessagingAdapter.d.ts +63 -0
  55. package/dist/adapters/messaging/WebSocketMessagingAdapter.d.ts.map +1 -0
  56. package/dist/adapters/messaging/index.d.ts +3 -0
  57. package/dist/adapters/messaging/index.d.ts.map +1 -0
  58. package/dist/adapters/storage/AutomergeSpaceMetadataStorage.d.ts +22 -0
  59. package/dist/adapters/storage/AutomergeSpaceMetadataStorage.d.ts.map +1 -0
  60. package/dist/adapters/storage/InMemoryCompactStore.d.ts +18 -0
  61. package/dist/adapters/storage/InMemoryCompactStore.d.ts.map +1 -0
  62. package/dist/adapters/storage/InMemorySpaceMetadataStorage.d.ts +17 -0
  63. package/dist/adapters/storage/InMemorySpaceMetadataStorage.d.ts.map +1 -0
  64. package/dist/adapters/storage/IndexedDBSpaceMetadataStorage.d.ts +15 -0
  65. package/dist/adapters/storage/IndexedDBSpaceMetadataStorage.d.ts.map +1 -0
  66. package/dist/adapters/storage/LocalStorageAdapter.d.ts +26 -0
  67. package/dist/adapters/storage/LocalStorageAdapter.d.ts.map +1 -0
  68. package/dist/adapters/storage/index.d.ts +2 -0
  69. package/dist/adapters/storage/index.d.ts.map +1 -0
  70. package/dist/crypto/capabilities.d.ts +80 -0
  71. package/dist/crypto/capabilities.d.ts.map +1 -0
  72. package/dist/crypto/did.d.ts +19 -0
  73. package/dist/crypto/did.d.ts.map +1 -0
  74. package/dist/crypto/encoding.d.ts +7 -0
  75. package/dist/crypto/encoding.d.ts.map +1 -0
  76. package/dist/crypto/envelope-auth.d.ts +30 -0
  77. package/dist/crypto/envelope-auth.d.ts.map +1 -0
  78. package/dist/crypto/index.d.ts +4 -0
  79. package/dist/crypto/index.d.ts.map +1 -0
  80. package/dist/crypto/jws.d.ts +26 -0
  81. package/dist/crypto/jws.d.ts.map +1 -0
  82. package/dist/identity/SeedStorage.d.ts +64 -0
  83. package/dist/identity/SeedStorage.d.ts.map +1 -0
  84. package/dist/identity/WotIdentity.d.ts +134 -0
  85. package/dist/identity/WotIdentity.d.ts.map +1 -0
  86. package/dist/identity/index.d.ts +3 -0
  87. package/dist/identity/index.d.ts.map +1 -0
  88. package/dist/index.d.ts +69 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +6840 -0
  91. package/dist/services/AttestationDeliveryService.d.ts +61 -0
  92. package/dist/services/AttestationDeliveryService.d.ts.map +1 -0
  93. package/dist/services/EncryptedSyncService.d.ts +26 -0
  94. package/dist/services/EncryptedSyncService.d.ts.map +1 -0
  95. package/dist/services/GraphCacheService.d.ts +56 -0
  96. package/dist/services/GraphCacheService.d.ts.map +1 -0
  97. package/dist/services/GroupKeyService.d.ts +43 -0
  98. package/dist/services/GroupKeyService.d.ts.map +1 -0
  99. package/dist/services/ProfileService.d.ts +19 -0
  100. package/dist/services/ProfileService.d.ts.map +1 -0
  101. package/dist/services/VaultClient.d.ts +53 -0
  102. package/dist/services/VaultClient.d.ts.map +1 -0
  103. package/dist/services/VaultPushScheduler.d.ts +49 -0
  104. package/dist/services/VaultPushScheduler.d.ts.map +1 -0
  105. package/dist/services/index.d.ts +2 -0
  106. package/dist/services/index.d.ts.map +1 -0
  107. package/dist/storage/CompactStorageManager.d.ts +22 -0
  108. package/dist/storage/CompactStorageManager.d.ts.map +1 -0
  109. package/dist/storage/PersistenceMetrics.d.ts +141 -0
  110. package/dist/storage/PersistenceMetrics.d.ts.map +1 -0
  111. package/dist/storage/TraceLog.d.ts +85 -0
  112. package/dist/storage/TraceLog.d.ts.map +1 -0
  113. package/dist/storage/TracedCompactStorageManager.d.ts +12 -0
  114. package/dist/storage/TracedCompactStorageManager.d.ts.map +1 -0
  115. package/dist/types/attestation.d.ts +33 -0
  116. package/dist/types/attestation.d.ts.map +1 -0
  117. package/dist/types/contact.d.ts +25 -0
  118. package/dist/types/contact.d.ts.map +1 -0
  119. package/dist/types/identity.d.ts +28 -0
  120. package/dist/types/identity.d.ts.map +1 -0
  121. package/dist/types/index.d.ts +9 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/types/messaging.d.ts +33 -0
  124. package/dist/types/messaging.d.ts.map +1 -0
  125. package/dist/types/proof.d.ts +12 -0
  126. package/dist/types/proof.d.ts.map +1 -0
  127. package/dist/types/resource-ref.d.ts +25 -0
  128. package/dist/types/resource-ref.d.ts.map +1 -0
  129. package/dist/types/space.d.ts +25 -0
  130. package/dist/types/space.d.ts.map +1 -0
  131. package/dist/types/verification.d.ts +49 -0
  132. package/dist/types/verification.d.ts.map +1 -0
  133. package/dist/verification/VerificationHelper.d.ts +75 -0
  134. package/dist/verification/VerificationHelper.d.ts.map +1 -0
  135. package/dist/verification/index.d.ts +2 -0
  136. package/dist/verification/index.d.ts.map +1 -0
  137. package/dist/wordlists/german-positive.d.ts +21 -0
  138. package/dist/wordlists/german-positive.d.ts.map +1 -0
  139. package/dist/wordlists/index.d.ts +2 -0
  140. package/dist/wordlists/index.d.ts.map +1 -0
  141. package/package.json +56 -0
@@ -0,0 +1,43 @@
1
+ import { KeyPair } from '../../types';
2
+ /**
3
+ * Encrypted payload structure for E2E encryption
4
+ */
5
+ export interface EncryptedPayload {
6
+ ciphertext: Uint8Array;
7
+ nonce: Uint8Array;
8
+ ephemeralPublicKey?: Uint8Array;
9
+ }
10
+ /**
11
+ * Crypto adapter interface for all cryptographic operations.
12
+ *
13
+ * Framework-agnostic: Can be implemented with Web Crypto API,
14
+ * noble/ed25519, libsodium, or any other crypto library.
15
+ */
16
+ export interface CryptoAdapter {
17
+ generateKeyPair(): Promise<KeyPair>;
18
+ exportKeyPair(keyPair: KeyPair): Promise<{
19
+ publicKey: string;
20
+ privateKey: string;
21
+ }>;
22
+ importKeyPair(exported: {
23
+ publicKey: string;
24
+ privateKey: string;
25
+ }): Promise<KeyPair>;
26
+ exportPublicKey(publicKey: CryptoKey): Promise<string>;
27
+ importPublicKey(exported: string): Promise<CryptoKey>;
28
+ createDid(publicKey: CryptoKey): Promise<string>;
29
+ didToPublicKey(did: string): Promise<CryptoKey>;
30
+ sign(data: Uint8Array, privateKey: CryptoKey): Promise<Uint8Array>;
31
+ verify(data: Uint8Array, signature: Uint8Array, publicKey: CryptoKey): Promise<boolean>;
32
+ signString(data: string, privateKey: CryptoKey): Promise<string>;
33
+ verifyString(data: string, signature: string, publicKey: CryptoKey): Promise<boolean>;
34
+ generateSymmetricKey(): Promise<Uint8Array>;
35
+ encryptSymmetric(plaintext: Uint8Array, key: Uint8Array): Promise<{
36
+ ciphertext: Uint8Array;
37
+ nonce: Uint8Array;
38
+ }>;
39
+ decryptSymmetric(ciphertext: Uint8Array, nonce: Uint8Array, key: Uint8Array): Promise<Uint8Array>;
40
+ generateNonce(): string;
41
+ hashData(data: Uint8Array): Promise<Uint8Array>;
42
+ }
43
+ //# sourceMappingURL=CryptoAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CryptoAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/CryptoAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,UAAU,CAAA;IACjB,kBAAkB,CAAC,EAAE,UAAU,CAAA;CAChC;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAE5B,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACnC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnF,aAAa,CAAC,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACpF,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACtD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IAGrD,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAChD,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IAG/C,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAClE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACvF,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAChE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAGrF,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,CAAA;IAC3C,gBAAgB,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC,CAAA;IAChH,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAGjG,aAAa,IAAI,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CAChD"}
@@ -0,0 +1,71 @@
1
+ import { PublicProfile } from '../../types/identity';
2
+ import { Verification } from '../../types/verification';
3
+ import { Attestation } from '../../types/attestation';
4
+ import { WotIdentity } from '../../identity/WotIdentity';
5
+ /**
6
+ * Published verifications data — wraps an array of verifications
7
+ * about a DID, signed by the DID owner as JWS.
8
+ */
9
+ export interface PublicVerificationsData {
10
+ did: string;
11
+ verifications: Verification[];
12
+ updatedAt: string;
13
+ }
14
+ /**
15
+ * Published attestations data — wraps an array of accepted attestations
16
+ * about a DID, signed by the DID owner as JWS.
17
+ */
18
+ export interface PublicAttestationsData {
19
+ did: string;
20
+ attestations: Attestation[];
21
+ updatedAt: string;
22
+ }
23
+ /**
24
+ * Lightweight summary for batch queries.
25
+ * Unsigned (derived from already-verified JWS data server-side).
26
+ */
27
+ export interface ProfileSummary {
28
+ did: string;
29
+ name: string | null;
30
+ verificationCount: number;
31
+ attestationCount: number;
32
+ }
33
+ /**
34
+ * Result of resolving a profile — includes cache metadata.
35
+ * Allows callers to distinguish fresh network data from cached fallback.
36
+ */
37
+ export interface ProfileResolveResult {
38
+ profile: PublicProfile | null;
39
+ fromCache: boolean;
40
+ }
41
+ /**
42
+ * Discovery adapter interface for public profile lookup.
43
+ *
44
+ * Framework-agnostic: Can be implemented with HTTP REST (POC, wot-profiles),
45
+ * Automerge Auto-Groups, IPFS, DHT, or Nostr.
46
+ *
47
+ * The DiscoveryAdapter answers the question: "Who is this DID?"
48
+ * — before any contact exists.
49
+ *
50
+ * Design principles:
51
+ * - All data is Ed25519-signed (JWS) — integrity without confidentiality
52
+ * - The DID owner controls what is public
53
+ * - Anonymously readable — no login needed
54
+ * - No authentication — the cryptographic signature IS the authorization
55
+ * - Server is a dumb cache — truth lives locally
56
+ *
57
+ * Three orthogonal axes:
58
+ * Discovery (this) → Messaging → Replication
59
+ * VOR dem Kontakt ZWISCHEN INNERHALB
60
+ * öffentlich privat Gruppe
61
+ */
62
+ export interface DiscoveryAdapter {
63
+ publishProfile(data: PublicProfile, identity: WotIdentity): Promise<void>;
64
+ publishVerifications(data: PublicVerificationsData, identity: WotIdentity): Promise<void>;
65
+ publishAttestations(data: PublicAttestationsData, identity: WotIdentity): Promise<void>;
66
+ resolveProfile(did: string): Promise<ProfileResolveResult>;
67
+ resolveVerifications(did: string): Promise<Verification[]>;
68
+ resolveAttestations(did: string): Promise<Attestation[]>;
69
+ resolveSummaries?(dids: string[]): Promise<ProfileSummary[]>;
70
+ }
71
+ //# sourceMappingURL=DiscoveryAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscoveryAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/DiscoveryAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAE7D;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,EAAE,YAAY,EAAE,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAA;IAC7B,SAAS,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,gBAAgB;IAE/B,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzE,oBAAoB,CAAC,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzF,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAGvF,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAC1D,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAC1D,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IAGxD,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;CAC7D"}
@@ -0,0 +1,66 @@
1
+ import { PublicProfile } from '../../types/identity';
2
+ import { Verification } from '../../types/verification';
3
+ import { Attestation } from '../../types/attestation';
4
+ /**
5
+ * Summary of cached graph data for a DID.
6
+ * Pre-computed for fast UI rendering (contact list, profile cards).
7
+ */
8
+ export interface CachedGraphEntry {
9
+ did: string;
10
+ name?: string;
11
+ bio?: string;
12
+ avatar?: string;
13
+ encryptionPublicKey?: string;
14
+ verificationCount: number;
15
+ attestationCount: number;
16
+ /** DIDs that have verified this person */
17
+ verifierDids: string[];
18
+ fetchedAt: string;
19
+ }
20
+ /**
21
+ * Persistent store for social graph cache data.
22
+ *
23
+ * Caches profiles, verifications, and attestations fetched via
24
+ * DiscoveryAdapter for offline access, DID-to-name resolution,
25
+ * and trust signal computation.
26
+ *
27
+ * Implementations:
28
+ * - InMemoryGraphCacheStore (for tests)
29
+ * - EvoluGraphCacheStore (for Demo App, backed by Evolu/SQLite)
30
+ */
31
+ export interface GraphCacheStore {
32
+ /** Cache a complete graph snapshot for a DID */
33
+ cacheEntry(did: string, profile: PublicProfile | null, verifications: Verification[], attestations: Attestation[]): Promise<void>;
34
+ /** Get the cached summary for a DID (fast, pre-computed) */
35
+ getEntry(did: string): Promise<CachedGraphEntry | null>;
36
+ /** Get summaries for multiple DIDs (batch, for contact list) */
37
+ getEntries(dids: string[]): Promise<Map<string, CachedGraphEntry>>;
38
+ /** Get cached verifications for a DID */
39
+ getCachedVerifications(did: string): Promise<Verification[]>;
40
+ /** Get cached attestations for a DID */
41
+ getCachedAttestations(did: string): Promise<Attestation[]>;
42
+ /** Resolve DID to display name (returns null if not cached) */
43
+ resolveName(did: string): Promise<string | null>;
44
+ /** Batch resolve DIDs to names (for rendering verifier/attester lists) */
45
+ resolveNames(dids: string[]): Promise<Map<string, string>>;
46
+ /**
47
+ * Find mutual contacts: which of myContactDids also verified targetDid?
48
+ * Returns the intersection of myContactDids and targetDid's verifierDids.
49
+ */
50
+ findMutualContacts(targetDid: string, myContactDids: string[]): Promise<string[]>;
51
+ /**
52
+ * Search cached profiles by name or claim text.
53
+ * For "does anyone offer X?" type queries.
54
+ */
55
+ search(query: string): Promise<CachedGraphEntry[]>;
56
+ /**
57
+ * Update only summary fields (name, counts) without touching detail data.
58
+ * Used by refreshContactSummaries() for lightweight batch updates.
59
+ */
60
+ updateSummary(did: string, name: string | null, verificationCount: number, attestationCount: number): Promise<void>;
61
+ /** Remove all cached data for a DID */
62
+ evict(did: string): Promise<void>;
63
+ /** Remove all cached data */
64
+ clear(): Promise<void>;
65
+ }
66
+ //# sourceMappingURL=GraphCacheStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphCacheStore.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/GraphCacheStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1D;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAG9B,gDAAgD;IAChD,UAAU,CACR,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,aAAa,EAAE,YAAY,EAAE,EAC7B,YAAY,EAAE,WAAW,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAAA;IAIhB,4DAA4D;IAC5D,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IAEvD,gEAAgE;IAChE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAIlE,yCAAyC;IACzC,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAE5D,wCAAwC;IACxC,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IAI1D,+DAA+D;IAC/D,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAEhD,0EAA0E;IAC1E,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAE1D;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAEjF;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAA;IAIlD;;;OAGG;IACH,aAAa,CACX,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,iBAAiB,EAAE,MAAM,EACzB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAAA;IAIhB,uCAAuC;IACvC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjC,6BAA6B;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB"}
@@ -0,0 +1,23 @@
1
+ import { MessageEnvelope, DeliveryReceipt, MessagingState } from '../../types/messaging';
2
+ /**
3
+ * Messaging adapter interface for cross-user message delivery.
4
+ *
5
+ * Framework-agnostic: Can be implemented with WebSocket Relay (POC),
6
+ * Matrix (production), or InMemory (tests).
7
+ *
8
+ * Follows the Empfänger-Prinzip: Messages are delivered to the recipient.
9
+ * Handles attestation/verification delivery, contact requests,
10
+ * item-key delivery, space invitations, and arbitrary DID-to-DID messages.
11
+ */
12
+ export interface MessagingAdapter {
13
+ connect(myDid: string): Promise<void>;
14
+ disconnect(): Promise<void>;
15
+ getState(): MessagingState;
16
+ onStateChange(callback: (state: MessagingState) => void): () => void;
17
+ send(envelope: MessageEnvelope): Promise<DeliveryReceipt>;
18
+ onMessage(callback: (envelope: MessageEnvelope) => void | Promise<void>): () => void;
19
+ onReceipt(callback: (receipt: DeliveryReceipt) => void): () => void;
20
+ registerTransport(did: string, transportAddress: string): Promise<void>;
21
+ resolveTransport(did: string): Promise<string | null>;
22
+ }
23
+ //# sourceMappingURL=MessagingAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessagingAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/MessagingAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAA;AAE9B;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAE/B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,QAAQ,IAAI,cAAc,CAAA;IAG1B,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAGpE,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;IAGzD,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAA;IAGpF,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAKnE,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvE,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;CACtD"}
@@ -0,0 +1,35 @@
1
+ import { MessageEnvelope } from '../../types/messaging';
2
+ import { Subscribable } from './Subscribable';
3
+ /**
4
+ * Outbox entry with metadata for retry logic.
5
+ */
6
+ export interface OutboxEntry {
7
+ envelope: MessageEnvelope;
8
+ createdAt: string;
9
+ retryCount: number;
10
+ }
11
+ /**
12
+ * Persistent store for the messaging outbox.
13
+ *
14
+ * Stores unsent MessageEnvelopes for retry when connectivity is restored.
15
+ * Implementations:
16
+ * - InMemoryOutboxStore (for tests)
17
+ * - EvoluOutboxStore (for Demo App, backed by Evolu/SQLite)
18
+ */
19
+ export interface OutboxStore {
20
+ /** Add an envelope to the outbox. Idempotent on envelope.id. */
21
+ enqueue(envelope: MessageEnvelope): Promise<void>;
22
+ /** Remove a successfully sent envelope from the outbox. */
23
+ dequeue(envelopeId: string): Promise<void>;
24
+ /** Get all pending outbox entries, ordered by createdAt ascending. */
25
+ getPending(): Promise<OutboxEntry[]>;
26
+ /** Check if an envelope is already in the outbox (dedup guard). */
27
+ has(envelopeId: string): Promise<boolean>;
28
+ /** Increment retry count for a failed attempt. */
29
+ incrementRetry(envelopeId: string): Promise<void>;
30
+ /** Get the count of pending messages (for UI badge). */
31
+ count(): Promise<number>;
32
+ /** Reactive pending count for UI binding. Optional — implementations may return undefined. */
33
+ watchPendingCount?(): Subscribable<number>;
34
+ }
35
+ //# sourceMappingURL=OutboxStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OutboxStore.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/OutboxStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,eAAe,CAAA;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjD,2DAA2D;IAC3D,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE1C,sEAAsE;IACtE,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IAEpC,mEAAmE;IACnE,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEzC,kDAAkD;IAClD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEjD,wDAAwD;IACxD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IAExB,8FAA8F;IAC9F,iBAAiB,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;CAC3C"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Field types for discovery publish operations.
3
+ */
4
+ export type PublishStateField = 'profile' | 'verifications' | 'attestations';
5
+ /**
6
+ * Persistent store for publish state tracking.
7
+ *
8
+ * Tracks which publish operations are pending (dirty flags)
9
+ * so they can be retried when connectivity is restored.
10
+ *
11
+ * Implementations:
12
+ * - InMemoryPublishStateStore (for tests)
13
+ * - EvoluPublishStateStore (for Demo App, backed by Evolu/SQLite)
14
+ */
15
+ export interface PublishStateStore {
16
+ /** Mark a field as needing sync to the discovery service */
17
+ markDirty(did: string, field: PublishStateField): Promise<void>;
18
+ /** Clear the dirty flag after successful sync */
19
+ clearDirty(did: string, field: PublishStateField): Promise<void>;
20
+ /** Get all fields that need syncing for a DID */
21
+ getDirtyFields(did: string): Promise<Set<PublishStateField>>;
22
+ }
23
+ //# sourceMappingURL=PublishStateStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublishStateStore.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/PublishStateStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,eAAe,GAAG,cAAc,CAAA;AAE5E;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE/D,iDAAiD;IACjD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhE,iDAAiD;IACjD,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAA;CAC7D"}
@@ -0,0 +1,23 @@
1
+ import { Subscribable } from './Subscribable';
2
+ import { Identity } from '../../types/identity';
3
+ import { Contact } from '../../types/contact';
4
+ import { Verification } from '../../types/verification';
5
+ import { Attestation } from '../../types/attestation';
6
+ /**
7
+ * Reactive extension for storage backends that support live queries.
8
+ *
9
+ * Backends with native reactivity (Evolu, p2panda, Jazz) implement this.
10
+ * Backends without (REST, CLI) implement only StorageAdapter.
11
+ *
12
+ * A single adapter class can implement both:
13
+ * class EvoluAdapter implements StorageAdapter, ReactiveStorageAdapter
14
+ */
15
+ export interface ReactiveStorageAdapter {
16
+ watchIdentity(): Subscribable<Identity | null>;
17
+ watchContacts(): Subscribable<Contact[]>;
18
+ watchReceivedVerifications(): Subscribable<Verification[]>;
19
+ watchAllVerifications(): Subscribable<Verification[]>;
20
+ watchAllAttestations(): Subscribable<Attestation[]>;
21
+ watchReceivedAttestations(): Subscribable<Attestation[]>;
22
+ }
23
+ //# sourceMappingURL=ReactiveStorageAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReactiveStorageAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/ReactiveStorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1D;;;;;;;;GAQG;AACH,MAAM,WAAW,sBAAsB;IACrC,aAAa,IAAI,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IAC9C,aAAa,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC,CAAA;IACxC,0BAA0B,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC,CAAA;IAC1D,qBAAqB,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC,CAAA;IACrD,oBAAoB,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC,CAAA;IACnD,yBAAyB,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC,CAAA;CACzD"}
@@ -0,0 +1,57 @@
1
+ import { SpaceInfo, SpaceDocMeta, SpaceMemberChange, ReplicationState } from '../../types/space';
2
+ import { Subscribable } from './Subscribable';
3
+ /**
4
+ * Options for SpaceHandle.transact().
5
+ */
6
+ export interface TransactOptions {
7
+ /** Use debounced vault push instead of immediate. For streaming input (e.g. text editing). */
8
+ stream?: boolean;
9
+ }
10
+ /**
11
+ * SpaceHandle — typed access to a CRDT space.
12
+ *
13
+ * Wraps the underlying CRDT doc (e.g. Automerge) and provides
14
+ * transactional writes + remote update notifications.
15
+ */
16
+ export interface SpaceHandle<T = unknown> {
17
+ readonly id: string;
18
+ info(): SpaceInfo;
19
+ /** Get the current document state (read-only snapshot). */
20
+ getDoc(): T;
21
+ /** Get space metadata from the shared _meta map. */
22
+ getMeta(): SpaceDocMeta;
23
+ /** Apply a transactional change to the doc. Encrypts + broadcasts to members. */
24
+ transact(fn: (doc: T) => void, options?: TransactOptions): void;
25
+ /** Fires when remote changes arrive and are applied. */
26
+ onRemoteUpdate(callback: () => void): () => void;
27
+ /** Close this handle (unsubscribe from updates). */
28
+ close(): void;
29
+ }
30
+ /**
31
+ * ReplicationAdapter — CRDT Sync for Multi-Device and Multi-User Spaces.
32
+ *
33
+ * Manages Automerge docs, encrypts changes with group keys,
34
+ * and distributes via MessagingAdapter.
35
+ */
36
+ export interface ReplicationAdapter {
37
+ start(): Promise<void>;
38
+ stop(): Promise<void>;
39
+ getState(): ReplicationState;
40
+ createSpace<T>(type: 'personal' | 'shared', initialDoc: T, meta?: {
41
+ name?: string;
42
+ description?: string;
43
+ appTag?: string;
44
+ }): Promise<SpaceInfo>;
45
+ updateSpace(spaceId: string, meta: SpaceDocMeta): Promise<void>;
46
+ getSpaces(): Promise<SpaceInfo[]>;
47
+ getSpace(spaceId: string): Promise<SpaceInfo | null>;
48
+ watchSpaces(): Subscribable<SpaceInfo[]>;
49
+ openSpace<T>(spaceId: string): Promise<SpaceHandle<T>>;
50
+ addMember(spaceId: string, memberDid: string, memberEncryptionPublicKey: Uint8Array): Promise<void>;
51
+ removeMember(spaceId: string, memberDid: string): Promise<void>;
52
+ leaveSpace(spaceId: string): Promise<void>;
53
+ onMemberChange(callback: (change: SpaceMemberChange) => void): () => void;
54
+ requestSync(spaceId: string): Promise<void>;
55
+ getKeyGeneration(spaceId: string): number;
56
+ }
57
+ //# sourceMappingURL=ReplicationAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReplicationAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/ReplicationAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACrG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,IAAI,IAAI,SAAS,CAAA;IAEjB,2DAA2D;IAC3D,MAAM,IAAI,CAAC,CAAA;IAEX,oDAAoD;IACpD,OAAO,IAAI,YAAY,CAAA;IAEvB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IAE/D,wDAAwD;IACxD,cAAc,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IAEhD,oDAAoD;IACpD,KAAK,IAAI,IAAI,CAAA;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IAEjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,QAAQ,IAAI,gBAAgB,CAAA;IAG5B,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/I,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAA;IACpD,WAAW,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC,CAAA;IAGxC,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAGtD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,yBAAyB,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAGzE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAG3C,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;CAC1C"}
@@ -0,0 +1,46 @@
1
+ import { SpaceInfo } from '../../types/space';
2
+ /**
3
+ * Persisted metadata for a single space.
4
+ *
5
+ * Does NOT include the Automerge document binary — that is managed
6
+ * by automerge-repo's own StorageAdapter (e.g. IndexedDB).
7
+ */
8
+ export interface PersistedSpaceMetadata {
9
+ info: SpaceInfo;
10
+ /** automerge-repo DocumentId */
11
+ documentId: string;
12
+ /** automerge-repo AutomergeUrl (automerge:<base58-id>) */
13
+ documentUrl: string;
14
+ /** Encryption public keys per member DID */
15
+ memberEncryptionKeys: Record<string, Uint8Array>;
16
+ }
17
+ /**
18
+ * Persisted group key for a space at a specific generation.
19
+ */
20
+ export interface PersistedGroupKey {
21
+ spaceId: string;
22
+ generation: number;
23
+ key: Uint8Array;
24
+ }
25
+ /**
26
+ * SpaceMetadataStorage — Persistence for Space metadata and Group Keys.
27
+ *
28
+ * Automerge document persistence is handled by automerge-repo's StorageAdapter.
29
+ * This interface only stores metadata (SpaceInfo, document references, member keys)
30
+ * and symmetric group keys.
31
+ *
32
+ * Implemented by platform-specific backends (IndexedDB, Evolu, in-memory for tests).
33
+ * Used by AutomergeReplicationAdapter to restore space state across restarts.
34
+ */
35
+ export interface SpaceMetadataStorage {
36
+ saveSpaceMetadata(meta: PersistedSpaceMetadata): Promise<void>;
37
+ loadSpaceMetadata(spaceId: string): Promise<PersistedSpaceMetadata | null>;
38
+ loadAllSpaceMetadata(): Promise<PersistedSpaceMetadata[]>;
39
+ deleteSpaceMetadata(spaceId: string): Promise<void>;
40
+ saveGroupKey(key: PersistedGroupKey): Promise<void>;
41
+ loadGroupKeys(spaceId: string): Promise<PersistedGroupKey[]>;
42
+ deleteGroupKeys(spaceId: string): Promise<void>;
43
+ /** Delete all stored metadata and group keys. Used on identity switch/logout. */
44
+ clearAll(): Promise<void>;
45
+ }
46
+ //# sourceMappingURL=SpaceMetadataStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpaceMetadataStorage.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/SpaceMetadataStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,SAAS,CAAA;IACf,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAA;IACnB,4CAA4C;IAC5C,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,UAAU,CAAA;CAChB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IAEnC,iBAAiB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAA;IAC1E,oBAAoB,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAA;IACzD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAGnD,YAAY,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAA;IAC5D,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAG/C,iFAAiF;IACjF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B"}
@@ -0,0 +1,32 @@
1
+ import { Identity, Profile, Contact, Verification, Attestation, AttestationMetadata } from '../../types';
2
+ /**
3
+ * Storage adapter interface for persisting Web of Trust data.
4
+ *
5
+ * Framework-agnostic: Can be implemented with IndexedDB, SQLite,
6
+ * Evolu, Jazz, or any other storage backend.
7
+ *
8
+ * Follows the Empfänger-Prinzip: Verifications and Attestations
9
+ * are stored at the recipient (to), not the sender (from).
10
+ */
11
+ export interface StorageAdapter {
12
+ createIdentity(did: string, profile: Profile): Promise<Identity>;
13
+ getIdentity(): Promise<Identity | null>;
14
+ updateIdentity(identity: Identity): Promise<void>;
15
+ addContact(contact: Contact): Promise<void>;
16
+ getContacts(): Promise<Contact[]>;
17
+ getContact(did: string): Promise<Contact | null>;
18
+ updateContact(contact: Contact): Promise<void>;
19
+ removeContact(did: string): Promise<void>;
20
+ saveVerification(verification: Verification): Promise<void>;
21
+ getReceivedVerifications(): Promise<Verification[]>;
22
+ getAllVerifications(): Promise<Verification[]>;
23
+ getVerification(id: string): Promise<Verification | null>;
24
+ saveAttestation(attestation: Attestation): Promise<void>;
25
+ getReceivedAttestations(): Promise<Attestation[]>;
26
+ getAttestation(id: string): Promise<Attestation | null>;
27
+ getAttestationMetadata(attestationId: string): Promise<AttestationMetadata | null>;
28
+ setAttestationAccepted(attestationId: string, accepted: boolean): Promise<void>;
29
+ init(): Promise<void>;
30
+ clear(): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=StorageAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/StorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,OAAO,EACP,OAAO,EACP,YAAY,EACZ,WAAW,EACX,mBAAmB,EACpB,MAAM,aAAa,CAAA;AAEpB;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAE7B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChE,WAAW,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IACvC,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAGjD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IACjC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IAChD,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAKzC,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,wBAAwB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACnD,mBAAmB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAC9C,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;IAGzD,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,uBAAuB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IACjD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAGvD,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAA;IAClF,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAG/E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Framework-agnostic reactive primitive.
3
+ * Maps directly to React's useSyncExternalStore.
4
+ *
5
+ * Implementors must:
6
+ * - Call all subscribers when value changes
7
+ * - Return the current value synchronously via getValue()
8
+ * - Return an unsubscribe function from subscribe()
9
+ */
10
+ export interface Subscribable<T> {
11
+ subscribe(callback: (value: T) => void): () => void;
12
+ getValue(): T;
13
+ }
14
+ /**
15
+ * Wraps a Subscribable to skip the first emission after subscribe.
16
+ *
17
+ * Useful when subscribe() triggers an initial callback (e.g. current value)
18
+ * but the consumer only wants subsequent changes (e.g. to avoid an
19
+ * unnecessary upload on mount).
20
+ */
21
+ export declare function skipFirst<T>(source: Subscribable<T>): Subscribable<T>;
22
+ //# sourceMappingURL=Subscribable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Subscribable.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/Subscribable.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IACnD,QAAQ,IAAI,CAAC,CAAA;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAcrE"}
@@ -0,0 +1,12 @@
1
+ export * from './StorageAdapter';
2
+ export * from './CryptoAdapter';
3
+ export * from './Subscribable';
4
+ export * from './ReactiveStorageAdapter';
5
+ export * from './MessagingAdapter';
6
+ export * from './DiscoveryAdapter';
7
+ export * from './PublishStateStore';
8
+ export * from './GraphCacheStore';
9
+ export * from './ReplicationAdapter';
10
+ export * from './OutboxStore';
11
+ export * from './AuthorizationAdapter';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,wBAAwB,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { OutboxStore, OutboxEntry } from '../interfaces/OutboxStore';
2
+ import { MessageEnvelope } from '../../types/messaging';
3
+ import { Subscribable } from '../interfaces/Subscribable';
4
+ export interface PersonalDocFunctions {
5
+ getPersonalDoc: () => any;
6
+ changePersonalDoc: (fn: (doc: any) => void, options?: {
7
+ background?: boolean;
8
+ }) => any;
9
+ onPersonalDocChange: (callback: () => void) => () => void;
10
+ }
11
+ export declare class PersonalDocOutboxStore implements OutboxStore {
12
+ private getPersonalDoc;
13
+ private changePersonalDoc;
14
+ private onPersonalDocChange;
15
+ constructor(fns: PersonalDocFunctions);
16
+ enqueue(envelope: MessageEnvelope): Promise<void>;
17
+ dequeue(envelopeId: string): Promise<void>;
18
+ getPending(): Promise<OutboxEntry[]>;
19
+ has(envelopeId: string): Promise<boolean>;
20
+ incrementRetry(envelopeId: string): Promise<void>;
21
+ count(): Promise<number>;
22
+ watchPendingCount(): Subscribable<number>;
23
+ }
24
+ //# sourceMappingURL=AutomergeOutboxStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutomergeOutboxStore.d.ts","sourceRoot":"","sources":["../../../src/adapters/messaging/AutomergeOutboxStore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACZ,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,GAAG,CAAA;IACzB,iBAAiB,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,GAAG,CAAA;IACtF,mBAAmB,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CAC1D;AAED,qBAAa,sBAAuB,YAAW,WAAW;IACxD,OAAO,CAAC,cAAc,CAAW;IACjC,OAAO,CAAC,iBAAiB,CAAqE;IAC9F,OAAO,CAAC,mBAAmB,CAAsC;gBAErD,GAAG,EAAE,oBAAoB;IAM/B,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAajD,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1C,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAWpC,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAK9B,iBAAiB,IAAI,YAAY,CAAC,MAAM,CAAC;CAsB1C"}
@@ -0,0 +1,36 @@
1
+ import { MessagingAdapter } from '../interfaces/MessagingAdapter';
2
+ import { MessageEnvelope, DeliveryReceipt, MessagingState } from '../../types/messaging';
3
+ /**
4
+ * In-memory messaging adapter for testing.
5
+ *
6
+ * Uses a shared static registry so two instances (Alice + Bob) in the same
7
+ * process can exchange messages. Supports offline queuing: messages sent
8
+ * to a DID that is not yet connected are queued and delivered on connect.
9
+ *
10
+ * Multi-device: multiple instances can connect with the same DID.
11
+ * Messages sent to that DID are delivered to ALL connected instances.
12
+ */
13
+ export declare class InMemoryMessagingAdapter implements MessagingAdapter {
14
+ private static registry;
15
+ private static offlineQueue;
16
+ private static transportMap;
17
+ private myDid;
18
+ private state;
19
+ private messageCallbacks;
20
+ private receiptCallbacks;
21
+ private stateCallbacks;
22
+ onStateChange(callback: (state: MessagingState) => void): () => void;
23
+ private notifyStateChange;
24
+ connect(myDid: string): Promise<void>;
25
+ disconnect(): Promise<void>;
26
+ getState(): MessagingState;
27
+ send(envelope: MessageEnvelope): Promise<DeliveryReceipt>;
28
+ onMessage(callback: (envelope: MessageEnvelope) => void | Promise<void>): () => void;
29
+ onReceipt(callback: (receipt: DeliveryReceipt) => void): () => void;
30
+ registerTransport(did: string, transportAddress: string): Promise<void>;
31
+ resolveTransport(did: string): Promise<string | null>;
32
+ /** Reset all shared state. Call in afterEach() for test isolation. */
33
+ static resetAll(): void;
34
+ private deliverToSelf;
35
+ }
36
+ //# sourceMappingURL=InMemoryMessagingAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryMessagingAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/messaging/InMemoryMessagingAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAA;AAE9B;;;;;;;;;GASG;AACH,qBAAa,wBAAyB,YAAW,gBAAgB;IAE/D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmD;IAC1E,OAAO,CAAC,MAAM,CAAC,YAAY,CAAuC;IAClE,OAAO,CAAC,MAAM,CAAC,YAAY,CAA4B;IAEvD,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,gBAAgB,CAAiE;IACzF,OAAO,CAAC,gBAAgB,CAAgD;IACxE,OAAO,CAAC,cAAc,CAA6C;IAEnE,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;IAKpE,OAAO,CAAC,iBAAiB;IAOnB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBrC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAcjC,QAAQ,IAAI,cAAc;IAIpB,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAuC/D,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI;IAOpF,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAO7D,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI3D,sEAAsE;IACtE,MAAM,CAAC,QAAQ,IAAI,IAAI;YAYT,aAAa;CAS5B"}
@@ -0,0 +1,12 @@
1
+ import { MessageEnvelope } from '../../types/messaging';
2
+ import { OutboxStore, OutboxEntry } from '../interfaces/OutboxStore';
3
+ export declare class InMemoryOutboxStore implements OutboxStore {
4
+ private entries;
5
+ enqueue(envelope: MessageEnvelope): Promise<void>;
6
+ dequeue(envelopeId: string): Promise<void>;
7
+ getPending(): Promise<OutboxEntry[]>;
8
+ has(envelopeId: string): Promise<boolean>;
9
+ incrementRetry(envelopeId: string): Promise<void>;
10
+ count(): Promise<number>;
11
+ }
12
+ //# sourceMappingURL=InMemoryOutboxStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryOutboxStore.d.ts","sourceRoot":"","sources":["../../../src/adapters/messaging/InMemoryOutboxStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEzE,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,OAAO,CAAiC;IAE1C,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAKpC,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAG/B"}