@metalabel/dfos-protocol 0.0.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,20 +1,5 @@
1
1
  import {
2
- ChainStore,
3
- ContentOperationsParams,
4
- ContentOperationsResponse,
5
- IdentityOperationsParams,
6
- IdentityOperationsResponse,
7
- RegistryError,
8
- ResolveContentResponse,
9
- ResolveIdentityResponse,
10
- ResolveOperationResponse,
11
- SubmitContentChainRequest,
12
- SubmitContentChainResponse,
13
- SubmitIdentityChainRequest,
14
- SubmitIdentityChainResponse,
15
- createRegistryServer
16
- } from "./chunk-U6DANYPT.js";
17
- import {
2
+ BeaconPayload,
18
3
  ContentOperation,
19
4
  ED25519_PRIV_MULTICODEC,
20
5
  ED25519_PUB_MULTICODEC,
@@ -25,11 +10,40 @@ import {
25
10
  deriveChainIdentifier,
26
11
  deriveContentId,
27
12
  encodeEd25519Multikey,
13
+ signBeacon,
28
14
  signContentOperation,
15
+ signCountersignature,
29
16
  signIdentityOperation,
17
+ verifyBeacon,
18
+ verifyBeaconCountersignature,
30
19
  verifyContentChain,
20
+ verifyCountersignature,
31
21
  verifyIdentityChain
32
- } from "./chunk-VEBMLR37.js";
22
+ } from "./chunk-GEVJ3SEV.js";
23
+ import {
24
+ buildMerkleTree,
25
+ generateMerkleProof,
26
+ hashLeaf,
27
+ hexToBytes,
28
+ verifyMerkleProof
29
+ } from "./chunk-E5CFQG2B.js";
30
+ import {
31
+ AuthTokenClaims,
32
+ AuthTokenVerificationError,
33
+ ContentReadSubject,
34
+ ContentWriteSubject,
35
+ CredentialClaims,
36
+ CredentialVerificationError,
37
+ DFOSCredentialType,
38
+ VCClaim,
39
+ VC_TYPE_CONTENT_READ,
40
+ VC_TYPE_CONTENT_WRITE,
41
+ createAuthToken,
42
+ createCredential,
43
+ decodeCredentialUnsafe,
44
+ verifyAuthToken,
45
+ verifyCredential
46
+ } from "./chunk-CZSEEZLL.js";
33
47
  import {
34
48
  JwsVerificationError,
35
49
  JwtVerificationError,
@@ -54,34 +68,35 @@ import {
54
68
  verifyJwt
55
69
  } from "./chunk-ZXXP5W5N.js";
56
70
  export {
57
- ChainStore,
71
+ AuthTokenClaims,
72
+ AuthTokenVerificationError,
73
+ BeaconPayload,
58
74
  ContentOperation,
59
- ContentOperationsParams,
60
- ContentOperationsResponse,
75
+ ContentReadSubject,
76
+ ContentWriteSubject,
77
+ CredentialClaims,
78
+ CredentialVerificationError,
79
+ DFOSCredentialType,
61
80
  ED25519_PRIV_MULTICODEC,
62
81
  ED25519_PUB_MULTICODEC,
63
82
  IdentityOperation,
64
- IdentityOperationsParams,
65
- IdentityOperationsResponse,
66
83
  JwsVerificationError,
67
84
  JwtVerificationError,
68
85
  MultikeyPublicKey,
69
- RegistryError,
70
- ResolveContentResponse,
71
- ResolveIdentityResponse,
72
- ResolveOperationResponse,
73
- SubmitContentChainRequest,
74
- SubmitContentChainResponse,
75
- SubmitIdentityChainRequest,
76
- SubmitIdentityChainResponse,
86
+ VCClaim,
87
+ VC_TYPE_CONTENT_READ,
88
+ VC_TYPE_CONTENT_WRITE,
77
89
  VerifiedIdentity,
78
90
  base64urlDecode,
79
91
  base64urlEncode,
92
+ buildMerkleTree,
93
+ createAuthToken,
94
+ createCredential,
80
95
  createJws,
81
96
  createJwt,
82
97
  createNewEd25519Keypair,
83
- createRegistryServer,
84
98
  dagCborCanonicalEncode,
99
+ decodeCredentialUnsafe,
85
100
  decodeJwsUnsafe,
86
101
  decodeJwtUnsafe,
87
102
  decodeMultikey,
@@ -90,17 +105,28 @@ export {
90
105
  encodeEd25519Multikey,
91
106
  generateId,
92
107
  generateIdNoPrefix,
108
+ generateMerkleProof,
109
+ hashLeaf,
110
+ hexToBytes,
93
111
  importEd25519Keypair,
94
112
  isCanonicallyEqual,
95
113
  isValidEd25519Signature,
96
114
  isValidId,
97
115
  normalizedId,
98
116
  parseDagCborCID,
117
+ signBeacon,
99
118
  signContentOperation,
119
+ signCountersignature,
100
120
  signIdentityOperation,
101
121
  signPayloadEd25519,
122
+ verifyAuthToken,
123
+ verifyBeacon,
124
+ verifyBeaconCountersignature,
102
125
  verifyContentChain,
126
+ verifyCountersignature,
127
+ verifyCredential,
103
128
  verifyIdentityChain,
104
129
  verifyJws,
105
- verifyJwt
130
+ verifyJwt,
131
+ verifyMerkleProof
106
132
  };
@@ -0,0 +1,45 @@
1
+ declare const hexToBytes: (hex: string) => Uint8Array;
2
+ /**
3
+ * Hash a leaf node — SHA-256 of UTF-8 encoded contentId
4
+ */
5
+ declare const hashLeaf: (contentId: string) => Promise<Uint8Array>;
6
+ /**
7
+ * Build a sorted binary Merkle tree over content identifiers
8
+ *
9
+ * ContentIds are sorted lexicographically, hashed to leaves, then paired
10
+ * and hashed up to the root. Odd nodes are promoted to the next level.
11
+ *
12
+ * Returns null root for empty input. Deduplicates contentIds.
13
+ */
14
+ declare const buildMerkleTree: (contentIds: string[]) => Promise<{
15
+ root: string | null;
16
+ leafCount: number;
17
+ }>;
18
+
19
+ interface MerkleProof {
20
+ /** The contentId being proven */
21
+ contentId: string;
22
+ /** Hex SHA-256 root of the tree */
23
+ root: string;
24
+ /** Sibling hashes along the path from leaf to root */
25
+ path: Array<{
26
+ /** Hex SHA-256 of sibling node */
27
+ hash: string;
28
+ /** Position of the sibling relative to the current node */
29
+ position: 'left' | 'right';
30
+ }>;
31
+ }
32
+ /**
33
+ * Generate an inclusion proof for a contentId in the set
34
+ *
35
+ * Returns null if the contentId is not in the set.
36
+ */
37
+ declare const generateMerkleProof: (contentIds: string[], targetId: string) => Promise<MerkleProof | null>;
38
+ /**
39
+ * Verify a Merkle inclusion proof
40
+ *
41
+ * Recomputes the root from the leaf and proof path, compares to the claimed root.
42
+ */
43
+ declare const verifyMerkleProof: (proof: MerkleProof) => Promise<boolean>;
44
+
45
+ export { type MerkleProof, buildMerkleTree, generateMerkleProof, hashLeaf, hexToBytes, verifyMerkleProof };
@@ -0,0 +1,14 @@
1
+ import {
2
+ buildMerkleTree,
3
+ generateMerkleProof,
4
+ hashLeaf,
5
+ hexToBytes,
6
+ verifyMerkleProof
7
+ } from "../chunk-E5CFQG2B.js";
8
+ export {
9
+ buildMerkleTree,
10
+ generateMerkleProof,
11
+ hashLeaf,
12
+ hexToBytes,
13
+ verifyMerkleProof
14
+ };
@@ -0,0 +1,14 @@
1
+ {
2
+ "description": "Beacon: signed merkle root announcement with witness countersignature",
3
+ "type": "beacon",
4
+ "controllerJws": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmJlYWNvbiIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgiLCJjaWQiOiJiYWZ5cmVpaGhvbHV1aTdzN25zNzRpZW02YWhmeHNiNDcyaHdvZ2JxZDMyeXJycDVmenRjM2t4YTVxdSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiYmVhY29uIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsIm1lcmtsZVJvb3QiOiI3ZTgwZDQ3ODBmNDU0ZTBmY2EwYjA5MGQ4YzY0NmY1NzJiNDkzNTRmNTQxNTQ1MzE2MDYxMDVhYWQyZmRhMjhlIiwiY3JlYXRlZEF0IjoiMjAyNi0wMy0wN1QwMDowNTowMC4wMDBaIn0._1RgZpMv63-M3ZUeTNX679xkAeX3TY0PJ0ImH7422cKA7I88Hf8bBVQMVVhP3oNdvX7i7Q4se5EP3kk5aEuxDQ",
5
+ "witnessJws": "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmJlYWNvbiIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X2V6OWE4NzR0Y2tyM2R2OTMzZDNja2QiLCJjaWQiOiJiYWZ5cmVpaGhvbHV1aTdzN25zNzRpZW02YWhmeHNiNDcyaHdvZ2JxZDMyeXJycDVmenRjM2t4YTVxdSJ9.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiYmVhY29uIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsIm1lcmtsZVJvb3QiOiI3ZTgwZDQ3ODBmNDU0ZTBmY2EwYjA5MGQ4YzY0NmY1NzJiNDkzNTRmNTQxNTQ1MzE2MDYxMDVhYWQyZmRhMjhlIiwiY3JlYXRlZEF0IjoiMjAyNi0wMy0wN1QwMDowNTowMC4wMDBaIn0.awA8ctmLHjJCHZcH0lav7HpadkIoGiG2WR-pCf-0XfPVi9dD8Z2at0E7iAnOUnVEc5VthBo-mMklSIJFK28IDw",
6
+ "controllerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
7
+ "witnessPublicKey": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK",
8
+ "expected": {
9
+ "beaconCID": "bafyreihholuui7s7ns74iem6ahfxsb472hwogbqd32yrrp5fztc3kxa5qu",
10
+ "did": "did:dfos:e3vvtck42d4eacdnzvtrn6",
11
+ "merkleRoot": "7e80d4780f454e0fca0b090d8c646f572b49354f54154531606105aad2fda28e",
12
+ "createdAt": "2026-03-07T00:05:00.000Z"
13
+ }
14
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "description": "Content chain: creator signs genesis, delegate signs update with write VC",
3
+ "type": "content-delegated",
4
+ "chain": [
5
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9yOWV2MzRmdmMyM3o5OTl2ZWFhZnQ4IiwiY2lkIjoiYmFmeXJlaWFmeG9ka290ZzJpZGE1eHBjZWR2MzdrMmtqZDdqbmJ5Z2hhamhub3VvYm9qaWF4eGo1eGkifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWduN2dmdXU1NHdvMmdlZzN0ZjV0ZXBlcGxibGt0YWhqZnpxanB1aml6YzdhMmJvZXljY2EiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MTA6MDAuMDAwWiIsIm5vdGUiOm51bGx9.oanyS9rbkqrxd1j8T172jVG4ILKFwW2t1JhkQLxsFqHMMURqA5Hl-0GzGFrfSkQT02Nq5RMYXzhcToqbjoV8AQ",
6
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczpuemtmODM4ZWZyNDI0NDMzcm4ycnprI2tleV9hOHIyNzQzNGFhcjc2YWU3MmM4NzdmIiwiY2lkIjoiYmFmeXJlaWJtMjRmNjY3cGlsNHhiZ2M3emZhM3lvdXRkandya3B4YTJjbWQ3Zm50aWxhYWljMmRlNzQifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwiZGlkIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFmeG9ka290ZzJpZGE1eHBjZWR2MzdrMmtqZDdqbmJ5Z2hhamhub3VvYm9qaWF4eGo1eGkiLCJkb2N1bWVudENJRCI6ImJhZnlyZWlmbml5bmQ2aGV2NjQ2dW9hamFjM2VnYWs3cDJxZmhyaGhvNG1mbXBwYTNydGNqcGV0Z2RlIiwiYmFzZURvY3VtZW50Q0lEIjoiYmFmeXJlaWduN2dmdXU1NHdvMmdlZzN0ZjV0ZXBlcGxibGt0YWhqZnpxanB1aml6YzdhMmJvZXljY2EiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjExOjAwLjAwMFoiLCJub3RlIjoiZGVsZWdhdGVkIGVkaXQgYnkga2V5MyIsImF1dGhvcml6YXRpb24iOiJleUpoYkdjaU9pSkZaRVJUUVNJc0luUjVjQ0k2SW5aaksycDNkQ0lzSW10cFpDSTZJbVJwWkRwa1ptOXpPbVV6ZG5aMFkyczBNbVEwWldGalpHNTZkblJ5YmpZamEyVjVYM0k1WlhZek5HWjJZekl6ZWprNU9YWmxZV0ZtZERnaWZRLmV5SnBjM01pT2lKa2FXUTZaR1p2Y3pwbE0zWjJkR05yTkRKa05HVmhZMlJ1ZW5aMGNtNDJJaXdpYzNWaUlqb2laR2xrT21SbWIzTTZibnByWmpnek9HVm1jalF5TkRRek0zSnVNbko2YXlJc0ltVjRjQ0k2TVRjNU9EYzJNVFl3TUN3aWFXRjBJam94TnpjeU9EUXhOakF3TENKMll5STZleUpBWTI5dWRHVjRkQ0k2V3lKb2RIUndjem92TDNkM2R5NTNNeTV2Y21jdmJuTXZZM0psWkdWdWRHbGhiSE12ZGpJaVhTd2lkSGx3WlNJNld5SldaWEpwWm1saFlteGxRM0psWkdWdWRHbGhiQ0lzSWtSR1QxTkRiMjUwWlc1MFYzSnBkR1VpWFN3aVkzSmxaR1Z1ZEdsaGJGTjFZbXBsWTNRaU9uc2lZMjl1ZEdWdWRFbGtJam9pWVdNeU5ubzRlbXRyWlRZM2VqUTRZV1l6Y21ob09TSjlmWDAuZG5vN2lkcnVTMUZDVzl2ZEp5TjAyT1g0a05vcEh0RGlvRE5feHo3MzdBb2tmT1FZa0c3VHFzcXlmM3VPQ0p1MTRtZmhLbGNsb2RMT01LcVBGcGJNQkEifQ.8CiWJSk5Aw0OntAj_vxMawd4rDx42SwhlaPFpevthXVYqXLIOjEeyUO59YnbfQ4dSoz2PfEoRTrBnm4oXIPYAg"
7
+ ],
8
+ "creatorPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
9
+ "delegatePublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
10
+ "documents": [
11
+ {
12
+ "content": {
13
+ "$schema": "https://schemas.dfos.com/post/v1",
14
+ "format": "short-post",
15
+ "title": "Original Post",
16
+ "body": "Content created by the chain owner.",
17
+ "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
18
+ },
19
+ "baseDocumentCID": null,
20
+ "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
21
+ "createdAt": "2026-03-07T00:10:00.000Z"
22
+ },
23
+ {
24
+ "content": {
25
+ "$schema": "https://schemas.dfos.com/post/v1",
26
+ "format": "short-post",
27
+ "title": "Delegated Edit",
28
+ "body": "Content updated by an authorized delegate.",
29
+ "createdByDID": "did:dfos:nzkf838efr424433rn2rzk"
30
+ },
31
+ "baseDocumentCID": "bafyreign7gfuu54wo2geg3tf5tepeplblktahjfzqjpujizc7a2boeycca",
32
+ "createdByDID": "did:dfos:nzkf838efr424433rn2rzk",
33
+ "createdAt": "2026-03-07T00:11:00.000Z"
34
+ }
35
+ ],
36
+ "authorization": "eyJhbGciOiJFZERTQSIsInR5cCI6InZjK2p3dCIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgifQ.eyJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42Iiwic3ViIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRGT1NDb250ZW50V3JpdGUiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiY29udGVudElkIjoiYWMyNno4emtrZTY3ejQ4YWYzcmhoOSJ9fX0.dno7idruS1FCW9vdJyN02OX4kNopHtDioDN_xz737AokfOQYkG7Tqsqyf3uOCJu14mfhKlclodLOMKqPFpbMBA",
37
+ "expected": {
38
+ "contentId": "ac26z8zkke67z48af3rhh9",
39
+ "creatorDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
40
+ "isDeleted": false,
41
+ "currentDocumentCID": "bafyreifniynd6hev646uoajac3egak7p2qfhrhho4mfmppa3rtcjpetgde",
42
+ "length": 2
43
+ }
44
+ }
@@ -2,8 +2,8 @@
2
2
  "description": "Content chain: create + delete",
3
3
  "type": "content",
4
4
  "chain": [
5
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWE1ejd6eGtuYWU1ZHM3MmV1aWh1ZjJyZzNpeGw2dDRmYnpqZWZoY29nZzNucXBweW9ncXUifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZG9jdW1lbnRDSUQiOiJiYWZ5cmVpZnB2d3Vhcm1sNjJzZm9nZHBpMnZsbHR2ZzJldjZvNHh0dzc0emZ1ZDdjcGtnNzQyNnpuZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.t_DDkJ_TmNekIGUFO22G-W78QoE4XTg9LKQ4gzAQHaK3B6491Tir9b-wtp-hcwmENu2Hqnieqv5ASiqfFrEbDw",
6
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWVwamFzN3JzdHV5aWI0eDY0NHYyeXJxN3c3MmV0dG5xcWozbzdhcmRhcWN1NnVzZml6b3kifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiZGVsZXRlIiwicHJldmlvdXNPcGVyYXRpb25DSUQiOiJiYWZ5cmVpYTV6N3p4a25hZTVkczcyZXVpaHVmMnJnM2l4bDZ0NGZiemplZmhjb2dnM25xcHB5b2dxdSIsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDM6MDAuMDAwWiIsIm5vdGUiOiJyZW1vdmluZyBjb250ZW50In0.VkfUjFIz40nBOMzCTtoO1nhExzQHB4QX9PIOe2MmDwC-nilMStTwdiRcxRskPRg0gw8eM5Mz9hNQ8dZfCJ9JAg"
5
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWh6d3VvdXBmZzNkeGlwNnhtZ3pteHN5d3lpaTJqZW94eHpiZ3gzenhtMmluN2tub2kzZzQiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.Rv6vlz5MfrwqDUrSVIGs4ZfeBbkQUSBcXhxwZ6hfudSr5MxhYl08hTqLDOA0W1NMjN0Hs0IW9jXTwLwP1dMDBg",
6
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWQydjUyN2lxMzZ2dnUyNWc3b3BjczJudjRjbmRhcWdrd29naHEzdHB3Z215cnBxZWVuZ2EifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiZGVsZXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoiLCJub3RlIjoicmVtb3ZpbmcgY29udGVudCJ9.9DTnVeYjVV6Kc971etvWeNn9iMme7RnrRZRmYBO0iaYeePJDblL_p2uuEIuxtAQQp1bATpsQ475zpK6N2A0eAg"
7
7
  ],
8
8
  "signerPublicKey": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK",
9
9
  "documents": [
@@ -12,7 +12,8 @@
12
12
  "$schema": "https://schemas.dfos.com/post/v1",
13
13
  "format": "short-post",
14
14
  "title": "Hello World",
15
- "body": "First post on the protocol."
15
+ "body": "First post on the protocol.",
16
+ "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
16
17
  },
17
18
  "baseDocumentCID": null,
18
19
  "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
@@ -20,7 +21,7 @@
20
21
  }
21
22
  ],
