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.
- package/.claude-flow/data/pending-insights.jsonl +30 -0
- package/dist/adapters/aidefence-suspicion-adapter.d.ts +40 -0
- package/dist/adapters/aidefence-suspicion-adapter.d.ts.map +1 -0
- package/dist/adapters/aidefence-suspicion-adapter.js +77 -0
- package/dist/adapters/aidefence-suspicion-adapter.js.map +1 -0
- package/dist/adapters/browser-causal-adapter.d.ts +83 -0
- package/dist/adapters/browser-causal-adapter.d.ts.map +1 -0
- package/dist/adapters/browser-causal-adapter.js +146 -0
- package/dist/adapters/browser-causal-adapter.js.map +1 -0
- package/dist/adapters/cost-attribution-adapter.d.ts +48 -0
- package/dist/adapters/cost-attribution-adapter.d.ts.map +1 -0
- package/dist/adapters/cost-attribution-adapter.js +95 -0
- package/dist/adapters/cost-attribution-adapter.js.map +1 -0
- package/dist/adapters/federation-trust-adapter.d.ts +49 -0
- package/dist/adapters/federation-trust-adapter.d.ts.map +1 -0
- package/dist/adapters/federation-trust-adapter.js +82 -0
- package/dist/adapters/federation-trust-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +16 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +16 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/jujutsu-blast-radius-adapter.d.ts +46 -0
- package/dist/adapters/jujutsu-blast-radius-adapter.d.ts.map +1 -0
- package/dist/adapters/jujutsu-blast-radius-adapter.js +80 -0
- package/dist/adapters/jujutsu-blast-radius-adapter.js.map +1 -0
- package/dist/adapters/knowledge-graph-adapter.d.ts +41 -0
- package/dist/adapters/knowledge-graph-adapter.d.ts.map +1 -0
- package/dist/adapters/knowledge-graph-adapter.js +83 -0
- package/dist/adapters/knowledge-graph-adapter.js.map +1 -0
- package/dist/adapters/observability-span-adapter.d.ts +45 -0
- package/dist/adapters/observability-span-adapter.d.ts.map +1 -0
- package/dist/adapters/observability-span-adapter.js +97 -0
- package/dist/adapters/observability-span-adapter.js.map +1 -0
- package/dist/adapters/portfolio-cg-adapter.d.ts +60 -0
- package/dist/adapters/portfolio-cg-adapter.d.ts.map +1 -0
- package/dist/adapters/portfolio-cg-adapter.js +102 -0
- package/dist/adapters/portfolio-cg-adapter.js.map +1 -0
- package/dist/adapters/rag-memory-adapter.d.ts +49 -0
- package/dist/adapters/rag-memory-adapter.d.ts.map +1 -0
- package/dist/adapters/rag-memory-adapter.js +86 -0
- package/dist/adapters/rag-memory-adapter.js.map +1 -0
- package/dist/application/federation-client.d.ts +54 -0
- package/dist/application/federation-client.d.ts.map +1 -0
- package/dist/application/federation-client.js +101 -0
- package/dist/application/federation-client.js.map +1 -0
- package/dist/application/federation-server.d.ts +38 -0
- package/dist/application/federation-server.d.ts.map +1 -0
- package/dist/application/federation-server.js +127 -0
- package/dist/application/federation-server.js.map +1 -0
- package/dist/application/streaming-bridge.d.ts +62 -0
- package/dist/application/streaming-bridge.d.ts.map +1 -0
- package/dist/application/streaming-bridge.js +101 -0
- package/dist/application/streaming-bridge.js.map +1 -0
- package/dist/domain/adapter.d.ts +58 -0
- package/dist/domain/adapter.d.ts.map +1 -0
- package/dist/domain/adapter.js +43 -0
- package/dist/domain/adapter.js.map +1 -0
- package/dist/domain/federation-protocol.d.ts +857 -0
- package/dist/domain/federation-protocol.d.ts.map +1 -0
- package/dist/domain/federation-protocol.js +72 -0
- package/dist/domain/federation-protocol.js.map +1 -0
- package/dist/domain/signed-artifact.d.ts +429 -0
- package/dist/domain/signed-artifact.d.ts.map +1 -0
- package/dist/domain/signed-artifact.js +57 -0
- package/dist/domain/signed-artifact.js.map +1 -0
- package/dist/domain/types.d.ts +329 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +165 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/jl-embed.d.ts +27 -0
- package/dist/infrastructure/jl-embed.d.ts.map +1 -0
- package/dist/infrastructure/jl-embed.js +79 -0
- package/dist/infrastructure/jl-embed.js.map +1 -0
- package/dist/infrastructure/solver-bridge.d.ts +73 -0
- package/dist/infrastructure/solver-bridge.d.ts.map +1 -0
- package/dist/infrastructure/solver-bridge.js +359 -0
- package/dist/infrastructure/solver-bridge.js.map +1 -0
- package/dist/infrastructure/witness-signer.d.ts +44 -0
- package/dist/infrastructure/witness-signer.d.ts.map +1 -0
- package/dist/infrastructure/witness-signer.js +158 -0
- package/dist/infrastructure/witness-signer.js.map +1 -0
- package/dist/mcp-tools/index.d.ts +27 -0
- package/dist/mcp-tools/index.d.ts.map +1 -0
- package/dist/mcp-tools/index.js +292 -0
- package/dist/mcp-tools/index.js.map +1 -0
- package/package.json +55 -0
- package/ruvector.db +0 -0
- package/src/adapters/aidefence-suspicion-adapter.ts +102 -0
- package/src/adapters/browser-causal-adapter.ts +193 -0
- package/src/adapters/cost-attribution-adapter.ts +123 -0
- package/src/adapters/federation-trust-adapter.ts +116 -0
- package/src/adapters/index.ts +87 -0
- package/src/adapters/jujutsu-blast-radius-adapter.ts +107 -0
- package/src/adapters/knowledge-graph-adapter.ts +110 -0
- package/src/adapters/observability-span-adapter.ts +123 -0
- package/src/adapters/portfolio-cg-adapter.ts +140 -0
- package/src/adapters/rag-memory-adapter.ts +117 -0
- package/src/application/federation-client.ts +147 -0
- package/src/application/federation-server.ts +158 -0
- package/src/application/streaming-bridge.ts +137 -0
- package/src/domain/adapter.ts +92 -0
- package/src/domain/federation-protocol.ts +95 -0
- package/src/domain/signed-artifact.ts +80 -0
- package/src/domain/types.ts +215 -0
- package/src/index.ts +105 -0
- package/src/infrastructure/jl-embed.ts +98 -0
- package/src/infrastructure/solver-bridge.ts +389 -0
- package/src/infrastructure/witness-signer.ts +209 -0
- package/src/mcp-tools/index.ts +316 -0
- package/tests/adapter-registry.test.ts +69 -0
- package/tests/browser-causal-adapter.test.ts +174 -0
- package/tests/mcp-tools.test.ts +169 -0
- package/tests/phase3-adapters.test.ts +206 -0
- package/tests/phase4-adapters.test.ts +158 -0
- package/tests/phase5-portfolio.test.ts +122 -0
- package/tests/phase6-adapters.test.ts +224 -0
- package/tests/phase6_5-streaming.test.ts +135 -0
- package/tests/phase7-signed-artifact.test.ts +238 -0
- package/tests/phase8-federation.test.ts +194 -0
- package/tests/solver-bridge.test.ts +255 -0
- package/tsconfig.json +21 -0
- 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"}
|