agentic-flow 3.2.0 → 3.3.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 (34) hide show
  1. package/.agents/skills/agentic-flow-ecosystem/SKILL.md +6 -5
  2. package/.claude/skills/agentic-flow-ecosystem/skill.md +6 -5
  3. package/CHANGELOG.md +45 -0
  4. package/README.md +2 -2
  5. package/dist/.tsbuildinfo +1 -1
  6. package/dist/config/claudeFlow.d.ts +1 -1
  7. package/dist/integrations/index.d.ts +2 -2
  8. package/dist/integrations/index.d.ts.map +1 -1
  9. package/dist/integrations/index.js +1 -1
  10. package/dist/integrations/index.js.map +1 -1
  11. package/dist/integrations/optional.d.ts +3 -15
  12. package/dist/integrations/optional.d.ts.map +1 -1
  13. package/dist/integrations/optional.js +4 -28
  14. package/dist/integrations/optional.js.map +1 -1
  15. package/dist/integrations/sublinear.d.ts +56 -28
  16. package/dist/integrations/sublinear.d.ts.map +1 -1
  17. package/dist/integrations/sublinear.js +165 -89
  18. package/dist/integrations/sublinear.js.map +1 -1
  19. package/dist/intelligence/RuVectorIntelligence.d.ts +4 -2
  20. package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -1
  21. package/dist/intelligence/RuVectorIntelligence.js +39 -13
  22. package/dist/intelligence/RuVectorIntelligence.js.map +1 -1
  23. package/dist/mcp/standalone-stdio.js +1 -1
  24. package/dist/mcp/standalone-stdio.js.map +1 -1
  25. package/dist/mcp/tools/ecosystem-tools.d.ts +4 -4
  26. package/dist/mcp/tools/ecosystem-tools.d.ts.map +1 -1
  27. package/dist/mcp/tools/ecosystem-tools.js +30 -8
  28. package/dist/mcp/tools/ecosystem-tools.js.map +1 -1
  29. package/dist/optimizations/configuration-tuning.d.ts +1 -1
  30. package/dist/services/sona-loader.d.ts +15 -1
  31. package/dist/services/sona-loader.d.ts.map +1 -1
  32. package/dist/services/sona-loader.js +54 -2
  33. package/dist/services/sona-loader.js.map +1 -1
  34. package/package.json +5 -5
@@ -1,22 +1,20 @@
1
1
  /**
2
- * Linear solves and PageRank through `sublinear-time-solver`, verified.
2
+ * Linear solves and PageRank through `@ruvnet/sublinear-core`, verified.
3
3
  *
4
- * sublinear-time-solver (optionalDependency, ~120 MB installed with its own
5
- * deps) solves diagonally dominant systems with push / random-walk methods.
6
- * Measured against 1.7.2: `forward-push` is accurate, but the default
7
- * `neumann` method returned a wrong answer with `converged: false` and
8
- * `random-walk` threw, and the package logs banners with `console.log`. So:
9
- * - only `forward-push` is used;
10
- * - every answer is checked against the residual ||Mx - b||_inf here, and a
11
- * built-in Gauss-Seidel solve replaces it when the check fails;
12
- * - the import, construction and solve run with console output sent to stderr
13
- * (the MCP stdio server owns stdout).
4
+ * @ruvnet/sublinear-core (optionalDependency, zero dependencies, ~220 kB) is
5
+ * the embeddable core of sublinear-time-solver: sparse iterative solvers
6
+ * (Gauss-Seidel, conjugate gradient, Jacobi, Neumann), PageRank, personalized
7
+ * PageRank and local forward push. It reports the residual of the x it
8
+ * returns, but every answer is still checked here against ||Mx - b||_inf, and
9
+ * a built-in Gauss-Seidel solve replaces it when the check fails or the
10
+ * package is not installed.
14
11
  *
15
12
  * The 5 bundled `sublinear/*` agents name sublinear-time-solver tools; the
16
13
  * `sublinear_solve` / `sublinear_pagerank` MCP tools in this package give them
17
14
  * a working in-process path without a separate MCP server.
18
15
  */
