@rohankumar4179/engram-sdk 0.0.0-stage → 0.2.0

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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -2
  3. package/dist/anchor.d.ts +114 -0
  4. package/dist/anchor.js +243 -0
  5. package/dist/anchor.js.map +1 -0
  6. package/dist/audit.d.ts +53 -0
  7. package/dist/audit.js +122 -0
  8. package/dist/audit.js.map +1 -0
  9. package/dist/consolidator.d.ts +62 -0
  10. package/dist/consolidator.js +141 -0
  11. package/dist/consolidator.js.map +1 -0
  12. package/dist/crypto.d.ts +26 -0
  13. package/dist/crypto.js +72 -0
  14. package/dist/crypto.js.map +1 -0
  15. package/dist/engram.d.ts +266 -0
  16. package/dist/engram.js +681 -0
  17. package/dist/engram.js.map +1 -0
  18. package/dist/env.d.ts +28 -0
  19. package/dist/env.js +81 -0
  20. package/dist/env.js.map +1 -0
  21. package/dist/index.d.ts +18 -0
  22. package/dist/index.js +19 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/inspect.d.ts +19 -0
  25. package/dist/inspect.js +61 -0
  26. package/dist/inspect.js.map +1 -0
  27. package/dist/link.d.ts +40 -0
  28. package/dist/link.js +57 -0
  29. package/dist/link.js.map +1 -0
  30. package/dist/llm.d.ts +60 -0
  31. package/dist/llm.js +188 -0
  32. package/dist/llm.js.map +1 -0
  33. package/dist/memwal-account.d.ts +39 -0
  34. package/dist/memwal-account.js +75 -0
  35. package/dist/memwal-account.js.map +1 -0
  36. package/dist/merkle.d.ts +14 -0
  37. package/dist/merkle.js +69 -0
  38. package/dist/merkle.js.map +1 -0
  39. package/dist/mind.d.ts +150 -0
  40. package/dist/mind.js +193 -0
  41. package/dist/mind.js.map +1 -0
  42. package/dist/proof.d.ts +21 -0
  43. package/dist/proof.js +46 -0
  44. package/dist/proof.js.map +1 -0
  45. package/dist/remote.d.ts +112 -0
  46. package/dist/remote.js +232 -0
  47. package/dist/remote.js.map +1 -0
  48. package/dist/store.d.ts +28 -0
  49. package/dist/store.js +72 -0
  50. package/dist/store.js.map +1 -0
  51. package/dist/tatum.d.ts +83 -0
  52. package/dist/tatum.js +148 -0
  53. package/dist/tatum.js.map +1 -0
  54. package/dist/types.d.ts +122 -0
  55. package/dist/types.js +2 -0
  56. package/dist/types.js.map +1 -0
  57. package/dist/vault.d.ts +31 -0
  58. package/dist/vault.js +45 -0
  59. package/dist/vault.js.map +1 -0
  60. package/package.json +53 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Rohan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,22 @@
