ruflo-graph-intelligence 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-flow/data/pending-insights.jsonl +30 -0
- package/dist/adapters/aidefence-suspicion-adapter.d.ts +40 -0
- package/dist/adapters/aidefence-suspicion-adapter.d.ts.map +1 -0
- package/dist/adapters/aidefence-suspicion-adapter.js +77 -0
- package/dist/adapters/aidefence-suspicion-adapter.js.map +1 -0
- package/dist/adapters/browser-causal-adapter.d.ts +83 -0
- package/dist/adapters/browser-causal-adapter.d.ts.map +1 -0
- package/dist/adapters/browser-causal-adapter.js +146 -0
- package/dist/adapters/browser-causal-adapter.js.map +1 -0
- package/dist/adapters/cost-attribution-adapter.d.ts +48 -0
- package/dist/adapters/cost-attribution-adapter.d.ts.map +1 -0
- package/dist/adapters/cost-attribution-adapter.js +95 -0
- package/dist/adapters/cost-attribution-adapter.js.map +1 -0
- package/dist/adapters/federation-trust-adapter.d.ts +49 -0
- package/dist/adapters/federation-trust-adapter.d.ts.map +1 -0
- package/dist/adapters/federation-trust-adapter.js +82 -0
- package/dist/adapters/federation-trust-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +16 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +16 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/jujutsu-blast-radius-adapter.d.ts +46 -0
- package/dist/adapters/jujutsu-blast-radius-adapter.d.ts.map +1 -0
- package/dist/adapters/jujutsu-blast-radius-adapter.js +80 -0
- package/dist/adapters/jujutsu-blast-radius-adapter.js.map +1 -0
- package/dist/adapters/knowledge-graph-adapter.d.ts +41 -0
- package/dist/adapters/knowledge-graph-adapter.d.ts.map +1 -0
- package/dist/adapters/knowledge-graph-adapter.js +83 -0
- package/dist/adapters/knowledge-graph-adapter.js.map +1 -0
- package/dist/adapters/observability-span-adapter.d.ts +45 -0
- package/dist/adapters/observability-span-adapter.d.ts.map +1 -0
- package/dist/adapters/observability-span-adapter.js +97 -0
- package/dist/adapters/observability-span-adapter.js.map +1 -0
- package/dist/adapters/portfolio-cg-adapter.d.ts +60 -0
- package/dist/adapters/portfolio-cg-adapter.d.ts.map +1 -0
- package/dist/adapters/portfolio-cg-adapter.js +102 -0
- package/dist/adapters/portfolio-cg-adapter.js.map +1 -0
- package/dist/adapters/rag-memory-adapter.d.ts +49 -0
- package/dist/adapters/rag-memory-adapter.d.ts.map +1 -0
- package/dist/adapters/rag-memory-adapter.js +86 -0
- package/dist/adapters/rag-memory-adapter.js.map +1 -0
- package/dist/application/federation-client.d.ts +54 -0
- package/dist/application/federation-client.d.ts.map +1 -0
- package/dist/application/federation-client.js +101 -0
- package/dist/application/federation-client.js.map +1 -0
- package/dist/application/federation-server.d.ts +38 -0
- package/dist/application/federation-server.d.ts.map +1 -0
- package/dist/application/federation-server.js +127 -0
- package/dist/application/federation-server.js.map +1 -0
- package/dist/application/streaming-bridge.d.ts +62 -0
- package/dist/application/streaming-bridge.d.ts.map +1 -0
- package/dist/application/streaming-bridge.js +101 -0
- package/dist/application/streaming-bridge.js.map +1 -0
- package/dist/domain/adapter.d.ts +58 -0
- package/dist/domain/adapter.d.ts.map +1 -0
- package/dist/domain/adapter.js +43 -0
- package/dist/domain/adapter.js.map +1 -0
- package/dist/domain/federation-protocol.d.ts +857 -0
- package/dist/domain/federation-protocol.d.ts.map +1 -0
- package/dist/domain/federation-protocol.js +72 -0
- package/dist/domain/federation-protocol.js.map +1 -0
- package/dist/domain/signed-artifact.d.ts +429 -0
- package/dist/domain/signed-artifact.d.ts.map +1 -0
- package/dist/domain/signed-artifact.js +57 -0
- package/dist/domain/signed-artifact.js.map +1 -0
- package/dist/domain/types.d.ts +329 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +165 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/jl-embed.d.ts +27 -0
- package/dist/infrastructure/jl-embed.d.ts.map +1 -0
- package/dist/infrastructure/jl-embed.js +79 -0
- package/dist/infrastructure/jl-embed.js.map +1 -0
- package/dist/infrastructure/solver-bridge.d.ts +73 -0
- package/dist/infrastructure/solver-bridge.d.ts.map +1 -0
- package/dist/infrastructure/solver-bridge.js +359 -0
- package/dist/infrastructure/solver-bridge.js.map +1 -0
- package/dist/infrastructure/witness-signer.d.ts +44 -0
- package/dist/infrastructure/witness-signer.d.ts.map +1 -0
- package/dist/infrastructure/witness-signer.js +158 -0
- package/dist/infrastructure/witness-signer.js.map +1 -0
- package/dist/mcp-tools/index.d.ts +27 -0
- package/dist/mcp-tools/index.d.ts.map +1 -0
- package/dist/mcp-tools/index.js +292 -0
- package/dist/mcp-tools/index.js.map +1 -0
- package/package.json +55 -0
- package/ruvector.db +0 -0
- package/src/adapters/aidefence-suspicion-adapter.ts +102 -0
- package/src/adapters/browser-causal-adapter.ts +193 -0
- package/src/adapters/cost-attribution-adapter.ts +123 -0
- package/src/adapters/federation-trust-adapter.ts +116 -0
- package/src/adapters/index.ts +87 -0
- package/src/adapters/jujutsu-blast-radius-adapter.ts +107 -0
- package/src/adapters/knowledge-graph-adapter.ts +110 -0
- package/src/adapters/observability-span-adapter.ts +123 -0
- package/src/adapters/portfolio-cg-adapter.ts +140 -0
- package/src/adapters/rag-memory-adapter.ts +117 -0
- package/src/application/federation-client.ts +147 -0
- package/src/application/federation-server.ts +158 -0
- package/src/application/streaming-bridge.ts +137 -0
- package/src/domain/adapter.ts +92 -0
- package/src/domain/federation-protocol.ts +95 -0
- package/src/domain/signed-artifact.ts +80 -0
- package/src/domain/types.ts +215 -0
- package/src/index.ts +105 -0
- package/src/infrastructure/jl-embed.ts +98 -0
- package/src/infrastructure/solver-bridge.ts +389 -0
- package/src/infrastructure/witness-signer.ts +209 -0
- package/src/mcp-tools/index.ts +316 -0
- package/tests/adapter-registry.test.ts +69 -0
- package/tests/browser-causal-adapter.test.ts +174 -0
- package/tests/mcp-tools.test.ts +169 -0
- package/tests/phase3-adapters.test.ts +206 -0
- package/tests/phase4-adapters.test.ts +158 -0
- package/tests/phase5-portfolio.test.ts +122 -0
- package/tests/phase6-adapters.test.ts +224 -0
- package/tests/phase6_5-streaming.test.ts +135 -0
- package/tests/phase7-signed-artifact.test.ts +238 -0
- package/tests/phase8-federation.test.ts +194 -0
- package/tests/solver-bridge.test.ts +255 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,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"}
|