22
23
  "expected": {
23
- "contentId": "67t27rzc83v7c22n9t6z7c",
24
+ "contentId": "a82z92a3hndk6c97thcrn8",
24
25
  "isDeleted": true,
25
26
  "currentDocumentCID": null,
26
27
  "length": 2
@@ -2,8 +2,8 @@
2
2
  "description": "Content chain: create + update (with both documents)",
3
3
  "type": "content",
4
4
  "chain": [
5
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWE1ejd6eGtuYWU1ZHM3MmV1aWh1ZjJyZzNpeGw2dDRmYnpqZWZoY29nZzNucXBweW9ncXUifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZG9jdW1lbnRDSUQiOiJiYWZ5cmVpZnB2d3Vhcm1sNjJzZm9nZHBpMnZsbHR2ZzJldjZvNHh0dzc0emZ1ZDdjcGtnNzQyNnpuZSIsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.t_DDkJ_TmNekIGUFO22G-W78QoE4XTg9LKQ4gzAQHaK3B6491Tir9b-wtp-hcwmENu2Hqnieqv5ASiqfFrEbDw",
6
- "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWJiNGxzdnFtejRqNzZyc3Zoa3F3M3YyYjR2cDIzdDdkaW1tNnZsNWc1d2xuaW52a2VteHEifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwicHJldmlvdXNPcGVyYXRpb25DSUQiOiJiYWZ5cmVpYTV6N3p4a25hZTVkczcyZXVpaHVmMnJnM2l4bDZ0NGZiemplZmhjb2dnM25xcHB5b2dxdSIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWV1bzI2emZtanh3cG13NWprNmJxenFodml2eGNiY2tneHR5ZXVjN3lwZjNwNHNpaGdxNHEiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoiLCJub3RlIjoiZWRpdGVkIHRpdGxlIGFuZCBib2R5In0.v2BnXflq3lAiDqCpCuAoXUURY1scOGb9AMHHfCMxj1bD0GJOgdV_klv7KfqDLlSfF3Sn6CK1RDeLniF_UTKXAQ"
5
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoiY3JlYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsImRvY3VtZW50Q0lEIjoiYmFmeXJlaWh6d3VvdXBmZzNkeGlwNnhtZ3pteHN5d3lpaTJqZW94eHpiZ3gzenhtMmluN2tub2kzZzQiLCJiYXNlRG9jdW1lbnRDSUQiOm51bGwsImNyZWF0ZWRBdCI6IjIwMjYtMDMtMDdUMDA6MDI6MDAuMDAwWiIsIm5vdGUiOm51bGx9.Rv6vlz5MfrwqDUrSVIGs4ZfeBbkQUSBcXhxwZ6hfudSr5MxhYl08hTqLDOA0W1NMjN0Hs0IW9jXTwLwP1dMDBg",
6
+ "eyJhbGciOiJFZERTQSIsInR5cCI6ImRpZDpkZm9zOmNvbnRlbnQtb3AiLCJraWQiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42I2tleV9lejlhODc0dGNrcjNkdjkzM2QzY2tkIiwiY2lkIjoiYmFmeXJlaWg2ZTVjYmppdHBvemh6aGdtZmt0bWlvaG14eW4zdWN3aHFkM21qaXhpenZ3bWxodjdobTQifQ.eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidXBkYXRlIiwiZGlkIjoiZGlkOmRmb3M6ZTN2dnRjazQyZDRlYWNkbnp2dHJuNiIsInByZXZpb3VzT3BlcmF0aW9uQ0lEIjoiYmFmeXJlaWFlZGhqcTY0YWFqcHdvY2lhaGw1dzM3ajZ1b3hyNW1vam9xNWRuYWg2ZnB2eHI1ZDRseHUiLCJkb2N1bWVudENJRCI6ImJhZnlyZWlkaDdlMzZjdnd5M3V3NXlwaXRjcWs3dW9rdGJra2tqN2U2aHhoa3k0bzc1cnhuN2t4aWx1IiwiYmFzZURvY3VtZW50Q0lEIjoiYmFmeXJlaWh6d3VvdXBmZzNkeGlwNnhtZ3pteHN5d3lpaTJqZW94eHpiZ3gzenhtMmluN2tub2kzZzQiLCJjcmVhdGVkQXQiOiIyMDI2LTAzLTA3VDAwOjAzOjAwLjAwMFoiLCJub3RlIjoiZWRpdGVkIHRpdGxlIGFuZCBib2R5In0.46H3WBKigCzUrIOvS2ekYJFdK1OeLhqvcZTj8FBqFNKO1ivs3oC0ui_hzTKkKO-8uevMjf9-k0GOjyw2u16PDA"
7
7
  ],
8
8
  "signerPublicKey": "z6MkfUd65JrAhfdgFuMCccU9ThQvjB2fJAMUHkuuajF992gK",
9
9
  "documents": [
@@ -12,7 +12,8 @@
12
12
  "$schema": "https://schemas.dfos.com/post/v1",
13
13
  "format": "short-post",
14
14
  "title": "Hello World",
15
- "body": "First post on the protocol."
15
+ "body": "First post on the protocol.",
16
+ "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
16
17
  },
17
18
  "baseDocumentCID": null,
18
19
  "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
@@ -23,17 +24,18 @@
23
24
  "$schema": "https://schemas.dfos.com/post/v1",
24
25
  "format": "short-post",
25
26
  "title": "Hello World (edited)",
26
- "body": "Updated content."
27
+ "body": "Updated content.",
28
+ "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6"
27
29
  },
