@intent-driven/bridge-postgres
Bridge между Postgres БД и IDF Φ event-log: CDC mirror (read-only, БД primary) и gateway-mode (Fold принимает agent calls, валидирует, при confirm пишет в БД).
Status
pgoutput decoder + createMirror skeleton | ✅ PR 5a |
createPgLogicalMirror + idempotent setup helpers | ✅ PR 5b |
Schema-drift detector (detectDrift) | ✅ PR 5c |
| Gateway mode + transactional outbox | ✅ PR 5d |
| Reference deployment + migration guide | планируется PR 5e |
Gateway mode (PR 5d)
import {
ensureOutboxTable,
createGateway,
createOutboxProcessor,
} from "@intent-driven/bridge-postgres";
import pg from "pg";
const pool = new pg.Pool({ connectionString });
const setupClient = await pool.connect();
await ensureOutboxTable(setupClient);
setupClient.release();
const gateway = createGateway({ pool, ontology });
const result = await gateway.execute({
intentName: "create_order",
params: { amount: 100, status: "new" },
ctx: { idempotencyKey: "uuid-...", role: { base: "agent" } },
});
const processor = createOutboxProcessor({
pool,
publish: async (row) => { await foldRuntime.publishEffect(row); },
});
await processor.start();
Atomicity: business write + outbox row в одной TX. Validator reject (preapproval / invariants / irreversibility) → ничего не пишется. Idempotency через idempotency_key UNIQUE constraint (replay safe).
Mirror API (PR 5a)
import { createMirror } from "@intent-driven/bridge-postgres";
const mirror = createMirror({
stream: someAsyncIterableOfPgoutputBuffers,
async onEffect(effect, ctx) {
await foldRuntime.proposeEffect(effect);
},
async onCommit(info) {
},
});
await mirror.start();
console.log(mirror.stats);
В PR 5b будет high-level helper:
const mirror = createPgLogicalMirror({
connectionString: "postgres://repluser:pass@host/db",
slotName: "idf_mirror",
publicationName: "idf_pub",
onEffect, onCommit,
});
License
MIT.