@motebit/protocol 0.7.0 → 0.8.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.
Files changed (45) hide show
  1. package/dist/__tests__/branded-ids.test.d.ts +2 -0
  2. package/dist/__tests__/branded-ids.test.d.ts.map +1 -0
  3. package/dist/__tests__/branded-ids.test.js +70 -0
  4. package/dist/__tests__/branded-ids.test.js.map +1 -0
  5. package/dist/__tests__/semiring-laws.test.d.ts +25 -0
  6. package/dist/__tests__/semiring-laws.test.d.ts.map +1 -0
  7. package/dist/__tests__/semiring-laws.test.js +231 -0
  8. package/dist/__tests__/semiring-laws.test.js.map +1 -0
  9. package/dist/__tests__/semiring.test.d.ts +2 -0
  10. package/dist/__tests__/semiring.test.d.ts.map +1 -0
  11. package/dist/__tests__/semiring.test.js +201 -0
  12. package/dist/__tests__/semiring.test.js.map +1 -0
  13. package/dist/__tests__/traversal.test.d.ts +2 -0
  14. package/dist/__tests__/traversal.test.d.ts.map +1 -0
  15. package/dist/__tests__/traversal.test.js +331 -0
  16. package/dist/__tests__/traversal.test.js.map +1 -0
  17. package/dist/__tests__/trust-algebra.test.d.ts +2 -0
  18. package/dist/__tests__/trust-algebra.test.d.ts.map +1 -0
  19. package/dist/__tests__/trust-algebra.test.js +105 -0
  20. package/dist/__tests__/trust-algebra.test.js.map +1 -0
  21. package/dist/credential-anchor.d.ts +86 -0
  22. package/dist/credential-anchor.d.ts.map +1 -0
  23. package/dist/credential-anchor.js +8 -0
  24. package/dist/credential-anchor.js.map +1 -0
  25. package/dist/graph.d.ts +50 -0
  26. package/dist/graph.d.ts.map +1 -0
  27. package/dist/graph.js +95 -0
  28. package/dist/graph.js.map +1 -0
  29. package/dist/index.d.ts +123 -2
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +10 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/semiring.d.ts +88 -0
  34. package/dist/semiring.d.ts.map +1 -0
  35. package/dist/semiring.js +166 -0
  36. package/dist/semiring.js.map +1 -0
  37. package/dist/traversal.d.ts +60 -0
  38. package/dist/traversal.d.ts.map +1 -0
  39. package/dist/traversal.js +183 -0
  40. package/dist/traversal.js.map +1 -0
  41. package/dist/trust-algebra.d.ts +34 -0
  42. package/dist/trust-algebra.d.ts.map +1 -0
  43. package/dist/trust-algebra.js +58 -0
  44. package/dist/trust-algebra.js.map +1 -0
  45. package/package.json +6 -5
