@moltium/world-core 0.1.9 → 0.1.11

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
@@ -70,8 +70,8 @@ var PersistenceConfigSchema = _zod.z.object({
70
70
  });
71
71
  var BlockchainConfigSchema = _zod.z.object({
72
72
  rpcUrl: _zod.z.string().url(),
73
- privateKey: _zod.z.string().regex(/^0x[a-fA-F0-9]{64}$/, "Invalid private key format"),
74
- entryFee: _zod.z.number().nonnegative(),
73
+ privateKey: _zod.z.string().regex(/^0x[a-fA-F0-9]{64}$/, "Invalid private key format").optional(),
74
+ entryFee: _zod.z.number().nonnegative().optional(),
75
75
  requireMembership: _zod.z.boolean().optional(),
76
76
  enforceOnChainValidation: _zod.z.boolean().optional(),
77
77
  agentRegistryAddress: _zod.z.string().optional(),
@@ -229,6 +229,12 @@ async function createSQLiteAdapter(config) {
229
229
  return new class {
230
230
 
231
231
  async connect() {
232
+ const path = await Promise.resolve().then(() => _interopRequireWildcard(require("path")));
233
+ const fs = await Promise.resolve().then(() => _interopRequireWildcard(require("fs")));
234
+ const dir = path.dirname(config.filename);
235
+ if (dir && dir !== ".") {
236
+ fs.mkdirSync(dir, { recursive: true });
237
+ }
232
238
  this.db = new Database(config.filename);
233
239
  this.db.exec(`
234
240
  CREATE TABLE IF NOT EXISTS world_state (
@@ -795,7 +801,7 @@ var World = (_class2 = class {
795
801
  this.setState("initializing");
796
802
  try {
797
803
  if (this.config.persistence) {
798
- logger4.info("Connecting to persistence backend:", this.config.persistence.type);
804
+ logger4.info(`Connecting to persistence backend: ${this.config.persistence.type}`);
799
805
  this.persistence = await createPersistence(this.config.persistence);
800
806
  await this.persistence.connect();
801
807
  const savedState = await this.persistence.loadState();
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/index.cjs","../src/config/types.ts","../src/config/validator.ts","../src/persistence/adapters/InMemoryAdapter.ts","../src/persistence/PersistenceFactory.ts","../src/engine/World.ts","../src/discovery/AgentEvaluator.ts","../src/blockchain/BlockchainClient.ts","../src/server/app.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACwUO,SAAS,eAAA,CAAgB,IAAA,EAAiB,aAAA,EAAsC;AACrF,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,IAAA,CAAK,IAAA;AAAA,IACX,eAAA,EAAiB,IAAA,CAAK,eAAA;AAAA,IACtB,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,SAAA,mBAAW,IAAA,CAAK,YAAA,CAAa,SAAA,UAAa,OAAA;AAAA,MAC1C,iBAAA,mBAAmB,IAAA,CAAK,YAAA,CAAa,iBAAA,UAAqB,OAAA;AAAA,MAC1D,sBAAA,EAAwB,IAAA,CAAK,YAAA,CAAa;AAAA,IAC5C,CAAA;AAAA,IACA,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AACF;ADtUA;AACA;AExBA,0BAAkB;AAQX,IAAM,qBAAA,EAAuB,MAAA,CAAE,MAAA,CAAO;AAAA,EAC3C,SAAA,EAAW,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAChD,cAAA,EAAgB,MAAA,CAAE,KAAA,CAAM,MAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC7C,YAAA,EAAc,MAAA,CAAE,KAAA,CAAM,MAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC3C,kBAAA,EAAoB,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACxC,eAAA,EAAiB,MAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAA,CAAS;AACzC,CAAC,CAAA;AAGD,IAAM,mBAAA,EAAqB,MAAA,CAAE,MAAA,CAAO;AAAA,EAClC,QAAA,EAAU,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACnB,MAAA,EAAQ,MAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,QAAA,CAAS;AAC/B,CAAC,CAAA;AAED,IAAM,qBAAA,EAAuB,MAAA,CAAE,MAAA,CAAO;AAAA,EACpC,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACf,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC1B,QAAA,EAAU,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACnB,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACf,QAAA,EAAU,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACnB,GAAA,EAAK,MAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC1B,GAAA,EAAK,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS;AAC3B,CAAC,CAAA;AAED,IAAM,kBAAA,EAAoB,MAAA,CAAE,MAAA,CAAO;AAAA,EACjC,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACf,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC1B,QAAA,EAAU,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC9B,EAAA,EAAI,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACxB,SAAA,EAAW,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS;AACjC,CAAC,CAAA;AAED,IAAM,oBAAA,EAAsB,MAAA,CAAE,MAAA,CAAO;AAAA,EACnC,GAAA,EAAK,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACd,QAAA,EAAU,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACnB,kBAAA,EAAoB,MAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,QAAA,CAAS;AAC3C,CAAC,CAAA;AAED,IAAM,oBAAA,EAAsB,MAAA,CAAE,MAAA,CAAO;AAAA,EACnC,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO;AACjB,CAAC,CAAA;AAEM,IAAM,wBAAA,EAA0B,MAAA,CAAE,MAAA,CAAO;AAAA,EAC9C,IAAA,EAAM,MAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,EAC5E,MAAA,EAAQ,kBAAA,CAAmB,QAAA,CAAS,CAAA;AAAA,EACpC,QAAA,EAAU,oBAAA,CAAqB,QAAA,CAAS,CAAA;AAAA,EACxC,KAAA,EAAO,iBAAA,CAAkB,QAAA,CAAS,CAAA;AAAA,EAClC,OAAA,EAAS,mBAAA,CAAoB,QAAA,CAAS,CAAA;AAAA,EACtC,OAAA,EAAS,mBAAA,CAAoB,QAAA,CAAS,CAAA;AAAA,EACtC,kBAAA,EAAoB,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAA,CAAS;AAC3D,CAAC,CAAA;AAEM,IAAM,uBAAA,EAAyB,MAAA,CAAE,MAAA,CAAO;AAAA,EAC7C,MAAA,EAAQ,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA;AAAA,EACvB,UAAA,EAAY,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,qBAAA,EAAuB,4BAA4B,CAAA;AAAA,EAChF,QAAA,EAAU,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,WAAA,CAAY,CAAA;AAAA,EACjC,iBAAA,EAAmB,MAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACxC,wBAAA,EAA0B,MAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC/C,oBAAA,EAAsB,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC1C,yBAAA,EAA2B,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC/C,iBAAA,EAAmB,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACvC,OAAA,EAAS,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS;AACrC,CAAC,CAAA;AAEM,IAAM,kBAAA,EAAoB,MAAA,CAAE,MAAA,CAAO;AAAA,EACxC,MAAA,EAAQ,MAAA,CAAE,OAAA,CAAQ,CAAA;AAAA,EAClB,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC1B,MAAA,EAAQ,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC5B,aAAA,EAAe,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAC9C,QAAA,EAAU,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,CAAS;AACrD,CAAC,CAAA;AAEM,IAAM,kBAAA,EAAoB,MAAA,CAAE,MAAA,CAAO;AAAA,EACxC,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,wBAAwB,CAAA;AAAA,EAChD,WAAA,EAAa,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACjC,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAE1B,MAAA,EAAQ,MAAA,CAAE,MAAA,CAAO;AAAA,IACf,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA;AAAA,IACvC,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO;AAAA,EACjB,CAAC,CAAA;AAAA,EAED,GAAA,EAAK,MAAA,CAAE,MAAA,CAAO;AAAA,IACZ,OAAA,EAAS,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA;AAAA,IACxB,iBAAA,EAAmB,MAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,IACxC,SAAA,EAAW,MAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,QAAA,CAAS;AAAA,EAClC,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAEZ,SAAA,EAAW,oBAAA;AAAA,EAEX,UAAA,EAAY,MAAA,CAAE,MAAA,CAAO;AAAA,IACnB,cAAA,EAAgB,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,IACrD,QAAA,EAAU,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,IAC/C,SAAA,EAAW,MAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,QAAA,CAAS;AAAA,EAClC,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EAEZ,WAAA,EAAa,uBAAA,CAAwB,QAAA,CAAS,CAAA;AAAA,EAC9C,UAAA,EAAY,sBAAA,CAAuB,QAAA,CAAS,CAAA;AAAA,EAC5C,KAAA,EAAO,iBAAA,CAAkB,QAAA,CAAS,CAAA;AAAA,EAElC,KAAA,EAAO,MAAA,CAAE,KAAA,CAAM,MAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA;AAAA,EACjC,SAAA,EAAW,MAAA,CAAE,KAAA,CAAM,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,CAAS;AAChD,CAAC,CAAA;AAKM,SAAS,mBAAA,CAAoB,MAAA,EAAuB;AACzD,EAAA,IAAI;AACF,IAAA,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA;AAAA,EAChC,EAAA,MAAA,CAAS,KAAA,EAAO;AACd,IAAA,GAAA,CAAI,MAAA,WAAiB,MAAA,CAAE,QAAA,EAAU;AAC/B,MAAA,MAAM,SAAA,EAAW,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,EAAA,GAAK,CAAA,EAAA;AACvB,MAAA;AAClB,IAAA;AACM,IAAA;AACR,EAAA;AACF;AAK6D;AACvD,EAAA;AAC4B,IAAA;AACvB,IAAA;AACD,EAAA;AACC,IAAA;AACT,EAAA;AACF;AFLgD;AACA;AGhHW;AACd,iBAAA;AACX,kBAAA;AACoB,kBAAA;AAErB,EAAA;AAE/B,EAAA;AAE0D,EAAA;AAChC,IAAA;AAC1B,EAAA;AAEsD,EAAA;AACZ,IAAA;AAC1C,EAAA;AAEkD,EAAA;AACnB,IAAA;AAC/B,EAAA;AAE6D,EAAA;AAC7B,IAAA;AAEZ,IAAA;AACkB,MAAA;AACpC,IAAA;AAEsB,IAAA;AACc,MAAA;AACpC,IAAA;AAE2B,IAAA;AACS,MAAA;AACpC,IAAA;AAEyB,IAAA;AACW,MAAA;AACpC,IAAA;AAGwC,IAAA;AAErB,IAAA;AACwB,MAAA;AAC3C,IAAA;AAEO,IAAA;AACT,EAAA;AAEsD,EAAA;AACT,IAAA;AAC7C,EAAA;AAEmD,EAAA;AACtB,IAAA;AAC7B,EAAA;AAE2C,EAAA;AACG,IAAA;AAC9C,EAAA;AAE+D,EAAA;AACvB,IAAA;AACR,IAAA;AAChC,EAAA;AAEkC,EAAA;AAElC,EAAA;AAEsC,EAAA;AAC7B,IAAA;AACT,EAAA;AAE6B,EAAA;AACd,IAAA;AACE,IAAA;AACG,IAAA;AACpB,EAAA;AACF;AH4FgD;AACA;AIpLgD;AACzE,EAAA;AACd,IAAA;AACwB,MAAA;AAExB,IAAA;AAC+B,MAAA;AAE/B,IAAA;AACmB,MAAA;AACJ,QAAA;AAClB,MAAA;AACoC,MAAA;AAEjC,IAAA;AACgB,MAAA;AACD,QAAA;AAClB,MAAA;AACsC,MAAA;AAEnC,IAAA;AACkB,MAAA;AACH,QAAA;AAClB,MAAA;AACwC,MAAA;AAErC,IAAA;AACkB,MAAA;AACH,QAAA;AAClB,MAAA;AAC0C,MAAA;AAE5C,IAAA;AACkB,MAAA;AACpB,EAAA;AACF;AAK6E;AACvE,EAAA;AAC6B,IAAA;AAGiB,IAAA;AACtC,MAAA;AAEuB,MAAA;AACS,QAAA;AACzB,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BZ,QAAA;AACH,MAAA;AAE2C,MAAA;AACZ,QAAA;AACW,QAAA;AAC1C,MAAA;AAEgC,MAAA;AACD,QAAA;AACR,QAAA;AACJ,QAAA;AACoB,QAAA;AACvC,MAAA;AAE2C,MAAA;AACZ,QAAA;AACQ,QAAA;AACvC,MAAA;AAE8C,MAAA;AAChC,QAAA;AACW,QAAA;AACL,QAAA;AAAW,UAAA;AAAwC,UAAA;AAAG,QAAA;AAClD,QAAA;AAAW,UAAA;AAAiD,UAAA;AAAG,QAAA;AAC1D,QAAA;AAAW,UAAA;AAAuD,UAAA;AAAG,QAAA;AACvE,QAAA;AAAW,UAAA;AAAqD,UAAA;AAAG,QAAA;AACnF,QAAA;AACU,QAAA;AAAW,UAAA;AAAoC,UAAA;AAAG,QAAA;AACnC,QAAA;AACH,QAAA;AACO,QAAA;AACxC,MAAA;AAE6C,MAAA;AACd,QAAA;AACO,QAAA;AACtC,MAAA;AAEmD,MAAA;AACjC,QAAA;AAClB,MAAA;AAEkC,MAAA;AACH,QAAA;AACM,QAAA;AACrC,MAAA;AAE+C,MAAA;AACjB,QAAA;AACX,QAAA;AACsB,QAAA;AACzC,MAAA;AAEkC,MAAA;AAAgB,QAAA;AAAG,MAAA;AACf,MAAA;AAAM,QAAA;AAAkC,UAAA;AAAU,UAAA;AAAc,QAAA;AAAS,UAAA;AAAO,QAAA;AAAE,MAAA;AAC3F,MAAA;AAAe,QAAA;AAAqE,MAAA;AAChH,IAAA;AACgB,EAAA;AACA,IAAA;AACP,MAAA;AACR,QAAA;AACF,MAAA;AACF,IAAA;AACM,IAAA;AACR,EAAA;AACF;AAK+E;AACzE,EAAA;AAC0B,IAAA;AACQ,IAAA;AACK,IAAA;AACR,IAAA;AACd,EAAA;AACA,IAAA;AACP,MAAA;AACR,QAAA;AACF,MAAA;AACF,IAAA;AACM,IAAA;AACR,EAAA;AACF;AAK4E;AACtE,EAAA;AACoB,IAAA;AACgB,IAAA;AACR,IAAA;AACX,EAAA;AACA,IAAA;AACP,MAAA;AACR,QAAA;AACF,MAAA;AACF,IAAA;AACM,IAAA;AACR,EAAA;AACF;AAK4E;AACtE,EAAA;AAEoB,IAAA;AACgB,IAAA;AACR,IAAA;AACX,EAAA;AACA,IAAA;AACP,MAAA;AACR,QAAA;AACF,MAAA;AACF,IAAA;AACM,IAAA;AACR,EAAA;AACF;AAK8E;AACxE,EAAA;AAEkB,IAAA;AACoB,IAAA;AACR,IAAA;AACb,EAAA;AACA,IAAA;AACP,MAAA;AACR,QAAA;AACF,MAAA;AACF,IAAA;AACM,IAAA;AACR,EAAA;AACF;AJwKgD;AACA;AKpZnB;ALsZmB;AACA;AMlZJ;AAiBhB;AACiB,EAAA;AAAvB,IAAA;AAAwB,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAa1C,EAAA;AAE2C,IAAA;AAC1B,MAAA;AACO,MAAA;AACvB,IAAA;AAG2B,IAAA;AACI,MAAA;AACnB,QAAA;AACO,QAAA;AACjB,MAAA;AAEM,MAAA;AACK,QAAA;AAC2B,QAAA;AACvC,MAAA;AACF,IAAA;AAGmC,IAAA;AACG,MAAA;AACJ,QAAA;AAChB,UAAA;AACS,UAAA;AACtB,QAAA;AAEM,QAAA;AACK,UAAA;AACuB,UAAA;AACnC,QAAA;AACF,MAAA;AACF,IAAA;AAG4C,IAAA;AACJ,MAAA;AACL,MAAA;AACK,QAAA;AACtC,MAAA;AAE8B,MAAA;AACE,QAAA;AACnB,UAAA;AACV,QAAA;AAEM,QAAA;AACK,UAAA;AAC0B,UAAA;AACtC,QAAA;AACF,MAAA;AACF,IAAA;AAG0C,IAAA;AACF,MAAA;AACJ,MAAA;AACD,QAAA;AACjC,MAAA;AAEqB,MAAA;AACW,QAAA;AACP,UAAA;AACtB,QAAA;AAEM,QAAA;AACK,UAAA;AACF,UAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AAGgC,IAAA;AACQ,MAAA;AACE,MAAA;AAEV,MAAA;AACE,QAAA;AACL,UAAA;AACxB,QAAA;AAEM,QAAA;AACT,MAAA;AAG0C,MAAA;AAC3B,QAAA;AACU,UAAA;AACtB,QAAA;AACH,MAAA;AAEO,MAAA;AACT,IAAA;AAG8B,IAAA;AAEvB,IAAA;AACK,MAAA;AACF,MAAA;AACV,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAMmD,EAAA;AACpB,IAAA;AACF,MAAA;AAClB,MAAA;AAC8B,QAAA;AACA,QAAA;AACrC,MAAA;AACF,IAAA;AAEgC,IAAA;AACJ,IAAA;AAEQ,IAAA;AACA,IAAA;AACV,IAAA;AAC5B,EAAA;AACF;ANsWgD;AACA;AOxgBzB;AAIuB;AAGnB;AACzB,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACF;AAE6B;AAC3B,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACF;AAEwB;AACtB,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACF;AAc8B;AAOkB,EAAA;AAA1B,IAAA;AAEyB,IAAA;AACJ,IAAA;AAE3B,IAAA;AACM,MAAA;AACI,MAAA;AACrB,IAAA;AACH,EAAA;AAfQ,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAAA;AAAA;AAAA;AAgBoB,EAAA;AAEY,IAAA;AACJ,MAAA;AAClB,QAAA;AACZ,QAAA;AACK,QAAA;AACP,MAAA;AACY,MAAA;AACW,QAAA;AACtB,MAAA;AACH,IAAA;AAG2C,IAAA;AACJ,MAAA;AACvB,QAAA;AACZ,QAAA;AACK,QAAA;AACP,MAAA;AACY,MAAA;AACW,QAAA;AACtB,MAAA;AACH,IAAA;AAGmC,IAAA;AACJ,MAAA;AACf,QAAA;AACZ,QAAA;AACK,QAAA;AACP,MAAA;AACuC,MAAA;AAChB,QAAA;AACtB,MAAA;AACH,IAAA;AAEqC,IAAA;AACvC,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO6D,EAAA;AAClC,IAAA;AACX,MAAA;AACL,MAAA;AACT,IAAA;AAEI,IAAA;AACuC,MAAA;AACD,MAAA;AAC9B,QAAA;AACR,QAAA;AACD,MAAA;AACM,MAAA;AACY,IAAA;AACN,MAAA;AACH,QAAA;AACK,QAAA;AACd,MAAA;AACM,MAAA;AACT,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO2D,EAAA;AAC3B,IAAA;AACZ,MAAA;AAClB,IAAA;AAEI,IAAA;AAE0B,MAAA;AAEU,MAAA;AAC7B,QAAA;AAC8B,QAAA;AACtC,MAAA;AAGwC,MAAA;AAChC,QAAA;AACR,MAAA;AAE6B,MAAA;AAEO,MAAA;AAC5B,QAAA;AACS,QAAA;AACK,QAAA;AACtB,MAAA;AAEc,MAAA;AACI,IAAA;AACN,MAAA;AACJ,QAAA;AACM,QAAA;AACd,MAAA;AACK,MAAA;AACR,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO2D,EAAA;AAC3B,IAAA;AAChB,MAAA;AACL,MAAA;AACT,IAAA;AAEI,IAAA;AAC+B,MAAA;AAC1B,MAAA;AACY,IAAA;AACN,MAAA;AACJ,QAAA;AACM,QAAA;AACd,MAAA;AACM,MAAA;AACT,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO6D,EAAA;AAC7B,IAAA;AACZ,MAAA;AAClB,IAAA;AAEI,IAAA;AACmC,MAAA;AAEI,MAAA;AACX,MAAA;AAEI,MAAA;AACzB,QAAA;AACS,QAAA;AACjB,MAAA;AAEc,MAAA;AACI,IAAA;AACN,MAAA;AACJ,QAAA;AACM,QAAA;AACd,MAAA;AACK,MAAA;AACR,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAKyC,EAAA;AACT,IAAA;AACrB,MAAA;AACT,IAAA;AAEI,IAAA;AACuB,MAAA;AACN,MAAA;AACA,IAAA;AACN,MAAA;AACN,MAAA;AACT,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAKsC,EAAA;AACN,IAAA;AACZ,MAAA;AAClB,IAAA;AAEI,IAAA;AACkC,MAAA;AAEK,MAAA;AACX,MAAA;AAEA,MAAA;AACZ,QAAA;AACK,QAAA;AACtB,MAAA;AAEc,MAAA;AACI,IAAA;AACqB,MAAA;AAClC,MAAA;AACR,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAK2B,EAAA;AACN,IAAA;AACrB,EAAA;AAAA;AAAA;AAAA;AAKqC,EAAA;AACL,IAAA;AACrB,MAAA;AACT,IAAA;AAEI,IAAA;AACwC,MAAA;AACb,MAAA;AACV,IAAA;AACqB,MAAA;AACjC,MAAA;AACT,IAAA;AACF,EAAA;AACF;APidgD;AACA;AKxuBb;AAehB;AAUgC,EAAA;AAArB,IAAA;AAEA,IAAA;AAGb,IAAA;AACJ,MAAA;AACD,MAAA;AACC,MAAA;AACa,MAAA;AACT,MAAA;AACb,IAAA;AAEsB,IAAA;AACa,IAAA;AACQ,IAAA;AAEV,IAAA;AACV,MAAA;AACO,MAAA;AAC7B,IAAA;AACH,EAAA;AA9BQ,EAAA;AACA,EAAA;AACyC,kBAAA;AACG,kBAAA;AAC5C,EAAA;AACA,EAAA;AACsC,kBAAA;AACI,kBAAA;AAAA;AAAA;AAAA;AA4BtB,EAAA;AACS,IAAA;AACP,IAAA;AAExB,IAAA;AAE2B,MAAA;AACf,QAAA;AACa,QAAA;AACM,QAAA;AAGD,QAAA;AACd,QAAA;AACD,UAAA;AACD,UAAA;AACQ,YAAA;AACD,YAAA;AAClB,UAAA;AAG8B,UAAA;AACE,UAAA;AACC,YAAA;AAClC,UAAA;AAEoC,UAAA;AACtC,QAAA;AACF,MAAA;AAG4B,MAAA;AACd,QAAA;AACgB,QAAA;AACK,QAAA;AACnC,MAAA;AAGyC,MAAA;AACA,QAAA;AAEA,QAAA;AAEH,QAAA;AACV,UAAA;AACW,UAAA;AAE7B,YAAA;AAC+B,cAAA;AACd,YAAA;AACP,cAAA;AACd,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AAGsB,MAAA;AACD,QAAA;AACrB,MAAA;AAEqB,MAAA;AACT,MAAA;AACU,QAAA;AACkB,QAAA;AACvC,MAAA;AACkB,IAAA;AACN,MAAA;AACS,MAAA;AAChB,MAAA;AACR,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAK6B,EAAA;AACS,IAAA;AACI,MAAA;AACtC,MAAA;AACF,IAAA;AAE0C,IAAA;AACnB,IAAA;AAEH,IAAA;AACP,MAAA;AACL,MAAA;AACc,MAAA;AACrB,IAAA;AAG2C,IAAA;AACxB,MAAA;AACpB,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAK4B,EAAA;AACK,IAAA;AACR,IAAA;AAGA,IAAA;AACU,MAAA;AACX,MAAA;AACtB,IAAA;AAG2B,IAAA;AACU,MAAA;AACX,MAAA;AAC1B,IAAA;AAGsB,IAAA;AACkB,MAAA;AACxC,IAAA;AAEoB,IAAA;AACP,MAAA;AACL,MAAA;AACc,MAAA;AACrB,IAAA;AAE0B,IAAA;AAC7B,EAAA;AAAA;AAAA;AAAA;AAKmE,EAAA;AAC3B,IAAA;AAEd,IAAA;AACN,MAAA;AAClB,IAAA;AAGyC,IAAA;AACZ,MAAA;AACb,MAAA;AACI,QAAA;AAClB,MAAA;AACyC,MAAA;AAC3C,IAAA;AAGyC,IAAA;AAEN,MAAA;AAEb,MAAA;AACN,QAAA;AACgB,QAAA;AACvB,MAAA;AACO,QAAA;AACd,MAAA;AACF,IAAA;AAE8B,IAAA;AAClB,MAAA;AACC,MAAA;AACW,MAAA;AACT,MAAA;AACC,MAAA;AACiB,QAAA;AACQ,QAAA;AACR,QAAA;AAC/B,MAAA;AACmB,MAAA;AACJ,MAAA;AACI,MAAA;AACnB,MAAA;AACF,IAAA;AAEoC,IAAA;AAEd,IAAA;AACoB,MAAA;AAC1C,IAAA;AAEoB,IAAA;AACP,MAAA;AACL,MAAA;AACc,MAAA;AACF,MAAA;AACwB,MAAA;AAC3C,IAAA;AAE0C,IAAA;AAC3B,MAAA;AACW,MAAA;AAC1B,IAAA;AACH,EAAA;AAAA;AAAA;AAAA;AAKmD,EAAA;AACX,IAAA;AAC1B,IAAA;AAC0B,MAAA;AACtC,IAAA;AAE2B,IAAA;AAEL,IAAA;AACe,MAAA;AACrC,IAAA;AAEoB,IAAA;AACP,MAAA;AACL,MAAA;AACc,MAAA;AACpB,MAAA;AACyB,MAAA;AAC1B,IAAA;AAEuC,IAAA;AACb,MAAA;AAC1B,IAAA;AACH,EAAA;AAAA;AAAA;AAAA;AAK4B,EAAA;AACY,IAAA;AACxC,EAAA;AAAA;AAAA;AAAA;AAK+B,EAAA;AACN,IAAA;AACzB,EAAA;AAAA;AAAA;AAAA;AAKyD,EAAA;AACjC,IAAA;AACkB,MAAA;AACxC,IAAA;AACF,EAAA;AAAA;AAAA;AAAA;AAK0C,EAAA;AACrB,IAAA;AACa,IAAA;AAClC,EAAA;AAAA;AAAA;AAAA;AAK8B,EAAA;AACc,IAAA;AAEN,IAAA;AACZ,MAAA;AACkB,QAAA;AACD,QAAA;AACvC,MAAA;AACS,IAAA;AAEC,IAAA;AACd,EAAA;AAAA;AAAA;AAAA;AAK6B,EAAA;AACc,IAAA;AAEG,IAAA;AAC/B,MAAA;AAES,MAAA;AACP,QAAA;AACL,QAAA;AACc,QAAA;AACU,QAAA;AAC/B,MAAA;AAEqC,MAAA;AAGE,MAAA;AAC1B,QAAA;AACI,QAAA;AAClB,MAAA;AACS,IAAA;AAEC,IAAA;AACd,EAAA;AACF;ALupBgD;AACA;AQvgCmB;AAI1B;AAgBa;AAChC,EAAA;AAGE,EAAA;AACwB,EAAA;AAGlB,EAAA;AACgB,IAAA;AAC7B,MAAA;AACH,MAAA;AACT,IAAA;AACI,IAAA;AACN,EAAA;AAK6C,EAAA;AACnC,IAAA;AACY,MAAA;AACO,MAAA;AACC,MAAA;AACL,MAAA;AACQ,MAAA;AACI,MAAA;AACvB,MAAA;AAC8B,QAAA;AACF,QAAA;AACJ,QAAA;AACnC,MAAA;AACD,IAAA;AACF,EAAA;AAW8D,EAAA;AACzD,IAAA;AACsC,MAAA;AAEzB,MAAA;AACe,QAAA;AACjB,UAAA;AACF,UAAA;AACR,QAAA;AACH,MAAA;AAEwC,MAAA;AACb,QAAA;AAC1B,MAAA;AAGqC,MAAA;AACL,MAAA;AAEI,MAAA;AACP,QAAA;AACjB,UAAA;AAC6B,UAAA;AACvC,QAAA;AACH,MAAA;AAGoC,MAAA;AAE3B,MAAA;AACE,QAAA;AACA,QAAA;AACF,QAAA;AACc,UAAA;AACW,UAAA;AAChC,QAAA;AACD,MAAA;AACkB,IAAA;AACN,MAAA;AAEQ,MAAA;AACV,QAAA;AACe,QAAA;AACzB,MAAA;AACH,IAAA;AACD,EAAA;AAKyD,EAAA;AACnB,IAAA;AACxB,MAAA;AACC,MAAA;AACW,MAAA;AACW,MAAA;AAClB,MAAA;AACJ,MAAA;AACZ,IAAA;AAEO,IAAA;AACP,MAAA;AACc,MAAA;AACf,IAAA;AACF,EAAA;AAKwD,EAAA;AAC9B,IAAA;AAC1B,EAAA;AAK+D,EAAA;AAC1D,IAAA;AACgB,MAAA;AACT,MAAA;AACE,QAAA;AACA,QAAA;AACa,QAAA;AACvB,MAAA;AACkB,IAAA;AACE,MAAA;AACV,QAAA;AACI,QAAA;AACd,MAAA;AACH,IAAA;AACD,EAAA;AAK8D,EAAA;AACzD,IAAA;AACe,MAAA;AACR,MAAA;AACE,QAAA;AACA,QAAA;AACa,QAAA;AACvB,MAAA;AACkB,IAAA;AACE,MAAA;AACV,QAAA;AACI,QAAA;AACd,MAAA;AACH,IAAA;AACD,EAAA;AAK4C,EAAA;AACvC,IAAA;AAC+B,MAAA;AACS,MAAA;AAIV,MAAA;AAEvB,MAAA;AACE,QAAA;AACA,QAAA;AACV,MAAA;AACkB,IAAA;AACE,MAAA;AACV,QAAA;AACI,QAAA;AACd,MAAA;AACH,IAAA;AACD,EAAA;AAGwC,EAAA;AAClB,IAAA;AACZ,MAAA;AACG,MAAA;AACX,IAAA;AACF,EAAA;AAG6D,EAAA;AAC3B,IAAA;AAEZ,IAAA;AACZ,MAAA;AACM,MAAA;AACd,IAAA;AACF,EAAA;AAEM,EAAA;AACT;AAKoE;AAClC,EAAA;AAEc,EAAA;AACR,IAAA;AAEG,IAAA;AACD,IAAA;AACxB,IAAA;AACU,IAAA;AACZ,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACb,EAAA;AAGiC,EAAA;AACpB,IAAA;AAEa,IAAA;AACN,MAAA;AACH,MAAA;AACf,IAAA;AACF,EAAA;AAEgC,EAAA;AACnB,IAAA;AAEa,IAAA;AACN,MAAA;AACH,MAAA;AACf,IAAA;AACF,EAAA;AACH;ARk7BgD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/index.cjs","sourcesContent":[null,"import type { AgentCard } from '@a2a-js/sdk';\n\n/**\n * ============================================================================\n * WORLD CONFIGURATION TYPES\n * ============================================================================\n */\n\nexport interface WorldConfig {\n /** World name (unique identifier) */\n name: string;\n \n /** World description */\n description?: string;\n \n /** World type (for plugin system) */\n type?: string;\n \n /** Server configuration */\n server: {\n port: number;\n host: string;\n };\n \n /** A2A configuration for the world itself */\n a2a?: {\n baseUrl: string;\n pushNotifications?: boolean;\n streaming?: boolean;\n };\n \n /** Admission rules for agent entry */\n admission: AdmissionRules;\n \n /** Simulation configuration */\n simulation?: {\n /** Tick interval in milliseconds */\n tickIntervalMs?: number;\n \n /** Maximum ticks before auto-stop */\n maxTicks?: number;\n \n /** Auto-start simulation on world init */\n autoStart?: boolean;\n };\n \n /** Persistence configuration */\n persistence?: PersistenceConfig;\n \n /** Blockchain configuration */\n blockchain?: BlockchainConfig;\n \n /** Optional world token configuration */\n token?: TokenConfig;\n \n /** World-specific rules */\n rules?: WorldRule[];\n \n /** Pre-configured agent URLs to discover on startup */\n agentUrls?: string[];\n}\n\n/**\n * ============================================================================\n * ADMISSION RULES\n * ============================================================================\n */\n\nexport interface AdmissionRules {\n /** Maximum number of agents allowed */\n maxAgents?: number;\n \n /** Required skills (agent must have ALL of these) */\n requiredSkills?: string[];\n \n /** Required tags (agent must have AT LEAST ONE) */\n requiredTags?: string[];\n \n /** Minimum protocol version */\n minProtocolVersion?: string;\n \n /** Custom evaluator function */\n customEvaluator?: (profile: AgentProfile) => Promise<AdmissionDecision>;\n}\n\nexport interface AdmissionDecision {\n admitted: boolean;\n reason?: string;\n role?: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * AGENT PROFILE\n * ============================================================================\n */\n\nexport interface AgentProfile {\n /** Agent URL (canonical identifier from Agent Card) */\n url: string;\n \n /** Agent name */\n name: string;\n \n /** Protocol version */\n protocolVersion: string;\n \n /** Skills from Agent Card */\n skills: Array<{\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n }>;\n \n /** Capabilities */\n capabilities: {\n streaming: boolean;\n pushNotifications: boolean;\n stateTransitionHistory?: boolean;\n };\n \n /** When agent joined the world */\n joinedAt: number;\n \n /** Assigned role (optional) */\n role?: string;\n \n /** Additional metadata */\n metadata?: Record<string, any>;\n \n /** Wallet address (for blockchain membership) */\n walletAddress?: string;\n}\n\n/**\n * ============================================================================\n * WORLD STATE\n * ============================================================================\n */\n\nexport type WorldPhase = \n | 'idle' \n | 'initializing' \n | 'ready' \n | 'running' \n | 'paused' \n | 'completed' \n | 'stopped' \n | 'failed';\n\nexport interface WorldStateSnapshot {\n phase: WorldPhase;\n tick: number;\n round: number;\n timestamp: number;\n metadata: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * WORLD EVENTS\n * ============================================================================\n */\n\nexport interface WorldEvent {\n id: string;\n type: string;\n timestamp: number;\n agentUrl?: string;\n data?: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * WORLD RULES\n * ============================================================================\n */\n\nexport interface WorldRule {\n id: string;\n name: string;\n description?: string;\n evaluate: (context: RuleContext) => Promise<RuleViolation | null>;\n}\n\nexport interface RuleContext {\n world: {\n phase: WorldPhase;\n tick: number;\n agents: Map<string, AgentProfile>;\n };\n event?: WorldEvent;\n agent?: AgentProfile;\n}\n\nexport interface RuleViolation {\n ruleId: string;\n severity: 'warning' | 'error' | 'critical';\n message: string;\n agentUrl?: string;\n action?: 'warn' | 'kick' | 'pause_world';\n}\n\n/**\n * ============================================================================\n * PERSISTENCE CONFIGURATION\n * ============================================================================\n */\n\nexport interface PersistenceConfig {\n type: 'memory' | 'postgres' | 'redis' | 'mongodb' | 'sqlite' | 'leveldb';\n \n // Adapter-specific configs (only one should be present based on type)\n postgres?: {\n host: string;\n port?: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean;\n max?: number; // connection pool size\n };\n \n redis?: {\n host: string;\n port?: number;\n password?: string;\n db?: number;\n };\n \n mongodb?: {\n url: string;\n database: string;\n };\n \n sqlite?: {\n filename: string;\n };\n \n leveldb?: {\n location: string;\n };\n \n /** Auto-save interval in milliseconds (default: 10000) */\n autoSaveIntervalMs?: number;\n}\n\n/**\n * ============================================================================\n * BLOCKCHAIN CONFIGURATION\n * ============================================================================\n */\n\nexport interface BlockchainConfig {\n /** Monad RPC URL */\n rpcUrl: string;\n \n /** World owner's private key */\n privateKey: string;\n \n /** Entry fee in MON tokens */\n entryFee: number;\n \n /** Require NFT membership for participation (default: true) */\n requireMembership?: boolean;\n \n /** Enforce on-chain agent validation (default: false) */\n enforceOnChainValidation?: boolean;\n \n /** Contract addresses (filled after deployment) */\n agentRegistryAddress?: string;\n membershipContractAddress?: string;\n worldTokenAddress?: string;\n \n /** Chain ID */\n chainId?: number;\n}\n\n/**\n * ============================================================================\n * TOKEN CONFIGURATION\n * ============================================================================\n */\n\nexport interface TokenConfig {\n /** Deploy custom world token */\n deploy: boolean;\n \n /** Token name */\n name?: string;\n \n /** Token symbol */\n symbol?: string;\n \n /** Initial supply */\n initialSupply?: number;\n \n /** Decimals */\n decimals?: number;\n}\n\n/**\n * ============================================================================\n * WORLD TYPE MODULE (for plugin system)\n * ============================================================================\n */\n\nexport interface WorldTypeModule {\n name: string;\n description: string;\n defaultRules: WorldRule[];\n defaultAdmissionRules: Partial<AdmissionRules>;\n onInit?: (world: any) => Promise<void>;\n onTick?: (world: any, tick: number) => Promise<void>;\n onAgentJoin?: (world: any, agent: AgentProfile) => Promise<void>;\n onAgentLeave?: (world: any, agent: AgentProfile) => Promise<void>;\n}\n\n/**\n * ============================================================================\n * UTILITY TYPES\n * ============================================================================\n */\n\nexport interface EventFilter {\n type?: string;\n agentUrl?: string;\n fromTimestamp?: number;\n toTimestamp?: number;\n limit?: number;\n}\n\n/** Helper to build AgentProfile from AgentCard */\nexport function profileFromCard(card: AgentCard, walletAddress?: string): AgentProfile {\n return {\n url: card.url,\n name: card.name,\n protocolVersion: card.protocolVersion,\n skills: card.skills,\n capabilities: {\n streaming: card.capabilities.streaming ?? false,\n pushNotifications: card.capabilities.pushNotifications ?? false,\n stateTransitionHistory: card.capabilities.stateTransitionHistory,\n },\n joinedAt: Date.now(),\n walletAddress,\n };\n}\n","import { z } from 'zod';\n\n/**\n * ============================================================================\n * ZOD SCHEMAS FOR RUNTIME VALIDATION\n * ============================================================================\n */\n\nexport const AdmissionRulesSchema = z.object({\n maxAgents: z.number().int().positive().optional(),\n requiredSkills: z.array(z.string()).optional(),\n requiredTags: z.array(z.string()).optional(),\n minProtocolVersion: z.string().optional(),\n customEvaluator: z.function().optional(),\n});\n\n// Persistence configuration schemas\nconst SQLiteConfigSchema = z.object({\n filename: z.string(),\n memory: z.boolean().optional(),\n});\n\nconst PostgresConfigSchema = z.object({\n host: z.string(),\n port: z.number().optional(),\n database: z.string(),\n user: z.string(),\n password: z.string(),\n ssl: z.boolean().optional(),\n max: z.number().optional(),\n});\n\nconst RedisConfigSchema = z.object({\n host: z.string(),\n port: z.number().optional(),\n password: z.string().optional(),\n db: z.number().optional(),\n keyPrefix: z.string().optional(),\n});\n\nconst MongoDBConfigSchema = z.object({\n url: z.string(),\n database: z.string(),\n useUnifiedTopology: z.boolean().optional(),\n});\n\nconst LevelDBConfigSchema = z.object({\n path: z.string(),\n});\n\nexport const PersistenceConfigSchema = z.object({\n type: z.enum(['memory', 'postgres', 'redis', 'mongodb', 'sqlite', 'leveldb']),\n sqlite: SQLiteConfigSchema.optional(),\n postgres: PostgresConfigSchema.optional(),\n redis: RedisConfigSchema.optional(),\n mongodb: MongoDBConfigSchema.optional(),\n leveldb: LevelDBConfigSchema.optional(),\n autoSaveIntervalMs: z.number().int().positive().optional(),\n});\n\nexport const BlockchainConfigSchema = z.object({\n rpcUrl: z.string().url(),\n privateKey: z.string().regex(/^0x[a-fA-F0-9]{64}$/, 'Invalid private key format'),\n entryFee: z.number().nonnegative(),\n requireMembership: z.boolean().optional(),\n enforceOnChainValidation: z.boolean().optional(),\n agentRegistryAddress: z.string().optional(),\n membershipContractAddress: z.string().optional(),\n worldTokenAddress: z.string().optional(),\n chainId: z.number().int().optional(),\n});\n\nexport const TokenConfigSchema = z.object({\n deploy: z.boolean(),\n name: z.string().optional(),\n symbol: z.string().optional(),\n initialSupply: z.number().positive().optional(),\n decimals: z.number().int().min(0).max(18).optional(),\n});\n\nexport const WorldConfigSchema = z.object({\n name: z.string().min(1, 'World name is required'),\n description: z.string().optional(),\n type: z.string().optional(),\n \n server: z.object({\n port: z.number().int().min(1).max(65535),\n host: z.string(),\n }),\n \n a2a: z.object({\n baseUrl: z.string().url(),\n pushNotifications: z.boolean().optional(),\n streaming: z.boolean().optional(),\n }).optional(),\n \n admission: AdmissionRulesSchema,\n \n simulation: z.object({\n tickIntervalMs: z.number().int().positive().optional(),\n maxTicks: z.number().int().positive().optional(),\n autoStart: z.boolean().optional(),\n }).optional(),\n \n persistence: PersistenceConfigSchema.optional(),\n blockchain: BlockchainConfigSchema.optional(),\n token: TokenConfigSchema.optional(),\n \n rules: z.array(z.any()).optional(),\n agentUrls: z.array(z.string().url()).optional(),\n});\n\n/**\n * Validate world configuration\n */\nexport function validateWorldConfig(config: unknown): void {\n try {\n WorldConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const messages = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');\n throw new Error(`Invalid world configuration: ${messages}`);\n }\n throw error;\n }\n}\n\n/**\n * Validate world configuration and return result\n */\nexport function isValidWorldConfig(config: unknown): boolean {\n try {\n WorldConfigSchema.parse(config);\n return true;\n } catch {\n return false;\n }\n}\n","import type { PersistenceAdapter } from '../PersistenceAdapter.js';\nimport type {\n WorldStateSnapshot,\n WorldEvent,\n AgentProfile,\n EventFilter,\n} from '../../config/types.js';\n\n/**\n * ============================================================================\n * IN-MEMORY PERSISTENCE ADAPTER\n * ============================================================================\n * \n * Simple in-memory persistence for testing and development.\n * No external dependencies - works on any Node version.\n * \n * WARNING: All data is lost when process exits.\n * \n * Use Case: Testing, development, temporary worlds\n */\n\nexport class InMemoryAdapter implements PersistenceAdapter {\n private state: WorldStateSnapshot | null = null;\n private events: WorldEvent[] = [];\n private agents: Map<string, AgentProfile> = new Map();\n \n async connect(): Promise<void> {\n // No-op for in-memory\n }\n \n async saveState(state: WorldStateSnapshot): Promise<void> {\n this.state = { ...state };\n }\n \n async loadState(): Promise<WorldStateSnapshot | null> {\n return this.state ? { ...this.state } : null;\n }\n \n async saveEvent(event: WorldEvent): Promise<void> {\n this.events.push({ ...event });\n }\n \n async getEvents(filter?: EventFilter): Promise<WorldEvent[]> {\n let filtered = [...this.events];\n \n if (filter?.type) {\n filtered = filtered.filter(e => e.type === filter.type);\n }\n \n if (filter?.agentUrl) {\n filtered = filtered.filter(e => e.agentUrl === filter.agentUrl);\n }\n \n if (filter?.fromTimestamp) {\n filtered = filtered.filter(e => e.timestamp >= filter.fromTimestamp!);\n }\n \n if (filter?.toTimestamp) {\n filtered = filtered.filter(e => e.timestamp <= filter.toTimestamp!);\n }\n \n // Sort by timestamp descending\n filtered.sort((a, b) => b.timestamp - a.timestamp);\n \n if (filter?.limit) {\n filtered = filtered.slice(0, filter.limit);\n }\n \n return filtered;\n }\n \n async saveAgent(profile: AgentProfile): Promise<void> {\n this.agents.set(profile.url, { ...profile });\n }\n \n async removeAgent(agentUrl: string): Promise<void> {\n this.agents.delete(agentUrl);\n }\n \n async getAgents(): Promise<AgentProfile[]> {\n return Array.from(this.agents.values()).map(a => ({ ...a }));\n }\n \n async getAgent(agentUrl: string): Promise<AgentProfile | null> {\n const agent = this.agents.get(agentUrl);\n return agent ? { ...agent } : null;\n }\n \n async disconnect(): Promise<void> {\n // No-op for in-memory\n }\n \n async healthCheck(): Promise<boolean> {\n return true;\n }\n \n async clear(): Promise<void> {\n this.state = null;\n this.events = [];\n this.agents.clear();\n }\n}\n","import type { PersistenceAdapter } from './PersistenceAdapter.js';\nimport type { PersistenceConfig } from '../config/types.js';\nimport { InMemoryAdapter } from './adapters/InMemoryAdapter.js';\n\n/**\n * ============================================================================\n * PERSISTENCE FACTORY\n * ============================================================================\n * \n * Creates the appropriate persistence adapter based on configuration.\n * Uses dynamic import() for optional dependencies to avoid requiring all databases\n * to be installed. Only the adapter for the configured persistence type is loaded.\n */\n\nexport async function createPersistence(config: PersistenceConfig): Promise<PersistenceAdapter> {\n switch (config.type) {\n case 'memory':\n return new InMemoryAdapter();\n \n case 'sqlite':\n return createSQLiteAdapter(config.sqlite || { filename: './world.db' });\n \n case 'postgres':\n if (!config.postgres) {\n throw new Error('PostgreSQL configuration is required');\n }\n return createPostgresAdapter(config.postgres);\n \n case 'redis':\n if (!config.redis) {\n throw new Error('Redis configuration is required');\n }\n return createRedisAdapter(config.redis);\n \n case 'mongodb':\n if (!config.mongodb) {\n throw new Error('MongoDB configuration is required');\n }\n return createMongoAdapter(config.mongodb);\n \n case 'leveldb':\n if (!config.leveldb) {\n throw new Error('LevelDB configuration is required');\n }\n return createLevelDBAdapter(config.leveldb);\n \n default:\n throw new Error(`Unknown persistence type: ${(config as any).type}`);\n }\n}\n\n/**\n * Lazy-load SQLite adapter via dynamic import\n */\nasync function createSQLiteAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n const Database = (await import('better-sqlite3')).default;\n \n // Inline adapter that uses the dynamically-imported Database\n return new (class implements PersistenceAdapter {\n private db!: any;\n \n async connect(): Promise<void> {\n this.db = new Database(config.filename);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS world_state (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n phase TEXT NOT NULL,\n tick INTEGER NOT NULL,\n round INTEGER NOT NULL,\n timestamp INTEGER NOT NULL,\n metadata TEXT\n );\n CREATE TABLE IF NOT EXISTS events (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n agent_url TEXT,\n timestamp INTEGER NOT NULL,\n data TEXT\n );\n CREATE TABLE IF NOT EXISTS agents (\n url TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n protocol_version TEXT NOT NULL,\n skills TEXT NOT NULL,\n capabilities TEXT NOT NULL,\n joined_at INTEGER NOT NULL,\n role TEXT,\n metadata TEXT,\n wallet_address TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n CREATE INDEX IF NOT EXISTS idx_events_agent ON events(agent_url);\n `);\n }\n\n async saveState(state: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT OR REPLACE INTO world_state (id, phase, tick, round, timestamp, metadata) VALUES (1, ?, ?, ?, ?, ?)`);\n stmt.run(state.phase, state.tick, state.round, state.timestamp, JSON.stringify(state.metadata));\n }\n\n async loadState(): Promise<any> {\n const stmt = this.db.prepare('SELECT * FROM world_state WHERE id = 1');\n const row = stmt.get() as any;\n if (!row) return null;\n return { phase: row.phase, tick: row.tick, round: row.round, timestamp: row.timestamp, metadata: JSON.parse(row.metadata || '{}') };\n }\n\n async saveEvent(event: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT INTO events (id, type, agent_url, timestamp, data) VALUES (?, ?, ?, ?, ?)`);\n stmt.run(event.id, event.type, event.agentUrl || null, event.timestamp, JSON.stringify(event.data || {}));\n }\n\n async getEvents(filter?: any): Promise<any[]> {\n let query = 'SELECT * FROM events WHERE 1=1';\n const params: any[] = [];\n if (filter?.type) { query += ' AND type = ?'; params.push(filter.type); }\n if (filter?.agentUrl) { query += ' AND agent_url = ?'; params.push(filter.agentUrl); }\n if (filter?.fromTimestamp) { query += ' AND timestamp >= ?'; params.push(filter.fromTimestamp); }\n if (filter?.toTimestamp) { query += ' AND timestamp <= ?'; params.push(filter.toTimestamp); }\n query += ' ORDER BY timestamp DESC';\n if (filter?.limit) { query += ' LIMIT ?'; params.push(filter.limit); }\n const stmt = this.db.prepare(query);\n const rows = stmt.all(...params) as any[];\n return rows.map(row => ({ id: row.id, type: row.type, timestamp: row.timestamp, agentUrl: row.agent_url || undefined, data: JSON.parse(row.data || '{}') }));\n }\n\n async saveAgent(profile: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT OR REPLACE INTO agents (url, name, protocol_version, skills, capabilities, joined_at, role, metadata, wallet_address) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);\n stmt.run(profile.url, profile.name, profile.protocolVersion, JSON.stringify(profile.skills), JSON.stringify(profile.capabilities), profile.joinedAt, profile.role || null, JSON.stringify(profile.metadata || {}), profile.walletAddress || null);\n }\n\n async removeAgent(agentUrl: string): Promise<void> {\n this.db.prepare('DELETE FROM agents WHERE url = ?').run(agentUrl);\n }\n\n async getAgents(): Promise<any[]> {\n const rows = this.db.prepare('SELECT * FROM agents ORDER BY joined_at ASC').all() as any[];\n return rows.map(row => ({ url: row.url, name: row.name, protocolVersion: row.protocol_version, skills: JSON.parse(row.skills), capabilities: JSON.parse(row.capabilities), joinedAt: row.joined_at, role: row.role || undefined, metadata: JSON.parse(row.metadata || '{}'), walletAddress: row.wallet_address || undefined }));\n }\n\n async getAgent(agentUrl: string): Promise<any> {\n const row = this.db.prepare('SELECT * FROM agents WHERE url = ?').get(agentUrl) as any;\n if (!row) return null;\n return { url: row.url, name: row.name, protocolVersion: row.protocol_version, skills: JSON.parse(row.skills), capabilities: JSON.parse(row.capabilities), joinedAt: row.joined_at, role: row.role || undefined, metadata: JSON.parse(row.metadata || '{}'), walletAddress: row.wallet_address || undefined };\n }\n\n async disconnect(): Promise<void> { this.db.close(); }\n async healthCheck(): Promise<boolean> { try { this.db.prepare('SELECT 1').get(); return true; } catch { return false; } }\n async clear(): Promise<void> { this.db.exec('DELETE FROM world_state; DELETE FROM events; DELETE FROM agents;'); }\n })();\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'SQLite adapter requires better-sqlite3. Install it with: npm install better-sqlite3'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load PostgreSQL adapter via dynamic import\n */\nasync function createPostgresAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n const pg = await import('pg');\n const Pool = pg.default?.Pool || pg.Pool;\n const { PostgresAdapter } = await import('./adapters/PostgresAdapter.js');\n return new PostgresAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'PostgreSQL adapter requires pg. Install it with: npm install pg'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load Redis adapter via dynamic import\n */\nasync function createRedisAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n await import('ioredis');\n const { RedisAdapter } = await import('./adapters/RedisAdapter.js');\n return new RedisAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'Redis adapter requires ioredis. Install it with: npm install ioredis'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load MongoDB adapter via dynamic import\n */\nasync function createMongoAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n // @ts-ignore - mongodb is an optional peer dependency\n await import('mongodb');\n const { MongoAdapter } = await import('./adapters/MongoAdapter.js');\n return new MongoAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'MongoDB adapter requires mongodb. Install it with: npm install mongodb'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load LevelDB adapter via dynamic import\n */\nasync function createLevelDBAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n // @ts-ignore - level is an optional peer dependency\n await import('level');\n const { LevelDBAdapter } = await import('./adapters/LevelDBAdapter.js');\n return new LevelDBAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'LevelDB adapter requires level. Install it with: npm install level'\n );\n }\n throw error;\n }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport type {\n WorldConfig,\n WorldPhase,\n WorldStateSnapshot,\n WorldEvent,\n AgentProfile,\n} from '../config/types.js';\nimport { validateWorldConfig } from '../config/validator.js';\nimport type { PersistenceAdapter } from '../persistence/PersistenceAdapter.js';\nimport { createPersistence } from '../persistence/PersistenceFactory.js';\nimport { CardFetcher } from '../discovery/CardFetcher.js';\nimport { AgentEvaluator } from '../discovery/AgentEvaluator.js';\nimport { BlockchainClient } from '../blockchain/BlockchainClient.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('World');\n\n/**\n * ============================================================================\n * WORLD ENGINE\n * ============================================================================\n * \n * Core world runtime managing:\n * - Agent discovery and admission\n * - World state and lifecycle\n * - Persistence and event logging\n * - Simulation ticks (if enabled)\n * - Rule enforcement\n */\n\nexport class World {\n private state: WorldStateSnapshot;\n private agents: Map<string, AgentProfile>;\n private persistence: PersistenceAdapter | null = null;\n private blockchainClient: BlockchainClient | null = null;\n private cardFetcher: CardFetcher;\n private evaluator: AgentEvaluator;\n private tickInterval: NodeJS.Timeout | null = null;\n private autoSaveInterval: NodeJS.Timeout | null = null;\n \n constructor(public readonly config: WorldConfig) {\n // Validate configuration\n validateWorldConfig(config);\n \n // Initialize state\n this.state = {\n phase: 'idle',\n tick: 0,\n round: 0,\n timestamp: Date.now(),\n metadata: {},\n };\n \n this.agents = new Map();\n this.cardFetcher = new CardFetcher();\n this.evaluator = new AgentEvaluator(config.admission);\n \n logger.info(`World \"${config.name}\" created`, {\n type: config.type || 'generic',\n maxAgents: config.admission.maxAgents,\n });\n }\n \n /**\n * Initialize the world (connect persistence, restore state, discover agents)\n */\n async init(): Promise<void> {\n logger.info('Initializing world...');\n this.setState('initializing');\n \n try {\n // 1. Connect to persistence backend\n if (this.config.persistence) {\n logger.info('Connecting to persistence backend:', this.config.persistence.type);\n this.persistence = await createPersistence(this.config.persistence);\n await this.persistence.connect();\n \n // Try to restore state from persistence\n const savedState = await this.persistence.loadState();\n if (savedState) {\n this.state = savedState;\n logger.info('Restored world state from persistence', {\n phase: savedState.phase,\n tick: savedState.tick,\n });\n \n // Restore agents\n const savedAgents = await this.persistence.getAgents();\n for (const agent of savedAgents) {\n this.agents.set(agent.url, agent);\n }\n \n logger.info(`Restored ${savedAgents.length} agents from persistence`);\n }\n }\n \n // 2. Initialize blockchain client if configured\n if (this.config.blockchain) {\n logger.info('Initializing blockchain client...');\n this.blockchainClient = new BlockchainClient(this.config.blockchain);\n await this.blockchainClient.init();\n }\n \n // 3. Discover pre-configured agents\n if (this.config.agentUrls && this.config.agentUrls.length > 0) {\n logger.info(`Discovering ${this.config.agentUrls.length} pre-configured agents...`);\n \n const results = await this.cardFetcher.fetchCards(this.config.agentUrls);\n \n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result.success && result.card) {\n // Auto-admit pre-configured agents\n try {\n await this.admitAgent(result.card);\n } catch (error: any) {\n logger.warn(`Failed to admit pre-configured agent:`, error.message);\n }\n }\n }\n }\n \n // 3. Start auto-save if persistence enabled\n if (this.persistence) {\n this.startAutoSave();\n }\n \n this.setState('ready');\n logger.info('World initialized successfully', {\n agents: this.agents.size,\n persistence: this.config.persistence?.type || 'none',\n });\n } catch (error: any) {\n logger.error('Failed to initialize world:', error);\n this.setState('failed');\n throw error;\n }\n }\n \n /**\n * Start the world simulation\n */\n async start(): Promise<void> {\n if (this.state.phase === 'running') {\n logger.warn('World is already running');\n return;\n }\n \n logger.info('Starting world simulation...');\n this.setState('running');\n \n await this.logEvent({\n id: uuidv4(),\n type: 'world_started',\n timestamp: Date.now(),\n });\n \n // Start tick interval if simulation is enabled\n if (this.config.simulation?.tickIntervalMs) {\n this.startTicking();\n }\n }\n \n /**\n * Stop the world simulation\n */\n async stop(): Promise<void> {\n logger.info('Stopping world...');\n this.setState('stopped');\n \n // Stop ticking\n if (this.tickInterval) {\n clearInterval(this.tickInterval);\n this.tickInterval = null;\n }\n \n // Stop auto-save\n if (this.autoSaveInterval) {\n clearInterval(this.autoSaveInterval);\n this.autoSaveInterval = null;\n }\n \n // Final save\n if (this.persistence) {\n await this.persistence.saveState(this.state);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'world_stopped',\n timestamp: Date.now(),\n });\n \n logger.info('World stopped');\n }\n \n /**\n * Admit an agent to the world\n */\n async admitAgent(card: any, walletAddress?: string): Promise<void> {\n const decision = await this.evaluator.evaluate(card, this.agents.size, walletAddress);\n \n if (!decision.admitted) {\n throw new Error(`Agent admission denied: ${decision.reason}`);\n }\n \n // Optional: Validate agent on-chain\n if (this.blockchainClient && this.config.blockchain?.enforceOnChainValidation && walletAddress) {\n const isValid = await this.blockchainClient.validateAgent(walletAddress);\n if (!isValid) {\n throw new Error('Agent not registered in on-chain AgentRegistry');\n }\n logger.info(`Agent validated on-chain: ${card.name}`);\n }\n \n // Optional: Mint membership NFT\n if (this.blockchainClient && this.config.blockchain?.requireMembership && walletAddress) {\n // Check if agent already has membership\n const hasMembership = await this.blockchainClient.hasMembership(walletAddress);\n \n if (!hasMembership) {\n logger.info(`Minting membership NFT for agent: ${card.name}`);\n await this.blockchainClient.mintMembership(walletAddress);\n } else {\n logger.info(`Agent already has membership: ${card.name}`);\n }\n }\n \n const profile: AgentProfile = {\n url: card.url,\n name: card.name,\n protocolVersion: card.protocolVersion,\n skills: card.skills,\n capabilities: {\n streaming: card.capabilities.streaming ?? false,\n pushNotifications: card.capabilities.pushNotifications ?? false,\n stateTransitionHistory: card.capabilities.stateTransitionHistory,\n },\n joinedAt: Date.now(),\n role: decision.role,\n metadata: decision.metadata,\n walletAddress,\n };\n \n this.agents.set(profile.url, profile);\n \n if (this.persistence) {\n await this.persistence.saveAgent(profile);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'agent_joined',\n timestamp: Date.now(),\n agentUrl: profile.url,\n data: { name: profile.name, role: profile.role },\n });\n \n logger.info(`Agent admitted: ${profile.name}`, {\n role: profile.role,\n totalAgents: this.agents.size,\n });\n }\n \n /**\n * Remove an agent from the world\n */\n async removeAgent(agentUrl: string): Promise<void> {\n const agent = this.agents.get(agentUrl);\n if (!agent) {\n throw new Error(`Agent not found: ${agentUrl}`);\n }\n \n this.agents.delete(agentUrl);\n \n if (this.persistence) {\n await this.persistence.removeAgent(agentUrl);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'agent_left',\n timestamp: Date.now(),\n agentUrl,\n data: { name: agent.name },\n });\n \n logger.info(`Agent removed: ${agent.name}`, {\n totalAgents: this.agents.size,\n });\n }\n \n /**\n * Get all agents in the world\n */\n getAgents(): AgentProfile[] {\n return Array.from(this.agents.values());\n }\n \n /**\n * Get current world state\n */\n getState(): WorldStateSnapshot {\n return { ...this.state };\n }\n \n /**\n * Log an event\n */\n private async logEvent(event: WorldEvent): Promise<void> {\n if (this.persistence) {\n await this.persistence.saveEvent(event);\n }\n }\n \n /**\n * Set world phase\n */\n private setState(phase: WorldPhase): void {\n this.state.phase = phase;\n this.state.timestamp = Date.now();\n }\n \n /**\n * Start auto-save interval\n */\n private startAutoSave(): void {\n const interval = this.config.persistence?.autoSaveIntervalMs || 10000;\n \n this.autoSaveInterval = setInterval(async () => {\n if (this.persistence) {\n await this.persistence.saveState(this.state);\n logger.debug('Auto-saved world state');\n }\n }, interval);\n \n logger.info(`Auto-save enabled (interval: ${interval}ms)`);\n }\n \n /**\n * Start simulation ticking\n */\n private startTicking(): void {\n const interval = this.config.simulation!.tickIntervalMs!;\n \n this.tickInterval = setInterval(async () => {\n this.state.tick++;\n \n await this.logEvent({\n id: uuidv4(),\n type: 'tick',\n timestamp: Date.now(),\n data: { tick: this.state.tick },\n });\n \n logger.debug(`Tick ${this.state.tick}`);\n \n // Check max ticks\n if (this.config.simulation?.maxTicks && this.state.tick >= this.config.simulation.maxTicks) {\n logger.info('Max ticks reached, stopping world');\n await this.stop();\n }\n }, interval);\n \n logger.info(`Simulation ticking enabled (interval: ${interval}ms)`);\n }\n}\n","import type { AgentCard } from '@a2a-js/sdk';\nimport type { AgentProfile, AdmissionRules, AdmissionDecision } from '../config/types.js';\nimport { profileFromCard } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('AgentEvaluator');\n\n/**\n * ============================================================================\n * AGENT EVALUATOR\n * ============================================================================\n * \n * Evaluates whether an agent should be admitted to the world based on rules.\n * \n * Evaluation criteria:\n * - Max agents limit\n * - Required skills (agent must have ALL)\n * - Required tags (agent must have AT LEAST ONE)\n * - Minimum protocol version\n * - Custom evaluator function\n */\n\nexport class AgentEvaluator {\n constructor(private rules: AdmissionRules) {}\n \n /**\n * Evaluate whether an agent should be admitted.\n * \n * @param card Agent's A2A card\n * @param currentAgentCount Current number of agents in world\n * @param walletAddress Optional wallet address for blockchain membership\n * @returns Admission decision\n */\n async evaluate(\n card: AgentCard,\n currentAgentCount: number,\n walletAddress?: string\n ): Promise<AdmissionDecision> {\n logger.debug(`Evaluating agent: ${card.name}`, {\n currentAgents: currentAgentCount,\n maxAgents: this.rules.maxAgents,\n });\n \n // Check max agents limit\n if (this.rules.maxAgents && currentAgentCount >= this.rules.maxAgents) {\n logger.info(`Agent ${card.name} rejected: world is full`, {\n current: currentAgentCount,\n max: this.rules.maxAgents,\n });\n \n return {\n admitted: false,\n reason: `World is full (${this.rules.maxAgents} agents maximum)`,\n };\n }\n \n // Check protocol version\n if (this.rules.minProtocolVersion) {\n if (!this.meetsProtocolVersion(card.protocolVersion, this.rules.minProtocolVersion)) {\n logger.info(`Agent ${card.name} rejected: protocol version too old`, {\n agent: card.protocolVersion,\n required: this.rules.minProtocolVersion,\n });\n \n return {\n admitted: false,\n reason: `Protocol version ${card.protocolVersion} is below minimum ${this.rules.minProtocolVersion}`,\n };\n }\n }\n \n // Check required skills (agent must have ALL)\n if (this.rules.requiredSkills && this.rules.requiredSkills.length > 0) {\n const agentSkillIds = card.skills.map(s => s.id.toLowerCase());\n const missingSkills = this.rules.requiredSkills.filter(\n required => !agentSkillIds.includes(required.toLowerCase())\n );\n \n if (missingSkills.length > 0) {\n logger.info(`Agent ${card.name} rejected: missing required skills`, {\n missing: missingSkills,\n });\n \n return {\n admitted: false,\n reason: `Missing required skills: ${missingSkills.join(', ')}`,\n };\n }\n }\n \n // Check required tags (agent must have AT LEAST ONE)\n if (this.rules.requiredTags && this.rules.requiredTags.length > 0) {\n const agentTags = card.skills.flatMap(s => s.tags || []).map(t => t.toLowerCase());\n const hasRequiredTag = this.rules.requiredTags.some(\n required => agentTags.includes(required.toLowerCase())\n );\n \n if (!hasRequiredTag) {\n logger.info(`Agent ${card.name} rejected: no matching tags`, {\n required: this.rules.requiredTags,\n });\n \n return {\n admitted: false,\n reason: `Must have at least one of these tags: ${this.rules.requiredTags.join(', ')}`,\n };\n }\n }\n \n // Run custom evaluator if provided\n if (this.rules.customEvaluator) {\n const profile = profileFromCard(card, walletAddress);\n const customDecision = await this.rules.customEvaluator(profile);\n \n if (!customDecision.admitted) {\n logger.info(`Agent ${card.name} rejected by custom evaluator`, {\n reason: customDecision.reason,\n });\n \n return customDecision;\n }\n \n // Custom evaluator can assign roles and metadata\n if (customDecision.role || customDecision.metadata) {\n logger.debug(`Custom evaluator assigned role/metadata to ${card.name}`, {\n role: customDecision.role,\n });\n }\n \n return customDecision;\n }\n \n // All checks passed\n logger.info(`Agent ${card.name} admitted to world`);\n \n return {\n admitted: true,\n reason: 'All admission criteria met',\n };\n }\n \n /**\n * Check if agent's protocol version meets minimum requirement.\n * Simple semver comparison (major.minor).\n */\n private meetsProtocolVersion(agentVersion: string, minVersion: string): boolean {\n const parse = (v: string) => {\n const parts = v.split('.');\n return {\n major: parseInt(parts[0] || '0', 10),\n minor: parseInt(parts[1] || '0', 10),\n };\n };\n \n const agent = parse(agentVersion);\n const min = parse(minVersion);\n \n if (agent.major > min.major) return true;\n if (agent.major < min.major) return false;\n return agent.minor >= min.minor;\n }\n}\n","import { ethers } from 'ethers';\nimport type { BlockchainConfig } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('BlockchainClient');\n\n// Contract ABIs (minimal interfaces)\nconst AGENT_REGISTRY_ABI = [\n 'function registerAgent(string agentUrl, string name) external',\n 'function isAgentValid(address wallet) external view returns (bool)',\n 'function getAgent(address wallet) external view returns (tuple(address walletAddress, string agentUrl, string name, uint256 registeredAt, bool isActive))',\n 'function getWalletByUrl(string agentUrl) external view returns (address)',\n 'event AgentRegistered(address indexed wallet, string agentUrl, string name)',\n];\n\nconst WORLD_MEMBERSHIP_ABI = [\n 'function mintMembership(address agent) external payable',\n 'function revokeMembership(address agent) external',\n 'function hasMembership(address agent) external view returns (bool)',\n 'function entryFee() external view returns (uint256)',\n 'function totalMembers() external view returns (uint256)',\n 'function withdrawFees() external',\n 'event MembershipMinted(address indexed agent, uint256 indexed tokenId, uint256 feePaid)',\n];\n\nconst WORLD_TOKEN_ABI = [\n 'function mint(address to, uint256 amount) external',\n 'function burn(address from, uint256 amount) external',\n 'function balanceOf(address account) external view returns (uint256)',\n 'function transfer(address to, uint256 amount) external returns (bool)',\n];\n\n/**\n * ============================================================================\n * BLOCKCHAIN CLIENT\n * ============================================================================\n * \n * Handles all blockchain interactions for the World SDK:\n * - Agent registry validation\n * - Membership NFT minting\n * - Entry fee collection\n * - World token operations\n */\n\nexport class BlockchainClient {\n private provider: ethers.JsonRpcProvider;\n private wallet: ethers.Wallet;\n private agentRegistry?: ethers.Contract;\n private membershipContract?: ethers.Contract;\n private worldToken?: ethers.Contract;\n \n constructor(private config: BlockchainConfig) {\n // Initialize provider and wallet\n this.provider = new ethers.JsonRpcProvider(config.rpcUrl);\n this.wallet = new ethers.Wallet(config.privateKey, this.provider);\n \n logger.info('Blockchain client initialized', {\n network: config.rpcUrl,\n wallet: this.wallet.address,\n });\n }\n \n /**\n * Initialize contract connections\n */\n async init(): Promise<void> {\n // Connect to AgentRegistry if address provided\n if (this.config.agentRegistryAddress) {\n this.agentRegistry = new ethers.Contract(\n this.config.agentRegistryAddress,\n AGENT_REGISTRY_ABI,\n this.wallet\n );\n logger.info('Connected to AgentRegistry', {\n address: this.config.agentRegistryAddress,\n });\n }\n \n // Connect to WorldMembership if address provided\n if (this.config.membershipContractAddress) {\n this.membershipContract = new ethers.Contract(\n this.config.membershipContractAddress,\n WORLD_MEMBERSHIP_ABI,\n this.wallet\n );\n logger.info('Connected to WorldMembership', {\n address: this.config.membershipContractAddress,\n });\n }\n \n // Connect to WorldToken if address provided\n if (this.config.worldTokenAddress) {\n this.worldToken = new ethers.Contract(\n this.config.worldTokenAddress,\n WORLD_TOKEN_ABI,\n this.wallet\n );\n logger.info('Connected to WorldToken', {\n address: this.config.worldTokenAddress,\n });\n }\n \n logger.info('Blockchain client ready');\n }\n \n /**\n * Validate agent on-chain\n * @param walletAddress Agent's wallet address\n * @returns True if agent is registered and valid\n */\n async validateAgent(walletAddress: string): Promise<boolean> {\n if (!this.agentRegistry) {\n logger.warn('AgentRegistry not configured, skipping on-chain validation');\n return true; // Skip validation if not configured\n }\n \n try {\n const isValid = await this.agentRegistry.isAgentValid(walletAddress);\n logger.debug('Agent validation result', {\n wallet: walletAddress,\n isValid,\n });\n return isValid;\n } catch (error: any) {\n logger.error('Failed to validate agent on-chain', {\n wallet: walletAddress,\n error: error.message,\n });\n return false;\n }\n }\n \n /**\n * Mint membership NFT for an agent\n * @param agentWallet Agent's wallet address\n * @returns Transaction hash\n */\n async mintMembership(agentWallet: string): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n // Get entry fee\n const entryFee = await this.membershipContract.entryFee();\n \n logger.info('Minting membership NFT', {\n agent: agentWallet,\n entryFee: ethers.formatEther(entryFee),\n });\n \n // Mint membership\n const tx = await this.membershipContract.mintMembership(agentWallet, {\n value: entryFee,\n });\n \n const receipt = await tx.wait();\n \n logger.info('Membership NFT minted', {\n agent: agentWallet,\n txHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to mint membership NFT', {\n agent: agentWallet,\n error: error.message,\n });\n throw error;\n }\n }\n \n /**\n * Check if agent has membership\n * @param agentWallet Agent's wallet address\n * @returns True if agent has membership\n */\n async hasMembership(agentWallet: string): Promise<boolean> {\n if (!this.membershipContract) {\n logger.warn('WorldMembership not configured, skipping membership check');\n return true; // Skip check if not configured\n }\n \n try {\n const hasMembership = await this.membershipContract.hasMembership(agentWallet);\n return hasMembership;\n } catch (error: any) {\n logger.error('Failed to check membership', {\n agent: agentWallet,\n error: error.message,\n });\n return false;\n }\n }\n \n /**\n * Revoke membership NFT\n * @param agentWallet Agent's wallet address\n * @returns Transaction hash\n */\n async revokeMembership(agentWallet: string): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n logger.info('Revoking membership', { agent: agentWallet });\n \n const tx = await this.membershipContract.revokeMembership(agentWallet);\n const receipt = await tx.wait();\n \n logger.info('Membership revoked', {\n agent: agentWallet,\n txHash: receipt.hash,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to revoke membership', {\n agent: agentWallet,\n error: error.message,\n });\n throw error;\n }\n }\n \n /**\n * Get total number of members\n */\n async getTotalMembers(): Promise<number> {\n if (!this.membershipContract) {\n return 0;\n }\n \n try {\n const total = await this.membershipContract.totalMembers();\n return Number(total);\n } catch (error: any) {\n logger.error('Failed to get total members', { error: error.message });\n return 0;\n }\n }\n \n /**\n * Withdraw collected entry fees (world owner only)\n */\n async withdrawFees(): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n logger.info('Withdrawing entry fees');\n \n const tx = await this.membershipContract.withdrawFees();\n const receipt = await tx.wait();\n \n logger.info('Fees withdrawn', {\n txHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to withdraw fees', { error: error.message });\n throw error;\n }\n }\n \n /**\n * Get world owner's wallet address\n */\n getWalletAddress(): string {\n return this.wallet.address;\n }\n \n /**\n * Get entry fee in MON\n */\n async getEntryFee(): Promise<string> {\n if (!this.membershipContract) {\n return '0';\n }\n \n try {\n const fee = await this.membershipContract.entryFee();\n return ethers.formatEther(fee);\n } catch (error: any) {\n logger.error('Failed to get entry fee', { error: error.message });\n return '0';\n }\n }\n}\n","import express, { type Express, type Request, type Response } from 'express';\nimport type { World } from '../engine/World.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('WorldServer');\n\n/**\n * ============================================================================\n * WORLD HTTP SERVER\n * ============================================================================\n * \n * Express server providing HTTP endpoints for:\n * - World information\n * - Agent join requests \n * - Agent list\n * - World state and events\n * \n * Mirrors the agent SDK server pattern.\n */\n\nexport function createWorldApp(world: World): Express {\n const app = express();\n \n // Middleware\n app.use(express.json());\n app.use(express.urlencoded({ extended: true }));\n \n // Request logging\n app.use((req, res, next) => {\n logger.debug(`${req.method} ${req.path}`, {\n query: req.query,\n ip: req.ip,\n });\n next();\n });\n \n /**\n * GET / - World information\n */\n app.get('/', (req: Request, res: Response) => {\n res.json({\n name: world.config.name,\n description: world.config.description,\n type: world.config.type || 'generic',\n state: world.getState(),\n agentCount: world.getAgents().length,\n maxAgents: world.config.admission.maxAgents || null,\n admission: {\n requiredSkills: world.config.admission.requiredSkills || [],\n requiredTags: world.config.admission.requiredTags || [],\n minProtocolVersion: world.config.admission.minProtocolVersion || null,\n },\n });\n });\n \n /**\n * POST /world/join - Agent join request\n * \n * Body:\n * {\n * \"agentUrl\": \"http://localhost:3000\",\n * \"walletAddress\": \"0x...\" // optional, for blockchain membership\n * }\n */\n app.post('/world/join', async (req: Request, res: Response) => {\n try {\n const { agentUrl, walletAddress } = req.body;\n \n if (!agentUrl) {\n return res.status(400).json({\n success: false,\n error: 'agentUrl is required',\n });\n }\n \n logger.info(`Agent join request from: ${agentUrl}`, {\n wallet: walletAddress || 'none',\n });\n \n // Fetch agent card\n const cardFetcher = new (await import('../discovery/CardFetcher.js')).CardFetcher();\n const result = await cardFetcher.fetchCard(agentUrl);\n \n if (!result.success || !result.card) {\n return res.status(400).json({\n success: false,\n error: `Failed to fetch agent card: ${result.error}`,\n });\n }\n \n // Admit agent\n await world.admitAgent(result.card, walletAddress);\n \n res.json({\n success: true,\n message: 'Agent admitted to world',\n world: {\n name: world.config.name,\n agentCount: world.getAgents().length,\n },\n });\n } catch (error: any) {\n logger.error('Failed to process join request:', error);\n \n res.status(400).json({\n success: false,\n error: error.message || 'Failed to join world',\n });\n }\n });\n \n /**\n * GET /world/agents - List all agents\n */\n app.get('/world/agents', (req: Request, res: Response) => {\n const agents = world.getAgents().map(agent => ({\n url: agent.url,\n name: agent.name,\n protocolVersion: agent.protocolVersion,\n skills: agent.skills.map(s => s.id),\n joinedAt: agent.joinedAt,\n role: agent.role,\n }));\n \n res.json({\n agents,\n count: agents.length,\n });\n });\n \n /**\n * GET /world/state - World state\n */\n app.get('/world/state', (req: Request, res: Response) => {\n res.json(world.getState());\n });\n \n /**\n * POST /world/start - Start world simulation\n */\n app.post('/world/start', async (req: Request, res: Response) => {\n try {\n await world.start();\n res.json({\n success: true,\n message: 'World simulation started',\n state: world.getState(),\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n /**\n * POST /world/stop - Stop world simulation\n */\n app.post('/world/stop', async (req: Request, res: Response) => {\n try {\n await world.stop();\n res.json({\n success: true,\n message: 'World simulation stopped',\n state: world.getState(),\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n /**\n * DELETE /world/agents/:agentUrl - Remove an agent\n */\n app.delete('/world/agents/:agentUrl', async (req: Request, res: Response) => {\n try {\n const agentUrlParam = req.params.agentUrl;\n const agentUrl = typeof agentUrlParam === 'string' \n ? decodeURIComponent(agentUrlParam)\n : decodeURIComponent(agentUrlParam[0]);\n \n await world.removeAgent(agentUrl);\n \n res.json({\n success: true,\n message: 'Agent removed from world',\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n // 404 handler\n app.use((req: Request, res: Response) => {\n res.status(404).json({\n error: 'Not found',\n path: req.path,\n });\n });\n \n // Error handler\n app.use((err: any, req: Request, res: Response, next: any) => {\n logger.error('Server error:', err);\n \n res.status(500).json({\n error: 'Internal server error',\n message: err.message,\n });\n });\n \n return app;\n}\n\n/**\n * Start world server on configured port\n */\nexport async function startWorldServer(world: World): Promise<void> {\n const app = createWorldApp(world);\n \n const server = app.listen(world.config.server.port, world.config.server.host, () => {\n const { host, port } = world.config.server;\n \n logger.info(`World \"${world.config.name}\" server started`);\n logger.info(` http://${host}:${port}`);\n logger.info('');\n logger.info('Endpoints:');\n logger.info(` GET / - World info`);\n logger.info(` POST /world/join - Agent join request`);\n logger.info(` GET /world/agents - List agents`);\n logger.info(` GET /world/state - World state`);\n logger.info(` POST /world/start - Start simulation`);\n logger.info(` POST /world/stop - Stop simulation`);\n logger.info(` DELETE /world/agents/:url - Remove agent`);\n });\n \n // Graceful shutdown\n process.on('SIGTERM', async () => {\n logger.info('SIGTERM received, shutting down gracefully...');\n \n server.close(async () => {\n await world.stop();\n process.exit(0);\n });\n });\n \n process.on('SIGINT', async () => {\n logger.info('SIGINT received, shutting down gracefully...');\n \n server.close(async () => {\n await world.stop();\n process.exit(0);\n });\n });\n}\n"]}
1
+ {"version":3,"sources":["/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/index.cjs","../src/config/types.ts","../src/config/validator.ts","../src/persistence/adapters/InMemoryAdapter.ts","../src/persistence/PersistenceFactory.ts","../src/engine/World.ts","../src/discovery/AgentEvaluator.ts","../src/blockchain/BlockchainClient.ts","../src/server/app.ts"],"names":[],"mappings":"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","file":"/Users/brooklyn/Desktop/SchrodingerLabs/Byzantium/packages/world-core/dist/index.cjs","sourcesContent":[null,"import type { AgentCard } from '@a2a-js/sdk';\n\n/**\n * ============================================================================\n * WORLD CONFIGURATION TYPES\n * ============================================================================\n */\n\nexport interface WorldConfig {\n /** World name (unique identifier) */\n name: string;\n \n /** World description */\n description?: string;\n \n /** World type (for plugin system) */\n type?: string;\n \n /** Server configuration */\n server: {\n port: number;\n host: string;\n };\n \n /** A2A configuration for the world itself */\n a2a?: {\n baseUrl: string;\n pushNotifications?: boolean;\n streaming?: boolean;\n };\n \n /** Admission rules for agent entry */\n admission: AdmissionRules;\n \n /** Simulation configuration */\n simulation?: {\n /** Tick interval in milliseconds */\n tickIntervalMs?: number;\n \n /** Maximum ticks before auto-stop */\n maxTicks?: number;\n \n /** Auto-start simulation on world init */\n autoStart?: boolean;\n };\n \n /** Persistence configuration */\n persistence?: PersistenceConfig;\n \n /** Blockchain configuration */\n blockchain?: BlockchainConfig;\n \n /** Optional world token configuration */\n token?: TokenConfig;\n \n /** World-specific rules */\n rules?: WorldRule[];\n \n /** Pre-configured agent URLs to discover on startup */\n agentUrls?: string[];\n}\n\n/**\n * ============================================================================\n * ADMISSION RULES\n * ============================================================================\n */\n\nexport interface AdmissionRules {\n /** Maximum number of agents allowed */\n maxAgents?: number;\n \n /** Required skills (agent must have ALL of these) */\n requiredSkills?: string[];\n \n /** Required tags (agent must have AT LEAST ONE) */\n requiredTags?: string[];\n \n /** Minimum protocol version */\n minProtocolVersion?: string;\n \n /** Custom evaluator function */\n customEvaluator?: (profile: AgentProfile) => Promise<AdmissionDecision>;\n}\n\nexport interface AdmissionDecision {\n admitted: boolean;\n reason?: string;\n role?: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * AGENT PROFILE\n * ============================================================================\n */\n\nexport interface AgentProfile {\n /** Agent URL (canonical identifier from Agent Card) */\n url: string;\n \n /** Agent name */\n name: string;\n \n /** Protocol version */\n protocolVersion: string;\n \n /** Skills from Agent Card */\n skills: Array<{\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n }>;\n \n /** Capabilities */\n capabilities: {\n streaming: boolean;\n pushNotifications: boolean;\n stateTransitionHistory?: boolean;\n };\n \n /** When agent joined the world */\n joinedAt: number;\n \n /** Assigned role (optional) */\n role?: string;\n \n /** Additional metadata */\n metadata?: Record<string, any>;\n \n /** Wallet address (for blockchain membership) */\n walletAddress?: string;\n}\n\n/**\n * ============================================================================\n * WORLD STATE\n * ============================================================================\n */\n\nexport type WorldPhase = \n | 'idle' \n | 'initializing' \n | 'ready' \n | 'running' \n | 'paused' \n | 'completed' \n | 'stopped' \n | 'failed';\n\nexport interface WorldStateSnapshot {\n phase: WorldPhase;\n tick: number;\n round: number;\n timestamp: number;\n metadata: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * WORLD EVENTS\n * ============================================================================\n */\n\nexport interface WorldEvent {\n id: string;\n type: string;\n timestamp: number;\n agentUrl?: string;\n data?: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * WORLD RULES\n * ============================================================================\n */\n\nexport interface WorldRule {\n id: string;\n name: string;\n description?: string;\n evaluate: (context: RuleContext) => Promise<RuleViolation | null>;\n}\n\nexport interface RuleContext {\n world: {\n phase: WorldPhase;\n tick: number;\n agents: Map<string, AgentProfile>;\n };\n event?: WorldEvent;\n agent?: AgentProfile;\n}\n\nexport interface RuleViolation {\n ruleId: string;\n severity: 'warning' | 'error' | 'critical';\n message: string;\n agentUrl?: string;\n action?: 'warn' | 'kick' | 'pause_world';\n}\n\n/**\n * ============================================================================\n * PERSISTENCE CONFIGURATION\n * ============================================================================\n */\n\nexport interface PersistenceConfig {\n type: 'memory' | 'postgres' | 'redis' | 'mongodb' | 'sqlite' | 'leveldb';\n \n // Adapter-specific configs (only one should be present based on type)\n postgres?: {\n host: string;\n port?: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean;\n max?: number; // connection pool size\n };\n \n redis?: {\n host: string;\n port?: number;\n password?: string;\n db?: number;\n };\n \n mongodb?: {\n url: string;\n database: string;\n };\n \n sqlite?: {\n filename: string;\n };\n \n leveldb?: {\n location: string;\n };\n \n /** Auto-save interval in milliseconds (default: 10000) */\n autoSaveIntervalMs?: number;\n}\n\n/**\n * ============================================================================\n * BLOCKCHAIN CONFIGURATION\n * ============================================================================\n */\n\nexport interface BlockchainConfig {\n /** Monad RPC URL */\n rpcUrl: string;\n \n /** World owner's private key */\n privateKey: string;\n \n /** Entry fee in MON tokens */\n entryFee: number;\n \n /** Require NFT membership for participation (default: true) */\n requireMembership?: boolean;\n \n /** Enforce on-chain agent validation (default: false) */\n enforceOnChainValidation?: boolean;\n \n /** Contract addresses (filled after deployment) */\n agentRegistryAddress?: string;\n membershipContractAddress?: string;\n worldTokenAddress?: string;\n \n /** Chain ID */\n chainId?: number;\n}\n\n/**\n * ============================================================================\n * TOKEN CONFIGURATION\n * ============================================================================\n */\n\nexport interface TokenConfig {\n /** Deploy custom world token */\n deploy: boolean;\n \n /** Token name */\n name?: string;\n \n /** Token symbol */\n symbol?: string;\n \n /** Initial supply */\n initialSupply?: number;\n \n /** Decimals */\n decimals?: number;\n}\n\n/**\n * ============================================================================\n * WORLD TYPE MODULE (for plugin system)\n * ============================================================================\n */\n\nexport interface WorldTypeModule {\n name: string;\n description: string;\n defaultRules: WorldRule[];\n defaultAdmissionRules: Partial<AdmissionRules>;\n onInit?: (world: any) => Promise<void>;\n onTick?: (world: any, tick: number) => Promise<void>;\n onAgentJoin?: (world: any, agent: AgentProfile) => Promise<void>;\n onAgentLeave?: (world: any, agent: AgentProfile) => Promise<void>;\n}\n\n/**\n * ============================================================================\n * UTILITY TYPES\n * ============================================================================\n */\n\nexport interface EventFilter {\n type?: string;\n agentUrl?: string;\n fromTimestamp?: number;\n toTimestamp?: number;\n limit?: number;\n}\n\n/** Helper to build AgentProfile from AgentCard */\nexport function profileFromCard(card: AgentCard, walletAddress?: string): AgentProfile {\n return {\n url: card.url,\n name: card.name,\n protocolVersion: card.protocolVersion,\n skills: card.skills,\n capabilities: {\n streaming: card.capabilities.streaming ?? false,\n pushNotifications: card.capabilities.pushNotifications ?? false,\n stateTransitionHistory: card.capabilities.stateTransitionHistory,\n },\n joinedAt: Date.now(),\n walletAddress,\n };\n}\n","import { z } from 'zod';\n\n/**\n * ============================================================================\n * ZOD SCHEMAS FOR RUNTIME VALIDATION\n * ============================================================================\n */\n\nexport const AdmissionRulesSchema = z.object({\n maxAgents: z.number().int().positive().optional(),\n requiredSkills: z.array(z.string()).optional(),\n requiredTags: z.array(z.string()).optional(),\n minProtocolVersion: z.string().optional(),\n customEvaluator: z.function().optional(),\n});\n\n// Persistence configuration schemas\nconst SQLiteConfigSchema = z.object({\n filename: z.string(),\n memory: z.boolean().optional(),\n});\n\nconst PostgresConfigSchema = z.object({\n host: z.string(),\n port: z.number().optional(),\n database: z.string(),\n user: z.string(),\n password: z.string(),\n ssl: z.boolean().optional(),\n max: z.number().optional(),\n});\n\nconst RedisConfigSchema = z.object({\n host: z.string(),\n port: z.number().optional(),\n password: z.string().optional(),\n db: z.number().optional(),\n keyPrefix: z.string().optional(),\n});\n\nconst MongoDBConfigSchema = z.object({\n url: z.string(),\n database: z.string(),\n useUnifiedTopology: z.boolean().optional(),\n});\n\nconst LevelDBConfigSchema = z.object({\n path: z.string(),\n});\n\nexport const PersistenceConfigSchema = z.object({\n type: z.enum(['memory', 'postgres', 'redis', 'mongodb', 'sqlite', 'leveldb']),\n sqlite: SQLiteConfigSchema.optional(),\n postgres: PostgresConfigSchema.optional(),\n redis: RedisConfigSchema.optional(),\n mongodb: MongoDBConfigSchema.optional(),\n leveldb: LevelDBConfigSchema.optional(),\n autoSaveIntervalMs: z.number().int().positive().optional(),\n});\n\nexport const BlockchainConfigSchema = z.object({\n rpcUrl: z.string().url(),\n privateKey: z.string().regex(/^0x[a-fA-F0-9]{64}$/, 'Invalid private key format').optional(),\n entryFee: z.number().nonnegative().optional(),\n requireMembership: z.boolean().optional(),\n enforceOnChainValidation: z.boolean().optional(),\n agentRegistryAddress: z.string().optional(),\n membershipContractAddress: z.string().optional(),\n worldTokenAddress: z.string().optional(),\n chainId: z.number().int().optional(),\n});\n\nexport const TokenConfigSchema = z.object({\n deploy: z.boolean(),\n name: z.string().optional(),\n symbol: z.string().optional(),\n initialSupply: z.number().positive().optional(),\n decimals: z.number().int().min(0).max(18).optional(),\n});\n\nexport const WorldConfigSchema = z.object({\n name: z.string().min(1, 'World name is required'),\n description: z.string().optional(),\n type: z.string().optional(),\n \n server: z.object({\n port: z.number().int().min(1).max(65535),\n host: z.string(),\n }),\n \n a2a: z.object({\n baseUrl: z.string().url(),\n pushNotifications: z.boolean().optional(),\n streaming: z.boolean().optional(),\n }).optional(),\n \n admission: AdmissionRulesSchema,\n \n simulation: z.object({\n tickIntervalMs: z.number().int().positive().optional(),\n maxTicks: z.number().int().positive().optional(),\n autoStart: z.boolean().optional(),\n }).optional(),\n \n persistence: PersistenceConfigSchema.optional(),\n blockchain: BlockchainConfigSchema.optional(),\n token: TokenConfigSchema.optional(),\n \n rules: z.array(z.any()).optional(),\n agentUrls: z.array(z.string().url()).optional(),\n});\n\n/**\n * Validate world configuration\n */\nexport function validateWorldConfig(config: unknown): void {\n try {\n WorldConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const messages = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');\n throw new Error(`Invalid world configuration: ${messages}`);\n }\n throw error;\n }\n}\n\n/**\n * Validate world configuration and return result\n */\nexport function isValidWorldConfig(config: unknown): boolean {\n try {\n WorldConfigSchema.parse(config);\n return true;\n } catch {\n return false;\n }\n}\n","import type { PersistenceAdapter } from '../PersistenceAdapter.js';\nimport type {\n WorldStateSnapshot,\n WorldEvent,\n AgentProfile,\n EventFilter,\n} from '../../config/types.js';\n\n/**\n * ============================================================================\n * IN-MEMORY PERSISTENCE ADAPTER\n * ============================================================================\n * \n * Simple in-memory persistence for testing and development.\n * No external dependencies - works on any Node version.\n * \n * WARNING: All data is lost when process exits.\n * \n * Use Case: Testing, development, temporary worlds\n */\n\nexport class InMemoryAdapter implements PersistenceAdapter {\n private state: WorldStateSnapshot | null = null;\n private events: WorldEvent[] = [];\n private agents: Map<string, AgentProfile> = new Map();\n \n async connect(): Promise<void> {\n // No-op for in-memory\n }\n \n async saveState(state: WorldStateSnapshot): Promise<void> {\n this.state = { ...state };\n }\n \n async loadState(): Promise<WorldStateSnapshot | null> {\n return this.state ? { ...this.state } : null;\n }\n \n async saveEvent(event: WorldEvent): Promise<void> {\n this.events.push({ ...event });\n }\n \n async getEvents(filter?: EventFilter): Promise<WorldEvent[]> {\n let filtered = [...this.events];\n \n if (filter?.type) {\n filtered = filtered.filter(e => e.type === filter.type);\n }\n \n if (filter?.agentUrl) {\n filtered = filtered.filter(e => e.agentUrl === filter.agentUrl);\n }\n \n if (filter?.fromTimestamp) {\n filtered = filtered.filter(e => e.timestamp >= filter.fromTimestamp!);\n }\n \n if (filter?.toTimestamp) {\n filtered = filtered.filter(e => e.timestamp <= filter.toTimestamp!);\n }\n \n // Sort by timestamp descending\n filtered.sort((a, b) => b.timestamp - a.timestamp);\n \n if (filter?.limit) {\n filtered = filtered.slice(0, filter.limit);\n }\n \n return filtered;\n }\n \n async saveAgent(profile: AgentProfile): Promise<void> {\n this.agents.set(profile.url, { ...profile });\n }\n \n async removeAgent(agentUrl: string): Promise<void> {\n this.agents.delete(agentUrl);\n }\n \n async getAgents(): Promise<AgentProfile[]> {\n return Array.from(this.agents.values()).map(a => ({ ...a }));\n }\n \n async getAgent(agentUrl: string): Promise<AgentProfile | null> {\n const agent = this.agents.get(agentUrl);\n return agent ? { ...agent } : null;\n }\n \n async disconnect(): Promise<void> {\n // No-op for in-memory\n }\n \n async healthCheck(): Promise<boolean> {\n return true;\n }\n \n async clear(): Promise<void> {\n this.state = null;\n this.events = [];\n this.agents.clear();\n }\n}\n","import type { PersistenceAdapter } from './PersistenceAdapter.js';\nimport type { PersistenceConfig } from '../config/types.js';\nimport { InMemoryAdapter } from './adapters/InMemoryAdapter.js';\n\n/**\n * ============================================================================\n * PERSISTENCE FACTORY\n * ============================================================================\n * \n * Creates the appropriate persistence adapter based on configuration.\n * Uses dynamic import() for optional dependencies to avoid requiring all databases\n * to be installed. Only the adapter for the configured persistence type is loaded.\n */\n\nexport async function createPersistence(config: PersistenceConfig): Promise<PersistenceAdapter> {\n switch (config.type) {\n case 'memory':\n return new InMemoryAdapter();\n \n case 'sqlite':\n return createSQLiteAdapter(config.sqlite || { filename: './world.db' });\n \n case 'postgres':\n if (!config.postgres) {\n throw new Error('PostgreSQL configuration is required');\n }\n return createPostgresAdapter(config.postgres);\n \n case 'redis':\n if (!config.redis) {\n throw new Error('Redis configuration is required');\n }\n return createRedisAdapter(config.redis);\n \n case 'mongodb':\n if (!config.mongodb) {\n throw new Error('MongoDB configuration is required');\n }\n return createMongoAdapter(config.mongodb);\n \n case 'leveldb':\n if (!config.leveldb) {\n throw new Error('LevelDB configuration is required');\n }\n return createLevelDBAdapter(config.leveldb);\n \n default:\n throw new Error(`Unknown persistence type: ${(config as any).type}`);\n }\n}\n\n/**\n * Lazy-load SQLite adapter via dynamic import\n */\nasync function createSQLiteAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n const Database = (await import('better-sqlite3')).default;\n \n // Inline adapter that uses the dynamically-imported Database\n return new (class implements PersistenceAdapter {\n private db!: any;\n \n async connect(): Promise<void> {\n // Ensure the parent directory exists\n const path = await import('path');\n const fs = await import('fs');\n const dir = path.dirname(config.filename);\n if (dir && dir !== '.') {\n fs.mkdirSync(dir, { recursive: true });\n }\n this.db = new Database(config.filename);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS world_state (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n phase TEXT NOT NULL,\n tick INTEGER NOT NULL,\n round INTEGER NOT NULL,\n timestamp INTEGER NOT NULL,\n metadata TEXT\n );\n CREATE TABLE IF NOT EXISTS events (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n agent_url TEXT,\n timestamp INTEGER NOT NULL,\n data TEXT\n );\n CREATE TABLE IF NOT EXISTS agents (\n url TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n protocol_version TEXT NOT NULL,\n skills TEXT NOT NULL,\n capabilities TEXT NOT NULL,\n joined_at INTEGER NOT NULL,\n role TEXT,\n metadata TEXT,\n wallet_address TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n CREATE INDEX IF NOT EXISTS idx_events_agent ON events(agent_url);\n `);\n }\n\n async saveState(state: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT OR REPLACE INTO world_state (id, phase, tick, round, timestamp, metadata) VALUES (1, ?, ?, ?, ?, ?)`);\n stmt.run(state.phase, state.tick, state.round, state.timestamp, JSON.stringify(state.metadata));\n }\n\n async loadState(): Promise<any> {\n const stmt = this.db.prepare('SELECT * FROM world_state WHERE id = 1');\n const row = stmt.get() as any;\n if (!row) return null;\n return { phase: row.phase, tick: row.tick, round: row.round, timestamp: row.timestamp, metadata: JSON.parse(row.metadata || '{}') };\n }\n\n async saveEvent(event: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT INTO events (id, type, agent_url, timestamp, data) VALUES (?, ?, ?, ?, ?)`);\n stmt.run(event.id, event.type, event.agentUrl || null, event.timestamp, JSON.stringify(event.data || {}));\n }\n\n async getEvents(filter?: any): Promise<any[]> {\n let query = 'SELECT * FROM events WHERE 1=1';\n const params: any[] = [];\n if (filter?.type) { query += ' AND type = ?'; params.push(filter.type); }\n if (filter?.agentUrl) { query += ' AND agent_url = ?'; params.push(filter.agentUrl); }\n if (filter?.fromTimestamp) { query += ' AND timestamp >= ?'; params.push(filter.fromTimestamp); }\n if (filter?.toTimestamp) { query += ' AND timestamp <= ?'; params.push(filter.toTimestamp); }\n query += ' ORDER BY timestamp DESC';\n if (filter?.limit) { query += ' LIMIT ?'; params.push(filter.limit); }\n const stmt = this.db.prepare(query);\n const rows = stmt.all(...params) as any[];\n return rows.map(row => ({ id: row.id, type: row.type, timestamp: row.timestamp, agentUrl: row.agent_url || undefined, data: JSON.parse(row.data || '{}') }));\n }\n\n async saveAgent(profile: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT OR REPLACE INTO agents (url, name, protocol_version, skills, capabilities, joined_at, role, metadata, wallet_address) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);\n stmt.run(profile.url, profile.name, profile.protocolVersion, JSON.stringify(profile.skills), JSON.stringify(profile.capabilities), profile.joinedAt, profile.role || null, JSON.stringify(profile.metadata || {}), profile.walletAddress || null);\n }\n\n async removeAgent(agentUrl: string): Promise<void> {\n this.db.prepare('DELETE FROM agents WHERE url = ?').run(agentUrl);\n }\n\n async getAgents(): Promise<any[]> {\n const rows = this.db.prepare('SELECT * FROM agents ORDER BY joined_at ASC').all() as any[];\n return rows.map(row => ({ url: row.url, name: row.name, protocolVersion: row.protocol_version, skills: JSON.parse(row.skills), capabilities: JSON.parse(row.capabilities), joinedAt: row.joined_at, role: row.role || undefined, metadata: JSON.parse(row.metadata || '{}'), walletAddress: row.wallet_address || undefined }));\n }\n\n async getAgent(agentUrl: string): Promise<any> {\n const row = this.db.prepare('SELECT * FROM agents WHERE url = ?').get(agentUrl) as any;\n if (!row) return null;\n return { url: row.url, name: row.name, protocolVersion: row.protocol_version, skills: JSON.parse(row.skills), capabilities: JSON.parse(row.capabilities), joinedAt: row.joined_at, role: row.role || undefined, metadata: JSON.parse(row.metadata || '{}'), walletAddress: row.wallet_address || undefined };\n }\n\n async disconnect(): Promise<void> { this.db.close(); }\n async healthCheck(): Promise<boolean> { try { this.db.prepare('SELECT 1').get(); return true; } catch { return false; } }\n async clear(): Promise<void> { this.db.exec('DELETE FROM world_state; DELETE FROM events; DELETE FROM agents;'); }\n })();\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'SQLite adapter requires better-sqlite3. Install it with: npm install better-sqlite3'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load PostgreSQL adapter via dynamic import\n */\nasync function createPostgresAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n const pg = await import('pg');\n const Pool = pg.default?.Pool || pg.Pool;\n const { PostgresAdapter } = await import('./adapters/PostgresAdapter.js');\n return new PostgresAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'PostgreSQL adapter requires pg. Install it with: npm install pg'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load Redis adapter via dynamic import\n */\nasync function createRedisAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n await import('ioredis');\n const { RedisAdapter } = await import('./adapters/RedisAdapter.js');\n return new RedisAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'Redis adapter requires ioredis. Install it with: npm install ioredis'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load MongoDB adapter via dynamic import\n */\nasync function createMongoAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n // @ts-ignore - mongodb is an optional peer dependency\n await import('mongodb');\n const { MongoAdapter } = await import('./adapters/MongoAdapter.js');\n return new MongoAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'MongoDB adapter requires mongodb. Install it with: npm install mongodb'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load LevelDB adapter via dynamic import\n */\nasync function createLevelDBAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n // @ts-ignore - level is an optional peer dependency\n await import('level');\n const { LevelDBAdapter } = await import('./adapters/LevelDBAdapter.js');\n return new LevelDBAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'LevelDB adapter requires level. Install it with: npm install level'\n );\n }\n throw error;\n }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport type {\n WorldConfig,\n WorldPhase,\n WorldStateSnapshot,\n WorldEvent,\n AgentProfile,\n} from '../config/types.js';\nimport { validateWorldConfig } from '../config/validator.js';\nimport type { PersistenceAdapter } from '../persistence/PersistenceAdapter.js';\nimport { createPersistence } from '../persistence/PersistenceFactory.js';\nimport { CardFetcher } from '../discovery/CardFetcher.js';\nimport { AgentEvaluator } from '../discovery/AgentEvaluator.js';\nimport { BlockchainClient } from '../blockchain/BlockchainClient.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('World');\n\n/**\n * ============================================================================\n * WORLD ENGINE\n * ============================================================================\n * \n * Core world runtime managing:\n * - Agent discovery and admission\n * - World state and lifecycle\n * - Persistence and event logging\n * - Simulation ticks (if enabled)\n * - Rule enforcement\n */\n\nexport class World {\n private state: WorldStateSnapshot;\n private agents: Map<string, AgentProfile>;\n private persistence: PersistenceAdapter | null = null;\n private blockchainClient: BlockchainClient | null = null;\n private cardFetcher: CardFetcher;\n private evaluator: AgentEvaluator;\n private tickInterval: NodeJS.Timeout | null = null;\n private autoSaveInterval: NodeJS.Timeout | null = null;\n \n constructor(public readonly config: WorldConfig) {\n // Validate configuration\n validateWorldConfig(config);\n \n // Initialize state\n this.state = {\n phase: 'idle',\n tick: 0,\n round: 0,\n timestamp: Date.now(),\n metadata: {},\n };\n \n this.agents = new Map();\n this.cardFetcher = new CardFetcher();\n this.evaluator = new AgentEvaluator(config.admission);\n \n logger.info(`World \"${config.name}\" created`, {\n type: config.type || 'generic',\n maxAgents: config.admission.maxAgents,\n });\n }\n \n /**\n * Initialize the world (connect persistence, restore state, discover agents)\n */\n async init(): Promise<void> {\n logger.info('Initializing world...');\n this.setState('initializing');\n \n try {\n // 1. Connect to persistence backend\n if (this.config.persistence) {\n logger.info(`Connecting to persistence backend: ${this.config.persistence.type}`);\n this.persistence = await createPersistence(this.config.persistence);\n await this.persistence.connect();\n \n // Try to restore state from persistence\n const savedState = await this.persistence.loadState();\n if (savedState) {\n this.state = savedState;\n logger.info('Restored world state from persistence', {\n phase: savedState.phase,\n tick: savedState.tick,\n });\n \n // Restore agents\n const savedAgents = await this.persistence.getAgents();\n for (const agent of savedAgents) {\n this.agents.set(agent.url, agent);\n }\n \n logger.info(`Restored ${savedAgents.length} agents from persistence`);\n }\n }\n \n // 2. Initialize blockchain client if configured\n if (this.config.blockchain) {\n logger.info('Initializing blockchain client...');\n this.blockchainClient = new BlockchainClient(this.config.blockchain);\n await this.blockchainClient.init();\n }\n \n // 3. Discover pre-configured agents\n if (this.config.agentUrls && this.config.agentUrls.length > 0) {\n logger.info(`Discovering ${this.config.agentUrls.length} pre-configured agents...`);\n \n const results = await this.cardFetcher.fetchCards(this.config.agentUrls);\n \n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result.success && result.card) {\n // Auto-admit pre-configured agents\n try {\n await this.admitAgent(result.card);\n } catch (error: any) {\n logger.warn(`Failed to admit pre-configured agent:`, error.message);\n }\n }\n }\n }\n \n // 3. Start auto-save if persistence enabled\n if (this.persistence) {\n this.startAutoSave();\n }\n \n this.setState('ready');\n logger.info('World initialized successfully', {\n agents: this.agents.size,\n persistence: this.config.persistence?.type || 'none',\n });\n } catch (error: any) {\n logger.error('Failed to initialize world:', error);\n this.setState('failed');\n throw error;\n }\n }\n \n /**\n * Start the world simulation\n */\n async start(): Promise<void> {\n if (this.state.phase === 'running') {\n logger.warn('World is already running');\n return;\n }\n \n logger.info('Starting world simulation...');\n this.setState('running');\n \n await this.logEvent({\n id: uuidv4(),\n type: 'world_started',\n timestamp: Date.now(),\n });\n \n // Start tick interval if simulation is enabled\n if (this.config.simulation?.tickIntervalMs) {\n this.startTicking();\n }\n }\n \n /**\n * Stop the world simulation\n */\n async stop(): Promise<void> {\n logger.info('Stopping world...');\n this.setState('stopped');\n \n // Stop ticking\n if (this.tickInterval) {\n clearInterval(this.tickInterval);\n this.tickInterval = null;\n }\n \n // Stop auto-save\n if (this.autoSaveInterval) {\n clearInterval(this.autoSaveInterval);\n this.autoSaveInterval = null;\n }\n \n // Final save\n if (this.persistence) {\n await this.persistence.saveState(this.state);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'world_stopped',\n timestamp: Date.now(),\n });\n \n logger.info('World stopped');\n }\n \n /**\n * Admit an agent to the world\n */\n async admitAgent(card: any, walletAddress?: string): Promise<void> {\n const decision = await this.evaluator.evaluate(card, this.agents.size, walletAddress);\n \n if (!decision.admitted) {\n throw new Error(`Agent admission denied: ${decision.reason}`);\n }\n \n // Optional: Validate agent on-chain\n if (this.blockchainClient && this.config.blockchain?.enforceOnChainValidation && walletAddress) {\n const isValid = await this.blockchainClient.validateAgent(walletAddress);\n if (!isValid) {\n throw new Error('Agent not registered in on-chain AgentRegistry');\n }\n logger.info(`Agent validated on-chain: ${card.name}`);\n }\n \n // Optional: Mint membership NFT\n if (this.blockchainClient && this.config.blockchain?.requireMembership && walletAddress) {\n // Check if agent already has membership\n const hasMembership = await this.blockchainClient.hasMembership(walletAddress);\n \n if (!hasMembership) {\n logger.info(`Minting membership NFT for agent: ${card.name}`);\n await this.blockchainClient.mintMembership(walletAddress);\n } else {\n logger.info(`Agent already has membership: ${card.name}`);\n }\n }\n \n const profile: AgentProfile = {\n url: card.url,\n name: card.name,\n protocolVersion: card.protocolVersion,\n skills: card.skills,\n capabilities: {\n streaming: card.capabilities.streaming ?? false,\n pushNotifications: card.capabilities.pushNotifications ?? false,\n stateTransitionHistory: card.capabilities.stateTransitionHistory,\n },\n joinedAt: Date.now(),\n role: decision.role,\n metadata: decision.metadata,\n walletAddress,\n };\n \n this.agents.set(profile.url, profile);\n \n if (this.persistence) {\n await this.persistence.saveAgent(profile);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'agent_joined',\n timestamp: Date.now(),\n agentUrl: profile.url,\n data: { name: profile.name, role: profile.role },\n });\n \n logger.info(`Agent admitted: ${profile.name}`, {\n role: profile.role,\n totalAgents: this.agents.size,\n });\n }\n \n /**\n * Remove an agent from the world\n */\n async removeAgent(agentUrl: string): Promise<void> {\n const agent = this.agents.get(agentUrl);\n if (!agent) {\n throw new Error(`Agent not found: ${agentUrl}`);\n }\n \n this.agents.delete(agentUrl);\n \n if (this.persistence) {\n await this.persistence.removeAgent(agentUrl);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'agent_left',\n timestamp: Date.now(),\n agentUrl,\n data: { name: agent.name },\n });\n \n logger.info(`Agent removed: ${agent.name}`, {\n totalAgents: this.agents.size,\n });\n }\n \n /**\n * Get all agents in the world\n */\n getAgents(): AgentProfile[] {\n return Array.from(this.agents.values());\n }\n \n /**\n * Get current world state\n */\n getState(): WorldStateSnapshot {\n return { ...this.state };\n }\n \n /**\n * Log an event\n */\n private async logEvent(event: WorldEvent): Promise<void> {\n if (this.persistence) {\n await this.persistence.saveEvent(event);\n }\n }\n \n /**\n * Set world phase\n */\n private setState(phase: WorldPhase): void {\n this.state.phase = phase;\n this.state.timestamp = Date.now();\n }\n \n /**\n * Start auto-save interval\n */\n private startAutoSave(): void {\n const interval = this.config.persistence?.autoSaveIntervalMs || 10000;\n \n this.autoSaveInterval = setInterval(async () => {\n if (this.persistence) {\n await this.persistence.saveState(this.state);\n logger.debug('Auto-saved world state');\n }\n }, interval);\n \n logger.info(`Auto-save enabled (interval: ${interval}ms)`);\n }\n \n /**\n * Start simulation ticking\n */\n private startTicking(): void {\n const interval = this.config.simulation!.tickIntervalMs!;\n \n this.tickInterval = setInterval(async () => {\n this.state.tick++;\n \n await this.logEvent({\n id: uuidv4(),\n type: 'tick',\n timestamp: Date.now(),\n data: { tick: this.state.tick },\n });\n \n logger.debug(`Tick ${this.state.tick}`);\n \n // Check max ticks\n if (this.config.simulation?.maxTicks && this.state.tick >= this.config.simulation.maxTicks) {\n logger.info('Max ticks reached, stopping world');\n await this.stop();\n }\n }, interval);\n \n logger.info(`Simulation ticking enabled (interval: ${interval}ms)`);\n }\n}\n","import type { AgentCard } from '@a2a-js/sdk';\nimport type { AgentProfile, AdmissionRules, AdmissionDecision } from '../config/types.js';\nimport { profileFromCard } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('AgentEvaluator');\n\n/**\n * ============================================================================\n * AGENT EVALUATOR\n * ============================================================================\n * \n * Evaluates whether an agent should be admitted to the world based on rules.\n * \n * Evaluation criteria:\n * - Max agents limit\n * - Required skills (agent must have ALL)\n * - Required tags (agent must have AT LEAST ONE)\n * - Minimum protocol version\n * - Custom evaluator function\n */\n\nexport class AgentEvaluator {\n constructor(private rules: AdmissionRules) {}\n \n /**\n * Evaluate whether an agent should be admitted.\n * \n * @param card Agent's A2A card\n * @param currentAgentCount Current number of agents in world\n * @param walletAddress Optional wallet address for blockchain membership\n * @returns Admission decision\n */\n async evaluate(\n card: AgentCard,\n currentAgentCount: number,\n walletAddress?: string\n ): Promise<AdmissionDecision> {\n logger.debug(`Evaluating agent: ${card.name}`, {\n currentAgents: currentAgentCount,\n maxAgents: this.rules.maxAgents,\n });\n \n // Check max agents limit\n if (this.rules.maxAgents && currentAgentCount >= this.rules.maxAgents) {\n logger.info(`Agent ${card.name} rejected: world is full`, {\n current: currentAgentCount,\n max: this.rules.maxAgents,\n });\n \n return {\n admitted: false,\n reason: `World is full (${this.rules.maxAgents} agents maximum)`,\n };\n }\n \n // Check protocol version\n if (this.rules.minProtocolVersion) {\n if (!this.meetsProtocolVersion(card.protocolVersion, this.rules.minProtocolVersion)) {\n logger.info(`Agent ${card.name} rejected: protocol version too old`, {\n agent: card.protocolVersion,\n required: this.rules.minProtocolVersion,\n });\n \n return {\n admitted: false,\n reason: `Protocol version ${card.protocolVersion} is below minimum ${this.rules.minProtocolVersion}`,\n };\n }\n }\n \n // Check required skills (agent must have ALL)\n if (this.rules.requiredSkills && this.rules.requiredSkills.length > 0) {\n const agentSkillIds = card.skills.map(s => s.id.toLowerCase());\n const missingSkills = this.rules.requiredSkills.filter(\n required => !agentSkillIds.includes(required.toLowerCase())\n );\n \n if (missingSkills.length > 0) {\n logger.info(`Agent ${card.name} rejected: missing required skills`, {\n missing: missingSkills,\n });\n \n return {\n admitted: false,\n reason: `Missing required skills: ${missingSkills.join(', ')}`,\n };\n }\n }\n \n // Check required tags (agent must have AT LEAST ONE)\n if (this.rules.requiredTags && this.rules.requiredTags.length > 0) {\n const agentTags = card.skills.flatMap(s => s.tags || []).map(t => t.toLowerCase());\n const hasRequiredTag = this.rules.requiredTags.some(\n required => agentTags.includes(required.toLowerCase())\n );\n \n if (!hasRequiredTag) {\n logger.info(`Agent ${card.name} rejected: no matching tags`, {\n required: this.rules.requiredTags,\n });\n \n return {\n admitted: false,\n reason: `Must have at least one of these tags: ${this.rules.requiredTags.join(', ')}`,\n };\n }\n }\n \n // Run custom evaluator if provided\n if (this.rules.customEvaluator) {\n const profile = profileFromCard(card, walletAddress);\n const customDecision = await this.rules.customEvaluator(profile);\n \n if (!customDecision.admitted) {\n logger.info(`Agent ${card.name} rejected by custom evaluator`, {\n reason: customDecision.reason,\n });\n \n return customDecision;\n }\n \n // Custom evaluator can assign roles and metadata\n if (customDecision.role || customDecision.metadata) {\n logger.debug(`Custom evaluator assigned role/metadata to ${card.name}`, {\n role: customDecision.role,\n });\n }\n \n return customDecision;\n }\n \n // All checks passed\n logger.info(`Agent ${card.name} admitted to world`);\n \n return {\n admitted: true,\n reason: 'All admission criteria met',\n };\n }\n \n /**\n * Check if agent's protocol version meets minimum requirement.\n * Simple semver comparison (major.minor).\n */\n private meetsProtocolVersion(agentVersion: string, minVersion: string): boolean {\n const parse = (v: string) => {\n const parts = v.split('.');\n return {\n major: parseInt(parts[0] || '0', 10),\n minor: parseInt(parts[1] || '0', 10),\n };\n };\n \n const agent = parse(agentVersion);\n const min = parse(minVersion);\n \n if (agent.major > min.major) return true;\n if (agent.major < min.major) return false;\n return agent.minor >= min.minor;\n }\n}\n","import { ethers } from 'ethers';\nimport type { BlockchainConfig } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('BlockchainClient');\n\n// Contract ABIs (minimal interfaces)\nconst AGENT_REGISTRY_ABI = [\n 'function registerAgent(string agentUrl, string name) external',\n 'function isAgentValid(address wallet) external view returns (bool)',\n 'function getAgent(address wallet) external view returns (tuple(address walletAddress, string agentUrl, string name, uint256 registeredAt, bool isActive))',\n 'function getWalletByUrl(string agentUrl) external view returns (address)',\n 'event AgentRegistered(address indexed wallet, string agentUrl, string name)',\n];\n\nconst WORLD_MEMBERSHIP_ABI = [\n 'function mintMembership(address agent) external payable',\n 'function revokeMembership(address agent) external',\n 'function hasMembership(address agent) external view returns (bool)',\n 'function entryFee() external view returns (uint256)',\n 'function totalMembers() external view returns (uint256)',\n 'function withdrawFees() external',\n 'event MembershipMinted(address indexed agent, uint256 indexed tokenId, uint256 feePaid)',\n];\n\nconst WORLD_TOKEN_ABI = [\n 'function mint(address to, uint256 amount) external',\n 'function burn(address from, uint256 amount) external',\n 'function balanceOf(address account) external view returns (uint256)',\n 'function transfer(address to, uint256 amount) external returns (bool)',\n];\n\n/**\n * ============================================================================\n * BLOCKCHAIN CLIENT\n * ============================================================================\n * \n * Handles all blockchain interactions for the World SDK:\n * - Agent registry validation\n * - Membership NFT minting\n * - Entry fee collection\n * - World token operations\n */\n\nexport class BlockchainClient {\n private provider: ethers.JsonRpcProvider;\n private wallet: ethers.Wallet;\n private agentRegistry?: ethers.Contract;\n private membershipContract?: ethers.Contract;\n private worldToken?: ethers.Contract;\n \n constructor(private config: BlockchainConfig) {\n // Initialize provider and wallet\n this.provider = new ethers.JsonRpcProvider(config.rpcUrl);\n this.wallet = new ethers.Wallet(config.privateKey, this.provider);\n \n logger.info('Blockchain client initialized', {\n network: config.rpcUrl,\n wallet: this.wallet.address,\n });\n }\n \n /**\n * Initialize contract connections\n */\n async init(): Promise<void> {\n // Connect to AgentRegistry if address provided\n if (this.config.agentRegistryAddress) {\n this.agentRegistry = new ethers.Contract(\n this.config.agentRegistryAddress,\n AGENT_REGISTRY_ABI,\n this.wallet\n );\n logger.info('Connected to AgentRegistry', {\n address: this.config.agentRegistryAddress,\n });\n }\n \n // Connect to WorldMembership if address provided\n if (this.config.membershipContractAddress) {\n this.membershipContract = new ethers.Contract(\n this.config.membershipContractAddress,\n WORLD_MEMBERSHIP_ABI,\n this.wallet\n );\n logger.info('Connected to WorldMembership', {\n address: this.config.membershipContractAddress,\n });\n }\n \n // Connect to WorldToken if address provided\n if (this.config.worldTokenAddress) {\n this.worldToken = new ethers.Contract(\n this.config.worldTokenAddress,\n WORLD_TOKEN_ABI,\n this.wallet\n );\n logger.info('Connected to WorldToken', {\n address: this.config.worldTokenAddress,\n });\n }\n \n logger.info('Blockchain client ready');\n }\n \n /**\n * Validate agent on-chain\n * @param walletAddress Agent's wallet address\n * @returns True if agent is registered and valid\n */\n async validateAgent(walletAddress: string): Promise<boolean> {\n if (!this.agentRegistry) {\n logger.warn('AgentRegistry not configured, skipping on-chain validation');\n return true; // Skip validation if not configured\n }\n \n try {\n const isValid = await this.agentRegistry.isAgentValid(walletAddress);\n logger.debug('Agent validation result', {\n wallet: walletAddress,\n isValid,\n });\n return isValid;\n } catch (error: any) {\n logger.error('Failed to validate agent on-chain', {\n wallet: walletAddress,\n error: error.message,\n });\n return false;\n }\n }\n \n /**\n * Mint membership NFT for an agent\n * @param agentWallet Agent's wallet address\n * @returns Transaction hash\n */\n async mintMembership(agentWallet: string): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n // Get entry fee\n const entryFee = await this.membershipContract.entryFee();\n \n logger.info('Minting membership NFT', {\n agent: agentWallet,\n entryFee: ethers.formatEther(entryFee),\n });\n \n // Mint membership\n const tx = await this.membershipContract.mintMembership(agentWallet, {\n value: entryFee,\n });\n \n const receipt = await tx.wait();\n \n logger.info('Membership NFT minted', {\n agent: agentWallet,\n txHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to mint membership NFT', {\n agent: agentWallet,\n error: error.message,\n });\n throw error;\n }\n }\n \n /**\n * Check if agent has membership\n * @param agentWallet Agent's wallet address\n * @returns True if agent has membership\n */\n async hasMembership(agentWallet: string): Promise<boolean> {\n if (!this.membershipContract) {\n logger.warn('WorldMembership not configured, skipping membership check');\n return true; // Skip check if not configured\n }\n \n try {\n const hasMembership = await this.membershipContract.hasMembership(agentWallet);\n return hasMembership;\n } catch (error: any) {\n logger.error('Failed to check membership', {\n agent: agentWallet,\n error: error.message,\n });\n return false;\n }\n }\n \n /**\n * Revoke membership NFT\n * @param agentWallet Agent's wallet address\n * @returns Transaction hash\n */\n async revokeMembership(agentWallet: string): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n logger.info('Revoking membership', { agent: agentWallet });\n \n const tx = await this.membershipContract.revokeMembership(agentWallet);\n const receipt = await tx.wait();\n \n logger.info('Membership revoked', {\n agent: agentWallet,\n txHash: receipt.hash,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to revoke membership', {\n agent: agentWallet,\n error: error.message,\n });\n throw error;\n }\n }\n \n /**\n * Get total number of members\n */\n async getTotalMembers(): Promise<number> {\n if (!this.membershipContract) {\n return 0;\n }\n \n try {\n const total = await this.membershipContract.totalMembers();\n return Number(total);\n } catch (error: any) {\n logger.error('Failed to get total members', { error: error.message });\n return 0;\n }\n }\n \n /**\n * Withdraw collected entry fees (world owner only)\n */\n async withdrawFees(): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n logger.info('Withdrawing entry fees');\n \n const tx = await this.membershipContract.withdrawFees();\n const receipt = await tx.wait();\n \n logger.info('Fees withdrawn', {\n txHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to withdraw fees', { error: error.message });\n throw error;\n }\n }\n \n /**\n * Get world owner's wallet address\n */\n getWalletAddress(): string {\n return this.wallet.address;\n }\n \n /**\n * Get entry fee in MON\n */\n async getEntryFee(): Promise<string> {\n if (!this.membershipContract) {\n return '0';\n }\n \n try {\n const fee = await this.membershipContract.entryFee();\n return ethers.formatEther(fee);\n } catch (error: any) {\n logger.error('Failed to get entry fee', { error: error.message });\n return '0';\n }\n }\n}\n","import express, { type Express, type Request, type Response } from 'express';\nimport type { World } from '../engine/World.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('WorldServer');\n\n/**\n * ============================================================================\n * WORLD HTTP SERVER\n * ============================================================================\n * \n * Express server providing HTTP endpoints for:\n * - World information\n * - Agent join requests \n * - Agent list\n * - World state and events\n * \n * Mirrors the agent SDK server pattern.\n */\n\nexport function createWorldApp(world: World): Express {\n const app = express();\n \n // Middleware\n app.use(express.json());\n app.use(express.urlencoded({ extended: true }));\n \n // Request logging\n app.use((req, res, next) => {\n logger.debug(`${req.method} ${req.path}`, {\n query: req.query,\n ip: req.ip,\n });\n next();\n });\n \n /**\n * GET / - World information\n */\n app.get('/', (req: Request, res: Response) => {\n res.json({\n name: world.config.name,\n description: world.config.description,\n type: world.config.type || 'generic',\n state: world.getState(),\n agentCount: world.getAgents().length,\n maxAgents: world.config.admission.maxAgents || null,\n admission: {\n requiredSkills: world.config.admission.requiredSkills || [],\n requiredTags: world.config.admission.requiredTags || [],\n minProtocolVersion: world.config.admission.minProtocolVersion || null,\n },\n });\n });\n \n /**\n * POST /world/join - Agent join request\n * \n * Body:\n * {\n * \"agentUrl\": \"http://localhost:3000\",\n * \"walletAddress\": \"0x...\" // optional, for blockchain membership\n * }\n */\n app.post('/world/join', async (req: Request, res: Response) => {\n try {\n const { agentUrl, walletAddress } = req.body;\n \n if (!agentUrl) {\n return res.status(400).json({\n success: false,\n error: 'agentUrl is required',\n });\n }\n \n logger.info(`Agent join request from: ${agentUrl}`, {\n wallet: walletAddress || 'none',\n });\n \n // Fetch agent card\n const cardFetcher = new (await import('../discovery/CardFetcher.js')).CardFetcher();\n const result = await cardFetcher.fetchCard(agentUrl);\n \n if (!result.success || !result.card) {\n return res.status(400).json({\n success: false,\n error: `Failed to fetch agent card: ${result.error}`,\n });\n }\n \n // Admit agent\n await world.admitAgent(result.card, walletAddress);\n \n res.json({\n success: true,\n message: 'Agent admitted to world',\n world: {\n name: world.config.name,\n agentCount: world.getAgents().length,\n },\n });\n } catch (error: any) {\n logger.error('Failed to process join request:', error);\n \n res.status(400).json({\n success: false,\n error: error.message || 'Failed to join world',\n });\n }\n });\n \n /**\n * GET /world/agents - List all agents\n */\n app.get('/world/agents', (req: Request, res: Response) => {\n const agents = world.getAgents().map(agent => ({\n url: agent.url,\n name: agent.name,\n protocolVersion: agent.protocolVersion,\n skills: agent.skills.map(s => s.id),\n joinedAt: agent.joinedAt,\n role: agent.role,\n }));\n \n res.json({\n agents,\n count: agents.length,\n });\n });\n \n /**\n * GET /world/state - World state\n */\n app.get('/world/state', (req: Request, res: Response) => {\n res.json(world.getState());\n });\n \n /**\n * POST /world/start - Start world simulation\n */\n app.post('/world/start', async (req: Request, res: Response) => {\n try {\n await world.start();\n res.json({\n success: true,\n message: 'World simulation started',\n state: world.getState(),\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n /**\n * POST /world/stop - Stop world simulation\n */\n app.post('/world/stop', async (req: Request, res: Response) => {\n try {\n await world.stop();\n res.json({\n success: true,\n message: 'World simulation stopped',\n state: world.getState(),\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n /**\n * DELETE /world/agents/:agentUrl - Remove an agent\n */\n app.delete('/world/agents/:agentUrl', async (req: Request, res: Response) => {\n try {\n const agentUrlParam = req.params.agentUrl;\n const agentUrl = typeof agentUrlParam === 'string' \n ? decodeURIComponent(agentUrlParam)\n : decodeURIComponent(agentUrlParam[0]);\n \n await world.removeAgent(agentUrl);\n \n res.json({\n success: true,\n message: 'Agent removed from world',\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n // 404 handler\n app.use((req: Request, res: Response) => {\n res.status(404).json({\n error: 'Not found',\n path: req.path,\n });\n });\n \n // Error handler\n app.use((err: any, req: Request, res: Response, next: any) => {\n logger.error('Server error:', err);\n \n res.status(500).json({\n error: 'Internal server error',\n message: err.message,\n });\n });\n \n return app;\n}\n\n/**\n * Start world server on configured port\n */\nexport async function startWorldServer(world: World): Promise<void> {\n const app = createWorldApp(world);\n \n const server = app.listen(world.config.server.port, world.config.server.host, () => {\n const { host, port } = world.config.server;\n \n logger.info(`World \"${world.config.name}\" server started`);\n logger.info(` http://${host}:${port}`);\n logger.info('');\n logger.info('Endpoints:');\n logger.info(` GET / - World info`);\n logger.info(` POST /world/join - Agent join request`);\n logger.info(` GET /world/agents - List agents`);\n logger.info(` GET /world/state - World state`);\n logger.info(` POST /world/start - Start simulation`);\n logger.info(` POST /world/stop - Stop simulation`);\n logger.info(` DELETE /world/agents/:url - Remove agent`);\n });\n \n // Graceful shutdown\n process.on('SIGTERM', async () => {\n logger.info('SIGTERM received, shutting down gracefully...');\n \n server.close(async () => {\n await world.stop();\n process.exit(0);\n });\n });\n \n process.on('SIGINT', async () => {\n logger.info('SIGINT received, shutting down gracefully...');\n \n server.close(async () => {\n await world.stop();\n process.exit(0);\n });\n });\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -428,8 +428,8 @@ declare const PersistenceConfigSchema: z.ZodObject<{
428
428
  }>;
429
429
  declare const BlockchainConfigSchema: z.ZodObject<{
430
430
  rpcUrl: z.ZodString;
431
- privateKey: z.ZodString;
432
- entryFee: z.ZodNumber;
431
+ privateKey: z.ZodOptional<z.ZodString>;
432
+ entryFee: z.ZodOptional<z.ZodNumber>;
433
433
  requireMembership: z.ZodOptional<z.ZodBoolean>;
434
434
  enforceOnChainValidation: z.ZodOptional<z.ZodBoolean>;
435
435
  agentRegistryAddress: z.ZodOptional<z.ZodString>;
@@ -438,8 +438,8 @@ declare const BlockchainConfigSchema: z.ZodObject<{
438
438
  chainId: z.ZodOptional<z.ZodNumber>;
439
439
  }, "strip", z.ZodTypeAny, {
440
440
  rpcUrl: string;
441
- privateKey: string;
442
- entryFee: number;
441
+ privateKey?: string | undefined;
442
+ entryFee?: number | undefined;
443
443
  requireMembership?: boolean | undefined;
444
444
  enforceOnChainValidation?: boolean | undefined;
445
445
  agentRegistryAddress?: string | undefined;
@@ -448,8 +448,8 @@ declare const BlockchainConfigSchema: z.ZodObject<{
448
448
  chainId?: number | undefined;
449
449
  }, {
450
450
  rpcUrl: string;
451
- privateKey: string;
452
- entryFee: number;
451
+ privateKey?: string | undefined;
452
+ entryFee?: number | undefined;
453
453
  requireMembership?: boolean | undefined;
454
454
  enforceOnChainValidation?: boolean | undefined;
455
455
  agentRegistryAddress?: string | undefined;
@@ -677,8 +677,8 @@ declare const WorldConfigSchema: z.ZodObject<{
677
677
  }>>;
678
678
  blockchain: z.ZodOptional<z.ZodObject<{
679
679
  rpcUrl: z.ZodString;
680
- privateKey: z.ZodString;
681
- entryFee: z.ZodNumber;
680
+ privateKey: z.ZodOptional<z.ZodString>;
681
+ entryFee: z.ZodOptional<z.ZodNumber>;
682
682
  requireMembership: z.ZodOptional<z.ZodBoolean>;
683
683
  enforceOnChainValidation: z.ZodOptional<z.ZodBoolean>;
684
684
  agentRegistryAddress: z.ZodOptional<z.ZodString>;
@@ -687,8 +687,8 @@ declare const WorldConfigSchema: z.ZodObject<{
687
687
  chainId: z.ZodOptional<z.ZodNumber>;
688
688
  }, "strip", z.ZodTypeAny, {
689
689
  rpcUrl: string;
690
- privateKey: string;
691
- entryFee: number;
690
+ privateKey?: string | undefined;
691
+ entryFee?: number | undefined;
692
692
  requireMembership?: boolean | undefined;
693
693
  enforceOnChainValidation?: boolean | undefined;
694
694
  agentRegistryAddress?: string | undefined;
@@ -697,8 +697,8 @@ declare const WorldConfigSchema: z.ZodObject<{
697
697
  chainId?: number | undefined;
698
698
  }, {
699
699
  rpcUrl: string;
700
- privateKey: string;
701
- entryFee: number;
700
+ privateKey?: string | undefined;
701
+ entryFee?: number | undefined;
702
702
  requireMembership?: boolean | undefined;
703
703
  enforceOnChainValidation?: boolean | undefined;
704
704
  agentRegistryAddress?: string | undefined;
@@ -786,8 +786,8 @@ declare const WorldConfigSchema: z.ZodObject<{
786
786
  } | undefined;
787
787
  blockchain?: {
788
788
  rpcUrl: string;
789
- privateKey: string;
790
- entryFee: number;
789
+ privateKey?: string | undefined;
790
+ entryFee?: number | undefined;
791
791
  requireMembership?: boolean | undefined;
792
792
  enforceOnChainValidation?: boolean | undefined;
793
793
  agentRegistryAddress?: string | undefined;
@@ -863,8 +863,8 @@ declare const WorldConfigSchema: z.ZodObject<{
863
863
  } | undefined;
864
864
  blockchain?: {
865
865
  rpcUrl: string;
866
- privateKey: string;
867
- entryFee: number;
866
+ privateKey?: string | undefined;
867
+ entryFee?: number | undefined;
868
868
  requireMembership?: boolean | undefined;
869
869
  enforceOnChainValidation?: boolean | undefined;
870
870
  agentRegistryAddress?: string | undefined;
package/dist/index.d.ts CHANGED
@@ -428,8 +428,8 @@ declare const PersistenceConfigSchema: z.ZodObject<{
428
428
  }>;
429
429
  declare const BlockchainConfigSchema: z.ZodObject<{
430
430
  rpcUrl: z.ZodString;
431
- privateKey: z.ZodString;
432
- entryFee: z.ZodNumber;
431
+ privateKey: z.ZodOptional<z.ZodString>;
432
+ entryFee: z.ZodOptional<z.ZodNumber>;
433
433
  requireMembership: z.ZodOptional<z.ZodBoolean>;
434
434
  enforceOnChainValidation: z.ZodOptional<z.ZodBoolean>;
435
435
  agentRegistryAddress: z.ZodOptional<z.ZodString>;
@@ -438,8 +438,8 @@ declare const BlockchainConfigSchema: z.ZodObject<{
438
438
  chainId: z.ZodOptional<z.ZodNumber>;
439
439
  }, "strip", z.ZodTypeAny, {
440
440
  rpcUrl: string;
441
- privateKey: string;
442
- entryFee: number;
441
+ privateKey?: string | undefined;
442
+ entryFee?: number | undefined;
443
443
  requireMembership?: boolean | undefined;
444
444
  enforceOnChainValidation?: boolean | undefined;
445
445
  agentRegistryAddress?: string | undefined;
@@ -448,8 +448,8 @@ declare const BlockchainConfigSchema: z.ZodObject<{
448
448
  chainId?: number | undefined;
449
449
  }, {
450
450
  rpcUrl: string;
451
- privateKey: string;
452
- entryFee: number;
451
+ privateKey?: string | undefined;
452
+ entryFee?: number | undefined;
453
453
  requireMembership?: boolean | undefined;
454
454
  enforceOnChainValidation?: boolean | undefined;
455
455
  agentRegistryAddress?: string | undefined;
@@ -677,8 +677,8 @@ declare const WorldConfigSchema: z.ZodObject<{
677
677
  }>>;
678
678
  blockchain: z.ZodOptional<z.ZodObject<{
679
679
  rpcUrl: z.ZodString;
680
- privateKey: z.ZodString;
681
- entryFee: z.ZodNumber;
680
+ privateKey: z.ZodOptional<z.ZodString>;
681
+ entryFee: z.ZodOptional<z.ZodNumber>;
682
682
  requireMembership: z.ZodOptional<z.ZodBoolean>;
683
683
  enforceOnChainValidation: z.ZodOptional<z.ZodBoolean>;
684
684
  agentRegistryAddress: z.ZodOptional<z.ZodString>;
@@ -687,8 +687,8 @@ declare const WorldConfigSchema: z.ZodObject<{
687
687
  chainId: z.ZodOptional<z.ZodNumber>;
688
688
  }, "strip", z.ZodTypeAny, {
689
689
  rpcUrl: string;
690
- privateKey: string;
691
- entryFee: number;
690
+ privateKey?: string | undefined;
691
+ entryFee?: number | undefined;
692
692
  requireMembership?: boolean | undefined;
693
693
  enforceOnChainValidation?: boolean | undefined;
694
694
  agentRegistryAddress?: string | undefined;
@@ -697,8 +697,8 @@ declare const WorldConfigSchema: z.ZodObject<{
697
697
  chainId?: number | undefined;
698
698
  }, {
699
699
  rpcUrl: string;
700
- privateKey: string;
701
- entryFee: number;
700
+ privateKey?: string | undefined;
701
+ entryFee?: number | undefined;
702
702
  requireMembership?: boolean | undefined;
703
703
  enforceOnChainValidation?: boolean | undefined;
704
704
  agentRegistryAddress?: string | undefined;
@@ -786,8 +786,8 @@ declare const WorldConfigSchema: z.ZodObject<{
786
786
  } | undefined;
787
787
  blockchain?: {
788
788
  rpcUrl: string;
789
- privateKey: string;
790
- entryFee: number;
789
+ privateKey?: string | undefined;
790
+ entryFee?: number | undefined;
791
791
  requireMembership?: boolean | undefined;
792
792
  enforceOnChainValidation?: boolean | undefined;
793
793
  agentRegistryAddress?: string | undefined;
@@ -863,8 +863,8 @@ declare const WorldConfigSchema: z.ZodObject<{
863
863
  } | undefined;
864
864
  blockchain?: {
865
865
  rpcUrl: string;
866
- privateKey: string;
867
- entryFee: number;
866
+ privateKey?: string | undefined;
867
+ entryFee?: number | undefined;
868
868
  requireMembership?: boolean | undefined;
869
869
  enforceOnChainValidation?: boolean | undefined;
870
870
  agentRegistryAddress?: string | undefined;
package/dist/index.js CHANGED
@@ -70,8 +70,8 @@ var PersistenceConfigSchema = z.object({
70
70
  });
71
71
  var BlockchainConfigSchema = z.object({
72
72
  rpcUrl: z.string().url(),
73
- privateKey: z.string().regex(/^0x[a-fA-F0-9]{64}$/, "Invalid private key format"),
74
- entryFee: z.number().nonnegative(),
73
+ privateKey: z.string().regex(/^0x[a-fA-F0-9]{64}$/, "Invalid private key format").optional(),
74
+ entryFee: z.number().nonnegative().optional(),
75
75
  requireMembership: z.boolean().optional(),
76
76
  enforceOnChainValidation: z.boolean().optional(),
77
77
  agentRegistryAddress: z.string().optional(),
@@ -229,6 +229,12 @@ async function createSQLiteAdapter(config) {
229
229
  return new class {
230
230
  db;
231
231
  async connect() {
232
+ const path = await import("path");
233
+ const fs = await import("fs");
234
+ const dir = path.dirname(config.filename);
235
+ if (dir && dir !== ".") {
236
+ fs.mkdirSync(dir, { recursive: true });
237
+ }
232
238
  this.db = new Database(config.filename);
233
239
  this.db.exec(`
234
240
  CREATE TABLE IF NOT EXISTS world_state (
@@ -795,7 +801,7 @@ var World = class {
795
801
  this.setState("initializing");
796
802
  try {
797
803
  if (this.config.persistence) {
798
- logger4.info("Connecting to persistence backend:", this.config.persistence.type);
804
+ logger4.info(`Connecting to persistence backend: ${this.config.persistence.type}`);
799
805
  this.persistence = await createPersistence(this.config.persistence);
800
806
  await this.persistence.connect();
801
807
  const savedState = await this.persistence.loadState();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/types.ts","../src/config/validator.ts","../src/persistence/adapters/InMemoryAdapter.ts","../src/persistence/PersistenceFactory.ts","../src/engine/World.ts","../src/discovery/AgentEvaluator.ts","../src/blockchain/BlockchainClient.ts","../src/server/app.ts"],"sourcesContent":["import type { AgentCard } from '@a2a-js/sdk';\n\n/**\n * ============================================================================\n * WORLD CONFIGURATION TYPES\n * ============================================================================\n */\n\nexport interface WorldConfig {\n /** World name (unique identifier) */\n name: string;\n \n /** World description */\n description?: string;\n \n /** World type (for plugin system) */\n type?: string;\n \n /** Server configuration */\n server: {\n port: number;\n host: string;\n };\n \n /** A2A configuration for the world itself */\n a2a?: {\n baseUrl: string;\n pushNotifications?: boolean;\n streaming?: boolean;\n };\n \n /** Admission rules for agent entry */\n admission: AdmissionRules;\n \n /** Simulation configuration */\n simulation?: {\n /** Tick interval in milliseconds */\n tickIntervalMs?: number;\n \n /** Maximum ticks before auto-stop */\n maxTicks?: number;\n \n /** Auto-start simulation on world init */\n autoStart?: boolean;\n };\n \n /** Persistence configuration */\n persistence?: PersistenceConfig;\n \n /** Blockchain configuration */\n blockchain?: BlockchainConfig;\n \n /** Optional world token configuration */\n token?: TokenConfig;\n \n /** World-specific rules */\n rules?: WorldRule[];\n \n /** Pre-configured agent URLs to discover on startup */\n agentUrls?: string[];\n}\n\n/**\n * ============================================================================\n * ADMISSION RULES\n * ============================================================================\n */\n\nexport interface AdmissionRules {\n /** Maximum number of agents allowed */\n maxAgents?: number;\n \n /** Required skills (agent must have ALL of these) */\n requiredSkills?: string[];\n \n /** Required tags (agent must have AT LEAST ONE) */\n requiredTags?: string[];\n \n /** Minimum protocol version */\n minProtocolVersion?: string;\n \n /** Custom evaluator function */\n customEvaluator?: (profile: AgentProfile) => Promise<AdmissionDecision>;\n}\n\nexport interface AdmissionDecision {\n admitted: boolean;\n reason?: string;\n role?: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * AGENT PROFILE\n * ============================================================================\n */\n\nexport interface AgentProfile {\n /** Agent URL (canonical identifier from Agent Card) */\n url: string;\n \n /** Agent name */\n name: string;\n \n /** Protocol version */\n protocolVersion: string;\n \n /** Skills from Agent Card */\n skills: Array<{\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n }>;\n \n /** Capabilities */\n capabilities: {\n streaming: boolean;\n pushNotifications: boolean;\n stateTransitionHistory?: boolean;\n };\n \n /** When agent joined the world */\n joinedAt: number;\n \n /** Assigned role (optional) */\n role?: string;\n \n /** Additional metadata */\n metadata?: Record<string, any>;\n \n /** Wallet address (for blockchain membership) */\n walletAddress?: string;\n}\n\n/**\n * ============================================================================\n * WORLD STATE\n * ============================================================================\n */\n\nexport type WorldPhase = \n | 'idle' \n | 'initializing' \n | 'ready' \n | 'running' \n | 'paused' \n | 'completed' \n | 'stopped' \n | 'failed';\n\nexport interface WorldStateSnapshot {\n phase: WorldPhase;\n tick: number;\n round: number;\n timestamp: number;\n metadata: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * WORLD EVENTS\n * ============================================================================\n */\n\nexport interface WorldEvent {\n id: string;\n type: string;\n timestamp: number;\n agentUrl?: string;\n data?: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * WORLD RULES\n * ============================================================================\n */\n\nexport interface WorldRule {\n id: string;\n name: string;\n description?: string;\n evaluate: (context: RuleContext) => Promise<RuleViolation | null>;\n}\n\nexport interface RuleContext {\n world: {\n phase: WorldPhase;\n tick: number;\n agents: Map<string, AgentProfile>;\n };\n event?: WorldEvent;\n agent?: AgentProfile;\n}\n\nexport interface RuleViolation {\n ruleId: string;\n severity: 'warning' | 'error' | 'critical';\n message: string;\n agentUrl?: string;\n action?: 'warn' | 'kick' | 'pause_world';\n}\n\n/**\n * ============================================================================\n * PERSISTENCE CONFIGURATION\n * ============================================================================\n */\n\nexport interface PersistenceConfig {\n type: 'memory' | 'postgres' | 'redis' | 'mongodb' | 'sqlite' | 'leveldb';\n \n // Adapter-specific configs (only one should be present based on type)\n postgres?: {\n host: string;\n port?: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean;\n max?: number; // connection pool size\n };\n \n redis?: {\n host: string;\n port?: number;\n password?: string;\n db?: number;\n };\n \n mongodb?: {\n url: string;\n database: string;\n };\n \n sqlite?: {\n filename: string;\n };\n \n leveldb?: {\n location: string;\n };\n \n /** Auto-save interval in milliseconds (default: 10000) */\n autoSaveIntervalMs?: number;\n}\n\n/**\n * ============================================================================\n * BLOCKCHAIN CONFIGURATION\n * ============================================================================\n */\n\nexport interface BlockchainConfig {\n /** Monad RPC URL */\n rpcUrl: string;\n \n /** World owner's private key */\n privateKey: string;\n \n /** Entry fee in MON tokens */\n entryFee: number;\n \n /** Require NFT membership for participation (default: true) */\n requireMembership?: boolean;\n \n /** Enforce on-chain agent validation (default: false) */\n enforceOnChainValidation?: boolean;\n \n /** Contract addresses (filled after deployment) */\n agentRegistryAddress?: string;\n membershipContractAddress?: string;\n worldTokenAddress?: string;\n \n /** Chain ID */\n chainId?: number;\n}\n\n/**\n * ============================================================================\n * TOKEN CONFIGURATION\n * ============================================================================\n */\n\nexport interface TokenConfig {\n /** Deploy custom world token */\n deploy: boolean;\n \n /** Token name */\n name?: string;\n \n /** Token symbol */\n symbol?: string;\n \n /** Initial supply */\n initialSupply?: number;\n \n /** Decimals */\n decimals?: number;\n}\n\n/**\n * ============================================================================\n * WORLD TYPE MODULE (for plugin system)\n * ============================================================================\n */\n\nexport interface WorldTypeModule {\n name: string;\n description: string;\n defaultRules: WorldRule[];\n defaultAdmissionRules: Partial<AdmissionRules>;\n onInit?: (world: any) => Promise<void>;\n onTick?: (world: any, tick: number) => Promise<void>;\n onAgentJoin?: (world: any, agent: AgentProfile) => Promise<void>;\n onAgentLeave?: (world: any, agent: AgentProfile) => Promise<void>;\n}\n\n/**\n * ============================================================================\n * UTILITY TYPES\n * ============================================================================\n */\n\nexport interface EventFilter {\n type?: string;\n agentUrl?: string;\n fromTimestamp?: number;\n toTimestamp?: number;\n limit?: number;\n}\n\n/** Helper to build AgentProfile from AgentCard */\nexport function profileFromCard(card: AgentCard, walletAddress?: string): AgentProfile {\n return {\n url: card.url,\n name: card.name,\n protocolVersion: card.protocolVersion,\n skills: card.skills,\n capabilities: {\n streaming: card.capabilities.streaming ?? false,\n pushNotifications: card.capabilities.pushNotifications ?? false,\n stateTransitionHistory: card.capabilities.stateTransitionHistory,\n },\n joinedAt: Date.now(),\n walletAddress,\n };\n}\n","import { z } from 'zod';\n\n/**\n * ============================================================================\n * ZOD SCHEMAS FOR RUNTIME VALIDATION\n * ============================================================================\n */\n\nexport const AdmissionRulesSchema = z.object({\n maxAgents: z.number().int().positive().optional(),\n requiredSkills: z.array(z.string()).optional(),\n requiredTags: z.array(z.string()).optional(),\n minProtocolVersion: z.string().optional(),\n customEvaluator: z.function().optional(),\n});\n\n// Persistence configuration schemas\nconst SQLiteConfigSchema = z.object({\n filename: z.string(),\n memory: z.boolean().optional(),\n});\n\nconst PostgresConfigSchema = z.object({\n host: z.string(),\n port: z.number().optional(),\n database: z.string(),\n user: z.string(),\n password: z.string(),\n ssl: z.boolean().optional(),\n max: z.number().optional(),\n});\n\nconst RedisConfigSchema = z.object({\n host: z.string(),\n port: z.number().optional(),\n password: z.string().optional(),\n db: z.number().optional(),\n keyPrefix: z.string().optional(),\n});\n\nconst MongoDBConfigSchema = z.object({\n url: z.string(),\n database: z.string(),\n useUnifiedTopology: z.boolean().optional(),\n});\n\nconst LevelDBConfigSchema = z.object({\n path: z.string(),\n});\n\nexport const PersistenceConfigSchema = z.object({\n type: z.enum(['memory', 'postgres', 'redis', 'mongodb', 'sqlite', 'leveldb']),\n sqlite: SQLiteConfigSchema.optional(),\n postgres: PostgresConfigSchema.optional(),\n redis: RedisConfigSchema.optional(),\n mongodb: MongoDBConfigSchema.optional(),\n leveldb: LevelDBConfigSchema.optional(),\n autoSaveIntervalMs: z.number().int().positive().optional(),\n});\n\nexport const BlockchainConfigSchema = z.object({\n rpcUrl: z.string().url(),\n privateKey: z.string().regex(/^0x[a-fA-F0-9]{64}$/, 'Invalid private key format'),\n entryFee: z.number().nonnegative(),\n requireMembership: z.boolean().optional(),\n enforceOnChainValidation: z.boolean().optional(),\n agentRegistryAddress: z.string().optional(),\n membershipContractAddress: z.string().optional(),\n worldTokenAddress: z.string().optional(),\n chainId: z.number().int().optional(),\n});\n\nexport const TokenConfigSchema = z.object({\n deploy: z.boolean(),\n name: z.string().optional(),\n symbol: z.string().optional(),\n initialSupply: z.number().positive().optional(),\n decimals: z.number().int().min(0).max(18).optional(),\n});\n\nexport const WorldConfigSchema = z.object({\n name: z.string().min(1, 'World name is required'),\n description: z.string().optional(),\n type: z.string().optional(),\n \n server: z.object({\n port: z.number().int().min(1).max(65535),\n host: z.string(),\n }),\n \n a2a: z.object({\n baseUrl: z.string().url(),\n pushNotifications: z.boolean().optional(),\n streaming: z.boolean().optional(),\n }).optional(),\n \n admission: AdmissionRulesSchema,\n \n simulation: z.object({\n tickIntervalMs: z.number().int().positive().optional(),\n maxTicks: z.number().int().positive().optional(),\n autoStart: z.boolean().optional(),\n }).optional(),\n \n persistence: PersistenceConfigSchema.optional(),\n blockchain: BlockchainConfigSchema.optional(),\n token: TokenConfigSchema.optional(),\n \n rules: z.array(z.any()).optional(),\n agentUrls: z.array(z.string().url()).optional(),\n});\n\n/**\n * Validate world configuration\n */\nexport function validateWorldConfig(config: unknown): void {\n try {\n WorldConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const messages = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');\n throw new Error(`Invalid world configuration: ${messages}`);\n }\n throw error;\n }\n}\n\n/**\n * Validate world configuration and return result\n */\nexport function isValidWorldConfig(config: unknown): boolean {\n try {\n WorldConfigSchema.parse(config);\n return true;\n } catch {\n return false;\n }\n}\n","import type { PersistenceAdapter } from '../PersistenceAdapter.js';\nimport type {\n WorldStateSnapshot,\n WorldEvent,\n AgentProfile,\n EventFilter,\n} from '../../config/types.js';\n\n/**\n * ============================================================================\n * IN-MEMORY PERSISTENCE ADAPTER\n * ============================================================================\n * \n * Simple in-memory persistence for testing and development.\n * No external dependencies - works on any Node version.\n * \n * WARNING: All data is lost when process exits.\n * \n * Use Case: Testing, development, temporary worlds\n */\n\nexport class InMemoryAdapter implements PersistenceAdapter {\n private state: WorldStateSnapshot | null = null;\n private events: WorldEvent[] = [];\n private agents: Map<string, AgentProfile> = new Map();\n \n async connect(): Promise<void> {\n // No-op for in-memory\n }\n \n async saveState(state: WorldStateSnapshot): Promise<void> {\n this.state = { ...state };\n }\n \n async loadState(): Promise<WorldStateSnapshot | null> {\n return this.state ? { ...this.state } : null;\n }\n \n async saveEvent(event: WorldEvent): Promise<void> {\n this.events.push({ ...event });\n }\n \n async getEvents(filter?: EventFilter): Promise<WorldEvent[]> {\n let filtered = [...this.events];\n \n if (filter?.type) {\n filtered = filtered.filter(e => e.type === filter.type);\n }\n \n if (filter?.agentUrl) {\n filtered = filtered.filter(e => e.agentUrl === filter.agentUrl);\n }\n \n if (filter?.fromTimestamp) {\n filtered = filtered.filter(e => e.timestamp >= filter.fromTimestamp!);\n }\n \n if (filter?.toTimestamp) {\n filtered = filtered.filter(e => e.timestamp <= filter.toTimestamp!);\n }\n \n // Sort by timestamp descending\n filtered.sort((a, b) => b.timestamp - a.timestamp);\n \n if (filter?.limit) {\n filtered = filtered.slice(0, filter.limit);\n }\n \n return filtered;\n }\n \n async saveAgent(profile: AgentProfile): Promise<void> {\n this.agents.set(profile.url, { ...profile });\n }\n \n async removeAgent(agentUrl: string): Promise<void> {\n this.agents.delete(agentUrl);\n }\n \n async getAgents(): Promise<AgentProfile[]> {\n return Array.from(this.agents.values()).map(a => ({ ...a }));\n }\n \n async getAgent(agentUrl: string): Promise<AgentProfile | null> {\n const agent = this.agents.get(agentUrl);\n return agent ? { ...agent } : null;\n }\n \n async disconnect(): Promise<void> {\n // No-op for in-memory\n }\n \n async healthCheck(): Promise<boolean> {\n return true;\n }\n \n async clear(): Promise<void> {\n this.state = null;\n this.events = [];\n this.agents.clear();\n }\n}\n","import type { PersistenceAdapter } from './PersistenceAdapter.js';\nimport type { PersistenceConfig } from '../config/types.js';\nimport { InMemoryAdapter } from './adapters/InMemoryAdapter.js';\n\n/**\n * ============================================================================\n * PERSISTENCE FACTORY\n * ============================================================================\n * \n * Creates the appropriate persistence adapter based on configuration.\n * Uses dynamic import() for optional dependencies to avoid requiring all databases\n * to be installed. Only the adapter for the configured persistence type is loaded.\n */\n\nexport async function createPersistence(config: PersistenceConfig): Promise<PersistenceAdapter> {\n switch (config.type) {\n case 'memory':\n return new InMemoryAdapter();\n \n case 'sqlite':\n return createSQLiteAdapter(config.sqlite || { filename: './world.db' });\n \n case 'postgres':\n if (!config.postgres) {\n throw new Error('PostgreSQL configuration is required');\n }\n return createPostgresAdapter(config.postgres);\n \n case 'redis':\n if (!config.redis) {\n throw new Error('Redis configuration is required');\n }\n return createRedisAdapter(config.redis);\n \n case 'mongodb':\n if (!config.mongodb) {\n throw new Error('MongoDB configuration is required');\n }\n return createMongoAdapter(config.mongodb);\n \n case 'leveldb':\n if (!config.leveldb) {\n throw new Error('LevelDB configuration is required');\n }\n return createLevelDBAdapter(config.leveldb);\n \n default:\n throw new Error(`Unknown persistence type: ${(config as any).type}`);\n }\n}\n\n/**\n * Lazy-load SQLite adapter via dynamic import\n */\nasync function createSQLiteAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n const Database = (await import('better-sqlite3')).default;\n \n // Inline adapter that uses the dynamically-imported Database\n return new (class implements PersistenceAdapter {\n private db!: any;\n \n async connect(): Promise<void> {\n this.db = new Database(config.filename);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS world_state (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n phase TEXT NOT NULL,\n tick INTEGER NOT NULL,\n round INTEGER NOT NULL,\n timestamp INTEGER NOT NULL,\n metadata TEXT\n );\n CREATE TABLE IF NOT EXISTS events (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n agent_url TEXT,\n timestamp INTEGER NOT NULL,\n data TEXT\n );\n CREATE TABLE IF NOT EXISTS agents (\n url TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n protocol_version TEXT NOT NULL,\n skills TEXT NOT NULL,\n capabilities TEXT NOT NULL,\n joined_at INTEGER NOT NULL,\n role TEXT,\n metadata TEXT,\n wallet_address TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n CREATE INDEX IF NOT EXISTS idx_events_agent ON events(agent_url);\n `);\n }\n\n async saveState(state: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT OR REPLACE INTO world_state (id, phase, tick, round, timestamp, metadata) VALUES (1, ?, ?, ?, ?, ?)`);\n stmt.run(state.phase, state.tick, state.round, state.timestamp, JSON.stringify(state.metadata));\n }\n\n async loadState(): Promise<any> {\n const stmt = this.db.prepare('SELECT * FROM world_state WHERE id = 1');\n const row = stmt.get() as any;\n if (!row) return null;\n return { phase: row.phase, tick: row.tick, round: row.round, timestamp: row.timestamp, metadata: JSON.parse(row.metadata || '{}') };\n }\n\n async saveEvent(event: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT INTO events (id, type, agent_url, timestamp, data) VALUES (?, ?, ?, ?, ?)`);\n stmt.run(event.id, event.type, event.agentUrl || null, event.timestamp, JSON.stringify(event.data || {}));\n }\n\n async getEvents(filter?: any): Promise<any[]> {\n let query = 'SELECT * FROM events WHERE 1=1';\n const params: any[] = [];\n if (filter?.type) { query += ' AND type = ?'; params.push(filter.type); }\n if (filter?.agentUrl) { query += ' AND agent_url = ?'; params.push(filter.agentUrl); }\n if (filter?.fromTimestamp) { query += ' AND timestamp >= ?'; params.push(filter.fromTimestamp); }\n if (filter?.toTimestamp) { query += ' AND timestamp <= ?'; params.push(filter.toTimestamp); }\n query += ' ORDER BY timestamp DESC';\n if (filter?.limit) { query += ' LIMIT ?'; params.push(filter.limit); }\n const stmt = this.db.prepare(query);\n const rows = stmt.all(...params) as any[];\n return rows.map(row => ({ id: row.id, type: row.type, timestamp: row.timestamp, agentUrl: row.agent_url || undefined, data: JSON.parse(row.data || '{}') }));\n }\n\n async saveAgent(profile: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT OR REPLACE INTO agents (url, name, protocol_version, skills, capabilities, joined_at, role, metadata, wallet_address) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);\n stmt.run(profile.url, profile.name, profile.protocolVersion, JSON.stringify(profile.skills), JSON.stringify(profile.capabilities), profile.joinedAt, profile.role || null, JSON.stringify(profile.metadata || {}), profile.walletAddress || null);\n }\n\n async removeAgent(agentUrl: string): Promise<void> {\n this.db.prepare('DELETE FROM agents WHERE url = ?').run(agentUrl);\n }\n\n async getAgents(): Promise<any[]> {\n const rows = this.db.prepare('SELECT * FROM agents ORDER BY joined_at ASC').all() as any[];\n return rows.map(row => ({ url: row.url, name: row.name, protocolVersion: row.protocol_version, skills: JSON.parse(row.skills), capabilities: JSON.parse(row.capabilities), joinedAt: row.joined_at, role: row.role || undefined, metadata: JSON.parse(row.metadata || '{}'), walletAddress: row.wallet_address || undefined }));\n }\n\n async getAgent(agentUrl: string): Promise<any> {\n const row = this.db.prepare('SELECT * FROM agents WHERE url = ?').get(agentUrl) as any;\n if (!row) return null;\n return { url: row.url, name: row.name, protocolVersion: row.protocol_version, skills: JSON.parse(row.skills), capabilities: JSON.parse(row.capabilities), joinedAt: row.joined_at, role: row.role || undefined, metadata: JSON.parse(row.metadata || '{}'), walletAddress: row.wallet_address || undefined };\n }\n\n async disconnect(): Promise<void> { this.db.close(); }\n async healthCheck(): Promise<boolean> { try { this.db.prepare('SELECT 1').get(); return true; } catch { return false; } }\n async clear(): Promise<void> { this.db.exec('DELETE FROM world_state; DELETE FROM events; DELETE FROM agents;'); }\n })();\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'SQLite adapter requires better-sqlite3. Install it with: npm install better-sqlite3'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load PostgreSQL adapter via dynamic import\n */\nasync function createPostgresAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n const pg = await import('pg');\n const Pool = pg.default?.Pool || pg.Pool;\n const { PostgresAdapter } = await import('./adapters/PostgresAdapter.js');\n return new PostgresAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'PostgreSQL adapter requires pg. Install it with: npm install pg'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load Redis adapter via dynamic import\n */\nasync function createRedisAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n await import('ioredis');\n const { RedisAdapter } = await import('./adapters/RedisAdapter.js');\n return new RedisAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'Redis adapter requires ioredis. Install it with: npm install ioredis'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load MongoDB adapter via dynamic import\n */\nasync function createMongoAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n // @ts-ignore - mongodb is an optional peer dependency\n await import('mongodb');\n const { MongoAdapter } = await import('./adapters/MongoAdapter.js');\n return new MongoAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'MongoDB adapter requires mongodb. Install it with: npm install mongodb'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load LevelDB adapter via dynamic import\n */\nasync function createLevelDBAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n // @ts-ignore - level is an optional peer dependency\n await import('level');\n const { LevelDBAdapter } = await import('./adapters/LevelDBAdapter.js');\n return new LevelDBAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'LevelDB adapter requires level. Install it with: npm install level'\n );\n }\n throw error;\n }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport type {\n WorldConfig,\n WorldPhase,\n WorldStateSnapshot,\n WorldEvent,\n AgentProfile,\n} from '../config/types.js';\nimport { validateWorldConfig } from '../config/validator.js';\nimport type { PersistenceAdapter } from '../persistence/PersistenceAdapter.js';\nimport { createPersistence } from '../persistence/PersistenceFactory.js';\nimport { CardFetcher } from '../discovery/CardFetcher.js';\nimport { AgentEvaluator } from '../discovery/AgentEvaluator.js';\nimport { BlockchainClient } from '../blockchain/BlockchainClient.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('World');\n\n/**\n * ============================================================================\n * WORLD ENGINE\n * ============================================================================\n * \n * Core world runtime managing:\n * - Agent discovery and admission\n * - World state and lifecycle\n * - Persistence and event logging\n * - Simulation ticks (if enabled)\n * - Rule enforcement\n */\n\nexport class World {\n private state: WorldStateSnapshot;\n private agents: Map<string, AgentProfile>;\n private persistence: PersistenceAdapter | null = null;\n private blockchainClient: BlockchainClient | null = null;\n private cardFetcher: CardFetcher;\n private evaluator: AgentEvaluator;\n private tickInterval: NodeJS.Timeout | null = null;\n private autoSaveInterval: NodeJS.Timeout | null = null;\n \n constructor(public readonly config: WorldConfig) {\n // Validate configuration\n validateWorldConfig(config);\n \n // Initialize state\n this.state = {\n phase: 'idle',\n tick: 0,\n round: 0,\n timestamp: Date.now(),\n metadata: {},\n };\n \n this.agents = new Map();\n this.cardFetcher = new CardFetcher();\n this.evaluator = new AgentEvaluator(config.admission);\n \n logger.info(`World \"${config.name}\" created`, {\n type: config.type || 'generic',\n maxAgents: config.admission.maxAgents,\n });\n }\n \n /**\n * Initialize the world (connect persistence, restore state, discover agents)\n */\n async init(): Promise<void> {\n logger.info('Initializing world...');\n this.setState('initializing');\n \n try {\n // 1. Connect to persistence backend\n if (this.config.persistence) {\n logger.info('Connecting to persistence backend:', this.config.persistence.type);\n this.persistence = await createPersistence(this.config.persistence);\n await this.persistence.connect();\n \n // Try to restore state from persistence\n const savedState = await this.persistence.loadState();\n if (savedState) {\n this.state = savedState;\n logger.info('Restored world state from persistence', {\n phase: savedState.phase,\n tick: savedState.tick,\n });\n \n // Restore agents\n const savedAgents = await this.persistence.getAgents();\n for (const agent of savedAgents) {\n this.agents.set(agent.url, agent);\n }\n \n logger.info(`Restored ${savedAgents.length} agents from persistence`);\n }\n }\n \n // 2. Initialize blockchain client if configured\n if (this.config.blockchain) {\n logger.info('Initializing blockchain client...');\n this.blockchainClient = new BlockchainClient(this.config.blockchain);\n await this.blockchainClient.init();\n }\n \n // 3. Discover pre-configured agents\n if (this.config.agentUrls && this.config.agentUrls.length > 0) {\n logger.info(`Discovering ${this.config.agentUrls.length} pre-configured agents...`);\n \n const results = await this.cardFetcher.fetchCards(this.config.agentUrls);\n \n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result.success && result.card) {\n // Auto-admit pre-configured agents\n try {\n await this.admitAgent(result.card);\n } catch (error: any) {\n logger.warn(`Failed to admit pre-configured agent:`, error.message);\n }\n }\n }\n }\n \n // 3. Start auto-save if persistence enabled\n if (this.persistence) {\n this.startAutoSave();\n }\n \n this.setState('ready');\n logger.info('World initialized successfully', {\n agents: this.agents.size,\n persistence: this.config.persistence?.type || 'none',\n });\n } catch (error: any) {\n logger.error('Failed to initialize world:', error);\n this.setState('failed');\n throw error;\n }\n }\n \n /**\n * Start the world simulation\n */\n async start(): Promise<void> {\n if (this.state.phase === 'running') {\n logger.warn('World is already running');\n return;\n }\n \n logger.info('Starting world simulation...');\n this.setState('running');\n \n await this.logEvent({\n id: uuidv4(),\n type: 'world_started',\n timestamp: Date.now(),\n });\n \n // Start tick interval if simulation is enabled\n if (this.config.simulation?.tickIntervalMs) {\n this.startTicking();\n }\n }\n \n /**\n * Stop the world simulation\n */\n async stop(): Promise<void> {\n logger.info('Stopping world...');\n this.setState('stopped');\n \n // Stop ticking\n if (this.tickInterval) {\n clearInterval(this.tickInterval);\n this.tickInterval = null;\n }\n \n // Stop auto-save\n if (this.autoSaveInterval) {\n clearInterval(this.autoSaveInterval);\n this.autoSaveInterval = null;\n }\n \n // Final save\n if (this.persistence) {\n await this.persistence.saveState(this.state);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'world_stopped',\n timestamp: Date.now(),\n });\n \n logger.info('World stopped');\n }\n \n /**\n * Admit an agent to the world\n */\n async admitAgent(card: any, walletAddress?: string): Promise<void> {\n const decision = await this.evaluator.evaluate(card, this.agents.size, walletAddress);\n \n if (!decision.admitted) {\n throw new Error(`Agent admission denied: ${decision.reason}`);\n }\n \n // Optional: Validate agent on-chain\n if (this.blockchainClient && this.config.blockchain?.enforceOnChainValidation && walletAddress) {\n const isValid = await this.blockchainClient.validateAgent(walletAddress);\n if (!isValid) {\n throw new Error('Agent not registered in on-chain AgentRegistry');\n }\n logger.info(`Agent validated on-chain: ${card.name}`);\n }\n \n // Optional: Mint membership NFT\n if (this.blockchainClient && this.config.blockchain?.requireMembership && walletAddress) {\n // Check if agent already has membership\n const hasMembership = await this.blockchainClient.hasMembership(walletAddress);\n \n if (!hasMembership) {\n logger.info(`Minting membership NFT for agent: ${card.name}`);\n await this.blockchainClient.mintMembership(walletAddress);\n } else {\n logger.info(`Agent already has membership: ${card.name}`);\n }\n }\n \n const profile: AgentProfile = {\n url: card.url,\n name: card.name,\n protocolVersion: card.protocolVersion,\n skills: card.skills,\n capabilities: {\n streaming: card.capabilities.streaming ?? false,\n pushNotifications: card.capabilities.pushNotifications ?? false,\n stateTransitionHistory: card.capabilities.stateTransitionHistory,\n },\n joinedAt: Date.now(),\n role: decision.role,\n metadata: decision.metadata,\n walletAddress,\n };\n \n this.agents.set(profile.url, profile);\n \n if (this.persistence) {\n await this.persistence.saveAgent(profile);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'agent_joined',\n timestamp: Date.now(),\n agentUrl: profile.url,\n data: { name: profile.name, role: profile.role },\n });\n \n logger.info(`Agent admitted: ${profile.name}`, {\n role: profile.role,\n totalAgents: this.agents.size,\n });\n }\n \n /**\n * Remove an agent from the world\n */\n async removeAgent(agentUrl: string): Promise<void> {\n const agent = this.agents.get(agentUrl);\n if (!agent) {\n throw new Error(`Agent not found: ${agentUrl}`);\n }\n \n this.agents.delete(agentUrl);\n \n if (this.persistence) {\n await this.persistence.removeAgent(agentUrl);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'agent_left',\n timestamp: Date.now(),\n agentUrl,\n data: { name: agent.name },\n });\n \n logger.info(`Agent removed: ${agent.name}`, {\n totalAgents: this.agents.size,\n });\n }\n \n /**\n * Get all agents in the world\n */\n getAgents(): AgentProfile[] {\n return Array.from(this.agents.values());\n }\n \n /**\n * Get current world state\n */\n getState(): WorldStateSnapshot {\n return { ...this.state };\n }\n \n /**\n * Log an event\n */\n private async logEvent(event: WorldEvent): Promise<void> {\n if (this.persistence) {\n await this.persistence.saveEvent(event);\n }\n }\n \n /**\n * Set world phase\n */\n private setState(phase: WorldPhase): void {\n this.state.phase = phase;\n this.state.timestamp = Date.now();\n }\n \n /**\n * Start auto-save interval\n */\n private startAutoSave(): void {\n const interval = this.config.persistence?.autoSaveIntervalMs || 10000;\n \n this.autoSaveInterval = setInterval(async () => {\n if (this.persistence) {\n await this.persistence.saveState(this.state);\n logger.debug('Auto-saved world state');\n }\n }, interval);\n \n logger.info(`Auto-save enabled (interval: ${interval}ms)`);\n }\n \n /**\n * Start simulation ticking\n */\n private startTicking(): void {\n const interval = this.config.simulation!.tickIntervalMs!;\n \n this.tickInterval = setInterval(async () => {\n this.state.tick++;\n \n await this.logEvent({\n id: uuidv4(),\n type: 'tick',\n timestamp: Date.now(),\n data: { tick: this.state.tick },\n });\n \n logger.debug(`Tick ${this.state.tick}`);\n \n // Check max ticks\n if (this.config.simulation?.maxTicks && this.state.tick >= this.config.simulation.maxTicks) {\n logger.info('Max ticks reached, stopping world');\n await this.stop();\n }\n }, interval);\n \n logger.info(`Simulation ticking enabled (interval: ${interval}ms)`);\n }\n}\n","import type { AgentCard } from '@a2a-js/sdk';\nimport type { AgentProfile, AdmissionRules, AdmissionDecision } from '../config/types.js';\nimport { profileFromCard } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('AgentEvaluator');\n\n/**\n * ============================================================================\n * AGENT EVALUATOR\n * ============================================================================\n * \n * Evaluates whether an agent should be admitted to the world based on rules.\n * \n * Evaluation criteria:\n * - Max agents limit\n * - Required skills (agent must have ALL)\n * - Required tags (agent must have AT LEAST ONE)\n * - Minimum protocol version\n * - Custom evaluator function\n */\n\nexport class AgentEvaluator {\n constructor(private rules: AdmissionRules) {}\n \n /**\n * Evaluate whether an agent should be admitted.\n * \n * @param card Agent's A2A card\n * @param currentAgentCount Current number of agents in world\n * @param walletAddress Optional wallet address for blockchain membership\n * @returns Admission decision\n */\n async evaluate(\n card: AgentCard,\n currentAgentCount: number,\n walletAddress?: string\n ): Promise<AdmissionDecision> {\n logger.debug(`Evaluating agent: ${card.name}`, {\n currentAgents: currentAgentCount,\n maxAgents: this.rules.maxAgents,\n });\n \n // Check max agents limit\n if (this.rules.maxAgents && currentAgentCount >= this.rules.maxAgents) {\n logger.info(`Agent ${card.name} rejected: world is full`, {\n current: currentAgentCount,\n max: this.rules.maxAgents,\n });\n \n return {\n admitted: false,\n reason: `World is full (${this.rules.maxAgents} agents maximum)`,\n };\n }\n \n // Check protocol version\n if (this.rules.minProtocolVersion) {\n if (!this.meetsProtocolVersion(card.protocolVersion, this.rules.minProtocolVersion)) {\n logger.info(`Agent ${card.name} rejected: protocol version too old`, {\n agent: card.protocolVersion,\n required: this.rules.minProtocolVersion,\n });\n \n return {\n admitted: false,\n reason: `Protocol version ${card.protocolVersion} is below minimum ${this.rules.minProtocolVersion}`,\n };\n }\n }\n \n // Check required skills (agent must have ALL)\n if (this.rules.requiredSkills && this.rules.requiredSkills.length > 0) {\n const agentSkillIds = card.skills.map(s => s.id.toLowerCase());\n const missingSkills = this.rules.requiredSkills.filter(\n required => !agentSkillIds.includes(required.toLowerCase())\n );\n \n if (missingSkills.length > 0) {\n logger.info(`Agent ${card.name} rejected: missing required skills`, {\n missing: missingSkills,\n });\n \n return {\n admitted: false,\n reason: `Missing required skills: ${missingSkills.join(', ')}`,\n };\n }\n }\n \n // Check required tags (agent must have AT LEAST ONE)\n if (this.rules.requiredTags && this.rules.requiredTags.length > 0) {\n const agentTags = card.skills.flatMap(s => s.tags || []).map(t => t.toLowerCase());\n const hasRequiredTag = this.rules.requiredTags.some(\n required => agentTags.includes(required.toLowerCase())\n );\n \n if (!hasRequiredTag) {\n logger.info(`Agent ${card.name} rejected: no matching tags`, {\n required: this.rules.requiredTags,\n });\n \n return {\n admitted: false,\n reason: `Must have at least one of these tags: ${this.rules.requiredTags.join(', ')}`,\n };\n }\n }\n \n // Run custom evaluator if provided\n if (this.rules.customEvaluator) {\n const profile = profileFromCard(card, walletAddress);\n const customDecision = await this.rules.customEvaluator(profile);\n \n if (!customDecision.admitted) {\n logger.info(`Agent ${card.name} rejected by custom evaluator`, {\n reason: customDecision.reason,\n });\n \n return customDecision;\n }\n \n // Custom evaluator can assign roles and metadata\n if (customDecision.role || customDecision.metadata) {\n logger.debug(`Custom evaluator assigned role/metadata to ${card.name}`, {\n role: customDecision.role,\n });\n }\n \n return customDecision;\n }\n \n // All checks passed\n logger.info(`Agent ${card.name} admitted to world`);\n \n return {\n admitted: true,\n reason: 'All admission criteria met',\n };\n }\n \n /**\n * Check if agent's protocol version meets minimum requirement.\n * Simple semver comparison (major.minor).\n */\n private meetsProtocolVersion(agentVersion: string, minVersion: string): boolean {\n const parse = (v: string) => {\n const parts = v.split('.');\n return {\n major: parseInt(parts[0] || '0', 10),\n minor: parseInt(parts[1] || '0', 10),\n };\n };\n \n const agent = parse(agentVersion);\n const min = parse(minVersion);\n \n if (agent.major > min.major) return true;\n if (agent.major < min.major) return false;\n return agent.minor >= min.minor;\n }\n}\n","import { ethers } from 'ethers';\nimport type { BlockchainConfig } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('BlockchainClient');\n\n// Contract ABIs (minimal interfaces)\nconst AGENT_REGISTRY_ABI = [\n 'function registerAgent(string agentUrl, string name) external',\n 'function isAgentValid(address wallet) external view returns (bool)',\n 'function getAgent(address wallet) external view returns (tuple(address walletAddress, string agentUrl, string name, uint256 registeredAt, bool isActive))',\n 'function getWalletByUrl(string agentUrl) external view returns (address)',\n 'event AgentRegistered(address indexed wallet, string agentUrl, string name)',\n];\n\nconst WORLD_MEMBERSHIP_ABI = [\n 'function mintMembership(address agent) external payable',\n 'function revokeMembership(address agent) external',\n 'function hasMembership(address agent) external view returns (bool)',\n 'function entryFee() external view returns (uint256)',\n 'function totalMembers() external view returns (uint256)',\n 'function withdrawFees() external',\n 'event MembershipMinted(address indexed agent, uint256 indexed tokenId, uint256 feePaid)',\n];\n\nconst WORLD_TOKEN_ABI = [\n 'function mint(address to, uint256 amount) external',\n 'function burn(address from, uint256 amount) external',\n 'function balanceOf(address account) external view returns (uint256)',\n 'function transfer(address to, uint256 amount) external returns (bool)',\n];\n\n/**\n * ============================================================================\n * BLOCKCHAIN CLIENT\n * ============================================================================\n * \n * Handles all blockchain interactions for the World SDK:\n * - Agent registry validation\n * - Membership NFT minting\n * - Entry fee collection\n * - World token operations\n */\n\nexport class BlockchainClient {\n private provider: ethers.JsonRpcProvider;\n private wallet: ethers.Wallet;\n private agentRegistry?: ethers.Contract;\n private membershipContract?: ethers.Contract;\n private worldToken?: ethers.Contract;\n \n constructor(private config: BlockchainConfig) {\n // Initialize provider and wallet\n this.provider = new ethers.JsonRpcProvider(config.rpcUrl);\n this.wallet = new ethers.Wallet(config.privateKey, this.provider);\n \n logger.info('Blockchain client initialized', {\n network: config.rpcUrl,\n wallet: this.wallet.address,\n });\n }\n \n /**\n * Initialize contract connections\n */\n async init(): Promise<void> {\n // Connect to AgentRegistry if address provided\n if (this.config.agentRegistryAddress) {\n this.agentRegistry = new ethers.Contract(\n this.config.agentRegistryAddress,\n AGENT_REGISTRY_ABI,\n this.wallet\n );\n logger.info('Connected to AgentRegistry', {\n address: this.config.agentRegistryAddress,\n });\n }\n \n // Connect to WorldMembership if address provided\n if (this.config.membershipContractAddress) {\n this.membershipContract = new ethers.Contract(\n this.config.membershipContractAddress,\n WORLD_MEMBERSHIP_ABI,\n this.wallet\n );\n logger.info('Connected to WorldMembership', {\n address: this.config.membershipContractAddress,\n });\n }\n \n // Connect to WorldToken if address provided\n if (this.config.worldTokenAddress) {\n this.worldToken = new ethers.Contract(\n this.config.worldTokenAddress,\n WORLD_TOKEN_ABI,\n this.wallet\n );\n logger.info('Connected to WorldToken', {\n address: this.config.worldTokenAddress,\n });\n }\n \n logger.info('Blockchain client ready');\n }\n \n /**\n * Validate agent on-chain\n * @param walletAddress Agent's wallet address\n * @returns True if agent is registered and valid\n */\n async validateAgent(walletAddress: string): Promise<boolean> {\n if (!this.agentRegistry) {\n logger.warn('AgentRegistry not configured, skipping on-chain validation');\n return true; // Skip validation if not configured\n }\n \n try {\n const isValid = await this.agentRegistry.isAgentValid(walletAddress);\n logger.debug('Agent validation result', {\n wallet: walletAddress,\n isValid,\n });\n return isValid;\n } catch (error: any) {\n logger.error('Failed to validate agent on-chain', {\n wallet: walletAddress,\n error: error.message,\n });\n return false;\n }\n }\n \n /**\n * Mint membership NFT for an agent\n * @param agentWallet Agent's wallet address\n * @returns Transaction hash\n */\n async mintMembership(agentWallet: string): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n // Get entry fee\n const entryFee = await this.membershipContract.entryFee();\n \n logger.info('Minting membership NFT', {\n agent: agentWallet,\n entryFee: ethers.formatEther(entryFee),\n });\n \n // Mint membership\n const tx = await this.membershipContract.mintMembership(agentWallet, {\n value: entryFee,\n });\n \n const receipt = await tx.wait();\n \n logger.info('Membership NFT minted', {\n agent: agentWallet,\n txHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to mint membership NFT', {\n agent: agentWallet,\n error: error.message,\n });\n throw error;\n }\n }\n \n /**\n * Check if agent has membership\n * @param agentWallet Agent's wallet address\n * @returns True if agent has membership\n */\n async hasMembership(agentWallet: string): Promise<boolean> {\n if (!this.membershipContract) {\n logger.warn('WorldMembership not configured, skipping membership check');\n return true; // Skip check if not configured\n }\n \n try {\n const hasMembership = await this.membershipContract.hasMembership(agentWallet);\n return hasMembership;\n } catch (error: any) {\n logger.error('Failed to check membership', {\n agent: agentWallet,\n error: error.message,\n });\n return false;\n }\n }\n \n /**\n * Revoke membership NFT\n * @param agentWallet Agent's wallet address\n * @returns Transaction hash\n */\n async revokeMembership(agentWallet: string): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n logger.info('Revoking membership', { agent: agentWallet });\n \n const tx = await this.membershipContract.revokeMembership(agentWallet);\n const receipt = await tx.wait();\n \n logger.info('Membership revoked', {\n agent: agentWallet,\n txHash: receipt.hash,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to revoke membership', {\n agent: agentWallet,\n error: error.message,\n });\n throw error;\n }\n }\n \n /**\n * Get total number of members\n */\n async getTotalMembers(): Promise<number> {\n if (!this.membershipContract) {\n return 0;\n }\n \n try {\n const total = await this.membershipContract.totalMembers();\n return Number(total);\n } catch (error: any) {\n logger.error('Failed to get total members', { error: error.message });\n return 0;\n }\n }\n \n /**\n * Withdraw collected entry fees (world owner only)\n */\n async withdrawFees(): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n logger.info('Withdrawing entry fees');\n \n const tx = await this.membershipContract.withdrawFees();\n const receipt = await tx.wait();\n \n logger.info('Fees withdrawn', {\n txHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to withdraw fees', { error: error.message });\n throw error;\n }\n }\n \n /**\n * Get world owner's wallet address\n */\n getWalletAddress(): string {\n return this.wallet.address;\n }\n \n /**\n * Get entry fee in MON\n */\n async getEntryFee(): Promise<string> {\n if (!this.membershipContract) {\n return '0';\n }\n \n try {\n const fee = await this.membershipContract.entryFee();\n return ethers.formatEther(fee);\n } catch (error: any) {\n logger.error('Failed to get entry fee', { error: error.message });\n return '0';\n }\n }\n}\n","import express, { type Express, type Request, type Response } from 'express';\nimport type { World } from '../engine/World.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('WorldServer');\n\n/**\n * ============================================================================\n * WORLD HTTP SERVER\n * ============================================================================\n * \n * Express server providing HTTP endpoints for:\n * - World information\n * - Agent join requests \n * - Agent list\n * - World state and events\n * \n * Mirrors the agent SDK server pattern.\n */\n\nexport function createWorldApp(world: World): Express {\n const app = express();\n \n // Middleware\n app.use(express.json());\n app.use(express.urlencoded({ extended: true }));\n \n // Request logging\n app.use((req, res, next) => {\n logger.debug(`${req.method} ${req.path}`, {\n query: req.query,\n ip: req.ip,\n });\n next();\n });\n \n /**\n * GET / - World information\n */\n app.get('/', (req: Request, res: Response) => {\n res.json({\n name: world.config.name,\n description: world.config.description,\n type: world.config.type || 'generic',\n state: world.getState(),\n agentCount: world.getAgents().length,\n maxAgents: world.config.admission.maxAgents || null,\n admission: {\n requiredSkills: world.config.admission.requiredSkills || [],\n requiredTags: world.config.admission.requiredTags || [],\n minProtocolVersion: world.config.admission.minProtocolVersion || null,\n },\n });\n });\n \n /**\n * POST /world/join - Agent join request\n * \n * Body:\n * {\n * \"agentUrl\": \"http://localhost:3000\",\n * \"walletAddress\": \"0x...\" // optional, for blockchain membership\n * }\n */\n app.post('/world/join', async (req: Request, res: Response) => {\n try {\n const { agentUrl, walletAddress } = req.body;\n \n if (!agentUrl) {\n return res.status(400).json({\n success: false,\n error: 'agentUrl is required',\n });\n }\n \n logger.info(`Agent join request from: ${agentUrl}`, {\n wallet: walletAddress || 'none',\n });\n \n // Fetch agent card\n const cardFetcher = new (await import('../discovery/CardFetcher.js')).CardFetcher();\n const result = await cardFetcher.fetchCard(agentUrl);\n \n if (!result.success || !result.card) {\n return res.status(400).json({\n success: false,\n error: `Failed to fetch agent card: ${result.error}`,\n });\n }\n \n // Admit agent\n await world.admitAgent(result.card, walletAddress);\n \n res.json({\n success: true,\n message: 'Agent admitted to world',\n world: {\n name: world.config.name,\n agentCount: world.getAgents().length,\n },\n });\n } catch (error: any) {\n logger.error('Failed to process join request:', error);\n \n res.status(400).json({\n success: false,\n error: error.message || 'Failed to join world',\n });\n }\n });\n \n /**\n * GET /world/agents - List all agents\n */\n app.get('/world/agents', (req: Request, res: Response) => {\n const agents = world.getAgents().map(agent => ({\n url: agent.url,\n name: agent.name,\n protocolVersion: agent.protocolVersion,\n skills: agent.skills.map(s => s.id),\n joinedAt: agent.joinedAt,\n role: agent.role,\n }));\n \n res.json({\n agents,\n count: agents.length,\n });\n });\n \n /**\n * GET /world/state - World state\n */\n app.get('/world/state', (req: Request, res: Response) => {\n res.json(world.getState());\n });\n \n /**\n * POST /world/start - Start world simulation\n */\n app.post('/world/start', async (req: Request, res: Response) => {\n try {\n await world.start();\n res.json({\n success: true,\n message: 'World simulation started',\n state: world.getState(),\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n /**\n * POST /world/stop - Stop world simulation\n */\n app.post('/world/stop', async (req: Request, res: Response) => {\n try {\n await world.stop();\n res.json({\n success: true,\n message: 'World simulation stopped',\n state: world.getState(),\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n /**\n * DELETE /world/agents/:agentUrl - Remove an agent\n */\n app.delete('/world/agents/:agentUrl', async (req: Request, res: Response) => {\n try {\n const agentUrlParam = req.params.agentUrl;\n const agentUrl = typeof agentUrlParam === 'string' \n ? decodeURIComponent(agentUrlParam)\n : decodeURIComponent(agentUrlParam[0]);\n \n await world.removeAgent(agentUrl);\n \n res.json({\n success: true,\n message: 'Agent removed from world',\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n // 404 handler\n app.use((req: Request, res: Response) => {\n res.status(404).json({\n error: 'Not found',\n path: req.path,\n });\n });\n \n // Error handler\n app.use((err: any, req: Request, res: Response, next: any) => {\n logger.error('Server error:', err);\n \n res.status(500).json({\n error: 'Internal server error',\n message: err.message,\n });\n });\n \n return app;\n}\n\n/**\n * Start world server on configured port\n */\nexport async function startWorldServer(world: World): Promise<void> {\n const app = createWorldApp(world);\n \n const server = app.listen(world.config.server.port, world.config.server.host, () => {\n const { host, port } = world.config.server;\n \n logger.info(`World \"${world.config.name}\" server started`);\n logger.info(` http://${host}:${port}`);\n logger.info('');\n logger.info('Endpoints:');\n logger.info(` GET / - World info`);\n logger.info(` POST /world/join - Agent join request`);\n logger.info(` GET /world/agents - List agents`);\n logger.info(` GET /world/state - World state`);\n logger.info(` POST /world/start - Start simulation`);\n logger.info(` POST /world/stop - Stop simulation`);\n logger.info(` DELETE /world/agents/:url - Remove agent`);\n });\n \n // Graceful shutdown\n process.on('SIGTERM', async () => {\n logger.info('SIGTERM received, shutting down gracefully...');\n \n server.close(async () => {\n await world.stop();\n process.exit(0);\n });\n });\n \n process.on('SIGINT', async () => {\n logger.info('SIGINT received, shutting down gracefully...');\n \n server.close(async () => {\n await world.stop();\n process.exit(0);\n });\n });\n}\n"],"mappings":"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","names":["logger","logger","logger","logger"]}
1
+ {"version":3,"sources":["../src/config/types.ts","../src/config/validator.ts","../src/persistence/adapters/InMemoryAdapter.ts","../src/persistence/PersistenceFactory.ts","../src/engine/World.ts","../src/discovery/AgentEvaluator.ts","../src/blockchain/BlockchainClient.ts","../src/server/app.ts"],"sourcesContent":["import type { AgentCard } from '@a2a-js/sdk';\n\n/**\n * ============================================================================\n * WORLD CONFIGURATION TYPES\n * ============================================================================\n */\n\nexport interface WorldConfig {\n /** World name (unique identifier) */\n name: string;\n \n /** World description */\n description?: string;\n \n /** World type (for plugin system) */\n type?: string;\n \n /** Server configuration */\n server: {\n port: number;\n host: string;\n };\n \n /** A2A configuration for the world itself */\n a2a?: {\n baseUrl: string;\n pushNotifications?: boolean;\n streaming?: boolean;\n };\n \n /** Admission rules for agent entry */\n admission: AdmissionRules;\n \n /** Simulation configuration */\n simulation?: {\n /** Tick interval in milliseconds */\n tickIntervalMs?: number;\n \n /** Maximum ticks before auto-stop */\n maxTicks?: number;\n \n /** Auto-start simulation on world init */\n autoStart?: boolean;\n };\n \n /** Persistence configuration */\n persistence?: PersistenceConfig;\n \n /** Blockchain configuration */\n blockchain?: BlockchainConfig;\n \n /** Optional world token configuration */\n token?: TokenConfig;\n \n /** World-specific rules */\n rules?: WorldRule[];\n \n /** Pre-configured agent URLs to discover on startup */\n agentUrls?: string[];\n}\n\n/**\n * ============================================================================\n * ADMISSION RULES\n * ============================================================================\n */\n\nexport interface AdmissionRules {\n /** Maximum number of agents allowed */\n maxAgents?: number;\n \n /** Required skills (agent must have ALL of these) */\n requiredSkills?: string[];\n \n /** Required tags (agent must have AT LEAST ONE) */\n requiredTags?: string[];\n \n /** Minimum protocol version */\n minProtocolVersion?: string;\n \n /** Custom evaluator function */\n customEvaluator?: (profile: AgentProfile) => Promise<AdmissionDecision>;\n}\n\nexport interface AdmissionDecision {\n admitted: boolean;\n reason?: string;\n role?: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * AGENT PROFILE\n * ============================================================================\n */\n\nexport interface AgentProfile {\n /** Agent URL (canonical identifier from Agent Card) */\n url: string;\n \n /** Agent name */\n name: string;\n \n /** Protocol version */\n protocolVersion: string;\n \n /** Skills from Agent Card */\n skills: Array<{\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n }>;\n \n /** Capabilities */\n capabilities: {\n streaming: boolean;\n pushNotifications: boolean;\n stateTransitionHistory?: boolean;\n };\n \n /** When agent joined the world */\n joinedAt: number;\n \n /** Assigned role (optional) */\n role?: string;\n \n /** Additional metadata */\n metadata?: Record<string, any>;\n \n /** Wallet address (for blockchain membership) */\n walletAddress?: string;\n}\n\n/**\n * ============================================================================\n * WORLD STATE\n * ============================================================================\n */\n\nexport type WorldPhase = \n | 'idle' \n | 'initializing' \n | 'ready' \n | 'running' \n | 'paused' \n | 'completed' \n | 'stopped' \n | 'failed';\n\nexport interface WorldStateSnapshot {\n phase: WorldPhase;\n tick: number;\n round: number;\n timestamp: number;\n metadata: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * WORLD EVENTS\n * ============================================================================\n */\n\nexport interface WorldEvent {\n id: string;\n type: string;\n timestamp: number;\n agentUrl?: string;\n data?: Record<string, any>;\n}\n\n/**\n * ============================================================================\n * WORLD RULES\n * ============================================================================\n */\n\nexport interface WorldRule {\n id: string;\n name: string;\n description?: string;\n evaluate: (context: RuleContext) => Promise<RuleViolation | null>;\n}\n\nexport interface RuleContext {\n world: {\n phase: WorldPhase;\n tick: number;\n agents: Map<string, AgentProfile>;\n };\n event?: WorldEvent;\n agent?: AgentProfile;\n}\n\nexport interface RuleViolation {\n ruleId: string;\n severity: 'warning' | 'error' | 'critical';\n message: string;\n agentUrl?: string;\n action?: 'warn' | 'kick' | 'pause_world';\n}\n\n/**\n * ============================================================================\n * PERSISTENCE CONFIGURATION\n * ============================================================================\n */\n\nexport interface PersistenceConfig {\n type: 'memory' | 'postgres' | 'redis' | 'mongodb' | 'sqlite' | 'leveldb';\n \n // Adapter-specific configs (only one should be present based on type)\n postgres?: {\n host: string;\n port?: number;\n database: string;\n user: string;\n password: string;\n ssl?: boolean;\n max?: number; // connection pool size\n };\n \n redis?: {\n host: string;\n port?: number;\n password?: string;\n db?: number;\n };\n \n mongodb?: {\n url: string;\n database: string;\n };\n \n sqlite?: {\n filename: string;\n };\n \n leveldb?: {\n location: string;\n };\n \n /** Auto-save interval in milliseconds (default: 10000) */\n autoSaveIntervalMs?: number;\n}\n\n/**\n * ============================================================================\n * BLOCKCHAIN CONFIGURATION\n * ============================================================================\n */\n\nexport interface BlockchainConfig {\n /** Monad RPC URL */\n rpcUrl: string;\n \n /** World owner's private key */\n privateKey: string;\n \n /** Entry fee in MON tokens */\n entryFee: number;\n \n /** Require NFT membership for participation (default: true) */\n requireMembership?: boolean;\n \n /** Enforce on-chain agent validation (default: false) */\n enforceOnChainValidation?: boolean;\n \n /** Contract addresses (filled after deployment) */\n agentRegistryAddress?: string;\n membershipContractAddress?: string;\n worldTokenAddress?: string;\n \n /** Chain ID */\n chainId?: number;\n}\n\n/**\n * ============================================================================\n * TOKEN CONFIGURATION\n * ============================================================================\n */\n\nexport interface TokenConfig {\n /** Deploy custom world token */\n deploy: boolean;\n \n /** Token name */\n name?: string;\n \n /** Token symbol */\n symbol?: string;\n \n /** Initial supply */\n initialSupply?: number;\n \n /** Decimals */\n decimals?: number;\n}\n\n/**\n * ============================================================================\n * WORLD TYPE MODULE (for plugin system)\n * ============================================================================\n */\n\nexport interface WorldTypeModule {\n name: string;\n description: string;\n defaultRules: WorldRule[];\n defaultAdmissionRules: Partial<AdmissionRules>;\n onInit?: (world: any) => Promise<void>;\n onTick?: (world: any, tick: number) => Promise<void>;\n onAgentJoin?: (world: any, agent: AgentProfile) => Promise<void>;\n onAgentLeave?: (world: any, agent: AgentProfile) => Promise<void>;\n}\n\n/**\n * ============================================================================\n * UTILITY TYPES\n * ============================================================================\n */\n\nexport interface EventFilter {\n type?: string;\n agentUrl?: string;\n fromTimestamp?: number;\n toTimestamp?: number;\n limit?: number;\n}\n\n/** Helper to build AgentProfile from AgentCard */\nexport function profileFromCard(card: AgentCard, walletAddress?: string): AgentProfile {\n return {\n url: card.url,\n name: card.name,\n protocolVersion: card.protocolVersion,\n skills: card.skills,\n capabilities: {\n streaming: card.capabilities.streaming ?? false,\n pushNotifications: card.capabilities.pushNotifications ?? false,\n stateTransitionHistory: card.capabilities.stateTransitionHistory,\n },\n joinedAt: Date.now(),\n walletAddress,\n };\n}\n","import { z } from 'zod';\n\n/**\n * ============================================================================\n * ZOD SCHEMAS FOR RUNTIME VALIDATION\n * ============================================================================\n */\n\nexport const AdmissionRulesSchema = z.object({\n maxAgents: z.number().int().positive().optional(),\n requiredSkills: z.array(z.string()).optional(),\n requiredTags: z.array(z.string()).optional(),\n minProtocolVersion: z.string().optional(),\n customEvaluator: z.function().optional(),\n});\n\n// Persistence configuration schemas\nconst SQLiteConfigSchema = z.object({\n filename: z.string(),\n memory: z.boolean().optional(),\n});\n\nconst PostgresConfigSchema = z.object({\n host: z.string(),\n port: z.number().optional(),\n database: z.string(),\n user: z.string(),\n password: z.string(),\n ssl: z.boolean().optional(),\n max: z.number().optional(),\n});\n\nconst RedisConfigSchema = z.object({\n host: z.string(),\n port: z.number().optional(),\n password: z.string().optional(),\n db: z.number().optional(),\n keyPrefix: z.string().optional(),\n});\n\nconst MongoDBConfigSchema = z.object({\n url: z.string(),\n database: z.string(),\n useUnifiedTopology: z.boolean().optional(),\n});\n\nconst LevelDBConfigSchema = z.object({\n path: z.string(),\n});\n\nexport const PersistenceConfigSchema = z.object({\n type: z.enum(['memory', 'postgres', 'redis', 'mongodb', 'sqlite', 'leveldb']),\n sqlite: SQLiteConfigSchema.optional(),\n postgres: PostgresConfigSchema.optional(),\n redis: RedisConfigSchema.optional(),\n mongodb: MongoDBConfigSchema.optional(),\n leveldb: LevelDBConfigSchema.optional(),\n autoSaveIntervalMs: z.number().int().positive().optional(),\n});\n\nexport const BlockchainConfigSchema = z.object({\n rpcUrl: z.string().url(),\n privateKey: z.string().regex(/^0x[a-fA-F0-9]{64}$/, 'Invalid private key format').optional(),\n entryFee: z.number().nonnegative().optional(),\n requireMembership: z.boolean().optional(),\n enforceOnChainValidation: z.boolean().optional(),\n agentRegistryAddress: z.string().optional(),\n membershipContractAddress: z.string().optional(),\n worldTokenAddress: z.string().optional(),\n chainId: z.number().int().optional(),\n});\n\nexport const TokenConfigSchema = z.object({\n deploy: z.boolean(),\n name: z.string().optional(),\n symbol: z.string().optional(),\n initialSupply: z.number().positive().optional(),\n decimals: z.number().int().min(0).max(18).optional(),\n});\n\nexport const WorldConfigSchema = z.object({\n name: z.string().min(1, 'World name is required'),\n description: z.string().optional(),\n type: z.string().optional(),\n \n server: z.object({\n port: z.number().int().min(1).max(65535),\n host: z.string(),\n }),\n \n a2a: z.object({\n baseUrl: z.string().url(),\n pushNotifications: z.boolean().optional(),\n streaming: z.boolean().optional(),\n }).optional(),\n \n admission: AdmissionRulesSchema,\n \n simulation: z.object({\n tickIntervalMs: z.number().int().positive().optional(),\n maxTicks: z.number().int().positive().optional(),\n autoStart: z.boolean().optional(),\n }).optional(),\n \n persistence: PersistenceConfigSchema.optional(),\n blockchain: BlockchainConfigSchema.optional(),\n token: TokenConfigSchema.optional(),\n \n rules: z.array(z.any()).optional(),\n agentUrls: z.array(z.string().url()).optional(),\n});\n\n/**\n * Validate world configuration\n */\nexport function validateWorldConfig(config: unknown): void {\n try {\n WorldConfigSchema.parse(config);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const messages = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');\n throw new Error(`Invalid world configuration: ${messages}`);\n }\n throw error;\n }\n}\n\n/**\n * Validate world configuration and return result\n */\nexport function isValidWorldConfig(config: unknown): boolean {\n try {\n WorldConfigSchema.parse(config);\n return true;\n } catch {\n return false;\n }\n}\n","import type { PersistenceAdapter } from '../PersistenceAdapter.js';\nimport type {\n WorldStateSnapshot,\n WorldEvent,\n AgentProfile,\n EventFilter,\n} from '../../config/types.js';\n\n/**\n * ============================================================================\n * IN-MEMORY PERSISTENCE ADAPTER\n * ============================================================================\n * \n * Simple in-memory persistence for testing and development.\n * No external dependencies - works on any Node version.\n * \n * WARNING: All data is lost when process exits.\n * \n * Use Case: Testing, development, temporary worlds\n */\n\nexport class InMemoryAdapter implements PersistenceAdapter {\n private state: WorldStateSnapshot | null = null;\n private events: WorldEvent[] = [];\n private agents: Map<string, AgentProfile> = new Map();\n \n async connect(): Promise<void> {\n // No-op for in-memory\n }\n \n async saveState(state: WorldStateSnapshot): Promise<void> {\n this.state = { ...state };\n }\n \n async loadState(): Promise<WorldStateSnapshot | null> {\n return this.state ? { ...this.state } : null;\n }\n \n async saveEvent(event: WorldEvent): Promise<void> {\n this.events.push({ ...event });\n }\n \n async getEvents(filter?: EventFilter): Promise<WorldEvent[]> {\n let filtered = [...this.events];\n \n if (filter?.type) {\n filtered = filtered.filter(e => e.type === filter.type);\n }\n \n if (filter?.agentUrl) {\n filtered = filtered.filter(e => e.agentUrl === filter.agentUrl);\n }\n \n if (filter?.fromTimestamp) {\n filtered = filtered.filter(e => e.timestamp >= filter.fromTimestamp!);\n }\n \n if (filter?.toTimestamp) {\n filtered = filtered.filter(e => e.timestamp <= filter.toTimestamp!);\n }\n \n // Sort by timestamp descending\n filtered.sort((a, b) => b.timestamp - a.timestamp);\n \n if (filter?.limit) {\n filtered = filtered.slice(0, filter.limit);\n }\n \n return filtered;\n }\n \n async saveAgent(profile: AgentProfile): Promise<void> {\n this.agents.set(profile.url, { ...profile });\n }\n \n async removeAgent(agentUrl: string): Promise<void> {\n this.agents.delete(agentUrl);\n }\n \n async getAgents(): Promise<AgentProfile[]> {\n return Array.from(this.agents.values()).map(a => ({ ...a }));\n }\n \n async getAgent(agentUrl: string): Promise<AgentProfile | null> {\n const agent = this.agents.get(agentUrl);\n return agent ? { ...agent } : null;\n }\n \n async disconnect(): Promise<void> {\n // No-op for in-memory\n }\n \n async healthCheck(): Promise<boolean> {\n return true;\n }\n \n async clear(): Promise<void> {\n this.state = null;\n this.events = [];\n this.agents.clear();\n }\n}\n","import type { PersistenceAdapter } from './PersistenceAdapter.js';\nimport type { PersistenceConfig } from '../config/types.js';\nimport { InMemoryAdapter } from './adapters/InMemoryAdapter.js';\n\n/**\n * ============================================================================\n * PERSISTENCE FACTORY\n * ============================================================================\n * \n * Creates the appropriate persistence adapter based on configuration.\n * Uses dynamic import() for optional dependencies to avoid requiring all databases\n * to be installed. Only the adapter for the configured persistence type is loaded.\n */\n\nexport async function createPersistence(config: PersistenceConfig): Promise<PersistenceAdapter> {\n switch (config.type) {\n case 'memory':\n return new InMemoryAdapter();\n \n case 'sqlite':\n return createSQLiteAdapter(config.sqlite || { filename: './world.db' });\n \n case 'postgres':\n if (!config.postgres) {\n throw new Error('PostgreSQL configuration is required');\n }\n return createPostgresAdapter(config.postgres);\n \n case 'redis':\n if (!config.redis) {\n throw new Error('Redis configuration is required');\n }\n return createRedisAdapter(config.redis);\n \n case 'mongodb':\n if (!config.mongodb) {\n throw new Error('MongoDB configuration is required');\n }\n return createMongoAdapter(config.mongodb);\n \n case 'leveldb':\n if (!config.leveldb) {\n throw new Error('LevelDB configuration is required');\n }\n return createLevelDBAdapter(config.leveldb);\n \n default:\n throw new Error(`Unknown persistence type: ${(config as any).type}`);\n }\n}\n\n/**\n * Lazy-load SQLite adapter via dynamic import\n */\nasync function createSQLiteAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n const Database = (await import('better-sqlite3')).default;\n \n // Inline adapter that uses the dynamically-imported Database\n return new (class implements PersistenceAdapter {\n private db!: any;\n \n async connect(): Promise<void> {\n // Ensure the parent directory exists\n const path = await import('path');\n const fs = await import('fs');\n const dir = path.dirname(config.filename);\n if (dir && dir !== '.') {\n fs.mkdirSync(dir, { recursive: true });\n }\n this.db = new Database(config.filename);\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS world_state (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n phase TEXT NOT NULL,\n tick INTEGER NOT NULL,\n round INTEGER NOT NULL,\n timestamp INTEGER NOT NULL,\n metadata TEXT\n );\n CREATE TABLE IF NOT EXISTS events (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n agent_url TEXT,\n timestamp INTEGER NOT NULL,\n data TEXT\n );\n CREATE TABLE IF NOT EXISTS agents (\n url TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n protocol_version TEXT NOT NULL,\n skills TEXT NOT NULL,\n capabilities TEXT NOT NULL,\n joined_at INTEGER NOT NULL,\n role TEXT,\n metadata TEXT,\n wallet_address TEXT\n );\n CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n CREATE INDEX IF NOT EXISTS idx_events_agent ON events(agent_url);\n `);\n }\n\n async saveState(state: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT OR REPLACE INTO world_state (id, phase, tick, round, timestamp, metadata) VALUES (1, ?, ?, ?, ?, ?)`);\n stmt.run(state.phase, state.tick, state.round, state.timestamp, JSON.stringify(state.metadata));\n }\n\n async loadState(): Promise<any> {\n const stmt = this.db.prepare('SELECT * FROM world_state WHERE id = 1');\n const row = stmt.get() as any;\n if (!row) return null;\n return { phase: row.phase, tick: row.tick, round: row.round, timestamp: row.timestamp, metadata: JSON.parse(row.metadata || '{}') };\n }\n\n async saveEvent(event: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT INTO events (id, type, agent_url, timestamp, data) VALUES (?, ?, ?, ?, ?)`);\n stmt.run(event.id, event.type, event.agentUrl || null, event.timestamp, JSON.stringify(event.data || {}));\n }\n\n async getEvents(filter?: any): Promise<any[]> {\n let query = 'SELECT * FROM events WHERE 1=1';\n const params: any[] = [];\n if (filter?.type) { query += ' AND type = ?'; params.push(filter.type); }\n if (filter?.agentUrl) { query += ' AND agent_url = ?'; params.push(filter.agentUrl); }\n if (filter?.fromTimestamp) { query += ' AND timestamp >= ?'; params.push(filter.fromTimestamp); }\n if (filter?.toTimestamp) { query += ' AND timestamp <= ?'; params.push(filter.toTimestamp); }\n query += ' ORDER BY timestamp DESC';\n if (filter?.limit) { query += ' LIMIT ?'; params.push(filter.limit); }\n const stmt = this.db.prepare(query);\n const rows = stmt.all(...params) as any[];\n return rows.map(row => ({ id: row.id, type: row.type, timestamp: row.timestamp, agentUrl: row.agent_url || undefined, data: JSON.parse(row.data || '{}') }));\n }\n\n async saveAgent(profile: any): Promise<void> {\n const stmt = this.db.prepare(`INSERT OR REPLACE INTO agents (url, name, protocol_version, skills, capabilities, joined_at, role, metadata, wallet_address) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);\n stmt.run(profile.url, profile.name, profile.protocolVersion, JSON.stringify(profile.skills), JSON.stringify(profile.capabilities), profile.joinedAt, profile.role || null, JSON.stringify(profile.metadata || {}), profile.walletAddress || null);\n }\n\n async removeAgent(agentUrl: string): Promise<void> {\n this.db.prepare('DELETE FROM agents WHERE url = ?').run(agentUrl);\n }\n\n async getAgents(): Promise<any[]> {\n const rows = this.db.prepare('SELECT * FROM agents ORDER BY joined_at ASC').all() as any[];\n return rows.map(row => ({ url: row.url, name: row.name, protocolVersion: row.protocol_version, skills: JSON.parse(row.skills), capabilities: JSON.parse(row.capabilities), joinedAt: row.joined_at, role: row.role || undefined, metadata: JSON.parse(row.metadata || '{}'), walletAddress: row.wallet_address || undefined }));\n }\n\n async getAgent(agentUrl: string): Promise<any> {\n const row = this.db.prepare('SELECT * FROM agents WHERE url = ?').get(agentUrl) as any;\n if (!row) return null;\n return { url: row.url, name: row.name, protocolVersion: row.protocol_version, skills: JSON.parse(row.skills), capabilities: JSON.parse(row.capabilities), joinedAt: row.joined_at, role: row.role || undefined, metadata: JSON.parse(row.metadata || '{}'), walletAddress: row.wallet_address || undefined };\n }\n\n async disconnect(): Promise<void> { this.db.close(); }\n async healthCheck(): Promise<boolean> { try { this.db.prepare('SELECT 1').get(); return true; } catch { return false; } }\n async clear(): Promise<void> { this.db.exec('DELETE FROM world_state; DELETE FROM events; DELETE FROM agents;'); }\n })();\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'SQLite adapter requires better-sqlite3. Install it with: npm install better-sqlite3'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load PostgreSQL adapter via dynamic import\n */\nasync function createPostgresAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n const pg = await import('pg');\n const Pool = pg.default?.Pool || pg.Pool;\n const { PostgresAdapter } = await import('./adapters/PostgresAdapter.js');\n return new PostgresAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'PostgreSQL adapter requires pg. Install it with: npm install pg'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load Redis adapter via dynamic import\n */\nasync function createRedisAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n await import('ioredis');\n const { RedisAdapter } = await import('./adapters/RedisAdapter.js');\n return new RedisAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'Redis adapter requires ioredis. Install it with: npm install ioredis'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load MongoDB adapter via dynamic import\n */\nasync function createMongoAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n // @ts-ignore - mongodb is an optional peer dependency\n await import('mongodb');\n const { MongoAdapter } = await import('./adapters/MongoAdapter.js');\n return new MongoAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'MongoDB adapter requires mongodb. Install it with: npm install mongodb'\n );\n }\n throw error;\n }\n}\n\n/**\n * Lazy-load LevelDB adapter via dynamic import\n */\nasync function createLevelDBAdapter(config: any): Promise<PersistenceAdapter> {\n try {\n // @ts-ignore - level is an optional peer dependency\n await import('level');\n const { LevelDBAdapter } = await import('./adapters/LevelDBAdapter.js');\n return new LevelDBAdapter(config);\n } catch (error: any) {\n if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'LevelDB adapter requires level. Install it with: npm install level'\n );\n }\n throw error;\n }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport type {\n WorldConfig,\n WorldPhase,\n WorldStateSnapshot,\n WorldEvent,\n AgentProfile,\n} from '../config/types.js';\nimport { validateWorldConfig } from '../config/validator.js';\nimport type { PersistenceAdapter } from '../persistence/PersistenceAdapter.js';\nimport { createPersistence } from '../persistence/PersistenceFactory.js';\nimport { CardFetcher } from '../discovery/CardFetcher.js';\nimport { AgentEvaluator } from '../discovery/AgentEvaluator.js';\nimport { BlockchainClient } from '../blockchain/BlockchainClient.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('World');\n\n/**\n * ============================================================================\n * WORLD ENGINE\n * ============================================================================\n * \n * Core world runtime managing:\n * - Agent discovery and admission\n * - World state and lifecycle\n * - Persistence and event logging\n * - Simulation ticks (if enabled)\n * - Rule enforcement\n */\n\nexport class World {\n private state: WorldStateSnapshot;\n private agents: Map<string, AgentProfile>;\n private persistence: PersistenceAdapter | null = null;\n private blockchainClient: BlockchainClient | null = null;\n private cardFetcher: CardFetcher;\n private evaluator: AgentEvaluator;\n private tickInterval: NodeJS.Timeout | null = null;\n private autoSaveInterval: NodeJS.Timeout | null = null;\n \n constructor(public readonly config: WorldConfig) {\n // Validate configuration\n validateWorldConfig(config);\n \n // Initialize state\n this.state = {\n phase: 'idle',\n tick: 0,\n round: 0,\n timestamp: Date.now(),\n metadata: {},\n };\n \n this.agents = new Map();\n this.cardFetcher = new CardFetcher();\n this.evaluator = new AgentEvaluator(config.admission);\n \n logger.info(`World \"${config.name}\" created`, {\n type: config.type || 'generic',\n maxAgents: config.admission.maxAgents,\n });\n }\n \n /**\n * Initialize the world (connect persistence, restore state, discover agents)\n */\n async init(): Promise<void> {\n logger.info('Initializing world...');\n this.setState('initializing');\n \n try {\n // 1. Connect to persistence backend\n if (this.config.persistence) {\n logger.info(`Connecting to persistence backend: ${this.config.persistence.type}`);\n this.persistence = await createPersistence(this.config.persistence);\n await this.persistence.connect();\n \n // Try to restore state from persistence\n const savedState = await this.persistence.loadState();\n if (savedState) {\n this.state = savedState;\n logger.info('Restored world state from persistence', {\n phase: savedState.phase,\n tick: savedState.tick,\n });\n \n // Restore agents\n const savedAgents = await this.persistence.getAgents();\n for (const agent of savedAgents) {\n this.agents.set(agent.url, agent);\n }\n \n logger.info(`Restored ${savedAgents.length} agents from persistence`);\n }\n }\n \n // 2. Initialize blockchain client if configured\n if (this.config.blockchain) {\n logger.info('Initializing blockchain client...');\n this.blockchainClient = new BlockchainClient(this.config.blockchain);\n await this.blockchainClient.init();\n }\n \n // 3. Discover pre-configured agents\n if (this.config.agentUrls && this.config.agentUrls.length > 0) {\n logger.info(`Discovering ${this.config.agentUrls.length} pre-configured agents...`);\n \n const results = await this.cardFetcher.fetchCards(this.config.agentUrls);\n \n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n if (result.success && result.card) {\n // Auto-admit pre-configured agents\n try {\n await this.admitAgent(result.card);\n } catch (error: any) {\n logger.warn(`Failed to admit pre-configured agent:`, error.message);\n }\n }\n }\n }\n \n // 3. Start auto-save if persistence enabled\n if (this.persistence) {\n this.startAutoSave();\n }\n \n this.setState('ready');\n logger.info('World initialized successfully', {\n agents: this.agents.size,\n persistence: this.config.persistence?.type || 'none',\n });\n } catch (error: any) {\n logger.error('Failed to initialize world:', error);\n this.setState('failed');\n throw error;\n }\n }\n \n /**\n * Start the world simulation\n */\n async start(): Promise<void> {\n if (this.state.phase === 'running') {\n logger.warn('World is already running');\n return;\n }\n \n logger.info('Starting world simulation...');\n this.setState('running');\n \n await this.logEvent({\n id: uuidv4(),\n type: 'world_started',\n timestamp: Date.now(),\n });\n \n // Start tick interval if simulation is enabled\n if (this.config.simulation?.tickIntervalMs) {\n this.startTicking();\n }\n }\n \n /**\n * Stop the world simulation\n */\n async stop(): Promise<void> {\n logger.info('Stopping world...');\n this.setState('stopped');\n \n // Stop ticking\n if (this.tickInterval) {\n clearInterval(this.tickInterval);\n this.tickInterval = null;\n }\n \n // Stop auto-save\n if (this.autoSaveInterval) {\n clearInterval(this.autoSaveInterval);\n this.autoSaveInterval = null;\n }\n \n // Final save\n if (this.persistence) {\n await this.persistence.saveState(this.state);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'world_stopped',\n timestamp: Date.now(),\n });\n \n logger.info('World stopped');\n }\n \n /**\n * Admit an agent to the world\n */\n async admitAgent(card: any, walletAddress?: string): Promise<void> {\n const decision = await this.evaluator.evaluate(card, this.agents.size, walletAddress);\n \n if (!decision.admitted) {\n throw new Error(`Agent admission denied: ${decision.reason}`);\n }\n \n // Optional: Validate agent on-chain\n if (this.blockchainClient && this.config.blockchain?.enforceOnChainValidation && walletAddress) {\n const isValid = await this.blockchainClient.validateAgent(walletAddress);\n if (!isValid) {\n throw new Error('Agent not registered in on-chain AgentRegistry');\n }\n logger.info(`Agent validated on-chain: ${card.name}`);\n }\n \n // Optional: Mint membership NFT\n if (this.blockchainClient && this.config.blockchain?.requireMembership && walletAddress) {\n // Check if agent already has membership\n const hasMembership = await this.blockchainClient.hasMembership(walletAddress);\n \n if (!hasMembership) {\n logger.info(`Minting membership NFT for agent: ${card.name}`);\n await this.blockchainClient.mintMembership(walletAddress);\n } else {\n logger.info(`Agent already has membership: ${card.name}`);\n }\n }\n \n const profile: AgentProfile = {\n url: card.url,\n name: card.name,\n protocolVersion: card.protocolVersion,\n skills: card.skills,\n capabilities: {\n streaming: card.capabilities.streaming ?? false,\n pushNotifications: card.capabilities.pushNotifications ?? false,\n stateTransitionHistory: card.capabilities.stateTransitionHistory,\n },\n joinedAt: Date.now(),\n role: decision.role,\n metadata: decision.metadata,\n walletAddress,\n };\n \n this.agents.set(profile.url, profile);\n \n if (this.persistence) {\n await this.persistence.saveAgent(profile);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'agent_joined',\n timestamp: Date.now(),\n agentUrl: profile.url,\n data: { name: profile.name, role: profile.role },\n });\n \n logger.info(`Agent admitted: ${profile.name}`, {\n role: profile.role,\n totalAgents: this.agents.size,\n });\n }\n \n /**\n * Remove an agent from the world\n */\n async removeAgent(agentUrl: string): Promise<void> {\n const agent = this.agents.get(agentUrl);\n if (!agent) {\n throw new Error(`Agent not found: ${agentUrl}`);\n }\n \n this.agents.delete(agentUrl);\n \n if (this.persistence) {\n await this.persistence.removeAgent(agentUrl);\n }\n \n await this.logEvent({\n id: uuidv4(),\n type: 'agent_left',\n timestamp: Date.now(),\n agentUrl,\n data: { name: agent.name },\n });\n \n logger.info(`Agent removed: ${agent.name}`, {\n totalAgents: this.agents.size,\n });\n }\n \n /**\n * Get all agents in the world\n */\n getAgents(): AgentProfile[] {\n return Array.from(this.agents.values());\n }\n \n /**\n * Get current world state\n */\n getState(): WorldStateSnapshot {\n return { ...this.state };\n }\n \n /**\n * Log an event\n */\n private async logEvent(event: WorldEvent): Promise<void> {\n if (this.persistence) {\n await this.persistence.saveEvent(event);\n }\n }\n \n /**\n * Set world phase\n */\n private setState(phase: WorldPhase): void {\n this.state.phase = phase;\n this.state.timestamp = Date.now();\n }\n \n /**\n * Start auto-save interval\n */\n private startAutoSave(): void {\n const interval = this.config.persistence?.autoSaveIntervalMs || 10000;\n \n this.autoSaveInterval = setInterval(async () => {\n if (this.persistence) {\n await this.persistence.saveState(this.state);\n logger.debug('Auto-saved world state');\n }\n }, interval);\n \n logger.info(`Auto-save enabled (interval: ${interval}ms)`);\n }\n \n /**\n * Start simulation ticking\n */\n private startTicking(): void {\n const interval = this.config.simulation!.tickIntervalMs!;\n \n this.tickInterval = setInterval(async () => {\n this.state.tick++;\n \n await this.logEvent({\n id: uuidv4(),\n type: 'tick',\n timestamp: Date.now(),\n data: { tick: this.state.tick },\n });\n \n logger.debug(`Tick ${this.state.tick}`);\n \n // Check max ticks\n if (this.config.simulation?.maxTicks && this.state.tick >= this.config.simulation.maxTicks) {\n logger.info('Max ticks reached, stopping world');\n await this.stop();\n }\n }, interval);\n \n logger.info(`Simulation ticking enabled (interval: ${interval}ms)`);\n }\n}\n","import type { AgentCard } from '@a2a-js/sdk';\nimport type { AgentProfile, AdmissionRules, AdmissionDecision } from '../config/types.js';\nimport { profileFromCard } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('AgentEvaluator');\n\n/**\n * ============================================================================\n * AGENT EVALUATOR\n * ============================================================================\n * \n * Evaluates whether an agent should be admitted to the world based on rules.\n * \n * Evaluation criteria:\n * - Max agents limit\n * - Required skills (agent must have ALL)\n * - Required tags (agent must have AT LEAST ONE)\n * - Minimum protocol version\n * - Custom evaluator function\n */\n\nexport class AgentEvaluator {\n constructor(private rules: AdmissionRules) {}\n \n /**\n * Evaluate whether an agent should be admitted.\n * \n * @param card Agent's A2A card\n * @param currentAgentCount Current number of agents in world\n * @param walletAddress Optional wallet address for blockchain membership\n * @returns Admission decision\n */\n async evaluate(\n card: AgentCard,\n currentAgentCount: number,\n walletAddress?: string\n ): Promise<AdmissionDecision> {\n logger.debug(`Evaluating agent: ${card.name}`, {\n currentAgents: currentAgentCount,\n maxAgents: this.rules.maxAgents,\n });\n \n // Check max agents limit\n if (this.rules.maxAgents && currentAgentCount >= this.rules.maxAgents) {\n logger.info(`Agent ${card.name} rejected: world is full`, {\n current: currentAgentCount,\n max: this.rules.maxAgents,\n });\n \n return {\n admitted: false,\n reason: `World is full (${this.rules.maxAgents} agents maximum)`,\n };\n }\n \n // Check protocol version\n if (this.rules.minProtocolVersion) {\n if (!this.meetsProtocolVersion(card.protocolVersion, this.rules.minProtocolVersion)) {\n logger.info(`Agent ${card.name} rejected: protocol version too old`, {\n agent: card.protocolVersion,\n required: this.rules.minProtocolVersion,\n });\n \n return {\n admitted: false,\n reason: `Protocol version ${card.protocolVersion} is below minimum ${this.rules.minProtocolVersion}`,\n };\n }\n }\n \n // Check required skills (agent must have ALL)\n if (this.rules.requiredSkills && this.rules.requiredSkills.length > 0) {\n const agentSkillIds = card.skills.map(s => s.id.toLowerCase());\n const missingSkills = this.rules.requiredSkills.filter(\n required => !agentSkillIds.includes(required.toLowerCase())\n );\n \n if (missingSkills.length > 0) {\n logger.info(`Agent ${card.name} rejected: missing required skills`, {\n missing: missingSkills,\n });\n \n return {\n admitted: false,\n reason: `Missing required skills: ${missingSkills.join(', ')}`,\n };\n }\n }\n \n // Check required tags (agent must have AT LEAST ONE)\n if (this.rules.requiredTags && this.rules.requiredTags.length > 0) {\n const agentTags = card.skills.flatMap(s => s.tags || []).map(t => t.toLowerCase());\n const hasRequiredTag = this.rules.requiredTags.some(\n required => agentTags.includes(required.toLowerCase())\n );\n \n if (!hasRequiredTag) {\n logger.info(`Agent ${card.name} rejected: no matching tags`, {\n required: this.rules.requiredTags,\n });\n \n return {\n admitted: false,\n reason: `Must have at least one of these tags: ${this.rules.requiredTags.join(', ')}`,\n };\n }\n }\n \n // Run custom evaluator if provided\n if (this.rules.customEvaluator) {\n const profile = profileFromCard(card, walletAddress);\n const customDecision = await this.rules.customEvaluator(profile);\n \n if (!customDecision.admitted) {\n logger.info(`Agent ${card.name} rejected by custom evaluator`, {\n reason: customDecision.reason,\n });\n \n return customDecision;\n }\n \n // Custom evaluator can assign roles and metadata\n if (customDecision.role || customDecision.metadata) {\n logger.debug(`Custom evaluator assigned role/metadata to ${card.name}`, {\n role: customDecision.role,\n });\n }\n \n return customDecision;\n }\n \n // All checks passed\n logger.info(`Agent ${card.name} admitted to world`);\n \n return {\n admitted: true,\n reason: 'All admission criteria met',\n };\n }\n \n /**\n * Check if agent's protocol version meets minimum requirement.\n * Simple semver comparison (major.minor).\n */\n private meetsProtocolVersion(agentVersion: string, minVersion: string): boolean {\n const parse = (v: string) => {\n const parts = v.split('.');\n return {\n major: parseInt(parts[0] || '0', 10),\n minor: parseInt(parts[1] || '0', 10),\n };\n };\n \n const agent = parse(agentVersion);\n const min = parse(minVersion);\n \n if (agent.major > min.major) return true;\n if (agent.major < min.major) return false;\n return agent.minor >= min.minor;\n }\n}\n","import { ethers } from 'ethers';\nimport type { BlockchainConfig } from '../config/types.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('BlockchainClient');\n\n// Contract ABIs (minimal interfaces)\nconst AGENT_REGISTRY_ABI = [\n 'function registerAgent(string agentUrl, string name) external',\n 'function isAgentValid(address wallet) external view returns (bool)',\n 'function getAgent(address wallet) external view returns (tuple(address walletAddress, string agentUrl, string name, uint256 registeredAt, bool isActive))',\n 'function getWalletByUrl(string agentUrl) external view returns (address)',\n 'event AgentRegistered(address indexed wallet, string agentUrl, string name)',\n];\n\nconst WORLD_MEMBERSHIP_ABI = [\n 'function mintMembership(address agent) external payable',\n 'function revokeMembership(address agent) external',\n 'function hasMembership(address agent) external view returns (bool)',\n 'function entryFee() external view returns (uint256)',\n 'function totalMembers() external view returns (uint256)',\n 'function withdrawFees() external',\n 'event MembershipMinted(address indexed agent, uint256 indexed tokenId, uint256 feePaid)',\n];\n\nconst WORLD_TOKEN_ABI = [\n 'function mint(address to, uint256 amount) external',\n 'function burn(address from, uint256 amount) external',\n 'function balanceOf(address account) external view returns (uint256)',\n 'function transfer(address to, uint256 amount) external returns (bool)',\n];\n\n/**\n * ============================================================================\n * BLOCKCHAIN CLIENT\n * ============================================================================\n * \n * Handles all blockchain interactions for the World SDK:\n * - Agent registry validation\n * - Membership NFT minting\n * - Entry fee collection\n * - World token operations\n */\n\nexport class BlockchainClient {\n private provider: ethers.JsonRpcProvider;\n private wallet: ethers.Wallet;\n private agentRegistry?: ethers.Contract;\n private membershipContract?: ethers.Contract;\n private worldToken?: ethers.Contract;\n \n constructor(private config: BlockchainConfig) {\n // Initialize provider and wallet\n this.provider = new ethers.JsonRpcProvider(config.rpcUrl);\n this.wallet = new ethers.Wallet(config.privateKey, this.provider);\n \n logger.info('Blockchain client initialized', {\n network: config.rpcUrl,\n wallet: this.wallet.address,\n });\n }\n \n /**\n * Initialize contract connections\n */\n async init(): Promise<void> {\n // Connect to AgentRegistry if address provided\n if (this.config.agentRegistryAddress) {\n this.agentRegistry = new ethers.Contract(\n this.config.agentRegistryAddress,\n AGENT_REGISTRY_ABI,\n this.wallet\n );\n logger.info('Connected to AgentRegistry', {\n address: this.config.agentRegistryAddress,\n });\n }\n \n // Connect to WorldMembership if address provided\n if (this.config.membershipContractAddress) {\n this.membershipContract = new ethers.Contract(\n this.config.membershipContractAddress,\n WORLD_MEMBERSHIP_ABI,\n this.wallet\n );\n logger.info('Connected to WorldMembership', {\n address: this.config.membershipContractAddress,\n });\n }\n \n // Connect to WorldToken if address provided\n if (this.config.worldTokenAddress) {\n this.worldToken = new ethers.Contract(\n this.config.worldTokenAddress,\n WORLD_TOKEN_ABI,\n this.wallet\n );\n logger.info('Connected to WorldToken', {\n address: this.config.worldTokenAddress,\n });\n }\n \n logger.info('Blockchain client ready');\n }\n \n /**\n * Validate agent on-chain\n * @param walletAddress Agent's wallet address\n * @returns True if agent is registered and valid\n */\n async validateAgent(walletAddress: string): Promise<boolean> {\n if (!this.agentRegistry) {\n logger.warn('AgentRegistry not configured, skipping on-chain validation');\n return true; // Skip validation if not configured\n }\n \n try {\n const isValid = await this.agentRegistry.isAgentValid(walletAddress);\n logger.debug('Agent validation result', {\n wallet: walletAddress,\n isValid,\n });\n return isValid;\n } catch (error: any) {\n logger.error('Failed to validate agent on-chain', {\n wallet: walletAddress,\n error: error.message,\n });\n return false;\n }\n }\n \n /**\n * Mint membership NFT for an agent\n * @param agentWallet Agent's wallet address\n * @returns Transaction hash\n */\n async mintMembership(agentWallet: string): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n // Get entry fee\n const entryFee = await this.membershipContract.entryFee();\n \n logger.info('Minting membership NFT', {\n agent: agentWallet,\n entryFee: ethers.formatEther(entryFee),\n });\n \n // Mint membership\n const tx = await this.membershipContract.mintMembership(agentWallet, {\n value: entryFee,\n });\n \n const receipt = await tx.wait();\n \n logger.info('Membership NFT minted', {\n agent: agentWallet,\n txHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to mint membership NFT', {\n agent: agentWallet,\n error: error.message,\n });\n throw error;\n }\n }\n \n /**\n * Check if agent has membership\n * @param agentWallet Agent's wallet address\n * @returns True if agent has membership\n */\n async hasMembership(agentWallet: string): Promise<boolean> {\n if (!this.membershipContract) {\n logger.warn('WorldMembership not configured, skipping membership check');\n return true; // Skip check if not configured\n }\n \n try {\n const hasMembership = await this.membershipContract.hasMembership(agentWallet);\n return hasMembership;\n } catch (error: any) {\n logger.error('Failed to check membership', {\n agent: agentWallet,\n error: error.message,\n });\n return false;\n }\n }\n \n /**\n * Revoke membership NFT\n * @param agentWallet Agent's wallet address\n * @returns Transaction hash\n */\n async revokeMembership(agentWallet: string): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n logger.info('Revoking membership', { agent: agentWallet });\n \n const tx = await this.membershipContract.revokeMembership(agentWallet);\n const receipt = await tx.wait();\n \n logger.info('Membership revoked', {\n agent: agentWallet,\n txHash: receipt.hash,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to revoke membership', {\n agent: agentWallet,\n error: error.message,\n });\n throw error;\n }\n }\n \n /**\n * Get total number of members\n */\n async getTotalMembers(): Promise<number> {\n if (!this.membershipContract) {\n return 0;\n }\n \n try {\n const total = await this.membershipContract.totalMembers();\n return Number(total);\n } catch (error: any) {\n logger.error('Failed to get total members', { error: error.message });\n return 0;\n }\n }\n \n /**\n * Withdraw collected entry fees (world owner only)\n */\n async withdrawFees(): Promise<string> {\n if (!this.membershipContract) {\n throw new Error('WorldMembership contract not configured');\n }\n \n try {\n logger.info('Withdrawing entry fees');\n \n const tx = await this.membershipContract.withdrawFees();\n const receipt = await tx.wait();\n \n logger.info('Fees withdrawn', {\n txHash: receipt.hash,\n blockNumber: receipt.blockNumber,\n });\n \n return receipt.hash;\n } catch (error: any) {\n logger.error('Failed to withdraw fees', { error: error.message });\n throw error;\n }\n }\n \n /**\n * Get world owner's wallet address\n */\n getWalletAddress(): string {\n return this.wallet.address;\n }\n \n /**\n * Get entry fee in MON\n */\n async getEntryFee(): Promise<string> {\n if (!this.membershipContract) {\n return '0';\n }\n \n try {\n const fee = await this.membershipContract.entryFee();\n return ethers.formatEther(fee);\n } catch (error: any) {\n logger.error('Failed to get entry fee', { error: error.message });\n return '0';\n }\n }\n}\n","import express, { type Express, type Request, type Response } from 'express';\nimport type { World } from '../engine/World.js';\nimport { createLogger } from '../logger.js';\n\nconst logger = createLogger('WorldServer');\n\n/**\n * ============================================================================\n * WORLD HTTP SERVER\n * ============================================================================\n * \n * Express server providing HTTP endpoints for:\n * - World information\n * - Agent join requests \n * - Agent list\n * - World state and events\n * \n * Mirrors the agent SDK server pattern.\n */\n\nexport function createWorldApp(world: World): Express {\n const app = express();\n \n // Middleware\n app.use(express.json());\n app.use(express.urlencoded({ extended: true }));\n \n // Request logging\n app.use((req, res, next) => {\n logger.debug(`${req.method} ${req.path}`, {\n query: req.query,\n ip: req.ip,\n });\n next();\n });\n \n /**\n * GET / - World information\n */\n app.get('/', (req: Request, res: Response) => {\n res.json({\n name: world.config.name,\n description: world.config.description,\n type: world.config.type || 'generic',\n state: world.getState(),\n agentCount: world.getAgents().length,\n maxAgents: world.config.admission.maxAgents || null,\n admission: {\n requiredSkills: world.config.admission.requiredSkills || [],\n requiredTags: world.config.admission.requiredTags || [],\n minProtocolVersion: world.config.admission.minProtocolVersion || null,\n },\n });\n });\n \n /**\n * POST /world/join - Agent join request\n * \n * Body:\n * {\n * \"agentUrl\": \"http://localhost:3000\",\n * \"walletAddress\": \"0x...\" // optional, for blockchain membership\n * }\n */\n app.post('/world/join', async (req: Request, res: Response) => {\n try {\n const { agentUrl, walletAddress } = req.body;\n \n if (!agentUrl) {\n return res.status(400).json({\n success: false,\n error: 'agentUrl is required',\n });\n }\n \n logger.info(`Agent join request from: ${agentUrl}`, {\n wallet: walletAddress || 'none',\n });\n \n // Fetch agent card\n const cardFetcher = new (await import('../discovery/CardFetcher.js')).CardFetcher();\n const result = await cardFetcher.fetchCard(agentUrl);\n \n if (!result.success || !result.card) {\n return res.status(400).json({\n success: false,\n error: `Failed to fetch agent card: ${result.error}`,\n });\n }\n \n // Admit agent\n await world.admitAgent(result.card, walletAddress);\n \n res.json({\n success: true,\n message: 'Agent admitted to world',\n world: {\n name: world.config.name,\n agentCount: world.getAgents().length,\n },\n });\n } catch (error: any) {\n logger.error('Failed to process join request:', error);\n \n res.status(400).json({\n success: false,\n error: error.message || 'Failed to join world',\n });\n }\n });\n \n /**\n * GET /world/agents - List all agents\n */\n app.get('/world/agents', (req: Request, res: Response) => {\n const agents = world.getAgents().map(agent => ({\n url: agent.url,\n name: agent.name,\n protocolVersion: agent.protocolVersion,\n skills: agent.skills.map(s => s.id),\n joinedAt: agent.joinedAt,\n role: agent.role,\n }));\n \n res.json({\n agents,\n count: agents.length,\n });\n });\n \n /**\n * GET /world/state - World state\n */\n app.get('/world/state', (req: Request, res: Response) => {\n res.json(world.getState());\n });\n \n /**\n * POST /world/start - Start world simulation\n */\n app.post('/world/start', async (req: Request, res: Response) => {\n try {\n await world.start();\n res.json({\n success: true,\n message: 'World simulation started',\n state: world.getState(),\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n /**\n * POST /world/stop - Stop world simulation\n */\n app.post('/world/stop', async (req: Request, res: Response) => {\n try {\n await world.stop();\n res.json({\n success: true,\n message: 'World simulation stopped',\n state: world.getState(),\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n /**\n * DELETE /world/agents/:agentUrl - Remove an agent\n */\n app.delete('/world/agents/:agentUrl', async (req: Request, res: Response) => {\n try {\n const agentUrlParam = req.params.agentUrl;\n const agentUrl = typeof agentUrlParam === 'string' \n ? decodeURIComponent(agentUrlParam)\n : decodeURIComponent(agentUrlParam[0]);\n \n await world.removeAgent(agentUrl);\n \n res.json({\n success: true,\n message: 'Agent removed from world',\n });\n } catch (error: any) {\n res.status(400).json({\n success: false,\n error: error.message,\n });\n }\n });\n \n // 404 handler\n app.use((req: Request, res: Response) => {\n res.status(404).json({\n error: 'Not found',\n path: req.path,\n });\n });\n \n // Error handler\n app.use((err: any, req: Request, res: Response, next: any) => {\n logger.error('Server error:', err);\n \n res.status(500).json({\n error: 'Internal server error',\n message: err.message,\n });\n });\n \n return app;\n}\n\n/**\n * Start world server on configured port\n */\nexport async function startWorldServer(world: World): Promise<void> {\n const app = createWorldApp(world);\n \n const server = app.listen(world.config.server.port, world.config.server.host, () => {\n const { host, port } = world.config.server;\n \n logger.info(`World \"${world.config.name}\" server started`);\n logger.info(` http://${host}:${port}`);\n logger.info('');\n logger.info('Endpoints:');\n logger.info(` GET / - World info`);\n logger.info(` POST /world/join - Agent join request`);\n logger.info(` GET /world/agents - List agents`);\n logger.info(` GET /world/state - World state`);\n logger.info(` POST /world/start - Start simulation`);\n logger.info(` POST /world/stop - Stop simulation`);\n logger.info(` DELETE /world/agents/:url - Remove agent`);\n });\n \n // Graceful shutdown\n process.on('SIGTERM', async () => {\n logger.info('SIGTERM received, shutting down gracefully...');\n \n server.close(async () => {\n await world.stop();\n process.exit(0);\n });\n });\n \n process.on('SIGINT', async () => {\n logger.info('SIGINT received, shutting down gracefully...');\n \n server.close(async () => {\n await world.stop();\n process.exit(0);\n });\n });\n}\n"],"mappings":"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","names":["logger","logger","logger","logger"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moltium/world-core",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "World runtime for creating agent simulation environments with A2A-based admission and blockchain validation",
5
5
  "license": "MIT",
6
6
  "type": "module",