@kya-os/checkpoint-wasm-runtime 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +70 -0
- package/dist/adapters.js +0 -2
- package/dist/adapters.mjs +0 -2
- package/dist/edge.js +0 -2
- package/dist/edge.mjs +0 -2
- package/dist/engine-edge.js +0 -2
- package/dist/engine-edge.mjs +0 -2
- package/dist/engine.js +0 -2
- package/dist/engine.mjs +0 -2
- package/dist/index.js +0 -2
- package/dist/index.mjs +0 -2
- package/dist/node.js +0 -2
- package/dist/node.mjs +0 -2
- package/dist/orchestrator-edge.d.mts +5 -199
- package/dist/orchestrator-edge.d.ts +5 -199
- package/dist/orchestrator-edge.js +0 -2
- package/dist/orchestrator-edge.mjs +0 -2
- package/dist/orchestrator-node.d.mts +49 -0
- package/dist/orchestrator-node.d.ts +49 -0
- package/dist/orchestrator-node.js +547 -0
- package/dist/orchestrator-node.mjs +538 -0
- package/dist/orchestrator.d.mts +4 -47
- package/dist/orchestrator.d.ts +4 -47
- package/dist/orchestrator.js +0 -2
- package/dist/orchestrator.mjs +0 -2
- package/dist/render-decision-C1a-iuiW.d.mts +200 -0
- package/dist/render-decision-Dsjwt96g.d.ts +200 -0
- package/package.json +11 -1
- package/dist/adapters.js.map +0 -1
- package/dist/adapters.mjs.map +0 -1
- package/dist/edge.js.map +0 -1
- package/dist/edge.mjs.map +0 -1
- package/dist/engine-edge.js.map +0 -1
- package/dist/engine-edge.mjs.map +0 -1
- package/dist/engine.js.map +0 -1
- package/dist/engine.mjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/node.js.map +0 -1
- package/dist/node.mjs.map +0 -1
- package/dist/orchestrator-edge.js.map +0 -1
- package/dist/orchestrator-edge.mjs.map +0 -1
- package/dist/orchestrator.js.map +0 -1
- package/dist/orchestrator.mjs.map +0 -1
package/dist/adapters.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/adapters/outbound-url-policy.ts","../src/engine/adapters/util.ts","../src/engine/adapters/did-resolver.ts","../src/engine/adapters/status-list-cache.ts","../src/engine/adapters/reputation-oracle.ts","../src/engine/adapters/policy-evaluator.ts","../src/engine/adapters/clock.ts"],"names":["DEFAULT_FETCH_TIMEOUT_MS","DEFAULT_TTL_MS"],"mappings":";;;;;;AAQA,IAAM,oCAAoB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,UAAA,EAAY,0BAA0B,CAAC,CAAA;AAEhF,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EAClC,IAAA,GAAO,mBAAA;AAClB,CAAA;AAEO,SAAS,kBAAA,CAAmB,MAAA,EAAgB,KAAA,GAAQ,cAAA,EAAwB;AACjF,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,IAAI,MAAM,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,EAAG,KAAK,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAE,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,MAAA,CAAO,aAAa,QAAA,EAAU;AAChC,IAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,EAAG,KAAK,CAAA,iBAAA,EAAoB,MAAM,CAAA,CAAE,CAAA;AAAA,EAClE;AACA,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,EAAU;AACtC,IAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,EAAG,KAAK,CAAA,+BAAA,EAAkC,MAAM,CAAA,CAAE,CAAA;AAAA,EAChF;AAEA,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AAClD,EAAA,IAAI,CAAC,QAAA,IAAY,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,EAAG,KAAK,CAAA,kCAAA,EAAqC,MAAM,CAAA,CAAE,CAAA;AAAA,EACnF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAkB,QAAA,EAA0B;AACnD,EAAA,IAAI,UAAA,GAAa,QAAA,CAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAC7C,EAAA,IAAI,WAAW,UAAA,CAAW,GAAG,KAAK,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1D,IAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC/B,IAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,kBAAkB,QAAA,EAA2B;AACpD,EAAA,IAAI,kBAAkB,GAAA,CAAI,QAAQ,KAAK,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,EAAG;AACtE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,UAAU,QAAQ,CAAA;AAC/B,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO,cAAc,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,cAAc,QAAQ,CAAA;AAC/B;AAEA,SAAS,UAAU,QAAA,EAA2D;AAC5E,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AAChC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACjC,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,SAAU,MAAA,CAAO,GAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,IAAA,OAAO,KAAA,IAAS,CAAA,IAAK,KAAA,IAAS,GAAA,GAAM,QAAQ,MAAA,CAAO,GAAA;AAAA,EACrD,CAAC,CAAA;AAED,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,GAAG,OAAO,IAAA;AACtC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,aAAA,CAAc,CAAC,CAAA,EAAG,CAAC,CAAA,EAA8C;AACxE,EAAA,OACE,CAAA,KAAM,CAAA,IACN,CAAA,KAAM,EAAA,IACN,MAAM,GAAA,IACL,CAAA,KAAM,GAAA,IAAO,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,GAAA,IAC7B,CAAA,KAAM,OAAO,CAAA,KAAM,GAAA,IACnB,CAAA,KAAM,GAAA,IAAO,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,EAAA,IAC7B,MAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IACnB,CAAA,KAAM,GAAA,KAAQ,CAAA,KAAM,EAAA,IAAM,CAAA,KAAM,OACjC,CAAA,IAAK,GAAA;AAET;AAEA,SAAS,cAAc,QAAA,EAA2B;AAChD,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,GAAG,GAAG,OAAO,KAAA;AAEpC,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,wCAAwC,CAAA;AAC1E,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,UAAA,CAAW,CAAC,CAAC,CAAA;AACpC,IAAA,OAAO,IAAA,GAAO,aAAA,CAAc,IAAI,CAAA,GAAI,IAAA;AAAA,EACtC;AAEA,EAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,KAAA,IAAS,aAAa,iBAAA,EAAmB;AAC7E,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA,EAAK,EAAE,CAAA;AACtE,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,EAAG,OAAO,IAAA;AAEvC,EAAA,OAAA,CACG,eAAe,KAAA,MAAY,KAAA;AAAA,EAAA,CAC3B,eAAe,KAAA,MAAY,KAAA;AAAA,EAAA,CAC3B,eAAe,KAAA,MAAY,KAAA;AAEhC;;;ACjGO,SAAS,gBAAgB,KAAA,EAA2B;AACzD,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,GAAS,CAAA,KAAM,CAAA,GAAI,EAAA,GAAK,GAAA,CAAI,MAAA,CAAO,CAAA,GAAK,MAAA,CAAO,MAAA,GAAS,CAAE,CAAA;AACjF,EAAA,OAAO,IAAI,UAAA,CAAW,MAAA,CAAO,KAAK,MAAA,GAAS,OAAA,EAAS,QAAQ,CAAC,CAAA;AAC/D;;;ACSA,IAAM,yBAAA,GAA4B,EAAA;AAM3B,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EAC7B,IAAA,GAAO,cAAA;AAClB;AAEO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EACnC,IAAA,GAAO,oBAAA;AAClB;AAEO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EAC5B,IAAA,GAAO,aAAA;AAClB;AAEO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EACnC,IAAA,GAAO,oBAAA;AAClB;AAEO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EACjC,IAAA,GAAO,kBAAA;AAClB;AAEO,IAAM,oBAAA,GAAN,cAAmC,KAAA,CAAM;AAAA,EACrC,IAAA,GAAO,sBAAA;AAClB;AA+BA,IAAM,yBAAA,GAA4B,CAAC,GAAA,EAAM,CAAI,CAAA;AAC7C,IAAM,wBAAA,GAA2B,GAAA;AACjC,IAAM,iBAAiB,CAAA,GAAI,GAAA;AAEpB,SAAS,eAAA,CAAgB,IAAA,GAAwB,EAAC,EAAuB;AAC9E,EAAA,MAAM,SAAA,GAAY,KAAK,cAAA,IAAkB,wBAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,cAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,KAAK,KAAA,IAAS,KAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,oBAAS,IAAI,GAAA,EAAqC;AACrE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,KAAQ,MAAM,KAAK,GAAA,EAAI,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,MAAM,QAAQ,GAAA,EAAmC;AAC/C,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC5B,MAAA,IAAI,MAAA,IAAU,GAAA,EAAI,GAAI,MAAA,CAAO,YAAY,KAAA,EAAO;AAC9C,QAAA,OAAO,MAAA,CAAO,KAAA;AAAA,MAChB;AAUA,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,QAAA,MAAM,GAAA,GAAM,aAAa,GAAG,CAAA;AAC5B,QAAA,KAAA,CAAM,GAAA,CAAI,KAAK,EAAE,KAAA,EAAO,KAAK,SAAA,EAAW,GAAA,IAAO,CAAA;AAC/C,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,QAAA,MAAM,GAAA,GAAM,MAAM,aAAA,CAAc,GAAA,EAAK,WAAW,SAAS,CAAA;AACzD,QAAA,KAAA,CAAM,GAAA,CAAI,KAAK,EAAE,KAAA,EAAO,KAAK,SAAA,EAAW,GAAA,IAAO,CAAA;AAC/C,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAI,oBAAA,CAAqB,CAAA,gDAAA,EAAmD,GAAG,CAAA,CAAE,CAAA;AAAA,IACzF;AAAA,GACF;AACF;AAMO,SAAS,aAAa,GAAA,EAA0B;AACrD,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,8BAAA,EAAiC,GAAG,CAAA,CAAE,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AAClD,EAAA,IAAI,CAAC,cAAA,CAAe,UAAA,CAAW,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,uDAAA,EAA0D,cAAA,CAAe,CAAC,CAAA,IAAK,SAAS,CAAA;AAAA,KAC1F;AAAA,EACF;AAEA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,SAAA,CAAU,OAAO,cAAc,CAAA;AAAA,EAC3C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,iCAAA,EAAoC,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAC5E;AAEA,EAAA,IACE,OAAA,CAAQ,MAAA,GAAS,CAAA,IACjB,OAAA,CAAQ,CAAC,CAAA,KAAM,yBAAA,CAA0B,CAAC,CAAA,IAC1C,OAAA,CAAQ,CAAC,CAAA,KAAM,yBAAA,CAA0B,CAAC,CAAA,EAC1C;AACA,IAAA,MAAM,SAAA,GACJ,OAAA,CAAQ,MAAA,IAAU,CAAA,GACd,CAAA,EAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,GACxF,aAAA;AACN,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,kDAAkD,SAAS,CAAA,oCAAA;AAAA,KAC7D;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AACjC,EAAA,IAAI,SAAA,CAAU,WAAW,EAAA,EAAI;AAC3B,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,iDAAA,EAAoD,SAAA,CAAU,MAAM,CAAA,CAAE,CAAA;AAAA,EAC/F;AAEA,EAAA,MAAM,EAAA,GAAyB;AAAA,IAC7B,EAAA,EAAI,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AAAA;AAAA,IAC5B,OAAA,EAAS,SAAA;AAAA,IACT,cAAA,EAAgB,KAAA,CAAM,IAAA,CAAK,SAAS;AAAA,GACtC;AACA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,GAAA;AAAA,IACJ,mBAAA,EAAqB,CAAC,EAAE;AAAA,GAC1B;AACF;AAMA,eAAe,aAAA,CACb,GAAA,EACA,SAAA,EACA,SAAA,EACsB;AACtB,EAAA,MAAM,cAAA,GAAiB,YAAY,GAAG,CAAA;AACtC,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,kBAAA,CAAmB,gBAAgB,wBAAwB,CAAA;AAAA,EACnE,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,iBAAA,EAAmB;AACtC,MAAA,MAAM,IAAI,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,IAC1C;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AAEA,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAE5D,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,SAAA,CAAU,GAAA,EAAK,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AAAA,EAC/D,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,8BAAA,EAAiC,SAAS,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,IACrF;AACA,IAAA,MAAM,IAAI,iBAAiB,CAAA,sBAAA,EAAyB,GAAG,KAAK,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAC7E,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,IAAA,MAAM,IAAI,WAAA,CAAY,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAE,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,aAAA,EAAgB,SAAS,MAAM,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,EACxE;AAEA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,SAAS,IAAA,EAAK;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,iBAAiB,CAAA,mCAAA,EAAsC,GAAG,KAAK,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAC1F;AACA,EAAA,OAAO,sBAAA,CAAuB,KAAK,GAAG,CAAA;AACxC;AAgBA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AACxC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,yBAAA,EAA4B,GAAG,CAAA,CAAE,CAAA;AAAA,EAC1D;AACA,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,OAAA,KAAY;AAC7C,IAAA,IAAI;AACF,MAAA,OAAO,mBAAmB,OAAO,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,mDAAA,EAAsD,OAAO,CAAA,CAAE,CAAA;AAAA,IACxF;AAAA,EACF,CAAC,CAAA;AACD,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,CAAA,QAAA,EAAW,KAAA,CAAM,CAAC,CAAC,CAAA,qBAAA,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,CAAA,QAAA,EAAW,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,SAAA,CAAA;AACxD;AAaA,SAAS,sBAAA,CAAuB,KAAc,YAAA,EAAmC;AAC/E,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,IAAA,MAAM,IAAI,iBAAiB,CAAA,sCAAA,CAAwC,CAAA;AAAA,EACrE;AACA,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,MAAM,KAAK,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,GAAW,IAAI,EAAA,GAAK,YAAA;AAEjD,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,GAAI,GAAA,CAAI,qBAAqB,EAAC;AACrF,EAAA,MAAM,sBAA4C,EAAC;AACnD,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AACjD,IAAA,MAAM,EAAA,GAAK,KAAA;AACX,IAAA,IAAI,CAAC,aAAA,CAAc,EAAA,CAAG,IAAI,CAAA,EAAG;AAC7B,IAAA,MAAM,OAAO,OAAO,EAAA,CAAG,EAAA,KAAO,QAAA,GAAW,GAAG,EAAA,GAAK,MAAA;AACjD,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,MAAA,GAAS,wBAAwB,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,mBAAA,CAAoB,IAAA,CAAK;AAAA,MACvB,EAAA,EAAI,IAAA;AAAA,MACJ,OAAA,EAAS,SAAA;AAAA,MACT,cAAA,EAAgB,KAAA,CAAM,IAAA,CAAK,MAAM;AAAA,KAClC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,IAAI,mBAAA,EAAoB;AACnC;AAEA,SAAS,cAAc,IAAA,EAAwB;AAC7C,EAAA,OAAO,IAAA,KAAS,gCAAgC,IAAA,KAAS,4BAAA;AAC3D;AASA,SAAS,wBAAwB,EAAA,EAAgD;AAC/E,EAAA,IAAI,OAAO,EAAA,CAAG,kBAAA,KAAuB,QAAA,EAAU;AAC7C,IAAA,MAAM,KAAK,EAAA,CAAG,kBAAA;AACd,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,GAAG,GAAG,OAAO,IAAA;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,EAAE,CAAA;AAGnC,MAAA,IACE,OAAA,CAAQ,MAAA,KAAW,EAAA,IACnB,OAAA,CAAQ,CAAC,CAAA,KAAM,yBAAA,CAA0B,CAAC,CAAA,IAC1C,OAAA,CAAQ,CAAC,CAAA,KAAM,yBAAA,CAA0B,CAAC,CAAA,EAC1C;AACA,QAAA,OAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,MACxB;AAEA,MAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,EAAA,EAAI,OAAO,OAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,EAAA,CAAG,YAAA,IAAgB,OAAO,EAAA,CAAG,iBAAiB,QAAA,EAAU;AAC1D,IAAA,MAAM,MAAM,EAAA,CAAG,YAAA;AACf,IAAA,IAAI,IAAI,GAAA,KAAQ,KAAA,IAAS,GAAA,CAAI,GAAA,KAAQ,WAAW,OAAO,IAAA;AACvD,IAAA,IAAI,OAAO,GAAA,CAAI,CAAA,KAAM,QAAA,EAAU,OAAO,IAAA;AACtC,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAIA,IAAA,IAAI,OAAA,CAAQ,WAAW,yBAAA,EAA2B;AAChD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;ACjUO,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EACtC,IAAA,GAAO,uBAAA;AAClB;AAEO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EACpC,IAAA,GAAO,qBAAA;AAClB;AAEO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EAClC,IAAA,GAAO,mBAAA;AAClB;AA+BA,IAAMA,yBAAAA,GAA2B,GAAA;AACjC,IAAMC,eAAAA,GAAiB,GAAA;AAEhB,SAAS,mBAAA,CAAoB,IAAA,GAA4B,EAAC,EAA2B;AAC1F,EAAA,MAAM,SAAA,GAAY,KAAK,cAAA,IAAkBD,yBAAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAASC,eAAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,KAAK,KAAA,IAAS,KAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,oBAAS,IAAI,GAAA,EAAwB;AACxD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,KAAQ,MAAM,KAAK,GAAA,EAAI,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,MAAM,MAAM,GAAA,EAAgC;AAC1C,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC5B,MAAA,IAAI,MAAA,IAAU,GAAA,EAAI,GAAI,MAAA,CAAO,YAAY,KAAA,EAAO;AAC9C,QAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAChB;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,GAAA,EAAK,WAAW,SAAS,CAAA;AAC9D,MAAA,KAAA,CAAM,IAAI,GAAA,EAAK,EAAE,SAAS,SAAA,EAAW,GAAA,IAAO,CAAA;AAC5C,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,GACF;AACF;AAMA,eAAe,cAAA,CACb,GAAA,EACA,SAAA,EACA,SAAA,EACmB;AACnB,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,kBAAA,CAAmB,KAAK,iBAAiB,CAAA;AAAA,EACrD,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,iBAAA,EAAmB;AACtC,MAAA,MAAM,IAAI,qBAAA,CAAsB,KAAA,CAAM,OAAO,CAAA;AAAA,IAC/C;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AAEA,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAE5D,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,EAAS,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AAAA,EACnE,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,MAAA,MAAM,IAAI,iBAAA,CAAkB,CAAA,kCAAA,EAAqC,SAAS,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,IACxF;AACA,IAAA,MAAM,IAAI,sBAAsB,CAAA,0BAAA,EAA6B,GAAG,KAAK,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EACtF,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AAEA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,qBAAA,CAAsB,CAAA,iBAAA,EAAoB,SAAS,MAAM,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,EACjF;AAEA,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI;AACF,IAAA,EAAA,GAAK,MAAM,SAAS,IAAA,EAAK;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,CAAA,uCAAA,EAA0C,GAAG,CAAA,EAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACjE;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,mBAAmB,EAAE,CAAA;AACrC,EAAA,OAAO,wBAAwB,OAAO,CAAA;AACxC;AAEA,SAAS,mBAAmB,EAAA,EAAqB;AAC/C,EAAA,IAAI,EAAA,KAAO,IAAA,IAAQ,OAAO,EAAA,KAAO,QAAA,EAAU;AACzC,IAAA,MAAM,IAAI,oBAAoB,sCAAsC,CAAA;AAAA,EACtE;AACA,EAAA,MAAM,GAAA,GAAM,EAAA;AACZ,EAAA,MAAM,UAAU,GAAA,CAAI,iBAAA;AACpB,EAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAO,OAAA,KAAY,QAAA,EAAU;AACnD,IAAA,MAAM,IAAI,oBAAoB,0CAA0C,CAAA;AAAA,EAC1E;AACA,EAAA,MAAM,UAAW,OAAA,CAAoC,WAAA;AACrD,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,MAAM,IAAI,oBAAoB,6DAA6D,CAAA;AAAA,EAC7F;AACA,EAAA,OAAO,OAAA;AACT;AAOA,SAAS,wBAAwB,WAAA,EAA+B;AAC9D,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,gBAAgB,WAAW,CAAA;AAC9C,IAAA,KAAA,GAAQ,IAAI,UAAA,CAAW,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,EAC/C,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,mBAAA,CAAoB,CAAA,qCAAA,EAAwC,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EACvF;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,IAAS,YAAY,CAAA,EAAG,SAAA,GAAY,KAAA,CAAM,MAAA,EAAQ,aAAa,CAAA,EAAG;AAChE,IAAA,MAAM,IAAA,GAAO,MAAM,SAAS,CAAA;AAC5B,IAAA,IAAI,SAAS,CAAA,EAAG;AAChB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,EAAG;AACnC,MAAA,MAAM,IAAA,GAAO,KAAM,CAAA,GAAI,GAAA;AACvB,MAAA,IAAA,CAAK,IAAA,GAAO,UAAU,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,GAAY,CAAA,GAAI,GAAG,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;AC7HA,IAAMD,yBAAAA,GAA2B,IAAA;AACjC,IAAMC,eAAAA,GAAiB,GAAA;AACvB,IAAM,gBAAA,GAAmB,CAAA;AAElB,SAAS,oBAAA,CAAqB,IAAA,GAA6B,EAAC,EAA4B;AAC7F,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,EAAA,MAAM,SAAA,GAAY,KAAK,cAAA,IAAkBD,yBAAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAASC,eAAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,KAAK,KAAA,IAAS,KAAA;AAChC,EAAA,MAAM,QAAA,GAAW,KAAK,uBAAA,IAA2B,gBAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,oBAAS,IAAI,GAAA,EAAwB;AACxD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,KAAQ,MAAM,KAAK,GAAA,EAAI,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,KAAW,MAAM;AAAA,EAAC,CAAA,CAAA;AAEnC,EAAA,OAAO;AAAA,IACL,MAAM,MAAM,QAAA,EAAmC;AAC7C,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACjC,MAAA,IAAI,MAAA,IAAU,GAAA,EAAI,GAAI,MAAA,CAAO,YAAY,KAAA,EAAO;AAC9C,QAAA,OAAO,MAAA,CAAO,KAAA;AAAA,MAChB;AAEA,MAAA,IAAI,CAAC,QAAA,EAAU;AAGb,QAAA,OAAO,QAAA;AAAA,MACT;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,gBAAA,CAAiB,QAAA,EAAU,UAAU,SAAA,EAAW,SAAA,EAAW,UAAU,GAAG,CAAA;AAC5F,MAAA,KAAA,CAAM,IAAI,QAAA,EAAU,EAAE,OAAO,SAAA,EAAW,GAAA,IAAO,CAAA;AAC/C,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AACF;AAEA,eAAe,iBACb,QAAA,EACA,QAAA,EACA,SAAA,EACA,SAAA,EACA,UACA,GAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,QAAQ,CAAC,CAAA,CAAA;AAE9F,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAE5D,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,SAAA,CAAU,GAAA,EAAK,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AAAA,EAC/D,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,MAAA,GAAA;AAAA,QACE,CAAA,0CAAA,EAA6C,SAAS,CAAA,IAAA,EAAO,QAAQ,qBAAqB,QAAQ,CAAA;AAAA,OACpG;AAAA,IACF,CAAA,MAAO;AACL,MAAA,GAAA;AAAA,QACE,2CAA2C,QAAQ,CAAA,GAAA,EAAM,OAAO,KAAK,CAAC,oBAAoB,QAAQ,CAAA;AAAA,OACpG;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AAEA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,GAAA;AAAA,MACE,kCAAkC,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,QAAQ,qBAAqB,QAAQ,CAAA;AAAA,KAC7F;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,EAC7B,SAAS,KAAA,EAAO;AACd,IAAA,GAAA;AAAA,MACE,gDAAgD,QAAQ,CAAA,GAAA,EAAM,OAAO,KAAK,CAAC,oBAAoB,QAAQ,CAAA;AAAA,KACzG;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AAC7C,IAAA,GAAA;AAAA,MACE,CAAA,kDAAA,EAAqD,QAAQ,CAAA,kBAAA,EAAqB,QAAQ,CAAA;AAAA,KAC5F;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAS,IAAA,CAAiC,KAAA;AAChD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACxD,IAAA,GAAA;AAAA,MACE,wDAAwD,QAAQ,CAAA,GAAA,EAAM,OAAO,KAAK,CAAC,oBAAoB,QAAQ,CAAA;AAAA,KACjH;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,CAAA,EAAG;AAC1B,IAAA,GAAA;AAAA,MACE,CAAA,8CAAA,EAAiD,QAAQ,CAAA,GAAA,EAAM,KAAK,oBAAoB,QAAQ,CAAA;AAAA,KAClG;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;;;ACxFA,IAAMD,yBAAAA,GAA2B,GAAA;AACjC,IAAMC,eAAAA,GAAiB,GAAA;AAEvB,IAAM,wBAAA,GAAyC,EAAE,mBAAA,EAAqB,CAAA,EAAE;AAEjE,SAAS,mBAAA,CAAoB,IAAA,GAA4B,EAAC,EAA2B;AAC1F,EAAA,MAAM,eAAe,IAAA,CAAK,YAAA;AAC1B,EAAA,MAAM,SAAA,GAAY,KAAK,cAAA,IAAkBD,yBAAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAASC,eAAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,KAAK,KAAA,IAAS,KAAA;AAChC,EAAA,MAAM,cAAA,GAAiB,KAAK,aAAA,IAAiB,wBAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,oBAAS,IAAI,GAAA,EAAwB;AACxD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,KAAQ,MAAM,KAAK,GAAA,EAAI,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,KAAW,MAAM;AAAA,EAAC,CAAA,CAAA;AAEnC,EAAA,OAAO;AAAA,IACL,MAAM,SAAS,KAAA,EAA2C;AACxD,MAAA,MAAM,SAAS,MAAM,gBAAA;AAAA,QACnB,KAAA,CAAM,UAAA;AAAA,QACN,YAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,eAAA,CAAgB,QAAQ,KAAK,CAAA;AAAA,IACtC;AAAA,GACF;AACF;AAMA,SAAS,eAAA,CAAgB,QAAsB,KAAA,EAAkC;AAC/E,EAAA,IAAI,KAAA,CAAM,UAAA,GAAa,MAAA,CAAO,mBAAA,EAAqB;AACjD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,eAAA;AAAA,QACN,OAAO,KAAA,CAAM,UAAA;AAAA,QACb,WAAW,MAAA,CAAO;AAAA;AACpB,KACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;AAMA,eAAe,gBAAA,CACb,YACA,YAAA,EACA,SAAA,EACA,WACA,cAAA,EACA,KAAA,EACA,KAAA,EACA,GAAA,EACA,GAAA,EACuB;AACvB,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AACnC,EAAA,IAAI,MAAA,IAAU,GAAA,EAAI,GAAI,MAAA,CAAO,YAAY,KAAA,EAAO;AAC9C,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB;AAYA,EAAA,MAAM,gBAAgB,MAAoB;AACxC,IAAA,KAAA,CAAM,GAAA,CAAI,YAAY,EAAE,MAAA,EAAQ,gBAAgB,SAAA,EAAW,GAAA,IAAO,CAAA;AAClE,IAAA,OAAO,cAAA;AAAA,EACT,CAAA;AAEA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,aAAA,EAAc;AAAA,EACvB;AAEA,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA;AAClG,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAE5D,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,SAAA,CAAU,GAAA,EAAK,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AAAA,EAC/D,SAAS,KAAA,EAAO;AACd,IAAA,GAAA,CAAI,oCAAoC,UAAU,CAAA,GAAA,EAAM,MAAA,CAAO,KAAK,CAAC,CAAA,gBAAA,CAAkB,CAAA;AACvF,IAAA,OAAO,aAAA,EAAc;AAAA,EACvB,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AAEA,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,GAAA,CAAI,CAAA,kCAAA,EAAqC,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,UAAU,CAAA,iBAAA,CAAmB,CAAA;AAC1F,IAAA,OAAO,aAAA,EAAc;AAAA,EACvB;AAEA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,EAC7B,SAAS,KAAA,EAAO;AACd,IAAA,GAAA;AAAA,MACE,CAAA,gDAAA,EAAmD,UAAU,CAAA,GAAA,EAAM,MAAA,CAAO,KAAK,CAAC,CAAA,gBAAA;AAAA,KAClF;AACA,IAAA,OAAO,aAAA,EAAc;AAAA,EACvB;AAEA,EAAA,MAAM,MAAA,GAAS,kBAAkB,IAAI,CAAA;AACrC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,GAAA,CAAI,CAAA,iDAAA,EAAoD,UAAU,CAAA,iBAAA,CAAmB,CAAA;AACrF,IAAA,OAAO,aAAA,EAAc;AAAA,EACvB;AAEA,EAAA,KAAA,CAAM,GAAA,CAAI,YAAY,EAAE,MAAA,EAAQ,QAAQ,SAAA,EAAW,GAAA,IAAO,CAAA;AAC1D,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAkB,GAAA,EAAmC;AAC5D,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,UAAU,OAAO,IAAA;AACpD,EAAA,MAAM,YAAa,GAAA,CAAgC,mBAAA;AACnD,EAAA,IACE,OAAO,SAAA,KAAc,QAAA,IACrB,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,IAC1B,SAAA,GAAY,CAAA,IACZ,SAAA,GAAY,CAAA,EACZ;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,qBAAqB,SAAA,EAAU;AAC1C;;;AC3MO,SAAS,eAAA,GAAgC;AAC9C,EAAA,OAAO,EAAE,SAAS,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAA,EAAE;AACxD;AAEO,SAAS,eAAe,WAAA,EAAmC;AAChE,EAAA,OAAO,EAAE,OAAA,EAAS,MAAM,WAAA,EAAY;AACtC","file":"adapters.mjs","sourcesContent":["/**\n * Shared egress guard for verifier-owned outbound fetches.\n *\n * MCP-I payloads are attacker controlled until the signature verifies. Any\n * host-side fetch derived from that payload must reject obvious local/private\n * targets before invoking `fetch`.\n */\n\nconst BLOCKED_HOSTNAMES = new Set(['localhost', 'metadata', 'metadata.google.internal']);\n\nexport class UnsafeOutboundUrl extends Error {\n readonly kind = 'UnsafeOutboundUrl';\n}\n\nexport function assertSafeHttpsUrl(rawUrl: string, label = 'outbound URL'): string {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n throw new UnsafeOutboundUrl(`${label} must be a valid URL: ${rawUrl}`);\n }\n\n if (parsed.protocol !== 'https:') {\n throw new UnsafeOutboundUrl(`${label} must use https: ${rawUrl}`);\n }\n if (parsed.username || parsed.password) {\n throw new UnsafeOutboundUrl(`${label} must not contain credentials: ${rawUrl}`);\n }\n\n const hostname = normalizeHostname(parsed.hostname);\n if (!hostname || isBlockedHostname(hostname)) {\n throw new UnsafeOutboundUrl(`${label} targets a local or private host: ${rawUrl}`);\n }\n\n return rawUrl;\n}\n\nfunction normalizeHostname(hostname: string): string {\n let normalized = hostname.trim().toLowerCase();\n if (normalized.startsWith('[') && normalized.endsWith(']')) {\n normalized = normalized.slice(1, -1);\n }\n while (normalized.endsWith('.')) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\n\nfunction isBlockedHostname(hostname: string): boolean {\n if (BLOCKED_HOSTNAMES.has(hostname) || hostname.endsWith('.localhost')) {\n return true;\n }\n\n const ipv4 = parseIpv4(hostname);\n if (ipv4) {\n return isBlockedIpv4(ipv4);\n }\n\n return isBlockedIpv6(hostname);\n}\n\nfunction parseIpv4(hostname: string): [number, number, number, number] | null {\n const parts = hostname.split('.');\n if (parts.length !== 4) return null;\n\n const octets = parts.map((part) => {\n if (!/^\\d{1,3}$/.test(part)) return Number.NaN;\n const value = Number(part);\n return value >= 0 && value <= 255 ? value : Number.NaN;\n });\n\n if (octets.some(Number.isNaN)) return null;\n return octets as [number, number, number, number];\n}\n\nfunction isBlockedIpv4([a, b]: [number, number, number, number]): boolean {\n return (\n a === 0 ||\n a === 10 ||\n a === 127 ||\n (a === 100 && b >= 64 && b <= 127) ||\n (a === 169 && b === 254) ||\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && b === 168) ||\n (a === 198 && (b === 18 || b === 19)) ||\n a >= 224\n );\n}\n\nfunction isBlockedIpv6(hostname: string): boolean {\n if (!hostname.includes(':')) return false;\n\n const ipv4Mapped = hostname.match(/(?:^|:)ffff:(\\d{1,3}(?:\\.\\d{1,3}){3})$/);\n if (ipv4Mapped) {\n const ipv4 = parseIpv4(ipv4Mapped[1]);\n return ipv4 ? isBlockedIpv4(ipv4) : true;\n }\n\n if (hostname === '::' || hostname === '::1' || hostname === '0:0:0:0:0:0:0:1') {\n return true;\n }\n\n const firstSegment = Number.parseInt(hostname.split(':')[0] || '0', 16);\n if (Number.isNaN(firstSegment)) return true;\n\n return (\n (firstSegment & 0xfe00) === 0xfc00 || // unique local fc00::/7\n (firstSegment & 0xffc0) === 0xfe80 || // link-local fe80::/10\n (firstSegment & 0xff00) === 0xff00 // multicast ff00::/8\n );\n}\n","/**\n * Shared utilities for the Phase B adapters.\n *\n * Anything used by more than one adapter belongs here so a future\n * bug fix touches one site, not N.\n */\n\n/**\n * base64url decode without external deps. Pads if necessary,\n * substitutes URL-safe chars, returns the raw bytes as `Uint8Array`.\n * RFC 4648 § 5 — characters `-` and `_` substitute for `+` and `/`;\n * padding `=` is optional and stripped in URL contexts.\n */\nexport function base64UrlDecode(input: string): Uint8Array {\n const padded = input.replace(/-/g, '+').replace(/_/g, '/');\n const padding = padded.length % 4 === 0 ? '' : '='.repeat(4 - (padded.length % 4));\n return new Uint8Array(Buffer.from(padded + padding, 'base64'));\n}\n","/**\n * DidResolver adapter — sub-phase B.1.\n *\n * Resolves `did:key:*` (in-memory multibase decode) and `did:web:*`\n * (HTTPS fetch of `.well-known/did.json`) into the engine's\n * `DidDocument` shape. The async half does any required I/O; the\n * adapter's output is plain data that the host wrapper bundles into\n * `ContextSpec.didDocs` before calling `engineVerify`.\n *\n * Phase 1 supports only Ed25519 verification methods (the engine's\n * `KeyType` is `#[non_exhaustive]` with `Ed25519` as its single\n * variant). Non-Ed25519 methods on a resolved doc are silently\n * filtered out — the engine wouldn't accept them as a valid Stage 2\n * key match anyway.\n *\n * **`kid` for `did:key`**: the verification-method id is\n * `<did>#<multibase>` per mcp-i-core PR #16. **NOT** `<did>#keys-1`.\n * H-1's `stage2_did_key_fragment_resolution` test pins this.\n */\n\nimport { base58btc } from 'multiformats/bases/base58';\n\nimport type { DidDocument, KeyType, VerificationMethod } from '../types';\nimport { assertSafeHttpsUrl, UnsafeOutboundUrl } from './outbound-url-policy';\nimport { base64UrlDecode } from './util';\n\nconst ED25519_PUBLIC_KEY_LENGTH = 32;\n\n// -----------------------------------------------------------------------------\n// Errors — the adapter throws these; the host wrapper translates to verdicts.\n// -----------------------------------------------------------------------------\n\nexport class MalformedDid extends Error {\n readonly kind = 'MalformedDid';\n}\n\nexport class UnsupportedKeyType extends Error {\n readonly kind = 'UnsupportedKeyType';\n}\n\nexport class DidNotFound extends Error {\n readonly kind = 'DidNotFound';\n}\n\nexport class DidResolverTimeout extends Error {\n readonly kind = 'DidResolverTimeout';\n}\n\nexport class DidResolverError extends Error {\n readonly kind = 'DidResolverError';\n}\n\nexport class UnsupportedDidMethod extends Error {\n readonly kind = 'UnsupportedDidMethod';\n}\n\n// -----------------------------------------------------------------------------\n// Public surface — `DidResolverAdapter` is the seam Phase C composes.\n// -----------------------------------------------------------------------------\n\nexport interface DidResolverAdapter {\n resolve(did: string): Promise<DidDocument>;\n}\n\ninterface CacheEntry<T> {\n value: T;\n fetchedAt: number;\n}\n\nexport interface DidResolverOpts {\n /** AbortController timeout for did:web fetches. Default 3000ms. */\n fetchTimeoutMs?: number;\n /** TTL for the in-memory cache. Default 5 minutes. */\n ttlMs?: number;\n /** Injectable fetch — defaults to global `fetch` (Node 18+). */\n fetch?: typeof fetch;\n /**\n * Injectable cache — defaults to a fresh `Map` per adapter instance.\n * Tests pass a shared cache to assert miss/hit behaviour.\n */\n cache?: Map<string, CacheEntry<DidDocument>>;\n /** Injectable wall-clock — defaults to `Date.now()`. Tests use a stub. */\n now?: () => number;\n}\n\nconst ED25519_MULTICODEC_PREFIX = [0xed, 0x01] as const;\nconst DEFAULT_FETCH_TIMEOUT_MS = 3_000;\nconst DEFAULT_TTL_MS = 5 * 60_000;\n\nexport function makeDidResolver(opts: DidResolverOpts = {}): DidResolverAdapter {\n const timeoutMs = opts.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS;\n const ttlMs = opts.ttlMs ?? DEFAULT_TTL_MS;\n const fetchImpl = opts.fetch ?? fetch;\n const cache = opts.cache ?? new Map<string, CacheEntry<DidDocument>>();\n const now = opts.now ?? (() => Date.now());\n\n return {\n async resolve(did: string): Promise<DidDocument> {\n const cached = cache.get(did);\n if (cached && now() - cached.fetchedAt < ttlMs) {\n return cached.value;\n }\n // SSRF defense — Phase 1 supports `did:key` + `did:web` only.\n // The pre-fix code routed every non-`did:key:` input into\n // `resolveDidWeb`, which blindly stripped the first 8 chars\n // and used the remainder as a URL host. `did:ion:abc123` →\n // `https://n:abc123/.well-known/did.json` (probe). An\n // attacker submitting arbitrary DID strings could construct\n // arbitrary HTTPS URLs against the host's network namespace\n // — an SSRF probe surface against internal services.\n // Explicit prefix matching closes the surface.\n if (did.startsWith('did:key:')) {\n const doc = decodeDidKey(did);\n cache.set(did, { value: doc, fetchedAt: now() });\n return doc;\n }\n if (did.startsWith('did:web:')) {\n const doc = await resolveDidWeb(did, fetchImpl, timeoutMs);\n cache.set(did, { value: doc, fetchedAt: now() });\n return doc;\n }\n throw new UnsupportedDidMethod(`Phase 1 supports did:key and did:web only; got: ${did}`);\n },\n };\n}\n\n// -----------------------------------------------------------------------------\n// did:key — in-memory multibase decode.\n// -----------------------------------------------------------------------------\n\nexport function decodeDidKey(did: string): DidDocument {\n if (!did.startsWith('did:key:')) {\n throw new MalformedDid(`expected did:key prefix, got: ${did}`);\n }\n const multibaseValue = did.slice('did:key:'.length);\n if (!multibaseValue.startsWith('z')) {\n throw new MalformedDid(\n `did:key expects base58btc (multibase 'z' prefix); got: ${multibaseValue[0] ?? '<empty>'}`\n );\n }\n\n let decoded: Uint8Array;\n try {\n decoded = base58btc.decode(multibaseValue);\n } catch (cause) {\n throw new MalformedDid(`did:key multibase decode failed: ${String(cause)}`);\n }\n\n if (\n decoded.length < 2 ||\n decoded[0] !== ED25519_MULTICODEC_PREFIX[0] ||\n decoded[1] !== ED25519_MULTICODEC_PREFIX[1]\n ) {\n const prefixHex =\n decoded.length >= 2\n ? `0x${decoded[0].toString(16).padStart(2, '0')}${decoded[1].toString(16).padStart(2, '0')}`\n : '<too short>';\n throw new UnsupportedKeyType(\n `did:key expects Ed25519 multicodec 0xed01; got ${prefixHex} (only Ed25519 supported in Phase 1)`\n );\n }\n\n const publicKey = decoded.slice(2);\n if (publicKey.length !== 32) {\n throw new MalformedDid(`did:key Ed25519 public key must be 32 bytes; got ${publicKey.length}`);\n }\n\n const vm: VerificationMethod = {\n id: `${did}#${multibaseValue}`, // multibase as fragment — mcp-i-core PR #16\n keyType: 'Ed25519' satisfies KeyType,\n publicKeyBytes: Array.from(publicKey),\n };\n return {\n id: did,\n verificationMethods: [vm],\n };\n}\n\n// -----------------------------------------------------------------------------\n// did:web — HTTPS fetch + W3C → engine shape mapping.\n// -----------------------------------------------------------------------------\n\nasync function resolveDidWeb(\n did: string,\n fetchImpl: typeof fetch,\n timeoutMs: number\n): Promise<DidDocument> {\n const transformedUrl = didWebToUrl(did);\n let url: string;\n try {\n url = assertSafeHttpsUrl(transformedUrl, 'did:web resolution URL');\n } catch (cause) {\n if (cause instanceof UnsafeOutboundUrl) {\n throw new DidResolverError(cause.message);\n }\n throw cause;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetchImpl(url, { signal: controller.signal });\n } catch (cause) {\n if (cause instanceof Error && cause.name === 'AbortError') {\n throw new DidResolverTimeout(`did:web fetch timed out after ${timeoutMs}ms: ${url}`);\n }\n throw new DidResolverError(`did:web fetch failed: ${url}: ${String(cause)}`);\n } finally {\n clearTimeout(timer);\n }\n\n if (response.status === 404) {\n throw new DidNotFound(`no DID document at ${url}`);\n }\n if (!response.ok) {\n throw new DidResolverError(`did:web HTTP ${response.status} at ${url}`);\n }\n\n let raw: unknown;\n try {\n raw = await response.json();\n } catch (cause) {\n throw new DidResolverError(`did:web response not valid JSON at ${url}: ${String(cause)}`);\n }\n return mapW3CDocToEngineShape(raw, did);\n}\n\n/**\n * `did:web:example.com` → `https://example.com/.well-known/did.json`.\n * `did:web:example.com:user:alice` → `https://example.com/user/alice/did.json`.\n * `did:web:localhost%3A8080` transforms to\n * `https://localhost:8080/.well-known/did.json`, then the egress guard rejects\n * it before fetch because localhost/private targets are never safe verifier I/O.\n *\n * Per W3C did-method-web § 3.2 \"DID-to-HTTPS Transformation\": split on\n * `:`, then `decodeURIComponent` each segment so percent-encoded\n * characters (ports, paths-with-colons, etc.) are unescaped before\n * URL construction. Bugbot caught the missing decode pass on the\n * initial B.1 drop — without it, `did:web:host%3Aport` resolved to\n * `https://host%3Aport/...` which never reaches the right server.\n */\nfunction didWebToUrl(did: string): string {\n const path = did.slice('did:web:'.length);\n if (!path) {\n throw new MalformedDid(`did:web with empty path: ${did}`);\n }\n const parts = path.split(':').map((segment) => {\n try {\n return decodeURIComponent(segment);\n } catch {\n throw new MalformedDid(`did:web segment contains invalid percent-encoding: ${segment}`);\n }\n });\n if (parts.length === 1) {\n return `https://${parts[0]}/.well-known/did.json`;\n }\n return `https://${parts[0]}/${parts.slice(1).join('/')}/did.json`;\n}\n\n/**\n * Convert a W3C DID Core JSON document into the engine's shape.\n *\n * Phase 1 only accepts Ed25519 verification methods — the engine's\n * `KeyType::Ed25519` is the only currently-supported variant. Non-\n * Ed25519 methods are silently filtered (the engine wouldn't accept\n * them as a valid Stage 2 `kid` match).\n *\n * W3C uses `verificationMethod` (singular array name); the engine\n * uses `verificationMethods` (plural) — the rename happens here.\n */\nfunction mapW3CDocToEngineShape(raw: unknown, requestedDid: string): DidDocument {\n if (raw === null || typeof raw !== 'object') {\n throw new DidResolverError(`did:web response must be a JSON object`);\n }\n const doc = raw as Record<string, unknown>;\n const id = typeof doc.id === 'string' ? doc.id : requestedDid;\n\n const w3cMethods = Array.isArray(doc.verificationMethod) ? doc.verificationMethod : [];\n const verificationMethods: VerificationMethod[] = [];\n for (const entry of w3cMethods) {\n if (entry === null || typeof entry !== 'object') continue;\n const vm = entry as Record<string, unknown>;\n if (!isEd25519Type(vm.type)) continue;\n const vmId = typeof vm.id === 'string' ? vm.id : undefined;\n if (!vmId) continue;\n const pubKey = extractEd25519PublicKey(vm);\n if (!pubKey) continue;\n verificationMethods.push({\n id: vmId,\n keyType: 'Ed25519',\n publicKeyBytes: Array.from(pubKey),\n });\n }\n\n return { id, verificationMethods };\n}\n\nfunction isEd25519Type(type: unknown): boolean {\n return type === 'Ed25519VerificationKey2020' || type === 'Ed25519VerificationKey2018';\n}\n\n/**\n * Extract the 32-byte Ed25519 public key from a W3C verificationMethod\n * entry. Accepts either `publicKeyMultibase` (Ed25519VerificationKey2020)\n * or `publicKeyJwk` with `kty: OKP, crv: Ed25519, x: <base64url>`.\n *\n * Returns `null` if extraction fails; the caller drops the method.\n */\nfunction extractEd25519PublicKey(vm: Record<string, unknown>): Uint8Array | null {\n if (typeof vm.publicKeyMultibase === 'string') {\n const mb = vm.publicKeyMultibase;\n if (!mb.startsWith('z')) return null;\n try {\n const decoded = base58btc.decode(mb);\n // `publicKeyMultibase` on Ed25519VerificationKey2020 is prefixed\n // with the same `0xed01` multicodec as `did:key`. Strip it.\n if (\n decoded.length === 34 &&\n decoded[0] === ED25519_MULTICODEC_PREFIX[0] &&\n decoded[1] === ED25519_MULTICODEC_PREFIX[1]\n ) {\n return decoded.slice(2);\n }\n // Some legacy docs emit the raw 32 bytes without the multicodec.\n if (decoded.length === 32) return decoded;\n } catch {\n return null;\n }\n return null;\n }\n if (vm.publicKeyJwk && typeof vm.publicKeyJwk === 'object') {\n const jwk = vm.publicKeyJwk as Record<string, unknown>;\n if (jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519') return null;\n if (typeof jwk.x !== 'string') return null;\n let decoded: Uint8Array;\n try {\n decoded = base64UrlDecode(jwk.x);\n } catch {\n return null;\n }\n // Ed25519 public keys are exactly 32 bytes. A JWK with a\n // shorter or longer `x` is malformed; dropping the method is\n // safer than smuggling an invalid key into the WASM engine.\n if (decoded.length !== ED25519_PUBLIC_KEY_LENGTH) {\n return null;\n }\n return decoded;\n }\n return null;\n}\n","/**\n * StatusListCache adapter — sub-phase B.2.\n *\n * Fetches a W3C StatusList2021 Verifiable Credential, base64url-decodes\n * + gunzips the encoded bitstring, and enumerates set bits as a sorted\n * list of revoked indices. Phase C bundles the output as\n * `ContextSpec.revoked: Record<url, number[]>`; the engine's\n * `MapStatusListCache::is_revoked(url, index)` (in `wasm.rs`) checks\n * `indices.contains(&index)` to make a Stage 3 contribution.\n *\n * Architectural choice (deviation from kickoff § 5 B.2): the kickoff\n * sketched a contract where the WASM side does the bit-level lookup\n * on raw bytes. Phase A's `wasm.rs` already shipped with the simpler\n * `Vec<u64>`-of-indices shape, and § 4.1 of Phase B's mandate is\n * \"TS-only.\" The adapter does the bitstring decode + bit enumeration\n * on the TS side; the engine stays unchanged.\n *\n * Bit convention: W3C VC Status List § \"Bitstring expansion algorithm\"\n * — index N is bit `7 - (N % 8)` of byte `floor(N / 8)`, MSB-first.\n */\n\nimport { gunzipSync } from 'node:zlib';\n\nimport { assertSafeHttpsUrl, UnsafeOutboundUrl } from './outbound-url-policy';\nimport { base64UrlDecode } from './util';\n\n// -----------------------------------------------------------------------------\n// Errors.\n// -----------------------------------------------------------------------------\n\nexport class StatusListUnavailable extends Error {\n readonly kind = 'StatusListUnavailable';\n}\n\nexport class MalformedStatusList extends Error {\n readonly kind = 'MalformedStatusList';\n}\n\nexport class StatusListTimeout extends Error {\n readonly kind = 'StatusListTimeout';\n}\n\n// -----------------------------------------------------------------------------\n// Public surface.\n// -----------------------------------------------------------------------------\n\nexport interface StatusListCacheAdapter {\n /**\n * Fetch the status list at `url`, decode it, and return the sorted\n * set of revoked credential indices.\n *\n * @throws {StatusListUnavailable} on transport / non-2xx response.\n * @throws {StatusListTimeout} when the fetch budget is exceeded.\n * @throws {MalformedStatusList} when the VC is unparseable.\n */\n fetch(url: string): Promise<number[]>;\n}\n\ninterface CacheEntry {\n indices: number[];\n fetchedAt: number;\n}\n\nexport interface StatusListCacheOpts {\n fetchTimeoutMs?: number;\n ttlMs?: number;\n fetch?: typeof fetch;\n cache?: Map<string, CacheEntry>;\n now?: () => number;\n}\n\nconst DEFAULT_FETCH_TIMEOUT_MS = 3_000;\nconst DEFAULT_TTL_MS = 30_000;\n\nexport function makeStatusListCache(opts: StatusListCacheOpts = {}): StatusListCacheAdapter {\n const timeoutMs = opts.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS;\n const ttlMs = opts.ttlMs ?? DEFAULT_TTL_MS;\n const fetchImpl = opts.fetch ?? fetch;\n const cache = opts.cache ?? new Map<string, CacheEntry>();\n const now = opts.now ?? (() => Date.now());\n\n return {\n async fetch(url: string): Promise<number[]> {\n const cached = cache.get(url);\n if (cached && now() - cached.fetchedAt < ttlMs) {\n return cached.indices;\n }\n const indices = await fetchAndDecode(url, fetchImpl, timeoutMs);\n cache.set(url, { indices, fetchedAt: now() });\n return indices;\n },\n };\n}\n\n// -----------------------------------------------------------------------------\n// Decode pipeline — fetch → JSON → base64url → gunzip → enumerate.\n// -----------------------------------------------------------------------------\n\nasync function fetchAndDecode(\n url: string,\n fetchImpl: typeof fetch,\n timeoutMs: number\n): Promise<number[]> {\n let safeUrl: string;\n try {\n safeUrl = assertSafeHttpsUrl(url, 'status list URL');\n } catch (cause) {\n if (cause instanceof UnsafeOutboundUrl) {\n throw new StatusListUnavailable(cause.message);\n }\n throw cause;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetchImpl(safeUrl, { signal: controller.signal });\n } catch (cause) {\n if (cause instanceof Error && cause.name === 'AbortError') {\n throw new StatusListTimeout(`status list fetch timed out after ${timeoutMs}ms: ${url}`);\n }\n throw new StatusListUnavailable(`status list fetch failed: ${url}: ${String(cause)}`);\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n throw new StatusListUnavailable(`status list HTTP ${response.status} at ${url}`);\n }\n\n let vc: unknown;\n try {\n vc = await response.json();\n } catch (cause) {\n throw new MalformedStatusList(\n `status list response not valid JSON at ${url}: ${String(cause)}`\n );\n }\n\n const encoded = extractEncodedList(vc);\n return enumerateRevokedIndices(encoded);\n}\n\nfunction extractEncodedList(vc: unknown): string {\n if (vc === null || typeof vc !== 'object') {\n throw new MalformedStatusList('status list VC must be a JSON object');\n }\n const obj = vc as Record<string, unknown>;\n const subject = obj.credentialSubject;\n if (subject === null || typeof subject !== 'object') {\n throw new MalformedStatusList('status list VC missing credentialSubject');\n }\n const encoded = (subject as Record<string, unknown>).encodedList;\n if (typeof encoded !== 'string') {\n throw new MalformedStatusList('status list VC missing credentialSubject.encodedList string');\n }\n return encoded;\n}\n\n/**\n * Walk every byte of the decoded bitstring. For each set bit, push the\n * logical index into the result. W3C VC Status List spec: index N is\n * bit `7 - (N % 8)` of byte `floor(N / 8)`, MSB-first.\n */\nfunction enumerateRevokedIndices(encodedList: string): number[] {\n let bytes: Uint8Array;\n try {\n const compressed = base64UrlDecode(encodedList);\n bytes = new Uint8Array(gunzipSync(compressed));\n } catch (cause) {\n throw new MalformedStatusList(`status list bitstring decode failed: ${String(cause)}`);\n }\n\n const indices: number[] = [];\n for (let byteIndex = 0; byteIndex < bytes.length; byteIndex += 1) {\n const byte = bytes[byteIndex];\n if (byte === 0) continue; // fast path — typical bitstring is mostly zeros\n for (let bit = 0; bit < 8; bit += 1) {\n const mask = 1 << (7 - bit); // MSB-first per W3C\n if ((byte & mask) !== 0) {\n indices.push(byteIndex * 8 + bit);\n }\n }\n }\n return indices;\n}\n","/**\n * ReputationOracle adapter — sub-phase B.3.\n *\n * Resolves a per-DID reputation score in `[0.0, 1.0]`. Phase 1 wires\n * an optional HTTP endpoint (Argus). Unavailable / misconfigured /\n * out-of-range responses degrade to a baseline score so infrastructure\n * blips can't silently DOS Adobe-class traffic. The engine's Stage 6\n * compares the returned score against the tenant-configured threshold\n * (Phase B.4 builds the threshold via `PolicyEvaluator`).\n *\n * **Degrade-to-trust** (Phase B § 4.5). Reputation is best-effort;\n * Argus outages do not block traffic. The adapter returns the\n * configured baseline (default 1.0 = \"no signal, treat as trusted\")\n * and logs loudly. The engine's `LowReputation` block fires only\n * when score < threshold from tenant policy; baseline-1.0 ensures\n * no traffic is silently rejected just because Argus went down.\n */\n\n// -----------------------------------------------------------------------------\n// Public surface.\n// -----------------------------------------------------------------------------\n\nexport interface ReputationOracleAdapter {\n /**\n * Return the agent's reputation in `[0.0, 1.0]`. Higher is better.\n *\n * **Does not throw.** Network / parse / range failures degrade to\n * the baseline + log; the engine should never see a thrown error\n * from this adapter.\n */\n score(agentDid: string): Promise<number>;\n}\n\ninterface CacheEntry {\n value: number;\n fetchedAt: number;\n}\n\nexport interface ReputationOracleOpts {\n /**\n * Base URL for the reputation service (Argus). When unset, the\n * adapter returns the baseline without fetching. Phase 1 only —\n * Argus's HTTP surface is post-Adobe; until it lands, every host\n * runs in degrade-to-trust mode.\n */\n argusUrl?: string;\n /** Fetch budget. Default 1500ms — reputation is best-effort, tighter than DID resolution. */\n fetchTimeoutMs?: number;\n /** Cache TTL. Default 10s — reputation churns faster than DIDs. */\n ttlMs?: number;\n /** Injectable fetch. Defaults to global `fetch`. */\n fetch?: typeof fetch;\n /** Returned when Argus is unset / unreachable / malformed. Default 1.0. */\n baselineWhenUnreachable?: number;\n /** Injectable cache for tests. */\n cache?: Map<string, CacheEntry>;\n /** Injectable wall-clock. */\n now?: () => number;\n /** Hook for diagnostics. Phase 1 keeps log volume manageable by sampling. */\n logger?: (msg: string) => void;\n}\n\nconst DEFAULT_FETCH_TIMEOUT_MS = 1_500;\nconst DEFAULT_TTL_MS = 10_000;\nconst DEFAULT_BASELINE = 1.0;\n\nexport function makeReputationOracle(opts: ReputationOracleOpts = {}): ReputationOracleAdapter {\n const argusUrl = opts.argusUrl;\n const timeoutMs = opts.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS;\n const ttlMs = opts.ttlMs ?? DEFAULT_TTL_MS;\n const fetchImpl = opts.fetch ?? fetch;\n const baseline = opts.baselineWhenUnreachable ?? DEFAULT_BASELINE;\n const cache = opts.cache ?? new Map<string, CacheEntry>();\n const now = opts.now ?? (() => Date.now());\n const log = opts.logger ?? (() => {});\n\n return {\n async score(agentDid: string): Promise<number> {\n const cached = cache.get(agentDid);\n if (cached && now() - cached.fetchedAt < ttlMs) {\n return cached.value;\n }\n\n if (!argusUrl) {\n // No Argus configured — degrade-to-trust silently (the host\n // logs the config gap once at startup, not per-request).\n return baseline;\n }\n\n const value = await fetchAndValidate(argusUrl, agentDid, fetchImpl, timeoutMs, baseline, log);\n cache.set(agentDid, { value, fetchedAt: now() });\n return value;\n },\n };\n}\n\nasync function fetchAndValidate(\n argusUrl: string,\n agentDid: string,\n fetchImpl: typeof fetch,\n timeoutMs: number,\n baseline: number,\n log: (msg: string) => void\n): Promise<number> {\n const url = `${argusUrl.replace(/\\/$/, '')}/v1/reputation?agent=${encodeURIComponent(agentDid)}`;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetchImpl(url, { signal: controller.signal });\n } catch (cause) {\n if (cause instanceof Error && cause.name === 'AbortError') {\n log(\n `[reputation-oracle] Argus timed out after ${timeoutMs}ms (${agentDid}); using baseline ${baseline}`\n );\n } else {\n log(\n `[reputation-oracle] Argus fetch failed (${agentDid}): ${String(cause)}; using baseline ${baseline}`\n );\n }\n return baseline;\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n log(\n `[reputation-oracle] Argus HTTP ${response.status} (${agentDid}); using baseline ${baseline}`\n );\n return baseline;\n }\n\n let body: unknown;\n try {\n body = await response.json();\n } catch (cause) {\n log(\n `[reputation-oracle] Argus response not JSON (${agentDid}): ${String(cause)}; using baseline ${baseline}`\n );\n return baseline;\n }\n\n if (body === null || typeof body !== 'object') {\n log(\n `[reputation-oracle] Argus response not an object (${agentDid}); using baseline ${baseline}`\n );\n return baseline;\n }\n const score = (body as Record<string, unknown>).score;\n if (typeof score !== 'number' || !Number.isFinite(score)) {\n log(\n `[reputation-oracle] Argus score not a finite number (${agentDid}): ${String(score)}; using baseline ${baseline}`\n );\n return baseline;\n }\n if (score < 0 || score > 1) {\n log(\n `[reputation-oracle] Argus score out of range (${agentDid}): ${score}; using baseline ${baseline}`\n );\n return baseline;\n }\n return score;\n}\n","/**\n * PolicyEvaluator adapter — sub-phase B.4.\n *\n * Computes the **tenant verdict** on the JS side and hands the engine\n * a constant `Decision` for the WASM `WasmConstantPolicy` to echo as\n * Stage 7's contribution. The engine's cross-stage priority order\n * (locked in D-design § 6 row 4) handles how Stage 7 interacts with\n * Stages 2 / 3 / 4 / 5.\n *\n * **Sync-engine / async-host invariant.** The JS adapter is async (it\n * fetches tenant policy from the Checkpoint dashboard); the engine\n * sees only the resolved `Decision`. Cedar-1 will replace this\n * adapter's implementation without touching the surrounding orchestrator.\n *\n * **Cedar-1 forward-compat.** [`PolicyEvaluatorAdapter`] is the\n * Cedar-swappable interface: `(input) → Decision`. The Phase 1 stub\n * is a reputation-threshold check; Cedar-1 will replace the\n * implementation, not the surface. Don't bake Cedar internals into\n * this seam.\n *\n * **Degrade-to-permit.** Per Phase B § 4.5: when the dashboard policy\n * endpoint is unreachable, fall back to `defaultPolicy` (caller-supplied)\n * or `permit-by-default`. Loud log; no silent block.\n */\n\nimport type { Decision } from '../types';\n\n// -----------------------------------------------------------------------------\n// Public surface — the Cedar-swappable seam.\n// -----------------------------------------------------------------------------\n\n/**\n * Pre-fetched inputs the JS host knows before calling the engine.\n * Phase 1's evaluator only consumes `reputation` + `tenantHost`; later\n * implementations (Cedar-1) may extend.\n */\nexport interface PolicyEvalInput {\n tenantHost: string;\n reputation: number;\n // Layer 2 may add: classification, requestShape, agentDid, etc.\n}\n\nexport interface PolicyEvaluatorAdapter {\n evaluate(input: PolicyEvalInput): Promise<Decision>;\n}\n\n/**\n * Phase 1 tenant-policy shape — just a reputation threshold.\n * Cedar-1 replaces this with a full policy bundle; for now the\n * dashboard exposes one field.\n */\nexport interface TenantPolicy {\n reputationThreshold: number;\n}\n\nexport interface PolicyEvaluatorOpts {\n /**\n * Dashboard policy endpoint. When unset, every tenant resolves to\n * `defaultPolicy` (or permit-by-default if that's also unset).\n */\n dashboardUrl?: string;\n fetchTimeoutMs?: number;\n ttlMs?: number;\n fetch?: typeof fetch;\n /** Used when the dashboard endpoint is unreachable or unconfigured. */\n defaultPolicy?: TenantPolicy;\n cache?: Map<string, CacheEntry>;\n now?: () => number;\n logger?: (msg: string) => void;\n}\n\ninterface CacheEntry {\n policy: TenantPolicy;\n fetchedAt: number;\n}\n\nconst DEFAULT_FETCH_TIMEOUT_MS = 2_000;\nconst DEFAULT_TTL_MS = 60_000;\n/** Permit-by-default — threshold 0 means no reputation gate fires. */\nconst PERMIT_BY_DEFAULT_POLICY: TenantPolicy = { reputationThreshold: 0 };\n\nexport function makePolicyEvaluator(opts: PolicyEvaluatorOpts = {}): PolicyEvaluatorAdapter {\n const dashboardUrl = opts.dashboardUrl;\n const timeoutMs = opts.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS;\n const ttlMs = opts.ttlMs ?? DEFAULT_TTL_MS;\n const fetchImpl = opts.fetch ?? fetch;\n const fallbackPolicy = opts.defaultPolicy ?? PERMIT_BY_DEFAULT_POLICY;\n const cache = opts.cache ?? new Map<string, CacheEntry>();\n const now = opts.now ?? (() => Date.now());\n const log = opts.logger ?? (() => {});\n\n return {\n async evaluate(input: PolicyEvalInput): Promise<Decision> {\n const policy = await getOrFetchPolicy(\n input.tenantHost,\n dashboardUrl,\n fetchImpl,\n timeoutMs,\n fallbackPolicy,\n cache,\n ttlMs,\n now,\n log\n );\n return computeDecision(policy, input);\n },\n };\n}\n\n// -----------------------------------------------------------------------------\n// JS-side Decision computation — the Cedar-1 replaceable body.\n// -----------------------------------------------------------------------------\n\nfunction computeDecision(policy: TenantPolicy, input: PolicyEvalInput): Decision {\n if (input.reputation < policy.reputationThreshold) {\n return {\n kind: 'Block',\n reason: {\n kind: 'LowReputation',\n score: input.reputation,\n threshold: policy.reputationThreshold,\n },\n };\n }\n return { kind: 'Permit' };\n}\n\n// -----------------------------------------------------------------------------\n// Policy fetch + cache.\n// -----------------------------------------------------------------------------\n\nasync function getOrFetchPolicy(\n tenantHost: string,\n dashboardUrl: string | undefined,\n fetchImpl: typeof fetch,\n timeoutMs: number,\n fallbackPolicy: TenantPolicy,\n cache: Map<string, CacheEntry>,\n ttlMs: number,\n now: () => number,\n log: (msg: string) => void\n): Promise<TenantPolicy> {\n const cached = cache.get(tenantHost);\n if (cached && now() - cached.fetchedAt < ttlMs) {\n return cached.policy;\n }\n\n // Thundering-herd defense — every degraded path writes the fallback\n // back to the cache. Pre-fix, a dashboard outage meant every\n // request re-attempted the failing fetch and ate up to\n // `fetchTimeoutMs` (2s default). Architect flagged the symmetry\n // gap against ReputationOracle (which caches degraded baselines).\n //\n // When the dashboard recovers, the cached fallback stays in\n // effect until `ttlMs` expires — bounded staleness, acceptable\n // for Phase 1. Negative-TTL knobs (retry sooner on degrade)\n // land as a follow-up if production telemetry justifies them.\n const cacheFallback = (): TenantPolicy => {\n cache.set(tenantHost, { policy: fallbackPolicy, fetchedAt: now() });\n return fallbackPolicy;\n };\n\n if (!dashboardUrl) {\n return cacheFallback();\n }\n\n const url = `${dashboardUrl.replace(/\\/$/, '')}/api/policy?tenant=${encodeURIComponent(tenantHost)}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n let response: Response;\n try {\n response = await fetchImpl(url, { signal: controller.signal });\n } catch (cause) {\n log(`[policy-evaluator] fetch failed (${tenantHost}): ${String(cause)}; using fallback`);\n return cacheFallback();\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n log(`[policy-evaluator] dashboard HTTP ${response.status} (${tenantHost}); using fallback`);\n return cacheFallback();\n }\n\n let body: unknown;\n try {\n body = await response.json();\n } catch (cause) {\n log(\n `[policy-evaluator] dashboard response not JSON (${tenantHost}): ${String(cause)}; using fallback`\n );\n return cacheFallback();\n }\n\n const parsed = parseTenantPolicy(body);\n if (!parsed) {\n log(`[policy-evaluator] dashboard response malformed (${tenantHost}); using fallback`);\n return cacheFallback();\n }\n\n cache.set(tenantHost, { policy: parsed, fetchedAt: now() });\n return parsed;\n}\n\nfunction parseTenantPolicy(raw: unknown): TenantPolicy | null {\n if (raw === null || typeof raw !== 'object') return null;\n const threshold = (raw as Record<string, unknown>).reputationThreshold;\n if (\n typeof threshold !== 'number' ||\n !Number.isFinite(threshold) ||\n threshold < 0 ||\n threshold > 1\n ) {\n return null;\n }\n return { reputationThreshold: threshold };\n}\n","/**\n * Clock adapter — sub-phase B.5.\n *\n * Provides the Unix-seconds timestamp the engine's `Clock` trait needs\n * for Stage 4 expiration checks. Trivial; the trait shape exists so\n * tests can inject a frozen clock (and so the engine's sync-trait\n * surface is satisfied without a JS callback crossing the WASM\n * boundary — `ContextSpec.nowUnix` carries the value).\n */\n\nexport interface ClockAdapter {\n nowUnix(): number;\n}\n\nexport function makeSystemClock(): ClockAdapter {\n return { nowUnix: () => Math.floor(Date.now() / 1000) };\n}\n\nexport function makeFixedClock(unixSeconds: number): ClockAdapter {\n return { nowUnix: () => unixSeconds };\n}\n"]}
|
package/dist/edge.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/wasm-detector.ts","../src/wasm-bindgen/agentshield_wasm.js","../src/loaders/static-loader.ts","../src/policy/policy-loader.ts","../src/fallback/rules-detector.ts","../src/edge.ts"],"names":["version","ptr","loadRulesSync"],"mappings":"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","file":"edge.js","sourcesContent":["/**\n * AgentShield WASM Runtime Types\n *\n * Core interfaces following SOLID principles:\n * - Interface Segregation: Small, focused interfaces\n * - Dependency Inversion: Depend on abstractions\n */\n\n/**\n * Detection input - information about the request to analyze\n */\nexport interface IDetectionInput {\n /** User-Agent header value */\n userAgent?: string;\n /** Client IP address */\n ipAddress?: string;\n /** All request headers */\n headers: Record<string, string>;\n /** Request URL path */\n url?: string;\n /** HTTP method (GET, POST, etc.) */\n method?: string;\n /** Client fingerprint data (for browser detection) */\n clientFingerprint?: string;\n /** Request timestamp */\n timestamp?: Date;\n}\n\n/**\n * Verification method used to detect the agent\n */\nexport type VerificationMethod =\n | 'signature' // Cryptographic signature verification (highest confidence)\n | 'pattern' // User-agent or header pattern matching\n | 'behavioral' // Behavioral analysis\n | 'network' // Network/IP-based detection\n | 'mcp_i_handshake' // MCP-I protocol handshake\n | 'none'; // No verification method\n\n/**\n * Detection class - categorization of the detected entity\n */\nexport type DetectionClass =\n | { type: 'Human' }\n | { type: 'AiAgent'; agentType: string }\n | { type: 'Bot'; botType?: string }\n | { type: 'Automation'; toolType?: string }\n | { type: 'Unknown' };\n\n/**\n * Forgeability risk level\n * How easy it is to spoof the detection signals\n */\nexport type ForgeabilityRisk = 'low' | 'medium' | 'high';\n\n/**\n * Detected agent information\n */\nexport interface IDetectedAgent {\n /** Agent type identifier (e.g., 'openai', 'anthropic') */\n type: string;\n /** Human-readable agent name (e.g., 'ChatGPT', 'Claude') */\n name: string;\n /** Vendor/company name */\n vendor?: string;\n /** Model identifier if known */\n model?: string;\n /** Version if known */\n version?: string;\n}\n\n/**\n * Detection result - output from the detection engine\n * Confidence is ALWAYS on 0-100 scale\n */\nexport interface IDetectionResult {\n /** Whether the request was identified as coming from an agent */\n isAgent: boolean;\n /** Confidence score on 0-100 scale (NOT 0-1) */\n confidence: number;\n /** Detection classification */\n detectionClass: DetectionClass;\n /** Detected agent details if identified */\n detectedAgent?: IDetectedAgent;\n /** Method used for verification */\n verificationMethod: VerificationMethod;\n /** Risk level of signal forgeability */\n forgeabilityRisk: ForgeabilityRisk;\n /** Reasons/signals that contributed to detection */\n reasons: string[];\n /** Detection timestamp */\n timestamp: Date;\n /** Whether the request should be blocked (set by policy) */\n shouldBlock?: boolean;\n /** Reason for blocking (set by policy) */\n blockReason?: string;\n}\n\n/**\n * WASM bindings interface - functions exposed by the WASM module\n */\nexport interface IWasmBindings {\n /** Detect an agent from request metadata */\n detect_agent(metadata: IWasmRequestMetadata): IWasmDetectionResult;\n /** Get WASM module version */\n get_version(): string;\n /** Get build information */\n get_build_info(): string;\n}\n\n/**\n * WASM request metadata - input to WASM detect_agent function\n */\nexport interface IWasmRequestMetadata {\n user_agent: string | null;\n ip_address: string | null;\n headers: string; // JSON string\n timestamp: string; // ISO 8601\n url: string | null;\n method: string | null;\n client_fingerprint: string | null;\n free(): void;\n}\n\n/**\n * WASM detection result - output from WASM detect_agent function\n */\nexport interface IWasmDetectionResult {\n is_agent: boolean;\n confidence: number; // 0-100 scale (converted at WASM boundary)\n agent: string | null;\n verification_method: string;\n risk_level: string;\n timestamp: string;\n}\n\n/**\n * WASM loader interface - abstracts WASM loading strategy\n */\nexport interface IWasmLoader {\n /** Load the WASM module */\n load(): Promise<void>;\n /** Get the WASM bindings after loading */\n getBindings(): IWasmBindings;\n /** Check if WASM is loaded */\n isLoaded(): boolean;\n /** Get the loading strategy name */\n getStrategy(): string;\n}\n\n/**\n * Agent detector interface - main detection API\n */\nexport interface IDetector {\n /** Analyze a request and detect if it's from an agent */\n detect(input: IDetectionInput): Promise<IDetectionResult>;\n /** Check if the detector is ready */\n isReady(): boolean;\n /** Ensure the detector is initialized */\n ensureReady(): Promise<void>;\n /** Get detector version */\n getVersion(): Promise<string>;\n}\n\n/**\n * Customer policy - rules for agent handling\n */\nexport interface ICustomerPolicy {\n /** Project ID */\n projectId: string;\n /** Agents to always block */\n denyList?: string[];\n /** Agents to always allow (if set, blocks all others) */\n allowList?: string[];\n /** Minimum confidence to trigger blocking */\n blockThreshold?: number;\n /** Path-based rules */\n pathRules?: IPathRule[];\n /** Policy version for cache invalidation */\n version?: string;\n /** Last updated timestamp */\n updatedAt?: Date;\n}\n\n/**\n * Path-based rule for policy\n */\nexport interface IPathRule {\n /** Path pattern (glob or regex) */\n pattern: string;\n /** Action for matching paths */\n action: 'allow' | 'block' | 'challenge';\n /** Specific agents this rule applies to */\n agents?: string[];\n}\n\n/**\n * Policy loader interface - loads customer policies\n */\nexport interface IPolicyLoader {\n /** Load policy for an API key */\n loadPolicy(apiKey: string): Promise<ICustomerPolicy>;\n /** Get cached policy if available */\n getCachedPolicy(apiKey: string): ICustomerPolicy | null;\n /** Invalidate cached policy */\n invalidateCache(apiKey: string): void;\n}\n\n/**\n * Detector configuration options\n */\nexport interface IDetectorOptions {\n /** API key for loading customer policies */\n apiKey?: string;\n /** Custom WASM loader (for Edge Runtime static imports) */\n wasmLoader?: IWasmLoader;\n /** Whether to fall back to JavaScript if WASM fails */\n fallbackToJS?: boolean;\n /** Whether to cache policies */\n cachePolicy?: boolean;\n /** Policy cache TTL in milliseconds */\n policyTTL?: number;\n /** Base URL for policy API */\n policyApiUrl?: string;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Confidence thresholds - centralized constants\n */\nexport const CONFIDENCE = {\n /** Minimum confidence for isAgent=true */\n THRESHOLD_AGENT: 30,\n /** Cryptographic signature verified */\n SIGNATURE_VERIFIED: 100,\n /** Signature header present but not verified */\n SIGNATURE_PRESENT: 85,\n /** Strong pattern match */\n PATTERN_HIGH: 85,\n /** Moderate pattern match */\n PATTERN_MEDIUM: 60,\n /** Weak pattern match */\n PATTERN_LOW: 40,\n /** Cloud IP detection only */\n CLOUD_IP: 30,\n} as const;\n","/**\n * Unified WASM Detector\n *\n * Single implementation of the AgentShield detection engine used by all packages.\n * Follows the Single Responsibility Principle: this class only handles detection.\n *\n * Key design decisions:\n * - Confidence is ALWAYS on 0-100 scale (no conversions needed)\n * - WASM output is used directly (no post-processing adjustments)\n * - Policy application is optional and happens after detection\n */\n\nimport type {\n IDetector,\n IDetectionInput,\n IDetectionResult,\n IWasmLoader,\n IWasmRequestMetadata,\n IPolicyLoader,\n ICustomerPolicy,\n DetectionClass,\n VerificationMethod,\n ForgeabilityRisk,\n IDetectorOptions,\n} from './types';\nimport { CONFIDENCE } from './types';\n\n/**\n * Convert verification method string from WASM to typed enum\n */\nfunction parseVerificationMethod(method: string): VerificationMethod {\n switch (method.toLowerCase()) {\n case 'signature':\n return 'signature';\n case 'pattern':\n return 'pattern';\n case 'behavioral':\n return 'behavioral';\n case 'network':\n return 'network';\n case 'mcp_i_handshake':\n return 'mcp_i_handshake';\n default:\n return 'none';\n }\n}\n\n/**\n * Determine forgeability risk based on verification method and confidence\n */\nfunction determineForgeabilityRisk(\n method: VerificationMethod,\n confidence: number\n): ForgeabilityRisk {\n // Cryptographic signature verification = low risk\n if (method === 'signature' && confidence >= 90) {\n return 'low';\n }\n\n // High confidence pattern match = medium risk\n if (confidence >= 80) {\n return 'medium';\n }\n\n // Everything else = high risk (easily spoofable)\n return 'high';\n}\n\n/**\n * Determine detection class from WASM result\n */\nfunction determineDetectionClass(\n isAgent: boolean,\n agentName: string | null,\n confidence: number\n): DetectionClass {\n if (!isAgent || confidence < CONFIDENCE.THRESHOLD_AGENT) {\n return { type: 'Human' };\n }\n\n if (agentName) {\n // Check if it's an AI agent\n const aiAgentPatterns = [\n 'chatgpt',\n 'gpt',\n 'openai',\n 'claude',\n 'anthropic',\n 'perplexity',\n 'gemini',\n 'google ai',\n 'copilot',\n 'bing chat',\n ];\n\n const lowerName = agentName.toLowerCase();\n if (aiAgentPatterns.some((pattern) => lowerName.includes(pattern))) {\n return { type: 'AiAgent', agentType: agentName };\n }\n\n // Check if it's a bot\n const botPatterns = ['bot', 'crawler', 'spider', 'scraper'];\n if (botPatterns.some((pattern) => lowerName.includes(pattern))) {\n return { type: 'Bot', botType: agentName };\n }\n\n // Check if it's automation\n const automationPatterns = ['selenium', 'puppeteer', 'playwright', 'cypress'];\n if (automationPatterns.some((pattern) => lowerName.includes(pattern))) {\n return { type: 'Automation', toolType: agentName };\n }\n\n // Default to AI agent if detected but unrecognized\n return { type: 'AiAgent', agentType: agentName };\n }\n\n return { type: 'Unknown' };\n}\n\n/**\n * Unified WASM Detector\n *\n * Main detection class that wraps the WASM engine and provides\n * a consistent interface across all AgentShield packages.\n */\nexport class WasmDetector implements IDetector {\n private ready = false;\n private loadPromise: Promise<void> | null = null;\n\n /**\n * Create a new WasmDetector\n * @param loader - WASM loader (static for Edge, dynamic for Node.js)\n * @param policyLoader - Optional policy loader for API key support\n * @param options - Detector configuration options\n */\n constructor(\n private readonly loader: IWasmLoader,\n private readonly policyLoader?: IPolicyLoader,\n private readonly options: IDetectorOptions = {}\n ) {}\n\n /**\n * Analyze a request and detect if it's from an agent\n */\n async detect(input: IDetectionInput): Promise<IDetectionResult> {\n // Ensure WASM is loaded\n await this.ensureReady();\n\n try {\n // Get WASM bindings\n const bindings = this.loader.getBindings();\n\n // Create WASM metadata\n const metadata: IWasmRequestMetadata = {\n user_agent: input.userAgent || null,\n ip_address: input.ipAddress || null,\n headers: JSON.stringify(input.headers || {}),\n timestamp: (input.timestamp || new Date()).toISOString(),\n url: input.url || null,\n method: input.method || null,\n client_fingerprint: input.clientFingerprint || null,\n free: () => {}, // No-op for JS\n };\n\n // Call WASM detection\n const wasmResult = bindings.detect_agent(metadata);\n\n // Convert WASM result to IDetectionResult\n // NOTE: WASM already outputs confidence on 0-100 scale\n // No conversion needed!\n const verificationMethod = parseVerificationMethod(wasmResult.verification_method);\n const forgeabilityRisk = determineForgeabilityRisk(verificationMethod, wasmResult.confidence);\n const detectionClass = determineDetectionClass(\n wasmResult.is_agent,\n wasmResult.agent,\n wasmResult.confidence\n );\n\n let result: IDetectionResult = {\n isAgent: wasmResult.is_agent,\n confidence: wasmResult.confidence, // Already 0-100, no conversion!\n detectionClass,\n detectedAgent: wasmResult.agent\n ? {\n type: this.inferAgentType(wasmResult.agent),\n name: wasmResult.agent,\n }\n : undefined,\n verificationMethod,\n forgeabilityRisk,\n reasons: this.extractReasons(wasmResult),\n timestamp: new Date(),\n };\n\n // Apply customer policy if available\n if (this.policyLoader && this.options.apiKey) {\n result = await this.applyPolicy(result);\n }\n\n return result;\n } catch (error) {\n // Log error if debug enabled\n if (this.options.debug) {\n console.error('[WasmDetector] Detection error:', error);\n }\n\n // Return safe default (assume human)\n return this.createDefaultResult();\n }\n }\n\n /**\n * Check if the detector is ready\n */\n isReady(): boolean {\n return this.ready;\n }\n\n /**\n * Ensure the detector is initialized\n */\n async ensureReady(): Promise<void> {\n if (this.ready) {\n return;\n }\n\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = this.initialize();\n return this.loadPromise;\n }\n\n /**\n * Get detector version\n */\n async getVersion(): Promise<string> {\n await this.ensureReady();\n return this.loader.getBindings().get_version();\n }\n\n /**\n * Initialize the detector\n */\n private async initialize(): Promise<void> {\n try {\n await this.loader.load();\n this.ready = true;\n\n if (this.options.debug) {\n const version = this.loader.getBindings().get_version();\n console.log(\n `[WasmDetector] Initialized with WASM v${version} (${this.loader.getStrategy()})`\n );\n }\n } catch (error) {\n this.loadPromise = null;\n throw error;\n }\n }\n\n /**\n * Apply customer policy to detection result\n */\n private async applyPolicy(result: IDetectionResult): Promise<IDetectionResult> {\n if (!this.policyLoader || !this.options.apiKey) {\n return result;\n }\n\n try {\n // Try to get cached policy first\n let policy = this.policyLoader.getCachedPolicy(this.options.apiKey);\n\n // Load policy if not cached\n if (!policy) {\n policy = await this.policyLoader.loadPolicy(this.options.apiKey);\n }\n\n return this.applyPolicyRules(result, policy);\n } catch (error) {\n if (this.options.debug) {\n console.warn('[WasmDetector] Failed to load policy:', error);\n }\n // Return original result if policy loading fails\n return result;\n }\n }\n\n /**\n * Check if agent name matches a policy list entry\n * Uses exact match or word-boundary prefix match to avoid false positives\n * e.g., \"gpt\" matches \"ChatGPT\" and \"GPT-4\" but not \"EgyptBot\"\n */\n private matchesPolicyEntry(agentName: string, policyEntry: string): boolean {\n const lowerAgent = agentName.toLowerCase();\n const lowerEntry = policyEntry.toLowerCase();\n\n // Exact match\n if (lowerAgent === lowerEntry) {\n return true;\n }\n\n // Word boundary match: entry appears as a complete word or at word boundaries\n // This prevents \"ai\" from matching \"baidubot\" while allowing \"gpt\" to match \"chatgpt\"\n const wordBoundaryRegex = new RegExp(\n `(^|[^a-z0-9])${this.escapeRegex(lowerEntry)}($|[^a-z0-9])`,\n 'i'\n );\n return wordBoundaryRegex.test(lowerAgent);\n }\n\n /**\n * Escape special regex characters in a string\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Apply policy rules to detection result\n */\n private applyPolicyRules(result: IDetectionResult, policy: ICustomerPolicy): IDetectionResult {\n // Check deny list\n if (policy.denyList && result.detectedAgent) {\n const agentName = result.detectedAgent.name;\n const isDenied = policy.denyList.some((denied) => this.matchesPolicyEntry(agentName, denied));\n\n if (isDenied) {\n return {\n ...result,\n shouldBlock: true,\n blockReason: 'deny_list',\n };\n }\n }\n\n // Check allow list (if set, blocks everything not in list, but allows listed agents)\n if (policy.allowList && policy.allowList.length > 0 && result.isAgent) {\n const agentName = result.detectedAgent?.name;\n\n // If agent was detected but not identified (no name), skip allow list check\n // Allow list is for named agents only - unidentified agents go through threshold check\n if (!agentName) {\n // Fall through to threshold check below\n } else {\n const isAllowed = policy.allowList.some((allowed) =>\n this.matchesPolicyEntry(agentName, allowed)\n );\n\n if (!isAllowed) {\n return {\n ...result,\n shouldBlock: true,\n blockReason: 'not_in_allow_list',\n };\n }\n\n // Agent is explicitly allowed - skip threshold check and don't block\n return {\n ...result,\n shouldBlock: false,\n };\n }\n }\n\n // Check confidence threshold (only for detected agents not in allow list)\n // Use !== undefined instead of truthiness check since 0 is a valid threshold\n // (meaning \"block all detected agents regardless of confidence\")\n if (\n policy.blockThreshold !== undefined &&\n result.isAgent &&\n result.confidence >= policy.blockThreshold\n ) {\n return {\n ...result,\n shouldBlock: true,\n blockReason: 'threshold',\n };\n }\n\n return result;\n }\n\n /**\n * Infer agent type from name\n */\n private inferAgentType(agentName: string): string {\n const lowerName = agentName.toLowerCase();\n\n if (\n lowerName.includes('chatgpt') ||\n lowerName.includes('openai') ||\n lowerName.includes('gpt')\n ) {\n return 'openai';\n }\n if (lowerName.includes('claude') || lowerName.includes('anthropic')) {\n return 'anthropic';\n }\n if (lowerName.includes('perplexity')) {\n return 'perplexity';\n }\n if (lowerName.includes('gemini') || lowerName.includes('google')) {\n return 'google';\n }\n if (lowerName.includes('copilot') || lowerName.includes('bing')) {\n return 'microsoft';\n }\n\n return 'unknown';\n }\n\n /**\n * Extract reasons from WASM result\n */\n private extractReasons(wasmResult: {\n verification_method: string;\n agent: string | null;\n }): string[] {\n const reasons: string[] = [];\n\n if (wasmResult.verification_method) {\n reasons.push(`method:${wasmResult.verification_method}`);\n }\n\n if (wasmResult.agent) {\n reasons.push(`agent:${wasmResult.agent.toLowerCase()}`);\n }\n\n return reasons;\n }\n\n /**\n * Create default result (assumed human)\n */\n private createDefaultResult(): IDetectionResult {\n return {\n isAgent: false,\n confidence: 0,\n detectionClass: { type: 'Human' },\n verificationMethod: 'none',\n forgeabilityRisk: 'high',\n reasons: ['detection_failed'],\n timestamp: new Date(),\n };\n }\n}\n","let wasm;\n\nconst cachedTextDecoder =\n typeof TextDecoder !== 'undefined'\n ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true })\n : {\n decode: () => {\n throw Error('TextDecoder not available');\n },\n };\n\nif (typeof TextDecoder !== 'undefined') {\n cachedTextDecoder.decode();\n}\n\nlet cachedUint8ArrayMemory0 = null;\n\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nfunction logError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n let error = (function () {\n try {\n return e instanceof Error ? `${e.message}\\n\\nStack:\\n${e.stack}` : e.toString();\n } catch (_) {\n return '<failed to stringify thrown value>';\n }\n })();\n console.error(\n 'wasm-bindgen: imported JS function that was not marked as `catch` threw an error:',\n error\n );\n throw e;\n }\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst cachedTextEncoder =\n typeof TextEncoder !== 'undefined'\n ? new TextEncoder('utf-8')\n : {\n encode: () => {\n throw Error('TextEncoder not available');\n },\n };\n\nconst encodeString =\n typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n }\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length,\n };\n };\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (typeof arg !== 'string') throw new Error(`expected a string argument, found ${typeof arg}`);\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0()\n .subarray(ptr, ptr + buf.length)\n .set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7f) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, (len = offset + arg.length * 3), 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n if (ret.read !== arg.length) throw new Error('failed to pass whole string');\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nlet cachedDataViewMemory0 = null;\n\nfunction getDataViewMemory0() {\n if (\n cachedDataViewMemory0 === null ||\n cachedDataViewMemory0.buffer.detached === true ||\n (cachedDataViewMemory0.buffer.detached === undefined &&\n cachedDataViewMemory0.buffer !== wasm.memory.buffer)\n ) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction _assertNum(n) {\n if (typeof n !== 'number') throw new Error(`expected a number argument, found ${typeof n}`);\n}\n\nfunction _assertBoolean(n) {\n if (typeof n !== 'boolean') {\n throw new Error(`expected a boolean argument, found ${typeof n}`);\n }\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n/**\n * Initialize the AgentShield WASM module\n */\nexport function init() {\n wasm.init();\n}\n\nfunction _assertClass(instance, klass) {\n if (!(instance instanceof klass)) {\n throw new Error(`expected instance of ${klass.name}`);\n }\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_export_3.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n/**\n * Analyze a request and detect if it's from an agent\n * @param {JsRequestMetadata} metadata\n * @returns {JsDetectionResult}\n */\nexport function detect_agent(metadata) {\n _assertClass(metadata, JsRequestMetadata);\n if (metadata.__wbg_ptr === 0) {\n throw new Error('Attempt to use a moved value');\n }\n const ret = wasm.detect_agent(metadata.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return JsDetectionResult.__wrap(ret[0]);\n}\n\n/**\n * Get the version of the AgentShield library\n * @returns {string}\n */\nexport function version() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.version();\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);\n }\n}\n\nconst JsDetectionResultFinalization =\n typeof FinalizationRegistry === 'undefined'\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry((ptr) => wasm.__wbg_jsdetectionresult_free(ptr >>> 0, 1));\n/**\n * JavaScript-compatible detection result\n */\nexport class JsDetectionResult {\n constructor() {\n throw new Error('cannot invoke `new` directly');\n }\n\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(JsDetectionResult.prototype);\n obj.__wbg_ptr = ptr;\n JsDetectionResultFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n JsDetectionResultFinalization.unregister(this);\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_jsdetectionresult_free(ptr, 0);\n }\n /**\n * Whether the request was identified as coming from an agent\n * @returns {boolean}\n */\n get is_agent() {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.__wbg_get_jsdetectionresult_is_agent(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * Whether the request was identified as coming from an agent\n * @param {boolean} arg0\n */\n set is_agent(arg0) {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n _assertBoolean(arg0);\n wasm.__wbg_set_jsdetectionresult_is_agent(this.__wbg_ptr, arg0);\n }\n /**\n * Confidence score (0.0 to 1.0)\n * @returns {number}\n */\n get confidence() {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.__wbg_get_jsdetectionresult_confidence(this.__wbg_ptr);\n return ret;\n }\n /**\n * Confidence score (0.0 to 1.0)\n * @param {number} arg0\n */\n set confidence(arg0) {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n wasm.__wbg_set_jsdetectionresult_confidence(this.__wbg_ptr, arg0);\n }\n /**\n * Get the detected agent name\n * @returns {string | undefined}\n */\n get agent() {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.jsdetectionresult_agent(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * Get the verification method as a string\n * @returns {string}\n */\n get verification_method() {\n let deferred1_0;\n let deferred1_1;\n try {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.jsdetectionresult_verification_method(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * Get the risk level as a string\n * @returns {string}\n */\n get risk_level() {\n let deferred1_0;\n let deferred1_1;\n try {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.jsdetectionresult_risk_level(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * Get the timestamp as a string\n * @returns {string}\n */\n get timestamp() {\n let deferred1_0;\n let deferred1_1;\n try {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.jsdetectionresult_timestamp(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);\n }\n }\n}\n\nconst JsRequestMetadataFinalization =\n typeof FinalizationRegistry === 'undefined'\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry((ptr) => wasm.__wbg_jsrequestmetadata_free(ptr >>> 0, 1));\n/**\n * JavaScript-compatible request metadata\n */\nexport class JsRequestMetadata {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n JsRequestMetadataFinalization.unregister(this);\n return ptr;\n }\n\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_jsrequestmetadata_free(ptr, 0);\n }\n /**\n * Constructor for JsRequestMetadata\n * @param {string | null | undefined} user_agent\n * @param {string | null | undefined} ip_address\n * @param {string} headers\n * @param {string} timestamp\n * @param {string | null} [url]\n * @param {string | null} [method]\n * @param {string | null} [client_fingerprint]\n */\n constructor(user_agent, ip_address, headers, timestamp, url, method, client_fingerprint) {\n var ptr0 = isLikeNone(user_agent)\n ? 0\n : passStringToWasm0(user_agent, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n var ptr1 = isLikeNone(ip_address)\n ? 0\n : passStringToWasm0(ip_address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len1 = WASM_VECTOR_LEN;\n const ptr2 = passStringToWasm0(headers, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len2 = WASM_VECTOR_LEN;\n const ptr3 = passStringToWasm0(timestamp, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len3 = WASM_VECTOR_LEN;\n var ptr4 = isLikeNone(url)\n ? 0\n : passStringToWasm0(url, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len4 = WASM_VECTOR_LEN;\n var ptr5 = isLikeNone(method)\n ? 0\n : passStringToWasm0(method, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len5 = WASM_VECTOR_LEN;\n var ptr6 = isLikeNone(client_fingerprint)\n ? 0\n : passStringToWasm0(client_fingerprint, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len6 = WASM_VECTOR_LEN;\n const ret = wasm.jsrequestmetadata_new(\n ptr0,\n len0,\n ptr1,\n len1,\n ptr2,\n len2,\n ptr3,\n len3,\n ptr4,\n len4,\n ptr5,\n len5,\n ptr6,\n len6\n );\n this.__wbg_ptr = ret >>> 0;\n JsRequestMetadataFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * Get the user agent\n * @returns {string | undefined}\n */\n get user_agent() {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.jsrequestmetadata_user_agent(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * Get the IP address\n * @returns {string | undefined}\n */\n get ip_address() {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.jsrequestmetadata_ip_address(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * Get the headers as JSON string\n * @returns {string}\n */\n get headers() {\n let deferred1_0;\n let deferred1_1;\n try {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.jsrequestmetadata_headers(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * Get the timestamp\n * @returns {string}\n */\n get timestamp() {\n let deferred1_0;\n let deferred1_1;\n try {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.jsrequestmetadata_timestamp(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);\n }\n }\n /**\n * Get the URL\n * @returns {string | undefined}\n */\n get url() {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.jsrequestmetadata_url(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * Get the method\n * @returns {string | undefined}\n */\n get method() {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.jsrequestmetadata_method(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * Get the client fingerprint\n * @returns {string | undefined}\n */\n get client_fingerprint() {\n if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value');\n _assertNum(this.__wbg_ptr);\n const ret = wasm.jsrequestmetadata_client_fingerprint(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n } catch (e) {\n if (module.headers.get('Content-Type') != 'application/wasm') {\n console.warn(\n '`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n',\n e\n );\n } else {\n throw e;\n }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n}\n\nfunction __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbg_error_7534b8e9a36f1ab4 = function () {\n return logError(function (arg0, arg1) {\n let deferred0_0;\n let deferred0_1;\n try {\n deferred0_0 = arg0;\n deferred0_1 = arg1;\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);\n }\n }, arguments);\n };\n imports.wbg.__wbg_getTime_46267b1c24877e30 = function () {\n return logError(function (arg0) {\n const ret = arg0.getTime();\n return ret;\n }, arguments);\n };\n imports.wbg.__wbg_log_c222819a41e063d3 = function () {\n return logError(function (arg0) {\n console.log(arg0);\n }, arguments);\n };\n imports.wbg.__wbg_new_31a97dac4f10fab7 = function () {\n return logError(function (arg0) {\n const ret = new Date(arg0);\n return ret;\n }, arguments);\n };\n imports.wbg.__wbg_new_8a6f238a6ece86ea = function () {\n return logError(function () {\n const ret = new Error();\n return ret;\n }, arguments);\n };\n imports.wbg.__wbg_now_807e54c39636c349 = function () {\n return logError(function () {\n const ret = Date.now();\n return ret;\n }, arguments);\n };\n imports.wbg.__wbg_stack_0ed75d68575b0f3c = function () {\n return logError(function (arg0, arg1) {\n const ret = arg1.stack;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n }, arguments);\n };\n imports.wbg.__wbindgen_init_externref_table = function () {\n const table = wasm.__wbindgen_export_3;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n };\n imports.wbg.__wbindgen_string_new = function (arg0, arg1) {\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n };\n imports.wbg.__wbindgen_throw = function (arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n };\n\n return imports;\n}\n\nfunction __wbg_init_memory(imports, memory) {}\n\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n __wbg_init.__wbindgen_wasm_module = module;\n cachedDataViewMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n\n wasm.__wbindgen_start();\n return wasm;\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n if (typeof module !== 'undefined') {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({ module } = module);\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead');\n }\n }\n\n const imports = __wbg_get_imports();\n\n __wbg_init_memory(imports);\n\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n\n const instance = new WebAssembly.Instance(module, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n if (typeof module_or_path !== 'undefined') {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({ module_or_path } = module_or_path);\n } else {\n console.warn(\n 'using deprecated parameters for the initialization function; pass a single object instead'\n );\n }\n }\n\n if (typeof module_or_path === 'undefined') {\n module_or_path = new URL('agentshield_wasm_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (\n typeof module_or_path === 'string' ||\n (typeof Request === 'function' && module_or_path instanceof Request) ||\n (typeof URL === 'function' && module_or_path instanceof URL)\n ) {\n module_or_path = fetch(module_or_path);\n }\n\n __wbg_init_memory(imports);\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync };\nexport default __wbg_init;\n","/**\n * Static WASM Loader for Edge Runtime\n *\n * This loader is designed for environments that require static WASM imports,\n * such as Vercel Edge Runtime and Cloudflare Workers.\n *\n * Usage:\n * ```typescript\n * // In your middleware.ts:\n * import wasmModule from '@kya-os/checkpoint-wasm-runtime/wasm?module';\n * import { StaticWasmLoader, WasmDetector } from '@kya-os/checkpoint-wasm-runtime/edge';\n *\n * const loader = new StaticWasmLoader(wasmModule);\n * const detector = new WasmDetector(loader);\n * ```\n *\n * The `?module` suffix tells bundlers (webpack, esbuild) to import the WASM\n * as a pre-compiled WebAssembly.Module, which is required for Edge Runtime.\n */\n\nimport type {\n IWasmLoader,\n IWasmBindings,\n IWasmRequestMetadata,\n IWasmDetectionResult,\n} from '../types';\n\n// Import the wasm-bindgen generated glue code\nimport {\n initSync,\n JsRequestMetadata,\n type JsDetectionResult,\n detect_agent,\n version,\n} from '../wasm-bindgen/agentshield_wasm.js';\n\n/**\n * Static WASM Loader\n *\n * For Edge Runtime environments that require pre-compiled WASM modules.\n * The consumer must provide the WASM module via a static import with `?module` suffix.\n *\n * This loader uses the wasm-bindgen generated JS glue code to properly\n * initialize the WASM module with all required imports.\n */\nexport class StaticWasmLoader implements IWasmLoader {\n private bindings: IWasmBindings | null = null;\n private loadPromise: Promise<void> | null = null;\n private wasmExports: unknown = null;\n\n /**\n * Create a new StaticWasmLoader\n * @param wasmModule - Pre-compiled WebAssembly.Module from static import\n */\n constructor(private readonly wasmModule: WebAssembly.Module) {\n if (!wasmModule) {\n throw new Error(\n 'StaticWasmLoader requires a WebAssembly.Module. ' +\n \"Import with: import wasmModule from './wasm.wasm?module'\"\n );\n }\n }\n\n /**\n * Load and instantiate the WASM module\n */\n async load(): Promise<void> {\n if (this.bindings) {\n return; // Already loaded\n }\n\n // Prevent concurrent loading - return existing promise if in progress\n if (this.loadPromise) {\n return this.loadPromise;\n }\n\n this.loadPromise = this.doLoad();\n return this.loadPromise;\n }\n\n /**\n * Internal load implementation using wasm-bindgen initSync\n */\n private async doLoad(): Promise<void> {\n try {\n // Use wasm-bindgen's initSync which handles all the import bindings correctly\n this.wasmExports = initSync({ module: this.wasmModule });\n\n // Create bindings wrapper using the wasm-bindgen exports\n this.bindings = this.createBindings();\n } catch (error) {\n // Reset loadPromise so future attempts can retry\n this.loadPromise = null;\n throw new Error(\n `Failed to instantiate WASM module: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Get the WASM bindings after loading\n */\n getBindings(): IWasmBindings {\n if (!this.bindings) {\n throw new Error('WASM not loaded. Call load() first.');\n }\n return this.bindings;\n }\n\n /**\n * Check if WASM is loaded\n */\n isLoaded(): boolean {\n return this.bindings !== null;\n }\n\n /**\n * Get the loading strategy name\n */\n getStrategy(): string {\n return 'static-import';\n }\n\n /**\n * Create bindings wrapper using wasm-bindgen exports\n */\n private createBindings(): IWasmBindings {\n return {\n detect_agent: (metadata: IWasmRequestMetadata): IWasmDetectionResult => {\n // Create JsRequestMetadata instance using wasm-bindgen generated class\n const wasmMetadata = new JsRequestMetadata(\n metadata.user_agent,\n metadata.ip_address,\n metadata.headers,\n metadata.timestamp,\n metadata.url,\n metadata.method,\n metadata.client_fingerprint\n );\n\n let result: JsDetectionResult | null = null;\n\n try {\n // Call the wasm-bindgen exported detect_agent function\n result = detect_agent(wasmMetadata);\n\n // Extract result properties and return as IWasmDetectionResult\n return {\n is_agent: result.is_agent,\n confidence: result.confidence,\n agent: result.agent ?? null, // Convert undefined to null\n verification_method: result.verification_method,\n risk_level: result.risk_level,\n timestamp: result.timestamp,\n };\n } finally {\n // Free WASM memory for both objects - always free wasmMetadata,\n // and free result if it was successfully created\n result?.free();\n wasmMetadata.free();\n }\n },\n get_version: () => {\n try {\n return version();\n } catch {\n return '0.1.0-static';\n }\n },\n get_build_info: () => {\n return JSON.stringify({ version: '0.1.0', strategy: 'static-import' });\n },\n };\n }\n}\n\n/**\n * Create a static loader with validation\n */\nexport function createStaticLoader(wasmModule: WebAssembly.Module): StaticWasmLoader {\n return new StaticWasmLoader(wasmModule);\n}\n","/**\n * Policy Loader\n *\n * Loads customer policies from the AgentShield API.\n * Supports LRU caching with background refresh.\n */\n\nimport type { IPolicyLoader, ICustomerPolicy } from '../types';\n\n/**\n * Cached policy entry\n */\ninterface CachedPolicy {\n policy: ICustomerPolicy;\n loadedAt: number;\n refreshing: boolean;\n}\n\n/**\n * Policy loader configuration\n */\nexport interface PolicyLoaderConfig {\n /** Base URL for the policy API */\n apiUrl?: string;\n /** Cache TTL in milliseconds (default: 5 minutes) */\n cacheTTL?: number;\n /** Maximum number of policies to cache (default: 100) */\n maxCacheSize?: number;\n /** Enable background refresh (default: true) */\n backgroundRefresh?: boolean;\n /** Timeout for API requests in milliseconds (default: 5000) */\n timeout?: number;\n}\n\nconst DEFAULT_CONFIG: Required<PolicyLoaderConfig> = {\n apiUrl: 'https://api.agentshield.io',\n cacheTTL: 5 * 60 * 1000, // 5 minutes\n maxCacheSize: 100,\n backgroundRefresh: true,\n timeout: 5000,\n};\n\n/**\n * Policy Loader\n *\n * Loads and caches customer policies from the AgentShield API.\n * Follows Single Responsibility Principle: only handles policy loading.\n */\nexport class PolicyLoader implements IPolicyLoader {\n private cache = new Map<string, CachedPolicy>();\n private config: Required<PolicyLoaderConfig>;\n\n constructor(config: PolicyLoaderConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Load policy for an API key\n */\n async loadPolicy(apiKey: string): Promise<ICustomerPolicy> {\n // Check cache first\n const cached = this.getCachedPolicy(apiKey);\n if (cached) {\n // Trigger background refresh if nearing expiry\n if (this.config.backgroundRefresh && this.shouldRefresh(apiKey)) {\n this.refreshInBackground(apiKey);\n }\n return cached;\n }\n\n // Fetch from API\n return this.fetchPolicy(apiKey);\n }\n\n /**\n * Get cached policy if available and not expired\n */\n getCachedPolicy(apiKey: string): ICustomerPolicy | null {\n const entry = this.cache.get(apiKey);\n if (!entry) {\n return null;\n }\n\n // Check if expired\n if (this.isExpired(entry)) {\n this.cache.delete(apiKey);\n return null;\n }\n\n return entry.policy;\n }\n\n /**\n * Invalidate cached policy\n */\n invalidateCache(apiKey: string): void {\n this.cache.delete(apiKey);\n }\n\n /**\n * Fetch policy from API and cache it\n */\n private async fetchPolicy(apiKey: string): Promise<ICustomerPolicy> {\n const policy = await this.fetchPolicyFromApi(apiKey);\n this.cachePolicy(apiKey, policy);\n return policy;\n }\n\n /**\n * Fetch policy from API without caching\n * Used internally for both direct fetches and background refreshes\n */\n private async fetchPolicyFromApi(apiKey: string): Promise<ICustomerPolicy> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(`${this.config.apiUrl}/api/v1/policy`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'agentshield-wasm-runtime/0.1.0',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new PolicyLoadError('Invalid API key', 'INVALID_API_KEY');\n }\n if (response.status === 404) {\n // Return default policy if not found\n return this.getDefaultPolicy(apiKey);\n }\n throw new PolicyLoadError(`Failed to load policy: ${response.status}`, 'API_ERROR');\n }\n\n return (await response.json()) as ICustomerPolicy;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof PolicyLoadError) {\n throw error;\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new PolicyLoadError('Policy request timeout', 'TIMEOUT');\n }\n\n throw new PolicyLoadError(\n `Failed to load policy: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'NETWORK_ERROR'\n );\n }\n }\n\n /**\n * Cache a policy\n */\n private cachePolicy(apiKey: string, policy: ICustomerPolicy): void {\n // Enforce cache size limit (simple LRU: delete oldest)\n if (this.cache.size >= this.config.maxCacheSize) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey) {\n this.cache.delete(oldestKey);\n }\n }\n\n this.cache.set(apiKey, {\n policy,\n loadedAt: Date.now(),\n refreshing: false,\n });\n }\n\n /**\n * Check if cached entry is expired\n */\n private isExpired(entry: CachedPolicy): boolean {\n return Date.now() - entry.loadedAt > this.config.cacheTTL;\n }\n\n /**\n * Check if cache entry should be refreshed\n */\n private shouldRefresh(apiKey: string): boolean {\n const entry = this.cache.get(apiKey);\n if (!entry) {\n return false;\n }\n\n // Refresh when 80% of TTL has passed\n const refreshThreshold = this.config.cacheTTL * 0.8;\n return Date.now() - entry.loadedAt > refreshThreshold && !entry.refreshing;\n }\n\n /**\n * Refresh policy in background\n */\n private async refreshInBackground(apiKey: string): Promise<void> {\n const entry = this.cache.get(apiKey);\n if (!entry || entry.refreshing) {\n return;\n }\n\n // Mark as refreshing\n entry.refreshing = true;\n\n try {\n // Use fetch-only method to avoid double caching\n const policy = await this.fetchPolicyFromApi(apiKey);\n this.cachePolicy(apiKey, policy);\n } catch {\n // Ignore errors in background refresh, keep serving stale cache\n } finally {\n // Reset refreshing flag on the current entry\n // (cachePolicy creates a new entry with refreshing: false, so this is\n // only needed if the fetch failed and we're still serving the old entry)\n const currentEntry = this.cache.get(apiKey);\n if (currentEntry && currentEntry.refreshing) {\n currentEntry.refreshing = false;\n }\n }\n }\n\n /**\n * Get default policy for a project\n */\n private getDefaultPolicy(apiKey: string): ICustomerPolicy {\n return {\n projectId: apiKey.split('_')[1] || 'unknown',\n blockThreshold: 90,\n };\n }\n}\n\n/**\n * Policy load error\n */\nexport class PolicyLoadError extends Error {\n constructor(\n message: string,\n public readonly code: 'INVALID_API_KEY' | 'API_ERROR' | 'NETWORK_ERROR' | 'TIMEOUT'\n ) {\n super(message);\n this.name = 'PolicyLoadError';\n }\n}\n\n/**\n * Create a policy loader with default configuration\n */\nexport function createPolicyLoader(config?: PolicyLoaderConfig): PolicyLoader {\n return new PolicyLoader(config);\n}\n","/**\n * Rules-Based Fallback Detector\n *\n * JavaScript fallback detector that uses merged-rules.json when WASM is unavailable.\n * This provides consistent detection using the same rules as WASM, just implemented in JS.\n */\n\nimport type {\n IDetector,\n IDetectionInput,\n IDetectionResult,\n DetectionClass,\n VerificationMethod,\n} from '../types';\nimport { CONFIDENCE } from '../types';\nimport { loadRulesSync, type DetectionRules } from '@kya-os/checkpoint-shared';\n\n/**\n * Rules-Based Fallback Detector\n *\n * Uses the same merged-rules.json as the WASM engine to provide\n * consistent detection when WASM is not available.\n */\nexport class RulesDetector implements IDetector {\n private rules: DetectionRules | null = null;\n private ready = false;\n\n /**\n * Analyze a request and detect if it's from an agent\n */\n async detect(input: IDetectionInput): Promise<IDetectionResult> {\n await this.ensureReady();\n\n const reasons: string[] = [];\n let confidence = 0;\n let detectedAgentName: string | null = null;\n let verificationMethod: VerificationMethod = 'none';\n\n const userAgent = input.userAgent || input.headers['user-agent'] || '';\n const normalizedHeaders = this.normalizeHeaders(input.headers);\n\n // Check User-Agent patterns\n if (userAgent && this.rules) {\n const uaMatch = this.matchUserAgent(userAgent);\n if (uaMatch) {\n confidence = Math.max(confidence, uaMatch.confidence);\n detectedAgentName = uaMatch.agentName;\n verificationMethod = 'pattern';\n reasons.push(`pattern:${uaMatch.agentKey}`);\n }\n }\n\n // Check suspicious headers\n if (this.rules) {\n const headerMatch = this.matchHeaders(normalizedHeaders);\n if (headerMatch.confidence > 0) {\n confidence = Math.max(confidence, headerMatch.confidence);\n reasons.push(`headers:${headerMatch.count}`);\n }\n }\n\n // Check for signature headers (indicates AI agent)\n if (this.hasSignatureHeaders(normalizedHeaders)) {\n confidence = Math.max(confidence, CONFIDENCE.SIGNATURE_PRESENT);\n reasons.push('signature_headers_present');\n verificationMethod = 'pattern'; // Can't verify signature in JS fallback\n }\n\n // Determine detection class\n const isAgent = confidence > CONFIDENCE.THRESHOLD_AGENT;\n const detectionClass = this.determineDetectionClass(isAgent, detectedAgentName, confidence);\n\n return {\n isAgent,\n confidence,\n detectionClass,\n detectedAgent: detectedAgentName\n ? {\n type: this.inferAgentType(detectedAgentName),\n name: detectedAgentName,\n }\n : undefined,\n verificationMethod,\n forgeabilityRisk: 'high', // JS fallback is always high risk\n reasons,\n timestamp: new Date(),\n };\n }\n\n /**\n * Check if the detector is ready\n */\n isReady(): boolean {\n return this.ready;\n }\n\n /**\n * Ensure the detector is initialized\n */\n async ensureReady(): Promise<void> {\n if (this.ready) {\n return;\n }\n\n try {\n this.rules = loadRulesSync();\n this.ready = true;\n } catch (error) {\n console.warn('[RulesDetector] Failed to load rules:', error);\n // Continue without rules - will return default results\n this.ready = true;\n }\n }\n\n /**\n * Get detector version\n */\n async getVersion(): Promise<string> {\n return '0.1.0-js-fallback';\n }\n\n /**\n * Normalize headers to lowercase keys\n */\n private normalizeHeaders(headers: Record<string, string>): Record<string, string> {\n const normalized: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n normalized[key.toLowerCase()] = value;\n }\n return normalized;\n }\n\n /**\n * Match user agent against rules\n */\n private matchUserAgent(\n userAgent: string\n ): { confidence: number; agentName: string; agentKey: string } | null {\n if (!this.rules) {\n return null;\n }\n\n const userAgents = this.rules.rules.userAgents;\n\n // Sort to check specific patterns first (generic_bot, dev_tools, automation_tools last)\n const genericKeys = ['generic_bot', 'dev_tools', 'automation_tools'];\n const entries = Object.entries(userAgents).sort((a, b) => {\n const aIsGeneric = genericKeys.includes(a[0]);\n const bIsGeneric = genericKeys.includes(b[0]);\n if (aIsGeneric && !bIsGeneric) return 1;\n if (!aIsGeneric && bIsGeneric) return -1;\n return 0;\n });\n\n for (const [agentKey, rule] of entries) {\n for (const pattern of rule.patterns) {\n try {\n const regex = new RegExp(pattern, 'i');\n if (regex.test(userAgent)) {\n return {\n // Convert 0-1 rule confidence to 0-100 scale\n confidence: rule.confidence * 100,\n agentName: this.getAgentName(agentKey),\n agentKey,\n };\n }\n } catch {\n // Invalid regex, skip\n }\n }\n }\n\n return null;\n }\n\n /**\n * Match headers against suspicious header rules\n */\n private matchHeaders(headers: Record<string, string>): { confidence: number; count: number } {\n if (!this.rules) {\n return { confidence: 0, count: 0 };\n }\n\n const suspicious = this.rules.rules.headers.suspicious || [];\n let maxConfidence = 0;\n let count = 0;\n\n for (const headerRule of suspicious) {\n if (headers[headerRule.name.toLowerCase()]) {\n // Convert 0-1 rule confidence to 0-100 scale\n maxConfidence = Math.max(maxConfidence, headerRule.confidence * 100);\n count++;\n }\n }\n\n return { confidence: maxConfidence, count };\n }\n\n /**\n * Check if signature headers are present\n */\n private hasSignatureHeaders(headers: Record<string, string>): boolean {\n return !!(headers['signature'] || headers['signature-input'] || headers['signature-agent']);\n }\n\n /**\n * Get human-readable agent name from rule key\n */\n private getAgentName(agentKey: string): string {\n const nameMap: Record<string, string> = {\n openai_gptbot: 'ChatGPT/GPTBot',\n anthropic_claude: 'Claude',\n perplexity_bot: 'Perplexity',\n google_ai: 'Google AI',\n microsoft_ai: 'Microsoft Copilot',\n meta_ai: 'Meta AI',\n cohere_bot: 'Cohere',\n huggingface_bot: 'HuggingFace',\n generic_bot: 'Generic Bot',\n dev_tools: 'Development Tool',\n automation_tools: 'Automation Tool',\n };\n return nameMap[agentKey] || agentKey;\n }\n\n /**\n * Infer agent type from name\n */\n private inferAgentType(agentName: string): string {\n const lowerName = agentName.toLowerCase();\n\n if (lowerName.includes('chatgpt') || lowerName.includes('gpt')) return 'openai';\n if (lowerName.includes('claude')) return 'anthropic';\n if (lowerName.includes('perplexity')) return 'perplexity';\n if (lowerName.includes('google')) return 'google';\n if (lowerName.includes('copilot') || lowerName.includes('bing')) return 'microsoft';\n\n return 'unknown';\n }\n\n /**\n * Determine detection class\n */\n private determineDetectionClass(\n isAgent: boolean,\n agentName: string | null,\n confidence: number\n ): DetectionClass {\n if (!isAgent || confidence < CONFIDENCE.THRESHOLD_AGENT) {\n return { type: 'Human' };\n }\n\n if (agentName) {\n const lowerName = agentName.toLowerCase();\n\n // AI agents\n const aiPatterns = ['chatgpt', 'gpt', 'claude', 'perplexity', 'gemini', 'copilot'];\n if (aiPatterns.some((p) => lowerName.includes(p))) {\n return { type: 'AiAgent', agentType: agentName };\n }\n\n // Bots\n if (lowerName.includes('bot') || lowerName.includes('crawler')) {\n return { type: 'Bot', botType: agentName };\n }\n\n // Automation\n if (lowerName.includes('automation') || lowerName.includes('tool')) {\n return { type: 'Automation', toolType: agentName };\n }\n\n return { type: 'AiAgent', agentType: agentName };\n }\n\n return { type: 'Unknown' };\n }\n}\n\n/**\n * Create a rules-based fallback detector\n */\nexport function createRulesDetector(): RulesDetector {\n return new RulesDetector();\n}\n","/**\n * AgentShield WASM Runtime - Edge Runtime Entry\n *\n * Optimized exports for Vercel Edge Runtime and Cloudflare Workers.\n * Uses static WASM imports for Edge Runtime compatibility.\n *\n * @example\n * ```typescript\n * // In your middleware.ts:\n * import wasmModule from '@kya-os/checkpoint-wasm-runtime/wasm?module';\n * import { createEdgeDetector, WasmDetector, StaticWasmLoader } from '@kya-os/checkpoint-wasm-runtime/edge';\n *\n * const detector = createEdgeDetector(wasmModule, {\n * apiKey: process.env.AGENTSHIELD_API_KEY,\n * });\n *\n * export async function middleware(request: NextRequest) {\n * const result = await detector.detect({\n * userAgent: request.headers.get('user-agent') || undefined,\n * headers: Object.fromEntries(request.headers.entries()),\n * });\n *\n * if (result.shouldBlock) {\n * return new NextResponse('Forbidden', { status: 403 });\n * }\n *\n * return NextResponse.next();\n * }\n * ```\n */\n\n// Export types\nexport type {\n IDetectionInput,\n IDetectionResult,\n IDetector,\n IWasmLoader,\n IPolicyLoader,\n ICustomerPolicy,\n IDetectedAgent,\n IDetectorOptions,\n DetectionClass,\n VerificationMethod,\n ForgeabilityRisk,\n} from './types';\n\nexport { CONFIDENCE } from './types';\n\n// Import classes for use in this module\nimport { WasmDetector } from './wasm-detector';\nimport { StaticWasmLoader, createStaticLoader } from './loaders/static-loader';\nimport { PolicyLoader, createPolicyLoader } from './policy/policy-loader';\nimport { RulesDetector, createRulesDetector } from './fallback/rules-detector';\n\n// Re-export for consumers\nexport { WasmDetector };\nexport { StaticWasmLoader, createStaticLoader };\nexport { PolicyLoader, createPolicyLoader };\nexport { RulesDetector, createRulesDetector };\n\n/**\n * Create a detector for Edge Runtime with static WASM import\n *\n * @param wasmModule - Pre-compiled WebAssembly.Module from static import\n * @param options - Detector configuration\n */\nexport function createEdgeDetector(\n wasmModule: WebAssembly.Module,\n options: import('./types').IDetectorOptions = {}\n): import('./types').IDetector {\n const loader = new StaticWasmLoader(wasmModule);\n\n let policyLoader: import('./types').IPolicyLoader | undefined;\n if (options.apiKey) {\n policyLoader = new PolicyLoader({\n apiUrl: options.policyApiUrl,\n cacheTTL: options.policyTTL,\n });\n }\n\n return new WasmDetector(loader, policyLoader, options);\n}\n\n/**\n * Create a fallback detector using JavaScript rules\n * Use this when WASM loading fails or is not available\n */\nexport function createFallbackDetector(): import('./types').IDetector {\n return new RulesDetector();\n}\n\n/**\n * Extract detection input from a Request object (Edge Runtime)\n */\nexport function extractInputFromRequest(request: Request): import('./types').IDetectionInput {\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n const url = new URL(request.url);\n\n return {\n userAgent: request.headers.get('user-agent') || undefined,\n ipAddress:\n request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||\n request.headers.get('x-real-ip') ||\n undefined,\n headers,\n url: url.pathname + url.search,\n method: request.method,\n };\n}\n"]}
|