28
- "baseDocumentCID": "bafyreifpvwuarml62sfogdpi2vlltvg2ev6o4xtw74zfud7cpkg7426zne",
30
+ "baseDocumentCID": "bafyreihzwuoupfg3dxip6xmgzmxsywyii2jeoxxzbgx3zxm2in7knoi3g4",
29
31
  "createdByDID": "did:dfos:e3vvtck42d4eacdnzvtrn6",
30
32
  "createdAt": "2026-03-07T00:03:00.000Z"
31
33
  }
32
34
  ],
33
35
  "expected": {
34
- "contentId": "67t27rzc83v7c22n9t6z7c",
36
+ "contentId": "a82z92a3hndk6c97thcrn8",
35
37
  "isDeleted": false,
36
- "currentDocumentCID": "bafyreieuo26zfmjxwpmw5jk6bqzqhvivxcbckgxtyeuc7ypf3p4sihgq4q",
38
+ "currentDocumentCID": "bafyreidh7e36cvwy3uw5ypitcqk7uoktbkkkj7e6hxhky4o75rxn7kxilu",
37
39
  "length": 2
38
40
  }
39
41
  }
@@ -0,0 +1,12 @@
1
+ {
2
+ "description": "VC-JWT: DFOSContentRead credential",
3
+ "type": "credential",
4
+ "credential": "eyJhbGciOiJFZERTQSIsInR5cCI6InZjK2p3dCIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgifQ.eyJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42Iiwic3ViIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRGT1NDb250ZW50UmVhZCJdLCJjcmVkZW50aWFsU3ViamVjdCI6e319fQ.zGC2aUOgqXlVwTxSFSa_6g_gGEDEtS5YMLfIJNyPC9hn5IcbHtHxET8MqOKmFfKm9xJgA8uyDv12sr_D3hF9DQ",
5
+ "issuerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
6
+ "subjectPublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
7
+ "expected": {
8
+ "iss": "did:dfos:e3vvtck42d4eacdnzvtrn6",
9
+ "sub": "did:dfos:nzkf838efr424433rn2rzk",
10
+ "vcType": "DFOSContentRead"
11
+ }
12
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "description": "VC-JWT: DFOSContentWrite credential (broad + narrowed)",
3
+ "type": "credential",
4
+ "broadCredential": "eyJhbGciOiJFZERTQSIsInR5cCI6InZjK2p3dCIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgifQ.eyJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42Iiwic3ViIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRGT1NDb250ZW50V3JpdGUiXSwiY3JlZGVudGlhbFN1YmplY3QiOnt9fX0.Oj0wl8jjzJtT7nluaTa3e9UgdDBnAYagTRs5ZnlW3Dvfxw8BUkEuZ2o_gu80QBl1cHUUxLwmc3-lToPPT7iMCQ",
5
+ "narrowCredential": "eyJhbGciOiJFZERTQSIsInR5cCI6InZjK2p3dCIsImtpZCI6ImRpZDpkZm9zOmUzdnZ0Y2s0MmQ0ZWFjZG56dnRybjYja2V5X3I5ZXYzNGZ2YzIzejk5OXZlYWFmdDgifQ.eyJpc3MiOiJkaWQ6ZGZvczplM3Z2dGNrNDJkNGVhY2RuenZ0cm42Iiwic3ViIjoiZGlkOmRmb3M6bnprZjgzOGVmcjQyNDQzM3JuMnJ6ayIsImV4cCI6MTc5ODc2MTYwMCwiaWF0IjoxNzcyODQxNjAwLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRGT1NDb250ZW50V3JpdGUiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiY29udGVudElkIjoiYTgyejkyYTNobmRrNmM5N3RoY3JuOCJ9fX0.XecRGtsjHJbE5S2AxNLkfvnHof_t7gZRe_qrbBCLogvzPule51CWVWFsgJctgWu2jEPGiFxAedPOuuhXitSLBA",
6
+ "issuerPublicKey": "z6MkrzLMNwoJSV4P3YccWcbtk8vd9LtgMKnLeaDLUqLuASjb",
7
+ "subjectPublicKey": "z6MkvsvmSh2dGnu2qw1Tnw7M5fz98ycfuYGxqnpfgmPkLv7o",
8
+ "expected": {
9
+ "iss": "did:dfos:e3vvtck42d4eacdnzvtrn6",
10
+ "sub": "did:dfos:nzkf838efr424433rn2rzk",
11
+ "vcType": "DFOSContentWrite",
12
+ "narrowContentId": "a82z92a3hndk6c97thcrn8"
13
+ }
14
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "description": "Merkle tree: 5 content IDs → sorted → leaf hashes → root, with inclusion proof for \"charlie\"",
3
+ "type": "merkle",
4
+ "contentIds": ["alpha", "bravo", "charlie", "delta", "echo"],
5
+ "expected": {
6
+ "sortedIds": ["alpha", "bravo", "charlie", "delta", "echo"],
7
+ "root": "7e80d4780f454e0fca0b090d8c646f572b49354f54154531606105aad2fda28e",
8
+ "leafCount": 5,
9
+ "charlieProof": {
10
+ "contentId": "charlie",
11
+ "root": "7e80d4780f454e0fca0b090d8c646f572b49354f54154531606105aad2fda28e",
12
+ "path": [
13
+ {
14
+ "hash": "4f4a9410ffcdf895c4adb880659e9b5c0dd1f23a30790684340b3eaacb045398",
15
+ "position": "right"
16
+ },
17
+ {
18
+ "hash": "90d39555bb3c223e12f5a375c3011d2462fe2e1e36b8416a0b623d5831a9b4f3",
19
+ "position": "left"
20
+ },
21
+ {
22
+ "hash": "092c79e8f80e559e404bcf660c48f3522b67aba9ff1484b0367e1a4ddef7431d",
23
+ "position": "right"
24
+ }
25
+ ]
26
+ }
27
+ }
28
+ }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@metalabel/dfos-protocol",
3
- "version": "0.0.3",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
- "description": "DFOS Protocol — Ed25519 signed chain primitives, registry, and verification",
5
+ "description": "DFOS Protocol — Ed25519 signed chain primitives, beacons, merkle trees, and verification",
6
6
  "license": "MIT",
