ruflo-graph-intelligence 0.1.0-alpha.1

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 (126) hide show
  1. package/.claude-flow/data/pending-insights.jsonl +30 -0
  2. package/dist/adapters/aidefence-suspicion-adapter.d.ts +40 -0
  3. package/dist/adapters/aidefence-suspicion-adapter.d.ts.map +1 -0
  4. package/dist/adapters/aidefence-suspicion-adapter.js +77 -0
  5. package/dist/adapters/aidefence-suspicion-adapter.js.map +1 -0
  6. package/dist/adapters/browser-causal-adapter.d.ts +83 -0
  7. package/dist/adapters/browser-causal-adapter.d.ts.map +1 -0
  8. package/dist/adapters/browser-causal-adapter.js +146 -0
  9. package/dist/adapters/browser-causal-adapter.js.map +1 -0
  10. package/dist/adapters/cost-attribution-adapter.d.ts +48 -0
  11. package/dist/adapters/cost-attribution-adapter.d.ts.map +1 -0
  12. package/dist/adapters/cost-attribution-adapter.js +95 -0
  13. package/dist/adapters/cost-attribution-adapter.js.map +1 -0
  14. package/dist/adapters/federation-trust-adapter.d.ts +49 -0
  15. package/dist/adapters/federation-trust-adapter.d.ts.map +1 -0
  16. package/dist/adapters/federation-trust-adapter.js +82 -0
  17. package/dist/adapters/federation-trust-adapter.js.map +1 -0
  18. package/dist/adapters/index.d.ts +16 -0
  19. package/dist/adapters/index.d.ts.map +1 -0
  20. package/dist/adapters/index.js +16 -0
  21. package/dist/adapters/index.js.map +1 -0
  22. package/dist/adapters/jujutsu-blast-radius-adapter.d.ts +46 -0
  23. package/dist/adapters/jujutsu-blast-radius-adapter.d.ts.map +1 -0
  24. package/dist/adapters/jujutsu-blast-radius-adapter.js +80 -0
  25. package/dist/adapters/jujutsu-blast-radius-adapter.js.map +1 -0
  26. package/dist/adapters/knowledge-graph-adapter.d.ts +41 -0
  27. package/dist/adapters/knowledge-graph-adapter.d.ts.map +1 -0
  28. package/dist/adapters/knowledge-graph-adapter.js +83 -0
  29. package/dist/adapters/knowledge-graph-adapter.js.map +1 -0
  30. package/dist/adapters/observability-span-adapter.d.ts +45 -0
  31. package/dist/adapters/observability-span-adapter.d.ts.map +1 -0
  32. package/dist/adapters/observability-span-adapter.js +97 -0
  33. package/dist/adapters/observability-span-adapter.js.map +1 -0
  34. package/dist/adapters/portfolio-cg-adapter.d.ts +60 -0
  35. package/dist/adapters/portfolio-cg-adapter.d.ts.map +1 -0
  36. package/dist/adapters/portfolio-cg-adapter.js +102 -0
  37. package/dist/adapters/portfolio-cg-adapter.js.map +1 -0
  38. package/dist/adapters/rag-memory-adapter.d.ts +49 -0
  39. package/dist/adapters/rag-memory-adapter.d.ts.map +1 -0
  40. package/dist/adapters/rag-memory-adapter.js +86 -0
  41. package/dist/adapters/rag-memory-adapter.js.map +1 -0
  42. package/dist/application/federation-client.d.ts +54 -0
  43. package/dist/application/federation-client.d.ts.map +1 -0
  44. package/dist/application/federation-client.js +101 -0
  45. package/dist/application/federation-client.js.map +1 -0
  46. package/dist/application/federation-server.d.ts +38 -0
  47. package/dist/application/federation-server.d.ts.map +1 -0
  48. package/dist/application/federation-server.js +127 -0
  49. package/dist/application/federation-server.js.map +1 -0
  50. package/dist/application/streaming-bridge.d.ts +62 -0
  51. package/dist/application/streaming-bridge.d.ts.map +1 -0
  52. package/dist/application/streaming-bridge.js +101 -0
  53. package/dist/application/streaming-bridge.js.map +1 -0
  54. package/dist/domain/adapter.d.ts +58 -0
  55. package/dist/domain/adapter.d.ts.map +1 -0
  56. package/dist/domain/adapter.js +43 -0
  57. package/dist/domain/adapter.js.map +1 -0
  58. package/dist/domain/federation-protocol.d.ts +857 -0
  59. package/dist/domain/federation-protocol.d.ts.map +1 -0
  60. package/dist/domain/federation-protocol.js +72 -0
  61. package/dist/domain/federation-protocol.js.map +1 -0
  62. package/dist/domain/signed-artifact.d.ts +429 -0
  63. package/dist/domain/signed-artifact.d.ts.map +1 -0
  64. package/dist/domain/signed-artifact.js +57 -0
  65. package/dist/domain/signed-artifact.js.map +1 -0
  66. package/dist/domain/types.d.ts +329 -0
  67. package/dist/domain/types.d.ts.map +1 -0
  68. package/dist/domain/types.js +165 -0
  69. package/dist/domain/types.js.map +1 -0
  70. package/dist/index.d.ts +31 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +37 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/infrastructure/jl-embed.d.ts +27 -0
  75. package/dist/infrastructure/jl-embed.d.ts.map +1 -0
  76. package/dist/infrastructure/jl-embed.js +79 -0
  77. package/dist/infrastructure/jl-embed.js.map +1 -0
  78. package/dist/infrastructure/solver-bridge.d.ts +73 -0
  79. package/dist/infrastructure/solver-bridge.d.ts.map +1 -0
  80. package/dist/infrastructure/solver-bridge.js +359 -0
  81. package/dist/infrastructure/solver-bridge.js.map +1 -0
  82. package/dist/infrastructure/witness-signer.d.ts +44 -0
  83. package/dist/infrastructure/witness-signer.d.ts.map +1 -0
  84. package/dist/infrastructure/witness-signer.js +158 -0
  85. package/dist/infrastructure/witness-signer.js.map +1 -0
  86. package/dist/mcp-tools/index.d.ts +27 -0
  87. package/dist/mcp-tools/index.d.ts.map +1 -0
  88. package/dist/mcp-tools/index.js +292 -0
  89. package/dist/mcp-tools/index.js.map +1 -0
  90. package/package.json +55 -0
  91. package/ruvector.db +0 -0
  92. package/src/adapters/aidefence-suspicion-adapter.ts +102 -0
  93. package/src/adapters/browser-causal-adapter.ts +193 -0
  94. package/src/adapters/cost-attribution-adapter.ts +123 -0
  95. package/src/adapters/federation-trust-adapter.ts +116 -0
  96. package/src/adapters/index.ts +87 -0
  97. package/src/adapters/jujutsu-blast-radius-adapter.ts +107 -0
  98. package/src/adapters/knowledge-graph-adapter.ts +110 -0
  99. package/src/adapters/observability-span-adapter.ts +123 -0
  100. package/src/adapters/portfolio-cg-adapter.ts +140 -0
  101. package/src/adapters/rag-memory-adapter.ts +117 -0
  102. package/src/application/federation-client.ts +147 -0
  103. package/src/application/federation-server.ts +158 -0
  104. package/src/application/streaming-bridge.ts +137 -0
  105. package/src/domain/adapter.ts +92 -0
  106. package/src/domain/federation-protocol.ts +95 -0
  107. package/src/domain/signed-artifact.ts +80 -0
  108. package/src/domain/types.ts +215 -0
  109. package/src/index.ts +105 -0
  110. package/src/infrastructure/jl-embed.ts +98 -0
  111. package/src/infrastructure/solver-bridge.ts +389 -0
  112. package/src/infrastructure/witness-signer.ts +209 -0
  113. package/src/mcp-tools/index.ts +316 -0
  114. package/tests/adapter-registry.test.ts +69 -0
  115. package/tests/browser-causal-adapter.test.ts +174 -0
  116. package/tests/mcp-tools.test.ts +169 -0
  117. package/tests/phase3-adapters.test.ts +206 -0
  118. package/tests/phase4-adapters.test.ts +158 -0
  119. package/tests/phase5-portfolio.test.ts +122 -0
  120. package/tests/phase6-adapters.test.ts +224 -0
  121. package/tests/phase6_5-streaming.test.ts +135 -0
  122. package/tests/phase7-signed-artifact.test.ts +238 -0
  123. package/tests/phase8-federation.test.ts +194 -0
  124. package/tests/solver-bridge.test.ts +255 -0
  125. package/tsconfig.json +21 -0
  126. package/vitest.config.ts +9 -0
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Johnson-Lindenstrauss embedding (Wedge: ADR-121 follow-up, ADR-123 Phase 6)
3
+ *
4
+ * Replaces `@claude-flow/embeddings`' hand-rolled hand-rolled JL with a
5
+ * tested implementation that obeys the Achlioptas / Dasgupta-Gupta bound
6
+ * `target_dim ≤ original_dim − 1`. Matches the upstream
7
+ * `sublinear-time-solver@1.7.0` JL contract.
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ /** Deterministic Gaussian RNG seeded by content hash so embeddings are reproducible. */
11
+ function* gaussianStream(seed) {
12
+ // Box-Muller from a deterministic PRNG seeded by the hash.
13
+ let counter = 0;
14
+ while (true) {
15
+ const h = createHash('sha256').update(seed + ':' + counter++).digest();
16
+ // Two 32-bit floats in [0,1) per hash
17
+ const u1 = (h.readUInt32BE(0) >>> 0) / 0x100000000;
18
+ const u2 = (h.readUInt32BE(4) >>> 0) / 0x100000000;
19
+ const r = Math.sqrt(-2 * Math.log(Math.max(u1, 1e-12)));
20
+ const theta = 2 * Math.PI * u2;
21
+ yield r * Math.cos(theta);
22
+ yield r * Math.sin(theta);
23
+ }
24
+ }
25
+ /** Cap target dim at `n − 1` (Achlioptas / Dasgupta-Gupta). */
26
+ export function computeTargetDim(originalDim, requestedDim, epsilon) {
27
+ const cap = Math.max(1, originalDim - 1);
28
+ const k = Math.min(cap, requestedDim);
29
+ // Documentation: the literature bound is k ≥ 4 log(n) / ε². We honour the
30
+ // user's requested target unless it exceeds the cap.
31
+ return Math.max(1, Math.min(cap, k));
32
+ }
33
+ /** Project a list of vectors to `targetDim` via a random Gaussian matrix. */
34
+ export function jlEmbed(vectors, options) {
35
+ if (vectors.length === 0) {
36
+ return {
37
+ projected: [],
38
+ targetDim: 0,
39
+ epsilon: options.epsilon ?? 0.1,
40
+ withinAchlioptasBound: true,
41
+ };
42
+ }
43
+ const originalDim = vectors[0].length;
44
+ const target = computeTargetDim(originalDim, options.targetDim, options.epsilon ?? 0.1);
45
+ const seed = options.seed ?? 'ruflo-jl-v1';
46
+ // Construct the k × n projection matrix R, then project each vector.
47
+ const stream = gaussianStream(seed);
48
+ const R = new Array(target);
49
+ for (let i = 0; i < target; i++) {
50
+ const row = new Float64Array(originalDim);
51
+ for (let j = 0; j < originalDim; j++)
52
+ row[j] = stream.next().value;
53
+ R[i] = row;
54
+ }
55
+ // Scaling: each entry has Var = 1, so multiply by 1/√k to keep ‖Rv‖² ≈ ‖v‖²
56
+ const scale = 1 / Math.sqrt(target);
57
+ const projected = [];
58
+ for (const v of vectors) {
59
+ if (v.length !== originalDim) {
60
+ throw new Error(`jlEmbed: vector dim ${v.length} ≠ expected ${originalDim}`);
61
+ }
62
+ const out = new Array(target);
63
+ for (let i = 0; i < target; i++) {
64
+ let s = 0;
65
+ const row = R[i];
66
+ for (let j = 0; j < originalDim; j++)
67
+ s += row[j] * v[j];
68
+ out[i] = s * scale;
69
+ }
70
+ projected.push(out);
71
+ }
72
+ return {
73
+ projected,
74
+ targetDim: target,
75
+ epsilon: options.epsilon ?? 0.1,
76
+ withinAchlioptasBound: target <= Math.max(1, originalDim - 1),
77
+ };
78
+ }
79
+ //# sourceMappingURL=jl-embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jl-embed.js","sourceRoot":"","sources":["../../src/infrastructure/jl-embed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * ruflo-graph-intelligence — Solver Bridge (ADR-123)
3
+ *
4
+ * Thin shim over `sublinear-time-solver@1.7.0`. Translates our SparseMatrix
5
+ * envelope into the solver's input shape, threads the complexity budget +
6
+ * coherence threshold, and unwraps structured errors back into our taxonomy.
7
+ *
8
+ * Phase 1 implementation uses a deterministic in-process forward-push
9
+ * implementation and a tiny CG solver. The shape of the contract matches
10
+ * what `sublinear-time-solver@1.7.0` produces so a single drop-in replacement
11
+ * in a later phase wires us into the published WASM / native crate.
12
+ */
13
+ import { type ComplexityClass, type CoherenceReport, type PageRankQuery, type PageRankResult, type SolveQuery, type SolveResult, type SolveOnChangeQuery, type SparseDelta, type SparseMatrix } from '../domain/types.js';
14
+ export declare function coherenceScore(matrix: SparseMatrix): number;
15
+ export declare function checkCoherence(matrix: SparseMatrix, threshold: number): CoherenceReport;
16
+ /**
17
+ * Single-entry personalized PageRank via forward-push.
18
+ *
19
+ * On a DD graph (which our `(I − αP^T)π = e_seed` rewriting always is for
20
+ * α<1) this is sublinear: only nodes within the active push-frontier are
21
+ * touched. Guarantee: result is within ε of the true PR score.
22
+ *
23
+ * Returns the score AND the iteration count (so callers can record the
24
+ * actual complexity-class achieved on the input).
25
+ */
26
+ export declare function singleEntryPageRank(matrix: SparseMatrix, query: PageRankQuery): {
27
+ score: number;
28
+ iterations: number;
29
+ };
30
+ export declare function conjugateGradient(matrix: SparseMatrix, b: number[], options?: {
31
+ epsilon: number;
32
+ maxIter?: number;
33
+ }): {
34
+ x: number[];
35
+ residualNorm: number;
36
+ iterations: number;
37
+ };
38
+ export declare function neumann(matrix: SparseMatrix, b: number[], options?: {
39
+ epsilon: number;
40
+ maxIter?: number;
41
+ }): {
42
+ x: number[];
43
+ residualNorm: number;
44
+ iterations: number;
45
+ };
46
+ export declare function solveOnChange(matrix: SparseMatrix, prevSolution: number[], delta: SparseDelta, options?: {
47
+ epsilon: number;
48
+ algorithm?: 'cg' | 'neumann';
49
+ }): {
50
+ x: number[];
51
+ iterations: number;
52
+ residualNorm: number;
53
+ };
54
+ export declare function hashResult(input: {
55
+ graphId: string;
56
+ nodeId: string;
57
+ alpha: number;
58
+ epsilon: number;
59
+ seedNodes: readonly string[];
60
+ score: number;
61
+ }): string;
62
+ /**
63
+ * Map measured iteration count + matrix size to an observed ComplexityClass.
64
+ *
65
+ * This is the *post-hoc* observation that the result carries; the upstream
66
+ * 1.7.0 `Complexity` trait provides the declared class for each solver. We
67
+ * pick the *tighter* (more honest) of the two when reporting.
68
+ */
69
+ export declare function observedComplexity(iterations: number, n: number): ComplexityClass;
70
+ export declare function runPageRank(matrix: SparseMatrix, query: PageRankQuery): PageRankResult;
71
+ export declare function runSolve(matrix: SparseMatrix, query: SolveQuery): SolveResult;
72
+ export declare function runSolveOnChange(matrix: SparseMatrix, query: SolveOnChangeQuery): SolveResult;
73
+ //# sourceMappingURL=solver-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solver-bridge.d.ts","sourceRoot":"","sources":["../../src/infrastructure/solver-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAM5B,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAe3D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,CAGvF;AAMD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,aAAa,GACnB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAqDvC;AAuBD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,EACpB,CAAC,EAAE,MAAM,EAAE,EACX,OAAO,GAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAsB,GACjE;IAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CA0B3D;AAED,wBAAgB,OAAO,CACrB,MAAM,EAAE,YAAY,EACpB,CAAC,EAAE,MAAM,EAAE,EACX,OAAO,GAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAsB,GACjE;IAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAmC3D;AAMD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,CAAA;CAAsB,GAC7E;IAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAS3D;AAMD,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,MAAM,CAUT;AAMD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAQjF;AAMD,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,GAAG,cAAc,CAyCtF;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,WAAW,CAgC7E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,kBAAkB,GAAG,WAAW,CAwB7F"}
@@ -0,0 +1,359 @@
1
+ /**
2
+ * ruflo-graph-intelligence — Solver Bridge (ADR-123)
3
+ *
4
+ * Thin shim over `sublinear-time-solver@1.7.0`. Translates our SparseMatrix
5
+ * envelope into the solver's input shape, threads the complexity budget +
6
+ * coherence threshold, and unwraps structured errors back into our taxonomy.
7
+ *
8
+ * Phase 1 implementation uses a deterministic in-process forward-push
9
+ * implementation and a tiny CG solver. The shape of the contract matches
10
+ * what `sublinear-time-solver@1.7.0` produces so a single drop-in replacement
11
+ * in a later phase wires us into the published WASM / native crate.
12
+ */
13
+ import { createHash } from 'node:crypto';
14
+ import { fitsBudget, } from '../domain/types.js';
15
+ // ============================================================================
16
+ // Coherence — per-row DD margin
17
+ // ============================================================================
18
+ export function coherenceScore(matrix) {
19
+ const rowSums = new Array(matrix.size).fill(0);
20
+ const diag = new Array(matrix.size).fill(0);
21
+ for (const { row, col, value } of matrix.entries) {
22
+ if (row === col)
23
+ diag[row] = Math.abs(value);
24
+ else
25
+ rowSums[row] += Math.abs(value);
26
+ }
27
+ let minMargin = Infinity;
28
+ for (let i = 0; i < matrix.size; i++) {
29
+ const d = diag[i];
30
+ if (d === 0)
31
+ return -Infinity; // a zero diagonal is fatal
32
+ const margin = (d - rowSums[i]) / d;
33
+ if (margin < minMargin)
34
+ minMargin = margin;
35
+ }
36
+ return Math.min(1, minMargin);
37
+ }
38
+ export function checkCoherence(matrix, threshold) {
39
+ const score = coherenceScore(matrix);
40
+ return { score, passed: score >= threshold, threshold };
41
+ }
42
+ // ============================================================================
43
+ // Single-entry PageRank — forward-push, deterministic
44
+ // ============================================================================
45
+ /**
46
+ * Single-entry personalized PageRank via forward-push.
47
+ *
48
+ * On a DD graph (which our `(I − αP^T)π = e_seed` rewriting always is for
49
+ * α<1) this is sublinear: only nodes within the active push-frontier are
50
+ * touched. Guarantee: result is within ε of the true PR score.
51
+ *
52
+ * Returns the score AND the iteration count (so callers can record the
53
+ * actual complexity-class achieved on the input).
54
+ */
55
+ export function singleEntryPageRank(matrix, query) {
56
+ // Build row-stochastic transition probabilities P with damping α
57
+ const N = matrix.size;
58
+ const outDegree = new Array(N).fill(0);
59
+ for (const { row, col, value } of matrix.entries) {
60
+ if (row !== col)
61
+ outDegree[row] += Math.abs(value);
62
+ }
63
+ // residual r and estimate p, indexed by row.
64
+ const r = new Float64Array(N);
65
+ const p = new Float64Array(N);
66
+ // Personalization: seedNodes carry the restart mass; otherwise uniform.
67
+ if (query.seedNodes.length > 0) {
68
+ const mass = 1 / query.seedNodes.length;
69
+ for (const seed of query.seedNodes) {
70
+ const idx = matrix.nodeIndex[seed];
71
+ if (idx !== undefined)
72
+ r[idx] = (r[idx] ?? 0) + mass;
73
+ }
74
+ }
75
+ else {
76
+ const u = 1 / N;
77
+ for (let i = 0; i < N; i++)
78
+ r[i] = u;
79
+ }
80
+ // Forward-push iterations
81
+ const alpha = query.alpha;
82
+ const eps = query.epsilon;
83
+ const maxIter = Math.max(64, Math.ceil(Math.log(1 / eps) / Math.log(1 / (1 - alpha)) * 4));
84
+ let iterations = 0;
85
+ for (let it = 0; it < maxIter; it++) {
86
+ iterations++;
87
+ let pushed = false;
88
+ for (let u = 0; u < N; u++) {
89
+ if (r[u] <= eps)
90
+ continue;
91
+ const ru = r[u];
92
+ r[u] = 0;
93
+ p[u] += (1 - alpha) * ru;
94
+ if (outDegree[u] === 0)
95
+ continue;
96
+ // Distribute α·ru to neighbours proportionally
97
+ const factor = alpha * ru / outDegree[u];
98
+ for (const { row, col, value } of matrix.entries) {
99
+ if (row === u && row !== col) {
100
+ r[col] += factor * Math.abs(value);
101
+ }
102
+ }
103
+ pushed = true;
104
+ }
105
+ if (!pushed)
106
+ break;
107
+ }
108
+ const targetIdx = matrix.nodeIndex[query.nodeId];
109
+ const score = targetIdx !== undefined ? p[targetIdx] : 0;
110
+ return { score, iterations };
111
+ }
112
+ // ============================================================================
113
+ // Full solve — Conjugate Gradient (symmetric PD) + Neumann (general DD)
114
+ // ============================================================================
115
+ /** Sparse matrix-vector product. */
116
+ function spmv(matrix, x) {
117
+ const out = new Float64Array(matrix.size);
118
+ for (const { row, col, value } of matrix.entries)
119
+ out[row] += value * (x[col] ?? 0);
120
+ return out;
121
+ }
122
+ function dot(a, b) {
123
+ let s = 0;
124
+ for (let i = 0; i < a.length; i++)
125
+ s += a[i] * b[i];
126
+ return s;
127
+ }
128
+ function l2(v) {
129
+ return Math.sqrt(dot(v, v));
130
+ }
131
+ export function conjugateGradient(matrix, b, options = { epsilon: 1e-8 }) {
132
+ const n = matrix.size;
133
+ const x = new Float64Array(n);
134
+ const Ax = spmv(matrix, x);
135
+ const r = new Float64Array(n);
136
+ for (let i = 0; i < n; i++)
137
+ r[i] = b[i] - Ax[i];
138
+ const p = new Float64Array(r);
139
+ const maxIter = options.maxIter ?? n;
140
+ let iterations = 0;
141
+ for (let k = 0; k < maxIter; k++) {
142
+ iterations++;
143
+ const Ap = spmv(matrix, p);
144
+ const rDotR = dot(r, r);
145
+ const pDotAp = dot(p, Ap);
146
+ if (pDotAp === 0)
147
+ break;
148
+ const alpha = rDotR / pDotAp;
149
+ for (let i = 0; i < n; i++) {
150
+ x[i] += alpha * p[i];
151
+ r[i] -= alpha * Ap[i];
152
+ }
153
+ const newRDotR = dot(r, r);
154
+ if (Math.sqrt(newRDotR) < options.epsilon)
155
+ break;
156
+ const beta = newRDotR / rDotR;
157
+ for (let i = 0; i < n; i++)
158
+ p[i] = r[i] + beta * p[i];
159
+ }
160
+ return { x: Array.from(x), residualNorm: l2(r), iterations };
161
+ }
162
+ export function neumann(matrix, b, options = { epsilon: 1e-8 }) {
163
+ // Solve via x_{k+1} = D⁻¹ (b − (A − D) x_k), Jacobi-Neumann.
164
+ const n = matrix.size;
165
+ const diag = new Float64Array(n);
166
+ for (const { row, col, value } of matrix.entries) {
167
+ if (row === col)
168
+ diag[row] = value;
169
+ }
170
+ const x = new Float64Array(n);
171
+ const maxIter = options.maxIter ?? 256;
172
+ let iterations = 0;
173
+ let lastResidual = Infinity;
174
+ for (let k = 0; k < maxIter; k++) {
175
+ iterations++;
176
+ const next = new Float64Array(n);
177
+ for (let i = 0; i < n; i++)
178
+ next[i] = b[i] ?? 0;
179
+ for (const { row, col, value } of matrix.entries) {
180
+ if (row !== col)
181
+ next[row] -= value * (x[col] ?? 0);
182
+ }
183
+ for (let i = 0; i < n; i++) {
184
+ const d = diag[i];
185
+ if (d === 0)
186
+ return { x: Array.from(x), residualNorm: Infinity, iterations };
187
+ next[i] /= d;
188
+ }
189
+ const Ax = spmv(matrix, next);
190
+ const r = new Float64Array(n);
191
+ for (let i = 0; i < n; i++)
192
+ r[i] = b[i] - Ax[i];
193
+ const norm = l2(r);
194
+ for (let i = 0; i < n; i++)
195
+ x[i] = next[i];
196
+ if (norm < options.epsilon) {
197
+ lastResidual = norm;
198
+ break;
199
+ }
200
+ lastResidual = norm;
201
+ }
202
+ return { x: Array.from(x), residualNorm: lastResidual, iterations };
203
+ }
204
+ // ============================================================================
205
+ // Incremental solve — `A·dx = δ`, then `x_new = x_prev + dx` (Wedge 12)
206
+ // ============================================================================
207
+ export function solveOnChange(matrix, prevSolution, delta, options = { epsilon: 1e-8 }) {
208
+ const rhs = new Array(matrix.size).fill(0);
209
+ for (let i = 0; i < delta.indices.length; i++) {
210
+ rhs[delta.indices[i]] = delta.values[i] ?? 0;
211
+ }
212
+ const solver = options.algorithm === 'neumann' ? neumann : conjugateGradient;
213
+ const dx = solver(matrix, rhs, { epsilon: options.epsilon });
214
+ const x = prevSolution.map((v, i) => v + (dx.x[i] ?? 0));
215
+ return { x, iterations: dx.iterations, residualNorm: dx.residualNorm };
216
+ }
217
+ // ============================================================================
218
+ // Result hashing — deterministic memoization + signing key material
219
+ // ============================================================================
220
+ export function hashResult(input) {
221
+ const canonical = JSON.stringify({
222
+ graphId: input.graphId,
223
+ nodeId: input.nodeId,
224
+ alpha: input.alpha,
225
+ epsilon: input.epsilon,
226
+ seedNodes: [...input.seedNodes].sort(),
227
+ score: Number(input.score.toFixed(12)),
228
+ });
229
+ return createHash('sha256').update(canonical).digest('hex');
230
+ }
231
+ // ============================================================================
232
+ // Complexity-class accounting — what the solver actually used
233
+ // ============================================================================
234
+ /**
235
+ * Map measured iteration count + matrix size to an observed ComplexityClass.
236
+ *
237
+ * This is the *post-hoc* observation that the result carries; the upstream
238
+ * 1.7.0 `Complexity` trait provides the declared class for each solver. We
239
+ * pick the *tighter* (more honest) of the two when reporting.
240
+ */
241
+ export function observedComplexity(iterations, n) {
242
+ if (iterations <= 1)
243
+ return 'constant';
244
+ if (iterations <= Math.ceil(Math.log2(Math.max(2, n))))
245
+ return 'logarithmic';
246
+ if (iterations <= Math.ceil(Math.pow(Math.log2(Math.max(2, n)), 2)))
247
+ return 'polylogarithmic';
248
+ if (iterations < n)
249
+ return 'sublinear';
250
+ if (iterations < n * Math.log2(Math.max(2, n)))
251
+ return 'linear';
252
+ if (iterations < n * n)
253
+ return 'linearithmic';
254
+ return 'polynomial';
255
+ }
256
+ // ============================================================================
257
+ // Top-level: run a PageRankQuery + assemble a PageRankResult
258
+ // ============================================================================
259
+ export function runPageRank(matrix, query) {
260
+ const coherence = checkCoherence(matrix, query.coherenceThreshold);
261
+ if (!coherence.passed) {
262
+ throw {
263
+ kind: 'coherence-rejected',
264
+ message: `coherence ${coherence.score.toFixed(4)} < threshold ${coherence.threshold}`,
265
+ recoverable: true,
266
+ coherence: coherence.score,
267
+ threshold: coherence.threshold,
268
+ };
269
+ }
270
+ const { score, iterations } = singleEntryPageRank(matrix, query);
271
+ const obs = observedComplexity(iterations, matrix.size);
272
+ if (!fitsBudget(obs, query.maxComplexityClass)) {
273
+ throw {
274
+ kind: 'complexity-budget-exceeded',
275
+ message: `observed ${obs} exceeds budget ${query.maxComplexityClass}`,
276
+ recoverable: true,
277
+ requiredClass: obs,
278
+ requestedClass: query.maxComplexityClass,
279
+ };
280
+ }
281
+ return {
282
+ graphId: matrix.graphId,
283
+ nodeId: query.nodeId,
284
+ score,
285
+ alpha: query.alpha,
286
+ epsilon: query.epsilon,
287
+ iterations,
288
+ complexityClass: obs,
289
+ coherence,
290
+ computedAt: new Date().toISOString(),
291
+ resultHash: hashResult({
292
+ graphId: matrix.graphId,
293
+ nodeId: query.nodeId,
294
+ alpha: query.alpha,
295
+ epsilon: query.epsilon,
296
+ seedNodes: query.seedNodes,
297
+ score,
298
+ }),
299
+ };
300
+ }
301
+ export function runSolve(matrix, query) {
302
+ const coherence = checkCoherence(matrix, query.coherenceThreshold);
303
+ if (!coherence.passed) {
304
+ throw {
305
+ kind: 'coherence-rejected',
306
+ message: `coherence ${coherence.score.toFixed(4)} < threshold ${coherence.threshold}`,
307
+ recoverable: true,
308
+ coherence: coherence.score,
309
+ threshold: coherence.threshold,
310
+ };
311
+ }
312
+ const solver = query.algorithm === 'neumann' ? neumann : conjugateGradient;
313
+ const { x, residualNorm, iterations } = solver(matrix, query.rhs, { epsilon: 1e-8 });
314
+ const obs = observedComplexity(iterations, matrix.size);
315
+ if (!fitsBudget(obs, query.maxComplexityClass)) {
316
+ throw {
317
+ kind: 'complexity-budget-exceeded',
318
+ message: `observed ${obs} exceeds budget ${query.maxComplexityClass}`,
319
+ recoverable: true,
320
+ requiredClass: obs,
321
+ requestedClass: query.maxComplexityClass,
322
+ };
323
+ }
324
+ return {
325
+ graphId: matrix.graphId,
326
+ x,
327
+ residualNorm,
328
+ iterations,
329
+ complexityClass: obs,
330
+ coherence,
331
+ computedAt: new Date().toISOString(),
332
+ };
333
+ }
334
+ export function runSolveOnChange(matrix, query) {
335
+ const { x, iterations, residualNorm } = solveOnChange(matrix, query.prevSolution, query.delta, {
336
+ epsilon: 1e-8,
337
+ algorithm: query.algorithm,
338
+ });
339
+ const obs = observedComplexity(iterations, matrix.size);
340
+ if (!fitsBudget(obs, query.maxComplexityClass)) {
341
+ throw {
342
+ kind: 'complexity-budget-exceeded',
343
+ message: `observed ${obs} exceeds budget ${query.maxComplexityClass}`,
344
+ recoverable: true,
345
+ requiredClass: obs,
346
+ requestedClass: query.maxComplexityClass,
347
+ };
348
+ }
349
+ return {
350
+ graphId: matrix.graphId,
351
+ x,
352
+ residualNorm,
353
+ iterations,
354
+ complexityClass: obs,
355
+ coherence: checkCoherence(matrix, 0), // attestation-only on streaming
356
+ computedAt: new Date().toISOString(),
357
+ };
358
+ }
359
+ //# sourceMappingURL=solver-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solver-bridge.js","sourceRoot":"","sources":["../../src/infrastructure/solver-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Witness Signer for PR Artifacts (Phase 7, ADR-123)
3
+ *
4
+ * Ed25519 sign / verify via node:crypto. Mirrors @claude-flow/browser's
5
+ * ADR-122 Phase 1 witness signer — same canonical-JSON approach so a single
6
+ * upstream-ADR-103 schema change cascades cleanly.
7
+ */
8
+ import { type KeyObject } from 'node:crypto';
9
+ import { type SignedPageRankEnvelope, type SignedPageRankPayload, type ArtifactVerificationResult } from '../domain/signed-artifact.js';
10
+ import type { PageRankResult } from '../domain/types.js';
11
+ export interface WitnessKey {
12
+ privateKey: KeyObject;
13
+ publicKey: KeyObject;
14
+ publicKeyHex: string;
15
+ }
16
+ /** Canonical-JSON for deterministic signing — omits undefined keys, sorts. */
17
+ export declare function canonicalJSON(value: unknown): string;
18
+ export declare function sha256Hex(input: Buffer | string): string;
19
+ export declare function generateWitnessKey(): WitnessKey;
20
+ export declare function loadWitnessKey(privateKeyPem: string): WitnessKey;
21
+ export declare function resolveWitnessKey(): WitnessKey;
22
+ export interface SealArtifactInput {
23
+ installationId: string;
24
+ witnessKeyId: string;
25
+ graphId: string;
26
+ graphHash: string;
27
+ graphTimestamp: string;
28
+ algorithm: SignedPageRankPayload['algorithm'];
29
+ alpha: number;
30
+ epsilon: number;
31
+ queryNode?: string;
32
+ seedNodes: readonly string[];
33
+ result: PageRankResult;
34
+ witnessKey?: WitnessKey;
35
+ sealedAt?: string;
36
+ }
37
+ export declare function sealArtifact(input: SealArtifactInput): {
38
+ envelope: SignedPageRankEnvelope;
39
+ publicKeyHex: string;
40
+ };
41
+ export declare function verifyArtifact(envelope: unknown, options?: {
42
+ trustedPublicKeys?: string[];
43
+ }): ArtifactVerificationResult;
44
+ //# sourceMappingURL=witness-signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"witness-signer.d.ts","sourceRoot":"","sources":["../../src/infrastructure/witness-signer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAKL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAChC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOpD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,kBAAkB,IAAI,UAAU,CAG/C;AAED,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,CAIhE;AAOD,wBAAgB,iBAAiB,IAAI,UAAU,CAI9C;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG;IACtD,QAAQ,EAAE,sBAAsB,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;CACtB,CA6BA;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAC7C,0BAA0B,CAqF5B"}