1
- # Temporary Holding Version
1
+ # @rohankumar4179/engram-sdk
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Git for agent memory: episodes → beliefs (LLM), signed commits on Walrus Memory anchored on Sui,
4
+ decision receipts with Merkle proofs, `verify`, and provable `forget`.
5
+
6
+ ```ts
7
+ import { engram } from "@rohankumar4179/engram-sdk";
8
+
9
+ const mind = engram({ agent: "money-ops" }); // keys from .env (Walrus Memory, Tatum, Gemini)
10
+ const agent = mind.wrap(myAgent, { used: (out) => out.beliefIds });
11
+
12
+ mind.observe({ source: "tatum", data: tx }); // encrypted episode
13
+ await mind.sleep(); // episodes → beliefs
14
+ await mind.commit("weekly"); // Merkle root → Walrus → Sui
15
+ await mind.beliefs({ about: "rent" });
16
+ mind.at("2026-10-25"); // time travel
17
+ mind.forget("ep_…"); // provable forgetting
18
+ await mind.verify(agent.lastReceipt!.id); // proof check
19
+ ```
20
+
21
+ Audit bundles: `exportAudit(mind.core)` / `verifyAudit(bundle, { anchorer })`.
22
+ Full docs: https://github.com/rohan911438/Engram
@@ -0,0 +1,114 @@
1
+ import { SuiGrpcClient } from "@mysten/sui/grpc";
2
+ import { type TatumSui } from "./tatum.js";
3
+ import type { Anchor, Commit } from "./types.js";
4
+ export interface AnchorCheck {
5
+ ok: boolean;
6
+ detail: string;
7
+ timestampMs?: number;
8
+ }
9
+ /** Finds and re-checks the on-chain record of a stored manifest. */
10
+ export interface Anchorer {
11
+ /** Locates the Sui record for a Walrus blob. Null if it isn't visible yet. */
12
+ find(blobId: string): Promise<Anchor | null>;
13
+ /** Independently re-reads the chain to confirm an anchor. */
14
+ check(anchor: Anchor, blobId: string, commit: Commit): Promise<AnchorCheck>;
15
+ /** Anchorers that write to chain themselves (option B) implement this instead of relying on `find`. */
16
+ publish?(commit: Commit): Promise<Anchor | null>;
17
+ }
18
+ /**
19
+ * Option A anchoring: every Walrus Memory write registers a Walrus `Blob`
20
+ * object on Sui, owned by the account owner. The commit manifest's blob is
21
+ * that anchor — its certifying transaction fixes the time on-chain.
22
+ * All reads go through Tatum's Sui RPC.
23
+ */
24
+ export declare class WalrusBlobAnchorer implements Anchorer {
25
+ readonly tatum: TatumSui;
26
+ private memwalAccountId;
27
+ private opts;
28
+ private owner?;
29
+ constructor(tatum: TatumSui, memwalAccountId: string, opts?: {
30
+ retries?: number;
31
+ delayMs?: number; /** Skip "owned by this Walrus Memory account" (for someone else's agent). */
32
+ anyOwner?: boolean;
33
+ });
34
+ ownerAddress(): Promise<string>;
35
+ find(blobId: string): Promise<Anchor | null>;
36
+ check(anchor: Anchor, blobId: string, commit: Commit): Promise<AnchorCheck>;
37
+ }
38
+ /** Offline anchorer for tests: pretends every blob is on-chain. */
39
+ export declare class FakeAnchorer implements Anchorer {
40
+ readonly anchored: Map<string, Anchor>;
41
+ find(blobId: string): Promise<Anchor | null>;
42
+ check(anchor: Anchor, blobId: string): Promise<AnchorCheck>;
43
+ }
44
+ export type SuiNetwork = "mainnet" | "testnet";
45
+ export interface MoveAnchorerOptions {
46
+ /** Published `engram_anchor` package ID. */
47
+ packageId: string;
48
+ /** Wallet that pays gas (BIP-39 phrase). */
49
+ mnemonic: string;
50
+ /** Default mainnet. Mainnet sends and re-reads through Tatum (gRPC); testnet uses the public Sui gRPC node. */
51
+ network?: SuiNetwork;
52
+ /** Required on mainnet. */
53
+ tatum?: TatumSui;
54
+ tatumApiKey?: string;
55
+ /** Checks older commits that were anchored as Walrus Blobs. */
56
+ blobAnchorer?: Anchorer;
57
+ }
58
+ /** The fields of one `Anchored` event, hex-encoded. */
59
+ interface AnchoredRead {
60
+ checkpoint?: string;
61
+ timestampMs?: number;
62
+ event?: {
63
+ commitId: string;
64
+ merkleRoot: string;
65
+ agentPubKey: string;
66
+ };
67
+ }
68
+ /** Reads the `Anchored` event of a transaction from some Sui endpoint. */
69
+ export interface AnchoredEventReader {
70
+ readAnchored(digest: string, eventType: string): Promise<AnchoredRead>;
71
+ }
72
+ export declare function suiGrpc(network: SuiNetwork): SuiGrpcClient;
73
+ /** Reads anchors over gRPC: a public Sui full node by network name, or any client (e.g. Tatum's). */
74
+ export declare class GrpcEventReader implements AnchoredEventReader {
75
+ private client;
76
+ constructor(source: SuiNetwork | SuiGrpcClient);
77
+ readAnchored(digest: string, eventType: string): Promise<AnchoredRead>;
78
+ }
79
+ /** Reads anchors through Tatum's Sui Mainnet gRPC gateway. */
80
+ export declare function tatumEventReader(tatum: TatumSui): AnchoredEventReader;
81
+ /**
82
+ * Option B anchoring: each commit calls `engram_anchor::anchor::anchor`, which
83
+ * emits an `Anchored` event with the commit ID and Merkle root in the clear.
84
+ * Mainnet transactions are sent and re-read through Tatum's Sui gRPC gateway.
85
+ */
86
+ export declare class MoveAnchorer implements Anchorer {
87
+ private opts;
88
+ private keypair;
89
+ readonly network: SuiNetwork;
90
+ private reader;
91
+ constructor(opts: MoveAnchorerOptions);
92
+ get address(): string;
93
+ get eventType(): string;
94
+ private buildTx;
95
+ private send;
96
+ publish(c: Commit): Promise<Anchor | null>;
97
+ find(): Promise<Anchor | null>;
98
+ check(anchor: Anchor, blobId: string, c: Commit): Promise<AnchorCheck>;
99
+ }
100
+ /** Re-reads an `Anchored` event and compares it with the commit. Accepts a Tatum client (mainnet) or any reader. */
101
+ export declare function checkMoveAnchor(source: TatumSui | AnchoredEventReader, anchor: Anchor, c: Commit): Promise<AnchorCheck>;
102
+ /**
103
+ * Checks anchors of an agent that isn't ours (e.g. one linked to the web app):
104
+ * Move-event anchors on any network, and Walrus Blob anchors without the
105
+ * "owned by our Walrus Memory account" rule.
106
+ */
107
+ export declare class ForeignAnchorChecker implements Anchorer {
108
+ private tatum?;
109
+ private blob?;
110
+ constructor(tatum?: TatumSui | undefined);
111
+ find(): Promise<Anchor | null>;
112
+ check(anchor: Anchor, blobId: string, c: Commit): Promise<AnchorCheck>;
113
+ }
114
+ export {};
package/dist/anchor.js ADDED
@@ -0,0 +1,243 @@
1
+ import { Transaction } from "@mysten/sui/transactions";
2
+ import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519";
3
+ import { SuiGrpcClient } from "@mysten/sui/grpc";
4
+ import { bcs } from "@mysten/sui/bcs";
5
+ import { hexToBytes } from "./crypto.js";
6
+ import { blobIdFromU256 } from "./tatum.js";
7
+ /**
8
+ * Option A anchoring: every Walrus Memory write registers a Walrus `Blob`
9
+ * object on Sui, owned by the account owner. The commit manifest's blob is
10
+ * that anchor — its certifying transaction fixes the time on-chain.
11
+ * All reads go through Tatum's Sui RPC.
12
+ */
13
+ export class WalrusBlobAnchorer {
14
+ tatum;
15
+ memwalAccountId;
16
+ opts;
17
+ owner;
18
+ constructor(tatum, memwalAccountId, opts = {}) {
19
+ this.tatum = tatum;
20
+ this.memwalAccountId = memwalAccountId;
21
+ this.opts = opts;
22
+ }
23
+ async ownerAddress() {
24
+ this.owner ??= await this.tatum.memwalAccountOwner(this.memwalAccountId);
25
+ return this.owner;
26
+ }
27
+ async find(blobId) {
28
+ const owner = await this.ownerAddress();
29
+ const retries = this.opts.retries ?? 4;
30
+ for (let attempt = 0; attempt <= retries; attempt++) {
31
+ for await (const b of this.tatum.ownedBlobs(owner)) {
32
+ if (b.blobId !== blobId)
33
+ continue;
34
+ const tx = await this.tatum.getTransaction(b.previousTransaction);
35
+ return { method: "walrus-blob", objectId: b.objectId, txDigest: tx.digest, checkpoint: tx.checkpoint, timestampMs: tx.timestampMs };
36
+ }
37
+ if (attempt < retries)
38
+ await new Promise((r) => setTimeout(r, this.opts.delayMs ?? 4000));
39
+ }
40
+ return null;
41
+ }
42
+ async check(anchor, blobId, commit) {
43
+ if (anchor.method === "move-event")
44
+ return checkMoveAnchor(anchor.network === "testnet" ? new GrpcEventReader("testnet") : this.tatum, anchor, commit);
45
+ const obj = await this.tatum.getObject(anchor.objectId);
46
+ if (!obj)
47
+ return { ok: false, detail: `Sui object ${anchor.objectId} not found` };
48
+ const fields = obj.content?.fields;
49
+ if (!obj.type?.endsWith("::blob::Blob") || !fields?.blob_id)
50
+ return { ok: false, detail: `object is not a Walrus Blob (${obj.type})` };
51
+ if (blobIdFromU256(fields.blob_id) !== blobId)
52
+ return { ok: false, detail: "on-chain blob_id does not match the manifest blob" };
53
+ if (fields.certified_epoch == null)
54
+ return { ok: false, detail: "blob is registered but not certified" };
55
+ const owner = obj.owner?.AddressOwner;
56
+ if (owner && !this.opts.anyOwner && owner !== (await this.ownerAddress()))
57
+ return { ok: false, detail: `blob owned by ${owner}, not the Walrus Memory account owner` };
58
+ const tx = await this.tatum.getTransaction(anchor.txDigest);
59
+ if (!tx.checkpoint)
60
+ return { ok: false, detail: `transaction ${anchor.txDigest} not found` };
61
+ if (anchor.checkpoint && tx.checkpoint !== anchor.checkpoint)
62
+ return { ok: false, detail: `checkpoint mismatch (${tx.checkpoint} vs ${anchor.checkpoint})` };
63
+ return { ok: true, detail: `Walrus Blob ${short(anchor.objectId)} certified, tx ${short(tx.digest)} in checkpoint ${tx.checkpoint}`, timestampMs: tx.timestampMs };
64
+ }
65
+ }
66
+ const short = (s) => (s.length > 14 ? `${s.slice(0, 8)}…${s.slice(-4)}` : s);
67
+ /** Offline anchorer for tests: pretends every blob is on-chain. */
68
+ export class FakeAnchorer {
69
+ anchored = new Map();
70
+ async find(blobId) {
71
+ let a = this.anchored.get(blobId);
72
+ if (!a) {
73
+ a = { method: "walrus-blob", objectId: `0xobj_${blobId.slice(0, 8)}`, txDigest: `tx_${blobId.slice(0, 8)}`, checkpoint: String(this.anchored.size + 1), timestampMs: Date.now() };
74
+ this.anchored.set(blobId, a);
75
+ }
76
+ return a;
77
+ }
78
+ async check(anchor, blobId) {
79
+ const a = this.anchored.get(blobId);
80
+ return a && a.txDigest === anchor.txDigest && a.objectId === anchor.objectId
81
+ ? { ok: true, detail: `fake anchor ${a.txDigest}`, timestampMs: a.timestampMs }
82
+ : { ok: false, detail: "no such anchor" };
83
+ }
84
+ }
85
+ const AnchoredBcs = bcs.struct("Anchored", {
86
+ sender: bcs.Address,
87
+ agent_pubkey: bcs.vector(bcs.u8()),
88
+ commit_id: bcs.vector(bcs.u8()),
89
+ merkle_root: bcs.vector(bcs.u8()),
90
+ parent: bcs.vector(bcs.u8()),
91
+ manifest_blob: bcs.vector(bcs.u8()),
92
+ timestamp_ms: bcs.u64(),
93
+ });
94
+ const toHex = (b) => Buffer.from([...b]).toString("hex");
95
+ const grpcClients = new Map();
96
+ export function suiGrpc(network) {
97
+ let c = grpcClients.get(network);
98
+ if (!c)
99
+ grpcClients.set(network, (c = new SuiGrpcClient({ network, baseUrl: `https://fullnode.${network}.sui.io:443` })));
100
+ return c;
101
+ }
102
+ /** Reads anchors over gRPC: a public Sui full node by network name, or any client (e.g. Tatum's). */
103
+ export class GrpcEventReader {
104
+ client;
105
+ constructor(source) {
106
+ this.client = typeof source === "string" ? suiGrpc(source) : source;
107
+ }
108
+ async readAnchored(digest, eventType) {
109
+ const res = await this.client.getTransaction({ digest, include: { events: true } });
110
+ const t = res.Transaction ?? res.FailedTransaction;
111
+ const ev = t?.events?.find((e) => e.eventType === eventType);
112
+ const out = { checkpoint: t?.checkpoint ?? undefined, timestampMs: t?.timestampMs ?? undefined };
113
+ if (ev && res.$kind === "Transaction") {
114
+ const p = AnchoredBcs.parse(ev.bcs);
115
+ out.event = { commitId: toHex(p.commit_id), merkleRoot: toHex(p.merkle_root), agentPubKey: toHex(p.agent_pubkey) };
116
+ }
117
+ return out;
118
+ }
119
+ }
120
+ /** Reads anchors through Tatum's Sui Mainnet gRPC gateway. */
121
+ export function tatumEventReader(tatum) {
122
+ return new GrpcEventReader(tatum.client);
123
+ }
124
+ /**
125
+ * Option B anchoring: each commit calls `engram_anchor::anchor::anchor`, which
126
+ * emits an `Anchored` event with the commit ID and Merkle root in the clear.
127
+ * Mainnet transactions are sent and re-read through Tatum's Sui gRPC gateway.
128
+ */
129
+ export class MoveAnchorer {
130
+ opts;
131
+ keypair;
132
+ network;
133
+ reader;
134
+ constructor(opts) {
135
+ this.opts = opts;
136
+ this.keypair = Ed25519Keypair.deriveKeypair(opts.mnemonic.trim());
137
+ this.network = opts.network ?? "mainnet";
138
+ if (this.network === "mainnet" && !opts.tatum)
139
+ throw new Error("mainnet anchoring needs a Tatum API key");
140
+ this.reader = this.network === "mainnet" ? tatumEventReader(opts.tatum) : new GrpcEventReader(this.network);
141
+ }
142
+ get address() {
143
+ return this.keypair.toSuiAddress();
144
+ }
145
+ get eventType() {
146
+ return `${this.opts.packageId}::anchor::Anchored`;
147
+ }
148
+ buildTx(c) {
149
+ const tx = new Transaction();
150
+ tx.moveCall({
151
+ target: `${this.opts.packageId}::anchor::anchor`,
152
+ arguments: [
153
+ tx.pure.vector("u8", hexToBytes(c.manifest.agentPubKey)),
154
+ tx.pure.vector("u8", hexToBytes(c.id)),
155
+ tx.pure.vector("u8", hexToBytes(c.manifest.merkleRoot)),
156
+ tx.pure.vector("u8", c.manifest.parent ? hexToBytes(c.manifest.parent) : new Uint8Array()),
157
+ tx.pure.vector("u8", new TextEncoder().encode(c.manifestBlobId ?? "")),
158
+ tx.object.clock(),
159
+ ],
160
+ });
161
+ return tx;
162
+ }
163
+ async send(c) {
164
+ const client = this.network === "mainnet" ? this.opts.tatum.client : suiGrpc(this.network);
165
+ const res = await client.signAndExecuteTransaction({ transaction: this.buildTx(c), signer: this.keypair });
166
+ if (res.$kind !== "Transaction")
167
+ throw new Error(`anchor transaction failed: ${JSON.stringify(res.FailedTransaction?.status)}`);
168
+ await client.waitForTransaction({ digest: res.Transaction.digest });
169
+ return res.Transaction.digest;
170
+ }
171
+ async publish(c) {
172
+ const digest = await this.send(c);
173
+ // The checkpoint can lag execution by a moment; retry briefly.
174
+ let t = {};
175
+ for (let i = 0; i < 6 && !t.checkpoint; i++) {
176
+ t = await this.reader.readAnchored(digest, this.eventType);
177
+ if (!t.checkpoint)
178
+ await new Promise((r) => setTimeout(r, 1500));
179
+ }
180
+ const anchor = { method: "move-event", objectId: this.opts.packageId, txDigest: digest, checkpoint: t.checkpoint, timestampMs: t.timestampMs };
181
+ if (this.network !== "mainnet")
182
+ anchor.network = this.network;
183
+ return anchor;
184
+ }
185
+ async find() {
186
+ return null; // option B anchors are published, not discovered
187
+ }
188
+ async check(anchor, blobId, c) {
189
+ if (anchor.method === "walrus-blob") {
190
+ return this.opts.blobAnchorer ? this.opts.blobAnchorer.check(anchor, blobId, c) : { ok: false, detail: "Walrus Blob anchor but no Walrus Memory account configured" };
191
+ }
192
+ const net = anchor.network ?? "mainnet";
193
+ if (net === this.network)
194
+ return checkMoveAnchor(this.reader, anchor, c);
195
+ if (net === "mainnet" && !this.opts.tatum)
196
+ return { ok: false, detail: "mainnet anchor but no Tatum key configured" };
197
+ return checkMoveAnchor(net === "mainnet" ? this.opts.tatum : new GrpcEventReader(net), anchor, c);
198
+ }
199
+ }
200
+ /** Re-reads an `Anchored` event and compares it with the commit. Accepts a Tatum client (mainnet) or any reader. */
201
+ export async function checkMoveAnchor(source, anchor, c) {
202
+ const reader = "readAnchored" in source ? source : tatumEventReader(source);
203
+ const r = await reader.readAnchored(anchor.txDigest, `${anchor.objectId}::anchor::Anchored`);
204
+ const net = anchor.network && anchor.network !== "mainnet" ? ` (${anchor.network})` : "";
205
+ if (!r.event)
206
+ return { ok: false, detail: `no Anchored event in tx ${anchor.txDigest}${net}` };
207
+ if (r.event.commitId !== c.id)
208
+ return { ok: false, detail: "event commit_id differs from this commit" };
209
+ if (r.event.merkleRoot !== c.manifest.merkleRoot)
210
+ return { ok: false, detail: "event merkle_root differs from this commit" };
211
+ if (r.event.agentPubKey !== c.manifest.agentPubKey)
212
+ return { ok: false, detail: "event names a different agent key" };
213
+ return { ok: true, detail: `Anchored event: root ${c.manifest.merkleRoot.slice(0, 10)}… public in checkpoint ${r.checkpoint}${net}`, timestampMs: r.timestampMs };
214
+ }
215
+ /**
216
+ * Checks anchors of an agent that isn't ours (e.g. one linked to the web app):
217
+ * Move-event anchors on any network, and Walrus Blob anchors without the
218
+ * "owned by our Walrus Memory account" rule.
219
+ */
220
+ export class ForeignAnchorChecker {
221
+ tatum;
222
+ blob;
223
+ constructor(tatum) {
224
+ this.tatum = tatum;
225
+ if (tatum)
226
+ this.blob = new WalrusBlobAnchorer(tatum, "", { anyOwner: true });
227
+ }
228
+ async find() {
229
+ return null;
230
+ }
231
+ async check(anchor, blobId, c) {
232
+ if (anchor.method === "move-event") {
233
+ const net = anchor.network ?? "mainnet";
234
+ if (net === "mainnet" && !this.tatum)
235
+ return { ok: true, detail: "mainnet anchor not checked (no Tatum key)" };
236
+ return checkMoveAnchor(net === "mainnet" ? this.tatum : new GrpcEventReader(net), anchor, c);
237
+ }
238
+ if (!this.blob)
239
+ return { ok: true, detail: "Walrus Blob anchor not checked (no Tatum key)" };
240
+ return this.blob.check(anchor, blobId, c);
241
+ }
242
+ }
243
+ //# sourceMappingURL=anchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.js","sourceRoot":"","sources":["../src/anchor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { Anchorer } from "./anchor.js";
2
+ import { type Engram } from "./engram.js";
3
+ import type { Belief, Commit, Receipt } from "./types.js";
4
+ /**
5
+ * A self-contained audit file: the agent's commit history, every belief
6
+ * version those commits reference, and its decision receipts. Anyone can
7
+ * re-check it without the agent's repo (`verifyAudit`). Raw episodes are not
8
+ * included — they stay encrypted; beliefs cite them by ID and Walrus blob.
9
+ */
10
+ export interface AuditBundle {
11
+ engram: "audit";
12
+ v: 1;
13
+ agent: string;
14
+ agentPubKey: string;
15
+ exportedAt: number;
16
+ head: string | null;
17
+ /** Newest first, back to the first commit. */
18
+ commits: Commit[];
19
+ beliefs: Belief[];
20
+ receipts: Receipt[];
21
+ }
22
+ export declare function exportAudit(e: Engram, opts?: {
23
+ receipts?: boolean;
24
+ }): AuditBundle;
25
+ export interface AuditCheck {
26
+ subject: string;
27
+ ok: boolean;
28
+ detail: string;
29
+ skipped?: boolean;
30
+ }
31
+ export interface AuditReport {
32
+ ok: boolean;
33
+ checks: AuditCheck[];
34
+ summary: {
35
+ commits: number;
36
+ receipts: number;
37
+ anchored: number;
38
+ };
39
+ }
40
+ /**
41
+ * Re-checks an audit bundle from scratch: each commit's ID, signature,
42
+ * Merkle root (rebuilt from the included beliefs) and parent link; each
43
+ * receipt's signature and Merkle proofs. With an `anchorer`, also re-reads
44
+ * every commit's anchor on Sui.
45
+ */
46
+ export declare function verifyAudit(bundle: AuditBundle, opts?: {
47
+ anchorer?: Anchorer;
48
+ }): Promise<AuditReport>;
49
+ /**
50
+ * Rebuilds a read-only repo from a (verified) audit bundle at `dir/.engram`,
51
+ * replacing whatever was there. Open it with `Engram.open({ dir, readOnly: true, … })`.
52
+ */
53
+ export declare function importAudit(bundle: AuditBundle, dir: string): void;
package/dist/audit.js ADDED
@@ -0,0 +1,122 @@
1
+ import { canonical, verifySignature } from "./crypto.js";
2
+ import { beliefKey } from "./engram.js";
3
+ import { buildCommitTree, commitId, verifyBeliefProof, verifyManifestSignature } from "./proof.js";
4
+ import { join } from "node:path";
5
+ import { rmSync } from "node:fs";
6
+ import { LocalStore } from "./store.js";
7
+ export function exportAudit(e, opts = {}) {
8
+ const head = e.head();
9
+ const commits = head ? e.log() : [];
10
+ const keys = new Set(commits.flatMap((c) => c.manifest.beliefs));
11
+ const beliefs = [...keys].map((k) => e.belief(k)).filter((b) => !!b);
12
+ return {
13
+ engram: "audit",
14
+ v: 1,
15
+ agent: e.agent,
16
+ agentPubKey: e.publicKey,
17
+ exportedAt: Date.now(),
18
+ head,
19
+ commits,
20
+ beliefs,
21
+ receipts: opts.receipts === false ? [] : e.receipts().filter((r) => commits.some((c) => c.id === r.commitId)),
22
+ };
23
+ }
24
+ /**
25
+ * Re-checks an audit bundle from scratch: each commit's ID, signature,
26
+ * Merkle root (rebuilt from the included beliefs) and parent link; each
27
+ * receipt's signature and Merkle proofs. With an `anchorer`, also re-reads
28
+ * every commit's anchor on Sui.
29
+ */
30
+ export async function verifyAudit(bundle, opts = {}) {
31
+ const checks = [];
32
+ const add = (subject, ok, detail, skipped = false) => checks.push({ subject, ok, detail, skipped });
33
+ if (bundle.engram !== "audit" || bundle.v !== 1)
34
+ throw new Error("not an Engram audit bundle (v1)");
35
+ const beliefs = new Map(bundle.beliefs.map((b) => [beliefKey(b), b]));
36
+ const commits = new Map(bundle.commits.map((c) => [c.id, c]));
37
+ let anchored = 0;
38
+ for (const c of bundle.commits) {
39
+ const m = c.manifest;
40
+ const s = `commit ${c.id.slice(0, 8)}`;
41
+ const problems = [];
42
+ if (commitId(m) !== c.id)
43
+ problems.push("ID is not the hash of its manifest");
44
+ if (m.agentPubKey !== bundle.agentPubKey)
45
+ problems.push("signed by a different agent key");
46
+ if (!verifyManifestSignature(m, c.signature))
47
+ problems.push("bad signature");
48
+ const missing = m.beliefs.filter((k) => !beliefs.has(k));
49
+ if (missing.length)
50
+ problems.push(`missing beliefs ${missing.join(", ")}`);
51
+ else if (buildCommitTree(m.beliefs.map((k) => beliefs.get(k)), m.tombstones).tree.root !== m.merkleRoot)
52
+ problems.push("beliefs don't rebuild the Merkle root");
53
+ if (m.parent && !commits.has(m.parent))
54
+ problems.push(`parent ${m.parent.slice(0, 8)} not in the bundle`);
55
+ else if (m.parent && commits.get(m.parent).manifest.ts > m.ts)
56
+ problems.push("parent is newer than the commit");
57
+ add(s, problems.length === 0, problems.length ? problems.join("; ") : `signed, ${m.beliefs.length} beliefs + ${m.tombstones.length} tombstones → root ${m.merkleRoot.slice(0, 10)}…`);
58
+ if (!opts.anchorer)
59
+ continue;
60
+ if (!c.anchor || !c.manifestBlobId) {
61
+ add(`${s} anchor`, false, "no Sui anchor");
62
+ continue;
63
+ }
64
+ try {
65
+ const r = await opts.anchorer.check(c.anchor, c.manifestBlobId, c);
66
+ if (r.ok)
67
+ anchored++;
68
+ add(`${s} anchor`, r.ok, r.detail);
69
+ }
70
+ catch (err) {
71
+ add(`${s} anchor`, true, `could not reach Sui: ${err.message}`, true);
72
+ }
73
+ }
74
+ if (bundle.head && bundle.commits[0]?.id !== bundle.head)
75
+ add("head", false, "the newest commit is not the bundle's head");
76
+ for (const r of bundle.receipts) {
77
+ const s = `receipt ${r.id}`;
78
+ const { signature, blobId: _b, ...body } = r;
79
+ const c = commits.get(r.commitId);
80
+ const problems = [];
81
+ if (r.agentPubKey !== bundle.agentPubKey || !verifySignature(canonical(body), signature, r.agentPubKey))
82
+ problems.push("bad signature");
83
+ if (!c)
84
+ problems.push(`points at commit ${r.commitId.slice(0, 8)}, not in the bundle`);
85
+ else {
86
+ const bad = r.beliefs.filter((k) => !beliefs.has(k) || !r.proofs[k] || !verifyBeliefProof(beliefs.get(k), r.proofs[k], c.manifest.merkleRoot));
87
+ if (bad.length)
88
+ problems.push(`invalid proof for ${bad.join(", ")}`);
89
+ if (r.ts < c.manifest.ts)
90
+ problems.push("decided before its commit existed");
91
+ }
92
+ add(s, problems.length === 0, problems.length ? problems.join("; ") : `"${r.action.slice(0, 60)}" — ${r.beliefs.length} belief(s) proven in ${r.commitId.slice(0, 8)}`);
93
+ }
94
+ return { ok: checks.every((x) => x.ok), checks, summary: { commits: bundle.commits.length, receipts: bundle.receipts.length, anchored } };
95
+ }
96
+ /**
97
+ * Rebuilds a read-only repo from a (verified) audit bundle at `dir/.engram`,
98
+ * replacing whatever was there. Open it with `Engram.open({ dir, readOnly: true, … })`.
99
+ */
100
+ export function importAudit(bundle, dir) {
101
+ const root = join(dir, ".engram");
102
+ rmSync(root, { recursive: true, force: true });
103
+ const store = new LocalStore(root);
104
+ const ns = (k) => `engram-${bundle.agent}-${k}`;
105
+ const first = bundle.commits.at(-1);
106
+ store.file("config.json").write({
107
+ v: 1,
108
+ agent: bundle.agent,
109
+ agentPubKey: bundle.agentPubKey,
110
+ createdAt: first?.manifest.ts ?? bundle.exportedAt,
111
+ namespaces: { episodes: ns("episodes"), beliefs: ns("beliefs"), commits: ns("commits"), receipts: ns("receipts") },
112
+ });
113
+ for (const c of bundle.commits)
114
+ store.put("commits", c.id, c);
115
+ for (const b of bundle.beliefs)
116
+ store.put("beliefs", beliefKey(b), b);
117
+ for (const r of bundle.receipts)
118
+ store.put("receipts", r.id, r);
119
+ if (bundle.head)
120
+ store.writeText("HEAD", bundle.head);
121
+ }
122
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}