7
7
  "author": "Metalabel <hello@metalabel.com> (https://metalabel.com)",
8
8
  "repository": {
@@ -37,9 +37,13 @@
37
37
  "import": "./dist/chain/index.js",
38
38
  "types": "./dist/chain/index.d.ts"
39
39
  },
40
- "./registry": {
41
- "import": "./dist/registry/index.js",
42
- "types": "./dist/registry/index.d.ts"
40
+ "./merkle": {
41
+ "import": "./dist/merkle/index.js",
42
+ "types": "./dist/merkle/index.d.ts"
43
+ },
44
+ "./credentials": {
45
+ "import": "./dist/credentials/index.js",
46
+ "types": "./dist/credentials/index.d.ts"
43
47
  }
44
48
  },
45
49
  "files": [
@@ -49,8 +53,6 @@
49
53
  "PROTOCOL.md",
50
54
  "DID-METHOD.md",
51
55
  "CONTENT-MODEL.md",
52
- "REGISTRY-API.md",
53
- "openapi.yaml",
54
56
  "LICENSE",
55
57
  "README.md"
56
58
  ],
@@ -58,7 +60,6 @@
58
60
  "@ipld/dag-cbor": "^9.2.5",
59
61
  "@noble/curves": "^2.0.1",
60
62
  "@noble/hashes": "^2.0.1",
