@nexart/codemode-sdk 1.8.4 → 1.9.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.
package/dist/esm/core.js CHANGED
@@ -1,5 +1,8 @@
1
+ import { hashes, verify } from '@noble/ed25519';
2
+ import { sha512 } from '@noble/hashes/sha2.js';
3
+
1
4
  // version.ts
2
- var SDK_VERSION = "1.8.4";
5
+ var SDK_VERSION = "1.9.0";
3
6
  var PROTOCOL_VERSION = "1.2.0";
4
7
  var PROTOCOL_PHASE = 3;
5
8
 
@@ -22,6 +25,20 @@ var DEFAULT_CONFIG = {
22
25
  minDuration: 1,
23
26
  maxDuration: 4
24
27
  };
28
+ var CodeVerifyCode = {
29
+ OK: "OK",
30
+ CERTIFICATE_HASH_MISMATCH: "CERTIFICATE_HASH_MISMATCH",
31
+ SNAPSHOT_HASH_MISMATCH: "SNAPSHOT_HASH_MISMATCH",
32
+ RENDER_HASH_MISMATCH: "RENDER_HASH_MISMATCH",
33
+ INVALID_SHA256_FORMAT: "INVALID_SHA256_FORMAT",
34
+ CANONICALIZATION_ERROR: "CANONICALIZATION_ERROR",
35
+ SCHEMA_ERROR: "SCHEMA_ERROR",
36
+ NODE_RECEIPT_MISSING: "NODE_RECEIPT_MISSING",
37
+ NODE_RECEIPT_KEY_NOT_FOUND: "NODE_RECEIPT_KEY_NOT_FOUND",
38
+ NODE_RECEIPT_INVALID_SIGNATURE: "NODE_RECEIPT_INVALID_SIGNATURE",
39
+ NODE_RECEIPT_KEY_FORMAT_UNSUPPORTED: "NODE_RECEIPT_KEY_FORMAT_UNSUPPORTED",
40
+ UNKNOWN_ERROR: "UNKNOWN_ERROR"
41
+ };
25
42
 
26
43
  // p5-runtime.ts
27
44
  var CODE_MODE_PROTOCOL_VERSION = PROTOCOL_VERSION;
@@ -1629,8 +1646,321 @@ function createEngine(config) {
1629
1646
  };
1630
1647
  }
1631
1648
 
