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,62 @@
1
+ /**
2
+ * Streaming Bridge — Wedge 12 (ADR-123 Phase 6.5)
3
+ *
4
+ * Couples a registered SublinearAdapter with `solve_on_change` so event-driven
5
+ * graphs (federation trust deltas, span streams, append-only causal breaks,
6
+ * cost spend events, AIDefence flag updates) pay only `O(nnz(delta) · log N)`
7
+ * per event rather than recomputing the full vector each tick.
8
+ *
9
+ * The bridge maintains the *previous solution* in memory; every push call
10
+ * applies the delta and returns the updated solution. It also exposes a
11
+ * `crossoverHeuristic()` that decides whether the cheap delta path is
12
+ * actually cheaper than a full re-solve given the current density.
13
+ */
14
+ import type { SublinearAdapter } from '../domain/adapter.js';
15
+ import type { ComplexityClass, SparseDelta } from '../domain/types.js';
16
+ export interface StreamingBridgeOptions {
17
+ adapter: SublinearAdapter;
18
+ /** Initial b vector for the base full-solve. */
19
+ initialRhs: number[];
20
+ algorithm?: 'cg' | 'neumann';
21
+ maxComplexityClass?: ComplexityClass;
22
+ /**
23
+ * Crossover threshold: prefer `solve_on_change` when
24
+ * `nnz(delta) / nnz(matrix) < deltaRatioThreshold`. Default 0.05.
25
+ */
26
+ deltaRatioThreshold?: number;
27
+ /** Force full re-solve after N delta updates regardless. Default 50. */
28
+ refreshEvery?: number;
29
+ }
30
+ export interface StreamingUpdate {
31
+ x: number[];
32
+ residualNorm: number;
33
+ iterations: number;
34
+ /** How this update was computed — informational. */
35
+ mode: 'delta' | 'full-resolve' | 'cold-start';
36
+ deltaNnz?: number;
37
+ appliedAt: string;
38
+ }
39
+ export declare class StreamingBridge {
40
+ private readonly adapter;
41
+ private readonly initialRhs;
42
+ private readonly algorithm;
43
+ private readonly maxComplexityClass;
44
+ private readonly deltaRatioThreshold;
45
+ private readonly refreshEvery;
46
+ private prevSolution;
47
+ private deltaCount;
48
+ private cachedMatrix;
49
+ constructor(options: StreamingBridgeOptions);
50
+ /** Force a fresh full re-solve and reset the streaming state. */
51
+ coldStart(): Promise<StreamingUpdate>;
52
+ /**
53
+ * Apply a delta event. The bridge picks `solve_on_change` if the delta is
54
+ * sparse enough; otherwise it falls back to a full re-solve.
55
+ */
56
+ pushDelta(delta: SparseDelta): Promise<StreamingUpdate>;
57
+ /** Best-effort current solution snapshot. */
58
+ getCurrentSolution(): readonly number[] | undefined;
59
+ /** Reset cached state (e.g. after the underlying graph re-grew). */
60
+ reset(): void;
61
+ }
62
+ //# sourceMappingURL=streaming-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-bridge.d.ts","sourceRoot":"","sources":["../../src/application/streaming-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAgB,MAAM,oBAAoB,CAAC;AAGrF,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,gDAAgD;IAChD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IAC7B,kBAAkB,CAAC,EAAE,eAAe,CAAC;IACrC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,YAAY,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAkB;IACrD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAA2B;gBAEnC,OAAO,EAAE,sBAAsB;IAS3C,iEAAiE;IAC3D,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAqB3C;;;OAGG;IACG,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;IAmC7D,6CAA6C;IAC7C,kBAAkB,IAAI,SAAS,MAAM,EAAE,GAAG,SAAS;IAInD,oEAAoE;IACpE,KAAK,IAAI,IAAI;CAKd"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Streaming Bridge — Wedge 12 (ADR-123 Phase 6.5)
3
+ *
4
+ * Couples a registered SublinearAdapter with `solve_on_change` so event-driven
5
+ * graphs (federation trust deltas, span streams, append-only causal breaks,
6
+ * cost spend events, AIDefence flag updates) pay only `O(nnz(delta) · log N)`
7
+ * per event rather than recomputing the full vector each tick.
8
+ *
9
+ * The bridge maintains the *previous solution* in memory; every push call
10
+ * applies the delta and returns the updated solution. It also exposes a
11
+ * `crossoverHeuristic()` that decides whether the cheap delta path is
12
+ * actually cheaper than a full re-solve given the current density.
13
+ */
14
+ import { runSolveOnChange, runSolve } from '../infrastructure/solver-bridge.js';
15
+ export class StreamingBridge {
16
+ adapter;
17
+ initialRhs;
18
+ algorithm;
19
+ maxComplexityClass;
20
+ deltaRatioThreshold;
21
+ refreshEvery;
22
+ prevSolution;
23
+ deltaCount = 0;
24
+ cachedMatrix;
25
+ constructor(options) {
26
+ this.adapter = options.adapter;
27
+ this.initialRhs = options.initialRhs;
28
+ this.algorithm = options.algorithm ?? 'cg';
29
+ this.maxComplexityClass = options.maxComplexityClass ?? 'polynomial';
30
+ this.deltaRatioThreshold = options.deltaRatioThreshold ?? 0.05;
31
+ this.refreshEvery = options.refreshEvery ?? 50;
32
+ }
33
+ /** Force a fresh full re-solve and reset the streaming state. */
34
+ async coldStart() {
35
+ const matrix = await this.adapter.exportAsSparseMatrix();
36
+ this.cachedMatrix = matrix;
37
+ const result = runSolve(matrix, {
38
+ graphId: matrix.graphId,
39
+ rhs: this.initialRhs,
40
+ algorithm: this.algorithm,
41
+ maxComplexityClass: this.maxComplexityClass,
42
+ coherenceThreshold: 0,
43
+ });
44
+ this.prevSolution = result.x;
45
+ this.deltaCount = 0;
46
+ return {
47
+ x: result.x,
48
+ residualNorm: result.residualNorm,
49
+ iterations: result.iterations,
50
+ mode: 'cold-start',
51
+ appliedAt: new Date().toISOString(),
52
+ };
53
+ }
54
+ /**
55
+ * Apply a delta event. The bridge picks `solve_on_change` if the delta is
56
+ * sparse enough; otherwise it falls back to a full re-solve.
57
+ */
58
+ async pushDelta(delta) {
59
+ if (!this.prevSolution || !this.cachedMatrix) {
60
+ await this.coldStart();
61
+ }
62
+ // Refresh-cap forces a clean re-solve to bound drift error
63
+ if (this.deltaCount >= this.refreshEvery) {
64
+ return this.coldStart().then((u) => ({ ...u, mode: 'full-resolve' }));
65
+ }
66
+ const matrix = this.cachedMatrix;
67
+ const deltaRatio = delta.indices.length / Math.max(1, matrix.entries.length);
68
+ if (deltaRatio >= this.deltaRatioThreshold) {
69
+ // Too dense — full re-solve is cheaper than delta-and-correct
70
+ return this.coldStart().then((u) => ({ ...u, mode: 'full-resolve' }));
71
+ }
72
+ const result = runSolveOnChange(matrix, {
73
+ graphId: matrix.graphId,
74
+ prevSolution: this.prevSolution,
75
+ delta,
76
+ algorithm: this.algorithm,
77
+ maxComplexityClass: this.maxComplexityClass,
78
+ });
79
+ this.prevSolution = result.x;
80
+ this.deltaCount++;
81
+ return {
82
+ x: result.x,
83
+ residualNorm: result.residualNorm,
84
+ iterations: result.iterations,
85
+ mode: 'delta',
86
+ deltaNnz: delta.indices.length,
87
+ appliedAt: new Date().toISOString(),
88
+ };
89
+ }
90
+ /** Best-effort current solution snapshot. */
91
+ getCurrentSolution() {
92
+ return this.prevSolution;
93
+ }
94
+ /** Reset cached state (e.g. after the underlying graph re-grew). */
95
+ reset() {
96
+ this.prevSolution = undefined;
97
+ this.cachedMatrix = undefined;
98
+ this.deltaCount = 0;
99
+ }
100
+ }
101
+ //# sourceMappingURL=streaming-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-bridge.js","sourceRoot":"","sources":["../../src/application/streaming-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * ruflo-graph-intelligence — Adapter Contract (ADR-123 § Architecture)
3
+ *
4
+ * Each owning plugin (browser, federation, knowledge-graph, …) implements
5
+ * this interface and registers itself at plugin-load time. The registry is
6
+ * plugin-local — the source plugin understands its own storage layout best.
7
+ */
8
+ import type { SparseMatrix } from './types.js';
9
+ export interface SublinearAdapter {
10
+ /** Stable identifier — `"ruflo-federation:trust-mesh"`, etc. */
11
+ readonly graphId: string;
12
+ /** Owning plugin's package name; informational. */
13
+ readonly ownerPlugin: string;
14
+ /**
15
+ * Export the current graph state as a SparseMatrix.
16
+ *
17
+ * `since` is an optional snapshot ISO timestamp — adapters may return
18
+ * a frozen snapshot at that moment (for reproducibility) instead of
19
+ * the live state. Adapters that don't support history return the live
20
+ * state regardless.
21
+ *
22
+ * `nodeFilter` is an optional allow-list — adapters that can prune
23
+ * irrelevant rows should honour it to keep the matrix small. Adapters
24
+ * that can't filter return the full matrix.
25
+ */
26
+ exportAsSparseMatrix(options?: {
27
+ since?: string;
28
+ nodeFilter?: ReadonlySet<string>;
29
+ }): Promise<SparseMatrix>;
30
+ /**
31
+ * Best-effort streaming hook — adapters that can emit deltas (new
32
+ * causal events, new federation trust updates, new spans) push
33
+ * `SparseDelta`s through this listener. Adapters that can't return
34
+ * `noopUnsubscribe`.
35
+ */
36
+ onChange?(listener: (delta: import('./types.js').SparseDelta) => void): () => void;
37
+ /**
38
+ * Whether this graph is **structurally** non-DD (e.g. asymmetric trust with
39
+ * negative weights). Adapters that know they need clamping/renormalisation
40
+ * before submission set this flag so the registry can advise callers.
41
+ */
42
+ readonly requiresPreprocessing?: boolean;
43
+ }
44
+ /** No-op unsubscribe for adapters that don't support streaming. */
45
+ export declare const noopUnsubscribe: () => void;
46
+ /** Plugin-load-time registry — populated via `register()`. */
47
+ export declare class AdapterRegistry {
48
+ private adapters;
49
+ register(adapter: SublinearAdapter): void;
50
+ unregister(graphId: string): boolean;
51
+ get(graphId: string): SublinearAdapter | undefined;
52
+ list(): SublinearAdapter[];
53
+ clear(): void;
54
+ }
55
+ export declare function getRegistry(): AdapterRegistry;
56
+ /** Test hook. */
57
+ export declare function resetRegistry(): void;
58
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/domain/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;;;;;;;;;;OAWG;IACH,oBAAoB,CAAC,OAAO,CAAC,EAAE;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE1B;;;;;OAKG;IACH,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,YAAY,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAEnF;;;;OAIG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED,mEAAmE;AACnE,eAAO,MAAM,eAAe,QAAO,IAAU,CAAC;AAE9C,8DAA8D;AAC9D,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAuC;IAEvD,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAOzC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIpC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIlD,IAAI,IAAI,gBAAgB,EAAE;IAI1B,KAAK,IAAI,IAAI;CAGd;AAID,wBAAgB,WAAW,IAAI,eAAe,CAG7C;AAED,iBAAiB;AACjB,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ruflo-graph-intelligence — Adapter Contract (ADR-123 § Architecture)
3
+ *
4
+ * Each owning plugin (browser, federation, knowledge-graph, …) implements
5
+ * this interface and registers itself at plugin-load time. The registry is
6
+ * plugin-local — the source plugin understands its own storage layout best.
7
+ */
8
+ /** No-op unsubscribe for adapters that don't support streaming. */
9
+ export const noopUnsubscribe = () => { };
10
+ /** Plugin-load-time registry — populated via `register()`. */
11
+ export class AdapterRegistry {
12
+ adapters = new Map();
13
+ register(adapter) {
14
+ if (this.adapters.has(adapter.graphId)) {
15
+ throw new Error(`adapter ${adapter.graphId} already registered`);
16
+ }
17
+ this.adapters.set(adapter.graphId, adapter);
18
+ }
19
+ unregister(graphId) {
20
+ return this.adapters.delete(graphId);
21
+ }
22
+ get(graphId) {
23
+ return this.adapters.get(graphId);
24
+ }
25
+ list() {
26
+ return [...this.adapters.values()];
27
+ }
28
+ clear() {
29
+ this.adapters.clear();
30
+ }
31
+ }
32
+ /** Singleton registry — same lifetime as the plugin process. */
33
+ let globalRegistry;
34
+ export function getRegistry() {
35
+ if (!globalRegistry)
36
+ globalRegistry = new AdapterRegistry();
37
+ return globalRegistry;
38
+ }
39
+ /** Test hook. */
40
+ export function resetRegistry() {
41
+ globalRegistry = undefined;
42
+ }
43
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/domain/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4CH,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;AAE9C,8DAA8D;AAC9D,MAAM,OAAO,eAAe;IAClB,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEvD,QAAQ,CAAC,OAAyB;QAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,OAAO,qBAAqB,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF;AAED,gEAAgE;AAChE,IAAI,cAA2C,CAAC;AAChD,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,cAAc;QAAE,cAAc,GAAG,IAAI,eAAe,EAAE,CAAC;IAC5D,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,aAAa;IAC3B,cAAc,GAAG,SAAS,CAAC;AAC7B,CAAC"}