@rohankumar4179/engram-sdk 0.0.0-stage → 0.1.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 (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -2
  3. package/dist/anchor.d.ts +101 -0
  4. package/dist/anchor.js +215 -0
  5. package/dist/anchor.js.map +1 -0
  6. package/dist/audit.d.ts +48 -0
  7. package/dist/audit.js +93 -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 +253 -0
  16. package/dist/engram.js +660 -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 +17 -0
  22. package/dist/index.js +18 -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/llm.d.ts +60 -0
  28. package/dist/llm.js +188 -0
  29. package/dist/llm.js.map +1 -0
  30. package/dist/memwal-account.d.ts +39 -0
  31. package/dist/memwal-account.js +75 -0
  32. package/dist/memwal-account.js.map +1 -0
  33. package/dist/merkle.d.ts +14 -0
  34. package/dist/merkle.js +69 -0
  35. package/dist/merkle.js.map +1 -0
  36. package/dist/mind.d.ts +130 -0
  37. package/dist/mind.js +156 -0
  38. package/dist/mind.js.map +1 -0
  39. package/dist/proof.d.ts +21 -0
  40. package/dist/proof.js +46 -0
  41. package/dist/proof.js.map +1 -0
  42. package/dist/remote.d.ts +112 -0
  43. package/dist/remote.js +232 -0
  44. package/dist/remote.js.map +1 -0
  45. package/dist/store.d.ts +28 -0
  46. package/dist/store.js +72 -0
  47. package/dist/store.js.map +1 -0
  48. package/dist/tatum.d.ts +83 -0
  49. package/dist/tatum.js +148 -0
  50. package/dist/tatum.js.map +1 -0
  51. package/dist/types.d.ts +122 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/vault.d.ts +31 -0
  55. package/dist/vault.js +45 -0
  56. package/dist/vault.js.map +1 -0
  57. package/package.json +53 -3
@@ -0,0 +1,75 @@
1
+ import { bcs } from "@mysten/sui/bcs";
2
+ import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519";
3
+ import { Transaction } from "@mysten/sui/transactions";
4
+ import { normalizeSuiAddress } from "@mysten/sui/utils";
5
+ import { MEMWAL_MAINNET } from "./remote.js";
6
+ /** A fresh Ed25519 delegate key; `secret` is the suiprivkey1… form. */
7
+ export function newDelegateKey() {
8
+ const kp = new Ed25519Keypair();
9
+ return { secret: kp.getSecretKey(), publicKey: Buffer.from(kp.getPublicKey().toRawBytes()).toString("hex"), suiAddress: kp.toSuiAddress() };
10
+ }
11
+ export function delegateFromSecret(secret) {
12
+ const kp = Ed25519Keypair.fromSecretKey(secret);
13
+ return { publicKey: Buffer.from(kp.getPublicKey().toRawBytes()).toString("hex"), suiAddress: kp.toSuiAddress() };
14
+ }
15
+ /** Finds the Walrus Memory account an address owns (each address can own one). */
16
+ export async function findMemwalAccount(client, owner, ids = MEMWAL_MAINNET) {
17
+ const { object } = await client.getObject({ objectId: ids.registryId, include: { json: true } });
18
+ const tableId = object.json?.accounts?.id;
19
+ if (!tableId)
20
+ throw new Error("Walrus Memory registry has no accounts table");
21
+ try {
22
+ const f = await client.getDynamicField({ parentId: tableId, name: { type: "address", bcs: bcs.Address.serialize(normalizeSuiAddress(owner)).toBytes() } });
23
+ const value = f.dynamicField?.value;
24
+ if (!value)
25
+ return null;
26
+ // Table<address, ID>: the value is the 32-byte account ID.
27
+ return normalizeSuiAddress(Buffer.from(value.bcs).toString("hex"));
28
+ }
29
+ catch (err) {
30
+ if (/not ?found|does not exist/i.test(String(err.message)))
31
+ return null;
32
+ throw err;
33
+ }
34
+ }
35
+ export async function readMemwalAccount(client, accountId) {
36
+ const { object } = await client.getObject({ objectId: accountId, include: { json: true } });
37
+ const j = object.json;
38
+ if (!j?.owner)
39
+ throw new Error(`${accountId} is not a Walrus Memory account`);
40
+ return {
41
+ accountId,
42
+ owner: normalizeSuiAddress(j.owner),
43
+ delegates: (j.delegate_keys ?? []).map((d) => ({
44
+ publicKey: /^[0-9a-f]+$/i.test(d.public_key) ? d.public_key.toLowerCase() : Buffer.from(d.public_key, "base64").toString("hex"),
45
+ suiAddress: normalizeSuiAddress(d.sui_address),
46
+ label: d.label ?? "",
47
+ })),
48
+ };
49
+ }
50
+ /** Unsigned `create_account` transaction for `sender`, as base64 bytes ready for a wallet. */
51
+ export async function buildCreateAccountTx(client, sender, ids = MEMWAL_MAINNET) {
52
+ const tx = new Transaction();
53
+ tx.setSender(sender);
54
+ tx.moveCall({ target: `${ids.packageId}::account::create_account`, arguments: [tx.object(ids.registryId), tx.object.clock()] });
55
+ return Buffer.from(await tx.build({ client })).toString("base64");
56
+ }
57
+ /** Unsigned `add_delegate_key` transaction (owner adds the server's key). */
58
+ export async function buildAddDelegateTx(client, sender, accountId, publicKeyHex, label, ids = MEMWAL_MAINNET) {
59
+ const tx = new Transaction();
60
+ tx.setSender(sender);
61
+ tx.moveCall({
62
+ target: `${ids.packageId}::account::add_delegate_key`,
63
+ arguments: [tx.object(accountId), tx.object(ids.registryId), tx.pure.vector("u8", Buffer.from(publicKeyHex, "hex")), tx.pure.string(label), tx.object.clock()],
64
+ });
65
+ return Buffer.from(await tx.build({ client })).toString("base64");
66
+ }
67
+ /** Submits wallet-signed bytes and waits for them to land. Returns the digest. */
68
+ export async function executeSigned(client, bytesBase64, signature) {
69
+ const res = await client.executeTransaction({ transaction: Buffer.from(bytesBase64, "base64"), signatures: [signature] });
70
+ if (res.$kind !== "Transaction")
71
+ throw new Error(`transaction failed: ${JSON.stringify(res.FailedTransaction?.status)}`);
72
+ await client.waitForTransaction({ digest: res.Transaction.digest });
73
+ return res.Transaction.digest;
74
+ }
75
+ //# sourceMappingURL=memwal-account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memwal-account.js","sourceRoot":"","sources":["../src/memwal-account.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { MerkleProofStep } from "./types.js";
2
+ /** Root of an empty tree. */
3
+ export declare const EMPTY_ROOT: string;
4
+ /**
5
+ * Binary Merkle tree over hex leaf values, in the given order.
6
+ * An odd node at the end of a level is carried up unchanged.
7
+ */
8
+ export declare class MerkleTree {
9
+ private levels;
10
+ constructor(leaves: string[]);
11
+ get root(): string;
12
+ proof(index: number): MerkleProofStep[];
13
+ }
14
+ export declare function verifyProof(leafHex: string, proof: MerkleProofStep[], rootHex: string): boolean;
package/dist/merkle.js ADDED
@@ -0,0 +1,69 @@
1
+ import { bytesToHex, hexToBytes, sha256Bytes } from "./crypto.js";
2
+ // Domain separation so a leaf can never be passed off as an inner node.
3
+ const LEAF = 0x00;
4
+ const NODE = 0x01;
5
+ function hashLeaf(leafHex) {
6
+ return bytesToHex(sha256Bytes(concat([LEAF], hexToBytes(leafHex))));
7
+ }
8
+ function hashNode(leftHex, rightHex) {
9
+ return bytesToHex(sha256Bytes(concat([NODE], hexToBytes(leftHex), hexToBytes(rightHex))));
10
+ }
11
+ function concat(prefix, ...parts) {
12
+ const out = new Uint8Array(prefix.length + parts.reduce((n, p) => n + p.length, 0));
13
+ out.set(prefix, 0);
14
+ let o = prefix.length;
15
+ for (const p of parts) {
16
+ out.set(p, o);
17
+ o += p.length;
18
+ }
19
+ return out;
20
+ }
21
+ /** Root of an empty tree. */
22
+ export const EMPTY_ROOT = bytesToHex(sha256Bytes(new Uint8Array([NODE])));
23
+ /**
24
+ * Binary Merkle tree over hex leaf values, in the given order.
25
+ * An odd node at the end of a level is carried up unchanged.
26
+ */
27
+ export class MerkleTree {
28
+ levels;
29
+ constructor(leaves) {
30
+ let level = leaves.map(hashLeaf);
31
+ this.levels = [level];
32
+ while (level.length > 1) {
33
+ const next = [];
34
+ for (let i = 0; i < level.length; i += 2) {
35
+ const l = level[i];
36
+ const r = level[i + 1];
37
+ next.push(r === undefined ? l : hashNode(l, r));
38
+ }
39
+ this.levels.push(next);
40
+ level = next;
41
+ }
42
+ }
43
+ get root() {
44
+ const top = this.levels[this.levels.length - 1];
45
+ return top[0] ?? EMPTY_ROOT;
46
+ }
47
+ proof(index) {
48
+ if (index < 0 || index >= this.levels[0].length)
49
+ throw new Error(`leaf ${index} out of range`);
50
+ const steps = [];
51
+ let i = index;
52
+ for (let d = 0; d < this.levels.length - 1; d++) {
53
+ const level = this.levels[d];
54
+ const isRight = i % 2 === 1;
55
+ const sib = isRight ? level[i - 1] : level[i + 1];
56
+ if (sib !== undefined)
57
+ steps.push({ hash: sib, left: isRight });
58
+ i = Math.floor(i / 2);
59
+ }
60
+ return steps;
61
+ }
62
+ }
63
+ export function verifyProof(leafHex, proof, rootHex) {
64
+ let h = hashLeaf(leafHex);
65
+ for (const s of proof)
66
+ h = s.left ? hashNode(s.hash, h) : hashNode(h, s.hash);
67
+ return h === rootHex;
68
+ }
69
+ //# sourceMappingURL=merkle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkle.js","sourceRoot":"","sources":["../src/merkle.ts"],"names":[],"mappings":"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"}
package/dist/mind.d.ts ADDED
@@ -0,0 +1,130 @@
1
+ import { type Anchorer, type SuiNetwork } from "./anchor.js";
2
+ import { Engram, type ForgetResult, type ObserveInput, type SleepReport, type VerifyReport } from "./engram.js";
3
+ import { type LLM } from "./llm.js";
4
+ import { type RemoteMemory } from "./remote.js";
5
+ import type { Belief, Commit, Episode, Receipt } from "./types.js";
6
+ /**
7
+ * Settings for `engram()`. Anything left out is read from the environment
8
+ * (`.env`: MEMWAL_KEY, MEMWAL_ACCOUNT_ID, TATUM_API_KEY, GEMINI_API_KEYS, …).
9
+ */
10
+ export interface EngramConfig {
11
+ /** Agent name — lowercase letters, digits and dashes. Used for a new repo. */
12
+ agent: string;
13
+ /** Folder for `.engram/` (default: the current directory). */
14
+ dir?: string;
15
+ /** Walrus Memory account, a ready remote, or "memory" for an in-process store (tests). */
16
+ walrus?: {
17
+ accountId: string;
18
+ key: string;
19
+ serverUrl?: string;
20
+ } | RemoteMemory | "memory";
21
+ /** Tatum Sui gateway (mainnet) — wallet reads and anchor checks. */
22
+ tatum?: {
23
+ apiKey: string;
24
+ };
25
+ /** LLM for `sleep()`: Gemini keys, or any `LLM`. */
26
+ llm?: {
27
+ gemini: string[];
28
+ model?: string;
29
+ } | LLM;
30
+ /** Anchor commits with the engram_anchor Move module. */
31
+ anchor?: {
32
+ packageId: string;
33
+ mnemonic: string;
34
+ network?: SuiNetwork;
35
+ } | Anchorer | false;
36
+ /** Domain hint for consolidation, e.g. "a wallet-watching agent". */
37
+ context?: string;
38
+ /** Where unspecified settings come from (default: process.env). */
39
+ env?: Record<string, string | undefined>;
40
+ }
41
+ export interface WrapOptions<In, Out> {
42
+ /** What to look up beliefs about (default: the input as JSON). */
43
+ query?: (input: In) => string;
44
+ /** One-line description of the decision for the receipt (default: the output as JSON). */
45
+ action?: (output: Out, input: In) => string;
46
+ /** Beliefs the decision used: ids like "b_rent" (default: every belief the agent was given). */
47
+ used?: (output: Out, beliefs: Belief[]) => string[];
48
+ /** Also record the input as an episode (default true). */
49
+ observe?: boolean | ((input: In) => ObserveInput);
50
+ /** Max beliefs handed to the agent (default 6). */
51
+ limit?: number;
52
+ }
53
+ /** A wrapped agent: same call, plus the last receipt. */
54
+ export interface WrappedAgent<In, Out> {
55
+ (input: In): Promise<Out>;
56
+ /** Receipt of the most recent call (null before the first commit). */
57
+ lastReceipt: Receipt | null;
58
+ }
59
+ /**
60
+ * The high-level API: one object for an agent's memory.
61
+ *
62
+ * ```ts
63
+ * const mind = engram({ agent: "money-ops" });
64
+ * const agent = mind.wrap(myAgent); // beliefs in, signed receipts out
65
+ * mind.observe({ source: "tatum", data: tx });
66
+ * await mind.sleep(); // episodes → beliefs
67
+ * await mind.commit("weekly"); // Merkle root → Walrus → Sui
68
+ * await mind.beliefs({ about: "rent" });
69
+ * mind.at("2026-10-25"); // time travel
70
+ * mind.forget("ep_…"); // provable forgetting
71
+ * await mind.verify("r_…"); // proof check
72
+ * ```
73
+ */
74
+ export declare class Mind {
75
+ private llmFactory;
76
+ private context?;
77
+ readonly core: Engram;
78
+ private llmInstance?;
79
+ constructor(core: Engram, llmFactory: () => LLM, context?: string | undefined);
80
+ get agent(): string;
81
+ /** Records an episode (encrypted with its own key). */
82
+ observe(input: ObserveInput): Episode;
83
+ /** Consolidates new episodes into beliefs with the configured LLM. */
84
+ sleep(opts?: {
85
+ context?: string;
86
+ batchSize?: number;
87
+ }): Promise<SleepReport>;
88
+ /** Signs and stores a snapshot of the current beliefs, anchored on Sui. */
89
+ commit(message: string): Promise<Commit>;
90
+ /**
91
+ * Current beliefs. With `about`, the most relevant ones (Walrus Memory
92
+ * semantic recall, keyword fallback offline).
93
+ */
94
+ beliefs(opts?: {
95
+ about?: string;
96
+ limit?: number;
97
+ }): Promise<Belief[]>;
98
+ /** Beliefs as they were at a commit, `HEAD~n`, or a date ("2026-10-25"). */
99
+ at(ref: string): Belief[];
100
+ /** Destroys an episode's key; dependent beliefs are retracted or revised. */
101
+ forget(episodeId: string, reason?: string): ForgetResult;
102
+ /** Verifies a receipt (`r_…`) or a commit (id, `HEAD`, date) end to end. */
103
+ verify(ref: string, opts?: {
104
+ offline?: boolean;
105
+ }): Promise<VerifyReport>;
106
+ log(): Commit[];
107
+ diff(from: string, to?: string): import("./engram.js").BeliefDiff;
108
+ blame(belief: string): {
109
+ belief: Belief;
110
+ history: Belief[];
111
+ evidence: import("./engram.js").BlameEntry[];
112
+ };
113
+ receipts(): Receipt[];
114
+ /**
115
+ * Wraps an existing agent function. Each call: the relevant committed
116
+ * beliefs are passed in, the agent runs, and a signed receipt records what it
117
+ * decided and which beliefs it relied on.
118
+ *
119
+ * ```ts
120
+ * const agent = mind.wrap(async (tx, beliefs) => decide(tx, beliefs), {
121
+ * used: (out) => out.beliefIds,
122
+ * });
123
+ * const decision = await agent(tx);
124
+ * agent.lastReceipt; // r_…
125
+ * ```
126
+ */
127
+ wrap<In, Out>(fn: (input: In, beliefs: Belief[]) => Promise<Out> | Out, opts?: WrapOptions<In, Out>): WrappedAgent<In, Out>;
128
+ }
129
+ /** Opens (or creates) an agent's memory. See {@link EngramConfig}. */
130
+ export declare function engram(cfg: EngramConfig): Mind;
package/dist/mind.js ADDED
@@ -0,0 +1,156 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { MoveAnchorer, WalrusBlobAnchorer } from "./anchor.js";
4
+ import { Engram } from "./engram.js";
5
+ import { servicesFromEnv } from "./env.js";
6
+ import { GeminiLLM } from "./llm.js";
7
+ import { InMemoryRemote, WalrusMemoryRemote } from "./remote.js";
8
+ import { TatumSui } from "./tatum.js";
9
+ /**
10
+ * The high-level API: one object for an agent's memory.
11
+ *
12
+ * ```ts
13
+ * const mind = engram({ agent: "money-ops" });
14
+ * const agent = mind.wrap(myAgent); // beliefs in, signed receipts out
15
+ * mind.observe({ source: "tatum", data: tx });
16
+ * await mind.sleep(); // episodes → beliefs
17
+ * await mind.commit("weekly"); // Merkle root → Walrus → Sui
18
+ * await mind.beliefs({ about: "rent" });
19
+ * mind.at("2026-10-25"); // time travel
20
+ * mind.forget("ep_…"); // provable forgetting
21
+ * await mind.verify("r_…"); // proof check
22
+ * ```
23
+ */
24
+ export class Mind {
25
+ llmFactory;
26
+ context;
27
+ core;
28
+ llmInstance;
29
+ constructor(core, llmFactory, context) {
30
+ this.llmFactory = llmFactory;
31
+ this.context = context;
32
+ this.core = core;
33
+ }
34
+ get agent() {
35
+ return this.core.agent;
36
+ }
37
+ /** Records an episode (encrypted with its own key). */
38
+ observe(input) {
39
+ return this.core.observe(input);
40
+ }
41
+ /** Consolidates new episodes into beliefs with the configured LLM. */
42
+ sleep(opts = {}) {
43
+ this.llmInstance ??= this.llmFactory();
44
+ return this.core.sleep({ llm: this.llmInstance, context: opts.context ?? this.context, batchSize: opts.batchSize });
45
+ }
46
+ /** Signs and stores a snapshot of the current beliefs, anchored on Sui. */
47
+ commit(message) {
48
+ return this.core.commit(message);
49
+ }
50
+ /**
51
+ * Current beliefs. With `about`, the most relevant ones (Walrus Memory
52
+ * semantic recall, keyword fallback offline).
53
+ */
54
+ async beliefs(opts = {}) {
55
+ if (!opts.about)
56
+ return this.core.beliefs().slice(0, opts.limit ?? Infinity);
57
+ return this.core.relevant(opts.about, opts.limit ?? 5);
58
+ }
59
+ /** Beliefs as they were at a commit, `HEAD~n`, or a date ("2026-10-25"). */
60
+ at(ref) {
61
+ return this.core.beliefsAt(ref);
62
+ }
63
+ /** Destroys an episode's key; dependent beliefs are retracted or revised. */
64
+ forget(episodeId, reason) {
65
+ return this.core.forget(episodeId, reason);
66
+ }
67
+ /** Verifies a receipt (`r_…`) or a commit (id, `HEAD`, date) end to end. */
68
+ verify(ref, opts = {}) {
69
+ const o = opts.offline ? { walrus: false, chain: false } : {};
70
+ return ref.startsWith("r_") ? this.core.verifyReceipt(ref, o) : this.core.verifyCommit(ref, o);
71
+ }
72
+ log() {
73
+ return this.core.head() ? this.core.log() : [];
74
+ }
75
+ diff(from, to) {
76
+ return this.core.diff(from, to);
77
+ }
78
+ blame(belief) {
79
+ return this.core.blame(belief);
80
+ }
81
+ receipts() {
82
+ return this.core.receipts();
83
+ }
84
+ /**
85
+ * Wraps an existing agent function. Each call: the relevant committed
86
+ * beliefs are passed in, the agent runs, and a signed receipt records what it
87
+ * decided and which beliefs it relied on.
88
+ *
89
+ * ```ts
90
+ * const agent = mind.wrap(async (tx, beliefs) => decide(tx, beliefs), {
91
+ * used: (out) => out.beliefIds,
92
+ * });
93
+ * const decision = await agent(tx);
94
+ * agent.lastReceipt; // r_…
95
+ * ```
96
+ */
97
+ wrap(fn, opts = {}) {
98
+ const json = (v) => (typeof v === "string" ? v : JSON.stringify(v));
99
+ const wrapped = (async (input) => {
100
+ if (opts.observe !== false) {
101
+ this.core.observe(typeof opts.observe === "function" ? opts.observe(input) : { source: "agent", data: input });
102
+ }
103
+ const res = await this.core.act({ query: opts.query?.(input) ?? json(input).slice(0, 500), input, limit: opts.limit ?? 6 }, async (beliefs) => {
104
+ const out = await fn(input, beliefs);
105
+ return {
106
+ action: (opts.action?.(out, input) ?? json(out)).slice(0, 2000),
107
+ used: opts.used ? opts.used(out, beliefs) : beliefs.map((b) => b.id),
108
+ result: out,
109
+ };
110
+ });
111
+ wrapped.lastReceipt = res.receipt;
112
+ return res.result;
113
+ });
114
+ wrapped.lastReceipt = null;
115
+ return wrapped;
116
+ }
117
+ }
118
+ /** Opens (or creates) an agent's memory. See {@link EngramConfig}. */
119
+ export function engram(cfg) {
120
+ const env = cfg.env ?? process.env;
121
+ const fromEnv = servicesFromEnv(env);
122
+ const dir = resolve(cfg.dir ?? ".");
123
+ const remote = cfg.walrus === "memory"
124
+ ? new InMemoryRemote()
125
+ : cfg.walrus && "putMany" in cfg.walrus
126
+ ? cfg.walrus
127
+ : cfg.walrus
128
+ ? new WalrusMemoryRemote({ key: cfg.walrus.key, accountId: cfg.walrus.accountId, serverUrl: cfg.walrus.serverUrl })
129
+ : fromEnv.remote;
130
+ const tatum = cfg.tatum ? new TatumSui({ apiKey: cfg.tatum.apiKey }) : fromEnv.tatum;
131
+ // A Walrus Memory account given in the config (not "memory", not a ready remote).
132
+ const account = typeof cfg.walrus === "object" && !("putMany" in cfg.walrus) ? cfg.walrus : undefined;
133
+ const blobAnchorer = account && tatum ? new WalrusBlobAnchorer(tatum, account.accountId) : undefined;
134
+ let anchorer;
135
+ if (cfg.anchor && "check" in cfg.anchor)
136
+ anchorer = cfg.anchor;
137
+ else if (cfg.anchor === false || cfg.walrus === "memory")
138
+ anchorer = undefined;
139
+ else if (cfg.anchor)
140
+ anchorer = new MoveAnchorer({ ...cfg.anchor, tatum, blobAnchorer: blobAnchorer ?? fromEnv.anchorer });
141
+ else
142
+ anchorer = blobAnchorer ?? fromEnv.anchorer;
143
+ const llmFactory = () => {
144
+ if (cfg.llm && "json" in cfg.llm)
145
+ return cfg.llm;
146
+ if (cfg.llm)
147
+ return new GeminiLLM({ apiKeys: cfg.llm.gemini, model: cfg.llm.model });
148
+ return fromEnv.llm();
149
+ };
150
+ const opts = { dir, remote, anchorer };
151
+ const core = existsSync(join(dir, ".engram", "config.json")) ? Engram.open(opts) : Engram.init(cfg.agent, opts);
152
+ if (core.agent !== cfg.agent)
153
+ throw new Error(`${dir} holds agent "${core.agent}", not "${cfg.agent}"`);
154
+ return new Mind(core, llmFactory, cfg.context);
155
+ }
156
+ //# sourceMappingURL=mind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mind.js","sourceRoot":"","sources":["../src/mind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { MerkleTree } from "./merkle.js";
2
+ import type { Belief, CommitManifest, MerkleProofStep } from "./types.js";
3
+ /**
4
+ * Leaf for one belief version. Commits to everything that matters about it —
5
+ * change a word, the confidence or the evidence, and the root changes.
6
+ */
7
+ export declare function beliefLeaf(b: Belief): string;
8
+ /** Leaf recording that an episode was forgotten, so forgetting is itself part of the proof. */
9
+ export declare function tombstoneLeaf(episodeId: string): string;
10
+ export interface CommitTree {
11
+ tree: MerkleTree;
12
+ /** "belief:b_x@2" / "tombstone:ep_1", in leaf order */
13
+ labels: string[];
14
+ }
15
+ /** Leaves sorted by label, so the same belief set always gives the same root. */
16
+ export declare function buildCommitTree(beliefs: Belief[], tombstones: string[]): CommitTree;
17
+ export declare function proofFor(ct: CommitTree, beliefKey: string): MerkleProofStep[];
18
+ export declare function verifyBeliefProof(b: Belief, proof: MerkleProofStep[], root: string): boolean;
19
+ /** Commit ID = sha256 of the canonical manifest. */
20
+ export declare function commitId(m: CommitManifest): string;
21
+ export declare function verifyManifestSignature(m: CommitManifest, signature: string): boolean;
package/dist/proof.js ADDED
@@ -0,0 +1,46 @@
1
+ import { canonical, sha256Hex, verifySignature } from "./crypto.js";
2
+ import { MerkleTree, verifyProof } from "./merkle.js";
3
+ /**
4
+ * Leaf for one belief version. Commits to everything that matters about it —
5
+ * change a word, the confidence or the evidence, and the root changes.
6
+ */
7
+ export function beliefLeaf(b) {
8
+ return sha256Hex(canonical({
9
+ k: "belief",
10
+ id: b.id,
11
+ version: b.version,
12
+ statement: sha256Hex(b.statement),
13
+ confidence: b.confidence,
14
+ evidence: new MerkleTree([...b.evidence].sort().map((e) => sha256Hex(e))).root,
15
+ tags: [...b.tags].sort(),
16
+ }));
17
+ }
18
+ /** Leaf recording that an episode was forgotten, so forgetting is itself part of the proof. */
19
+ export function tombstoneLeaf(episodeId) {
20
+ return sha256Hex(canonical({ k: "tombstone", episode: episodeId }));
21
+ }
22
+ /** Leaves sorted by label, so the same belief set always gives the same root. */
23
+ export function buildCommitTree(beliefs, tombstones) {
24
+ const entries = [
25
+ ...beliefs.map((b) => ({ label: `belief:${b.id}@${b.version}`, leaf: beliefLeaf(b) })),
26
+ ...tombstones.map((t) => ({ label: `tombstone:${t}`, leaf: tombstoneLeaf(t) })),
27
+ ].sort((a, b) => (a.label < b.label ? -1 : a.label > b.label ? 1 : 0));
28
+ return { tree: new MerkleTree(entries.map((e) => e.leaf)), labels: entries.map((e) => e.label) };
29
+ }
30
+ export function proofFor(ct, beliefKey) {
31
+ const i = ct.labels.indexOf(`belief:${beliefKey}`);
32
+ if (i < 0)
33
+ throw new Error(`belief ${beliefKey} is not in this commit`);
34
+ return ct.tree.proof(i);
35
+ }
36
+ export function verifyBeliefProof(b, proof, root) {
37
+ return verifyProof(beliefLeaf(b), proof, root);
38
+ }
39
+ /** Commit ID = sha256 of the canonical manifest. */
40
+ export function commitId(m) {
41
+ return sha256Hex(canonical(m));
42
+ }
43
+ export function verifyManifestSignature(m, signature) {
44
+ return verifySignature(canonical(m), signature, m.agentPubKey);
45
+ }
46
+ //# sourceMappingURL=proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof.js","sourceRoot":"","sources":["../src/proof.ts"],"names":[],"mappings":"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"}