1649
+ // canonicalJson.ts
1650
+ function toCanonicalJson(value) {
1651
+ if (value === null) return "null";
1652
+ if (typeof value === "boolean") return value ? "true" : "false";
1653
+ if (typeof value === "number") {
1654
+ if (!isFinite(value)) throw new Error(`toCanonicalJson: non-finite number ${value}`);
1655
+ return JSON.stringify(value);
1656
+ }
1657
+ if (typeof value === "string") return JSON.stringify(value);
1658
+ if (Array.isArray(value)) {
1659
+ return "[" + value.map(toCanonicalJson).join(",") + "]";
1660
+ }
1661
+ if (typeof value === "object") {
1662
+ const obj = value;
1663
+ const keys = Object.keys(obj).sort();
1664
+ return "{" + keys.filter((k) => obj[k] !== void 0 && typeof obj[k] !== "function").map((k) => `${JSON.stringify(k)}:${toCanonicalJson(obj[k])}`).join(",") + "}";
1665
+ }
1666
+ throw new Error(`toCanonicalJson: unsupported type ${typeof value}`);
1667
+ }
1668
+
1669
+ // nodeReceipt.ts
1670
+ hashes.sha512 = sha512;
1671
+ function base64urlToBytes(s) {
1672
+ const pad = s.length % 4;
1673
+ const base64 = s.replace(/-/g, "+").replace(/_/g, "/") + (pad ? "=".repeat(4 - pad) : "");
1674
+ if (typeof Buffer !== "undefined") {
1675
+ return new Uint8Array(Buffer.from(base64, "base64"));
1676
+ }
1677
+ const binary = atob(base64);
1678
+ return Uint8Array.from(binary, (c) => c.charCodeAt(0));
1679
+ }
1680
+ async function verifyNodeReceiptSignature(params) {
1681
+ try {
1682
+ const { receipt, signatureB64Url, key } = params;
1683
+ let pubKeyBytes;
1684
+ if (key.jwk) {
1685
+ if (key.jwk.kty !== "OKP" || key.jwk.crv !== "Ed25519") {
1686
+ return {
1687
+ ok: false,
1688
+ code: CodeVerifyCode.NODE_RECEIPT_KEY_FORMAT_UNSUPPORTED,
1689
+ details: [
1690
+ `JWK must have kty=OKP and crv=Ed25519, got kty=${key.jwk.kty} crv=${key.jwk.crv}`
1691
+ ]
1692
+ };
1693
+ }
1694
+ pubKeyBytes = base64urlToBytes(key.jwk.x);
1695
+ } else if (key.rawB64Url) {
1696
+ pubKeyBytes = base64urlToBytes(key.rawB64Url);
1697
+ } else if (key.spkiB64) {
1698
+ const spkiBytes = base64urlToBytes(key.spkiB64);
1699
+ if (spkiBytes.length < 32) {
1700
+ return {
1701
+ ok: false,
1702
+ code: CodeVerifyCode.NODE_RECEIPT_KEY_FORMAT_UNSUPPORTED,
1703
+ details: ["SPKI key too short to extract Ed25519 public key"]
1704
+ };
1705
+ }
1706
+ pubKeyBytes = spkiBytes.slice(spkiBytes.length - 32);
1707
+ } else {
1708
+ return {
1709
+ ok: false,
1710
+ code: CodeVerifyCode.NODE_RECEIPT_KEY_FORMAT_UNSUPPORTED,
1711
+ details: ["No usable key provided: supply jwk, rawB64Url, or spkiB64"]
1712
+ };
1713
+ }
1714
+ if (pubKeyBytes.length !== 32) {
1715
+ return {
1716
+ ok: false,
1717
+ code: CodeVerifyCode.NODE_RECEIPT_KEY_FORMAT_UNSUPPORTED,
1718
+ details: [`Ed25519 public key must be 32 bytes, got ${pubKeyBytes.length}`]
1719
+ };
1720
+ }
1721
+ const sigBytes = base64urlToBytes(signatureB64Url);
1722
+ if (sigBytes.length !== 64) {
1723
+ return {
1724
+ ok: false,
1725
+ code: CodeVerifyCode.NODE_RECEIPT_INVALID_SIGNATURE,
1726
+ details: [`Ed25519 signature must be 64 bytes, got ${sigBytes.length}`]
1727
+ };
1728
+ }
1729
+ const msgBytes = new TextEncoder().encode(toCanonicalJson(receipt));
1730
+ const isValid = await verify(sigBytes, msgBytes, pubKeyBytes);
1731
+ if (!isValid) {
1732
+ return {
1733
+ ok: false,
1734
+ code: CodeVerifyCode.NODE_RECEIPT_INVALID_SIGNATURE,
1735
+ details: ["Ed25519 signature verification failed"]
1736
+ };
1737
+ }
1738
+ return { ok: true, code: CodeVerifyCode.OK };
1739
+ } catch (err) {
1740
+ return {
1741
+ ok: false,
1742
+ code: CodeVerifyCode.NODE_RECEIPT_INVALID_SIGNATURE,
1743
+ details: [err instanceof Error ? err.message : String(err)]
1744
+ };
1745
+ }
1746
+ }
1747
+ async function fetchNodeKeys(nodeUrl) {
1748
+ const url = `${nodeUrl.replace(/\/+$/, "")}/.well-known/nexart-node.json`;
1749
+ const response = await fetch(url);
1750
+ if (!response.ok) {
1751
+ throw new Error(`Failed to fetch node keys from ${url}: HTTP ${response.status}`);
1752
+ }
1753
+ const data = await response.json();
1754
+ if (typeof data !== "object" || data === null) {
1755
+ throw new Error("Node keys response is not an object");
1756
+ }
1757
+ const doc = data;
1758
+ if (typeof doc.nodeId !== "string" || !Array.isArray(doc.keys)) {
1759
+ throw new Error("Node keys document missing required fields (nodeId, keys)");
1760
+ }
1761
+ return data;
1762
+ }
1763
+ function selectNodeKey(doc, kid) {
1764
+ if (kid) {
1765
+ const found = doc.keys.find((k) => k.kid === kid);
1766
+ if (!found) {
1767
+ return {
1768
+ error: {
1769
+ ok: false,
1770
+ code: CodeVerifyCode.NODE_RECEIPT_KEY_NOT_FOUND,
1771
+ details: [`Key with kid="${kid}" not found in node keys document`]
1772
+ }
1773
+ };
1774
+ }
1775
+ return { key: found };
1776
+ }
1777
+ if (doc.activeKid) {
1778
+ const found = doc.keys.find((k) => k.kid === doc.activeKid);
1779
+ if (!found) {
1780
+ return {
1781
+ error: {
1782
+ ok: false,
1783
+ code: CodeVerifyCode.NODE_RECEIPT_KEY_NOT_FOUND,
1784
+ details: [`activeKid="${doc.activeKid}" not found in keys array`]
1785
+ }
1786
+ };
1787
+ }
1788
+ return { key: found };
1789
+ }
1790
+ if (doc.keys.length === 0) {
1791
+ return {
1792
+ error: {
1793
+ ok: false,
1794
+ code: CodeVerifyCode.NODE_RECEIPT_KEY_NOT_FOUND,
1795
+ details: ["No keys available in node keys document"]
1796
+ }
1797
+ };
1798
+ }
1799
+ return { key: doc.keys[0] };
1800
+ }
1801
+ function extractReceiptAndSignature(bundle) {
1802
+ if (typeof bundle !== "object" || bundle === null) return null;
1803
+ const b = bundle;
1804
+ if (typeof b.receipt === "object" && b.receipt !== null && typeof b.signature === "string") {
1805
+ return {
1806
+ receipt: b.receipt,
1807
+ signatureB64Url: b.signature,
1808
+ attestorKeyId: typeof b.attestorKeyId === "string" ? b.attestorKeyId : void 0
1809
+ };
1810
+ }
1811
+ if (typeof b.attestation === "object" && b.attestation !== null) {
1812
+ const att = b.attestation;
1813
+ if (typeof att.receipt === "object" && att.receipt !== null && typeof att.signature === "string") {
1814
+ return {
1815
+ receipt: att.receipt,
1816
+ signatureB64Url: att.signature,
1817
+ attestorKeyId: typeof att.attestorKeyId === "string" ? att.attestorKeyId : void 0
1818
+ };
1819
+ }
1820
+ }
1821
+ if (typeof b.meta === "object" && b.meta !== null) {
1822
+ const meta = b.meta;
1823
+ if (typeof meta.attestation === "object" && meta.attestation !== null) {
1824
+ const att = meta.attestation;
1825
+ if (typeof att.receipt === "object" && att.receipt !== null && typeof att.signature === "string") {
1826
+ return {
1827
+ receipt: att.receipt,
1828
+ signatureB64Url: att.signature,
1829
+ attestorKeyId: typeof att.attestorKeyId === "string" ? att.attestorKeyId : void 0
1830
+ };
1831
+ }
1832
+ }
1833
+ }
1834
+ return null;
1835
+ }
1836
+ async function verifyBundleAttestation(bundle, options) {
1837
+ const extracted = extractReceiptAndSignature(bundle);
1838
+ if (!extracted) {
1839
+ return {
1840
+ ok: false,
1841
+ code: CodeVerifyCode.NODE_RECEIPT_MISSING,
1842
+ details: ["No signed receipt found in bundle (expected bundle.receipt + bundle.signature or bundle.attestation envelope)"]
1843
+ };
1844
+ }
1845
+ const nodeId = extracted.receipt.nodeId;
1846
+ const resolvedKid = options.kid ?? extracted.attestorKeyId ?? extracted.receipt.attestorKeyId;
1847
+ function ctx() {
1848
+ const lines = [];
1849
+ if (nodeId) lines.push(`nodeId: ${nodeId}`);
1850
+ if (resolvedKid) lines.push(`kid: ${resolvedKid}`);
1851
+ return lines;
1852
+ }
1853
+ if (typeof bundle.certificateHash === "string") {
1854
+ const bundleCertHash = bundle.certificateHash;
1855
+ if (extracted.receipt.certificateHash !== bundleCertHash) {
1856
+ return {
1857
+ ok: false,
1858
+ code: CodeVerifyCode.CERTIFICATE_HASH_MISMATCH,
1859
+ details: [
1860
+ "Receipt certificateHash does not match bundle certificateHash",
1861
+ `receipt.certificateHash: ${extracted.receipt.certificateHash}`,
1862
+ `bundle.certificateHash: ${bundleCertHash}`,
1863
+ ...ctx()
1864
+ ]
1865
+ };
1866
+ }
1867
+ }
1868
+ let keysDoc;
1869
+ try {
1870
+ keysDoc = await fetchNodeKeys(options.nodeUrl);
1871
+ } catch (err) {
1872
+ return {
1873
+ ok: false,
1874
+ code: CodeVerifyCode.NODE_RECEIPT_KEY_NOT_FOUND,
1875
+ details: [...ctx(), err instanceof Error ? err.message : String(err)]
1876
+ };
1877
+ }
1878
+ const selected = selectNodeKey(keysDoc, resolvedKid);
1879
+ if (selected.error) {
1880
+ return {
1881
+ ...selected.error,
1882
+ details: [...ctx(), ...selected.error.details ?? []]
1883
+ };
1884
+ }
1885
+ const keyEntry = selected.key;
1886
+ const keyParam = {};
1887
+ if (keyEntry.publicKeyJwk) keyParam.jwk = keyEntry.publicKeyJwk;
1888
+ else if (keyEntry.publicKey) keyParam.rawB64Url = keyEntry.publicKey;
1889
+ else if (keyEntry.publicKeySpkiB64) keyParam.spkiB64 = keyEntry.publicKeySpkiB64;
1890
+ else {
1891
+ return {
1892
+ ok: false,
1893
+ code: CodeVerifyCode.NODE_RECEIPT_KEY_FORMAT_UNSUPPORTED,
1894
+ details: [
1895
+ `Key kid="${keyEntry.kid}" has no usable public key field (publicKeyJwk, publicKey, or publicKeySpkiB64)`,
1896
+ ...ctx()
1897
+ ]
1898
+ };
1899
+ }
1900
+ const sigResult = await verifyNodeReceiptSignature({
1901
+ receipt: extracted.receipt,
1902
+ signatureB64Url: extracted.signatureB64Url,
1903
+ key: keyParam
1904
+ });
1905
+ const contextLines = ctx();
1906
+ if (contextLines.length === 0) return sigResult;
1907
+ return sigResult.ok ? { ok: true, code: CodeVerifyCode.OK, details: contextLines } : { ...sigResult, details: [...contextLines, ...sigResult.details ?? []] };
1908
+ }
1909
+
1910
+ // attestation.ts
1911
+ function getAttestationReceipt(bundle) {
1912
+ if (typeof bundle !== "object" || bundle === null) return null;
1913
+ const b = bundle;
1914
+ if (typeof b.receipt === "object" && b.receipt !== null && typeof b.signature === "string") {
1915
+ const r = b.receipt;
1916
+ return {
1917
+ attestationId: r.attestationId,
1918
+ attestedAt: r.attestedAt,
1919
+ nodeId: r.nodeId,
1920
+ attestorKeyId: r.attestorKeyId,
1921
+ nodeRuntimeHash: r.nodeRuntimeHash,
1922
+ certificateHash: r.certificateHash,
1923
+ protocolVersion: r.protocolVersion,
1924
+ receipt: r,
1925
+ signature: b.signature
1926
+ };
1927
+ }
1928
+ if (typeof b.attestation === "object" && b.attestation !== null) {
1929
+ const att = b.attestation;
1930
+ if (typeof att.receipt === "object" && att.receipt !== null && typeof att.signature === "string") {
1931
+ const r = att.receipt;
1932
+ return {
1933
+ attestationId: r.attestationId,
1934
+ attestedAt: r.attestedAt,
1935
+ nodeId: r.nodeId,
1936
+ attestorKeyId: r.attestorKeyId,
1937
+ nodeRuntimeHash: r.nodeRuntimeHash,
1938
+ certificateHash: r.certificateHash,
1939
+ protocolVersion: r.protocolVersion,
1940
+ receipt: r,
1941
+ signature: att.signature
1942
+ };
1943
+ }
1944
+ }
1945
+ if (typeof b.attestationId === "string") {
1946
+ return {
1947
+ attestationId: b.attestationId,
1948
+ attestedAt: typeof b.attestedAt === "string" ? b.attestedAt : "",
1949
+ nodeId: typeof b.nodeId === "string" ? b.nodeId : void 0,
1950
+ attestorKeyId: typeof b.attestorKeyId === "string" ? b.attestorKeyId : void 0,
1951
+ nodeRuntimeHash: typeof b.nodeRuntimeHash === "string" ? b.nodeRuntimeHash : void 0,
1952
+ certificateHash: typeof b.certificateHash === "string" ? b.certificateHash : void 0,
1953
+ protocolVersion: typeof b.protocolVersion === "string" ? b.protocolVersion : void 0
1954
+ };
1955
+ }
1956
+ return null;
1957
+ }
1958
+ function hasAttestation(bundle) {
1959
+ return getAttestationReceipt(bundle) !== null;
1960
+ }
1961
+
1632
1962
  // core-index.ts
