@engramx/client 0.7.3 → 0.7.4-rc.2

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.
package/README.md CHANGED
@@ -96,6 +96,36 @@ const backups = await engram.listBackups('sqlite');
96
96
  const data = await engram.pullBackupChunk(backupId, 0);
97
97
  ```
98
98
 
99
+ ## Verify canonical lineage
100
+
101
+ An engram's own `getSpawnedBy()` is a self-report — any fork can claim any spawner.
102
+ The authoritative fact is the registry's testimony: its public, free
103
+ `getCustodyMode(engramId)` query answers `"managed"`/`"sovereign"` only for engrams
104
+ it actually spawned, and `"unknown"` for everything else. The SDK wraps the whole
105
+ check — registry testimony plus a certified (subnet-signed, not self-reported)
106
+ `module_hash` comparison against the registry's attested template — in one call:
107
+
108
+ ```typescript
109
+ import { verifyCanonicalLineage } from '@engramx/client';
110
+
111
+ const verdict = await verifyCanonicalLineage(engramId, agent);
112
+ // verdict.lineage:
113
+ // 'canonical' — the canonical registry vouches for it (managed custody)
114
+ // 'canonical-sovereign' — canonical lineage, owner-held keys (code may lawfully differ)
115
+ // 'not-canonical' — the registry does not know it (staging fleet or fork;
116
+ // verdict.spawnedBy hints which — an unverified self-report)
117
+ // 'indeterminate' — the registry could not be asked; NOT evidence either way
118
+ // verdict.codeMatchesCanonicalTemplate: true | false | 'unknown'
119
+ // certified live module hash vs the registry's current template. Lineage ≠ code:
120
+ // false on a managed engram usually just means one release behind, not suspect.
121
+ ```
122
+
123
+ The canonical registry id ships in the SDK as `CANONICAL_REGISTRY_CANISTER_ID`
124
+ (empty until the production fleet is live — while empty, calls without an explicit
125
+ registry report `'indeterminate'` by design). Pass `{ registryId }` to ask a
126
+ different fleet (e.g. staging); the answer is then *that fleet's* testimony, not
127
+ canonicity.
128
+
99
129
  ## OpenClaw Integration
100
130
 
101
131
  The `--target openclaw` option on `pair` handles plugin installation and `openclaw.json` configuration automatically. For manual setup or customization, see [integrations/openclaw/README.md](../../integrations/openclaw/README.md).
package/dist/index.d.ts CHANGED
@@ -36,3 +36,4 @@ export type { SignedTransaction, SignedAuthorization, SignedTypedData } from '@i
36
36
  export type { ServiceDefinition, Job, JobStatus, PricingScheme, VerificationMethod, } from '@ic402/client';
37
37
  export { Ic402Error, probeX402, fetchX402, findPaymentOption } from '@ic402/client';
38
38
  export { broadcastTransaction, pollReceipt, registerAgent } from '@ic402/client';
39
+ export { verifyCanonicalLineage, classifyLineage, CANONICAL_REGISTRY_CANISTER_ID, type LineageVerdict, type CustodyMode, } from './lineage.js';
package/dist/index.js CHANGED
@@ -21,4 +21,7 @@ export { Ic402Client } from '@ic402/client';
21
21
  export { signVoucher, encodeVoucherPayload } from '@ic402/client';
22
22
  export { Ic402Error, probeX402, fetchX402, findPaymentOption } from '@ic402/client';
23
23
  export { broadcastTransaction, pollReceipt, registerAgent } from '@ic402/client';
24
+ // Canonical-lineage verification — the one-call check for agents/relying parties: is this
25
+ // engram canonically spawned (registry testimony), and does it run the attested template?
26
+ export { verifyCanonicalLineage, classifyLineage, CANONICAL_REGISTRY_CANISTER_ID, } from './lineage.js';
24
27
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1E,wDAAwD;AACxD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,qDAAqD;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,2CAA2C;AAC3C,OAAO,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIhE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE3F,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,eAAe,EACf,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAwD5C,iEAAiE;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AASlE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1E,wDAAwD;AACxD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,qDAAqD;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,2CAA2C;AAC3C,OAAO,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIhE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE3E,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE3F,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,eAAe,EACf,wBAAwB,GACzB,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAwD5C,iEAAiE;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AASlE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEjF,0FAA0F;AAC1F,0FAA0F;AAC1F,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,8BAA8B,GAG/B,MAAM,cAAc,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { type HttpAgent } from '@icp-sdk/core/agent';
2
+ /** The canonical registry — SET AT FLEET DEPLOY (empty until then, like @engramx/owner's
3
+ * config). While empty, verification without an explicit registryId reports 'indeterminate'
4
+ * rather than guessing. */
5
+ export declare const CANONICAL_REGISTRY_CANISTER_ID = "";
6
+ export type CustodyMode = 'managed' | 'sovereign' | 'unknown';
7
+ export interface LineageVerdict {
8
+ /** The verdict:
9
+ * - 'canonical' — the canonical registry vouches it spawned this engram (managed).
10
+ * - 'canonical-sovereign' — canonical lineage, but the owner holds custody (code may differ).
11
+ * - 'not-canonical' — the canonical registry does not know this engram (staging or fork;
12
+ * `spawnedBy` hints at which fleet).
13
+ * - 'indeterminate' — no canonical registry to ask (constant unset and none passed), or
14
+ * the registry was unreachable. NOT evidence either way. */
15
+ lineage: 'canonical' | 'canonical-sovereign' | 'not-canonical' | 'indeterminate';
16
+ /** The engram's own (forgeable) claim of its spawning registry — a hint, never proof. */
17
+ spawnedBy: string | null;
18
+ /** The canonical registry's testimony (authoritative); null when it could not be asked. */
19
+ custodyMode: CustodyMode | null;
20
+ /** Certified live module hash vs the canonical registry's attested template.
21
+ * 'unknown' when either side could not be read. See the module comment: false ≠ suspect. */
22
+ codeMatchesCanonicalTemplate: boolean | 'unknown';
23
+ /** Which registry actually testified (echo of the id used). */
24
+ registryChecked: string | null;
25
+ }
26
+ /** Pure classification — exported for tests. */
27
+ export declare function classifyLineage(custody: CustodyMode | null, registryAsked: boolean): LineageVerdict['lineage'];
28
+ /**
29
+ * Verify an engram's canonical lineage in one call.
30
+ *
31
+ * @param engramId the engram canister id to verify
32
+ * @param agent an HttpAgent pointed at the IC (anonymous is fine — every read is public)
33
+ * @param opts.registryId override the canonical registry (defaults to
34
+ * CANONICAL_REGISTRY_CANISTER_ID; REQUIRED in practice until that constant is set at
35
+ * fleet deploy — without it the verdict is 'indeterminate' by design, never a guess)
36
+ */
37
+ export declare function verifyCanonicalLineage(engramId: string, agent: HttpAgent, opts?: {
38
+ registryId?: string;
39
+ }): Promise<LineageVerdict>;
@@ -0,0 +1,119 @@
1
+ // lineage.ts — canonical-lineage verification: the one-call check that tells an agent (or any
2
+ // relying party) whether an engram belongs to the canonical EngramX fleet, is a staging/fork
3
+ // engram, or cannot be determined.
4
+ //
5
+ // TRUST MODEL (why two hops): an engram's own claim about its origin is FORGEABLE — any fork can
6
+ // say "I am canonical". The authoritative watermark is the CANONICAL REGISTRY'S OWN TESTIMONY:
7
+ // its public, free getCustodyMode(engramId) answers "managed"/"sovereign" only for engrams it
8
+ // actually spawned, and "unknown" for everything else. The engram-side getSpawnedBy() is kept as
9
+ // a hint (useful for classifying which non-canonical fleet an engram belongs to), never as proof.
10
+ //
11
+ // LINEAGE vs CODE — deliberately separate facts: canonical lineage proves the canonical registry
12
+ // spawned this canister; it does NOT prove the canister still runs canonical code (a sovereign
13
+ // engram may legitimately run modified code). codeMatchesCanonicalTemplate compares the LIVE
14
+ // certified module hash (read_state — subnet-signed, not self-reported) against the canonical
15
+ // registry's current attested template. A managed engram one release behind will read `false`
16
+ // here without being suspect; treat lineage as the trust fact and the code bit as freshness.
17
+ import { Actor, CanisterStatus } from '@icp-sdk/core/agent';
18
+ import { Principal } from '@icp-sdk/core/principal';
19
+ /** The canonical registry — SET AT FLEET DEPLOY (empty until then, like @engramx/owner's
20
+ * config). While empty, verification without an explicit registryId reports 'indeterminate'
21
+ * rather than guessing. */
22
+ export const CANONICAL_REGISTRY_CANISTER_ID = '';
23
+ const engramLineageIdl = ({ IDL }) => IDL.Service({ getSpawnedBy: IDL.Func([], [IDL.Opt(IDL.Principal)], ['query']) });
24
+ const registryLineageIdl = ({ IDL }) => IDL.Service({
25
+ getCustodyMode: IDL.Func([IDL.Principal], [IDL.Text], ['query']),
26
+ getEngramWasmHash: IDL.Func([], [IDL.Text], ['query']),
27
+ });
28
+ /** Pure classification — exported for tests. */
29
+ export function classifyLineage(custody, registryAsked) {
30
+ if (!registryAsked || custody === null)
31
+ return 'indeterminate';
32
+ if (custody === 'managed')
33
+ return 'canonical';
34
+ if (custody === 'sovereign')
35
+ return 'canonical-sovereign';
36
+ return 'not-canonical';
37
+ }
38
+ /**
39
+ * Verify an engram's canonical lineage in one call.
40
+ *
41
+ * @param engramId the engram canister id to verify
42
+ * @param agent an HttpAgent pointed at the IC (anonymous is fine — every read is public)
43
+ * @param opts.registryId override the canonical registry (defaults to
44
+ * CANONICAL_REGISTRY_CANISTER_ID; REQUIRED in practice until that constant is set at
45
+ * fleet deploy — without it the verdict is 'indeterminate' by design, never a guess)
46
+ */
47
+ export async function verifyCanonicalLineage(engramId, agent, opts = {}) {
48
+ const registryId = opts.registryId ?? CANONICAL_REGISTRY_CANISTER_ID;
49
+ // Engram-side hint (forgeable — recorded, never trusted).
50
+ let spawnedBy = null;
51
+ try {
52
+ const engram = Actor.createActor(engramLineageIdl, { agent, canisterId: engramId });
53
+ const sb = (await engram['getSpawnedBy']());
54
+ spawnedBy = sb.length ? sb[0].toText() : null;
55
+ }
56
+ catch {
57
+ /* unreachable/frozen engram — the registry testimony below still stands on its own */
58
+ }
59
+ if (!registryId) {
60
+ return {
61
+ lineage: 'indeterminate',
62
+ spawnedBy,
63
+ custodyMode: null,
64
+ codeMatchesCanonicalTemplate: 'unknown',
65
+ registryChecked: null,
66
+ };
67
+ }
68
+ // Registry-side testimony (authoritative).
69
+ let custody = null;
70
+ let templateHash = '';
71
+ try {
72
+ const registry = Actor.createActor(registryLineageIdl, { agent, canisterId: registryId });
73
+ const mode = (await registry['getCustodyMode'](Principal.fromText(engramId)));
74
+ custody = mode === 'managed' || mode === 'sovereign' ? mode : 'unknown';
75
+ try {
76
+ templateHash = (await registry['getEngramWasmHash']())
77
+ .replace(/^0x/, '')
78
+ .toLowerCase();
79
+ }
80
+ catch {
81
+ /* template hash unreadable — code check degrades to 'unknown' */
82
+ }
83
+ }
84
+ catch {
85
+ /* registry unreachable — indeterminate, never a guess */
86
+ }
87
+ // Code freshness: certified (subnet-signed) live module hash vs the attested template.
88
+ let codeMatches = 'unknown';
89
+ if (custody !== null && custody !== 'unknown' && templateHash) {
90
+ try {
91
+ const status = await CanisterStatus.request({
92
+ agent,
93
+ canisterId: Principal.fromText(engramId),
94
+ paths: ['module_hash'],
95
+ });
96
+ const raw = status.get('module_hash');
97
+ if (raw instanceof ArrayBuffer || ArrayBuffer.isView(raw)) {
98
+ const bytes = raw instanceof ArrayBuffer
99
+ ? new Uint8Array(raw)
100
+ : new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength);
101
+ const liveHash = Array.from(bytes)
102
+ .map((b) => b.toString(16).padStart(2, '0'))
103
+ .join('');
104
+ codeMatches = liveHash === templateHash;
105
+ }
106
+ }
107
+ catch {
108
+ /* read_state failed — 'unknown' */
109
+ }
110
+ }
111
+ return {
112
+ lineage: classifyLineage(custody, true),
113
+ spawnedBy,
114
+ custodyMode: custody,
115
+ codeMatchesCanonicalTemplate: codeMatches,
116
+ registryChecked: registryId,
117
+ };
118
+ }
119
+ //# sourceMappingURL=lineage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineage.js","sourceRoot":"","sources":["../src/lineage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@engramx/client",
3
- "version": "0.7.3",
3
+ "version": "0.7.4-rc.2",
4
4
  "description": "Client SDK for EngramX — persistent, decentralized memory for AI agents on ICP",
5
5
  "license": "Apache-2.0",
6
6
  "author": "EngramX <developer@engramx.ai>",