build(agent): molt-x#ed374b iteration
This commit is contained in:
parent
03893093aa
commit
4e4b2a53b4
|
|
@ -34,3 +34,11 @@ Notes
|
||||||
- This repository emphasizes minimal, pragmatic changes; the goal is to establish a safe, extensible MVP while keeping the codebase approachable for contributors.
|
- This repository emphasizes minimal, pragmatic changes; the goal is to establish a safe, extensible MVP while keeping the codebase approachable for contributors.
|
||||||
|
|
||||||
See AGENTS.md for architectural guidance and testing rules.
|
See AGENTS.md for architectural guidance and testing rules.
|
||||||
|
|
||||||
|
EnergiBridge interoperability (beta)
|
||||||
|
- Added a minimal EnergiBridge scaffold to map Open-EnergyMesh primitives to a canonical, vendor-agnostic contract representation and a Graph-of-Contracts registry.
|
||||||
|
- Included toy adapters to bootstrap cross-ecosystem interoperability:
|
||||||
|
- adapters/energi_bridge/inverter_bridge_adapter.js
|
||||||
|
- adapters/energi_bridge/der_bridge_adapter.js
|
||||||
|
- These adapters integrate with the existing MVP via the ADMM-lite path and demonstrate how to plug in device-specific models.
|
||||||
|
- This work lays the groundwork for Phase 0 protocol skeleton, registry of adapters, and TLS-based transport in future iterations.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
// Toy DER/Storage bridge adapter for EnergiBridge canonical path
|
||||||
|
class DerBridgeAdapter {
|
||||||
|
constructor(id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simple solve that models a local demand/consumption signal
|
||||||
|
solve(localProblem, /* sharedVariables */) {
|
||||||
|
const target = (localProblem && localProblem.vars && typeof localProblem.vars.value === 'number')
|
||||||
|
? localProblem.vars.value
|
||||||
|
: 0;
|
||||||
|
// Produce a modest consumption to demonstrate delta-sync behavior
|
||||||
|
const consumptionW = Math.max(0, target * 0.2);
|
||||||
|
return {
|
||||||
|
generationW: 0,
|
||||||
|
consumptionW,
|
||||||
|
netFlowW: -consumptionW
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
DerBridgeAdapter
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
// Toy inverter bridge adapter for EnergiBridge canonical path
|
||||||
|
class InverterBridgeAdapter {
|
||||||
|
constructor(id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lightweight solve() method compatible with EnergyMesh.admmAdapter usage
|
||||||
|
// Computes a simple plan targeting the current localProblem value
|
||||||
|
solve(localProblem, /* sharedVariables */) {
|
||||||
|
const target = (localProblem && localProblem.vars && typeof localProblem.vars.value === 'number')
|
||||||
|
? localProblem.vars.value
|
||||||
|
: 0;
|
||||||
|
// Simple heuristic: approach target as generation; no load signal here
|
||||||
|
const generationW = Math.max(0, target * 0.95);
|
||||||
|
const result = {
|
||||||
|
generationW,
|
||||||
|
// Keep consumption at 0 in this toy adapter; focus is demonstrating path
|
||||||
|
consumptionW: 0,
|
||||||
|
netFlowW: generationW
|
||||||
|
};
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
InverterBridgeAdapter
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
// EnergiBridge: Lightweight canonical bridge for interoperability in Open-EnergyMesh MVP
|
||||||
|
// This module provides minimal scaffolding for a CatOpt-like bridge that maps
|
||||||
|
// primitives to a vendor-agnostic contract representation and a Graph-of-Contracts
|
||||||
|
// registry for adapters and data schemas.
|
||||||
|
|
||||||
|
class GraphOfContracts {
|
||||||
|
constructor() {
|
||||||
|
this.contracts = new Map(); // contractName -> schema
|
||||||
|
this.adapters = new Map(); // adapterName -> { contractName, adapter }
|
||||||
|
}
|
||||||
|
|
||||||
|
registerContract(contractName, schema) {
|
||||||
|
this.contracts.set(contractName, schema);
|
||||||
|
}
|
||||||
|
|
||||||
|
getContract(contractName) {
|
||||||
|
return this.contracts.get(contractName);
|
||||||
|
}
|
||||||
|
|
||||||
|
registerAdapter(adapterName, contractName, adapter) {
|
||||||
|
this.adapters.set(adapterName, { contractName, adapter });
|
||||||
|
}
|
||||||
|
|
||||||
|
getAdapter(adapterName) {
|
||||||
|
return this.adapters.get(adapterName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class EnergiBridge {
|
||||||
|
constructor() {
|
||||||
|
this.registry = new GraphOfContracts();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Minimal canonical mapping from a local Open-EnergyMesh primitive to a
|
||||||
|
// CatOpt-like canonical object. The real project would implement richer
|
||||||
|
// mappings; this is a skeleton to bootstrap adapters.
|
||||||
|
static toCanonical(primitive) {
|
||||||
|
if (!primitive) return null;
|
||||||
|
// Heuristic-based mapping: detect common shapes
|
||||||
|
if (primitive.localProblem || primitive.LocalProblem) {
|
||||||
|
const lp = primitive.localProblem || primitive.LocalProblem;
|
||||||
|
return { Objects: 'LocalProblem', payload: lp };
|
||||||
|
}
|
||||||
|
if (primitive.sharedVariables || primitive.SharedVariables) {
|
||||||
|
const sv = primitive.sharedVariables || primitive.SharedVariables;
|
||||||
|
return { Morphisms: 'SharedVariables', payload: sv };
|
||||||
|
}
|
||||||
|
// Fallback: wrap as a generic contract element
|
||||||
|
return { Objects: 'Unknown', payload: primitive };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
EnergiBridge,
|
||||||
|
GraphOfContracts
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue