ruflo-graph-intelligence 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/.claude-flow/data/pending-insights.jsonl +30 -0
  2. package/dist/adapters/aidefence-suspicion-adapter.d.ts +40 -0
  3. package/dist/adapters/aidefence-suspicion-adapter.d.ts.map +1 -0
  4. package/dist/adapters/aidefence-suspicion-adapter.js +77 -0
  5. package/dist/adapters/aidefence-suspicion-adapter.js.map +1 -0
  6. package/dist/adapters/browser-causal-adapter.d.ts +83 -0
  7. package/dist/adapters/browser-causal-adapter.d.ts.map +1 -0
  8. package/dist/adapters/browser-causal-adapter.js +146 -0
  9. package/dist/adapters/browser-causal-adapter.js.map +1 -0
  10. package/dist/adapters/cost-attribution-adapter.d.ts +48 -0
  11. package/dist/adapters/cost-attribution-adapter.d.ts.map +1 -0
  12. package/dist/adapters/cost-attribution-adapter.js +95 -0
  13. package/dist/adapters/cost-attribution-adapter.js.map +1 -0
  14. package/dist/adapters/federation-trust-adapter.d.ts +49 -0
  15. package/dist/adapters/federation-trust-adapter.d.ts.map +1 -0
  16. package/dist/adapters/federation-trust-adapter.js +82 -0
  17. package/dist/adapters/federation-trust-adapter.js.map +1 -0
  18. package/dist/adapters/index.d.ts +16 -0
  19. package/dist/adapters/index.d.ts.map +1 -0
  20. package/dist/adapters/index.js +16 -0
  21. package/dist/adapters/index.js.map +1 -0
  22. package/dist/adapters/jujutsu-blast-radius-adapter.d.ts +46 -0
  23. package/dist/adapters/jujutsu-blast-radius-adapter.d.ts.map +1 -0
  24. package/dist/adapters/jujutsu-blast-radius-adapter.js +80 -0
  25. package/dist/adapters/jujutsu-blast-radius-adapter.js.map +1 -0
  26. package/dist/adapters/knowledge-graph-adapter.d.ts +41 -0
  27. package/dist/adapters/knowledge-graph-adapter.d.ts.map +1 -0
  28. package/dist/adapters/knowledge-graph-adapter.js +83 -0
  29. package/dist/adapters/knowledge-graph-adapter.js.map +1 -0
  30. package/dist/adapters/observability-span-adapter.d.ts +45 -0
  31. package/dist/adapters/observability-span-adapter.d.ts.map +1 -0
  32. package/dist/adapters/observability-span-adapter.js +97 -0
  33. package/dist/adapters/observability-span-adapter.js.map +1 -0
  34. package/dist/adapters/portfolio-cg-adapter.d.ts +60 -0
  35. package/dist/adapters/portfolio-cg-adapter.d.ts.map +1 -0
  36. package/dist/adapters/portfolio-cg-adapter.js +102 -0
  37. package/dist/adapters/portfolio-cg-adapter.js.map +1 -0
  38. package/dist/adapters/rag-memory-adapter.d.ts +49 -0
  39. package/dist/adapters/rag-memory-adapter.d.ts.map +1 -0
  40. package/dist/adapters/rag-memory-adapter.js +86 -0
  41. package/dist/adapters/rag-memory-adapter.js.map +1 -0
  42. package/dist/application/federation-client.d.ts +54 -0
  43. package/dist/application/federation-client.d.ts.map +1 -0
  44. package/dist/application/federation-client.js +101 -0
  45. package/dist/application/federation-client.js.map +1 -0
  46. package/dist/application/federation-server.d.ts +38 -0
  47. package/dist/application/federation-server.d.ts.map +1 -0
  48. package/dist/application/federation-server.js +127 -0
  49. package/dist/application/federation-server.js.map +1 -0
  50. package/dist/application/streaming-bridge.d.ts +62 -0
  51. package/dist/application/streaming-bridge.d.ts.map +1 -0
  52. package/dist/application/streaming-bridge.js +101 -0
  53. package/dist/application/streaming-bridge.js.map +1 -0
  54. package/dist/domain/adapter.d.ts +58 -0
  55. package/dist/domain/adapter.d.ts.map +1 -0
  56. package/dist/domain/adapter.js +43 -0
  57. package/dist/domain/adapter.js.map +1 -0
  58. package/dist/domain/federation-protocol.d.ts +857 -0
  59. package/dist/domain/federation-protocol.d.ts.map +1 -0
  60. package/dist/domain/federation-protocol.js +72 -0
  61. package/dist/domain/federation-protocol.js.map +1 -0
  62. package/dist/domain/signed-artifact.d.ts +429 -0
  63. package/dist/domain/signed-artifact.d.ts.map +1 -0
  64. package/dist/domain/signed-artifact.js +57 -0
  65. package/dist/domain/signed-artifact.js.map +1 -0
  66. package/dist/domain/types.d.ts +329 -0
  67. package/dist/domain/types.d.ts.map +1 -0
  68. package/dist/domain/types.js +165 -0
  69. package/dist/domain/types.js.map +1 -0
  70. package/dist/index.d.ts +31 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +37 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/infrastructure/jl-embed.d.ts +27 -0
  75. package/dist/infrastructure/jl-embed.d.ts.map +1 -0
  76. package/dist/infrastructure/jl-embed.js +79 -0
  77. package/dist/infrastructure/jl-embed.js.map +1 -0
  78. package/dist/infrastructure/solver-bridge.d.ts +73 -0
  79. package/dist/infrastructure/solver-bridge.d.ts.map +1 -0
  80. package/dist/infrastructure/solver-bridge.js +359 -0
  81. package/dist/infrastructure/solver-bridge.js.map +1 -0
  82. package/dist/infrastructure/witness-signer.d.ts +44 -0
  83. package/dist/infrastructure/witness-signer.d.ts.map +1 -0
  84. package/dist/infrastructure/witness-signer.js +158 -0
  85. package/dist/infrastructure/witness-signer.js.map +1 -0
  86. package/dist/mcp-tools/index.d.ts +27 -0
  87. package/dist/mcp-tools/index.d.ts.map +1 -0
  88. package/dist/mcp-tools/index.js +292 -0
  89. package/dist/mcp-tools/index.js.map +1 -0
  90. package/package.json +55 -0
  91. package/ruvector.db +0 -0
  92. package/src/adapters/aidefence-suspicion-adapter.ts +102 -0
  93. package/src/adapters/browser-causal-adapter.ts +193 -0
  94. package/src/adapters/cost-attribution-adapter.ts +123 -0
  95. package/src/adapters/federation-trust-adapter.ts +116 -0
  96. package/src/adapters/index.ts +87 -0
  97. package/src/adapters/jujutsu-blast-radius-adapter.ts +107 -0
  98. package/src/adapters/knowledge-graph-adapter.ts +110 -0
  99. package/src/adapters/observability-span-adapter.ts +123 -0
  100. package/src/adapters/portfolio-cg-adapter.ts +140 -0
  101. package/src/adapters/rag-memory-adapter.ts +117 -0
  102. package/src/application/federation-client.ts +147 -0
  103. package/src/application/federation-server.ts +158 -0
  104. package/src/application/streaming-bridge.ts +137 -0
  105. package/src/domain/adapter.ts +92 -0
  106. package/src/domain/federation-protocol.ts +95 -0
  107. package/src/domain/signed-artifact.ts +80 -0
  108. package/src/domain/types.ts +215 -0
  109. package/src/index.ts +105 -0
  110. package/src/infrastructure/jl-embed.ts +98 -0
  111. package/src/infrastructure/solver-bridge.ts +389 -0
  112. package/src/infrastructure/witness-signer.ts +209 -0
  113. package/src/mcp-tools/index.ts +316 -0
  114. package/tests/adapter-registry.test.ts +69 -0
  115. package/tests/browser-causal-adapter.test.ts +174 -0
  116. package/tests/mcp-tools.test.ts +169 -0
  117. package/tests/phase3-adapters.test.ts +206 -0
  118. package/tests/phase4-adapters.test.ts +158 -0
  119. package/tests/phase5-portfolio.test.ts +122 -0
  120. package/tests/phase6-adapters.test.ts +224 -0
  121. package/tests/phase6_5-streaming.test.ts +135 -0
  122. package/tests/phase7-signed-artifact.test.ts +238 -0
  123. package/tests/phase8-federation.test.ts +194 -0
  124. package/tests/solver-bridge.test.ts +255 -0
  125. package/tsconfig.json +21 -0
  126. package/vitest.config.ts +9 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Federation Trust Adapter (Wedge 3, ADR-123 Phase 3)