@@ -0,0 +1,331 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { WeightedDigraph } from "../index.js";
3
+ import { TrustSemiring, CostSemiring, BooleanSemiring, productSemiring } from "../index.js";
4
+ import { optimalPaths, optimalPath, transitiveClosure, optimalPathTrace } from "../index.js";
5
+ describe("optimalPaths — TrustSemiring (max, ×)", () => {
6
+ it("finds most trusted chain through linear path", () => {
7
+ const g = new WeightedDigraph(TrustSemiring);
8
+ g.setEdge("A", "B", 0.9);
9
+ g.setEdge("B", "C", 0.8);
10
+ g.setEdge("C", "D", 0.7);
11
+ const paths = optimalPaths(g, "A");
12
+ expect(paths.get("A")).toBe(1); // self = identity
13
+ expect(paths.get("B")).toBeCloseTo(0.9); // direct
14
+ expect(paths.get("C")).toBeCloseTo(0.72); // 0.9 × 0.8
15
+ expect(paths.get("D")).toBeCloseTo(0.504); // 0.9 × 0.8 × 0.7
16
+ });
17
+ it("picks best parallel path", () => {
18
+ const g = new WeightedDigraph(TrustSemiring);
19
+ // Direct: 0.5
20
+ g.setEdge("A", "C", 0.5);
21
+ // Via B: 0.9 × 0.8 = 0.72
22
+ g.setEdge("A", "B", 0.9);
23
+ g.setEdge("B", "C", 0.8);
24
+ const paths = optimalPaths(g, "A");
25
+ expect(paths.get("C")).toBeCloseTo(0.72); // via B wins
26
+ });
27
+ it("zero trust blocks the chain", () => {
28
+ const g = new WeightedDigraph(TrustSemiring);
29
+ g.setEdge("A", "B", 0.9);
30
+ g.setEdge("B", "C", 0.0); // blocked
31
+ g.setEdge("C", "D", 0.8);
32
+ const paths = optimalPaths(g, "A");
33
+ expect(paths.get("C")).toBe(0); // annihilated
34
+ expect(paths.get("D")).toBe(0); // can't reach through zero
35
+ });
36
+ });
37
+ describe("optimalPaths — CostSemiring (min, +)", () => {
38
+ it("finds cheapest path", () => {
39
+ const g = new WeightedDigraph(CostSemiring);
40
+ // Direct: $10
41
+ g.setEdge("A", "C", 10);
42
+ // Via B: $3 + $4 = $7
43
+ g.setEdge("A", "B", 3);
44
+ g.setEdge("B", "C", 4);
45
+ const paths = optimalPaths(g, "A");
46
+ expect(paths.get("C")).toBe(7); // via B is cheaper
47
+ });
48
+ it("unreachable nodes stay at infinity", () => {
49
+ const g = new WeightedDigraph(CostSemiring);
50
+ g.setEdge("A", "B", 5);
51
+ g.addNode("C"); // isolated
52
+ const paths = optimalPaths(g, "A");
53
+ expect(paths.get("C")).toBe(Infinity);
54
+ });
55
+ });
56
+ describe("optimalPaths — BooleanSemiring (∨, ∧)", () => {
57
+ it("determines reachability", () => {
58
+ const g = new WeightedDigraph(BooleanSemiring);
59
+ g.setEdge("A", "B", true);
60
+ g.setEdge("B", "C", true);
61
+ g.addNode("D"); // isolated
62
+ const paths = optimalPaths(g, "A");
63
+ expect(paths.get("B")).toBe(true);
64
+ expect(paths.get("C")).toBe(true);
65
+ expect(paths.get("D")).toBe(false);
66
+ });
67
+ });
68
+ describe("optimalPaths — Product(Trust × Cost)", () => {
69
+ it("computes multi-objective optimal simultaneously", () => {
70
+ const ps = productSemiring(TrustSemiring, CostSemiring);
71
+ const g = new WeightedDigraph(ps);
72
+ // Edge A→B: trust 0.9, cost $3
73
+ g.setEdge("A", "B", [0.9, 3]);
74
+ // Edge B→C: trust 0.8, cost $4
75
+ g.setEdge("B", "C", [0.8, 4]);
76
+ const paths = optimalPaths(g, "A");
77
+ const toC = paths.get("C");
78
+ expect(toC[0]).toBeCloseTo(0.72); // trust: 0.9 × 0.8
79
+ expect(toC[1]).toBe(7); // cost: 3 + 4
80
+ });
81
+ });
82
+ describe("optimalPath — convenience", () => {
83
+ it("returns single value between two nodes", () => {
84
+ const g = new WeightedDigraph(TrustSemiring);
85
+ g.setEdge("A", "B", 0.9);
86
+ g.setEdge("B", "C", 0.8);
87
+ expect(optimalPath(g, "A", "C")).toBeCloseTo(0.72);
88
+ });
89
+ it("returns zero for unreachable target", () => {
90
+ const g = new WeightedDigraph(TrustSemiring);
91
+ g.setEdge("A", "B", 0.9);
92
+ g.addNode("C");
93
+ expect(optimalPath(g, "A", "C")).toBe(0);
94
+ });
95
+ });
96
+ describe("optimalPathTrace", () => {
97
+ it("returns path and value", () => {
98
+ const g = new WeightedDigraph(TrustSemiring);
99
+ g.setEdge("A", "B", 0.9);
100
+ g.setEdge("B", "C", 0.8);
101
+ g.setEdge("A", "C", 0.5); // direct but worse
102
+ const result = optimalPathTrace(g, "A", "C");
103
+ expect(result).not.toBeNull();
104
+ expect(result.value).toBeCloseTo(0.72);
105
+ expect(result.path).toEqual(["A", "B", "C"]);
106
+ });
107
+ it("returns null for unreachable", () => {
108
+ const g = new WeightedDigraph(TrustSemiring);
109
+ g.setEdge("A", "B", 0.9);
110
+ g.addNode("C");
111
+ expect(optimalPathTrace(g, "A", "C")).toBeNull();
112
+ });
113
+ });
114
+ describe("transitiveClosure — TrustSemiring", () => {
115
+ it("computes all-pairs trust", () => {
116
+ const g = new WeightedDigraph(TrustSemiring);
117
+ g.setEdge("A", "B", 0.9);
118
+ g.setEdge("B", "C", 0.8);
119
+ g.setEdge("A", "C", 0.5);
120
+ const closure = transitiveClosure(g);
121
+ // A→A: identity = 1
122
+ expect(closure.get("A").get("A")).toBe(1);
123
+ // A→B: direct 0.9
124
+ expect(closure.get("A").get("B")).toBeCloseTo(0.9);
125
+ // A→C: max(direct 0.5, via B 0.72) = 0.72
126
+ expect(closure.get("A").get("C")).toBeCloseTo(0.72);
127
+ // B→A: no path = 0
128
+ expect(closure.get("B").get("A")).toBe(0);
129
+ // B→C: direct 0.8
130
+ expect(closure.get("B").get("C")).toBeCloseTo(0.8);
131
+ });
132
+ it("handles cycles gracefully", () => {
133
+ const g = new WeightedDigraph(TrustSemiring);
134
+ g.setEdge("A", "B", 0.9);
135
+ g.setEdge("B", "A", 0.8);
136
+ const closure = transitiveClosure(g);
137
+ // A→A through cycle: max(1, 0.9 × 0.8 × ... ) = 1 (identity wins)
138
+ expect(closure.get("A").get("A")).toBe(1);
139
+ expect(closure.get("A").get("B")).toBeCloseTo(0.9);
140
+ });
141
+ });
142
+ describe("transitiveClosure — CostSemiring", () => {
143
+ it("computes all-pairs cheapest routes", () => {
144
+ const g = new WeightedDigraph(CostSemiring);
145
+ g.setEdge("A", "B", 3);
146
+ g.setEdge("B", "C", 4);
147
+ g.setEdge("A", "C", 10);
148
+ const closure = transitiveClosure(g);
149
+ // A→C: min(direct 10, via B 7) = 7
150
+ expect(closure.get("A").get("C")).toBe(7);
151
+ });
152
+ });
153
+ describe("early termination", () => {
154
+ it("converges quickly on already-optimal graphs", () => {
155
+ const g = new WeightedDigraph(TrustSemiring);
156
+ // Tree structure: no relaxation beyond first pass
157
+ g.setEdge("root", "a", 0.9);
158
+ g.setEdge("root", "b", 0.8);
159
+ g.setEdge("a", "c", 0.7);
160
+ g.setEdge("b", "d", 0.6);
161
+ const paths = optimalPaths(g, "root");
162
+ expect(paths.get("c")).toBeCloseTo(0.63); // 0.9 × 0.7
163
+ expect(paths.get("d")).toBeCloseTo(0.48); // 0.8 × 0.6
164
+ });
165
+ });
166
+ describe("optimalPath — missing target node", () => {
167
+ it("returns zero for a target not in the graph at all", () => {
168
+ const g = new WeightedDigraph(TrustSemiring);
169
+ g.setEdge("A", "B", 0.9);
170
+ // "Z" is not a node in the graph — hits the ?? graph.sr.zero fallback
171
+ expect(optimalPath(g, "A", "Z")).toBe(0);
172
+ });
173
+ });
174
+ describe("optimalPathTrace — edge cases", () => {
175
+ it("returns identity for source === target (self-loop)", () => {
176
+ const g = new WeightedDigraph(TrustSemiring);
177
+ g.addNode("A");
178
+ const result = optimalPathTrace(g, "A", "A");
179
+ expect(result).not.toBeNull();
180
+ expect(result.value).toBe(1); // semiring one
181
+ expect(result.path).toEqual(["A"]);
182
+ });
183
+ it("returns null when target value is zero (line 177-178 branch)", () => {
184
+ const g = new WeightedDigraph(TrustSemiring);
185
+ g.setEdge("A", "B", 0.9);
186
+ g.addNode("C"); // isolated — dist stays at zero
187
+ const result = optimalPathTrace(g, "A", "C");
188
+ expect(result).toBeNull();
189
+ });
190
+ it("returns null when path reconstruction does not start at source (line 190 branch)", () => {
191
+ // This tests the path[0] !== source guard.
192
+ // In a disconnected graph where pred never gets set for the target,
193
+ // the path reconstruction will produce just [target] with no predecessor.
194
+ const g = new WeightedDigraph(CostSemiring);
195
+ g.addNode("A");
196
+ g.addNode("B");
197
+ // B has dist = Infinity (CostSemiring.zero), A has dist = 0 (CostSemiring.one)
198
+ // For CostSemiring, zero is Infinity — so the value === sr.zero check on line 178
199
+ // will catch this. Let's test a scenario that exercises line 190 differently.
200
+ const result = optimalPathTrace(g, "A", "B");
201
+ expect(result).toBeNull();
202
+ });
203
+ });
204
+ describe("WeightedDigraph — query methods", () => {
205
+ it("nodes() returns all added nodes", () => {
206
+ const g = new WeightedDigraph(TrustSemiring);
207
+ g.addNode("A");
208
+ g.addNode("B");
209
+ g.addNode("C");
210
+ const nodes = g.nodes();
211
+ expect(nodes.size).toBe(3);
212
+ expect(nodes.has("A")).toBe(true);
213
+ expect(nodes.has("B")).toBe(true);
214
+ expect(nodes.has("C")).toBe(true);
215
+ });
216
+ it("nodeCount() returns correct count", () => {
217
+ const g = new WeightedDigraph(TrustSemiring);
218
+ expect(g.nodeCount()).toBe(0);
219
+ g.addNode("A");
220
+ expect(g.nodeCount()).toBe(1);
221
+ g.addNode("B");
222
+ expect(g.nodeCount()).toBe(2);
223
+ });
224
+ it("neighbors() returns outgoing edges", () => {
225
+ const g = new WeightedDigraph(TrustSemiring);
226
+ g.setEdge("A", "B", 0.9);
227
+ g.setEdge("A", "C", 0.7);
228
+ const neighbors = g.neighbors("A");
229
+ expect(neighbors.size).toBe(2);
230
+ expect(neighbors.get("B")).toBe(0.9);
231
+ expect(neighbors.get("C")).toBe(0.7);
232
+ });
233
+ it("neighbors() returns empty map for unknown node", () => {
234
+ const g = new WeightedDigraph(TrustSemiring);
235
+ const neighbors = g.neighbors("nonexistent");
236
+ expect(neighbors.size).toBe(0);
237
+ });
238
+ it("edges() returns all edges in the graph", () => {
239
+ const g = new WeightedDigraph(TrustSemiring);
240
+ g.setEdge("A", "B", 0.9);
241
+ g.setEdge("B", "C", 0.8);
242
+ g.setEdge("A", "C", 0.5);
243
+ const edges = g.edges();
244
+ expect(edges.length).toBe(3);
245
+ expect(edges).toEqual(expect.arrayContaining([
246
+ { from: "A", to: "B", weight: 0.9 },
247
+ { from: "B", to: "C", weight: 0.8 },
248
+ { from: "A", to: "C", weight: 0.5 },
249
+ ]));
250
+ });
251
+ it("edgeCount() returns total number of edges", () => {
252
+ const g = new WeightedDigraph(TrustSemiring);
253
+ expect(g.edgeCount()).toBe(0);
254
+ g.setEdge("A", "B", 0.9);
255
+ expect(g.edgeCount()).toBe(1);
256
+ g.setEdge("B", "C", 0.8);
257
+ expect(g.edgeCount()).toBe(2);
258
+ g.setEdge("A", "C", 0.5);
259
+ expect(g.edgeCount()).toBe(3);
260
+ });
261
+ it("addEdge merges parallel edges via semiring add", () => {
262
+ const g = new WeightedDigraph(TrustSemiring);
263
+ // First edge: trust 0.5
264
+ g.addEdge("A", "B", 0.5);
265
+ expect(g.getEdge("A", "B")).toBe(0.5);
266
+ // Second addEdge: trust 0.8 — should ⊕-combine via max(0.5, 0.8) = 0.8
267
+ g.addEdge("A", "B", 0.8);
268
+ expect(g.getEdge("A", "B")).toBe(0.8);
269
+ });
270
+ it("addEdge with CostSemiring merges via min", () => {
271
+ const g = new WeightedDigraph(CostSemiring);
272
+ g.addEdge("A", "B", 10);
273
+ expect(g.getEdge("A", "B")).toBe(10);
274
+ // Second addEdge: cost 5 — should ⊕-combine via min(10, 5) = 5
275
+ g.addEdge("A", "B", 5);
276
+ expect(g.getEdge("A", "B")).toBe(5);
277
+ });
278
+ it("removeEdge removes an edge", () => {
279
+ const g = new WeightedDigraph(TrustSemiring);
280
+ g.setEdge("A", "B", 0.9);
281
+ expect(g.hasEdge("A", "B")).toBe(true);
282
+ g.removeEdge("A", "B");
283
+ expect(g.hasEdge("A", "B")).toBe(false);
284
+ });
285
+ it("removeEdge is safe for non-existent edge", () => {
286
+ const g = new WeightedDigraph(TrustSemiring);
287
+ // Should not throw
288
+ g.removeEdge("A", "B");
289
+ });
290
+ it("removeNode removes node and all its edges", () => {
291
+ const g = new WeightedDigraph(TrustSemiring);
292
+ g.setEdge("A", "B", 0.9);
293
+ g.setEdge("B", "C", 0.8);
294
+ g.setEdge("C", "B", 0.7);
295
+ g.removeNode("B");
296
+ expect(g.hasNode("B")).toBe(false);
297
+ expect(g.hasEdge("A", "B")).toBe(false);
298
+ expect(g.hasEdge("B", "C")).toBe(false);
299
+ expect(g.hasEdge("C", "B")).toBe(false);
300
+ expect(g.hasNode("A")).toBe(true);
301
+ expect(g.hasNode("C")).toBe(true);
302
+ });
303
+ });
304
+ // ── Compound semiring convergence (exercises sr.eq) ─────────────────
305
+ describe("optimalPaths with compound semiring (product)", () => {
306
+ it("converges correctly using value equality", () => {
307
+ const TC = productSemiring(TrustSemiring, CostSemiring);
308
+ const g = new WeightedDigraph(TC);
309
+ g.setEdge("A", "B", [0.9, 5]);
310
+ g.setEdge("B", "C", [0.8, 3]);
311
+ g.setEdge("A", "C", [0.5, 2]);
312
+ const paths = optimalPaths(g, "A");
313
+ const toC = paths.get("C");
314
+ // Trust: max(0.9*0.8, 0.5) = max(0.72, 0.5) = 0.72
315
+ expect(toC[0]).toBeCloseTo(0.72);
316
+ // Cost: min(5+3, 2) = 2
317
+ expect(toC[1]).toBe(2);
318
+ });
319
+ it("optimalPathTrace works with compound semiring", () => {
320
+ const TC = productSemiring(TrustSemiring, CostSemiring);
321
+ const g = new WeightedDigraph(TC);
322
+ g.setEdge("A", "B", [0.9, 5]);
323
+ g.setEdge("B", "C", [0.8, 3]);
324
+ const trace = optimalPathTrace(g, "A", "C");
325
+ expect(trace).not.toBeNull();
326
+ expect(trace.path).toEqual(["A", "B", "C"]);
327
+ expect(trace.value[0]).toBeCloseTo(0.72);
328
+ expect(trace.value[1]).toBe(8);
329
+ });
330
+ });
331
+ //# sourceMappingURL=traversal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traversal.test.js","sourceRoot":"","sources":["../../src/__tests__/traversal.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trust-algebra.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust-algebra.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/trust-algebra.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Trust algebra tests — MIT protocol functions only.
3
+ * BSL functions (composeDelegationTrust, evaluateTrustTransition) are tested in @motebit/semiring.
4
+ */
5
+ import { describe, it, expect } from "vitest";
6
+ import { AgentTrustLevel, TRUST_LEVEL_SCORES, trustLevelToScore, TRUST_ZERO, TRUST_ONE, trustAdd, trustMultiply, composeTrustChain, joinParallelRoutes, DEFAULT_TRUST_THRESHOLDS, } from "../index.js";
7
+ describe("Trust Semiring Algebra", () => {
8
+ // ── Semiring laws ──
9
+ describe("semiring laws", () => {
10
+ const values = [0, 0.1, 0.3, 0.6, 0.9, 1];
11
+ it("⊕ is associative: max(a, max(b, c)) = max(max(a, b), c)", () => {
12
+ for (const a of values)
13
+ for (const b of values)
14
+ for (const c of values)
15
+ expect(trustAdd(a, trustAdd(b, c))).toBe(trustAdd(trustAdd(a, b), c));
16
+ });
17
+ it("⊗ is associative: (a × b) × c = a × (b × c)", () => {
18
+ for (const a of values)
19
+ for (const b of values)
20
+ for (const c of values)
21
+ expect(trustMultiply(trustMultiply(a, b), c)).toBeCloseTo(trustMultiply(a, trustMultiply(b, c)));
22
+ });
23
+ it("⊕ is commutative: max(a, b) = max(b, a)", () => {
24
+ for (const a of values)
25
+ for (const b of values)
26
+ expect(trustAdd(a, b)).toBe(trustAdd(b, a));
27
+ });
28
+ it("⊗ distributes over ⊕: a × max(b, c) = max(a × b, a × c)", () => {
29
+ for (const a of values)
30
+ for (const b of values)
31
+ for (const c of values)
32
+ expect(trustMultiply(a, trustAdd(b, c))).toBeCloseTo(trustAdd(trustMultiply(a, b), trustMultiply(a, c)));
33
+ });
34
+ });
35
+ // ── Identity elements ──
36
+ describe("identity elements", () => {
37
+ it("1 ⊗ x = x (multiplicative identity)", () => {
38
+ expect(trustMultiply(TRUST_ONE, 0.6)).toBe(0.6);
39
+ expect(trustMultiply(0.6, TRUST_ONE)).toBe(0.6);
40
+ });
41
+ it("0 ⊕ x = x (additive identity)", () => {
42
+ expect(trustAdd(TRUST_ZERO, 0.6)).toBe(0.6);
43
+ expect(trustAdd(0.6, TRUST_ZERO)).toBe(0.6);
44
+ });
45
+ });
46
+ // ── Annihilator ──
47
+ describe("annihilator", () => {
48
+ it("0 ⊗ x = 0 (Blocked agent kills the chain)", () => {
49
+ expect(trustMultiply(TRUST_ZERO, 0.9)).toBe(0);
50
+ expect(trustMultiply(0.9, TRUST_ZERO)).toBe(0);
51
+ });
52
+ });
53
+ // ── trustLevelToScore ──
54
+ describe("trustLevelToScore", () => {
55
+ it("maps all 5 levels correctly", () => {
56
+ expect(trustLevelToScore(AgentTrustLevel.Unknown)).toBe(0.1);
57
+ expect(trustLevelToScore(AgentTrustLevel.FirstContact)).toBe(0.3);
58
+ expect(trustLevelToScore(AgentTrustLevel.Verified)).toBe(0.6);
59
+ expect(trustLevelToScore(AgentTrustLevel.Trusted)).toBe(0.9);
60
+ expect(trustLevelToScore(AgentTrustLevel.Blocked)).toBe(0.0);
61
+ });
62
+ it("returns 0.1 for unknown strings", () => {
63
+ expect(trustLevelToScore("nonexistent")).toBe(0.1);
64
+ });
65
+ it("TRUST_LEVEL_SCORES has all 5 entries", () => {
66
+ expect(Object.keys(TRUST_LEVEL_SCORES)).toHaveLength(5);
67
+ });
68
+ });
69
+ // ── composeTrustChain ──
70
+ describe("composeTrustChain", () => {
71
+ it("[0.9, 0.6] → 0.54", () => {
72
+ expect(composeTrustChain([0.9, 0.6])).toBeCloseTo(0.54);
73
+ });
74
+ it("empty → 1.0 (multiplicative identity)", () => {
75
+ expect(composeTrustChain([])).toBe(1.0);
76
+ });
77
+ it("single element returns itself", () => {
78
+ expect(composeTrustChain([0.3])).toBeCloseTo(0.3);
79
+ });
80
+ it("chain with 0 → 0 (Blocked kills chain)", () => {
81
+ expect(composeTrustChain([0.9, 0.0, 0.6])).toBe(0);
82
+ });
83
+ });
84
+ // ── joinParallelRoutes ──
85
+ describe("joinParallelRoutes", () => {
86
+ it("[0.3, 0.6, 0.1] → 0.6", () => {
87
+ expect(joinParallelRoutes([0.3, 0.6, 0.1])).toBe(0.6);
88
+ });
89
+ it("empty → 0.0 (additive identity)", () => {
90
+ expect(joinParallelRoutes([])).toBe(0.0);
91
+ });
92
+ it("single element returns itself", () => {
93
+ expect(joinParallelRoutes([0.3])).toBe(0.3);
94
+ });
95
+ });
96
+ // ── DEFAULT_TRUST_THRESHOLDS ──
97
+ describe("DEFAULT_TRUST_THRESHOLDS", () => {
98
+ it("exists and has expected shape", () => {
99
+ expect(DEFAULT_TRUST_THRESHOLDS).toBeDefined();
100
+ expect(typeof DEFAULT_TRUST_THRESHOLDS.promoteToVerified_minTasks).toBe("number");
101
+ expect(typeof DEFAULT_TRUST_THRESHOLDS.promoteToTrusted_minRate).toBe("number");
102
+ });
103
+ });
104
+ });
105
+ //# sourceMappingURL=trust-algebra.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust-algebra.test.js","sourceRoot":"","sources":["../../src/__tests__/trust-algebra.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Credential anchor types — motebit/credential-anchor@1.0.
3
+ *
4
+ * MIT: these types define the interoperable format for credential anchoring.
5
+ * Any implementation can produce and verify anchor proofs using these types.
6
+ */
7
+ /** A batch of credential hashes anchored as a Merkle tree. */
8
+ export interface CredentialAnchorBatch {
9
+ /** UUID v4 batch identifier. */
10
+ batch_id: string;
11
+ /** MotebitId of the relay that created this batch. */
12
+ relay_id: string;
13
+ /** Hex-encoded SHA-256 Merkle root. */
14
+ merkle_root: string;
15
+ /** Number of credentials in this batch. */
16
+ leaf_count: number;
17
+ /** Millisecond timestamp of the earliest credential in the batch. */
18
+ first_issued_at: number;
19
+ /** Millisecond timestamp of the latest credential in the batch. */
20
+ last_issued_at: number;
21
+ /** Hex-encoded Ed25519 signature over the canonical batch payload. */
22
+ signature: string;
23
+ /** Onchain anchor metadata, or null if signed but not yet submitted. */
24
+ anchor: CredentialChainAnchor | null;
25
+ }
26
+ /** Onchain anchor reference — chain-agnostic. */
27
+ export interface CredentialChainAnchor {
28
+ /** Chain identifier (e.g., "solana"). */
29
+ chain: string;
30
+ /** CAIP-2 network identifier (e.g., "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"). */
31
+ network: string;
32
+ /** Transaction hash on the target chain. */
33
+ tx_hash: string;
34
+ /** Millisecond timestamp when the anchor was confirmed. */
35
+ anchored_at: number;
36
+ }
37
+ /** Self-verifiable Merkle inclusion proof for a credential in an anchored batch. */
38
+ export interface CredentialAnchorProof {
39
+ /** Credential identifier. */
40
+ credential_id: string;
41
+ /** Hex-encoded SHA-256 hash of the full credential (including proof). */
42
+ credential_hash: string;
43
+ /** Batch containing this credential. */
44
+ batch_id: string;
45
+ /** Hex-encoded Merkle root of the batch. */
46
+ merkle_root: string;
47
+ /** Number of credentials in this batch (needed for signature verification). */
48
+ leaf_count: number;
49
+ /** Millisecond timestamp of the earliest credential in the batch. */
50
+ first_issued_at: number;
51
+ /** Millisecond timestamp of the latest credential in the batch. */
52
+ last_issued_at: number;
53
+ /** Position of this credential's leaf in the sorted array. */
54
+ leaf_index: number;
55
+ /** Hex-encoded sibling hashes for Merkle path verification. */
56
+ siblings: string[];
57
+ /** Layer sizes for odd-leaf promotion detection. */
58
+ layer_sizes: number[];
59
+ /** MotebitId of the relay that created the batch. */
60
+ relay_id: string;
61
+ /** Hex-encoded Ed25519 public key of the relay (for signature verification). */
62
+ relay_public_key: string;
63
+ /** Hex-encoded Ed25519 signature over the canonical batch payload. */
64
+ batch_signature: string;
65
+ /** Onchain anchor metadata, or null if not yet submitted. */
66
+ anchor: CredentialChainAnchor | null;
67
+ }
68
+ /**
69
+ * Chain-agnostic interface for submitting Merkle roots onchain.
70
+ *
71
+ * The relay defines what it needs (publish a root). Implementations
72
+ * satisfy it for specific chains (Solana Memo, EVM calldata, etc.).
73
+ */
74
+ export interface ChainAnchorSubmitter {
75
+ /** Chain identifier (e.g., "solana", "eip155"). */
76
+ readonly chain: string;
77
+ /** CAIP-2 network identifier. */
78
+ readonly network: string;
79
+ /** Submit a Merkle root onchain. Returns the transaction hash. */
80
+ submitMerkleRoot(root: string, relayId: string, leafCount: number): Promise<{
81
+ txHash: string;
82
+ }>;
83
+ /** Whether the submitter is currently available (chain reachable, funded). */
84
+ isAvailable(): Promise<boolean>;
85
+ }
86
+ //# sourceMappingURL=credential-anchor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-anchor.d.ts","sourceRoot":"","sources":["../src/credential-anchor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,8DAA8D;AAC9D,MAAM,WAAW,qBAAqB;IACpC,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,eAAe,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,cAAc,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACtC;AAED,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACpC,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,oFAAoF;AACpF,MAAM,WAAW,qBAAqB;IACpC,6BAA6B;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,eAAe,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,eAAe,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,cAAc,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oDAAoD;IACpD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACtC;AAID;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChG,8EAA8E;IAC9E,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Credential anchor types — motebit/credential-anchor@1.0.
3
+ *
4
+ * MIT: these types define the interoperable format for credential anchoring.
5
+ * Any implementation can produce and verify anchor proofs using these types.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=credential-anchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-anchor.js","sourceRoot":"","sources":["../src/credential-anchor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Weighted directed graph parameterized by a semiring.
3
+ *
4
+ * The graph represents the agent network. Nodes are motebits.
5
+ * Edges carry semiring-valued weights (trust, cost, latency, or products thereof).
6
+ *
7
+ * Key insight: the same graph structure supports different queries by
8
+ * swapping the semiring used in traversal. The graph stores raw edge data;
9
+ * the semiring determines how to compose and compare paths.
10
+ */
11
+ import type { Semiring } from "./semiring.js";
12
+ export interface Edge<T> {
13
+ readonly from: string;
14
+ readonly to: string;
15
+ readonly weight: T;
16
+ }
17
+ /**
18
+ * Immutable-ish weighted digraph. Nodes are string IDs (motebit_id).
19
+ * Edges are stored adjacency-list style for efficient traversal.
20
+ */
21
+ export declare class WeightedDigraph<T> {
22
+ private readonly semiring;
23
+ private readonly _adj;
24
+ private readonly _nodes;
25
+ constructor(semiring: Semiring<T>);
26
+ /** The semiring this graph operates over. */
27
+ get sr(): Semiring<T>;
28
+ addNode(id: string): void;
29
+ /**
30
+ * Set an edge weight. If the edge already exists, the new weight
31
+ * is ⊕-combined with the existing weight (parallel edges merge).
32
+ */
33
+ addEdge(from: string, to: string, weight: T): void;
34
+ /** Set an edge weight, replacing any existing weight. */
35
+ setEdge(from: string, to: string, weight: T): void;
36
+ removeEdge(from: string, to: string): void;
37
+ removeNode(id: string): void;
38
+ hasNode(id: string): boolean;
39
+ hasEdge(from: string, to: string): boolean;
40
+ /** Get edge weight, or semiring zero if no edge exists. */
41
+ getEdge(from: string, to: string): T;
42
+ nodes(): ReadonlySet<string>;
43
+ nodeCount(): number;
44
+ /** Outgoing edges from a node. */
45
+ neighbors(id: string): ReadonlyMap<string, T>;
46
+ /** All edges in the graph. */
47
+ edges(): Edge<T>[];
48
+ edgeCount(): number;
49
+ }
50
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,IAAI,CAAC,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,eAAe,CAAC,CAAC;IAIhB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;gBAEf,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAElD,6CAA6C;IAC7C,IAAI,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,CAEpB;IAED,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKzB;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI;IAQlD,yDAAyD;IACzD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI;IAMlD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAI1C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ5B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI5B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IAI1C,2DAA2D;IAC3D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC;IAIpC,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC;IAI5B,SAAS,IAAI,MAAM;IAInB,kCAAkC;IAClC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAI7C,8BAA8B;IAC9B,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE;IAUlB,SAAS,IAAI,MAAM;CAKpB"}