@haven_ai/mcp 0.1.24-alpha.0 → 0.1.26-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs CHANGED
@@ -767,7 +767,7 @@ async function resolveHavenClient(options = {}) {
767
767
  return { client, credentials };
768
768
  }
769
769
  var MCP_NAME = "@haven_ai/mcp";
770
- var MCP_VERSION = "0.1.24-alpha.0";
770
+ var MCP_VERSION = "0.1.26-alpha.0";
771
771
  var MCP_INSTRUCTIONS = [
772
772
  "Haven local MCP server: signs in-process with the delegate key it holds on",
773
773
  "this machine \u2014 the key never leaves this process. Call haven_get_agent",
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/credentials.ts","../src/tools.ts","../src/consent.ts","../src/server.ts","../src/cli.ts"],"names":["readFile","stat","z","composeDescription","sharedDescriptions","HavenPaymentStateError","discoverMerchantMcpUrl","sameUrl","verifyPaymentReceipt","HavenApiError","HavenSigningError","AgentPaymentNextAction","HavenError","createHash","resolve","path","mkdir","dirname","writeFile","HavenClient","McpServer","isSupportedNodeVersion","unsupportedNodeVersionMessage","StdioServerTransport"],"mappings":";;;;;;;;;;;AA6EA,eAAsB,eAAA,CACpB,MAAA,GAAqD,OAAA,CAAQ,GAAA,CAAI,iBAAA,EACnC;AAC9B,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAO,wBAAwB,MAAM,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,OAAO,uBAAA,CAAwB,OAAO,eAAe,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,MAAA,EAAQ,YAAA,IAAgB,MAAA,EAAQ,UAAA,EAAY;AAC9C,IAAA,IAAI,CAAC,MAAA,CAAO,YAAA,IAAgB,CAAC,OAAO,UAAA,EAAY;AAC9C,MAAA,MAAM,IAAI,MAAM,qEAAqE,CAAA;AAAA,IACvF;AACA,IAAA,OAAO,6BAAA,CAA8B,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,UAAU,CAAA;AAAA,EAC7E;AAEA,EAAA,MAAM,WAAW,sBAAA,EAAuB;AACxC,EAAA,IAAI,UAAU,OAAO,QAAA;AAErB,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GAEF;AACF;AAEA,eAAe,wBAAwB,IAAA,EAA4C;AACjF,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAMA,iBAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAAA,EACvC,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,IAAI,CAAA,EAAA,EAAK,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EACpH;AAEA,EAAA,MAAM,+BAA+B,IAAI,CAAA;AAEzC,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AAAA,EACxF;AAEA,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,OAAA,IAAW,IAAI,MAAM,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,GAAA,CAAI,YAAA,IAAgB,IAAI,WAAW,CAAA;AAEnE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAAA,EACtF;AAEA,EAAA,OAAO;AAAA,IACH,MAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA,EAAS,WAAA,CAAY,GAAA,CAAI,QAAA,IAAY,IAAI,OAAO,CAAA;AAAA,IAChD,WAAA,EAAa,WAAA,CAAY,GAAA,CAAI,YAAA,IAAgB,IAAI,WAAW,CAAA;AAAA,IAC5D,eAAA,EAAiB,WAAA,CAAY,GAAA,CAAI,gBAAA,IAAoB,IAAI,eAAe,CAAA;AAAA,IACxE,OAAA,EAAS,WAAA,CAAY,GAAA,CAAI,QAAA,IAAY,IAAI,OAAO,CAAA;AAAA,IAChD,OAAA,EAAS,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAAA,IAChC,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,OAAA,IAAW,IAAI,MAAM,CAAA;AAAA,IAC7C,gBAAA,EAAkB,sBAAsB,GAAA,CAAI,iBAAA,IAAqB,IAAI,gBAAA,IAAoB,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,WAAW,CAAA;AAAA,IAC5H,UAAA,EAAY;AAAA,GACd;AACJ;AAEA,eAAe,6BAAA,CAA8B,cAAsB,UAAA,EAAkD;AACnH,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,YAAA,EAAc,4BAA4B,CAAA;AAC9E,EAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,UAAA,EAAY,0BAA0B,CAAA;AAExE,EAAA,MAAM,+BAA+B,YAAY,CAAA;AACjD,EAAA,MAAM,+BAA+B,UAAU,CAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,QAAA,CAAS,OAAA,IAAW,SAAS,MAAM,CAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAA,CAAO,YAAA,IAAgB,OAAO,WAAW,CAAA;AAEzE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACtE;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA,EAAS,mBAAA;AAAA,MACP,UAAA;AAAA,MACA,QAAA,CAAS,YAAY,QAAA,CAAS,OAAA;AAAA,MAC9B,MAAA,CAAO,YAAY,MAAA,CAAO;AAAA,KAC5B;AAAA,IACA,WAAA,EAAa,mBAAA;AAAA,MACX,cAAA;AAAA,MACA,QAAA,CAAS,gBAAgB,QAAA,CAAS,WAAA;AAAA,MAClC,MAAA,CAAO,gBAAgB,MAAA,CAAO,WAAA;AAAA,MAC9B,EAAE,iBAAiB,IAAA;AAAK,KAC1B;AAAA,IACA,eAAA,EAAiB,mBAAA;AAAA,MACf,kBAAA;AAAA,MACA,MAAA,CAAO,oBAAoB,MAAA,CAAO,eAAA;AAAA,MAClC,QAAA,CAAS,oBAAoB,QAAA,CAAS,eAAA;AAAA,MACtC,EAAE,iBAAiB,IAAA;AAAK,KAC1B;AAAA,IACA,OAAA,EAAS,mBAAA;AAAA,MACP,UAAA;AAAA,MACA,QAAA,CAAS,YAAY,QAAA,CAAS,OAAA;AAAA,MAC9B,MAAA,CAAO,YAAY,MAAA,CAAO;AAAA,KAC5B;AAAA,IACA,OAAA,EAAS,mBAAA;AAAA,MACP,SAAA;AAAA,MACA,QAAA,CAAS,OAAA;AAAA,MACT,MAAA,CAAO,OAAA;AAAA,MACP,EAAE,iBAAiB,IAAA;AAAK,KAC1B;AAAA,IACA,MAAA,EAAQ,WAAA,CAAY,QAAA,CAAS,OAAA,IAAW,SAAS,MAAM,CAAA;AAAA,IACvD,gBAAA,EAAkB,qBAAA;AAAA,MAChB,SAAS,iBAAA,IACP,QAAA,CAAS,gBAAA,IACT,QAAA,CAAS,gBACT,QAAA,CAAS;AAAA,KACb;AAAA,IACA,UAAA,EAAY,YAAA;AAAA,IACZ,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAe,YAAA,CAAa,MAAc,KAAA,EAA2C;AACnF,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAMA,iBAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAAA,EACvC,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,KAAK,OAAO,IAAI,CAAA,EAAA,EAAK,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3G;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,cAAA,CAAgB,CAAA;AAAA,EAC1C;AACF;AAEA,SAAS,sBAAA,GAAqD;AAC5D,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AAE9D,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,WAAA,EAAa,OAAO,IAAA;AAEpC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,MAAM,8HAA8H,CAAA;AAAA,EAChJ;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,WAAA;AAAA,IACE,OAAA,EAAS,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAAA,IAC/C,WAAA,EAAa,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AAAA,IACvD,OAAA,EAAS,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAAA,IAC/C,OAAA,EAAS,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAAA,IAC9C,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,aAAa;AAAA,GAC/C;AACJ;AAEA,SAAS,YAAY,KAAA,EAAoC;AACvD,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,GAAI,KAAA,CAAM,MAAK,GAAI,MAAA;AACpE;AAEA,SAAS,YAAY,KAAA,EAAoC;AACvD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,GAAG,OAAO,KAAA;AAChE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,MAAU,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG,OAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AACvG,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBACP,KAAA,EACA,SAAA,EACA,QAAA,EACA,OAAA,GAAyC,EAAC,EACtB;AACpB,EAAA,MAAM,cAAA,GAAiB,YAAY,SAAS,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,YAAY,QAAQ,CAAA;AAC1C,EAAA,IACE,cAAA,IACA,iBACA,CAAC,mBAAA,CAAoB,gBAAgB,aAAA,EAAe,OAAA,CAAQ,eAAe,CAAA,EAC3E;AACA,IAAA,MAAM,+BAA+B,KAAK,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,cAAA,IAAkB,aAAA;AAC3B;AAEA,SAAS,mBAAA,CAAoB,KAAA,EAAe,SAAA,EAAoB,QAAA,EAAuC;AACrG,EAAA,MAAM,cAAA,GAAiB,YAAY,SAAS,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,YAAY,QAAQ,CAAA;AAC1C,EAAA,IAAI,cAAA,KAAmB,MAAA,IAAa,aAAA,KAAkB,MAAA,IAAa,mBAAmB,aAAA,EAAe;AACnG,IAAA,MAAM,+BAA+B,KAAK,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,cAAA,IAAkB,aAAA;AAC3B;AAEA,SAAS,mBAAA,CAAoB,KAAA,EAAe,MAAA,EAAgB,eAAA,GAAkB,KAAA,EAAgB;AAC5F,EAAA,OAAO,kBAAkB,KAAA,CAAM,WAAA,OAAkB,MAAA,CAAO,WAAA,KAAgB,KAAA,KAAU,MAAA;AACpF;AAEA,SAAS,+BAA+B,KAAA,EAAsB;AAC5D,EAAA,OAAO,IAAI,KAAA;AAAA,IACT,2CAA2C,KAAK,CAAA,qFAAA;AAAA,GAElD;AACF;AAEA,SAAS,sBAAsB,KAAA,EAAwD;AACrF,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,MAAA;AAClC,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACzC,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,SAAiB,EAAC;AAC/C,IAAA,MAAM,GAAA,GAAM,IAAA;AACZ,IAAA,MAAM,QAAQ,WAAA,CAAY,GAAA,CAAI,SAAS,GAAA,CAAI,YAAA,IAAgB,IAAI,WAAW,CAAA;AAC1E,IAAA,MAAM,SAAS,WAAA,CAAY,GAAA,CAAI,UAAU,GAAA,CAAI,gBAAA,IAAoB,IAAI,eAAe,CAAA;AACpF,IAAA,MAAM,QAAQ,GAAA,CAAI,YAAA,IAAgB,IAAI,aAAA,IAAiB,GAAA,CAAI,oBAAoB,GAAA,CAAI,cAAA;AACnF,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,SAAe,EAAC;AAC/B,IAAA,OAAO,CAAC;AAAA,MACN,KAAA;AAAA,MACA,MAAA;AAAA,MACA,cAAc,KAAA,KAAU,IAAA,GAAO,IAAA,GAAO,WAAA,CAAY,KAAK,CAAA,IAAK;AAAA,KAC7D,CAAA;AAAA,EACH,CAAC,CAAA;AACD,EAAA,OAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,MAAA;AAC9C;AAYA,eAAsB,8BAAA,CACpB,MACA,GAAA,GAAiC,CAAC,YAAY,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,OAAO;AAAA,CAAI,CAAA,EACjF,QAAA,GAA4B,OAAA,CAAQ,QAAA,EACrB;AACf,EAAA,IAAI,aAAa,OAAA,EAAS;AAE1B,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAMC,aAAA,CAAK,IAAI,CAAA;AAC7B,IAAA,IAAA,GAAO,KAAA,CAAM,IAAA;AAAA,EACf,CAAA,CAAA,MAAQ;AAGN,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,eAAe,IAAA,GAAO,EAAA;AAC5B,EAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,IAAA,MAAM,KAAA,GAAA,CAAS,OAAO,GAAA,EAAO,QAAA,CAAS,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACxD,IAAA,GAAA;AAAA,MACE,CAAA,uCAAA,EAA0C,IAAI,CAAA,oCAAA,EACrC,KAAK,qBAAqB,IAAI,CAAA;AAAA,KACzC;AAAA,EACF;AACF;AC5TA,IAAM,aAAA,GAAgBC,IAAA,CAAE,MAAA,CAAOA,IAAA,CAAE,MAAA,IAAUA,IAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAkBzD,IAAM,WAAA,GAAuD;AAAA,EAClE,UAAA,EAAY;AAAA,IACV,OAAOA,IAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,IAC7B,SAAA,EAAWA,IAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,IAC3B,MAAA,EAAQA,IAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,IACxB,cAAA,EAAgBA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GACtC;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,YAAA,EAAcA,IAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AAAA,IAC7B,SAAA,EAAWA,IAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,IAC3B,SAAA,EAAWA,IAAA,CAAE,MAAA,CAAOA,IAAA,CAAE,MAAA,IAAUA,IAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS;AAAA,IACtD,cAAA,EAAgBA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GACtC;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,GAAA,EAAKA,IAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AAAA,IACpB,MAAA,EAAQA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC5B,OAAA,EAAS,aAAA;AAAA,IACT,IAAA,EAAMA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,cAAA,EAAgBA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GACtC;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,KAAA,EAAOA,KAAE,OAAA,EAAQ;AAAA,IACjB,cAAA,EAAgBA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GACtC;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,GAAA,EAAKA,IAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AAAA,IACpB,MAAA,EAAQA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC5B,OAAA,EAAS,aAAA;AAAA,IACT,IAAA,EAAMA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,cAAA,EAAgBA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GACtC;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,UAAA,EAAYA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAChC,YAAA,EAAcA,IAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GACrC;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,UAAA,EAAYA,KAAE,MAAA;AAAO,GACvB;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,UAAA,EAAYA,KAAE,MAAA;AAAO,GACvB;AAAA,EACA,iBAAiB,EAAC;AAAA,EAClB,sBAAsB,EAAC;AAAA,EACvB,sBAAsB,EAAC;AAAA,EACvB,oBAAA,EAAsB;AAAA,IACpB,QAAA,EAAUA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC9B,MAAA,EAAQA,IAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC5B,IAAA,EAAMA,KAAE,IAAA,CAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,QAAA;AAAS,GACzC;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,KAAA,EAAOA,IAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AAAS,GACnD;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,OAAA,EAASA,KAAE,OAAA;AAAQ;AAEvB,CAAA;AAQO,IAAM,gBAAA,GAAqD;AAAA,EAChE,UAAA,EAAYC,sBAAA,CAAmBC,oBAAA,CAAmB,IAAI,CAAA;AAAA,EACtD,kBAAA,EAAoBD,sBAAA,CAAmBC,oBAAA,CAAmB,UAAU,CAAA;AAAA,EACpE,gBAAA,EAAkBD,sBAAA,CAAmBC,oBAAA,CAAmB,SAAS,CAAA;AAAA,EACjE,oBAAA,EAAsBD,sBAAA,CAAmBC,oBAAA,CAAmB,OAAO,CAAA;AAAA,EACnE,cAAA,EAAgBD,sBAAA,CAAmBC,oBAAA,CAAmB,cAAc,CAAA;AAAA,EACpE,yBAAA,EAA2BD,sBAAA,CAAmBC,oBAAA,CAAmB,UAAU,CAAA;AAAA,EAC3E,wBAAA,EAA0BD,sBAAA,CAAmBC,oBAAA,CAAmB,gBAAgB,CAAA;AAAA,EAChF,sBAAA,EAAwBD,sBAAA,CAAmBC,oBAAA,CAAmB,cAAc,CAAA;AAAA,EAC5E,eAAA,EAAiBD,sBAAA,CAAmBC,oBAAA,CAAmB,QAAQ,CAAA;AAAA,EAC/D,oBAAA,EAAsBD,sBAAA,CAAmBC,oBAAA,CAAmB,aAAa,CAAA;AAAA,EACzE,oBAAA,EAAsBD,sBAAA,CAAmBC,oBAAA,CAAmB,cAAc,CAAA;AAAA,EAC1E,oBAAA,EAAsBD,sBAAA,CAAmBC,oBAAA,CAAmB,aAAa,CAAA;AAAA,EACzE,mBAAA,EAAqBD,sBAAA,CAAmBC,oBAAA,CAAmB,YAAY,CAAA;AAAA,EACvE,oBAAA,EAAsBD,sBAAA,CAAmBC,oBAAA,CAAmB,aAAa;AAC3E,CAAA;AAwBO,SAAS,mBAAmB,KAAA,EAAwF;AACzH,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,OAAO,KAAA,KAAU;AAC3B,MAAA,OAAO,QAAQ,YAAY;AACzB,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,YAAA,EAAc,KAAK,CAAA;AAC5C,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI;AAAA,YAC7B,OAAO,IAAA,CAAK,KAAA;AAAA,YACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,IAAI,IAAA,CAAK,SAAA;AAAA;AAAA;AAAA,YAGT,gBAAgB,OAAO,IAAA,CAAK,cAAA,KAAmB,QAAA,GAAW,KAAK,cAAA,GAAiB,KAAA;AAAA,WACjF,CAAA;AACD,UAAA,OAAO;AAAA,YACL,YAAY,MAAA,CAAO,SAAA;AAAA,YACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,OAAA,EAAS,OAAO,MAAA,IAAU,IAAA;AAAA,YAC1B,OAAO,IAAA,CAAK,KAAA;AAAA,YACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,WAAW,IAAA,CAAK;AAAA,WAClB;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,IAAI,GAAA,YAAeC,0BAAA,IAA0B,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1E,YAAA,OAAO;AAAA,cACL,YAAY,GAAA,CAAI,SAAA;AAAA,cAChB,MAAA,EAAQ,kBAAA;AAAA,cACR,OAAO,IAAA,CAAK,KAAA;AAAA,cACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,cACb,WAAW,IAAA,CAAK;AAAA,aAClB;AAAA,UACF;AACA,UAAA,MAAM,GAAA;AAAA,QACR;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,kBAAA,EAAoB,OAAO,KAAA,KAAU;AACnC,MAAA,OAAO,QAAQ,YAAY;AACzB,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,oBAAA,EAAsB,KAAK,CAAA;AACpD,QAAA,MAAM,QAAA,GAAW,yBAAA,CAA0B,IAAA,CAAK,SAAA,EAAqB,KAAK,SAAgD,CAAA;AAC1H,QAAA,MAAM,IAAA,GAAoB;AAAA,UACxB,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ;AAAA,SAC/B;AAaA,QAAA,IAAI,cAAc,IAAA,CAAK,YAAA;AACvB,QAAA,MAAM,iBAAiB,IAAA,CAAK,cAAA;AAC5B,QAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,KAAA,CAAM,aAAa,IAAA,EAAM,EAAE,gBAAgB,CAAA;AAEvE,QAAA,IAAI,QAAA,GAAW,MAAM,OAAA,EAAQ;AAC7B,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,UAAA,GAAa,MAAMC,0BAAA,CAAuB,WAAW,CAAA;AAG3D,UAAA,IAAI,CAAC,UAAA,IAAcC,WAAA,CAAQ,UAAA,EAAY,WAAW,CAAA,EAAG;AACnD,YAAA,MAAM,kBAAA,CAAmB,QAAA,EAAU,WAAA,EAAa,UAAU,CAAA;AAAA,UAC5D;AACA,UAAA,MAAM,QAAA,GAAW,WAAA;AACjB,UAAA,WAAA,GAAc,UAAA;AACd,UAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,EAAQ;AACpC,UAAA,IAAI,CAAC,cAAc,EAAA,EAAI;AAGrB,YAAA,MAAM,kBAAA,CAAmB,aAAA,EAAe,WAAA,EAAa,UAAA,EAAY,QAAQ,CAAA;AAAA,UAC3E;AACA,UAAA,QAAA,GAAW,aAAA;AAAA,QACb;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAC9C,QAAA,OAAO;AAAA,UACL,GAAG,OAAA;AAAA;AAAA,UAEH,YAAA,EAAc,WAAA;AAAA,UACd,GAAI,gBAAgB,IAAA,CAAK,YAAA,GAAe,EAAE,4BAAA,EAA8B,IAAA,CAAK,YAAA,EAAa,GAAI;AAAC,SACjG;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,gBAAA,EAAkB,OAAO,KAAA,KAAU;AACjC,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,kBAAA,EAAoB,KAAK,CAAA;AAClD,MAAA,IAAI;AACF,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAM,MAAM,SAAA,CAAU,IAAA,CAAK,GAAA,EAAK,WAAA,CAAY,IAAI,CAAA,EAAG,EAAE,gBAAgB,IAAA,CAAK,cAAA,EAAgB,CAAA,EAAE;AAAA,MAC5H,SAAS,GAAA,EAAK;AAKZ,QAAA,OAAO,eAAe,GAAG,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA;AAAA,IAEA,oBAAA,EAAsB,OAAO,KAAA,KAAU;AACrC,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,sBAAA,EAAwB,KAAK,CAAA;AACtD,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAGnB,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,QAAA,OAAO,SAAA;AAAA,UACL,YAAA;AAAA,UACA,oNAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,CAAC,MAAM,eAAA,EAAiB;AAC1B,QAAA,OAAO,SAAA;AAAA,UACL,YAAA;AAAA,UACA,oHAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,QAAQ,YAAY;AACzB,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,OAAoB,EAAE,cAAA,EAAgB,IAAA,CAAK,cAAA,EAAgB,CAAA;AAC1G,QAAA,OAAO,gBAAgB,QAAQ,CAAA;AAAA,MACjC,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,cAAA,EAAgB,OAAO,KAAA,KAAU;AAC/B,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,gBAAA,EAAkB,KAAK,CAAA;AAChD,MAAA,OAAO,QAAQ,YAAY;AACzB,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK,WAAA,CAAY,IAAI,CAAA,EAAG,EAAE,cAAA,EAAgB,IAAA,CAAK,gBAAgB,CAAA;AACvG,QAAA,OAAO,gBAAgB,QAAQ,CAAA;AAAA,MACjC,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,yBAAA,EAA2B,OAAO,KAAA,KAAU;AAC1C,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,2BAAA,EAA6B,KAAK,CAAA;AAI3D,MAAA,OAAO,QAAQ,YAAY;AACzB,QAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA;AAC5C,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,iBAAA,CAAkB,KAAK,CAAA;AACpD,QAAA,OAAO,gBAAgB,QAAQ,CAAA;AAAA,MACjC,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,wBAAA,EAA0B,OAAO,KAAA,KAAU;AACzC,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,0BAAA,EAA4B,KAAK,CAAA;AAM1D,MAAA,OAAO,QAAQ,YAAY,KAAA,CAAM,yCAAA,CAA0C,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IAC7F,CAAA;AAAA,IAEA,sBAAA,EAAwB,OAAO,KAAA,KAAU;AACvC,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,wBAAA,EAA0B,KAAK,CAAA;AACxD,MAAA,OAAO,QAAQ,YAAY,KAAA,CAAM,cAAA,CAAe,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IAClE,CAAA;AAAA,IAEA,iBAAiB,YAAY,OAAA,CAAQ,YAAY,KAAA,CAAM,iBAAiB,CAAA;AAAA,IACxE,sBAAsB,YAAY,OAAA,CAAQ,YAAY,KAAA,CAAM,eAAe,CAAA;AAAA,IAC3E,sBAAsB,YAAY,OAAA,CAAQ,YAAY,KAAA,CAAM,eAAe,CAAA;AAAA,IAC3E,oBAAA,EAAsB,OAAO,KAAA,KAAU;AACrC,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,sBAAA,EAAwB,KAAK,CAAA;AACtD,MAAA,OAAO,QAAQ,YAAY;AACzB,QAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,aAAA,CAAc;AAAA,UACxC,UAAU,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,KAAK,QAAA,GAAW,KAAA,CAAA;AAAA,UAC9D,QAAQ,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAAW,KAAK,MAAA,GAAS,KAAA,CAAA;AAAA,UACxD,IAAA,EAAM,KAAK,IAAA,KAAS,MAAA,IAAU,KAAK,IAAA,KAAS,KAAA,GAAQ,KAAK,IAAA,GAAO,KAAA;AAAA,SACjE,CAAA;AACD,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UAC7B,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,cAAc,KAAA,CAAM,WAAA;AAAA,UACpB,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,WAAW,KAAA,CAAM,QAAA;AAAA,UACjB,gBAAgB,KAAA,CAAM,aAAA;AAAA,UACtB,eAAe,KAAA,CAAM,YAAA;AAAA,UACrB,cAAc,KAAA,CAAM,WAAA;AAAA,UACpB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,aAAa,KAAA,CAAM,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMnB,cAAA,EACE,KAAA,CAAM,QAAA,KAAa,KAAA,GAAQ,oBAAA,GACzB;AAAA,SACN,CAAE,CAAA;AAAA,MACJ,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,mBAAA,EAAqB,OAAO,KAAA,KAAU;AACpC,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,qBAAA,EAAuB,KAAK,CAAA;AACrD,MAAA,OAAO,OAAA,CAAQ,YAAY,KAAA,CAAM,YAAA,CAAa,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA;AAAA,IACtE,CAAA;AAAA,IACA,oBAAA,EAAsB,OAAO,KAAA,KAAU;AACrC,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,sBAAA,EAAwB,KAAK,CAAA;AACtD,MAAA,OAAO,OAAA,CAAQ,YAAYC,wBAAA,CAAqB,IAAA,CAAK,OAAyB,CAAC,CAAA;AAAA,IACjF;AAAA,GACF;AAEA,EAAA,eAAe,WAAA,CACb,MACA,IAAA,EAC0B;AAC1B,IAAA,MAAM,KAAA,GACJ,IAAA,CAAK,YAAA,KACJ,IAAA,CAAK,UAAA,GAAa,MAAM,KAAA,CAAM,cAAA,CAAe,IAAA,CAAK,UAAU,CAAA,GAAI,MAAA,CAAA;AAEnE,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,MAAA,MAAM,IAAIC,iBAAA,CAAc,CAAA,aAAA,EAAgB,IAAI,iDAAiD,GAAG,CAAA;AAAA,IAClG;AAEA,IAAA,IAAK,KAAA,CAA6B,SAAS,IAAA,EAAM;AAC/C,MAAA,MAAM,IAAIA,iBAAA,CAAc,CAAA,4BAAA,EAA+B,IAAI,CAAA,MAAA,CAAA,EAAU,KAAK,KAAK,CAAA;AAAA,IACjF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,MAAA,EAAqC;AAC9D,EAAA,OAAO,MAAA,KAAW,aAAa,MAAA,KAAW,kBAAA;AAC5C;AAOA,SAAS,SAAA,CAAU,IAAA,EAAc,OAAA,EAAiB,cAAA,EAAsC;AACtF,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,SAAS,cAAA,EAAe;AACzD;AAGA,SAAS,yBAAA,CACP,UACA,IAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,EAAA,EAAI,CAAA,UAAA,EAAa,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,IAC3B,MAAA,EAAQ,YAAA;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,SAAA,EAAW,QAAQ;AAAC;AACtB,GACF;AACF;AAEA,SAAS,WAAA,CACP,MACA,KAAA,EACqB;AACrB,EAAA,OAAOP,IAAA,CAAE,OAAO,WAAA,CAAY,IAAI,CAAC,CAAA,CAAE,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA;AACtD;AAEA,SAAS,YAAY,KAAA,EAAsG;AACzH,EAAA,IAAI,CAAC,MAAM,MAAA,IAAU,CAAC,MAAM,OAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,OAAO,MAAA;AACxE,EAAA,OAAO;AAAA,IACL,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,MAAM,KAAA,CAAM;AAAA,GACd;AACF;AAEA,eAAe,QAAW,EAAA,EAA+C;AACvE,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAM,IAAG,EAAE;AAAA,EAC3C,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,eAAe,GAAG,CAAA;AAAA,EAC3B;AACF;AAEA,eAAe,gBAAgB,QAAA,EAAsD;AACnF,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,EAAA,OAAO;AAAA,IACL,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,YAAY,QAAA,CAAS,UAAA;AAAA,IACrB,SAAS,MAAA,CAAO,WAAA,CAAY,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA;AAAA,IACtD,IAAA,EAAM,eAAe,IAAI;AAAA,GAC3B;AACF;AAEA,SAAS,eAAe,IAAA,EAAuB;AAC7C,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAWA,SAAS,kBAAA,CACP,QAAA,EACA,WAAA,EACA,UAAA,EACA,iBAAA,EACe;AACf,EAAA,MAAM,OAAO,iBAAA,GACT,CAAA,iBAAA,EAAoB,WAAW,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,6BAAA,EACpC,WAAW,CAAA,gBAAA,EAAmB,iBAAiB,CAAA,sCAAA,CAAA,GAE9E,CAAA,iBAAA,EAAoB,WAAW,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,CAAA,CAAA;AACvE,EAAA,MAAM,QAAA,GAAW,oBACb,EAAA,GACA,UAAA,GACE,iDAAiD,UAAU,CAAA,2CAAA,CAAA,GAC3D,6FACM,WAAW,CAAA,kFAAA,CAAA;AACvB,EAAA,OAAO,IAAIO,kBAAc,CAAA,EAAG,IAAI,GAAG,QAAQ,CAAA,CAAA,EAAI,QAAA,CAAS,MAAA,IAAU,GAAG,CAAA;AACvE;AAEA,SAAS,eAAe,GAAA,EAA2B;AACjD,EAAA,IAAI,eAAeJ,0BAAA,EAAwB;AACzC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,cAAc,GAAA,CAAI,WAAA;AAAA,MAClB,MAAM,GAAA,CAAI;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,IAAI,eAAeK,qBAAA,EAAmB;AACpC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI;AAAA,KACf;AAAA,EACF;AAEA,EAAA,IAAI,eAAeD,iBAAA,EAAe;AAChC,IAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,KAAA,EAAO,iBAAA,CAAkB,IAAA,EAAM,KAAK,CAAA;AAAA,MACpC,UAAA,EACE,kBAAkB,IAAA,EAAM,UAAU,KAClC,iBAAA,CAAkB,IAAA,EAAM,WAAW,CAAA,IACnCE,0BAAA,CAAuB,eAAA;AAAA,MACzB,MAAM,GAAA,CAAI;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,IAAI,eAAeC,cAAA,EAAY;AAC7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,IAAA,EAAM,eAAA;AAAA,IACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,IACxD,YAAYD,0BAAA,CAAuB;AAAA,GACrC;AACF;AAEA,SAAS,kBAAkB,KAAA,EAAoC;AAC7D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;ACtdO,SAAS,mBAAmB,KAAA,EAA6B;AAC9D,EAAA,MAAM,kBAAA,GAAqB,CAAC,GAAG,KAAA,CAAM,gBAAgB,EAClD,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,KAAK,IAAI,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,YAAA,IAAgB,MAAM,EAAE,CAAA,CAC/D,IAAA,EAAK,CACL,IAAA,CAAK,GAAG,CAAA;AACX,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,KAAA,CAAM,SAAS,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAAA;AAM1D,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,KAAA,CAAM,YAAA;AAAA,IACN,MAAM,MAAA,IAAU,EAAA;AAAA,IAChB,MAAM,OAAA,IAAW,EAAA;AAAA,IAAA,CAChB,KAAA,CAAM,WAAA,IAAe,EAAA,EAAI,WAAA,EAAY;AAAA,IAAA,CACrC,KAAA,CAAM,eAAA,IAAmB,EAAA,EAAI,WAAA,EAAY;AAAA,IAC1C,MAAM,OAAA,IAAW;AAAA,GACnB,CAAE,KAAK,GAAG,CAAA;AACV,EAAA,OAAOE,iBAAA,CAAW,QAAQ,CAAA,CACvB,MAAA,CAAO,GAAG,QAAQ;AAAA,EAAK,aAAa;AAAA,EAAK,kBAAkB,EAAE,CAAA,CAC7D,MAAA,CAAO,KAAK,CAAA,CACZ,KAAA,CAAM,GAAG,EAAE,CAAA;AAChB;AAEO,SAAS,kBAAA,CAAmB,OAAqB,IAAA,EAAsB;AAC5E,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,EAAA;AAAA,IACA,0WAAA;AAAA,IACA,8CAAA;AAAA,IACA,0WAAA;AAAA,IACA,EAAA;AAAA,IACA,CAAA,YAAA,EAAe,MAAM,YAAY,CAAA,MAAA;AAAA,GACnC;AACA,EAAA,IAAI,MAAM,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AACzD,EAAA,IAAI,MAAM,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC3D,EAAA,IAAI,MAAM,WAAA,EAAa,KAAA,CAAM,KAAK,CAAA,qBAAA,EAAwB,KAAA,CAAM,WAAW,CAAA,CAAE,CAAA;AAC7E,EAAA,IAAI,MAAM,eAAA,EAAiB,KAAA,CAAM,KAAK,CAAA,yBAAA,EAA4B,KAAA,CAAM,eAAe,CAAA,CAAE,CAAA;AACzF,EAAA,IAAI,OAAO,MAAM,OAAA,KAAY,QAAA,QAAgB,IAAA,CAAK,CAAA,WAAA,EAAc,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC/E,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,+DAA+D,CAAA;AAC1E,EAAA,KAAA,CAAM,KAAK,+DAA+D,CAAA;AAC1E,EAAA,KAAA,CAAM,KAAK,yEAAqE,CAAA;AAChF,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,sDAAsD,CAAA;AACjE,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,SAAA,EAAW;AAClC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAO,IAAI,CAAA,CAAE,CAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,gBAAA,CAAiB,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9C;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,IAAI,KAAA,CAAM,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,sCAAsC,CAAA;AACjD,IAAA,KAAA,CAAM,KAAK,4DAA4D,CAAA;AACvE,IAAA,KAAA,CAAM,KAAK,gDAAgD,CAAA;AAAA,EAC7D,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,iEAAiE,CAAA;AAC5E,IAAA,KAAA,MAAW,CAAA,IAAK,MAAM,gBAAA,EAAkB;AACtC,MAAA,MAAM,QAAQ,CAAA,CAAE,YAAA,GAAe,CAAA,KAAA,EAAQ,CAAA,CAAE,YAAY,CAAA,IAAA,CAAA,GAAS,aAAA;AAC9D,MAAA,KAAA,CAAM,IAAA,CAAK,kBAAa,CAAA,CAAE,MAAM,IAAI,CAAA,CAAE,KAAK,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,IACvD;AAAA,EACF;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,iEAAiE,CAAA;AAC5E,EAAA,KAAA,CAAM,KAAK,8DAA8D,CAAA;AACzE,EAAA,KAAA,CAAM,KAAK,kCAAkC,CAAA;AAC7C,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAE,CAAA;AAClC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,EAAyB,IAAI,CAAA,kCAAA,CAAqC,CAAA;AAC7E,EAAA,KAAA,CAAM,KAAK,sEAAiE,CAAA;AAC5E,EAAA,KAAA,CAAM,KAAK,uDAAuD,CAAA;AAClE,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,0WAA8D,CAAA;AACzE,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAGA,eAAsB,aAAA,CACpB,KAAA,EACA,OAAA,GAA0B,EAAC,EACD;AAC1B,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA;AACnC,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,MAAA;AACnC,EAAA,MAAM,IAAA,GAAO,mBAAmB,KAAK,CAAA;AAGrC,EAAA,IAAI,GAAA,CAAI,kBAAkB,MAAA,EAAQ;AAChC,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,QAAQ,cAAA,EAAe;AAAA,EAClD;AAGA,EAAA,IAAI,OAAO,GAAA,CAAI,aAAA,KAAkB,YAAY,GAAA,CAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AACzE,IAAA,IAAI,GAAA,CAAI,kBAAkB,IAAA,EAAM;AAC9B,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,QAAQ,eAAA,EAAgB;AAAA,IACnD;AACA,IAAA,GAAA,CAAI,KAAA,CAAM,kBAAA,CAAmB,KAAA,EAAO,IAAI,CAAC,CAAA;AACzC,IAAA,GAAA,CAAI,KAAA;AAAA,MACF,CAAA;AAAA,UAAA,EACa,IAAI;AAAA,UAAA,EACJ,IAAI,aAAa;AAAA;;AAAA;AAAA,KAEhC;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,kBAAA,EAAmB;AAAA,EACvD;AAGA,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,eAAe,CAAA;AACnD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,OAAO,CAAA;AACxC,IAAA,IAAI,MAAA,EAAQ,QAAQ,IAAA,EAAM;AACxB,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,QAAQ,gBAAA,EAAiB;AAAA,IACpD;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,IAAA,GAAA,CAAI,KAAA,CAAM,kBAAA,CAAmB,KAAA,EAAO,IAAI,CAAC,CAAA;AACzC,IAAA,MAAM,YAAA,CAAa,SAAS,IAAI,CAAA;AAChC,IAAA,GAAA,CAAI,KAAA,CAAM,4BAA4B,OAAO;;AAAA,CAAM,CAAA;AACnD,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,QAAQ,gBAAA,EAAiB;AAAA,EACpD;AAGA,EAAA,GAAA,CAAI,KAAA,CAAM,kBAAA,CAAmB,KAAA,EAAO,IAAI,CAAC,CAAA;AACzC,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,QAAQ,oBAAA,EAAqB;AACzD;AAEA,SAAS,YAAY,eAAA,EAAyC;AAC5D,EAAA,IAAI,CAAC,iBAAiB,OAAO,IAAA;AAC7B,EAAA,OAAOC,YAAA,CAAQ,CAAA,EAAG,eAAe,CAAA,SAAA,CAAW,CAAA;AAC9C;AAEA,eAAe,YAAY,IAAA,EAAgD;AACzE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMd,iBAAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO,EAAE,KAAK,OAAO,MAAA,CAAO,QAAQ,QAAA,GAAW,MAAA,CAAO,MAAM,KAAA,CAAA,EAAU;AAAA,EACxE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAe,YAAA,CAAae,QAAc,IAAA,EAA6B;AACrE,EAAA,MAAMC,eAAMC,YAAA,CAAQF,MAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,EAAA,MAAMG,kBAAA;AAAA,IACJH,MAAA;AAAA,IACA,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAK,IAAA,EAAM,EAAA,EAAA,iBAAI,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,EAAE,EAAG,MAAM,CAAC,CAAA;AAAA,IACnE;AAAA,GACF;AACF;AA2BA,eAAsB,sBAAA,CACpB,KAAA,EACA,IAAA,EACA,SAAA,EACuB;AACvB,EAAA,IAAI,gBAAA,GAAqD,IAAA,CAAK,gBAAA,IAAoB,EAAC;AACnF,EAAA,IAAI,cAAc,IAAA,CAAK,WAAA;AACvB,EAAA,IAAI,kBAAsC,IAAA,CAAK,eAAA;AAC/C,EAAA,IAAI,UAA8B,IAAA,CAAK,OAAA;AAEvC,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,aAAA,EAAc;AAC1C,IAAA,MAAM,IAAA,GAAyB,kBAAA,CAAmB,OAAO,CAAA,GACrD,OAAA,CAAQ,UAAA,GACR,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAClB,OAAA,GACD,EAAC;AACP,IAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC/B,MAAA,WAAA,GAAc,QAAQ,WAAA,IAAe,WAAA;AACrC,MAAA,eAAA,GAAkB,OAAA,CAAQ,eAAA;AAC1B,MAAA,OAAA,GAAU,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GAAW,QAAQ,OAAA,GAAU,OAAA;AAAA,IACpE;AACA,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC5C,KAAA,EAAO,EAAE,WAAA,IAAe,SAAA;AAAA,MACxB,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAS,MAAA,IAAU,EAAE,gBAAA,IAAoB,GAAA;AAAA,MACnD,YAAA,EACE,OAAO,CAAA,CAAE,OAAA,EAAS,iBAAiB,QAAA,GAC/B,CAAA,CAAE,OAAA,CAAQ,YAAA,GACV,OAAO,CAAA,CAAE,cAAA,KAAmB,QAAA,GAC1B,EAAE,cAAA,GACF;AAAA,KACV,CAAE,CAAA;AACF,IAAA,gBAAA,GAAmB,oBAAA;AAAA,EACrB,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAAA,IACtC,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,WAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,mBAAmB,KAAA,EAAgD;AAC1E,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,gBAAgB,KAAA,IAChB,KAAA,CAAM,OAAA,CAAS,KAAA,CAAkC,UAAU,CAAA;AAE/D;AAQA,SAAS,aAAa,MAAA,EAAwB;AAC5C,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC3B;AAGO,SAAS,mBAAA,GAA0C;AACxD,EAAA,OAAO,MAAA,CAAO,KAAK,WAAW,CAAA;AAChC;;;AChRA,eAAsB,kBAAA,CAAmB,OAAA,GAAiC,EAAC,EAAiC;AAO1G,EAAA,0BAAA,CAA2B,QAAQ,WAAW,CAAA;AAE9C,EAAA,MAAM,mBAAmB,OAAA,CAAQ,eAAA,IAAmB,OAAA,CAAQ,YAAA,IAAgB,QAAQ,UAAA,GAChF;AAAA,IACE,iBAAiB,OAAA,CAAQ,eAAA;AAAA,IACzB,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB,YAAY,OAAA,CAAQ;AAAA,GACtB,GACA,MAAA;AACJ,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,MAAM,gBAAgB,gBAAgB,CAAA;AACjF,EAAA,MAAM,MAAA,GAAS,IAAII,eAAAA,CAAY;AAAA,IAC7B,QAAQ,WAAA,CAAY,MAAA;AAAA,IACpB,aAAa,WAAA,CAAY,WAAA;AAAA,IACzB,SAAS,WAAA,CAAY;AAAA,GACtB,CAAA;AACD,EAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAC/B;AAiBO,IAAM,QAAA,GAAW,eAAA;AACjB,IAAM,WAAA,GAAc,gBAAA;AASpB,IAAM,gBAAA,GAAmB;AAAA,EAC9B,4EAAA;AAAA,EACA,6EAAA;AAAA,EACA,yEAAA;AAAA,EACA,wDAAA;AAAA,EACA,EAAA;AAAA,EACA,8DAAA;AAAA,EACA,qEAAA;AAAA,EACA,8EAAA;AAAA,EACA,uCAAA;AAAA,EACA,EAAA;AAAA,EACA,gFAAA;AAAA,EACA,4EAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI,CAAA;AAEJ,SAAS,eAAe,KAAA,EAA+B;AAC5D,EAAA,MAAM,SAAS,IAAIC,gBAAA;AAAA,IACjB;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,IACA,EAAE,cAAc,gBAAA;AAAiB,GACnC;AAEA,EAAA,MAAM,QAAA,GAAW,mBAAmB,KAAK,CAAA;AACzC,EAAA,MAAM,YAAA,GAAgB,MAAA,CAAe,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AACrD,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAyB;AACjE,IAAA,YAAA;AAAA,MACE,IAAA;AAAA,MACA,iBAAiB,IAAI,CAAA;AAAA,MACrB,YAAY,IAAI,CAAA;AAAA,MAChB,OAAO,SACL,KAAA,CAAM,kBAAA;AAAA,QAAmB,EAAE,oBAAoB,IAAA,EAAK;AAAA,QAAG,YACrD,WAAA,CAAY,MAAM,SAAS,IAAI,CAAA,CAAE,IAAI,CAAC;AAAA;AACxC,KACJ;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,0BAAA,CAA2B,WAAA,GAAsB,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAY;AAC5F,EAAA,IAAIC,0BAAA,CAAuB,WAAW,CAAA,EAAG;AACzC,EAAA,MAAM,MAA6B,IAAI,KAAA;AAAA,IACrCC,iCAAA,CAA8B,EAAE,OAAA,EAAS,sBAAA,EAAwB,aAAa;AAAA,GAChF;AACA,EAAA,GAAA,CAAI,IAAA,GAAO,4BAAA;AACX,EAAA,MAAM,GAAA;AACR;AAEA,eAAsB,cAAA,CAAe,OAAA,GAAiC,EAAC,EAAkB;AAGvF,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,aAAY,GAAI,MAAM,mBAAmB,OAAO,CAAA;AAEvE,EAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,IAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,KAAA,EAAO,aAAa,OAAO,CAAA;AACjE,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAEhB,MAAA,MAAM,MAA6B,IAAI,KAAA;AAAA,QACrC,QAAA,CAAS,MAAA,KAAW,kBAAA,GAChB,6EAAA,GACA;AAAA,OACN;AACA,MAAA,GAAA,CAAI,IAAA,GAAO,sBAAA;AACX,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,EAAA,MAAM,MAAA,CAAO,OAAA,CAAQ,IAAIC,6BAAA,EAAsB,CAAA;AACjD;AAEA,eAAsB,cAAA,CACpB,KAAA,EACA,WAAA,EACA,OAAA,EAC0B;AAC1B,EAAA,MAAM,YAAY,mBAAA,EAAoB;AACtC,EAAA,MAAM,QAAQ,MAAM,sBAAA;AAAA,IAClB,KAAA;AAAA,IACA;AAAA,MACE,QAAQ,WAAA,CAAY,MAAA;AAAA,MACpB,QAAQ,WAAA,CAAY,MAAA;AAAA,MACpB,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,aAAa,WAAA,CAAY,WAAA;AAAA,MACzB,iBAAiB,WAAA,CAAY,eAAA;AAAA,MAC7B,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,kBAAkB,WAAA,CAAY;AAAA,KAChC;AAAA,IACA;AAAA,GACF;AAKA,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,mBAAmB,WAAA,CAAY,UAAA;AACvF,EAAA,OAAO,cAAc,KAAA,EAAO;AAAA,IAC1B,eAAA;AAAA,IACA,UAAU,OAAA,CAAQ;AAAA,GACnB,CAAA;AACH;AAEA,SAAS,YAAY,OAAA,EAAsB;AACzC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,OAAA,CAAQ,OAAA;AAAA,IAClB,OAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,MAAM,CAAC;AAAA;AACvC;AACF,GACF;AACF;;;ACzNA,SAAS,UAAU,IAAA,EAAuC;AACxD,EAAA,MAAM,UAAiC,EAAC;AACxC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA,EAAG;AACvC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,GAAA,KAAQ,eAAA,IAAmB,GAAA,KAAQ,oBAAA,EAAsB;AAC3D,MAAA,OAAA,CAAQ,eAAA,GAAkB,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACpC,MAAA,CAAA,IAAK,CAAA;AAAA,IACP,CAAA,MAAA,IAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,OAAA,CAAQ,YAAA,GAAe,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACjC,MAAA,CAAA,IAAK,CAAA;AAAA,IACP,CAAA,MAAA,IAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,OAAA,CAAQ,UAAA,GAAa,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AAC/B,MAAA,CAAA,IAAK,CAAA;AAAA,IACP,CAAA,MAAA,IAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AAC5B,MAAA,CAAA,IAAK,CAAA;AACL,MAAA,IAAI,cAAc,OAAA,EAAS;AACzB,QAAA,MAAM,IAAI,MAAM,2FAA2F,CAAA;AAAA,MAC7G;AAAA,IACF,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAG1B,MAAA,OAAA,CAAQ,QAAA,GAAW,IAAA;AAAA,IACrB,CAAA,MAAA,IAAW,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,QACnB,kBAAA;AAAA,QACA,EAAA;AAAA,QACA,QAAA;AAAA,QACA,uDAAA;AAAA,QACA,qFAAA;AAAA,QACA,EAAA;AAAA,QACA,UAAA;AAAA,QACA,6FAAA;AAAA,QACA,qFAAA;AAAA,QACA,mFAAA;AAAA,QACA,sFAAA;AAAA,QACA,mFAAA;AAAA,QACA,qFAAA;AAAA,QACA,EAAA;AAAA,QACA,UAAA;AAAA,QACA,oEAAA;AAAA,QACA,0EAAA;AAAA,QACA,8EAAA;AAAA,QACA;AAAA,OACF,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AACZ,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,IAAA,GAAsB;AACnC,EAAA,MAAM,eAAe,SAAA,CAAU,OAAA,CAAQ,KAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACvD;AAEA,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACpB,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AAC5E,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB,CAAC,CAAA","file":"cli.cjs","sourcesContent":["import { readFile, stat } from 'node:fs/promises'\n\nexport interface HavenCredentialFile {\n apiKey: string\n delegateKey: string\n agentId?: string\n safeAddress?: string\n delegateAddress?: string\n chainId?: number\n network?: string\n apiUrl?: string\n allowanceSummary?: readonly HavenCredentialAllowance[]\n /**\n * Absolute path the credentials were loaded from, if any. Set when the\n * caller pointed at a JSON file via `--credentials` or `HAVEN_CREDENTIALS`;\n * left undefined when credentials came purely from environment variables.\n * The MCP server uses this to locate the consent sidecar\n * (`<sourcePath>.ack.json`) so `--ack` works regardless of how the\n * credential path was supplied.\n */\n sourcePath?: string\n identityPath?: string\n signerPath?: string\n}\n\nexport interface HavenCredentialAllowance {\n token: string\n amount: string\n resetMinutes: number | null\n}\n\nexport interface HavenCredentialSource {\n credentialsPath?: string\n identityPath?: string\n signerPath?: string\n}\n\ninterface RawCredentialFile {\n api_key?: unknown\n apiKey?: unknown\n delegate_key?: unknown\n delegateKey?: unknown\n delegate_address?: unknown\n delegateAddress?: unknown\n agent_id?: unknown\n agentId?: unknown\n safe_address?: unknown\n safeAddress?: unknown\n chain_id?: unknown\n chainId?: unknown\n network?: unknown\n api_url?: unknown\n apiUrl?: unknown\n hosted_mcp_url?: unknown\n hostedMcpUrl?: unknown\n allowance_summary?: unknown\n allowanceSummary?: unknown\n agent_budget?: unknown\n agentBudget?: unknown\n}\n\n/**\n * Load Haven agent credentials for the MCP server.\n *\n * Resolution order — earlier sources win, later sources are fallbacks:\n *\n * 1. Explicit `path` argument (typically from `--credentials <path>`).\n * 2. `HAVEN_CREDENTIALS` env var pointing at a credential JSON file.\n * 3. Inline env vars: `HAVEN_API_KEY` + `HAVEN_DELEGATE_KEY` (+ optional\n * `HAVEN_AGENT_ID`, `HAVEN_SAFE_ADDRESS`, `HAVEN_API_URL`).\n *\n * The inline-env path exists so that runtime config snippets emitted by the\n * Haven dashboard (Claude Desktop / Cursor / generic MCP configs) can be a\n * single self-contained block — paste the snippet, restart the runtime, done.\n * The values still live only in the agent operator's process environment;\n * Haven's backend never sees the delegate key either way.\n */\nexport async function loadCredentials(\n source: string | HavenCredentialSource | undefined = process.env.HAVEN_CREDENTIALS,\n): Promise<HavenCredentialFile> {\n if (typeof source === 'string') {\n return loadCredentialsFromFile(source)\n }\n if (source?.credentialsPath) {\n return loadCredentialsFromFile(source.credentialsPath)\n }\n if (source?.identityPath || source?.signerPath) {\n if (!source.identityPath || !source.signerPath) {\n throw new Error('Haven split credentials require both --identity and --signer paths.')\n }\n return loadCredentialsFromSplitFiles(source.identityPath, source.signerPath)\n }\n\n const envCreds = loadCredentialsFromEnv()\n if (envCreds) return envCreds\n\n throw new Error(\n 'No Haven credentials found. Set HAVEN_CREDENTIALS to a Haven agent credential JSON file, ' +\n 'pass --credentials <path>, or set HAVEN_API_KEY and HAVEN_DELEGATE_KEY environment variables.',\n )\n}\n\nasync function loadCredentialsFromFile(path: string): Promise<HavenCredentialFile> {\n let rawText: string\n try {\n rawText = await readFile(path, 'utf8')\n } catch (err) {\n throw new Error(`Could not read Haven credentials at ${path}: ${err instanceof Error ? err.message : String(err)}`)\n }\n\n await warnIfCredentialFilePermissive(path)\n\n let raw: RawCredentialFile\n try {\n raw = JSON.parse(rawText) as RawCredentialFile\n } catch {\n throw new Error('Haven credentials must be JSON with api_key and delegate_key fields.')\n }\n\n const apiKey = stringField(raw.api_key ?? raw.apiKey)\n const delegateKey = stringField(raw.delegate_key ?? raw.delegateKey)\n\n if (!apiKey) {\n throw new Error('Haven credentials are missing api_key.')\n }\n if (!delegateKey) {\n throw new Error('Haven MCP requires delegate_key so payments can be signed locally.')\n }\n\n return {\n apiKey,\n delegateKey,\n agentId: stringField(raw.agent_id ?? raw.agentId),\n safeAddress: stringField(raw.safe_address ?? raw.safeAddress),\n delegateAddress: stringField(raw.delegate_address ?? raw.delegateAddress),\n chainId: numberField(raw.chain_id ?? raw.chainId),\n network: stringField(raw.network),\n apiUrl: stringField(raw.api_url ?? raw.apiUrl),\n allowanceSummary: allowanceSummaryField(raw.allowance_summary ?? raw.allowanceSummary ?? raw.agent_budget ?? raw.agentBudget),\n sourcePath: path,\n }\n}\n\nasync function loadCredentialsFromSplitFiles(identityPath: string, signerPath: string): Promise<HavenCredentialFile> {\n const identity = await readJsonFile(identityPath, 'Haven identity credentials')\n const signer = await readJsonFile(signerPath, 'Haven signer credentials')\n\n await warnIfCredentialFilePermissive(identityPath)\n await warnIfCredentialFilePermissive(signerPath)\n\n const apiKey = stringField(identity.api_key ?? identity.apiKey)\n const delegateKey = stringField(signer.delegate_key ?? signer.delegateKey)\n\n if (!apiKey) {\n throw new Error('Haven identity credentials are missing api_key.')\n }\n if (!delegateKey) {\n throw new Error('Haven signer credentials are missing delegate_key.')\n }\n\n return {\n apiKey,\n delegateKey,\n agentId: matchingStringField(\n 'agent_id',\n identity.agent_id ?? identity.agentId,\n signer.agent_id ?? signer.agentId,\n ),\n safeAddress: matchingStringField(\n 'safe_address',\n identity.safe_address ?? identity.safeAddress,\n signer.safe_address ?? signer.safeAddress,\n { caseInsensitive: true },\n ),\n delegateAddress: matchingStringField(\n 'delegate_address',\n signer.delegate_address ?? signer.delegateAddress,\n identity.delegate_address ?? identity.delegateAddress,\n { caseInsensitive: true },\n ),\n chainId: matchingNumberField(\n 'chain_id',\n identity.chain_id ?? identity.chainId,\n signer.chain_id ?? signer.chainId,\n ),\n network: matchingStringField(\n 'network',\n identity.network,\n signer.network,\n { caseInsensitive: true },\n ),\n apiUrl: stringField(identity.api_url ?? identity.apiUrl),\n allowanceSummary: allowanceSummaryField(\n identity.allowance_summary ??\n identity.allowanceSummary ??\n identity.agent_budget ??\n identity.agentBudget,\n ),\n sourcePath: identityPath,\n identityPath,\n signerPath,\n }\n}\n\nasync function readJsonFile(path: string, label: string): Promise<RawCredentialFile> {\n let rawText: string\n try {\n rawText = await readFile(path, 'utf8')\n } catch (err) {\n throw new Error(`Could not read ${label} at ${path}: ${err instanceof Error ? err.message : String(err)}`)\n }\n\n try {\n return JSON.parse(rawText) as RawCredentialFile\n } catch {\n throw new Error(`${label} must be JSON.`)\n }\n}\n\nfunction loadCredentialsFromEnv(): HavenCredentialFile | null {\n const apiKey = stringField(process.env.HAVEN_API_KEY)\n const delegateKey = stringField(process.env.HAVEN_DELEGATE_KEY)\n\n if (!apiKey && !delegateKey) return null\n\n if (!apiKey) {\n throw new Error('HAVEN_DELEGATE_KEY is set but HAVEN_API_KEY is missing.')\n }\n if (!delegateKey) {\n throw new Error('HAVEN_API_KEY is set but HAVEN_DELEGATE_KEY is missing. Haven MCP requires a delegate key so payments can be signed locally.')\n }\n\n return {\n apiKey,\n delegateKey,\n agentId: stringField(process.env.HAVEN_AGENT_ID),\n safeAddress: stringField(process.env.HAVEN_SAFE_ADDRESS),\n chainId: numberField(process.env.HAVEN_CHAIN_ID),\n network: stringField(process.env.HAVEN_NETWORK),\n apiUrl: stringField(process.env.HAVEN_API_URL),\n }\n}\n\nfunction stringField(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined\n}\n\nfunction numberField(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim() && /^\\d+$/.test(value.trim())) return Number(value.trim())\n return undefined\n}\n\nfunction matchingStringField(\n label: string,\n preferred: unknown,\n fallback: unknown,\n options: { caseInsensitive?: boolean } = {},\n): string | undefined {\n const preferredValue = stringField(preferred)\n const fallbackValue = stringField(fallback)\n if (\n preferredValue &&\n fallbackValue &&\n !sameCredentialValue(preferredValue, fallbackValue, options.caseInsensitive)\n ) {\n throw mismatchedSplitCredentialError(label)\n }\n return preferredValue ?? fallbackValue\n}\n\nfunction matchingNumberField(label: string, preferred: unknown, fallback: unknown): number | undefined {\n const preferredValue = numberField(preferred)\n const fallbackValue = numberField(fallback)\n if (preferredValue !== undefined && fallbackValue !== undefined && preferredValue !== fallbackValue) {\n throw mismatchedSplitCredentialError(label)\n }\n return preferredValue ?? fallbackValue\n}\n\nfunction sameCredentialValue(first: string, second: string, caseInsensitive = false): boolean {\n return caseInsensitive ? first.toLowerCase() === second.toLowerCase() : first === second\n}\n\nfunction mismatchedSplitCredentialError(label: string): Error {\n return new Error(\n `Haven split credentials have mismatched ${label} values. ` +\n 'Recreate the identity and signer credential files from the same Haven agent.',\n )\n}\n\nfunction allowanceSummaryField(value: unknown): HavenCredentialAllowance[] | undefined {\n if (!Array.isArray(value)) return undefined\n const allowances = value.flatMap((item) => {\n if (!item || typeof item !== 'object') return []\n const raw = item as Record<string, unknown>\n const token = stringField(raw.token ?? raw.token_symbol ?? raw.tokenSymbol)\n const amount = stringField(raw.amount ?? raw.allowance_amount ?? raw.allowanceAmount)\n const reset = raw.resetMinutes ?? raw.reset_minutes ?? raw.reset_period_min ?? raw.resetPeriodMin\n if (!token || !amount) return []\n return [{\n token,\n amount,\n resetMinutes: reset === null ? null : numberField(reset) ?? null,\n }]\n })\n return allowances.length > 0 ? allowances : undefined\n}\n\n/**\n * Warn (but do not block) when the credential file is readable by users\n * other than the owner. The check is best-effort: it only runs on POSIX\n * filesystems where the stat mode bits map cleanly. Windows ACLs require\n * `icacls`-style introspection that doesn't fit a single stat call, so we\n * skip the check there and the dashboard handoff text guides the user\n * separately.\n *\n * Exported for testing.\n */\nexport async function warnIfCredentialFilePermissive(\n path: string,\n log: (message: string) => void = (message) => process.stderr.write(`${message}\\n`),\n platform: NodeJS.Platform = process.platform,\n): Promise<void> {\n if (platform === 'win32') return\n\n let mode: number\n try {\n const stats = await stat(path)\n mode = stats.mode\n } catch {\n // The credential read already failed cleanly above if the file is\n // unreadable. A stat failure here is not worth blocking on.\n return\n }\n\n const groupOrOther = mode & 0o077\n if (groupOrOther !== 0) {\n const octal = (mode & 0o777).toString(8).padStart(4, '0')\n log(\n `haven-mcp: warning: credential file at ${path} is readable beyond the owner ` +\n `(mode ${octal}). Run: chmod 600 ${path}`,\n )\n }\n}\n","/**\n * Local (stdio) MCP tool handlers. This package runs in the AGENT OPERATOR'S\n * OWN environment — it reads the local credential file and signs locally; the\n * hosted backend is not in the loop for the merchant call. So `merchant_url`\n * passed to `haven.fetch` below is NOT an SSRF surface: the agent is the\n * principal paying a merchant IT chose, on its own machine — the same trust\n * position as running `curl`. There is no server reflecting attacker input\n * into an internal request. (Hosted, multi-tenant fetches live in mcp-server,\n * which is where URL-hardening would matter.)\n */\nimport {\n AgentPaymentNextAction,\n HavenApiError,\n HavenClient,\n HavenError,\n HavenPaymentStateError,\n HavenSigningError,\n composeDescription,\n discoverMerchantMcpUrl,\n sameUrl,\n toolDescriptions as sharedDescriptions,\n verifyPaymentReceipt,\n type PaymentReceipt,\n type X402Quote,\n type X402ResumeState,\n} from '@haven_ai/sdk'\nimport { z } from 'zod/v3'\n\nconst headersSchema = z.record(z.string(), z.string()).optional()\n\nexport type HavenMcpToolName =\n | 'haven_send'\n | 'haven_pay_mcp_tool'\n | 'haven_quote_x402'\n | 'haven_pay_x402_quote'\n | 'haven_pay_x402'\n | 'haven_resume_x402_payment'\n | 'haven_get_payment_status'\n | 'haven_get_resume_state'\n | 'haven_get_agent'\n | 'haven_get_allowances'\n | 'haven_list_receipts'\n | 'haven_verify_receipt'\n | 'haven_sweep_delegate'\n | 'haven_discover_tools'\n\nexport const toolSchemas: Record<HavenMcpToolName, z.ZodRawShape> = {\n haven_send: {\n asset: z.enum(['ETH', 'USDC']),\n recipient: z.string().min(1),\n amount: z.string().min(1),\n idempotencyKey: z.string().optional(),\n },\n haven_pay_mcp_tool: {\n merchant_url: z.string().url(),\n tool_name: z.string().min(1),\n arguments: z.record(z.string(), z.unknown()).optional(),\n idempotencyKey: z.string().optional(),\n },\n haven_quote_x402: {\n url: z.string().url(),\n method: z.string().optional(),\n headers: headersSchema,\n body: z.string().optional(),\n idempotencyKey: z.string().optional(),\n },\n haven_pay_x402_quote: {\n quote: z.unknown(),\n idempotencyKey: z.string().optional(),\n },\n haven_pay_x402: {\n url: z.string().url(),\n method: z.string().optional(),\n headers: headersSchema,\n body: z.string().optional(),\n idempotencyKey: z.string().optional(),\n },\n haven_resume_x402_payment: {\n payment_id: z.string().optional(),\n resume_state: z.unknown().optional(),\n },\n haven_get_payment_status: {\n payment_id: z.string(),\n },\n haven_get_resume_state: {\n payment_id: z.string(),\n },\n haven_get_agent: {},\n haven_get_allowances: {},\n haven_sweep_delegate: {},\n haven_discover_tools: {\n category: z.string().optional(),\n search: z.string().optional(),\n rail: z.enum(['x402', 'mpp']).optional(),\n },\n haven_list_receipts: {\n limit: z.number().int().min(1).max(100).optional(),\n },\n haven_verify_receipt: {\n receipt: z.unknown(),\n },\n}\n\n/**\n * MCP tool descriptions, composed from the shared semantic source in\n * `@haven_ai/sdk`'s `tool-descriptions.ts`. Keeping both the SDK tool-calling\n * surface and the MCP surface pointed at the same prose source means new\n * guidance lands in both places at once and a parity test can catch drift.\n */\nexport const toolDescriptions: Record<HavenMcpToolName, string> = {\n haven_send: composeDescription(sharedDescriptions.send),\n haven_pay_mcp_tool: composeDescription(sharedDescriptions.payMcpTool),\n haven_quote_x402: composeDescription(sharedDescriptions.quoteX402),\n haven_pay_x402_quote: composeDescription(sharedDescriptions.payX402),\n haven_pay_x402: composeDescription(sharedDescriptions.payX402OneShot),\n haven_resume_x402_payment: composeDescription(sharedDescriptions.resumeX402),\n haven_get_payment_status: composeDescription(sharedDescriptions.getPaymentStatus),\n haven_get_resume_state: composeDescription(sharedDescriptions.getResumeState),\n haven_get_agent: composeDescription(sharedDescriptions.getAgent),\n haven_get_allowances: composeDescription(sharedDescriptions.getAllowances),\n haven_sweep_delegate: composeDescription(sharedDescriptions.sweep_delegate),\n haven_discover_tools: composeDescription(sharedDescriptions.discoverTools),\n haven_list_receipts: composeDescription(sharedDescriptions.listReceipts),\n haven_verify_receipt: composeDescription(sharedDescriptions.verifyReceipt),\n}\n\nexport interface ToolSuccess<T> {\n success: true\n data: T\n}\n\nexport interface ToolFailure {\n success: false\n code: string\n message: string\n /** Structured hint pointing the agent at the correct tool for this operation. */\n suggested_tool?: string\n statusCode?: number\n paymentId?: string\n status?: string\n phase?: string\n nextAction?: string\n resume_state?: unknown\n body?: unknown\n}\n\nexport type ToolPayload<T = unknown> = ToolSuccess<T> | ToolFailure\n\nexport function createToolHandlers(haven: HavenClient): Record<HavenMcpToolName, (input: unknown) => Promise<ToolPayload>> {\n return {\n haven_send: async (input) => {\n return runTool(async () => {\n const args = objectInput('haven_send', input)\n try {\n const result = await haven.pay({\n token: args.asset,\n amount: args.amount,\n to: args.recipient,\n // #1207: was accepted by the schema but silently dropped — now\n // carried to the backend's replay contract.\n idempotencyKey: typeof args.idempotencyKey === 'string' ? args.idempotencyKey : undefined,\n })\n return {\n payment_id: result.paymentId,\n status: result.status,\n tx_hash: result.txHash ?? null,\n asset: args.asset,\n amount: args.amount,\n recipient: args.recipient,\n }\n } catch (err) {\n if (err instanceof HavenPaymentStateError && isPendingApproval(err.status)) {\n return {\n payment_id: err.paymentId,\n status: 'pending_approval',\n asset: args.asset,\n amount: args.amount,\n recipient: args.recipient,\n }\n }\n throw err\n }\n })\n },\n\n haven_pay_mcp_tool: async (input) => {\n return runTool(async () => {\n const args = objectInput('haven_pay_mcp_tool', input)\n const envelope = buildMcpToolsCallEnvelope(args.tool_name as string, args.arguments as Record<string, unknown> | undefined)\n const init: RequestInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(envelope),\n }\n // #1301: a base merchant URL is accepted, mirroring the hosted MCP's\n // #1271 discovery. `haven.fetch()` already resolves a 402 itself\n // (pays and retries) — it never hands a 402 back to us, and a\n // successfully-paid retry that the merchant rejects THROWS from\n // inside the SDK rather than returning a non-ok Response (see\n // `retryX402Request`). So any Response this call returns with\n // `.ok === false` can only be the UNTOUCHED first-hop response to a\n // URL that never spoke 402 at all — free-tool 200s and paid 200s\n // both stay `.ok === true` and never reach this branch. That is the\n // local flow's equivalent of the hosted probe's\n // `X402UnexpectedStatusError` (#1300): \"this URL isn't the MCP\n // endpoint,\" expressed as a Response instead of a thrown error.\n let merchantUrl = args.merchant_url as string\n const idempotencyKey = args.idempotencyKey as string | undefined\n const attempt = () => haven.fetch(merchantUrl, init, { idempotencyKey })\n\n let response = await attempt()\n if (!response.ok) {\n const discovered = await discoverMerchantMcpUrl(merchantUrl)\n // Trailing-slash/case echoes of the input are \"same URL\" — spend\n // the one retry only on a genuinely different endpoint.\n if (!discovered || sameUrl(discovered, merchantUrl)) {\n throw discoveryMissError(response, merchantUrl, discovered)\n }\n const inputUrl = merchantUrl\n merchantUrl = discovered\n const retryResponse = await attempt()\n if (!retryResponse.ok) {\n // Label which URL failed — the agent otherwise cannot tell the\n // discovered endpoint's miss from the original probe's.\n throw discoveryMissError(retryResponse, merchantUrl, discovered, inputUrl)\n }\n response = retryResponse\n }\n const payload = await responsePayload(response)\n return {\n ...payload,\n // The RESOLVED endpoint (#1271/#1301), not the input as given.\n merchant_url: merchantUrl,\n ...(merchantUrl !== args.merchant_url ? { merchant_url_discovered_from: args.merchant_url } : {}),\n }\n })\n },\n\n haven_quote_x402: async (input) => {\n const args = objectInput('haven_quote_x402', input)\n try {\n return { success: true, data: await haven.quoteX402(args.url, requestInit(args), { idempotencyKey: args.idempotencyKey }) }\n } catch (err) {\n // #1328: quoteX402 still refuses a MACHINE-PAYMENT-CHALLENGE response as\n // a defensive shape guard, but nothing in Haven produces that header\n // anymore (the mpp_demo route it was built for is retired) — fall\n // through to the generic error rather than suggesting a deleted tool.\n return normalizeError(err)\n }\n },\n\n haven_pay_x402_quote: async (input) => {\n const args = objectInput('haven_pay_x402_quote', input)\n const quote = args.quote as Record<string, unknown> | null | undefined\n // Guard before network calls so the agent gets actionable guidance rather\n // than an opaque SDK error.\n if (!quote || typeof quote !== 'object') {\n return wrongTool(\n 'WRONG_TOOL',\n 'The quote argument is missing or is not a valid x402 quote object. Call haven_quote_x402 first to obtain a quote, or use haven_pay_x402 to handle the full probe → pay → retry round trip automatically.',\n 'haven_quote_x402',\n )\n }\n if (!quote.paymentRequired) {\n return wrongTool(\n 'WRONG_TOOL',\n 'The quote is missing the required paymentRequired field. Call haven_quote_x402 first to obtain a valid x402 quote.',\n 'haven_quote_x402',\n )\n }\n return runTool(async () => {\n const response = await haven.payX402Quote(args.quote as X402Quote, { idempotencyKey: args.idempotencyKey })\n return responsePayload(response)\n })\n },\n\n haven_pay_x402: async (input) => {\n const args = objectInput('haven_pay_x402', input)\n return runTool(async () => {\n const response = await haven.fetch(args.url, requestInit(args), { idempotencyKey: args.idempotencyKey })\n return responsePayload(response)\n })\n },\n\n haven_resume_x402_payment: async (input) => {\n const args = objectInput('haven_resume_x402_payment', input)\n // #1328: the mpp rail resume_state branch is retired along with\n // haven_resume_mpp_payment — any non-x402 rail is now just a\n // state-mismatch, not a \"use this other tool\" redirect.\n return runTool(async () => {\n const state = await resumeState(args, 'x402')\n const response = await haven.resumeX402Payment(state)\n return responsePayload(response)\n })\n },\n\n haven_get_payment_status: async (input) => {\n const args = objectInput('haven_get_payment_status', input)\n // #1310/#1311: shared with mcp-server's haven_get_payment_status\n // handler — see HavenClient.getPaymentStatusWithPostPurchaseAllowance\n // in @haven_ai/sdk for the single home of this \"settled x402 only\"\n // attach logic (was duplicated verbatim in both packages) and for why\n // `funded_but_unsettled` is excluded from \"settled\".\n return runTool(async () => haven.getPaymentStatusWithPostPurchaseAllowance(args.payment_id))\n },\n\n haven_get_resume_state: async (input) => {\n const args = objectInput('haven_get_resume_state', input)\n return runTool(async () => haven.getResumeState(args.payment_id))\n },\n\n haven_get_agent: async () => runTool(async () => haven.getAgentSummary()),\n haven_get_allowances: async () => runTool(async () => haven.getAllowances()),\n haven_sweep_delegate: async () => runTool(async () => haven.sweepDelegate()),\n haven_discover_tools: async (input) => {\n const args = objectInput('haven_discover_tools', input)\n return runTool(async () => {\n const entries = await haven.discoverTools({\n category: typeof args.category === 'string' ? args.category : undefined,\n search: typeof args.search === 'string' ? args.search : undefined,\n rail: args.rail === 'x402' || args.rail === 'mpp' ? args.rail : undefined,\n })\n return entries.map((entry) => ({\n id: entry.id,\n name: entry.name,\n description: entry.description,\n category: entry.category,\n resource_url: entry.resourceUrl,\n rail: entry.rail,\n protocol: entry.protocol,\n tool_name: entry.toolName,\n tool_arguments: entry.toolArguments,\n price_display: entry.priceDisplay,\n price_atomic: entry.priceAtomic,\n asset: entry.asset,\n network: entry.network,\n status: entry.status,\n verified_at: entry.verifiedAt,\n // Which Haven pay tool reaches this entry from the local MCP surface.\n // #1328: the 'mpp' rail's only-ever catalog row (the Haven MPP demo\n // resource) is delisted with the mpp_demo retirement, so this\n // fallback is unreachable today; it stays x402 rather than naming a\n // deleted tool in case a future non-demo 'mpp' rail entry appears.\n suggested_tool:\n entry.protocol === 'mcp' ? 'haven_pay_mcp_tool'\n : 'haven_pay_x402',\n }))\n })\n },\n haven_list_receipts: async (input) => {\n const args = objectInput('haven_list_receipts', input)\n return runTool(async () => haven.listReceipts({ limit: args.limit }))\n },\n haven_verify_receipt: async (input) => {\n const args = objectInput('haven_verify_receipt', input)\n return runTool(async () => verifyPaymentReceipt(args.receipt as PaymentReceipt))\n },\n }\n\n async function resumeState(\n args: { payment_id?: string; resume_state?: unknown },\n rail: 'x402',\n ): Promise<X402ResumeState> {\n const state =\n args.resume_state ??\n (args.payment_id ? await haven.getResumeState(args.payment_id) : undefined)\n\n if (!state || typeof state !== 'object') {\n throw new HavenApiError(`haven_resume_${rail}_payment requires resume_state or payment_id.`, 400)\n }\n\n if ((state as { rail?: unknown }).rail !== rail) {\n throw new HavenApiError(`Resume state is not for the ${rail} rail.`, 409, state)\n }\n\n return state as X402ResumeState\n }\n}\n\nfunction isPendingApproval(status: string | undefined): boolean {\n return status === 'pending' || status === 'pending_approval'\n}\n\n/**\n * Build a structured wrong-tool ToolFailure pointing the agent at the right tool.\n * `code` should be 'WRONG_TOOL' (wrong operation entirely) or 'WRONG_RAIL' (right\n * operation but wrong payment protocol — x402 vs MPP).\n */\nfunction wrongTool(code: string, message: string, suggested_tool?: string): ToolFailure {\n return { success: false, code, message, suggested_tool }\n}\n\n/** Build a JSON-RPC 2.0 tools/call envelope for an MCP merchant. */\nfunction buildMcpToolsCallEnvelope(\n toolName: string,\n args?: Record<string, unknown>,\n): Record<string, unknown> {\n return {\n jsonrpc: '2.0',\n id: `haven-mcp-${Date.now()}`,\n method: 'tools/call',\n params: {\n name: toolName,\n arguments: args ?? {},\n },\n }\n}\n\nfunction objectInput<TName extends HavenMcpToolName>(\n name: TName,\n input: unknown,\n): Record<string, any> {\n return z.object(toolSchemas[name]).parse(input ?? {})\n}\n\nfunction requestInit(input: { method?: string; headers?: Record<string, string>; body?: string }): RequestInit | undefined {\n if (!input.method && !input.headers && input.body === undefined) return undefined\n return {\n method: input.method,\n headers: input.headers,\n body: input.body,\n }\n}\n\nasync function runTool<T>(fn: () => Promise<T>): Promise<ToolPayload<T>> {\n try {\n return { success: true, data: await fn() }\n } catch (err) {\n return normalizeError(err)\n }\n}\n\nasync function responsePayload(response: Response): Promise<Record<string, unknown>> {\n const text = await response.text()\n return {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n body: parseMaybeJson(text),\n }\n}\n\nfunction parseMaybeJson(text: string): unknown {\n if (!text) return null\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n}\n\n/**\n * #1301: the local-flow counterpart of mcp-server's `withDiscoveryGuidance`\n * (kept there, not shared — that helper rewrites a thrown `HavenApiError`;\n * this one builds a fresh failure from a non-ok `Response`, since the local\n * `haven.fetch()` idiom never throws for a non-402 answer). Keeps the\n * original probe status authoritative, but tells the agent what discovery\n * tried — the pre-#1301 local failure mode was a silent pass-through of\n * whatever the base path served.\n */\nfunction discoveryMissError(\n response: Response,\n merchantUrl: string,\n discovered: string | null,\n discoveredFromUrl?: string,\n): HavenApiError {\n const base = discoveredFromUrl\n ? `Merchant call to ${merchantUrl} failed with HTTP ${response.status} ` +\n `(at the DISCOVERED endpoint ${merchantUrl}, resolved from ${discoveredFromUrl} ` +\n `via the merchant discovery document).`\n : `Merchant call to ${merchantUrl} failed with HTTP ${response.status}.`\n const guidance = discoveredFromUrl\n ? ''\n : discovered\n ? ` Same-origin discovery resolved the same URL (${discovered}), which still did not answer successfully.`\n : ` No same-origin discovery document was found at /.well-known/haven-demo-merchant or /. ` +\n `If ${merchantUrl} is a base merchant URL, pass the exact MCP endpoint instead (often <origin>/mcp).`\n return new HavenApiError(`${base}${guidance}`, response.status || 400)\n}\n\nfunction normalizeError(err: unknown): ToolFailure {\n if (err instanceof HavenPaymentStateError) {\n return {\n success: false,\n code: err.code,\n message: err.message,\n statusCode: err.statusCode,\n paymentId: err.paymentId,\n status: err.status,\n phase: err.phase,\n nextAction: err.nextAction,\n resume_state: err.resumeState,\n body: err.body,\n }\n }\n\n if (err instanceof HavenSigningError) {\n return {\n success: false,\n code: err.code,\n message: err.message,\n }\n }\n\n if (err instanceof HavenApiError) {\n const body = err.body as Record<string, unknown> | undefined\n return {\n success: false,\n code: err.code,\n message: err.message,\n statusCode: err.statusCode,\n paymentId: err.paymentId,\n phase: stringOrUndefined(body?.phase),\n nextAction:\n stringOrUndefined(body?.nextAction) ??\n stringOrUndefined(body?.next_action) ??\n AgentPaymentNextAction.StopAndTellUser,\n body: err.body,\n }\n }\n\n if (err instanceof HavenError) {\n return {\n success: false,\n code: err.code,\n message: err.message,\n statusCode: err.statusCode,\n paymentId: err.paymentId,\n }\n }\n\n return {\n success: false,\n code: 'UNKNOWN_ERROR',\n message: err instanceof Error ? err.message : String(err),\n nextAction: AgentPaymentNextAction.StopAndTellUser,\n }\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined\n}\n","import { createHash } from 'node:crypto'\nimport { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { dirname, resolve } from 'node:path'\nimport type { HavenAllowance, HavenAllowanceSummary, HavenClient } from '@haven_ai/sdk'\nimport { toolDescriptions, toolSchemas, type HavenMcpToolName } from './tools.js'\n\n/**\n * First-launch consent gate for the Haven MCP server.\n *\n * Why this exists (option A of issue #163): an agent runtime that loads a\n * Haven credential file is about to expose Haven payment tools to a model.\n * Before the server starts taking JSON-RPC calls we want the operator to\n * acknowledge — exactly once per credential + tool set — what those tools\n * can do and what the on-chain allowance cap actually is. The on-chain\n * AllowanceModule remains the policy primitive; this gate is informational\n * rather than enforcement.\n *\n * Resolution:\n * - `HAVEN_MCP_ACK=<hash>` env var matching the current consent hash → pass.\n * - `HAVEN_MCP_ACK=skip` → pass (intended for CI / scripted setups).\n * - sidecar file `<credentials>.ack.json` containing `{ ack: <hash> }` → pass.\n * - `--ack` CLI flag → write the sidecar file, print the consent block, pass.\n * - otherwise → print the consent block to stderr and exit non-zero.\n *\n * The hash binds the api-key prefix to the registered tool set and the\n * agent's current allowance summary, so a configuration change re-triggers\n * the prompt.\n */\n\nexport interface ConsentInput {\n apiKeyPrefix: string\n /** Haven API base URL the credential will hit. */\n apiUrl?: string\n /** Agent identity from the credential file, when present. */\n agentId?: string\n /** Haven wallet (Safe) the agent spends from. */\n safeAddress?: string\n /** Agent's delegate EOA — the local signer. */\n delegateAddress?: string\n /** Chain the agent operates on. */\n chainId?: number\n toolNames: readonly HavenMcpToolName[]\n allowanceSummary: readonly { token: string; amount: string; resetMinutes: number | null }[]\n}\n\nexport interface ConsentDecision {\n /** True if the gate is satisfied and the server may start. */\n ok: boolean\n /** Hash representing the current consent surface. */\n hash: string\n /** Reason the gate accepted (or rejected) the run. */\n reason:\n | 'env_var_match'\n | 'env_var_skip'\n | 'ack_file_match'\n | 'wrote_ack_file'\n | 'env_var_mismatch'\n | 'no_acknowledgement'\n}\n\nexport interface ConsentOptions {\n /** Path to the credential file; used to locate the sidecar `<path>.ack.json`. */\n credentialsPath?: string\n /** When true, write the sidecar file with the current hash and accept. */\n writeAck?: boolean\n /** Override the environment lookup (testing). */\n env?: Record<string, string | undefined>\n /** Override the writable stream the consent block is printed to (testing). */\n out?: { write: (chunk: string) => unknown }\n}\n\nexport function computeConsentHash(input: ConsentInput): string {\n const allowanceCanonical = [...input.allowanceSummary]\n .map((a) => `${a.token}:${a.amount}:${a.resetMinutes ?? 'none'}`)\n .sort()\n .join('|')\n const toolCanonical = [...input.toolNames].sort().join(',')\n // Identity fields are included in the hash so swapping the credential\n // to a different Haven wallet / delegate / chain — even one with an\n // identical allowance set — invalidates the prior sidecar and re-prompts\n // the operator. Addresses are normalised to lowercase so casing changes\n // in the credential file don't gratuitously re-prompt.\n const identity = [\n input.apiKeyPrefix,\n input.apiUrl ?? '',\n input.agentId ?? '',\n (input.safeAddress ?? '').toLowerCase(),\n (input.delegateAddress ?? '').toLowerCase(),\n input.chainId ?? '',\n ].join('|')\n return createHash('sha256')\n .update(`${identity}\\n${toolCanonical}\\n${allowanceCanonical}`)\n .digest('hex')\n .slice(0, 16)\n}\n\nexport function renderConsentBlock(input: ConsentInput, hash: string): string {\n const lines: string[] = [\n '',\n '────────────────────────────────────────────────────────────',\n 'Haven MCP server — first-launch consent',\n '────────────────────────────────────────────────────────────',\n '',\n `Credential: ${input.apiKeyPrefix}…`,\n ]\n if (input.apiUrl) lines.push(`Haven API: ${input.apiUrl}`)\n if (input.agentId) lines.push(`Agent ID: ${input.agentId}`)\n if (input.safeAddress) lines.push(`Haven wallet (Safe): ${input.safeAddress}`)\n if (input.delegateAddress) lines.push(`Delegate (local signer): ${input.delegateAddress}`)\n if (typeof input.chainId === 'number') lines.push(`Chain ID: ${input.chainId}`)\n lines.push('')\n lines.push('Confirm these match the Haven wallet and chain you intend the')\n lines.push('agent runtime to use. The delegate above is the only key that')\n lines.push('signs payments — it lives in this process, not on Haven\\'s backend.')\n lines.push('')\n lines.push('Tools this server will expose to your agent runtime:')\n for (const name of input.toolNames) {\n lines.push(` • ${name}`)\n lines.push(` ${toolDescriptions[name]}`)\n }\n lines.push('')\n if (input.allowanceSummary.length === 0) {\n lines.push('On-chain allowance: none configured.')\n lines.push(' Any payment will queue for manual approval. The on-chain')\n lines.push(' Safe AllowanceModule is the real spend gate.')\n } else {\n lines.push('On-chain allowance (the real spend gate, Safe AllowanceModule):')\n for (const a of input.allowanceSummary) {\n const reset = a.resetMinutes ? ` per ${a.resetMinutes} min` : ' (no reset)'\n lines.push(` • up to ${a.amount} ${a.token}${reset}`)\n }\n }\n lines.push('')\n lines.push('Anything above the on-chain allowance pauses for owner approval')\n lines.push('in the Haven dashboard. Revoking the agent on-chain disables')\n lines.push('every MCP tool that would spend.')\n lines.push('')\n lines.push(`Consent hash: ${hash}`)\n lines.push('')\n lines.push('To acknowledge, EITHER:')\n lines.push(` • set HAVEN_MCP_ACK=${hash} in this process\\'s environment, OR`)\n lines.push(' • re-run with --ack to write the acknowledgement next to your')\n lines.push(' credential file (sidecar <credentials>.ack.json).')\n lines.push('')\n lines.push('────────────────────────────────────────────────────────────')\n lines.push('')\n return lines.join('\\n')\n}\n\n/** Resolve the consent gate. Does not exit the process; the caller decides. */\nexport async function ensureConsent(\n input: ConsentInput,\n options: ConsentOptions = {},\n): Promise<ConsentDecision> {\n const env = options.env ?? process.env\n const out = options.out ?? process.stderr\n const hash = computeConsentHash(input)\n\n // 1) Explicit skip — for CI and scripted environments.\n if (env.HAVEN_MCP_ACK === 'skip') {\n return { ok: true, hash, reason: 'env_var_skip' }\n }\n\n // 2) Env var hash match.\n if (typeof env.HAVEN_MCP_ACK === 'string' && env.HAVEN_MCP_ACK.length > 0) {\n if (env.HAVEN_MCP_ACK === hash) {\n return { ok: true, hash, reason: 'env_var_match' }\n }\n out.write(renderConsentBlock(input, hash))\n out.write(\n `HAVEN_MCP_ACK was set but did not match the current consent hash.\\n` +\n `Expected: ${hash}\\n` +\n `Got: ${env.HAVEN_MCP_ACK}\\n` +\n `Re-acknowledge with the new hash above, or run with --ack.\\n\\n`,\n )\n return { ok: false, hash, reason: 'env_var_mismatch' }\n }\n\n // 3) Sidecar ack file (only meaningful when we loaded from a file).\n const ackPath = sidecarPath(options.credentialsPath)\n if (ackPath) {\n const stored = await readAckFile(ackPath)\n if (stored?.ack === hash) {\n return { ok: true, hash, reason: 'ack_file_match' }\n }\n }\n\n // 4) --ack: write the sidecar and accept.\n if (options.writeAck && ackPath) {\n out.write(renderConsentBlock(input, hash))\n await writeAckFile(ackPath, hash)\n out.write(`Wrote acknowledgement to ${ackPath}\\n\\n`)\n return { ok: true, hash, reason: 'wrote_ack_file' }\n }\n\n // 5) Otherwise: print and refuse.\n out.write(renderConsentBlock(input, hash))\n return { ok: false, hash, reason: 'no_acknowledgement' }\n}\n\nfunction sidecarPath(credentialsPath?: string): string | null {\n if (!credentialsPath) return null\n return resolve(`${credentialsPath}.ack.json`)\n}\n\nasync function readAckFile(path: string): Promise<{ ack?: string } | null> {\n try {\n const raw = await readFile(path, 'utf8')\n const parsed = JSON.parse(raw) as { ack?: unknown }\n return { ack: typeof parsed.ack === 'string' ? parsed.ack : undefined }\n } catch {\n return null\n }\n}\n\nasync function writeAckFile(path: string, hash: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(\n path,\n JSON.stringify({ ack: hash, at: new Date().toISOString() }, null, 2),\n 'utf8',\n )\n}\n\nexport interface CredentialIdentitySeed {\n apiKey: string\n apiUrl?: string\n agentId?: string\n /** Safe address from the credential file, used as a fallback. */\n safeAddress?: string\n /** Delegate address from the credential file, used before live allowance metadata is available. */\n delegateAddress?: string\n /** Chain from the credential file, used as a fallback. */\n chainId?: number\n /** Intended agent budget from the setup flow, used before on-chain approval is visible. */\n allowanceSummary?: readonly { token: string; amount: string; resetMinutes: number | null }[]\n}\n\n/**\n * Build the consent input from credential identity plus a live allowance\n * lookup. The on-chain (or configured) allowance is what the operator\n * actually cares about — that's the real spend ceiling — but we also bind\n * the hash to the Haven wallet / delegate / chain so a credential swap\n * cannot quietly reuse a prior sidecar acknowledgement.\n *\n * If `getAllowances()` fails (e.g. backend unreachable on first launch) we\n * fall through to whatever identity fields the credential file provided,\n * so the operator at least sees the tool list and the api-key prefix.\n */\nexport async function consentInputFromClient(\n haven: HavenClient,\n seed: CredentialIdentitySeed,\n toolNames: readonly HavenMcpToolName[],\n): Promise<ConsentInput> {\n let allowanceSummary: ConsentInput['allowanceSummary'] = seed.allowanceSummary ?? []\n let safeAddress = seed.safeAddress\n let delegateAddress: string | undefined = seed.delegateAddress\n let chainId: number | undefined = seed.chainId\n\n try {\n const summary = await haven.getAllowances()\n const list: HavenAllowance[] = isAllowanceSummary(summary)\n ? summary.allowances\n : Array.isArray(summary)\n ? (summary as HavenAllowance[])\n : []\n if (isAllowanceSummary(summary)) {\n safeAddress = summary.safeAddress ?? safeAddress\n delegateAddress = summary.delegateAddress\n chainId = typeof summary.chainId === 'number' ? summary.chainId : chainId\n }\n const liveAllowanceSummary = list.map((a) => ({\n token: a.tokenSymbol ?? 'UNKNOWN',\n amount: a.onchain?.amount ?? a.configuredAmount ?? '0',\n resetMinutes:\n typeof a.onchain?.resetTimeMin === 'number'\n ? a.onchain.resetTimeMin\n : typeof a.resetPeriodMin === 'number'\n ? a.resetPeriodMin\n : null,\n }))\n allowanceSummary = liveAllowanceSummary\n } catch {\n // Identity falls back to what the credential file gave us.\n }\n\n return {\n apiKeyPrefix: derivePrefix(seed.apiKey),\n apiUrl: seed.apiUrl,\n agentId: seed.agentId,\n safeAddress,\n delegateAddress,\n chainId,\n toolNames,\n allowanceSummary,\n }\n}\n\nfunction isAllowanceSummary(value: unknown): value is HavenAllowanceSummary {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'allowances' in value &&\n Array.isArray((value as { allowances: unknown }).allowances)\n )\n}\n\n/**\n * Use the leading characters of the api key (which already begins with the\n * non-secret `sk_agent_` prefix) as a stable, low-information identifier.\n * Twelve characters is enough to disambiguate credentials in front of a\n * human but not enough to reveal the secret.\n */\nfunction derivePrefix(apiKey: string): string {\n return apiKey.slice(0, 12)\n}\n\n/** Convenience: the canonical tool list registered by the server. */\nexport function registeredToolNames(): HavenMcpToolName[] {\n return Object.keys(toolSchemas) as HavenMcpToolName[]\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { HavenClient, isSupportedNodeVersion, unsupportedNodeVersionMessage } from '@haven_ai/sdk'\nimport { loadCredentials, type HavenCredentialFile } from './credentials.js'\nimport {\n createToolHandlers,\n toolDescriptions,\n toolSchemas,\n type HavenMcpToolName,\n type ToolPayload,\n} from './tools.js'\nimport {\n consentInputFromClient,\n ensureConsent,\n registeredToolNames,\n type ConsentDecision,\n} from './consent.js'\n\nexport interface HavenMcpServerOptions {\n credentialsPath?: string\n identityPath?: string\n signerPath?: string\n credentials?: HavenCredentialFile\n /**\n * When true, write the consent sidecar file (`<credentials>.ack.json`)\n * with the current consent hash and proceed. Surfaced via the `--ack`\n * CLI flag.\n */\n writeAck?: boolean\n /**\n * When true, skip the consent gate entirely. Reserved for tests and\n * controlled embedding — production CLIs should not set this.\n */\n skipConsent?: boolean\n /** Overridable so the Node-floor refusal is testable without spawning a Node. */\n nodeVersion?: string\n}\n\nexport interface ResolvedHavenClient {\n client: HavenClient\n credentials: HavenCredentialFile\n}\n\nexport async function createHavenClient(options: HavenMcpServerOptions = {}): Promise<HavenClient> {\n const { client } = await resolveHavenClient(options)\n return client\n}\n\nexport async function resolveHavenClient(options: HavenMcpServerOptions = {}): Promise<ResolvedHavenClient> {\n // The choke point (#1161 review): `runStdioServer`, `createHavenClient` and\n // `createHavenMcpServer` all funnel through here, and the client built below\n // is delegate-key-bound — `pay()`, `sign()` and the x402 paths activate the\n // moment `delegateKey` is set. Guarding only the stdio entrypoint would leave\n // the embedding constructors reaching a signing-capable client on an\n // unsupported runtime, which is this issue's own bug one layer down.\n assertSupportedNodeVersion(options.nodeVersion)\n\n const credentialSource = options.credentialsPath || options.identityPath || options.signerPath\n ? {\n credentialsPath: options.credentialsPath,\n identityPath: options.identityPath,\n signerPath: options.signerPath,\n }\n : undefined\n const credentials = options.credentials ?? await loadCredentials(credentialSource)\n const client = new HavenClient({\n apiKey: credentials.apiKey,\n delegateKey: credentials.delegateKey,\n baseUrl: credentials.apiUrl,\n })\n return { client, credentials }\n}\n\nexport async function createHavenMcpServer(options: HavenMcpServerOptions = {}): Promise<McpServer> {\n const haven = await createHavenClient(options)\n return buildMcpServer(haven)\n}\n\n/**\n * Build an MCP server bound to the supplied Haven client.\n *\n * Each tool dispatch is wrapped in `haven.withRequestContext` so every\n * Haven API request the dispatch issues carries `X-Haven-MCP-Tool: <name>`\n * — and *only* that dispatch's requests see the header. The SDK uses an\n * `AsyncLocalStorage` for the context, so two tool calls running\n * concurrently cannot leak headers into each other and the backend\n * `agent_tool_invocations` rows are always attributed to the right tool.\n */\nexport const MCP_NAME = '@haven_ai/mcp'\nexport const MCP_VERSION = '0.1.24-alpha.0'\n\n/**\n * MCP `instructions` — the critical path, surfaced to the model at\n * `initialize`. Shorter than the hosted server's: this runtime signs\n * in-process with the delegate key it holds, so there is no separate\n * haven-signer namespace or payment_id signing step to describe. Kept free\n * of any version literal; a guard test in `server.test.ts` pins that.\n */\nexport const MCP_INSTRUCTIONS = [\n 'Haven local MCP server: signs in-process with the delegate key it holds on',\n 'this machine — the key never leaves this process. Call haven_get_agent',\n 'first, every session: identity, readiness, and live remaining budget in',\n 'one call. Do not guess the wallet, network, or budget.',\n '',\n 'To pay: haven_discover_tools to find a payable service, then',\n 'haven_pay_mcp_tool for MCP merchants or haven_pay_x402 for any x402',\n 'paywall. Tool responses carry nextAction — follow it; description prose',\n 'is fallback, not the source of truth.',\n '',\n 'pending_approval means stop and tell the user — do not retry, re-sign, or',\n 're-pay while a payment is pending. Spend authority is enforced on-chain by',\n 'the user\\'s account; Haven never holds keys and cannot override it.',\n].join('\\n')\n\nexport function buildMcpServer(haven: HavenClient): McpServer {\n const server = new McpServer(\n {\n name: MCP_NAME,\n version: MCP_VERSION,\n },\n { instructions: MCP_INSTRUCTIONS },\n )\n\n const handlers = createToolHandlers(haven)\n const registerTool = (server as any).tool.bind(server)\n for (const name of Object.keys(toolSchemas) as HavenMcpToolName[]) {\n registerTool(\n name,\n toolDescriptions[name],\n toolSchemas[name],\n async (args: unknown) =>\n haven.withRequestContext({ 'X-Haven-MCP-Tool': name }, async () =>\n toMcpResult(await handlers[name](args)),\n ),\n )\n }\n\n return server\n}\n\n/**\n * Refuse to start on an unsupported Node (#1161).\n *\n * Same reasoning as the signer's identical guard: install-time enforcement\n * cannot see a Node downgrade after setup, or a version manager handing the\n * agent runtime a different Node than the shell that connected. The local MCP\n * server drives payment construction against the signer, so it is held to the\n * package's declared floor rather than whatever happens to boot.\n */\nexport function assertSupportedNodeVersion(nodeVersion: string = process.versions.node): void {\n if (isSupportedNodeVersion(nodeVersion)) return\n const err: NodeJS.ErrnoException = new Error(\n unsupportedNodeVersionMessage({ subject: 'The Haven MCP server', nodeVersion }),\n )\n err.code = 'HAVEN_MCP_UNSUPPORTED_NODE'\n throw err\n}\n\nexport async function runStdioServer(options: HavenMcpServerOptions = {}): Promise<void> {\n // Asserted inside resolveHavenClient — the choke point every key-bound path\n // shares — so it still runs here, before credentials are read.\n const { client: haven, credentials } = await resolveHavenClient(options)\n\n if (!options.skipConsent) {\n const decision = await runConsentGate(haven, credentials, options)\n if (!decision.ok) {\n // The consent block has already been printed by `ensureConsent`.\n const err: NodeJS.ErrnoException = new Error(\n decision.reason === 'env_var_mismatch'\n ? 'Haven MCP consent acknowledgement does not match the current configuration.'\n : 'Haven MCP server requires a one-time consent acknowledgement before starting.',\n )\n err.code = 'HAVEN_MCP_NO_CONSENT'\n throw err\n }\n }\n\n const server = buildMcpServer(haven)\n await server.connect(new StdioServerTransport())\n}\n\nexport async function runConsentGate(\n haven: HavenClient,\n credentials: HavenCredentialFile,\n options: HavenMcpServerOptions,\n): Promise<ConsentDecision> {\n const toolNames = registeredToolNames()\n const input = await consentInputFromClient(\n haven,\n {\n apiKey: credentials.apiKey,\n apiUrl: credentials.apiUrl,\n agentId: credentials.agentId,\n safeAddress: credentials.safeAddress,\n delegateAddress: credentials.delegateAddress,\n chainId: credentials.chainId,\n allowanceSummary: credentials.allowanceSummary,\n },\n toolNames,\n )\n // Prefer the path actually used to load credentials (covers\n // HAVEN_CREDENTIALS as well as --credentials). If neither file path is\n // available the operator must use HAVEN_MCP_ACK; --ack has nowhere to\n // write a sidecar in that case.\n const credentialsPath = options.identityPath ?? options.credentialsPath ?? credentials.sourcePath\n return ensureConsent(input, {\n credentialsPath,\n writeAck: options.writeAck,\n })\n}\n\nfunction toMcpResult(payload: ToolPayload) {\n return {\n isError: !payload.success,\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(payload, null, 2),\n },\n ],\n }\n}\n","#!/usr/bin/env node\n\nimport { runStdioServer, type HavenMcpServerOptions } from './server.js'\n\nfunction parseArgs(argv: string[]): HavenMcpServerOptions {\n const options: HavenMcpServerOptions = {}\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i]\n if (arg === '--credentials' || arg === '--credentials-path') {\n options.credentialsPath = argv[i + 1]\n i += 1\n } else if (arg === '--identity') {\n options.identityPath = argv[i + 1]\n i += 1\n } else if (arg === '--signer') {\n options.signerPath = argv[i + 1]\n i += 1\n } else if (arg === '--transport') {\n const transport = argv[i + 1]\n i += 1\n if (transport !== 'stdio') {\n throw new Error('Only local stdio transport is supported. Haven does not provide a remote MCP signer mode.')\n }\n } else if (arg === '--ack') {\n // Write the consent-gate acknowledgement next to the credential file\n // and proceed. Used on first-launch to opt the operator in once.\n options.writeAck = true\n } else if (arg === '--help' || arg === '-h') {\n process.stdout.write([\n 'Haven MCP server',\n '',\n 'Usage:',\n ' npx @haven_ai/mcp --credentials /path/to/agent.json',\n ' npx @haven_ai/mcp --identity /path/to/identity.json --signer /path/to/signer.json',\n '',\n 'Options:',\n ' --credentials <path> Haven credential JSON file. Also supported: HAVEN_CREDENTIALS.',\n ' --identity <path> Haven identity JSON file written by @haven_ai/connect.',\n ' --signer <path> Haven signer JSON file written by @haven_ai/connect.',\n ' --transport stdio Local stdio transport. This is the only supported mode.',\n ' --ack Acknowledge the first-launch consent block and write',\n ' a sidecar acknowledgement file next to the credential.',\n '',\n 'Consent:',\n ' On first launch the server prints the tool list and the on-chain',\n ' allowance summary, then refuses to start unless you have acknowledged.',\n ' Acknowledge with EITHER --ack OR HAVEN_MCP_ACK=<hash> in your environment.',\n '',\n ].join('\\n'))\n process.exit(0)\n }\n }\n return options\n}\n\nasync function main(): Promise<void> {\n await runStdioServer(parseArgs(process.argv.slice(2)))\n}\n\nmain().catch((err) => {\n process.stderr.write(`${err instanceof Error ? err.message : String(err)}\\n`)\n process.exit(1)\n})\n"]}
1
+ {"version":3,"sources":["../src/credentials.ts","../src/tools.ts","../src/consent.ts","../src/server.ts","../src/cli.ts"],"names":["readFile","stat","z","composeDescription","sharedDescriptions","HavenPaymentStateError","discoverMerchantMcpUrl","sameUrl","verifyPaymentReceipt","HavenApiError","HavenSigningError","AgentPaymentNextAction","HavenError","createHash","resolve","path","mkdir","dirname","writeFile","HavenClient","McpServer","isSupportedNodeVersion","unsupportedNodeVersionMessage","StdioServerTransport"],"mappings":"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","file":"cli.cjs","sourcesContent":["import { readFile, stat } from 'node:fs/promises'\n\nexport interface HavenCredentialFile {\n apiKey: string\n delegateKey: string\n agentId?: string\n safeAddress?: string\n delegateAddress?: string\n chainId?: number\n network?: string\n apiUrl?: string\n allowanceSummary?: readonly HavenCredentialAllowance[]\n /**\n * Absolute path the credentials were loaded from, if any. Set when the\n * caller pointed at a JSON file via `--credentials` or `HAVEN_CREDENTIALS`;\n * left undefined when credentials came purely from environment variables.\n * The MCP server uses this to locate the consent sidecar\n * (`<sourcePath>.ack.json`) so `--ack` works regardless of how the\n * credential path was supplied.\n */\n sourcePath?: string\n identityPath?: string\n signerPath?: string\n}\n\nexport interface HavenCredentialAllowance {\n token: string\n amount: string\n resetMinutes: number | null\n}\n\nexport interface HavenCredentialSource {\n credentialsPath?: string\n identityPath?: string\n signerPath?: string\n}\n\ninterface RawCredentialFile {\n api_key?: unknown\n apiKey?: unknown\n delegate_key?: unknown\n delegateKey?: unknown\n delegate_address?: unknown\n delegateAddress?: unknown\n agent_id?: unknown\n agentId?: unknown\n safe_address?: unknown\n safeAddress?: unknown\n chain_id?: unknown\n chainId?: unknown\n network?: unknown\n api_url?: unknown\n apiUrl?: unknown\n hosted_mcp_url?: unknown\n hostedMcpUrl?: unknown\n allowance_summary?: unknown\n allowanceSummary?: unknown\n agent_budget?: unknown\n agentBudget?: unknown\n}\n\n/**\n * Load Haven agent credentials for the MCP server.\n *\n * Resolution order — earlier sources win, later sources are fallbacks:\n *\n * 1. Explicit `path` argument (typically from `--credentials <path>`).\n * 2. `HAVEN_CREDENTIALS` env var pointing at a credential JSON file.\n * 3. Inline env vars: `HAVEN_API_KEY` + `HAVEN_DELEGATE_KEY` (+ optional\n * `HAVEN_AGENT_ID`, `HAVEN_SAFE_ADDRESS`, `HAVEN_API_URL`).\n *\n * The inline-env path exists so that runtime config snippets emitted by the\n * Haven dashboard (Claude Desktop / Cursor / generic MCP configs) can be a\n * single self-contained block — paste the snippet, restart the runtime, done.\n * The values still live only in the agent operator's process environment;\n * Haven's backend never sees the delegate key either way.\n */\nexport async function loadCredentials(\n source: string | HavenCredentialSource | undefined = process.env.HAVEN_CREDENTIALS,\n): Promise<HavenCredentialFile> {\n if (typeof source === 'string') {\n return loadCredentialsFromFile(source)\n }\n if (source?.credentialsPath) {\n return loadCredentialsFromFile(source.credentialsPath)\n }\n if (source?.identityPath || source?.signerPath) {\n if (!source.identityPath || !source.signerPath) {\n throw new Error('Haven split credentials require both --identity and --signer paths.')\n }\n return loadCredentialsFromSplitFiles(source.identityPath, source.signerPath)\n }\n\n const envCreds = loadCredentialsFromEnv()\n if (envCreds) return envCreds\n\n throw new Error(\n 'No Haven credentials found. Set HAVEN_CREDENTIALS to a Haven agent credential JSON file, ' +\n 'pass --credentials <path>, or set HAVEN_API_KEY and HAVEN_DELEGATE_KEY environment variables.',\n )\n}\n\nasync function loadCredentialsFromFile(path: string): Promise<HavenCredentialFile> {\n let rawText: string\n try {\n rawText = await readFile(path, 'utf8')\n } catch (err) {\n throw new Error(`Could not read Haven credentials at ${path}: ${err instanceof Error ? err.message : String(err)}`)\n }\n\n await warnIfCredentialFilePermissive(path)\n\n let raw: RawCredentialFile\n try {\n raw = JSON.parse(rawText) as RawCredentialFile\n } catch {\n throw new Error('Haven credentials must be JSON with api_key and delegate_key fields.')\n }\n\n const apiKey = stringField(raw.api_key ?? raw.apiKey)\n const delegateKey = stringField(raw.delegate_key ?? raw.delegateKey)\n\n if (!apiKey) {\n throw new Error('Haven credentials are missing api_key.')\n }\n if (!delegateKey) {\n throw new Error('Haven MCP requires delegate_key so payments can be signed locally.')\n }\n\n return {\n apiKey,\n delegateKey,\n agentId: stringField(raw.agent_id ?? raw.agentId),\n safeAddress: stringField(raw.safe_address ?? raw.safeAddress),\n delegateAddress: stringField(raw.delegate_address ?? raw.delegateAddress),\n chainId: numberField(raw.chain_id ?? raw.chainId),\n network: stringField(raw.network),\n apiUrl: stringField(raw.api_url ?? raw.apiUrl),\n allowanceSummary: allowanceSummaryField(raw.allowance_summary ?? raw.allowanceSummary ?? raw.agent_budget ?? raw.agentBudget),\n sourcePath: path,\n }\n}\n\nasync function loadCredentialsFromSplitFiles(identityPath: string, signerPath: string): Promise<HavenCredentialFile> {\n const identity = await readJsonFile(identityPath, 'Haven identity credentials')\n const signer = await readJsonFile(signerPath, 'Haven signer credentials')\n\n await warnIfCredentialFilePermissive(identityPath)\n await warnIfCredentialFilePermissive(signerPath)\n\n const apiKey = stringField(identity.api_key ?? identity.apiKey)\n const delegateKey = stringField(signer.delegate_key ?? signer.delegateKey)\n\n if (!apiKey) {\n throw new Error('Haven identity credentials are missing api_key.')\n }\n if (!delegateKey) {\n throw new Error('Haven signer credentials are missing delegate_key.')\n }\n\n return {\n apiKey,\n delegateKey,\n agentId: matchingStringField(\n 'agent_id',\n identity.agent_id ?? identity.agentId,\n signer.agent_id ?? signer.agentId,\n ),\n safeAddress: matchingStringField(\n 'safe_address',\n identity.safe_address ?? identity.safeAddress,\n signer.safe_address ?? signer.safeAddress,\n { caseInsensitive: true },\n ),\n delegateAddress: matchingStringField(\n 'delegate_address',\n signer.delegate_address ?? signer.delegateAddress,\n identity.delegate_address ?? identity.delegateAddress,\n { caseInsensitive: true },\n ),\n chainId: matchingNumberField(\n 'chain_id',\n identity.chain_id ?? identity.chainId,\n signer.chain_id ?? signer.chainId,\n ),\n network: matchingStringField(\n 'network',\n identity.network,\n signer.network,\n { caseInsensitive: true },\n ),\n apiUrl: stringField(identity.api_url ?? identity.apiUrl),\n allowanceSummary: allowanceSummaryField(\n identity.allowance_summary ??\n identity.allowanceSummary ??\n identity.agent_budget ??\n identity.agentBudget,\n ),\n sourcePath: identityPath,\n identityPath,\n signerPath,\n }\n}\n\nasync function readJsonFile(path: string, label: string): Promise<RawCredentialFile> {\n let rawText: string\n try {\n rawText = await readFile(path, 'utf8')\n } catch (err) {\n throw new Error(`Could not read ${label} at ${path}: ${err instanceof Error ? err.message : String(err)}`)\n }\n\n try {\n return JSON.parse(rawText) as RawCredentialFile\n } catch {\n throw new Error(`${label} must be JSON.`)\n }\n}\n\nfunction loadCredentialsFromEnv(): HavenCredentialFile | null {\n const apiKey = stringField(process.env.HAVEN_API_KEY)\n const delegateKey = stringField(process.env.HAVEN_DELEGATE_KEY)\n\n if (!apiKey && !delegateKey) return null\n\n if (!apiKey) {\n throw new Error('HAVEN_DELEGATE_KEY is set but HAVEN_API_KEY is missing.')\n }\n if (!delegateKey) {\n throw new Error('HAVEN_API_KEY is set but HAVEN_DELEGATE_KEY is missing. Haven MCP requires a delegate key so payments can be signed locally.')\n }\n\n return {\n apiKey,\n delegateKey,\n agentId: stringField(process.env.HAVEN_AGENT_ID),\n safeAddress: stringField(process.env.HAVEN_SAFE_ADDRESS),\n chainId: numberField(process.env.HAVEN_CHAIN_ID),\n network: stringField(process.env.HAVEN_NETWORK),\n apiUrl: stringField(process.env.HAVEN_API_URL),\n }\n}\n\nfunction stringField(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined\n}\n\nfunction numberField(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim() && /^\\d+$/.test(value.trim())) return Number(value.trim())\n return undefined\n}\n\nfunction matchingStringField(\n label: string,\n preferred: unknown,\n fallback: unknown,\n options: { caseInsensitive?: boolean } = {},\n): string | undefined {\n const preferredValue = stringField(preferred)\n const fallbackValue = stringField(fallback)\n if (\n preferredValue &&\n fallbackValue &&\n !sameCredentialValue(preferredValue, fallbackValue, options.caseInsensitive)\n ) {\n throw mismatchedSplitCredentialError(label)\n }\n return preferredValue ?? fallbackValue\n}\n\nfunction matchingNumberField(label: string, preferred: unknown, fallback: unknown): number | undefined {\n const preferredValue = numberField(preferred)\n const fallbackValue = numberField(fallback)\n if (preferredValue !== undefined && fallbackValue !== undefined && preferredValue !== fallbackValue) {\n throw mismatchedSplitCredentialError(label)\n }\n return preferredValue ?? fallbackValue\n}\n\nfunction sameCredentialValue(first: string, second: string, caseInsensitive = false): boolean {\n return caseInsensitive ? first.toLowerCase() === second.toLowerCase() : first === second\n}\n\nfunction mismatchedSplitCredentialError(label: string): Error {\n return new Error(\n `Haven split credentials have mismatched ${label} values. ` +\n 'Recreate the identity and signer credential files from the same Haven agent.',\n )\n}\n\nfunction allowanceSummaryField(value: unknown): HavenCredentialAllowance[] | undefined {\n if (!Array.isArray(value)) return undefined\n const allowances = value.flatMap((item) => {\n if (!item || typeof item !== 'object') return []\n const raw = item as Record<string, unknown>\n const token = stringField(raw.token ?? raw.token_symbol ?? raw.tokenSymbol)\n const amount = stringField(raw.amount ?? raw.allowance_amount ?? raw.allowanceAmount)\n const reset = raw.resetMinutes ?? raw.reset_minutes ?? raw.reset_period_min ?? raw.resetPeriodMin\n if (!token || !amount) return []\n return [{\n token,\n amount,\n resetMinutes: reset === null ? null : numberField(reset) ?? null,\n }]\n })\n return allowances.length > 0 ? allowances : undefined\n}\n\n/**\n * Warn (but do not block) when the credential file is readable by users\n * other than the owner. The check is best-effort: it only runs on POSIX\n * filesystems where the stat mode bits map cleanly. Windows ACLs require\n * `icacls`-style introspection that doesn't fit a single stat call, so we\n * skip the check there and the dashboard handoff text guides the user\n * separately.\n *\n * Exported for testing.\n */\nexport async function warnIfCredentialFilePermissive(\n path: string,\n log: (message: string) => void = (message) => process.stderr.write(`${message}\\n`),\n platform: NodeJS.Platform = process.platform,\n): Promise<void> {\n if (platform === 'win32') return\n\n let mode: number\n try {\n const stats = await stat(path)\n mode = stats.mode\n } catch {\n // The credential read already failed cleanly above if the file is\n // unreadable. A stat failure here is not worth blocking on.\n return\n }\n\n const groupOrOther = mode & 0o077\n if (groupOrOther !== 0) {\n const octal = (mode & 0o777).toString(8).padStart(4, '0')\n log(\n `haven-mcp: warning: credential file at ${path} is readable beyond the owner ` +\n `(mode ${octal}). Run: chmod 600 ${path}`,\n )\n }\n}\n","/**\n * Local (stdio) MCP tool handlers. This package runs in the AGENT OPERATOR'S\n * OWN environment — it reads the local credential file and signs locally; the\n * hosted backend is not in the loop for the merchant call. So `merchant_url`\n * passed to `haven.fetch` below is NOT an SSRF surface: the agent is the\n * principal paying a merchant IT chose, on its own machine — the same trust\n * position as running `curl`. There is no server reflecting attacker input\n * into an internal request. (Hosted, multi-tenant fetches live in mcp-server,\n * which is where URL-hardening would matter.)\n */\nimport {\n AgentPaymentNextAction,\n HavenApiError,\n HavenClient,\n HavenError,\n HavenPaymentStateError,\n HavenSigningError,\n composeDescription,\n discoverMerchantMcpUrl,\n sameUrl,\n toolDescriptions as sharedDescriptions,\n verifyPaymentReceipt,\n type PaymentReceipt,\n type X402Quote,\n type X402ResumeState,\n} from '@haven_ai/sdk'\nimport { z } from 'zod/v3'\n\nconst headersSchema = z.record(z.string(), z.string()).optional()\n\nexport type HavenMcpToolName =\n | 'haven_send'\n | 'haven_pay_mcp_tool'\n | 'haven_quote_x402'\n | 'haven_pay_x402_quote'\n | 'haven_pay_x402'\n | 'haven_resume_x402_payment'\n | 'haven_get_payment_status'\n | 'haven_get_resume_state'\n | 'haven_get_agent'\n | 'haven_get_allowances'\n | 'haven_list_receipts'\n | 'haven_verify_receipt'\n | 'haven_sweep_delegate'\n | 'haven_discover_tools'\n\nexport const toolSchemas: Record<HavenMcpToolName, z.ZodRawShape> = {\n haven_send: {\n asset: z.enum(['ETH', 'USDC']),\n recipient: z.string().min(1),\n amount: z.string().min(1),\n idempotencyKey: z.string().optional(),\n },\n haven_pay_mcp_tool: {\n merchant_url: z.string().url(),\n tool_name: z.string().min(1),\n arguments: z.record(z.string(), z.unknown()).optional(),\n idempotencyKey: z.string().optional(),\n },\n haven_quote_x402: {\n url: z.string().url(),\n method: z.string().optional(),\n headers: headersSchema,\n body: z.string().optional(),\n idempotencyKey: z.string().optional(),\n },\n haven_pay_x402_quote: {\n quote: z.unknown(),\n idempotencyKey: z.string().optional(),\n },\n haven_pay_x402: {\n url: z.string().url(),\n method: z.string().optional(),\n headers: headersSchema,\n body: z.string().optional(),\n idempotencyKey: z.string().optional(),\n },\n haven_resume_x402_payment: {\n payment_id: z.string().optional(),\n resume_state: z.unknown().optional(),\n },\n haven_get_payment_status: {\n payment_id: z.string(),\n },\n haven_get_resume_state: {\n payment_id: z.string(),\n },\n haven_get_agent: {},\n haven_get_allowances: {},\n haven_sweep_delegate: {},\n haven_discover_tools: {\n category: z.string().optional(),\n search: z.string().optional(),\n rail: z.enum(['x402', 'mpp']).optional(),\n },\n haven_list_receipts: {\n limit: z.number().int().min(1).max(100).optional(),\n },\n haven_verify_receipt: {\n receipt: z.unknown(),\n },\n}\n\n/**\n * MCP tool descriptions, composed from the shared semantic source in\n * `@haven_ai/sdk`'s `tool-descriptions.ts`. Keeping both the SDK tool-calling\n * surface and the MCP surface pointed at the same prose source means new\n * guidance lands in both places at once and a parity test can catch drift.\n */\nexport const toolDescriptions: Record<HavenMcpToolName, string> = {\n haven_send: composeDescription(sharedDescriptions.send),\n haven_pay_mcp_tool: composeDescription(sharedDescriptions.payMcpTool),\n haven_quote_x402: composeDescription(sharedDescriptions.quoteX402),\n haven_pay_x402_quote: composeDescription(sharedDescriptions.payX402),\n haven_pay_x402: composeDescription(sharedDescriptions.payX402OneShot),\n haven_resume_x402_payment: composeDescription(sharedDescriptions.resumeX402),\n haven_get_payment_status: composeDescription(sharedDescriptions.getPaymentStatus),\n haven_get_resume_state: composeDescription(sharedDescriptions.getResumeState),\n haven_get_agent: composeDescription(sharedDescriptions.getAgent),\n haven_get_allowances: composeDescription(sharedDescriptions.getAllowances),\n haven_sweep_delegate: composeDescription(sharedDescriptions.sweep_delegate),\n haven_discover_tools: composeDescription(sharedDescriptions.discoverTools),\n haven_list_receipts: composeDescription(sharedDescriptions.listReceipts),\n haven_verify_receipt: composeDescription(sharedDescriptions.verifyReceipt),\n}\n\nexport interface ToolSuccess<T> {\n success: true\n data: T\n}\n\nexport interface ToolFailure {\n success: false\n code: string\n message: string\n /** Structured hint pointing the agent at the correct tool for this operation. */\n suggested_tool?: string\n statusCode?: number\n paymentId?: string\n status?: string\n phase?: string\n nextAction?: string\n resume_state?: unknown\n body?: unknown\n}\n\nexport type ToolPayload<T = unknown> = ToolSuccess<T> | ToolFailure\n\nexport function createToolHandlers(haven: HavenClient): Record<HavenMcpToolName, (input: unknown) => Promise<ToolPayload>> {\n return {\n haven_send: async (input) => {\n return runTool(async () => {\n const args = objectInput('haven_send', input)\n try {\n const result = await haven.pay({\n token: args.asset,\n amount: args.amount,\n to: args.recipient,\n // #1207: was accepted by the schema but silently dropped — now\n // carried to the backend's replay contract.\n idempotencyKey: typeof args.idempotencyKey === 'string' ? args.idempotencyKey : undefined,\n })\n return {\n payment_id: result.paymentId,\n status: result.status,\n tx_hash: result.txHash ?? null,\n asset: args.asset,\n amount: args.amount,\n recipient: args.recipient,\n }\n } catch (err) {\n if (err instanceof HavenPaymentStateError && isPendingApproval(err.status)) {\n return {\n payment_id: err.paymentId,\n status: 'pending_approval',\n asset: args.asset,\n amount: args.amount,\n recipient: args.recipient,\n }\n }\n throw err\n }\n })\n },\n\n haven_pay_mcp_tool: async (input) => {\n return runTool(async () => {\n const args = objectInput('haven_pay_mcp_tool', input)\n const envelope = buildMcpToolsCallEnvelope(args.tool_name as string, args.arguments as Record<string, unknown> | undefined)\n const init: RequestInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(envelope),\n }\n // #1301: a base merchant URL is accepted, mirroring the hosted MCP's\n // #1271 discovery. `haven.fetch()` already resolves a 402 itself\n // (pays and retries) — it never hands a 402 back to us, and a\n // successfully-paid retry that the merchant rejects THROWS from\n // inside the SDK rather than returning a non-ok Response (see\n // `retryX402Request`). So any Response this call returns with\n // `.ok === false` can only be the UNTOUCHED first-hop response to a\n // URL that never spoke 402 at all — free-tool 200s and paid 200s\n // both stay `.ok === true` and never reach this branch. That is the\n // local flow's equivalent of the hosted probe's\n // `X402UnexpectedStatusError` (#1300): \"this URL isn't the MCP\n // endpoint,\" expressed as a Response instead of a thrown error.\n let merchantUrl = args.merchant_url as string\n const idempotencyKey = args.idempotencyKey as string | undefined\n const attempt = () => haven.fetch(merchantUrl, init, { idempotencyKey })\n\n let response = await attempt()\n if (!response.ok) {\n const discovered = await discoverMerchantMcpUrl(merchantUrl)\n // Trailing-slash/case echoes of the input are \"same URL\" — spend\n // the one retry only on a genuinely different endpoint.\n if (!discovered || sameUrl(discovered, merchantUrl)) {\n throw discoveryMissError(response, merchantUrl, discovered)\n }\n const inputUrl = merchantUrl\n merchantUrl = discovered\n const retryResponse = await attempt()\n if (!retryResponse.ok) {\n // Label which URL failed — the agent otherwise cannot tell the\n // discovered endpoint's miss from the original probe's.\n throw discoveryMissError(retryResponse, merchantUrl, discovered, inputUrl)\n }\n response = retryResponse\n }\n const payload = await responsePayload(response)\n return {\n ...payload,\n // The RESOLVED endpoint (#1271/#1301), not the input as given.\n merchant_url: merchantUrl,\n ...(merchantUrl !== args.merchant_url ? { merchant_url_discovered_from: args.merchant_url } : {}),\n }\n })\n },\n\n haven_quote_x402: async (input) => {\n const args = objectInput('haven_quote_x402', input)\n try {\n return { success: true, data: await haven.quoteX402(args.url, requestInit(args), { idempotencyKey: args.idempotencyKey }) }\n } catch (err) {\n // #1328: quoteX402 still refuses a MACHINE-PAYMENT-CHALLENGE response as\n // a defensive shape guard, but nothing in Haven produces that header\n // anymore (the mpp_demo route it was built for is retired) — fall\n // through to the generic error rather than suggesting a deleted tool.\n return normalizeError(err)\n }\n },\n\n haven_pay_x402_quote: async (input) => {\n const args = objectInput('haven_pay_x402_quote', input)\n const quote = args.quote as Record<string, unknown> | null | undefined\n // Guard before network calls so the agent gets actionable guidance rather\n // than an opaque SDK error.\n if (!quote || typeof quote !== 'object') {\n return wrongTool(\n 'WRONG_TOOL',\n 'The quote argument is missing or is not a valid x402 quote object. Call haven_quote_x402 first to obtain a quote, or use haven_pay_x402 to handle the full probe → pay → retry round trip automatically.',\n 'haven_quote_x402',\n )\n }\n if (!quote.paymentRequired) {\n return wrongTool(\n 'WRONG_TOOL',\n 'The quote is missing the required paymentRequired field. Call haven_quote_x402 first to obtain a valid x402 quote.',\n 'haven_quote_x402',\n )\n }\n return runTool(async () => {\n const response = await haven.payX402Quote(args.quote as X402Quote, { idempotencyKey: args.idempotencyKey })\n return responsePayload(response)\n })\n },\n\n haven_pay_x402: async (input) => {\n const args = objectInput('haven_pay_x402', input)\n return runTool(async () => {\n const response = await haven.fetch(args.url, requestInit(args), { idempotencyKey: args.idempotencyKey })\n return responsePayload(response)\n })\n },\n\n haven_resume_x402_payment: async (input) => {\n const args = objectInput('haven_resume_x402_payment', input)\n // #1328: the mpp rail resume_state branch is retired along with\n // haven_resume_mpp_payment — any non-x402 rail is now just a\n // state-mismatch, not a \"use this other tool\" redirect.\n return runTool(async () => {\n const state = await resumeState(args, 'x402')\n const response = await haven.resumeX402Payment(state)\n return responsePayload(response)\n })\n },\n\n haven_get_payment_status: async (input) => {\n const args = objectInput('haven_get_payment_status', input)\n // #1310/#1311: shared with mcp-server's haven_get_payment_status\n // handler — see HavenClient.getPaymentStatusWithPostPurchaseAllowance\n // in @haven_ai/sdk for the single home of this \"settled x402 only\"\n // attach logic (was duplicated verbatim in both packages) and for why\n // `funded_but_unsettled` is excluded from \"settled\".\n return runTool(async () => haven.getPaymentStatusWithPostPurchaseAllowance(args.payment_id))\n },\n\n haven_get_resume_state: async (input) => {\n const args = objectInput('haven_get_resume_state', input)\n return runTool(async () => haven.getResumeState(args.payment_id))\n },\n\n haven_get_agent: async () => runTool(async () => haven.getAgentSummary()),\n haven_get_allowances: async () => runTool(async () => haven.getAllowances()),\n haven_sweep_delegate: async () => runTool(async () => haven.sweepDelegate()),\n haven_discover_tools: async (input) => {\n const args = objectInput('haven_discover_tools', input)\n return runTool(async () => {\n const entries = await haven.discoverTools({\n category: typeof args.category === 'string' ? args.category : undefined,\n search: typeof args.search === 'string' ? args.search : undefined,\n rail: args.rail === 'x402' || args.rail === 'mpp' ? args.rail : undefined,\n })\n return entries.map((entry) => ({\n id: entry.id,\n name: entry.name,\n description: entry.description,\n category: entry.category,\n resource_url: entry.resourceUrl,\n rail: entry.rail,\n protocol: entry.protocol,\n tool_name: entry.toolName,\n tool_arguments: entry.toolArguments,\n price_display: entry.priceDisplay,\n price_atomic: entry.priceAtomic,\n asset: entry.asset,\n network: entry.network,\n status: entry.status,\n verified_at: entry.verifiedAt,\n // Which Haven pay tool reaches this entry from the local MCP surface.\n // #1328: the 'mpp' rail's only-ever catalog row (the Haven MPP demo\n // resource) is delisted with the mpp_demo retirement, so this\n // fallback is unreachable today; it stays x402 rather than naming a\n // deleted tool in case a future non-demo 'mpp' rail entry appears.\n suggested_tool:\n entry.protocol === 'mcp' ? 'haven_pay_mcp_tool'\n : 'haven_pay_x402',\n }))\n })\n },\n haven_list_receipts: async (input) => {\n const args = objectInput('haven_list_receipts', input)\n return runTool(async () => haven.listReceipts({ limit: args.limit }))\n },\n haven_verify_receipt: async (input) => {\n const args = objectInput('haven_verify_receipt', input)\n return runTool(async () => verifyPaymentReceipt(args.receipt as PaymentReceipt))\n },\n }\n\n async function resumeState(\n args: { payment_id?: string; resume_state?: unknown },\n rail: 'x402',\n ): Promise<X402ResumeState> {\n const state =\n args.resume_state ??\n (args.payment_id ? await haven.getResumeState(args.payment_id) : undefined)\n\n if (!state || typeof state !== 'object') {\n throw new HavenApiError(`haven_resume_${rail}_payment requires resume_state or payment_id.`, 400)\n }\n\n if ((state as { rail?: unknown }).rail !== rail) {\n throw new HavenApiError(`Resume state is not for the ${rail} rail.`, 409, state)\n }\n\n return state as X402ResumeState\n }\n}\n\nfunction isPendingApproval(status: string | undefined): boolean {\n return status === 'pending' || status === 'pending_approval'\n}\n\n/**\n * Build a structured wrong-tool ToolFailure pointing the agent at the right tool.\n * `code` should be 'WRONG_TOOL' (wrong operation entirely) or 'WRONG_RAIL' (right\n * operation but wrong payment protocol — x402 vs MPP).\n */\nfunction wrongTool(code: string, message: string, suggested_tool?: string): ToolFailure {\n return { success: false, code, message, suggested_tool }\n}\n\n/** Build a JSON-RPC 2.0 tools/call envelope for an MCP merchant. */\nfunction buildMcpToolsCallEnvelope(\n toolName: string,\n args?: Record<string, unknown>,\n): Record<string, unknown> {\n return {\n jsonrpc: '2.0',\n id: `haven-mcp-${Date.now()}`,\n method: 'tools/call',\n params: {\n name: toolName,\n arguments: args ?? {},\n },\n }\n}\n\nfunction objectInput<TName extends HavenMcpToolName>(\n name: TName,\n input: unknown,\n): Record<string, any> {\n return z.object(toolSchemas[name]).parse(input ?? {})\n}\n\nfunction requestInit(input: { method?: string; headers?: Record<string, string>; body?: string }): RequestInit | undefined {\n if (!input.method && !input.headers && input.body === undefined) return undefined\n return {\n method: input.method,\n headers: input.headers,\n body: input.body,\n }\n}\n\nasync function runTool<T>(fn: () => Promise<T>): Promise<ToolPayload<T>> {\n try {\n return { success: true, data: await fn() }\n } catch (err) {\n return normalizeError(err)\n }\n}\n\nasync function responsePayload(response: Response): Promise<Record<string, unknown>> {\n const text = await response.text()\n return {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n body: parseMaybeJson(text),\n }\n}\n\nfunction parseMaybeJson(text: string): unknown {\n if (!text) return null\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n}\n\n/**\n * #1301: the local-flow counterpart of mcp-server's `withDiscoveryGuidance`\n * (kept there, not shared — that helper rewrites a thrown `HavenApiError`;\n * this one builds a fresh failure from a non-ok `Response`, since the local\n * `haven.fetch()` idiom never throws for a non-402 answer). Keeps the\n * original probe status authoritative, but tells the agent what discovery\n * tried — the pre-#1301 local failure mode was a silent pass-through of\n * whatever the base path served.\n */\nfunction discoveryMissError(\n response: Response,\n merchantUrl: string,\n discovered: string | null,\n discoveredFromUrl?: string,\n): HavenApiError {\n const base = discoveredFromUrl\n ? `Merchant call to ${merchantUrl} failed with HTTP ${response.status} ` +\n `(at the DISCOVERED endpoint ${merchantUrl}, resolved from ${discoveredFromUrl} ` +\n `via the merchant discovery document).`\n : `Merchant call to ${merchantUrl} failed with HTTP ${response.status}.`\n const guidance = discoveredFromUrl\n ? ''\n : discovered\n ? ` Same-origin discovery resolved the same URL (${discovered}), which still did not answer successfully.`\n : ` No same-origin discovery document was found at /.well-known/haven-demo-merchant or /. ` +\n `If ${merchantUrl} is a base merchant URL, pass the exact MCP endpoint instead (often <origin>/mcp).`\n return new HavenApiError(`${base}${guidance}`, response.status || 400)\n}\n\nfunction normalizeError(err: unknown): ToolFailure {\n if (err instanceof HavenPaymentStateError) {\n return {\n success: false,\n code: err.code,\n message: err.message,\n statusCode: err.statusCode,\n paymentId: err.paymentId,\n status: err.status,\n phase: err.phase,\n nextAction: err.nextAction,\n resume_state: err.resumeState,\n body: err.body,\n }\n }\n\n if (err instanceof HavenSigningError) {\n return {\n success: false,\n code: err.code,\n message: err.message,\n }\n }\n\n if (err instanceof HavenApiError) {\n const body = err.body as Record<string, unknown> | undefined\n return {\n success: false,\n code: err.code,\n message: err.message,\n statusCode: err.statusCode,\n paymentId: err.paymentId,\n phase: stringOrUndefined(body?.phase),\n nextAction:\n stringOrUndefined(body?.nextAction) ??\n stringOrUndefined(body?.next_action) ??\n AgentPaymentNextAction.StopAndTellUser,\n body: err.body,\n }\n }\n\n if (err instanceof HavenError) {\n return {\n success: false,\n code: err.code,\n message: err.message,\n statusCode: err.statusCode,\n paymentId: err.paymentId,\n }\n }\n\n return {\n success: false,\n code: 'UNKNOWN_ERROR',\n message: err instanceof Error ? err.message : String(err),\n nextAction: AgentPaymentNextAction.StopAndTellUser,\n }\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined\n}\n","import { createHash } from 'node:crypto'\nimport { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { dirname, resolve } from 'node:path'\nimport type { HavenAllowance, HavenAllowanceSummary, HavenClient } from '@haven_ai/sdk'\nimport { toolDescriptions, toolSchemas, type HavenMcpToolName } from './tools.js'\n\n/**\n * First-launch consent gate for the Haven MCP server.\n *\n * Why this exists (option A of issue #163): an agent runtime that loads a\n * Haven credential file is about to expose Haven payment tools to a model.\n * Before the server starts taking JSON-RPC calls we want the operator to\n * acknowledge — exactly once per credential + tool set — what those tools\n * can do and what the on-chain allowance cap actually is. The on-chain\n * AllowanceModule remains the policy primitive; this gate is informational\n * rather than enforcement.\n *\n * Resolution:\n * - `HAVEN_MCP_ACK=<hash>` env var matching the current consent hash → pass.\n * - `HAVEN_MCP_ACK=skip` → pass (intended for CI / scripted setups).\n * - sidecar file `<credentials>.ack.json` containing `{ ack: <hash> }` → pass.\n * - `--ack` CLI flag → write the sidecar file, print the consent block, pass.\n * - otherwise → print the consent block to stderr and exit non-zero.\n *\n * The hash binds the api-key prefix to the registered tool set and the\n * agent's current allowance summary, so a configuration change re-triggers\n * the prompt.\n */\n\nexport interface ConsentInput {\n apiKeyPrefix: string\n /** Haven API base URL the credential will hit. */\n apiUrl?: string\n /** Agent identity from the credential file, when present. */\n agentId?: string\n /** Haven wallet (Safe) the agent spends from. */\n safeAddress?: string\n /** Agent's delegate EOA — the local signer. */\n delegateAddress?: string\n /** Chain the agent operates on. */\n chainId?: number\n toolNames: readonly HavenMcpToolName[]\n allowanceSummary: readonly { token: string; amount: string; resetMinutes: number | null }[]\n}\n\nexport interface ConsentDecision {\n /** True if the gate is satisfied and the server may start. */\n ok: boolean\n /** Hash representing the current consent surface. */\n hash: string\n /** Reason the gate accepted (or rejected) the run. */\n reason:\n | 'env_var_match'\n | 'env_var_skip'\n | 'ack_file_match'\n | 'wrote_ack_file'\n | 'env_var_mismatch'\n | 'no_acknowledgement'\n}\n\nexport interface ConsentOptions {\n /** Path to the credential file; used to locate the sidecar `<path>.ack.json`. */\n credentialsPath?: string\n /** When true, write the sidecar file with the current hash and accept. */\n writeAck?: boolean\n /** Override the environment lookup (testing). */\n env?: Record<string, string | undefined>\n /** Override the writable stream the consent block is printed to (testing). */\n out?: { write: (chunk: string) => unknown }\n}\n\nexport function computeConsentHash(input: ConsentInput): string {\n const allowanceCanonical = [...input.allowanceSummary]\n .map((a) => `${a.token}:${a.amount}:${a.resetMinutes ?? 'none'}`)\n .sort()\n .join('|')\n const toolCanonical = [...input.toolNames].sort().join(',')\n // Identity fields are included in the hash so swapping the credential\n // to a different Haven wallet / delegate / chain — even one with an\n // identical allowance set — invalidates the prior sidecar and re-prompts\n // the operator. Addresses are normalised to lowercase so casing changes\n // in the credential file don't gratuitously re-prompt.\n const identity = [\n input.apiKeyPrefix,\n input.apiUrl ?? '',\n input.agentId ?? '',\n (input.safeAddress ?? '').toLowerCase(),\n (input.delegateAddress ?? '').toLowerCase(),\n input.chainId ?? '',\n ].join('|')\n return createHash('sha256')\n .update(`${identity}\\n${toolCanonical}\\n${allowanceCanonical}`)\n .digest('hex')\n .slice(0, 16)\n}\n\nexport function renderConsentBlock(input: ConsentInput, hash: string): string {\n const lines: string[] = [\n '',\n '────────────────────────────────────────────────────────────',\n 'Haven MCP server — first-launch consent',\n '────────────────────────────────────────────────────────────',\n '',\n `Credential: ${input.apiKeyPrefix}…`,\n ]\n if (input.apiUrl) lines.push(`Haven API: ${input.apiUrl}`)\n if (input.agentId) lines.push(`Agent ID: ${input.agentId}`)\n if (input.safeAddress) lines.push(`Haven wallet (Safe): ${input.safeAddress}`)\n if (input.delegateAddress) lines.push(`Delegate (local signer): ${input.delegateAddress}`)\n if (typeof input.chainId === 'number') lines.push(`Chain ID: ${input.chainId}`)\n lines.push('')\n lines.push('Confirm these match the Haven wallet and chain you intend the')\n lines.push('agent runtime to use. The delegate above is the only key that')\n lines.push('signs payments — it lives in this process, not on Haven\\'s backend.')\n lines.push('')\n lines.push('Tools this server will expose to your agent runtime:')\n for (const name of input.toolNames) {\n lines.push(` • ${name}`)\n lines.push(` ${toolDescriptions[name]}`)\n }\n lines.push('')\n if (input.allowanceSummary.length === 0) {\n lines.push('On-chain allowance: none configured.')\n lines.push(' Any payment will queue for manual approval. The on-chain')\n lines.push(' Safe AllowanceModule is the real spend gate.')\n } else {\n lines.push('On-chain allowance (the real spend gate, Safe AllowanceModule):')\n for (const a of input.allowanceSummary) {\n const reset = a.resetMinutes ? ` per ${a.resetMinutes} min` : ' (no reset)'\n lines.push(` • up to ${a.amount} ${a.token}${reset}`)\n }\n }\n lines.push('')\n lines.push('Anything above the on-chain allowance pauses for owner approval')\n lines.push('in the Haven dashboard. Revoking the agent on-chain disables')\n lines.push('every MCP tool that would spend.')\n lines.push('')\n lines.push(`Consent hash: ${hash}`)\n lines.push('')\n lines.push('To acknowledge, EITHER:')\n lines.push(` • set HAVEN_MCP_ACK=${hash} in this process\\'s environment, OR`)\n lines.push(' • re-run with --ack to write the acknowledgement next to your')\n lines.push(' credential file (sidecar <credentials>.ack.json).')\n lines.push('')\n lines.push('────────────────────────────────────────────────────────────')\n lines.push('')\n return lines.join('\\n')\n}\n\n/** Resolve the consent gate. Does not exit the process; the caller decides. */\nexport async function ensureConsent(\n input: ConsentInput,\n options: ConsentOptions = {},\n): Promise<ConsentDecision> {\n const env = options.env ?? process.env\n const out = options.out ?? process.stderr\n const hash = computeConsentHash(input)\n\n // 1) Explicit skip — for CI and scripted environments.\n if (env.HAVEN_MCP_ACK === 'skip') {\n return { ok: true, hash, reason: 'env_var_skip' }\n }\n\n // 2) Env var hash match.\n if (typeof env.HAVEN_MCP_ACK === 'string' && env.HAVEN_MCP_ACK.length > 0) {\n if (env.HAVEN_MCP_ACK === hash) {\n return { ok: true, hash, reason: 'env_var_match' }\n }\n out.write(renderConsentBlock(input, hash))\n out.write(\n `HAVEN_MCP_ACK was set but did not match the current consent hash.\\n` +\n `Expected: ${hash}\\n` +\n `Got: ${env.HAVEN_MCP_ACK}\\n` +\n `Re-acknowledge with the new hash above, or run with --ack.\\n\\n`,\n )\n return { ok: false, hash, reason: 'env_var_mismatch' }\n }\n\n // 3) Sidecar ack file (only meaningful when we loaded from a file).\n const ackPath = sidecarPath(options.credentialsPath)\n if (ackPath) {\n const stored = await readAckFile(ackPath)\n if (stored?.ack === hash) {\n return { ok: true, hash, reason: 'ack_file_match' }\n }\n }\n\n // 4) --ack: write the sidecar and accept.\n if (options.writeAck && ackPath) {\n out.write(renderConsentBlock(input, hash))\n await writeAckFile(ackPath, hash)\n out.write(`Wrote acknowledgement to ${ackPath}\\n\\n`)\n return { ok: true, hash, reason: 'wrote_ack_file' }\n }\n\n // 5) Otherwise: print and refuse.\n out.write(renderConsentBlock(input, hash))\n return { ok: false, hash, reason: 'no_acknowledgement' }\n}\n\nfunction sidecarPath(credentialsPath?: string): string | null {\n if (!credentialsPath) return null\n return resolve(`${credentialsPath}.ack.json`)\n}\n\nasync function readAckFile(path: string): Promise<{ ack?: string } | null> {\n try {\n const raw = await readFile(path, 'utf8')\n const parsed = JSON.parse(raw) as { ack?: unknown }\n return { ack: typeof parsed.ack === 'string' ? parsed.ack : undefined }\n } catch {\n return null\n }\n}\n\nasync function writeAckFile(path: string, hash: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(\n path,\n JSON.stringify({ ack: hash, at: new Date().toISOString() }, null, 2),\n 'utf8',\n )\n}\n\nexport interface CredentialIdentitySeed {\n apiKey: string\n apiUrl?: string\n agentId?: string\n /** Safe address from the credential file, used as a fallback. */\n safeAddress?: string\n /** Delegate address from the credential file, used before live allowance metadata is available. */\n delegateAddress?: string\n /** Chain from the credential file, used as a fallback. */\n chainId?: number\n /** Intended agent budget from the setup flow, used before on-chain approval is visible. */\n allowanceSummary?: readonly { token: string; amount: string; resetMinutes: number | null }[]\n}\n\n/**\n * Build the consent input from credential identity plus a live allowance\n * lookup. The on-chain (or configured) allowance is what the operator\n * actually cares about — that's the real spend ceiling — but we also bind\n * the hash to the Haven wallet / delegate / chain so a credential swap\n * cannot quietly reuse a prior sidecar acknowledgement.\n *\n * If `getAllowances()` fails (e.g. backend unreachable on first launch) we\n * fall through to whatever identity fields the credential file provided,\n * so the operator at least sees the tool list and the api-key prefix.\n */\nexport async function consentInputFromClient(\n haven: HavenClient,\n seed: CredentialIdentitySeed,\n toolNames: readonly HavenMcpToolName[],\n): Promise<ConsentInput> {\n let allowanceSummary: ConsentInput['allowanceSummary'] = seed.allowanceSummary ?? []\n let safeAddress = seed.safeAddress\n let delegateAddress: string | undefined = seed.delegateAddress\n let chainId: number | undefined = seed.chainId\n\n try {\n const summary = await haven.getAllowances()\n const list: HavenAllowance[] = isAllowanceSummary(summary)\n ? summary.allowances\n : Array.isArray(summary)\n ? (summary as HavenAllowance[])\n : []\n if (isAllowanceSummary(summary)) {\n safeAddress = summary.safeAddress ?? safeAddress\n delegateAddress = summary.delegateAddress\n chainId = typeof summary.chainId === 'number' ? summary.chainId : chainId\n }\n const liveAllowanceSummary = list.map((a) => ({\n token: a.tokenSymbol ?? 'UNKNOWN',\n amount: a.onchain?.amount ?? a.configuredAmount ?? '0',\n resetMinutes:\n typeof a.onchain?.resetTimeMin === 'number'\n ? a.onchain.resetTimeMin\n : typeof a.resetPeriodMin === 'number'\n ? a.resetPeriodMin\n : null,\n }))\n allowanceSummary = liveAllowanceSummary\n } catch {\n // Identity falls back to what the credential file gave us.\n }\n\n return {\n apiKeyPrefix: derivePrefix(seed.apiKey),\n apiUrl: seed.apiUrl,\n agentId: seed.agentId,\n safeAddress,\n delegateAddress,\n chainId,\n toolNames,\n allowanceSummary,\n }\n}\n\nfunction isAllowanceSummary(value: unknown): value is HavenAllowanceSummary {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'allowances' in value &&\n Array.isArray((value as { allowances: unknown }).allowances)\n )\n}\n\n/**\n * Use the leading characters of the api key (which already begins with the\n * non-secret `sk_agent_` prefix) as a stable, low-information identifier.\n * Twelve characters is enough to disambiguate credentials in front of a\n * human but not enough to reveal the secret.\n */\nfunction derivePrefix(apiKey: string): string {\n return apiKey.slice(0, 12)\n}\n\n/** Convenience: the canonical tool list registered by the server. */\nexport function registeredToolNames(): HavenMcpToolName[] {\n return Object.keys(toolSchemas) as HavenMcpToolName[]\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { HavenClient, isSupportedNodeVersion, unsupportedNodeVersionMessage } from '@haven_ai/sdk'\nimport { loadCredentials, type HavenCredentialFile } from './credentials.js'\nimport {\n createToolHandlers,\n toolDescriptions,\n toolSchemas,\n type HavenMcpToolName,\n type ToolPayload,\n} from './tools.js'\nimport {\n consentInputFromClient,\n ensureConsent,\n registeredToolNames,\n type ConsentDecision,\n} from './consent.js'\n\nexport interface HavenMcpServerOptions {\n credentialsPath?: string\n identityPath?: string\n signerPath?: string\n credentials?: HavenCredentialFile\n /**\n * When true, write the consent sidecar file (`<credentials>.ack.json`)\n * with the current consent hash and proceed. Surfaced via the `--ack`\n * CLI flag.\n */\n writeAck?: boolean\n /**\n * When true, skip the consent gate entirely. Reserved for tests and\n * controlled embedding — production CLIs should not set this.\n */\n skipConsent?: boolean\n /** Overridable so the Node-floor refusal is testable without spawning a Node. */\n nodeVersion?: string\n}\n\nexport interface ResolvedHavenClient {\n client: HavenClient\n credentials: HavenCredentialFile\n}\n\nexport async function createHavenClient(options: HavenMcpServerOptions = {}): Promise<HavenClient> {\n const { client } = await resolveHavenClient(options)\n return client\n}\n\nexport async function resolveHavenClient(options: HavenMcpServerOptions = {}): Promise<ResolvedHavenClient> {\n // The choke point (#1161 review): `runStdioServer`, `createHavenClient` and\n // `createHavenMcpServer` all funnel through here, and the client built below\n // is delegate-key-bound — `pay()`, `sign()` and the x402 paths activate the\n // moment `delegateKey` is set. Guarding only the stdio entrypoint would leave\n // the embedding constructors reaching a signing-capable client on an\n // unsupported runtime, which is this issue's own bug one layer down.\n assertSupportedNodeVersion(options.nodeVersion)\n\n const credentialSource = options.credentialsPath || options.identityPath || options.signerPath\n ? {\n credentialsPath: options.credentialsPath,\n identityPath: options.identityPath,\n signerPath: options.signerPath,\n }\n : undefined\n const credentials = options.credentials ?? await loadCredentials(credentialSource)\n const client = new HavenClient({\n apiKey: credentials.apiKey,\n delegateKey: credentials.delegateKey,\n baseUrl: credentials.apiUrl,\n })\n return { client, credentials }\n}\n\nexport async function createHavenMcpServer(options: HavenMcpServerOptions = {}): Promise<McpServer> {\n const haven = await createHavenClient(options)\n return buildMcpServer(haven)\n}\n\n/**\n * Build an MCP server bound to the supplied Haven client.\n *\n * Each tool dispatch is wrapped in `haven.withRequestContext` so every\n * Haven API request the dispatch issues carries `X-Haven-MCP-Tool: <name>`\n * — and *only* that dispatch's requests see the header. The SDK uses an\n * `AsyncLocalStorage` for the context, so two tool calls running\n * concurrently cannot leak headers into each other and the backend\n * `agent_tool_invocations` rows are always attributed to the right tool.\n */\nexport const MCP_NAME = '@haven_ai/mcp'\nexport const MCP_VERSION = '0.1.26-alpha.0'\n\n/**\n * MCP `instructions` — the critical path, surfaced to the model at\n * `initialize`. Shorter than the hosted server's: this runtime signs\n * in-process with the delegate key it holds, so there is no separate\n * haven-signer namespace or payment_id signing step to describe. Kept free\n * of any version literal; a guard test in `server.test.ts` pins that.\n */\nexport const MCP_INSTRUCTIONS = [\n 'Haven local MCP server: signs in-process with the delegate key it holds on',\n 'this machine — the key never leaves this process. Call haven_get_agent',\n 'first, every session: identity, readiness, and live remaining budget in',\n 'one call. Do not guess the wallet, network, or budget.',\n '',\n 'To pay: haven_discover_tools to find a payable service, then',\n 'haven_pay_mcp_tool for MCP merchants or haven_pay_x402 for any x402',\n 'paywall. Tool responses carry nextAction — follow it; description prose',\n 'is fallback, not the source of truth.',\n '',\n 'pending_approval means stop and tell the user — do not retry, re-sign, or',\n 're-pay while a payment is pending. Spend authority is enforced on-chain by',\n 'the user\\'s account; Haven never holds keys and cannot override it.',\n].join('\\n')\n\nexport function buildMcpServer(haven: HavenClient): McpServer {\n const server = new McpServer(\n {\n name: MCP_NAME,\n version: MCP_VERSION,\n },\n { instructions: MCP_INSTRUCTIONS },\n )\n\n const handlers = createToolHandlers(haven)\n const registerTool = (server as any).tool.bind(server)\n for (const name of Object.keys(toolSchemas) as HavenMcpToolName[]) {\n registerTool(\n name,\n toolDescriptions[name],\n toolSchemas[name],\n async (args: unknown) =>\n haven.withRequestContext({ 'X-Haven-MCP-Tool': name }, async () =>\n toMcpResult(await handlers[name](args)),\n ),\n )\n }\n\n return server\n}\n\n/**\n * Refuse to start on an unsupported Node (#1161).\n *\n * Same reasoning as the signer's identical guard: install-time enforcement\n * cannot see a Node downgrade after setup, or a version manager handing the\n * agent runtime a different Node than the shell that connected. The local MCP\n * server drives payment construction against the signer, so it is held to the\n * package's declared floor rather than whatever happens to boot.\n */\nexport function assertSupportedNodeVersion(nodeVersion: string = process.versions.node): void {\n if (isSupportedNodeVersion(nodeVersion)) return\n const err: NodeJS.ErrnoException = new Error(\n unsupportedNodeVersionMessage({ subject: 'The Haven MCP server', nodeVersion }),\n )\n err.code = 'HAVEN_MCP_UNSUPPORTED_NODE'\n throw err\n}\n\nexport async function runStdioServer(options: HavenMcpServerOptions = {}): Promise<void> {\n // Asserted inside resolveHavenClient — the choke point every key-bound path\n // shares — so it still runs here, before credentials are read.\n const { client: haven, credentials } = await resolveHavenClient(options)\n\n if (!options.skipConsent) {\n const decision = await runConsentGate(haven, credentials, options)\n if (!decision.ok) {\n // The consent block has already been printed by `ensureConsent`.\n const err: NodeJS.ErrnoException = new Error(\n decision.reason === 'env_var_mismatch'\n ? 'Haven MCP consent acknowledgement does not match the current configuration.'\n : 'Haven MCP server requires a one-time consent acknowledgement before starting.',\n )\n err.code = 'HAVEN_MCP_NO_CONSENT'\n throw err\n }\n }\n\n const server = buildMcpServer(haven)\n await server.connect(new StdioServerTransport())\n}\n\nexport async function runConsentGate(\n haven: HavenClient,\n credentials: HavenCredentialFile,\n options: HavenMcpServerOptions,\n): Promise<ConsentDecision> {\n const toolNames = registeredToolNames()\n const input = await consentInputFromClient(\n haven,\n {\n apiKey: credentials.apiKey,\n apiUrl: credentials.apiUrl,\n agentId: credentials.agentId,\n safeAddress: credentials.safeAddress,\n delegateAddress: credentials.delegateAddress,\n chainId: credentials.chainId,\n allowanceSummary: credentials.allowanceSummary,\n },\n toolNames,\n )\n // Prefer the path actually used to load credentials (covers\n // HAVEN_CREDENTIALS as well as --credentials). If neither file path is\n // available the operator must use HAVEN_MCP_ACK; --ack has nowhere to\n // write a sidecar in that case.\n const credentialsPath = options.identityPath ?? options.credentialsPath ?? credentials.sourcePath\n return ensureConsent(input, {\n credentialsPath,\n writeAck: options.writeAck,\n })\n}\n\nfunction toMcpResult(payload: ToolPayload) {\n return {\n isError: !payload.success,\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(payload, null, 2),\n },\n ],\n }\n}\n","#!/usr/bin/env node\n\nimport { runStdioServer, type HavenMcpServerOptions } from './server.js'\n\nfunction parseArgs(argv: string[]): HavenMcpServerOptions {\n const options: HavenMcpServerOptions = {}\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i]\n if (arg === '--credentials' || arg === '--credentials-path') {\n options.credentialsPath = argv[i + 1]\n i += 1\n } else if (arg === '--identity') {\n options.identityPath = argv[i + 1]\n i += 1\n } else if (arg === '--signer') {\n options.signerPath = argv[i + 1]\n i += 1\n } else if (arg === '--transport') {\n const transport = argv[i + 1]\n i += 1\n if (transport !== 'stdio') {\n throw new Error('Only local stdio transport is supported. Haven does not provide a remote MCP signer mode.')\n }\n } else if (arg === '--ack') {\n // Write the consent-gate acknowledgement next to the credential file\n // and proceed. Used on first-launch to opt the operator in once.\n options.writeAck = true\n } else if (arg === '--help' || arg === '-h') {\n process.stdout.write([\n 'Haven MCP server',\n '',\n 'Usage:',\n ' npx @haven_ai/mcp --credentials /path/to/agent.json',\n ' npx @haven_ai/mcp --identity /path/to/identity.json --signer /path/to/signer.json',\n '',\n 'Options:',\n ' --credentials <path> Haven credential JSON file. Also supported: HAVEN_CREDENTIALS.',\n ' --identity <path> Haven identity JSON file written by @haven_ai/connect.',\n ' --signer <path> Haven signer JSON file written by @haven_ai/connect.',\n ' --transport stdio Local stdio transport. This is the only supported mode.',\n ' --ack Acknowledge the first-launch consent block and write',\n ' a sidecar acknowledgement file next to the credential.',\n '',\n 'Consent:',\n ' On first launch the server prints the tool list and the on-chain',\n ' allowance summary, then refuses to start unless you have acknowledged.',\n ' Acknowledge with EITHER --ack OR HAVEN_MCP_ACK=<hash> in your environment.',\n '',\n ].join('\\n'))\n process.exit(0)\n }\n }\n return options\n}\n\nasync function main(): Promise<void> {\n await runStdioServer(parseArgs(process.argv.slice(2)))\n}\n\nmain().catch((err) => {\n process.stderr.write(`${err instanceof Error ? err.message : String(err)}\\n`)\n process.exit(1)\n})\n"]}
package/dist/cli.js CHANGED
@@ -765,7 +765,7 @@ async function resolveHavenClient(options = {}) {
765
765
  return { client, credentials };
766
766
  }
767
767
  var MCP_NAME = "@haven_ai/mcp";
768
- var MCP_VERSION = "0.1.24-alpha.0";
768
+ var MCP_VERSION = "0.1.26-alpha.0";
769
769
  var MCP_INSTRUCTIONS = [
770
770
  "Haven local MCP server: signs in-process with the delegate key it holds on",
771
771
  "this machine \u2014 the key never leaves this process. Call haven_get_agent",