3
+ *
4
+ * `ruflo-federation` ships a peer trust mesh (ADR-097/104/105/111). This
5
+ * adapter exports the mesh as a SparseMatrix so `sublinear/page-rank-entry`
6
+ * computes transitive trust `(I − αT)τ = e` in O(log peers) instead of
7
+ * O(peers²) closure walks. Trust is one-way → the matrix is asymmetric
8
+ * (per upstream 2025 asymmetric-DD result, this is in-scope for sublinear).
9
+ */
10
+ import { createHash } from 'node:crypto';
11
+ import { getRegistry } from '../domain/adapter.js';
12
+ export const FEDERATION_TRUST_GRAPH_ID = 'ruflo-federation:trust-mesh';
13
+ export class FederationTrustAdapter {
14
+ graphId = FEDERATION_TRUST_GRAPH_ID;
15
+ ownerPlugin = 'ruflo-federation';
16
+ requiresPreprocessing = false;
17
+ source;
18
+ freshnessMs;
19
+ ddSafetyMargin;
20
+ constructor(options) {
21
+ this.source = options.source;
22
+ this.freshnessMs = options.freshnessMs ?? 7 * 24 * 60 * 60 * 1000;
23
+ this.ddSafetyMargin = options.ddSafetyMargin ?? 0.25;
24
+ }
25
+ async exportAsSparseMatrix(options) {
26
+ const allEdges = await this.source.listTrustEdges();
27
+ const now = Date.now();
28
+ const fresh = allEdges.filter((e) => now - Date.parse(e.updatedAt) <= this.freshnessMs);
29
+ const peerSet = new Set();
30
+ for (const e of fresh) {
31
+ peerSet.add(e.fromPeer);
32
+ peerSet.add(e.toPeer);
33
+ }
34
+ if (options?.nodeFilter) {
35
+ for (const p of [...peerSet])
36
+ if (!options.nodeFilter.has(p))
37
+ peerSet.delete(p);
38
+ }
39
+ const peers = [...peerSet].sort();
40
+ const nodeIndex = {};
41
+ peers.forEach((p, i) => (nodeIndex[p] = i));
42
+ const entries = [];
43
+ const rowSums = new Array(peers.length).fill(0);
44
+ for (const edge of fresh) {
45
+ const r = nodeIndex[edge.fromPeer];
46
+ const c = nodeIndex[edge.toPeer];
47
+ if (r === undefined || c === undefined || r === c)
48
+ continue;
49
+ const w = Math.max(0, Math.min(1, edge.confidence));
50
+ if (w === 0)
51
+ continue;
52
+ entries.push({ row: r, col: c, value: w });
53
+ rowSums[r] += w;
54
+ }
55
+ // DD diagonal: |diag| ≥ Σ|off| + margin
56
+ for (let i = 0; i < peers.length; i++) {
57
+ entries.push({ row: i, col: i, value: rowSums[i] + this.ddSafetyMargin });
58
+ }
59
+ return {
60
+ graphId: this.graphId,
61
+ size: peers.length,
62
+ entries,
63
+ nodeIndex,
64
+ indexNode: peers,
65
+ capturedAt: new Date().toISOString(),
66
+ contentHash: hashContent(this.graphId, entries),
67
+ };
68
+ }
69
+ }
70
+ export function registerFederationTrustAdapter(options) {
71
+ const adapter = new FederationTrustAdapter(options);
72
+ (options.registry ?? getRegistry()).register(adapter);
73
+ return adapter;
74
+ }
75
+ function hashContent(graphId, entries) {
76
+ const h = createHash('sha256');
77
+ h.update(graphId);
78
+ for (const e of entries)
79
+ h.update(`|${e.row},${e.col},${e.value.toFixed(8)}`);
80
+ return h.digest('hex');
81
+ }
82
+ //# sourceMappingURL=federation-trust-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation-trust-adapter.js","sourceRoot":"","sources":["../../src/adapters/federation-trust-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ruflo-graph-intelligence — Adapter barrel export
3
+ *
4
+ * Each adapter lives in its own file and is opted into by the owning plugin
5
+ * at init time. Phase-1 ships zero adapters; Phase 2+ adds them one at a time.
6
+ */
7
+ export { BrowserCausalAdapter, browserCausalGraphId, registerBrowserCausalAdapter, type BreakEventSource, type BreakEventLike, type BrowserCausalAdapterOptions, } from './browser-causal-adapter.js';
8
+ export { FederationTrustAdapter, FEDERATION_TRUST_GRAPH_ID, registerFederationTrustAdapter, type PeerTrustEdge, type PeerTrustSource, type FederationTrustAdapterOptions, } from './federation-trust-adapter.js';
9
+ export { CostAttributionAdapter, costAttributionGraphId, registerCostAttributionAdapter, type CostCausationEdge, type CostCausationSource, type CostAttributionAdapterOptions, } from './cost-attribution-adapter.js';
10
+ export { ObservabilitySpanAdapter, observabilityGraphId, registerObservabilitySpanAdapter, type SpanRecord, type ObservabilitySpanSource, type ObservabilitySpanAdapterOptions, } from './observability-span-adapter.js';
11
+ export { KnowledgeGraphAdapter, KNOWLEDGE_GRAPH_ID, registerKnowledgeGraphAdapter, type KGEdge, type KnowledgeGraphSource, type KnowledgeGraphAdapterOptions, } from './knowledge-graph-adapter.js';
12
+ export { RagMemoryAdapter, ragMemoryGraphId, registerRagMemoryAdapter, type ChunkEdge, type RagMemorySource, type RagMemoryAdapterOptions, } from './rag-memory-adapter.js';
13
+ export { PortfolioCovarianceAdapter, portfolioGraphId, registerPortfolioCovarianceAdapter, type CovarianceEntry, type PortfolioSource, type PortfolioAdapterOptions, } from './portfolio-cg-adapter.js';
14
+ export { AIDefenceSuspicionAdapter, AIDEFENCE_CALL_GRAPH_ID, registerAIDefenceSuspicionAdapter, type CallEdge, type AIDefenceSource, type AIDefenceAdapterOptions, } from './aidefence-suspicion-adapter.js';
15
+ export { JujutsuBlastRadiusAdapter, JUJUTSU_IMPORT_GRAPH_ID, registerJujutsuBlastRadiusAdapter, type ImportEdge, type JujutsuSource, type JujutsuAdapterOptions, } from './jujutsu-blast-radius-adapter.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,2BAA2B,GACjC,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,8BAA8B,EAC9B,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,6BAA6B,GACnC,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,8BAA8B,EAC9B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,6BAA6B,GACnC,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,gCAAgC,EAChC,KAAK,UAAU,EACf,KAAK,uBAAuB,EAC5B,KAAK,+BAA+B,GACrC,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,6BAA6B,EAC7B,KAAK,MAAM,EACX,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,GAClC,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,uBAAuB,GAC7B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,kCAAkC,EAClC,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,uBAAuB,GAC7B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,iCAAiC,EACjC,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,uBAAuB,GAC7B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,iCAAiC,EACjC,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,qBAAqB,GAC3B,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ruflo-graph-intelligence — Adapter barrel export
3
+ *
4
+ * Each adapter lives in its own file and is opted into by the owning plugin
5
+ * at init time. Phase-1 ships zero adapters; Phase 2+ adds them one at a time.
6
+ */
7
+ export { BrowserCausalAdapter, browserCausalGraphId, registerBrowserCausalAdapter, } from './browser-causal-adapter.js';
8
+ export { FederationTrustAdapter, FEDERATION_TRUST_GRAPH_ID, registerFederationTrustAdapter, } from './federation-trust-adapter.js';
9
+ export { CostAttributionAdapter, costAttributionGraphId, registerCostAttributionAdapter, } from './cost-attribution-adapter.js';
10
+ export { ObservabilitySpanAdapter, observabilityGraphId, registerObservabilitySpanAdapter, } from './observability-span-adapter.js';
11
+ export { KnowledgeGraphAdapter, KNOWLEDGE_GRAPH_ID, registerKnowledgeGraphAdapter, } from './knowledge-graph-adapter.js';
12
+ export { RagMemoryAdapter, ragMemoryGraphId, registerRagMemoryAdapter, } from './rag-memory-adapter.js';
13
+ export { PortfolioCovarianceAdapter, portfolioGraphId, registerPortfolioCovarianceAdapter, } from './portfolio-cg-adapter.js';
14
+ export { AIDefenceSuspicionAdapter, AIDEFENCE_CALL_GRAPH_ID, registerAIDefenceSuspicionAdapter, } from './aidefence-suspicion-adapter.js';
15
+ export { JujutsuBlastRadiusAdapter, JUJUTSU_IMPORT_GRAPH_ID, registerJujutsuBlastRadiusAdapter, } from './jujutsu-blast-radius-adapter.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,4BAA4B,GAI7B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,8BAA8B,GAI/B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,8BAA8B,GAI/B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,gCAAgC,GAIjC,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,6BAA6B,GAI9B,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,GAIzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,kCAAkC,GAInC,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,iCAAiC,GAIlC,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,iCAAiC,GAIlC,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Jujutsu Blast-Radius Adapter (Wedge 11, ADR-123 Phase 6)
3
+ *
4
+ * `ruflo-jujutsu` runs diff-analyze. This adapter exports the file-import
5
+ * graph so "if I change `foo.ts`, which files are downstream-affected" is a
6
+ * single-entry PR query — O(log files) instead of O(LOC × imports).
7
+ *
8
+ * The graph is directed: A imports B → A is downstream of B (B's change
9
+ * propagates upward to A). For blast-radius FROM a changed file, the matrix
10
+ * keeps natural orientation (changed file is the seed; downstream files
11
+ * receive the PR mass).
12
+ */
13
+ import type { SparseMatrix } from '../domain/types.js';
14
+ import type { SublinearAdapter, AdapterRegistry } from '../domain/adapter.js';
15
+ export interface ImportEdge {
16
+ /** File that does the importing. */
17
+ importer: string;
18
+ /** File being imported. */
19
+ importee: string;
20
+ /** Optional weight — number of distinct symbols imported. Default 1. */
21
+ weight?: number;
22
+ }
23
+ export interface JujutsuSource {
24
+ listImportEdges(): Promise<readonly ImportEdge[]>;
25
+ }
26
+ export interface JujutsuAdapterOptions {
27
+ source: JujutsuSource;
28
+ /** DD safety margin. Default 0.25. */
29
+ ddSafetyMargin?: number;
30
+ }
31
+ export declare const JUJUTSU_IMPORT_GRAPH_ID = "ruflo-jujutsu:import-graph";
32
+ export declare class JujutsuBlastRadiusAdapter implements SublinearAdapter {
33
+ readonly graphId = "ruflo-jujutsu:import-graph";
34
+ readonly ownerPlugin = "ruflo-jujutsu";
35
+ readonly requiresPreprocessing = false;
36
+ private readonly source;
37
+ private readonly ddSafetyMargin;
38
+ constructor(options: JujutsuAdapterOptions);
39
+ exportAsSparseMatrix(options?: {
40
+ nodeFilter?: ReadonlySet<string>;
41
+ }): Promise<SparseMatrix>;
42
+ }
43
+ export declare function registerJujutsuBlastRadiusAdapter(options: JujutsuAdapterOptions & {
44
+ registry?: AdapterRegistry;
45
+ }): JujutsuBlastRadiusAdapter;
46
+ //# sourceMappingURL=jujutsu-blast-radius-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jujutsu-blast-radius-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/jujutsu-blast-radius-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG9E,MAAM,WAAW,UAAU;IACzB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,IAAI,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,aAAa,CAAC;IACtB,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AAEpE,qBAAa,yBAA0B,YAAW,gBAAgB;IAChE,QAAQ,CAAC,OAAO,gCAA2B;IAC3C,QAAQ,CAAC,WAAW,mBAAmB;IACvC,QAAQ,CAAC,qBAAqB,SAAS;IAEvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,OAAO,EAAE,qBAAqB;IAKpC,oBAAoB,CAAC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;CAuClG;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,qBAAqB,GAAG;IAAE,QAAQ,CAAC,EAAE,eAAe,CAAA;CAAE,GAC9D,yBAAyB,CAI3B"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Jujutsu Blast-Radius Adapter (Wedge 11, ADR-123 Phase 6)
3
+ *
4
+ * `ruflo-jujutsu` runs diff-analyze. This adapter exports the file-import
5
+ * graph so "if I change `foo.ts`, which files are downstream-affected" is a
6
+ * single-entry PR query — O(log files) instead of O(LOC × imports).
7
+ *
8
+ * The graph is directed: A imports B → A is downstream of B (B's change
9
+ * propagates upward to A). For blast-radius FROM a changed file, the matrix
10
+ * keeps natural orientation (changed file is the seed; downstream files
11
+ * receive the PR mass).
12
+ */
13
+ import { createHash } from 'node:crypto';
14
+ import { getRegistry } from '../domain/adapter.js';
15
+ export const JUJUTSU_IMPORT_GRAPH_ID = 'ruflo-jujutsu:import-graph';
16
+ export class JujutsuBlastRadiusAdapter {
17
+ graphId = JUJUTSU_IMPORT_GRAPH_ID;
18
+ ownerPlugin = 'ruflo-jujutsu';
19
+ requiresPreprocessing = false;
20
+ source;
21
+ ddSafetyMargin;
22
+ constructor(options) {
23
+ this.source = options.source;
24
+ this.ddSafetyMargin = options.ddSafetyMargin ?? 0.25;
25
+ }
26
+ async exportAsSparseMatrix(options) {
27
+ const edges = await this.source.listImportEdges();
28
+ const fileSet = new Set();
29
+ for (const e of edges) {
30
+ fileSet.add(e.importer);
31
+ fileSet.add(e.importee);
32
+ }
33
+ if (options?.nodeFilter) {
34
+ for (const n of [...fileSet])
35
+ if (!options.nodeFilter.has(n))
36
+ fileSet.delete(n);
37
+ }
38
+ const files = [...fileSet].sort();
39
+ const nodeIndex = {};
40
+ files.forEach((f, i) => (nodeIndex[f] = i));
41
+ // For blast-radius PR seeded at the changed file: we want change to flow
42
+ // from `importee` → `importer`. So row = importee, col = importer.
43
+ const entries = [];
44
+ const rowSums = new Array(files.length).fill(0);
45
+ for (const e of edges) {
46
+ const r = nodeIndex[e.importee];
47
+ const c = nodeIndex[e.importer];
48
+ if (r === undefined || c === undefined || r === c)
49
+ continue;
50
+ const w = Math.max(0, e.weight ?? 1);
51
+ entries.push({ row: r, col: c, value: w });
52
+ rowSums[r] += w;
53
+ }
54
+ for (let i = 0; i < files.length; i++) {
55
+ entries.push({ row: i, col: i, value: rowSums[i] + this.ddSafetyMargin });
56
+ }
57
+ return {
58
+ graphId: this.graphId,
59
+ size: files.length,
60
+ entries,
61
+ nodeIndex,
62
+ indexNode: files,
63
+ capturedAt: new Date().toISOString(),
64
+ contentHash: hashContent(this.graphId, entries),
65
+ };
66
+ }
67
+ }
68
+ export function registerJujutsuBlastRadiusAdapter(options) {
69
+ const adapter = new JujutsuBlastRadiusAdapter(options);
70
+ (options.registry ?? getRegistry()).register(adapter);
71
+ return adapter;
72
+ }
73
+ function hashContent(graphId, entries) {
74
+ const h = createHash('sha256');
75
+ h.update(graphId);
76
+ for (const e of entries)
77
+ h.update(`|${e.row},${e.col},${e.value.toFixed(8)}`);
78
+ return h.digest('hex');
79
+ }
80
+ //# sourceMappingURL=jujutsu-blast-radius-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jujutsu-blast-radius-adapter.js","sourceRoot":"","sources":["../../src/adapters/jujutsu-blast-radius-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Knowledge Graph Adapter (Wedge 4, ADR-123 Phase 4)
3
+ *
4
+ * `ruflo-knowledge-graph` builds an entity-relation graph via kg-extract.
5
+ * This adapter exports it as a SparseMatrix so kg-importance(entity) becomes
6
+ * a single-entry PR query — answering "which entity is most central" in
7
+ * sub-millisecond on a 10k-node graph.
8
+ */
9
+ import type { SparseMatrix } from '../domain/types.js';
10
+ import type { SublinearAdapter, AdapterRegistry } from '../domain/adapter.js';
11
+ export interface KGEdge {
12
+ fromEntity: string;
13
+ toEntity: string;
14
+ relation: string;
15
+ /** Edge confidence in [0,1]. Default 1.0. */
16
+ confidence?: number;
17
+ }
18
+ export interface KnowledgeGraphSource {
19
+ listEdges(): Promise<readonly KGEdge[]>;
20
+ }
21
+ export interface KnowledgeGraphAdapterOptions {
22
+ source: KnowledgeGraphSource;
23
+ /** DD safety margin. Default 0.25. */
24
+ ddSafetyMargin?: number;
25
+ }
26
+ export declare const KNOWLEDGE_GRAPH_ID = "ruflo-knowledge-graph:entities";
27
+ export declare class KnowledgeGraphAdapter implements SublinearAdapter {
28
+ readonly graphId = "ruflo-knowledge-graph:entities";
29
+ readonly ownerPlugin = "ruflo-knowledge-graph";
30
+ readonly requiresPreprocessing = false;
31
+ private readonly source;
32
+ private readonly ddSafetyMargin;
33
+ constructor(options: KnowledgeGraphAdapterOptions);
34
+ exportAsSparseMatrix(options?: {
35
+ nodeFilter?: ReadonlySet<string>;
36
+ }): Promise<SparseMatrix>;
37
+ }
38
+ export declare function registerKnowledgeGraphAdapter(options: KnowledgeGraphAdapterOptions & {
39
+ registry?: AdapterRegistry;
40
+ }): KnowledgeGraphAdapter;
41
+ //# sourceMappingURL=knowledge-graph-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-graph-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/knowledge-graph-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG9E,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AAEnE,qBAAa,qBAAsB,YAAW,gBAAgB;IAC5D,QAAQ,CAAC,OAAO,oCAAsB;IACtC,QAAQ,CAAC,WAAW,2BAA2B;IAC/C,QAAQ,CAAC,qBAAqB,SAAS;IAEvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,OAAO,EAAE,4BAA4B;IAK3C,oBAAoB,CAAC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;CA+ClG;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,4BAA4B,GAAG;IAAE,QAAQ,CAAC,EAAE,eAAe,CAAA;CAAE,GACrE,qBAAqB,CAIvB"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Knowledge Graph Adapter (Wedge 4, ADR-123 Phase 4)
3
+ *
4
+ * `ruflo-knowledge-graph` builds an entity-relation graph via kg-extract.
5
+ * This adapter exports it as a SparseMatrix so kg-importance(entity) becomes
6
+ * a single-entry PR query — answering "which entity is most central" in
7
+ * sub-millisecond on a 10k-node graph.
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ import { getRegistry } from '../domain/adapter.js';
11
+ export const KNOWLEDGE_GRAPH_ID = 'ruflo-knowledge-graph:entities';
12
+ export class KnowledgeGraphAdapter {
13
+ graphId = KNOWLEDGE_GRAPH_ID;
14
+ ownerPlugin = 'ruflo-knowledge-graph';
15
+ requiresPreprocessing = false;
16
+ source;
17
+ ddSafetyMargin;
18
+ constructor(options) {
19
+ this.source = options.source;
20
+ this.ddSafetyMargin = options.ddSafetyMargin ?? 0.25;
21
+ }
22
+ async exportAsSparseMatrix(options) {
23
+ const edges = await this.source.listEdges();
24
+ const entitySet = new Set();
25
+ for (const e of edges) {
26
+ entitySet.add(e.fromEntity);
27
+ entitySet.add(e.toEntity);
28
+ }
29
+ if (options?.nodeFilter) {
30
+ for (const n of [...entitySet])
31
+ if (!options.nodeFilter.has(n))
32
+ entitySet.delete(n);
33
+ }
34
+ const entities = [...entitySet].sort();
35
+ const nodeIndex = {};
36
+ entities.forEach((n, i) => (nodeIndex[n] = i));
37
+ // Weight edges by confidence; if multiple relations exist between two
38
+ // entities, sum confidences (cap at 1).
39
+ const weights = new Map();
40
+ for (const e of edges) {
41
+ const r = nodeIndex[e.fromEntity];
42
+ const c = nodeIndex[e.toEntity];
43
+ if (r === undefined || c === undefined || r === c)
44
+ continue;
45
+ const key = `${r},${c}`;
46
+ weights.set(key, Math.min(1, (weights.get(key) ?? 0) + (e.confidence ?? 1)));
47
+ }
48
+ const entries = [];
49
+ const rowSums = new Array(entities.length).fill(0);
50
+ for (const [key, w] of weights) {
51
+ const [rStr, cStr] = key.split(',');
52
+ const r = Number(rStr);
53
+ const c = Number(cStr);
54
+ entries.push({ row: r, col: c, value: w });
55
+ rowSums[r] += w;
56
+ }
57
+ for (let i = 0; i < entities.length; i++) {
58
+ entries.push({ row: i, col: i, value: rowSums[i] + this.ddSafetyMargin });
59
+ }
60
+ return {
61
+ graphId: this.graphId,
62
+ size: entities.length,
63
+ entries,
64
+ nodeIndex,
65
+ indexNode: entities,
66
+ capturedAt: new Date().toISOString(),
67
+ contentHash: hashContent(this.graphId, entries),
68
+ };
69
+ }
70
+ }
71
+ export function registerKnowledgeGraphAdapter(options) {
72
+ const adapter = new KnowledgeGraphAdapter(options);
73
+ (options.registry ?? getRegistry()).register(adapter);
74
+ return adapter;
75
+ }
76
+ function hashContent(graphId, entries) {
77
+ const h = createHash('sha256');
78
+ h.update(graphId);
79
+ for (const e of entries)
80
+ h.update(`|${e.row},${e.col},${e.value.toFixed(8)}`);
81
+ return h.digest('hex');
82
+ }
83
+ //# sourceMappingURL=knowledge-graph-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-graph-adapter.js","sourceRoot":"","sources":["../../src/adapters/knowledge-graph-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Observability Span Adapter (Wedge 7, ADR-123 Phase 3)
3
+ *
4
+ * `ruflo-observability` records spans (OpenTelemetry-style) with parent links
5
+ * + cross-trace causality. This adapter exports the span graph so the user
6
+ * can ask "which span most contributed to this slow/failed request" in
7
+ * O(log spans) instead of full-trace walks.
8
+ */
9
+ import type { SparseMatrix } from '../domain/types.js';
10
+ import type { SublinearAdapter, AdapterRegistry } from '../domain/adapter.js';
11
+ export interface SpanRecord {
12
+ spanId: string;
13
+ parentSpanId?: string;
14
+ traceId: string;
15
+ /** Self-time in microseconds — used as edge weight. */
16
+ selfTimeUs: number;
17
+ /** Optional cross-trace causality link (e.g. an event triggered this trace). */
18
+ causedBySpanId?: string;
19
+ }
20
+ export interface ObservabilitySpanSource {
21
+ listSpans(traceId: string): Promise<readonly SpanRecord[]>;
22
+ }
23
+ export interface ObservabilitySpanAdapterOptions {
24
+ source: ObservabilitySpanSource;
25
+ traceId: string;
26
+ /** DD safety margin. Default 0.25. */
27
+ ddSafetyMargin?: number;
28
+ }
29
+ export declare function observabilityGraphId(traceId: string): string;
30
+ export declare class ObservabilitySpanAdapter implements SublinearAdapter {
31
+ readonly graphId: string;
32
+ readonly ownerPlugin = "ruflo-observability";
33
+ readonly requiresPreprocessing = false;
34
+ private readonly source;
35
+ private readonly traceId;
36
+ private readonly ddSafetyMargin;
37
+ constructor(options: ObservabilitySpanAdapterOptions);
38
+ exportAsSparseMatrix(options?: {
39
+ nodeFilter?: ReadonlySet<string>;
40
+ }): Promise<SparseMatrix>;
41
+ }
42
+ export declare function registerObservabilitySpanAdapter(options: ObservabilitySpanAdapterOptions & {
43
+ registry?: AdapterRegistry;
44
+ }): ObservabilitySpanAdapter;
45
+ //# sourceMappingURL=observability-span-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability-span-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/observability-span-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG9E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,uBAAuB,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,qBAAa,wBAAyB,YAAW,gBAAgB;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,yBAAyB;IAC7C,QAAQ,CAAC,qBAAqB,SAAS;IAEvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,OAAO,EAAE,+BAA+B;IAO9C,oBAAoB,CAAC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;CAoDlG;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,+BAA+B,GAAG;IAAE,QAAQ,CAAC,EAAE,eAAe,CAAA;CAAE,GACxE,wBAAwB,CAI1B"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Observability Span Adapter (Wedge 7, ADR-123 Phase 3)
3
+ *
4
+ * `ruflo-observability` records spans (OpenTelemetry-style) with parent links
5
+ * + cross-trace causality. This adapter exports the span graph so the user
6
+ * can ask "which span most contributed to this slow/failed request" in
7
+ * O(log spans) instead of full-trace walks.
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ import { getRegistry } from '../domain/adapter.js';
11
+ export function observabilityGraphId(traceId) {
12
+ return `ruflo-observability:trace:${traceId}`;
13
+ }
14
+ export class ObservabilitySpanAdapter {
15
+ graphId;
16
+ ownerPlugin = 'ruflo-observability';
17
+ requiresPreprocessing = false;
18
+ source;
19
+ traceId;
20
+ ddSafetyMargin;
21
+ constructor(options) {
22
+ this.source = options.source;
23
+ this.traceId = options.traceId;
24
+ this.ddSafetyMargin = options.ddSafetyMargin ?? 0.25;
25
+ this.graphId = observabilityGraphId(this.traceId);
26
+ }
27
+ async exportAsSparseMatrix(options) {
28
+ const spans = await this.source.listSpans(this.traceId);
29
+ const idSet = new Set();
30
+ for (const s of spans) {
31
+ idSet.add(s.spanId);
32
+ if (s.parentSpanId)
33
+ idSet.add(s.parentSpanId);
34
+ if (s.causedBySpanId)
35
+ idSet.add(s.causedBySpanId);
36
+ }
37
+ if (options?.nodeFilter) {
38
+ for (const n of [...idSet])
39
+ if (!options.nodeFilter.has(n))
40
+ idSet.delete(n);
41
+ }
42
+ const nodes = [...idSet].sort();
43
+ const nodeIndex = {};
44
+ nodes.forEach((n, i) => (nodeIndex[n] = i));
45
+ // Normalise self-time per parent: each parent's outbound weights sum to ≤1.
46
+ const childrenByParent = new Map();
47
+ for (const s of spans) {
48
+ const p = s.parentSpanId ?? s.causedBySpanId;
49
+ if (!p)
50
+ continue;
51
+ if (!childrenByParent.has(p))
52
+ childrenByParent.set(p, []);
53
+ childrenByParent.get(p).push(s);
54
+ }
55
+ const entries = [];
56
+ const rowSums = new Array(nodes.length).fill(0);
57
+ for (const [parent, children] of childrenByParent) {
58
+ const r = nodeIndex[parent];
59
+ if (r === undefined)
60
+ continue;
61
+ const total = children.reduce((s, c) => s + Math.max(1, c.selfTimeUs), 0);
62
+ for (const child of children) {
63
+ const c = nodeIndex[child.spanId];
64
+ if (c === undefined || c === r)
65
+ continue;
66
+ const w = Math.max(1, child.selfTimeUs) / total;
67
+ entries.push({ row: r, col: c, value: w });
68
+ rowSums[r] += w;
69
+ }
70
+ }
71
+ for (let i = 0; i < nodes.length; i++) {
72
+ entries.push({ row: i, col: i, value: rowSums[i] + this.ddSafetyMargin });
73
+ }
74
+ return {
75
+ graphId: this.graphId,
76
+ size: nodes.length,
77
+ entries,
78
+ nodeIndex,
79
+ indexNode: nodes,
80
+ capturedAt: new Date().toISOString(),
81
+ contentHash: hashContent(this.graphId, entries),
82
+ };
83
+ }
84
+ }
85
+ export function registerObservabilitySpanAdapter(options) {
86
+ const adapter = new ObservabilitySpanAdapter(options);
87
+ (options.registry ?? getRegistry()).register(adapter);
88
+ return adapter;
89
+ }
90
+ function hashContent(graphId, entries) {
91
+ const h = createHash('sha256');
92
+ h.update(graphId);
93
+ for (const e of entries)
94
+ h.update(`|${e.row},${e.col},${e.value.toFixed(8)}`);
95
+ return h.digest('hex');
96
+ }
97
+ //# sourceMappingURL=observability-span-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability-span-adapter.js","sourceRoot":"","sources":["../../src/adapters/observability-span-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Portfolio Covariance Adapter (Wedge 8, ADR-123 Phase 5)
3
+ *
4
+ * `ruflo-neural-trader` does mean-variance optimisation: solve `Σ x = μ`
5
+ * where `Σ` is the symmetric positive-definite asset-covariance matrix and
6
+ * `μ` is the vector of expected returns. CG is the ideal target — upstream
7
+ * 1.7.0 benchmarks: **816 ns at n=256, 40-60× faster than Neumann**.
8
+ *
9
+ * This adapter exports the covariance matrix as a SparseMatrix so callers
10
+ * use `sublinear/solve` with `algorithm: 'cg'` and get the optimal weights.
11
+ * Unlike the PageRank wedges, this graph IS symmetric (Σ = Σᵀ) and SPD by
12
+ * construction.
13
+ */
14
+ import type { SparseMatrix } from '../domain/types.js';
15
+ import type { SublinearAdapter, AdapterRegistry } from '../domain/adapter.js';
16
+ export interface CovarianceEntry {
17
+ /** Asset symbol on the row side. */
18
+ assetA: string;
19
+ /** Asset symbol on the column side. */
20
+ assetB: string;
21
+ /** Covariance value. Σ[A,B] = Σ[B,A] by SPD construction. */
22
+ covariance: number;
23
+ }
24
+ export interface PortfolioSource {
25
+ /**
26
+ * Dense or sparse covariance entries. Adapter symmetrises automatically
27
+ * if only one of (A,B) or (B,A) is provided.
28
+ */
29
+ listCovarianceEntries(portfolioId: string): Promise<readonly CovarianceEntry[]>;
30
+ /** Expected returns vector — same keys as covariance assets. */
31
+ listExpectedReturns(portfolioId: string): Promise<Record<string, number>>;
32
+ }
33
+ export interface PortfolioAdapterOptions {
34
+ source: PortfolioSource;
35
+ portfolioId: string;
36
+ /**
37
+ * Ridge regularisation added to the diagonal to ensure SPD even when the
38
+ * empirical covariance is rank-deficient. Default 1e-6.
39
+ */
40
+ ridge?: number;
41
+ }
42
+ export declare function portfolioGraphId(portfolioId: string): string;
43
+ export declare class PortfolioCovarianceAdapter implements SublinearAdapter {
44
+ readonly graphId: string;
45
+ readonly ownerPlugin = "ruflo-neural-trader";
46
+ readonly requiresPreprocessing = false;
47
+ private readonly source;
48
+ private readonly portfolioId;
49
+ private readonly ridge;
50
+ constructor(options: PortfolioAdapterOptions);
51
+ exportAsSparseMatrix(options?: {
52
+ nodeFilter?: ReadonlySet<string>;
53
+ }): Promise<SparseMatrix>;
54
+ /** Fetch expected returns aligned with the matrix's node order. */
55
+ expectedReturnsVector(matrix: SparseMatrix): Promise<number[]>;
56
+ }
57
+ export declare function registerPortfolioCovarianceAdapter(options: PortfolioAdapterOptions & {
58
+ registry?: AdapterRegistry;
59
+ }): PortfolioCovarianceAdapter;
60
+ //# sourceMappingURL=portfolio-cg-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio-cg-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/portfolio-cg-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG9E,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAAC;IAChF,gEAAgE;IAChE,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,eAAe,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,qBAAa,0BAA2B,YAAW,gBAAgB;IACjE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,yBAAyB;IAC7C,QAAQ,CAAC,qBAAqB,SAAS;IAEvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,OAAO,EAAE,uBAAuB;IAOtC,oBAAoB,CAAC,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAmDjG,mEAAmE;IAC7D,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAIrE;AAED,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,uBAAuB,GAAG;IAAE,QAAQ,CAAC,EAAE,eAAe,CAAA;CAAE,GAChE,0BAA0B,CAI5B"}