@invariance/sdk 0.0.1 → 0.1.1

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/index.cjs CHANGED
@@ -7804,7 +7804,7 @@ var require_main = __commonJS({
7804
7804
  var fs = require("fs");
7805
7805
  var path = require("path");
7806
7806
  var os = require("os");
7807
- var crypto = require("crypto");
7807
+ var crypto2 = require("crypto");
7808
7808
  var packageJson = require_package();
7809
7809
  var version = packageJson.version;
7810
7810
  var LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;
@@ -8023,7 +8023,7 @@ var require_main = __commonJS({
8023
8023
  const authTag = ciphertext.subarray(-16);
8024
8024
  ciphertext = ciphertext.subarray(12, -16);
8025
8025
  try {
8026
- const aesgcm = crypto.createDecipheriv("aes-256-gcm", key, nonce);
8026
+ const aesgcm = crypto2.createDecipheriv("aes-256-gcm", key, nonce);
8027
8027
  aesgcm.setAuthTag(authTag);
8028
8028
  return `${aesgcm.update(ciphertext)}${aesgcm.final()}`;
8029
8029
  } catch (error) {
@@ -8849,6 +8849,7 @@ __export(index_exports, {
8849
8849
  GovernmentComplianceKit: () => GovernmentComplianceKit,
8850
8850
  IdentityGatekeeper: () => IdentityGatekeeper,
8851
8851
  IdentityManager: () => IdentityManager,
8852
+ InMemoryLedgerAdapter: () => InMemoryLedgerAdapter,
8852
8853
  IntentProtocol: () => IntentProtocol,
8853
8854
  Invariance: () => Invariance,
8854
8855
  InvarianceError: () => InvarianceError,
@@ -8858,6 +8859,7 @@ __export(index_exports, {
8858
8859
  MarketplaceKit: () => MarketplaceKit,
8859
8860
  MarketplacePlugin: () => MarketplacePlugin,
8860
8861
  MultiAgentComposer: () => MultiAgentComposer,
8862
+ OffchainLedger: () => OffchainLedger,
8861
8863
  PipelineBuilder: () => PipelineBuilder,
8862
8864
  PolicyEngine: () => PolicyEngine,
8863
8865
  ReputationBridge: () => ReputationBridge,
@@ -8866,8 +8868,10 @@ __export(index_exports, {
8866
8868
  SDK_VERSION: () => SDK_VERSION,
8867
8869
  SessionContext: () => SessionContext,
8868
8870
  SocialGraphAdapter: () => SocialGraphAdapter,
8871
+ SupabaseLedgerAdapter: () => SupabaseLedgerAdapter,
8869
8872
  Telemetry: () => Telemetry,
8870
8873
  Verifier: () => Verifier,
8874
+ VotingManager: () => VotingManager,
8871
8875
  WalletManager: () => WalletManager,
8872
8876
  X402Manager: () => X402Manager,
8873
8877
  generatePrivateKey: () => import_accounts3.generatePrivateKey,
@@ -8880,6 +8884,8 @@ __export(index_exports, {
8880
8884
  module.exports = __toCommonJS(index_exports);
8881
8885
 
8882
8886
  // src/core/InvarianceClient.ts
8887
+ init_dist();
8888
+ init_InvarianceError();
8883
8889
  var import_chains2 = require("viem/chains");
8884
8890
  var import_accounts2 = require("viem/accounts");
8885
8891
 
@@ -8904,6 +8910,7 @@ var ABI_MAP = {
8904
8910
  atomicVerifier: InvarianceAtomicVerifierAbi,
8905
8911
  voting: InvarianceVotingAbi
8906
8912
  };
8913
+ var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
8907
8914
  var ADDRESS_KEY_MAP = {
8908
8915
  identity: "identity",
8909
8916
  policy: "policy",
@@ -8997,6 +9004,12 @@ var ContractFactory = class {
8997
9004
  `Contract address not configured: ${name}`
8998
9005
  );
8999
9006
  }
9007
+ if (addr === ZERO_ADDRESS) {
9008
+ throw new InvarianceError(
9009
+ ErrorCode.NETWORK_ERROR,
9010
+ `Contract address for ${name} is the zero address. Contracts may not be deployed on this chain yet.`
9011
+ );
9012
+ }
9000
9013
  return addr;
9001
9014
  }
9002
9015
  /**
@@ -17063,8 +17076,191 @@ var VotingManager = class {
17063
17076
  }
17064
17077
  };
17065
17078
 
17079
+ // src/modules/ledger/OffchainLedger.ts
17080
+ var OffchainLedger = class {
17081
+ events;
17082
+ telemetry;
17083
+ failOpen;
17084
+ adapter;
17085
+ constructor(events, telemetry, options) {
17086
+ this.events = events;
17087
+ this.telemetry = telemetry;
17088
+ this.adapter = options.adapter;
17089
+ this.failOpen = options.failOpen ?? true;
17090
+ }
17091
+ /**
17092
+ * Log a ledger event.
17093
+ *
17094
+ * @param event - Same `LedgerEventInput` used by on-chain ledger
17095
+ * @returns The created off-chain ledger entry
17096
+ */
17097
+ async log(event) {
17098
+ this.telemetry.track("offchain_ledger.log", { action: event.action });
17099
+ const entryId = crypto.randomUUID();
17100
+ const timestamp = Date.now();
17101
+ const category = event.category ?? "custom";
17102
+ const severity = event.severity ?? "info";
17103
+ const entry = {
17104
+ entryId,
17105
+ action: event.action,
17106
+ actor: event.actor,
17107
+ category,
17108
+ severity,
17109
+ timestamp,
17110
+ createdAt: new Date(timestamp).toISOString()
17111
+ };
17112
+ if (event.metadata) {
17113
+ entry.metadata = event.metadata;
17114
+ }
17115
+ try {
17116
+ const persisted = await this.adapter.insert(entry);
17117
+ this.events.emit("ledger.logged", { entryId: persisted.entryId, action: persisted.action });
17118
+ return persisted;
17119
+ } catch (err) {
17120
+ if (this.failOpen) {
17121
+ this.events.emit("ledger.logged", { entryId: entry.entryId, action: entry.action });
17122
+ return entry;
17123
+ }
17124
+ throw err;
17125
+ }
17126
+ }
17127
+ /**
17128
+ * Query off-chain ledger entries.
17129
+ *
17130
+ * @param filters - Same `LedgerQueryFilters` used by on-chain ledger
17131
+ * @returns Matching off-chain ledger entries
17132
+ */
17133
+ async query(filters) {
17134
+ this.telemetry.track("offchain_ledger.query", { action: filters.action });
17135
+ try {
17136
+ return await this.adapter.query(filters);
17137
+ } catch (err) {
17138
+ if (this.failOpen) {
17139
+ return [];
17140
+ }
17141
+ throw err;
17142
+ }
17143
+ }
17144
+ };
17145
+
17146
+ // src/modules/ledger/adapters/SupabaseLedgerAdapter.ts
17147
+ init_dist();
17148
+ init_InvarianceError();
17149
+ var TABLE_NAME = "offchain_ledger_entries";
17150
+ var SupabaseLedgerAdapter = class _SupabaseLedgerAdapter {
17151
+ url;
17152
+ key;
17153
+ client = null;
17154
+ clientPromise = null;
17155
+ constructor(options) {
17156
+ this.url = options.url;
17157
+ this.key = options.key;
17158
+ }
17159
+ /** @internal */
17160
+ async getClient() {
17161
+ if (this.client) return this.client;
17162
+ if (this.clientPromise) return this.clientPromise;
17163
+ this.clientPromise = (async () => {
17164
+ try {
17165
+ const { createClient } = await import("@supabase/supabase-js");
17166
+ this.client = createClient(this.url, this.key);
17167
+ return this.client;
17168
+ } catch {
17169
+ throw new InvarianceError(
17170
+ ErrorCode.NETWORK_ERROR,
17171
+ "Failed to import @supabase/supabase-js. Install it with: npm install @supabase/supabase-js"
17172
+ );
17173
+ }
17174
+ })();
17175
+ return this.clientPromise;
17176
+ }
17177
+ /** Persist a ledger entry to Supabase. */
17178
+ async insert(entry) {
17179
+ const row = {
17180
+ entry_id: entry.entryId,
17181
+ action: entry.action,
17182
+ actor_type: entry.actor.type,
17183
+ actor_address: entry.actor.address,
17184
+ category: entry.category,
17185
+ severity: entry.severity,
17186
+ metadata: entry.metadata ?? null,
17187
+ timestamp: entry.timestamp
17188
+ };
17189
+ const client = await this.getClient();
17190
+ const { data, error } = await client.from(TABLE_NAME).insert(row).select().single();
17191
+ if (error) {
17192
+ throw new InvarianceError(ErrorCode.NETWORK_ERROR, `Supabase insert failed: ${error.message}`);
17193
+ }
17194
+ return _SupabaseLedgerAdapter.toEntry(data);
17195
+ }
17196
+ /** Query ledger entries from Supabase. */
17197
+ async query(filters) {
17198
+ const client = await this.getClient();
17199
+ let q = client.from(TABLE_NAME).select("*");
17200
+ if (filters.actor) {
17201
+ q = q.eq("actor_address", filters.actor);
17202
+ }
17203
+ if (filters.actorType) {
17204
+ q = q.eq("actor_type", filters.actorType);
17205
+ }
17206
+ if (filters.action) {
17207
+ if (Array.isArray(filters.action)) {
17208
+ q = q.in("action", filters.action);
17209
+ } else {
17210
+ q = q.eq("action", filters.action);
17211
+ }
17212
+ }
17213
+ if (filters.category) {
17214
+ q = q.eq("category", filters.category);
17215
+ }
17216
+ if (filters.from !== void 0) {
17217
+ const fromTs = typeof filters.from === "string" ? new Date(filters.from).getTime() : filters.from;
17218
+ q = q.gte("timestamp", fromTs);
17219
+ }
17220
+ if (filters.to !== void 0) {
17221
+ const toTs = typeof filters.to === "string" ? new Date(filters.to).getTime() : filters.to;
17222
+ q = q.lte("timestamp", toTs);
17223
+ }
17224
+ const orderCol = filters.orderBy ?? "timestamp";
17225
+ const ascending = (filters.order ?? "desc") === "asc";
17226
+ q = q.order(orderCol, { ascending });
17227
+ if (filters.limit) {
17228
+ q = q.limit(filters.limit);
17229
+ }
17230
+ if (filters.offset) {
17231
+ q = q.range(filters.offset, filters.offset + (filters.limit ?? 100) - 1);
17232
+ }
17233
+ const { data, error } = await q;
17234
+ if (error) {
17235
+ throw new InvarianceError(ErrorCode.NETWORK_ERROR, `Supabase query failed: ${error.message}`);
17236
+ }
17237
+ return data.map(
17238
+ (row) => _SupabaseLedgerAdapter.toEntry(row)
17239
+ );
17240
+ }
17241
+ /** Map a Supabase row to an OffchainLedgerEntry. */
17242
+ static toEntry(row) {
17243
+ const entry = {
17244
+ entryId: row["entry_id"],
17245
+ action: row["action"],
17246
+ actor: {
17247
+ type: row["actor_type"],
17248
+ address: row["actor_address"]
17249
+ },
17250
+ category: row["category"],
17251
+ severity: row["severity"],
17252
+ timestamp: row["timestamp"],
17253
+ createdAt: row["created_at"]
17254
+ };
17255
+ if (row["metadata"] != null) {
17256
+ entry.metadata = row["metadata"];
17257
+ }
17258
+ return entry;
17259
+ }
17260
+ };
17261
+
17066
17262
  // src/core/InvarianceClient.ts
17067
- var SDK_VERSION = "0.0.1";
17263
+ var SDK_VERSION = "0.1.1";
17068
17264
  var Invariance = class _Invariance {
17069
17265
  config;
17070
17266
  contracts;
@@ -17089,6 +17285,7 @@ var Invariance = class _Invariance {
17089
17285
  _marketplace;
17090
17286
  _auditTrail;
17091
17287
  _voting;
17288
+ _ledgerOffchain;
17092
17289
  // ===========================================================================
17093
17290
  // Static Factory Methods
17094
17291
  // ===========================================================================
@@ -17467,6 +17664,39 @@ var Invariance = class _Invariance {
17467
17664
  }
17468
17665
  return this._auditTrail;
17469
17666
  }
17667
+ /**
17668
+ * Off-chain ledger module backed by a pluggable {@link LedgerAdapter}.
17669
+ *
17670
+ * Same `LedgerEventInput` interface as on-chain, zero gas.
17671
+ * Resolution order: `config.ledgerAdapter` > `config.supabase` > env vars.
17672
+ *
17673
+ * @example
17674
+ * ```typescript
17675
+ * const entry = await inv.ledgerOffchain.log({
17676
+ * action: 'model-inference',
17677
+ * actor: { type: 'agent', address: '0xBot' },
17678
+ * });
17679
+ * ```
17680
+ */
17681
+ get ledgerOffchain() {
17682
+ if (!this._ledgerOffchain) {
17683
+ let adapter = this.config.ledgerAdapter;
17684
+ if (!adapter) {
17685
+ const url = this.config.supabase?.url ?? process.env["INVARIANCE_SUPABASE_URL"];
17686
+ const key = this.config.supabase?.key ?? process.env["INVARIANCE_SUPABASE_KEY"];
17687
+ if (!url || !key) {
17688
+ throw new InvarianceError(
17689
+ ErrorCode.INVALID_INPUT,
17690
+ "Off-chain ledger requires either config.ledgerAdapter, config.supabase (url + key), or INVARIANCE_SUPABASE_URL / INVARIANCE_SUPABASE_KEY env vars."
17691
+ );
17692
+ }
17693
+ adapter = new SupabaseLedgerAdapter({ url, key });
17694
+ }
17695
+ const failOpen = this.config.supabase?.failOpen ?? true;
17696
+ this._ledgerOffchain = new OffchainLedger(this.events, this.telemetry, { adapter, failOpen });
17697
+ }
17698
+ return this._ledgerOffchain;
17699
+ }
17470
17700
  /**
17471
17701
  * Off-chain batch voting with merkle root settlement.
17472
17702
  *
@@ -18035,6 +18265,59 @@ var Invariance = class _Invariance {
18035
18265
  init_InvarianceError();
18036
18266
  init_dist();
18037
18267
 
18268
+ // src/modules/ledger/adapters/InMemoryLedgerAdapter.ts
18269
+ var InMemoryLedgerAdapter = class {
18270
+ /** @internal */
18271
+ entries = [];
18272
+ async insert(entry) {
18273
+ this.entries.push(entry);
18274
+ return entry;
18275
+ }
18276
+ async query(filters) {
18277
+ let results = [...this.entries];
18278
+ if (filters.actor) {
18279
+ results = results.filter((e) => e.actor.address === filters.actor);
18280
+ }
18281
+ if (filters.actorType) {
18282
+ results = results.filter((e) => e.actor.type === filters.actorType);
18283
+ }
18284
+ if (filters.action) {
18285
+ if (Array.isArray(filters.action)) {
18286
+ results = results.filter((e) => filters.action.includes(e.action));
18287
+ } else {
18288
+ results = results.filter((e) => e.action === filters.action);
18289
+ }
18290
+ }
18291
+ if (filters.category) {
18292
+ results = results.filter((e) => e.category === filters.category);
18293
+ }
18294
+ if (filters.from !== void 0) {
18295
+ const fromTs = typeof filters.from === "string" ? new Date(filters.from).getTime() : filters.from;
18296
+ results = results.filter((e) => e.timestamp >= fromTs);
18297
+ }
18298
+ if (filters.to !== void 0) {
18299
+ const toTs = typeof filters.to === "string" ? new Date(filters.to).getTime() : filters.to;
18300
+ results = results.filter((e) => e.timestamp <= toTs);
18301
+ }
18302
+ const ascending = (filters.order ?? "desc") === "asc";
18303
+ const orderBy = filters.orderBy ?? "timestamp";
18304
+ results.sort((a, b) => {
18305
+ const aVal = a[orderBy];
18306
+ const bVal = b[orderBy];
18307
+ if (aVal < bVal) return ascending ? -1 : 1;
18308
+ if (aVal > bVal) return ascending ? 1 : -1;
18309
+ return 0;
18310
+ });
18311
+ if (filters.offset) {
18312
+ results = results.slice(filters.offset);
18313
+ }
18314
+ if (filters.limit) {
18315
+ results = results.slice(0, filters.limit);
18316
+ }
18317
+ return results;
18318
+ }
18319
+ };
18320
+
18038
18321
  // src/utils/webhook.ts
18039
18322
  var import_crypto = require("crypto");
18040
18323
  function verifyWebhookSignature(body, signature, secret) {
@@ -18997,6 +19280,7 @@ var import_accounts3 = require("viem/accounts");
18997
19280
  GovernmentComplianceKit,
18998
19281
  IdentityGatekeeper,
18999
19282
  IdentityManager,
19283
+ InMemoryLedgerAdapter,
19000
19284
  IntentProtocol,
19001
19285
  Invariance,
19002
19286
  InvarianceError,
@@ -19006,6 +19290,7 @@ var import_accounts3 = require("viem/accounts");
19006
19290
  MarketplaceKit,
19007
19291
  MarketplacePlugin,
19008
19292
  MultiAgentComposer,
19293
+ OffchainLedger,
19009
19294
  PipelineBuilder,
19010
19295
  PolicyEngine,
19011
19296
  ReputationBridge,
@@ -19014,8 +19299,10 @@ var import_accounts3 = require("viem/accounts");
19014
19299
  SDK_VERSION,
19015
19300
  SessionContext,
19016
19301
  SocialGraphAdapter,
19302
+ SupabaseLedgerAdapter,
19017
19303
  Telemetry,
19018
19304
  Verifier,
19305
+ VotingManager,
19019
19306
  WalletManager,
19020
19307
  X402Manager,
19021
19308
  generatePrivateKey,