1633
1963
  var SDK_VERSION2 = SDK_VERSION;
1634
1964
  var SDK_NAME = "@nexart/codemode-sdk";
1635
1965
 
1636
- export { CODE_MODE_ENFORCEMENT, CODE_MODE_PROTOCOL_PHASE, CODE_MODE_PROTOCOL_VERSION, DEFAULT_CONFIG, DEFAULT_VARS, PROTOCOL_IDENTITY, PROTOCOL_PHASE, PROTOCOL_VERSION, SDK_NAME, SDK_VERSION2 as SDK_VERSION, VAR_COUNT, VAR_MAX, VAR_MIN, cancelLoopMode, createEngine, createP5Runtime, createProtocolVAR, executeCodeMode, injectTimeVariables, runLoopMode, runStaticMode, validateCodeModeSource };
1966
+ export { CODE_MODE_ENFORCEMENT, CODE_MODE_PROTOCOL_PHASE, CODE_MODE_PROTOCOL_VERSION, CodeVerifyCode, DEFAULT_CONFIG, DEFAULT_VARS, PROTOCOL_IDENTITY, PROTOCOL_PHASE, PROTOCOL_VERSION, SDK_NAME, SDK_VERSION2 as SDK_VERSION, VAR_COUNT, VAR_MAX, VAR_MIN, cancelLoopMode, createEngine, createP5Runtime, createProtocolVAR, executeCodeMode, fetchNodeKeys, getAttestationReceipt, hasAttestation, injectTimeVariables, runLoopMode, runStaticMode, selectNodeKey, toCanonicalJson, validateCodeModeSource, verifyBundleAttestation, verifyNodeReceiptSignature };
package/dist/esm/node.cjs CHANGED
@@ -1068,7 +1068,7 @@ var init_soundart_sketches = __esm({
1068
1068
  });