19
- import { importOptional, withStdoutToStderr } from './optional.js';
16
+ import { importOptional } from './optional.js';
17
+ export const SUBLINEAR_CORE = '@ruvnet/sublinear-core';
20
18
  function toCsr(m) {
21
19
  if (Array.isArray(m)) {
22
20
  const n = m.length;
@@ -86,42 +84,32 @@ function gaussSeidel(a, b, tol, maxIterations) {
86
84
  }
87
85
  return { x, iterations: it };
88
86
  }
89
- const solverCache = new Map();
90
- async function librarySolve(a, b, tol, maxIterations) {
91
- return withStdoutToStderr(async () => {
92
- const mod = await importOptional('sublinear-time-solver/core', { quietStdout: true });
93
- const Solver = mod?.SublinearSolver;
94
- if (typeof Solver !== 'function')
95
- return null;
96
- const key = `${tol}|${maxIterations}`;
97
- let solver = solverCache.get(key);
98
- if (!solver) {
99
- solver = new Solver({ method: 'forward-push', epsilon: tol, maxIterations });
100
- // The constructor starts WASM probing asynchronously and logs when it
101
- // finishes; let that settle while console output is still redirected.
102
- await solver.initializeWasm?.().catch(() => undefined);
103
- await new Promise((r) => setTimeout(r, 0));
104
- if (solverCache.size > 8)
105
- solverCache.clear();
106
- solverCache.set(key, solver);
87
+ /** The core module, or null when it is not installed. */
88
+ export async function loadSublinearCore() {
89
+ const mod = await importOptional(SUBLINEAR_CORE);
90
+ return typeof mod?.solve === 'function' && typeof mod?.pageRank === 'function' ? mod : null;
91
+ }
92
+ function coreSolve(core, a, b, tol, maxIterations, method) {
93
+ const rowIndices = [];
94
+ const colIndices = [];
95
+ const values = [];
96
+ a.rows.forEach((row, i) => {
97
+ for (const [j, v] of row) {
98
+ rowIndices.push(i);
99
+ colIndices.push(j);
100
+ values.push(v);
107
101
  }
108
- const values = [];
109
- const rowIndices = [];
110
- const colIndices = [];
111
- a.rows.forEach((row, i) => {
112
- for (const [j, v] of row) {
113
- values.push(v);
114
- rowIndices.push(i);
115
- colIndices.push(j);
116
- }
117
- });
118
- const res = await solver.solve({ rows: a.n, cols: a.n, values, rowIndices, colIndices, format: 'coo' }, b);
119
- return Array.isArray(res?.solution) ? res.solution.map(Number) : null;
120
102
  });
103
+ const A = core.csrFromCoo({ rows: a.n, cols: a.n, rowIndices, colIndices, values });
104
+ // Core stops on the relative L2 residual ||b - Ax||_2 / ||b||_2. The local
105
+ // gate is an absolute inf-norm bound, and ||r||_inf <= ||r||_2, so asking
106
+ // core for tol / sqrt(n) keeps every converged core answer inside it.
107
+ return core.solve(A, b, { method, tolerance: tol / Math.sqrt(a.n), maxIterations });
121
108
  }
122
109
  /**
123
- * Solve Mx = b. Intended for (row) diagonally dominant M; other matrices are
124
- * attempted with Gauss-Seidel and reported with `converged: false` if it fails.
110
+ * Solve Mx = b. Intended for (row) diagonally dominant or symmetric positive
111
+ * definite M; other matrices are attempted with Gauss-Seidel and reported with
112
+ * `converged: false` if it fails.
125
113
  */
126
114
  export async function solveLinearSystem(matrix, b, options = {}) {
127
115
  const a = toCsr(matrix);
@@ -131,24 +119,28 @@ export async function solveLinearSystem(matrix, b, options = {}) {
131
119
  throw new Error('vector entries must be finite');
132
120
  const tol = options.tolerance ?? 1e-8;
133
121
  const maxIterations = Math.min(options.maxIterations ?? 10000, 1_000_000);
134
- // Residual tolerance scaled to the problem: absolute tol on ||b||_inf ~ 1.
122
+ // Absolute inf-norm acceptance scaled to the problem: tol on ||b||_inf ~ 1.
135
123
  const scale = Math.max(1, ...b.map(Math.abs));
136
124
  const accept = tol * scale * 10;
137
125
  const diagonallyDominant = isDiagonallyDominant(a);
138
126
  let libraryRejected;
139
127
  if (options.engine !== 'builtin') {
140
- try {
141
- const x = await librarySolve(a, b, tol, maxIterations);
142
- if (x && x.length === a.n && x.every(Number.isFinite)) {
143
- const r = residualInf(a, x, b);
144
- if (r <= accept) {
145
- return { solution: x, residual: r, converged: true, iterations: 0, diagonallyDominant, engine: 'sublinear-time-solver' };
128
+ const core = await loadSublinearCore();
129
+ if (core) {
130
+ try {
131
+ const r = coreSolve(core, a, b, tol, maxIterations, options.method ?? 'auto');
132
+ const x = Array.from(r.x);
133
+ const residual = residualInf(a, x, b);
134
+ if (r.converged && x.every(Number.isFinite) && residual <= accept) {
135
+ return { solution: x, residual, converged: true, iterations: r.iterations, diagonallyDominant, engine: 'sublinear-core', method: r.method };
146
136
  }
147
- libraryRejected = `residual ${r.toExponential(2)} above ${accept.toExponential(2)}`;
137
+ libraryRejected = r.converged
138
+ ? `residual ${residual.toExponential(2)} above ${accept.toExponential(2)}`
139
+ : `${r.method} did not converge in ${r.iterations} iterations (relative residual ${Number(r.residual).toExponential(2)})`;
140
+ }
141
+ catch (err) {
142
+ libraryRejected = err?.message ?? String(err);
148
143
  }
149
- }
150
- catch (err) {
151
- libraryRejected = err?.message ?? String(err);
152
144
  }
153
145
  }
154
146
  const { x, iterations } = gaussSeidel(a, b, accept, maxIterations);
@@ -160,50 +152,74 @@ export async function solveLinearSystem(matrix, b, options = {}) {
160
152
  iterations,
161
153
  diagonallyDominant,
162
154
  engine: 'builtin',
155
+ method: 'gauss-seidel',
163
156
  ...(libraryRejected ? { libraryRejected } : {}),
164
157
  };
165
158
  }
166
- /**
167
- * PageRank over a directed graph as a linear system:
168
- * (I - d·Pᵀ) y = 1, then scores = y / Σy. With dangling rows left at zero this
169
- * equals PageRank with uniform teleport from dangling nodes.
170
- */
171
- export async function pageRank(edges, options = {}) {
172
- const d = options.damping ?? 0.85;
173
- if (!(d > 0 && d < 1))
174
- throw new Error('damping must be in (0, 1)');
159
+ function indexGraph(edges, options) {
175
160
  const ids = new Map();
176
161
  const names = [];
177
162
  const add = (s) => {
178
- if (!ids.has(s)) {
179
- ids.set(s, names.length);
163
+ let i = ids.get(s);
164
+ if (i === undefined) {
165
+ i = names.length;
166
+ ids.set(s, i);
180
167
  names.push(s);
181
168
  }
182
- return ids.get(s);
169
+ return i;
183
170
  };
184
171
  for (const n of options.nodes ?? [])
185
172
  add(String(n));
186
- const out = [];
173
+ const indexed = [];
187
174
  for (const e of edges) {
188
175
  const w = e.weight ?? 1;
189
176
  if (!Number.isFinite(w) || w < 0)
190
177
  throw new Error(`invalid edge weight ${w}`);
191
- const a = add(String(e.from));
192
- const b = add(String(e.to));
193
- while (out.length < names.length)
194
- out.push(new Map());
178
+ indexed.push([add(String(e.from)), add(String(e.to)), w]);
179
+ }
180
+ const out = Array.from({ length: names.length }, () => new Map());
181
+ for (const [a, b, w] of indexed)
195
182
  out[a].set(b, (out[a].get(b) ?? 0) + w);
183
+ let teleport = null;
184
+ if (options.seeds !== undefined) {
185
+ const weights = Array.isArray(options.seeds)
186
+ ? options.seeds.map((s) => [String(s), 1])
187
+ : Object.entries(options.seeds);
188
+ if (weights.length === 0)
189
+ throw new Error('seeds must name at least one node');
190
+ teleport = new Array(names.length).fill(0);
191
+ for (const [name, w] of weights) {
192
+ const i = ids.get(name);
193
+ if (i === undefined)
194
+ throw new Error(`unknown seed node ${name}`);
195
+ if (!Number.isFinite(w) || w < 0)
196
+ throw new Error(`invalid seed weight ${w} for ${name}`);
197
+ teleport[i] += w;
198
+ }
199
+ const total = teleport.reduce((s, v) => s + v, 0);
200
+ if (!(total > 0))
201
+ throw new Error('seed weights must not all be zero');
202
+ teleport = teleport.map((v) => v / total);
196
203
  }
197
- while (out.length < names.length)
198
- out.push(new Map());
199
- const n = names.length;
200
- if (n === 0)
201
- return { scores: {}, ranking: [], engine: 'builtin', residual: 0 };
202
- // M = I - d * P^T, P row-normalised out-links.
204
+ return { names, edges: indexed, out, teleport };
205
+ }
206
+ function rank(names, scores, top) {
207
+ const entries = scores instanceof Map ? [...scores] : scores.map((s, i) => [i, s]);
208
+ entries.sort((x, y) => y[1] - x[1] || x[0] - y[0]);
209
+ return (top ? entries.slice(0, top) : entries).map(([i, score]) => ({ node: names[i], score }));
210
+ }
211
+ /**
212
+ * Built-in PageRank as a linear system: (I - d·Pᵀ) y = v, scores = y / Σy,
213
+ * with v uniform or the seed distribution. With dangling rows left at zero
214
+ * this equals PageRank whose dangling mass follows the teleport vector, which
215
+ * is also what the core computes.
216
+ */
217
+ async function builtinPageRank(g, d) {
218
+ const n = g.names.length;
203
219
  const entries = [];
204
220
  for (let i = 0; i < n; i++)
205
221
  entries.push({ row: i, col: i, value: 1 });
206
- out.forEach((links, src) => {
222
+ g.out.forEach((links, src) => {
207
223
  let total = 0;
208
224
  for (const w of links.values())
209
225
  total += w;
@@ -212,16 +228,76 @@ export async function pageRank(edges, options = {}) {
212
228
  for (const [dst, w] of links)
213
229
  entries.push({ row: dst, col: src, value: -d * (w / total) });
214
230
  });
215
- const res = await solveLinearSystem({ size: n, entries }, new Array(n).fill(1), {
216
- tolerance: 1e-10,
217
- engine: options.engine,
218
- });
219
- const sum = res.solution.reduce((s, v) => s + v, 0) || 1;
231
+ const v = g.teleport ?? new Array(n).fill(1);
232
+ const res = await solveLinearSystem({ size: n, entries }, v, { tolerance: 1e-10, engine: 'builtin' });
233
+ const sum = res.solution.reduce((s, x) => s + x, 0) || 1;
234
+ return { scores: res.solution.map((x) => x / sum), residual: res.residual };
235
+ }
236
+ /**
237
+ * PageRank over a directed graph, or personalized PageRank from `seeds`.
238
+ * Scores sum to 1 (approximate runs: to 1 - residualMass).
239
+ */
240
+ export async function pageRank(edges, options = {}) {
241
+ const d = options.damping ?? 0.85;
242
+ if (!(d > 0 && d < 1))
243
+ throw new Error('damping must be in (0, 1)');
244
+ if (options.approximate && options.seeds === undefined) {
245
+ throw new Error('approximate (forward push) needs seeds: it estimates personalized PageRank around them');
246
+ }
247
+ const g = indexGraph(edges, options);
248
+ const n = g.names.length;
249
+ const personalized = g.teleport !== null;
250
+ if (n === 0)
251
+ return { scores: {}, ranking: [], engine: 'builtin', method: 'gauss-seidel', personalized, residual: 0 };
252
+ let libraryRejected;
253
+ const core = options.engine === 'builtin' ? null : await loadSublinearCore();
254
+ if (core) {
255
+ try {
256
+ const graph = core.graphFromEdges(g.edges, { n });
257
+ const seeds = g.teleport ? new Map(g.teleport.flatMap((w, i) => (w > 0 ? [[i, w]] : []))) : null;
258
+ if (options.approximate && seeds) {
259
+ const r = core.forwardPush(graph, seeds, { damping: d, epsilon: options.epsilon ?? 1e-6 });
260
+ let mass = 0;
261
+ for (const s of r.scores.values())
262
+ mass += s;
263
+ // Forward push keeps p + r = 1 exactly; check that the books balance.
264
+ if (r.converged && Math.abs(mass + r.residualMass - 1) <= 1e-6) {
265
+ const ranking = rank(g.names, r.scores, options.top);
266
+ const scores = {};
267
+ for (const { node, score } of ranking)
268
+ scores[node] = score;
269
+ return { scores, ranking, engine: 'sublinear-core', method: 'forward-push', personalized, residual: r.residualMass, residualMass: r.residualMass };
270
+ }
271
+ libraryRejected = r.converged ? `forward push mass ${mass + r.residualMass} != 1` : `forward push stopped after ${r.pushes} pushes`;
272
+ }
273
+ else {
274
+ const opts = { damping: d, tolerance: 1e-12, maxIterations: 10000 };
275
+ const r = seeds ? core.personalizedPageRank(graph, seeds, opts) : core.pageRank(graph, opts);
276
+ const x = Array.from(r.scores);
277
+ const total = x.reduce((s, v) => s + v, 0);
278
+ if (r.converged && x.every((v) => Number.isFinite(v) && v >= 0) && Math.abs(total - 1) <= 1e-8) {
279
+ const scores = {};
280
+ g.names.forEach((name, i) => (scores[name] = x[i]));
281
+ return { scores, ranking: rank(g.names, x, options.top), engine: 'sublinear-core', method: 'power-iteration', personalized, residual: r.delta };
282
+ }
283
+ libraryRejected = r.converged ? `scores sum to ${total}, not 1` : `power iteration did not converge (delta ${r.delta})`;
284
+ }
285
+ }
286
+ catch (err) {
287
+ libraryRejected = err?.message ?? String(err);
288
+ }
289
+ }
290
+ const { scores: x, residual } = await builtinPageRank(g, d);
220
291
  const scores = {};
221
- names.forEach((name, i) => (scores[name] = res.solution[i] / sum));
222
- const ranking = names
223
- .map((node) => ({ node, score: scores[node] }))
224
- .sort((x, y) => y.score - x.score);
225
- return { scores, ranking, engine: res.engine, residual: res.residual };
292
+ g.names.forEach((name, i) => (scores[name] = x[i]));
293
+ return {
294
+ scores,
295
+ ranking: rank(g.names, x, options.top),
296
+ engine: 'builtin',
297
+ method: 'gauss-seidel',
298
+ personalized,
299
+ residual,
300
+ ...(libraryRejected ? { libraryRejected } : {}),
301
+ };
226
302
  }
227
303
  //# sourceMappingURL=sublinear.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sublinear.js","sourceRoot":"","sources":["../../src/integrations/sublinear.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AA4BnE,SAAS,KAAK,CAAC,CAAc;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACnB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,QAAQ,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YACnH,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC7E,IAAI,CAAC,KAAK,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IACjB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACtF,MAAM,GAAG,GAA+B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACnF,KAAK,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACnG,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,GAAG,iBAAiB,CAAC,CAAC;QACrF,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,WAAW,CAAC,CAAM,EAAE,CAAW,EAAE,CAAW;IACnD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAM;IAClC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAC7B,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG;YAAE,IAAI,CAAC,KAAK,CAAC;gBAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,CAAM,EAAE,CAAW,EAAE,GAAW,EAAE,aAAqB;IAC1E,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,OAAO,EAAE,GAAG,aAAa,EAAE,EAAE,EAAE,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,yCAAyC,CAAC,CAAC;YACzG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACb,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC;oBAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG;YAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,EAAe,CAAC;AAE3C,KAAK,UAAU,YAAY,CAAC,CAAM,EAAE,CAAW,EAAE,GAAW,EAAE,aAAqB;IACjF,OAAO,kBAAkB,CAAC,KAAK,IAAI,EAAE;QACnC,MAAM,GAAG,GAAG,MAAM,cAAc,CAAM,4BAA4B,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,GAAG,EAAE,eAAe,CAAC;QACpC,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QAC9C,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;QACtC,IAAI,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;YAC7E,sEAAsE;YACtE,sEAAsE;YACtE,MAAM,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACvD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC;gBAAE,WAAW,CAAC,KAAK,EAAE,CAAC;YAC9C,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACxB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACf,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3G,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAmB,EACnB,CAAW,EACX,UAAuF,EAAE;IAEzF,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,MAAM,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/G,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IACtC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,KAAK,EAAE,SAAS,CAAC,CAAC;IAC1E,2EAA2E;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,EAAE,CAAC;IAChC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAEnD,IAAI,eAAmC,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;oBAChB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,kBAAkB,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;gBAC3H,CAAC;gBACD,eAAe,GAAG,YAAY,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACtF,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,eAAe,GAAG,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,OAAO;QACL,QAAQ,EAAE,CAAC;QACX,QAAQ;QACR,SAAS,EAAE,QAAQ,IAAI,MAAM;QAC7B,UAAU;QACV,kBAAkB;QAClB,MAAM,EAAE,SAAS;QACjB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC;AASD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAA2D,EAC3D,UAA+E,EAAE;IAEjF,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IAClC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACpE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE;QACxB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;IACrB,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE;QAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,GAAG,GAA+B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACtD,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAEhF,+CAA+C;IAC/C,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE;YAAE,KAAK,IAAI,CAAC,CAAC;QAC3C,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QAC9E,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,KAAK;SAClB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;AACzE,CAAC","sourcesContent":["/**\n * Linear solves and PageRank through `sublinear-time-solver`, verified.\n *\n * sublinear-time-solver (optionalDependency, ~120 MB installed with its own\n * deps) solves diagonally dominant systems with push / random-walk methods.\n * Measured against 1.7.2: `forward-push` is accurate, but the default\n * `neumann` method returned a wrong answer with `converged: false` and\n * `random-walk` threw, and the package logs banners with `console.log`. So:\n * - only `forward-push` is used;\n * - every answer is checked against the residual ||Mx - b||_inf here, and a\n * built-in Gauss-Seidel solve replaces it when the check fails;\n * - the import, construction and solve run with console output sent to stderr\n * (the MCP stdio server owns stdout).\n *\n * The 5 bundled `sublinear/*` agents name sublinear-time-solver tools; the\n * `sublinear_solve` / `sublinear_pagerank` MCP tools in this package give them\n * a working in-process path without a separate MCP server.\n */\n\nimport { importOptional, withStdoutToStderr } from './optional.js';\n\nexport interface SparseEntry {\n row: number;\n col: number;\n value: number;\n}\n\nexport type MatrixInput = number[][] | { size: number; entries: SparseEntry[] };\n\nexport interface LinearSolveResult {\n solution: number[];\n /** max_i |(Mx - b)_i| */\n residual: number;\n converged: boolean;\n iterations: number;\n diagonallyDominant: boolean;\n engine: 'sublinear-time-solver' | 'builtin';\n /** Set when the library answered but failed verification. */\n libraryRejected?: string;\n}\n\ninterface Csr {\n n: number;\n rows: Array<Array<[number, number]>>; // per row: [col, value]\n diag: number[];\n}\n\nfunction toCsr(m: MatrixInput): Csr {\n if (Array.isArray(m)) {\n const n = m.length;\n const rows = m.map((row, i) => {\n if (!Array.isArray(row) || row.length !== n) throw new Error(`matrix must be square; row ${i} has ${row?.length}`);\n const out: Array<[number, number]> = [];\n row.forEach((v, j) => {\n if (!Number.isFinite(v)) throw new Error(`matrix[${i}][${j}] is not finite`);\n if (v !== 0) out.push([j, v]);\n });\n return out;\n });\n return { n, rows, diag: m.map((row, i) => row[i]) };\n }\n const n = m.size;\n if (!Number.isInteger(n) || n < 1) throw new Error('size must be a positive integer');\n const acc: Array<Map<number, number>> = Array.from({ length: n }, () => new Map());\n for (const { row, col, value } of m.entries) {\n if (!Number.isInteger(row) || !Number.isInteger(col) || row < 0 || col < 0 || row >= n || col >= n) {\n throw new Error(`entry (${row}, ${col}) is outside a ${n}x${n} matrix`);\n }\n if (!Number.isFinite(value)) throw new Error(`entry (${row}, ${col}) is not finite`);\n acc[row].set(col, (acc[row].get(col) ?? 0) + value);\n }\n const rows = acc.map((r) => [...r.entries()].filter(([, v]) => v !== 0));\n return { n, rows, diag: acc.map((r, i) => r.get(i) ?? 0) };\n}\n\nfunction residualInf(a: Csr, x: number[], b: number[]): number {\n let worst = 0;\n for (let i = 0; i < a.n; i++) {\n let s = 0;\n for (const [j, v] of a.rows[i]) s += v * x[j];\n worst = Math.max(worst, Math.abs(s - b[i]));\n }\n return worst;\n}\n\nfunction isDiagonallyDominant(a: Csr): boolean {\n return a.rows.every((row, i) => {\n let off = 0;\n for (const [j, v] of row) if (j !== i) off += Math.abs(v);\n return Math.abs(a.diag[i]) >= off && a.diag[i] !== 0;\n });\n}\n\nfunction gaussSeidel(a: Csr, b: number[], tol: number, maxIterations: number) {\n const x = new Array(a.n).fill(0);\n let it = 0;\n for (; it < maxIterations; it++) {\n for (let i = 0; i < a.n; i++) {\n if (a.diag[i] === 0) throw new Error(`zero diagonal at row ${i}: Gauss-Seidel needs a nonzero diagonal`);\n let s = b[i];\n for (const [j, v] of a.rows[i]) if (j !== i) s -= v * x[j];\n x[i] = s / a.diag[i];\n }\n if (residualInf(a, x, b) <= tol) return { x, iterations: it + 1 };\n }\n return { x, iterations: it };\n}\n\nconst solverCache = new Map<string, any>();\n\nasync function librarySolve(a: Csr, b: number[], tol: number, maxIterations: number): Promise<number[] | null> {\n return withStdoutToStderr(async () => {\n const mod = await importOptional<any>('sublinear-time-solver/core', { quietStdout: true });\n const Solver = mod?.SublinearSolver;\n if (typeof Solver !== 'function') return null;\n const key = `${tol}|${maxIterations}`;\n let solver = solverCache.get(key);\n if (!solver) {\n solver = new Solver({ method: 'forward-push', epsilon: tol, maxIterations });\n // The constructor starts WASM probing asynchronously and logs when it\n // finishes; let that settle while console output is still redirected.\n await solver.initializeWasm?.().catch(() => undefined);\n await new Promise((r) => setTimeout(r, 0));\n if (solverCache.size > 8) solverCache.clear();\n solverCache.set(key, solver);\n }\n const values: number[] = [];\n const rowIndices: number[] = [];\n const colIndices: number[] = [];\n a.rows.forEach((row, i) => {\n for (const [j, v] of row) {\n values.push(v);\n rowIndices.push(i);\n colIndices.push(j);\n }\n });\n const res = await solver.solve({ rows: a.n, cols: a.n, values, rowIndices, colIndices, format: 'coo' }, b);\n return Array.isArray(res?.solution) ? res.solution.map(Number) : null;\n });\n}\n\n/**\n * Solve Mx = b. Intended for (row) diagonally dominant M; other matrices are\n * attempted with Gauss-Seidel and reported with `converged: false` if it fails.\n */\nexport async function solveLinearSystem(\n matrix: MatrixInput,\n b: number[],\n options: { tolerance?: number; maxIterations?: number; engine?: 'auto' | 'builtin' } = {},\n): Promise<LinearSolveResult> {\n const a = toCsr(matrix);\n if (!Array.isArray(b) || b.length !== a.n) throw new Error(`vector length ${b?.length} != matrix size ${a.n}`);\n if (!b.every(Number.isFinite)) throw new Error('vector entries must be finite');\n const tol = options.tolerance ?? 1e-8;\n const maxIterations = Math.min(options.maxIterations ?? 10000, 1_000_000);\n // Residual tolerance scaled to the problem: absolute tol on ||b||_inf ~ 1.\n const scale = Math.max(1, ...b.map(Math.abs));\n const accept = tol * scale * 10;\n const diagonallyDominant = isDiagonallyDominant(a);\n\n let libraryRejected: string | undefined;\n if (options.engine !== 'builtin') {\n try {\n const x = await librarySolve(a, b, tol, maxIterations);\n if (x && x.length === a.n && x.every(Number.isFinite)) {\n const r = residualInf(a, x, b);\n if (r <= accept) {\n return { solution: x, residual: r, converged: true, iterations: 0, diagonallyDominant, engine: 'sublinear-time-solver' };\n }\n libraryRejected = `residual ${r.toExponential(2)} above ${accept.toExponential(2)}`;\n }\n } catch (err: any) {\n libraryRejected = err?.message ?? String(err);\n }\n }\n\n const { x, iterations } = gaussSeidel(a, b, accept, maxIterations);\n const residual = residualInf(a, x, b);\n return {\n solution: x,\n residual,\n converged: residual <= accept,\n iterations,\n diagonallyDominant,\n engine: 'builtin',\n ...(libraryRejected ? { libraryRejected } : {}),\n };\n}\n\nexport interface PageRankResult {\n scores: Record<string, number>;\n ranking: Array<{ node: string; score: number }>;\n engine: LinearSolveResult['engine'];\n residual: number;\n}\n\n/**\n * PageRank over a directed graph as a linear system:\n * (I - d·Pᵀ) y = 1, then scores = y / Σy. With dangling rows left at zero this\n * equals PageRank with uniform teleport from dangling nodes.\n */\nexport async function pageRank(\n edges: Array<{ from: string; to: string; weight?: number }>,\n options: { damping?: number; nodes?: string[]; engine?: 'auto' | 'builtin' } = {},\n): Promise<PageRankResult> {\n const d = options.damping ?? 0.85;\n if (!(d > 0 && d < 1)) throw new Error('damping must be in (0, 1)');\n const ids = new Map<string, number>();\n const names: string[] = [];\n const add = (s: string) => {\n if (!ids.has(s)) {\n ids.set(s, names.length);\n names.push(s);\n }\n return ids.get(s)!;\n };\n for (const n of options.nodes ?? []) add(String(n));\n const out: Array<Map<number, number>> = [];\n for (const e of edges) {\n const w = e.weight ?? 1;\n if (!Number.isFinite(w) || w < 0) throw new Error(`invalid edge weight ${w}`);\n const a = add(String(e.from));\n const b = add(String(e.to));\n while (out.length < names.length) out.push(new Map());\n out[a].set(b, (out[a].get(b) ?? 0) + w);\n }\n while (out.length < names.length) out.push(new Map());\n const n = names.length;\n if (n === 0) return { scores: {}, ranking: [], engine: 'builtin', residual: 0 };\n\n // M = I - d * P^T, P row-normalised out-links.\n const entries: SparseEntry[] = [];\n for (let i = 0; i < n; i++) entries.push({ row: i, col: i, value: 1 });\n out.forEach((links, src) => {\n let total = 0;\n for (const w of links.values()) total += w;\n if (total === 0) return;\n for (const [dst, w] of links) entries.push({ row: dst, col: src, value: -d * (w / total) });\n });\n const res = await solveLinearSystem({ size: n, entries }, new Array(n).fill(1), {\n tolerance: 1e-10,\n engine: options.engine,\n });\n const sum = res.solution.reduce((s, v) => s + v, 0) || 1;\n const scores: Record<string, number> = {};\n names.forEach((name, i) => (scores[name] = res.solution[i] / sum));\n const ranking = names\n .map((node) => ({ node, score: scores[node] }))\n .sort((x, y) => y.score - x.score);\n return { scores, ranking, engine: res.engine, residual: res.residual };\n}\n"]}
1
+ {"version":3,"file":"sublinear.js","sourceRoot":"","sources":["../../src/integrations/sublinear.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Linear solves and PageRank through `@ruvnet/sublinear-core`, verified.\n *\n * @ruvnet/sublinear-core (optionalDependency, zero dependencies, ~220 kB) is\n * the embeddable core of sublinear-time-solver: sparse iterative solvers\n * (Gauss-Seidel, conjugate gradient, Jacobi, Neumann), PageRank, personalized\n * PageRank and local forward push. It reports the residual of the x it\n * returns, but every answer is still checked here against ||Mx - b||_inf, and\n * a built-in Gauss-Seidel solve replaces it when the check fails or the\n * package is not installed.\n *\n * The 5 bundled `sublinear/*` agents name sublinear-time-solver tools; the\n * `sublinear_solve` / `sublinear_pagerank` MCP tools in this package give them\n * a working in-process path without a separate MCP server.\n */\n\nimport { importOptional } from './optional.js';\n\nexport const SUBLINEAR_CORE = '@ruvnet/sublinear-core';\n\nexport interface SparseEntry {\n row: number;\n col: number;\n value: number;\n}\n\nexport type MatrixInput = number[][] | { size: number; entries: SparseEntry[] };\n\nexport type SolveMethod = 'auto' | 'gauss-seidel' | 'conjugate-gradient' | 'jacobi' | 'neumann';\n\nexport type SublinearEngine = 'sublinear-core' | 'builtin';\n\nexport interface LinearSolveResult {\n solution: number[];\n /** max_i |(Mx - b)_i|, recomputed here from the returned solution. */\n residual: number;\n converged: boolean;\n iterations: number;\n diagonallyDominant: boolean;\n engine: SublinearEngine;\n /** Method that produced the solution. */\n method: Exclude<SolveMethod, 'auto'>;\n /** Set when the library answered but failed verification. */\n libraryRejected?: string;\n}\n\ninterface Csr {\n n: number;\n rows: Array<Array<[number, number]>>; // per row: [col, value]\n diag: number[];\n}\n\nfunction toCsr(m: MatrixInput): Csr {\n if (Array.isArray(m)) {\n const n = m.length;\n const rows = m.map((row, i) => {\n if (!Array.isArray(row) || row.length !== n) throw new Error(`matrix must be square; row ${i} has ${row?.length}`);\n const out: Array<[number, number]> = [];\n row.forEach((v, j) => {\n if (!Number.isFinite(v)) throw new Error(`matrix[${i}][${j}] is not finite`);\n if (v !== 0) out.push([j, v]);\n });\n return out;\n });\n return { n, rows, diag: m.map((row, i) => row[i]) };\n }\n const n = m.size;\n if (!Number.isInteger(n) || n < 1) throw new Error('size must be a positive integer');\n const acc: Array<Map<number, number>> = Array.from({ length: n }, () => new Map());\n for (const { row, col, value } of m.entries) {\n if (!Number.isInteger(row) || !Number.isInteger(col) || row < 0 || col < 0 || row >= n || col >= n) {\n throw new Error(`entry (${row}, ${col}) is outside a ${n}x${n} matrix`);\n }\n if (!Number.isFinite(value)) throw new Error(`entry (${row}, ${col}) is not finite`);\n acc[row].set(col, (acc[row].get(col) ?? 0) + value);\n }\n const rows = acc.map((r) => [...r.entries()].filter(([, v]) => v !== 0));\n return { n, rows, diag: acc.map((r, i) => r.get(i) ?? 0) };\n}\n\nfunction residualInf(a: Csr, x: ArrayLike<number>, b: number[]): number {\n let worst = 0;\n for (let i = 0; i < a.n; i++) {\n let s = 0;\n for (const [j, v] of a.rows[i]) s += v * x[j];\n worst = Math.max(worst, Math.abs(s - b[i]));\n }\n return worst;\n}\n\nfunction isDiagonallyDominant(a: Csr): boolean {\n return a.rows.every((row, i) => {\n let off = 0;\n for (const [j, v] of row) if (j !== i) off += Math.abs(v);\n return Math.abs(a.diag[i]) >= off && a.diag[i] !== 0;\n });\n}\n\nfunction gaussSeidel(a: Csr, b: number[], tol: number, maxIterations: number) {\n const x = new Array(a.n).fill(0);\n let it = 0;\n for (; it < maxIterations; it++) {\n for (let i = 0; i < a.n; i++) {\n if (a.diag[i] === 0) throw new Error(`zero diagonal at row ${i}: Gauss-Seidel needs a nonzero diagonal`);\n let s = b[i];\n for (const [j, v] of a.rows[i]) if (j !== i) s -= v * x[j];\n x[i] = s / a.diag[i];\n }\n if (residualInf(a, x, b) <= tol) return { x, iterations: it + 1 };\n }\n return { x, iterations: it };\n}\n\n/** The core module, or null when it is not installed. */\nexport async function loadSublinearCore(): Promise<any | null> {\n const mod = await importOptional<any>(SUBLINEAR_CORE);\n return typeof mod?.solve === 'function' && typeof mod?.pageRank === 'function' ? mod : null;\n}\n\nfunction coreSolve(core: any, a: Csr, b: number[], tol: number, maxIterations: number, method: SolveMethod) {\n const rowIndices: number[] = [];\n const colIndices: number[] = [];\n const values: number[] = [];\n a.rows.forEach((row, i) => {\n for (const [j, v] of row) {\n rowIndices.push(i);\n colIndices.push(j);\n values.push(v);\n }\n });\n const A = core.csrFromCoo({ rows: a.n, cols: a.n, rowIndices, colIndices, values });\n // Core stops on the relative L2 residual ||b - Ax||_2 / ||b||_2. The local\n // gate is an absolute inf-norm bound, and ||r||_inf <= ||r||_2, so asking\n // core for tol / sqrt(n) keeps every converged core answer inside it.\n return core.solve(A, b, { method, tolerance: tol / Math.sqrt(a.n), maxIterations });\n}\n\n/**\n * Solve Mx = b. Intended for (row) diagonally dominant or symmetric positive\n * definite M; other matrices are attempted with Gauss-Seidel and reported with\n * `converged: false` if it fails.\n */\nexport async function solveLinearSystem(\n matrix: MatrixInput,\n b: number[],\n options: { tolerance?: number; maxIterations?: number; method?: SolveMethod; engine?: 'auto' | 'builtin' } = {},\n): Promise<LinearSolveResult> {\n const a = toCsr(matrix);\n if (!Array.isArray(b) || b.length !== a.n) throw new Error(`vector length ${b?.length} != matrix size ${a.n}`);\n if (!b.every(Number.isFinite)) throw new Error('vector entries must be finite');\n const tol = options.tolerance ?? 1e-8;\n const maxIterations = Math.min(options.maxIterations ?? 10000, 1_000_000);\n // Absolute inf-norm acceptance scaled to the problem: tol on ||b||_inf ~ 1.\n const scale = Math.max(1, ...b.map(Math.abs));\n const accept = tol * scale * 10;\n const diagonallyDominant = isDiagonallyDominant(a);\n\n let libraryRejected: string | undefined;\n if (options.engine !== 'builtin') {\n const core = await loadSublinearCore();\n if (core) {\n try {\n const r = coreSolve(core, a, b, tol, maxIterations, options.method ?? 'auto');\n const x: number[] = Array.from(r.x as Float64Array);\n const residual = residualInf(a, x, b);\n if (r.converged && x.every(Number.isFinite) && residual <= accept) {\n return { solution: x, residual, converged: true, iterations: r.iterations, diagonallyDominant, engine: 'sublinear-core', method: r.method };\n }\n libraryRejected = r.converged\n ? `residual ${residual.toExponential(2)} above ${accept.toExponential(2)}`\n : `${r.method} did not converge in ${r.iterations} iterations (relative residual ${Number(r.residual).toExponential(2)})`;\n } catch (err: any) {\n libraryRejected = err?.message ?? String(err);\n }\n }\n }\n\n const { x, iterations } = gaussSeidel(a, b, accept, maxIterations);\n const residual = residualInf(a, x, b);\n return {\n solution: x,\n residual,\n converged: residual <= accept,\n iterations,\n diagonallyDominant,\n engine: 'builtin',\n method: 'gauss-seidel',\n ...(libraryRejected ? { libraryRejected } : {}),\n };\n}\n\nexport interface PageRankEdge {\n from: string;\n to: string;\n weight?: number;\n}\n\nexport interface PageRankOptions {\n /** Probability of following an out-edge (1 - restart probability). Default 0.85. */\n damping?: number;\n /** Extra nodes with no edges. */\n nodes?: string[];\n /** Personalized PageRank: restart at these nodes (equal weight) or by weight. */\n seeds?: string[] | Record<string, number>;\n /**\n * With `seeds`: estimate by local forward push instead of power iteration.\n * Work depends on `epsilon`, not on the graph size; scores of nodes far from\n * the seeds are left at 0 and `residualMass` bounds the total L1 error.\n */\n approximate?: boolean;\n /** Forward-push residual threshold. Default 1e-6. */\n epsilon?: number;\n /** Return only the top N in `ranking` (and `scores`, for approximate runs). */\n top?: number;\n engine?: 'auto' | 'builtin';\n}\n\nexport interface PageRankResult {\n scores: Record<string, number>;\n ranking: Array<{ node: string; score: number }>;\n engine: SublinearEngine;\n method: 'power-iteration' | 'forward-push' | 'gauss-seidel';\n personalized: boolean;\n /** Linear-system residual (gauss-seidel) or last L1 change (power iteration). */\n residual: number;\n /** forward-push only: unpushed mass, an upper bound on the total L1 error. */\n residualMass?: number;\n /** Set when the library answered but failed verification. */\n libraryRejected?: string;\n}\n\ninterface IndexedGraph {\n names: string[];\n edges: Array<[number, number, number]>;\n out: Array<Map<number, number>>;\n teleport: number[] | null; // normalized seed distribution, null = uniform\n}\n\nfunction indexGraph(edges: PageRankEdge[], options: PageRankOptions): IndexedGraph {\n const ids = new Map<string, number>();\n const names: string[] = [];\n const add = (s: string) => {\n let i = ids.get(s);\n if (i === undefined) {\n i = names.length;\n ids.set(s, i);\n names.push(s);\n }\n return i;\n };\n for (const n of options.nodes ?? []) add(String(n));\n const indexed: Array<[number, number, number]> = [];\n for (const e of edges) {\n const w = e.weight ?? 1;\n if (!Number.isFinite(w) || w < 0) throw new Error(`invalid edge weight ${w}`);\n indexed.push([add(String(e.from)), add(String(e.to)), w]);\n }\n const out: Array<Map<number, number>> = Array.from({ length: names.length }, () => new Map());\n for (const [a, b, w] of indexed) out[a].set(b, (out[a].get(b) ?? 0) + w);\n\n let teleport: number[] | null = null;\n if (options.seeds !== undefined) {\n const weights: Array<[string, number]> = Array.isArray(options.seeds)\n ? options.seeds.map((s) => [String(s), 1])\n : Object.entries(options.seeds);\n if (weights.length === 0) throw new Error('seeds must name at least one node');\n teleport = new Array(names.length).fill(0);\n for (const [name, w] of weights) {\n const i = ids.get(name);\n if (i === undefined) throw new Error(`unknown seed node ${name}`);\n if (!Number.isFinite(w) || w < 0) throw new Error(`invalid seed weight ${w} for ${name}`);\n teleport[i] += w;\n }\n const total = teleport.reduce((s, v) => s + v, 0);\n if (!(total > 0)) throw new Error('seed weights must not all be zero');\n teleport = teleport.map((v) => v / total);\n }\n return { names, edges: indexed, out, teleport };\n}\n\nfunction rank(names: string[], scores: Map<number, number> | number[], top?: number) {\n const entries: Array<[number, number]> = scores instanceof Map ? [...scores] : scores.map((s, i) => [i, s]);\n entries.sort((x, y) => y[1] - x[1] || x[0] - y[0]);\n return (top ? entries.slice(0, top) : entries).map(([i, score]) => ({ node: names[i], score }));\n}\n\n/**\n * Built-in PageRank as a linear system: (I - d·Pᵀ) y = v, scores = y / Σy,\n * with v uniform or the seed distribution. With dangling rows left at zero\n * this equals PageRank whose dangling mass follows the teleport vector, which\n * is also what the core computes.\n */\nasync function builtinPageRank(g: IndexedGraph, d: number) {\n const n = g.names.length;\n const entries: SparseEntry[] = [];\n for (let i = 0; i < n; i++) entries.push({ row: i, col: i, value: 1 });\n g.out.forEach((links, src) => {\n let total = 0;\n for (const w of links.values()) total += w;\n if (total === 0) return;\n for (const [dst, w] of links) entries.push({ row: dst, col: src, value: -d * (w / total) });\n });\n const v = g.teleport ?? new Array(n).fill(1);\n const res = await solveLinearSystem({ size: n, entries }, v, { tolerance: 1e-10, engine: 'builtin' });\n const sum = res.solution.reduce((s, x) => s + x, 0) || 1;\n return { scores: res.solution.map((x) => x / sum), residual: res.residual };\n}\n\n/**\n * PageRank over a directed graph, or personalized PageRank from `seeds`.\n * Scores sum to 1 (approximate runs: to 1 - residualMass).\n */\nexport async function pageRank(edges: PageRankEdge[], options: PageRankOptions = {}): Promise<PageRankResult> {\n const d = options.damping ?? 0.85;\n if (!(d > 0 && d < 1)) throw new Error('damping must be in (0, 1)');\n if (options.approximate && options.seeds === undefined) {\n throw new Error('approximate (forward push) needs seeds: it estimates personalized PageRank around them');\n }\n const g = indexGraph(edges, options);\n const n = g.names.length;\n const personalized = g.teleport !== null;\n if (n === 0) return { scores: {}, ranking: [], engine: 'builtin', method: 'gauss-seidel', personalized, residual: 0 };\n\n let libraryRejected: string | undefined;\n const core = options.engine === 'builtin' ? null : await loadSublinearCore();\n if (core) {\n try {\n const graph = core.graphFromEdges(g.edges, { n });\n const seeds = g.teleport ? new Map(g.teleport.flatMap((w, i) => (w > 0 ? [[i, w] as [number, number]] : []))) : null;\n\n if (options.approximate && seeds) {\n const r = core.forwardPush(graph, seeds, { damping: d, epsilon: options.epsilon ?? 1e-6 });\n let mass = 0;\n for (const s of r.scores.values()) mass += s;\n // Forward push keeps p + r = 1 exactly; check that the books balance.\n if (r.converged && Math.abs(mass + r.residualMass - 1) <= 1e-6) {\n const ranking = rank(g.names, r.scores, options.top);\n const scores: Record<string, number> = {};\n for (const { node, score } of ranking) scores[node] = score;\n return { scores, ranking, engine: 'sublinear-core', method: 'forward-push', personalized, residual: r.residualMass, residualMass: r.residualMass };\n }\n libraryRejected = r.converged ? `forward push mass ${mass + r.residualMass} != 1` : `forward push stopped after ${r.pushes} pushes`;\n } else {\n const opts = { damping: d, tolerance: 1e-12, maxIterations: 10000 };\n const r = seeds ? core.personalizedPageRank(graph, seeds, opts) : core.pageRank(graph, opts);\n const x: number[] = Array.from(r.scores as Float64Array);\n const total = x.reduce((s, v) => s + v, 0);\n if (r.converged && x.every((v) => Number.isFinite(v) && v >= 0) && Math.abs(total - 1) <= 1e-8) {\n const scores: Record<string, number> = {};\n g.names.forEach((name, i) => (scores[name] = x[i]));\n return { scores, ranking: rank(g.names, x, options.top), engine: 'sublinear-core', method: 'power-iteration', personalized, residual: r.delta };\n }\n libraryRejected = r.converged ? `scores sum to ${total}, not 1` : `power iteration did not converge (delta ${r.delta})`;\n }\n } catch (err: any) {\n libraryRejected = err?.message ?? String(err);\n }\n }\n\n const { scores: x, residual } = await builtinPageRank(g, d);\n const scores: Record<string, number> = {};\n g.names.forEach((name, i) => (scores[name] = x[i]));\n return {\n scores,\n ranking: rank(g.names, x, options.top),\n engine: 'builtin',\n method: 'gauss-seidel',\n personalized,\n residual,\n ...(libraryRejected ? { libraryRejected } : {}),\n };\n}\n"]}
@@ -301,9 +301,11 @@ export declare class RuVectorIntelligence {
301
301
  */
302
302
  private getPatternsCount;
303
303
  /**
304
- * Compute attention asynchronously
304
+ * Compute attention asynchronously on a native worker thread
305
305
  *
306
- * Useful for large batches or when non-blocking is required
306
+ * Useful for large batches or when non-blocking is required. 'standard' (the
307
+ * default) is native scaled dot-product attention. The native functions take
308
+ * the embedding dimension (and flash block size) explicitly.
307
309
  */
308
310
  computeAttentionAsync(query: Float32Array, keys: Float32Array[], values: Float32Array[], type?: 'flash' | 'hyperbolic' | 'standard'): Promise<Float32Array>;
309
311
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"RuVectorIntelligence.d.ts","sourceRoot":"","sources":["../../src/intelligence/RuVectorIntelligence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RuVectorIntelligence.d.ts","sourceRoot":"","sources":["../../src/intelligence/RuVectorIntelligence.ts"],"names":[],"mappings":"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"}
@@ -47,10 +47,19 @@ let poincareDistance = null;
47
47
  let projectToPoincareBall = null;
48
48
  let AttentionType = null;
49
49
  let attentionAvailable = false;
50
- // Try to load @ruvector/sona
50
+ /**
51
+ * Tile size for native flash attention. @ruvector/attention 2.x requires it
52
+ * explicitly in both the FlashAttention constructor and
53
+ * computeFlashAttentionAsync (omitting it throws, which used to push every
54
+ * 'flash' route onto the JS fallback).
55
+ */
56
+ const FLASH_ATTENTION_BLOCK_SIZE = 64;
57
+ /** Max graph position for GraphRoPeAttention's rotary table. */
58
+ const GRAPH_ROPE_MAX_POSITION = 10000;
59
+ // Try to load @ruvector/sona (through the loader, whose engines validate
60
+ // LoRA input lengths instead of letting a native panic abort the process)
51
61
  try {
52
- const sonaModule = await import('@ruvector/sona');
53
- SonaEngine = sonaModule.SonaEngine;
62
+ SonaEngine = requireSonaEngine();
54
63
  sonaAvailable = true;
55
64
  }
56
65
  catch {
@@ -81,6 +90,7 @@ catch {
81
90
  console.warn('[RuVectorIntelligence] @ruvector/attention not available - attention features disabled');
82
91
  }
83
92
  // Import from ruvector core (for HNSW)
93
+ import { requireSonaEngine } from '../services/sona-loader.js';
84
94
  import ruvector from 'ruvector';
85
95
  // Export availability flags
86
96
  export { sonaAvailable, attentionAvailable };
@@ -197,7 +207,7 @@ export class RuVectorIntelligence {
197
207
  this.multiHeadAttention = new MultiHeadAttention(dim, this.config.numHeads ?? 8);
198
208
  break;
199
209
  case 'flash':
200
- this.flashAttention = new FlashAttention(dim);
210
+ this.flashAttention = new FlashAttention(dim, FLASH_ATTENTION_BLOCK_SIZE);
201
211
  break;
202
212
  case 'hyperbolic':
203
213
  this.hyperbolicAttention = new HyperbolicAttention(dim, this.config.curvature ?? 1.0);
@@ -211,12 +221,17 @@ export class RuVectorIntelligence {
211
221
  this.moeAttention = new MoEAttention(moeConfig);
212
222
  break;
213
223
  case 'graph':
214
- this.graphAttention = new GraphRoPeAttention(dim, 10000);
224
+ // 2.x takes a RoPEConfig object; positional args throw "Missing field `dim`"
225
+ this.graphAttention = new GraphRoPeAttention({ dim, maxPosition: GRAPH_ROPE_MAX_POSITION });
215
226
  break;
216
227
  case 'dual':
217
- this.dualSpaceAttention = new DualSpaceAttention(dim, this.config.curvature ?? 1.0, 0.5, // Euclidean weight
218
- 0.5 // Hyperbolic weight
219
- );
228
+ // 2.x takes a DualSpaceConfig object; positional args throw "Missing field `dim`"
229
+ this.dualSpaceAttention = new DualSpaceAttention({
230
+ dim,
231
+ curvature: this.config.curvature ?? 1.0,
232
+ euclideanWeight: 0.5,
233
+ hyperbolicWeight: 0.5,
234
+ });
220
235
  break;
221
236
  }
222
237
  }
@@ -467,6 +482,14 @@ export class RuVectorIntelligence {
467
482
  attentionOutput = this.computeFallbackAttention(transformedQuery, keys, values);
468
483
  }
469
484
  break;
485
+ case 'graph':
486
+ if (this.graphAttention) {
487
+ attentionOutput = this.graphAttention.compute(transformedQuery, keys, values);
488
+ }
489
+ else {
490
+ attentionOutput = this.computeFallbackAttention(transformedQuery, keys, values);
491
+ }
492
+ break;
470
493
  case 'dual':
471
494
  if (this.dualSpaceAttention) {
472
495
  attentionOutput = this.dualSpaceAttention.compute(transformedQuery, keys, values);
@@ -754,18 +777,21 @@ export class RuVectorIntelligence {
754
777
  // Async Attention (for large batches)
755
778
  // ==========================================================================
756
779
  /**
757
- * Compute attention asynchronously
780
+ * Compute attention asynchronously on a native worker thread
758
781
  *
759
- * Useful for large batches or when non-blocking is required
782
+ * Useful for large batches or when non-blocking is required. 'standard' (the
783
+ * default) is native scaled dot-product attention. The native functions take
784
+ * the embedding dimension (and flash block size) explicitly.
760
785
  */
761
786
  async computeAttentionAsync(query, keys, values, type) {
787
+ const dim = query.length;
762
788
  switch (type) {
763
789
  case 'flash':
764
- return computeFlashAttentionAsync(query, keys, values);
790
+ return computeFlashAttentionAsync(query, keys, values, dim, FLASH_ATTENTION_BLOCK_SIZE);
765
791
  case 'hyperbolic':
766
- return computeHyperbolicAttentionAsync(query, keys, values, this.config.curvature);
792
+ return computeHyperbolicAttentionAsync(query, keys, values, dim, this.config.curvature ?? 1.0);
767
793
  default:
768
- return computeAttentionAsync(query, keys, values, AttentionType.MultiHead);
794
+ return computeAttentionAsync(query, keys, values, dim);
769
795
  }
770
796
  }
771
797
  // ==========================================================================