trellis
Version:
Agentic State Engine — event-sourced causal graph with branching, decision traces, and realtime sync for AI-native applications
126 lines (123 loc) • 3.78 kB
JavaScript
import {
__esm
} from "./chunk-2ESYSVXG.js";
// src/core/persist/canonical-op.ts
function canonicalFact(f) {
const out = { e: f.e, a: f.a, v: f.v };
if (f.meta !== void 0) out.meta = canonicalFactMeta(f.meta);
return out;
}
function canonicalFactMeta(m) {
const out = {};
if (m.confidence !== void 0) out.confidence = m.confidence;
if (m.dataTypeId !== void 0) out.dataTypeId = m.dataTypeId;
if (m.sources !== void 0) out.sources = m.sources.map(canonicalSource);
return out;
}
function canonicalSource(s) {
const out = {};
if (s.authors !== void 0) out.authors = [...s.authors];
if (s.location !== void 0) out.location = { uri: s.location.uri };
if (s.loadedAt !== void 0) out.loadedAt = s.loadedAt;
if (s.firstPublished !== void 0) out.firstPublished = s.firstPublished;
if (s.lastUpdated !== void 0) out.lastUpdated = s.lastUpdated;
return out;
}
function canonicalLink(l) {
return { e1: l.e1, a: l.a, e2: l.e2 };
}
function canonicalProvenance(p) {
if (!p) return null;
return { actorType: p.actorType, origin: p.origin };
}
function toCanonicalBody(payload, version) {
return {
...version !== void 0 ? { v: version } : {},
facts: (payload.facts ?? []).map(canonicalFact),
links: (payload.links ?? []).map(canonicalLink),
deleteFacts: (payload.deleteFacts ?? []).map(canonicalFact),
deleteLinks: (payload.deleteLinks ?? []).map(canonicalLink),
provenance: canonicalProvenance(payload.provenance)
};
}
function canonicalOpBody(payload) {
return JSON.stringify(toCanonicalBody(payload, OP_PREIMAGE_VERSION));
}
function canonicalOpBodyFromOp(op) {
return JSON.stringify(
toCanonicalBody(
{
facts: op.facts,
links: op.links,
deleteFacts: op.deleteFacts,
deleteLinks: op.deleteLinks,
provenance: op.provenance
},
op.v
)
);
}
function canonicalPreimage(header, payload) {
return JSON.stringify({
v: OP_PREIMAGE_VERSION,
kind: header.kind,
timestamp: header.timestamp,
agentId: header.agentId,
previousHash: header.previousHash ?? null,
body: toCanonicalBody(payload, OP_PREIMAGE_VERSION)
});
}
async function sha256Hex(data) {
const buf = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(data));
return Array.from(new Uint8Array(buf)).map((b) => b.toString(16).padStart(2, "0")).join("");
}
async function hashKernelOp(header, payload) {
return `trellis:op:${await sha256Hex(canonicalPreimage(header, payload))}`;
}
async function verifyOpHash(op) {
const version = op.v;
if (version !== OP_PREIMAGE_VERSION) {
return { valid: true, legacy: true };
}
const expected = await hashKernelOp(
{
kind: op.kind,
timestamp: op.timestamp,
agentId: op.agentId,
previousHash: op.previousHash
},
{
facts: op.facts,
links: op.links,
deleteFacts: op.deleteFacts,
deleteLinks: op.deleteLinks,
provenance: op.provenance
}
);
return { valid: expected === op.hash, legacy: false };
}
var OP_PREIMAGE_VERSION, PROVENANCE;
var init_canonical_op = __esm({
"src/core/persist/canonical-op.ts"() {
OP_PREIMAGE_VERSION = 2;
PROVENANCE = {
cli: { actorType: "user", origin: "cli" },
http: { actorType: "machine", origin: "http" },
mcp: { actorType: "ai", origin: "mcp" },
sdk: { actorType: "machine", origin: "sdk" },
agent: { actorType: "ai", origin: "sdk" },
sync: { actorType: "machine", origin: "sync" },
migration: { actorType: "machine", origin: "migration" },
cron: { actorType: "machine", origin: "cron" }
};
}
});
export {
OP_PREIMAGE_VERSION,
PROVENANCE,
canonicalOpBody,
canonicalOpBodyFromOp,
hashKernelOp,
verifyOpHash,
init_canonical_op
};