1069
1069
 
1070
1070
  // version.ts
1071
- var SDK_VERSION = "1.8.4";
1071
+ var SDK_VERSION = "1.9.0";
1072
1072
  var PROTOCOL_VERSION = "1.2.0";
1073
1073
  var PROTOCOL_PHASE = 3;
1074
1074
 
package/dist/esm/node.js CHANGED
@@ -1065,7 +1065,7 @@ var init_soundart_sketches = __esm({
1065
1065
  });
1066
1066
 
1067
1067
  // version.ts
1068
- var SDK_VERSION = "1.8.4";
1068
+ var SDK_VERSION = "1.9.0";
1069
1069
  var PROTOCOL_VERSION = "1.2.0";
1070
1070
  var PROTOCOL_PHASE = 3;
1071
1071
 
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @nexart/codemode-sdk — Attestation Receipt Helpers (v1.9.0)
3
+ *
4
+ * Utilities for extracting and inspecting attestation receipts from Code Mode
5
+ * snapshot bundles. These are read-only helpers — they never perform network
6
+ * calls or signature verification. For full offline verification use
7
+ * verifyBundleAttestation() from nodeReceipt.ts.
8
+ *
9
+ * Recognised bundle layouts:
10
+ * A. Top-level envelope — bundle.receipt + bundle.signature
11
+ * B. Nested attestation — bundle.attestation.receipt + bundle.attestation.signature
12
+ * C. Legacy flat fields — bundle.attestationId (pre-receipt format)
13
+ */
14
+ import type { CodeAttestationReceipt } from './types.js';
15
+ /**
16
+ * Extract a normalised CodeAttestationReceipt from any Code Mode bundle.
17
+ * Returns null when no attestation is present.
18
+ */
19
+ export declare function getAttestationReceipt(bundle: unknown): CodeAttestationReceipt | null;
20
+ /**
21
+ * Return true if the bundle carries any form of attestation data.
22
+ */
23
+ export declare function hasAttestation(bundle: unknown): boolean;
24
+ //# sourceMappingURL=attestation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attestation.d.ts","sourceRoot":"","sources":["../../../../attestation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAA4B,MAAM,YAAY,CAAC;AAEnF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI,CAqDpF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAEvD"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @nexart/codemode-sdk — Canonical JSON
3
+ *
4
+ * Deterministic, sorted-key JSON serialization used for signing and
5
+ * verifying attestation receipts. The output is byte-for-byte identical
6
+ * whether produced in Node.js or a browser.
7
+ *
8
+ * Rules:
9
+ * - Object keys are sorted lexicographically (Unicode code point order)
10
+ * - No trailing commas, no whitespace
11
+ * - Arrays preserve insertion order
12
+ * - null, boolean, number, string are encoded as standard JSON literals
13
+ * - Undefined values and function-valued properties are omitted (same as JSON.stringify)
14
+ */
15
+ export declare function toCanonicalJson(value: unknown): string;
16
+ //# sourceMappingURL=canonicalJson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalJson.d.ts","sourceRoot":"","sources":["../../../../canonicalJson.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAwBtD"}
@@ -14,10 +14,14 @@ export { createP5Runtime, injectTimeVariables, createProtocolVAR, VAR_COUNT, VAR
14
14
  export { runStaticMode, } from './static-engine';
15
15
  export { runLoopMode, cancelLoopMode, } from './loop-engine';
16
16
  export { createEngine, } from './engine';
17
+ export { CodeVerifyCode, type CodeVerifyCode as CodeVerifyCodeType, type CodeVerificationResult, type NodeReceiptVerifyResult, type NodeKeysDocument, type SignedAttestationReceipt, type CodeAttestationReceipt, } from './types.js';
18
+ export { verifyNodeReceiptSignature, fetchNodeKeys, selectNodeKey, verifyBundleAttestation, } from './nodeReceipt.js';
19
+ export { getAttestationReceipt, hasAttestation, } from './attestation.js';
20
+ export { toCanonicalJson } from './canonicalJson.js';
17
21
  /**
18
22
  * SDK Identity — imported from version.ts (single source of truth)
19
23
  */
20
- export declare const SDK_VERSION = "1.8.4";
24
+ export declare const SDK_VERSION = "1.9.0";
21
25
  export declare const SDK_NAME = "@nexart/codemode-sdk";
22
26
  export { PROTOCOL_VERSION, PROTOCOL_PHASE };
23
27
  //# sourceMappingURL=core-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"core-index.d.ts","sourceRoot":"","sources":["../../../../core-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAA+B,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG1F,OAAO,EACL,eAAe,EACf,sBAAsB,GACvB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,MAAM,EACX,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,iBAAiB,EACjB,YAAY,EACZ,cAAc,GACf,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,OAAO,EACP,0BAA0B,EAC1B,wBAAwB,EACxB,qBAAqB,EACrB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,aAAa,GACd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,WAAW,EACX,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,YAAY,GACb,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,eAAO,MAAM,WAAW,UAAe,CAAC;AACxC,eAAO,MAAM,QAAQ,yBAAyB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"core-index.d.ts","sourceRoot":"","sources":["../../../../core-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAA+B,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG1F,OAAO,EACL,eAAe,EACf,sBAAsB,GACvB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,MAAM,EACX,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,iBAAiB,EACjB,YAAY,EACZ,cAAc,GACf,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,OAAO,EACP,0BAA0B,EAC1B,wBAAwB,EACxB,qBAAqB,EACrB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,aAAa,GACd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,WAAW,EACX,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,YAAY,GACb,MAAM,UAAU,CAAC;AAKlB,OAAO,EACL,cAAc,EACd,KAAK,cAAc,IAAI,kBAAkB,EACzC,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,GAC5B,MAAM,YAAY,CAAC;AAKpB,OAAO,EACL,0BAA0B,EAC1B,aAAa,EACb,aAAa,EACb,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EACL,qBAAqB,EACrB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,WAAW,UAAe,CAAC;AACxC,eAAO,MAAM,QAAQ,yBAAyB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC"}
@@ -28,7 +28,7 @@ export { createRuntime, NexArtRuntime, RUNTIME_VERSION, } from '../runtime';
28
28
  export type { RuntimeOptions, RuntimeState, NexArtRuntime as NexArtRuntimeType, } from '../runtime';
29
29
  export { renderSoundArtViaCodeMode, canRenderViaCodeMode, getCodeModeAvailableStyles, } from '../soundart-engine';
30
30
  export type { TweakParams, SoundArtEngineConfig, SoundArtRenderOptions, SoundArtRenderResult, SoundArtMetadata, SoundSnapshot, SoundFeatures, SoundArtSketchName, } from '../soundart-engine';
31
- export declare const SDK_VERSION = "1.8.4";
31
+ export declare const SDK_VERSION = "1.9.0";
32
32
  export declare const SDK_NAME = "@nexart/codemode-sdk";
33
33
  export declare const SDK_ENTRY = "browser";
34
34
  /**
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @nexart/codemode-sdk — Node Receipt Verification (v1.9.0)
3
+ *
4
+ * Offline Ed25519 signature verification for Code Mode attestation receipts.
5
+ * Browser and Node.js compatible — uses @noble/ed25519 with @noble/hashes/sha2.
6
+ *
7
+ * Usage:
8
+ * const res = await verifyBundleAttestation(bundle, { nodeUrl });
9
+ * console.log(res.ok, res.code);
10
+ */
11
+ import type { NodeKeysDocument, SignedAttestationReceipt, NodeReceiptVerifyResult } from './types.js';
12
+ /**
13
+ * Verify an Ed25519 signature over the canonical JSON bytes of a receipt.
14
+ *
15
+ * @param params.receipt - The receipt object that was signed.
16
+ * @param params.signatureB64Url - Base64url-encoded 64-byte Ed25519 signature.
17
+ * @param params.key - Public key in one of: JWK, raw base64url, or SPKI.
18
+ */
19
+ export declare function verifyNodeReceiptSignature(params: {
20
+ receipt: SignedAttestationReceipt;
21
+ signatureB64Url: string;
22
+ key: {
23
+ jwk?: NodeKeysDocument['keys'][number]['publicKeyJwk'];
24
+ spkiB64?: string;
25
+ rawB64Url?: string;
26
+ };
27
+ }): Promise<NodeReceiptVerifyResult>;
28
+ /**
29
+ * Fetch node keys from /.well-known/nexart-node.json on the attestation node.
30
+ */
31
+ export declare function fetchNodeKeys(nodeUrl: string): Promise<NodeKeysDocument>;
32
+ type SelectKeySuccess = {
33
+ key: NodeKeysDocument['keys'][number];
34
+ error?: never;
35
+ };
36
+ type SelectKeyFailure = {
37
+ error: NodeReceiptVerifyResult;
38
+ key?: never;
39
+ };
40
+ type SelectKeyResult = SelectKeySuccess | SelectKeyFailure;
41
+ /**
42
+ * Select the appropriate key from a NodeKeysDocument.
43
+ *
44
+ * Priority: explicit kid → activeKid → first key in array.
45
+ */
46
+ export declare function selectNodeKey(doc: NodeKeysDocument, kid?: string): SelectKeyResult;
47
+ /**
48
+ * Fully verify a Code Mode bundle's node attestation (offline).
49
+ *
50
+ * Steps:
51
+ * 1. Extract signed receipt + signature from the bundle.
52
+ * 2. Cross-check receipt.certificateHash === bundle.certificateHash.
53
+ * 3. Fetch node keys from nodeUrl.
54
+ * 4. Select the key (by kid, activeKid, or first).
55
+ * 5. Verify the Ed25519 signature over canonical JSON of the receipt.
56
+ *
57
+ * @param bundle - A Code Mode snapshot bundle (any recognised layout).
58
+ * @param options - nodeUrl to fetch keys from; optional kid to select.
59
+ */
60
+ export declare function verifyBundleAttestation(bundle: unknown, options: {
61
+ nodeUrl: string;
62
+ kid?: string;
63
+ }): Promise<NodeReceiptVerifyResult>;
64
+ export {};
65
+ //# sourceMappingURL=nodeReceipt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeReceipt.d.ts","sourceRoot":"","sources":["../../../../nodeReceipt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAsBtG;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAAC,MAAM,EAAE;IACvD,OAAO,EAAE,wBAAwB,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE;QACH,GAAG,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QACvD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA0EnC;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAe9E;AAED,KAAK,gBAAgB,GAAG;IAAE,GAAG,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACjF,KAAK,gBAAgB,GAAG;IAAE,KAAK,EAAE,uBAAuB,CAAC;IAAC,GAAG,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACxE,KAAK,eAAe,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,eAAe,CAwClF;AAiDD;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,OAAO,EACf,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC,OAAO,CAAC,uBAAuB,CAAC,CAqFlC"}
@@ -18,7 +18,7 @@
18
18
  * ║ BROWSER-SAFE: No Node.js dependencies. Works in Vite/Next/React. ║
19
19
  * ╚══════════════════════════════════════════════════════════════════════════╝
20
20
  */
21
- export declare const RUNTIME_VERSION = "1.8.4";
21
+ export declare const RUNTIME_VERSION = "1.9.0";
22
22
  export interface RuntimeOptions {
23
23
  seed: string | number;
24
24
  vars?: number[];
@@ -149,6 +149,102 @@ export interface ExecuteCodeModeResult {
149
149
  frames?: ImageData[];
150
150
  metadata: ProtocolMetadata;
151
151
  }
152
+ /**
153
+ * ─────────────────────────────────────────────────────────────────────────────
154
+ * Verification Reason Codes (v1.9.0)
155
+ * ─────────────────────────────────────────────────────────────────────────────
156
+ *
157
+ * Stable, string-valued reason codes returned by all Code Mode verification
158
+ * functions. Additive-only: existing codes will never be renamed or removed.
159
+ */
160
+ export declare const CodeVerifyCode: {
161
+ readonly OK: "OK";
162
+ readonly CERTIFICATE_HASH_MISMATCH: "CERTIFICATE_HASH_MISMATCH";
163
+ readonly SNAPSHOT_HASH_MISMATCH: "SNAPSHOT_HASH_MISMATCH";
164
+ readonly RENDER_HASH_MISMATCH: "RENDER_HASH_MISMATCH";
165
+ readonly INVALID_SHA256_FORMAT: "INVALID_SHA256_FORMAT";
166
+ readonly CANONICALIZATION_ERROR: "CANONICALIZATION_ERROR";
167
+ readonly SCHEMA_ERROR: "SCHEMA_ERROR";
168
+ readonly NODE_RECEIPT_MISSING: "NODE_RECEIPT_MISSING";
169
+ readonly NODE_RECEIPT_KEY_NOT_FOUND: "NODE_RECEIPT_KEY_NOT_FOUND";
170
+ readonly NODE_RECEIPT_INVALID_SIGNATURE: "NODE_RECEIPT_INVALID_SIGNATURE";
171
+ readonly NODE_RECEIPT_KEY_FORMAT_UNSUPPORTED: "NODE_RECEIPT_KEY_FORMAT_UNSUPPORTED";
172
+ readonly UNKNOWN_ERROR: "UNKNOWN_ERROR";
173
+ };
174
+ export type CodeVerifyCode = typeof CodeVerifyCode[keyof typeof CodeVerifyCode];
175
+ /**
176
+ * Verification result returned by Code Mode verification functions.
177
+ * `ok` — true on success
178
+ * `code` — stable machine-readable reason code (CodeVerifyCode)
179
+ * `details` — optional human-readable detail lines
180
+ */
181
+ export interface CodeVerificationResult {
182
+ ok: boolean;
183
+ code: CodeVerifyCode;
184
+ details?: string[];
185
+ }
186
+ /**
187
+ * ─────────────────────────────────────────────────────────────────────────────
188
+ * Signed Attestation Receipt — Code Mode (v1.9.0)
189
+ * ─────────────────────────────────────────────────────────────────────────────
190
+ *
191
+ * Payload signed by the attestation node over a Code Mode snapshot bundle.
192
+ * The signature is Ed25519 over the canonical JSON bytes of this object.
193
+ */
194
+ export interface SignedAttestationReceipt {
195
+ receiptVersion: 'attestation.receipt.v1';
196
+ attestationId: string;
197
+ attestedAt: string;
198
+ nodeId: string;
199
+ attestorKeyId: string;
200
+ nodeRuntimeHash: string;
201
+ certificateHash: string;
202
+ protocolVersion: string;
203
+ [key: string]: unknown;
204
+ }
205
+ /**
206
+ * Node Keys Document
207
+ * Fetched from /.well-known/nexart-node.json on the attestation node.
208
+ */
209
+ export interface NodeKeysDocument {
210
+ nodeId: string;
211
+ activeKid?: string;
212
+ keys: Array<{
213
+ kid: string;
214
+ alg: 'Ed25519';
215
+ use: 'sig';
216
+ publicKeyJwk?: {
217
+ kty: 'OKP';
218
+ crv: 'Ed25519';
219
+ x: string;
220
+ };
221
+ publicKey?: string;
222
+ publicKeySpkiB64?: string;
223
+ createdAt?: string;
224
+ }>;
225
+ }
226
+ /**
227
+ * Result of node receipt signature verification (Code Mode variant).
228
+ * Alias of CodeVerificationResult — kept as a distinct named type for
229
+ * clarity in function signatures.
230
+ */
231
+ export type NodeReceiptVerifyResult = CodeVerificationResult;
232
+ /**
233
+ * Normalised attestation receipt extracted from any Code Mode bundle format.
234
+ * Returned by getAttestationReceipt().
235
+ */
236
+ export interface CodeAttestationReceipt {
237
+ attestationId: string;
238
+ attestedAt: string;
239
+ nodeId?: string;
240
+ attestorKeyId?: string;
241
+ nodeRuntimeHash?: string;
242
+ certificateHash?: string;
243
+ protocolVersion?: string;
244
+ receipt?: SignedAttestationReceipt;
245
+ signature?: string;
246
+ [key: string]: unknown;
247
+ }
152
248
  /**
153
249
  * Builder Manifest (v1.6.0)
154
250
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../types.ts"],"names":[],"mappings":"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"}