61
- "hono": "^4.12.3",
62
63
  "multiformats": "^13.4.2",
63
64
  "zod": "^4.3.6"
64
65
  },
@@ -75,6 +76,6 @@
75
76
  "clean": "rm -rf dist",
76
77
  "typecheck": "tsc --noEmit",
77
78
  "test": "vitest run",
78
- "generate-examples": "vitest run --config vitest.scripts.config.ts"
79
+ "generate-examples": "tsx scripts/generate-examples.ts"
79
80
  }
80
81
  }
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.dfos.com/manifest/v1",
4
+ "title": "Manifest",
5
+ "description": "A manifest — a named map of protocol object references for semantic navigation. Keys are path-like labels. Values are protocol references: content chain identifiers (22-char bare hash), DIDs (did:dfos:...), or CIDs (bafyrei...). The document layer of the dark forest. Discovery is social or out-of-band.",
6
+ "type": "object",
7
+ "required": ["$schema", "entries"],
8
+ "properties": {
9
+ "$schema": {
10
+ "const": "https://schemas.dfos.com/manifest/v1"
11
+ },
12
+ "entries": {
13
+ "type": "object",
14
+ "propertyNames": {
15
+ "pattern": "^[a-z0-9][a-z0-9._/-]*[a-z0-9]$",
16
+ "minLength": 2,
17
+ "maxLength": 128
18
+ },
19
+ "additionalProperties": {
20
+ "type": "string",
21
+ "pattern": "^[a-z0-9][a-z0-9:._/-]*$",
22
+ "minLength": 1,
23
+ "maxLength": 512
24
+ },
25
+ "description": "Named entries mapping path-like keys to protocol object references (contentId, DID, or CID)."
26
+ }
27
+ },
28
+ "additionalProperties": false
29
+ }
@@ -35,6 +35,11 @@
35
35
  "type": "array",
36
36
  "items": { "type": "string" },
37
37
  "description": "Topic names this post belongs to. Stored as names for portability."
38
+ },
39
+ "createdByDID": {
40
+ "type": "string",
41
+ "pattern": "^did:",
42
+ "description": "DID of the identity that authored this content. Optional — omit when the signer IS the author."
38
43
  }
39
44
  },
40
45
  "additionalProperties": false,
@@ -28,6 +28,11 @@
28
28
  "background": {
29
29
  "$ref": "#/$defs/media",
30
30
  "description": "Background image."
31
+ },
32
+ "createdByDID": {
33
+ "type": "string",
34
+ "pattern": "^did:",
35
+ "description": "DID of the identity that authored this content. Optional — omit when the signer IS the author."
31
36
  }
32
37
  },
33
38
  "additionalProperties": false,