@agentproto/cli 0.1.0-alpha.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../runtime/src/config.ts","../src/commands/daemon.ts","../src/util/credentials.ts","../src/commands/auth.ts","../src/commands/config.ts","../src/registry/resolve.ts","../src/commands/setup.ts","../src/commands/install.ts","../src/util/stdin.ts","../src/commands/run.ts","../src/util/pty-factory.ts","../src/commands/serve.ts","../../runtime/src/workspaces-config.ts","../../define-doctype/src/index.ts","../../manifest/src/index.ts","../../extension/src/schema.js","../../extension/src/define-extension.js","../../extension/src/spec-from-extension.js","../../extension/src/manifest/index.js","../../mcp-server/src/index.ts","../../runtime/src/agentproto-dir.ts","../../runtime/src/command-tools.ts","../../runtime/src/conversations.ts","../../runtime/src/events.ts","../../runtime/src/fs-tools.ts","../../runtime/src/mcp-discovery.ts","../../runtime/src/mcp-imports.ts","../../runtime/src/session-tools.ts","../../runtime/src/heartbeat.ts","../../runtime/src/http-server.ts","../../runtime/src/resume-strategies.ts","../../runtime/src/sessions.ts","../../runtime/src/mcp-proxy.ts","../../runtime/src/remote-providers/quick.ts","../../runtime/src/remote-controller.ts","../../runtime/src/remote-tools.ts","../../runtime/src/workspace-fs.ts","../../runtime/src/index.ts","../src/commands/workspace.ts","../src/commands/sessions.ts","../src/cli.ts"],"names":["fs","dirname","join","homedir","USAGE","osPlatform","runInstall","runStart","runStop","parseArgs","resolve","spawn","text","resolvePath","stat","platform","input","output","readFile","mkdir","writeFile","chmod","isAbsolute","rm","matter","z","readdir","unlink","existsSync","normalize","relative","WORKSPACES_CONFIG_VERSION","DEFAULT_CONFIG_DIR","DEFAULT_CONFIG_PATH","sanitizeSlug","loadWorkspacesConfig","normalizeConfig","findWorkspace","getActiveWorkspace","server","id","EventEmitter","rt","randomBytes","createHash","fsReadFile","fsWriteFile","randomUUID","http","userInfo","hostname","createAgentCliRuntime","paths","sleep","WebSocket","headers","basename","RESUME_STRATEGIES","probeMtimeLatestJsonl","list","config","isPidAlive","truncate","preview","runDaemon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFA,eAAsB,WAAW,IAAA,EAA0C;AACzE,EAAA,MAAM,MAAA,GAAiB,gBAAA,EAAA;AACvB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMA,QAAAA,CAAG,QAAA,CAAS,QAAQ,MAAM,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,MAAA,OAAO,MAAA;AACT,IAAA;AACA,IAAA,OAAA,CAAQ,IAAA;AACN,MAAA,CAAA,iBAAA,EAAoB,MAAM,CAAA,kDAAA;AAAA,KAAA;AAE5B,IAAA,OAAO,EAAA;AACT,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AAEZ,IAAA,MAAM,OAAQ,GAAA,CAA8B,IAAA;AAC5C,IAAA,IAAI,IAAA,IAAQ,SAAS,QAAA,EAAU;AAC7B,MAAA,OAAA,CAAQ,IAAA;QACN,CAAA,gCAAA,EAAmC,MAAM,KACvC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA;AAAA,OAAA;AAEJ,IAAA;AACA,IAAA,OAAO,EAAA;AACT,EAAA;AACF;AAcA,eAAsB,UAAA,CACpB,MACA,IAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAiB,gBAAA,EAAA;AACvB,EAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,EAAM,SAAS,cAAA,EAAA;AACpC,EAAA,MAAM,GAAA,GAAMC,QAAQ,MAAM,CAAA;AAC1B,EAAA,MAAMD,SAAG,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,GAAG,MAAM,CAAA,IAAA,CAAA;AACrB,EAAA,MAAMA,QAAAA,CAAG,SAAA,CAAU,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,MAAM,CAAA;AACvE,EAAA,MAAMA,QAAAA,CAAG,MAAA,CAAO,GAAA,EAAK,MAAM,CAAA;AAC7B;AAMO,SAAS,YAAA,CACd,KACA,MAAA,EACS;AACT,EAAA,IAAI,GAAA,GAAe,GAAA;AACnB,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACpC,IAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,OAAO,GAAA,KAAQ,UAAU,OAAO,MAAA;AACnD,IAAA,GAAA,GAAO,IAAgC,IAAI,CAAA;AAC7C,EAAA;AACA,EAAA,OAAO,GAAA;AACT;AAOO,SAAS,YAAA,CACd,GAAA,EACA,MAAA,EACA,KAAA,EACkB;AAClB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC9B,EAAA,MAAM,GAAA,GAAwB,EAAE,GAAG,GAAA,EAAA;AACnC,EAAA,IAAI,GAAA,GAA+B,GAAA;AACnC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAM,IAAA,GAAO,IAAI,CAAC,CAAA;AAClB,IAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5D,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,EAAE,GAAI,IAAA,EAAA;IACjB,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,IAAI,EAAA;AACX,IAAA;AACA,IAAA,GAAA,GAAM,IAAI,CAAC,CAAA;AACb,EAAA;AACA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,IAAI,IAAI,CAAA;EACjB,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,IAAI,CAAA,GAAI,KAAA;AACd,EAAA;AACA,EAAA,OAAO,GAAA;AACT;IAxJa,cAAA,EA6CA,gBAAA;;;AA7CN,IAAM,cAAA,GAAiB,CAAA;AA6CvB,IAAM,mBAAmB,MAC9BE,IAAAA,CAAKC,OAAAA,EAAA,EAAW,eAAe,aAAa,CAAA;;;;;AC7E9C,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,SAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAmDA,eAAsB,UAAU,IAAA,EAA0C;AACxE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,IAAA,CAAK,SAAS,IAAI,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AACvE,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAMC,MAAK,CAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,EACjC;AACA,EAAA,IAAIC,QAAA,OAAiB,QAAA,EAAU;AAC7B,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,mBAAA,EAAsBA,UAAY,CAAA;AAAA;AAAA,KAGpC;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,SAAA;AACH,MAAA,OAAOC,YAAW,IAAI,CAAA;AAAA,IACxB,KAAK,WAAA;AACH,MAAA,OAAO,YAAA,EAAa;AAAA,IACtB,KAAK,OAAA;AACH,MAAA,OAAOC,SAAAA,EAAS;AAAA,IAClB,KAAK,MAAA;AACH,MAAA,OAAOC,QAAAA,EAAQ;AAAA,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,SAAA,EAAU;AAAA,IACnB,KAAK,MAAA;AACH,MAAA,OAAO,QAAQ,IAAI,CAAA;AAAA,IACrB;AACE,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,wCAAwC,GAAG,CAAA;;AAAA,EAASJ,MAAK,CAAA;AAAA,OAC3D;AACA,MAAA,OAAO,CAAA;AAAA;AAEb;AAYA,SAAS,KAAA,GAAe;AACtB,EAAA,OAAO;AAAA,IACL,KAAA,EAAOF,KAAKC,OAAAA,EAAQ,EAAG,WAAW,cAAA,EAAgB,CAAA,EAAG,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,IAClE,GAAA,EAAKD,IAAAA,CAAKC,OAAAA,EAAQ,EAAG,eAAe,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKhD,IAAA,EAAM;AAAA,MACJ,OAAA,CAAQ,QAAA;AAAA,MACR,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,IAAK;AAAA;AACrB,GACF;AACF;AAEA,eAAeG,YAAW,IAAA,EAA0C;AAClE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAIG,SAAAA,CAAU;AAAA,IAC3B,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,KAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,SAAS,EAAE,SAAA,EAAW,EAAE,IAAA,EAAM,WAAU;AAAE,GAC3C,CAAA;AACD,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,IAAU,EAAC;AAC9B,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,IAAA,GAAO,CAAC,OAAO,CAAA;AACrB,EAAA,IAAI,OAAO,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,OAAO,SAAS,CAAA;AAC/D,EAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU,IAAA,CAAK,KAAK,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC5E,EAAA,IAAI,OAAO,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,OAAO,IAAI,CAAA;AAChD,EAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,cAAA,IAAkB,EAAC,EAAG;AAChD,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,EACpC;AACA,EAAA,IAAI,OAAO,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,OAAO,KAAK,CAAA;AACnD,EAAA,MAAM,UAAA,GAAa,IAAI,MAAA,EAAQ,IAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,MAAA,EAAQ,WAAA,KAAgB,IAAA;AAChD,EAAA,IAAI,UAAA,IAAc,WAAA,EAAa,IAAA,CAAK,IAAA,CAAK,aAAa,UAAU,CAAA;AAEhE,EAAA,MAAM,QAAQ,WAAA,CAAY;AAAA,IACxB,KAAA,EAAO,KAAA;AAAA;AAAA,IAEP,UAAU,CAAC,GAAG,CAAA,CAAE,IAAA,EAAM,GAAG,IAAI,CAAA;AAAA,IAC7B,SAAS,CAAA,CAAE;AAAA,GACZ,CAAA;AAED,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,cAAA,EAAiB,EAAE,KAAK,CAAA;;AAAA,EAAQ,KAAK;AAAA,mCAAA,EAAwC,EAAE,KAAK;AAAA;AAAA,KACtF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAMT,QAAAA,CAAG,MAAMC,OAAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACpD,EAAA,MAAMD,QAAAA,CAAG,MAAMC,OAAAA,CAAQ,CAAA,CAAE,GAAG,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAClD,EAAA,MAAMD,QAAAA,CAAG,SAAA,CAAU,CAAA,CAAE,KAAA,EAAO,OAAO,MAAM,CAAA;AACzC,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,yBAAA,EAA4B,CAAA,CAAE,KAAK;AAAA,CAAI,CAAA;AAI5D,EAAA,MAAM,SAAA,CAAU,CAAC,SAAA,EAAW,CAAA,IAAA,EAAO,OAAA,CAAQ,MAAA,IAAS,IAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAC,CAAA,CAAE,KAAA;AAAA,IACtE,MAAM;AAAA,GACR;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAU;AAAA,IAC3B,WAAA;AAAA,IACA,CAAA,IAAA,EAAO,OAAA,CAAQ,MAAA,IAAS,IAAK,CAAC,CAAA,CAAA;AAAA,IAC9B,CAAA,CAAE;AAAA,GACH,CAAA;AACD,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,4DAAA,EAA+D,KAAK,IAAI,CAAA;AAAA,EAAM,KAAK,MAAM;AAAA;AAAA,KAC3F;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb,CAAA;AAAA;AAAA,GACF;AACA,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,YAAA,GAAgC;AAC7C,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,SAAS,CAAA,IAAA,EAAO,OAAA,CAAQ,UAAS,IAAK,CAAC,IAAI,KAAK,CAAA,CAAA;AACtD,EAAA,MAAM,MAAM,MAAM,SAAA,CAAU,CAAC,SAAA,EAAW,MAAM,CAAC,CAAA;AAC/C,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,IAAK,CAAC,mBAAmB,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG;AAC1D,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,4DAAA,EAA+D,IAAI,IAAI,CAAA;AAAA,EAAM,IAAI,MAAM;AAAA;AAAA,KACzF;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAMA,QAAAA,CAAG,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA;AACvB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,CAAA,CAAE,KAAK;AAAA,CAAI,CAAA;AAAA,EAChE,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,OAAQ,GAAA,CAA8B,IAAA;AAC5C,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,mBAAA,EAAsB,CAAA,CAAE,KAAK,CAAA;AAAA,CAAmB,CAAA;AAAA,IACvE,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,wDACE,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD;AAAA;AAAA,OACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,CAAA;AACT;AAEA,eAAeO,SAAAA,GAA4B;AACzC,EAAA,MAAM,SAAS,CAAA,IAAA,EAAO,OAAA,CAAQ,UAAS,IAAK,CAAC,IAAI,KAAK,CAAA,CAAA;AACtD,EAAA,MAAM,MAAM,MAAM,SAAA,CAAU,CAAC,WAAA,EAAa,IAAA,EAAM,MAAM,CAAC,CAAA;AACvD,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,yBAAA,EAA4B,GAAA,CAAI,MAAA,IAAU,mBAAA,GAAsB,IAAI,IAAI;AAAA;AAAA;AAAA,KAE1E;AACA,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AACA,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,qCAAqC,CAAA;AAC1D,EAAA,OAAO,CAAA;AACT;AAEA,eAAeC,QAAAA,GAA2B;AACxC,EAAA,MAAM,SAAS,CAAA,IAAA,EAAO,OAAA,CAAQ,UAAS,IAAK,CAAC,IAAI,KAAK,CAAA,CAAA;AACtD,EAAA,MAAM,MAAM,MAAM,SAAA,CAAU,CAAC,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAC,CAAA;AACvD,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,wBAAA,EAA2B,GAAA,CAAI,MAAA,IAAU,mBAAA,GAAsB,IAAI,IAAI;AAAA;AAAA,KACzE;AACA,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AACA,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,mCAAmC,CAAA;AACxD,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,SAAA,GAA6B;AAC1C,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,EAAQ,IAAA,IAAQ,KAAA;AACjC,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,EAAQ,IAAA,IAAQ,WAAA;AAGjC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI;AACF,IAAA,MAAMR,QAAAA,CAAG,MAAA,CAAO,CAAA,CAAE,KAAK,CAAA;AACvB,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,SAAS,CAAA,IAAA,EAAO,OAAA,CAAQ,UAAS,IAAK,CAAC,IAAI,KAAK,CAAA,CAAA;AACtD,EAAA,MAAM,WAAW,MAAM,SAAA,CAAU,CAAC,OAAA,EAAS,MAAM,CAAC,CAAA;AAClD,EAAA,MAAM,MAAA,GAAS,SAAS,IAAA,KAAS,CAAA;AAGjC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,sBAAsB,CAAA;AAC7D,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,wBAAwB,CAAA;AAGjE,EAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAM,KAAA,CAAM,UAAU,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,OAAA,CAAA,EAAW;AAAA,MACvD,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,GAAG;AAAA,KAChC,CAAA;AACD,IAAA,IAAI,IAAI,EAAA,EAAI;AACV,MAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAI/C,MAAA,MAAA,GAAS,CAAA,kBAAA,EAAkB,KAAK,SAAA,IAAa,GAAG,YAAS,cAAA,CAAe,IAAA,CAAK,QAAA,IAAY,CAAC,CAAC,CAAA,CAAA;AAAA,IAC7F,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,CAAA,KAAA,EAAQ,IAAI,MAAM,CAAA,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,MAAA,GAAS,aAAA;AAAA,EACX;AAEA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb,CAAA;AAAA,aAAA,EACkB,OAAA,GAAU,WAAA,GAAc,eAAe,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA;AAAA,aAAA,EACnD,SAAS,QAAA,GAAW,YAAY,CAAA,CAAA,IAC/C,QAAA,GAAW,aAAU,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA,GAAK,OACrC,UAAA,GAAa,CAAA,YAAA,EAAY,WAAW,CAAC,CAAC,KAAK,EAAA,CAAA,GAC5C;AAAA,aAAA,EACgB,MAAM,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA;AAAA,aAAA,EAC/B,kBAAkB;AAAA,aAAA,EAClB,EAAE,GAAG;AAAA;AAAA,GACzB;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAMA,QAAAA,CAAG,QAAA,CAAS,CAAA,CAAE,KAAK,MAAM,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,EAAK;AACvD,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA;AAAA,EAAqB,MAAA,CAAO,IAAA,EAAM,MAAM,CAAC;AAAA,CAAI,CAAA;AAAA,IACpE;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,OAAA,IAAW,SAAS,CAAA,GAAI,CAAA;AACjC;AAEA,eAAe,QAAQ,IAAA,EAA0C;AAC/D,EAAA,MAAM,EAAE,MAAA,EAAO,GAAIS,SAAAA,CAAU;AAAA,IAC3B,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,KAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,EAAE,KAAA,EAAO,EAAE,MAAM,QAAA,EAAU,KAAA,EAAO,KAAI;AAAE,GAClD,CAAA;AACD,EAAA,MAAM,CAAA,GAAI,OAAO,KAAA,GAAQ,MAAA,CAAO,SAAS,MAAA,CAAO,KAAA,EAAO,EAAE,CAAA,GAAI,EAAA;AAC7D,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAMT,QAAAA,CAAG,QAAA,CAAS,CAAA,CAAE,KAAK,MAAM,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,CAAC,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AACnD,IAAA,IAAI,CAAC,IAAI,QAAA,CAAS,IAAI,GAAG,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AAClD,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,2BAA2B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA;AAAA,KAC7E;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AASA,SAAS,YAAY,IAAA,EAAyB;AAC5C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CACjB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,YAAA,EAAe,SAAA,CAAU,CAAC,CAAC,CAAA,SAAA,CAAW,CAAA,CAC/C,IAAA,CAAK,IAAI,CAAA;AACZ,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,0BAAA,EAImB,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA;AAAA;AAAA,EAG/C,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAA,EAK8B,SAAA,CAAU,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,sCAAA,EACrB,SAAA,CAAU,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA;AAAA;AAAA,2BAAA,EAGlC,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,IAAQ,8BAA8B,CAAC,CAAA;AAAA,2BAAA,EAC7D,UAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,IAAQG,OAAAA,EAAS,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAKrE;AAEA,SAAS,UAAU,CAAA,EAAmB;AACpC,EAAA,OAAO,CAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,EACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC3B;AAQA,SAAS,UAAU,IAAA,EAA0C;AAC3D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAAO,QAAAA,KAAW;AAC5B,IAAA,MAAM,KAAA,GAAQC,KAAAA,CAAM,WAAA,EAAa,IAAA,EAAM,EAAE,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA,EAAG,CAAA;AAC5E,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,CAAM,MAAA,EAAQ,YAAY,MAAM,CAAA,CAAE,GAAG,MAAA,EAAQ,CAAA,CAAA,KAAM,UAAU,CAAE,CAAA;AAC/D,IAAA,KAAA,CAAM,MAAA,EAAQ,YAAY,MAAM,CAAA,CAAE,GAAG,MAAA,EAAQ,CAAA,CAAA,KAAM,UAAU,CAAE,CAAA;AAC/D,IAAA,KAAA,CAAM,EAAA;AAAA,MAAG,OAAA;AAAA,MAAS,CAAA,GAAA,KAChBD,SAAQ,EAAE,IAAA,EAAM,KAAK,MAAA,EAAQ,MAAA,EAAQ,GAAA,CAAI,OAAA,EAAS;AAAA,KACpD;AACA,IAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAA,IAAA,KAAQA,QAAAA,CAAQ,EAAE,IAAA,EAAM,IAAA,IAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAQ,CAAC,CAAA;AAAA,EACvE,CAAC,CAAA;AACH;AAEA,SAAS,eAAe,EAAA,EAAoB;AAC1C,EAAA,IAAI,EAAA,GAAK,GAAA,EAAM,OAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AAC3B,EAAA,IAAI,EAAA,GAAK,KAAQ,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAC,CAAA,CAAA,CAAA;AAChD,EAAA,IAAI,EAAA,GAAK,MAAW,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,GAAM,CAAC,CAAA,CAAA,CAAA;AACrD,EAAA,IAAI,EAAA,GAAK,OAAY,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,IAAS,CAAC,CAAA,CAAA,CAAA;AACzD,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,KAAU,CAAC,CAAA,CAAA,CAAA;AACvC;AAEA,SAAS,MAAA,CAAO,GAAW,MAAA,EAAwB;AACjD,EAAA,OAAO,CAAA,CACJ,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,OAAK,MAAA,GAAS,CAAC,CAAA,CACnB,IAAA,CAAK,IAAI,CAAA;AACd;AA9YA,IAkCM,KAAA,EACAN,MAAAA;AAnCN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wBAAA,GAAA;AAgCA,IAAA,WAAA,EAAA;AAEA,IAAM,KAAA,GAAQ,eAAA;AACd,IAAMA,MAAAA,GAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACgCd,IAAM,YAAA,GAAe,CAAA;AAEd,SAAS,eAAA,GAA0B;AACxC,EAAA,MAAM,IAAA,GAAO,QAAQ,GAAA,CAAI,iBAAiB,KAAK,IAAA,CAAK,OAAA,IAAW,aAAa,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,kBAAkB,CAAA;AACtC;AAEO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAChC;AAEA,eAAsB,eAAA,GAA4C;AAChE,EAAA,MAAM,OAAO,eAAA,EAAgB;AAC7B,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,MAAA,CAAO,YAAY,YAAA,EAAc;AACnC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,kCAAA,EAAqC,MAAA,CAAO,OAAO,CAAA,WAAA,EAAc,YAAY,CAAA,uDAAA;AAAA,OAE/E;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,IAAK,GAAA,CAA8B,SAAS,QAAA,EAAU;AACpD,MAAA,OAAO,EAAE,OAAA,EAAS,YAAA,EAAc,KAAA,EAAO,EAAC,EAAE;AAAA,IAC5C;AACA,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,eAAsB,gBAAgB,IAAA,EAAsC;AAC1E,EAAA,MAAM,OAAO,eAAA,EAAgB;AAC7B,EAAA,MAAM,MAAM,OAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,EAAA,MAAM,UAAU,IAAA,EAAM,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AACnD,EAAA,MAAM,KAAA,CAAM,IAAA,EAAM,GAAK,CAAA,CAAE,MAAM,MAAM;AAAA,EAIrC,CAAC,CAAA;AACH;AAEA,eAAsB,SAAS,IAAA,EAA8C;AAC3E,EAAA,MAAM,CAAA,GAAI,MAAM,eAAA,EAAgB;AAChC,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,IAAI,CAAC,CAAA,IAAK,IAAA;AACzC;AAEA,eAAsB,SAAA,CACpB,MACA,IAAA,EACe;AACf,EAAA,MAAM,CAAA,GAAI,MAAM,eAAA,EAAgB;AAChC,EAAA,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,IAAI,CAAC,CAAA,GAAI,IAAA;AAC/B,EAAA,MAAM,gBAAgB,CAAC,CAAA;AACzB;AAEA,eAAsB,WAAW,IAAA,EAA8C;AAC7E,EAAA,MAAM,CAAA,GAAI,MAAM,eAAA,EAAgB;AAChC,EAAA,MAAM,GAAA,GAAM,cAAc,IAAI,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,IAAK,IAAA;AAC7B,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO,CAAA,CAAE,MAAM,GAAG,CAAA;AAClB,IAAA,IAAI,OAAO,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AAGrC,MAAA,MAAM,MAAA,CAAO,eAAA,EAAiB,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAChD,CAAA,MAAO;AACL,MAAA,MAAM,gBAAgB,CAAC,CAAA;AAAA,IACzB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,SAAA,CAAU,IAAA,EAAsB,aAAA,GAAgB,GAAA,EAAiB;AAC/E,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AACrC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,GAAG,OAAO,KAAA;AAClC,EAAA,OAAO,GAAA,GAAM,aAAA,IAAiB,IAAA,CAAK,GAAA,EAAI;AACzC;AAEO,SAAS,aAAa,IAAA,EAA8B;AACzD,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AACnC,EAAA,IAAI,OAAO,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,GAAG,OAAO,SAAA;AACxC,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAK,GAAA,EAAI;AACpC,EAAA,IAAI,KAAK,CAAA,EAAG,OAAO,WAAW,cAAA,CAAe,CAAC,EAAE,CAAC,CAAA,IAAA,CAAA;AACjD,EAAA,OAAO,CAAA,WAAA,EAAc,cAAA,CAAe,EAAE,CAAC,CAAA,CAAA;AACzC;AAEA,SAAS,eAAe,EAAA,EAAoB;AAC1C,EAAA,IAAI,EAAA,GAAK,KAAQ,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAC,CAAA,CAAA,CAAA;AAChD,EAAA,IAAI,EAAA,GAAK,MAAW,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,GAAM,CAAC,CAAA,CAAA,CAAA;AACrD,EAAA,IAAI,EAAA,GAAK,OAAY,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,IAAS,CAAC,CAAA,CAAA,CAAA;AACzD,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,KAAU,CAAC,CAAA,CAAA,CAAA;AACvC;;;ACzHA,eAAsB,QAAQ,IAAA,EAA0C;AACtE,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAA,OAAO,aAAa,IAAI,CAAA;AAAA,IAC1B,KAAK,QAAA;AACH,MAAA,OAAO,cAAc,IAAI,CAAA;AAAA,IAC3B,KAAK,QAAA;AACH,MAAA,OAAO,cAAc,IAAI,CAAA;AAAA,IAC3B,KAAK,MAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,KAAK,CAAA;AAC1B,MAAA,OAAO,CAAA;AAAA,IACT;AACE,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,wCAAwC,GAAG,CAAA;;AAAA,EAAS,KAAK,CAAA;AAAA,OAC3D;AACA,MAAA,OAAO,CAAA;AAAA;AAEb;AAEA,IAAM,KAAA,GAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAwEd,eAAe,aAAa,IAAA,EAA0C;AACpE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,CAAU;AAAA,IAC3B,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MAChC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS;AAC1B,GACD,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,IAAS,MAAM,eAAA,EAAgB;AACnD,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,CAAA,EAAG,UAAS,CAAE,QAAQ,CAAA,CAAA,EAAI,QAAA,EAAU,CAAA,CAAA;AAClE,EAAA,MAAM,cAAA,GAAiB,OAAO,KAAA,IAAS,mCAAA;AAEvC,EAAA,MAAM,QAAA,GAAW,OAAO,IAAI,CAAA;AAC5B,EAAA,MAAM,YAAA,GAAe,GAAG,QAAQ,CAAA,iCAAA,CAAA;AAChC,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,6BAAA,EAAgC,YAAY;AAAA,CAAI,CAAA;AACrE,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,SAAA,GAAY,MAAM,UAAyB,YAAY,CAAA;AAAA,EACzD,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,mDAAmD,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA;AAAA;AAAA,KAErG;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI;AACF,IAAA,SAAA,GAAY,MAAM,QAAA;AAAA,MAChB,SAAA,CAAU,6BAAA;AAAA,MACV;AAAA,QACE,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,KAAA,EAAO,cAAA;AAAA;AAAA;AAAA;AAAA,QAIP,YAAA,EAAc;AAAA;AAChB,KACF;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,yDAAyD,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA;AAAA,KAC3G;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAA,GACJ,SAAA,CAAU,yBAAA,IAA6B,SAAA,CAAU,gBAAA;AACnD,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb;AAAA;AAAA,EAAA,EAA8B,SAAS;AAAA,gBAAA,EAAqB,UAAU,SAAS;;AAAA;AAAA,GACjF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,YAAY,CAAA,EAAG;AACzB,IAAA,KAAK,YAAY,SAAS,CAAA;AAAA,EAC5B;AACA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb,CAAA,kDAAA,EAAqD,cAAA,CAAe,SAAA,CAAU,UAAA,GAAa,GAAI,CAAC,CAAA;AAAA;AAAA,GAClG;AAGA,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,CAAU,YAAY,CAAC,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,UAAU,UAAA,GAAa,GAAA;AACrD,EAAA,IAAI,iBAAiB,QAAA,GAAW,GAAA;AAChC,EAAA,IAAI,KAAA,GAAqC,IAAA;AACzC,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,MAAM,cAAc,CAAA;AAC1B,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,QAAA;AAAA,QACV,SAAA,CAAU,cAAA;AAAA,QACV;AAAA,UACE,UAAA,EAAY,8CAAA;AAAA,UACZ,aAAa,SAAA,CAAU,WAAA;AAAA,UACvB,WAAW,SAAA,CAAU;AAAA;AACvB,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,uCAAuC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA;AAAA,OACzF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,kBAAkB,GAAA,EAAK;AACzB,MAAA,KAAA,GAAQ,GAAA;AACR,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,UAAU,uBAAA,EAAyB;AAC3C,IAAA,IAAI,GAAA,CAAI,UAAU,WAAA,EAAa;AAG7B,MAAA,cAAA,IAAkB,GAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,UAAU,eAAA,EAAiB;AACjC,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA;AAAA,CAA+C,CAAA;AACpE,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,CAAI,UAAU,eAAA,EAAiB;AACjC,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA;AAAA;AAAA,OACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,0CAAA,EAA6C,GAAA,CAAI,KAAK,CAAA,CAAA,EACpD,GAAA,CAAI,oBAAoB,CAAA,EAAA,EAAK,GAAA,CAAI,iBAAiB,CAAA,CAAA,GAAK,EACzD;AAAA;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA;AAAA;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,OAAO,KAAA,CAAM,YAAA;AAAA,IACb,SAAA,EAAW,QAAA;AAAA,IACX,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,KAAA,CAAM,UAAA,GAAa,GAAI,CAAA,CAAE,WAAA,EAAY;AAAA,IACtE,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACnC,GAAI,MAAM,aAAA,GAAgB,EAAE,cAAc,KAAA,CAAM,aAAA,KAAkB,EAAC;AAAA,IACnE,GAAI,MAAM,KAAA,GAAQ,EAAE,OAAO,KAAA,CAAM,KAAA,KAAU,EAAC;AAAA,IAC5C,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IAClD,GAAI,MAAM,aAAA,GAAgB,EAAE,cAAc,KAAA,CAAM,aAAA,KAAkB,EAAC;AAAA,IACnE,WAAA,EAAa;AAAA,GACf;AACA,EAAA,MAAM,SAAA,CAAU,MAAM,IAAI,CAAA;AAC1B,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb,CAAA,qCAAA,EAAmC,aAAA,CAAc,IAAI,CAAC;AAAA,WAAA,EACtC,iBAAiB,CAAA;AAAA,EAAA,EAC1B,YAAA,CAAa,IAAI,CAAC,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,UAAA,EAAa,IAAA,CAAK,OAAO,CAAA,CAAA,GAAK,EAAE;AAAA;AAAA,GAC7E;AACA,EAAA,OAAO,CAAA;AACT;AAIA,eAAe,cAAc,IAAA,EAA0C;AACrE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,CAAU;AAAA,IAC3B,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA;AAAU;AAC1B,GACD,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,MAAM,eAAA,EAAgB;AACnC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACzC,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA;AAAA,CAAiB,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA;AAAA;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,GACpB,OAAA,CAAQ,OAAO,CAAC,CAAC,CAAC,CAAA,KAAM,CAAA,KAAM,aAAA,CAAc,MAAA,CAAO,IAAK,CAAC,CAAA,GACzD,OAAA;AACJ,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,IAAA,CAAK,SAAA;AAAA,QACH;AAAA,UACE,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,CAAC,CAAA,MAAO;AAAA,YAClC,IAAA;AAAA,YACA,OAAA,EAAS,EAAE,OAAA,IAAW,IAAA;AAAA,YACtB,KAAA,EAAO,EAAE,KAAA,IAAS,IAAA;AAAA,YAClB,YAAY,CAAA,CAAE,UAAA;AAAA,YACd,WAAW,CAAA,CAAE,SAAA;AAAA,YACb,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,YACpB,WAAA,EAAa,EAAE,WAAA,IAAe;AAAA,WAChC,CAAE;AAAA,SACJ;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF,GAAI;AAAA,KACN;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,CAAC,CAAA,IAAK,QAAA,EAAU;AAChC,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,CAAC,CAAA,GAAI,gBAAA,GAAc,eAAA;AAC5C,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,IAAI;AAAA,kBAAA,EACK,CAAA,CAAE,WAAW,QAAQ;AAAA,kBAAA,EACrB,CAAA,CAAE,SAAS,QAAQ;AAAA,kBAAA,EACnB,CAAA,CAAE,eAAe,QAAQ;AAAA,SAAA,EAClC,YAAA,CAAa,CAAC,CAAC,CAAA,YAAA,EAAe,EAAE,UAAU,CAAA;AAAA;AAAA,KAC1D;AAAA,EACF;AACA,EAAA,OAAO,CAAA;AACT;AAIA,eAAe,cAAc,IAAA,EAA0C;AACrE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,CAAU;AAAA,IAC3B,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,MAAA,EAAQ,IAAA;AAAA,IACR,SAAS,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,UAAS;AAAE,GACrC,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,IAAS,MAAM,eAAA,EAAgB;AACnD,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA;AAAA;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAI,CAAA;AAChC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,mDAAmD,IAAI,CAAA;AAAA;AAAA,KACzD;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAOA,EAAA,IAAI,aAAA,GAA6C,SAAA;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,OAAO,IAAI,CAAA;AAC5B,IAAA,MAAM,YAAY,MAAM,SAAA;AAAA,MACtB,GAAG,QAAQ,CAAA,iCAAA;AAAA,KACb;AACA,IAAA,IAAI,UAAU,mBAAA,EAAqB;AACjC,MAAA,MAAM,MAAA,GAAiC;AAAA,QACrC,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,OAAO,IAAA,CAAK;AAAA,OACd;AACA,MAAA,IAAI,IAAA,CAAK,YAAA,EAAc,MAAA,CAAO,eAAe,IAAI,IAAA,CAAK,YAAA;AACtD,MAAA,MAAM,QAAA,CAAS,SAAA,CAAU,mBAAA,EAAqB,MAAM,CAAA;AACpD,MAAA,aAAA,GAAgB,IAAA;AAAA,IAClB;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,aAAA,GAAgB,QAAA;AAAA,EAClB;AAEA,EAAA,MAAM,WAAW,IAAI,CAAA;AACrB,EAAA,MAAM,OACJ,aAAA,KAAkB,IAAA,GACd,mBAAA,GACA,aAAA,KAAkB,WAChB,uDAAA,GACA,0DAAA;AACR,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,sCAAA,EAAoC,IAAI,GAAG,IAAI;AAAA,CAAI,CAAA;AACxE,EAAA,OAAO,CAAA;AACT;AAIA,eAAe,eAAA,GAA0C;AACvD,EAAA,MAAM,CAAA,GAAI,MAAM,eAAA,EAAgB;AAChC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA;AAChC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAG9B,EAAA,IAAI,IAAA,GAAoD,IAAA;AACxD,EAAA,KAAA,MAAW,CAAC,MAAM,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,EAAG;AAClD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AACzB,IAAA,IAAI,CAAC,QAAQ,CAAA,GAAI,IAAA,CAAK,YAAY,IAAA,GAAO,EAAE,IAAA,EAAM,UAAA,EAAY,CAAA,EAAE;AAAA,EACjE;AACA,EAAA,OAAO,IAAA,EAAM,IAAA,IAAQ,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAClC;AAQA,SAAS,OAAO,IAAA,EAAsB;AACpC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACvC,EAAA,IAAI,OAAA,CAAQ,WAAW,QAAQ,CAAA,SAAU,UAAA,GAAa,OAAA,CAAQ,MAAM,CAAC,CAAA;AACrE,EAAA,IAAI,OAAA,CAAQ,WAAW,OAAO,CAAA,SAAU,SAAA,GAAY,OAAA,CAAQ,MAAM,CAAC,CAAA;AACnE,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,UAAa,GAAA,EAAyB;AACnD,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,SAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB,EAAG,CAAA;AACxE,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,GAAG,CAAA,QAAA,EAAM,IAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,EAChE;AACA,EAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AACzB;AAEA,eAAe,QAAA,CACb,KACA,IAAA,EACY;AACZ,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,IAAI,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAC3B,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,mCAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,IAAA,EAAM,OAAO,QAAA;AAAS,GACvB,CAAA;AAGD,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,WAAW,GAAA,EAAK;AACjC,IAAA,MAAMQ,QAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,QAAQ,GAAG,CAAA,QAAA,EAAM,GAAA,CAAI,MAAM,IAAI,GAAA,CAAI,UAAU,CAAA,EAAGA,KAAAA,GAAO,OAAOA,KAAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,IAAI,EAAE,CAAA;AAAA,KACvF;AAAA,EACF;AACA,EAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AACzB;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACF,aAAY,UAAA,CAAWA,QAAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEA,SAAS,eAAe,EAAA,EAAoB;AAC1C,EAAA,IAAI,EAAA,GAAK,KAAQ,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAC,CAAA,CAAA,CAAA;AAChD,EAAA,IAAI,EAAA,GAAK,MAAW,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,GAAM,CAAC,CAAA,CAAA,CAAA;AACrD,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,IAAS,CAAC,CAAA,CAAA,CAAA;AACtC;AAEA,SAAS,YAAY,GAAA,EAA4B;AAE/C,EAAA,MAAM,IAAI,QAAA,EAAS;AACnB,EAAA,MAAM,MAAM,CAAA,KAAM,QAAA,GAAW,MAAA,GAAS,CAAA,KAAM,UAAU,KAAA,GAAQ,UAAA;AAC9D,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,GAAU,CAAC,MAAM,OAAA,EAAS,GAAG,CAAA,GAAI,CAAC,GAAG,CAAA;AACxD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,KAAY;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,EAAK,IAAA,EAAM,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,CAAA;AAClE,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,MAAMA,QAAAA,EAAS,CAAA;AACnC,MAAA,KAAA,CAAM,IAAA,CAAK,SAAS,MAAM;AACxB,QAAA,KAAA,CAAM,KAAA,EAAM;AACZ,QAAAA,QAAAA,EAAQ;AAAA,MACV,CAAC,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AACN,MAAAA,QAAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAC,CAAA;AACH;;;ACjdA,WAAA,EAAA;AAQA,IAAMN,MAAAA,GAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAiBd,eAAsB,UAAU,IAAA,EAA0C;AACxE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,IAAA,CAAK,SAAS,IAAI,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AACvE,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAMA,MAAK,CAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,EACjC;AACA,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,MAAA;AACH,MAAA,OAAO,QAAQ,IAAI,CAAA;AAAA,IACrB,KAAK,MAAA;AACH,MAAA,OAAO,OAAA,EAAQ;AAAA,IACjB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,IAAI,CAAA;AAAA,IACpB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,IAAI,CAAA;AAAA,IACpB,KAAK,OAAA;AACH,MAAA,OAAO,SAAS,IAAI,CAAA;AAAA,IACtB,KAAK,MAAA;AACH,MAAA,OAAO,OAAA,EAAQ;AAAA,IACjB;AACE,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,wCAAwC,GAAG,CAAA;;AAAA,EAASA,MAAK,CAAA;AAAA,OAC3D;AACA,MAAA,OAAO,CAAA;AAAA;AAEb;AAEA,eAAe,QAAQ,IAAA,EAA0C;AAC/D,EAAA,MAAM,EAAE,MAAA,EAAO,GAAIK,SAAAA,CAAU;AAAA,IAC3B,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,KAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,SAAS,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,WAAU;AAAE,GACtC,CAAA;AAED,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AACxD,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,OAAA,GAA2B;AACxC,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,gBAAA,EAAiB,GAAI,IAAI,CAAA;AAC9C,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,OAAO,IAAA,EAA0C;AAC9D,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,EAAK,GAAG,CAAA;AACjC,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAG,CAAA;AAAA,CAAa,CAAA;AAChE,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AACxD,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,OAAO,IAAA,EAA0C;AAC9D,EAAA,MAAM,CAAC,GAAA,EAAK,GAAG,UAAU,CAAA,GAAI,IAAA;AAC7B,EAAA,IAAI,CAAC,GAAA,IAAO,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AACnC,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KAGF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,WAAW,GAAG,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,EAAK,GAAA,EAAK,MAAM,CAAA;AAC1C,EAAA,MAAM,WAAW,IAAI,CAAA;AACrB,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb,0BAA0B,GAAG,CAAA,GAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC;AAAA,GAAA,EACjD,kBAAkB,CAAA;AAAA;AAAA,GAC5B;AACA,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,SAAS,IAAA,EAA0C;AAChE,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,EAAA,IAAI,YAAA,CAAa,GAAA,EAAK,GAAG,CAAA,KAAM,MAAA,EAAW;AACxC,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,0BAAA,EAA6B,GAAG,CAAA;AAAA,CAAa,CAAA;AAClE,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,EAAK,GAAA,EAAK,MAAS,CAAA;AAC7C,EAAA,MAAM,WAAW,IAAI,CAAA;AACrB,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,yBAAA,EAA4B,GAAG;AAAA,CAAI,CAAA;AACxD,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,OAAA,GAA2B;AAIxC,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,EAAA,MAAM,WAAW,GAAG,CAAA;AACpB,EAAA,MAAM,SAAS,OAAA,CAAQ,GAAA,CAAI,MAAA,IAAU,OAAA,CAAQ,IAAI,MAAA,IAAU,IAAA;AAC3D,EAAA,OAAO,IAAI,OAAA,CAAgB,CAAAC,QAAAA,KAAW;AACpC,IAAA,MAAM,QAAQC,KAAAA,CAAM,MAAA,EAAQ,CAAC,gBAAA,EAAkB,CAAA,EAAG;AAAA,MAChD,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,CAAA,GAAA,KAAO;AACvB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,yCAAA,EAA4C,MAAM,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO;AAAA;AAAA,OACpE;AACA,MAAAD,SAAQ,CAAC,CAAA;AAAA,IACX,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,GAAG,MAAA,EAAQ,CAAA,IAAA,KAAQA,QAAAA,CAAQ,IAAA,IAAQ,CAAC,CAAC,CAAA;AAAA,EAC7C,CAAC,CAAA;AACH;AAcA,SAAS,WAAW,GAAA,EAAsB;AACxC,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,IAAA;AAC/B,EAAA,IAAI,OAAA,KAAY,SAAS,OAAO,KAAA;AAChC,EAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,IAAA;AAE/B,EAAA,IAAI,aAAa,IAAA,CAAK,OAAO,KAAK,OAAA,KAAY,MAAA,IAAU,YAAY,OAAA,EAAS;AAC3E,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,SAAS,GAAG,CAAA,IAAK,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACrD,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,OAAA;AACT;AC5JA,IAAM,WAAA,GAAc,CAAC,IAAA,KACnB,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,CAAC,CAAA,EAAG,CAAA,KAAc,CAAA,CAAE,WAAA,EAAa,CAAA;AAEhE,eAAsB,eAAe,IAAA,EAAwC;AAC3E,EAAA,IAAI,CAAC,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,qCAAqC,IAAI,CAAA,yBAAA;AAAA,KAC3C;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,uBAAuB,IAAI,CAAA,CAAA;AAC/C,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAO,MAAM,OAAO,WAAA,CAAA;AAAA,EACtB,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,QAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC7D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oCAAA,EAAuC,IAAI,CAAA,UAAA,EAC/B,WAAW,gCAAgC,WAAW;AAAA,SAAA,EAAc,KAAK,CAAA;AAAA,KACvF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,YAAY,IAAI,CAAA;AAC9B,EAAA,MAAM,YACH,GAAA,CAAI,KAAK,CAAA,IACT,GAAA,CAAI,WACJ,GAAA,CAAI,MAAA;AAEP,EAAA,IAAI,CAAC,SAAA,IAAa,OAAO,cAAc,QAAA,IAAY,EAAE,UAAU,SAAA,CAAA,EAAY;AACzE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qBAAA,EAAwB,WAAW,CAAA,wDAAA,EACV,KAAK,CAAA,2BAAA;AAAA,KAChC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,OAAO,WAAA,EAAY;AAC/D;AAqBA,eAAsB,sBAAsB,IAAA,EAIjB;AACzB,EAAA,MAAM,KAAA,GAAQ,MAAM,+BAAA,CAAgC,IAAA,EAAM,UAAU,CAAA;AACpE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAqB,EAAC;AAQ5B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,UAAoB,EAAC;AACzB,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAMV,QAAA,CAAG,OAAA,CAAQ,IAAI,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA,EAAG;AACnC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AAC1C,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACpB,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,IAAI,CAAA;AAC1C,QAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,QAAA,MAAM,IAAA,GAAoB;AAAA,UACxB,IAAA;AAAA,UACA,MAAM,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,IAAA;AAAA,UACtD,SAAS,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,GAAA;AAAA,UAC/D,aACE,OAAO,MAAA,CAAO,WAAA,KAAgB,QAAA,GAAW,OAAO,WAAA,GAAc,EAAA;AAAA,UAChE,UACE,OAAO,MAAA,CAAO,QAAA,KAAa,QAAA,GAAW,OAAO,QAAA,GAAW,SAAA;AAAA,UAC1D,SAAA,EAAW,CAAC,CAAE,MAAA,CAAO,YAAA,EACjB,SAAA;AAAA,UACJ,WAAA,EAAa,QAAA,CAAS,WAAA,IAAe,CAAA,oBAAA,EAAuB,IAAI,CAAA;AAAA,SAClE;AACA,QAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,MACf,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAO3D,QAAA,IACE,2CAAA,CAA4C,KAAK,GAAG,CAAA,IACpD,IAAI,QAAA,CAAS,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA,EAC1C,CAEF,MAAO;AACL,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,CAAA,iEAAA,EAAoE,IAAI,CAAA,GAAA,EAAM,GAAG,CAAA;AAAA,WACnF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAYA,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AACxD;AAQA,eAAe,gCACb,KAAA,EACmB;AACnB,EAAA,MAAM,QAAkB,EAAC;AAIzB,EAAA,IAAI,GAAA,GAAM,KAAA,IAAS,OAAA,CAAQ,GAAA,EAAI;AAO/B,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAA0B;AAAA,IAC9Ca,OAAA,CAAY,GAAA,EAAK,cAAA,EAAgB,aAAa,CAAA;AAAA,IAC9CA,OAAA,CAAY,GAAA,EAAK,cAAA,EAAgB,OAAA,EAAS,gBAAgB,aAAa;AAAA,GACzE;AACA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,EAAA,EAAI,KAAA,EAAA,EAAS;AACvC,IAAA,KAAA,MAAW,SAAA,IAAa,YAAA,CAAa,GAAG,CAAA,EAAG;AACzC,MAAA,IAAI;AACF,QAAA,MAAMC,KAAAA,GAAO,MAAMd,QAAA,CAAG,IAAA,CAAK,SAAS,CAAA;AACpC,QAAA,IAAIc,KAAAA,CAAK,WAAA,EAAY,EAAG,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,MAC9C,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAASD,OAAA,CAAY,GAAA,EAAK,IAAI,CAAA;AACpC,IAAA,IAAI,WAAW,GAAA,EAAK;AACpB,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACA,EAAA,OAAO,KAAA;AACT;AC/HA,eAAsB,SAAS,IAAA,EAAwC;AACrE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,EAAC;AACpC,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,sCAAA,EAAyC,IAAA,CAAK,IAAI,CAAA;AAAA,CAAM,CAAA;AAC7E,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,UAAA,EAAY,KAAK,IAAI,CAAA;AACrD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAEzE,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,IAAI,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AACvC,IAAA,IAAI,WAAW,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAEtC,IAAA,MAAM,MAAM,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,MAAM,MAAM,CAAA,CAAA,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,GAAG,GAAG,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,CAAA;AAG3C,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,IAAA,EAAM;AACvB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,EAAG,IAAI,CAAA,2BAAA,EAAyB,IAAA,CAAK,WAAW,CAAA,EAAG,IAAA,CAAK,gBAAA,GAAmB,eAAA,GAAkB,EAAE,CAAA;AAAA;AAAA,OACjG;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,CAAK,KAAA,EAAO;AAC/B,MAAA,MAAM,EAAA,GAAK,MAAM,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA;AACzC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAAA,CAAkC,CAAA;AAC9D,QAAA,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,GAAI;AAAA,UACtB,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACpC,gBAAA,EAAkB;AAAA,SACpB;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAAA,CAA+B,CAAA;AAC3D,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,GAA4B,IAAA;AAChC,IAAA,IAAI;AACF,MAAA,QAAQ,KAAK,IAAA;AAAM,QACjB,KAAK,KAAA;AACH,UAAA,KAAA,GAAQ,MAAM,UAAA,CAAW,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AAC3C,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,KAAA,GAAQ,MAAM,aAAA,CAAc,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AAC9C,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,KAAA,GAAQ,MAAM,eAAA,CAAgB,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AAChD,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,YACb,GAAG,IAAI,CAAA;AAAA;AAAA,WAET;AACA,UAAA,OAAO,CAAA;AAAA;AACX,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,EAAG,IAAI,CAAA,gBAAA,EAAc,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA;AAAA,OACvE;AACA,MAAA,MAAM,UAAA,CAAW,YAAY,MAAM,CAAA;AACnC,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,GAAI,KAAA;AAGxB,MAAA,MAAM,UAAA,CAAW,YAAY,MAAM,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAA,CAAK,IAAI,CAAA;AAAA,CAAe,CAAA;AACvE,EAAA,OAAO,CAAA;AACT;AAOA,eAAsB,gBAAgB,IAAA,EAA0C;AAC9E,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAIJ,SAAAA,CAAU;AAAA,IACxC,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,GAAA,EAAI;AAAA,MACrC,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MAC7B,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA;AAAK;AACzC,GACD,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,IAAI,CAAA;AACzC,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,IAAA;AAAA,IACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,KAAA,EAAO,OAAO,KAAA,IAAS,KAAA;AAAA,IACvB,MAAA,EAAQ,MAAA,CAAO,SAAS,CAAA,IAAK,KAAA;AAAA,IAC7B,GAAI,OAAO,IAAA,GAAO,EAAE,MAAM,MAAA,CAAO,IAAA,KAAS;AAAC,GAC5C,CAAA;AACH;AAIA,eAAe,UAAA,CACb,IAAA,EACA,MAAA,EACA,IAAA,EACsB;AACtB,EAAA,IAAI,IAAA,CAAK,aAAa,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW;AAAA,CAAI,CAAA;AAC1E,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,GAAA,EAAM,KAAK,GAAG;AAAA,CAAI,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,CAAkB,IAAA,CAAK,GAAA,EAAK;AAAA,IACjD,SAAA,EAAW,KAAK,UAAA,IAAc,GAAA;AAAA,IAC9B,WAAA,EAAa,KAAK,WAAA,IAAe;AAAA,GAClC,CAAA;AACD,EAAA,IAAI,QAAA,CAAS,aAAa,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,WAAA,EAAc,QAAA,CAAS,QAAQ,CAAA,EAAG,QAAA,CAAS,MAAA,GAAS,IAAA,GAAO,QAAA,CAAS,QAAA,CAAS,MAAA,EAAQ,GAAG,CAAA,GAAI,EAAE,CAAA;AAAA,KAChG;AAAA,EACF;AAEA,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,IAAA,EAAK;AACnC,IAAA,WAAA,GAAc,MAAM,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,OAAO,MAAM,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACpC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB;AAAC,GACvC;AACF;AAEA,eAAe,aAAA,CACb,IAAA,EACA,MAAA,EACA,IAAA,EACsB;AACtB,EAAA,IAAI,IAAA,CAAK,aAAa,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW;AAAA,CAAI,CAAA;AAC1E,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,MAAA;AAE1B,EAAA,IAAI,KAAA;AACJ,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,KAAA,GAAQ,MAAM,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ;AAAA,QACtC,cAAc,IAAA,CAAK,OAAA;AAAA,QACnB,QAAQ,IAAA,KAAS;AAAA,OAClB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,KAAA,GAAS,MAAM,cAAc,IAAA,CAAK,MAAA,EAAQ,KAAK,OAAA,KAAY,MAAM,IAC7D,MAAA,GACA,OAAA;AACJ,MAAA;AAAA,IACF,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AACvD,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,MAC/D;AACA,MAAA,KAAA,GAAQ,MAAM,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,KAAK,OAAO,CAAA;AAC7D,MAAA;AAAA,IACF;AAAA;AAGF,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,WAAA,GAAc,MAAM,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,OAAO,MAAM,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACpC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB;AAAC,GACvC;AACF;AAEA,eAAe,eAAA,CACb,IAAA,EACA,MAAA,EACA,IAAA,EACsB;AACtB,EAAA,IAAI,IAAA,CAAK,aAAa,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW;AAAA,CAAI,CAAA;AAC1E,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,SAAA,EAAY,KAAK,GAAG;AAAA,CAAI,CAAA;AACpD,EAAA,MAAM,MAAA,GACJM,UAAS,KAAM,QAAA,GACX,SACAA,QAAAA,EAAS,KAAM,UACb,KAAA,GACA,UAAA;AACR,EAAA,MAAM,IAAA,GAAOA,QAAAA,EAAS,KAAM,OAAA,GAAU,CAAC,IAAA,EAAM,OAAA,EAAS,IAAA,CAAK,GAAG,CAAA,GAAI,CAAC,IAAA,CAAK,GAAG,CAAA;AAC3E,EAAA,MAAM,IAAI,OAAA,CAAc,CAACL,QAAAA,KAAY;AACnC,IAAA,MAAM,KAAA,GAAQC,MAAM,MAAA,EAAQ,IAAA,EAAM,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,CAAA;AACrE,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,MAAMD,QAAAA,EAAS,CAAA;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,MAAMA,QAAAA,EAAS,CAAA;AAAA,EACrC,CAAC,CAAA;AAOD,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,IAAA,CAAK,UAAU,KAAA,EAAO;AACxB,IAAA,KAAA,GAAQ,MAAM,YAAA;AAAA,MACZ,CAAA,oBAAA,EAAuB,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,mBAAA,CAAA;AAAA,MAC1C,EAAE,QAAQ,KAAA;AAAM,KAClB;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAAA,CAAsC,CAAA;AAClE,IAAA,MAAM,YAAA,CAAa,2BAAA,EAA6B,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,IAAA,CAAK,WAAW,KAAA,EAAO;AACzB,IAAA,WAAA,GAAc,MAAM,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,OAAO,MAAM,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACpC,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB;AAAC,GACvC;AACF;AAIA,eAAe,YAAY,IAAA,EAA6C;AACtE,EAAA,MAAM,YAAA,GAAe,KAAK,SAAA,IAAa,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,CAAkB,IAAA,CAAK,GAAA,EAAK;AAAA,IACjD,SAAA,EAAW,KAAK,UAAA,IAAc,GAAA;AAAA,IAC9B,WAAA,EAAa;AAAA,GACd,CAAA;AACD,EAAA,OAAO,SAAS,QAAA,KAAa,YAAA;AAC/B;AAIA,eAAe,YAAA,CACb,OAAA,EACA,KAAA,EACA,MAAA,EACiB;AACjB,EAAA,IAAI,KAAA,IAAS,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAK;AACnC,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,YAAY,EAAC;AAC3C,IAAA,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAChC,IAAA,OAAO,CAAA,IAAA,EAAO,QAAQ,GAAG,CAAA,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,aAAA,IAAiB,OAAA,IAAW,OAAA,CAAQ,WAAA,EAAa;AAKnD,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,+EAAA,EAAkF,QAAQ,WAAW,CAAA;AAAA;AAAA,KAEvG;AACA,IAAA,OAAO,CAAA,OAAA,EAAU,QAAQ,WAAW,CAAA,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,KAAA,IAAS,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAK;AACnC,IAAA,MAAM,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,cAAA,EAAgB,WAAA,CAAY,KAAK,CAAC,CAAA;AAClE,IAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,CAAkB,GAAA,EAAK;AAAA,MAC5C,SAAA,EAAW,GAAA;AAAA,MACX,WAAA,EAAa;AAAA,KACd,CAAA;AACD,IAAA,IAAI,QAAA,CAAS,aAAa,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAA,CAAS,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,MAAM,mEAAmE,CAAA;AACrF;AAIA,eAAe,YAAA,CACb,UACA,IAAA,EACiB;AAIjB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,KAAA,IAAS,KAAA;AACrC,EAAA,MAAM,SAAS,IAAA,CAAK,YAAA,GAAe,CAAA,EAAA,EAAK,IAAA,CAAK,YAAY,CAAA,CAAA,CAAA,GAAM,EAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,CAAA,EAAG,QAAQ,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AACnC,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,CAAC,KAAA,EAAO;AACzB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA;AAAA;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,KAAK,eAAA,CAAgB,SAAEM,eAAOC,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA;AAC7D,EAAA,IAAI,IAAA,CAAK,UAAU,KAAA,EAAO;AAExB,IAAA,OAAA,CAAQ,KAAA,CAAM,aAAa,IAAI,CAAA;AAC/B,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,MAAM,CAAA;AAC3B,IAAA,OAAO,IAAI,OAAA,CAAgB,CAACP,QAAAA,KAAY;AACtC,MAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAkB;AAChC,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,IAAI,IAAA,KAAS,EAAA,IAAiB,IAAA,KAAS,EAAA,EAAe;AACpD,YAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAChC,YAAA,OAAA,CAAQ,KAAA,CAAM,aAAa,KAAK,CAAA;AAChC,YAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AACzB,YAAA,EAAA,CAAG,KAAA,EAAM;AACT,YAAAA,QAAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,YAAA,IAAgB,EAAE,CAAA;AACtC,YAAA;AAAA,UACF;AACA,UAAA,IAAI,SAAS,CAAA,EAAmB;AAC9B,YAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAChC,YAAA,OAAA,CAAQ,KAAA,CAAM,aAAa,KAAK,CAAA;AAChC,YAAA,EAAA,CAAG,KAAA,EAAM;AACT,YAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,UAClB;AACA,UAAA,IAAI,IAAA,KAAS,GAAA,IAA8B,IAAA,KAAS,CAAA,EAAM;AACxD,YAAA,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACrB,YAAA;AAAA,UACF;AACA,UAAA,GAAA,IAAO,MAAA,CAAO,aAAa,IAAI,CAAA;AAC/B,UAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,QAAG,CAAA;AAAA,QAC1B;AAAA,MACF,CAAA;AACA,MAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH;AACA,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,MAAM,EAAA,CAAG,QAAA,CAAS,MAAM,GAAG,IAAA,EAAK;AAC7C,IAAA,OAAO,GAAA,IAAO,KAAK,YAAA,IAAgB,EAAA;AAAA,EACrC,CAAA,SAAE;AACA,IAAA,EAAA,CAAG,KAAA,EAAM;AAAA,EACX;AACF;AAEA,eAAe,aAAA,CACb,UACA,UAAA,EACkB;AAClB,EAAA,MAAM,GAAA,GAAM,aAAa,KAAA,GAAQ,KAAA;AACjC,EAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA,EAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AACxE,EAAA,IAAI,CAAC,KAAK,OAAO,UAAA;AACjB,EAAA,OAAO,WAAA,CAAY,KAAK,GAAG,CAAA;AAC7B;AAEA,eAAe,YAAA,CACb,QAAA,EACA,OAAA,EACA,YAAA,EACiB;AACjB,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,QAAQ;AAAA,CAAI,CAAA;AACpC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,OAAA,CAAQ,SAAQ,EAAG;AACtC,IAAA,MAAM,IAAA,GACJ,gBAAgB,CAAA,CAAE,KAAA,KAAU,eAAe,GAAA,GAAM,CAAA,KAAM,IAAI,GAAA,GAAM,GAAA;AACnE,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,KAAK,IAAI,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,KAAK,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAK,GAAG,CAAA,CAAE,KAAA,GAAQ,KAAK,CAAA,CAAE,KAAK,MAAM,EAAE;AAAA;AAAA,KAC5E;AAAA,EACF;AACA,EAAA,MAAM,MAAM,MAAM,YAAA;AAAA,IAChB,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAAA,IAC1B,eAAe,EAAE,YAAA,EAAa,GAAI,EAAE,QAAQ,KAAA;AAAM,GACpD;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA;AACrC,EAAA,IAAI,MAAA,CAAO,SAAS,KAAK,CAAA,IAAK,SAAS,CAAA,IAAK,KAAA,IAAS,QAAQ,MAAA,EAAQ;AACnE,IAAA,OAAO,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAA,CAAG,KAAA;AAAA,EAC7B;AACA,EAAA,MAAM,QAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,GAAG,CAAA;AACjD,EAAA,IAAI,KAAA,SAAc,KAAA,CAAM,KAAA;AACxB,EAAA,IAAI,YAAA,IAAgB,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,YAAY,CAAA,EAAG;AACjE,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,mBAAA,EAAsB,GAAG,CAAA,mBAAA,EAAsB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,GACvF;AACF;AAEA,eAAe,qBACb,OAAA,EAC8C;AAC9C,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,OAAO,EAAE,KAAA,EAAO,GAAE,CAAE,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,CAAkB,OAAA,CAAQ,GAAA,EAAK;AAAA,IACpD,SAAA,EAAW,QAAQ,UAAA,IAAc,GAAA;AAAA,IACjC,WAAA,EAAa;AAAA,GACd,CAAA;AACD,EAAA,IAAI,QAAA,CAAS,aAAa,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,0BAAA,EAA6B,SAAS,QAAQ,CAAA,EAAA,EAAK,SAAS,QAAA,CAAS,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACA,EAAA,OAAO,SAAS,MAAA,CACb,KAAA,CAAM,IAAI,CAAA,CACV,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,GAAI,CAAA;AACtC,IAAA,MAAM,GAAA,GAAyC,EAAE,KAAA,EAAc;AAC/D,IAAA,IAAI,KAAA,MAAW,KAAA,GAAQ,KAAA;AACvB,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACL;AAIA,eAAe,iBAAA,CACb,KACA,IAAA,EAC+D;AAC/D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,KAAY;AAC9B,IAAA,MAAM,QAAQC,KAAAA,CAAM,MAAA,EAAQ,CAAC,KAAA,EAAO,GAAG,CAAA,EAAG;AAAA,MACxC,OAAO,IAAA,CAAK,WAAA,GACR,YACA,CAAC,QAAA,EAAU,QAAQ,MAAM;AAAA,KAC9B,CAAA;AACD,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAc;AACtC,MAAA,MAAA,IAAU,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAc;AACtC,MAAA,MAAA,IAAU,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,MAAA,UAAA,CAAW,MAAM,KAAA,CAAM,IAAA,CAAK,SAAS,GAAG,GAAI,CAAA;AAAA,IAC9C,CAAA,EAAG,KAAK,SAAS,CAAA;AACjB,IAAA,KAAA,CAAM,IAAA,CAAK,SAAS,MAAM;AACxB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAAD,QAAAA,CAAQ,EAAE,QAAA,EAAU,GAAA,EAAK,QAAQ,MAAA,EAAQ,MAAA,IAAU,eAAe,CAAA;AAAA,IACpE,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,CAAC,IAAA,KAAS;AAC3B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAAA,SAAQ,EAAE,QAAA,EAAU,QAAQ,CAAA,EAAG,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACjD,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEA,SAAS,YAAY,CAAA,EAAmB;AAGtC,EAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AACrC;AAEA,SAAS,QAAA,CAAS,GAAW,GAAA,EAAqB;AAChD,EAAA,OAAO,CAAA,CAAE,UAAU,GAAA,GAAM,CAAA,GAAI,EAAE,KAAA,CAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA,GAAI,QAAA;AACrD;AAIA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,MAAM,IAAA,GACJ,QAAQ,GAAA,CAAI,iBAAiB,KAAKR,IAAAA,CAAKC,OAAAA,IAAW,aAAa,CAAA;AACjE,EAAA,OAAOD,IAAAA,CAAK,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,IAAI,CAAA,KAAA,CAAO,CAAA;AAC3C;AAEA,eAAe,UAAA,CAAW,MAAc,IAAA,EAA+B;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMgB,QAAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,OAAO,IAAA,KAAS,IAAA,IAAQ,OAAO,MAAA,CAAO,KAAA,KAAU,UAAU,OAAO,MAAA;AAAA,EACvE,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,OAAO;AAAC,GACV;AACF;AAEA,eAAe,UAAA,CAAW,MAAc,MAAA,EAA+B;AACrE,EAAA,MAAA,CAAO,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,EAAA,MAAMC,MAAMlB,OAAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,EAAA,MAAMmB,UAAU,IAAA,EAAM,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AACrD,EAAA,MAAMC,KAAAA,CAAM,IAAA,EAAM,GAAK,CAAA,CAAE,MAAM,MAAM;AAAA,EAGrC,CAAC,CAAA;AACH;;;AC9iBA,eAAsB,WAAW,IAAA,EAA0C;AACzE,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAIZ,SAAAA,CAAU;AAAA,IACxC,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,GAAA,EAAI;AAAA,MACrC,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MAC7B,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA;AAAU;AAClC,GACD,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,IAAI,CAAA;AACzC,EAAA,MAAM,YAAA,GAAwC,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAC;AACzE,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,gCAAgC,IAAI,CAAA;AAAA;AAAA,KACtC;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,OAAA,CAAQ,OAAO,aAAa,CAAA;AAClE,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,aAAA,EAAgB,IAAI,CAAA,qBAAA,EAAwB,OAAA,CAAQ,OAAO,CAAA;AAAA;AAAA,OAC7D;AACA,MAAA,gBAAA,GAAmB,IAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,IAAI,WAAA,GAAoE,IAAA;AACxE,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,IAAI,CAAA,IAAK,YAAA,CAAa,SAAQ,EAAG;AAM9C,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb,CAAA,oBAAA,EAAuB,IAAI,CAAC,CAAA,CAAA,EAAI,aAAa,MAAM,CAAA,EAAA,EAAK,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA;AAAA,SAC5E;AACA,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,oBAAA,EAAuB,IAAI,CAAC,CAAA,CAAA,EAAI,aAAa,MAAM,CAAA,EAAA,EAAK,YAAA,CAAa,IAAI,CAAC;AAAA;AAAA,OAC5E;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAI,CAAA;AAC/B,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA;AAAA,MACF;AACA,MAAA,WAAA,GAAc,EAAE,MAAM,IAAA,EAAK;AAC3B,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,4BAAA,EAA+B,IAAA,CAAK,MAAM,CAAA,WAAA,EAAc,IAAI,CAAA;AAAA;AAAA,OAC9D;AAAA,IACF;AACA,IAAA,IAAI,CAAC,aAAa,WAAA,EAAa;AAC7B,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,wBAAA,EAA2B,aAAa,MAAM,CAAA,uCAAA,EAA0C,YAAY,IAAA,CAAK,MAAM,CAAA,aAAA,EAAW,WAAA,CAAY,IAAI,CAAA;AAAA;AAAA,OAC5I;AACA,MAAA,OAAO,WAAA,CAAY,IAAA;AAAA,IACrB;AACA,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,WAAA,EAAa;AAE9B,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,2DAA2D,IAAI,CAAA;AAAA;AAAA,OACjE;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,aAAA,EAAgB,IAAI,CAAA;AAAA,CAAgB,CAAA;AAAA,EAC3D;AAMA,EAAA,IAAI,CAAC,OAAO,YAAY,CAAA,IAAA,CAAM,QAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,IAAU,CAAA,IAAK,CAAA,EAAG;AACpE,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,CAAA;AAAA,CAAM,CAAA;AACjE,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS;AAAA,MAC/B,IAAA;AAAA,MACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,KAAA,EAAO,OAAO,KAAA,IAAS,KAAA;AAAA,MACvB,MAAA,EAAQ,MAAA,CAAO,SAAS,CAAA,IAAK;AAAA,KAC9B,CAAA;AACD,IAAA,IAAI,SAAA,KAAc,GAAG,OAAO,SAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,aAAa,IAAA,EAAqC;AACzD,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,KAAA;AACH,MAAA,OAAO,CAAA,YAAA,EAAe,KAAK,MAAA,GAAS,KAAA,GAAQ,EAAE,CAAA,EAAG,IAAA,CAAK,WAAW,KAAK,CAAA,CAAA;AAAA,IACxE,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAA,IAAW,KAAK,CAAA,CAAA;AAAA,IAC9C,KAAK,KAAA;AACH,MAAA,OAAO,CAAA,YAAA,EAAe,KAAK,IAAA,GAAO,SAAA,GAAY,EAAE,CAAA,EAAG,IAAA,CAAK,WAAW,KAAK,CAAA,CAAA;AAAA,IAC1E,KAAK,OAAA;AACH,MAAA,OAAO,CAAA,cAAA,EAAiB,IAAA,CAAK,OAAA,IAAW,KAAK,CAAA,CAAA;AAAA,IAC/C,KAAK,IAAA;AACH,MAAA,OAAO,CAAA,WAAA,EAAc,IAAA,CAAK,OAAA,IAAW,KAAK,CAAA,CAAA;AAAA,IAC5C,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,IAAO,KAAK,CAAA,OAAA,CAAA;AAAA,IAClC,KAAK,UAAA;AACH,MAAA,OAAO,YAAY,IAAA,CAAK,GAAA,IAAO,KAAK,CAAA,QAAA,EAAM,IAAA,CAAK,eAAe,KAAK,CAAA,CAAA;AAAA,IACrE;AACE,MAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,IAAA,IAAQ,KAAK,CAAA,CAAA;AAAA;AAE7E;AAEA,eAAe,QAAQ,IAAA,EAA8C;AACnE,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,KAAA,EAAO;AACV,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,iDAAiD,CAAA;AACtE,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAA,GAAO,CAAC,SAAS,CAAA;AACvB,MAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,OAAO,CAAA;AACtB,MAAA,OAAO,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,IACjC;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,kDAAkD,CAAA;AACvE,QAAA,OAAO,CAAA;AAAA,MACT;AAIA,MAAA,OAAO,aAAa,MAAA,EAAQ,CAAC,SAAA,EAAW,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACvD;AAAA,IACA,KAAK,KAAA,EAAO;AACV,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,iDAAiD,CAAA;AACtE,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAA,GAAO,CAAC,SAAS,CAAA;AACvB,MAAA,IAAI,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AACjC,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,OAAO,CAAA;AAGtB,MAAA,OAAO,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,IACjC;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb;AAAA,SACF;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,OAAO,aAAa,OAAA,EAAS,CAAC,SAAA,EAAW,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACxD;AAAA,IACA,KAAK,IAAA,EAAM;AACT,MAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,gDAAgD,CAAA;AACrE,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,OAAO,aAAa,IAAA,EAAM,CAAC,SAAA,EAAW,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IACrD;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,8CAA8C,CAAA;AACnE,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,aAAa,CAAA;AAAA,IACtD;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,IAAO,CAAC,KAAK,WAAA,EAAa;AAClC,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb;AAAA,SACF;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,OAAO,oBAAA,CAAqB;AAAA,QAC1B,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,cAAc,IAAA,CAAK;AAAA,OACpB,CAAA;AAAA,IACH;AAAA,IACA;AACE,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,4BAAA,EAA+B,KAAK,MAAM,CAAA;AAAA;AAAA,OAE5C;AACA,MAAA,OAAO,CAAA;AAAA;AAEb;AAUA,eAAe,gBAAA,CACb,KACA,YAAA,EACiB;AACjB,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,4BAA4B,GAAG,CAAA;AAAA;AAAA,KACjC;AAAA,EACF;AACA,EAAA,MAAM,MAAM,MAAM,OAAA,CAAQP,KAAK,MAAA,EAAO,EAAG,kBAAkB,CAAC,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAaA,IAAAA,CAAK,GAAA,EAAK,YAAY,CAAA;AACzC,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAM,KAAA,CAAM,KAAK,EAAE,QAAA,EAAU,UAAU,CAAA;AACnD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,uCAAA,EAA0C,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,IAAI,UAAU;AAAA;AAAA,OACxE;AACA,MAAA,OAAO,GAAA,CAAI,MAAA;AAAA,IACb;AACA,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,GAAA,CAAI,aAAa,CAAA;AAC/C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,GAAA,GAAM,WAAW,QAAQ,CAAA,CAAE,OAAO,GAAG,CAAA,CAAE,OAAO,KAAK,CAAA;AACzD,MAAA,IAAI,GAAA,KAAQ,YAAA,CAAa,WAAA,EAAY,EAAG;AACtC,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb,4CAA4C,GAAG;AAAA,YAAA,EAAiB,YAAY;AAAA,YAAA,EAAiB,GAAG;AAAA;AAAA,SAClG;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,sCAAA,EAAyC,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA;AAAA,OAC3D;AAAA,IACF;AACA,IAAA,MAAMkB,SAAAA,CAAU,YAAY,GAAG,CAAA;AAC/B,IAAA,MAAMC,KAAAA,CAAM,YAAY,GAAK,CAAA;AAC7B,IAAA,OAAO,YAAA,CAAa,MAAA,EAAQ,CAAC,UAAU,CAAC,CAAA;AAAA,EAC1C,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,4CAA4C,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA;AAAA,KAC9F;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,MAAM,EAAA,CAAG,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,OAAO,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAChE;AACF;AAUA,eAAe,qBAAqB,IAAA,EAIhB;AAClB,EAAA,MAAM,MAAM,MAAM,OAAA,CAAQnB,KAAK,MAAA,EAAO,EAAG,gBAAgB,CAAC,CAAA;AAC1D,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,aAAA;AAC9C,IAAA,MAAM,WAAA,GAAcA,IAAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA,CAAK,KAAK,EAAE,QAAA,EAAU,UAAU,CAAA;AACxD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,2CAAA,EAA8C,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,IAAI,UAAU;AAAA;AAAA,OAC5E;AACA,MAAA,OAAO,GAAA,CAAI,MAAA;AAAA,IACb;AACA,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,GAAA,CAAI,aAAa,CAAA;AAC/C,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,GAAA,GAAM,WAAW,QAAQ,CAAA,CAAE,OAAO,GAAG,CAAA,CAAE,OAAO,KAAK,CAAA;AACzD,MAAA,IAAI,GAAA,KAAQ,IAAA,CAAK,YAAA,CAAa,WAAA,EAAY,EAAG;AAC3C,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb,CAAA;AAAA,YAAA,EAAqD,KAAK,YAAY;AAAA,YAAA,EAAiB,GAAG;AAAA;AAAA,SAC5F;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,MAAMkB,SAAAA,CAAU,aAAa,GAAG,CAAA;AAEhC,IAAA,MAAM,UAAA,GAAalB,IAAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AACtC,IAAA,MAAMiB,KAAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAC3C,IAAA,IAAI,WAAA;AACJ,IAAA,IACE,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,IAC3B,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,IACxB,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EACxB;AACA,MAAA,WAAA,GAAc,MAAM,aAAa,KAAA,EAAO;AAAA,QACtC,KAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AACpC,MAAA,WAAA,GAAc,MAAM,aAAa,OAAA,EAAS;AAAA,QACxC,IAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,sDAAsD,QAAQ,CAAA;AAAA;AAAA,OAEhE;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,WAAA,KAAgB,GAAG,OAAO,WAAA;AAE9B,IAAA,MAAM,MAAA,GAASjB,IAAAA,CAAK,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAC/C,IAAA,MAAM,MAAA,GACJ,QAAQ,GAAA,CAAI,oBAAoB,KAAKA,IAAAA,CAAKC,QAAAA,EAAQ,EAAG,QAAA,EAAU,KAAK,CAAA;AACtE,IAAA,MAAMgB,KAAAA,CAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,IAAA,MAAM,OAAA,GAAUjB,KAAK,MAAA,EAAQ,IAAA,CAAK,WAAW,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAM,CAAA;AAE9D,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,IAAA,EAAM,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAC,CAAA;AAC/D,IAAA,IAAI,MAAA,KAAW,GAAG,OAAO,MAAA;AACzB,IAAA,MAAMmB,KAAAA,CAAM,SAAS,GAAK,CAAA;AAC1B,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,oBAAA,EAAuB,OAAO;AAAA,CAAI,CAAA;AACvD,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1C,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,+BAA0B,MAAM,CAAA;AAAA;AAAA,OAClC;AAAA,IACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,wCAAwC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA;AAAA,KAC1F;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,MAAM,EAAA,CAAG,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,OAAO,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAChE;AACF;AAEA,SAASlB,QAAAA,GAAkB;AACzB,EAAA,OAAO,QAAQ,GAAA,CAAI,MAAM,KAAK,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,IAAK,GAAA;AAC9D;AAEA,SAAS,YAAA,CAAa,KAAa,IAAA,EAAiC;AAClE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACO,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,QAAQC,KAAAA,CAAM,GAAA,EAAK,MAAM,EAAE,KAAA,EAAO,WAAW,CAAA;AACnD,IAAA,KAAA,CAAM,IAAA,CAAK,SAAS,MAAM,CAAA;AAC1B,IAAA,KAAA,CAAM,KAAK,MAAA,EAAQ,CAAC,SAASD,QAAAA,CAAQ,IAAA,IAAQ,CAAC,CAAC,CAAA;AAAA,EACjD,CAAC,CAAA;AACH;AAEA,eAAe,gBACb,KAAA,EAG2C;AAC3C,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,2BAAA,EAA4B;AACrE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,KAAY;AAC9B,IAAA,MAAM,QAAQC,KAAAA,CAAM,MAAA,EAAQ,CAAC,KAAA,EAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AAAA,MAC9C,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,QAAQ;AAAA,KACnC,CAAA;AACD,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAc;AACrC,MAAA,GAAA,IAAO,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,IAC1B,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,MAAMD,QAAAA,CAAQ,EAAE,IAAI,KAAA,EAAO,OAAA,EAAS,cAAA,EAAgB,CAAC,CAAA;AACzE,IAAA,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,CAAC,IAAA,KAAS;AAC3B,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAAA,QAAAA,CAAQ,EAAE,EAAA,EAAI,KAAA,EAAO,SAAS,CAAA,aAAA,EAAgB,IAAI,IAAI,CAAA;AACtD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AACjC,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACtB,MAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG;AACf,QAAAA,SAAQ,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,2BAA2B,CAAA;AACzD,QAAA;AAAA,MACF;AAIA,MAAAA,QAAAA,CAAQ,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,WAAW,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA;AAAA,IAClD,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;;;ACzaA,eAAsB,gBAAA,GAA2C;AAC/D,EAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,OAAO,IAAA;AAChC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,WAAA,MAAiB,KAAA,IAAS,QAAQ,KAAA,EAAO;AACvC,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,MAAME,KAAAA,GAAO,OAAO,MAAA,CAAO,MAAM,EAAE,QAAA,CAAS,MAAM,EAAE,IAAA,EAAK;AACzD,EAAA,OAAOA,KAAAA,CAAK,MAAA,GAAS,CAAA,GAAIA,KAAAA,GAAO,IAAA;AAClC;;;ACOA,eAAsB,OAAO,IAAA,EAA0C;AACrE,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAIH,SAAAA,CAAU;AAAA,IACxC,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACtB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,GAAA,EAAI;AAAA,MACrC,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACzB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA;AAAU;AAC1B,GACD,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,OAAO,GAAA,GAAMI,OAAAA,CAAY,OAAO,GAAG,CAAA,GAAI,QAAQ,GAAA,EAAI;AAC/D,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,IAAW,MAAM,gBAAA,EAAiB;AAC3D,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,IAAI,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,OAAA,CAAQ,MAAM,CAAA;AAEpD,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAwB;AACxC,IAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,qBAAA,EAA0B,GAAG,CAAA;AAAA,CAAiB,CAAA;AACnE,IAAA,UAAA,CAAW,KAAA,EAAM;AAAA,EACnB,CAAA;AACA,EAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,QAAQ,CAAA;AAC/B,EAAA,OAAA,CAAQ,IAAA,CAAK,WAAW,QAAQ,CAAA;AAEhC,EAAA,IAAI,OAAA,GAAyC,IAAA;AAC7C,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAM,QAAQ,KAAA,CAAM;AAAA,MAC5B,GAAA;AAAA,MACA,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,iBAAiB,MAAA,CAAO;AAAA,KACzB,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,GAAO,SAAA,GAAY,WAAA;AAC1C,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,WAAA,MAAiB,EAAA,IAAM,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AAC9C,MAAA,OAAA,CAAQ,EAAE,CAAA;AACV,MAAA,IAAI,GAAG,IAAA,KAAS,UAAA,IAAc,EAAA,CAAG,MAAA,KAAW,aAAa,IAAA,GAAO,CAAA;AAChE,MAAA,IAAI,EAAA,CAAG,IAAA,KAAS,OAAA,EAAS,IAAA,GAAO,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,QAAQ,CAAA;AAC9B,IAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,QAAQ,CAAA;AAC/B,IAAA,IAAI,SAAS,MAAM,OAAA,CAAQ,KAAA,EAAM,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACnD;AACF;AAEA,SAAS,UAAU,EAAA,EAAuB;AACxC,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC;AAAA,CAAI,CAAA;AAChD;AAEA,SAAS,YAAY,EAAA,EAAuB;AAC1C,EAAA,QAAQ,GAAG,IAAA;AAAM,IACf,KAAK,YAAA;AACH,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,EAAA,CAAG,IAAI,CAAA;AAC5B,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,iBAAA,EAAoB,EAAA,CAAG,IAAI,CAAA;AAAA,CAAW,CAAA;AAC3D,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,eAAA,EAAkB,EAAA,CAAG,QAAQ,CAAA;AAAA,CAAW,CAAA;AAC7D,MAAA;AAAA,IACF,KAAK,aAAA;AACH,MAAA,IAAI,EAAA,CAAG,OAAA;AACL,QAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA;AAAA,CAA+B,CAAA;AACtD,MAAA;AAAA,IACF,KAAK,cAAA;AACH,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA;AAAA,CAA8C,CAAA;AACnE,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM;AAAA,kBAAA,EAAuB,GAAG,MAAM,CAAA;AAAA,CAAY,CAAA;AACjE,MAAA;AAAA,IACF,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAA,GACJ,OAAO,EAAA,CAAG,KAAA,CAAM,IAAA,KAAS,WAAW,CAAA,OAAA,EAAU,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA,CAAA,CAAA,GAAM,EAAA;AACnE,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA,EAAI,EAAA,CAAG,MAAM,OAAO,CAAA;AAAA;AAAA,OAC5C;AAKA,MAAA,MAAM,IAAA,GAAO,GAAG,KAAA,CAAM,IAAA;AACtB,MAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,QAAA,MAAM,SAAU,IAAA,CAA8B,MAAA;AAC9C,QAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,MAAK,EAAG;AAC/C,UAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA;AAAA,EAA8B,MAAM,CAAA;AAAA,CAAW,CAAA;AAAA,QACtE;AAGA,QAAA,MAAM,IAAA,GAAO,EAAE,GAAI,IAAA,EAAiC;AACpD,QAAA,OAAO,IAAA,CAAK,MAAA;AACZ,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChC,UAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,YACb,CAAA;AAAA,EAA4B,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA;AAAA,WAC3D;AAAA,QACF;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAAA;AAEJ;;;ACvGA,eAAsB,kBAAA,GAAiD;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,OAAO,UAAU,CAAA;AAG1C,IAAA,MAAM,OAAA,GAAW,WAAmB,OAAA,IAAW,UAAA;AAC/C,IAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,KAAU,UAAA,EAAY,OAAO,IAAA;AAChD,IAAA,OAAO,CAAC,IAAA,KAAS;AACf,MAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,KAAK,IAAA,EAAM;AAAA,QACjD,IAAA,EAAM,gBAAA;AAAA,QACN,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,GAAA,EAAK;AAAA,UACH,GAAI,OAAA,CAAQ,GAAA;AAAA,UACZ,GAAI,IAAA,CAAK,GAAA,IAAO;AAAC;AACnB,OACD,CAAA;AACD,MAAA,MAAM,IAAA,GAAmB;AAAA,QACvB,IAAI,GAAA,GAAM;AACR,UAAA,OAAO,GAAA,CAAI,GAAA;AAAA,QACb,CAAA;AAAA,QACA,MAAM,IAAA,EAAc;AAClB,UAAA,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,QAChB,CAAA;AAAA,QACA,MAAA,CAAO,MAAc,IAAA,EAAc;AACjC,UAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,QACvB,CAAA;AAAA,QACA,KAAK,MAAA,EAAiB;AACpB,UAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,QACjB,CAAA;AAAA,QACA,OAAO,OAAA,EAAiC;AACtC,UAAA,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,QACpB,CAAA;AAAA,QACA,OAAO,OAAA,EAAiE;AACtE,UAAA,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,QACpB;AAAA,OACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC/BA,WAAA,EAAA;ACtBO,IAAM,yBAAA,GAA4B,CAAA;AA8BlC,IAAM,kBAAA,GAAqB,MAChC,OAAA,CAAQV,OAAAA,IAAW,aAAa,CAAA;AAC3B,IAAM,mBAAA,GAAsB,MACjC,OAAA,CAAQ,kBAAA,IAAsB,iBAAiB,CAAA;AAK1C,SAAS,aAAaa,MAAAA,EAAuB;AAClD,EAAA,MAAM,OAAA,GAAUA,MAAAA,CAAM,IAAA,EAAA,CAAO,WAAA,EAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,OAAA,CACb,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAA,CAC5B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAGd,EAAA,OAAO,OAAA,IAAW,WAAA;AACpB;AAKA,eAAsB,oBAAA,CACpB,IAAA,GAAe,mBAAA,EAAA,EACY;AAC3B,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAMhB,QAAAA,CAAG,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AACtC,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,IAAK,GAAA,CAA8B,SAAS,QAAA,EAAU;AACpD,MAAA,OAAO,EAAE,OAAA,EAAS,yBAAA,EAA2B,UAAA,EAAY,EAAA,EAAC;AAC5D,IAAA;AACA,IAAA,MAAM,GAAA;AACR,EAAA;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACzB,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA;MACR,CAAA,YAAA,EAAe,IAAI,uBACjB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA,sCAAA;AAAA,KAAA;AAEJ,EAAA;AACA,EAAA,OAAO,gBAAgB,MAAM,CAAA;AAC/B;AAMA,eAAsB,oBAAA,CACpB,MAAA,EACA,IAAA,GAAe,mBAAA,EAAA,EACA;AACf,EAAA,MAAM,UAAA,GAAa,gBAAgB,MAAM,CAAA;AACzC,EAAA,MAAMA,QAAAA,CAAG,MAAMC,OAAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACjD,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,QAAQ,GAAG,CAAA,CAAA;AACtC,EAAA,MAAMD,QAAAA,CAAG,SAAA,CAAU,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,YAAY,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,MAAM,CAAA;AAC1E,EAAA,MAAMA,QAAAA,CAAG,MAAA,CAAO,GAAA,EAAK,IAAI,CAAA;AAC3B;AAOO,SAAS,YAAA,CACd,QACAgB,MAAAA,EACkB;AAClB,EAAA,IAAI,CAAC,UAAA,CAAWA,MAAAA,CAAM,IAAI,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,KAAA;AACR,MAAA,CAAA,0CAAA,EAA6CA,OAAM,IAAI,CAAA,EAAA;AAAA,KAAA;AAE3D,EAAA;AACA,EAAA,MAAM,IAAA,GAAO,YAAA,CAAaA,MAAAA,CAAM,IAAI,CAAA;AACpC,EAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACvB,EAAA,MAAM,WAAA,GAAc,OAAO,UAAA,CAAW,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AACpE,EAAA,MAAM,IAAA,GAAuB,eAAe,CAAA,GACxC;IACE,GAAG,MAAA,CAAO,WAAW,WAAW,CAAA;AAChC,IAAA,IAAA,EAAMA,MAAAA,CAAM,IAAA;IACZ,GAAIA,MAAAA,CAAM,UAAU,MAAA,GAAY,EAAE,OAAOA,MAAAA,CAAM,KAAA,KAAU,EAAA;IACzD,SAAA,EAAW;GAAA,GAEb;AACE,IAAA,IAAA;AACA,IAAA,IAAA,EAAMA,MAAAA,CAAM,IAAA;AACZ,IAAA,GAAIA,OAAM,KAAA,GAAQ,EAAE,OAAOA,MAAAA,CAAM,KAAA,KAAU,EAAA;IAC3C,OAAA,EAAS,GAAA;IACT,SAAA,EAAW;AAAA,GAAA;AAEjB,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,MAAA,CAAO,UAAU,CAAA;AACxC,EAAA,IAAI,WAAA,IAAe,CAAA,EAAG,UAAA,CAAW,WAAW,CAAA,GAAI,IAAA;AAC3C,OAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAGzB,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,IAAA;AAChC,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAA;AAClC;AAEO,SAAS,eAAA,CACd,QACA,IAAA,EACkB;AAClB,EAAA,MAAM,SAAA,GAAY,aAAa,IAAI,CAAA;AACnC,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,SAAS,CAAA;AAIrE,EAAA,IAAI,SAAS,MAAA,CAAO,MAAA;AACpB,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,MAAA,GAAS,UAAA,CAAW,CAAC,CAAA,EAAG,IAAA;AAC1B,EAAA;AACA,EAAA,MAAM,IAAA,GAAyB,EAAE,GAAG,MAAA,EAAQ,UAAA,EAAA;AAC5C,EAAA,IAAI,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,OAAA,OAC5B,IAAA,CAAK,MAAA;AACjB,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,kBAAA,CACd,QACA,IAAA,EACkB;AAClB,EAAA,MAAM,SAAA,GAAY,aAAa,IAAI,CAAA;AACnC,EAAA,IAAI,CAAC,OAAO,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,EAAG;AACtD,IAAA,MAAM,IAAI,KAAA;MACR,CAAA,uDAAA,EAA0D,SAAS,mDACjB,SAAS,CAAA,SAAA;AAAA,KAAA;AAE/D,EAAA;AACA,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAA;AAC9B;AAEO,SAAS,aAAA,CACd,QACA,IAAA,EAC4B;AAC5B,EAAA,OAAO,MAAA,CAAO,WAAW,IAAA,CAAK,CAAA,MAAK,CAAA,CAAE,IAAA,KAAS,YAAA,CAAa,IAAI,CAAC,CAAA;AAClE;AAIO,SAAS,mBACd,MAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAA,CAAO,WAAW,CAAC,CAAA;AAC9C,EAAA,OAAO,cAAc,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAA,IAAK,MAAA,CAAO,WAAW,CAAC,CAAA;AACpE;AASA,SAAS,gBAAgB,MAAA,EAAmC;AAC1D,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,IAAA,OAAO,EAAE,OAAA,EAAS,yBAAA,EAA2B,UAAA,EAAY,EAAA,EAAC;AAC5D,EAAA;AACA,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,MAAM,aAA+B,EAAA;AACrC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG;AACjC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,UAAA,EAAY;AAClC,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,IAAA,GAAO,OAAO,CAAA,CAAE,IAAA,KAAS,WAAW,YAAA,CAAa,CAAA,CAAE,IAAI,CAAA,GAAI,EAAA;AACjE,MAAA,MAAM,OAAO,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,EAAA;AACnD,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AACpB,MAAA,MAAM,OAAA,GACJ,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAA,iBAAU,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACzD,MAAA,MAAM,YAAY,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,GAAW,EAAE,SAAA,GAAY,OAAA;AAClE,MAAA,MAAM,EAAA,GAAqB,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,SAAA,EAAA;AAClD,MAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,YAAY,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ;AACjD,QAAA,EAAA,CAAG,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,IAAA,EAAA;AACrB,MAAA;AACA,MAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AACpB,IAAA;AACF,EAAA;AAGA,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAA;AAClB,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAC3C,EAAA,MAAM,SACJ,OAAO,GAAA,CAAI,WAAW,QAAA,IAAY,SAAA,CAAU,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,IAAI,MAAM,CAAA,GACtE,IAAI,MAAA,GACL,SAAA,CAAU,CAAC,CAAA,EAAG,IAAA;AACpB,EAAA,MAAM,GAAA,GAAwB;IAC5B,OAAA,EAAS,yBAAA;IACT,UAAA,EAAY;AAAA,GAAA;AAEd,EAAA,IAAI,MAAA,KAAW,MAAA,EAAW,GAAA,CAAI,MAAA,GAAS,MAAA;AACvC,EAAA,OAAO,GAAA;AACT;;;ACpKA,IAAM,kBAAA,GAAqB,6BAAA;AAC3B,IAAM,mBAAA,GAAsB,GAAA;AAgBrB,SAAS,cACd,IAAA,EACwB;AACxB,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,kBAAA;AACpC,EAAA,MAAM,YAAA,GACJ,IAAA,CAAK,YAAA,KAAiB,CAAC,QAAe,GAAA,CAAuB,EAAA,CAAA;AAC/D,EAAA,MAAM,eAAA,GACJ,KAAK,eAAA,KAAoB,KAAA,GACrB,OACC,IAAA,CAAK,eAAA,KACL,CAAC,GAAA,KAAe,GAAA,CAAgC,WAAA,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,KAAK,iBAAA,IAAqB,mBAAA;AACzC,EAAA,MAAM,MAAA,GAAS,CAAA,MAAA,EAAS,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAG,CAAA,CAAA,CAAA;AAE/B,EAAA,OAAO,SAAS,iBAAiB,GAAA,EAAoB;AACnD,IAAA,MAAM,QAAA,GAAW,aAAa,GAAG,CAAA;AACjC,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,CAAC,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC7D,MAAA,MAAM,IAAI,KAAA;QACR,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,cAAA,EAAiB,MAAA;AAClC,UAAA;AAAA,SACD,uBAAkB,SAAS,CAAA;AAAA,OAAA;AAEhC,IAAA;AACA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,WAAA,GAAc,gBAAgB,GAAG,CAAA;AACvC,MAAA,IACE,OAAO,gBAAgB,QAAA,IACvB,WAAA,CAAY,WAAW,CAAA,IACvB,WAAA,CAAY,SAAS,MAAA,EACrB;AACA,QAAA,MAAM,IAAI,KAAA;AACR,UAAA,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,MAAA,EAAS,QAAQ,gCAA2B,MAAM,CAAA,MAAA;AAAA,SAAA;AAEzE,MAAA;AACF,IAAA;AACA,IAAA,IAAA,CAAK,WAAW,GAAG,CAAA;AACnB,IAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AACtC,EAAA,CAAA;AACF;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CAAE,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAA,GAAgB,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACnE;AAiBO,SAAS,mBAAmB,KAAA,EAAyB;AAC1D,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,KAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,UAAA,EAAY,OAAO,MAAA;AACxC,EAAA,IACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,IAClD,OAAA,IAAW,SACX,OAAQ,KAAA,CAA8B,UAAU,UAAA,EAChD;AACA,IAAA,OAAO,MAAA;AACT,EAAA;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,IAAI,kBAAkB,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,MAAM,MAAS,CAAA;AACpE,EAAA;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,MAA+B,EAAA;AACrC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AACrE,MAAA,MAAM,QAAA,GAAW,mBAAmB,CAAC,CAAA;AACrC,MAAA,IAAI,QAAA,KAAa,MAAA,EAAW,GAAA,CAAI,CAAC,CAAA,GAAI,QAAA;AACvC,IAAA;AACA,IAAA,OAAO,GAAA;AACT,EAAA;AACA,EAAA,OAAO,KAAA;AACT;ACzDA,IAAM,iBAAA,GAAuC;AAC3C,EAAA,cAAA;AACA,EAAA,MAAA;AACA,EAAA,MAAA;AACA,EAAA,OAAA;AACA,EAAA;AACF,CAAA;AAEO,SAAS,YAGd,IAAA,EAA8D;AAC9D,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA,IAAY,GAAG,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,GAAA,CAAA;AAC5D,EAAA,MAAM,aAAA,GACJ,IAAA,CAAK,aAAA,KACJ,CAAC,WACA,kBAAA,CAAmB;AACjB,IAAA,MAAA,EAAQ,IAAA,CAAK,aAAA;IACb,GAAG;GACJ,CAAA,CAAA;AAEL,EAAA,eAAe,MAAA,CACb,QACA,IAAA,EAC8B;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AACjC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AACvC,IAAA,MAAM,IAAA,GAAOd,IAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,YAAY,CAAA;AACxC,IAAA,MAAM,WAAA,GAAc,cAAc,MAAM,CAAA;AACxC,IAAA,MAAM,WAAW,MAAA,CAAO,SAAA;MACtB,IAAA,CAAK,IAAA,IAAQ,WAAA,CAAY,IAAA,EAAM,WAAW,CAAA;AAC1C,MAAA;AAAA,KAAA;AAEF,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAMiB,MAAMlB,OAAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,MAAA,MAAMmB,SAAAA,CAAU,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AACxC,IAAA;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAA;AACzB,EAAA;AAEA,EAAA,eAAe,KACb,IAAA,EAC0D;AAC1D,IAAA,MAAM,MAAA,GAAS,MAAMF,QAAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC1C,IAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAA,GAAS,IAAA,CAAK,MAAM,MAAM,CAAA;AAI/C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,WAAiC,CAAA;AAC5D,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAA;AACzB,EAAA;AAEA,EAAA,eAAe,IAAA,CACb,GAAA,EACA,IAAA,GAAoB,EAAA,EACA;AACpB,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAA,CAAK,YAAY,iBAAiB,CAAA;AACvD,IAAA,MAAM,MAAiB,EAAA;AAEvB,IAAA,eAAe,KAAK,OAAA,EAAgC;AAKlD,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI;AACF,QAAA,OAAA,GAAW,MAAM,OAAA,CAAQ,OAAA,EAAS,EAAE,aAAA,EAAe,MAAM,CAAA;MAC3D,CAAA,CAAA,MAAQ;AACN,QAAA;AACF,MAAA;AACA,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AACnC,QAAA,IAAI,KAAA,CAAM,aAAA,EAAe;AACvB,UAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AACzB,UAAA,MAAM,IAAA,CAAKhB,IAAAA,CAAK,OAAA,EAAS,SAAS,CAAC,CAAA;AACnC,UAAA;AACF,QAAA;AACA,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAA,EAAU;AACrB,QAAA,IAAI,cAAc,QAAA,EAAU;AAC5B,QAAA,IAAI;AACF,UAAA,MAAM,EAAE,QAAA,GAAW,MAAM,KAAKA,IAAAA,CAAK,OAAA,EAAS,SAAS,CAAC,CAAA;AACtD,UAAA,IAAI,CAAC,KAAK,MAAA,IAAU,IAAA,CAAK,OAAO,MAAM,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;QAC1D,CAAA,CAAA,MAAQ;AAGR,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,MAAM,KAAK,GAAG,CAAA;AACd,IAAA,OAAO,GAAA;AACT,EAAA;AAEA,EAAA,eAAe,MAAA,CACb,IAAA,EACA,OAAA,EAIA,IAAA,GAA4C,EAAA,EACd;AAC9B,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAA,GAAS,MAAM,KAAK,IAAI,CAAA;AAGxC,IAAA,MAAM,MAAA,GAAS,MAAMgB,QAAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC1C,IAAA,MAAM,EAAE,WAAA,EAAA,GAAgB,IAAA,CAAK,MAAM,MAAM,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,WAAA;AACf,IAAA,MAAM,UAAU,MAAM,OAAA,CAAQ,QAAQ,EAAE,MAAA,EAAQ,MAAM,CAAA;AACtD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACrC,IAAA,MAAM,cAAA,GAAiB,cAAc,OAAO,CAAA;AAC5C,IAAA,MAAM,WAAW,MAAA,CAAO,SAAA;AACtB,MAAA,IAAA,CAAK,IAAA,IAAQ,IAAA;AACb,MAAA;AAAA,KAAA;AAEF,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAMC,MAAMlB,OAAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,MAAA,MAAMmB,SAAAA,CAAU,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AACxC,IAAA;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAA;AACpC,EAAA;AAEA,EAAA,eAAeV,QAAAA,CACb,KAAA,EACA,GAAA,GAAsB,EAAA,EACJ;AAClB,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AACjC,IAAA;AACA,IAAA,IAAI,UAAU,KAAA,EAAO;AACnB,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,IAAW,GAAA;AAC/B,MAAA,MAAM,IAAA,GAAOY,UAAAA,CAAW,KAAA,CAAM,IAAI,CAAA,GAAI,MAAM,IAAA,GAAOpB,IAAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA;AAC3E,MAAA,MAAM,EAAE,MAAA,EAAA,GAAW,MAAM,KAAK,IAAI,CAAA;AAClC,MAAA,OAAO,MAAA;AACT,IAAA;AACA,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAI,CAAC,IAAI,UAAA,EAAY;AACnB,QAAA,MAAM,IAAI,KAAA;AACR,UAAA,CAAA,EAAG,KAAK,IAAI,CAAA,cAAA,EAAiB,KAAK,GAAG,CAAA,qBAAA,EAAwB,MAAM,GAAG,CAAA,0FAAA;AAAA,SAAA;AAE1E,MAAA;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,UAAA,CAAW,MAAM,GAAG,CAAA;AAC/C,MAAA,OAAO,IAAA,CAAK,OAAO,QAAmB,CAAA;AACxC,IAAA;AACA,IAAA,MAAM,IAAI,KAAA;AACR,MAAA,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,cAAA,EAAiB,IAAA,CAAK,GAAG,CAAA,6CAAA;AAAA,KAAA;AAEzC,EAAA;AAEA,EAAA,eAAe,SAAS,IAAA,EAA6B;AACnD,IAAA,MAAMqB,EAAAA,CAAG,IAAA,EAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AAChC,EAAA;AAEA,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAM,IAAA,EAAM,QAAQ,OAAA,EAAAb,QAAAA,EAAS,QAAQ,QAAA,EAAA;AACxD;AAEA,SAAS,WAAA,CACP,MACA,WAAA,EACQ;AACR,EAAA,MAAM,KACJ,OAAO,WAAA,CAAY,SAAS,QAAA,GACxB,WAAA,CAAY,OACZ,OAAO,WAAA,CAAY,OAAO,QAAA,GACxB,WAAA,CAAY,KACZ,OAAO,WAAA,CAAY,SAAS,QAAA,GAC1B,WAAA,CAAY,OACZ,IAAA,CAAK,IAAA;AACf,EAAA,OAAO,KAAK,EAAE;;AAChB;AC/RO,IAAM,6BAA6B,CAAA,CAAE,MAAA,CAAO,EAAE,QAAA,EAAU,EAAE,OAAA,CAAQ,yBAAyB,CAAA,CAAE,QAAA,CAAS,kDAAkD,CAAA,EAAG,MAAA,EAAQ,CAAA,CAAE,MAAA,GAAS,KAAA,CAAM,IAAI,MAAA,CAAO,2CAA2C,CAAC,CAAA,CAAE,QAAA,CAAS,6HAAwH,CAAA,EAAG,SAAS,CAAA,CAAE,MAAA,EAAA,CAAS,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,SAAS,8BAA8B,CAAA,EAAG,aAAA,EAAe,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,CAAE,IAAI,GAAI,CAAA,CAAE,QAAA,CAAS,qDAAqD,GAAG,SAAA,EAAW,CAAA,CAAE,MAAA,EAAA,CAAS,MAAM,IAAI,MAAA,CAAO,6CAA6C,CAAC,EAAE,QAAA,CAAS,kDAAkD,CAAA,EAAG,QAAA,EAAU,EAAE,OAAA,CAAQ,OAAO,CAAA,CAAE,QAAA,CAAS,8GAAyG,CAAA,EAAG,SAAA,EAAW,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAA,CAAS,KAAA,CAAM,IAAI,MAAA,CAAO,YAAY,CAAC,CAAA,CAAE,SAAS,gDAAgD,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,CAAE,QAAA,CAAS,oCAAoC,CAAC,CAAC,CAAA,CAAE,QAAA,CAAS,wEAAwE,CAAA,EAAG,cAAc,CAAA,CAAE,MAAA,CAAO,EAAE,YAAA,EAAc,EAAE,MAAA,CAAO,CAAA,CAAE,MAAA,EAAA,EAAU,EAAE,GAAA,EAAK,CAAA,CAAE,QAAA,CAAS,mJAA8I,CAAA,CAAE,QAAA,EAAA,EAAY,UAAA,EAAY,EAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAM,CAAC,IAAA,EAAM,CAAA,KAAM,GAAA,CAAI,QAAQ,IAAI,CAAA,IAAK,CAAC,CAAA,EAAG,EAAE,OAAA,EAAS,2BAAA,EAA6B,CAAA,CAAE,SAAS,sHAAsH,CAAA,CAAE,OAAA,CAAQ,EAAE,CAAA,EAAG,CAAA,CAAE,MAAA,GAAS,QAAA,CAAS,gEAAgE,CAAA,CAAE,QAAA,IAAY,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,EAAE,WAAW,CAAA,CAAE,MAAA,EAAA,CAAS,QAAA,IAAY,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA,CAAE,QAAA,EAAA,EAAY,aAAa,CAAA,CAAE,MAAA,EAAA,CAAS,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,IAAY,WAAA,EAAa,CAAA,CAAE,MAAA,EAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAE,UAAA,EAAY,SAAA,EAAW,CAAA,CAAE,MAAA,GAAS,QAAA,EAAA,EAAY,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,QAAA,EAAA,EAAY,EAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,8IAA8I,CAAA,CAAE,QAAA,EAAA,EAAY,UAAA,EAAY,EAAE,MAAA,CAAO,CAAA,CAAE,MAAA,EAAA,EAAU,EAAE,GAAA,EAAK,CAAA,CAAE,QAAA,CAAS,8HAA8H,CAAA,CAAE,QAAA,EAAA,EAAY,iBAAA,EAAmB,EAAE,MAAA,EAAA,CAAS,GAAA,CAAI,CAAC,EAAE,QAAA,CAAS,iMAAiM,CAAA,CAAE,QAAA,IAAY,UAAA,EAAY,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,QAAA,CAAS,GAAA,EAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,QAAQ,GAAA,CAAI,KAAA,CAAM,CAAC,IAAA,EAAM,MAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAC,CAAA,EAAG,EAAE,OAAA,EAAS,2BAAA,EAA6B,CAAA,CAAE,QAAA,CAAS,kEAAkE,CAAA,CAAE,QAAQ,EAAE,CAAA,EAAG,UAAA,EAAY,EAAE,MAAA,CAAO,CAAA,CAAE,MAAA,EAAA,EAAU,EAAE,GAAA,EAAK,CAAA,CAAE,QAAA,CAAS,kFAAkF,CAAA,CAAE,OAAA,CAAQ,EAAE,GAAG,CAAA,CAAE,MAAA,EAAA,CAAS,SAAS,yPAAyP,CAAA;ACMtsG,aAAA,CAAc;EACzC,GAAA,EAAK,EAAA;EACL,IAAA,EAAM,WAAA;;;EAGN,SAAA,EAAW,2CAAA;EACX,YAAA,EAAc,CAAC,QAAQ,GAAA,CAAI,IAAA;AAC3B,EAAA,QAAA,CAAS,GAAA,EAAK;AACV,IAAA,MAAM,MAAA,GAAS,0BAAA,CAA2B,SAAA,CAAU,GAAG,CAAA;AACvD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,CAAA,0BAAA,EAA6B,MAAA,CAAO,MAAM,MAAA,CACrD,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,EAAE,CAAA,CAC9C,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACrB,IAAA;AAIJ,EAAA,CAAA;AACA,EAAA,KAAA,CAAM,GAAA,EAAK;AAKP,IAAA,OAAO,EAAE,GAAG,GAAA,EAAA;AAChB,EAAA;AACJ,CAAC;ACtBM,SAAS,iBAAA,CAAkB,SAAA,EAAW,IAAA,GAAO,EAAA,EAAI;AACpD,EAAA,MAAM,EAAE,QAAA,GAAW,IAAA;AACnB,EAAA,MAAM,MAAA,GAAS,UAAU,OAAA,KAAY,MAAA;AACrC,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,EAAQ;AACpB,IAAA,MAAM,IAAI,MAAM,CAAA,uCAAA,EAA0C,SAAA,CAAU,IAAI,CAAA,WAAA,EAAc,SAAA,CAAU,OAAO,CAAA,gDAAA,CAAkD,CAAA;AAC7J,EAAA;AACA,EAAA,IAAI,MAAA,IAAU,CAAC,SAAA,CAAU,eAAA,EAAiB;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,SAAA,CAAU,IAAI,CAAA,oEAAA,CAAsE,CAAA;AAClJ,EAAA;AAEA,EAAA,IAAI,MAAA,IAAU,UAAU,OAAA,EAAS;AAC7B,IAAA,gBAAA,CAAiB,SAAiB,CAAA;AACtC,EAAA;AACA,EAAA,MAAM,QAAA,GAAW,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,KAAK,SAAA,CAAU,IAAA;AAC3D,EAAA,MAAM,YAAA,GAAe,UAAU,eAAA,IAAmB,IAAA;AAIlD,EAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,UAAU,UAAA,EAAY,UAAA,IAAc,EAAE,CAAC,CAAA;AACjF,EAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KAAW;AAGvB,IAAA,MAAM,YAAA,GAAe,EAAE,GAAG,MAAA,EAAA;AAC1B,IAAA,IAAI,UAAU,QAAA,EAAU;AACpB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAA,EAAG;AAC3D,QAAA,IAAI,YAAA,CAAa,GAAG,CAAA,KAAM,MAAA,IAAa,UAAU,MAAA,EAAW;AACxD,UAAA,YAAA,CAAa,GAAG,CAAA,GAAI,KAAA;AACxB,QAAA;AACJ,MAAA;AACJ,IAAA;AACA,IAAA,IAAI,MAAA,EAAQ;AAMR,MAAA,OAAO,MAAA,CAAO,OAAO,YAAY,CAAA;AACrC,IAAA;AASA,IAAA,MAAM,aAAa,EAAA;AACnB,IAAA,MAAM,gBAAgB,EAAA;AACtB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACrD,MAAA,IAAI,aAAA,CAAc,IAAI,GAAG,CAAA;AACrB,QAAA,aAAA,CAAc,GAAG,CAAA,GAAI,KAAA;;AAErB,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAC1B,IAAA;AACA,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAC7C,IAAA,OAAO,OAAO,MAAA,CAAO;MACjB,GAAG,YAAA;MACH,GAAG;KACN,CAAA;AACL,EAAA,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,SAAA,CAAU,SAAS,IAAI,MAAA,CAAO,KAAA;AACrD,EAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KAAW;AACvB,IAAA,IAAI,YAAA,EAAc;AACd,MAAA,OAAO,mBAAA,CAAoB,YAAA,EAAc,MAAA,EAAQ,QAAQ,CAAA;AAC7D,IAAA;AACA,IAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAC/B,EAAA,CAAA;AACA,EAAA,OAAO;AACH,IAAA,IAAA,EAAM,SAAA,CAAU,IAAA;IAChB,GAAA,EAAK,EAAA;AACL,IAAA,aAAA,EAAe,QAAQ,aAAA,IAAiB,CAAA,uBAAA,CAAA;AACxC,IAAA,MAAA;AACA,IAAA,MAAA;AACA,IAAA;AAAA,GAAA;AAER;AACA,SAAS,gBAAA,CAAiB,WAAW,MAAA,EAAQ;AAMzC,EAAA,MAAM,CAAA,GAAI,SAAA,CAAU,OAAA,IAAW,EAAA;AAC/B,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC/C,IAAA,IAAI,OAAO,QAAA,CAAS,SAAA,KAAc,QAAA,IAC9B,OAAO,QAAA,CAAS,SAAA,KAAc,QAAA,IAC9B,QAAA,CAAS,SAAA,GAAY,QAAA,CAAS,SAAA,EAAW;AACzC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,SAAA,CAAU,IAAI,CAAA,UAAA,EAAa,KAAK,CAAA,aAAA,EAAgB,QAAA,CAAS,SAAS,CAAA,eAAA,EAAkB,QAAA,CAAS,SAAS,CAAA,CAAA,CAAG,CAAA;AACvK,IAAA;AACA,IAAA,IAAI,OAAO,QAAA,CAAS,OAAA,KAAY,QAAA,IAC5B,OAAO,QAAA,CAAS,OAAA,KAAY,QAAA,IAC5B,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAA,EAAS;AACrC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,SAAA,CAAU,IAAI,CAAA,UAAA,EAAa,KAAK,CAAA,WAAA,EAAc,QAAA,CAAS,OAAO,CAAA,aAAA,EAAgB,QAAA,CAAS,OAAO,CAAA,CAAA,CAAG,CAAA;AAC/J,IAAA;AACA,IAAA,IAAI,QAAA,CAAS,SAAS,MAAA,IAAa,CAAC,MAAM,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC9D,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,UAAU,IAAI,CAAA,UAAA,EAAa,KAAK,CAAA,uBAAA,CAAyB,CAAA;AACvH,IAAA;AACJ,EAAA;AACJ;AACA,SAAS,UAAU,SAAA,EAAW;AAC1B,EAAA,OAAO,CAAC,MAAA,KAAW;AAQf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,SAAA,CAAU,IAAI,CAAA,+FAAA,CAA4F,CAAA;AACxK,EAAA,CAAA;AACJ;AACA,SAAS,mBAAA,CAAoB,QAAA,EAAU,MAAA,EAAQ,WAAA,EAAa;AAIxD,EAAA,MAAM,WAAY,OAAO,MAAA,CAAO,OAAO,QAAA,IAAY,MAAA,CAAO,MACrD,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,OAAO,IAAA,IAC1C,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,IAAA,IAC3C,SAAA;AACJ,EAAA,OAAO,QAAA,CACF,QAAQ,SAAA,EAAW,QAAQ,EAC3B,OAAA,CAAQ,YAAA,EAAc,WAAA,CAAY,WAAA,EAAa,CAAA;AACxD;AC3HO,SAAS,uBAAuB,MAAA,EAAQ;AAC3C,EAAA,MAAM,MAAA,GAASc,OAAO,MAAM,CAAA;AAC5B,EAAA,IAAI,OAAO,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACvC,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAC1E,EAAA;AACA,EAAA,MAAM,MAAA,GAAS,0BAAA,CAA2B,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA;AAC/D,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACjB,IAAA,MAAM,IAAI,MAAM,CAAA,mDAAA,EAAiD,MAAA,CAAO,MAAM,MAAA,CACzE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,EAAE,CAAA,CAC9C,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACrB,EAAA;AACA,EAAA,OAAO,EAAE,WAAA,EAAa,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,OAAO,OAAA,EAAA;AACpD;;;ACiCA,eAAsB,gBACpB,IAAA,EACgC;AAChC,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU;AAC3B,IAAA,IAAA,EAAM,KAAK,IAAA,IAAQ,uBAAA;AACnB,IAAA,OAAA,EAAS,KAAK,OAAA,IAAW;GAC1B,CAAA;AAED,EAAA,MAAM,QAAA,GAAsB,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAG1C,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,MAAM,aAAa,MAAM,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,KAAK,KAAK,CAAA;AAClE,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,UAAU,CAAA;AAC7B,EAAA;AAOA,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KACdF,UAAAA,CAAW,CAAC,CAAA,IAAK,CAAC,IAAA,CAAK,SAAA,GAAY,CAAA,GAAIpB,IAAAA,CAAK,IAAA,CAAK,WAAW,CAAC,CAAA;AAE/D,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,aAAA,CAAc,MAAA,EAAQ,MAAM,MAAM,CAAA;AACpC,EAAA;AAEA,EAAA,OAAO;AACL,IAAA,MAAA;AACA,IAAA,UAAA,EAAY,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI;AAAA,GAAA;AAE1C;AAiBA,SAAS,aAAA,CACP,MAAA,EACA,IAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,YAAY,IAAI,CAAA;AAG9B,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAChB,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,CAAA,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,EAAc,IAAA,KACjC,CAAA,EAAG,IAAI,CAAA,SAAA,EAAY,IAAA,CAAK,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,aAAa,IAAI,CAAA,CAAA;AAG3D,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,IAAA,WAAA;AACE,MAAA,QAAA;AACA,MAAA;AAAA,KAAA;AAEF,IAAA;AACE,MAAA,MAAA,EAAQuB,CAAAA,CACL,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAA,EAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,CAC9B,QAAA,CAAS,CAAA,IAAA,EAAO,IAAA,CAAK,IAAI,CAAA,mBAAA,CAAqB,CAAA;AACjD,MAAA,GAAA,EAAKA,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,kDAAkD,CAAA;AAC3E,MAAA,IAAA,EAAMA,EACH,MAAA,EAAA,CACA,QAAA,EAAA,CACA,SAAS,0DAA0D,CAAA;AACtE,MAAA,MAAA,EAAQA,EACL,OAAA,EAAA,CACA,QAAA,EAAA,CACA,SAAS,yCAAoC;AAAA,KAAA;AAElD,IAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAM,QAAA,KAAa;AACvC,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ;AACxC,QAAA,GAAA,EAAK,OAAO,GAAG,CAAA;AACf,QAAA,IAAA;AACA,QAAA;OACD,CAAA;AACD,MAAA,OAAO,WAAA,CAAY;AACjB,QAAA,IAAA,EAAM,MAAA,CAAO,IAAA;AACb,QAAA,QAAA,EAAU,MAAA,CAAO;OAClB,CAAA;AACH,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,QAAA,CAAS,MAAM,CAAA;AACf,IAAA,WAAA,CAAY,QAAQ,uDAAuD,CAAA;AAC3E,IAAA;AACE,MAAA,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,sDAAsD;AAAA,KAAA;IAElF,OAAO,EAAE,MAAA,KAAW;AAClB,MAAA,MAAM,SAAS,MAAM,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAC5C,MAAA,OAAO,WAAA,CAAY,EAAE,IAAA,EAAM,MAAA,CAAO,MAAM,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AACjE,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,QAAA,CAAS,MAAM,CAAA;AACf,IAAA,WAAA;AACE,MAAA,MAAA;AACA,MAAA;AAAA,KAAA;AAEF,IAAA;AACE,MAAA,GAAA,EAAKA,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,oBAAoB,CAAA;MAC7C,QAAA,EAAUA,CAAAA,CACP,MAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAA,CACA,QAAA,CAAS,2DAA2D;AAAA,KAAA;IAEzE,OAAO,EAAE,GAAA,EAAK,QAAA,EAAA,KAAe;AAC3B,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,IAAA,CAAK,OAAO,GAAG,CAAA,EAAG,EAAE,QAAA,EAAU,CAAA;AAC1D,MAAA,OAAO,YAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,MAAA,EAAQ,SAAS,CAAA;AACvD,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,IAAA,WAAA;AACE,MAAA,QAAA;AACA,MAAA;AAAA,KAAA;AAEF,IAAA;AACE,MAAA,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,iCAAiC,CAAA;MAC3D,KAAA,EAAOA,CAAAA,CACJ,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAA,EAAUA,EAAE,OAAA,EAAS,CAAA,CAC9B,QAAA,CAAS,qDAAqD,CAAA;AACjE,MAAA,IAAA,EAAMA,EAAE,MAAA,EAAA,CAAS,QAAA,EAAA,CAAW,SAAS,6CAA6C;AAAA,KAAA;AAEpF,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAA,KAAW;AAC/B,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA;AACzB,QAAA,MAAA,CAAO,IAAI,CAAA;AACX,QAAA,CAAC,QAAA,MAAuC,EAAE,GAAG,QAAA,EAAU,GAAG,KAAA,EAAA,CAAA;AAC1D,QAAA,EAAE,IAAA;AAAK,OAAA;AAET,MAAA,OAAO,WAAA,CAAY,EAAE,IAAA,EAAM,MAAA,CAAO,MAAM,QAAA,EAAU,MAAA,CAAO,UAAU,CAAA;AACrE,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,QAAA,CAAS,SAAS,CAAA;AAClB,IAAA,WAAA;AACE,MAAA,SAAA;AACA,MAAA;AAAA,KAAA;AAEF,IAAA;AACE,MAAA,KAAA,EAAOA,EACJ,KAAA,CAAM;AACLA,QAAAA,CAAAA,CAAE,MAAA,CAAO,EAAE,MAAA,EAAQA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAA,EAAUA,CAAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA;AACtDA,QAAAA,CAAAA,CAAE,OAAO,EAAE,GAAA,EAAKA,CAAAA,CAAE,MAAA,IAAU,CAAA;AAC5BA,QAAAA,CAAAA,CAAE,OAAO,EAAE,IAAA,EAAMA,CAAAA,CAAE,MAAA,IAAU;OAC9B,CAAA,CACA,SAAS,wBAAwB,CAAA;AACpC,MAAA,OAAA,EAASA,EACN,MAAA,EAAA,CACA,QAAA,EAAA,CACA,SAAS,kCAAkC;AAAA,KAAA;IAEhD,OAAO,EAAE,KAAA,EAAO,OAAA,EAAA,KAAc;AAC5B,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO;QACxC,OAAA,EAAS,OAAA,GAAU,MAAA,CAAO,OAAO,CAAA,GAAI;OACtC,CAAA;AACD,MAAA,OAAO,WAAA,CAAY,EAAE,MAAA,EAAQ,CAAA;AAC/B,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,IAAA,WAAA,CAAY,UAAU,mCAAmC,CAAA;AACzD,IAAA;AACE,MAAA,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,iCAAiC;AAAA,KAAA;IAE7D,OAAO,EAAE,MAAA,KAAW;AAClB,MAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,MAAA,MAAM,KAAA,CAAM,OAAO,MAAM,CAAA;AACzB,MAAA,OAAO,WAAA,CAAY,EAAE,OAAA,EAAS,MAAA,EAAQ,CAAA;AACxC,IAAA;AAAA,GAAA;AAEJ;AAIA,eAAe,cAAA,CACb,WACA,KAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAASf,OAAAA,CAAQ,SAAA,EAAW,YAAY,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAA,CAAW,MAAM,CAAA,SAAU,EAAA;AAEhC,EAAA,MAAM,MAAiB,EAAA;AACvB,EAAA,MAAM,EAAE,OAAA,EAAAgB,QAAAA,EAAA,GAAY,MAAM,OAAO,aAAkB,CAAA;AAGnD,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAW,MAAMA,SAAQ,MAAA,EAAQ;MAC/B,aAAA,EAAe;KAChB,CAAA;EACH,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AACT,EAAA;AAEA,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAA,EAAe;AAC1B,IAAA,MAAM,eAAexB,IAAAA,CAAK,MAAA,EAAQ,OAAO,KAAA,CAAM,IAAI,GAAG,cAAc,CAAA;AACpE,IAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAE/B,IAAA,MAAM,MAAA,GAAS,MAAMgB,QAAAA,CAAS,YAAA,EAAc,MAAM,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,uBAAuB,MAAM,CAAA;AAC5C,IAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AAEnB,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,OAAA,KAAY,MAAA,EAAQ;AACzC,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAChD,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,KAAA;AACR,UAAA,CAAA,uBAAA,EAA0B,GAAA,CAAI,IAAI,CAAA,uBAAA,EAA0B,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,SAAA;AAE3E,MAAA;AACA,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA;AACpC,MAAA,MAAA,GAAS,MAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,SAAS,CAAA;AAC9C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,KAAA;UACR,CAAA,uBAAA,EAA0B,GAAA,CAAI,IAAI,CAAA,cAAA,EAAiB,SAAS,CAAA,8EAAA;AAAA,SAAA;AAEhE,MAAA;AACF,IAAA;AAEA,IAAA,GAAA,CAAI,KAAK,iBAAA,CAAkB,GAAA,EAAK,EAAE,MAAA,EAAQ,CAAY,CAAA;AACxD,EAAA;AAEA,EAAA,OAAO,GAAA;AACT;AAIA,SAAS,YAAY,OAAA,EAEnB;AACA,EAAA,OAAO;IACL,OAAA,EAAS;AACP,MAAA;QACE,IAAA,EAAM,MAAA;AACN,QAAA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC;AAAA;AACvC;AACF,GAAA;AAEJ;AC7QA,eAAsB,gBAAA,CACpB,WACA,IAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAMhB,IAAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AACzC,EAAA,IAAI;AACF,IAAA,MAAMiB,KAAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAEpC,IAAA,MAAMC,SAAAA;AACJlB,MAAAA,IAAAA,CAAK,KAAK,cAAc,CAAA;AACxB,MAAA,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA;MAChC,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,GAAA;AAAM,KAAA;AAEpC,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,uDAAuD,GAAG,CAAA;AAC1E,EAAA;AACF;AAQA,eAAsB,kBAAkB,SAAA,EAAkC;AACxE,EAAA,IAAI;AACF,IAAA,MAAMyB,MAAAA,CAAOzB,IAAAA,CAAK,SAAA,EAAW,aAAA,EAAe,cAAc,CAAC,CAAA;EAC7D,CAAA,CAAA,MAAQ;AAER,EAAA;AACF;AAOA,eAAsB,gBAAgB,SAAA,EAG5B;AACR,EAAA,MAAM,IAAA,GAAOA,IAAAA,CAAK,SAAA,EAAW,aAAA,EAAe,cAAc,CAAA;AAC1D,EAAA,IAAI;AACF,IAAA,MAAM,CAAC,GAAA,EAAK,EAAE,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAACgB,QAAAA,CAAS,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AACxE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAA,CAAG,KAAA,EAAA;EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AACT,EAAA;AACF;AAaA,eAAsB,sBAAA,CACpB,YACA,gBAAA,EACmB;AACnB,EAAA,MAAM,UAAoB,EAAA;AAC1B,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,IAAI,OAAO,gBAAA,EAAkB;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,eAAA,CAAgB,EAAE,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,GAAA;AACtB,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/C,MAAA,IAAI;AACF,QAAA,MAAMS,MAAAA,CAAOzB,IAAAA,CAAK,EAAA,EAAI,aAAA,EAAe,cAAc,CAAC,CAAA;AACpD,QAAA,OAAA,CAAQ,IAAA,CAAKA,IAAAA,CAAK,EAAA,EAAI,aAAA,EAAe,cAAc,CAAC,CAAA;MACtD,CAAA,CAAA,MAAQ;AAER,MAAA;AACF,IAAA;AACF,EAAA;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,WAAW,GAAA,EAAsB;AACxC,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AACnB,IAAA,OAAO,IAAA;AACT,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,MAAM,OAAQ,GAAA,CAA8B,IAAA;AAC5C,IAAA,IAAI,IAAA,KAAS,SAAS,OAAO,IAAA;AAC7B,IAAA,OAAO,KAAA;AACT,EAAA;AACF;ACvGA,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,cAAA,GAAiB,GAAA;AACvB,IAAM,aAAA,GAAgB,mCAAA;AAgBtB,IAAI,cAAA,GAAsE,IAAA;AAE1E,eAAe,cAAc,SAAA,EAAyC;AACpE,EAAA,MAAM,IAAA,GAAOQ,OAAAA,CAAQ,SAAA,EAAW,aAAa,CAAA;AAC7C,EAAA,IAAI,CAACkB,UAAAA,CAAW,IAAI,CAAA,EAAG;AACrB,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,2BAAW,GAAA,EAAA;AACb,EAAA;AACA,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,MAAMd,IAAAA,CAAK,IAAI,CAAA;AACzB,IAAA,IACE,cAAA,IACA,eAAe,IAAA,KAAS,IAAA,IACxB,eAAe,KAAA,CAAM,OAAA,KAAY,EAAE,OAAA,EACnC;AACA,MAAA,OAAO,eAAe,KAAA,CAAM,QAAA;AAC9B,IAAA;AACA,IAAA,MAAM,GAAA,GAAM,MAAMI,QAAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA,CAAO,WAAW,EAAA;AAChE,IAAA,MAAM,WAAW,IAAI,GAAA;AACnB,MAAA,IAAA,CACG,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,CAAC,EAChE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM;AAAA,KAAA;AAEtB,IAAA,cAAA,GAAiB,EAAE,MAAM,KAAA,EAAO,EAAE,SAAS,CAAA,CAAE,OAAA,EAAS,UAAA,EAAS;AAC/D,IAAA,OAAO,QAAA;AACT,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AAGZ,IAAA,OAAA,CAAQ,KAAA;AACN,MAAA,CAAA,yBAAA,EAA4B,aAAa,CAAA,iBAAA,CAAA;AACzC,MAAA;AAAA,KAAA;AAEF,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,2BAAW,GAAA,EAAA;AACb,EAAA;AACF;AAEA,SAAS,cAAc,SAAA,EAA0D;AAC/E,EAAA,MAAM,IAAA,GAAOR,QAAQ,SAAS,CAAA;AAC9B,EAAA,OAAO,CAACM,MAAAA,KAAmB;AACzB,IAAA,IAAI,CAACA,MAAAA,IAASA,MAAAA,CAAM,MAAA,KAAW,GAAG,OAAO,IAAA;AACzC,IAAA,MAAM,SAAA,GAAYM,UAAAA,CAAWN,MAAK,CAAA,GAC9B,SAAA,CAAUA,MAAK,CAAA,GACf,SAAA,CAAUd,IAAAA,CAAK,IAAA,EAAMc,MAAK,CAAC,CAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,EAAM,SAAS,CAAA;AACpC,IAAA,IAAI,IAAI,UAAA,CAAW,IAAI,CAAA,IAAKM,UAAAA,CAAW,GAAG,CAAA,EAAG;AAC3C,MAAA,MAAM,IAAI,KAAA;QACR,CAAA,4BAAA,EAA+BN,MAAK,gBAAgB,IAAI,CAAA,CAAA;AAAA,OAAA;AAE5D,IAAA;AACA,IAAA,OAAO,SAAA;AACT,EAAA,CAAA;AACF;AAmBO,SAAS,oBAAA,CACd,QACA,IAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,IAAA,CAAK,SAAS,CAAA;AAE9C,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,iBAAA;AACA,IAAA,gTAAA;AACA,IAAA;AACE,MAAA,OAAA,EAASS,CAAAA,CACN,MAAA,EAAA,CACA,GAAA,CAAI,CAAC,CAAA,CACL,QAAA;AACC,QAAA;AAAA,OAAA;AAEJ,MAAA,IAAA,EAAMA,EACH,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAChB,UAAA,CACA,QAAA;AACC,QAAA;AAAA,OAAA;AAEJ,MAAA,GAAA,EAAKA,CAAAA,CACF,MAAA,EAAA,CACA,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA,OAAA;AAEJ,MAAA,KAAA,EAAOA,EACJ,MAAA,EAAA,CACA,QAAA,EAAA,CACA,SAAS,8CAA8C,CAAA;MAC1D,SAAA,EAAWA,CAAAA,CACR,MAAA,EAAA,CACA,GAAA,EAAA,CACA,QAAA,EAAA,CACA,GAAA,CAAI,cAAc,CAAA,CAClB,QAAA,EAAA,CACA,QAAA;QACC,CAAA,0CAAA,EAA6C,kBAAkB,eAAe,cAAc,CAAA,CAAA;AAAA;AAC9F,KAAA;AAEJ,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,WAAA,KAAgB;AAClD,MAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc,IAAA,CAAK,SAAS,CAAA;AACpD,MAAA,MAAM,QAAA,GAAW,SAAS,OAAO,CAAA;AACjC,MAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5B,QAAA,MAAM,OAAA,GAAU,CAAC,GAAG,SAAS,EAAE,IAAA,EAAA,CAAO,IAAA,CAAK,IAAI,CAAA,IAAK,SAAA;AACpD,QAAA,MAAM,IAAI,KAAA;UACR,CAAA,SAAA,EAAY,QAAQ,wCACLvB,IAAAA,CAAK,IAAA,CAAK,WAAW,aAAa,CAAC,gDACD,OAAO,CAAA,CAAA;AAAA,SAAA;AAE5D,MAAA;AACA,MAAA,MAAM,WAAA,GAAc,UAAU,GAAG,CAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,SAAA,IAAa,oBAAoB,cAAc,CAAA;AACtE,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW;AAC9B,QAAA,OAAA;AACA,QAAA,IAAA,EAAM,QAAQ,EAAA;QACd,GAAA,EAAK,WAAA;AACL,QAAA,KAAA;QACA,SAAA,EAAW;OACZ,CAAA;AACD,MAAA,OAAO;QACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAAA,OAAA;AAErE,IAAA;AAAA,GAAA;AAEJ;AAUA,IAAM,iBAAA,GAAoB,OAAA;AAE1B,eAAe,WAAWc,MAAAA,EAAgD;AACxE,EAAA,OAAO,IAAI,OAAA,CAAuB,CAAA,cAAA,KAAkB;AAClD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAA;AACvB,IAAA,MAAM,KAAA,GAAQL,KAAAA,CAAMK,MAAAA,CAAM,OAAA,EAASA,OAAM,IAAA,EAAM;AAC7C,MAAA,GAAA,EAAKA,MAAAA,CAAM,GAAA;MACX,KAAA,EAAO,KAAA;;AAEP,MAAA,GAAA,EAAK,OAAA,CAAQ,GAAA;MACb,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;KAC/B,CAAA;AAED,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,SAAS,YAAA,CAAa,KAAa,KAAA,EAAuB;AACxD,MAAA,IAAI,GAAA,CAAI,UAAU,iBAAA,EAAmB;AACnC,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,OAAO,GAAA;AACT,MAAA;AACA,MAAA,MAAM,IAAA,GAAO,oBAAoB,GAAA,CAAI,MAAA;AACrC,MAAA,MAAMJ,KAAAA,GAAO,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAClC,MAAA,IAAIA,KAAAA,CAAK,SAAS,IAAA,EAAM;AACtB,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,OAAO,GAAA,GAAMA,KAAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AACjC,MAAA;AACA,MAAA,OAAO,GAAA,GAAMA,KAAAA;AACf,IAAA;AACA,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAA,CAAA,KAAK;AAC5B,MAAA,MAAA,GAAS,YAAA,CAAa,QAAQ,CAAC,CAAA;IACjC,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAA,CAAA,KAAK;AAC5B,MAAA,MAAA,GAAS,YAAA,CAAa,QAAQ,CAAC,CAAA;IACjC,CAAC,CAAA;AAED,IAAA,IAAII,OAAM,KAAA,EAAO;AACf,MAAA,KAAA,CAAM,KAAA,EAAO,KAAA,CAAMA,MAAAA,CAAM,KAAK,CAAA;AAChC,IAAA;AACA,IAAA,KAAA,CAAM,OAAO,GAAA,EAAA;AAEb,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,GAAW,IAAA;AAGX,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,KAAK,SAAS,CAAA;MACtB,CAAA,CAAA,MAAQ;AAER,MAAA;AAEA,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAI;AACF,UAAA,KAAA,CAAM,KAAK,SAAS,CAAA;QACtB,CAAA,CAAA,MAAQ;AAER,QAAA;MACF,CAAA,EAAG,GAAK,EAAE,KAAA,EAAA;AACZ,IAAA,CAAA,EAAGA,OAAM,SAAS,CAAA;AAClB,IAAA,KAAA,CAAM,KAAA,EAAA;AAEN,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAA,GAAA,KAAO;AACvB,MAAA,YAAA,CAAa,KAAK,CAAA;AAGlB,MAAA,cAAA,CAAe;QACb,QAAA,EAAU,EAAA;QACV,MAAA,EAAQ,IAAA;AACR,QAAA,MAAA;AACA,QAAA,MAAA,EAAQ,MAAA,IAAU,MAAA,GAAS,IAAA,GAAO,EAAA,CAAA,GAAO,GAAA,CAAc,OAAA;AACvD,QAAA,SAAA;QACA,UAAA,EAAY,IAAA,CAAK,KAAA,GAAQ;OAC1B,CAAA;IACH,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,EAAM,MAAA,KAAW;AAClC,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,cAAA,CAAe;QACb,QAAA,EAAU,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,EAAA;QAC5C,MAAA,EAAQ,MAAA,KAAW,WAAW,iBAAA,GAAoB,IAAA,CAAA;AAClD,QAAA,MAAA;AACA,QAAA,MAAA;AACA,QAAA,SAAA;QACA,UAAA,EAAY,IAAA,CAAK,KAAA,GAAQ;OAC1B,CAAA;IACH,CAAC,CAAA;EACH,CAAC,CAAA;AACH;AC/RA,IAAM,cAAA,GAAiB,yBAAA;AA8ChB,SAAS,sBACd,IAAA,EACmB;AACnB,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,IAAOd,IAAAA,CAAK,IAAA,CAAK,WAAW,eAAe,CAAA;AAE5D,EAAA,MAAM,WAAW,CAAC,EAAA,KAAeA,KAAK,GAAA,EAAK,CAAA,EAAG,EAAE,CAAA,GAAA,CAAK,CAAA;AAErD,EAAA,OAAO;IACL,OAAA,EAAS,QAAA;IAET,MAAM,IAAA,CAAK,IAAI,IAAA,EAAM;AACnB,MAAA,MAAMiB,KAAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,SAAS,EAAE,CAAA;AACxB,MAAA,IAAIS,UAAAA,CAAW,IAAI,CAAA,EAAG;AACtB,MAAA,MAAM,SAAS,YAAA,CAAa;AAC1B,QAAA,EAAA;AACA,QAAA,KAAA,EAAO,IAAA,CAAK,KAAA;QACZ,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;QACpB,MAAA,EAAQ;OACT,CAAA;AACD,MAAA,MAAMR,SAAAA,CAAU,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AACtC,IAAA,CAAA;AAEA,IAAA,MAAM,UAAA,CAAW,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS;AAC3C,MAAA,MAAM,IAAA,GAAO,SAAS,EAAE,CAAA;AAGxB,MAAA,IAAI,CAACQ,UAAAA,CAAW,IAAI,CAAA,EAAG;AACrB,QAAA,MAAM,IAAA,CAAK,KAAK,EAAA,EAAI,EAAE,OAAO,OAAA,EAAS,WAAA,IAAe,WAAW,CAAA;AAClE,MAAA;AACA,MAAA,MAAM,QAAQ,UAAA,CAAW;AACvB,QAAA,IAAA;AACA,QAAA,EAAA,EAAI,OAAA,EAAS,EAAA,IAAA,iBAAM,IAAI,IAAA,IAAO,WAAA,EAAA;AAC9B,QAAA,WAAA,EAAa,OAAA,EAAS,WAAA;AACtB,QAAA;OACD,CAAA;AAGD,MAAA,MAAMR,SAAAA,CAAU,MAAM,KAAA,EAAO,EAAE,UAAU,MAAA,EAAQ,IAAA,EAAM,KAAK,CAAA;AAC9D,IAAA,CAAA;AAEA,IAAA,MAAM,KAAK,EAAA,EAAI;AACb,MAAA,MAAM,IAAA,GAAO,SAAS,EAAE,CAAA;AACxB,MAAA,MAAM,MAAA,GAAS,MAAMF,QAAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC1C,MAAA,OAAO,iBAAA,CAAkB,QAAQ,EAAE,CAAA;AACrC,IAAA,CAAA;AAEA,IAAA,MAAM,IAAA,GAAO;AACX,MAAA,IAAI,CAACU,UAAAA,CAAW,GAAG,CAAA,SAAU,EAAA;AAC7B,MAAA,MAAM,UAAU,MAAMF,OAAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC1D,MAAA,MAAM,MAAqD,EAAA;AAC3D,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,QAAA,IAAI,CAAC,MAAM,MAAA,EAAA,IAAY,CAAC,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AACpD,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAA;AACjC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAMR,QAAAA,CAAShB,IAAAA,CAAK,KAAK,KAAA,CAAM,IAAI,GAAG,MAAM,CAAA;AAC3D,UAAA,MAAM,EAAE,IAAA,EAAA,GAAS,iBAAA,CAAkB,QAAQ,EAAE,CAAA;AAC7C,UAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,CAAA;QACvB,CAAA,CAAA,MAAQ;AAER,QAAA;AACF,MAAA;AACA,MAAA,OAAO,GAAA;AACT,IAAA;AAAA,GAAA;AAEJ;AAIA,SAAS,aAAa,IAAA,EAAgC;AACpD,EAAA,OAAO;AACL,IAAA,KAAA;AACA,IAAA,CAAA,uBAAA,CAAA;AACA,IAAA,CAAA,IAAA,EAAO,KAAK,EAAE,CAAA,CAAA;AACd,IAAA,CAAA,OAAA,EAAU,KAAK,KAAK,CAAA,CAAA;AACpB,IAAA,CAAA,SAAA,EAAY,KAAK,OAAO,CAAA,CAAA;AACxB,IAAA,CAAA,QAAA,EAAW,KAAK,MAAM,CAAA,CAAA;AACtB,IAAA,KAAA;AACA,IAAA,EAAA;AACA,IAAA;AAAA,GAAA,CACA,KAAK,IAAI,CAAA;AACb;AAEA,SAAS,WAAW,IAAA,EAAgC;AAClD,EAAA,MAAM,UAAU,IAAA,CAAK,WAAA,GACjB,MAAM,IAAA,CAAK,IAAI,WAAM,IAAA,CAAK,EAAE,CAAA,EAAA,EAAK,IAAA,CAAK,WAAW,CAAA,CAAA,CAAA,GACjD,CAAA,GAAA,EAAM,KAAK,IAAI,CAAA,QAAA,EAAM,KAAK,EAAE,CAAA,CAAA;AAChC,EAAA,OAAO,GAAG,OAAO;;EAAO,IAAA,CAAK,OAAA,CAAQ,SAAS;;;AAChD;AASA,SAAS,iBAAA,CAAkB,QAAgB,UAAA,EAAwC;AACjF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,cAAc,CAAA;AACzC,EAAA,IAAI,IAAA,GAAyB;IAC3B,EAAA,EAAI,UAAA;IACJ,KAAA,EAAO,SAAA;IACP,OAAA,EAAS,EAAA;IACT,MAAA,EAAQ;AAAA,GAAA;AAEV,EAAA,IAAI,IAAA,GAAO,MAAA;AACX,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,CAAC,CAAA,IAAK,IAAI,UAAU,CAAA;AAClD,IAAA,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,CAAC,EAAE,MAAM,CAAA;AACrC,EAAA;AAEA,EAAA,MAAM,QAA4B,EAAA;AAGlC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,IAAI,OAAA,GAAmC,IAAA;AACvC,EAAA,IAAI,SAAmB,EAAA;AAEvB,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,OAAA,CAAQ,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,IAAA,EAAA;AACpC,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,MAAA,GAAS,EAAA;AACX,EAAA,CAAA;AAEA,EAAA,MAAM,SAAA,GACJ,kEAAA;AAEF,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAC9B,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,KAAA,EAAA;AACA,MAAA,OAAA,GAAU;AACR,QAAA,IAAA,EAAM,EAAE,CAAC,CAAA;QACT,EAAA,EAAI,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACZ,QAAA,WAAA,EAAa,EAAE,CAAC,CAAA;QAChB,OAAA,EAAS;AAAA,OAAA;AAEX,MAAA;AACF,IAAA;AACA,IAAA,IAAI,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC/B,EAAA;AACA,EAAA,KAAA,EAAA;AAEA,EAAA,OAAO,EAAE,MAAM,KAAA,EAAA;AACjB;AAEA,SAAS,gBAAA,CACP,KACA,UAAA,EACkB;AAClB,EAAA,MAAM,MAA8B,EAAA;AACpC,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,EAAE,IAAA,EAAA;AACjC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,EAAE,IAAA,EAAA;AACpC,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AACb,EAAA;AACA,EAAA,OAAO;AACL,IAAA,EAAA,EAAI,IAAI,EAAA,IAAM,UAAA;AACd,IAAA,KAAA,EAAO,IAAI,KAAA,IAAS,SAAA;AACpB,IAAA,OAAA,EAAS,IAAI,OAAA,IAAW,EAAA;IACxB,MAAA,EAAS,GAAA,CAAI,MAAA,KAAW,QAAA,GAAW,QAAA,GAAW;AAAA,GAAA;AAElD;AChKO,SAAS,mBAAA,GAAqC;AACnD,EAAA,MAAM,EAAA,GAAK,IAAI,YAAA,EAAA;AACf,EAAA,EAAA,CAAG,gBAAgB,EAAE,CAAA;AAErB,EAAA,OAAO;AACL,IAAA,EAAA,CAAG,MAAM,OAAA,EAAS;AAChB,MAAA,MAAM,OAAA,GAAU,CAAC,EAAA,KAAqB;AACpC,QAAA,IAAI,EAAA,CAAG,IAAA,KAAS,IAAA,EAAM,OAAA,CAAQ,EAAkD,CAAA;AAClF,MAAA,CAAA;AACA,MAAA,EAAA,CAAG,EAAA,CAAG,SAAS,OAAO,CAAA;AACtB,MAAA,OAAO,MAAM,EAAA,CAAG,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACtC,IAAA,CAAA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS;AACb,MAAA,EAAA,CAAG,EAAA,CAAG,SAAS,OAAO,CAAA;AACtB,MAAA,OAAO,MAAM,EAAA,CAAG,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AACtC,IAAA,CAAA;AACA,IAAA,IAAA,CAAK,EAAA,EAAI;AACP,MAAA,EAAA,CAAG,IAAA,CAAK,SAAS,EAAE,CAAA;AACrB,IAAA;AAAA,GAAA;AAEJ;ACpDA,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAC9B,EAAA,WAAA,CAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACd,EAAA;AACF,CAAA;AAEA,SAAS,WAAW,SAAA,EAA8C;AAChE,EAAA,MAAM,IAAA,GAAOQ,QAAQ,SAAS,CAAA;AAC9B,EAAA,OAAO,CAACM,MAAAA,KAAkB;AACxB,IAAA,IAAI,OAAOA,MAAAA,KAAU,QAAA,IAAYA,MAAAA,CAAM,WAAW,CAAA,EAAG;AACnD,MAAA,MAAM,IAAI,YAAY,iCAAiC,CAAA;AACzD,IAAA;AACA,IAAA,MAAM,SAAA,GAAYM,UAAAA,CAAWN,MAAK,CAAA,GAC9Ba,SAAAA,CAAUb,MAAK,CAAA,GACfa,SAAAA,CAAU3B,IAAAA,CAAK,IAAA,EAAMc,MAAK,CAAC,CAAA;AAC/B,IAAA,MAAM,GAAA,GAAMc,QAAAA,CAAS,IAAA,EAAM,SAAS,CAAA;AACpC,IAAA,IAAI,IAAI,UAAA,CAAW,IAAI,CAAA,IAAKR,UAAAA,CAAW,GAAG,CAAA,EAAG;AAC3C,MAAA,MAAM,IAAI,WAAA,CAAY,CAAA,6BAAA,EAAgCN,MAAK,CAAA,CAAA,CAAG,CAAA;AAChE,IAAA;AACA,IAAA,OAAO,SAAA;AACT,EAAA,CAAA;AACF;AAEA,SAAS,KAAK,KAAA,EAEZ;AACA,EAAA,OAAO;IACL,OAAA,EAAS;AACP,MAAA;QACE,IAAA,EAAM,MAAA;AACN,QAAA,IAAA,EAAM,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK;AAAA;AAChE;AACF,GAAA;AAEJ;AAEO,SAAS,eAAA,CACd,QACA,IAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AAExC,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,WAAA;AACA,IAAA,uCAAA;AACA,IAAA,EAAE,MAAMS,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,sCAAsC,CAAA,EAAA;IAClE,OAAO,EAAE,MAAA,KAAW;AAClB,MAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,MAAA,MAAM,GAAA,GAAM,MAAMP,QAAAA,CAAS,GAAG,CAAA;AAC9B,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,MAAM,CAAC,CAAA;AAClC,IAAA;AAAA,GAAA;AAGF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,YAAA;AACA,IAAA,0EAAA;AACA,IAAA;AACE,MAAA,IAAA,EAAMO,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,sCAAsC,CAAA;AAChE,MAAA,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,oBAAoB;AAAA,KAAA;IAEnD,OAAO,EAAE,IAAA,EAAM,OAAA,EAAA,KAAc;AAC3B,MAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,MAAA,MAAMN,MAAMlB,OAAAA,CAAQ,GAAG,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC7C,MAAA,MAAMmB,SAAAA,CAAU,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA;AACpC,MAAA,OAAO,KAAK,IAAI,CAAA;AAClB,IAAA;AAAA,GAAA;AAGF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,gBAAA;AACA,IAAA,oJAAA;AACA,IAAA;AACE,MAAA,IAAA,EAAMK,EACH,MAAA,EAAA,CACA,QAAA,EAAA,CACA,SAAS,4DAA4D;AAAA,KAAA;IAE1E,OAAO,EAAE,MAAA,KAAW;AAClB,MAAA,MAAM,MAAM,MAAA,CAAO,IAAA,IAAQ,KAAK,MAAA,GAAS,CAAA,GAAI,OAAO,GAAG,CAAA;AACvD,MAAA,MAAM,UAAU,MAAMC,OAAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC1D,MAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA;QAAI,CAAA,CAAA,KACxB,CAAA,CAAE,WAAA,EAAA,GAAgB,CAAA,OAAA,EAAU,EAAE,IAAI,CAAA,CAAA,GAAK,CAAA,OAAA,EAAU,CAAA,CAAE,IAAI,CAAA;AAAA,OAAA;AAEzD,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAC9B,IAAA;AAAA,GAAA;AAGF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,eAAA;AACA,IAAA,4CAAA;AACA,IAAA,EAAE,MAAMD,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,0BAA0B,CAAA,EAAA;IACtD,OAAO,EAAE,MAAA,KAAW;AAClB,MAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,MAAA,MAAM,IAAA,GAAO,MAAMX,IAAAA,CAAK,GAAG,CAAA;AAC3B,MAAA,OAAO,IAAA,CAAK;AACV,QAAA,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,IAAS,IAAA;AAC9B,QAAA,IAAA;QACA,IAAA,EAAM,IAAA,CAAK,WAAA,EAAA,GAAgB,WAAA,GAAc,MAAA;AACzC,QAAA,IAAA,EAAM,IAAA,CAAK,IAAA;QACX,QAAA,EAAU,IAAA,CAAK,MAAM,WAAA,EAAA;QACrB,OAAA,EAAS,IAAA,CAAK,UAAU,WAAA;OACzB,CAAA;AACH,IAAA;AAAA,GAAA;AAGF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,kBAAA;AACA,IAAA,kDAAA;AACA,IAAA,EAAE,MAAMW,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,oCAAoC,CAAA,EAAA;IAChE,OAAO,EAAE,MAAA,KAAW;AAClB,MAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,MAAA,MAAMN,KAAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACpC,MAAA,OAAO,KAAK,IAAI,CAAA;AAClB,IAAA;AAAA,GAAA;AAGF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,aAAA;AACA,IAAA,oDAAA;AACA,IAAA,EAAE,MAAMM,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,0BAA0B,CAAA,EAAA;IACtD,OAAO,EAAE,MAAA,KAAW;AAClB,MAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,MAAA,MAAMF,GAAG,GAAA,EAAK,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAC9C,MAAA,OAAO,KAAK,IAAI,CAAA;AAClB,IAAA;AAAA,GAAA;AAEJ;AZ5IO,IAAMQ,0BAAAA,GAA4B,CAAA;AA8BlC,IAAMC,mBAAAA,GAAqB,MAChCtB,OAAAA,CAAQP,OAAAA,IAAW,aAAa,CAAA;AAC3B,IAAM8B,oBAAAA,GAAsB,MACjCvB,OAAAA,CAAQsB,mBAAAA,IAAsB,iBAAiB,CAAA;AAK1C,SAASE,cAAalB,MAAAA,EAAuB;AAClD,EAAA,MAAM,OAAA,GAAUA,MAAAA,CAAM,IAAA,EAAA,CAAO,WAAA,EAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,OAAA,CACb,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAA,CAC5B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAGd,EAAA,OAAO,OAAA,IAAW,WAAA;AACpB;AAKA,eAAsBmB,qBAAAA,CACpB,IAAA,GAAeF,oBAAAA,EAAA,EACY;AAC3B,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAMjC,QAAAA,CAAG,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AACtC,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,IAAK,GAAA,CAA8B,SAAS,QAAA,EAAU;AACpD,MAAA,OAAO,EAAE,OAAA,EAAS+B,0BAAAA,EAA2B,UAAA,EAAY,EAAA,EAAC;AAC5D,IAAA;AACA,IAAA,MAAM,GAAA;AACR,EAAA;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACzB,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA;MACR,CAAA,YAAA,EAAe,IAAI,uBACjB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA,sCAAA;AAAA,KAAA;AAEJ,EAAA;AACA,EAAA,OAAOK,iBAAgB,MAAM,CAAA;AAC/B;AA0FO,SAASC,cAAAA,CACd,QACA,IAAA,EAC4B;AAC5B,EAAA,OAAO,MAAA,CAAO,WAAW,IAAA,CAAK,CAAA,MAAK,CAAA,CAAE,IAAA,KAASH,aAAAA,CAAa,IAAI,CAAC,CAAA;AAClE;AAIO,SAASI,oBACd,MAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAA,CAAO,WAAW,CAAC,CAAA;AAC9C,EAAA,OAAOD,eAAc,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAA,IAAK,MAAA,CAAO,WAAW,CAAC,CAAA;AACpE;AASA,SAASD,iBAAgB,MAAA,EAAmC;AAC1D,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,IAAA,OAAO,EAAE,OAAA,EAASL,0BAAAA,EAA2B,UAAA,EAAY,EAAA,EAAC;AAC5D,EAAA;AACA,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,MAAM,aAA+B,EAAA;AACrC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG;AACjC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,UAAA,EAAY;AAClC,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,IAAA,GAAO,OAAO,CAAA,CAAE,IAAA,KAAS,WAAWG,aAAAA,CAAa,CAAA,CAAE,IAAI,CAAA,GAAI,EAAA;AACjE,MAAA,MAAM,OAAO,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,EAAA;AACnD,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AACpB,MAAA,MAAM,OAAA,GACJ,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAA,iBAAU,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACzD,MAAA,MAAM,YAAY,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,GAAW,EAAE,SAAA,GAAY,OAAA;AAClE,MAAA,MAAM,EAAA,GAAqB,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,SAAA,EAAA;AAClD,MAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,YAAY,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ;AACjD,QAAA,EAAA,CAAG,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,IAAA,EAAA;AACrB,MAAA;AACA,MAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AACpB,IAAA;AACF,EAAA;AAGA,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAA;AAClB,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAC3C,EAAA,MAAM,SACJ,OAAO,GAAA,CAAI,WAAW,QAAA,IAAY,SAAA,CAAU,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,IAAI,MAAM,CAAA,GACtE,IAAI,MAAA,GACL,SAAA,CAAU,CAAC,CAAA,EAAG,IAAA;AACpB,EAAA,MAAM,GAAA,GAAwB;IAC5B,OAAA,EAASH,0BAAAA;IACT,UAAA,EAAY;AAAA,GAAA;AAEd,EAAA,IAAI,MAAA,KAAW,MAAA,EAAW,GAAA,CAAI,MAAA,GAAS,MAAA;AACvC,EAAA,OAAO,GAAA;AACT;AapLA,eAAsB,YAAA,CACpB,IAAA,GAA4B,EAAA,EACF;AAC1B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ5B,OAAAA,EAAAA;AAC1B,EAAA,MAAM,MAAuB,EAAA;AAC7B,EAAA,MAAM,SAAmB,EAAA;AACzB,EAAA,MAAM,QAAQ,GAAA,CAAI;IAChB,cAAA,CAAe,IAAA,EAAM,KAAK,MAAM,CAAA;IAChC,UAAA,CAAW,IAAA,EAAM,KAAK,MAAM,CAAA;AAC5B,IAAA,SAAA,CAAU,MAAM,GAAW,CAAA;AAC3B,IAAA,wBAAA,CAAyB,KAAK,MAAM;GACrC,CAAA;AAID,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAA;AACjB,EAAA,MAAM,QAAyB,EAAA;AAC/B,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,MAAM,GAAA,GAAM,GAAG,CAAA,CAAE,MAAM,IAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA;AAC5C,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACd,EAAA;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAGrB,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmB,CAAC,CAAA,CAAE,CAAA;AAC7D,EAAA;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC1B,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,CAAE,MAAA,SAAe,CAAA,CAAE,MAAA,CAAO,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA;AACjE,IAAA,IAAI,CAAA,CAAE,UAAU,CAAA,CAAE,KAAA,SAAc,CAAA,CAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA;AAC7D,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;EACpC,CAAC,CAAA;AACH;AAcA,eAAe,cAAA,CACb,IAAA,EACA,GAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAOU,OAAAA,CAAY,IAAA,EAAM,cAAc,CAAA;AAC7C,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAMb,QAAAA,CAAG,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AACtC,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,IAAK,GAAA,CAA8B,SAAS,QAAA,EAAU;AACtD,IAAA,MAAA,CAAO,KAAK,CAAA,kBAAA,EAAqB,IAAI,CAAA,QAAA,EAAO,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACnE,IAAA;AACF,EAAA;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACzB,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,MAAA,CAAO,KAAK,CAAA,wBAAA,EAA2B,IAAI,CAAA,QAAA,EAAO,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACzE,IAAA;AACF,EAAA;AACA,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AAC3C,EAAA,MAAM,IAAA,GAAO,MAAA;AACb,EAAA,MAAM,MAAM,IAAA,CAAK,UAAA;AACjB,EAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,IAAA,UAAA,CAAW;AACT,MAAA,GAAA;MACA,MAAA,EAAQ,aAAA;MACR,KAAA,EAAO,QAAA;MACP,GAAA,EAAK;KACN,CAAA;AACH,EAAA;AACA,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,EAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC5C,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,IAAI,CAAA,IAAK,MAAA,CAAO,OAAA;AACpC,MAAA;KAAA,EACC;AACD,MAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACvC,MAAA,MAAM,WAAY,IAAA,CAAiC,UAAA;AACnD,MAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC/C,MAAA,UAAA,CAAW;AACT,QAAA,GAAA;QACA,MAAA,EAAQ,aAAA;AACR,QAAA,KAAA,EAAO,WAAW,QAAQ,CAAA,CAAA;QAC1B,GAAA,EAAK;OACN,CAAA;AACH,IAAA;AACF,EAAA;AACF;AAKA,eAAe,UAAA,CACb,IAAA,EACA,GAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAOa,OAAAA,CAAY,IAAA,EAAM,SAAA,EAAW,UAAU,CAAA;AACpD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAMb,QAAAA,CAAG,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AACtC,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,IAAK,GAAA,CAA8B,SAAS,QAAA,EAAU;AACtD,IAAA,MAAA,CAAO,KAAK,CAAA,aAAA,EAAgB,IAAI,CAAA,QAAA,EAAO,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAC9D,IAAA;AACF,EAAA;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACzB,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,MAAA,CAAO,KAAK,CAAA,mBAAA,EAAsB,IAAI,CAAA,QAAA,EAAO,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACpE,IAAA;AACF,EAAA;AACA,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AAC3C,EAAA,MAAM,IAAA,GAAO,MAAA;AACb,EAAA,MAAM,MAAM,IAAA,CAAK,UAAA;AACjB,EAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,IAAA,UAAA,CAAW;AACT,MAAA,GAAA;MACA,MAAA,EAAQ,QAAA;MACR,KAAA,EAAO,QAAA;AACP,MAAA;KACD,CAAA;AACH,EAAA;AACF;AAOA,eAAe,SAAA,CACb,IAAA,EACA,GAAA,EACA,MAAA,EACe;AAEf,EAAA,MAAM,IAAA,GAAOa,OAAAA,CAAY,IAAA,EAAM,SAAA,EAAW,SAAS,aAAa,CAAA;AAChE,EAAA,IAAI;AACF,IAAA,MAAMb,QAAAA,CAAG,OAAO,IAAI,CAAA;EACtB,CAAA,CAAA,MAAQ;AACN,IAAA;AACF,EAAA;AAKA,EAAA,GAAA,CAAI,IAAA,CAAK;IACP,EAAA,EAAI,wBAAA;IACJ,MAAA,EAAQ,OAAA;IACR,KAAA,EAAO,QAAA;IACP,IAAA,EAAM,yBAAA;IACN,IAAA,EAAM,SAAA;IACN,SAAA,EACE;GAEH,CAAA;AACH;AASA,eAAe,wBAAA,CACb,KACA,MAAA,EACe;AACf,EAAA,IAAI,aAA+B,EAAA;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMmC,qBAAAA,EAAA;AAClB,IAAA,UAAA,GAAa,GAAA,CAAI,UAAA;AACnB,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,+BAAA,EAA8B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACjE,IAAA;AACF,EAAA;AAIA,EAAA,MAAM,OAAA,CAAQ,GAAA;IACZ,UAAA,CAAW,GAAA,CAAI,OAAM,EAAA,KAAM;AACzB,MAAA,MAAM,UAAA,GAAa;QACjBtB,OAAAA,CAAY,EAAA,CAAG,MAAM,WAAW,CAAA;QAChCA,OAAAA,CAAY,EAAA,CAAG,IAAA,EAAM,SAAA,EAAW,UAAU,CAAA;QAC1CA,OAAAA,CAAY,EAAA,CAAG,IAAA,EAAM,SAAA,EAAW,UAAU;AAAA,OAAA;AAE5C,MAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI;AACF,UAAA,GAAA,GAAM,MAAMb,QAAAA,CAAG,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AACtC,QAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,UAAA,IAAK,GAAA,CAA8B,SAAS,QAAA,EAAU;AACtD,UAAA,MAAA,CAAO,IAAA;AACL,YAAA,CAAA,UAAA,EAAa,GAAG,IAAI,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,EAAO,IAAc,OAAO,CAAA;AAAA,WAAA;AAEhE,UAAA;AACF,QAAA;AACA,QAAA,IAAI,MAAA;AACJ,QAAA,IAAI;AACF,UAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACzB,QAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,UAAA,MAAA,CAAO,IAAA;AACL,YAAA,CAAA,UAAA,EAAa,GAAG,IAAI,CAAA,aAAA,EAAgB,IAAI,CAAA,QAAA,EAAO,IAAc,OAAO,CAAA;AAAA,WAAA;AAEtE,UAAA;AACF,QAAA;AACA,QAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AAC3C,QAAA,MAAM,MAAO,MAAA,CAAmC,UAAA;AAChD,QAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACrC,QAAA,UAAA,CAAW;AACT,UAAA,GAAA;UACA,MAAA,EAAQ,WAAA;UACR,KAAA,EAAO,CAAA,UAAA,EAAa,GAAG,IAAI,CAAA,CAAA;AAC3B,UAAA;SACD,CAAA;AACH,MAAA;IACF,CAAC;AAAA,GAAA;AAEL;AAEA,SAAS,WAAW,IAAA,EAKX;AACP,EAAA,KAAA,MAAW,CAAC,MAAM,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG;AAClD,IAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACrC,IAAA,MAAM,KAAA,GAAQ,GAAA;AACd,IAAA,MAAM,EAAA,GAAK,GAAG,IAAA,CAAK,MAAM,IAAI,IAAA,CAAK,KAAK,IAAI,IAAI,CAAA,CAAA;AAC/C,IAAA,MAAM,WAAW,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,IAAA;AAC/D,IAAA,MAAM,MAAM,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,GAAW,MAAM,GAAA,GAAM,MAAA;AACxD,IAAA,MAAM,UAAU,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GAAW,MAAM,OAAA,GAAU,MAAA;AACpE,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,KAAA,IAAS,aAAa,OAAA,EAAS;AACrE,MAAA,IAAA,GAAO,QAAA;AACT,IAAA,CAAA,MAAA,IAAW,GAAA,EAAK;AACd,MAAA,IAAA,GAAO,MAAA;AACT,IAAA,CAAA,MAAA,IAAW,OAAA,EAAS;AAClB,MAAA,IAAA,GAAO,OAAA;IACT,CAAA,MAAO;AACL,MAAA,IAAA,GAAO,SAAA;AACT,IAAA;AACA,IAAA,MAAM,CAAA,GAAmB;AACvB,MAAA,EAAA;AACA,MAAA,MAAA,EAAQ,IAAA,CAAK,MAAA;AACb,MAAA,KAAA,EAAO,IAAA,CAAK,KAAA;AACZ,MAAA,IAAA;AACA,MAAA;AAAA,KAAA;AAEF,IAAA,IAAI,OAAA,KAAY,MAAA,EAAW,CAAA,CAAE,OAAA,GAAU,OAAA;AACvC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AAC7B,MAAA,CAAA,CAAE,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,MAAM,QAAQ,CAAA;AACtE,IAAA;AACA,IAAA,IAAI,KAAA,CAAM,GAAA,IAAO,OAAO,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC9C,MAAA,CAAA,CAAE,GAAA,GAAM,eAAA,CAAgB,KAAA,CAAM,GAAG,CAAA;AACnC,IAAA;AACA,IAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,CAAA,CAAE,GAAA,GAAM,GAAA;AAC/B,IAAA,IAAI,KAAA,CAAM,OAAA,IAAW,OAAO,KAAA,CAAM,YAAY,QAAA,EAAU;AACtD,MAAA,CAAA,CAAE,OAAA,GAAU,eAAA,CAAgB,KAAA,CAAM,OAAO,CAAA;AAC3C,IAAA;AACA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,CAAA,CAAE,SAAA,GACA,2EAAA;AACJ,IAAA;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AACjB,EAAA;AACF;AAEA,SAAS,gBACP,GAAA,EACwB;AACxB,EAAA,MAAM,MAA8B,EAAA;AACpC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAC3B,SAAA,IAAA,CAAA,IAAK,IAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAI,OAAO,CAAC,CAAA;AACvC,EAAA;AACA,EAAA,OAAO,GAAA;AACT;ACnUO,IAAM,qBAAqB,MAChCa,OAAAA,CAAYV,OAAAA,EAAAA,EAAW,eAAe,oBAAoB,CAAA;AAErD,IAAM,qBAAA,GAAwB,CAAA;AAcrC,IAAM,KAAA,GAA4B;EAChC,OAAA,EAAS,qBAAA;AACT,EAAA,OAAA,EAAS;AACX,CAAA;AAEA,eAAsB,gBAAA,CACpB,IAAA,GAAe,kBAAA,EAAA,EACc;AAC7B,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAMH,QAAAA,CAAG,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AACtC,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,IAAK,GAAA,CAA8B,IAAA,KAAS,QAAA,EAAU,OAAO,KAAA;AAC7D,IAAA,MAAM,GAAA;AACR,EAAA;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACzB,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAI,KAAA;MACR,CAAA,YAAA,EAAe,IAAI,uBACjB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA,0BAAA;AAAA,KAAA;AAEJ,EAAA;AACA,EAAA,OAAO6B,WAAU,MAAM,CAAA;AACzB;AAEA,eAAsB,gBAAA,CACpB,MAAA,EACA,IAAA,GAAe,kBAAA,EAAA,EACA;AACf,EAAA,MAAM7B,QAAAA,CAAG,MAAMC,OAAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACjD,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,QAAQ,GAAG,CAAA,CAAA;AACtC,EAAA,MAAMD,QAAAA,CAAG,SAAA,CAAU,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,MAAM,CAAA;AACtE,EAAA,MAAMA,QAAAA,CAAG,MAAA,CAAO,GAAA,EAAK,IAAI,CAAA;AAC3B;AAOO,SAAS,SAAA,CACd,QACAgB,MAAAA,EACoB;AACpB,EAAA,MAAM,SAASA,MAAAA,CAAM,KAAA,IAASA,MAAAA,CAAM,QAAA,CAAS,MAAM,IAAA,EAAA;AACnD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAC7D,EAAA;AACA,EAAA,MAAM,OAAA,GAAA,iBAAU,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AAC3B,EAAA,MAAM,IAAA,GAAyB;AAC7B,IAAA,EAAA,EAAIA,OAAM,QAAA,CAAS,EAAA;AACnB,IAAA,KAAA;AACA,IAAA,OAAA;AACA,IAAA,QAAA,EAAUA,MAAAA,CAAM;AAAA,GAAA;AAElB,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAK,CAAA,CAAE,EAAA,KAAOA,MAAAA,CAAM,QAAA,CAAS,EAAE,CAAA;AACpE,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,CAAC,GAAG,MAAA,EAAQ,IAAI,CAAA,EAAA;AAC/C;AAEO,SAAS,YAAA,CACd,QACA,EAAA,EACoB;AACpB,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAA;AACrE;AASA,SAASa,WAAU,MAAA,EAAqC;AACtD,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,UAAU,OAAO,KAAA;AAClD,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,MAAM,UAA8B,EAAA;AACpC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9B,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,OAAA,EAAS;AAC/B,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,MAAM,KAAK,OAAO,CAAA,CAAE,EAAA,KAAO,QAAA,GAAW,EAAE,EAAA,GAAK,EAAA;AAC7C,MAAA,MAAM,QAAQ,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,GAAQ,EAAA;AACtD,MAAA,MAAM,OAAA,GACJ,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAA,iBAAU,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACzD,MAAA,MAAM,WAAW,CAAA,CAAE,QAAA;AACnB,MAAA,IAAI,CAAC,EAAA,IAAM,CAAC,QAAA,EAAU;AACtB,MAAA,OAAA,CAAQ,KAAK,EAAE,EAAA,EAAI,KAAA,EAAO,OAAA,EAAS,UAAU,CAAA;AAC/C,IAAA;AACF,EAAA;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,qBAAA,EAAuB,OAAA,EAAA;AAC3C;ACzFO,SAAS,oBAAA,CACd,QACA,IAAA,EACM;AACN,EAAA,MAAM,EAAE,QAAA,EAAU,mBAAA,EAAqB,iBAAA,EAAmB,UAAA,GAAa,IAAA;AACvE,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,KAAe,IAAA;AAGvC,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,qBAAA;AACA,IAAA,gYAAA;AAMA,IAAA;AACE,MAAA,OAAA,EAASJ,CAAAA,CACN,MAAA,EAAA,CACA,GAAA,CAAI,CAAC,CAAA,CACL,QAAA;AACC,QAAA;AAAA,OAAA;AAGJ,MAAA,aAAA,EAAeA,CAAAA,CACZ,MAAA,EAAA,CACA,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA,OAAA;AAGJ,MAAA,GAAA,EAAKA,CAAAA,CACF,MAAA,EAAA,CACA,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA,OAAA;AAEJ,MAAA,MAAA,EAAQA,CAAAA,CACL,MAAA,EAAA,CACA,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA,OAAA;AAGJ,MAAA,KAAA,EAAOA,CAAAA,CACJ,MAAA,EAAA,CACA,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA;AAEF,KAAA;AAEJ,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EACE;AAAA;AAGJ,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AAIA,MAAA,IAAI,MAAMA,MAAAA,CAAM,GAAA;AAChB,MAAA,IAAI,YAAA,GAAeA,OAAM,aAAA,IAAiB,SAAA;AAC1C,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAMmB,qBAAAA,EAAA;AACrB,UAAA,MAAM,EAAA,GAAKnB,OAAM,aAAA,GACbqB,cAAAA,CAAc,QAAQrB,MAAAA,CAAM,aAAa,CAAA,GACzCsB,mBAAAA,CAAmB,MAAM,CAAA;AAC7B,UAAA,IAAI,EAAA,EAAI;AACN,YAAA,GAAA,GAAM,EAAA,CAAG,IAAA;AACT,YAAA,YAAA,GAAe,EAAA,CAAG,IAAA;AACpB,UAAA;QACF,CAAA,CAAA,MAAQ;AAER,QAAA;AACF,MAAA;AACA,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EACE;AAAA;AAGJ,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoBtB,MAAAA,CAAM,OAAO,CAAA;AACxD,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EAAM,CAAA,8BAAA,EAAiCA,OAAM,OAAO,CAAA,qDAAA;AAAA;AACtD,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,IAAI;AACF,QAAA,MAAM,eAAe,MAAM,QAAA,CAAS,YAAA,CAAa,EAAE,KAAK,CAAA;AACxD,QAAA,MAAM,IAAA,GAAO,SAAS,UAAA,CAAW;UAC/B,aAAA,EAAe,YAAA;AACf,UAAA,GAAA;AACA,UAAA,YAAA;AACA,UAAA,WAAA,EAAaA,MAAAA,CAAM,OAAA;AACnB,UAAA,GAAIA,OAAM,MAAA,GAAS,EAAE,eAAeA,MAAAA,CAAM,MAAA,KAAW,EAAA;AACrD,UAAA,GAAIA,OAAM,KAAA,GAAQ,EAAE,OAAOA,MAAAA,CAAM,KAAA,KAAU,EAAA;AAC3C,UAAA,GAAI,SAAS,cAAA,GACT,EAAE,gBAAgB,QAAA,CAAS,cAAA,KAC3B;SACL,CAAA;AACD,QAAA,OAAO;UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,SAAA;AAEnE,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;AACN,cAAA,IAAA,EAAM,4CACJ,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA;AAAA;AACF,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACF,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,sBAAA;AACA,IAAA,yRAAA;AAIA,IAAA;AACE,MAAA,SAAA,EAAWS,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,6CAA6C,CAAA;AAC5E,MAAA,MAAA,EAAQA,EAAE,MAAA,EAAA,CAAS,IAAI,CAAC,CAAA,CAAE,SAAS,kCAAkC;AAAA,KAAA;AAEvE,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,IAAI;AAMF,QAAA,KAAK,QAAA,CAAS,WAAWA,MAAAA,CAAM,SAAA,EAAWA,OAAM,MAAM,CAAA,CAAE,MAAM,MAAM;QAEpE,CAAC,CAAA;AACD,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;AACN,cAAA,IAAA,EAAM,IAAA,CAAK,SAAA;AACT,gBAAA,EAAE,IAAI,IAAA,EAAM,SAAA,EAAWA,MAAAA,CAAM,SAAA,EAAW,QAAQ,IAAA,EAAA;AAChD,gBAAA,IAAA;AACA,gBAAA;AAAA;AACF;AACF;AACF,SAAA;AAEJ,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;AACN,cAAA,IAAA,EAAM,yBAAyB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACjF,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACF,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,eAAA;AACA,IAAA,qZAAA;AAMA,IAAA;MACE,IAAA,EAAMS,CAAAA,CACH,IAAA,CAAK,CAAC,UAAA,EAAY,WAAA,EAAa,WAAW,KAAK,CAAC,CAAA,CAChD,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA,OAAA;AAIJ,MAAA,SAAA,EAAWA,EACR,OAAA,EAAA,CACA,QAAA,EAAA,CACA,SAAS,2DAA2D,CAAA;AACvE,MAAA,MAAA,EAAQA,CAAAA,CACL,IAAA,CAAK,CAAC,UAAA,EAAY,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,OAAO,CAAC,CAAA,CACzD,QAAA,EAAA,CACA,SAAS,+CAA+C;AAAA,KAAA;AAE7D,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,IAAI,IAAA,GAAO,SAAS,IAAA,EAAA;AACpB,MAAA,IAAIA,MAAAA,CAAM,IAAA,IAAQA,MAAAA,CAAM,IAAA,KAAS,KAAA,EAAO;AACtC,QAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAA,MAAK,CAAA,CAAE,IAAA,KAASA,OAAM,IAAI,CAAA;AAC/C,MAAA;AACA,MAAA,IAAIA,OAAM,MAAA,EAAQ;AAChB,QAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAA,MAAK,CAAA,CAAE,MAAA,KAAWA,OAAM,MAAM,CAAA;AACnD,MAAA,CAAA,MAAA,IAAWA,OAAM,SAAA,EAAW;AAC1B,QAAA,IAAA,GAAO,IAAA,CAAK,MAAA;AACV,UAAA,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,EAAE,MAAA,KAAW;AAAA,SAAA;AAEhD,MAAA;AACA,MAAA,OAAO;QACL,OAAA,EAAS;UACP,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,IAAA,EAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAE;AACpE,OAAA;AAEJ,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,qBAAA;AACA,IAAA,kNAAA;AAGA,IAAA;AACE,MAAA,SAAA,EAAWS,EACR,OAAA,EAAA,CACA,QAAA,EAAA,CACA,SAAS,wDAAwD;AAAA,KAAA;AAEtE,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,MAAM,GAAA,GAAM,SAAS,IAAA,EAAA;AACrB,MAAA,MAAM,QAAA,GAAWA,MAAAA,CAAM,SAAA,GACnB,GAAA,CAAI,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,MAAA,KAAW,UAAU,CAAA,GACjE,GAAA;AACJ,MAAA,OAAO;QACL,OAAA,EAAS;AACP,UAAA;YACE,IAAA,EAAM,MAAA;AACN,YAAA,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,UAAU,QAAA,EAAA,EAAY,MAAM,CAAC;AAAA;AACtD;AACF,OAAA;AAEJ,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,0BAAA;AACA,IAAA,+LAAA;AAGA,IAAA;AACE,MAAA,SAAA,EAAWS,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,aAAa,CAAA;AAC5C,MAAA,KAAA,EAAOA,CAAAA,CACJ,MAAA,EAAA,CACA,GAAA,GACA,GAAA,CAAI,CAAC,CAAA,CACL,GAAA,CAAI,GAAG,CAAA,CACP,QAAA,EAAA,CACA,SAAS,2CAA2C;AAAA,KAAA;AAEzD,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAIA,MAAAA,CAAM,SAAS,CAAA;AACzC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,CAAA,sCAAA,EAAyCA,MAAAA,CAAM,SAAS,CAAA,CAAA,CAAA;AAAI,WAAA;UAEpF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AAGA,MAAA,MAAM,KAAA,GAAQA,OAAM,KAAA,IAAS,EAAA;AAC7B,MAAA,MAAM,QAAkB,EAAA;AACxB,MAAA,MAAM,QAAQ,QAAA,CAAS,MAAA,CAAOA,OAAM,SAAA,EAAW,CAAC,MAAM,OAAA,KAAY;AAChE,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;MACjB,CAAC,CAAA;AACD,MAAA,IAAI,OAAO,KAAA,EAAA;AACX,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAC,KAAK,CAAA;AAC/B,MAAA,OAAO;QACL,OAAA,EAAS;AACP,UAAA;YACE,IAAA,EAAM,MAAA;AACN,YAAA,IAAA,EAAM,IAAA,CAAK,SAAA;AACT,cAAA;AACE,gBAAA,SAAA,EAAWA,MAAAA,CAAM,SAAA;AACjB,gBAAA,MAAA,EAAQ,IAAA,CAAK,MAAA;AACb,gBAAA,YAAA,EAAc,IAAA,CAAK,YAAA;gBACnB,KAAA,EAAO;AAAA,eAAA;AAET,cAAA,IAAA;AACA,cAAA;AAAA;AACF;AACF;AACF,OAAA;AAEJ,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,eAAA;AACA,IAAA,iTAAA;IAKA,EAAA;IACA,YAAY;AACV,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EACE;AAAA;AAGJ,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,EAAA;AACvB,QAAA,OAAO;AACL,UAAA,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAA,EAAY,IAAA,EAAM,CAAC,GAAG;AAAA,SAAA;AAE3E,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;AACN,cAAA,IAAA,EAAM,yBAAyB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACjF,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACF,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,sBAAA;AACA,IAAA,iWAAA;IAKA,EAAA;IACA,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,YAAA,EAAA;AACnB,QAAA,OAAO;AACL,UAAA,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAA,EAAQ,IAAA,EAAM,CAAC,GAAG;AAAA,SAAA;AAEvE,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;AACN,cAAA,IAAA,EAAM,gCAAgC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACxF,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACF,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,oBAAA;AACA,IAAA,iRAAA;IAIA,EAAA;IACA,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,EAAA;AACrB,QAAA,OAAO;UACL,OAAA,EAAS;YACP,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAE;AACxD,SAAA;AAEJ,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;AACN,cAAA,IAAA,EAAM,8BAA8B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACtF,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACF,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,YAAA;AACA,IAAA,qRAAA;AAKA,IAAA;AACE,MAAA,WAAA,EAAaS,CAAAA,CACV,MAAA,EAAA,CACA,GAAA,CAAI,CAAC,CAAA,CACL,QAAA;AACC,QAAA;AAAA,OAAA;AAGJ,MAAA,KAAA,EAAOA,CAAAA,CACJ,MAAA,EAAA,CACA,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA;AACF,KAAA;AAEJ,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,YAAA,EAAA;AACzB,QAAA,MAAM,QAAA,GAAW,WAAW,IAAA,CAAK,CAAA,MAAK,CAAA,CAAE,EAAA,KAAOA,OAAM,WAAW,CAAA;AAChE,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAO;YACL,OAAA,EAAS;AACP,cAAA;gBACE,IAAA,EAAM,MAAA;gBACN,IAAA,EAAM,CAAA,4BAAA,EAA+BA,OAAM,WAAW,CAAA,4DAAA;AAAA;AACxD,aAAA;YAEF,OAAA,EAAS;AAAA,WAAA;AAEb,QAAA;AACA,QAAA,MAAM,GAAA,GAAM,MAAM,gBAAA,EAAA;AAClB,QAAA,MAAM,IAAA,GAAO,UAAU,GAAA,EAAK;AAC1B,UAAA,QAAA;AACA,UAAA,GAAIA,OAAM,KAAA,GAAQ,EAAE,OAAOA,MAAAA,CAAM,KAAA,KAAU;SAC5C,CAAA;AACD,QAAA,MAAM,iBAAiB,IAAI,CAAA;AAC3B,QAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,QAAA,CAAS,EAAE,CAAA;AACzD,QAAA,OAAO;UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,SAAA;AAEpE,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;AACN,cAAA,IAAA,EAAM,sBAAsB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AAC9E,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACF,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,qBAAA;AACA,IAAA,gIAAA;AAEA,IAAA;AACE,MAAA,EAAA,EAAIS,CAAAA,CACD,MAAA,EAAA,CACA,GAAA,CAAI,CAAC,CAAA,CACL,QAAA;AACC,QAAA;AAAA;AACF,KAAA;AAEJ,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,gBAAA,EAAA;AAClB,QAAA,IAAI,CAAC,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAK,CAAA,CAAE,EAAA,KAAOA,MAAAA,CAAM,EAAE,CAAA,EAAG;AAC7C,UAAA,OAAO;YACL,OAAA,EAAS;AACP,cAAA;gBACE,IAAA,EAAM,MAAA;gBACN,IAAA,EAAM,CAAA,yBAAA,EAA4BA,OAAM,EAAE,CAAA,gEAAA;AAAA;AAC5C,aAAA;YAEF,OAAA,EAAS;AAAA,WAAA;AAEb,QAAA;AACA,QAAA,MAAM,gBAAA,CAAiB,YAAA,CAAa,GAAA,EAAKA,MAAAA,CAAM,EAAE,CAAC,CAAA;AAClD,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,UAAU,EAAE,EAAA,EAAI,IAAA,EAAM,EAAA,EAAIA,MAAAA,CAAM,EAAA,EAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAE;AAC5E,SAAA;AAEJ,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;AACN,cAAA,IAAA,EAAM,+BAA+B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACvF,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACF,IAAA;AAAA,GAAA;AAQF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,qBAAA;AACA,IAAA,uUAAA;IAKA,EAAA;IACA,YAAY;AACV,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EACE;AAAA;AAEJ,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,WAAA,EAAA;AAC/B,QAAA,OAAO;UACL,OAAA,EAAS;YACP,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,OAAA,EAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAAE;AACtE,SAAA;AAEJ,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;AACN,cAAA,IAAA,EAAM,+BAA+B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACvF,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACF,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,yBAAA;AACA,IAAA,iXAAA;AAMA,IAAA;AACE,MAAA,KAAA,EAAOS,CAAAA,CACJ,MAAA,EAAA,CACA,GAAA,CAAI,CAAC,CAAA,CACL,QAAA;AACC,QAAA;AAAA;AAEF,KAAA;AAEJ,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EAAM;AAAA;AACR,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,SAAA,CAAUA,OAAM,KAAK,CAAA;AAChD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;AACN,cAAA,IAAA,EAAM,CAAA,yBAAA,EAA4BA,MAAAA,CAAM,KAAK,CAAA,GAAA,EAAM,IAAI,KAAK,CAAA;AAAA;AAC9D,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,OAAO;QACL,OAAA,EAAS;AACP,UAAA,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,UAAU,EAAE,KAAA,EAAOA,MAAAA,CAAM,KAAA,EAAO,OAAO,GAAA,CAAI,KAAA,EAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAE;AAC1F,OAAA;AAEJ,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,mBAAA;AACA,IAAA,sWAAA;AAMA,IAAA;AACE,MAAA,KAAA,EAAOS,EAAE,MAAA,EAAA,CAAS,IAAI,CAAC,CAAA,CAAE,SAAS,qBAAqB,CAAA;AACvD,MAAA,QAAA,EAAUA,CAAAA,CACP,MAAA,EAAA,CACA,GAAA,CAAI,CAAC,CAAA,CACL,QAAA;AACC,QAAA;AAAA,OAAA;MAGJ,IAAA,EAAMA,CAAAA,CACH,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAA,EAAUA,EAAE,OAAA,EAAS,CAAA,CAC9B,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA;AAEF,KAAA;AAEJ,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EAAM;AAAA;AACR,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,QAAA;QACzBA,MAAAA,CAAM,KAAA;QACNA,MAAAA,CAAM,QAAA;AACNA,QAAAA,MAAAA,CAAM,QAAQ;AAAC,OAAA;AAEjB,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EAAM,CAAA,mBAAA,EAAsBA,OAAM,KAAK,CAAA,EAAA,EAAKA,OAAM,QAAQ,CAAA,EAAA,EAAK,IAAI,KAAK,CAAA;AAAA;AAC1E,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AAIA,MAAA,OAAO,GAAA,CAAI,MAAA;AAIb,IAAA;AAAA,GAAA;AAIF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,oBAAA;AACA,IAAA,uKAAA;AAGA,IAAA;AACE,MAAA,SAAA,EAAWS,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,aAAa;AAAA,KAAA;AAE9C,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,IAAA,CAAKA,MAAAA,CAAM,SAAS,CAAA;AACxC,MAAA,OAAO;QACL,OAAA,EAAS;AACP,UAAA;YACE,IAAA,EAAM,MAAA;YACN,IAAA,EAAM,IAAA,CAAK,UAAU,EAAE,EAAA,EAAI,WAAWA,MAAAA,CAAM,SAAA,EAAA,EAAa,IAAA,EAAM,CAAC;AAAA;AAClE;AACF,OAAA;AAEJ,IAAA;AAAA,GAAA;AAWF,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,MAGpB;IACJ,OAAA,EAAS;AACP,MAAA;QACE,IAAA,EAAM,MAAA;AACN,QAAA,IAAA,EACE,GAAG,QAAQ,CAAA,+LAAA;AAAA;AAGf,KAAA;IAEF,OAAA,EAAS;AAAA,GAAA,CAAA;AAGX,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,wBAAA;AACA,IAAA,yUAAA;AAKA,IAAA;MACE,IAAA,EAAMS,CAAAA,CACH,MAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,GAAA,CAAI,CAAC,CAAA,CACL,QAAA;AACC,QAAA;AAAA,OAAA;AAGJ,MAAA,aAAA,EAAeA,CAAAA,CACZ,MAAA,EAAA,CACA,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA,OAAA;AAGJ,MAAA,GAAA,EAAKA,EACF,MAAA,EAAA,CACA,QAAA,EAAA,CACA,SAAS,sDAAsD,CAAA;AAClE,MAAA,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAA,CAAS,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAA,CAAW,SAAS,2BAA2B,CAAA;AACtF,MAAA,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAA,CAAS,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAA,CAAW,SAAS,2BAA2B,CAAA;AACtF,MAAA,IAAA,EAAMA,CAAAA,CACH,MAAA,EAAA,CACA,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA,OAAA;AAGJ,MAAA,KAAA,EAAOA,CAAAA,CACJ,MAAA,EAAA,CACA,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA;AACF,KAAA;AAEJ,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,IAAI,CAAC,UAAA,EAAY,OAAO,gBAAA,CAAiB,wBAAwB,CAAA;AACjE,MAAA,IAAI,MAAMA,MAAAA,CAAM,GAAA;AAChB,MAAA,IAAI,YAAA,GAAeA,OAAM,aAAA,IAAiB,SAAA;AAC1C,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAMmB,qBAAAA,EAAA;AACrB,UAAA,MAAM,EAAA,GAAKnB,OAAM,aAAA,GACbqB,cAAAA,CAAc,QAAQrB,MAAAA,CAAM,aAAa,CAAA,GACzCsB,mBAAAA,CAAmB,MAAM,CAAA;AAC7B,UAAA,IAAI,EAAA,EAAI;AACN,YAAA,GAAA,GAAM,EAAA,CAAG,IAAA;AACT,YAAA,YAAA,GAAe,EAAA,CAAG,IAAA;AACpB,UAAA;QACF,CAAA,CAAA,MAAQ;AAER,QAAA;AACF,MAAA;AACA,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EACE;AAAA;AAEJ,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,SAAS,QAAA,CAAS;AAC7B,UAAA,IAAA,EAAMtB,MAAAA,CAAM,IAAA;AACZ,UAAA,GAAA;UACA,aAAA,EAAe,YAAA;AACf,UAAA,IAAA,EAAMA,OAAM,IAAA,IAAQ,EAAA;AACpB,UAAA,IAAA,EAAMA,OAAM,IAAA,IAAQ,EAAA;AACpB,UAAA,GAAIA,OAAM,IAAA,GAAO,EAAE,MAAMA,MAAAA,CAAM,IAAA,KAAS,EAAA;AACxC,UAAA,GAAIA,OAAM,KAAA,GAAQ,EAAE,OAAOA,MAAAA,CAAM,KAAA,KAAU;SAC5C,CAAA;AACD,QAAA,OAAO;UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG;AAAA,SAAA;AAEnE,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;AACN,cAAA,IAAA,EAAM,2BAA2B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACnF,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACF,IAAA;AAAA,GAAA;AAGF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,sBAAA;AACA,IAAA,2NAAA;AAGA,IAAA;AACE,MAAA,SAAA,EAAWS,CAAAA,CACR,MAAA,EAAA,CACA,QAAA,CAAS,iDAAiD,CAAA;AAC7D,MAAA,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAA,CAAS,QAAA,CAAS,+CAA+C;AAAA,KAAA;AAE3E,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,IAAI,CAAC,UAAA,EAAY,OAAO,gBAAA,CAAiB,sBAAsB,CAAA;AAC/D,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,cAAA,CAAeA,MAAAA,CAAM,SAAS,CAAA;AACpD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EAAM,CAAA,kCAAA,EAAqCA,OAAM,SAAS,CAAA,CAAA;AAAA;AAC5D,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,MAAM,KAAK,QAAA,CAAS,kBAAA,CAAmB,IAAA,CAAK,EAAA,EAAIA,OAAM,IAAI,CAAA;AAC1D,MAAA,OAAO;QACL,OAAA,EAAS;AACP,UAAA;YACE,IAAA,EAAM,MAAA;YACN,IAAA,EAAM,IAAA,CAAK,UAAU,EAAE,EAAA,EAAI,WAAW,IAAA,CAAK,EAAA,EAAA,EAAM,IAAA,EAAM,CAAC;AAAA;AAC1D,SAAA;AAEF,QAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAE,SAAS,IAAA;AAAc,OAAA;AAE3C,IAAA;AAAA,GAAA;AAGF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,sBAAA;AACA,IAAA,sNAAA;AAGA,IAAA;AACE,MAAA,SAAA,EAAWS,CAAAA,CACR,MAAA,EAAA,CACA,QAAA,CAAS,iDAAiD,CAAA;AAC7D,MAAA,SAAA,EAAWA,CAAAA,CACR,MAAA,EAAA,CACA,GAAA,GACA,GAAA,CAAI,CAAC,CAAA,CACL,GAAA,CAAI,KAAK,IAAI,CAAA,CACb,QAAA,EAAA,CACA,SAAS,+DAA+D;AAAA,KAAA;AAE7E,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,IAAI,CAAC,UAAA,EAAY,OAAO,gBAAA,CAAiB,sBAAsB,CAAA;AAC/D,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,cAAA,CAAeA,MAAAA,CAAM,SAAS,CAAA;AACpD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EAAM,CAAA,kCAAA,EAAqCA,OAAM,SAAS,CAAA,CAAA;AAAA;AAC5D,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,MAAM,MAAM,QAAA,CAAS,kBAAA;QACnB,IAAA,CAAK,EAAA;QACLA,MAAAA,CAAM;AAAA,OAAA;AAER,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EAAM,CAAA,+BAAA,EAAkC,KAAK,EAAE,CAAA,cAAA;AAAA;AACjD,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,OAAO;QACL,OAAA,EAAS;AACP,UAAA;YACE,IAAA,EAAM,MAAA;AACN,YAAA,IAAA,EAAM,IAAA,CAAK,SAAA;AACT,cAAA;AACE,gBAAA,SAAA,EAAW,IAAA,CAAK,EAAA;AAChB,gBAAA,MAAA,EAAQ,IAAA,CAAK,MAAA;AACb,gBAAA,KAAA,EAAO,GAAA,CAAI,UAAA;gBACX,GAAA,EAAK,GAAA,CAAI,SAAS,QAAQ;AAAA,eAAA;AAE5B,cAAA,IAAA;AACA,cAAA;AAAA;AACF;AACF;AACF,OAAA;AAEJ,IAAA;AAAA,GAAA;AAGF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,uBAAA;AACA,IAAA,yKAAA;AAGA,IAAA;AACE,MAAA,SAAA,EAAWS,CAAAA,CACR,MAAA,EAAA,CACA,QAAA,CAAS,iDAAiD;AAAA,KAAA;AAE/D,IAAA,OAAMT,MAAAA,KAAS;AACb,MAAA,IAAI,CAAC,UAAA,EAAY,OAAO,gBAAA,CAAiB,uBAAuB,CAAA;AAChE,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,cAAA,CAAeA,MAAAA,CAAM,SAAS,CAAA;AACpD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO;UACL,OAAA,EAAS;AACP,YAAA;cACE,IAAA,EAAM,MAAA;cACN,IAAA,EAAM,CAAA,mCAAA,EAAsCA,OAAM,SAAS,CAAA,CAAA;AAAA;AAC7D,WAAA;UAEF,OAAA,EAAS;AAAA,SAAA;AAEb,MAAA;AACA,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA;AAChC,MAAA,OAAO;QACL,OAAA,EAAS;AACP,UAAA;YACE,IAAA,EAAM,MAAA;YACN,IAAA,EAAM,IAAA,CAAK,UAAU,EAAE,EAAA,EAAI,WAAW,IAAA,CAAK,EAAA,EAAA,EAAM,IAAA,EAAM,CAAC;AAAA;AAC1D;AACF,OAAA;AAEJ,IAAA;AAAA,GAAA;AAEJ;ACx8BO,SAAS,eAAe,IAAA,EAA+C;AAC5E,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,cAAA;AAClC,EAAA,MAAM,IAAA,GAAOd,IAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,KAAQ,0BAAU,IAAA,EAAA,CAAA;AAEnC,EAAA,IAAI,KAAA,GAA+B,IAAA;AACnC,EAAA,IAAI,cAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,eAAe,IAAA,GAAwC;AACrD,IAAA,IAAI,CAAC0B,UAAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AAC9B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAMV,QAAAA,CAAS,IAAA,EAAM,MAAM,CAAA;IACtC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAM,MAAA,GAASM,OAAO,MAAM,CAAA;AAC5B,IAAA,MAAM,KAAK,MAAA,CAAO,IAAA;AAClB,IAAA,MAAM,QAAQ,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,GAAW,GAAG,KAAA,GAAQ,IAAA;AACxD,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,UAAU,EAAA,CAAG,OAAA,KAAY,SAAY,IAAA,GAAO,OAAA,CAAQ,GAAG,OAAO,CAAA;AACpE,IAAA,MAAM,WAAW,OAAO,EAAA,CAAG,KAAA,KAAU,QAAA,GAAW,GAAG,KAAA,GAAQ,KAAA;AAC3D,IAAA,MAAM,OAAA,GAAU,cAAc,QAAQ,CAAA;AACtC,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,MAAM,uBACJ,OAAO,EAAA,CAAG,YAAA,KAAiB,QAAA,GACvB,GAAG,YAAA,GACH,kBAAA;AACN,IAAA,OAAO;AACL,MAAA,KAAA;AACA,MAAA,OAAA;AACA,MAAA,OAAA;AACA,MAAA,oBAAA;MACA,IAAA,EAAM,MAAA,CAAO,QAAQ,IAAA;AAAK,KAAA;AAE9B,EAAA;AAEA,EAAA,eAAe,IAAA,GAAsB;AACnC,IAAA,IAAI,MAAA,EAAQ;AACZ,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,YAAA,EAAc;AAC3C,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAM,IAAA,EAAA;AACjB,MAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,OAAA,EAAS;AACxB,MAAA,OAAA,GAAU,EAAA,CAAG,KAAA;AACb,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,UAAA,CAAW,GAAG,KAAK,CAAA;AAC5C,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK;UACf,IAAA,EAAM,iBAAA;UACN,EAAA,EAAI,GAAA,GAAM,WAAA,EAAA;AACV,UAAA,KAAA,EAAO,EAAA,CAAG,KAAA;UACV,KAAA,EAAO,CAAA,YAAA,EAAe,GAAG,KAAK,CAAA,gBAAA;SAC/B,CAAA;AACD,QAAA;AACF,MAAA;AACA,MAAA,IAAI,CAAC,GAAG,IAAA,EAAM;AACZ,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK;UACf,IAAA,EAAM,iBAAA;UACN,EAAA,EAAI,GAAA,GAAM,WAAA,EAAA;AACV,UAAA,KAAA,EAAO,EAAA,CAAG,KAAA;UACV,KAAA,EAAO;SACR,CAAA;AACD,QAAA;AACF,MAAA;AAEA,MAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,EAAA,CAAG,oBAAA,EAAsB,KAAK,CAAA;AACpE,MAAA,MAAM,IAAA,CAAK,cAAc,IAAA,CAAK,cAAA,EAAgB,EAAE,KAAA,EAAO,EAAA,CAAG,OAAO,CAAA;AAEjE,MAAA,MAAM,YAAY,GAAA,EAAA;AAClB,MAAA,MAAM,KAAK,aAAA,CAAc,UAAA;AACvB,QAAA,cAAA;AACA,QAAA,MAAA;QACA,EAAA,CAAG,IAAA;AACH,QAAA,EAAE,EAAA,EAAI,SAAA,CAAU,WAAA,EAAA,EAAe,aAAa,WAAA;AAAY,OAAA;AAE1D,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK;QACf,IAAA,EAAM,oBAAA;AACN,QAAA,EAAA,EAAI,UAAU,WAAA,EAAA;AACd,QAAA,cAAA;QACA,IAAA,EAAM,MAAA;QACN,cAAA,EAAgB,OAAA,CAAQ,GAAG,IAAI;OAChC,CAAA;AAED,MAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAA;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,QAAA,CAAS,GAAG,IAAI,CAAA;AAC1C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAA,GAAQ,EAAA;AAEhC,MAAA,MAAM,aAAa,GAAA,EAAA;AACnB,MAAA,MAAM,KAAK,aAAA,CAAc,UAAA;AACvB,QAAA,cAAA;AACA,QAAA,WAAA;QACA,KAAA,CAAM,IAAA;AACN,QAAA,EAAE,IAAI,UAAA,CAAW,WAAA,EAAA,EAAe,WAAA,EAAa,GAAG,KAAA;AAAM,OAAA;AAExD,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK;QACf,IAAA,EAAM,oBAAA;AACN,QAAA,EAAA,EAAI,WAAW,WAAA,EAAA;AACf,QAAA,cAAA;QACA,IAAA,EAAM,WAAA;QACN,cAAA,EAAgB,OAAA,CAAQ,MAAM,IAAI;OACnC,CAAA;AACD,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK;QACf,IAAA,EAAM,iBAAA;AACN,QAAA,EAAA,EAAI,WAAW,WAAA,EAAA;AACf,QAAA,KAAA,EAAO,EAAA,CAAG,KAAA;AACV,QAAA,cAAA;AACA,QAAA,MAAA,EAAQ,EAAA,CAAG,IAAA;AACX,QAAA,KAAA,EAAO,KAAA,CAAM,IAAA;AACb,QAAA;OACD,CAAA;AAGD,MAAA,IAAI,cAAA,KAAmB,IAAA,IAAQ,cAAA,KAAmB,EAAA,CAAG,OAAA,EAAS;AAC5D,QAAA,UAAA,CAAW,GAAG,OAAO,CAAA;AACvB,MAAA;AACF,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK;QACf,IAAA,EAAM,iBAAA;QACN,EAAA,EAAI,GAAA,GAAM,WAAA,EAAA;QACV,KAAA,EAAO,OAAA;AACP,QAAA,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;OACvD,CAAA;IACH,CAAA,SAAA;AACE,MAAA,MAAA,GAAS,KAAA;AACX,IAAA;AACF,EAAA;AAEA,EAAA,SAAS,WAAW,OAAA,EAAuB;AACzC,IAAA,IAAI,KAAA,gBAAqB,KAAK,CAAA;AAC9B,IAAA,cAAA,GAAiB,OAAA;AACjB,IAAA,KAAA,GAAQ,YAAY,MAAM;AACxB,MAAA,KAAK,IAAA,EAAA;AACP,IAAA,CAAA,EAAG,OAAO,CAAA;AACZ,EAAA;AAEA,EAAA,OAAO;IACL,KAAA,GAAQ;AACN,MAAA,IAAI,KAAA,EAAO;AAGX,MAAA,KAAK,IAAA,EAAA,CAAO,IAAA,CAAK,CAAC,EAAA,KAAO;AACvB,QAAA,MAAM,OAAA,GAAU,IAAI,OAAA,IAAW,GAAA;AAC/B,QAAA,UAAA,CAAW,OAAO,CAAA;MACpB,CAAC,CAAA;AACH,IAAA,CAAA;IACA,IAAA,GAAO;AACL,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,KAAA,GAAQ,IAAA;AACR,QAAA,cAAA,GAAiB,IAAA;AACnB,MAAA;AACF,IAAA,CAAA;AACA,IAAA,MAAM,OAAA,GAAU;AACd,MAAA,MAAM,IAAA,EAAA;AACR,IAAA;AAAA,GAAA;AAEJ;AAIA,IAAM,WAAA,GAAc,qBAAA;AAOb,SAAS,cAAcR,MAAAA,EAA8B;AAC1D,EAAA,MAAM,OAAA,GAAUA,OAAM,IAAA,EAAA;AACtB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA;AACvC,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AACzB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,IAAK,GAAG,OAAO,IAAA;AAC1C,EAAA,QAAQ,KAAA,CAAM,CAAC,CAAA;IACb,KAAK,GAAA;AACH,MAAA,OAAO,CAAA,GAAI,GAAA;IACb,KAAK,GAAA;AACH,MAAA,OAAO,CAAA,GAAI,GAAA;IACb,KAAK,GAAA;AACH,MAAA,OAAO,CAAA,GAAI,IAAA;IACb,KAAK,GAAA;AACH,MAAA,OAAO,CAAA,GAAI,KAAA;AACb,IAAA;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAMA,SAAS,cAAA,CAAe,UAAkB,IAAA,EAAoB;AAC5D,EAAA,MAAM,OAAO,IAAA,CAAK,WAAA,EAAA,CAAc,KAAA,CAAM,GAAG,EAAE,CAAA;AAC3C,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AAC3C;AAEA,SAAS,OAAA,CAAQJ,KAAAA,EAAc,GAAA,GAAM,GAAA,EAAa;AAChD,EAAA,MAAM,OAAOA,KAAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAA;AACvC,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,IAAA;AAC5D;ACzNA,IAAM,uBAAA,GAA6C;AACjD,EAAA,oBAAA;AACA,EAAA,oBAAA;AACA,EAAA;AACF,CAAA;AAoJA,eAAsB,gBACpB,IAAA,EACkC;AAClC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAA;AACvB,EAAA,MAAM,UAAA,GAAyB,IAAA,CAAK,IAAA,IAAQ,EAAE,MAAM,MAAA,EAAA;AACpD,EAAA,MAAM,WAAW,MACf,OAAO,UAAA,KAAe,UAAA,GAAa,YAAA,GAAe,UAAA;AA6BpD,EAAA,SAAS,WAAW,GAAA,EAA+B;AACjD,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,aAAA,IAAiB,EAAA;AACzC,IAAA,MAAM,WAAA,GACJ,IAAA,KAAS,WAAA,IAAe,IAAA,KAAS,SAAS,IAAA,KAAS,kBAAA;AACrD,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AAGzB,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,iBAAiB,CAAA,EAAG,OAAO,KAAA;AAC3C,IAAA,OAAO,IAAA;AACT,EAAA;AAEA,EAAA,SAAS,SAAA,CAAU,KAAsB,GAAA,EAA8B;AACrE,IAAA,MAAM,OAAO,QAAA,EAAA;AACb,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ,OAAO,IAAA;AACjC,IAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,IAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ,aAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AACrC,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,MAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAC,CAAA;AACjD,MAAA,OAAO,KAAA;AACT,IAAA;AACA,IAAA,OAAO,IAAA;AACT,EAAA;AAuBA,EAAA,SAAS,mBAAmB,GAAA,EAAgD;AAC1E,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA;AAGxB,IAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ,aAAA;AAC3B,IAAA,MAAM,QAAA,GAAW,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA;AACrC,IAAA,IAAI,MAAA,KAAW,UAAU,OAAO,IAAA;AAGhC,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,IAAO,EAAA;AAC1B,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACxB,MAAA,MAAM,EAAA,GAAK,IAAI,eAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,OAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AACpE,MAAA,MAAM,OAAA,GAAU,EAAA,CAAG,GAAA,CAAI,OAAO,CAAA;AAC9B,MAAA,IAAI,OAAA,IAAW,OAAA,KAAY,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA;AAChD,IAAA;AAGA,IAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAQ,MAAA;AAC3B,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,aAAA,CAAc,MAAM,GAAG,OAAO,IAAA;AAEhE,IAAA,OAAO,SAAS,KAAA,GAAQ,SAAA;AAC1B,EAAA;AAEA,EAAA,SAAS,cAAc,MAAA,EAAyB;AAO9C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,GACb,IAAA,CAAK,kBAAkB,EAAA,GACxB,CAAC,GAAG,uBAAA,EAAyB,GAAI,IAAA,CAAK,cAAA,IAAkB,EAAG,CAAA;AAC/D,IAAA,KAAA,MAAW,WAAW,IAAA,EAAM;AAC1B,MAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,IAAA;AAE/B,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,QAAA,IAAI,WAAW,MAAA,IAAU,MAAA,CAAO,WAAW,MAAA,GAAS,GAAG,GAAG,OAAO,IAAA;AACnE,MAAA;AACF,IAAA;AACA,IAAA,OAAO,KAAA;AACT,EAAA;AAEA,EAAA,SAAS,yBAAA,CACP,GAAA,EACA,GAAA,EACA,IAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,IAAU,IAAA;AACrC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,GAClB,IAAA,CAAK,kBAAkB,EAAA,GACxB,CAAC,GAAG,uBAAA,EAAyB,GAAI,IAAA,CAAK,cAAA,IAAkB,EAAG,CAAA;AAC/D,IAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,IAAA,MAAM,OAAA,GACJ,SAAS,SAAA,GACL,MAAA,GACE,WAAW,MAAM,CAAA,wHAAA,EAC+C,MAAM,CAAA,kHAAA,CAAA,GAEtE,CAAA,8LAAA,CAAA,GAGF,CAAA,4HAAA,CAAA;AAEN,IAAA,GAAA,CAAI,GAAA;AACF,MAAA,IAAA,CAAK,SAAA,CAAU;QACb,KAAA,EAAO,uBAAA;AACP,QAAA,OAAA;;;QAGA,cAAA,EAAgB,MAAA;QAChB,cAAA,EAAgB,SAAA;;QAEhB,kBAAA,EAAoB,OAAO,GAAA,CAAI,OAAA,CAAQ,aAAA,KAAkB;OAC1D;AAAA,KAAA;AAEL,EAAA;AAQA,EAAA,SAAS,uBAAA,CAAwB,QAAgB,IAAA,EAAuB;AACtE,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,WAAW,GAAG,OAAO,KAAA;AAC1C,IAAA,IAAI,WAAW,MAAA,IAAU,MAAA,KAAW,YAAY,MAAA,KAAW,KAAA,IAAS,WAAW,OAAA,EAAS;AACtF,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,OAAO,KAAA;AACT,EAAA;AAEA,EAAA,eAAe,SAAA,CAAU,KAAsB,GAAA,EAAoC;AACjF,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,EAAK,GAAG,CAAA,EAAG;AAI1B,IAAA,MAAM2B,OAAAA,GAAS,MAAM,IAAA,CAAK,gBAAA,EAAA;AAC1B,IAAA,MAAM,SAAA,GAAY,IAAI,6BAAA,CAA8B;MAClD,kBAAA,EAAoB;KACrB,CAAA;AAGD,IAAA,MAAM,iBAAA,GAAoB,SAAA;AAC1B,IAAA,IAAI,aAAc,SAAA,EAAsB;AACtC,MAAA,iBAAA,CAAkB,SAAS,CAAA,GAAI,CAAC,GAAA,KAAiB;AAC/C,QAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,GAAG,CAAA;AAC9C,MAAA,CAAA;AACF,IAAA;AAEA,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM;AACpB,MAAA,KAAK,UAAU,KAAA,EAAA;AACf,MAAA,KAAKA,QAAO,KAAA,EAAA;IACd,CAAC,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAMA,OAAAA,CAAO,QAAQ,SAAS,CAAA;AAC9B,MAAA,MAAM,SAAA,CAAU,aAAA,CAAc,GAAA,EAAK,GAAG,CAAA;AACxC,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,GAAG,CAAA;AAC/C,MAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AACpB,QAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,QAAA,GAAA,CAAI,GAAA;AACF,UAAA,IAAA,CAAK,SAAA,CAAU;YACb,KAAA,EAAO,sBAAA;AACP,YAAA,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;WACzD;AAAA,SAAA;AAEL,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA,SAAS,YAAA,CAAa,MAAuB,GAAA,EAA2B;AACtE,IAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,IAAA,GAAA,CAAI,GAAA;AACF,MAAA,IAAA,CAAK,SAAA,CAAU;QACb,MAAA,EAAQ,IAAA;AACR,QAAA,SAAA,EAAW,KAAK,IAAA,CAAK,SAAA;AACrB,QAAA,UAAA,EAAY,KAAK,IAAA,CAAK,UAAA;QACtB,QAAA,EAAU,IAAA,CAAK,KAAA,GAAQ;OACxB;AAAA,KAAA;AAEL,EAAA;AAEA,EAAA,SAAS,YAAA,CAAa,KAAsB,GAAA,EAA2B;AACrE,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,EAAK,GAAG,CAAA,EAAG;AAC1B,IAAA,GAAA,CAAI,UAAU,GAAA,EAAK;MACjB,cAAA,EAAgB,mBAAA;MAChB,eAAA,EAAiB,wBAAA;MACjB,UAAA,EAAY;KACb,CAAA;AACD,IAAA,GAAA,CAAI,KAAA,CAAM,CAAA;;AAAiB,CAAA,CAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAC,EAAA,KAAqB;AAClD,MAAA,GAAA,CAAI,KAAA,CAAM,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC;;AAAM,CAAA,CAAA;IAC7C,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,GAAG,CAAA;AACrB,EAAA;AAEA,EAAA,eAAe,uBAAA,CACb,KACA,GAAA,EACe;AACf,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,EAAK,GAAG,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA,CAAc,IAAA,EAAA;AACtC,IAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,IAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAC9B,EAAA;AAEA,EAAA,eAAe,qBAAA,CACb,GAAA,EACA,GAAA,EACA,EAAA,EACe;AACf,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,EAAK,GAAG,CAAA,EAAG;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA,CAAc,KAAK,EAAE,CAAA;AAC7C,MAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAC9B,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,MAAA,GAAA,CAAI,GAAA;AACF,QAAA,IAAA,CAAK,SAAA,CAAU;UACb,KAAA,EAAO,WAAA;AACP,UAAA,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;SACzD;AAAA,OAAA;AAEL,IAAA;AACF,EAAA;AAEA,EAAA,eAAe,mBAAA,CACb,KACA,GAAA,EACe;AACf,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,EAAK,GAAG,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAA,CAAK,UAAU,OAAA,EAAA;AACrB,IAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,IAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAC,CAAA;AAC7C,EAAA;AA2BA,EAAA,eAAe,gBAAA,CACb,GAAA,EACA,GAAA,EACA,GAAA,EACe;AACf,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,EAAgB,IAAA,KAAwB;AACrD,MAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AAC5D,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAC9B,IAAA,CAAA;AACA,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,CAAgB,GAAA,CAAI,SAAS,GAAG,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,IAAI,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,IAAI,EAAE,CAAA;AACvF,IAAA,MAAM,GAAA,GAAM,EAAA,CAAG,GAAA,CAAI,KAAK,CAAA;AACxB,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,GAAA,CAAI,MAAM,CAAA;AAC7B,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,OAAA,EAAS;AACpB,MAAA,KAAA,CAAM,GAAA,EAAK,EAAE,KAAA,EAAO,qBAAA,EAAuB,CAAA;AAC3C,MAAA;AACF,IAAA;AACA,IAAA,IAAI,CAACjB,UAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,MAAA,KAAA,CAAM,GAAA,EAAK,EAAE,KAAA,EAAO,kBAAA,EAAoB,CAAA;AACxC,MAAA;AACF,IAAA;AAIA,IAAA,MAAM,WAAW,OAAA,CACd,OAAA,CAAQ,SAAA,EAAW,GAAG,EACtB,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA,CACrB,QAAQ,MAAA,EAAQ,EAAE,CAAA,CAClB,KAAA,CAAM,GAAG,GAAG,CAAA;AACf,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,KAAA,CAAM,GAAA,EAAK,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA;AACpC,MAAA;AACF,IAAA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAMR,IAAAA,CAAK,GAAG,CAAA;AACzB,MAAA,IAAI,CAAC,EAAA,CAAG,WAAA,EAAA,EAAe;AACrB,QAAA,KAAA,CAAM,GAAA,EAAK,EAAE,KAAA,EAAO,qBAAA,EAAuB,CAAA;AAC3C,QAAA;AACF,MAAA;IACF,CAAA,CAAA,MAAQ;AACN,MAAA,KAAA,CAAM,GAAA,EAAK,EAAE,KAAA,EAAO,eAAA,EAAiB,CAAA;AACrC,MAAA;AACF,IAAA;AACA,IAAA,MAAM,GAAA,GAAMZ,IAAAA,CAAK,GAAA,EAAK,yBAAyB,CAAA;AAC/C,IAAA,MAAM,MAAA,GAASW,OAAAA,CAAY,GAAA,EAAK,QAAQ,CAAA;AAGxC,IAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAWA,OAAAA,CAAY,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,GAAI,EAAA,GAAK,GAAA,CAAI,CAAA,EAAG;AACzE,MAAA,KAAA,CAAM,GAAA,EAAK,EAAE,KAAA,EAAO,wBAAA,EAA0B,CAAA;AAC9C,MAAA;AACF,IAAA;AACA,IAAA,MAAM,SAAA,GAAY,KAAK,IAAA,GAAO,IAAA;AAC9B,IAAA,MAAM,SAAmB,EAAA;AACzB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,WAAA,EAAa,UAAA,KAAe;AACnD,MAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAA,KAAA,KAAS;AACtB,QAAA,IAAI,OAAA,EAAS;AACb,QAAA,MAAM,GAAA,GAAM,KAAA;AACZ,QAAA,KAAA,IAAS,GAAA,CAAI,MAAA;AACb,QAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,KAAA,CAAM,KAAK,EAAE,KAAA,EAAO,gBAAA,EAAkB,QAAA,EAAU,WAAW,CAAA;AAC3D,UAAA,UAAA,CAAW,IAAI,KAAA,CAAM,WAAW,CAAC,CAAA;AACjC,UAAA;AACF,QAAA;AACA,QAAA,MAAA,CAAO,KAAK,GAAG,CAAA;MACjB,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,QAAA,IAAI,CAAC,SAAS,WAAA,EAAA;MAChB,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,GAAG,OAAA,EAAS,CAAA,GAAA,KAAO,UAAA,CAAW,GAAG,CAAC,CAAA;IACxC,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACxB,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,IAAI;AACF,MAAA,MAAMM,KAAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACpC,MAAA,MAAMC,SAAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAC7C,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAC3C,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,KAAA,CAAM,GAAA,EAAK;QACT,KAAA,EAAO,cAAA;AACP,QAAA,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;OACzD,CAAA;AACH,IAAA;AACF,EAAA;AAcA,EAAA,SAAS,SAAA,CAAU,KAAsB,GAAA,EAA2B;AAClE,IAAA,MAAM,MAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,MAAA,IAAiC,GAAA;AAC7D,IAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,MAAM,CAAA;AACnD,IAAA,GAAA,CAAI,SAAA,CAAU,QAAQ,QAAQ,CAAA;AAC9B,IAAA,GAAA,CAAI,SAAA,CAAU,oCAAoC,MAAM,CAAA;AACxD,IAAA,GAAA,CAAI,SAAA;AACF,MAAA,8BAAA;MACA,GAAA,CAAI,OAAA,CAAQ,gCAAgC,CAAA,IAC1C;AAAA,KAAA;AAEJ,IAAA,GAAA,CAAI,SAAA;AACF,MAAA,8BAAA;AACA,MAAA;AAAA,KAAA;AAEF,IAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,wCAAwC,CAAA,KAAM,MAAA,EAAQ;AACpE,MAAA,GAAA,CAAI,SAAA,CAAU,wCAAwC,MAAM,CAAA;AAC9D,IAAA;AACF,EAAA;AAEA,EAAA,MAAM,MAAA,GAAiB,YAAA,CAAa,CAAC,GAAA,EAAK,GAAA,KAAQ;AAChD,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,IAAO,GAAA;AACvB,QAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAKlC,QAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AAClC,UAAA,IAAA,CAAK,OAAO,IAAA,CAAK;YACf,IAAA,EAAM,YAAA;YACN,EAAA,EAAA,iBAAI,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACf,YAAA,IAAA,EAAM,aAAa,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAG,SAAS,GAAA,CAAI,OAAA,CAAQ,IAAA,IAAQ,GAAG,QAAQ,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,iBAAiB,CAAC,CAAC,CAAA;WACnH,CAAA;AACH,QAAA;AAEA,QAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAClB,QAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,UAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,UAAA,GAAA,CAAI,GAAA,EAAA;AACJ,UAAA;AACF,QAAA;AAEA,QAAA,IAAI,IAAA,KAAS,SAAA,IAAa,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AAC9C,UAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AACrB,UAAA;AACF,QAAA;AACA,QAAA,IAAI,IAAA,KAAS,SAAA,IAAa,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AAC9C,UAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AACrB,UAAA;AACF,QAAA;AACA,QAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,UAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,UAAA;AACF,QAAA;AACA,QAAA,IAAI,IAAA,KAAS,gBAAA,IAAoB,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AACrD,UAAA,MAAM,uBAAA,CAAwB,KAAK,GAAG,CAAA;AACtC,UAAA;AACF,QAAA;AACA,QAAA,IAAI,KAAK,UAAA,CAAW,iBAAiB,CAAA,IAAK,GAAA,CAAI,WAAW,KAAA,EAAO;AAC9D,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,iBAAA,CAAkB,MAAM,CAAA;AAC9C,UAAA,MAAM,qBAAA,CAAsB,GAAA,EAAK,GAAA,EAAK,EAAE,CAAA;AACxC,UAAA;AACF,QAAA;AACA,QAAA,IAAI,IAAA,KAAS,iBAAA,IAAqB,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AACvD,UAAA,MAAM,mBAAA,CAAoB,KAAK,GAAG,CAAA;AAClC,UAAA;AACF,QAAA;AAEA,QAAA,IAAI,IAAA,KAAS,eAAA,IAAmB,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AAGrD,UAAA,MAAM,IAAA,GAAO,mBAAmB,GAAG,CAAA;AACnC,UAAA,IAAI,SAAS,IAAA,EAAM;AACjB,YAAA,yBAAA,CAA0B,GAAA,EAAK,KAAK,IAAI,CAAA;AACxC,YAAA;AACF,UAAA;AACA,UAAA,MAAM,gBAAA,CAAiB,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AACpC,UAAA;AACF,QAAA;AAMA,QAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AACjD,UAAA,IAAI,uBAAA,CAAwB,GAAA,CAAI,MAAA,IAAU,KAAA,EAAO,IAAI,CAAA,EAAG;AACtD,YAAA,MAAM,IAAA,GAAO,mBAAmB,GAAG,CAAA;AACnC,YAAA,IAAI,SAAS,IAAA,EAAM;AACjB,cAAA,yBAAA,CAA0B,GAAA,EAAK,KAAK,IAAI,CAAA;AACxC,cAAA;AACF,YAAA;AACF,UAAA;AACA,UAAA,MAAM,UAAU,MAAM,cAAA;AACpB,YAAA,GAAA;AACA,YAAA,GAAA;AACA,YAAA,IAAA;YACA,IAAA,CAAK,QAAA;YACL,IAAA,CAAK,mBAAA;AACL,YAAA,IAAA,CAAK,UAAA,KAAe;AAAA,WAAA;AAEtB,UAAA,IAAI,OAAA,EAAS;AACf,QAAA;AAEA,QAAA,IAAI,IAAA,KAAS,aAAA,IAAiB,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AAKlD,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAMe,qBAAAA,EAAA;AACrB,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAChC,UAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,GAAA;AACF,cAAA,IAAA,CAAK,SAAA,CAAU;gBACb,KAAA,EAAO,wBAAA;AACP,gBAAA,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;eACzD;AAAA,aAAA;AAEL,UAAA;AACA,UAAA;AACF,QAAA;AAEA,QAAA,IAAI,IAAA,KAAS,eAAA,IAAmB,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AACpD,UAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,EAAA;AACrB,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,UAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC9B,UAAA;AACF,QAAA;AACA,QAAA,IAAI,IAAA,KAAS,eAAA,IAAmB,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AACrD,UAAA,MAAM,IAAA,GAAQ,MAAM,YAAA,CAAa,GAAG,CAAA;AAIpC,UAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,CAAK,gBAAgB,QAAA,EAAU;AACjD,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,qBAAA,EAAuB,CAAC,CAAA;AACxD,YAAA;AACF,UAAA;AACA,UAAA,MAAM,UAAA,GAAa,MAAM,YAAA,EAAA;AACzB,UAAA,MAAM,QAAA,GAAW,WAAW,IAAA,CAAK,CAAA,MAAK,CAAA,CAAE,EAAA,KAAO,KAAK,WAAW,CAAA;AAC/D,UAAA,IAAI,CAAC,QAAA,EAAU;AACb,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,GAAA;AACF,cAAA,IAAA,CAAK,SAAA,CAAU;gBACb,KAAA,EAAO,0BAAA;AACP,gBAAA,WAAA,EAAa,IAAA,CAAK;eACnB;AAAA,aAAA;AAEH,YAAA;AACF,UAAA;AACA,UAAA,MAAM,GAAA,GAAM,MAAM,gBAAA,EAAA;AAClB,UAAA,MAAM,IAAA,GAAO,UAAU,GAAA,EAAK;AAC1B,YAAA,QAAA;AACA,YAAA,GAAI,KAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAU;WAC1C,CAAA;AACD,UAAA,MAAM,iBAAiB,IAAI,CAAA;AAC3B,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,UAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,QAAA,CAAS,EAAE,CAAC,CAAC,CAAA;AACpE,UAAA;AACF,QAAA;AACA,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA;AACxD,QAAA,IAAI,WAAA,IAAe,GAAA,CAAI,MAAA,KAAW,QAAA,EAAU;AAG1C,UAAA,MAAM,EAAA,GAAK,kBAAA,CAAmB,WAAA,CAAY,CAAC,KAAK,EAAE,CAAA;AAClD,UAAA,MAAM,GAAA,GAAM,MAAM,gBAAA,EAAA;AAClB,UAAA,IAAI,CAAC,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAG;AACvC,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,GAAA,CAAI,KAAK,SAAA,CAAU,EAAE,OAAO,kBAAA,EAAoB,EAAA,EAAI,CAAC,CAAA;AACzD,YAAA;AACF,UAAA;AACA,UAAA,MAAM,gBAAA,CAAiB,YAAA,CAAa,GAAA,EAAK,EAAE,CAAC,CAAA;AAC5C,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,UAAA,GAAA,CAAI,GAAA,CAAI,KAAK,SAAA,CAAU,EAAE,IAAI,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA;AACxC,UAAA;AACF,QAAA;AAEA,QAAA,IAAI,IAAA,KAAS,kBAAA,IAAsB,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AAIvD,UAAA,IAAI;AACF,YAAA,MAAM,IAAA,GAAO,MAAM,YAAA,EAAA;AACnB,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,CAAC,CAAA;AAClC,UAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,GAAA;AACF,cAAA,IAAA,CAAK,SAAA,CAAU;gBACb,KAAA,EAAO,kBAAA;AACP,gBAAA,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;eACzD;AAAA,aAAA;AAEL,UAAA;AACA,UAAA;AACF,QAAA;AAMA,QAAA,IAAI,IAAA,KAAS,oBAAA,IAAwB,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AACzD,UAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,0BAAA,EAA4B,CAAC,CAAA;AAC7D,YAAA;AACF,UAAA;AACA,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,EAAA;AACpC,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,CAAC,CAAA;AACrC,UAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,GAAA;AACF,cAAA,IAAA,CAAK,SAAA,CAAU;gBACb,KAAA,EAAO,qBAAA;AACP,gBAAA,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;eACzD;AAAA,aAAA;AAEL,UAAA;AACA,UAAA;AACF,QAAA;AACA,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,8BAA8B,CAAA;AACjE,QAAA,IAAI,eAAA,IAAmB,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AAC3C,UAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,0BAAA,EAA4B,CAAC,CAAA;AAC7D,YAAA;AACF,UAAA;AACA,UAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,eAAA,CAAgB,CAAC,KAAK,EAAE,CAAA;AACzD,UAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,QAAA,CAAS,UAAU,KAAK,CAAA;AAC/C,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,EAAA,GAAK,GAAA,GAAM,GAAA,EAAK;YAChC,cAAA,EAAgB;WACjB,CAAA;AACD,UAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAC3B,UAAA;AACF,QAAA;AACA,QAAA,IAAI,IAAA,KAAS,kBAAA,IAAsB,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AACxD,UAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,0BAAA,EAA4B,CAAC,CAAA;AAC7D,YAAA;AACF,UAAA;AACA,UAAA,MAAM,IAAA,GAAQ,MAAM,YAAA,CAAa,GAAG,CAAA;AAKpC,UAAA,IACE,CAAC,QACD,OAAO,IAAA,CAAK,UAAU,QAAA,IACtB,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,EACzB;AACA,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,GAAA;AACF,cAAA,IAAA,CAAK,SAAA,CAAU;gBACb,KAAA,EAAO,cAAA;gBACP,OAAA,EAAS;eACV;AAAA,aAAA;AAEH,YAAA;AACF,UAAA;AACA,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,QAAA;YACjC,IAAA,CAAK,KAAA;YACL,IAAA,CAAK,QAAA;AACL,YAAA,IAAA,CAAK,QAAQ;AAAC,WAAA;AAEhB,UAAA,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,EAAA,GAAK,GAAA,GAAM,GAAA,EAAK;YACnC,cAAA,EAAgB;WACjB,CAAA;AACD,UAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAC9B,UAAA;AACF,QAAA;AAEA,QAAA,IAAI,IAAA,KAAS,WAAA,IAAe,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AAChD,UAAA,IAAI,CAAC,KAAK,iBAAA,EAAmB;AAC3B,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,GAAA;AACF,cAAA,IAAA,CAAK,SAAA,CAAU;gBACb,KAAA,EAAO,uBAAA;gBACP,OAAA,EACE;eAEH;AAAA,aAAA;AAEH,YAAA;AACF,UAAA;AACA,UAAA,IAAI;AACF,YAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,EAAA;AAC5B,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,CAAC,CAAA;AACtC,UAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,GAAA;AACF,cAAA,IAAA,CAAK,SAAA,CAAU;gBACb,KAAA,EAAO,aAAA;AACP,gBAAA,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;eACzD;AAAA,aAAA;AAEL,UAAA;AACA,UAAA;AACF,QAAA;AAEA,QAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,QAAA,GAAA,CAAI,GAAA,CAAI,KAAK,SAAA,CAAU,EAAE,OAAO,WAAA,EAAa,IAAA,EAAM,CAAC,CAAA;AACtD,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AACpB,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,UAAA,GAAA,CAAI,GAAA;AACF,YAAA,IAAA,CAAK,SAAA,CAAU;cACb,KAAA,EAAO,gBAAA;AACP,cAAA,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;aACzD;AAAA,WAAA;AAEL,QAAA;AACF,MAAA;IACF,CAAA,GAAA;EACF,CAAC,CAAA;AAaD,EAAA,MAAM,MAAM,IAAI,eAAA,CAAgB,EAAE,QAAA,EAAU,MAAM,CAAA;AAClD,EAAA,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,EAAK,QAAQ,IAAA,KAAS;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,IAAO,GAAA;AACvB,IAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAClC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA;AACxD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAA,CAAO,OAAA,EAAA;AACP,MAAA;AACF,IAAA;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,eAAe,IAAA,EAAM;AAC9C,MAAA,aAAA,CAAc,MAAA,EAAQ,KAAK,oBAAoB,CAAA;AAC/C,MAAA;AACF,IAAA;AAGA,IAAA,MAAM,IAAA,GAAO,mBAAmB,GAAG,CAAA;AACnC,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,aAAA,CAAc,MAAA,EAAQ,GAAA,EAAK,IAAA,KAAS,SAAA,GAAY,kBAAkB,WAAW,CAAA;AAC7E,MAAA;AACF,IAAA;AACA,IAAA,MAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrB,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,aAAA,CAAc,MAAA,EAAQ,KAAK,YAAY,CAAA;AACvC,MAAA;AACF,IAAA;AAGA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA;AAC5C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,aAAA,CAAc,MAAA,EAAQ,KAAK,mBAAmB,CAAA;AAC9C,MAAA;AACF,IAAA;AACA,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,MAAA,aAAA,CAAc,MAAA,EAAQ,KAAK,iBAAiB,CAAA;AAC5C,MAAA;AACF,IAAA;AAKA,IAAA,IACE,IAAA,CAAK,WAAW,QAAA,IAChB,IAAA,CAAK,WAAW,QAAA,IAChB,IAAA,CAAK,WAAW,OAAA,EAChB;AACA,MAAA,aAAA;AACE,QAAA,MAAA;AACA,QAAA,GAAA;AACA,QAAA,CAAA,QAAA,EAAW,KAAK,MAAM,CAAA,CAAA;AACtB,QAAA,CAAA,QAAA,EAAW,KAAK,EAAE,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,QAAQ,IAAA,CAAK,MAAM,yDACjB,IAAA,CAAK,IAAA,IAAQ,KAAK,EAAE,CAAA;AAAA,OAAA;AAE/E,MAAA;AACF,IAAA;AACA,IAAA,GAAA,CAAI,aAAA,CAAc,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAA,KAAM;AACzC,MAAA,kBAAA,CAAmB,EAAA,EAAI,GAAA,EAAK,IAAA,CAAK,EAAA,EAAI,KAAK,QAAS,CAAA;IACrD,CAAC,CAAA;EACH,CAAC,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,WAAA;AAC1B,EAAA,MAAM,IAAI,OAAA,CAAc,CAACzB,QAAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM,CAAA;AAC3B,IAAA,MAAA,CAAO,OAAO,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,MAAMA,UAAS,CAAA;EAChD,CAAC,CAAA;AAED,EAAA,OAAO;AACL,IAAA,GAAA,EAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO;AAMX,MAAA,GAAA,CAAI,KAAA,EAAA;AACJ,MAAA,MAAM,IAAI,QAAc,CAACA,QAAAA,KAAY,OAAO,KAAA,CAAM,MAAMA,QAAAA,EAAS,CAAC,CAAA;AACpE,IAAA;AAAA,GAAA;AAEJ;AAQA,SAAS,aAAA,CACP,MAAA,EACA,MAAA,EACA,MAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACtC,EAAA,MAAM,IAAA,GAA4C,EAAE,KAAA,EAAO,MAAA,EAAA;AAC3D,EAAA,IAAI,OAAA,OAAc,OAAA,GAAU,OAAA;AAC5B,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,KAAA;AACL,MAAA,CAAA,SAAA,EAAY,UAAU,CAAA;;;;IAGpB,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GACnB;;AAAA,KAAA;EAEN,CAAA,CAAA,MAAQ;AAER,EAAA;AACA,EAAA,MAAA,CAAO,OAAA,EAAA;AACT;AASA,SAAS,kBAAA,CACP,EAAA,EACA,GAAA,EACA,SAAA,EACA,QAAA,EACM;AAKN,EAAA,MAAM,QAAQ,IAAI,eAAA;AACf,IAAA,CAAA,GAAA,CAAI,GAAA,IAAO,EAAA,EAAI,QAAA,CAAS,GAAG,CAAA,GAAA,CAAK,GAAA,CAAI,GAAA,IAAO,EAAA,EAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI;AAAA,GAAA;AAElE,EAAA,MAAM,OAAO,gBAAA,CAAiB,KAAA,CAAM,GAAA,CAAI,MAAM,GAAG,EAAE,CAAA;AACnD,EAAA,MAAM,OAAO,gBAAA,CAAiB,KAAA,CAAM,GAAA,CAAI,MAAM,GAAG,EAAE,CAAA;AAKnD,EAAA,MAAM,qBAAqB,GAAA,GAAM,IAAA;AAEjC,EAAA,MAAM,SAAS,QAAA,CAAS,SAAA;AACtB,IAAA,SAAA;AACA,IAAA,EAAE,MAAM,IAAA,EAAA;AACR,IAAA,CAAA,KAAA,KAAS;AACP,MAAA,IAAI,EAAA,CAAG,UAAA,KAAe,EAAA,CAAG,IAAA,EAAM;AAC/B,MAAA,IAAI,EAAA,CAAG,iBAAiB,kBAAA,EAAoB;AAC5C,MAAA,EAAA,CAAG,IAAA;QACD,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAK,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,EAAG;AAAA,OAAA;AAElE,IAAA,CAAA;AACA,IAAA,CAAA,GAAA,KAAO;AACL,MAAA,IAAI,EAAA,CAAG,UAAA,KAAe,EAAA,CAAG,IAAA,EAAM;AAC/B,MAAA,EAAA,CAAG,IAAA;AACD,QAAA,IAAA,CAAK,SAAA,CAAU;UACb,IAAA,EAAM,MAAA;AACN,UAAA,QAAA,EAAU,GAAA,CAAI,QAAA;UACd,GAAI,GAAA,CAAI,UAAU,IAAA,GAAO,EAAE,QAAQ,GAAA,CAAI,MAAA,KAAW;SACnD;AAAA,OAAA;AAIH,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAA,CAAM,KAAM,gBAAgB,CAAA;MACjC,CAAA,CAAA,MAAQ;AAER,MAAA;AACF,IAAA;AAAA,GAAA;AAGF,EAAA,IAAI,CAAC,MAAA,EAAQ;AAGX,IAAA,IAAI;AACF,MAAA,EAAA,CAAG,KAAA,CAAM,MAAM,wBAAwB,CAAA;IACzC,CAAA,CAAA,MAAQ;AAER,IAAA;AACA,IAAA;AACF,EAAA;AAEA,EAAA,EAAA,CAAG,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,EAAK,QAAA,KAAa;AAClC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA;AACF,IAAA;AACA,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,MAAM,CAAC,CAAA;IACzC,CAAA,CAAA,MAAQ;AACN,MAAA;AACF,IAAA;AACA,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,QAAQ,EAAE,IAAA;AACR,MAAA,KAAK,OAAA,EAAS;AAGZ,QAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,UAAA,MAAA,CAAO,KAAA,CAAM,EAAE,IAAI,CAAA;QACrB,CAAA,MAAA,IAAW,OAAO,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AACpC,UAAA,IAAI;AACF,YAAA,MAAA,CAAO,KAAA,CAAM,OAAO,IAAA,CAAK,CAAA,CAAE,KAAK,QAAQ,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;UAC5D,CAAA,CAAA,MAAQ;AAER,UAAA;AACF,QAAA;AACA,QAAA;AACF,MAAA;AACA,MAAA,KAAK,QAAA,EAAU;AACb,QAAA,MAAM,CAAA,GACJ,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA,GAAI,IAAA;AAClE,QAAA,MAAM,CAAA,GACJ,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA,GAAI,IAAA;AAClE,QAAA,IAAI,CAAA,IAAK,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAC9B,QAAA;AACF,MAAA;MACA,KAAK,MAAA;AAEH,QAAA,IAAI;AACF,UAAA,EAAA,CAAG,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAC,CAAA;QAC1C,CAAA,CAAA,MAAQ;AAER,QAAA;AACA,QAAA;AAAA;EAGN,CAAC,CAAA;AAED,EAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AACnB,IAAA,MAAA,CAAO,MAAA,EAAA;EACT,CAAC,CAAA;AACD,EAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AACnB,IAAA,MAAA,CAAO,MAAA,EAAA;EACT,CAAC,CAAA;AACH;AAEA,SAAS,gBAAA,CAAiB,KAAoB,QAAA,EAA0B;AACtE,EAAA,IAAI,CAAC,KAAK,OAAO,QAAA;AACjB,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA;AACjC,EAAA,OAAO,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,GAAI,IAAI,CAAA,GAAI,QAAA;AAC3C;AAEA,SAAS,QAAA,CACP,GAAA,EACA,QAAA,EACA,GAAA,EACA,GAAA,EACQ;AACR,EAAA,IAAI,CAAC,KAAK,OAAO,QAAA;AACjB,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA;AACjC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,QAAA;AAChC,EAAA,IAAI,CAAA,GAAI,KAAK,OAAO,GAAA;AACpB,EAAA,IAAI,CAAA,GAAI,KAAK,OAAO,GAAA;AACpB,EAAA,OAAO,CAAA;AACT;AAcA,eAAe,eACb,GAAA,EACA,GAAA,EACA,MACA,QAAA,EACA,mBAAA,EACA,aAAa,KAAA,EACK;AAClB,EAAA,MAAM,IAAA,GAAO,CAAC,MAAA,EAAgB,IAAA,KAAwB;AACpD,IAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AAC5D,IAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAC9B,EAAA,CAAA;AAEA,EAAA,IAAI,IAAA,KAAS,WAAA,IAAe,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AAChD,IAAA,IAAA,CAAK,KAAK,EAAE,QAAA,EAAU,QAAA,CAAS,IAAA,IAAQ,CAAA;AACvC,IAAA,OAAO,IAAA;AACT,EAAA;AAMA,EAAA,IAAI,IAAA,KAAS,iBAAA,IAAqB,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AACvD,IAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,MAAA,IAAA,CAAK,GAAA,EAAK;QACR,KAAA,EAAO,+BAAA;QACP,OAAA,EACE;OAEH,CAAA;AACD,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,GAAG,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,MAAA,IAAA,CAAK,GAAA,EAAK,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA;AACnC,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,MAAM,UAAU,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,EAAA;AAC5D,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,GAAA,EAAK,EAAE,KAAA,EAAO,iBAAA,EAAmB,CAAA;AACtC,MAAA,OAAO,IAAA;AACT,IAAA;AAOA,IAAA,IAAI,GAAA,GACF,OAAO,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,EAAE,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,GAAA,GAAM,IAAA;AAC1D,IAAA,IAAI,gBACF,OAAO,CAAA,CAAE,aAAA,KAAkB,QAAA,GAAW,EAAE,aAAA,GAAgB,EAAA;AAC1D,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAMyB,qBAAAA,EAAA;AACrB,QAAA,MAAM,KAAK,aAAA,GACPE,cAAAA,CAAc,QAAQ,aAAa,CAAA,GACnCC,oBAAmB,MAAM,CAAA;AAC7B,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,GAAA,GAAM,EAAA,CAAG,IAAA;AACT,UAAA,aAAA,GAAgB,EAAA,CAAG,IAAA;AACrB,QAAA;MACF,CAAA,CAAA,MAAQ;AAER,MAAA;AACF,IAAA;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,GAAM,QAAQ,GAAA,EAAA;AACd,MAAA,OAAA,CAAQ,IAAA;QACN,CAAA,gDAAA,EAAmD,OAAO,oIAED,GAAG,CAAA;AAAA,OAAA;AAEhE,IAAA;AACA,IAAA,IAAI,CAAC,eAAe,aAAA,GAAgB,SAAA;AACpC,IAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,OAAO,CAAA;AAClD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAA,CAAK,GAAA,EAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,SAAS,CAAA;AACjD,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GACJ,OAAO,CAAA,CAAE,eAAA,KAAoB,QAAA,IAAY,EAAE,eAAA,CAAgB,MAAA,GAAS,CAAA,GAChE,CAAA,CAAE,eAAA,GACF,KAAA,CAAA;AACN,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,YAAA,CAAa;AAC/C,QAAA,GAAA;AACA,QAAA,GAAI,eAAA,GAAkB,EAAE,eAAA,EAAA,GAAoB;OAC7C,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,SAAS,UAAA,CAAW;AAC/B,QAAA,aAAA;AACA,QAAA,GAAA;AACA,QAAA,YAAA;QACA,WAAA,EAAa,OAAA;QACb,GAAI,OAAO,EAAE,MAAA,KAAW,QAAA,GAAW,EAAE,aAAA,EAAe,CAAA,CAAE,MAAA,EAAA,GAAW,EAAA;QACjE,GAAI,OAAO,EAAE,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAA,GAAU,EAAA;AACvD,QAAA,GAAI,SAAS,cAAA,GACT,EAAE,gBAAgB,QAAA,CAAS,cAAA,KAC3B;OACL,CAAA;AACD,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAChB,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,EAAK;QACR,KAAA,EAAO,oBAAA;AACP,QAAA,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;OACzD,CAAA;AACH,IAAA;AACA,IAAA,OAAO,IAAA;AACT,EAAA;AAMA,EAAA,IAAI,IAAA,KAAS,oBAAA,IAAwB,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AAC1D,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,IAAA,CAAK,GAAA,EAAK;QACR,KAAA,EAAO,oBAAA;QACP,OAAA,EACE;OAEH,CAAA;AACD,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,GAAG,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,MAAA,IAAA,CAAK,GAAA,EAAK,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA;AACnC,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,GAC5B,CAAA,CAAE,IAAA,CAAmB,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,IACtE,EAAA;AACJ,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,GAAA,EAAK,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA;AACnC,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA,GAAI,EAAA;AAC7E,IAAA,MAAM,IAAA,GAAO,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA,GAAI,EAAA;AAE7E,IAAA,IAAI,GAAA,GACF,OAAO,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,EAAE,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,GAAA,GAAM,IAAA;AAC1D,IAAA,IAAI,gBACF,OAAO,CAAA,CAAE,aAAA,KAAkB,QAAA,GAAW,EAAE,aAAA,GAAgB,EAAA;AAC1D,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAMH,qBAAAA,EAAA;AACrB,QAAA,MAAM,KAAK,aAAA,GACPE,cAAAA,CAAc,QAAQ,aAAa,CAAA,GACnCC,oBAAmB,MAAM,CAAA;AAC7B,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,GAAA,GAAM,EAAA,CAAG,IAAA;AACT,UAAA,aAAA,GAAgB,EAAA,CAAG,IAAA;AACrB,QAAA;MACF,CAAA,CAAA,MAAQ;AAER,MAAA;AACF,IAAA;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,GAAM,QAAQ,GAAA,EAAA;AACd,MAAA,OAAA,CAAQ,IAAA;AACN,QAAA,CAAA,gDAAA,EAAmD,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,wCAC7B,GAAG,CAAA;AAAA,OAAA;AAE3C,IAAA;AACA,IAAA,IAAI,CAAC,eAAe,aAAA,GAAgB,SAAA;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,SAAS,QAAA,CAAS;AAC7B,QAAA,IAAA;AACA,QAAA,GAAA;AACA,QAAA,aAAA;AACA,QAAA,IAAA;AACA,QAAA,IAAA;QACA,GAAI,CAAA,CAAE,GAAA,IAAO,OAAO,CAAA,CAAE,GAAA,KAAQ,QAAA,GAC1B,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAA,GACT,EAAA;QACJ,GAAI,OAAO,EAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAA,GAAS,EAAA;QACpD,GAAI,OAAO,EAAE,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAA,GAAU;OACxD,CAAA;AACD,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAChB,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,QAAA,CAAS,gBAAgB,CAAA,GACxC,MACA,GAAA,CAAI,QAAA,CAAS,gBAAgB,CAAA,GAC3B,GAAA,GACA,GAAA;AACN,MAAA,IAAA,CAAK,QAAQ,EAAE,KAAA,EAAO,kBAAA,EAAoB,OAAA,EAAS,KAAK,CAAA;AAC1D,IAAA;AACA,IAAA,OAAO,IAAA;AACT,EAAA;AAqBA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AAC9D,EAAA,IAAI,WAAA,IAAe,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AACxC,IAAA,MAAME,GAAAA,GAAK,YAAY,CAAC,CAAA;AACxB,IAAA,IAAI,CAACA,KAAI,OAAO,KAAA;AAChB,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,GAAG,CAAA;AACnC,IAAA,MAAM,SAAU,IAAA,EAAsC,MAAA;AACtD,IAAA,MAAM,WAAA,GACH,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,MAAA,GAAS,CAAA,IAC9C,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,IACnB,MAAA,CAAO,MAAA,GAAS,KAChB,MAAA,CAAO,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,KAAM,IAAA,IAAQ,OAAO,CAAA,KAAM,QAAQ,CAAA,IACtD,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,MAAM,CAAA;AACzE,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,IAAA,CAAK,GAAA,EAAK;QACR,KAAA,EAAO,gBAAA;QACP,OAAA,EACE;OACH,CAAA;AACD,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,IAAO,EAAA;AAC1B,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GACnC,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,GACpC,EAAA;AACJ,IAAA,MAAM,OAAO,IAAI,eAAA,CAAgB,WAAW,CAAA,CAAE,IAAI,MAAM,CAAA;AACxD,IAAA,MAAM,aAAA,GAAgB,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,GAAA;AACnD,IAAA,IAAI;AACF,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,QAAA,CAAS,aAAA,CAAcA,KAAI,MAAM,CAAA;AACjC,QAAA,IAAA,CAAK,GAAA,EAAK,EAAE,EAAA,EAAI,IAAA,EAAM,IAAAA,GAAAA,EAAI,MAAA,EAAQ,MAAM,CAAA;MAC1C,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,CAAS,UAAA,CAAWA,GAAAA,EAAI,MAAM,CAAA;AACpC,QAAA,IAAA,CAAK,KAAK,EAAE,EAAA,EAAI,IAAA,EAAM,EAAA,EAAAA,KAAI,CAAA;AAC5B,MAAA;AACF,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAG3D,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,QAAA,CAAS,YAAY,IACpC,GAAA,GACA,GAAA,CAAI,QAAA,CAAS,cAAc,IACzB,GAAA,GACA,GAAA,CAAI,QAAA,CAAS,UAAU,IACrB,GAAA,GACA,GAAA;AACR,MAAA,IAAA,CAAK,QAAQ,EAAE,KAAA,EAAO,oBAAA,EAAsB,OAAA,EAAS,KAAK,CAAA;AAC5D,IAAA;AACA,IAAA,OAAO,IAAA;AACT,EAAA;AAEA,EAAA,IAAI,IAAA,KAAS,WAAA,IAAe,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AACjD,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,GAAG,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,MAAA,IAAA,CAAK,GAAA,EAAK,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA;AACnC,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,GAC5B,CAAA,CAAE,IAAA,CAAmB,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,IACtE,EAAA;AACJ,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,IAAA,CAAK,GAAA,EAAK,EAAE,KAAA,EAAO,cAAA,EAAgB,CAAA;AACnC,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,SAAS,KAAA,CAAM;QAC1B,IAAA,EACE,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,eAAe,CAAA,CAAE,IAAA,KAAS,SAAA,GAC1D,CAAA,CAAE,IAAA,GACF,SAAA;AACN,QAAA,aAAA,EACE,OAAO,CAAA,CAAE,aAAA,KAAkB,QAAA,GAAW,EAAE,aAAA,GAAgB,SAAA;AAC1D,QAAA,GAAA,EAAK,OAAO,CAAA,CAAE,GAAA,KAAQ,WAAW,CAAA,CAAE,GAAA,GAAM,QAAQ,GAAA,EAAA;AACjD,QAAA,IAAA;AACA,QAAA,GAAA,EACE,EAAE,GAAA,IAAO,OAAO,EAAE,GAAA,KAAQ,QAAA,GACrB,EAAE,GAAA,GACH,KAAA,CAAA;AACN,QAAA,KAAA,EAAO,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,GAAQ,KAAA;OAChD,CAAA;AACD,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAChB,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,EAAK;QACR,KAAA,EAAO,cAAA;AACP,QAAA,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;OACzD,CAAA;AACH,IAAA;AACA,IAAA,OAAO,IAAA;AACT,EAAA;AAKA,EAAA,MAAM,UAAU,IAAA,CAAK,KAAA;AACnB,IAAA;AAAA,GAAA;AAEF,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,MAAM,GAAG,WAAA,EAAa,MAAM,CAAA,GAAI,OAAA;AAChC,EAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AACzB,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,cAAA,CAAe,WAAW,CAAA;AACxD,EAAA,MAAM,EAAA,GAAK,cAAc,EAAA,IAAM,WAAA;AAE/B,EAAA,IAAI,MAAA,KAAW,UAAA,IAAc,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AAMjD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,IAAA,CAAK,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,EAAA,EAAI,aAAa,CAAA;AACzD,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,IAAO,EAAA;AAC1B,IAAA,MAAM,KAAK,IAAI,eAAA;MACb,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,OAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAC,CAAA,GAAI;AAAA,KAAA;AAEjE,IAAA,MAAM,OAAA,GAAU,SAAS,EAAA,CAAG,GAAA,CAAI,OAAO,CAAA,EAAG,EAAA,EAAI,GAAG,GAAG,CAAA;AACpD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,EAAA,CAAG,GAAA,CAAI,OAAO,GAAG,EAAA,GAAK,IAAA,EAAM,GAAA,EAAK,EAAA,GAAK,IAAI,CAAA;AAKnE,IAAA,MAAM,QAAkB,EAAA;AACxB,IAAA,IAAI,YAAA,CAAa,QAAQ,IAAA,EAAM;AAC7B,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,EAAA,EAAI,CAAA,IAAA,KAAQ;AACxC,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;MACjB,CAAC,CAAA;AACD,MAAA,IAAI,OAAO,KAAA,EAAA;AACb,IAAA;AACA,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,kBAAA,CAAmB,EAAA,EAAI,OAAO,CAAA;AACxD,IAAA,IAAA,CAAK,GAAA,EAAK;AACR,MAAA,EAAA,EAAI,YAAA,CAAa,EAAA;MACjB,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,CAAC,OAAO,CAAA;AAC3B,MAAA,KAAA,EAAO,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,GAAI;KACjD,CAAA;AACD,IAAA,OAAO,IAAA;AACT,EAAA;AAEA,EAAA,IAAI,MAAA,KAAW,SAAA,IAAa,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AAChD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,IAAA,CAAK,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,EAAA,EAAI,aAAa,CAAA;AACzD,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,GAAA,CAAI,UAAU,GAAA,EAAK;MACjB,cAAA,EAAgB,mBAAA;MAChB,eAAA,EAAiB,UAAA;MACjB,UAAA,EAAY;KACb,CAAA;AAKD,IAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,MAAA,IAAI;AACF,QAAA,GAAA,CAAI,KAAA,CAAM,CAAA;;AAAkB,CAAA,CAAA;MAC9B,CAAA,CAAA,MAAQ;AACN,QAAA,aAAA,CAAc,IAAI,CAAA;AACpB,MAAA;AACF,IAAA,CAAA,EAAG,IAAM,CAAA;AACT,IAAA,MAAM,QAAQ,QAAA,CAAS,MAAA,CAAO,EAAA,EAAI,CAAC,MAAM,MAAA,KAAW;AAClD,MAAA,IAAI;AACF,QAAA,GAAA,CAAI,KAAA;AACF,UAAA,CAAA,MAAA,EAAS,KAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAC;;;AAAA,SAAA;MAE7C,CAAA,CAAA,MAAQ;AAER,MAAA;IACF,CAAC,CAAA;AACD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,GAAA,CAAI,GAAA,EAAA;AACJ,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,SAAS,MAAM;AACtB,MAAA,KAAA,EAAA;AACA,MAAA,aAAA,CAAc,IAAI,CAAA;IACpB,CAAC,CAAA;AACD,IAAA,OAAO,IAAA;AACT,EAAA;AAEA,EAAA,IAAI,MAAA,KAAW,OAAA,IAAW,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AAC/C,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAC3B,IAAA,IAAA,CAAK,KAAK,GAAA,GAAM,GAAA,EAAK,EAAE,EAAA,EAAI,IAAI,CAAA;AAC/B,IAAA,OAAO,IAAA;AACT,EAAA;AAEA,EAAA,IAAI,CAAC,MAAA,IAAU,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AACnC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,IAAA,CAAK,KAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,EAAA,EAAI,aAAa,CAAA;AACzD,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AACtB,IAAA,OAAO,IAAA;AACT,EAAA;AAEA,EAAA,IAAI,CAAC,MAAA,IAAU,GAAA,CAAI,MAAA,KAAW,QAAA,EAAU;AACtC,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AAC7B,IAAA,IAAA,CAAK,KAAK,GAAA,GAAM,GAAA,EAAK,EAAE,EAAA,EAAI,IAAI,CAAA;AAC/B,IAAA,OAAO,IAAA;AACT,EAAA;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,aAAa,GAAA,EAAwC;AAClE,EAAA,MAAM,SAAmB,EAAA;AACzB,EAAA,WAAA,MAAiB,SAAS,GAAA,EAAK;AAC7B,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAA,KAAU,QAAA,GAAW,OAAO,IAAA,CAAK,KAAK,IAAI,KAAK,CAAA;AACpE,EAAA;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAChC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AACT,EAAA;AACF;AC7hDO,IAAM,iBAAA,GAAoD;EAC/D,aAAA,EAAe;;;IAGb,UAAA,EAAY,sCAAA;IACZ,OAAA,EAAS,gBAAA;AACT,IAAA,OAAA,EAAS,sBAAsB,kBAAkB,CAAA;AACjD,IAAA,SAAA,EAAW,CAAA,EAAA,KAAM,CAAC,QAAA,EAAU,YAAY,EAAE;AAAA;;;;;;;;;AAW9C,CAAA;AASA,SAAS,sBACP,QAAA,EACgE;AAChE,EAAA,OAAO,OAAO,KAAK,aAAA,KAAkB;AACnC,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM9B,OAAAA,CAAQP,OAAAA,EAAAA,EAAW,UAAU,OAAO,CAAA;AAChD,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAMH,QAAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,CAAA,MAAK,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAC,CAAA;AACtD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAC5C,IAAA,MAAM,aAAgD,EAAA;AACtD,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,MAAMA,QAAAA,CAAG,KAAKE,IAAAA,CAAK,GAAA,EAAK,CAAC,CAAC,CAAA;AACrC,QAAA,IAAI,CAAC,OAAO,QAAA,CAAS,WAAW,KAAK,EAAA,CAAG,OAAA,IAAW,cAAc,GAAA,EAAM;AACrE,UAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,GAAG,KAAA,EAAO,EAAA,CAAG,SAAS,CAAA;AAChD,QAAA;MACF,CAAA,CAAA,MAAQ;AAER,MAAA;AACF,IAAA;AACA,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACpC,IAAA,UAAA,CAAW,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAC3C,IAAA,OAAO,WAAW,CAAC,CAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,YAAY,EAAE,CAAA;AACnD,EAAA,CAAA;AACF;AC/CO,IAAM,qBAAqB,MAChCQ,OAAAA,CAAQP,OAAAA,EAAAA,EAAW,eAAe,eAAe,CAAA;AAiHnD,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,mBAAmB,EAAA,GAAK,IAAA;AAC9B,IAAM,mBAAA,GAAsB,IAAA;AAM5B,IAAM,WAAA,GAAc,GAAA;AAKpB,SAAS,eAAe,CAAA,EAAmB;AACzC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,yBAAA,EAA2B,EAAE,CAAA;AAChD;AAmLO,SAAS,uBAAuB,IAAA,EAgBlB;AACnB,EAAA,MAAM,WAAA,GAAc,IAAA,EAAM,WAAA,IAAe,kBAAA,EAAA;AACzC,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,IAAA;AACjC,EAAA,MAAM,aAAa,IAAA,EAAM,QAAA;AACzB,EAAA,MAAM,cAAc,IAAA,EAAM,WAAA;AAC1B,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAA;AACrB,EAAA,IAAI,YAAA,GAAqD,IAAA;AAIzD,EAAA,IAAI,SAAA,GAAY,CAAA;AAIhB,EAAA,IAAI,YAAA,GAAe,KAAA;AAgBnB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,mBAAA,CAAoB,aAAa,QAAQ,CAAA;AAC3C,EAAA;AASA,EAAA,MAAM,gBAAgB,MAAY;AAChC,IAAA,YAAA,EAAA;AACF,EAAA,CAAA;AACA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,EAAA,CAAG,QAAQ,aAAa,CAAA;AAClC,EAAA;AAEA,EAAA,MAAM,kBAAkB,MAAY;AAClC,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,YAAA,eAA2B,YAAY,CAAA;AAC3C,IAAA,YAAA,GAAe,WAAW,MAAM;AAC9B,MAAA,KAAK,eAAA,EAAA;AACP,IAAA,CAAA,EAAG,mBAAmB,CAAA;AACxB,EAAA,CAAA;AAEA,EAAA,MAAM,kBAAkB,YAA2B;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW;QACf,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;QACpB,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI;AAAA,OAAA;AAEzD,MAAA,MAAMH,QAAAA,CAAG,MAAMC,OAAAA,CAAQ,WAAW,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACxD,MAAA,MAAMD,QAAAA,CAAG,UAAU,WAAA,EAAa,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,GAAI,IAAI,CAAA;AAC1E,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AAEZ,MAAA,OAAA,CAAQ,IAAA;AACN,QAAA,CAAA,2BAAA,EACE,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA;AAAA,OAAA;AAEJ,IAAA;AACF,EAAA,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CACjB,EAAA,EACA,IAAA,EACA,MAAA,KACS;AACT,IAAA,EAAA,CAAG,WAAA,CAAY,KAAK,IAAI,CAAA;AACxB,IAAA,IAAI,EAAA,CAAG,WAAA,CAAY,MAAA,GAAS,gBAAA,EAAkB;AAC5C,MAAA,EAAA,CAAG,YAAY,MAAA,CAAO,CAAA,EAAG,EAAA,CAAG,WAAA,CAAY,SAAS,gBAAgB,CAAA;AACnE,IAAA;AACA,IAAA,EAAA,CAAG,IAAA,CAAK,YAAA,GAAA,iBAAe,IAAI,IAAA,IAAO,WAAA,EAAA;AAClC,IAAA,gBAAA,CAAiB,IAAI,IAAI,CAAA;AACzB,IAAA,EAAA,CAAG,QAAQ,IAAA,CAAK,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAQ,CAAA;AAC1C,EAAA,CAAA;AAYA,EAAA,MAAM,gBAAA,GAAmB,CAAC,EAAA,EAAoB,IAAA,KAAuB;AACnE,IAAA,IAAI,EAAA,CAAG,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AAClC,IAAA,MAAM,QAAA,GAAW,GAAG,IAAA,CAAK,WAAA,GACrB,kBAAkB,EAAA,CAAG,IAAA,CAAK,WAAW,CAAA,GACrC,MAAA;AACJ,IAAA,IAAI,CAAC,UAAU,UAAA,EAAY;AAC3B,IAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AACzC,IAAA,IAAI,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,EAAG;AACb,MAAA,EAAA,CAAG,KAAK,cAAA,GAAiB;QACvB,GAAI,EAAA,CAAG,IAAA,CAAK,cAAA,IAAkB,EAAA;AAC9B,QAAA,CAAC,QAAA,CAAS,OAAO,GAAG,CAAA,CAAE,CAAC;AAAA,OAAA;AAEzB,MAAA,eAAA,EAAA;AACF,IAAA;AACF,EAAA,CAAA;AAUA,EAAA,MAAM,WAAA,GAAc,CAAC,EAAA,EAAoB,KAAA,KAAwB;AAC/D,IAAA,EAAA,CAAG,WAAA,CAAY,KAAK,KAAK,CAAA;AACzB,IAAA,EAAA,CAAG,mBAAmB,KAAA,CAAM,UAAA;AAC5B,IAAA,OACE,GAAG,eAAA,GAAkB,gBAAA,IACrB,EAAA,CAAG,WAAA,CAAY,SAAS,CAAA,EACxB;AACA,MAAA,MAAM,OAAA,GAAU,EAAA,CAAG,WAAA,CAAY,KAAA,EAAA;AAC/B,MAAA,IAAI,OAAA,EAAS,EAAA,CAAG,eAAA,IAAmB,OAAA,CAAQ,UAAA;AAC7C,IAAA;AACA,IAAA,EAAA,CAAG,IAAA,CAAK,YAAA,GAAA,iBAAe,IAAI,IAAA,IAAO,WAAA,EAAA;AAClC,IAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AAC/B,EAAA,CAAA;AAOA,EAAA,MAAM,gBAAA,GAAmB,CAAC,EAAA,KAA6B;AACrD,IAAA,IAAI,CAAC,GAAG,GAAA,IAAO,CAAC,GAAG,cAAA,IAAkB,EAAA,CAAG,cAAA,CAAe,IAAA,KAAS,CAAA,EAAG;AACnE,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,KAAA,MAAW,GAAA,IAAO,EAAA,CAAG,cAAA,CAAe,MAAA,EAAA,EAAU;AAC5C,MAAA,IAAI,GAAA,CAAI,IAAA,GAAO,IAAA,EAAM,IAAA,GAAO,GAAA,CAAI,IAAA;AAChC,MAAA,IAAI,GAAA,CAAI,IAAA,GAAO,IAAA,EAAM,IAAA,GAAO,GAAA,CAAI,IAAA;AAClC,IAAA;AACA,IAAA,IAAI,CAAC,OAAO,QAAA,CAAS,IAAI,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACtD,IAAA,IAAI;AACF,MAAA,EAAA,CAAG,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,IAAI,CAAA;IAC1B,CAAA,CAAA,MAAQ;AAER,IAAA;AACF,EAAA,CAAA;AAOA,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,EAAoB,GAAA,KAAgC;AACxE,IAAA,QAAQ,IAAI,IAAA;MACV,KAAK,YAAA;AACH,QAAA,IAAI,IAAI,IAAA,EAAM;AAIZ,UAAA,MAAM,QAAA,GAAW,EAAA,CAAG,OAAA,GAAU,GAAA,CAAI,IAAA;AAClC,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA;AACpC,UAAA,EAAA,CAAG,OAAA,GAAU,KAAA,CAAM,GAAA,EAAA,IAAS,EAAA;AAC5B,UAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,UAAA,CAAW,EAAA,EAAI,MAAM,QAAQ,CAAA;AACzD,QAAA;AACA,QAAA;MACF,KAAK,SAAA;AACH,QAAA,IAAI,IAAI,IAAA,EAAM;AAIZ,UAAA,MAAM,QAAA,GAAW,EAAA,CAAG,UAAA,GAAa,GAAA,CAAI,IAAA;AACrC,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA;AACpC,UAAA,EAAA,CAAG,UAAA,GAAa,KAAA,CAAM,GAAA,EAAA,IAAS,EAAA;AAC/B,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,IAAI,IAAA,CAAK,MAAA,EAAQ;AACf,cAAA,UAAA,CAAW,EAAA,EAAI,CAAA,iBAAA,EAAoB,IAAI,CAAA,OAAA,CAAA,EAAW,QAAQ,CAAA;AAC5D,YAAA;AACF,UAAA;AACF,QAAA;AACA,QAAA;MACF,KAAK,WAAA;AACH,QAAA,UAAA;AACE,UAAA,EAAA;UACA,CAAA,eAAA,EAAkB,GAAA,CAAI,YAAY,GAAG,CAAA,OAAA,CAAA;AACrC,UAAA;AAAA,SAAA;AAEF,QAAA;MACF,KAAK,aAAA;AACH,QAAA,IAAI,GAAA,CAAI,OAAA;AACN,UAAA,UAAA,CAAW,EAAA,EAAI,+BAA+B,QAAQ,CAAA;AACxD,QAAA;MACF,KAAK,cAAA;AACH,QAAA,UAAA,CAAW,EAAA,EAAI,mCAAmC,QAAQ,CAAA;AAC1D,QAAA;AACF,MAAA,KAAK,UAAA,EAAY;AAEf,QAAA,IAAI,EAAA,CAAG,UAAA,CAAW,IAAA,EAAA,EAAQ;AACxB,UAAA,UAAA;AACE,YAAA,EAAA;AACA,YAAA,CAAA,iBAAA,EAAoB,GAAG,UAAU,CAAA,OAAA,CAAA;AACjC,YAAA;AAAA,WAAA;AAEJ,QAAA;AACA,QAAA,EAAA,CAAG,UAAA,GAAa,EAAA;AAChB,QAAA,IAAI,GAAG,OAAA,EAAS;AACd,UAAA,UAAA,CAAW,EAAA,EAAI,EAAA,CAAG,OAAA,EAAS,QAAQ,CAAA;AACnC,UAAA,EAAA,CAAG,OAAA,GAAU,EAAA;AACf,QAAA;AACA,QAAA,UAAA;AACE,UAAA,EAAA;UACA,CAAA,8BAAA,EAAuB,GAAA,CAAI,UAAU,WAAW,CAAA,qBAAA,CAAA;AAChD,UAAA;AAAA,SAAA;AAEF,QAAA;AACF,MAAA;AACA,MAAA,KAAK,OAAA,EAAS;AACZ,QAAA,MAAM,IAAA,GACJ,OAAO,GAAA,CAAI,KAAA,EAAO,IAAA,KAAS,WAAW,CAAA,OAAA,EAAU,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAA,CAAA,GAAM,EAAA;AACtE,QAAA,UAAA;AACE,UAAA,EAAA;AACA,UAAA,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,EAAO,WAAW,SAAS,CAAA,OAAA,CAAA;AACzD,UAAA;AAAA,SAAA;AAKF,QAAA,MAAM,IAAA,GAAO,IAAI,KAAA,EAAO,IAAA;AAIxB,QAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,YAAY,OAAO,IAAA,CAAK,WAAW,QAAA,EAAU;AACvE,UAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAG;AAC7C,YAAA,IAAI,MAAM,UAAA,CAAW,EAAA,EAAI,CAAA,SAAA,EAAY,IAAI,WAAW,QAAQ,CAAA;AAC9D,UAAA;AACF,QAAA;AACA,QAAA;AACF,MAAA;AAAA;AAEJ,EAAA,CAAA;AAcA,EAAA,MAAM,iBAAA,GAAoB,CAAC,EAAA,EAAY,MAAA,KAAmC;AACxE,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC1B,IAAA,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,CAAA,EAAG,MAAM,CAAA,cAAA,EAAiB,EAAE,CAAA,CAAA,CAAG,CAAA;AACxD,IAAA,IAAI,CAAC,GAAG,YAAA,EAAc;AACpB,MAAA,MAAM,IAAI,KAAA;AACR,QAAA,CAAA,EAAG,MAAM,CAAA,WAAA,EAAc,EAAE,CAAA,gCAAA,EAAmC,EAAA,CAAG,KAAK,IAAI,CAAA,CAAA;AAAA,OAAA;AAE5E,IAAA;AACA,IAAA,IAAI,GAAG,IAAA,EAAM;AACX,MAAA,MAAM,IAAI,KAAA;QACR,CAAA,EAAG,MAAM,cAAc,EAAE,CAAA,oDAAA;AAAA,OAAA;AAE7B,IAAA;AACA,IAAA,OAAO,EAAA;AACT,EAAA,CAAA;AAmBA,EAAA,MAAM,gBAAA,GAAmB,OAAO,EAAA,KAAsC;AACpE,IAAA,IAAI,GAAG,YAAA,EAAc;AACrB,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,IAAI,EAAA,CAAG,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AAClC,IAAA,MAAM,WAAA,GAAc,EAAA,CAAG,IAAA,CAAK,WAAA,IAAe,EAAA,CAAG,WAAA;AAC9C,IAAA,MAAM,gBAAA,GAAmB,GAAG,IAAA,CAAK,gBAAA;AACjC,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,GAAA;AACpB,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,gBAAA,IAAoB,CAAC,GAAA,EAAK;AAC/C,IAAA,IAAI,GAAG,aAAA,EAAe;AACpB,MAAA,MAAM,EAAA,CAAG,aAAA;AACT,MAAA;AACF,IAAA;AACA,IAAA,EAAA,CAAG,iBAAiB,YAAY;AAC9B,MAAA,UAAA;AACE,QAAA,EAAA;QACA,CAAA,sBAAA,EAAe,WAAW,YAAY,gBAAgB,CAAA,aAAA,CAAA;AACtD,QAAA;AAAA,OAAA;AAEF,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY;AAC9B,UAAA,WAAA;AACA,UAAA,GAAA;UACA,eAAA,EAAiB;SAClB,CAAA;AACD,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,UAAA;AACE,YAAA,EAAA;AACA,YAAA,CAAA,gCAAA,EAAmC,WAAW,CAAA,eAAA,CAAA;AAC9C,YAAA;AAAA,WAAA;AAEF,UAAA;AACF,QAAA;AACA,QAAA,EAAA,CAAG,YAAA,GAAe,KAAA;AAClB,QAAA,EAAA,CAAG,WAAA,GAAc,WAAA;AACjB,QAAA,EAAA,CAAG,IAAA,CAAK,mBAAmB,KAAA,CAAM,SAAA;AACjC,QAAA,IAAI,EAAA,CAAG,IAAA,CAAK,MAAA,KAAW,SAAA,EAAW;AAChC,UAAA,EAAA,CAAG,KAAK,MAAA,GAAS,SAAA;AACjB,UAAA,OAAO,GAAG,IAAA,CAAK,OAAA;AACf,UAAA,OAAO,GAAG,IAAA,CAAK,QAAA;AACf,UAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,EAAA,CAAG,KAAK,MAAM,CAAA;AAC1C,QAAA;AACA,QAAA,eAAA,EAAA;AACF,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,UAAA,CAAW,EAAA,EAAI,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAA,EAAI,QAAQ,CAAA;AAC1D,MAAA;IACF,CAAA,GAAA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,CAAG,aAAA;IACX,CAAA,SAAA;AACE,MAAA,EAAA,CAAG,aAAA,GAAgB,MAAA;AACrB,IAAA;AACF,EAAA,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,OACnB,EAAA,EACA,OAAA,KACkB;AAClB,IAAA,IAAI,CAAC,GAAG,YAAA,EAAc;AACpB,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAC7D,IAAA;AACA,IAAA,EAAA,CAAG,IAAA,GAAO,IAAA;AACV,IAAA,IAAI;AACF,MAAA,UAAA;AACE,QAAA,EAAA;AACA,QAAA,CAAA,2BAAA,EAAe,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,oBAAA,CAAA;AAC9E,QAAA;AAAA,OAAA;AAMF,MAAA,MAAM,OAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAA,GAAY,OAAA;AAClE,MAAA,WAAA,MAAiB,GAAA,IAAO,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA,EAAG;AACrD,QAAA,YAAA,CAAa,IAAI,GAAG,CAAA;AACtB,MAAA;AACF,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,EAAA,CAAG,KAAK,MAAA,GAAS,OAAA;AACjB,MAAA,EAAA,CAAG,IAAA,CAAK,OAAA,GAAA,iBAAU,IAAI,IAAA,IAAO,WAAA,EAAA;AAC7B,MAAA,UAAA;AACE,QAAA,EAAA;AACA,QAAA,CAAA,aAAA,EAAgB,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAChE,QAAA;AAAA,OAAA;AAEF,MAAA,eAAA,EAAA;IACF,CAAA,SAAA;AACE,MAAA,EAAA,CAAG,IAAA,GAAO,KAAA;AACZ,IAAA;AACF,EAAA,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,EAAA,KAA6B;AACtD,IAAA,MAAM,OAAA,GACJ,CAAC,MAAA,KACD,CAAC,KAAA,KAAiC;AAChC,MAAA,MAAMY,QAAO,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,KAAA,CAAM,SAAS,MAAM,CAAA;AACtE,MAAA,KAAA,MAAW,IAAA,IAAQA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACtC,QAAA,IAAI,KAAK,MAAA,GAAS,CAAA,EAAG,UAAA,CAAW,EAAA,EAAI,MAAM,MAAM,CAAA;AAClD,MAAA;AACF,IAAA,CAAA;AAGF,IAAA,IAAI,CAAC,GAAG,KAAA,EAAO;AACf,IAAA,EAAA,CAAG,MAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC7C,IAAA,EAAA,CAAG,MAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC/C,EAAA,CAAA;AAEA,EAAA,OAAO;AACL,IAAA,KAAA,CAAMI,MAAAA,EAAO;AACX,MAAA,MAAM,EAAA,GAAKA,OAAM,EAAA,IAAM,CAAA,KAAA,EAAQ,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACvD,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACpB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,EAAE,CAAA,gBAAA,CAAkB,CAAA;AAC7D,MAAA;AACA,MAAA,MAAM,GAAA,GAAM,EAAE,GAAG,OAAA,CAAQ,KAAK,GAAIA,MAAAA,CAAM,GAAA,IAAO,EAAA,EAAC;AAEhD,MAAA,OAAO,GAAA,CAAI,YAAA;AACX,MAAA,MAAM,CAAC,GAAA,EAAK,GAAG,IAAI,IAAIA,MAAAA,CAAM,IAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAKtE,MAAA,MAAM,SAAA,GAAYA,MAAAA,CAAM,SAAA,GAAY,MAAA,GAAS,QAAA;AAC7C,MAAA,MAAM,KAAA,GAAQL,KAAAA,CAAM,GAAA,EAAK,IAAA,EAAM;AAC7B,QAAA,GAAA,EAAKK,MAAAA,CAAM,GAAA;AACX,QAAA,GAAA;QACA,KAAA,EAAO,CAAC,SAAA,EAAW,MAAA,EAAQ,MAAM;OAClC,CAAA;AACD,MAAA,MAAM,IAAA,GAA0B;AAC9B,QAAA,EAAA;AACA,QAAA,IAAA,EAAMA,MAAAA,CAAM,IAAA;AACZ,QAAA,aAAA,EAAeA,MAAAA,CAAM,aAAA;QACrB,OAAA,EAAS,CAAC,KAAK,GAAG,IAAI,EAAE,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC9C,QAAA,GAAA,EAAK,MAAM,GAAA,IAAO,IAAA;QAClB,MAAA,EAAQ,UAAA;QACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACtB,QAAA,IAAA,EAAMA,MAAAA,CAAM,IAAA;AACZ,QAAA,GAAA,EAAKA,MAAAA,CAAM,GAAA;AACX,QAAA,GAAIA,OAAM,KAAA,GAAQ,EAAE,OAAOA,MAAAA,CAAM,KAAA,KAAU;AAAC,OAAA;AAE9C,MAAA,MAAM,EAAA,GAAqB;AACzB,QAAA,IAAA;AACA,QAAA,KAAA;AACA,QAAA,WAAA,EAAa,EAAA;AACb,QAAA,WAAA,EAAa,EAAA;QACb,eAAA,EAAiB,CAAA;AACjB,QAAA,OAAA,EAAS,IAAIyB,YAAAA,EAAAA;QACb,IAAA,EAAM,KAAA;QACN,OAAA,EAAS,EAAA;QACT,UAAA,EAAY;AAAA,OAAA;AAId,MAAA,EAAA,CAAG,OAAA,CAAQ,gBAAgB,EAAE,CAAA;AAE7B,MAAA,QAAA,CAAS,GAAA,CAAI,IAAI,EAAE,CAAA;AACnB,MAAA,iBAAA,CAAkB,EAAE,CAAA;AAEpB,MAAA,KAAA,CAAM,IAAA,CAAK,SAAS,MAAM;AACxB,QAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,QAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AACrC,QAAA,eAAA,EAAA;MACF,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,GAAA,KAAO;AACzB,QAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,QAAA,IAAA,CAAK,OAAA,GAAA,iBAAU,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AAC1B,QAAA,UAAA,CAAW,EAAA,EAAI,CAAA,cAAA,EAAiB,GAAA,CAAI,OAAO,IAAI,QAAQ,CAAA;AACvD,QAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AACrC,QAAA,eAAA,EAAA;MACF,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,KAAW;AACnC,QAAA,IAAI,MAAA,IAAU,IAAA,CAAK,MAAA,KAAW,QAAA,OAAe,MAAA,GAAS,QAAA;AAC7C,aAAA,IAAA,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,MAAA,KAAW,UAAA,EAAY;AAChE,UAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AAChB,QAAA;AACA,QAAA,IAAA,CAAK,OAAA,GAAA,iBAAU,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AAC1B,QAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,IAAA;AAC9C,QAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AACrC,QAAA,eAAA,EAAA;MACF,CAAC,CAAA;AACD,MAAA,eAAA,EAAA;AACA,MAAA,OAAO,IAAA;AACT,IAAA,CAAA;AACA,IAAA,QAAA,CAASzB,MAAAA,EAAO;AACd,MAAA,IAAI,QAAA,CAAS,GAAA,CAAIA,MAAAA,CAAM,EAAE,CAAA,EAAG;AAG1B,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAIA,MAAAA,CAAM,EAAE,CAAA;AACtC,QAAA,IAAI,QAAA,SAAiB,QAAA,CAAS,IAAA;AAChC,MAAA;AACA,MAAA,MAAM,IAAA,GAA0B;AAC9B,QAAA,EAAA,EAAIA,MAAAA,CAAM,EAAA;AACV,QAAA,IAAA,EAAMA,OAAM,IAAA,IAAQ,SAAA;AACpB,QAAA,aAAA,EAAeA,MAAAA,CAAM,aAAA;AACrB,QAAA,OAAA,EAASA,MAAAA,CAAM,OAAA;QACf,GAAA,EAAKA,MAAAA,CAAM,MAAM,GAAA,IAAO,IAAA;QACxB,MAAA,EAAQA,MAAAA,CAAM,KAAA,CAAM,MAAA,GAAS,QAAA,GAAW,SAAA;QACxC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACtB,QAAA,GAAIA,OAAM,KAAA,GAAQ,EAAE,OAAOA,MAAAA,CAAM,KAAA,KAAU;AAAC,OAAA;AAE9C,MAAA,MAAM,EAAA,GAAqB;AACzB,QAAA,IAAA;AACA,QAAA,KAAA,EAAOA,MAAAA,CAAM,KAAA;AACb,QAAA,WAAA,EAAa,EAAA;AACb,QAAA,WAAA,EAAa,EAAA;QACb,eAAA,EAAiB,CAAA;AACjB,QAAA,OAAA,EAAS,IAAIyB,YAAAA,EAAAA;QACb,IAAA,EAAM,KAAA;QACN,OAAA,EAAS,EAAA;QACT,UAAA,EAAY;AAAA,OAAA;AAEd,MAAA,EAAA,CAAG,OAAA,CAAQ,gBAAgB,EAAE,CAAA;AAC7B,MAAA,QAAA,CAAS,GAAA,CAAIzB,MAAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AACzB,MAAA,iBAAA,CAAkB,EAAE,CAAA;AAIpB,MAAAA,OAAM,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,CAAC,MAAM,MAAA,KAAW;AACzC,QAAA,IAAI,MAAA,IAAU,IAAA,CAAK,MAAA,KAAW,QAAA,OAAe,MAAA,GAAS,QAAA;iBAC7C,IAAA,CAAK,MAAA,KAAW,SAAA,EAAW,IAAA,CAAK,MAAA,GAAS,QAAA;AAClD,QAAA,IAAA,CAAK,OAAA,GAAA,iBAAU,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AAC1B,QAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,IAAA;AAC9C,QAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AACrC,QAAA,eAAA,EAAA;MACF,CAAC,CAAA;AACD,MAAAA,MAAAA,CAAM,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,GAAA,KAAO;AAC/B,QAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,QAAA,IAAA,CAAK,OAAA,GAAA,iBAAU,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AAC1B,QAAA,UAAA,CAAW,EAAA,EAAI,CAAA,cAAA,EAAiB,GAAA,CAAI,OAAO,IAAI,QAAQ,CAAA;AACvD,QAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AACrC,QAAA,eAAA,EAAA;MACF,CAAC,CAAA;AACD,MAAA,eAAA,EAAA;AACA,MAAA,OAAO,IAAA;AACT,IAAA,CAAA;AACA,IAAA,UAAA,CAAWA,MAAAA,EAAO;AAChB,MAAA,MAAM,KAAK,CAAA,KAAA,EAAQ,UAAA,GAAa,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC3C,MAAA,MAAM,IAAA,GAA0B;AAC9B,QAAA,EAAA;QACA,IAAA,EAAM,WAAA;AACN,QAAA,aAAA,EAAeA,MAAAA,CAAM,aAAA;AACrB,QAAA,OAAA,EAASA,MAAAA,CAAM,cAAA,IAAkB,CAAA,EAAGA,MAAAA,CAAM,WAAW,CAAA,QAAA,CAAA;QACrD,GAAA,EAAK,IAAA;QACL,MAAA,EAAQ,SAAA;;QACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACtB,QAAA,GAAA,EAAKA,MAAAA,CAAM,GAAA;AACX,QAAA,WAAA,EAAaA,MAAAA,CAAM,WAAA;;;;;AAKnB,QAAA,gBAAA,EAAkBA,OAAM,YAAA,CAAa,SAAA;AACrC,QAAA,GAAIA,OAAM,KAAA,GAAQ,EAAE,OAAOA,MAAAA,CAAM,KAAA,KAAU;AAAC,OAAA;AAE9C,MAAA,MAAM,EAAA,GAAqB;AACzB,QAAA,IAAA;AACA,QAAA,YAAA,EAAcA,MAAAA,CAAM,YAAA;AACpB,QAAA,WAAA,EAAaA,MAAAA,CAAM,WAAA;AACnB,QAAA,WAAA,EAAa,EAAA;AACb,QAAA,WAAA,EAAa,EAAA;QACb,eAAA,EAAiB,CAAA;AACjB,QAAA,OAAA,EAAS,IAAIyB,YAAAA,EAAAA;QACb,IAAA,EAAM,KAAA;QACN,OAAA,EAAS,EAAA;QACT,UAAA,EAAY;AAAA,OAAA;AAEd,MAAA,EAAA,CAAG,OAAA,CAAQ,gBAAgB,EAAE,CAAA;AAC7B,MAAA,QAAA,CAAS,GAAA,CAAI,IAAI,EAAE,CAAA;AACnB,MAAA,UAAA;AACE,QAAA,EAAA;QACA,CAAA,aAAA,EAAMzB,MAAAA,CAAM,WAAW,CAAA,eAAA,EAAkBA,MAAAA,CAAM,aAAa,SAAS,CAAA,MAAA,EAASA,OAAM,GAAG,CAAA,cAAA,CAAA;AACvF,QAAA;AAAA,OAAA;AAEF,MAAA,eAAA,EAAA;AAIA,MAAA,IAAIA,OAAM,aAAA,EAAe;AACvB,QAAA,KAAK,aAAa,EAAA,EAAIA,MAAAA,CAAM,aAAa,CAAA,CAAE,KAAA,CAAM,CAAA,GAAA,KAAO;AACtD,UAAA,UAAA;AACE,YAAA,EAAA;AACA,YAAA,CAAA,aAAA,EAAgB,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAChE,YAAA;AAAA,WAAA;QAEJ,CAAC,CAAA;AACH,MAAA;AACA,MAAA,OAAO,IAAA;AACT,IAAA,CAAA;AACA,IAAA,QAAA,CAASA,MAAAA,EAAO;AACd,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,KAAA;AACR,UAAA;AAAA,SAAA;AAEJ,MAAA;AACA,MAAA,MAAM,KAAK,CAAA,KAAA,EAAQ,UAAA,GAAa,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAK3C,MAAA,IAAIA,OAAM,IAAA,EAAM;AACd,QAAA,KAAA,MAAW0B,GAAAA,IAAM,QAAA,CAAS,MAAA,EAAA,EAAU;AAClC,UAAA,IAAIA,GAAAA,CAAG,IAAA,CAAK,IAAA,KAAS1B,MAAAA,CAAM,IAAA,EAAM;AACjC,UAAA,MAAM,MAAA,GAAS0B,IAAG,IAAA,CAAK,MAAA;AACvB,UAAA,IAAI,MAAA,KAAW,SAAA,IAAa,MAAA,KAAW,UAAA,EAAY;AACjD,YAAA,MAAM,IAAI,KAAA;AACR,cAAA,CAAA,yBAAA,EAA4B1B,OAAM,IAAI,CAAA,oBAAA,EAAuB0B,IAAG,IAAA,CAAK,EAAE,YAAY,MAAM,CAAA,CAAA;AAAA,aAAA;AAE7F,UAAA;AAIAA,UAAAA,GAAAA,CAAG,KAAK,IAAA,GAAO,MAAA;AACjB,QAAA;AACF,MAAA;AACA,MAAA,MAAM,CAAC,GAAA,EAAK,GAAG,IAAI,IAAI1B,MAAAA,CAAM,IAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AACjE,MAAA;AAIA,MAAA,MAAM,GAAA,GAAM,EAAE,GAAI,OAAA,CAAQ,KAAgC,GAAIA,MAAAA,CAAM,GAAA,IAAO,EAAA,EAAC;AAC5E,MAAA,OAAO,GAAA,CAAI,YAAA;AACX,MAAA,MAAM,MAAkB,UAAA,CAAW;QACjC,OAAA,EAAS,GAAA;AACT,QAAA,IAAA;AACA,QAAA,GAAA,EAAKA,MAAAA,CAAM,GAAA;AACX,QAAA,GAAA;AACA,QAAA,IAAA,EAAMA,MAAAA,CAAM,IAAA;AACZ,QAAA,IAAA,EAAMA,MAAAA,CAAM;OACb,CAAA;AACD,MAAA,MAAM,IAAA,GAA0B;AAC9B,QAAA,EAAA;QACA,IAAA,EAAM,UAAA;AACN,QAAA,aAAA,EAAeA,MAAAA,CAAM,aAAA;QACrB,OAAA,EAAS,CAAC,KAAK,GAAG,IAAI,EAAE,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC9C,QAAA,GAAA,EAAK,GAAA,CAAI,GAAA;QACT,MAAA,EAAQ,SAAA;QACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;QACtB,GAAA,EAAK,IAAA;AACL,QAAA,IAAA,EAAMA,MAAAA,CAAM,IAAA;AACZ,QAAA,GAAA,EAAKA,MAAAA,CAAM,GAAA;AACX,QAAA,GAAIA,OAAM,IAAA,GAAO,EAAE,MAAMA,MAAAA,CAAM,IAAA,KAAS,EAAA;AACxC,QAAA,GAAIA,OAAM,KAAA,GAAQ,EAAE,OAAOA,MAAAA,CAAM,KAAA,KAAU;AAAC,OAAA;AAE9C,MAAA,MAAM,EAAA,GAAqB;AACzB,QAAA,IAAA;AACA,QAAA,GAAA;AACA,QAAA,cAAA,sBAAoB,GAAA,EAAA;AACpB,QAAA,WAAA,EAAa,EAAA;AACb,QAAA,WAAA,EAAa,EAAA;QACb,eAAA,EAAiB,CAAA;AACjB,QAAA,OAAA,EAAS,IAAIyB,YAAAA,EAAAA;QACb,IAAA,EAAM,KAAA;QACN,OAAA,EAAS,EAAA;QACT,UAAA,EAAY;AAAA,OAAA;AAEd,MAAA,EAAA,CAAG,OAAA,CAAQ,gBAAgB,EAAE,CAAA;AAC7B,MAAA,QAAA,CAAS,GAAA,CAAI,IAAI,EAAE,CAAA;AACnB,MAAA,GAAA,CAAI,MAAA,CAAO,CAAC,KAAA,KAAkB;AAG5B,QAAA,WAAA,CAAY,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,MAAM,CAAC,CAAA;MAC5C,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAA,KAAO;AAChB,QAAA,IAAI,EAAA,CAAG,IAAA,CAAK,MAAA,KAAW,QAAA,EAAU;AAC/B,UAAA,EAAA,CAAG,KAAK,MAAA,GAAS,QAAA;AACnB,QAAA;AACA,QAAA,EAAA,CAAG,IAAA,CAAK,OAAA,GAAA,iBAAU,IAAI,IAAA,IAAO,WAAA,EAAA;AAC7B,QAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,UAAU,EAAA,CAAG,IAAA,CAAK,WAAW,GAAA,CAAI,QAAA;AAC7D,QAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,GAAG,CAAA;AAC3B,QAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,EAAA,CAAG,KAAK,MAAM,CAAA;AACxC,QAAA,eAAA,EAAA;MACF,CAAC,CAAA;AACD,MAAA,eAAA,EAAA;AACA,MAAA,OAAO,IAAA;AACT,IAAA,CAAA;IACA,MAAM,UAAA,CAAW,IAAI,OAAA,EAAS;AAC5B,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC7B,MAAA,IAAI,KAAA,EAAO,MAAM,gBAAA,CAAiB,KAAK,CAAA;AACvC,MAAA,MAAM,EAAA,GAAK,iBAAA,CAAkB,EAAA,EAAI,YAAY,CAAA;AAC7C,MAAA,MAAM,YAAA,CAAa,IAAI,OAAO,CAAA;AAChC,IAAA,CAAA;AACA,IAAA,aAAA,CAAc,IAAI,OAAA,EAAS;AAQzB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC7B,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,EAAE,CAAA,CAAA,CAAG,CAAA;AACrD,MAAA;AACA,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,IAAA,KAAS,WAAA,EAAa;AACnC,QAAA,MAAM,IAAI,KAAA;AACR,UAAA,CAAA,wBAAA,EAA2B,EAAE,CAAA,gCAAA,EAAmC,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,SAAA;AAEnF,MAAA;AACA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAM,IAAI,KAAA;AACR,UAAA,CAAA,wBAAA,EAA2B,EAAE,CAAA,oDAAA;AAAA,SAAA;AAEjC,MAAA;AAIA,MAAA,KAAA,CAAM,YAAY;AAChB,QAAA,IAAI;AACF,UAAA,MAAM,iBAAiB,KAAK,CAAA;AAC5B,UAAA,MAAM,EAAA,GAAK,iBAAA,CAAkB,EAAA,EAAI,eAAe,CAAA;AAChD,UAAA,MAAM,YAAA,CAAa,IAAI,OAAO,CAAA;AAChC,QAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,UAAA,UAAA;AACE,YAAA,KAAA;AACA,YAAA,CAAA,QAAA,EAAW,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAC3D,YAAA;AAAA,WAAA;AAEJ,QAAA;MACF,CAAA,GAAA;AACF,IAAA,CAAA;IACA,IAAA,GAAO;AACL,MAAA,OAAO,KAAA,CAAM,KAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAChC,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CACf,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,SAAA,CAAU,aAAA,CAAc,CAAA,CAAE,SAAS,CAAC,CAAA;AAC1D,IAAA,CAAA;AACA,IAAA,GAAA,CAAI,EAAA,EAAI;AACN,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA;AAC3B,IAAA,CAAA;AACA,IAAA,MAAA,CAAO,IAAI,MAAA,EAAQ;AACjB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC1B,MAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAGhB,MAAA,KAAA,MAAW,IAAA,IAAQ,EAAA,CAAG,WAAA,EAAa,MAAA,CAAO,MAAM,QAAQ,CAAA;AACxD,MAAA,MAAM,UAAU,CAAC,GAAA,KAGL,OAAO,GAAA,CAAI,IAAA,EAAM,IAAI,MAAM,CAAA;AACvC,MAAA,EAAA,CAAG,OAAA,CAAQ,EAAA,CAAG,MAAA,EAAQ,OAAO,CAAA;AAC7B,MAAA,OAAO,MAAM,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,QAAQ,OAAO,CAAA;AAC7C,IAAA,CAAA;IACA,SAAA,CAAU,EAAA,EAAI,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ;AACrC,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC1B,MAAA,IAAI,CAAC,MAAM,CAAC,EAAA,CAAG,OAAO,CAAC,EAAA,CAAG,gBAAgB,OAAO,IAAA;AAIjD,MAAA,KAAA,MAAW,KAAA,IAAS,EAAA,CAAG,WAAA,EAAa,MAAA,CAAO,KAAK,CAAA;AAGhD,MAAA,MAAM,KAAA,GAAQ,SAAA,EAAA;AACd,MAAA,EAAA,CAAG,cAAA,CAAe,GAAA,CAAI,KAAA,EAAO,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,CAAA;AACvE,MAAA,gBAAA,CAAiB,EAAE,CAAA;AACnB,MAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAwB,MAAA,CAAO,KAAK,CAAA;AACzD,MAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAGT,MAAA,CAAO,GAAG,CAAA;AACtB,MAAA,EAAA,CAAG,OAAA,CAAQ,EAAA,CAAG,MAAA,EAAQ,WAAW,CAAA;AACjC,MAAA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAQ,WAAW,CAAA;AACnC,MAAA,OAAO;AACL,QAAA,KAAA,CAAM,IAAA,EAAoB;AACxB,UAAA,IAAI,CAAC,GAAG,GAAA,EAAK;AACb,UAAA,IAAI;AACF,YAAA,EAAA,CAAG,GAAA,CAAI,MAAM,IAAI,CAAA;UACnB,CAAA,CAAA,MAAQ;AAER,UAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAA,CAAO,MAAc,IAAA,EAAoB;AACvC,UAAA,IAAI,CAAC,GAAG,cAAA,EAAgB;AACxB,UAAA,EAAA,CAAG,eAAe,GAAA,CAAI,KAAA,EAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AAC3C,UAAA,gBAAA,CAAiB,EAAE,CAAA;AACrB,QAAA,CAAA;QACA,MAAA,GAAe;AACb,UAAA,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,WAAW,CAAA;AAClC,UAAA,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,WAAW,CAAA;AAClC,UAAA,EAAA,CAAG,cAAA,EAAgB,OAAO,KAAK,CAAA;AAC/B,UAAA,gBAAA,CAAiB,EAAE,CAAA;AACrB,QAAA;AAAA,OAAA;AAEJ,IAAA,CAAA;AACA,IAAA,cAAA,CAAe,KAAA,EAAO;AACpB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACjC,MAAA,IAAI,MAAA,SAAe,MAAA,CAAO,IAAA;AAC1B,MAAA,KAAA,MAAW,EAAA,IAAM,QAAA,CAAS,MAAA,EAAA,EAAU;AAClC,QAAA,IAAI,EAAA,CAAG,IAAA,CAAK,IAAA,KAAS,KAAA,SAAc,EAAA,CAAG,IAAA;AACxC,MAAA;AACA,MAAA,OAAO,MAAA;AACT,IAAA,CAAA;AACA,IAAA,kBAAA,CAAmB,IAAI,IAAA,EAAM;AAC3B,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC1B,MAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,KAAK,OAAO,KAAA;AAC3B,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,GAAA,CAAI,MAAM,IAAI,CAAA;AACjB,QAAA,OAAO,IAAA;MACT,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AACT,MAAA;AACF,IAAA,CAAA;AACA,IAAA,kBAAA,CAAmB,IAAI,SAAA,EAAW;AAChC,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC1B,MAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,KAAK,OAAO,IAAA;AAC3B,MAAA,MAAM,SAAS,MAAA,CAAO,MAAA,CAAO,EAAA,CAAG,WAAA,EAAa,GAAG,eAAe,CAAA;AAC/D,MAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,YAAY,CAAA,IAAK,MAAA,CAAO,aAAa,SAAA,EAAW;AACnF,QAAA,OAAO,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,UAAA,GAAa,SAAS,CAAA;AACtD,MAAA;AACA,MAAA,OAAO,MAAA;AACT,IAAA,CAAA;IACA,IAAA,CAAK,EAAA,EAAI,SAAS,SAAA,EAAW;AAC3B,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC1B,MAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAChB,MAAA,IACE,EAAA,CAAG,IAAA,CAAK,MAAA,KAAW,QAAA,IACnB,EAAA,CAAG,IAAA,CAAK,MAAA,KAAW,QAAA,IACnB,EAAA,CAAG,IAAA,CAAK,MAAA,KAAW,OAAA,EACnB;AACA,QAAA,OAAO,KAAA;AACT,MAAA;AACA,MAAA,EAAA,CAAG,KAAK,MAAA,GAAS,QAAA;AACjB,MAAA,EAAA,CAAG,IAAA,CAAK,OAAA,GAAA,iBAAU,IAAI,IAAA,IAAO,WAAA,EAAA;AAI7B,MAAA,IAAI,GAAG,YAAA,EAAc;AACnB,QAAA,KAAK,GAAG,YAAA,CAAa,KAAA,EAAA,CAAQ,KAAA,CAAM,MAAM,MAAS,CAAA;AACpD,MAAA;AACA,MAAA,IAAI,GAAG,GAAA,EAAK;AACV,QAAA,IAAI;AACF,UAAA,EAAA,CAAG,GAAA,CAAI,KAAK,MAAM,CAAA;QACpB,CAAA,CAAA,MAAQ;AAER,QAAA;AACF,MAAA;AACA,MAAA,EAAA,CAAG,KAAA,EAAO,KAAK,MAAM,CAAA;AACrB,MAAA,eAAA,EAAA;AACA,MAAA,OAAO,IAAA;AACT,IAAA,CAAA;AACA,IAAA,MAAA,CAAO,EAAA,EAAI;AACT,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC1B,MAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAEhB,MAAA,EAAA,CAAG,QAAQ,kBAAA,EAAA;AACX,MAAA,QAAA,CAAS,OAAO,EAAE,CAAA;AAClB,MAAA,eAAA,EAAA;AACA,MAAA,OAAO,IAAA;AACT,IAAA,CAAA;IACA,QAAA,GAAW;AACT,MAAA,YAAA,EAAA;AACF,IAAA;AAAA,GAAA;AAgBF,EAAA,SAAS,YAAA,GAAqB;AAC5B,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,IAAI,YAAA,eAA2B,YAAY,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,aAAa,CAAA;MACnC,CAAA,CAAA,MAAQ;AAER,MAAA;AACF,IAAA;AAKA,IAAA,MAAM,MAAA,GAAA,iBAAS,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AAC1B,IAAA,KAAA,MAAW,EAAA,IAAM,QAAA,CAAS,MAAA,EAAA,EAAU;AAClC,MAAA,EAAA,CAAG,QAAQ,kBAAA,EAAA;AACX,MAAA,IACE,GAAG,IAAA,CAAK,MAAA,KAAW,aACnB,EAAA,CAAG,IAAA,CAAK,WAAW,UAAA,EACnB;AACA,QAAA,EAAA,CAAG,KAAK,MAAA,GAAS,QAAA;AACjB,QAAA,EAAA,CAAG,KAAK,OAAA,GAAU,MAAA;AAClB,QAAA,IAAI,GAAG,YAAA,EAAc;AACnB,UAAA,KAAK,GAAG,YAAA,CAAa,KAAA,EAAA,CAAQ,KAAA,CAAM,MAAM,MAAS,CAAA;AACpD,QAAA;AACA,QAAA,IAAI,GAAG,GAAA,EAAK;AACV,UAAA,IAAI;AACF,YAAA,EAAA,CAAG,GAAA,CAAI,KAAK,SAAS,CAAA;UACvB,CAAA,CAAA,MAAQ;AAER,UAAA;AACF,QAAA;AACA,QAAA,EAAA,CAAG,KAAA,EAAO,KAAK,SAAS,CAAA;AAC1B,MAAA;AACF,IAAA;AAKA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW;UACf,OAAA,EAAS,MAAA;UACT,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI;AAAA,SAAA;AAEzD,QAAA,SAAA,CAAUxC,QAAQ,WAAW,CAAA,EAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACnD,QAAA,aAAA,CAAc,aAAa,IAAA,CAAK,SAAA,CAAU,UAAU,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;MACrE,CAAA,CAAA,MAAQ;AAER,MAAA;AACF,IAAA;AACA,IAAA,QAAA,CAAS,KAAA,EAAA;AACX,EAAA;AACF;AAqBA,SAAS,mBAAA,CACP,aACA,QAAA,EACM;AACN,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,YAAA,CAAa,aAAa,MAAM,CAAA;EACxC,CAAA,CAAA,MAAQ;AACN,IAAA;AACF,EAAA;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,IAAA;AACN,MAAA,CAAA,wBAAA,EAA2B,WAAW,CAAA,6BAAA;AAAA,KAAA;AAExC,IAAA;AACF,EAAA;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAErC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CACnB,MAAA,CAAO,CAAC,CAAA,KAA8B,CAAC,CAAC,CAAA,IAAK,OAAO,CAAA,CAAE,EAAA,KAAO,QAAQ,CAAA,CACrE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,aAAA,CAAc,CAAA,CAAE,SAAS,CAAC,CAAA,CACrD,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA;AACvB,EAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACvB,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC3B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,KAAK,MAAA,KAAW,UAAA;AAC9D,IAAA,MAAM,eAAkC,QAAA,GACpC;MACE,GAAG,IAAA;MACH,MAAA,EAAQ,QAAA;AACR,MAAA,OAAA,EAAS,KAAK,OAAA,IAAW;KAAA,GAE3B,IAAA;AACJ,IAAA,MAAM,EAAA,GAAqB;MACzB,IAAA,EAAM,YAAA;AACN,MAAA,WAAA,EAAa,EAAA;AACb,MAAA,WAAA,EAAa,EAAA;MACb,eAAA,EAAiB,CAAA;AACjB,MAAA,OAAA,EAAS,IAAIwC,YAAAA,EAAAA;MACb,IAAA,EAAM,KAAA;MACN,OAAA,EAAS,EAAA;MACT,UAAA,EAAY;AAAA,KAAA;AAEd,IAAA,EAAA,CAAG,OAAA,CAAQ,gBAAgB,EAAE,CAAA;AAC7B,IAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AAC1B,EAAA;AACF;AAIA,SAAS,SAAS,GAAA,EAAqB;AACrC,EAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,IAAA;AACvB,EAAA,IAAI,yBAAA,CAA0B,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,GAAA;AAChD,EAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,OAAA,CAAQ,YAAA,EAAc,MAAM,CAAC,CAAA,CAAA,CAAA;AAC9C;AChyCO,IAAM,mBAAN,MAAuB;AACpB,EAAA,OAAA,uBAAc,GAAA,EAAA;EACd,WAAA,GAAc,CAAA;;;;;EAKd,WAAA,GAAc,KAAA;;;;;;;AAQtB,EAAA,MAAM,aAAA,GAA+B;AACnC,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,MAAMzC,QAAAA,CAAG,IAAA,CAAK,oBAAoB,CAAA;AAC7C,MAAA,OAAA,GAAU,EAAA,CAAG,OAAA;IACf,CAAA,CAAA,MAAQ;AAGN,MAAA,OAAA,GAAU,CAAA;AACZ,IAAA;AACA,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,OAAA,KAAY,IAAA,CAAK,WAAA,EAAa;AAEtD,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,EAAA,CAAmB,MAAM,OAAO;MACnD,OAAA,EAAS,CAAA;AACT,MAAA,OAAA,EAAS;KAAC,CACV,CAAA;AACF,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAC,CAAA;AAGvD,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,KAAK,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW;AAC5C,MAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,EAAG;AACtB,QAAA,MAAM,SAAA,CAAU,EAAE,MAAM,CAAA;AACxB,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACxB,MAAA;AACF,IAAA;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,OAAA,EAAS;AAClC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAE,CAAA;AAC1C,MAAA,IAAI,QAAA,EAAU;AAIZ,QAAA,IACE,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,KAAA,CAAM,QAAQ,MACtC,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,QAAQ,CAAA,EAC7B;AACA,UAAA,MAAM,SAAA,CAAU,SAAS,MAAM,CAAA;AAC/B,UAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,gBAAA,CAAiB,KAAK,CAAC,CAAA;QACpD,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AACnB,QAAA;MACF,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,gBAAA,CAAiB,KAAK,CAAC,CAAA;AACpD,MAAA;AACF,IAAA;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACrB,EAAA;;;;;;AAOA,EAAA,MAAc,gBAAgB,KAAA,EAA4C;AACxE,IAAA,MAAM,KAAK,aAAA,EAAA;AACX,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AACrC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,IAAI,MAAA,CAAO,QAAQ,OAAO,MAAA;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA;AAC5C,MAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,MAAA,MAAA,CAAO,SAAA,GAAY,IAAA;AAGnB,MAAA,MAAM,CAAA,GAAI,MAAM,MAAA,CAAO,SAAA,EAAA;AACvB,MAAA,MAAA,CAAO,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI,YAAY,CAAA;AACvC,MAAA,OAAO,MAAA;AACT,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAChB,MAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,MAAA,MAAA,CAAO,YAAY,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAClE,MAAA,OAAO,MAAA;AACT,IAAA;AACF,EAAA;;;AAIQ,EAAA,WAAA,CAAY,SAAA,EAA4C;AAC9D,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAA,EAAU;AACrC,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,KAAA,KAAU,SAAA,EAAW,OAAO,CAAA;AACxC,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,EAAA,KAAO,SAAA,EAAW,OAAO,CAAA;AACvC,IAAA;AACA,IAAA,OAAO,MAAA;AACT,EAAA;AAEA,EAAA,MAAM,WAAA,GAA4C;AAChD,IAAA,MAAM,KAAK,aAAA,EAAA;AACX,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,MAAM;AACjD,MAAA,KAAA,EAAO,EAAE,KAAA,CAAM,KAAA;AACf,MAAA,QAAA,EAAU,EAAE,KAAA,CAAM,EAAA;MAClB,MAAA,EAAQ,CAAA,CAAE,MAAM,QAAA,CAAS,MAAA;MACzB,IAAA,EAAM,CAAA,CAAE,MAAM,QAAA,CAAS,IAAA;AACvB,MAAA,MAAA,EAAQ,CAAA,CAAE,MAAA,GACN,WAAA,GACA,CAAA,CAAE,YACA,OAAA,GACA,SAAA;MACN,SAAA,EAAW,CAAA,CAAE,OAAO,MAAA,IAAU,CAAA;AAC9B,MAAA,GAAI,EAAE,SAAA,GAAY,EAAE,WAAW,CAAA,CAAE,SAAA,KAAc;KAAC,CAChD,CAAA;AACJ,EAAA;AAEA,EAAA,MAAM,UACJ,KAAA,EACoF;AACpF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC/C,IAAA,IAAI,CAAC,QAAQ,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAA,CAAA,EAAA;AAC/D,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,CAAC,OAAO,KAAA,EAAO;AACnC,MAAA,OAAO;QACL,EAAA,EAAI,KAAA;AACJ,QAAA,KAAA,EAAO,OAAO,SAAA,IAAa;AAAA,OAAA;AAE/B,IAAA;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,OAAO,KAAA,EAAA;AACnC,EAAA;EAEA,MAAM,QAAA,CACJ,KAAA,EACA,QAAA,EACA,IAAA,EAC2B;AAC3B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC/C,IAAA,IAAI,CAAC,QAAQ,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAA,CAAA,EAAA;AAC/D,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAA,OAAO;QACL,EAAA,EAAI,KAAA;AACJ,QAAA,KAAA,EAAO,OAAO,SAAA,IAAa;AAAA,OAAA;AAE/B,IAAA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS;QAC1C,IAAA,EAAM,QAAA;AACN,QAAA,SAAA,EACE,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,GACnB,OACD;OACP,CAAA;AACD,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAA;AACrB,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AAIZ,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,IAAI,qCAAA,CAAsC,IAAA,CAAK,GAAG,CAAA,EAAG;AACnD,QAAA,MAAM,SAAA,CAAU,OAAO,MAAM,CAAA;AAC7B,QAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAChB,QAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,QAAA,MAAA,CAAO,SAAA,GAAY,GAAA;AACrB,MAAA;AACA,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,EAAA;AAC7B,IAAA;AACF,EAAA;AAEA,EAAA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,OAAA,CAAQ,GAAA;AACZ,MAAA,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,SAAA,CAAU,CAAA,CAAE,MAAM,CAAC;AAAA,KAAA;AAEhE,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAA;AACf,EAAA;AACF,CAAA;AAEA,SAAS,iBAAiB,KAAA,EAAsC;AAC9D,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAM,KAAA,EAAO,IAAA,EAAM,WAAW,IAAA,EAAA;AACxD;AAEA,SAAS,aAAa,IAAA,EAIE;AACtB,EAAA,OAAO;AACL,IAAA,IAAA,EAAM,IAAA,CAAK,IAAA;AACX,IAAA,GAAI,KAAK,WAAA,GAAc,EAAE,aAAa,IAAA,CAAK,WAAA,KAAgB,EAAA;AAC3D,IAAA,GAAI,KAAK,WAAA,GAAc,EAAE,aAAa,IAAA,CAAK,WAAA,KAAgB;AAAC,GAAA;AAEhE;AAWA,SAAS,sBACP,GAAA,EACwB;AACxB,EAAA,MAAM,MAA8B,EAAA;AACpC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,IAAA,MAAM,WAAW,CAAA,CAAE,OAAA;AACjB,MAAA,0CAAA;MACA,CAAC,MAAA,EAAQ,MAAc,QAAA,KAAiC;AACtD,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAChC,QAAA,IAAI,OAAA,KAAY,QAAW,OAAO,OAAA;AAClC,QAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,QAAA,OAAO,EAAA;AACT,MAAA;AAAA,KAAA;AAKF,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,QAAA;AACX,EAAA;AACA,EAAA,OAAO,GAAA;AACT;AAEA,eAAe,UAAU,MAAA,EAAsC;AAC7D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,KAAA,EAAA;EACf,CAAA,CAAA,MAAQ;AAER,EAAA;AACF;AAOA,eAAe,WAAW,KAAA,EAA0C;AAClE,EAAA,MAAM,OAAO,KAAA,CAAM,QAAA;AACnB,EAAA,MAAM,SAAS,IAAI,MAAA;IACjB,EAAE,IAAA,EAAM,yBAAA,EAA2B,OAAA,EAAS,OAAA,EAAA;IAC5C,EAAE,YAAA,EAAc,EAAA;AAAG,GAAA;AAErB,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,KAAA;AACR,QAAA,CAAA,QAAA,EAAW,MAAM,KAAK,CAAA,mCAAA;AAAA,OAAA;AAE1B,IAAA;AAOA,IAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,IAAA,CAAK,GAAA,IAAO,EAAE,CAAA;AACxD,IAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,CAAqB;AACzC,MAAA,OAAA,EAAS,IAAA,CAAK,OAAA;MACd,IAAA,EAAM,IAAA,CAAK,QAAQ,EAAA;AACnB,MAAA,GAAA,EAAK,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,GAAG,WAAA,EAAA;;;MAG1B,MAAA,EAAQ;KACT,CAAA;AACD,IAAA,MAAM,YAAsB,EAAA;AAC5B,IAAA,SAAA,CAAU,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAA2B;AACvD,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,CAAM,QAAA,CAAS,MAAM,CAAC,CAAA;AACzE,MAAA,IAAI,SAAA,CAAU,MAAA,GAAS,EAAA,EAAI,SAAA,CAAU,KAAA,EAAA;IACvC,CAAC,CAAA;AACD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAChC,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,IAAA,CAAK,EAAE,EAAE,IAAA,EAAA;AACtC,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,MAAM,IAAI,KAAA,CAAM,UAAA,GAAa,CAAA,EAAG,GAAG;AAAa,QAAA,EAAA,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,GAAK,GAAG,CAAA;AAChF,IAAA;AACA,IAAA,OAAO,MAAA;AACT,EAAA;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAA,CAAM,KAAK,CAAA,YAAA,CAAc,CAAA;AACnE,IAAA,MAAM,YAAY,IAAI,6BAAA,CAA8B,IAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,EAAG;MACrE,WAAA,EAAa;QACX,OAAA,EAAS,IAAA,CAAK,WAAW;AAAC;KAE7B,CAAA;AACD,IAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC9B,IAAA,OAAO,MAAA;AACT,EAAA;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAA,CAAM,KAAK,CAAA,YAAA,CAAc,CAAA;AACnE,IAAA,MAAM,YAAY,IAAI,kBAAA,CAAmB,IAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,EAAG;MAC1D,WAAA,EAAa;QACX,OAAA,EAAS,IAAA,CAAK,WAAW;AAAC;KAE7B,CAAA;AACD,IAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC9B,IAAA,OAAO,MAAA;AACT,EAAA;AACA,EAAA,MAAM,IAAI,KAAA;AACR,IAAA,CAAA,QAAA,EAAW,KAAA,CAAM,KAAK,CAAA,kCAAA,EAAqC,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,GAAA;AAExE;ACnVA,IAAM,aAAA,GAAgB,UAAU,QAAQ,CAAA;AAExC,IAAM,SAAA,GAAY,2CAAA;AAElB,IAAM,kBAAA,GAAqB,GAAA;AAEpB,SAAS,mBAAA,GAAsC;AACpD,EAAA,IAAI,KAAA,GAA6B,IAAA;AACjC,EAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,EAAA,OAAO;IACL,EAAA,EAAI,OAAA;AACJ,IAAA,MAAM,MAAM,IAAA,EAA0D;AACpE,MAAA,MAAM,uBAAA,EAAA;AACN,MAAA,MAAM,SAAA,GAAY,UAAU,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,IAAI,CAAA,CAAA;AAShE,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAC,CAAA,CAAE,SAAS,KAAK,CAAA;AACxC,MAAA,MAAM,GAAA,GAAME,IAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AAC9C,MAAA,MAAMiB,KAAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACpC,MAAA,UAAA,GAAajB,IAAAA,CAAK,GAAA,EAAK,CAAA,YAAA,EAAe,EAAE,CAAA,IAAA,CAAM,CAAA;AAC9C,MAAA,MAAM,UAAA,GAAa;AACjB,QAAA,CAAA,sDAAA,CAAA;AACA,QAAA,CAAA,0DAAA,CAAA;AACA,QAAA,CAAA,6DAAA,CAAA;AACA,QAAA,CAAA,iBAAA,CAAA;AACA,QAAA,CAAA,mBAAA,CAAA;AACA,QAAA,CAAA,eAAA,CAAA;AACA,QAAA,CAAA;AAAA,OAAA,CACA,KAAK,IAAI,CAAA;AACX,MAAA,MAAMkB,SAAAA,CAAU,UAAA,EAAY,UAAA,EAAY,MAAM,CAAA;AAC9C,MAAA,MAAM,IAAA,GAAOT,KAAAA;AACX,QAAA,aAAA;AACA,QAAA,CAAC,QAAA,EAAU,UAAA,EAAY,UAAA,EAAY,OAAA,EAAS,SAAS,CAAA;AACrD,QAAA,EAAE,OAAO,CAAC,QAAA,EAAU,QAAQ,MAAM,CAAA,EAAG,OAAO,KAAA;AAAM,OAAA;AAEpD,MAAA,KAAA,GAAQ,IAAA;AAER,MAAA,MAAM,MAAM,MAAM,IAAI,OAAA,CAAgB,CAACD,UAAS,MAAA,KAAW;AACzD,QAAA,IAAI,OAAA,GAAU,KAAA;AACd,QAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,UAAA,IAAI,OAAA,EAAS;AACb,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,IAAI;AACF,YAAA,IAAA,CAAK,KAAK,SAAS,CAAA;UACrB,CAAA,CAAA,MAAQ;AAER,UAAA;AACA,UAAA,MAAA;YACE,IAAI,KAAA;AACF,cAAA,CAAA,6CAAA,EAAgD,qBAAqB,GAAI,CAAA,CAAA;AAAA;AAC3E,WAAA;AAEJ,QAAA,CAAA,EAAG,kBAAkB,CAAA;AAErB,QAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAkB;AAChC,UAAA,MAAME,KAAAA,GAAO,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA;AAClC,UAAA,KAAA,MAAW,IAAA,IAAQA,KAAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACtC,YAAA,IAAI,KAAK,MAAA,GAAS,CAAA,OAAQ,KAAA,GAAQ,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAE,CAAA;AAC3D,UAAA;AACA,UAAA,IAAI,OAAA,EAAS;AACb,UAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAClC,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,OAAA,GAAU,IAAA;AACV,YAAA,YAAA,CAAa,KAAK,CAAA;AAClBF,YAAAA,QAAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AAClB,UAAA;AACF,QAAA,CAAA;AAIA,QAAA,IAAA,CAAK,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA;AAC9B,QAAA,IAAA,CAAK,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,MAAM,CAAA;AAE9B,QAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA,GAAA,KAAO;AACxB,UAAA,IAAI,OAAA,EAAS;AACb,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,MAAA,CAAO,GAAG,CAAA;QACZ,CAAC,CAAA;AACD,QAAA,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,KAAW;AAClC,UAAA,IAAI,OAAA,EAAS;AACb,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,MAAA;YACE,IAAI,KAAA;cACF,CAAA,+CAAA,EAAkD,IAAI,YAAY,MAAM,CAAA,CAAA;AAAA;AAC1E,WAAA;QAEJ,CAAC,CAAA;MACH,CAAC,CAAA;AAKD,MAAA,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,KAAW;AAClC,QAAA,IAAA,CAAK,KAAA;AACH,UAAA,CAAA,2BAAA,EAA8B,IAAA,IAAQ,GAAG,CAAA,QAAA,EAAW,MAAA,IAAU,GAAG,CAAA,CAAA;AAAA,SAAA;MAErE,CAAC,CAAA;AAED,MAAA,OAAO,EAAE,SAAA,EAAW,GAAA,EAAK,GAAA,EAAK,IAAA,CAAK,OAAO,IAAA,EAAA;AAC5C,IAAA,CAAA;AAEA,IAAA,MAAM,IAAA,GAAsB;AAC1B,MAAA,MAAM,IAAA,GAAO,KAAA;AACb,MAAA,MAAM,GAAA,GAAM,UAAA;AACZ,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,UAAA,GAAa,IAAA;AAIb,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,IAAI;AACF,UAAA,MAAMa,EAAAA,CAAG,GAAA,EAAK,EAAE,KAAA,EAAO,MAAM,CAAA;QAC/B,CAAA,CAAA,MAAQ;AAER,QAAA;AACF,MAAA;AACA,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,QAAA,KAAa,IAAA,EAAM;AACrC,MAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAEnB,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,KAAK,SAAS,CAAA;QACrB,CAAA,CAAA,MAAQ;AAER,QAAA;AACF,MAAA,CAAA,EAAG,GAAK,CAAA;AACR,MAAA,KAAA,CAAM,KAAA,EAAA;AACN,MAAA,MAAM,IAAI,OAAA,CAAc,CAAAb,QAAAA,KAAW;AACjC,QAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,UAAA,YAAA,CAAa,KAAK,CAAA;AAClBA,UAAAA,QAAAA,EAAAA;AACA,UAAA;AACF,QAAA;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,MAAM;AACtB,UAAA,YAAA,CAAa,KAAK,CAAA;AAClBA,UAAAA,QAAAA,EAAAA;QACF,CAAC,CAAA;MACH,CAAC,CAAA;AACH,IAAA;AAAA,GAAA;AAEJ;AAEA,eAAe,uBAAA,GAAyC;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,CAAc,eAAe,CAAC,WAAW,GAAG,EAAE,OAAA,EAAS,KAAO,CAAA;EACtE,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA;AACR,MAAA;AAAA,KAAA;AAMJ,EAAA;AACF;AC9DO,IAAM,mBAAN,MAAuB;EACpB,KAAA,GAA4B,IAAA;EAC5B,WAAA,GAA6B,IAAA;EAC7B,QAAA,GAAkC,IAAA;AAClC,EAAA,SAAA;AACS,EAAA,IAAA;AAEjB,EAAA,WAAA,CAAY,IAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACd,EAAA;;;;;;AAOS,EAAA,QAAA,GAAW,MAAmB;AACrC,IAAA,IAAI,KAAK,WAAA,KAAgB,IAAA,EAAM,OAAO,EAAE,MAAM,MAAA,EAAA;AAC9C,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,KAAK,WAAA,EAAA;AACvC,EAAA,CAAA;EAEA,MAAA,GAAuB;AACrB,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,KAAK,SAAA,EAAA;AAC3C,IAAA;AACA,IAAA,OAAO;MACL,OAAA,EAAS,IAAA;AACT,MAAA,QAAA,EAAU,KAAK,KAAA,CAAM,QAAA;AACrB,MAAA,SAAA,EAAW,KAAK,KAAA,CAAM,SAAA;AACtB,MAAA,GAAA,EAAK,KAAK,KAAA,CAAM,GAAA;AAChB,MAAA,SAAA,EAAW,KAAK,KAAA,CAAM,SAAA;AACtB,MAAA,MAAA,EAAQ,KAAK,KAAA,CAAM,MAAA;AACnB,MAAA,cAAA,EAAgB,KAAK,KAAA,CAAM,cAAA;AAC3B,MAAA,SAAA,EAAW,IAAA,CAAK;AAAA,KAAA;AAEpB,EAAA;AAEA,EAAA,MAAM,OAAOM,MAAAA,EAA2C;AACtD,IAAA,IAAI,KAAK,KAAA,EAAO;AAId,MAAA,MAAM,IAAI,KAAA;AACR,QAAA;AAAA,OAAA;AAEJ,IAAA;AACA,IAAA,MAAM,UAAA,GAAaA,OAAM,QAAA,IAAY,OAAA;AACrC,IAAA,MAAM,QAAA,GAAW,aAAa,UAAU,CAAA;AACxC,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAEjB,IAAA,MAAM,MAAA,GAAS;AACb,MAAA,IAAA,EAAMA,OAAM,UAAA,IAAc,WAAA;MAC1B,IAAA,EAAMA,MAAAA,CAAM,UAAA,IAAc,IAAA,CAAK,IAAA,CAAK;AAAA,KAAA;AAEtC,IAAA,MAAM,iBACJ,MAAA,CAAO,IAAA,KAAS,eAAe,MAAA,CAAO,IAAA,KAAS,KAAK,IAAA,CAAK,IAAA;AAE3D,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAM,SAAS,KAAA,CAAM;AAC7B,QAAA,MAAA;AACA,QAAA,SAAA,EAAW,KAAK,IAAA,CAAK,SAAA;AACrB,QAAA,KAAA,EAAO,CAAA,IAAA,KAAQ;AACb,UAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,IAAI,CAAA;AACxB,QAAA;OACD,CAAA;AACH,IAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,SAAA,GAAY,aAAa,GAAG,CAAA;AACjC,MAAA,MAAM,GAAA;AACR,IAAA;AAMA,IAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,IAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,WAAA,GAAc2B,WAAAA,CAAY,EAAE,CAAA,CAAE,QAAA,CAAS,WAAW,CAAA;AAClD,MAAA,eAAA,GAAkB,OAAO,WAAW,CAAA;AACtC,IAAA;AAEA,IAAA,MAAM,KAAA,GAAqB;MACzB,QAAA,EAAU,UAAA;AACV,MAAA,SAAA,EAAW,OAAA,CAAQ,SAAA;AACnB,MAAA,eAAA;MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACtB,MAAA,GAAA,EAAK,OAAA,CAAQ,GAAA;AACb,MAAA,MAAA;AACA,MAAA;AAAA,KAAA;AAGF,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAEhB,IAAA,MAAM,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAE7C,IAAA,MAAM,MAAA,GAAuB;MAC3B,QAAA,EAAU,UAAA;AACV,MAAA,SAAA,EAAW,OAAA,CAAQ,SAAA;AACnB,MAAA,MAAA;AACA,MAAA;AAAA,KAAA;AAEF,IAAA,IAAI,kBAAkB,WAAA,EAAa;AACjC,MAAA,MAAM,WAAA,GAAc,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,IAAA,CAAA;AACxC,MAAA,MAAA,CAAO,WAAA,GAAc,WAAA;AACrB,MAAA,MAAA,CAAO,WAAA,GAAc,WAAA;AACrB,MAAA,MAAA,CAAO,gBAAA,GAAmB,qBAAA,CAAsB,WAAA,EAAa,WAAW,CAAA;AAC1E,IAAA;AACA,IAAA,OAAO,MAAA;AACT,EAAA;AAEA,EAAA,MAAM,OAAA,GAA0C;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,OAAO,EAAE,UAAU,KAAA,EAAA;AACpC,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,IAAA,EAAA;AACjB,MAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,SAAA,GAAY,aAAa,GAAG,CAAA;AACnC,MAAA;AACF,IAAA;AACA,IAAA,MAAM,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AACpC,IAAA,OAAO,EAAE,UAAU,IAAA,EAAA;AACrB,EAAA;;;;;;;AAQA,EAAA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,SAAS,IAAA,EAAA;MACtB,CAAA,CAAA,MAAQ;AAER,MAAA;AACF,IAAA;AACF,EAAA;AACF,CAAA;AAIA,SAAS,aAAa,EAAA,EAA6B;AACjD,EAAA,IAAI,EAAA,KAAO,OAAA,EAAS,OAAO,mBAAA,EAAA;AAG3B,EAAA,MAAM,WAAA,GAAqB,EAAA;AAC3B,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,MAAA,CAAO,WAAW,CAAC,CAAA,CAAE,CAAA;AACnE;AAEA,SAAS,OAAO3B,MAAAA,EAAuB;AACrC,EAAA,OAAO4B,WAAW,QAAQ,CAAA,CAAE,OAAO5B,MAAK,CAAA,CAAE,OAAO,KAAK,CAAA;AACxD;AAEA,SAAS,aAAa,GAAA,EAAsB;AAC1C,EAAA,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AACxD;AAEA,eAAe,YAAA,CAAa,WAAmB,KAAA,EAAmC;AAChF,EAAA,MAAM,GAAA,GAAMd,IAAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AACzC,EAAA,MAAMiB,KAAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACpC,EAAA,MAAM,IAAA,GAAOjB,IAAAA,CAAK,GAAA,EAAK,aAAa,CAAA;AACpC,EAAA,MAAMkB,SAAAA,CAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,MAAM,CAAA;AAGnE,EAAA,IAAI;AACF,IAAA,MAAMC,KAAAA,CAAM,MAAM,GAAK,CAAA;EACzB,CAAA,CAAA,MAAQ;AAER,EAAA;AACF;AAEA,eAAe,WAAW,SAAA,EAAkC;AAC1D,EAAA,MAAM,IAAA,GAAOnB,IAAAA,CAAK,SAAA,EAAW,yBAAyB,CAAA;AACtD,EAAA,IAAI,CAAC0B,UAAAA,CAAW,IAAI,CAAA,EAAG;AACvB,EAAA,MAAML,EAAAA,CAAG,IAAA,EAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AAChC;AAuBA,SAAS,qBAAA,CAAsB,UAAkB,KAAA,EAAuB;AACtE,EAAA,OAAO,IAAA,CAAK,SAAA;AACV,IAAA;MACE,UAAA,EAAY;QACV,mBAAA,EAAqB;UACnB,SAAA,EAAW,MAAA;UACX,GAAA,EAAK,QAAA;AACL,UAAA,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAG;AAC9C;AACF,KAAA;AAEF,IAAA,IAAA;AACA,IAAA;AAAA,GAAA;AAEJ;ACvVA,SAASX,MAAK,KAAA,EAEZ;AACA,EAAA,OAAO;IACL,OAAA,EAAS;AACP,MAAA;QACE,IAAA,EAAM,MAAA;QACN,IAAA,EAAM,OAAO,UAAU,QAAA,GAAW,KAAA,GAAQ,KAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAC;AAAA;AACzE;AACF,GAAA;AAEJ;AAEO,SAAS,mBAAA,CACd,QACA,IAAA,EACM;AACN,EAAA,MAAM,EAAE,YAAA,GAAe,IAAA;AAEvB,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,eAAA;AACA,IAAA,gjBAAA;AAQA,IAAA;AACE,MAAA,QAAA,EAAUa,EACP,IAAA,CAAK,CAAC,OAAO,CAAC,CAAA,CACd,UAAA,CACA,QAAA;AACC,QAAA;AAAA,OAAA;AAEJ,MAAA,UAAA,EAAYA,CAAAA,CACT,MAAA,EAAA,CACA,GAAA,EAAA,CACA,GAAA,CAAI,CAAC,CAAA,CACL,GAAA,CAAI,KAAK,CAAA,CACT,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA,OAAA;AAEJ,MAAA,UAAA,EAAYA,CAAAA,CACT,MAAA,EAAA,CACA,QAAA,EAAA,CACA,QAAA;AACC,QAAA;AAAA;AACF,KAAA;AAEJ,IAAA,OAAO,EAAE,QAAA,EAAU,UAAA,EAAY,UAAA,EAAA,KAAiB;AAC9C,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,MAAA,CAAO,EAAE,QAAA,EAAU,UAAA,EAAY,YAAY,CAAA;AAC3E,MAAA,OAAOb,MAAK,MAAM,CAAA;AACpB,IAAA;AAAA,GAAA;AAGF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,gBAAA;AACA,IAAA,+IAAA;IAEA,EAAA;IACA,YAAY;AACV,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,EAAA;AAChC,MAAA,OAAOA,MAAK,MAAM,CAAA;AACpB,IAAA;AAAA,GAAA;AAGF,EAAA,MAAA,CAAO,IAAA;AACL,IAAA,eAAA;AACA,IAAA,iMAAA;IAGA,EAAA;IACA,YAAY;AACV,MAAA,OAAOA,KAAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,CAAA;AACjC,IAAA;AAAA,GAAA;AAEJ;AChFO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAC5C,EAAA,WAAA,CAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACd,EAAA;AACF,CAAA;AAEO,SAAS,kBAAkB,IAAA,EAA6C;AAC7E,EAAA,MAAM,IAAA,GAAOF,OAAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAEnC,EAAA,SAASG,aAAY,IAAA,EAAsB;AACzC,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,WAAW,CAAA,EAAG;AACjD,MAAA,MAAM,IAAI,mBAAmB,iCAAiC,CAAA;AAChE,IAAA;AACA,IAAA,IAAIS,UAAAA,CAAW,IAAI,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,kBAAA;AACR,QAAA;AAAA,OAAA;AAEJ,IAAA;AACA,IAAA,MAAM,MAAA,GAASO,SAAAA,CAAU3B,IAAAA,CAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AACzC,IAAA,MAAM,GAAA,GAAM4B,QAAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AACjC,IAAA,IAAI,IAAI,UAAA,CAAW,IAAI,CAAA,IAAKR,UAAAA,CAAW,GAAG,CAAA,EAAG;AAC3C,MAAA,MAAM,IAAI,kBAAA;AACR,QAAA,CAAA,6BAAA,EAAgC,IAAI,CAAA,CAAA;AAAA,OAAA;AAExC,IAAA;AACA,IAAA,OAAO,MAAA;AACT,EAAA;AAEA,EAAA,OAAO;AACL,IAAA,MAAM,SAAS,IAAA,EAAM;AACnB,MAAA,MAAM,GAAA,GAAMT,aAAY,IAAI,CAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,MAAMgC,QAAAA,CAAW,GAAG,CAAA;AAChC,MAAA,OAAO,GAAA,CAAI,SAAS,MAAM,CAAA;AAC5B,IAAA,CAAA;IACA,MAAM,SAAA,CAAU,MAAM,OAAA,EAAS;AAC7B,MAAA,MAAM,GAAA,GAAMhC,aAAY,IAAI,CAAA;AAC5B,MAAA,MAAMM,MAAMlB,OAAAA,CAAQ,GAAG,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC7C,MAAA,MAAM6C,SAAAA,CAAY,KAAK,OAAO,CAAA;AAChC,IAAA,CAAA;AACA,IAAA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAMjC,aAAY,IAAI,CAAA;AAC5B,QAAA,OAAOe,WAAW,GAAG,CAAA;MACvB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AACT,MAAA;AACF,IAAA;AAAA,GAAA;AAEJ;AC8FA,eAAsB,cACpB,IAAA,EACwB;AACxB,EAAA,MAAM,SAAA,GAAYlB,OAAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AACxC,EAAA,IAAI,CAACkB,UAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,SAAS,CAAA,CAAE,CAAA;AACvE,EAAA;AACA,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,KAAA;AAE1B,EAAA,MAAM,SAAS,mBAAA,EAAA;AACf,EAAA,MAAM,aAAA,GAAgB,qBAAA,CAAsB,EAAE,SAAA,EAAW,CAAA;AACzD,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,EAAE,SAAA,EAAW,CAAA;AAMnD,EAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,CAAiB;AAClC,IAAA,SAAA;AACA,IAAA,IAAA;IACA,KAAA,EAAO,CAAA,IAAA,KACL,MAAA,CAAO,IAAA,CAAK;MACV,IAAA,EAAM,YAAA;MACN,EAAA,EAAA,iBAAI,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACf,MAAA;KACD;GACJ,CAAA;AAOD,EAAA,MAAM,EAAE,UAAA,EAAA,GAAe,MAAM,eAAA,CAAgB;AAC3C,IAAA,KAAA,EAAO,IAAA,CAAK,KAAA;AACZ,IAAA,SAAA;AACA,IAAA,IAAA,EAAM,KAAK,IAAA,IAAQ,oBAAA;AACnB,IAAA,OAAA,EAAS,KAAK,OAAA,IAAW;GAC1B,CAAA;AAOD,EAAA,MAAM,WAAW,sBAAA,CAAuB;AACtC,IAAA,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAA;;;;;;;;AAQlD,IAAA,GAAI,KAAK,mBAAA,GACL;AACE,MAAA,WAAA,EAAa,OAAO,EAAE,WAAA,EAAa,GAAA,EAAK,iBAAA,KAAsB;AAC5D,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,mBAAA,CAAqB,WAAW,CAAA;AAC3D,QAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,OAAA,CAAQ,YAAA,CAAa,EAAE,GAAA,EAAK,iBAAiB,CAAA;AAC5D,QAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,IAAA;YACN,CAAA,0BAAA,EAA6B,WAAW,CAAA,GAAA,EAAM,eAAe,CAAA,UAAA,EAC3D,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA;AAAA,WAAA;AAEF,UAAA,OAAO,IAAA;AACT,QAAA;AACF,MAAA;AAAA,KAAA,GAEF;GACL,CAAA;AAMD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAASmB,UAAAA,EAAAA;AAM5B,EAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,EAAA;AAErB,EAAA,MAAM,mBAAmB,YAAY;AACnC,IAAA,MAAM,EAAE,MAAA,EAAA,GAAW,MAAM,eAAA,CAAgB;AACvC,MAAA,KAAA,EAAO,IAAA,CAAK,KAAA;AACZ,MAAA,SAAA;AACA,MAAA,IAAA,EAAM,KAAK,IAAA,IAAQ,oBAAA;AACnB,MAAA,OAAA,EAAS,KAAK,OAAA,IAAW;KAC1B,CAAA;AAKD,IAAA,eAAA,CAAgB,MAAA,EAAQ,EAAE,SAAA,EAAW,CAAA;AAKrC,IAAA,oBAAA,CAAqB,MAAA,EAAQ,EAAE,SAAA,EAAW,CAAA;AAI1C,IAAA,mBAAA,CAAoB,MAAA,EAAQ,EAAE,UAAA,EAAY,MAAA,EAAQ,CAAA;AAMlD,IAAA,oBAAA,CAAqB,MAAA,EAAQ;MAC3B,QAAA,EAAU,QAAA;AACV,MAAA,QAAA;AACA,MAAA,UAAA,EAAY,KAAK,QAAA,IAAY,IAAA;AAC7B,MAAA,GAAI,KAAK,mBAAA,GACL,EAAE,qBAAqB,IAAA,CAAK,mBAAA,KAC5B,EAAA;AACJ,MAAA,GAAI,KAAK,iBAAA,GACL,EAAE,mBAAmB,IAAA,CAAK,iBAAA,KAC1B;KACL,CAAA;AACD,IAAA,OAAO,MAAA;AACT,EAAA,CAAA;AAGA,EAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,MAAM,OAAA,CAAQ,WAAW,IAAA,EAAM,aAAA,EAAe,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACnE,MAAA,MAAA,CAAO,IAAA,CAAK;QACV,IAAA,EAAM,iBAAA;QACN,EAAA,EAAA,iBAAI,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACf,QAAA,KAAA,EAAO,IAAA,CAAK,gBAAA;AACZ,QAAA,KAAA,EAAO,mBAAmB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;OAC3E,CAAA;IACH,CAAC,CAAA;AACH,EAAA;AAEA,EAAA,MAAM,YAAY,cAAA,CAAe;AAC/B,IAAA,SAAA;AACA,IAAA,aAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA,EAAY,KAAK,UAAA,IAAc;GAChC,CAAA;AAED,EAAA,MAAMC,KAAAA,GAAO,MAAM,eAAA,CAAgB;AACjC,IAAA,IAAA;AACA,IAAA,IAAA,EAAM,IAAA,CAAK,IAAA;;;;;;;AAOX,IAAA,IAAA,EAAM,MAAM;AACV,MAAA,MAAM,UAAA,GAAa,OAAO,QAAA,EAAA;AAC1B,MAAA,IAAI,UAAA,CAAW,IAAA,KAAS,QAAA,EAAU,OAAO,UAAA;AACzC,MAAA,OAAO,IAAA,CAAK,IAAA,IAAQ,EAAE,IAAA,EAAM,MAAA,EAAA;AAC9B,IAAA,CAAA;AACA,IAAA,gBAAA;AACA,IAAA,aAAA;AACA,IAAA,MAAA;AACA,IAAA,SAAA;AACA,IAAA,QAAA;AACA,IAAA,QAAA;AACA,IAAA,KAAA;AACA,IAAA,UAAA,EAAY,KAAK,QAAA,IAAY,IAAA;AAC7B,IAAA,GAAI,KAAK,cAAA,GAAiB,EAAE,gBAAgB,IAAA,CAAK,cAAA,KAAmB,EAAA;AACpE,IAAA,GAAI,KAAK,aAAA,GAAgB,EAAE,aAAA,EAAe,IAAA,KAAS,EAAA;AACnD,IAAA,GAAI,KAAK,mBAAA,GACL,EAAE,qBAAqB,IAAA,CAAK,mBAAA,KAC5B,EAAA;AACJ,IAAA,GAAI,KAAK,iBAAA,GACL,EAAE,mBAAmB,IAAA,CAAK,iBAAA,KAC1B,EAAA;IACJ,IAAA,EAAM,EAAE,WAAW,UAAA;GACpB,CAAA;AAED,EAAA,SAAA,CAAU,KAAA,EAAA;AACV,EAAA,MAAA,CAAO,IAAA,CAAK;IACV,IAAA,EAAM,MAAA;IACN,EAAA,EAAA,iBAAI,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACf,IAAA,SAAA;AACA,IAAA;GACD,CAAA;AAMD,EAAA,KAAK,iBAAiB,SAAA,EAAW;AAC/B,IAAA,SAAA;AACA,IAAA,IAAA;AACA,IAAA,IAAA,EAAM,KAAK,IAAA,IAAQ,WAAA;AACnB,IAAA,GAAA,EAAK,OAAA,CAAQ,GAAA;IACb,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACtB,IAAA,IAAA,EAAM,KAAK,IAAA,IAAQ,oBAAA;AACnB,IAAA,UAAA;AACA,IAAA;GACD,CAAA;AAED,EAAA,OAAO;AACL,IAAA,GAAA,EAAKA,KAAAA,CAAK,GAAA;AACV,IAAA,SAAA;AACA,IAAA,WAAA;AACA,IAAA,UAAA;AACA,IAAA,QAAA;AACA,IAAA,KAAA;AACA,IAAA,MAAM,IAAA,GAAO;AACX,MAAA,SAAA,CAAU,IAAA,EAAA;AAIV,MAAA,QAAA,CAAS,QAAA,EAAA;AAGT,MAAA,MAAM,SAAS,QAAA,EAAA;AAIf,MAAA,MAAM,OAAO,QAAA,EAAA;AACb,MAAA,MAAMA,MAAK,IAAA,EAAA;AACb,IAAA;AAAA,GAAA;AAEJ;AAIA,IAAM,iBAAsC,YAAY,IAAA;AAExD,eAAe,OAAA,CACb,SAAA,EACA,IAAA,EACA,aAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO9C,IAAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AACtC,EAAA,IAAI,CAAC0B,UAAAA,CAAW,IAAI,CAAA,EAAG;AACvB,EAAA,MAAM,QAAQ,MAAMV,QAAAA,CAAS,IAAA,EAAM,MAAM,GAAG,IAAA,EAAA;AAC5C,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,KAAK,gBAAA,EAAkB;AAEhD,EAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,UAAA,CAAW,KAAK,gBAAgB,CAAA;AACzD,EAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,EAAA,MAAM,cAAA,GAAiB,CAAA,KAAA,EAAA,iBAAQ,IAAI,IAAA,IAAO,WAAA,EAAA,CAAc,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,CAAA,CAAA;AAC1F,EAAA,MAAM,cAAc,IAAA,CAAK,cAAA,EAAgB,EAAE,KAAA,EAAO,IAAA,CAAK,kBAAkB,CAAA;AACzE,EAAA,MAAM,aAAA,CAAc,UAAA,CAAW,cAAA,EAAgB,MAAA,EAAQ,IAAA,EAAM;IAC3D,WAAA,EAAa;GACd,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AACvC,EAAA,MAAM,aAAA,CAAc,UAAA,CAAW,cAAA,EAAgB,WAAA,EAAa,MAAM,IAAA,EAAM;AACtE,IAAA,WAAA,EAAa,IAAA,CAAK;GACnB,CAAA;AACD,EAAA,MAAA,CAAO,IAAA,CAAK;IACV,IAAA,EAAM,iBAAA;IACN,EAAA,EAAA,iBAAI,IAAI,IAAA,EAAA,EAAO,WAAA,EAAA;AACf,IAAA,KAAA,EAAO,IAAA,CAAK,gBAAA;AACZ,IAAA,cAAA;IACA,MAAA,EAAQ,IAAA;AACR,IAAA,KAAA,EAAO,KAAA,CAAM,IAAA;IACb,UAAA,EAAY;GACb,CAAA;AACH;A1BrVA,eAAsB,SAAS,IAAA,EAA0C;AACvE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAIT,SAAAA,CAAU;AAAA,IAC3B,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,KAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,GAAA,EAAI;AAAA,MACtC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,GAAA,EAAI;AAAA,MACpC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,GAAA,EAAI;AAAA,MACpC,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,GAAA,EAAI;AAAA,MACxC,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,GAAA,EAAI;AAAA,MACnC,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,GAAA,EAAI;AAAA,MACnC,cAAA,EAAgB,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,MACjD,WAAA,EAAa,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,GAAA;AAAI;AAC7C,GACD,CAAA;AAMD,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,MAAA,IAAU,EAAC;AACjC,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,MAAA,IAAU,EAAC;AAIjC,EAAA,MAAM,SAAA,GAAYI,OAAAA;AAAA,IAChB,MAAA,CAAO,SAAA,IAAa,SAAA,CAAU,SAAA,IAAa,QAAQ,GAAA;AAAI,GACzD;AACA,EAAA,IAAI;AACF,IAAA,MAAMC,KAAAA,GAAO,MAAMd,QAAAA,CAAG,IAAA,CAAK,SAAS,CAAA;AACpC,IAAA,IAAI,CAACc,KAAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,kCAAkC,SAAS,CAAA;AAAA;AAAA,OAC7C;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,kCAAkC,SAAS,CAAA;AAAA,6BAAA,EACT,SAAS,CAAA;AAAA;AAAA,KAC7C;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,GAChB,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA,GAC/B,OAAO,SAAA,CAAU,IAAA,KAAS,QAAA,GACxB,UAAU,IAAA,GACV,KAAA;AACN,EAAA,IAAI,CAAC,OAAO,QAAA,CAAS,IAAI,KAAK,IAAA,IAAQ,CAAA,IAAK,OAAO,KAAA,EAAO;AACvD,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,kCAAA,EAAqC,MAAA,CAAO,IAAI,CAAA;AAAA,CAAM,CAAA;AAC3E,IAAA,OAAO,CAAA;AAAA,EACT;AAIA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,SAAA,CAAU,KAAA,IAAS,CAAA,EAAGmC,QAAAA,EAAS,CAAE,QAAQ,CAAA,CAAA,EAAIC,QAAAA,EAAU,CAAA,CAAA;AAIrF,EAAA,MAAM,WAAA,GACJ,OAAO,OAAA,KACN,SAAA,CAAU,eAAe,SAAA,CAAU,IAAA,GAAO,UAAU,IAAA,GAAO,MAAA,CAAA;AAW9D,EAAA,IAAI,KAAA,GAA4B,MAAA,CAAO,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,gBAAA;AAC5D,EAAA,IAAI,CAAC,SAAS,WAAA,EAAa;AACzB,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,WAAW,CAAA;AACvC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AACnB,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb,4CAAuC,WAAW,CAAA,cAAA,EAAiB,aAAa,IAAI,CAAC,4CAC1C,WAAW,CAAA;AAAA;AAAA,SACxD;AAAA,MACF;AACA,MAAA,KAAA,GAAQ,IAAA,CAAK,KAAA;AACb,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,qDAAA,EAAwD,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA;AAAA,OAC5E;AAAA,IACF;AAAA,EACF;AAKA,EAAA,MAAM,cAAA,GAAiB,OAAO,cAAc,CAAA;AAC5C,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,GAAI,iBAAiB,EAAC;AACrE,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,SAAA,CAAU,cAAc,CAAA,GACrD,SAAA,CAAU,iBACV,EAAC;AACL,EAAA,MAAM,MAAA,GAAS,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,UAAA,EAAY,GAAG,UAAU,CAAC,CAAC,CAAA;AAC1D,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,MAAA;AAEpD,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,SAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,SAAA,CAAU,IAAA,IAAQ,WAAA;AAAA,IACvC,GAAI,WAAA,GAAc,EAAE,OAAA,EAAS,WAAA,KAAgB,EAAC;AAAA,IAC9C,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,IACzB,KAAA;AAAA,IACA,GAAI,cAAA,GAAiB,EAAE,cAAA,KAAmB,EAAC;AAAA,IAC3C,GAAI,UAAU,aAAA,KAAkB,IAAA,GAAO,EAAE,aAAA,EAAe,IAAA,KAAS;AAAC,GACpE;AAMA,EAAA,MAAM,mBAAA,GAA4C,OAAM,IAAA,KAAQ;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,IAAI,CAAA;AACzC,MAAA,MAAM,OAAA,GAAUC,qBAAAA,CAAsB,OAAA,CAAQ,MAAM,CAAA;AACpD,MAAA,OAAO;AAAA,QACL,MAAM,YAAA,CAAa,EAAE,GAAA,EAAK,iBAAgB,EAAG;AAC3C,UAAA,OAAO,QAAQ,KAAA,CAAM;AAAA,YACnB,GAAA;AAAA,YACA,GAAI,eAAA,GAAkB,EAAE,eAAA,KAAoB;AAAC,WAC9C,CAAA;AAAA,QACH,CAAA;AAAA,QACA,cAAA,EACE,CAAA,EAAG,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,CAAA,EAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG,IAAA,CAAK,GAAG,CAAC,GAAG,IAAA;AAAK,OAC9E;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,wCAAA,EAA2C,IAAI,CAAA,WAAA,EAC7C,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD,CAAA;AAAA,OACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAUA,EAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,EAAmB;AAK1C,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAM,aAAA,CAAc;AAAA,MAC5B,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,OAAO,EAAC;AAAA,MACR,IAAA,EAAM,kBAAA;AAAA;AAAA,MAEN,IAAA,EAAM,KAAA;AAAA,MACN,mBAAA;AAAA;AAAA;AAAA;AAAA,MAIA,iBAAA,EAAmB,qBAAA;AAAA,MACnB,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa,EAAC;AAAA,MAC/B,GAAI,KAAK,cAAA,GACL,EAAE,gBAAgB,IAAA,CAAK,cAAA,KACvB,EAAC;AAAA,MACL,GAAI,IAAA,CAAK,aAAA,GAAgB,EAAE,aAAA,EAAe,IAAA,KAAS;AAAC,KACrD,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,gDACE,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD;AAAA;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,eAAA,CAAgB;AAAA,IACd,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,YAAY,QAAA,IAAY,IAAA;AAAA,IACxB,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,aAAA,EAAe,KAAK,aAAA,KAAkB,IAAA;AAAA,IACtC,SAAS,IAAA,CAAK;AAAA,GACf,CAAA;AASD,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,EAAqB;AAC5C,IAAA,MAAMC,SAAQ,QAAA,CAAS,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AACjD,IAAA,MAAM,OAAA,GAAU,MAAM,sBAAA,CAAuBA,MAAAA,EAAO,KAAK,SAAS,CAAA;AAClE,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,EAAG,MAAM,GAAG,CAAA,QAAA,EAAW,QAAQ,MAAM,CAAA,sCAAA,EAAyC,MAAM,KAAK;AAAA;AAAA,OAC3F;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,OAAA,GAAU,IAAI,eAAA,EAAgB;AACpC,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,MAAM,QAAA,GAAW,OAAO,MAAA,KAA0C;AAChE,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,YAAA,GAAe,IAAA;AACf,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,EAAK,MAAM,GAAG,CAAA,4BAAA,EAAqB,MAAM,CAAA,cAAA,EAAO,MAAM,KAAK;AAAA;AAAA,KAC7D;AACA,IAAA,OAAA,CAAQ,KAAA,EAAM;AACd,IAAA,MAAM,OAAA,CAAQ,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAI1C,IAAA,MAAM,kBAAkB,IAAA,CAAK,SAAS,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC7D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAA;AACA,EAAA,OAAA,CAAQ,KAAK,QAAA,EAAU,MAAM,KAAK,QAAA,CAAS,QAAQ,CAAC,CAAA;AACpD,EAAA,OAAA,CAAQ,KAAK,SAAA,EAAW,MAAM,KAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAOtD,EAAA,OAAA,CAAQ,KAAK,QAAA,EAAU,MAAM,KAAK,QAAA,CAAS,QAAQ,CAAC,CAAA;AAWpD,EAAA,IAAI,OAAO,WAAA,EAAa;AACtB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,6EAAA,EAA2E,MAAM,KAAK;AAAA;AAAA,KACpG;AAMA,IAAA,MAAM,SAAA,GAAY,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,IAAK,EAAA,EAAI,YAAY,SAAS,CAAA;AAC/D,IAAA,MAAM,KAAA,GAAkB,SAAA,CAAA,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,SAAA,EAAW;AAAA,MACzD,KAAA,EAAO,SAAA;AAAA,MACP,GAAA,EAAK;AAAA,QACH,GAAG,OAAA,CAAQ,GAAA;AAAA,QACX,uBAAuB,OAAA,CAAQ,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAM/B,yBAAyB,OAAA,CAAQ;AAAA;AACnC,KACD,CAAA;AACD,IAAA,MAAM,IAAI,OAAA,CAAc,CAAA1C,QAAAA,KAAW;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,MAAMA,QAAAA,EAAS,CAAA;AAClC,MAAA,OAAA,CAAQ,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,MAAM;AAC7C,QAAA,IAAI;AACF,UAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,QACtB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAMD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAA,CAAQ,KAAA,EAAM;AACd,MAAA,MAAM,OAAA,CAAQ,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAC1C,MAAA,MAAM,kBAAkB,IAAA,CAAK,SAAS,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAEjB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,qBAAA,EAAwB,MAAM,KAAK;AAAA;AAAA,KACjD;AACA,IAAA,MAAM,IAAI,OAAA,CAAc,CAAAA,QAAAA,KAAW;AACjC,MAAA,OAAA,CAAQ,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,MAAMA,UAAS,CAAA;AAAA,IAC1D,CAAC,CAAA;AACD,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,0BAAA,EAA0B,IAAA,CAAK,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,OAAA,EAAK,KAAA,CAAM,KAAK;AAAA;AAAA,GACtF;AAEA,EAAA,IAAI,SAAA,GAAY,KAAK,cAAA,IAAkB,GAAA;AACvC,EAAA,MAAM,UAAA,GAAa,KAAK,cAAA,IAAkB,GAAA;AAK1C,EAAA,MAAM,cAAA,GAAiB,EAAE,SAAA,EAAW,KAAA,EAAM;AAC1C,EAAA,OAAO,CAAC,OAAA,CAAQ,MAAA,CAAO,OAAA,EAAS;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,aAAa,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,OAAA,CAAQ,QAAQ,cAAc,CAAA;AAC1E,MAAA,SAAA,GAAY,KAAK,cAAA,IAAkB,GAAA;AACnC,MAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,QAAA,cAAA,CAAe,SAAA,GAAY,KAAA;AAG3B,QAAA;AAAA,MACF;AAKA,MAAA,MAAM2C,MAAAA,CAAM,GAAA,EAAO,OAAA,CAAQ,MAAM,CAAA;AAAA,IACnC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAA,CAAQ,OAAO,OAAA,EAAS;AAC5B,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,mCAAmC,GAAG;AAAA,kBAAA,EAAuB,SAAS,CAAA;AAAA;AAAA,OACxE;AACA,MAAA,MAAMA,MAAAA,CAAM,SAAA,EAAW,OAAA,CAAQ,MAAM,CAAA;AACrC,MAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,CAAA,EAAG,UAAU,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AACT;AAOA,eAAe,YAAA,CACb,IAAA,EACA,OAAA,EACA,QAAA,EACA,QACA,cAAA,EACe;AACf,EAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,MAAM,IAAI,MAAM,iCAAiC,CAAA;AACpE,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,YAAA,EAAc;AAAA,GAChB;AACA,EAAA,IAAI,KAAK,KAAA,EAAO,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAK,KAAK,CAAA,CAAA;AAE5D,EAAA,MAAM,KAAK,IAAIC,UAAA,CAAU,KAAK,OAAA,EAAS,EAAE,SAAS,CAAA;AAGlD,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC5C,QAAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,EAAA,CAAG,GAAA,CAAI,SAAS,OAAO,CAAA;AACvB,MAAAA,QAAAA,EAAQ;AAAA,IACV,CAAA;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAe;AAC9B,MAAA,EAAA,CAAG,GAAA,CAAI,QAAQ,MAAM,CAAA;AACrB,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACZ,CAAA;AACA,IAAA,EAAA,CAAG,IAAA,CAAK,QAAQ,MAAM,CAAA;AACtB,IAAA,EAAA,CAAG,IAAA,CAAK,SAAS,OAAO,CAAA;AACxB,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,2BAA2B,CAAC,CAAA;AAAA,IAC/C;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,8BAA8B,CAAC,CAAA;AAAA,IAClD,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA;AAAA,CAAgC,CAAA;AAErD,EAAA,MAAM,IAAA,GAAkB,cAAc,EAAoD,CAAA;AAK1F,EAAA,MAAM,iBAAA,GAAoB,YAAY,MAAM;AAC1C,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,KAAK,EAAE,CAAA,EAAG,QAAQ,KAAA,EAAOqC,UAAAA,IAAc,CAAA;AAAA,IAC9C,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,GAAG,GAAM,CAAA;AAET,EAAA,MAAM,SAAS,kBAAA,CAAmB;AAAA,IAChC,IAAA;AAAA,IACA,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,KAAK,QAAA,KAAa,IAAA;AAAA,IAClB,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM/B,cAAc,OAAA,CAAQ,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMtB,gBAAgB,OAAO,EAAE,KAAK,SAAA,EAAW,OAAA,EAAAQ,UAAQ,KAAM;AAUrD,MAAA,MAAM,eAAA,GAA0C;AAAA,QAC9C,GAAIA;AAAA,OACN;AACA,MAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,KAAK,CAAC,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC5D,QAAA,IAAI;AACF,UAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,GAAG,CAAA;AACrB,UAAA,MAAM,UAAA,GAAa,CAAA,CAAE,QAAA,KAAa,MAAA,GAAS,QAAA,GAAW,OAAA;AACtD,UAAA,eAAA,CAAgB,QAAQ,CAAA,GAAI,CAAA,EAAG,UAAU,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,CAAA;AAAA,QACtD,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,OAAO,MAAM,IAAI,OAAA,CAAQ,CAAC7C,UAAS,MAAA,KAAW;AAC5C,QAAA,MAAM,IAAA,GAAO,IAAI4C,UAAA,CAAU,GAAA,EAAK,YAAY,CAAC,GAAG,SAAS,CAAA,GAAI,MAAA,EAAW;AAAA,UACtE,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA,MAAM,WAAW,MAAM;AACrB,UAAA,IAAA,CAAK,GAAA,CAAI,SAAS,SAAS,CAAA;AAC3B,UAAA,IAAA,CAAK,GAAA,CAAI,uBAAuB,cAAc,CAAA;AAC9C,UAAA5C,QAAAA,CAAQ;AAAA,YACN,QAAA,EAAU,KAAK,QAAA,IAAY,EAAA;AAAA,YAC3B,IAAA,EAAM,CAAC,IAAA,EAAM,QAAA,KAAa;AACxB,cAAA,IAAA,CAAK,KAAK,IAAA,EAAM,EAAE,MAAA,EAAQ,QAAA,CAAS,QAAQ,CAAA;AAAA,YAC7C,CAAA;AAAA,YACA,KAAA,EAAO,CAAC,IAAA,EAAM,MAAA,KAAW;AACvB,cAAA,IAAI;AACF,gBAAA,IAAA,CAAK,KAAA,CAAM,MAAM,MAAM,CAAA;AAAA,cACzB,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF,CAAA;AAAA,YACA,WAAW,CAAA,OAAA,KAAW;AACpB,cAAA,IAAA,CAAK,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,EAAa,QAAA,KAAsB;AACrD,gBAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,cACvB,CAAC,CAAA;AAAA,YACH,CAAA;AAAA,YACA,SAAS,CAAA,OAAA,KAAW;AAClB,cAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,EAAc,MAAA,KAAmB;AACjD,gBAAA,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,cACvC,CAAC,CAAA;AAAA,YACH,CAAA;AAAA,YACA,SAAS,CAAA,OAAA,KAAW;AAClB,cAAA,IAAA,CAAK,GAAG,OAAA,EAAS,CAAC,GAAA,KAAe,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,YAC/C;AAAA,WACD,CAAA;AAAA,QACH,CAAA;AACA,QAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAe;AAChC,UAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,QAAQ,CAAA;AACzB,UAAA,MAAA,CAAO,GAAG,CAAA;AAAA,QACZ,CAAA;AACA,QAAA,MAAM,cAAA,GAAiB,CACrB,IAAA,EACA,GAAA,KACG;AACH,UAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,QAAQ,CAAA;AACzB,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAI,UAAA,IAAc,CAAC,EAAE,CAAC,CAAA;AAAA,QACxE,CAAA;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,QAAQ,CAAA;AAC1B,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,SAAS,CAAA;AAC5B,QAAA,IAAA,CAAK,IAAA,CAAK,uBAAuB,cAAc,CAAA;AAAA,MACjD,CAAC,CAAA;AAAA,IACH,CAAA;AAAA;AAAA;AAAA;AAAA,IAIA,WAAW,CAAA,GAAA,KAAO,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOlB,gBAAgB,CAAC,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAQ,KAAM;AAC9C,MAAA,OAAA,CAAQ,SAAS,QAAA,CAAS;AAAA,QACxB,EAAA,EAAI,MAAA;AAAA,QACJ,KAAA;AAAA,QACA,eAAe,IAAA,CAAK,KAAA;AAAA,QACpB,OAAA,EAAS,CAAC,OAAA,CAAQ,OAAA,EAAS,GAAG,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,QACpD,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,OAAA,CAAQ,OAAO,CAAA;AAAA,OACtE,CAAA;AAAA,IACH,CAAA;AAAA;AAAA;AAAA;AAAA,IAIA,eAAA,EAAiB,CAAC,EAAE,QAAA,EAAS,KAAM;AACjC,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,gDAAA,EAAmD,YAAY,GAAG,CAAA;AAAA;AAAA,OACpE;AACA,MAAA,cAAA,CAAe,SAAA,GAAY,IAAA;AAC3B,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAA,CAAM,KAAM,YAAY,CAAA;AAAA,MAC7B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,IAAI,OAAA,CAAc,CAAAA,QAAAA,KAAW;AACjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,MAAM;AAClC,MAAA,aAAA,CAAc,iBAAiB,CAAA;AAC/B,MAAA,QAAA,EAAS;AACT,MAAAA,QAAAA,EAAQ;AAAA,IACV,CAAC,CAAA;AACD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,aAAA,CAAc,iBAAiB,CAAA;AAC/B,MAAA,MAAA,CAAO,KAAA,EAAM,CAAE,OAAA,CAAQ,MAAMA,UAAS,CAAA;AAAA,IACxC;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,MAAA,aAAA,CAAc,iBAAiB,CAAA;AAC/B,MAAA,MAAA,CAAO,KAAA,EAAM,CAAE,OAAA,CAAQ,MAAMA,UAAS,CAAA;AAAA,IACxC,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA;AAAA,CAAoC,CAAA;AAC3D;AAEA,SAAS2C,MAAAA,CAAM,IAAY,MAAA,EAAoC;AAC7D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA3C,QAAAA,KAAW;AAC5B,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,OAAOA,QAAAA,EAAQ;AACnC,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAWA,QAAAA,EAAS,EAAE,CAAA;AACpC,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAAA,QAAAA,EAAQ;AAAA,IACV,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAqBA,SAAS,gBAAgB,IAAA,EAOhB;AACP,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,IAAA,IAAQ,EAAA;AACjC,EAAA,MAAM,SAAA,GACJ,IAAA,IAAQ,IAAA,CAAK,SAAA,CAAU,WAAW,IAAI,CAAA,GAClC,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,CAAK,MAAM,IACtC,IAAA,CAAK,SAAA;AACX,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,GAClB,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,UAAA,EAAa,CAAA,CAAE,KAAK,CAAA,CAAA,GACxD,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,QAAA,EAAW,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,4BAAA,EAA+B,CAAA,CAAE,KAAK,CAAA,CAAA;AAC/E,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,KAAK,aAAA,EAAe;AACtB,IAAA,OAAA,GACE,KAAK,cAAA,IAAkB,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,IAChD,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,MAAA,EAAS,EAAE,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,cAAA,CAAe,KAAK,QAAK,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,6BAAA,EAAgC,CAAA,CAAE,KAAK,CAAA,CAAA,GAC7G,GAAG,CAAA,CAAE,GAAG,CAAA,2BAAA,EAA2B,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,sDAAA,EAAoD,EAAE,KAAK,CAAA,CAAA;AAAA,EACtH,CAAA,MAAO;AACL,IAAA,OAAA,GACE,IAAA,CAAK,kBAAkB,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA,GAChD,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,QAAK,CAAA,GAC9B,IAAI,CAAA,CAAE,GAAG,CAAA,qBAAA,EAAwB,CAAA,CAAE,KAAK,CAAA,CAAA,GACxC,GAAG,CAAA,CAAE,GAAG,CAAA,0BAAA,EAA6B,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,EACpD;AACA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,GACd,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,UAAK,IAAA,CAAK,OAAO,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,GAC7D,GAAG,CAAA,CAAE,GAAG,CAAA,UAAA,EAAa,CAAA,CAAE,KAAK,CAAA,CAAA;AAChC,EAAA,MAAM,OAAO,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,MAAA,EAAI,EAAE,KAAK,CAAA,CAAA;AAChC,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb;AAAA,EAAK,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,UAAA,EAAa,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,IAAA,EAAI,CAAA,CAAE,KAAK,CAAA,YAAA,EAAe,CAAA,CAAE,GAAG,CAAA,IAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,EAAG,CAAA,CAAE,KAAK,IAAI,IAAI;AAAA,EAAA,EAC1H,EAAE,GAAG,CAAA,SAAA,EAAY,CAAA,CAAE,KAAK,OAAO,SAAS;AAAA,EAAA,EACxC,EAAE,GAAG,CAAA,GAAA,EAAM,CAAA,CAAE,KAAK,aAAa,QAAQ;AAAA,EAAA,EACvC,EAAE,GAAG,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,SAAS,OAAO;AAAA,EAAA,EACtC,CAAA,CAAE,GAAG,CAAA,SAAA,EAAY,CAAA,CAAE,KAAK,+DAAsD,CAAA,CAAE,GAAG,CAAA,IAAA,EAAO,CAAA,CAAE,KAAK;AAAA,EAAA,EACjG,EAAE,GAAG,CAAA,IAAA,EAAO,CAAA,CAAE,KAAK,YAAY,IAAI;;AAAA;AAAA,GAE5C;AACF;AAOA,IAAM,MAAA,GAAS,CAAC,CAAE,OAAA,CAAQ,MAAA,CAA8B,KAAA;AACxD,IAAM,QAAQ,MAAA,GACV;AAAA,EACE,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,KAAA,EAAO,UAAA;AAAA,EACP,KAAA,EAAO,UAAA;AAAA,EACP,IAAA,EAAM,UAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA,GACA;AAAA,EACE,KAAA,EAAO,EAAA;AAAA,EACP,IAAA,EAAM,EAAA;AAAA,EACN,GAAA,EAAK,EAAA;AAAA,EACL,KAAA,EAAO,EAAA;AAAA,EACP,KAAA,EAAO,EAAA;AAAA,EACP,IAAA,EAAM,EAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA;A2BzsBJ,IAAMN,MAAAA,GAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,aAAA,EASC,qBAAqB;AAAA,CAAA;AAGpC,eAAsB,aAAa,IAAA,EAA0C;AAC3E,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACvE,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAMA,MAAK,CAAA;AAC1B,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,IAAI,CAAA;AAAA,IACpB,KAAK,MAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,OAAO,QAAQ,IAAI,CAAA;AAAA,IACrB,KAAK,QAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,OAAO,UAAU,IAAI,CAAA;AAAA,IACvB,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,IAAI,CAAA;AAAA,IACpB;AACE,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,6CAA6C,GAAG,CAAA;;AAAA,EAAQA,MAAK,CAAA;AAAA,OAC/D;AACA,MAAA,OAAO,CAAA;AAAA;AAEb;AAEA,eAAe,OAAO,IAAA,EAA0C;AAC9D,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAIK,SAAAA,CAAU;AAAA,IACxC,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS;AAC1B,GACD,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,YAAY,CAAC,CAAA;AAC7B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAUC,QAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,IAAQ,GAAG,CAAC,CAAA;AACtE,EAAA,IAAI,CAACkB,UAAAA,CAAW,OAAO,CAAA,EAAG;AACxB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,8BAA8B,OAAO,CAAA;AAAA;AAAA,KACvC;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAO,YAAA,CAAa,MAAA,CAAO,IAAA,IAAQ4B,QAAAA,CAAS,OAAO,CAAC,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,EAAqB;AAC1C,EAAA,MAAM,IAAA,GAAO,aAAa,MAAA,EAAQ;AAAA,IAChC,IAAA;AAAA,IACA,IAAA,EAAM,OAAA;AAAA,IACN,GAAI,OAAO,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU;AAAC,GAC/C,CAAA;AACD,EAAA,MAAM,qBAAqB,IAAI,CAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,OAAO,MAAA,KAAW,IAAA;AACpC,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,KAAW,IAAA,IAAQ,CAAC,SAAA;AAC9C,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb,UAAK,IAAI,CAAA,QAAA,EAAM,OAAO,CAAA,CAAA,IACnB,YAAA,GAAe,wDAAmD,EAAA,CAAA,GACnE;AAAA,GACJ;AACA,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,QAAQ,IAAA,EAA0C;AAC/D,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI/C,SAAAA,CAAU;AAAA,IAC3B,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,KAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,SAAS,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,WAAU;AAAE,GACtC,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,EAAqB;AAC1C,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AAC3D,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAClC,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KAEF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAIA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAA,CAAO,UAAU,CAAA,CAAE,IAAA;AAAA,IAAK,CAAC,CAAA,EAAG,CAAA,KAC7C,EAAE,SAAA,CAAU,aAAA,CAAc,EAAE,SAAS;AAAA,GACvC;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,CAAA;AAC7D,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,SAAS,QAAA,GAAM,GAAA;AAChD,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,MAAM,cAAc,CAAA,CAAE,KAAA,GAAQ,CAAA,GAAA,EAAM,CAAA,CAAE,KAAK,CAAA,CAAA,CAAA,GAAM,EAAA;AACjD,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,KAAK,CAAA,CAAE,IAAI,GAAG,WAAW;AAAA;AAAA,KAChD;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb;AAAA,EAAK,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,MAAA,CAAO,WAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,IAC1D,OAAO,MAAA,GAAS,CAAA,UAAA,EAAa,MAAA,CAAO,MAAM,KAAK,aAAA,CAAA,GAChD;AAAA,GACJ;AACA,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,UAAU,IAAA,EAA0C;AACjE,EAAA,MAAM,EAAE,WAAA,EAAY,GAAIA,SAAAA,CAAU;AAAA,IAChC,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,SAAS;AAAC,GACX,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,EAAqB;AAC1C,EAAA,MAAM,SAAA,GAAY,aAAa,IAAI,CAAA;AACnC,EAAA,MAAM,UAAU,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,SAAS,CAAA;AAChE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,oDAAoD,SAAS,CAAA;AAAA;AAAA,KAC/D;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,MAAA,EAAQ,SAAS,CAAA;AAC9C,EAAA,MAAM,qBAAqB,IAAI,CAAA;AAC/B,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,eAAA,EAAa,SAAS;AAAA,CAAI,CAAA;AAC/C,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,KAAW,OAAO,MAAA,EAAQ;AAChD,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,MAAM;AAAA,CAAI,CAAA;AAAA,EACjE,CAAA,MAAA,IAAW,CAAC,IAAA,CAAK,MAAA,IAAU,OAAO,MAAA,EAAQ;AACxC,IAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA;AAAA,CAAyC,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,OAAO,IAAA,EAA0C;AAC9D,EAAA,MAAM,EAAE,WAAA,EAAY,GAAIA,SAAAA,CAAU;AAAA,IAChC,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,SAAS;AAAC,GACX,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,6CAA6C,CAAA;AAClE,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,EAAqB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,MAAA,EAAQ,IAAI,CAAA;AAC5C,IAAA,MAAM,qBAAqB,IAAI,CAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,KAAK,UAAA,CAAW,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,KAAK,MAAM,CAAA;AAG1D,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,eAAA,EAAa,IAAA,CAAK,MAAM,CAAA,GAAA,EAAM,CAAA,EAAG,QAAQ,GAAG,CAAA;AAAA,CAAK,CAAA;AACtE,IAAA,OAAO,CAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,6BACE,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CACjD;AAAA;AAAA,KACF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACF;ARhJO,IAAMgD,kBAAAA,GAAoD;EAC/D,aAAA,EAAe;;;IAGb,UAAA,EAAY,sCAAA;IACZ,OAAA,EAAS,gBAAA;AACT,IAAA,OAAA,EAASC,uBAAsB,kBAAkB,CAAA;AACjD,IAAA,SAAA,EAAW,CAAA,EAAA,KAAM,CAAC,QAAA,EAAU,YAAY,EAAE;AAAA;;;;;;;;;AAW9C,CAAA;AASA,SAASA,uBACP,QAAA,EACgE;AAChE,EAAA,OAAO,OAAO,KAAK,aAAA,KAAkB;AACnC,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AACtC,IAAA,MAAM,GAAA,GAAMhD,OAAAA,CAAQP,OAAAA,EAAA,EAAW,UAAU,OAAO,CAAA;AAChD,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAMH,QAAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;IAChC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AACT,IAAA;AACA,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,CAAA,MAAK,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAC,CAAA;AACtD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAC5C,IAAA,MAAM,aAAgD,EAAA;AACtD,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,MAAMA,QAAAA,CAAG,KAAKE,IAAAA,CAAK,GAAA,EAAK,CAAC,CAAC,CAAA;AACrC,QAAA,IAAI,CAAC,OAAO,QAAA,CAAS,WAAW,KAAK,EAAA,CAAG,OAAA,IAAW,cAAc,GAAA,EAAM;AACrE,UAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,GAAG,KAAA,EAAO,EAAA,CAAG,SAAS,CAAA;AAChD,QAAA;MACF,CAAA,CAAA,MAAQ;AAER,MAAA;AACF,IAAA;AACA,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACpC,IAAA,UAAA,CAAW,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAC3C,IAAA,OAAO,WAAW,CAAC,CAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,YAAY,EAAE,CAAA;AACnD,EAAA,CAAA;AACF;;;ASpFA,IAAME,MAAAA,GAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AA6Bd,eAAsB,YAAY,IAAA,EAA0C;AAC1E,EAAA,IAAI,KAAK,QAAA,CAAS,QAAQ,KAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAClD,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAMA,MAAK,CAAA;AAC1B,IAAA,OAAO,CAAA;AAAA,EACT;AAIA,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,IAAI,QAAQ,OAAA,EAAS,OAAO,SAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAClD,EAAA,IAAI,QAAQ,MAAA,EAAQ,OAAO,QAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAChD,EAAA,IAAI,QAAQ,UAAA,EAAY,OAAO,YAAY,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACxD,EAAA,IAAI,QAAQ,QAAA,EAAU,OAAO,UAAU,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACpD,EAAA,IAAI,QAAQ,SAAA,EAAW,OAAO,WAAW,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAEtD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAIK,SAAAA,CAAU;AAAA,IAC3B,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,KAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MACzB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACzB,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MAC1B,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA;AAAU;AAChC,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AACpC,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,kBAAA,CAAmB,QAAQ,qBAAqB,CAAA;AAChD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AAExB,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,OAAO,SAAA,CAAU;AAAA,MACf,QAAA;AAAA,MACA,UAAU,MAAA,CAAO,MAAA;AAAA,MACjB,MAAA,EAAQ,CAAC,MAAA,CAAO,UAAU;AAAA,KAC3B,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,MAAMkD,KAAAA,GAAO,MAAM,aAAA,CAAc,QAAA,CAAS,GAAG,CAAA;AAC7C,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAUA,OAAM,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AACzD,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,OAAO,MAAA,CAAO,MAAA,GACV,cAAA,CAAe,QAAA,EAAU,CAAC,MAAA,CAAO,UAAU,CAAC,CAAA,GAC5C,QAAA,CAAS,QAAA,EAAU,CAAC,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,EAC5C;AAGA,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,QAAA,CAAS,GAAG,CAAA;AAC7C,EAAA,UAAA,CAAW,IAAI,CAAA;AACf,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,SAAS,IAAA,EAA0C;AAChE,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAIlD,SAAAA,CAAU;AAAA,IACxC,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACtB,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC5B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,GAAA,EAAI;AAAA,MACrC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MAC1B,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MACxB,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA;AAAU;AAChC,GACD,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KAEF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,4DAA4D,WAAA,CACzD,KAAA,CAAM,CAAC,CAAA,CACP,IAAA,CAAK,GAAG,CAAC;AAAA;AAAA,KACd;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AACpC,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,kBAAA,CAAmB,QAAQ,2BAA2B,CAAA;AACtD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AAExB,EAAA,MAAM,IAAA,GAA+B,EAAE,OAAA,EAAS,IAAA,EAAK;AACrD,EAAA,IAAI,OAAO,GAAA,EAAK,IAAA,CAAK,GAAA,GAAMC,OAAAA,CAAQ,OAAO,GAAG,CAAA;AAC7C,EAAA,IAAI,MAAA,CAAO,SAAA,EAAW,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,SAAA;AAClD,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,MAAA;AACxC,EAAA,IAAI,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,KAAA;AAEtC,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,YAAA;AAAA,MACX,CAAA,EAAG,SAAS,GAAG,CAAA,eAAA,CAAA;AAAA,MACf,IAAA;AAAA,MACA,QAAA,CAAS;AAAA,KACX;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACZ,MAAM,UAAA,CAAW,QAAA,EAAU,2BAA2B,CAAA,GAAK;AAAA,OAC9D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAG;AAAA,CAAI,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AAAA,EAC3D,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,mCAAA,EAAsC,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,EAAE,CAAA,EAAA,EACnD,IAAA,CAAK,MAAM,CAAA,SAAA,EAAO,IAAA,CAAK,OAAO;AAAA;AAAA,KACvC;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,OAAO,SAAA,CAAU;AAAA,MACf,QAAA;AAAA,MACA,UAAU,IAAA,CAAK,EAAA;AAAA,MACf,MAAA,EAAQ,CAAC,MAAA,CAAO,UAAU;AAAA,KAC3B,CAAA;AAAA,EACH;AACA,EAAA,OAAO,CAAA;AACT;AAEA,eAAe,QAAQ,IAAA,EAA0C;AAC/D,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAID,SAAAA,CAAU;AAAA,IACxC,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA;AAAU;AAC1B,GACD,CAAA;AACD,EAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KAEF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,2DAA2D,WAAA,CACxD,KAAA,CAAM,CAAC,CAAA,CACP,IAAA,CAAK,GAAG,CAAC;AAAA;AAAA,KACd;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AACpC,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,kBAAA,CAAmB,QAAQ,0BAA0B,CAAA;AACrD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AAExB,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAM,YAAA;AAAA,MACnB,GAAG,QAAA,CAAS,GAAG,CAAA,UAAA,EAAa,kBAAA,CAAmB,EAAE,CAAC,CAAA,KAAA,CAAA;AAAA,MAClD,EAAC;AAAA,MACD,QAAA,CAAS;AAAA,KACX;AACA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AAAA,IAC7D,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,MAAA,CAAO,EAAA,GACH,CAAA,0CAAA,EAA6C,EAAE;AAAA,CAAA,GAC/C,6BAA6B,EAAE,CAAA;AAAA;AAAA,OACrC;AAAA,IACF;AACA,IAAA,OAAO,MAAA,CAAO,KAAK,CAAA,GAAI,CAAA;AAAA,EACzB,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACZ,MAAM,UAAA,CAAW,QAAA,EAAU,0BAA0B,CAAA,GAAK;AAAA,OAC7D;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,yCAAyC,EAAE,CAAA;AAAA;AAAA,OAC7C;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,0BAAA,EAA6B,GAAG;AAAA,CAAI,CAAA;AACzD,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AASA,eAAe,YAAY,IAAA,EAA0C;AAInE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,MAAA,KAAW,EAAA,GAAK,CAAC,GAAG,IAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA;AACjE,EAAA,MAAM,iBAAA,GAAoB,WAAW,EAAA,GAAK,KAAK,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAEpE,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAIA,SAAAA,CAAU;AAAA,IACxC,IAAA,EAAM,QAAA;AAAA,IACN,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACtB,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MAC5B,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,MACvB,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MAC1B,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MACxB,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA;AAAU;AAChC,GACD,CAAA;AAOD,EAAA,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAQ9D,EAAA,MAAM,OACJ,iBAAA,CAAkB,MAAA,GAAS,IAAI,iBAAA,GAAoB,CAAC,GAAG,WAAW,CAAA;AACpE,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KAGF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AACpC,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,kBAAA,CAAmB,QAAQ,8BAA8B,CAAA;AACzD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AAExB,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,GAAO,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA,GAAI,MAAA;AAC9D,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,GAAO,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA,GAAI,MAAA;AAC9D,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,IAAA;AAAA,IACA,MACE,IAAA,IAAQ,MAAA,CAAO,SAAS,IAAI,CAAA,IAAK,OAAO,CAAA,GACpC,IAAA,GACA,OAAA,CAAQ,MAAA,CAAO,WAAW,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,GACjD,OAAA,CAAQ,OAAO,OAAA,GACf,EAAA;AAAA,IACR,MACE,IAAA,IAAQ,MAAA,CAAO,SAAS,IAAI,CAAA,IAAK,OAAO,CAAA,GACpC,IAAA,GACA,OAAA,CAAQ,MAAA,CAAO,QAAQ,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,GAC3C,OAAA,CAAQ,OAAO,IAAA,GACf;AAAA,GACV;AACA,EAAA,IAAI,OAAO,GAAA,EAAK,IAAA,CAAK,GAAA,GAAMC,OAAAA,CAAQ,OAAO,GAAG,CAAA;AAC7C,EAAA,IAAI,MAAA,CAAO,SAAA,EAAW,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,SAAA;AAClD,EAAA,IAAI,MAAA,CAAO,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,IAAA;AACpC,EAAA,IAAI,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,MAAA,CAAO,KAAA;AAEtC,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,YAAA;AAAA,MACX,CAAA,EAAG,SAAS,GAAG,CAAA,kBAAA,CAAA;AAAA,MACf,IAAA;AAAA,MACA,QAAA,CAAS;AAAA,KACX;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACZ,MAAM,UAAA,CAAW,QAAA,EAAU,8BAA8B,CAAA,GAAK;AAAA,OACjE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,GAAG;AAAA,CAAI,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AAAA,EAC3D,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,sCAAA,EAAyC,IAAA,CAAK,EAAE,CAAA,EAC3C,IAAA,CAAK,IAAA,GAAO,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,QAAA,EAAM,KAAK,OAAO;AAAA;AAAA,KAC3D;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,OAAO,SAAA,CAAU;AAAA,MACf,QAAA;AAAA,MACA,UAAU,IAAA,CAAK,EAAA;AAAA,MACf,MAAA,EAAQ,CAAC,MAAA,CAAO,UAAU;AAAA,KAC3B,CAAA;AAAA,EACH;AACA,EAAA,OAAO,CAAA;AACT;AAkBA,eAAe,cAAA,GAAiD;AAK9D,EAAA,IAAI,OAAA,CAAQ,IAAI,qBAAA,EAAuB;AACrC,IAAA,MAAM,MAAM,OAAA,CAAQ,GAAA,CAAI,qBAAA,CAAsB,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAChE,IAAA,IAAI,KAAA,GAA4B,QAAQ,GAAA,CAAI,uBAAA;AAC5C,IAAA,IAAI,CAAC,KAAA,EAAO;AAIV,MAAA,MAAMkD,UAAS,MAAM,oBAAA,EAAqB,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC5D,MAAA,IAAIA,OAAAA,EAAQ;AACV,QAAA,KAAA,MAAW,EAAA,IAAMA,QAAO,UAAA,EAAY;AAClC,UAAA,MAAM,EAAA,GAAK,MAAM,yBAAA,CAA0B,EAAA,CAAG,IAAI,CAAA;AAClD,UAAA,IAAI,EAAA,CAAG,YAAY,EAAA,CAAG,QAAA,CAAS,QAAQ,GAAA,IAAO,EAAA,CAAG,SAAS,KAAA,EAAO;AAC/D,YAAA,KAAA,GAAQ,GAAG,QAAA,CAAS,KAAA;AACpB,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,EAAE,GAAA,EAAK,GAAI,QAAQ,EAAE,KAAA,EAAM,GAAI,EAAC,EAAG;AAAA,MAC1C,OAAO;AAAC,KACV;AAAA,EACF;AACA,EAAA,MAAM,SAAS,MAAM,oBAAA,EAAqB,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC5D,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAE,OAAO,IAAA,EAAM,KAAA,EAAO,EAAC,EAAE;AAC7C,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,mBAAmB,MAAM,CAAA;AAAA,IACzB,GAAG,MAAA,CAAO;AAAA,GACZ,CAAE,MAAA;AAAA,IACA,CAAC,CAAA,EAAG,CAAA,EAAG,GAAA,KACL,CAAC,CAAC,CAAA,IAAK,GAAA,CAAI,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,EAAG,IAAA,KAAS,CAAA,CAAE,IAAI,CAAA,KAAM;AAAA,GACtD;AACA,EAAA,MAAM,QAAwC,EAAC;AAC/C,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,MAAA,GAAS,MAAM,yBAAA,CAA0B,CAAA,CAAE,IAAI,CAAA;AACrD,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,QAAA,EAAU,KAAA,EAAM;AAAA,IACzC;AACA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,KAAA,CAAM,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IACzB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAC9B;AAmBA,SAAS,kBAAA,CAAmB,QAA+B,IAAA,EAAoB;AAC7E,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,GAAG,IAAI,CAAA,kBAAA,CAAA;AAAA,IACP,CAAA,mEAAA;AAAA,GACF;AACA,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC3B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,CAAA;AAAA,MACA,CAAA,QAAA,EAAW,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,uCAAA;AAAA,KAChC;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,GAAA,EAAI,GAAI,CAAA,CAAE,KAAA,CAAM,OAAA,EAAS,CAAA,GAAI,GAAA;AACtE,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,IAAA,EAAO,EAAE,IAAI,CAAA,OAAA,EAAU,EAAE,GAAA,IAAO,GAAG,SAAM,GAAG,CAAA,KAAA;AAAA,OAC9C;AAAA,IACF;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,CAAA;AAAA,MACA,CAAA,wDAAA,CAAA;AAAA,MACA,GAAG,OAAO,KAAA,CAAM,GAAA,CAAI,OAAK,CAAA,OAAA,EAAU,CAAA,CAAE,IAAI,CAAA,CAAE;AAAA,KAC7C;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,IAAI,IAAI,IAAI,CAAA;AAC9C;AAgBA,eAAe,0BAA0B,aAAA,EAAiD;AACxF,EAAA,MAAM,IAAA,GAAOlD,OAAAA,CAAQ,aAAA,EAAe,aAAA,EAAe,cAAc,CAAA;AACjE,EAAA,IAAII,KAAAA;AACJ,EAAA,IAAI;AACF,IAAAA,KAAAA,GAAO,MAAMd,QAAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,UAAU,IAAA,EAAK;AAAA,EAC1B;AACA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAMA,QAAAA,CAAG,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,UAAU,IAAA,EAAK;AAAA,EAC1B;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,UAAU,IAAA,EAAK;AAAA,EAC1B;AACA,EAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,UAAU,OAAO,EAAE,UAAU,IAAA,EAAK;AAQ7D,EAAA,IAAI,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC6D,WAAAA,CAAW,MAAA,CAAO,GAAG,CAAA,EAAG;AAC7D,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA;AAAA,QACA,GAAA,EAAK,OAAO,GAAA,IAAO,IAAA;AAAA,QACnB,KAAA,EAAO/C,MAAK,KAAA,IAAS;AAAA;AACvB,KACF;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU;AAAA,MACR,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,QAAQ,WAAW,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAA;AAAA,MACxD,UAAA,EAAY,IAAA;AAAA,MACZ,GAAI,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,GAAI;AAAC;AACpE,GACF;AACF;AAEA,SAAS+C,YAAW,GAAA,EAAsB;AACxC,EAAA,IAAI;AAKF,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,OAAQ,GAAA,CAA8B,IAAA;AAC5C,IAAA,IAAI,IAAA,KAAS,SAAS,OAAO,IAAA;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,eAAe,cAAc,OAAA,EAA+C;AAC1E,EAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,CAAA,EAAG,OAAO,CAAA,SAAA,CAAW,CAAA;AACpD,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,MAAM,OAAA,CAAS,IAAA,CAAgC,QAAQ,CAAA,EAAG;AACtE,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAQ,IAAA,CAA2C,QAAA;AACrD;AAEA,SAAS,WAAW,IAAA,EAAiC;AACnD,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,gBAAgB,CAAA;AACrC,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,CAAG,MAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IAC7C,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IACjD,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,aAAA,CAAc,MAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IAC/D,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IACrD,GAAA,EAAK;AAAA,GACP;AACA,EAAA,MAAM,MAAA,GACJ,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,EAAE,CAAA,GACnB,IAAA,GACA,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA,GACvB,IAAA,GACA,GAAA,CAAI,WAAA,EAAa,MAAA,CAAO,SAAS,CAAA,GACjC,IAAA,GACA,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA,GAC3B,IAAA,GACA,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA,GACrB,WAAA;AACF,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,OAAA,EAAU,MAAM,CAAA;AAAA,CAAW,CAAA;AAChD,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,GAAA,GAAM,cAAc,GAAA,GAAM,IAAI,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,EAAS,CAAA;AAC/D,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAA,CAAE,MAAM,CAAA;AAClC,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,IAAI,CAAA,CAAE,EAAA,EAAI,OAAO,EAAE,CAAA,GACjB,OACA,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA,GACvB,IAAA,GACA,IAAI,CAAA,CAAE,aAAA,EAAe,OAAO,SAAS,CAAA,GACrC,CAAA,EAAA,EACG,IAAI,GAAG,GAAA,CAAI,CAAA,CAAE,QAAQ,MAAA,CAAO,MAAM,CAAC,CAAA,SAAA,CAAA,GAEtC,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GACnB,IAAA,GACAC,UAAS,CAAA,CAAE,OAAA,EAAS,EAAE,CAAA,GACtB;AAAA,KACJ;AAAA,EACF;AACF;AAEA,SAAS,aAAa,MAAA,EAAwB;AAC5C,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,SAAA;AACH,MAAA,OAAO,UAAA;AAAA;AAAA,IACT,KAAK,UAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,SAAA;AAAA;AAAA,IACT,KAAK,QAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,UAAA;AAAA;AAAA,IACT;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;AAEA,SAAS,GAAA,CAAI,GAAW,CAAA,EAAmB;AACzC,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,OAAO,CAAA;AAC1B,EAAA,OAAO,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,EAAE,MAAM,CAAA;AACpC;AAEA,SAASA,SAAAA,CAAS,GAAW,CAAA,EAAmB;AAC9C,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,OAAO,CAAA;AAC1B,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,GAAI,QAAA;AAC7B;AAEA,SAAS,cAAc,EAAA,EAAoB;AACzC,EAAA,IAAI,EAAA,GAAK,KAAQ,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAC,CAAA,CAAA,CAAA;AAChD,EAAA,IAAI,EAAA,GAAK,MAAW,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,GAAM,CAAC,CAAA,CAAA,CAAA;AACrD,EAAA,IAAI,EAAA,GAAK,OAAY,OAAO,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,IAAS,CAAC,CAAA,CAAA,CAAA;AACzD,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,KAAU,CAAC,CAAA,CAAA,CAAA;AACvC;AAsBA,eAAe,cAAA,CACb,UACA,MAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,KAAA,KAAU,IAAA;AACpC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,QAAA,CAAS,GAAG,CAAA;AAC7C,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAA,CAAQ,KAAA,CAAM,WAAW,IAAI,CAAA;AAC7B,EAAA,OAAA,CAAQ,MAAM,MAAA,EAAO;AACrB,EAAA,OAAA,CAAQ,KAAA,CAAM,YAAY,MAAM,CAAA;AAEhC,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,MAAA,GAA0B,IAAA;AAC9B,EAAA,IAAI,cAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,OAA4B,EAAC;AACjC,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,OAAO,CAAA;AAC5B,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,gCAAA,EAAgC,SAAS,GAAG,CAAA;;AAAA;AAAA,KAC9C;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAW,SAAS,CAAA;;AAAA,CAAa,CAAA;AAAA,IACxD;AACA,IAAA,gBAAA,CAAiB,MAAM,MAAM,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,UAAU,YAA2B;AACzC,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,aAAA,CAAc,QAAA,CAAS,GAAG,CAAA;AAAA,IACzC,SAAS,GAAA,EAAK;AACZ,MAAA,SAAA,GAAY,gBAAgB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAC5E,MAAA,IAAA,GAAO,EAAC;AAAA,IACV;AACA,IAAA,IAAI,MAAA,IAAU,KAAK,MAAA,EAAQ,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAAA,EACjE,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KAAsB;AAEnC,IAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,GAAA,EAAK;AACnC,MAAA,IAAI,SAAS,CAAA,EAAG,MAAA,EAAA;AAChB,MAAA,OAAA,EAAQ;AACR,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,GAAA,EAAK;AACnC,MAAA,IAAI,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,MAAA,EAAA;AAC9B,MAAA,OAAA,EAAQ;AACR,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA,EAAM;AAChC,MAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAC1B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,GAAS,QAAA;AACT,QAAA,cAAA,GAAiB,MAAA,CAAO,EAAA;AACxB,QAAA,IAAA,GAAO,IAAA;AAAA,MACT;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAC1B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,KAAK,YAAA;AAAA,QACH,GAAG,QAAA,CAAS,GAAG,aAAa,kBAAA,CAAmB,MAAA,CAAO,EAAE,CAAC,CAAA,KAAA,CAAA;AAAA,QACzD,EAAC;AAAA,QACD,QAAA,CAAS;AAAA,OACX,CACG,KAAK,CAAA,CAAA,KAAK;AACT,QAAA,SAAA,GAAY,CAAA,CAAE,KACV,CAAA,gBAAA,EAAmB,MAAA,CAAO,EAAE,CAAA,CAAA,GAC5B,CAAA,EAAG,OAAO,EAAE,CAAA,YAAA,CAAA;AAChB,QAAA,OAAO,OAAA,EAAQ;AAAA,MACjB,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,GAAA,KAAO;AACZ,QAAA,SAAA,GAAY,eAAe,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,MAC7E,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM,SAAS,CAAA;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAC1B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IACE,MAAA,CAAO,WAAW,QAAA,IAClB,MAAA,CAAO,WAAW,QAAA,IAClB,MAAA,CAAO,WAAW,OAAA,EAClB;AACA,QAAA,SAAA,GAAY,CAAA,GAAA,EAAM,MAAA,CAAO,EAAE,CAAA,OAAA,EAAU,OAAO,MAAM,CAAA,mBAAA,CAAA;AAClD,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACF;AACA,MAAA,KAAK,UAAA;AAAA,QACH,GAAG,QAAA,CAAS,GAAG,aAAa,kBAAA,CAAmB,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA;AAAA,QACzD,QAAA,CAAS;AAAA,OACX,CACG,KAAK,MAAM;AACV,QAAA,SAAA,GAAY,CAAA,OAAA,EAAU,OAAO,EAAE,CAAA,CAAA;AAC/B,QAAA,OAAO,OAAA,EAAQ;AAAA,MACjB,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,GAAA,KAAO;AACZ,QAAA,SAAA,GAAY,iBAAiB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,MAC/E,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM,SAAS,CAAA;AAC1B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,SAAA,GAAY,EAAA;AACZ,MAAA,KAAK,OAAA,EAAQ,CAAE,OAAA,CAAQ,MAAM,SAAS,CAAA;AACtC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,KAAQ,GAAA,IAAO,GAAA,KAAQ,GAAA,EAAkB;AAC3C,MAAA,IAAA,GAAO,IAAA;AACP,MAAA;AAAA,IACF;AACK,EACP,CAAA;AAEA,EAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,KAAK,CAAA;AAC9B,EAAA,MAAM,gBAAgB,MAAY;AAChC,IAAA,IAAA,GAAO,IAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,aAAa,CAAA;AAEpC,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,EAAQ;AACd,IAAA,OAAA,EAAQ;AACR,IAAA,OAAO,CAAC,IAAA,EAAM;AACZ,MAAA,MAAM,IAAI,OAAA,CAAc,CAAA,GAAA,KAAO,UAAA,CAAW,GAAA,EAAK,GAAK,CAAC,CAAA;AACrD,MAAA,IAAI,IAAA,EAAM;AACV,MAAA,MAAM,OAAA,EAAQ;AACd,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AAC/B,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,aAAa,CAAA;AACnC,IAAA,OAAA,CAAQ,KAAA,CAAM,WAAW,KAAK,CAAA;AAC9B,IAAA,OAAA,CAAQ,MAAM,KAAA,EAAM;AACpB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,MAAA,KAAW,YAAY,cAAA,EAAgB;AACzC,IAAA,OAAO,SAAA,CAAU;AAAA,MACf,QAAA;AAAA,MACA,QAAA,EAAU,cAAA;AAAA,MACV;AAAA,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,CAAA;AACT;AAQA,SAAS,gBAAA,CAAiB,MAA2B,MAAA,EAAsB;AACzE,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,gBAAgB,CAAA;AACrC,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,CAAG,MAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IAC7C,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IACjD,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,aAAA,CAAc,MAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IAC/D,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA,EAAG,CAAC,CAAA;AAAA,IACrD,GAAA,EAAK;AAAA,GACP;AACA,EAAA,MAAM,MAAA,GACJ,IAAA,GACA,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,EAAE,CAAA,GACnB,IAAA,GACA,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,IAAI,IACvB,IAAA,GACA,GAAA,CAAI,WAAA,EAAa,MAAA,CAAO,SAAS,CAAA,GACjC,IAAA,GACA,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA,GAC3B,IAAA,GACA,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,GAAG,CAAA,GACrB,WAAA;AACF,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,OAAA,EAAU,MAAM,CAAA;AAAA,CAAW,CAAA;AAChD,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,MAAM,GAAA,GAAM,cAAc,GAAA,GAAM,IAAI,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,EAAS,CAAA;AAC/D,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAA,CAAE,MAAM,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,CAAA,KAAM,MAAA,GAAS,eAAA,GAAa,GAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,CAAA,KAAM,MAAA,GAAS,SAAA,GAAY,EAAA;AACzC,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,EAAG,MAAM,CAAA,CAAA,CAAA,GACP,GAAA,CAAI,EAAE,EAAA,EAAI,MAAA,CAAO,EAAE,CAAA,GACnB,IAAA,GACA,IAAI,CAAA,CAAE,IAAA,EAAM,OAAO,IAAI,CAAA,GACvB,OACA,GAAA,CAAI,CAAA,CAAE,eAAe,MAAA,CAAO,SAAS,IACrC,CAAA,EAAA,EACG,IAAI,GAAG,GAAA,CAAI,CAAA,CAAE,QAAQ,MAAA,CAAO,MAAM,CAAC,CAAA,SAAA,CAAA,GAEtC,GAAA,CAAI,KAAK,MAAA,CAAO,GAAG,IACnB,IAAA,GACAA,SAAAA,CAAS,EAAE,OAAA,EAAS,EAAE,IACtB,KAAA,GACA;AAAA,KACJ;AAAA,EACF,CAAC,CAAA;AACH;AAiBA,eAAe,QAAA,CACb,UACA,MAAA,EACiB;AACjB,EAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,UAAU,IAAA,IAAQ,OAAA,CAAQ,OAAO,KAAA,KAAU,IAAA;AACrE,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,QAAA,CAAS,GAAG,CAAA;AAC7C,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,OAAO,CAAA;AAAA,EACT;AAMA,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,MAAA,GAAqC,IAAA;AACzC,EAAA,IAAI,cAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,WAAgC,EAAC;AACrC,EAAA,IAAI,eAA+C,EAAC;AACpD,EAAA,IAAI,MAAA,GAGO,IAAA;AACX,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,IAAI,cAAA,GAAiB,CAAA;AAKrB,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAsB;AAC/C,EAAA,IAAI,gBAAA,GAAmB,CAAA;AAGvB,EAAA,MAAM,QAAA,GAAW,aAAA;AACjB,EAAA,MAAM,OAAA,GAAU,aAAA;AAChB,EAAA,MAAM,OAAA,GAAU,WAAA;AAChB,EAAA,MAAM,OAAA,GAAU,WAAA;AAChB,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,QAAA,GAAW,OAAO,CAAA;AACvC,EAAA,OAAA,CAAQ,KAAA,CAAM,WAAW,IAAI,CAAA;AAC7B,EAAA,OAAA,CAAQ,MAAM,MAAA,EAAO;AACrB,EAAA,OAAA,CAAQ,KAAA,CAAM,YAAY,MAAM,CAAA;AAEhC,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,OAAO,CAAA;AACtC,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,KAAA,CAAM,WAAW,KAAK,CAAA;AAAA,IAChC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAA,CAAQ,MAAM,KAAA,EAAM;AAAA,EACtB,CAAA;AAGA,EAAA,MAAM,UAAU,YAA2B;AACzC,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,aAAA,CAAc,QAAA,CAAS,GAAG,CAAA;AAC3C,MAAA,IAAI,MAAA,IAAU,SAAS,MAAA,EAAQ,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAAA,IACzE,SAAS,GAAA,EAAK;AACZ,MAAA,KAAA;AAAA,QACE,gBAAgB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OAClE;AAAA,IACF;AAAA,EACF,CAAA;AACA,EAAA,MAAM,gBAAgB,YAA2B;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,OAAQ,MAAM,WAAA,CAGjB,CAAA,EAAG,QAAA,CAAS,GAAG,CAAA,OAAA,CAAS,CAAA;AAC3B,MAAA,MAAA,GAAS,IAAA;AAAA,IACX,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AAAA,EACF,CAAA;AASA,EAAA,MAAM,cAAA,GAAiB,OAAO,EAAA,KAA8B;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAGhB,CAAA,EAAG,QAAA,CAAS,GAAG,CAAA,UAAA,EAAa,kBAAA,CAAmB,EAAE,CAAC,CAAA,iBAAA,CAAmB,CAAA;AACxE,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,KAAA,CAAM,QAAQ,IAAA,CAAK,KAAK,KAAK,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG;AACtD,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,MAC1B,CAAA,MAAA,IAAW,OAAO,IAAA,CAAK,KAAA,KAAU,YAAY,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG;AAIlE,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,IAAA,CAAK,OAAO,QAAQ,CAAA,CAAE,SAAS,MAAM,CAAA;AAC7D,UAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,yBAAA,EAA2B,EAAE,CAAA;AAC1D,UAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,CAAM,IAAI,EAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAC3D,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,QAChC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,YAAA,CAAa,GAAA,CAAI,IAAI,KAAK,CAAA;AAG1B,MAAA,IAAI,YAAA,CAAa,OAAO,EAAA,EAAI;AAC1B,QAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,YAAA,CAAa,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,YAAA,CAAa,IAAA,GAAO,EAAE,CAAA;AACtE,QAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,YAAY,IAAI,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,GAAG,CAAA,OAAA,CAAS,CAAA;AAClD,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,QAAA,KAAa,QAAA,GAAW,KAAA,GAAQ,IAAA;AACtD,EAAA,MAAM,YAAY,GAAA,CAAI,GAAA;AAAA,IACpB,SAAA;AAAA,IACA,EAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,qBAAoB,EAAE;AAAA,IAC3C,CAAA,GAAA,KAAO;AACL,MAAA,IAAI,GAAA,GAAM,EAAA;AACV,MAAA,GAAA,CAAI,YAAY,MAAM,CAAA;AACtB,MAAA,GAAA,CAAI,EAAA,CAAG,QAAQ,CAAA,KAAA,KAAS;AACtB,QAAA,GAAA,IAAO,KAAA;AACP,QAAA,IAAI,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAC5B,QAAA,OAAO,QAAQ,EAAA,EAAI;AACjB,UAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC9B,UAAA,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AACvB,UAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AACpC,YAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/B,YAAA,IAAI;AACF,cAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAK/C,cAAA,MAAM,OAAA,GAAU,eAAe,OAAO,CAAA;AACtC,cAAA,IAAI,OAAA,EAAS;AACX,gBAAA,YAAA,CAAa,IAAA,CAAK;AAAA,kBAChB,EAAA,EAAI,UAAU,OAAA,CAAQ,EAAA,IAAA,qBAAU,IAAA,EAAK,EAAE,aAAa,CAAA;AAAA,kBACpD,IAAA,EAAM;AAAA,iBACP,CAAA;AACD,gBAAA,IAAI,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG,YAAA,CAAa,KAAA,EAAM;AAChD,gBAAA,MAAA,EAAO;AAAA,cACT;AAAA,YACF,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AACA,UAAA,GAAA,GAAM,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,QAC1B;AAAA,MACF,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,MAAM,MAAM,CAAA;AAAA,IAC5B;AAAA,GACF;AACA,EAAA,SAAA,CAAU,EAAA,CAAG,OAAA,EAAS,MAAM,MAAM,CAAA;AAGlC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KAA+B;AAC5C,IAAA,MAAA,IAAU,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,GAAM,GAAA,CAAI,SAAS,MAAM,CAAA;AAC7D,IAAA,OAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AAExB,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC/B,QAAA,MAAA,GAAS,MAAA,CAAO,MAAM,CAAC,CAAA;AACvB,QAAA,IAAI,SAAS,CAAA,EAAG,MAAA,EAAA;AAChB,QAAA,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA;AACzB,QAAA,IAAI,CAAA,IAAK,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,KAAK,cAAA,CAAe,CAAA,CAAE,EAAE,CAAA,CAAE,KAAK,MAAM,CAAA;AACvE,QAAA,MAAA,EAAO;AACP,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC/B,QAAA,MAAA,GAAS,MAAA,CAAO,MAAM,CAAC,CAAA;AACvB,QAAA,IAAI,MAAA,GAAS,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,MAAA,EAAA;AAClC,QAAA,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA;AACzB,QAAA,IAAI,CAAA,IAAK,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,KAAK,cAAA,CAAe,CAAA,CAAE,EAAE,CAAA,CAAE,KAAK,MAAM,CAAA;AACvE,QAAA,MAAA,EAAO;AACP,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,MAAA,MAAA,GAAS,MAAA,CAAO,MAAM,CAAC,CAAA;AACvB,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,IAAI,MAAA,GAAS,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,MAAA,EAAA;AAClC,QAAA,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA;AACzB,QAAA,IAAI,CAAA,IAAK,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,KAAK,cAAA,CAAe,CAAA,CAAE,EAAE,CAAA,CAAE,KAAK,MAAM,CAAA;AACvE,QAAA,MAAA,EAAO;AAAA,MACT,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AACrB,QAAA,IAAI,SAAS,CAAA,EAAG,MAAA,EAAA;AAChB,QAAA,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA;AACzB,QAAA,IAAI,CAAA,IAAK,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG,KAAK,cAAA,CAAe,CAAA,CAAE,EAAE,CAAA,CAAE,KAAK,MAAM,CAAA;AACvE,QAAA,MAAA,EAAO;AAAA,MACT,CAAA,MAAA,IAAW,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,EAAqB;AACnD,QAAA,IAAA,GAAO,IAAA;AACP,QAAA;AAAA,MACF,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AACrB,QAAA,KAAA,CAAM,kBAAa,CAAA;AACnB,QAAA,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAA,EAAQ,EAAG,eAAe,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,MAC/D,CAAA,MAAA,IAAW,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,IAAA,EAAM;AACrC,QAAA,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA;AACzB,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,MAAA,GAAS,QAAA;AACT,UAAA,cAAA,GAAiB,CAAA,CAAE,EAAA;AACnB,UAAA,IAAA,GAAO,IAAA;AACP,UAAA;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AAIrB,QAAA,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA;AACzB,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,MAAA,GAAS,QAAA;AACT,UAAA,cAAA,GAAiB,CAAA,CAAE,EAAA;AACnB,UAAA,IAAA,GAAO,IAAA;AACP,UAAA;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AAKrB,QAAA,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA;AACzB,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,KAAK,oBAAA,CAAqB,UAAU,CAAC,CAAA,CAClC,KAAK,CAAA,GAAA,KAAO,KAAA,CAAM,GAAG,CAAC,CAAA,CACtB,KAAA;AAAA,UAAM,CAAA,GAAA,KACL,KAAA;AAAA,YACE,kBAAkB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACpE,SACF,CACC,QAAQ,MAAM,KAAK,SAAQ,CAAE,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,MAC9C,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AACrB,QAAA,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA;AACzB,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,KAAK,YAAA;AAAA,UACH,GAAG,QAAA,CAAS,GAAG,aAAa,kBAAA,CAAmB,CAAA,CAAE,EAAE,CAAC,CAAA,KAAA,CAAA;AAAA,UACpD,EAAC;AAAA,UACD,QAAA,CAAS;AAAA,SACX,CACG,IAAA;AAAA,UAAK,CAAA,GAAA,KACJ,KAAA,CAAM,GAAA,CAAI,EAAA,GAAK,CAAA,gBAAA,EAAmB,CAAA,CAAE,EAAE,CAAA,CAAA,GAAK,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,YAAA,CAAc;AAAA,SAClE,CACC,KAAA;AAAA,UAAM,CAAA,GAAA,KACL,KAAA;AAAA,YACE,eAAe,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACjE,SACF,CACC,QAAQ,MAAM,KAAK,SAAQ,CAAE,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,MAC9C,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AACrB,QAAA,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA;AACzB,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,IACE,CAAA,CAAE,WAAW,QAAA,IACb,CAAA,CAAE,WAAW,QAAA,IACb,CAAA,CAAE,WAAW,OAAA,EACb;AACA,UAAA,KAAA,CAAM,MAAM,CAAA,CAAE,EAAE,CAAA,OAAA,EAAU,CAAA,CAAE,MAAM,CAAA,mBAAA,CAAgB,CAAA;AAClD,UAAA,MAAA,EAAO;AACP,UAAA;AAAA,QACF;AACA,QAAA,KAAK,UAAA;AAAA,UACH,GAAG,QAAA,CAAS,GAAG,aAAa,kBAAA,CAAmB,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA;AAAA,UACpD,QAAA,CAAS;AAAA,SACX,CACG,KAAK,MAAM;AACV,UAAA,KAAA,CAAM,CAAA,OAAA,EAAU,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AACtB,UAAA,OAAO,OAAA,EAAQ;AAAA,QACjB,CAAC,CAAA,CACA,KAAA;AAAA,UAAM,CAAA,GAAA,KACL,KAAA;AAAA,YACE,iBAAiB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACnE,SACF,CACC,OAAA,CAAQ,MAAM,MAAA,EAAQ,CAAA;AAAA,MAC3B;AAAA,IAEF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KAAsB;AACnC,IAAA,SAAA,GAAY,GAAA;AACZ,IAAA,cAAA,GAAiB,IAAA,CAAK,KAAI,GAAI,GAAA;AAAA,EAChC,CAAA;AAGA,EAAA,MAAM,IAAI,MAAA,GACN;AAAA,IACE,KAAA,EAAO,SAAA;AAAA,IACP,GAAA,EAAK,SAAA;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IAEN,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP,GACA;AAAA,IACE,KAAA,EAAO,EAAA;AAAA,IACP,GAAA,EAAK,EAAA;AAAA,IACL,IAAA,EAAM,EAAA;AAAA,IAEN,KAAA,EAAO,EAAA;AAAA,IACP,KAAA,EAAO,EAAA;AAAA,IACP,IAAA,EAAM,EAAA;AAAA,IACN,GAAA,EAAK;AAAA,GACP;AACJ,EAAA,MAAM,aAAa,CAAC,CAAA,KAClB,CAAA,KAAM,SAAA,GACF,EAAE,KAAA,GACF,CAAA,KAAM,UAAA,GACJ,CAAA,CAAE,QACF,CAAA,KAAM,QAAA,IAAY,MAAM,OAAA,GACtB,CAAA,CAAE,MACF,CAAA,CAAE,GAAA;AAEZ,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,GAAA;AACvC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,IAAQ,EAAA;AAEpC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AACrC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,GAAG,CAAC,CAAC,CAAA;AACtE,IAAA,MAAM,WAAA,GAAc,OAAO,YAAA,GAAe,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,GAAM,QAAA,GAAM,CAAA,CAAE,KAAA;AAC5B,IAAA,MAAM,MAAgB,EAAC;AAKvB,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,IAAA,IAAQ,EAAA;AACjC,IAAA,MAAM,KACJ,MAAA,EAAQ,SAAA,IAAa,IAAA,IAAQ,MAAA,CAAO,UAAU,UAAA,CAAW,IAAI,CAAA,GACzD,GAAA,GAAM,OAAO,SAAA,CAAU,KAAA,CAAM,KAAK,MAAM,CAAA,GACxC,QAAQ,SAAA,IAAa,GAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,GAAG,CAAA,CAAE,IAAI,qBAAqB,CAAA,CAAE,KAAK,IAAI,CAAA,CAAE,GAAG,OAAI,CAAA,CAAE,KAAK,IAAI,CAAA,CAAE,IAAI,GAAG,QAAA,CAAS,GAAG,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA;AAC/G,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,SAAA,EAAY,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,IAAA,EAAI,EAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,MAAA,EAAS,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,aAAA,CAAc,MAAA,EAAQ,QAAA,IAAY,CAAC,CAAC,CAAA,CAAA;AAC1I,IAAA,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,WAAA,EAAa,IAAI,CAAC,CAAA;AAC9C,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,GAAA,GAAM,QAAA,CAAI,OAAO,IAAI,CAAA,GAAI,EAAE,KAAK,CAAA;AAM3C,IAAA,MAAM,eAAe,aAAA,CAAc,QAAA,EAAU,QAAQ,YAAA,EAAc,QAAA,EAAU,GAAG,UAAU,CAAA;AAC1F,IAAA,MAAM,QAAA,GAAW,SAAS,MAAM,CAAA;AAChC,IAAA,MAAMC,WAAU,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,GAAI,MAAA;AAC3D,IAAA,MAAM,cAAc,YAAA,CAAa,QAAA,EAAU,WAAA,EAAa,QAAA,EAAU,GAAGA,QAAO,CAAA;AAC5E,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,aAAA,CAAc,YAAA,CAAa,CAAC,CAAA,IAAK,EAAA,EAAI,YAAY,CAAA,GAC/C,GAAA,IACC,WAAA,CAAY,CAAC,CAAA,IAAK,EAAA;AAAA,OACvB;AAAA,IACF;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,GAAA,GAAM,QAAA,CAAI,OAAO,IAAI,CAAA,GAAI,EAAE,KAAK,CAAA;AAG3C,IAAA,MAAM,SAAS,YAAA,CAAa,MAAA,KAAW,IACnC,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,6BAAA,EAA6B,CAAA,CAAE,KAAK,CAAA,CAAA,GAC5C,CAAA,EAAG,EAAE,GAAG,CAAA,MAAA,EAAS,EAAE,KAAK,CAAA,EAAA,CAAA,GACxB,aACG,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,EAAE,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,CAC9C,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,GAAG,CAAA,IAAA,EAAI,CAAA,CAAE,KAAK,CAAA,EAAA,CAAI,CAAA;AACrC,IAAA,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,IAAI,CAAC,CAAA;AAGnC,IAAA,MAAM,SAAA,GACJ,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI,GAAI,cAAA;AAC5B,IAAA,MAAM,YAAA,GAAe,SAAS,MAAM,CAAA;AACpC,IAAA,MAAM,MAAA,GACJ,iBACC,YAAA,CAAa,MAAA,KAAW,YACvB,YAAA,CAAa,MAAA,KAAW,QAAA,IACxB,YAAA,CAAa,MAAA,KAAW,OAAA,CAAA;AAC5B,IAAA,MAAM,SAAS,SAAA,GACX,CAAA,EAAG,CAAA,CAAE,KAAK,GAAG,SAAS,CAAA,EAAG,CAAA,CAAE,KAAK,KAChC,MAAA,GACE,CAAA,EAAG,CAAA,CAAE,GAAG,6BAAgB,CAAA,CAAE,KAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,SAAA,EAAY,CAAA,CAAE,KAAK,CAAA,EAAG,EAAE,GAAG,CAAA,uDAAA,EAA8C,CAAA,CAAE,KAAK,KACxH,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,wHAAA,EAA4F,EAAE,KAAK,CAAA,CAAA;AACjH,IAAA,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,IAAI,CAAC,CAAA;AAGnC,IAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,eAAA,GAAkB,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACvD,CAAA;AAGA,EAAA,MAAM,QAAA,GAAW,MAAY,MAAA,EAAO;AACpC,EAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,KAAK,CAAA;AAC9B,EAAA,OAAA,CAAQ,MAAA,CAAO,EAAA,CAAG,QAAA,EAAU,QAAQ,CAAA;AACpC,EAAA,MAAM,gBAAgB,MAAY;AAChC,IAAA,IAAA,GAAO,IAAA;AAAA,EACT,CAAA;AACA,EAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,aAAa,CAAA;AAEpC,EAAA,IAAI;AACF,IAAA,MAAM,QAAQ,GAAA,CAAI,CAAC,SAAQ,EAAG,aAAA,EAAe,CAAC,CAAA;AAE9C,IAAA,IAAI,QAAA,CAAS,MAAM,CAAA,EAAG,KAAK,eAAe,QAAA,CAAS,MAAM,EAAG,EAAE,CAAA;AAC9D,IAAA,MAAA,EAAO;AACP,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,OAAO,CAAC,IAAA,EAAM;AACZ,MAAA,MAAM,IAAI,OAAA,CAAc,CAAA,GAAA,KAAO,UAAA,CAAW,GAAA,EAAK,GAAK,CAAC,CAAA;AACrD,MAAA,IAAI,IAAA,EAAM;AACV,MAAA,KAAA,EAAA;AAGA,MAAA,IAAI,KAAA,GAAQ,CAAA,KAAM,CAAA,EAAG,MAAM,OAAA,EAAQ;AACnC,MAAA,IAAI,KAAA,GAAQ,EAAA,KAAO,CAAA,EAAG,MAAM,aAAA,EAAc;AAG1C,MAAA,IAAI,KAAA,GAAQ,oBAAoB,CAAA,EAAG;AACjC,QAAA,MAAM,CAAA,GAAI,SAAS,MAAM,CAAA;AACzB,QAAA,IAAI,CAAA,EAAG,KAAK,cAAA,CAAe,CAAA,CAAE,EAAE,CAAA;AAC/B,QAAA,gBAAA,GAAmB,KAAA;AAAA,MACrB;AACA,MAAA,MAAA,EAAO;AAAA,IACT;AAAA,EACF,CAAA,SAAE;AACA,IAAA,SAAA,CAAU,OAAA,EAAQ;AAClB,IAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AAC/B,IAAA,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,CAAA;AACrC,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,aAAa,CAAA;AACnC,IAAA,OAAA,EAAQ;AAAA,EACV;AAEA,EAAA,IAAI,MAAA,KAAW,YAAY,cAAA,EAAgB;AAKzC,IAAa,MAAM,SAAA,CAAU;AAAA,MAC3B,QAAA;AAAA,MACA,QAAA,EAAU,cAAA;AAAA,MACV;AAAA,KACD;AAED,IAAA,OAAO,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,EAClC;AACA,EAAA,IAAI,MAAA,KAAW,YAAY,cAAA,EAAgB;AACzC,IAAa,MAAM,SAAA,CAAU,CAAC,cAAc,CAAC;AAE7C,IAAA,OAAO,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,CAAA;AACT;AAiBA,eAAe,oBAAA,CACb,UACA,IAAA,EACiB;AACjB,EAAA,MAAM,SAAA,GAAY,MAAM,mBAAA,CAAoB,IAAI,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,iBAAiB,SAAS,CAAA;AACxC,EAAA,OAAO,0BAAA,CAA2B,QAAA,EAAU,SAAA,EAAW,KAAK,CAAA;AAC9D;AAwBA,SAAS,mBAAmB,IAAA,EAAiC;AAC3D,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,MAAM,CAAA,GAAIN,kBAAAA,CAAkB,IAAA,CAAK,WAAW,CAAA;AAC5C,IAAA,IAAI,CAAA,EAAG,aAAa,CAAA,CAAE,OAAA,IAAW,KAAK,cAAA,GAAiB,CAAA,CAAE,OAAO,CAAA,EAAG;AACjE,MAAA,MAAM,SAAS,CAAA,CAAE,SAAA,CAAU,QAAG,CAAA,CAAE,CAAC,KAAK,IAAA,CAAK,WAAA;AAC3C,MAAA,OAAO,eAAe,MAAM,CAAA,SAAA,CAAA;AAAA,IAC9B;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,gBAAA,EAAkB;AAC7C,IAAA,OAAO,iBAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAA;AACT;AAEA,eAAe,oBACb,IAAA,EAC4B;AAC5B,EAAA,MAAM,OAAO,IAAA,CAAK,WAAA;AAClB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,QAAA,GAAWA,mBAAkB,IAAI,CAAA;AACvC,EAAA,IAAI,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,IAAA;AAG/B,EAAA,IAAI,IAAA,CAAK,cAAA,GAAiB,QAAA,CAAS,OAAO,GAAG,OAAO,IAAA;AACpD,EAAA,IAAI,CAAC,IAAA,CAAK,GAAA,EAAK,OAAO,IAAA;AACtB,EAAA,MAAM,KAAK,MAAM,QAAA,CAAS,QAAQ,IAAA,CAAK,GAAA,EAAK,KAAK,SAAS,CAAA;AAC1D,EAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,cAAA,EAAgB;AAAA,MACd,GAAI,IAAA,CAAK,cAAA,IAAkB,EAAC;AAAA,MAC5B,CAAC,QAAA,CAAS,OAAO,GAAG;AAAA;AACtB,GACF;AACF;AAEA,SAAS,iBAAiB,IAAA,EAAsC;AAO9D,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,MAAM,QAAA,GAAWA,kBAAAA,CAAkB,IAAA,CAAK,WAAW,CAAA;AACnD,IAAA,MAAM,KAAK,QAAA,EAAU,OAAA,GACjB,KAAK,cAAA,GAAiB,QAAA,CAAS,OAAO,CAAA,GACtC,MAAA;AACJ,IAAA,IAAI,QAAA,EAAU,aAAa,EAAA,EAAI;AAC7B,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,SAAA;AAAA,QACL,IAAA,EAAM;AAAA,UACJ,IAAA,EAAM,QAAA,CAAS,SAAA,CAAU,EAAE,CAAA;AAAA,UAC3B,GAAA,EAAK,KAAK,GAAA,IAAO,MAAA;AAAA,UACjB,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AAAA,UAChC,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,IAAA,IAAQ,EAAA;AAAA,UAC7B,GAAI,KAAK,IAAA,GAAO,EAAE,MAAM,IAAA,CAAK,IAAA,KAAS,EAAC;AAAA,UACvC,GAAI,KAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAU;AAAC;AAC5C,OACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,IAChC,IAAA,CAAK,IAAA,GACL,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAChC,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,IAAA;AAAA,QACA,GAAA,EAAK,KAAK,GAAA,IAAO,MAAA;AAAA,QACjB,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AAAA,QAChC,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,IAAA,IAAQ,EAAA;AAAA,QAC7B,GAAI,KAAK,IAAA,GAAO,EAAE,MAAM,IAAA,CAAK,IAAA,KAAS,EAAC;AAAA,QACvC,GAAI,KAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAU;AAAC;AAC5C,KACF;AAAA,EACF;AACA,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,SAAS,IAAA,CAAK,WAAA;AAAA,QACd,GAAA,EAAK,KAAK,GAAA,IAAO,MAAA;AAAA,QACjB,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,GAAI,KAAK,gBAAA,GACL,EAAE,iBAAiB,IAAA,CAAK,gBAAA,KACxB,EAAC;AAAA,QACL,GAAI,KAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAU;AAAC;AAC5C,KACF;AAAA,EACF;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,EAAG,KAAK,EAAE,CAAA,0EAAA;AAAA,GACZ;AACF;AAEA,eAAe,0BAAA,CACb,QAAA,EACA,IAAA,EACA,KAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GACJ,KAAA,CAAM,GAAA,KAAQ,SAAA,GACV,CAAA,EAAG,SAAS,GAAG,CAAA,kBAAA,CAAA,GACf,CAAA,EAAG,QAAA,CAAS,GAAG,CAAA,eAAA,CAAA;AACrB,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,MAAM,YAAA;AAAA,MACjB,GAAA;AAAA,MACA,KAAA,CAAM,IAAA;AAAA,MACN,QAAA,CAAS;AAAA,KACX;AACA,IAAA,MAAM,IAAA,GAAO,mBAAmB,IAAI,CAAA;AACpC,IAAA,OAAO,aAAa,IAAA,CAAK,EAAE,WAAM,IAAA,CAAK,EAAE,GACtC,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,CAAK,IAAI,MAAM,EAClC,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,IAAI,MAAM,EAAE,CAAA,CAAA;AAAA,EAC7B,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAI3D,IAAA,IACE,MAAM,IAAA,CAAK,eAAA,IACX,+BAAA,CAAgC,IAAA,CAAK,GAAG,CAAA,EACxC;AACA,MAAA,MAAM,EAAE,eAAA,EAAiB,GAAG,IAAA,KAAS,KAAA,CAAM,IAAA;AAE3C,MAAA,MAAM,OAAO,MAAM,YAAA;AAAA,QACjB,GAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA,CAAS;AAAA,OACX;AACA,MAAA,OAAO,CAAA,UAAA,EAAa,IAAA,CAAK,EAAE,CAAA,QAAA,EAAM,IAAA,CAAK,EAAE,CAAA,EACtC,IAAA,CAAK,IAAA,GAAO,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,MAAM,EAClC,CAAA,oCAAA,CAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,SAAS,cACP,IAAA,EACA,MAAA,EACA,KAAA,EACA,MAAA,EACA,GACA,UAAA,EACU;AACV,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,QAAA,EAAW,EAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,IAAI,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACzE,EAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,yBAAA,EAAuB,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACnD,CAAA,MAAO;AACL,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,IAAA,CAAK,UAAU,GAAA,CAAI,MAAA,GAAS,QAAQ,CAAA,EAAA,EAAK;AAC3D,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,MAAM,WAAW,CAAA,KAAM,MAAA;AACvB,MAAA,MAAM,MAAA,GAAS,WAAW,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,GAAK,GAAA;AACnD,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,GAAA,GACf,CAAA,EAAG,EAAE,KAAK,CAAA,GAAA,EAAM,CAAA,CAAE,KAAK,KACvB,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,GAAA,EAAM,EAAE,KAAK,CAAA,CAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,EAAA;AAC1B,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,cAAc,GAAA,GAAM,IAAI,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,EAAS,CAAA;AAC/D,MAAA,MAAM,UAAA,GAAaK,SAAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACrC,MAAA,MAAM,IAAA,GACJ,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,UAAA,CAAW,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,GAAG,CAAA,CAAE,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,IAAI,CAAA,CAAE,GAAG,CAAA,EAAG,GAAA,CAAI,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA;AAC5H,MAAA,GAAA,CAAI,IAAA,CAAK,QAAA,GAAW,IAAA,GAAO,IAAI,CAAA;AAAA,IACjC;AAAA,EACF;AACA,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,MAAA,EAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AAEvC,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA;AAC5B;AAEA,SAAS,YAAA,CACP,CAAA,EACA,KAAA,EACA,MAAA,EACA,GACAC,QAAAA,EACU;AACV,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACpC,IAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,IAAA,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,qBAAA,EAAwB,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,EACpD,CAAA,MAAO;AACL,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACpC,IAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,IAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAAsB,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,EAAE,CAAC,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA;AACnE,IAAA,GAAA,CAAI,IAAA,CAAK,KAAK,EAAA,CAAG,IAAI,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AAChC,IAAA,IAAI,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,MAAM,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACnE,IAAA,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,EAAA,CAAG,MAAM,CAAC,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA,EAAG,EAAE,GAAA,GAAM,CAAA,CAAA,EAAI,EAAE,KAAK,CAAA,KAAA,EAAQ,EAAE,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAChF,IAAA,GAAA,CAAI,IAAA,CAAK,KAAK,EAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AACxC,IAAA,GAAA,CAAI,IAAA,CAAK,KAAK,EAAA,CAAG,WAAW,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,aAAa,CAAA,CAAE,CAAA;AAClD,IAAA,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,EAAA,CAAG,SAAS,CAAC,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA,EAAGD,SAAAA,CAAS,CAAA,CAAE,SAAS,KAAA,GAAQ,EAAE,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAClF,IAAA,GAAA,CAAI,IAAA,CAAK,KAAK,EAAA,CAAG,KAAK,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,GAAA,IAAO,QAAG,CAAA,CAAE,CAAA;AACzC,IAAA,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,EAAA,CAAG,SAAS,CAAC,IAAI,aAAA,CAAc,GAAA,GAAM,IAAI,IAAA,CAAK,EAAE,SAAS,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA,IAAA,CAAM,CAAA;AACzF,IAAA,IAAI,CAAA,CAAE,YAAA;AACJ,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,CAAA,EAAA,EAAK,EAAA,CAAG,UAAU,CAAC,IAAI,aAAA,CAAc,GAAA,GAAM,IAAI,IAAA,CAAK,CAAA,CAAE,YAAY,CAAA,CAAE,OAAA,EAAS,CAAC,CAAA,IAAA;AAAA,OAChF;AACF,IAAA,IAAI,EAAE,QAAA,KAAa,MAAA;AACjB,MAAA,GAAA,CAAI,IAAA,CAAK,KAAK,EAAA,CAAG,WAAW,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AAM/C,IAAA,IAAI,EAAE,WAAA,EAAa;AACjB,MAAA,GAAA,CAAI,IAAA,CAAK,KAAK,EAAA,CAAG,SAAS,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,WAAW,CAAA,CAAE,CAAA;AAAA,IAChD;AACA,IAAA,IAAI,EAAE,gBAAA,EAAkB;AACtB,MAAA,GAAA,CAAI,IAAA;AAAA,QACF,KAAK,EAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,EAAI,EAAE,GAAG,CAAA,EAAGA,SAAAA,CAAS,CAAA,CAAE,kBAAkB,KAAA,GAAQ,EAAE,CAAC,CAAA,EAAG,EAAE,KAAK,CAAA;AAAA,OACjF;AAAA,IACF;AACA,IAAA,IAAI,EAAE,cAAA,EAAgB;AACpB,MAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,CAAA,CAAE,cAAc,CAAA,EAAG;AACrD,QAAA,GAAA,CAAI,IAAA;AAAA,UACF,KAAK,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAC,IAAI,CAAA,CAAE,KAAK,GAAGA,SAAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,GAAQ,EAAE,CAAC,CAAA,EAAG,EAAE,KAAK,CAAA;AAAA,SAC7E;AAAA,MACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,WAAW,UAAA,EAAY;AACrD,MAAA,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,GAAG,CAAA,eAAA,EAAkB,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IAChD,CAAA,MAAA,IACE,EAAE,MAAA,KAAW,QAAA,IACb,EAAE,MAAA,KAAW,QAAA,IACb,CAAA,CAAE,MAAA,KAAW,OAAA,EACb;AACA,MAAA,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,GAAG,CAAA,YAAA,EAAe,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IAC7C;AAKA,IAAA,IAAIC,QAAAA,IAAWA,QAAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,MAAA,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,GAAG,CAAA,uCAAA,EAAsB,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAClD,MAAA,KAAA,MAAW,QAAQA,QAAAA,EAAS;AAC1B,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAA,EAAK,CAAA,CAAE,GAAG,CAAA,EAAGD,SAAAA,CAAS,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,MAAA,EAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AACvC,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA;AAC5B;AAGA,SAAS,SAAS,CAAA,EAAmB;AAEnC,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,qBAAqB,CAAA;AACvC,EAAA,OAAO,IAAI,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAG,WAAA,EAAa,CAAA,GAAA,CAAA,GAAQ,CAAA;AAC3C;AAOA,SAAS,eAAe,EAAA,EAA4C;AAClE,EAAA,MAAM,OAAO,OAAO,EAAA,CAAG,IAAA,KAAS,QAAA,GAAW,GAAG,IAAA,GAAO,GAAA;AACrD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,UAAA,EAAW,GAAG,SAAA,EAAkC,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,MAAS,GAAG,CAAA,CAAA;AAAA,IAChF,KAAK,YAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAWA,UAAS,MAAA,CAAO,EAAA,CAAG,QAAQ,EAAE,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,IACvD,KAAK,eAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,EAAA,CAAG,EAAA,IAAM,GAAG,CAAA,CAAA;AAAA,IAC9B,KAAK,cAAA;AACH,MAAA,OAAO,QAAQ,EAAA,CAAG,EAAA,IAAM,GAAG,CAAA,EAAA,EAAK,EAAA,CAAG,YAAY,GAAG,CAAA,CAAA,CAAA;AAAA,IACpD,KAAK,iBAAA;AACH,MAAA,OAAO,CAAA,gBAAA,EAAmBA,UAAS,MAAA,CAAO,EAAA,CAAG,SAAS,EAAE,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,IAChE;AACE,MAAA,OAAO,GAAG,IAAI,CAAA,CAAA;AAAA;AAEpB;AAEA,SAAS,UAAU,GAAA,EAAqB;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,GAAG,CAAA;AACtB,IAAA,OAAO,CAAA,EAAG,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,UAAA,EAAW,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,UAAA,EAAW,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EAChJ,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,UAAA;AAAA,EACT;AACF;AASA,SAAS,MAAA,CAAO,IAAA,EAAc,KAAA,EAAe,IAAA,EAAsB;AACjE,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAI,CAAA,CAAE,MAAA;AAChC,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,KAAK,CAAA,CAAE,MAAA;AAClC,EAAA,IAAI,OAAA,GAAU,CAAA,GAAI,QAAA,IAAY,IAAA,EAAM;AAClC,IAAA,OAAO,OAAO,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,OAAA,GAAU,QAAQ,CAAA,GAAI,KAAA;AAAA,EACxD;AACA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,OAAO,IAAA,GAAO,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,GAAO,OAAO,CAAC,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,YAAA,CAAa,MAAM,IAAI,CAAA;AAChC;AASA,SAAS,aAAA,CAAc,GAAW,KAAA,EAAuB;AACvD,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,CAAC,CAAA,CAAE,MAAA;AAC7B,EAAA,IAAI,OAAA,IAAW,OAAO,OAAO,CAAA;AAC7B,EAAA,OAAO,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,OAAO,CAAA;AACvC;AAEA,SAAS,YAAA,CAAa,GAAW,GAAA,EAAqB;AAIpD,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,CAAC,CAAA,CAAE,MAAA;AAC7B,EAAA,IAAI,OAAA,IAAW,KAAK,OAAO,CAAA;AAE3B,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA,GAAI,QAAA;AAC/B;AAEA,SAAS,UAAU,CAAA,EAAmB;AACpC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA;AACxC;AAEA,SAAS,UAAA,CAAW,KAAa,KAAA,EAAkC;AACjE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACpD,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,GAAG,CAAA;AACrB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC9C,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAClD,IAAA,MAAM,GAAA,GAAM,IAAI,OAAA,CAAQ,CAAA,EAAG,EAAE,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAQ,EAAG,CAAA,GAAA,KAAO;AAC/D,MAAA,IAAI,GAAA,GAAM,EAAA;AACV,MAAA,GAAA,CAAI,YAAY,MAAM,CAAA;AACtB,MAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAA,CAAA,KAAM,GAAA,IAAO,CAAE,CAAA;AAC9B,MAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,QAAA,MAAM,MAAA,GAAS,IAAI,UAAA,IAAc,CAAA;AACjC,QAAA,IAAI,MAAA,GAAS,GAAA,IAAO,MAAA,IAAU,GAAA,EAAK;AACjC,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,EAAA,EAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA;AACxD,UAAA;AAAA,QACF;AACA,QAAA,IAAI;AACF,UAAAA,SAAQ,GAAA,GAAM,IAAA,CAAK,MAAM,GAAG,CAAA,GAAI,EAAE,CAAA;AAAA,QACpC,SAAS,GAAA,EAAK;AACZ,UAAA,MAAA,CAAO,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,QAC5D;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AACtB,IAAA,GAAA,CAAI,GAAA,EAAI;AAAA,EACV,CAAC,CAAA;AACH;AAiCA,eAAe,WAAW,IAAA,EAA0C;AAClE,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAID,SAAAA,CAAU;AAAA,IACxC,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MAC1B,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,MACxB,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA;AAAU;AAChC,GACD,CAAA;AACD,EAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KAEF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AACpC,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,kBAAA,CAAmB,QAAQ,6BAA6B,CAAA;AACxD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AAGxB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,WAAA;AAAA,MACX,GAAG,QAAA,CAAS,GAAG,CAAA,UAAA,EAAa,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KACpD;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,4CAA4C,EAAE,CAAA;AAAA;AAAA,OAChD;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,6BAAA,EAAgC,GAAG;AAAA,CAAI,CAAA;AAC5D,IAAA,OAAO,CAAA;AAAA,EACT;AAKA,EAAA,IAAA,GAAO,MAAM,oBAAoB,IAAI,CAAA;AACrC,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,iBAAiB,IAAI,CAAA;AAAA,EAC/B,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,gCAAgC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC;AAAA;AAAA,KAClF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,EAAA,MAAM,GAAA,GACJ,KAAA,CAAM,GAAA,KAAQ,SAAA,GACV,CAAA,EAAG,SAAS,GAAG,CAAA,kBAAA,CAAA,GACf,CAAA,EAAG,QAAA,CAAS,GAAG,CAAA,eAAA,CAAA;AAErB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,YAAA,CAAgC,GAAA,EAAK,IAAA,EAAM,SAAS,KAAK,CAAA;AAAA,EACxE,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACZ,MAAM,UAAA,CAAW,QAAA,EAAU,6BAA6B,CAAA,GAAK;AAAA,OAChE;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,+BAAA,CAAgC,IAAA,CAAK,GAAG,CAAA,EAAG;AACrE,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,eAAA,EAAiB,CAAA,EAAG,GAAG,MAAK,GAAI,IAAA;AACxC,QAAA,KAAK,CAAA;AACL,QAAA,IAAA,GAAO,MAAM,YAAA;AAAA,UACX,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA,CAAS;AAAA,SACX;AACA,QAAA,cAAA,GAAiB,IAAA;AAAA,MACnB,SAAS,IAAA,EAAM;AACb,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb,gCAAgC,IAAA,YAAgB,KAAA,GAAQ,KAAK,OAAA,GAAU,MAAA,CAAO,IAAI,CAAC;AAAA;AAAA,SACrF;AACA,QAAA,OAAO,CAAA;AAAA,MACT;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,6BAAA,EAAgC,GAAG;AAAA,CAAI,CAAA;AAC5D,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AAAA,EAC3D,CAAA,MAAO;AACL,IAAA,MAAM,OAAA,GAAU,cAAA,GACZ,mCAAA,GACA,kBAAA,CAAmB,IAAI,CAAA,IAAK,aAAA;AAChC,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,qCAAA,EAAwC,IAAA,CAAK,EAAE,CAAA,EAC1C,IAAA,CAAK,IAAA,GAAO,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,QAAA,EAAM,KAAK,OAAO;AAAA,GAAA,EACjD,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AAAA;AAAA,KACjC;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,OAAO,SAAA,CAAU;AAAA,MACf,QAAA;AAAA,MACA,UAAU,IAAA,CAAK,EAAA;AAAA,MACf,MAAA,EAAQ,CAAC,MAAA,CAAO,UAAU;AAAA,KAC3B,CAAA;AAAA,EACH;AACA,EAAA,OAAO,CAAA;AACT;AAOA,SAAS,gBAAgB,CAAA,EAAqB;AAC5C,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,QAAA,EAAU;AAC3B,MAAA,QAAA,GAAW,CAAC,QAAA;AACZ,MAAA;AAAA,IACF;AACA,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,QAAA,EAAU;AAC3B,MAAA,QAAA,GAAW,CAAC,QAAA;AACZ,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,YAAY,CAAC,QAAA,IAAY,KAAK,IAAA,CAAK,EAAA,IAAM,EAAE,CAAA,EAAG;AACjD,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,QAAA,GAAA,GAAM,EAAA;AAAA,MACR;AACA,MAAA;AAAA,IACF;AACA,IAAA,GAAA,IAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AACrB,EAAA,OAAO,GAAA;AACT;AAEA,eAAe,UAAU,IAAA,EAA0C;AACjE,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAIA,SAAAA,CAAU;AAAA,IACxC,IAAA,EAAM,CAAC,GAAG,IAAI,CAAA;AAAA,IACd,gBAAA,EAAkB,IAAA;AAAA,IAClB,MAAA,EAAQ,IAAA;AAAA,IACR,SAAS,EAAE,UAAA,EAAY,EAAE,IAAA,EAAM,WAAU;AAAE,GAC5C,CAAA;AACD,EAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AACxB,EAAA,IAAI,CAAC,EAAA,EAAI;AACP,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb;AAAA,KAEF;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,EAAe;AACpC,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,kBAAA,CAAmB,QAAQ,4BAA4B,CAAA;AACvD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,MAAA,CAAO,KAAA;AACxB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,WAAA;AAAA,MACX,GAAG,QAAA,CAAS,GAAG,CAAA,UAAA,EAAa,kBAAA,CAAmB,EAAE,CAAC,CAAA;AAAA,KACpD;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,2CAA2C,EAAE,CAAA;AAAA;AAAA,OAC/C;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,GAAG;AAAA,CAAI,CAAA;AAC3D,IAAA,OAAO,CAAA;AAAA,EACT;AAKA,EAAA,IACE,IAAA,CAAK,GAAA,KAAQ,IAAA,KACZ,IAAA,CAAK,MAAA,KAAW,QAAA,IACf,IAAA,CAAK,MAAA,KAAW,QAAA,IAChB,IAAA,CAAK,MAAA,KAAW,OAAA,CAAA,EAClB;AACA,IAAA,oBAAA,CAAqB,8BAA8B,IAAI,CAAA;AACvD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,IAAA,OAAO,YAAA,CAAa,UAAU,IAAI,CAAA;AAAA,EACpC;AAGA,EAAA,OAAO,aAAa,QAAA,EAAU,IAAA,EAAM,CAAC,MAAA,CAAO,UAAU,CAAC,CAAA;AACzD;AASA,eAAe,YAAA,CACb,UACA,IAAA,EACiB;AACjB,EAAA,OAAO,IAAI,QAAQ,CAAA,IAAA,KAAQ;AACzB,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,IAAA,IAAQ,EAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,QAAQ,OAAA,EAAS,IAAI,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,EAAE,CAAA,UAAA,EAAa,WAAW,SAAS,WAAW,CAAA,CAAA;AACpH,IAAA,MAAM,EAAA,GAAK,IAAI6C,UAAAA,CAAU,KAAA,EAAO;AAAA,MAC9B,OAAA,EAAS,QAAA,CAAS,KAAA,GACd,EAAE,aAAA,EAAe,UAAU,QAAA,CAAS,KAAK,CAAA,CAAA,EAAG,GAC5C;AAAC,KACN,CAAA;AAED,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,wBAAA,EAAsB,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA;AAAA;AAAA,KACpE;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAuB;AACpC,MAAA,IAAI,MAAA,EAAQ;AACZ,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAA,CAAM,KAAM,mBAAmB,CAAA;AAAA,MACpC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,IAAI,CAAA;AAAA,IACX,CAAA;AAEA,IAAA,EAAA,CAAG,EAAA,CAAG,WAAW,CAAA,GAAA,KAAO;AACtB,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI;AACF,QAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,MAAA,MAAM,CAAA,GAAI,KAAA;AACV,MAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAU,OAAO,CAAA,CAAE,QAAQ,QAAA,EAAU;AAClD,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,CAAE,GAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,QACnD,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AAC5B,QAAA,MAAM,OAAO,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,EAAE,QAAA,GAAW,CAAA;AAC3D,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb;AAAA,sBAAA,EAAsB,IAAA,CAAK,EAAE,CAAA,cAAA,EAAiB,IAAI,CAAA;AAAA;AAAA,SACpD;AACA,QAAA,KAAA,CAAM,IAAI,CAAA;AAAA,MACZ;AAAA,IACF,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,EAAA,CAAG,SAAS,CAAA,GAAA,KAAO;AACpB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,GAAA,CAAI,OAAO;AAAA,CAAI,CAAA;AACnE,MAAA,KAAA,CAAM,CAAC,CAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,MAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7B,IAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,MAAM;AACzB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb;AAAA;AAAA;AAAA,OACF;AACA,MAAA,KAAA,CAAM,CAAC,CAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEA,eAAe,UAAU,IAAA,EAAmC;AAI1D,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,WAAA;AAAA,MACX,CAAA,EAAG,KAAK,QAAA,CAAS,GAAG,aAAa,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,KACpE;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACb,CAAA,0CAAA,EAA6C,KAAK,QAAQ,CAAA;AAAA;AAAA,OAC5D;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,GAAG;AAAA,CAAI,CAAA;AAC7D,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IACE,IAAA,CAAK,WAAW,QAAA,IAChB,IAAA,CAAK,WAAW,QAAA,IAChB,IAAA,CAAK,WAAW,OAAA,EAChB;AACA,IAAA,oBAAA,CAAqB,gCAAgC,IAAI,CAAA;AACzD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,EAAM;AACrB,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACtD;AAQA,SAAS,oBAAA,CACP,MACA,IAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,EAAA;AACjC,EAAA,MAAM,QAAA,GACJ,OAAO,IAAA,CAAK,QAAA,KAAa,WAAW,CAAA,MAAA,EAAS,IAAA,CAAK,QAAQ,CAAA,CAAA,GAAK,EAAA;AACjE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,GACb,aAAA,CAAc,KAAK,GAAA,EAAI,GAAI,IAAI,IAAA,CAAK,KAAK,OAAO,CAAA,CAAE,OAAA,EAAS,IAAI,MAAA,GAC/D,YAAA;AACJ,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,IACb,GAAG,IAAI,CAAA,UAAA,EAAa,KAAK,EAAE,CAAA,EAAG,KAAK,IAAA,GAAO,CAAA,EAAA,EAAK,KAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,YAAA,EAChD,IAAA,CAAK,MAAM,CAAA,SAAA,EAAY,GAAG,GAAG,QAAQ,CAAA;AAAA;AAAA,gCAAA,EAEhB,MAAM;AAAA;AAAA;AAAA;AAAA,GAG7C;AACF;AAEA,eAAe,YAAA,CACb,QAAA,EACA,IAAA,EACA,MAAA,EACiB;AACjB,EAAA,OAAO,IAAI,QAAQ,CAAA,IAAA,KAAQ;AACzB,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,SAAS,GAAG,CAAA,UAAA,EAAa,IAAA,CAAK,EAAE,CAAA,OAAA,CAAS,CAAA;AAChE,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,KAAa,QAAA,GAAW,KAAA,GAAQ,IAAA;AAChD,IAAA,MAAM,OAAA,GAAkC,EAAE,MAAA,EAAQ,mBAAA,EAAoB;AACtE,IAAA,IAAI,SAAS,KAAA,EAAO,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,SAAS,KAAK,CAAA,CAAA;AACpE,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,0BAAA,EAAwB,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA;AAAA;AAAA,KACtE;AACA,IAAA,MAAM,MAAM,GAAA,CAAI,GAAA,CAAI,KAAK,EAAE,OAAA,IAAW,CAAA,GAAA,KAAO;AAC3C,MAAA,IAAI,GAAA,CAAI,eAAe,GAAA,EAAK;AAC1B,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb,CAAA,0CAAA,EAA6C,KAAK,EAAE,CAAA;AAAA;AAAA,SACtD;AACA,QAAA,IAAA,CAAK,CAAC,CAAA;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,CAAI,eAAe,GAAA,EAAK;AAC1B,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb,CAAA,mCAAA,EAAsC,IAAI,UAAU;AAAA;AAAA,SACtD;AACA,QAAA,IAAA,CAAK,CAAC,CAAA;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,GAAM,EAAA;AACV,MAAA,GAAA,CAAI,YAAY,MAAM,CAAA;AACtB,MAAA,GAAA,CAAI,EAAA,CAAG,QAAQ,CAAA,KAAA,KAAS;AACtB,QAAA,GAAA,IAAO,KAAA;AACP,QAAA,IAAI,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAC5B,QAAA,OAAO,QAAQ,EAAA,EAAI;AACjB,UAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC9B,UAAA,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA;AACvB,UAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AACpC,YAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC5B,cAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACnC,cAAA,IAAI;AACF,gBAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAI/B,gBAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACnC,gBAAA,IAAI,MAAA,IAAU,IAAA,CAAK,MAAA,KAAW,QAAA,EAAU;AACtC,kBAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,QAAA,EAAW,IAAA,CAAK,IAAI,CAAA;AAAA,CAAW,CAAA;AAAA,gBACtD,CAAA,MAAO;AACL,kBAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAA,GAAO,IAAI,CAAA;AAAA,gBACvC;AAAA,cACF,CAAA,CAAA,MAAQ;AAAA,cAGR;AAAA,YACF;AAAA,UACF;AACA,UAAA,GAAA,GAAM,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,QAC1B;AAAA,MACF,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,MAAM,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,CAAA,GAAA,KAAO;AACrB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,GAAA,CAAI,OAAO;AAAA,CAAI,CAAA;AACrE,MAAA,IAAA,CAAK,CAAC,CAAA;AAAA,IACR,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,MAAM;AACzB,MAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,MAAA,IAAA,CAAK,CAAC,CAAA;AAAA,IACR,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAUA,eAAe,YAAA,CACb,QAAA,EACA,IAAA,EACA,OAAA,EACiB;AACjB,EAAA,OAAO,IAAI,QAAQ,CAAA,IAAA,KAAQ;AACzB,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,KAAA,KAAU,IAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,KAAA,KAAU,IAAA;AACzC,IAAA,MAAM,cACJ,SAAA,IAAa,OAAA,CAAQ,OAAO,OAAA,GAAU,OAAA,CAAQ,OAAO,OAAA,GAAU,EAAA;AACjE,IAAA,MAAM,cACJ,SAAA,IAAa,OAAA,CAAQ,OAAO,IAAA,GAAO,OAAA,CAAQ,OAAO,IAAA,GAAO,EAAA;AAC3D,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,QAAQ,OAAA,EAAS,IAAI,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,EAAE,CAAA,UAAA,EAAa,WAAW,SAAS,WAAW,CAAA,CAAA;AAQpH,IAAA,MAAM,sBAAsB,CAAC,GAAA,EAAO,GAAA,EAAO,GAAA,EAAO,KAAO,GAAK,CAAA;AAC9D,IAAA,IAAI,OAAA,GAAU,CAAA;AAId,IAAA,IAAI,EAAA,GAAgB,IAAIA,UAAAA,CAAU,KAAA,EAAO;AAAA,MACvC,OAAA,EAAS,QAAA,CAAS,KAAA,GACd,EAAE,aAAA,EAAe,UAAU,QAAA,CAAS,KAAK,CAAA,CAAA,EAAG,GAC5C;AAAC,KACN,CAAA;AAED,IAAA,IAAI,KAAA,GAAQ,KAAA;AAQZ,IAAA,MAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAA,MAAM,kBAA4B,EAAC;AACnC,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,MAAM,UAAU,MAAY;AAC1B,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,KAAA,CAAM,WAAW,KAAK,CAAA;AAAA,QAChC,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA,OAAA,CAAQ,MAAM,KAAA,EAAM;AAAA,MACtB;AACA,MAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AACjC,MAAA,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,CAAA;AACrC,MAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,QAAQ,CAAA;AAAA,IAClC,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAA+B;AAC9C,MAAA,IAAI,EAAA,CAAG,UAAA,KAAeA,UAAAA,CAAU,IAAA,EAAM;AAMtC,MAAA,MAAM,KAAA,GAAQ,OAAO,GAAA,KAAQ,QAAA,GAAW,OAAO,IAAA,CAAK,GAAA,EAAK,MAAM,CAAA,GAAI,GAAA;AASnE,MAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,CAAC,MAAM,CAAA,EAAM;AAC3C,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,QAAA,eAAA,CAAgB,KAAK,GAAG,CAAA;AAExB,QAAA,OACE,gBAAgB,MAAA,GAAS,CAAA,IACzB,MAAM,eAAA,CAAgB,CAAC,IAAK,sBAAA,EAC5B;AACA,UAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,QACxB;AACA,QAAA,IAAI,eAAA,CAAgB,UAAU,CAAA,EAAG;AAC/B,UAAA,eAAA,CAAgB,MAAA,GAAS,CAAA;AACzB,UAAA,IAAI;AACF,YAAA,EAAA,CAAG,KAAA,CAAM,KAAM,8BAA8B,CAAA;AAAA,UAC/C,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA;AAAA,QACF;AAAA,MAEF;AAKA,MAAA,IAAI,IAAA,GAAO,KAAA;AACX,MAAA,IAAI,KAAA,EAAO;AAGT,QAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,QAAA,IAAI,KAAA,KAAU,GAAA,IAAQ,KAAA,KAAU,EAAA,EAAM;AACpC,UAAA,KAAA,GAAQ,KAAA;AACR,UAAA,IAAI;AACF,YAAA,EAAA,CAAG,KAAA,CAAM,KAAM,eAAe,CAAA;AAAA,UAChC,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA;AAAA,QACF;AAGA,QAAA,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,CAAC,MAAA,CAAO,IAAA,CAAK,CAAC,EAAI,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA;AAChD,QAAA,KAAA,GAAQ,KAAA;AAAA,MACV;AAMA,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,EAAI,CAAA;AAC7B,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG,CAAC,CAAA;AACvE,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,KAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAE3B,QAAA,KAAA,GAAQ,IAAA;AACR,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACjC,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAA,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,QACzE;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA;AACzB,MAAA,IAAI,IAAA,KAAS,GAAA,IAAQ,IAAA,KAAS,EAAA,EAAM;AAIlC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACjC,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAA,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,QACzE;AACA,QAAA,IAAI;AACF,UAAA,EAAA,CAAG,KAAA,CAAM,KAAM,eAAe,CAAA;AAAA,QAChC,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA;AAAA,MACF;AAIA,MAAA,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,IACzE,CAAA;AAEA,IAAA,MAAM,WAAW,MAAY;AAC3B,MAAA,IAAI,EAAA,CAAG,UAAA,KAAeA,UAAAA,CAAU,IAAA,EAAM;AACtC,MAAA,MAAM,OACJ,SAAA,IAAa,OAAA,CAAQ,OAAO,OAAA,GAAU,OAAA,CAAQ,OAAO,OAAA,GAAU,EAAA;AACjE,MAAA,MAAM,OAAO,SAAA,IAAa,OAAA,CAAQ,OAAO,IAAA,GAAO,OAAA,CAAQ,OAAO,IAAA,GAAO,EAAA;AACtE,MAAA,EAAA,CAAG,IAAA,CAAK,KAAK,SAAA,CAAU,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,IACxD,CAAA;AAEA,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,IAAI,aAAA,GAAgB,KAAA;AAEpB,IAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAA0B;AACxC,MAAA,IAAA,CAAK,EAAA,CAAG,QAAQ,MAAM;AACpB,QAAA,IAAI,YAAY,CAAA,EAAG;AACjB,UAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,YACb,CAAA,wCAAA,EAAsC,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA;AAAA;AAAA,WAGpF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,YACb,CAAA,8BAAA,EAA4B,IAAA,CAAK,EAAE,CAAA,UAAA,EAAa,UAAU,CAAC,CAAA;AAAA;AAAA,WAC7D;AAAA,QACF;AACA,QAAA,OAAA,GAAU,CAAA;AACV,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,IAAI;AACF,cAAA,OAAA,CAAQ,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,YAC/B,CAAA,CAAA,MAAQ;AAAA,YAER;AACA,YAAA,OAAA,CAAQ,MAAM,MAAA,EAAO;AAAA,UACvB;AACA,UAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,OAAO,CAAA;AAChC,UAAA,OAAA,CAAQ,MAAA,CAAO,EAAA,CAAG,QAAA,EAAU,QAAQ,CAAA;AACpC,UAAA,OAAA,CAAQ,EAAA,CAAG,YAAY,QAAQ,CAAA;AAC/B,UAAA,UAAA,GAAa,IAAA;AAAA,QACf;AACA,QAAA,QAAA,EAAS;AAAA,MACX,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,EAAA,CAAG,WAAW,CAAA,GAAA,KAAO;AACxB,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI;AACF,UAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,QACzC,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,QAAA,MAAM,CAAA,GAAI,KAAA;AACV,QAAA,QAAQ,EAAE,IAAA;AAAM,UACd,KAAK,MAAA,EAAQ;AACX,YAAA,IAAI,OAAO,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,cAAA,IAAI;AACF,gBAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,CAAE,GAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,cACnD,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAAA,UACA,KAAK,MAAA,EAAQ;AACX,YAAA,MAAM,OAAO,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,EAAE,QAAA,GAAW,CAAA;AAC3D,YAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,cACb;AAAA,sBAAA,EAAsB,IAAA,CAAK,EAAE,CAAA,cAAA,EAAiB,IAAI,CAAA;AAAA;AAAA,aACpD;AACA,YAAA,QAAA,GAAW,IAAA;AACX,YAAA,aAAA,GAAgB,IAAA;AAChB,YAAA;AAAA,UACF;AAAA;AAEF,MACF,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,EAAc,MAAA,KAAmB;AAOjD,QAAA,IAAI,aAAA,IAAiB,SAAS,GAAA,EAAM;AAClC,UAAA,OAAA,EAAQ;AACR,UAAA,IAAA,CAAK,QAAQ,CAAA;AACb,UAAA;AAAA,QACF;AACA,QAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,OAAA,GAAU,mBAAA,CAAoB,MAAA,EAAQ;AACzD,UAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAO,CAAA,IAAK,GAAA;AAC9C,UAAA,OAAA,EAAA;AACA,UAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,YACb,CAAA,mCAAA,EAAiC,IAAI,CAAA,uBAAA,EAAuB,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAI,CAAC,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA,EAAI,mBAAA,CAAoB,MAAM,CAAA;AAAA;AAAA,WACjI;AACA,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,EAAA,GAAK,IAAIA,WAAU,KAAA,EAAO;AAAA,cACxB,OAAA,EAAS,QAAA,CAAS,KAAA,GACd,EAAE,aAAA,EAAe,UAAU,QAAA,CAAS,KAAK,CAAA,CAAA,EAAG,GAC5C;AAAC,aACN,CAAA;AACD,YAAA,MAAA,CAAO,EAAE,CAAA;AAAA,UACX,GAAG,KAAK,CAAA;AACR,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,UAAA,GAAa,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,WAAM,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA,GAAK,EAAA;AACnF,QAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,UACb;AAAA,mCAAA,EAAmC,IAAI,GAAG,UAAU,CAAA;AAAA;AAAA,iCAAA,EAEd,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,EAAE;AAAA;AAAA,SAC5D;AACA,QAAA,OAAA,EAAQ;AACR,QAAA,IAAA,CAAK,CAAC,CAAA;AAAA,MACR,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,EAAA,CAAG,SAAS,MAAM;AAAA,MAIvB,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAA,CAAO,EAAE,CAAA;AAET,IAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,MAAM;AAIzB,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAA,CAAM,KAAM,QAAQ,CAAA;AAAA,MACzB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AASA,eAAe,kBAAkB,OAAA,EAAmC;AAClE,EAAA,OAAO,IAAI,OAAA,CAAiB,CAAA5C,QAAAA,KAAW;AACrC,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,OAAA,CAAS,CAAA;AACrC,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC9C,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,EAAE,OAAA,EAAS,GAAA,IAAO,CAAA,GAAA,KAAO;AAC9C,QAAAA,QAAAA,CAAAA,CAAS,IAAI,UAAA,IAAc,CAAA,KAAM,QAAQ,GAAA,CAAI,UAAA,IAAc,KAAK,GAAG,CAAA;AACnE,QAAA,GAAA,CAAI,MAAA,EAAO;AAAA,MACb,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,MAAMA,QAAAA,CAAQ,KAAK,CAAC,CAAA;AACpC,MAAA,GAAA,CAAI,EAAA,CAAG,WAAW,MAAM;AACtB,QAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,QAAAA,SAAQ,KAAK,CAAA;AAAA,MACf,CAAC,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AACN,MAAAA,SAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAC,CAAA;AACH;AAeA,eAAe,UAAA,CACb,UACA,IAAA,EACiB;AACjB,EAAA,MAAM,KAAA,GAAQ,MAAM,iBAAA,CAAkB,QAAA,CAAS,GAAG,CAAA;AAClD,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,CAAA,EAAG,IAAI,CAAA,iCAAA,EAAoC,QAAA,CAAS,GAAG,CAAA;AAAA,GACzD;AACA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,gBAAA,EAAmB,SAAS,GAAG,CAAA,wCAAA,CAAA;AAAA,MAC/B,CAAA,+EAAA;AAAA,KACF;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,OAAA,CAAQ,IAAI,uBAAA,EAAyB;AACvC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,gFAAA,CAAA;AAAA,MACA,CAAA,qFAAA,CAAA;AAAA,MACA,CAAA,iGAAA;AAAA,KACF;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,iEAAA,CAAA;AAAA,MACA,CAAA,+BAAA,CAAA;AAAA,MACA,CAAA,IAAA,EAAO,SAAS,UAAU,CAAA,CAAA;AAAA,MAC1B,CAAA,mFAAA,CAAA;AAAA,MACA,CAAA,kFAAA,CAAA;AAAA,MACA,CAAA,6CAAA;AAAA,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,iEAAA,CAAA;AAAA,MACA,CAAA,oEAAA;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,YAAA,CACP,GAAA,EACA,IAAA,EACA,KAAA,EACY;AACZ,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,GAAG,CAAA;AACrB,IAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,KAAK,SAAA,CAAU,IAAI,GAAG,MAAM,CAAA;AACxD,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC9C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,gBAAA,EAAkB,OAAA,CAAQ,UAAA,CAAW,QAAA;AAAS,KAChD;AACA,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAClD,IAAA,MAAM,MAAM,GAAA,CAAI,OAAA;AAAA,MACd,CAAA;AAAA,MACA,EAAE,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAQ;AAAA,MAC1B,CAAA,GAAA,KAAO;AACL,QAAA,IAAI,GAAA,GAAM,EAAA;AACV,QAAA,GAAA,CAAI,YAAY,MAAM,CAAA;AACtB,QAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAA,CAAA,KAAM,GAAA,IAAO,CAAE,CAAA;AAC9B,QAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,UAAA,MAAM,MAAA,GAAS,IAAI,UAAA,IAAc,CAAA;AACjC,UAAA,IAAI,MAAA,GAAS,GAAA,IAAO,MAAA,IAAU,GAAA,EAAK;AACjC,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,EAAA,EAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA;AACxD,YAAA;AAAA,UACF;AACA,UAAA,IAAI;AACF,YAAAA,QAAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAM,CAAA;AAAA,UAC9B,SAAS,GAAA,EAAK;AACZ,YAAA,MAAA,CAAO,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,UAC5D;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AACtB,IAAA,GAAA,CAAI,MAAM,OAAO,CAAA;AACjB,IAAA,GAAA,CAAI,GAAA,EAAI;AAAA,EACV,CAAC,CAAA;AACH;AAEA,eAAe,YAAyB,GAAA,EAAyB;AAC/D,EAAA,OAAQ,MAAM,gBAAgB,GAAG,CAAA;AACnC;AAEA,SAAS,gBAAgB,GAAA,EAA+B;AACtD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,GAAG,CAAA;AACrB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC9C,IAAA,GAAA,CACG,GAAA,CAAI,GAAG,CAAA,GAAA,KAAO;AACb,MAAA,IAAI,IAAA,GAAO,EAAA;AACX,MAAA,GAAA,CAAI,YAAY,MAAM,CAAA;AACtB,MAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAA,CAAA,KAAM,IAAA,IAAQ,CAAE,CAAA;AAC/B,MAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,QAAA,IAAA,CAAK,IAAI,UAAA,IAAc,CAAA,IAAK,QAAQ,GAAA,CAAI,UAAA,IAAc,MAAM,GAAA,EAAK;AAC/D,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,UAAU,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA;AACjE,UAAA;AAAA,QACF;AACA,QAAA,IAAI;AACF,UAAAA,QAAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,QAC1B,SAAS,GAAA,EAAK;AACZ,UAAA,MAAA,CAAO,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAAA,QAC5D;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA,CACA,EAAA,CAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EACvB,CAAC,CAAA;AACH;;;ACpmFA,IAAMN,MAAAA,GAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAyCd,IAAM,KAAA,uBAAY,GAAA,CAAI;AAAA,EACpB,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,eAAe,KAAK,IAAA,EAA0C;AAI5D,EAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU,CAAC,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA;AAElD,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,IAAI,KAAK,QAAA,CAAS,WAAW,KAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACrD,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,0BAA0B,CAAA;AAC/C,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,IAAA,CAAK,SAAS,IAAI,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AACvE,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAMA,MAAK,CAAA;AAC1B,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,sCAAA,EAAyC,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC;;AAAA,EAAOA,MAAK,CAAA;AAAA,KACrE;AACA,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,KAAK,OAAO,CAAA;AACzB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA;AAEnC,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AACH,MAAA,OAAO,QAAQ,IAAI,CAAA;AAAA,IACrB,KAAK,QAAA;AACH,MAAA,OAAO,UAAU,IAAI,CAAA;AAAA,IACvB,KAAK,QAAA,EAAU;AAIb,MAAA,MAAM,EAAE,SAAA,EAAA4D,UAAAA,EAAU,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAC5B,MAAA,OAAOA,WAAU,IAAI,CAAA;AAAA,IACvB;AAAA,IACA,KAAK,SAAA;AACH,MAAA,OAAO,WAAW,IAAI,CAAA;AAAA,IACxB,KAAK,OAAA;AACH,MAAA,OAAO,gBAAgB,IAAI,CAAA;AAAA,IAC7B,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,IAAI,CAAA;AAAA,IACpB,KAAK,OAAA;AACH,MAAA,OAAO,SAAS,IAAI,CAAA;AAAA,IACtB,KAAK,WAAA;AACH,MAAA,OAAO,aAAa,IAAI,CAAA;AAAA,IAC1B,KAAK,UAAA;AACH,MAAA,OAAO,YAAY,IAAI,CAAA;AAAA,IACzB;AAEE,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,0BAAA,EAA6B,IAAI,CAAA;;AAAA,EAAQ5D,MAAK,CAAA,CAAE,CAAA;AACrE,MAAA,OAAO,CAAA;AAAA;AAEb;AAEA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,IAAA;AAAA,EAC1B,CAAC,IAAA,KAAS;AACR,IAAA,OAAA,CAAQ,QAAA,GAAW,IAAA;AAAA,EACrB,CAAA;AAAA,EACA,CAAC,GAAA,KAAiB;AAChB,IAAA,MAAM,GAAA,GAAM,eAAe,KAAA,GAAQ,GAAA,CAAI,SAAS,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AACxE,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,YAAA,EAAe,GAAG;AAAA,CAAI,CAAA;AAC3C,IAAA,OAAA,CAAQ,QAAA,GAAW,CAAA;AAAA,EACrB;AACF,CAAA","file":"cli.mjs","sourcesContent":["/**\n * `~/.agentproto/config.json` — single hand-editable JSON for the\n * agentproto control plane's defaults. Sits alongside the existing\n * surface files (workspaces.json, credentials.json, sessions.json):\n *\n * workspaces.json which directories are workspaces + which is active\n * credentials.json tunnel host bearer tokens (mode 0600)\n * sessions.json last-known snapshot of the registry (informational)\n * config.json daemon defaults: port, bind, allowed origins,\n * tunnel host, feature toggles\n *\n * Resolution order for every daemon knob is:\n * 1. CLI flag (e.g. --port)\n * 2. Env var (where one exists, e.g. AGENTPROTO_TOKEN)\n * 3. config.json\n * 4. Hardcoded default\n *\n * This means a user can call `agentproto config set daemon.port 18791`\n * once and never re-pass `--port 18791` to `serve install` etc. CLI\n * flags still win for one-off overrides.\n *\n * Schema is intentionally narrow + extensible — unknown keys are\n * preserved on save (deep-merge), so a newer CLI writing a new\n * field won't drop one an older CLI doesn't know about. No secrets\n * here; credentials stay in credentials.json (mode 0600).\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\n\nexport const CONFIG_VERSION = 1 as const\n\nexport interface DaemonConfig {\n /** Absolute path to the workspace the daemon binds to at boot. */\n workspace?: string\n /** HTTP port. Default 18790. */\n port?: number\n /** Bind addr. Default 127.0.0.1. */\n bind?: string\n /** Trusted browser origins for mutating /sessions/* routes (in\n * addition to the hardcoded localhost defaults). */\n allowedOrigins?: string[]\n /** When true, the daemon does NOT auto-trust localhost-on-any-port.\n * Only origins explicitly listed in `allowedOrigins` are allowed.\n * Pair with a curated list (e.g. `[\"http://localhost:3000\"]`) for\n * hardened setups. Default false. */\n strictOrigins?: boolean\n /** Server label sent in tunnel hello frames. */\n label?: string\n}\n\nexport interface TunnelConfig {\n /** Cloud WS URL. When set + autoconnect=true, `agentproto serve`\n * bootstraps with `--connect <host>`. */\n host?: string\n /** Whether `agentproto daemon start` connects the tunnel by\n * default. v0 only — implementer can ignore until daemon needs it. */\n autoconnect?: boolean\n}\n\nexport interface FeaturesConfig {\n /** Hint that PTY is desired — informational; the daemon still\n * detects node-pty's presence at runtime. */\n pty?: boolean\n}\n\nexport interface AgentprotoConfig {\n version?: number\n daemon?: DaemonConfig\n tunnel?: TunnelConfig\n features?: FeaturesConfig\n /** Unknown keys preserved across save round-trips. */\n [unknown: string]: unknown\n}\n\nexport const CONFIG_FILE_PATH = (): string =>\n join(homedir(), \".agentproto\", \"config.json\")\n\n/**\n * Load config.json. Returns an empty object (NOT null) when the file\n * is missing, malformed, or unreadable — callers can `cfg.daemon?.port`\n * safely without null-guards. Errors during a malformed-read are\n * logged once so the user notices the file is broken without the\n * daemon refusing to boot.\n */\nexport async function loadConfig(path?: string): Promise<AgentprotoConfig> {\n const target = path ?? CONFIG_FILE_PATH()\n try {\n const raw = await fs.readFile(target, \"utf8\")\n const parsed = JSON.parse(raw) as unknown\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as AgentprotoConfig\n }\n console.warn(\n `[runtime/config] ${target}: top-level value is not an object — ignoring`,\n )\n return {}\n } catch (err) {\n // ENOENT is the common case; only warn on other shapes.\n const code = (err as NodeJS.ErrnoException).code\n if (code && code !== \"ENOENT\") {\n console.warn(\n `[runtime/config] failed to read ${target}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n )\n }\n return {}\n }\n}\n\n/**\n * Write config.json atomically (tmp + rename) so a concurrent\n * `agentproto config edit` can't half-truncate the file. Writes\n * `next` AS-IS — callers are expected to pass the full desired\n * state (loaded the existing config, mutated, passed it back).\n *\n * Earlier versions deep-merged with the on-disk file, but that made\n * deletions impossible: `setConfigKey(cfg, \"x\", undefined)` would\n * remove the key from memory, then the deep-merge would silently\n * re-add it from disk. The current design trusts the caller's\n * snapshot and uses atomic rename for crash safety.\n */\nexport async function saveConfig(\n next: AgentprotoConfig,\n path?: string,\n): Promise<void> {\n const target = path ?? CONFIG_FILE_PATH()\n const payload = { ...next, version: CONFIG_VERSION }\n const dir = dirname(target)\n await fs.mkdir(dir, { recursive: true })\n const tmp = `${target}.tmp`\n await fs.writeFile(tmp, JSON.stringify(payload, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, target)\n}\n\n/**\n * Read a dot-notation key (`daemon.port`) out of a config. Returns\n * `undefined` when any segment is missing.\n */\nexport function getConfigKey(\n cfg: AgentprotoConfig,\n dotted: string,\n): unknown {\n let cur: unknown = cfg\n for (const part of dotted.split(\".\")) {\n if (cur == null || typeof cur !== \"object\") return undefined\n cur = (cur as Record<string, unknown>)[part]\n }\n return cur\n}\n\n/**\n * Set a dot-notation key in a config. Returns a new object — does\n * NOT mutate. Creates intermediate objects as needed. Setting\n * `value: undefined` is treated as a delete.\n */\nexport function setConfigKey(\n cfg: AgentprotoConfig,\n dotted: string,\n value: unknown,\n): AgentprotoConfig {\n const parts = dotted.split(\".\")\n const out: AgentprotoConfig = { ...cfg }\n let cur: Record<string, unknown> = out as Record<string, unknown>\n for (let i = 0; i < parts.length - 1; i++) {\n const k = parts[i]!\n const next = cur[k]\n if (next && typeof next === \"object\" && !Array.isArray(next)) {\n cur[k] = { ...(next as Record<string, unknown>) }\n } else {\n cur[k] = {}\n }\n cur = cur[k] as Record<string, unknown>\n }\n const leaf = parts[parts.length - 1]!\n if (value === undefined) {\n delete cur[leaf]\n } else {\n cur[leaf] = value\n }\n return out\n}\n\n/**\n * Deep merge — objects are recursively combined, everything else\n * (arrays, primitives) is replaced wholesale by `b`. Mirrors what\n * `Object.assign({}, a, b)` does for shallow keys.\n */\nfunction deepMerge<A extends Record<string, unknown>, B extends Record<string, unknown>>(\n a: A,\n b: B,\n): A & B {\n const out: Record<string, unknown> = { ...a }\n for (const [k, v] of Object.entries(b)) {\n const cur = out[k]\n if (\n v &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n cur &&\n typeof cur === \"object\" &&\n !Array.isArray(cur)\n ) {\n out[k] = deepMerge(\n cur as Record<string, unknown>,\n v as Record<string, unknown>,\n )\n } else {\n out[k] = v\n }\n }\n return out as A & B\n}\n","/**\n * `agentproto daemon <install|uninstall|start|stop|status|logs>`\n *\n * Service-management shim. On macOS we wrap `launchctl` with a\n * generated `~/Library/LaunchAgents/sh.agentproto.plist`; on Linux\n * we'll wrap `systemctl --user` once that path is finished (the\n * verb prints \"not yet\" until then). Windows: same, NSSM/Task\n * Scheduler is on the followup list.\n *\n * The plist's `ProgramArguments` is built from `~/.agentproto/config.json`'s\n * `daemon.*` keys (workspace, port, bind, allowedOrigins). The user\n * configures once via `agentproto config set …`, then `daemon install`\n * captures that snapshot. Re-run `install` after any config change\n * to refresh the plist.\n *\n * Logs go to `~/.agentproto/daemon.log` (stdout + stderr merged).\n *\n * Sub-verbs:\n * install write the plist + launchctl bootstrap\n * uninstall launchctl bootout + delete plist\n * start launchctl kickstart (one-shot; honours KeepAlive)\n * stop launchctl kill SIGTERM\n * status plist installed? launchctl loaded? /health probe?\n * last 10 lines of daemon.log\n * logs tail daemon.log (10 lines by default, --lines <N>)\n */\n\nimport { spawn } from \"node:child_process\"\nimport { promises as fs } from \"node:fs\"\nimport { homedir, platform as osPlatform } from \"node:os\"\nimport { dirname, join } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport { loadConfig, CONFIG_FILE_PATH } from \"@agentproto/runtime/config\"\n\nconst LABEL = \"sh.agentproto\"\nconst USAGE = `agentproto daemon — run agentproto serve as a background service\n\nUsage:\n agentproto daemon install [--dry-run] register service + start it (macOS launchd today)\n agentproto daemon uninstall stop + deregister service\n agentproto daemon start launchctl kickstart\n agentproto daemon stop launchctl kill SIGTERM\n agentproto daemon status installed? loaded? /health reachable?\n agentproto daemon logs [--lines <N>] tail daemon.log\n\nConfigure defaults via \\`agentproto config set\\` before \\`install\\`:\n agentproto config set daemon.workspace /path/to/project\n agentproto config set daemon.port 18790\n agentproto config set daemon.allowedOrigins https://guilde.work\n`\n\nexport async function runDaemon(args: readonly string[]): Promise<number> {\n if (args.includes(\"--help\") || args.includes(\"-h\") || args.length === 0) {\n process.stdout.write(USAGE)\n return args.length === 0 ? 2 : 0\n }\n if (osPlatform() !== \"darwin\") {\n process.stderr.write(\n `agentproto daemon: ${osPlatform()} not yet supported. macOS (launchd) ships today; ` +\n \"Linux (systemd --user) and Windows are on the follow-up list. \" +\n \"In the meantime: `agentproto serve &; disown` will detach the daemon from your shell.\\n\",\n )\n return 2\n }\n const sub = args[0]\n const rest = args.slice(1)\n switch (sub) {\n case \"install\":\n return runInstall(rest)\n case \"uninstall\":\n return runUninstall()\n case \"start\":\n return runStart()\n case \"stop\":\n return runStop()\n case \"status\":\n return runStatus()\n case \"logs\":\n return runLogs(rest)\n default:\n process.stderr.write(\n `agentproto daemon: unknown sub-verb \"${sub}\".\\n\\n${USAGE}`,\n )\n return 2\n }\n}\n\ninterface Paths {\n plist: string\n log: string\n /** `node /path/to/cli.mjs` — what launchd should exec. The CLI\n * ships as an ESM `.mjs` file with no shebang; the pnpm/npm bin\n * shim execs `node cli.mjs $@`. launchd doesn't run shell shims,\n * so we reconstruct the `node + script` pair here. */\n argv: [string, string]\n}\n\nfunction paths(): Paths {\n return {\n plist: join(homedir(), \"Library\", \"LaunchAgents\", `${LABEL}.plist`),\n log: join(homedir(), \".agentproto\", \"daemon.log\"),\n // process.execPath is the Node binary running THIS process (the\n // one running `agentproto daemon install`). Captures fnm / nvm /\n // homebrew / system Node correctly. argv[1] is the cli.mjs entry\n // resolved by the shim.\n argv: [\n process.execPath,\n process.argv[1] ?? \"/dev/null\",\n ],\n }\n}\n\nasync function runInstall(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: { \"dry-run\": { type: \"boolean\" } },\n })\n const cfg = await loadConfig()\n const daemon = cfg.daemon ?? {}\n const p = paths()\n const argv = [\"serve\"]\n if (daemon.workspace) argv.push(\"--workspace\", daemon.workspace)\n if (typeof daemon.port === \"number\") argv.push(\"--port\", String(daemon.port))\n if (daemon.bind) argv.push(\"--bind\", daemon.bind)\n for (const origin of daemon.allowedOrigins ?? []) {\n argv.push(\"--allow-origin\", origin)\n }\n if (daemon.label) argv.push(\"--label\", daemon.label)\n const tunnelHost = cfg.tunnel?.host\n const autoconnect = cfg.tunnel?.autoconnect === true\n if (tunnelHost && autoconnect) argv.push(\"--connect\", tunnelHost)\n\n const plist = renderPlist({\n label: LABEL,\n // `node /path/to/cli.mjs` first, then the serve verb + flags.\n fullArgv: [...p.argv, ...argv],\n logPath: p.log,\n })\n\n if (values[\"dry-run\"]) {\n process.stdout.write(\n `# Would write ${p.plist}:\\n\\n${plist}\\n# launchctl bootstrap gui/$(id -u) ${p.plist}\\n`,\n )\n return 0\n }\n\n await fs.mkdir(dirname(p.plist), { recursive: true })\n await fs.mkdir(dirname(p.log), { recursive: true })\n await fs.writeFile(p.plist, plist, \"utf8\")\n process.stdout.write(`agentproto daemon: wrote ${p.plist}\\n`)\n\n // If a previous version is loaded, bootout first so bootstrap\n // doesn't fail with \"service already bootstrapped\".\n await launchctl([\"bootout\", `gui/${process.getuid?.() ?? 0}/${LABEL}`]).catch(\n () => undefined,\n )\n\n const boot = await launchctl([\n \"bootstrap\",\n `gui/${process.getuid?.() ?? 0}`,\n p.plist,\n ])\n if (boot.code !== 0) {\n process.stderr.write(\n `agentproto daemon install: launchctl bootstrap failed (exit ${boot.code})\\n${boot.stderr}\\n`,\n )\n return 1\n }\n process.stdout.write(\n `agentproto daemon: loaded via launchd. Tail logs: agentproto daemon logs\\n`,\n )\n return 0\n}\n\nasync function runUninstall(): Promise<number> {\n const p = paths()\n const target = `gui/${process.getuid?.() ?? 0}/${LABEL}`\n const out = await launchctl([\"bootout\", target])\n if (out.code !== 0 && !/No such process/i.test(out.stderr)) {\n process.stderr.write(\n `agentproto daemon uninstall: launchctl bootout failed (exit ${out.code})\\n${out.stderr}\\n`,\n )\n }\n try {\n await fs.unlink(p.plist)\n process.stdout.write(`agentproto daemon: removed ${p.plist}\\n`)\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code\n if (code === \"ENOENT\") {\n process.stdout.write(`agentproto daemon: ${p.plist} already absent\\n`)\n } else {\n process.stderr.write(\n `agentproto daemon uninstall: failed to remove plist: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n )\n return 1\n }\n }\n return 0\n}\n\nasync function runStart(): Promise<number> {\n const target = `gui/${process.getuid?.() ?? 0}/${LABEL}`\n const out = await launchctl([\"kickstart\", \"-k\", target])\n if (out.code !== 0) {\n process.stderr.write(\n `agentproto daemon start: ${out.stderr || \"launchctl exited \" + out.code}\\n` +\n ` Run \\`agentproto daemon install\\` first.\\n`,\n )\n return out.code\n }\n process.stdout.write(\"agentproto daemon: kickstart sent\\n\")\n return 0\n}\n\nasync function runStop(): Promise<number> {\n const target = `gui/${process.getuid?.() ?? 0}/${LABEL}`\n const out = await launchctl([\"kill\", \"SIGTERM\", target])\n if (out.code !== 0) {\n process.stderr.write(\n `agentproto daemon stop: ${out.stderr || \"launchctl exited \" + out.code}\\n`,\n )\n return out.code\n }\n process.stdout.write(\"agentproto daemon: SIGTERM sent\\n\")\n return 0\n}\n\nasync function runStatus(): Promise<number> {\n const p = paths()\n const cfg = await loadConfig()\n const port = cfg.daemon?.port ?? 18790\n const bind = cfg.daemon?.bind ?? \"127.0.0.1\"\n\n // 1. plist installed?\n let plistOk = false\n try {\n await fs.access(p.plist)\n plistOk = true\n } catch {\n /* not installed */\n }\n\n // 2. launchctl loaded?\n const target = `gui/${process.getuid?.() ?? 0}/${LABEL}`\n const printOut = await launchctl([\"print\", target])\n const loaded = printOut.code === 0\n // Extract pid (or state) from the print output — best-effort regex\n // so a launchctl output format change doesn't crash us.\n const pidMatch = printOut.stdout.match(/^\\s*pid\\s*=\\s*(\\d+)/m)\n const stateMatch = printOut.stdout.match(/^\\s*state\\s*=\\s*(\\w+)/m)\n\n // 3. /health probe.\n let health: string | null = null\n try {\n const res = await fetch(`http://${bind}:${port}/health`, {\n signal: AbortSignal.timeout(800),\n })\n if (res.ok) {\n const body = (await res.json().catch(() => ({}))) as {\n workspace?: string\n uptimeMs?: number\n }\n health = `ok · workspace=${body.workspace ?? \"?\"} · up ${humaniseUptime(body.uptimeMs ?? 0)}`\n } else {\n health = `HTTP ${res.status}`\n }\n } catch {\n health = \"unreachable\"\n }\n\n process.stdout.write(\n `agentproto daemon status\\n` +\n ` plist: ${plistOk ? \"installed\" : \"not installed\"} (${p.plist})\\n` +\n ` launchd: ${loaded ? \"loaded\" : \"not loaded\"}` +\n (pidMatch ? ` · pid=${pidMatch[1]}` : \"\") +\n (stateMatch ? ` · state=${stateMatch[1]}` : \"\") +\n `\\n` +\n ` /health: ${health} (http://${bind}:${port})\\n` +\n ` config: ${CONFIG_FILE_PATH()}\\n` +\n ` logs: ${p.log}\\n`,\n )\n\n // Tail the last 5 lines so users see what the daemon is up to.\n try {\n const buf = await fs.readFile(p.log, \"utf8\")\n const tail = buf.split(\"\\n\").slice(-6).join(\"\\n\").trim()\n if (tail) {\n process.stdout.write(`\\n recent logs:\\n${indent(tail, \" \")}\\n`)\n }\n } catch {\n /* no log yet */\n }\n return plistOk && loaded ? 0 : 1\n}\n\nasync function runLogs(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: { lines: { type: \"string\", short: \"n\" } },\n })\n const n = values.lines ? Number.parseInt(values.lines, 10) : 10\n const p = paths()\n try {\n const buf = await fs.readFile(p.log, \"utf8\")\n const lines = buf.split(\"\\n\")\n process.stdout.write(lines.slice(-n - 1).join(\"\\n\"))\n if (!buf.endsWith(\"\\n\")) process.stdout.write(\"\\n\")\n return 0\n } catch (err) {\n process.stderr.write(\n `agentproto daemon logs: ${err instanceof Error ? err.message : String(err)}\\n`,\n )\n return 1\n }\n}\n\ninterface PlistOpts {\n label: string\n /** Full argv launchd execs — `[node, cli.mjs, serve, …]`. */\n fullArgv: string[]\n logPath: string\n}\n\nfunction renderPlist(opts: PlistOpts): string {\n const argEls = opts.fullArgv\n .map(a => ` <string>${xmlEscape(a)}</string>`)\n .join(\"\\n\")\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key><string>${xmlEscape(opts.label)}</string>\n <key>ProgramArguments</key>\n <array>\n${argEls}\n </array>\n <key>RunAtLoad</key><true/>\n <key>KeepAlive</key><true/>\n <key>ProcessType</key><string>Interactive</string>\n <key>StandardOutPath</key><string>${xmlEscape(opts.logPath)}</string>\n <key>StandardErrorPath</key><string>${xmlEscape(opts.logPath)}</string>\n <key>EnvironmentVariables</key>\n <dict>\n <key>PATH</key><string>${xmlEscape(process.env.PATH ?? \"/usr/local/bin:/usr/bin:/bin\")}</string>\n <key>HOME</key><string>${xmlEscape(process.env.HOME ?? homedir())}</string>\n </dict>\n</dict>\n</plist>\n`\n}\n\nfunction xmlEscape(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n}\n\ninterface LaunchctlResult {\n code: number\n stdout: string\n stderr: string\n}\n\nfunction launchctl(args: string[]): Promise<LaunchctlResult> {\n return new Promise(resolve => {\n const child = spawn(\"launchctl\", args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] })\n let stdout = \"\"\n let stderr = \"\"\n child.stdout?.setEncoding(\"utf8\").on(\"data\", c => (stdout += c))\n child.stderr?.setEncoding(\"utf8\").on(\"data\", c => (stderr += c))\n child.on(\"error\", err =>\n resolve({ code: 127, stdout, stderr: err.message }),\n )\n child.on(\"exit\", code => resolve({ code: code ?? 1, stdout, stderr }))\n })\n}\n\nfunction humaniseUptime(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n if (ms < 60_000) return `${Math.floor(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.floor(ms / 60_000)}m`\n if (ms < 86_400_000) return `${Math.floor(ms / 3_600_000)}h`\n return `${Math.floor(ms / 86_400_000)}d`\n}\n\nfunction indent(s: string, prefix: string): string {\n return s\n .split(\"\\n\")\n .map(l => prefix + l)\n .join(\"\\n\")\n}\n","/**\n * Credential store for `agentproto auth login`.\n *\n * Format on disk (JSON, mode 0600):\n *\n * {\n * \"version\": 1,\n * \"hosts\": {\n * \"wss://guilde.work/api/v1/agentproto/tunnel\": {\n * \"token\": \"eyJ…\",\n * \"tokenType\": \"Bearer\",\n * \"expiresAt\": \"2026-08-08T12:34:56.000Z\",\n * \"refreshToken\": \"rt_…\", // optional\n * \"scope\": \"tunnel:connect\",\n * \"subject\": \"user_abc\",\n * \"obtainedAt\": \"2026-05-10T08:21:11.000Z\",\n * \"deviceLabel\": \"jeremy@laptop\"\n * }\n * }\n * }\n *\n * One file per *user*, multiple hosts under the same file. Hosts are\n * keyed by the URL the user passed to `agentproto auth login --host`,\n * stripped of trailing slash. `agentproto serve --connect <url>` looks\n * up the same key when no `--token` is passed.\n *\n * Storage location:\n * - `$AGENTPROTO_HOME/credentials.json`, falling back to\n * - `~/.agentproto/credentials.json`\n *\n * The file holds bearer tokens, so it's chmod'd 0600 on every write.\n * On Windows we rely on the per-user profile path being already\n * private and skip chmod. Never log the token contents.\n */\n\nimport { mkdir, readFile, writeFile, chmod, unlink } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { join, dirname } from \"node:path\"\n\nexport interface HostCredential {\n /** Bearer token. Bearer-form is the only one supported for v1. */\n token: string\n /** Always \"Bearer\" today; reserved for future schemes. */\n tokenType: \"Bearer\"\n /** ISO-8601. May be in the past — callers must check `isExpired`. */\n expiresAt: string\n /** OAuth 2.0 refresh token. Present when the host issues one. */\n refreshToken?: string\n /** Space-separated scopes the token was issued with. */\n scope?: string\n /** Human-readable subject — usually the user id, surfaced in `auth status`. */\n subject?: string\n /** ISO-8601 of when this credential was minted. */\n obtainedAt: string\n /** Friendly device label shown on the host's Machine-tokens page. */\n deviceLabel?: string\n /** Opaque revocation hint surfaced by the host (e.g. JTI). The CLI\n * passes it back on `auth logout` so the host can revoke the right\n * row server-side, not just delete the local copy. */\n revocationId?: string\n}\n\ninterface CredentialsFile {\n version: 1\n hosts: Record<string, HostCredential>\n}\n\nconst FILE_VERSION = 1 as const\n\nexport function credentialsPath(): string {\n const base = process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n return join(base, \"credentials.json\")\n}\n\nexport function normaliseHost(host: string): string {\n return host.replace(/\\/+$/, \"\")\n}\n\nexport async function loadCredentials(): Promise<CredentialsFile> {\n const path = credentialsPath()\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as CredentialsFile\n if (parsed.version !== FILE_VERSION) {\n throw new Error(\n `credentials.json: unknown version ${parsed.version}; expected ${FILE_VERSION}. ` +\n `Delete the file and re-run \\`agentproto auth login\\`.`\n )\n }\n return parsed\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { version: FILE_VERSION, hosts: {} }\n }\n throw err\n }\n}\n\nexport async function saveCredentials(file: CredentialsFile): Promise<void> {\n const path = credentialsPath()\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, JSON.stringify(file, null, 2))\n await chmod(path, 0o600).catch(() => {\n // Windows + some sandboxed FSes (e.g. WSL on a Windows mount) don't\n // honour chmod. The file lives under the user profile in those\n // cases, which is already user-private; not worth refusing.\n })\n}\n\nexport async function readHost(host: string): Promise<HostCredential | null> {\n const f = await loadCredentials()\n return f.hosts[normaliseHost(host)] ?? null\n}\n\nexport async function writeHost(\n host: string,\n cred: HostCredential\n): Promise<void> {\n const f = await loadCredentials()\n f.hosts[normaliseHost(host)] = cred\n await saveCredentials(f)\n}\n\nexport async function deleteHost(host: string): Promise<HostCredential | null> {\n const f = await loadCredentials()\n const key = normaliseHost(host)\n const prev = f.hosts[key] ?? null\n if (prev) {\n delete f.hosts[key]\n if (Object.keys(f.hosts).length === 0) {\n // Empty file is a valid state (`auth login` re-creates), but\n // unlinking is cleaner — `auth status` then prints \"no credentials\".\n await unlink(credentialsPath()).catch(() => {})\n } else {\n await saveCredentials(f)\n }\n }\n return prev\n}\n\nexport function isExpired(cred: HostCredential, gracePeriodMs = 30_000): boolean {\n const exp = Date.parse(cred.expiresAt)\n if (!Number.isFinite(exp)) return false // unparseable expiry → trust the host\n return exp - gracePeriodMs <= Date.now()\n}\n\nexport function formatExpiry(cred: HostCredential): string {\n const exp = new Date(cred.expiresAt)\n if (Number.isNaN(exp.getTime())) return \"unknown\"\n const ms = exp.getTime() - Date.now()\n if (ms < 0) return `expired ${formatRelative(-ms)} ago`\n return `expires in ${formatRelative(ms)}`\n}\n\nfunction formatRelative(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`\n if (ms < 86_400_000) return `${Math.round(ms / 3_600_000)}h`\n return `${Math.round(ms / 86_400_000)}d`\n}\n","/**\n * `agentproto auth <login | status | logout>`\n *\n * Implements the **host-binding** flow — the JWT that authenticates\n * `agentproto serve --connect <host>` to its tunnel host (Guilde,\n * a self-hosted gateway, …). Different from per-adapter setup tokens,\n * which are per-CLI and live in adapter `setup[]` blocks.\n *\n * Mechanism: OAuth 2.0 Device Authorization Grant (RFC 8628), the\n * same flow Claude Code, gh, gcloud, and stripe-cli use. Three steps:\n *\n * 1. Discovery — fetch `<host>/.well-known/agentproto-host.json`\n * to learn the device + token endpoints.\n * 2. Authorize — POST device endpoint → user_code + verification_uri.\n * 3. Poll — POST token endpoint with grant_type=device_code\n * until the user approves in the browser, then\n * persist {access_token, refresh_token, expires_in}\n * to `~/.agentproto/credentials.json`.\n *\n * Everything else in `agentproto` (serve, install, run) treats this\n * file as the source of truth when no `--token` is supplied.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { hostname, platform, userInfo } from \"node:os\"\nimport { parseArgs } from \"node:util\"\nimport {\n credentialsPath,\n deleteHost,\n formatExpiry,\n isExpired,\n loadCredentials,\n normaliseHost,\n readHost,\n writeHost,\n type HostCredential,\n} from \"../util/credentials.js\"\n\nexport async function runAuth(args: readonly string[]): Promise<number> {\n const sub = args[0]\n const rest = args.slice(1)\n switch (sub) {\n case \"login\":\n return runAuthLogin(rest)\n case \"status\":\n return runAuthStatus(rest)\n case \"logout\":\n return runAuthLogout(rest)\n case undefined:\n case \"--help\":\n case \"-h\":\n process.stdout.write(USAGE)\n return 0\n default:\n process.stderr.write(\n `agentproto auth: unknown subcommand '${sub}'.\\n\\n${USAGE}`\n )\n return 2\n }\n}\n\nconst USAGE = `agentproto auth — host-binding tokens (RFC 8628 device flow)\n\nUsage:\n agentproto auth login [--host <url>] [--label <name>] [--no-browser]\n agentproto auth status [--host <url>] [--json]\n agentproto auth logout [--host <url>]\n\nThe default host is the one most recently logged into; on first use,\n\\`--host\\` is required. Examples:\n\n agentproto auth login --host wss://guilde.work\n agentproto auth status\n agentproto auth logout --host wss://guilde.work\n`\n\n// ── login ────────────────────────────────────────────────────────────\n\ninterface HostDiscovery {\n /** RFC 8414 issuer string, surfaced for \"logged in to X\" UI. */\n issuer: string\n /** RFC 8628 device authorization endpoint. */\n device_authorization_endpoint: string\n /** RFC 6749 token endpoint. */\n token_endpoint: string\n /** Optional revocation endpoint (RFC 7009). */\n revocation_endpoint?: string\n /** OAuth client_id the agentproto CLI presents. Hosts that don't\n * enforce per-client metadata MAY return the constant\n * `agentproto-cli`; hosts that do MUST register the CLI as a\n * public client and put the registered id here. */\n client_id: string\n /** Optional scopes the CLI may request. Subset of host's offer. */\n scopes_supported?: string[]\n}\n\ninterface DeviceAuthResponse {\n device_code: string\n user_code: string\n verification_uri: string\n /** Optional pre-filled URL with the user_code embedded. RFC 8628 §3.3.1. */\n verification_uri_complete?: string\n expires_in: number\n /** Polling interval in seconds. RFC 8628 default 5. */\n interval?: number\n}\n\ninterface TokenSuccessResponse {\n access_token: string\n token_type: \"Bearer\" | \"bearer\"\n expires_in: number\n refresh_token?: string\n scope?: string\n /** Custom (not in RFC 6749): host's revocation hint, e.g. JTI or\n * internal token row id. We pass it back on logout. */\n revocation_id?: string\n /** Custom: subject id surfaced in `auth status`. */\n subject?: string\n}\n\ninterface TokenErrorResponse {\n error:\n | \"authorization_pending\"\n | \"slow_down\"\n | \"access_denied\"\n | \"expired_token\"\n | \"invalid_client\"\n | \"invalid_grant\"\n | \"unsupported_grant_type\"\n | string\n error_description?: string\n}\n\nasync function runAuthLogin(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n strict: true,\n options: {\n host: { type: \"string\" },\n label: { type: \"string\" },\n \"no-browser\": { type: \"boolean\" },\n scope: { type: \"string\" },\n },\n })\n const host = values.host ?? (await pickDefaultHost())\n if (!host) {\n process.stderr.write(\n \"agentproto auth login: pass --host <url> on first login (e.g. --host wss://guilde.work).\\n\"\n )\n return 2\n }\n const label = values.label ?? `${userInfo().username}@${hostname()}`\n const requestedScope = values.scope ?? \"tunnel:connect agent-cli:dispatch\"\n\n const httpHost = toHttp(host)\n const discoveryUrl = `${httpHost}/.well-known/agentproto-host.json`\n process.stdout.write(`agentproto auth: discovering ${discoveryUrl}\\n`)\n let discovery: HostDiscovery\n try {\n discovery = await fetchJson<HostDiscovery>(discoveryUrl)\n } catch (err) {\n process.stderr.write(\n `agentproto auth: failed to fetch host metadata: ${err instanceof Error ? err.message : String(err)}\\n` +\n ` Hosts SHOULD expose /.well-known/agentproto-host.json with device_authorization_endpoint + token_endpoint.\\n`\n )\n return 1\n }\n\n // Step 1 — request a device code.\n let deviceRes: DeviceAuthResponse\n try {\n deviceRes = await postForm<DeviceAuthResponse>(\n discovery.device_authorization_endpoint,\n {\n client_id: discovery.client_id,\n scope: requestedScope,\n // Custom field; hosts that ignore it stay compliant. The\n // approval UI uses it to render \"approve <label>\" so the user\n // recognises the device they're authorising.\n device_label: label,\n }\n )\n } catch (err) {\n process.stderr.write(\n `agentproto auth: device authorization request failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n }\n\n // Step 2 — show the code, open the browser.\n const verifyUrl =\n deviceRes.verification_uri_complete ?? deviceRes.verification_uri\n process.stdout.write(\n `\\nagentproto auth: open\\n ${verifyUrl}\\nand enter code ${deviceRes.user_code}\\n\\n`\n )\n if (!values[\"no-browser\"]) {\n void openBrowser(verifyUrl)\n }\n process.stdout.write(\n `agentproto auth: waiting for approval (expires in ${formatDuration(deviceRes.expires_in * 1000)})…\\n`\n )\n\n // Step 3 — poll the token endpoint.\n const interval = Math.max(1, deviceRes.interval ?? 5)\n const deadline = Date.now() + deviceRes.expires_in * 1000\n let pollIntervalMs = interval * 1000\n let token: TokenSuccessResponse | null = null\n while (Date.now() < deadline) {\n await sleep(pollIntervalMs)\n let res: TokenSuccessResponse | TokenErrorResponse\n try {\n res = await postForm<TokenSuccessResponse | TokenErrorResponse>(\n discovery.token_endpoint,\n {\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceRes.device_code,\n client_id: discovery.client_id,\n }\n )\n } catch (err) {\n process.stderr.write(\n `agentproto auth: token poll failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n }\n if (\"access_token\" in res) {\n token = res\n break\n }\n if (res.error === \"authorization_pending\") continue\n if (res.error === \"slow_down\") {\n // Back off as RFC 8628 §3.5 recommends; poll cadence stays slower\n // for the rest of the flow.\n pollIntervalMs += 5_000\n continue\n }\n if (res.error === \"access_denied\") {\n process.stderr.write(`agentproto auth: approval denied. Aborting.\\n`)\n return 1\n }\n if (res.error === \"expired_token\") {\n process.stderr.write(\n `agentproto auth: device code expired before approval. Re-run \\`agentproto auth login\\`.\\n`\n )\n return 1\n }\n process.stderr.write(\n `agentproto auth: token endpoint returned '${res.error}'${\n res.error_description ? `: ${res.error_description}` : \"\"\n }\\n`\n )\n return 1\n }\n if (!token) {\n process.stderr.write(\n `agentproto auth: timed out waiting for approval. Re-run \\`agentproto auth login\\`.\\n`\n )\n return 1\n }\n\n // Persist.\n const cred: HostCredential = {\n token: token.access_token,\n tokenType: \"Bearer\",\n expiresAt: new Date(Date.now() + token.expires_in * 1000).toISOString(),\n obtainedAt: new Date().toISOString(),\n ...(token.refresh_token ? { refreshToken: token.refresh_token } : {}),\n ...(token.scope ? { scope: token.scope } : {}),\n ...(token.subject ? { subject: token.subject } : {}),\n ...(token.revocation_id ? { revocationId: token.revocation_id } : {}),\n deviceLabel: label,\n }\n await writeHost(host, cred)\n process.stdout.write(\n `agentproto auth: ✓ logged in to ${normaliseHost(host)}\\n` +\n ` saved to ${credentialsPath()} (mode 0600)\\n` +\n ` ${formatExpiry(cred)}${cred.subject ? `, subject ${cred.subject}` : \"\"}\\n`\n )\n return 0\n}\n\n// ── status ───────────────────────────────────────────────────────────\n\nasync function runAuthStatus(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n strict: true,\n options: {\n host: { type: \"string\" },\n json: { type: \"boolean\" },\n },\n })\n const file = await loadCredentials()\n const entries = Object.entries(file.hosts)\n if (entries.length === 0) {\n if (values.json) {\n process.stdout.write(`{\"hosts\": []}\\n`)\n } else {\n process.stdout.write(\n `agentproto auth: no credentials. Try: agentproto auth login --host wss://guilde.work\\n`\n )\n }\n return 0\n }\n const filtered = values.host\n ? entries.filter(([h]) => h === normaliseHost(values.host!))\n : entries\n if (values.json) {\n process.stdout.write(\n JSON.stringify(\n {\n hosts: filtered.map(([host, c]) => ({\n host,\n subject: c.subject ?? null,\n scope: c.scope ?? null,\n obtainedAt: c.obtainedAt,\n expiresAt: c.expiresAt,\n expired: isExpired(c),\n deviceLabel: c.deviceLabel ?? null,\n })),\n },\n null,\n 2\n ) + \"\\n\"\n )\n return 0\n }\n for (const [host, c] of filtered) {\n const status = isExpired(c) ? \"✗ EXPIRED\" : \"✓ active\"\n process.stdout.write(\n `${status} ${host}\\n` +\n ` subject: ${c.subject ?? \"(none)\"}\\n` +\n ` scope: ${c.scope ?? \"(none)\"}\\n` +\n ` label: ${c.deviceLabel ?? \"(none)\"}\\n` +\n ` ${formatExpiry(c)} (obtained ${c.obtainedAt})\\n`\n )\n }\n return 0\n}\n\n// ── logout ───────────────────────────────────────────────────────────\n\nasync function runAuthLogout(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n strict: true,\n options: { host: { type: \"string\" } },\n })\n const host = values.host ?? (await pickDefaultHost())\n if (!host) {\n process.stderr.write(\n `agentproto auth logout: no credentials to revoke. Pass --host <url> if you stored one.\\n`\n )\n return 0\n }\n const prev = await readHost(host)\n if (!prev) {\n process.stderr.write(\n `agentproto auth logout: no credential found for ${host}.\\n`\n )\n return 0\n }\n\n // Best-effort server-side revocation. RFC 7009 token revocation is\n // optional in the host metadata; when missing, we just delete the\n // local copy. When present, we call it but don't fail logout if it\n // errors — the local delete still happens so the user is logged out\n // on this machine even if the host is unreachable.\n let serverRevoked: \"ok\" | \"skipped\" | \"failed\" = \"skipped\"\n try {\n const httpHost = toHttp(host)\n const discovery = await fetchJson<HostDiscovery>(\n `${httpHost}/.well-known/agentproto-host.json`\n )\n if (discovery.revocation_endpoint) {\n const params: Record<string, string> = {\n client_id: discovery.client_id,\n token: prev.token,\n }\n if (prev.revocationId) params[\"revocation_id\"] = prev.revocationId\n await postForm(discovery.revocation_endpoint, params)\n serverRevoked = \"ok\"\n }\n } catch {\n serverRevoked = \"failed\"\n }\n\n await deleteHost(host)\n const note =\n serverRevoked === \"ok\"\n ? \" (server revoked)\"\n : serverRevoked === \"failed\"\n ? \" (server revocation failed; local copy still removed)\"\n : \" (no revocation endpoint advertised; local copy removed)\"\n process.stdout.write(`agentproto auth: ✓ logged out of ${host}${note}\\n`)\n return 0\n}\n\n// ── helpers ──────────────────────────────────────────────────────────\n\nasync function pickDefaultHost(): Promise<string | null> {\n const f = await loadCredentials()\n const keys = Object.keys(f.hosts)\n if (keys.length === 0) return null\n // Most-recently-issued wins. Status command surfaces the full list\n // so the heuristic is just for omitted --host on a single-host setup.\n let best: { host: string; obtainedAt: number } | null = null\n for (const [host, cred] of Object.entries(f.hosts)) {\n const t = Date.parse(cred.obtainedAt)\n if (!Number.isFinite(t)) continue\n if (!best || t > best.obtainedAt) best = { host, obtainedAt: t }\n }\n return best?.host ?? keys[0] ?? null\n}\n\n/**\n * The host URL the user passes is typically a wss:// (tunnel) URL.\n * The OAuth metadata document lives at the http(s) origin of the same\n * host. This converter assumes wss → https, ws → http; everything\n * else passes through.\n */\nfunction toHttp(host: string): string {\n const trimmed = host.replace(/\\/+$/, \"\")\n if (trimmed.startsWith(\"wss://\")) return \"https://\" + trimmed.slice(6)\n if (trimmed.startsWith(\"ws://\")) return \"http://\" + trimmed.slice(5)\n return trimmed\n}\n\nasync function fetchJson<T>(url: string): Promise<T> {\n const res = await fetch(url, { headers: { Accept: \"application/json\" } })\n if (!res.ok) {\n throw new Error(`GET ${url} → ${res.status} ${res.statusText}`)\n }\n return (await res.json()) as T\n}\n\nasync function postForm<T>(\n url: string,\n body: Record<string, string>\n): Promise<T> {\n const params = new URLSearchParams(body)\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: params.toString(),\n })\n // OAuth error responses return 400 with a JSON `{error, ...}` body.\n // Hand them back to the caller verbatim; let it discriminate.\n if (!res.ok && res.status !== 400) {\n const text = await res.text().catch(() => \"\")\n throw new Error(\n `POST ${url} → ${res.status} ${res.statusText}${text ? \": \" + text.slice(0, 200) : \"\"}`\n )\n }\n return (await res.json()) as T\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`\n return `${Math.round(ms / 3_600_000)}h`\n}\n\nfunction openBrowser(url: string): Promise<void> {\n // best-effort; failure is non-fatal — the URL is already on screen.\n const p = platform()\n const cmd = p === \"darwin\" ? \"open\" : p === \"win32\" ? \"cmd\" : \"xdg-open\"\n const args = p === \"win32\" ? [\"/c\", \"start\", url] : [url]\n return new Promise((resolve) => {\n try {\n const child = spawn(cmd, args, { stdio: \"ignore\", detached: true })\n child.once(\"error\", () => resolve())\n child.once(\"spawn\", () => {\n child.unref()\n resolve()\n })\n } catch {\n resolve()\n }\n })\n}\n","/**\n * `agentproto config <get|set|unset|edit|show> [args]`\n *\n * Hand-editable defaults at `~/.agentproto/config.json`. Sub-verbs:\n *\n * show dump the whole config (pretty JSON)\n * get <key> read one dot-notation key\n * set <key> <value> write one key. Value parsed as JSON when valid,\n * otherwise stored as a string. Arrays accept a\n * comma-separated form (`a,b,c`) for convenience.\n * unset <key> delete one key\n * edit open the file in $EDITOR (or vi)\n * path print the config file path (scripting helper)\n *\n * The daemon reads this file at boot — `serve` falls back to these\n * values when neither CLI flags nor env vars supply one. CLI flags\n * still win, so a config can hold sensible defaults without locking\n * out one-off overrides.\n */\n\nimport { parseArgs } from \"node:util\"\nimport { spawn } from \"node:child_process\"\nimport {\n loadConfig,\n saveConfig,\n getConfigKey,\n setConfigKey,\n CONFIG_FILE_PATH,\n} from \"@agentproto/runtime/config\"\n\nconst USAGE = `agentproto config — manage ~/.agentproto/config.json\n\nUsage:\n agentproto config show dump the full config as JSON\n agentproto config path print the config file path\n agentproto config get <key> read one dot-notation key\n agentproto config set <key> <value> write a key (JSON-parsed when valid)\n agentproto config unset <key> delete a key\n agentproto config edit open the file in $EDITOR\n\nExamples:\n agentproto config set daemon.port 18791\n agentproto config set daemon.allowedOrigins https://guilde.work,https://app.example.com\n agentproto config set tunnel.host wss://guilde.work/api/v1/agentproto/tunnel\n agentproto config get daemon.port\n`\n\nexport async function runConfig(args: readonly string[]): Promise<number> {\n if (args.includes(\"--help\") || args.includes(\"-h\") || args.length === 0) {\n process.stdout.write(USAGE)\n return args.length === 0 ? 2 : 0\n }\n const sub = args[0]\n const rest = args.slice(1)\n switch (sub) {\n case \"show\":\n return runShow(rest)\n case \"path\":\n return runPath()\n case \"get\":\n return runGet(rest)\n case \"set\":\n return runSet(rest)\n case \"unset\":\n return runUnset(rest)\n case \"edit\":\n return runEdit()\n default:\n process.stderr.write(\n `agentproto config: unknown sub-verb \"${sub}\".\\n\\n${USAGE}`,\n )\n return 2\n }\n}\n\nasync function runShow(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: { json: { type: \"boolean\" } },\n })\n void values // json is the only output today, accept flag for forward-compat\n const cfg = await loadConfig()\n process.stdout.write(JSON.stringify(cfg, null, 2) + \"\\n\")\n return 0\n}\n\nasync function runPath(): Promise<number> {\n process.stdout.write(CONFIG_FILE_PATH() + \"\\n\")\n return 0\n}\n\nasync function runGet(args: readonly string[]): Promise<number> {\n const key = args[0]\n if (!key) {\n process.stderr.write(\n \"agentproto config get: missing key.\\n Try: agentproto config get daemon.port\\n\",\n )\n return 2\n }\n const cfg = await loadConfig()\n const val = getConfigKey(cfg, key)\n if (val === undefined) {\n process.stderr.write(`agentproto config get: \"${key}\" not set\\n`)\n return 1\n }\n process.stdout.write(JSON.stringify(val, null, 2) + \"\\n\")\n return 0\n}\n\nasync function runSet(args: readonly string[]): Promise<number> {\n const [key, ...valueParts] = args\n if (!key || valueParts.length === 0) {\n process.stderr.write(\n \"agentproto config set: missing key and/or value.\\n\" +\n ' Try: agentproto config set daemon.port 18791\\n' +\n ' agentproto config set daemon.allowedOrigins https://guilde.work,https://x.com\\n',\n )\n return 2\n }\n // Joined back so `set key 1 2 3` (whitespace-split argv) becomes\n // \"1 2 3\" as a string — caller can quote at the shell to control.\n const raw = valueParts.join(\" \")\n const parsed = parseValue(raw)\n const cfg = await loadConfig()\n const next = setConfigKey(cfg, key, parsed)\n await saveConfig(next)\n process.stdout.write(\n `agentproto config: set ${key} = ${JSON.stringify(parsed)}\\n` +\n ` (${CONFIG_FILE_PATH()})\\n`,\n )\n return 0\n}\n\nasync function runUnset(args: readonly string[]): Promise<number> {\n const key = args[0]\n if (!key) {\n process.stderr.write(\n \"agentproto config unset: missing key.\\n Try: agentproto config unset tunnel.host\\n\",\n )\n return 2\n }\n const cfg = await loadConfig()\n if (getConfigKey(cfg, key) === undefined) {\n process.stderr.write(`agentproto config unset: \"${key}\" not set\\n`)\n return 0\n }\n const next = setConfigKey(cfg, key, undefined)\n await saveConfig(next)\n process.stdout.write(`agentproto config: unset ${key}\\n`)\n return 0\n}\n\nasync function runEdit(): Promise<number> {\n // First make sure the file exists — a non-existent file would fail\n // to open in some editors. saveConfig() with the current state is\n // a no-op write that materializes the file when missing.\n const cfg = await loadConfig()\n await saveConfig(cfg)\n const editor = process.env.EDITOR ?? process.env.VISUAL ?? \"vi\"\n return new Promise<number>(resolve => {\n const child = spawn(editor, [CONFIG_FILE_PATH()], {\n stdio: \"inherit\",\n })\n child.on(\"error\", err => {\n process.stderr.write(\n `agentproto config edit: failed to launch ${editor}: ${err.message}\\n`,\n )\n resolve(1)\n })\n child.on(\"exit\", code => resolve(code ?? 0))\n })\n}\n\n/**\n * Parse a value string with these rules, in order:\n * 1. `true`, `false`, `null` → corresponding JSON literal\n * 2. valid JSON → parsed (numbers, arrays, objects)\n * 3. comma in value → split into array of trimmed strings\n * 4. otherwise → raw string\n *\n * Rationale: people set `daemon.port 18791` and expect a number, set\n * `daemon.allowedOrigins https://a.com,https://b.com` and expect a\n * string array — those are the two common cases. Quoting tricks via\n * JSON-literal mode (`'[\"a\",\"b\"]'`) are the escape hatch.\n */\nfunction parseValue(raw: string): unknown {\n const trimmed = raw.trim()\n if (trimmed === \"true\") return true\n if (trimmed === \"false\") return false\n if (trimmed === \"null\") return null\n // JSON first — covers numbers, arrays, objects, quoted strings.\n if (/^[\\d\\[{\"-]/.test(trimmed) || trimmed === \"true\" || trimmed === \"false\") {\n try {\n return JSON.parse(trimmed)\n } catch {\n // fall through\n }\n }\n // CSV → string array (only when there's at least one unquoted comma).\n if (trimmed.includes(\",\") && !trimmed.startsWith('\"')) {\n return trimmed.split(\",\").map(s => s.trim()).filter(Boolean)\n }\n return trimmed\n}\n","/**\n * Resolve a slug like \"claude-code\" to a runnable `AgentCliHandle`.\n *\n * Resolution order:\n * 1. `@agentproto/adapter-<slug>` from npm (must default-export or\n * named-export an `AgentCliHandle` — convention is the camelCased\n * slug, e.g. `claudeCode`).\n * 2. (TODO) `~/.agentproto/adapters/<slug>/AGENT-CLI.md` on disk.\n * 3. (TODO) bundled fallbacks for the canonical adapters.\n *\n * Step 1 covers 100% of v0 usage. The on-disk path is only there for\n * users authoring their own adapters; we'll add it once `defineAgentCli`\n * supports MD-source authoring end to end.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { resolve as resolvePath } from \"node:path\"\nimport type { AgentCliHandle } from \"@agentproto/driver-agent-cli\"\n\nexport interface ResolvedAdapter {\n readonly slug: string\n readonly handle: AgentCliHandle\n readonly source: \"npm\" | \"file\" | \"bundled\"\n readonly packageName?: string\n}\n\n/**\n * Compact metadata about an installed adapter — the shape returned\n * by `listInstalledAdapters()` and exposed via the daemon's\n * `GET /adapters` route + `list_adapters` MCP tool. Only fields\n * safe to surface in a UI list (no install scripts, no env keys).\n * For full handle access call `resolveAdapter(slug)`.\n */\nexport interface AdapterInfo {\n slug: string\n /** Display name from the manifest. */\n name: string\n /** Adapter package version (matches npm package.json `version`). */\n version: string\n /** One-line user-facing description. */\n description: string\n /** Wire protocol — informs prompt/multi-turn semantics. */\n protocol: string\n /** True when the adapter advertises a streaming session contract. */\n streaming: boolean\n /** npm package name (for install hints / \"open in npmjs.com\" links). */\n packageName: string\n}\n\nconst slugToCamel = (slug: string): string =>\n slug.replace(/-([a-z0-9])/g, (_, c: string) => c.toUpperCase())\n\nexport async function resolveAdapter(slug: string): Promise<ResolvedAdapter> {\n if (!/^[a-z][a-z0-9-]*$/.test(slug)) {\n throw new Error(\n `agentproto: invalid adapter slug '${slug}'. Slugs are lower-kebab.`\n )\n }\n\n const packageName = `@agentproto/adapter-${slug}`\n let mod: Record<string, unknown>\n try {\n mod = (await import(packageName)) as Record<string, unknown>\n } catch (err) {\n const cause = err instanceof Error ? err.message : String(err)\n throw new Error(\n `agentproto: could not load adapter '${slug}'. ` +\n `Tried '${packageName}'. Install it with: npm i -g ${packageName}\\n cause: ${cause}`\n )\n }\n\n const camel = slugToCamel(slug)\n const candidate =\n (mod[camel] as AgentCliHandle | undefined) ??\n (mod.default as AgentCliHandle | undefined) ??\n (mod.handle as AgentCliHandle | undefined)\n\n if (!candidate || typeof candidate !== \"object\" || !(\"name\" in candidate)) {\n throw new Error(\n `agentproto: adapter '${packageName}' does not export an AgentCliHandle ` +\n `(looked for export '${camel}', 'default', or 'handle').`\n )\n }\n\n return { slug, handle: candidate, source: \"npm\", packageName }\n}\n\n/**\n * Enumerate every `@agentproto/adapter-*` package reachable from the\n * current node module-resolution path. Used by the daemon's\n * `GET /adapters` route and `list_adapters` MCP tool so UIs (web\n * spawn dialog) and operators can pick from the installed set\n * without trial-and-error against `resolveAdapter(slug)`.\n *\n * Implementation: walk `node_modules/@agentproto` looking for\n * `adapter-*` directories; for each, dynamic-import the package +\n * extract the AgentCliHandle's display fields. Failures (broken\n * exports, missing dist) are collected as warnings rather than\n * thrown — partial discovery beats failing the whole listing on\n * one bad adapter.\n *\n * Discovery is async + reads disk on every call; cache at the\n * caller layer if you list often. v0 does no caching here because\n * adapter sets typically change rarely (npm i / rm) and a fresh\n * scan stays fast (~10 packages worth of dynamic imports).\n */\nexport async function listInstalledAdapters(opts?: {\n /** Override the search root. Defaults to walking up from the cli\n * package's own location until we hit a `node_modules/@agentproto`. */\n searchRoot?: string\n}): Promise<AdapterInfo[]> {\n const roots = await collectAgentprotoNamespaceRoots(opts?.searchRoot)\n const seen = new Set<string>()\n const out: AdapterInfo[] = []\n // Two failure buckets so we can produce ONE summary line for the\n // expected case (adapter dir found by the walker but not importable\n // from the daemon's resolution path — i.e. workspace-hoisted, not\n // globally installed) and keep per-adapter warnings only for the\n // genuinely surprising ones (broken exports, missing dist, etc.).\n const notImportable: string[] = []\n\n for (const root of roots) {\n let entries: string[] = []\n try {\n entries = await fs.readdir(root)\n } catch {\n continue\n }\n for (const entry of entries) {\n if (!entry.startsWith(\"adapter-\")) continue\n const slug = entry.slice(\"adapter-\".length)\n if (seen.has(slug)) continue\n seen.add(slug)\n try {\n const resolved = await resolveAdapter(slug)\n const handle = resolved.handle as Record<string, unknown>\n const info: AdapterInfo = {\n slug,\n name: typeof handle.name === \"string\" ? handle.name : slug,\n version: typeof handle.version === \"string\" ? handle.version : \"?\",\n description:\n typeof handle.description === \"string\" ? handle.description : \"\",\n protocol:\n typeof handle.protocol === \"string\" ? handle.protocol : \"unknown\",\n streaming: !!(handle.capabilities as { streaming?: boolean })\n ?.streaming,\n packageName: resolved.packageName ?? `@agentproto/adapter-${slug}`,\n }\n out.push(info)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // ERR_MODULE_NOT_FOUND / \"Cannot find package\" is the expected\n // shape when the walker finds an adapter dir hoisted in a\n // workspace's node_modules but that dir isn't reachable from\n // the daemon binary's NODE_PATH. Collapse those into a single\n // summary line below; anything else (broken handle export,\n // syntax error in dist, etc.) still warns individually.\n if (\n /Cannot find package|ERR_MODULE_NOT_FOUND/i.test(msg) &&\n msg.includes(`@agentproto/adapter-${slug}`)\n ) {\n notImportable.push(slug)\n } else {\n console.warn(\n `[agentproto/cli] listInstalledAdapters: skipping broken adapter '${slug}': ${msg}`\n )\n }\n }\n }\n }\n\n // We deliberately do NOT log `notImportable` to console. The\n // discovery walker often finds adapter directories hoisted in a\n // workspace's node_modules that aren't reachable from the daemon's\n // own NODE_PATH — that's a normal state for a fresh checkout and\n // not actionable from a daemon log line. Callers who want the info\n // can inspect the `listInstalledAdapters` return value (importable\n // adapters only); a future `agentproto adapters doctor` verb is the\n // right home for surfacing the unimportable slugs interactively.\n void notImportable\n\n return out.sort((a, b) => a.slug.localeCompare(b.slug))\n}\n\n/**\n * Walk up from the cli package looking for `node_modules/@agentproto`\n * directories. Returns every match (pnpm + global + nvm hoisting can\n * produce more than one) so adapters installed in any reachable\n * scope are discoverable.\n */\nasync function collectAgentprotoNamespaceRoots(\n start?: string\n): Promise<string[]> {\n const roots: string[] = []\n // Start from this package's own dir — works in ESM (import.meta.url\n // route would be cleaner but isn't needed; cwd is reliable enough\n // for the daemon use case where it boots from a known dir).\n let cur = start ?? process.cwd()\n // Both classic + pnpm-hoist locations. Classic npm puts the\n // namespace at node_modules/@agentproto; pnpm hoists to\n // node_modules/.pnpm/node_modules/@agentproto and symlinks\n // individual packages from there. We need to scan the hoist dir\n // for the listing because the namespace dir is the only place\n // where every adapter package is enumerable.\n const candidatesAt = (dir: string): string[] => [\n resolvePath(dir, \"node_modules\", \"@agentproto\"),\n resolvePath(dir, \"node_modules\", \".pnpm\", \"node_modules\", \"@agentproto\"),\n ]\n for (let depth = 0; depth < 16; depth++) {\n for (const candidate of candidatesAt(cur)) {\n try {\n const stat = await fs.stat(candidate)\n if (stat.isDirectory()) roots.push(candidate)\n } catch {\n /* not present at this level */\n }\n }\n const parent = resolvePath(cur, \"..\")\n if (parent === cur) break\n cur = parent\n }\n return roots\n}\n","/**\n * `agentproto setup <slug>` + `runSetup()` engine.\n *\n * Implements AIP-29 § Setup — the post-install configuration pipeline.\n * Steps run in declared order. Idempotency comes from three layers:\n *\n * 1. Manifest's `version_check` — already covered by `install`. If the\n * binary's version answers, install steps are skipped entirely\n * before setup ever runs.\n *\n * 2. Per-step `skip_if.cmd` — runs first; matching exit code skips\n * the step. Asks the live system, so it works on fresh machines\n * without any local state.\n *\n * 3. Setup ledger — `~/.agentproto/setup/<slug>.json`, records each\n * successful step with timestamp + (when applicable) which slot\n * received the value. Re-runs short-circuit ledger-known steps\n * unless --force is passed.\n *\n * The `runSetup()` export is what `agentproto install` calls after the\n * install array succeeds; `runSetupCommand()` is the standalone verb\n * (re-runs only setup, no install).\n *\n * Step `kind` matrix (current support):\n *\n * - cmd ✓ — shell command, optional skip_if + persist (stdout)\n * - prompt ✓ — text / boolean / select / secret; persist via env / secret_slug / cmd\n * - oauth ✗ — placeholder; needs a SECRETS.md driver wire-up\n * - external ⚠ — opens URL via xdg-open/open; callback polling not yet wired\n *\n * The unsupported kinds surface a clear \"not yet implemented\" message\n * so adapter authors can lean on cmd + prompt today and migrate later.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { mkdir, readFile, writeFile, chmod } from \"node:fs/promises\"\nimport { homedir, platform } from \"node:os\"\nimport { join, dirname } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport { createInterface } from \"node:readline/promises\"\nimport { stdin as input, stdout as output } from \"node:process\"\nimport type {\n AgentCliHandle,\n AgentCliSetupStep,\n AgentCliSetupSkipIf,\n AgentCliSetupPersist,\n} from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\n\ninterface LedgerEntry {\n /** Step id from the manifest. */\n stepId: string\n /** ISO-8601 timestamp the step succeeded (or was skipped via skip_if). */\n completedAt: string\n /** What kind of step this was — for forensic scrubbing. Persist values\n * are NEVER stored in the ledger; only the slot name where they\n * landed. */\n kind: AgentCliSetupStep[\"kind\"]\n /** Slot the captured value went into, when applicable. Format:\n * - `env:OPENCLAW_GATEWAY_URL`\n * - `secret:openclaw/gateway-token`\n * - `cmd` (the value was piped to a config command, not stored here)\n */\n persistedTo?: string\n /** True when the step short-circuited via skip_if instead of running. */\n skippedViaSkipIf?: boolean\n}\n\ninterface Ledger {\n /** Bundle id, matches the manifest's `id`. */\n slug: string\n /** When the ledger was last touched. */\n updatedAt: string\n /** One per step id. Most recent run wins. */\n steps: Record<string, LedgerEntry>\n /** Captured env-bound values — persist.env steps land here. The\n * installer + runner read from the secrets backend in production;\n * for the local CLI host we mirror them into the ledger so\n * `agentproto run` can lift them onto the spawn env without hitting\n * a remote vault. Restricted to 0600 perms by the writer. */\n envValues?: Record<string, string>\n}\n\nexport interface RunSetupOptions {\n slug: string\n handle: AgentCliHandle\n /** When true, ignore the ledger AND skip_if; re-runs every step. */\n force?: boolean\n /** When true, log what would happen but don't spawn / prompt. */\n dryRun?: boolean\n /** When set, only run the named step ids (in declared order). Useful\n * for re-running a single step after a manual fix. */\n only?: string[]\n}\n\nexport async function runSetup(opts: RunSetupOptions): Promise<number> {\n const steps = opts.handle.setup ?? []\n if (steps.length === 0) {\n process.stdout.write(`agentproto setup: no setup steps for '${opts.slug}'.\\n`)\n return 0\n }\n\n const ledgerPath = ledgerPathFor(opts.slug)\n const ledger = await loadLedger(ledgerPath, opts.slug)\n const onlySet = opts.only && opts.only.length > 0 ? new Set(opts.only) : null\n\n for (const [i, step] of steps.entries()) {\n if (onlySet && !onlySet.has(step.id)) continue\n\n const idx = `[${i + 1}/${steps.length}]`\n const head = `${idx} ${step.kind}/${step.id}`\n\n // Layer 3: ledger short-circuit (skipped on --force).\n const prev = ledger.steps[step.id]\n if (!opts.force && prev) {\n process.stdout.write(\n `${head} ✓ already completed (${prev.completedAt}${prev.skippedViaSkipIf ? \", via skip_if\" : \"\"}). Pass --force to re-run.\\n`\n )\n continue\n }\n\n // Layer 2: per-step skip_if.\n if (step.skip_if && !opts.force) {\n const ok = await checkSkipIf(step.skip_if)\n if (ok) {\n process.stdout.write(`${head} ✓ skip_if matched — skipping.\\n`)\n ledger.steps[step.id] = {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n skippedViaSkipIf: true,\n }\n continue\n }\n }\n\n if (opts.dryRun) {\n process.stdout.write(`${head} (dry-run) — would execute.\\n`)\n continue\n }\n\n // Run the step.\n let entry: LedgerEntry | null = null\n try {\n switch (step.kind) {\n case \"cmd\":\n entry = await runCmdStep(step, ledger, head)\n break\n case \"prompt\":\n entry = await runPromptStep(step, ledger, head)\n break\n case \"external\":\n entry = await runExternalStep(step, ledger, head)\n break\n case \"oauth\":\n process.stderr.write(\n `${head} ✗ kind=oauth is not yet implemented in the local CLI host. ` +\n `Run the OAuth flow on the host that ships a SECRETS.md driver, then re-invoke.\\n`\n )\n return 1\n }\n } catch (err) {\n process.stderr.write(\n `${head} ✗ failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n await saveLedger(ledgerPath, ledger)\n return 1\n }\n\n if (entry) {\n ledger.steps[step.id] = entry\n // Persist incrementally so a later step's failure doesn't lose\n // earlier successes (avoids re-prompting on next run).\n await saveLedger(ledgerPath, ledger)\n }\n }\n\n process.stdout.write(`agentproto: setup for '${opts.slug}' complete.\\n`)\n return 0\n}\n\n/**\n * `agentproto setup <slug>` — re-run the setup pipeline for an\n * already-installed bundle. Useful when adding new steps to an\n * adapter, fixing a broken step, or after a `--skip-setup` install.\n */\nexport async function runSetupCommand(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n force: { type: \"boolean\", short: \"f\" },\n \"dry-run\": { type: \"boolean\" },\n only: { type: \"string\", multiple: true },\n },\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto setup: missing adapter slug. Try: agentproto setup openclaw\\n\"\n )\n return 2\n }\n const adapter = await resolveAdapter(slug)\n return runSetup({\n slug,\n handle: adapter.handle,\n force: values.force ?? false,\n dryRun: values[\"dry-run\"] ?? false,\n ...(values.only ? { only: values.only } : {}),\n })\n}\n\n// ── Step runners ─────────────────────────────────────────────────────\n\nasync function runCmdStep(\n step: Extract<AgentCliSetupStep, { kind: \"cmd\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n process.stdout.write(`${head} $ ${step.cmd}\\n`)\n const captured = await runShellCapturing(step.cmd, {\n timeoutMs: step.timeout_ms ?? 60_000,\n interactive: step.interactive ?? false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(\n `cmd exited ${captured.exitCode}${captured.stderr ? \": \" + truncate(captured.stderr, 400) : \"\"}`\n )\n }\n // Persist the trimmed stdout when the step asks for it.\n let persistedTo: string | undefined\n if (step.persist) {\n const value = captured.stdout.trim()\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\nasync function runPromptStep(\n step: Extract<AgentCliSetupStep, { kind: \"prompt\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n const type = step.type ?? \"text\"\n\n let value: string\n switch (type) {\n case \"text\":\n case \"secret\":\n value = await promptString(step.prompt, {\n defaultValue: step.default,\n masked: type === \"secret\",\n })\n break\n case \"boolean\":\n value = (await promptBoolean(step.prompt, step.default === \"true\"))\n ? \"true\"\n : \"false\"\n break\n case \"select\": {\n const options = await resolveSelectOptions(step.options)\n if (options.length === 0) {\n throw new Error(\"select prompt has no options to choose from\")\n }\n value = await promptSelect(step.prompt, options, step.default)\n break\n }\n }\n\n let persistedTo: string | undefined\n if (step.persist) {\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\nasync function runExternalStep(\n step: Extract<AgentCliSetupStep, { kind: \"external\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n process.stdout.write(`${head} opening ${step.url}\\n`)\n const opener =\n platform() === \"darwin\"\n ? \"open\"\n : platform() === \"win32\"\n ? \"cmd\"\n : \"xdg-open\"\n const args = platform() === \"win32\" ? [\"/c\", \"start\", step.url] : [step.url]\n await new Promise<void>((resolve) => {\n const child = spawn(opener, args, { stdio: \"ignore\", detached: true })\n child.once(\"error\", () => resolve()) // best-effort\n child.once(\"spawn\", () => resolve())\n })\n\n // Callback polling (a host-allocated callback URL holding the result)\n // requires a local HTTP listener, which is reasonable in some hosts\n // but overkill for the agentproto CLI in v0.1. For now we fall back\n // to \"paste the result\" when the step declares a callback param;\n // the URL was opened above to start the flow.\n let value = \"\"\n if (step.callback?.param) {\n value = await promptString(\n `Paste the value of '${step.callback.param}' from the redirect`,\n { masked: false }\n )\n } else {\n process.stdout.write(`${head} done — press Enter when finished.\\n`)\n await promptString(\"(press Enter to continue)\", { masked: false })\n }\n\n let persistedTo: string | undefined\n if (step.persist && value) {\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\n// ── skip_if check ────────────────────────────────────────────────────\n\nasync function checkSkipIf(skip: AgentCliSetupSkipIf): Promise<boolean> {\n const expectedCode = skip.exit_code ?? 0\n const captured = await runShellCapturing(skip.cmd, {\n timeoutMs: skip.timeout_ms ?? 5_000,\n interactive: false,\n })\n return captured.exitCode === expectedCode\n}\n\n// ── persist (env / secret_slug / cmd) ────────────────────────────────\n\nasync function applyPersist(\n persist: AgentCliSetupPersist,\n value: string,\n ledger: Ledger\n): Promise<string> {\n if (\"env\" in persist && persist.env) {\n if (!ledger.envValues) ledger.envValues = {}\n ledger.envValues[persist.env] = value\n return `env:${persist.env}`\n }\n if (\"secret_slug\" in persist && persist.secret_slug) {\n // The secrets backend is host-supplied. The local CLI host doesn't\n // ship one yet; we surface the slug so the operator can pipe the\n // value into their vault out-of-band. Recording the slug (NOT the\n // value) in the ledger is intentional — the ledger isn't a vault.\n process.stdout.write(\n `agentproto setup: store the prompted value in your secrets backend under slug '${persist.secret_slug}' ` +\n `(value not echoed; ledger records the slot only).\\n`\n )\n return `secret:${persist.secret_slug}`\n }\n if (\"cmd\" in persist && persist.cmd) {\n const cmd = persist.cmd.replace(/\\$\\{value\\}/g, shellEscape(value))\n const captured = await runShellCapturing(cmd, {\n timeoutMs: 60_000,\n interactive: false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(`persist cmd exited ${captured.exitCode}`)\n }\n return \"cmd\"\n }\n throw new Error(\"persist block must declare exactly one of env / secret_slug / cmd\")\n}\n\n// ── prompt helpers ───────────────────────────────────────────────────\n\nasync function promptString(\n question: string,\n opts: { defaultValue?: string; masked?: boolean }\n): Promise<string> {\n // Node's readline doesn't natively mask; for `masked: true` we set\n // the terminal to no-echo for the duration of the prompt. Best-effort\n // — some non-TTY environments fall back to plain input with a warning.\n const isTty = process.stdin.isTTY ?? false\n const suffix = opts.defaultValue ? ` [${opts.defaultValue}]` : \"\"\n const prompt = `${question}${suffix}: `\n if (opts.masked && !isTty) {\n process.stdout.write(\n `agentproto: stdin is not a TTY — masked input falls back to plain. Avoid piping secrets in non-interactive mode.\\n`\n )\n }\n const rl = createInterface({ input, output, terminal: isTty })\n if (opts.masked && isTty) {\n // Toggle echo off via raw mode.\n process.stdin.setRawMode?.(true)\n let buf = \"\"\n process.stdout.write(prompt)\n return new Promise<string>((resolve) => {\n const onData = (chunk: Buffer) => {\n for (const code of chunk) {\n if (code === 0x0d /* CR */ || code === 0x0a /* LF */) {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode?.(false)\n process.stdout.write(\"\\n\")\n rl.close()\n resolve(buf || opts.defaultValue || \"\")\n return\n }\n if (code === 0x03 /* Ctrl-C */) {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode?.(false)\n rl.close()\n process.exit(130)\n }\n if (code === 0x7f /* DEL / backspace */ || code === 0x08) {\n buf = buf.slice(0, -1)\n continue\n }\n buf += String.fromCharCode(code)\n process.stdout.write(\"•\")\n }\n }\n process.stdin.on(\"data\", onData)\n })\n }\n try {\n const ans = (await rl.question(prompt)).trim()\n return ans || opts.defaultValue || \"\"\n } finally {\n rl.close()\n }\n}\n\nasync function promptBoolean(\n question: string,\n defaultYes: boolean\n): Promise<boolean> {\n const def = defaultYes ? \"Y/n\" : \"y/N\"\n const ans = await promptString(`${question} [${def}]`, { masked: false })\n if (!ans) return defaultYes\n return /^y(es)?$/i.test(ans)\n}\n\nasync function promptSelect(\n question: string,\n options: { value: string; label?: string }[],\n defaultValue: string | undefined\n): Promise<string> {\n process.stdout.write(`${question}\\n`)\n for (const [i, o] of options.entries()) {\n const star =\n defaultValue && o.value === defaultValue ? \"*\" : i === 0 ? \" \" : \" \"\n process.stdout.write(\n ` ${star} ${i + 1}) ${o.label ?? o.value}${o.label ? ` (${o.value})` : \"\"}\\n`\n )\n }\n const ans = await promptString(\n `Choose 1-${options.length}`,\n defaultValue ? { defaultValue } : { masked: false }\n )\n // Accept either the numeric index or a literal value.\n const asNum = Number.parseInt(ans, 10)\n if (Number.isFinite(asNum) && asNum >= 1 && asNum <= options.length) {\n return options[asNum - 1]!.value\n }\n const exact = options.find((o) => o.value === ans)\n if (exact) return exact.value\n if (defaultValue && options.some((o) => o.value === defaultValue)) {\n return defaultValue\n }\n throw new Error(\n `invalid selection '${ans}'; expected one of ${options.map((o) => o.value).join(\", \")}`\n )\n}\n\nasync function resolveSelectOptions(\n options: Extract<AgentCliSetupStep, { kind: \"prompt\" }>[\"options\"]\n): Promise<{ value: string; label?: string }[]> {\n if (!options) return []\n if (Array.isArray(options)) {\n return options.map((v) => ({ value: v }))\n }\n // Dynamic options: run the cmd, parse stdout (one option per line,\n // optional `value\\tlabel`).\n const captured = await runShellCapturing(options.cmd, {\n timeoutMs: options.timeout_ms ?? 30_000,\n interactive: false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(\n `select options cmd exited ${captured.exitCode}: ${truncate(captured.stderr, 400)}`\n )\n }\n return captured.stdout\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean)\n .map((line) => {\n const [value, label] = line.split(\"\\t\")\n const out: { value: string; label?: string } = { value: value! }\n if (label) out.label = label\n return out\n })\n}\n\n// ── shell helper ─────────────────────────────────────────────────────\n\nasync function runShellCapturing(\n cmd: string,\n opts: { timeoutMs: number; interactive: boolean }\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n return new Promise((resolve) => {\n const child = spawn(\"bash\", [\"-lc\", cmd], {\n stdio: opts.interactive\n ? \"inherit\"\n : [\"ignore\", \"pipe\", \"pipe\"],\n })\n let stdout = \"\"\n let stderr = \"\"\n child.stdout?.on(\"data\", (c: Buffer) => {\n stdout += c.toString(\"utf8\")\n })\n child.stderr?.on(\"data\", (c: Buffer) => {\n stderr += c.toString(\"utf8\")\n })\n const timer = setTimeout(() => {\n child.kill(\"SIGTERM\")\n setTimeout(() => child.kill(\"SIGKILL\"), 1000)\n }, opts.timeoutMs)\n child.once(\"error\", () => {\n clearTimeout(timer)\n resolve({ exitCode: 127, stdout, stderr: stderr || \"spawn error\" })\n })\n child.once(\"exit\", (code) => {\n clearTimeout(timer)\n resolve({ exitCode: code ?? 0, stdout, stderr })\n })\n })\n}\n\nfunction shellEscape(s: string): string {\n // POSIX-style single-quote escape — wraps in single quotes and\n // closes/reopens around any literal single quote in the value.\n return `'${s.replace(/'/g, `'\"'\"'`)}'`\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : s.slice(0, max - 3) + \"…\"\n}\n\n// ── ledger ───────────────────────────────────────────────────────────\n\nfunction ledgerPathFor(slug: string): string {\n const base =\n process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n return join(base, \"setup\", `${slug}.json`)\n}\n\nasync function loadLedger(path: string, slug: string): Promise<Ledger> {\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as Ledger\n if (parsed.slug === slug && typeof parsed.steps === \"object\") return parsed\n } catch {\n // No ledger yet, or malformed — start fresh.\n }\n return {\n slug,\n updatedAt: new Date().toISOString(),\n steps: {},\n }\n}\n\nasync function saveLedger(path: string, ledger: Ledger): Promise<void> {\n ledger.updatedAt = new Date().toISOString()\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, JSON.stringify(ledger, null, 2))\n await chmod(path, 0o600).catch(() => {\n // chmod failures on Windows are non-fatal — the file lives in\n // %USERPROFILE% which is already user-private.\n })\n}\n","/**\n * `agentproto install <slug>`\n *\n * Reads the adapter manifest's `install` block and shells out to the\n * declared package manager. Idempotent: if `version_check` passes, we\n * skip and report \"already installed\" (override with --force).\n *\n * The adapter package itself must already be in node_modules (we resolve\n * it before reading its manifest). Bootstrapping the adapter package is\n * a separate concern — `npm i -g @agentproto/adapter-<slug>` first.\n *\n * Method support matrix:\n * - `npm` ✓\n * - `brew` ✓ (macOS / Linux Homebrew)\n * - `curl` ✓ (with optional verify_sha256)\n * - `download` ✓ (tarball/zip + extract_bin + optional verify_sha256)\n * - `pip` ✓ (with optional `user: true`)\n * - `cargo` ✓\n * - `go` ✓\n * - `apt/dnf/pacman` ✗ (privilege escalation needs explicit sudo policy)\n * - `choco/scoop` ✗ (Windows-only; not yet platform-detected)\n * - `vendored` ✗ (workspace-relative; needs a workspace root)\n *\n * After install, runs the optional `setup[]` pipeline (AIP-29 § Setup).\n */\n\nimport { spawn } from \"node:child_process\"\nimport { createHash } from \"node:crypto\"\nimport { mkdir, mkdtemp, rm, writeFile, chmod } from \"node:fs/promises\"\nimport { tmpdir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport type { AgentCliInstallMethod } from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\nimport { runSetup } from \"./setup.js\"\n\nexport async function runInstall(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n force: { type: \"boolean\", short: \"f\" },\n \"dry-run\": { type: \"boolean\" },\n \"skip-setup\": { type: \"boolean\" },\n },\n })\n\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto install: missing adapter slug. Try: agentproto install claude-code\\n\"\n )\n return 2\n }\n\n const adapter = await resolveAdapter(slug)\n const installSteps: AgentCliInstallMethod[] = adapter.handle.install ?? []\n if (installSteps.length === 0) {\n process.stderr.write(\n `agentproto install: adapter '${slug}' declares no install steps.\\n`\n )\n return 0\n }\n\n let alreadyInstalled = false\n if (!values.force) {\n const checked = await runVersionCheck(adapter.handle.version_check)\n if (checked.ok) {\n process.stdout.write(\n `agentproto: '${slug}' already installed (${checked.message}). Pass --force to reinstall.\\n`\n )\n alreadyInstalled = true\n }\n }\n\n if (!alreadyInstalled) {\n let lastFailure: { step: AgentCliInstallMethod; code: number } | null = null\n let succeeded = false\n for (const [i, step] of installSteps.entries()) {\n // Spec: hosts try install methods *in order until one succeeds*.\n // Pre-this-fix the runner aborted on the first failure, which made\n // the curl-fallback pattern in opencode/openclaw unreachable\n // whenever npm wasn't viable. Now we collect failures and only\n // surface the last one if every method falls through.\n if (step.experimental) {\n process.stdout.write(\n `agentproto install [${i + 1}/${installSteps.length}] ${describeStep(step)} (experimental — skipping)\\n`\n )\n continue\n }\n process.stdout.write(\n `agentproto install [${i + 1}/${installSteps.length}] ${describeStep(step)}\\n`\n )\n if (values[\"dry-run\"]) {\n succeeded = true\n continue\n }\n const code = await runStep(step)\n if (code === 0) {\n succeeded = true\n break\n }\n lastFailure = { step, code }\n process.stdout.write(\n `agentproto install: method '${step.method}' returned ${code}; trying next.\\n`\n )\n }\n if (!succeeded && lastFailure) {\n process.stderr.write(\n `agentproto install: all ${installSteps.length} install methods failed. Last failure: ${lastFailure.step.method} → exit ${lastFailure.code}.\\n`\n )\n return lastFailure.code\n }\n if (!succeeded && !lastFailure) {\n // Every method was experimental/skipped.\n process.stderr.write(\n `agentproto install: no usable install method found for '${slug}'.\\n`\n )\n return 1\n }\n process.stdout.write(`agentproto: '${slug}' installed.\\n`)\n }\n\n // Run the AIP-29 § Setup pipeline (post-install configuration). Skipped\n // when --skip-setup is passed or the manifest declares no setup. The\n // setup engine is idempotent — already-satisfied steps short-circuit\n // via skip_if; previously-completed steps short-circuit via the ledger.\n if (!values[\"skip-setup\"] && (adapter.handle.setup?.length ?? 0) > 0) {\n process.stdout.write(`agentproto: running setup for '${slug}'…\\n`)\n const setupCode = await runSetup({\n slug,\n handle: adapter.handle,\n force: values.force ?? false,\n dryRun: values[\"dry-run\"] ?? false,\n })\n if (setupCode !== 0) return setupCode\n }\n\n return 0\n}\n\nfunction describeStep(step: AgentCliInstallMethod): string {\n switch (step.method) {\n case \"npm\":\n return `npm install ${step.global ? \"-g \" : \"\"}${step.package ?? \"(?)\"}`\n case \"brew\":\n return `brew install ${step.package ?? \"(?)\"}`\n case \"pip\":\n return `pip install ${step.user ? \"--user \" : \"\"}${step.package ?? \"(?)\"}`\n case \"cargo\":\n return `cargo install ${step.package ?? \"(?)\"}`\n case \"go\":\n return `go install ${step.package ?? \"(?)\"}`\n case \"curl\":\n return `curl ${step.url ?? \"(?)\"} | bash`\n case \"download\":\n return `download ${step.url ?? \"(?)\"} → ${step.extract_bin ?? \"(?)\"}`\n default:\n return `${step.method} ${step.package ?? step.url ?? step.path ?? \"(?)\"}`\n }\n}\n\nasync function runStep(step: AgentCliInstallMethod): Promise<number> {\n switch (step.method) {\n case \"npm\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: npm step missing package.\\n\")\n return 2\n }\n const argv = [\"install\"]\n if (step.global) argv.push(\"-g\")\n argv.push(step.package)\n return spawnInherit(\"npm\", argv)\n }\n case \"brew\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: brew step missing package.\\n\")\n return 2\n }\n // Namespaced packages (e.g. `stripe/stripe-cli/stripe`) need an\n // implicit `brew tap`; `brew install` accepts the fully-qualified\n // form, so we pass it through verbatim. Bare names work too.\n return spawnInherit(\"brew\", [\"install\", step.package])\n }\n case \"pip\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: pip step missing package.\\n\")\n return 2\n }\n const argv = [\"install\"]\n if (step.user) argv.push(\"--user\")\n argv.push(step.package)\n // Prefer pip3 when it exists; fall back to pip. We just call `pip`\n // here because the user's PATH ordering is the right authority.\n return spawnInherit(\"pip\", argv)\n }\n case \"cargo\": {\n if (!step.package) {\n process.stderr.write(\n \"agentproto install: cargo step missing package.\\n\"\n )\n return 2\n }\n return spawnInherit(\"cargo\", [\"install\", step.package])\n }\n case \"go\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: go step missing package.\\n\")\n return 2\n }\n return spawnInherit(\"go\", [\"install\", step.package])\n }\n case \"curl\": {\n if (!step.url) {\n process.stderr.write(\"agentproto install: curl step missing url.\\n\")\n return 2\n }\n return runCurlInstaller(step.url, step.verify_sha256)\n }\n case \"download\": {\n if (!step.url || !step.extract_bin) {\n process.stderr.write(\n \"agentproto install: download step missing url or extract_bin.\\n\"\n )\n return 2\n }\n return runDownloadInstaller({\n url: step.url,\n extractBin: step.extract_bin,\n verifySha256: step.verify_sha256,\n })\n }\n default:\n process.stderr.write(\n `agentproto install: method '${step.method}' not yet implemented in this CLI version. ` +\n `Run it manually for now (see the adapter's docs).\\n`\n )\n return 1\n }\n}\n\n/**\n * `curl <url> | bash` with optional SHA-256 verification of the\n * installer script *before* executing it. Spec posture (AIP-29 §\n * Install methods → §curl): hosts SHOULD refuse curl-style installers\n * without a verify_sha256 in production. We surface a warning when\n * one is missing but still execute — the agentproto CLI runs in\n * developer / first-run contexts where the trade-off is acceptable.\n */\nasync function runCurlInstaller(\n url: string,\n verifySha256?: string\n): Promise<number> {\n if (!verifySha256) {\n process.stdout.write(\n `agentproto install: curl ${url} (⚠ no verify_sha256 declared — installer integrity not verified)\\n`\n )\n }\n const dir = await mkdtemp(join(tmpdir(), \"agentproto-curl-\"))\n const scriptPath = join(dir, \"install.sh\")\n try {\n const res = await fetch(url, { redirect: \"follow\" })\n if (!res.ok) {\n process.stderr.write(\n `agentproto install: curl fetch failed: ${res.status} ${res.statusText}\\n`\n )\n return res.status\n }\n const buf = Buffer.from(await res.arrayBuffer())\n if (verifySha256) {\n const got = createHash(\"sha256\").update(buf).digest(\"hex\")\n if (got !== verifySha256.toLowerCase()) {\n process.stderr.write(\n `agentproto install: SHA-256 mismatch for ${url}\\n expected: ${verifySha256}\\n got: ${got}\\n`\n )\n return 4\n }\n process.stdout.write(\n `agentproto install: SHA-256 verified (${got.slice(0, 16)}…)\\n`\n )\n }\n await writeFile(scriptPath, buf)\n await chmod(scriptPath, 0o755)\n return spawnInherit(\"bash\", [scriptPath])\n } catch (err) {\n process.stderr.write(\n `agentproto install: curl install failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {})\n }\n}\n\n/**\n * Download an archive, optionally verify SHA-256, extract the binary\n * named in `extract_bin`, drop it into `~/.local/bin/<id>` (or the\n * AGENTPROTO_BIN_DIR override), and chmod +x. Supports tar.gz, tgz,\n * zip via the host's `tar` and `unzip`. The CLI doesn't decide the\n * binary's final name — `extract_bin`'s basename becomes the symlink\n * name on PATH.\n */\nasync function runDownloadInstaller(opts: {\n url: string\n extractBin: string\n verifySha256?: string\n}): Promise<number> {\n const dir = await mkdtemp(join(tmpdir(), \"agentproto-dl-\"))\n try {\n const filename = opts.url.split(\"/\").pop() || \"archive.bin\"\n const archivePath = join(dir, filename)\n const res = await fetch(opts.url, { redirect: \"follow\" })\n if (!res.ok) {\n process.stderr.write(\n `agentproto install: download fetch failed: ${res.status} ${res.statusText}\\n`\n )\n return res.status\n }\n const buf = Buffer.from(await res.arrayBuffer())\n if (opts.verifySha256) {\n const got = createHash(\"sha256\").update(buf).digest(\"hex\")\n if (got !== opts.verifySha256.toLowerCase()) {\n process.stderr.write(\n `agentproto install: SHA-256 mismatch\\n expected: ${opts.verifySha256}\\n got: ${got}\\n`\n )\n return 4\n }\n }\n await writeFile(archivePath, buf)\n\n const extractDir = join(dir, \"extract\")\n await mkdir(extractDir, { recursive: true })\n let extractCode: number\n if (\n filename.endsWith(\".tar.gz\") ||\n filename.endsWith(\".tgz\") ||\n filename.endsWith(\".tar\")\n ) {\n extractCode = await spawnInherit(\"tar\", [\n \"-xf\",\n archivePath,\n \"-C\",\n extractDir,\n ])\n } else if (filename.endsWith(\".zip\")) {\n extractCode = await spawnInherit(\"unzip\", [\n \"-q\",\n archivePath,\n \"-d\",\n extractDir,\n ])\n } else {\n process.stderr.write(\n `agentproto install: unsupported archive format for ${filename}. ` +\n `Supported: .tar, .tar.gz, .tgz, .zip.\\n`\n )\n return 5\n }\n if (extractCode !== 0) return extractCode\n\n const srcBin = join(extractDir, opts.extractBin)\n const binDir =\n process.env[\"AGENTPROTO_BIN_DIR\"] ?? join(homedir(), \".local\", \"bin\")\n await mkdir(binDir, { recursive: true })\n const destBin = join(binDir, opts.extractBin.split(\"/\").pop()!)\n // Use cp -p to preserve mode bits then chmod +x to be safe.\n const cpCode = await spawnInherit(\"cp\", [\"-p\", srcBin, destBin])\n if (cpCode !== 0) return cpCode\n await chmod(destBin, 0o755)\n process.stdout.write(`agentproto install: ${destBin}\\n`)\n if (!process.env[\"PATH\"]?.includes(binDir)) {\n process.stdout.write(\n `agentproto install: ⚠ ${binDir} is not on PATH — add it to your shell profile so the binary is reachable.\\n`\n )\n }\n return 0\n } catch (err) {\n process.stderr.write(\n `agentproto install: download failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {})\n }\n}\n\nfunction homedir(): string {\n return process.env[\"HOME\"] ?? process.env[\"USERPROFILE\"] ?? \"/\"\n}\n\nfunction spawnInherit(cmd: string, argv: string[]): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, argv, { stdio: \"inherit\" })\n child.once(\"error\", reject)\n child.once(\"exit\", (code) => resolve(code ?? 0))\n })\n}\n\nasync function runVersionCheck(\n check: Awaited<\n ReturnType<typeof resolveAdapter>\n >[\"handle\"][\"version_check\"]\n): Promise<{ ok: boolean; message: string }> {\n if (!check) return { ok: false, message: \"no version_check declared\" }\n return new Promise((resolve) => {\n const child = spawn(\"bash\", [\"-lc\", check.cmd], {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n let buf = \"\"\n child.stdout.on(\"data\", (c: Buffer) => {\n buf += c.toString(\"utf8\")\n })\n child.once(\"error\", () => resolve({ ok: false, message: \"check failed\" }))\n child.once(\"exit\", (code) => {\n if (code !== 0) {\n resolve({ ok: false, message: `check exited ${code}` })\n return\n }\n const re = new RegExp(check.parse)\n const m = buf.match(re)\n if (!m || !m[1]) {\n resolve({ ok: false, message: \"could not parse version\" })\n return\n }\n // semver-range matching is left to a future helper; we report\n // the captured version and trust it. --force remains the\n // escape hatch when range gating actually matters.\n resolve({ ok: true, message: `version ${m[1]}` })\n })\n })\n}\n","/**\n * Read piped stdin to a string. Returns null if stdin is a TTY (no pipe).\n * Used by `agentproto run` to accept prompts via:\n * echo \"summarise this repo\" | agentproto run claude-code\n */\n\nexport async function readStdinIfPiped(): Promise<string | null> {\n if (process.stdin.isTTY) return null\n const chunks: Buffer[] = []\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n const text = Buffer.concat(chunks).toString(\"utf8\").trim()\n return text.length > 0 ? text : null\n}\n","/**\n * `agentproto run <slug> [--cwd <dir>] [--prompt <text>] [--resume <id>]`\n *\n * Boots the named adapter, dispatches a single user turn, streams events\n * to stdout, then exits. Designed for two use-cases:\n * - one-shot scripting (pipe a prompt in, get stream back)\n * - quick smoke-test from a fresh checkout (\"does claude even spawn?\")\n *\n * Long-lived multiplexing belongs to `agentproto serve`, not here.\n */\n\nimport { resolve as resolvePath } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport {\n createAgentCliRuntime,\n type AgentCliRuntimeSession,\n type StreamEvent,\n} from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\nimport { readStdinIfPiped } from \"../util/stdin.js\"\n\nexport async function runRun(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n cwd: { type: \"string\" },\n prompt: { type: \"string\", short: \"p\" },\n resume: { type: \"string\" },\n json: { type: \"boolean\" },\n },\n })\n\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto run: missing adapter slug. Try: agentproto run claude-code\\n\"\n )\n return 2\n }\n\n const cwd = values.cwd ? resolvePath(values.cwd) : process.cwd()\n const promptArg = values.prompt ?? (await readStdinIfPiped())\n if (!promptArg) {\n process.stderr.write(\n \"agentproto run: no prompt provided. Pass --prompt or pipe one over stdin.\\n\"\n )\n return 2\n }\n\n const adapter = await resolveAdapter(slug)\n const runtime = createAgentCliRuntime(adapter.handle)\n\n const controller = new AbortController()\n const onSignal = (sig: NodeJS.Signals) => {\n process.stderr.write(`\\nagentproto: received ${sig}, cancelling…\\n`)\n controller.abort()\n }\n process.once(\"SIGINT\", onSignal)\n process.once(\"SIGTERM\", onSignal)\n\n let session: AgentCliRuntimeSession | null = null\n try {\n session = await runtime.start({\n cwd,\n signal: controller.signal,\n resumeSessionId: values.resume,\n })\n\n const printer = values.json ? printJson : printPretty\n let exit = 0\n for await (const ev of session.send(promptArg)) {\n printer(ev)\n if (ev.kind === \"turn-end\" && ev.reason !== \"completed\") exit = 1\n if (ev.kind === \"error\") exit = 1\n }\n return exit\n } finally {\n process.off(\"SIGINT\", onSignal)\n process.off(\"SIGTERM\", onSignal)\n if (session) await session.close().catch(() => {})\n }\n}\n\nfunction printJson(ev: StreamEvent): void {\n process.stdout.write(`${JSON.stringify(ev)}\\n`)\n}\n\nfunction printPretty(ev: StreamEvent): void {\n switch (ev.kind) {\n case \"text-delta\":\n process.stdout.write(ev.text)\n break\n case \"thought\":\n process.stderr.write(`\\x1b[2m[thought] ${ev.text}\\x1b[0m\\n`)\n break\n case \"tool-call\":\n process.stderr.write(`\\x1b[36m[tool] ${ev.toolName}\\x1b[0m\\n`)\n break\n case \"tool-result\":\n if (ev.isError)\n process.stderr.write(`\\x1b[31m[tool-error]\\x1b[0m\\n`)\n break\n case \"agent-prompt\":\n process.stderr.write(`\\x1b[33m[agent-prompt: needs input]\\x1b[0m\\n`)\n break\n case \"turn-end\":\n process.stdout.write(`\\n\\x1b[2m[turn-end: ${ev.reason}]\\x1b[0m\\n`)\n break\n case \"error\": {\n const code =\n typeof ev.error.code === \"number\" ? ` (code ${ev.error.code})` : \"\"\n process.stderr.write(\n `\\x1b[31m[error]${code} ${ev.error.message}\\x1b[0m\\n`,\n )\n // Attached child stderr (added by define-agent-cli) — usually\n // the most useful line (\"not authenticated\", \"model gated\",\n // missing binary path). Print after the headline so the\n // headline still scans first.\n const data = ev.error.data\n if (data && typeof data === \"object\") {\n const stderr = (data as { stderr?: unknown }).stderr\n if (typeof stderr === \"string\" && stderr.trim()) {\n process.stderr.write(`\\x1b[2m── child stderr ──\\n${stderr}\\x1b[0m\\n`)\n }\n // Surface any non-stderr fields as JSON so callers don't\n // have to switch to --json to see what payload was rejected.\n const rest = { ...(data as Record<string, unknown>) }\n delete rest.stderr\n if (Object.keys(rest).length > 0) {\n process.stderr.write(\n `\\x1b[2m── error.data ──\\n${JSON.stringify(rest, null, 2)}\\x1b[0m\\n`,\n )\n }\n }\n break\n }\n }\n}\n","/**\n * Shared PTY factory loader.\n *\n * `node-pty` is an optional native dep — when present, the factory\n * returns a function that spawns child processes under a real PTY\n * (so ANSI escapes, alt-screen apps, key bindings and resize all\n * work). When absent, returns null and callers degrade to\n * `child_process.spawn` (no PTY).\n *\n * Two consumers today:\n * - `createTunnelServer` (packages/acp/src/tunnel/server.ts) — cloud-\n * dispatched spawns over the tunnel use this factory when the\n * spawn frame requests `pty: true`.\n * - `createGateway` (packages/runtime/src/index.ts) — local\n * `POST /sessions/terminal` route + MCP `start_terminal_session`\n * tool use this factory to register PTY-backed sessions in the\n * daemon's registry.\n *\n * Both consumers agree on the same minimal `PtyProcess` shape\n * (defined in `@agentproto/acp/tunnel`); the function we return here\n * satisfies both their `spawnPty` option types structurally.\n */\n\nimport type { PtyProcess } from \"@agentproto/acp/tunnel\"\n\nexport interface PtyFactoryOptions {\n command: string\n args: string[]\n cwd?: string\n env?: Record<string, string>\n cols: number\n rows: number\n}\n\nexport type PtyFactory = (opts: PtyFactoryOptions) => PtyProcess\n\nexport async function loadNodePtyFactory(): Promise<PtyFactory | null> {\n try {\n const nodePtyMod = await import(\"node-pty\")\n // node-pty is CJS — `import()` wraps the module under `.default` in ESM.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nodePty = (nodePtyMod as any).default ?? nodePtyMod\n if (typeof nodePty.spawn !== \"function\") return null\n return (opts) => {\n const pty = nodePty.spawn(opts.command, opts.args, {\n name: \"xterm-256color\",\n cols: opts.cols,\n rows: opts.rows,\n cwd: opts.cwd,\n env: {\n ...(process.env as Record<string, string>),\n ...(opts.env ?? {}),\n },\n })\n const proc: PtyProcess = {\n get pid() {\n return pty.pid\n },\n write(data: string) {\n pty.write(data)\n },\n resize(cols: number, rows: number) {\n pty.resize(cols, rows)\n },\n kill(signal?: string) {\n pty.kill(signal)\n },\n onData(handler: (data: string) => void) {\n pty.onData(handler)\n },\n onExit(handler: (event: { exitCode: number; signal?: number }) => void) {\n pty.onExit(handler)\n },\n }\n return proc\n }\n } catch {\n return null\n }\n}\n","/**\n * `agentproto serve [--workspace <dir>] [--port <n>] [--connect <wss>]`\n *\n * The single canonical agentproto daemon. Boots a local gateway\n * (HTTP + MCP server + sessions registry + workspace fs +\n * heartbeat) on `--port` (default 18790), and OPTIONALLY opens an\n * outbound WebSocket tunnel to a host (Guilde-shaped API) when\n * `--connect <url>` is set. With or without the tunnel:\n *\n * - HTTP /sessions, /sessions/agent, /sessions/:id/* routes work\n * - MCP tools (start_agent_session, prompt_agent_session, …) are\n * reachable via the daemon's /mcp transport\n * - the LocalDaemonSessionsCard in guilde-web sees every spawn\n *\n * When the tunnel is up, every tunnel-driven spawn is also adopted\n * into the gateway's sessions registry via the\n * `createTunnelServer.onChildSpawned` hook, so an operator\n * dispatching from the cloud lands in the same /sessions list as a\n * user spawning locally — single source of truth for what's running\n * on the user's machine.\n *\n * Replaces the old `playground/scripts/gateway.ts` for production\n * use (the playground keeps its own script for the MCP CRUD\n * doctype demo). v1 reuses createGateway with empty specs + a\n * noop heartbeat; the playground variant adds toolSpec/agentSpec/\n * etc. for its specific spec-authoring use case.\n *\n * Reconnect-with-backoff is built in for the tunnel. The local\n * gateway stays up across reconnects — only the tunnel cycles.\n *\n * Authorization: v0 trusts every spawn frame the host sends — there\n * is no policy file. Future work will gate spawn requests on a\n * `~/.agentproto/policy.toml` allowlist (see project_agentproto_repos\n * memory). The token is the only access control today.\n */\n\nimport { parseArgs } from \"node:util\"\nimport { hostname, userInfo } from \"node:os\"\nimport { resolve as resolvePath } from \"node:path\"\nimport { promises as fs } from \"node:fs\"\nimport { randomUUID } from \"node:crypto\"\nimport * as childProc from \"node:child_process\"\nimport {\n readHost,\n isExpired,\n formatExpiry,\n} from \"../util/credentials.js\"\nimport { loadNodePtyFactory, type PtyFactory } from \"../util/pty-factory.js\"\nimport { loadConfig } from \"@agentproto/runtime/config\"\nimport { loadWorkspacesConfig } from \"@agentproto/runtime/workspaces-config\"\nimport {\n createTunnelServer,\n wrapWebSocket,\n type FrameSink,\n} from \"@agentproto/acp/tunnel\"\nimport {\n createGateway,\n sweepStaleRuntimeMetas,\n unlinkRuntimeMeta,\n type AgentAdapterResolver,\n type GatewayHandle,\n} from \"@agentproto/runtime\"\nimport { createAgentCliRuntime } from \"@agentproto/driver-agent-cli\"\nimport {\n resolveAdapter,\n listInstalledAdapters,\n} from \"../registry/resolve.js\"\nimport WebSocket from \"ws\"\n\ninterface ServeOpts {\n /** Workspace dir. Defaults to cwd. */\n workspace: string\n /** Local HTTP port. Default 18790. */\n port: number\n /** Bind addr. Default 127.0.0.1. */\n bind: string\n /** Optional cloud WS URL. When unset, daemon runs local-only. */\n connect?: string\n token?: string\n label: string\n /** Initial reconnect delay in ms; doubled on each failure up to 30s. */\n reconnectMinMs?: number\n reconnectMaxMs?: number\n /** Extra Origin patterns trusted to drive mutating /sessions/* routes\n * + the PTY WS without a Bearer token. Localhost is always trusted\n * by default; add production origins via repeatable `--allow-origin`. */\n allowedOrigins?: readonly string[]\n /** When true, drop the localhost-wildcard default. Only `allowedOrigins`\n * is honoured. Useful for hardened / shared-host setups. */\n strictOrigins?: boolean\n}\n\nexport async function runServe(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: {\n connect: { type: \"string\", short: \"c\" },\n token: { type: \"string\", short: \"t\" },\n label: { type: \"string\", short: \"l\" },\n workspace: { type: \"string\", short: \"w\" },\n port: { type: \"string\", short: \"p\" },\n bind: { type: \"string\", short: \"b\" },\n \"allow-origin\": { type: \"string\", multiple: true },\n interactive: { type: \"boolean\", short: \"i\" },\n },\n })\n\n // Load ~/.agentproto/config.json once and fall back through it for\n // every knob below. Order: CLI flag → env var → config.json →\n // hardcoded default. Errors during read are non-fatal — the file\n // is optional. Resolves to an empty object when missing.\n const cfg = await loadConfig()\n const cfgDaemon = cfg.daemon ?? {}\n const cfgTunnel = cfg.tunnel ?? {}\n\n // Workspace defaults: --workspace > config.json > cwd. Validated\n // below — must exist + be a directory.\n const workspace = resolvePath(\n values.workspace ?? cfgDaemon.workspace ?? process.cwd(),\n )\n try {\n const stat = await fs.stat(workspace)\n if (!stat.isDirectory()) {\n process.stderr.write(\n `agentproto serve: --workspace \"${workspace}\" is not a directory.\\n`\n )\n return 2\n }\n } catch {\n process.stderr.write(\n `agentproto serve: --workspace \"${workspace}\" does not exist.\\n` +\n ` Create it first: mkdir -p \"${workspace}\"\\n`\n )\n return 2\n }\n\n const port = values.port\n ? Number.parseInt(values.port, 10)\n : typeof cfgDaemon.port === \"number\"\n ? cfgDaemon.port\n : 18790\n if (!Number.isFinite(port) || port <= 0 || port > 65535) {\n process.stderr.write(`agentproto serve: invalid --port \"${values.port}\".\\n`)\n return 2\n }\n\n // Default label is informative — the host's UI shows it next to\n // every spawn so users know which laptop is executing what.\n const label = values.label ?? cfgDaemon.label ?? `${userInfo().username}@${hostname()}`\n\n // tunnel.host + tunnel.autoconnect from config feed --connect when\n // the user hasn't passed one. autoconnect=false leaves it CLI-only.\n const connectFlag =\n values.connect ??\n (cfgTunnel.autoconnect && cfgTunnel.host ? cfgTunnel.host : undefined)\n\n // Token resolution precedence:\n // 1. --token <jwt> — explicit override\n // 2. $AGENTPROTO_TOKEN — env, useful for CI / docker\n // 3. ~/.agentproto/credentials.json[host] — `agentproto auth login`\n //\n // Step 3 only applies when --connect is set (we have a host to look\n // up) and the credential isn't expired. Expiry is non-fatal: we log\n // a warning and let the host reject the connect; that surfaces a\n // clearer error than a silent 401 mid-tunnel.\n let token: string | undefined = values.token ?? process.env.AGENTPROTO_TOKEN\n if (!token && connectFlag) {\n const cred = await readHost(connectFlag)\n if (cred) {\n if (isExpired(cred)) {\n process.stderr.write(\n `agentproto serve: ⚠ credentials for ${connectFlag} are expired (${formatExpiry(cred)}). ` +\n `Re-run \\`agentproto auth login --host ${connectFlag}\\`.\\n`\n )\n }\n token = cred.token\n process.stdout.write(\n `agentproto serve: using token from credentials.json (${formatExpiry(cred)})\\n`\n )\n }\n }\n\n // `--allow-origin <url>` is repeatable. parseArgs gives us a string[]\n // when `multiple: true` is set. Origins are merged with config's\n // daemon.allowedOrigins so CLI flags ADD to (not replace) the config.\n const allowOriginRaw = values[\"allow-origin\"]\n const cliOrigins = Array.isArray(allowOriginRaw) ? allowOriginRaw : []\n const cfgOrigins = Array.isArray(cfgDaemon.allowedOrigins)\n ? cfgDaemon.allowedOrigins\n : []\n const merged = [...new Set([...cfgOrigins, ...cliOrigins])]\n const allowedOrigins = merged.length > 0 ? merged : undefined\n\n const opts: ServeOpts = {\n workspace,\n port,\n bind: values.bind ?? cfgDaemon.bind ?? \"127.0.0.1\",\n ...(connectFlag ? { connect: connectFlag } : {}),\n ...(token ? { token } : {}),\n label,\n ...(allowedOrigins ? { allowedOrigins } : {}),\n ...(cfgDaemon.strictOrigins === true ? { strictOrigins: true } : {}),\n }\n\n // ── adapter resolver (powers MCP start_agent_session) ──\n // Wires the cli's adapter registry into the gateway's\n // /sessions/agent route + the start_agent_session MCP tool.\n // When unwired, those routes return 501 with a clear message.\n const resolveAgentAdapter: AgentAdapterResolver = async slug => {\n try {\n const adapter = await resolveAdapter(slug)\n const runtime = createAgentCliRuntime(adapter.handle)\n return {\n async startSession({ cwd, resumeSessionId }) {\n return runtime.start({\n cwd,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n })\n },\n commandPreview:\n `${adapter.handle.bin} ${(adapter.handle.bin_args ?? []).join(\" \")}`.trim(),\n }\n } catch (err) {\n console.warn(\n `[agentproto serve] resolveAgentAdapter('${slug}') failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n return null\n }\n }\n\n // ── pty factory ──\n // Resolved once at boot and shared between the local gateway (powers\n // POST /sessions/terminal + the four start_terminal_session MCP\n // tools + the WS /sessions/:id/pty bridge) AND the tunnel server\n // below (cloud-driven spawns with pty:true on the spawn frame).\n // When node-pty is missing, the factory is null and both paths\n // gracefully degrade — PTY routes return 501 / the tunnel rejects\n // pty:true spawns.\n const spawnPty = await loadNodePtyFactory()\n\n // ── boot the gateway ──\n // Empty specs + noop buildAgent. The playground gateway script\n // still has its own setup for spec authoring + Mastra heartbeat.\n let gateway: GatewayHandle\n try {\n gateway = await createGateway({\n workspace: opts.workspace,\n port: opts.port,\n bind: opts.bind,\n specs: [],\n name: \"agentproto-serve\",\n // BOOT.md is silly for a tunnel daemon — skip it.\n boot: false,\n resolveAgentAdapter,\n // Discovery for UIs / operators — `GET /adapters` + `list_adapters`\n // MCP tool. Walks node_modules @agentproto/adapter-* on each call;\n // cheap enough that we don't bother caching here.\n listAgentAdapters: listInstalledAdapters,\n ...(spawnPty ? { spawnPty } : {}),\n ...(opts.allowedOrigins\n ? { allowedOrigins: opts.allowedOrigins }\n : {}),\n ...(opts.strictOrigins ? { strictOrigins: true } : {}),\n })\n } catch (err) {\n process.stderr.write(\n `agentproto serve: gateway boot failed — ${\n err instanceof Error ? err.message : String(err)\n }\\n`\n )\n return 1\n }\n\n printBootBanner({\n url: gateway.url,\n workspace: gateway.workspace,\n ptyEnabled: spawnPty != null,\n allowedOrigins: opts.allowedOrigins,\n strictOrigins: opts.strictOrigins === true,\n connect: opts.connect,\n })\n\n // ── stale runtime.json sweep ──\n // Other workspaces may carry leftover runtime.json files from\n // previous daemon processes that didn't shut down gracefully\n // (kill -9, crash, reboot). Their tokens are stale; the CLI's\n // discovery layer would otherwise pick them up and send wrong\n // tokens to THIS daemon, producing a confusing 401. Clean them\n // here at boot so the user doesn't have to.\n try {\n const wsConfig = await loadWorkspacesConfig()\n const paths = wsConfig.workspaces.map(w => w.path)\n const cleaned = await sweepStaleRuntimeMetas(paths, opts.workspace)\n if (cleaned.length > 0) {\n process.stderr.write(\n `${color.dim}cleaned ${cleaned.length} stale runtime.json file(s) (dead PID)${color.reset}\\n`,\n )\n }\n } catch {\n // workspaces.json may not exist yet — no cleanup needed.\n }\n\n // ── shutdown wiring (covers both local-only and tunnel modes) ──\n const aborter = new AbortController()\n let shuttingDown = false\n const shutdown = async (signal: NodeJS.Signals): Promise<void> => {\n if (shuttingDown) return\n shuttingDown = true\n process.stderr.write(\n `\\n${color.dim}── shutting down (${signal}) ──${color.reset}\\n`,\n )\n aborter.abort()\n await gateway.stop().catch(() => undefined)\n // Delete our own runtime.json so the next CLI invocation doesn't\n // discover it as a \"live daemon\". Best-effort — the next boot\n // would clean it up anyway via the sweep above.\n await unlinkRuntimeMeta(opts.workspace).catch(() => undefined)\n process.exit(0)\n }\n process.once(\"SIGINT\", () => void shutdown(\"SIGINT\"))\n process.once(\"SIGTERM\", () => void shutdown(\"SIGTERM\"))\n // Terminal-window close / SSH-disconnect / logout → SIGHUP. Without\n // a handler, Node default-terminates the process which bypasses our\n // gateway.stop() — sessions.json then never gets the final flush.\n // Registry's `process.on(\"exit\")` belt-and-suspenders catches it\n // too, but firing the same logical path here gives a clean shutdown\n // banner + tunnel teardown.\n process.once(\"SIGHUP\", () => void shutdown(\"SIGHUP\"))\n\n // ── interactive mode: chain into the watch TUI as a child ─────\n // Spawn `agentproto sessions --watch` in the same terminal,\n // inheriting stdio. When the child exits (q / Ctrl-C in the TUI),\n // we treat it as a shutdown request for the daemon too — running\n // the TUI WITHOUT a daemon underneath would just show \"no\n // sessions\" forever, which isn't what `serve --interactive`\n // promised. The user can still detach with Ctrl-] then q\n // (PTY-attach detach chord) to leave the TUI but keep the daemon\n // running — but a Ctrl-C / q in the watch view tears the lot.\n if (values.interactive) {\n process.stderr.write(\n `${color.dim}entering interactive monitor — q in the TUI to quit (daemon + TUI both).${color.reset}\\n`,\n )\n // Use process.argv[0] (this node) + process.argv[1] (this script)\n // for the child so we don't depend on $PATH finding the right\n // shim. argv carries `sessions --watch` plus an env override so\n // the child discovers THIS daemon's URL + token directly without\n // re-walking workspaces.json.\n const childArgv = [process.argv[1] ?? \"\", \"sessions\", \"--watch\"]\n const child = childProc.spawn(process.execPath, childArgv, {\n stdio: \"inherit\",\n env: {\n ...process.env,\n AGENTPROTO_DAEMON_URL: gateway.url,\n // `gateway.token` is the per-boot daemon bearer (different\n // from `token`, which was the tunnel JWT). Without this, the\n // child's restart/kill calls would 401 against its own\n // parent — exactly the bug that closed --interactive after\n // any failed action.\n AGENTPROTO_DAEMON_TOKEN: gateway.token,\n },\n })\n await new Promise<void>(resolve => {\n child.once(\"exit\", () => resolve())\n aborter.signal.addEventListener(\"abort\", () => {\n try {\n child.kill(\"SIGTERM\")\n } catch {\n /* ignore */\n }\n })\n })\n // TUI quit → tear daemon down. If the SIGINT handler already\n // started a shutdown (parent + child both saw Ctrl-C from the\n // same process group), skip — the handler will finish on its\n // own. Otherwise drive the shutdown ourselves. The\n // `shuttingDown` flag in the outer scope is the source of truth.\n if (!shuttingDown) {\n aborter.abort()\n await gateway.stop().catch(() => undefined)\n await unlinkRuntimeMeta(opts.workspace).catch(() => undefined)\n }\n return 0\n }\n\n // ── local-only mode: nothing else to do ──\n if (!opts.connect) {\n // Banner already covered the \"local-only\" state. Just park.\n process.stderr.write(\n `${color.dim}Press Ctrl-C to stop.${color.reset}\\n`,\n )\n await new Promise<void>(resolve => {\n aborter.signal.addEventListener(\"abort\", () => resolve())\n })\n return 0\n }\n\n process.stderr.write(\n `${color.dim}tunnel · connecting to ${opts.connect} as '${opts.label}'…${color.reset}\\n`,\n )\n\n let backoffMs = opts.reconnectMinMs ?? 1_000\n const backoffMax = opts.reconnectMaxMs ?? 30_000\n // Shared flag — flipped by the `reconnect_soon` handler inside\n // runOneTunnel to skip the 2s post-clean-close pause. Lets a host\n // doing a graceful preStop drain finish its rollover in ~2s instead\n // of the daemon's normal ~30s backoff (or even the 2s settle).\n const reconnectState = { immediate: false }\n while (!aborter.signal.aborted) {\n try {\n await runOneTunnel(opts, gateway, spawnPty, aborter.signal, reconnectState)\n backoffMs = opts.reconnectMinMs ?? 1_000 // success resets backoff\n if (reconnectState.immediate) {\n reconnectState.immediate = false\n // Host signaled graceful drain — skip the settle pause and\n // reconnect right away (the new replica is already listening).\n continue\n }\n // Brief pause before reconnecting even on a clean close. This prevents\n // an infinite reconnect fight when two daemon processes are running with\n // the same token — each close-then-reconnect gets a minimum delay rather\n // than spinning at CPU speed.\n await sleep(2_000, aborter.signal)\n } catch (err) {\n if (aborter.signal.aborted) break\n const msg = err instanceof Error ? err.message : String(err)\n process.stderr.write(\n `agentproto serve: tunnel error: ${msg}\\n reconnecting in ${backoffMs}ms…\\n`\n )\n await sleep(backoffMs, aborter.signal)\n backoffMs = Math.min(backoffMs * 2, backoffMax)\n }\n }\n\n return 0\n}\n\n/**\n * One end-to-end tunnel attempt. Resolves when the socket closes\n * cleanly (host hung up); rejects on connection error or unexpected\n * close. The reconnect loop catches both and retries.\n */\nasync function runOneTunnel(\n opts: ServeOpts,\n gateway: GatewayHandle,\n spawnPty: PtyFactory | null,\n signal: AbortSignal,\n reconnectState: { immediate: boolean }\n): Promise<void> {\n if (!opts.connect) throw new Error(\"runOneTunnel: --connect not set\")\n const headers: Record<string, string> = {\n \"user-agent\": \"agentproto/0.1.0-alpha\",\n }\n if (opts.token) headers.authorization = `Bearer ${opts.token}`\n\n const ws = new WebSocket(opts.connect, { headers })\n\n // Wait for OPEN (or fail).\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n ws.off(\"error\", onError)\n resolve()\n }\n const onError = (err: Error) => {\n ws.off(\"open\", onOpen)\n reject(err)\n }\n ws.once(\"open\", onOpen)\n ws.once(\"error\", onError)\n if (signal.aborted) {\n ws.close()\n reject(new Error(\"Aborted before WS opened.\"))\n }\n signal.addEventListener(\"abort\", () => {\n ws.close()\n reject(new Error(\"Aborted while WS connecting.\"))\n })\n })\n\n process.stderr.write(`agentproto serve: tunnel up.\\n`)\n\n const sink: FrameSink = wrapWebSocket(ws as unknown as Parameters<typeof wrapWebSocket>[0])\n\n // Keep-alive: Cloud Run (and most reverse-proxies) close idle WebSocket\n // connections after ~5 minutes. Send a ping every 30s so the connection\n // stays alive between infrequent agent calls.\n const keepaliveInterval = setInterval(() => {\n try {\n sink.send({ t: \"ping\", nonce: randomUUID() })\n } catch {\n // sink already closing — the onClose handler below will clear us\n }\n }, 30_000)\n\n const server = createTunnelServer({\n sink,\n label: opts.label,\n pty: spawnPty !== null,\n ...(spawnPty ? { spawnPty } : {}),\n // Generic HTTP-relay upstream for tunnel `http_request` frames.\n // Cloud-side callers (e.g. the API's local-daemon filesystem\n // provider) can now route MCP JSON-RPC + any other HTTP through\n // the daemon without needing a public URL. We point at the local\n // gateway since that's where `/mcp`, `/sessions`, `/events` live.\n httpUpstream: gateway.url,\n // WS forwarding upstream — daemon dials the local gateway's WS\n // endpoints (/sessions/:id/pty, etc) and pipes frames to the host.\n // Used by the cloud tunnel pod so browsers on mobile can attach to\n // interactive PTY sessions even though the daemon is only reachable\n // through the host (not directly).\n dialUpstreamWs: async ({ url, protocols, headers }) => {\n // Dial with the same `ws` lib already used for the host tunnel.\n // Resolve once we receive `open`; reject on `error` / `unexpected-response`.\n //\n // Origin gotcha: the daemon's own HTTP gateway requires Origin in\n // its allowlist for mutating + WS routes. When we self-dial here\n // (no browser in the path), `ws` doesn't set Origin and the\n // request gets 401'd by the daemon's own auth. Inject a loopback\n // Origin matching the URL — `http://127.0.0.1:*` is always in the\n // default allowlist.\n const upstreamHeaders: Record<string, string> = {\n ...(headers as Record<string, string> | undefined),\n }\n if (!upstreamHeaders[\"origin\"] && !upstreamHeaders[\"Origin\"]) {\n try {\n const u = new URL(url)\n const httpScheme = u.protocol === \"wss:\" ? \"https:\" : \"http:\"\n upstreamHeaders[\"Origin\"] = `${httpScheme}//${u.host}`\n } catch {\n /* malformed url — daemon will reject with a clear error */\n }\n }\n return await new Promise((resolve, reject) => {\n const sock = new WebSocket(url, protocols ? [...protocols] : undefined, {\n headers: upstreamHeaders,\n })\n const onceOpen = () => {\n sock.off(\"error\", onceError)\n sock.off(\"unexpected-response\", onceUnexpected)\n resolve({\n protocol: sock.protocol ?? \"\",\n send: (data, sendOpts) => {\n sock.send(data, { binary: sendOpts.binary })\n },\n close: (code, reason) => {\n try {\n sock.close(code, reason)\n } catch {\n /* defensive — socket may already be closed */\n }\n },\n onMessage: handler => {\n sock.on(\"message\", (raw: Buffer, isBinary: boolean) => {\n handler(raw, isBinary)\n })\n },\n onClose: handler => {\n sock.on(\"close\", (code: number, reason: Buffer) => {\n handler(code, reason.toString(\"utf8\"))\n })\n },\n onError: handler => {\n sock.on(\"error\", (err: Error) => handler(err))\n },\n })\n }\n const onceError = (err: Error) => {\n sock.off(\"open\", onceOpen)\n reject(err)\n }\n const onceUnexpected = (\n _req: unknown,\n res: { statusCode?: number }\n ) => {\n sock.off(\"open\", onceOpen)\n reject(new Error(`Unexpected server response: ${res.statusCode ?? 0}`))\n }\n sock.once(\"open\", onceOpen)\n sock.once(\"error\", onceError)\n sock.once(\"unexpected-response\", onceUnexpected)\n })\n },\n // v0 authorize hook: trust the bearer-authenticated host completely.\n // Token possession proves the host was provisioned for this daemon.\n // Per-spawn policy filtering will land alongside the policy.toml.\n authorize: req => req,\n // ── AIP-46 bridge: tunnel spawns land in the gateway registry ──\n // Every cloud-driven spawn shows up in `gateway.url/sessions`\n // and the LocalDaemonSessionsCard, alongside spawns originated\n // through MCP tools or POST /sessions/agent. The execId is the\n // host's stable id — keep it so cloud cli_sessions rows can\n // cross-ref the daemon-side descriptor.\n onChildSpawned: ({ execId, child, request }) => {\n gateway.sessions.register({\n id: execId,\n child,\n workspaceSlug: opts.label,\n command: [request.command, ...request.args].join(\" \"),\n kind: \"agent-cli\",\n label: `tunnel: ${request.command.split(\"/\").pop() ?? request.command}`,\n })\n },\n // Graceful drain hook — flip the outer loop's \"reconnect immediately\"\n // flag and close the WS so the supervisor reconnects without backoff.\n // Host will follow up with close(1012) ~2s later as a hard backstop.\n onReconnectSoon: ({ reasonMs }) => {\n process.stderr.write(\n `agentproto serve: host signaled drain (reasonMs=${reasonMs ?? \"?\"}) — reconnecting immediately\\n`\n )\n reconnectState.immediate = true\n try {\n ws.close(1000, \"host_drain\")\n } catch {\n /* socket already closing */\n }\n },\n })\n\n // Block until the sink closes (peer disconnect or our shutdown).\n await new Promise<void>(resolve => {\n const offClose = sink.onClose(() => {\n clearInterval(keepaliveInterval)\n offClose()\n resolve()\n })\n if (signal.aborted) {\n clearInterval(keepaliveInterval)\n server.close().finally(() => resolve())\n }\n signal.addEventListener(\"abort\", () => {\n clearInterval(keepaliveInterval)\n server.close().finally(() => resolve())\n })\n })\n\n process.stderr.write(`agentproto serve: tunnel closed.\\n`)\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise(resolve => {\n if (signal.aborted) return resolve()\n const timer = setTimeout(resolve, ms)\n signal.addEventListener(\"abort\", () => {\n clearTimeout(timer)\n resolve()\n })\n })\n}\n\n/**\n * Boot banner. Single block so the user sees the whole \"gateway up\"\n * picture in one place, with subtle color when stdout is a TTY. The\n * old format was:\n *\n * agentproto serve: gateway up on http://...\n * workspace: /abs/path\n * mcp: http://.../mcp\n * …\n *\n * What this prints instead:\n *\n * ─ agentproto · gateway up · http://127.0.0.1:18790 ─\n * workspace /abs/path\n * pty enabled (node-pty)\n * origins localhost:* (default)\n * endpoints /mcp · /sessions · /events · /sessions/:id/pty (WS)\n * mode local-only\n */\nfunction printBootBanner(opts: {\n url: string\n workspace: string\n ptyEnabled: boolean\n allowedOrigins?: readonly string[]\n strictOrigins?: boolean\n connect?: string\n}): void {\n const c = color\n const home = process.env.HOME ?? \"\"\n const workspace =\n home && opts.workspace.startsWith(home)\n ? \"~\" + opts.workspace.slice(home.length)\n : opts.workspace\n const ptyState = opts.ptyEnabled\n ? `${c.green}enabled${c.reset} ${c.dim}(node-pty)${c.reset}`\n : `${c.amber}disabled${c.reset} ${c.dim}(install node-pty to enable)${c.reset}`\n let origins: string\n if (opts.strictOrigins) {\n origins =\n opts.allowedOrigins && opts.allowedOrigins.length > 0\n ? `${c.amber}STRICT${c.reset} ${opts.allowedOrigins.join(\" · \")} ${c.dim}(localhost defaults disabled)${c.reset}`\n : `${c.red}STRICT · empty allowlist${c.reset} ${c.dim}(every Origin will 401 — only Bearer-token works)${c.reset}`\n } else {\n origins =\n opts.allowedOrigins && opts.allowedOrigins.length > 0\n ? opts.allowedOrigins.join(\" · \") +\n ` ${c.dim}+ localhost (default)${c.reset}`\n : `${c.dim}localhost:* only (default)${c.reset}`\n }\n const mode = opts.connect\n ? `${c.cyan}tunnel${c.reset} ${c.dim}→ ${opts.connect}${c.reset}`\n : `${c.dim}local-only${c.reset}`\n const line = `${c.dim}─${c.reset}`\n process.stderr.write(\n `\\n${line} ${c.bold}agentproto${c.reset} ${c.dim}·${c.reset} gateway up ${c.dim}·${c.reset} ${c.cyan}${opts.url}${c.reset} ${line}\\n` +\n ` ${c.dim}workspace${c.reset} ${workspace}\\n` +\n ` ${c.dim}pty${c.reset} ${ptyState}\\n` +\n ` ${c.dim}origins${c.reset} ${origins}\\n` +\n ` ${c.dim}endpoints${c.reset} /mcp · /sessions · /events · /sessions/:id/pty ${c.dim}(WS)${c.reset}\\n` +\n ` ${c.dim}mode${c.reset} ${mode}\\n` +\n `\\n`,\n )\n}\n\n/**\n * Tiny ANSI palette gated on stdout being a TTY. Writing colors into\n * a logfile (launchd `StandardOutPath`) would litter the file with\n * `\\x1b[…m` noise; this strips when piped.\n */\nconst _isTty = !!(process.stderr as NodeJS.WriteStream).isTTY\nconst color = _isTty\n ? {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n amber: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n red: \"\\x1b[31m\",\n }\n : {\n reset: \"\",\n bold: \"\",\n dim: \"\",\n green: \"\",\n amber: \"\",\n cyan: \"\",\n red: \"\",\n }\n","/**\n * `~/.agentproto/workspaces.json` — single source of truth for the\n * local agentproto control plane. Tracks which directories the user\n * has opted into as agentproto workspaces, plus which one is \"active\"\n * (the daemon's default working set when no workspace is named in\n * a tool call).\n *\n * Why a config file instead of recreating an MCP entry per workspace:\n * - One daemon = one MCP entry in the user's IDE (clean to read in\n * `claude mcp list`, no `dapper_willow` / `noble_lantern` spam).\n * - The daemon walks `workspaces[]` at boot and exposes them all;\n * tools that need a target take an optional `workspace` arg and\n * fall back to `active` when omitted.\n * - The CLI (`agentproto workspace add/list/remove/use`), the daemon,\n * and the guilde-web onboarding dialog all read+write the same\n * file, so changes from one surface are immediately visible to\n * the others.\n *\n * File layout is intentionally boring (small, hand-editable JSON) —\n * future fields go on top, never break v1 readers.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, isAbsolute, resolve } from \"node:path\"\n\nexport const WORKSPACES_CONFIG_VERSION = 1 as const\n\nexport interface WorkspaceEntry {\n /** Stable handle — what tools accept as `workspace`. Lowercase\n * ASCII, hyphen-only. The CLI sanitises arbitrary names down to\n * this shape so paste-from-finder Just Works. */\n slug: string\n /** Absolute filesystem path. Required absolute so the daemon can\n * serve the workspace regardless of its own cwd. */\n path: string\n /** ISO-8601 — first time the entry was added. Pure metadata, no\n * behavioural impact. */\n addedAt: string\n /** Last time the entry was touched (renamed, path edited, used as\n * active). Lets the CLI sort by recency without an N+1 stat. */\n updatedAt: string\n /** Free-text label the user can attach so workspaces with similar\n * slugs stay distinguishable in `agentproto workspace list`. */\n label?: string\n}\n\nexport interface WorkspacesConfig {\n version: typeof WORKSPACES_CONFIG_VERSION\n /** Active workspace slug — daemon defaults to this when no\n * `workspace` arg is passed. May be undefined when no workspaces\n * are registered yet. */\n active?: string\n workspaces: WorkspaceEntry[]\n}\n\nexport const DEFAULT_CONFIG_DIR = (): string =>\n resolve(homedir(), \".agentproto\")\nexport const DEFAULT_CONFIG_PATH = (): string =>\n resolve(DEFAULT_CONFIG_DIR(), \"workspaces.json\")\n\n/** Reduce arbitrary user input to a safe slug. Aligns with what most\n * tooling validates against (`/^[a-z0-9][a-z0-9-]{0,63}$/`) so the\n * daemon never has to encode it for URLs or filesystem paths. */\nexport function sanitizeSlug(input: string): string {\n const trimmed = input.trim().toLowerCase()\n const cleaned = trimmed\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 64)\n // Edge case: input was entirely non-conforming — fall back to a\n // generic so we never return an empty string.\n return cleaned || \"workspace\"\n}\n\n/** Read the config from disk. Returns an empty config (no workspaces,\n * no active) when the file is missing — this is the legitimate\n * first-boot state, not an error. */\nexport async function loadWorkspacesConfig(\n path: string = DEFAULT_CONFIG_PATH()\n): Promise<WorkspacesConfig> {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { version: WORKSPACES_CONFIG_VERSION, workspaces: [] }\n }\n throw err\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n throw new Error(\n `agentproto: ${path} is not valid JSON (${\n err instanceof Error ? err.message : String(err)\n }). Delete the file or fix it manually.`\n )\n }\n return normalizeConfig(parsed)\n}\n\n/** Write the config back. Creates the parent directory if missing.\n * Atomic-ish: writes to a temp file first, then renames over the\n * target — avoids the partial-write window where a concurrent reader\n * sees half a JSON object. */\nexport async function saveWorkspacesConfig(\n config: WorkspacesConfig,\n path: string = DEFAULT_CONFIG_PATH()\n): Promise<void> {\n const normalized = normalizeConfig(config)\n await fs.mkdir(dirname(path), { recursive: true })\n const tmp = `${path}.tmp.${process.pid}`\n await fs.writeFile(tmp, JSON.stringify(normalized, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, path)\n}\n\n/**\n * Pure helpers — caller manages persistence. Returns a NEW config\n * (never mutates) so callers can compose multiple updates before\n * a single save.\n */\nexport function addWorkspace(\n config: WorkspacesConfig,\n input: { slug: string; path: string; label?: string }\n): WorkspacesConfig {\n if (!isAbsolute(input.path)) {\n throw new Error(\n `addWorkspace: path must be absolute, got \"${input.path}\".`\n )\n }\n const slug = sanitizeSlug(input.slug)\n const now = new Date().toISOString()\n const existingIdx = config.workspaces.findIndex(w => w.slug === slug)\n const next: WorkspaceEntry = existingIdx >= 0\n ? {\n ...config.workspaces[existingIdx]!,\n path: input.path,\n ...(input.label !== undefined ? { label: input.label } : {}),\n updatedAt: now,\n }\n : {\n slug,\n path: input.path,\n ...(input.label ? { label: input.label } : {}),\n addedAt: now,\n updatedAt: now,\n }\n const workspaces = [...config.workspaces]\n if (existingIdx >= 0) workspaces[existingIdx] = next\n else workspaces.push(next)\n // First-add becomes active automatically — saves the user a\n // separate `workspace use` call right after a fresh `add`.\n const active = config.active ?? slug\n return { ...config, workspaces, active }\n}\n\nexport function removeWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspacesConfig {\n const sanitised = sanitizeSlug(slug)\n const workspaces = config.workspaces.filter(w => w.slug !== sanitised)\n // If the removed workspace was active, hand off to whatever's\n // first — predictable and avoids leaving the daemon in an\n // unreachable state when the user removes the only one.\n let active = config.active\n if (active === sanitised) {\n active = workspaces[0]?.slug\n }\n const next: WorkspacesConfig = { ...config, workspaces }\n if (active !== undefined) next.active = active\n else delete next.active\n return next\n}\n\nexport function setActiveWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspacesConfig {\n const sanitised = sanitizeSlug(slug)\n if (!config.workspaces.some(w => w.slug === sanitised)) {\n throw new Error(\n `setActiveWorkspace: no workspace registered with slug \"${sanitised}\". ` +\n `Run \\`agentproto workspace add <path> --slug ${sanitised}\\` first.`\n )\n }\n return { ...config, active: sanitised }\n}\n\nexport function findWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspaceEntry | undefined {\n return config.workspaces.find(w => w.slug === sanitizeSlug(slug))\n}\n\n/** The active workspace, or undefined when none is registered. Pure\n * convenience to avoid re-implementing the lookup at every caller. */\nexport function getActiveWorkspace(\n config: WorkspacesConfig\n): WorkspaceEntry | undefined {\n if (!config.active) return config.workspaces[0]\n return findWorkspace(config, config.active) ?? config.workspaces[0]\n}\n\n/**\n * Coerce arbitrary parsed JSON into a valid config. Skips entries\n * with missing required fields rather than throwing — partial recovery\n * is friendlier than \"your config file is corrupted, here's a stack\n * trace\". Logs nothing here; the CLI shells that consume this should\n * decide whether to surface a warning.\n */\nfunction normalizeConfig(parsed: unknown): WorkspacesConfig {\n if (!parsed || typeof parsed !== \"object\") {\n return { version: WORKSPACES_CONFIG_VERSION, workspaces: [] }\n }\n const obj = parsed as Record<string, unknown>\n const workspaces: WorkspaceEntry[] = []\n if (Array.isArray(obj.workspaces)) {\n for (const entry of obj.workspaces) {\n if (!entry || typeof entry !== \"object\") continue\n const e = entry as Record<string, unknown>\n const slug = typeof e.slug === \"string\" ? sanitizeSlug(e.slug) : \"\"\n const path = typeof e.path === \"string\" ? e.path : \"\"\n if (!slug || !path) continue\n const addedAt =\n typeof e.addedAt === \"string\" ? e.addedAt : new Date().toISOString()\n const updatedAt = typeof e.updatedAt === \"string\" ? e.updatedAt : addedAt\n const we: WorkspaceEntry = { slug, path, addedAt, updatedAt }\n if (typeof e.label === \"string\" && e.label.trim()) {\n we.label = e.label.trim()\n }\n workspaces.push(we)\n }\n }\n // De-dupe by slug (last wins) — the file is hand-editable so a\n // typo could have produced two entries with the same slug.\n const dedup = new Map<string, WorkspaceEntry>()\n for (const w of workspaces) dedup.set(w.slug, w)\n const finalList = Array.from(dedup.values())\n const active =\n typeof obj.active === \"string\" && finalList.some(w => w.slug === obj.active)\n ? (obj.active as string)\n : finalList[0]?.slug\n const out: WorkspacesConfig = {\n version: WORKSPACES_CONFIG_VERSION,\n workspaces: finalList,\n }\n if (active !== undefined) out.active = active\n return out\n}\n","/**\n * @agentproto/define-doctype — meta-factory for AIP `defineX` constructors.\n *\n * Every AIP that defines a markdown-with-frontmatter doctype ships a\n * `defineX(definition)` constructor (`defineTool` for AIP-14, `defineDriver`\n * for AIP-30, future `defineSkill` / `defineKnowledge` / …). Those\n * constructors share a small invariant prologue: validate the `id`\n * against a regex, validate `description` length, throw with a canonical\n * error prefix, freeze the returned handle.\n *\n * `createDoctype` lifts that prologue to one place. Each per-AIP\n * package supplies the spec-specific bits via `validate(def)` and\n * `build(def)`; the factory wires them together with the shared rules.\n *\n * Recommended scaffold for new AIPs (referenced from AIP-1).\n */\n\n/**\n * Default shape every AIP definition is assumed to satisfy when no\n * custom `readIdentity` / `readDescription` extractors are passed.\n *\n * Most AIPs (AIP-14 TOOL, AIP-30 DRIVER, AIP-3 SKILL, …) carry\n * `id` + `description`. AIPs that depart from this convention (e.g.\n * AIP-7 POLICY uses `slug` + `name`, with `description` optional)\n * supply their own extractors via `DoctypeOptions`.\n */\nexport interface DoctypeDefinitionBase {\n id: string\n description: string\n}\n\nexport interface DoctypeOptions<TDef, THandle> {\n /**\n * AIP number — surfaces in error messages so a thrown stack frame\n * inside a framework adapter still tells you which spec rejected\n * the definition.\n */\n aip: number\n /**\n * Doctype name (lower-case singular). Used to build the error\n * prefix: `name = \"tool\"` → \"defineTool: …\".\n */\n name: string\n /**\n * Extract the identity string (kebab-id, slug, …) to validate against\n * `idPattern`. Default: `(def) => (def as { id: string }).id` —\n * works for any AIP whose definition has an `id` field. AIPs whose\n * identity field has a different name (e.g. AIP-7 POLICY's `slug`)\n * supply their own reader.\n */\n readIdentity?: (def: TDef) => string\n /**\n * Override the default identity pattern. Default:\n * `/^[a-z0-9][a-z0-9._-]{1,79}$/` — kebab/snake/dot separated,\n * 2-80 chars, leading alphanumeric. AIPs with stricter rules\n * (AIP-7 POLICY uses `^[a-z0-9][a-z0-9-]*$`, no dots) override.\n */\n idPattern?: RegExp\n /**\n * Extract the LLM-facing prose used by the length check. Default:\n * `(def) => (def as { description: string }).description`. Pass\n * `false` to skip the length validation (e.g. AIPs where\n * description is optional, or where the human-readable string lives\n * in a different field).\n */\n readDescription?: ((def: TDef) => string | undefined) | false\n /**\n * Override the maximum prose length. Default 2000. AIPs whose\n * doctypes carry longer normative text on the doctype itself can\n * raise this; most should keep the default for prompt-injection\n * resistance.\n */\n maxDescriptionLen?: number\n /**\n * Spec-specific validations that run AFTER the default id and\n * description checks. Throw on failure. Stays out of `build()` so\n * the build path can assume a validated definition.\n */\n validate?: (def: TDef) => void\n /**\n * Build the immutable handle from a validated definition. Apply\n * defaults, freeze nested arrays/objects per the spec's freezing\n * rules, return the handle. The factory takes care of the\n * top-level `Object.freeze`.\n */\n build: (def: TDef) => THandle\n}\n\nconst DEFAULT_ID_PATTERN = /^[a-z0-9][a-z0-9._-]{1,79}$/\nconst MAX_DESCRIPTION_LEN = 2000\n\n/**\n * Build a `defineX(definition)` constructor that enforces the\n * cross-AIP invariants and delegates spec-specific behaviour to\n * `validate` / `build`.\n *\n * Usage (from `@agentproto/tool/src/define-tool.ts`):\n *\n * export const defineTool = createDoctype<ToolDefinition, ToolHandle>({\n * aip: 14,\n * name: \"tool\",\n * validate(def) { ...spec-14 checks... },\n * build(def) { ...defaulting + nested freezing... },\n * })\n */\nexport function createDoctype<TDef, THandle>(\n opts: DoctypeOptions<TDef, THandle>,\n): (def: TDef) => THandle {\n const idPattern = opts.idPattern ?? DEFAULT_ID_PATTERN\n const readIdentity =\n opts.readIdentity ?? ((def: TDef) => (def as { id: string }).id)\n const readDescription =\n opts.readDescription === false\n ? null\n : (opts.readDescription ??\n ((def: TDef) => (def as { description: string }).description))\n const maxLen = opts.maxDescriptionLen ?? MAX_DESCRIPTION_LEN\n const prefix = `define${capitalize(opts.name)}`\n const aipTag = `(AIP-${opts.aip})`\n\n return function constructDoctype(def: TDef): THandle {\n const identity = readIdentity(def)\n if (typeof identity !== \"string\" || !idPattern.test(identity)) {\n throw new Error(\n `${prefix} ${aipTag}: invalid id '${String(\n identity,\n )}' — must match ${idPattern}`,\n )\n }\n if (readDescription) {\n const description = readDescription(def)\n if (\n typeof description !== \"string\" ||\n description.length === 0 ||\n description.length > maxLen\n ) {\n throw new Error(\n `${prefix} ${aipTag}: id='${identity}' description must be 1–${maxLen} chars`,\n )\n }\n }\n opts.validate?.(def)\n return Object.freeze(opts.build(def)) as THandle\n }\n}\n\nfunction capitalize(s: string): string {\n return s.length === 0 ? s : s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nexport const DOCTYPE_DEFAULT_ID_PATTERN = DEFAULT_ID_PATTERN\nexport const DOCTYPE_MAX_DESCRIPTION_LEN = MAX_DESCRIPTION_LEN\n\n/**\n * Filter a value to its YAML-serialisable subset:\n * - functions removed (e.g. driver `execute[id]: ExecuteFn`)\n * - zod schemas removed (e.g. tool `inputSchema`, `outputSchema`,\n * `contextSchema` — they live in TS, not in frontmatter)\n * - `undefined` values dropped from objects (so the YAML output\n * doesn't carry empty keys; `null` is preserved as a real value)\n *\n * Used by per-AIP `createX(params, opts)` to project a validated\n * definition into a manifest-shaped object before writing to disk.\n * Pure function; no I/O.\n */\nexport function filterSerializable(value: unknown): unknown {\n if (value === null || value === undefined) return value\n if (typeof value === \"function\") return undefined\n if (\n typeof value === \"object\" &&\n value !== null &&\n Object.prototype.hasOwnProperty.call(value, \"_def\") &&\n \"parse\" in value &&\n typeof (value as { parse?: unknown }).parse === \"function\"\n ) {\n return undefined\n }\n if (Array.isArray(value)) {\n return value.map(filterSerializable).filter((v) => v !== undefined)\n }\n if (typeof value === \"object\") {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n const filtered = filterSerializable(v)\n if (filtered !== undefined) out[k] = filtered\n }\n return out\n }\n return value\n}\n","/**\n * @agentproto/manifest — generic verbs for AIP doctypes.\n *\n * Every per-AIP package (`@agentproto/tool`, `@agentproto/driver`, …)\n * supplies a `DoctypeSpec` describing the per-package knobs (name,\n * AIP number, schema literal, path convention, validator, parser).\n * `createVerbs(spec)` returns the full lifecycle:\n *\n * create(params, opts) params → .md on disk\n * load(path) .md on disk → handle\n * list(dir, filter?) walk → handle[]\n * update(path, mutator) load → patch → write back\n * resolve(block, ctx?) { inline | ref | file } → handle\n * delete(path) fs.unlink\n *\n * Adding a new verb is a single place; every package picks it up\n * automatically — same model as `createDoctype` for the validation\n * pipeline.\n */\n\nimport { filterSerializable } from \"@agentproto/define-doctype\"\nimport matter from \"gray-matter\"\nimport type { Dirent } from \"node:fs\"\nimport { mkdir, readFile, readdir, rm, writeFile } from \"node:fs/promises\"\nimport { dirname, isAbsolute, join } from \"node:path\"\n\n/**\n * Per-package descriptor consumed by `createVerbs`.\n *\n * Generic over the params shape (input to `define`) and the handle\n * shape (output of `define`). For most AIPs `THandle` extends\n * `TParams` — handles are just frozen, defaulted definitions.\n */\nexport interface DoctypeSpec<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n> {\n /** Lower-case singular: \"tool\", \"driver\", \"operator\". Used in errors. */\n name: string\n /** AIP number — surfaces in error messages for provenance. */\n aip: number\n /** Frontmatter `schema:` literal (e.g. \"agentproto/tool/v1\"). */\n schemaLiteral: string\n /**\n * Filename of the doctype's manifest. By default `<DOCTYPE>.md`,\n * derived from `name.toUpperCase()`. Override only when the\n * doctype's filename diverges from convention.\n */\n filename?: string\n /**\n * Path-of-handle convention. Given a validated handle, return the\n * workspace-relative path the manifest lives at. Examples:\n * tool: `(h) => `${h.id}/TOOL.md``\n * policy: `(h) => `policies/${h.slug}/POLICY.md``\n * operator: `(h) => `${h.id}/OPERATOR.md``\n */\n pathOf(handle: THandle): string\n /** TS authoring path: validates params + applies defaults. */\n define(params: TParams): THandle\n /** MD authoring path: parses YAML+body. Throws on invalid frontmatter. */\n parse(source: string): { frontmatter: Record<string, unknown>; body: string }\n /**\n * Optional projection: handle → manifest-shaped frontmatter object.\n * Default: pass the params through `filterSerializable` (drops zod\n * schemas + functions). Override when the handle and frontmatter\n * shapes diverge non-trivially.\n */\n toFrontmatter?(params: TParams): Record<string, unknown>\n}\n\nexport interface CreateOptions {\n /** Workspace-relative or absolute base directory. */\n dir: string\n /** Body markdown after the frontmatter. Defaults to a one-line stub. */\n body?: string\n /** Render only — don't write. Returns the rendered string. */\n dryRun?: boolean\n}\n\nexport interface VerbResult<THandle> {\n path: string\n handle: THandle\n rendered: string\n}\n\nexport interface ListOptions {\n /** Filter the discovered handles. Receives the loaded handle. */\n filter?: <H>(handle: H) => boolean\n /** Skip subdirectories matching these names. Default: [\"node_modules\", \".git\", \"dist\", \".next\"]. */\n skipDirs?: readonly string[]\n}\n\nexport type RefBlock<TParams> =\n | { inline: TParams }\n | { ref: string }\n | { file: string }\n\nexport interface ResolveContext {\n /** Base dir for `file:` references. Required when resolving file blocks. */\n baseDir?: string\n /**\n * Registry resolver for `ref:` strings (e.g. `@agentik/runners/python-3.12`\n * → handle). Optional; throws when an unresolvable ref is encountered.\n */\n resolveRef?: (ref: string) => Promise<unknown> | unknown\n}\n\nexport interface Verbs<TParams, THandle> {\n /** TS-authored params → write `<dir>/<pathOf(handle)>` on disk. */\n create(params: TParams, opts: CreateOptions): Promise<VerbResult<THandle>>\n /** Read a manifest from disk → handle. */\n load(path: string): Promise<{ path: string; handle: THandle; body: string }>\n /** Walk `dir` for the doctype's `*.md` files; return loaded handles. */\n list(dir: string, opts?: ListOptions): Promise<THandle[]>\n /** Load → mutate → write back. Mutator receives the loaded params. */\n update(\n path: string,\n mutator: (params: TParams, ctx: { handle: THandle; body: string }) => TParams | Promise<TParams>,\n opts?: { body?: string; dryRun?: boolean },\n ): Promise<VerbResult<THandle>>\n /**\n * Resolve a `{ inline | ref | file }` block to a handle. Used by\n * doctypes that compose other doctypes (AIP-17/30/36 pattern).\n */\n resolve(\n block: RefBlock<TParams>,\n ctx?: ResolveContext,\n ): Promise<THandle>\n /** Remove the manifest file. Does NOT recurse into the containing dir. */\n delete(path: string): Promise<void>\n}\n\nconst DEFAULT_SKIP_DIRS: readonly string[] = [\n \"node_modules\",\n \".git\",\n \"dist\",\n \".next\",\n \".turbo\",\n]\n\nexport function createVerbs<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n>(spec: DoctypeSpec<TParams, THandle>): Verbs<TParams, THandle> {\n const filename = spec.filename ?? `${spec.name.toUpperCase()}.md`\n const toFrontmatter =\n spec.toFrontmatter ??\n ((params: TParams) =>\n filterSerializable({\n schema: spec.schemaLiteral,\n ...params,\n }) as Record<string, unknown>)\n\n async function create(\n params: TParams,\n opts: CreateOptions,\n ): Promise<VerbResult<THandle>> {\n const handle = spec.define(params)\n const relativePath = spec.pathOf(handle)\n const path = join(opts.dir, relativePath)\n const frontmatter = toFrontmatter(params)\n const rendered = matter.stringify(\n opts.body ?? defaultBody(spec, frontmatter),\n frontmatter,\n )\n if (!opts.dryRun) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, rendered, \"utf8\")\n }\n return { path, handle, rendered }\n }\n\n async function load(\n path: string,\n ): Promise<{ path: string; handle: THandle; body: string }> {\n const source = await readFile(path, \"utf8\")\n const { frontmatter, body } = spec.parse(source)\n // The frontmatter is already zod-validated by `parse` (each per-\n // package parser runs the schema). Cast through `define` so the\n // cross-AIP invariants run too — same path the TS authoring uses.\n const handle = spec.define(frontmatter as unknown as TParams)\n return { path, handle, body }\n }\n\n async function list(\n dir: string,\n opts: ListOptions = {},\n ): Promise<THandle[]> {\n const skip = new Set(opts.skipDirs ?? DEFAULT_SKIP_DIRS)\n const out: THandle[] = []\n\n async function walk(current: string): Promise<void> {\n // The Dirent overload returns `Dirent<NonSharedBuffer>[]` in\n // Node 22+'s @types/node when called with non-string buffer\n // input. Coerce by typing the entries as `Dirent[]` (string\n // names by default) since we always pass a string path.\n let entries: Dirent[]\n try {\n entries = (await readdir(current, { withFileTypes: true })) as Dirent[]\n } catch {\n return\n }\n for (const entry of entries) {\n const entryName = String(entry.name)\n if (entry.isDirectory()) {\n if (skip.has(entryName)) continue\n await walk(join(current, entryName))\n continue\n }\n if (!entry.isFile()) continue\n if (entryName !== filename) continue\n try {\n const { handle } = await load(join(current, entryName))\n if (!opts.filter || opts.filter(handle)) out.push(handle)\n } catch {\n // Malformed manifests skip the list — `load` will throw the\n // useful diagnostic when a caller wants to see it.\n }\n }\n }\n\n await walk(dir)\n return out\n }\n\n async function update(\n path: string,\n mutator: (\n params: TParams,\n ctx: { handle: THandle; body: string },\n ) => TParams | Promise<TParams>,\n opts: { body?: string; dryRun?: boolean } = {},\n ): Promise<VerbResult<THandle>> {\n const { handle, body } = await load(path)\n // Reconstruct params from the frontmatter — the load path already\n // validated, so this is just a reverse projection.\n const source = await readFile(path, \"utf8\")\n const { frontmatter } = spec.parse(source)\n const params = frontmatter as unknown as TParams\n const mutated = await mutator(params, { handle, body })\n const newHandle = spec.define(mutated)\n const newFrontmatter = toFrontmatter(mutated)\n const rendered = matter.stringify(\n opts.body ?? body,\n newFrontmatter,\n )\n if (!opts.dryRun) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, rendered, \"utf8\")\n }\n return { path, handle: newHandle, rendered }\n }\n\n async function resolve(\n block: RefBlock<TParams>,\n ctx: ResolveContext = {},\n ): Promise<THandle> {\n if (\"inline\" in block) {\n return spec.define(block.inline)\n }\n if (\"file\" in block) {\n const baseDir = ctx.baseDir ?? \".\"\n const path = isAbsolute(block.file) ? block.file : join(baseDir, block.file)\n const { handle } = await load(path)\n return handle\n }\n if (\"ref\" in block) {\n if (!ctx.resolveRef) {\n throw new Error(\n `${spec.name}.resolve (AIP-${spec.aip}): block has \\`ref: '${block.ref}'\\` but no resolveRef provided in context — registries must inject their own resolver`,\n )\n }\n const resolved = await ctx.resolveRef(block.ref)\n return spec.define(resolved as TParams)\n }\n throw new Error(\n `${spec.name}.resolve (AIP-${spec.aip}): block must have one of inline | ref | file`,\n )\n }\n\n async function deleteFn(path: string): Promise<void> {\n await rm(path, { force: true })\n }\n\n return { create, load, list, update, resolve, delete: deleteFn }\n}\n\nfunction defaultBody<P, H>(\n spec: DoctypeSpec<P extends { id?: string; slug?: string; name?: string } ? P : never, H>,\n frontmatter: Record<string, unknown>,\n): string {\n const id =\n typeof frontmatter.name === \"string\"\n ? frontmatter.name\n : typeof frontmatter.id === \"string\"\n ? frontmatter.id\n : typeof frontmatter.slug === \"string\"\n ? frontmatter.slug\n : spec.name\n return `# ${id}\\n`\n}\n\n","/**\n * AIP-40 EXTENSION.md frontmatter zod schema.\n *\n * Generated from `resources/aip-40/draft/EXTENSION.schema.json` via\n * json-schema-to-zod. Imported by both `define-extension.ts` (TS path\n * validation) and `manifest/index.ts` (.md path validation) so every\n * field-level constraint runs in both authoring paths from a single\n * source of truth — re-run scaffold-aip to refresh after spec changes.\n *\n * Cross-field rules (if/then/allOf in JSON Schema) don't translate\n * cleanly and live in `define-extension.ts`'s `validate(def)` instead.\n */\nimport { z } from \"zod\";\nexport const extensionFrontmatterSchema = z.object({ \"schema\": z.literal(\"agentproto/extension/v1\").describe(\"Pins the spec version this manifest conforms to.\"), \"slug\": z.string().regex(new RegExp(\"^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*[a-z0-9]$\")).describe(\"Namespaced identifier — `<namespace>:<name>`. Lowercase, digits, dashes; single colon separator. Example: `acme:deal`.\"), \"title\": z.string().min(1).max(80).describe(\"Human-readable display name.\"), \"description\": z.string().min(1).max(2000).describe(\"One-paragraph statement of the extension's purpose.\"), \"version\": z.string().regex(new RegExp(\"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:[-+][a-zA-Z0-9.-]+)?$\")).describe(\"Extension's own semver. Bump on breaking change.\"), \"status\": z.literal(\"Local\").describe(\"Extensions are perpetually Local — they never enter the public registry's Draft/Review/Final lifecycle.\"), \"extends\": z.union([z.string().regex(new RegExp(\"^aip-\\\\d+$\")).describe(\"Inherit a public AIP's schema (e.g. `aip-14`).\"), z.literal(\"none\").describe(\"Brand-new doctype, no inheritance.\")]).describe(\"Parent AIP this extension inherits from, or `none` for a root doctype.\"), \"add_fields\": z.object({ \"properties\": z.record(z.string(), z.any()).describe(\"JSON Schema property definitions to merge into the parent's properties. Collisions are an error — use `tighten` to narrow an existing field.\").optional(), \"required\": z.array(z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), { message: \"All items must be unique!\" }).describe(\"Field names that become required in addition to parent's required[]. Unioned with parent's required, never replaces.\").default([]) }).strict().describe(\"Schema-level additions: new properties + new required entries.\").optional(), \"tighten\": z.record(z.string(), z.object({ \"pattern\": z.string().optional(), \"enum\": z.array(z.any()).optional(), \"minLength\": z.number().int().gte(0).optional(), \"maxLength\": z.number().int().gte(0).optional(), \"minimum\": z.number().optional(), \"maximum\": z.number().optional() }).strict()).describe(\"Per-field constraint overrides. Each entry MUST tighten (not loosen) the parent's constraints; runtimes verify monotonicity at registration.\").optional(), \"defaults\": z.record(z.string(), z.any()).describe(\"Default values applied when a field is omitted. Layered on top of parent's defaults; extension's value wins on the same key.\").optional(), \"path_convention\": z.string().min(1).describe(\"Filesystem convention template, e.g. `\\\"deals/<slug>/DEAL.md\\\"`. Tokens: `<slug>` (doctype identity), `<DOCTYPE>` (extension's slug name part). Falls back to parent's convention when omitted.\").optional(), \"requires\": z.array(z.number().int().gte(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), { message: \"All items must be unique!\" }).describe(\"Public AIPs the extension depends on, in addition to its parent.\").default([]), \"metadata\": z.record(z.string(), z.any()).describe(\"Free-form vendor extensions under namespaced keys (`metadata.<vendor>.<field>`).\").default({}) }).strict().describe(\"Validates the YAML frontmatter portion of an AIP-40 EXTENSION.md manifest. An extension declares a workspace-local doctype that inherits a public AIP's schema and may add fields, tighten constraints, set defaults, and override the path convention.\");\n","import { createDoctype } from \"@agentproto/define-doctype\";\nimport { extensionFrontmatterSchema } from \"./schema.js\";\n/**\n * AIP-40 reference implementation of `defineExtension`.\n *\n * Built on `createDoctype` so the cross-AIP invariants (id pattern,\n * description length, top-level freeze, \"defineExtension (AIP-40): …\"\n * error prefix) run uniformly with every other AIP defineX.\n *\n * Field-level validation runs the schema-derived zod from\n * `./schema.ts` against the input. Same source of truth as the .md\n * path uses (`parseExtensionManifest`), so a malformed TS-authored\n * definition fails with the same diagnostic as a malformed manifest.\n * Cross-field rules go in `validate(def)` after the zod check.\n *\n * Identity / description extractors detected from the JSON Schema:\n * readIdentity: def.slug\n * readDescription: def.description.\n */\nexport const defineExtension = createDoctype({\n aip: 40,\n name: \"extension\",\n // Extension slugs are namespaced: `<namespace>:<name>` (e.g.\n // `acme:deal`). Override the default kebab-only pattern.\n idPattern: /^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*[a-z0-9]$/,\n readIdentity: (def) => def.slug,\n validate(def) {\n const result = extensionFrontmatterSchema.safeParse(def);\n if (!result.success) {\n throw new Error(`defineExtension (AIP-40): ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`);\n }\n // TODO: spec-40-specific cross-field rules (if/then/allOf in\n // the JSON Schema) — those don't translate to zod cleanly and\n // belong here. See @agentproto/operator's autonomy=gated rule.\n },\n build(def) {\n // Default build: spread the validated definition into a fresh object.\n // Hand-tune for nested freezing (Object.freeze on arrays/objects) and\n // for fields that need defaults applied — see @agentproto/operator\n // for a reference shape.\n return { ...def };\n },\n});\n","/**\n * `specFromExtension(handle, parent)` — turn a parsed EXTENSION.md\n * into a runtime `DoctypeSpec` consumable by\n * `@agentproto/manifest.createVerbs`.\n *\n * The parent argument is the public AIP's spec (e.g. `toolSpec` from\n * `@agentproto/tool`). The function composes:\n *\n * schema parent.schema ∪ ext.add_fields, then ext.tighten\n * path ext.path_convention ?? parent.pathOf\n * defaults parent defaults ⨁ ext.defaults\n * define wraps parent.define with default-application\n * parse parent.parse (frontmatter shape stays compatible)\n *\n * Tightening monotonicity is verified by-field: pattern subset\n * (cheap heuristic — full regex-language inclusion is undecidable),\n * enum subset (set membership), minLength/minimum ≥, maxLength/maximum ≤.\n *\n * For `extends: none`, `parent` is null/undefined and the extension\n * acts as a root doctype: the `add_fields` becomes its full schema,\n * `path_convention` is required (no parent fallback).\n */\nexport function specFromExtension(extension, opts = {}) {\n const { parent } = opts;\n const isRoot = extension.extends === \"none\";\n if (!isRoot && !parent) {\n throw new Error(`specFromExtension (AIP-40): extension '${extension.slug}' extends '${extension.extends}' but no parent spec was provided in opts.parent`);\n }\n if (isRoot && !extension.path_convention) {\n throw new Error(`specFromExtension (AIP-40): extension '${extension.slug}' is a root doctype (extends: none) and MUST declare path_convention`);\n }\n // Tightening monotonicity check — see Specification §\"Composition rules\" #3.\n if (parent && extension.tighten) {\n verifyTightening(extension, parent);\n }\n const slugName = extension.slug.split(\":\")[1] ?? extension.slug;\n const pathTemplate = extension.path_convention ?? null;\n // Keys the extension is authoritative over — anything declared in\n // `add_fields.properties`. Computed once at spec-composition time so\n // the per-call `define` is a hot-path lookup, not a re-derivation.\n const extensionKeys = new Set(Object.keys(extension.add_fields?.properties ?? {}));\n const define = (params) => {\n // Layered defaults: parent defaults are baked into parent.define;\n // extension defaults apply on top, only for keys the user omitted.\n const withDefaults = { ...params };\n if (extension.defaults) {\n for (const [key, value] of Object.entries(extension.defaults)) {\n if (withDefaults[key] === undefined && value !== undefined) {\n withDefaults[key] = value;\n }\n }\n }\n if (isRoot) {\n // Root doctype — no parent.define to delegate to. Return the\n // params verbatim, frozen. (A more disciplined runtime would\n // compile the add_fields schema to zod and validate; deferred\n // because root doctypes are rare and the manifest layer's\n // schema-level zod catches malformed input.)\n return Object.freeze(withDefaults);\n }\n // Split params before delegating: parent specs typically validate\n // through `zod.strict()` (e.g. AIP-42 `agentFrontmatterSchema`),\n // which rejects extension-owned keys as \"Unrecognized\". Hand the\n // parent only what it owns, then re-attach extension fields onto\n // the resulting handle. Extension-side validation of these fields\n // is the manifest layer's responsibility (compiled from\n // `add_fields` JSON Schema at parse time); the runtime trusts\n // input it received via that path.\n const parentOnly = {};\n const extensionOnly = {};\n for (const [key, value] of Object.entries(withDefaults)) {\n if (extensionKeys.has(key))\n extensionOnly[key] = value;\n else\n parentOnly[key] = value;\n }\n const parentHandle = parent.define(parentOnly);\n return Object.freeze({\n ...parentHandle,\n ...extensionOnly,\n });\n };\n const parse = isRoot ? rootParse(extension) : parent.parse;\n const pathOf = (handle) => {\n if (pathTemplate) {\n return resolvePathTemplate(pathTemplate, handle, slugName);\n }\n return parent.pathOf(handle);\n };\n return {\n name: extension.slug,\n aip: 40,\n schemaLiteral: parent?.schemaLiteral ?? `agentproto/extension/v1`,\n pathOf,\n define,\n parse,\n };\n}\nfunction verifyTightening(extension, parent) {\n // Best-effort: the manifest layer doesn't expose the parent's raw\n // JSON Schema, so we can only verify what the spec ships in\n // `extension.tighten` against itself for self-consistency. Full\n // parent-vs-extension monotonicity verification belongs to a future\n // version once parent specs expose `schema:` introspection.\n const t = extension.tighten ?? {};\n for (const [field, override] of Object.entries(t)) {\n if (typeof override.minLength === \"number\" &&\n typeof override.maxLength === \"number\" &&\n override.minLength > override.maxLength) {\n throw new Error(`specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: minLength (${override.minLength}) > maxLength (${override.maxLength})`);\n }\n if (typeof override.minimum === \"number\" &&\n typeof override.maximum === \"number\" &&\n override.minimum > override.maximum) {\n throw new Error(`specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: minimum (${override.minimum}) > maximum (${override.maximum})`);\n }\n if (override.enum !== undefined && !Array.isArray(override.enum)) {\n throw new Error(`specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: enum must be an array`);\n }\n }\n}\nfunction rootParse(extension) {\n return (source) => {\n // Root doctypes don't have a parent parser — fall back to bare\n // gray-matter. The manifest layer applies `define` afterwards.\n // We don't import gray-matter here to keep this module dependency-\n // light; the caller wires their own parse if they really want a\n // root doctype, or uses the standard parse from a sibling package.\n void source;\n void extension;\n throw new Error(`specFromExtension (AIP-40): extension '${extension.slug}' is a root doctype — supply your own parser or extend a public AIP for parser inheritance`);\n };\n}\nfunction resolvePathTemplate(template, handle, doctypeSlug) {\n // Tokens supported in v1: <slug> (the doctype's identity field —\n // tries id, slug, name in that order) and <DOCTYPE> (uppercase\n // version of the extension's slug name part, e.g. \"DEAL\").\n const identity = (typeof handle.id === \"string\" && handle.id) ||\n (typeof handle.slug === \"string\" && handle.slug) ||\n (typeof handle.name === \"string\" && handle.name) ||\n \"unknown\";\n return template\n .replace(/<slug>/g, identity)\n .replace(/<DOCTYPE>/g, doctypeSlug.toUpperCase());\n}\n","/**\n * AIP-40 EXTENSION.md sidecar parser + manifest-to-handle constructor.\n *\n * Mirror of `@agentproto/tool/manifest` and `@agentproto/driver/manifest`:\n * the .md provides metadata; the TS module supplies any spec-specific\n * runtime bits (schemas, execute bodies, …) that can't live in\n * frontmatter. Both inputs end up in `defineExtension` so the cross-AIP\n * invariants run uniformly.\n *\n *\n * The frontmatter zod schema below was generated from\n * `resources/aip-40/draft/EXTENSION.schema.json` via json-schema-to-zod.\n * Re-run scaffold-aip to refresh after spec changes (or hand-tune\n * any constraint the converter doesn't capture cleanly).\n */\nimport matter from \"gray-matter\";\nimport { extensionFrontmatterSchema } from \"../schema.js\";\nimport { defineExtension } from \"../define-extension.js\";\n// Re-export so consumers can import the schema + inferred type either\n// from \"@@agentproto/extension/manifest\" or directly from \"@@agentproto/extension/schema\".\nexport { extensionFrontmatterSchema };\nexport function parseExtensionManifest(source) {\n const parsed = matter(source);\n if (Object.keys(parsed.data).length === 0) {\n throw new Error(\"parseExtensionManifest: missing or empty frontmatter\");\n }\n const result = extensionFrontmatterSchema.safeParse(parsed.data);\n if (!result.success) {\n throw new Error(`parseExtensionManifest: invalid frontmatter — ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`);\n }\n return { frontmatter: result.data, body: parsed.content };\n}\nexport function extensionFromManifest(manifest) {\n // The zod-validated frontmatter is structurally compatible with\n // ExtensionDefinition; the cast pins the typing once the manifest\n // schema and the TS interface diverge (e.g. handle has frozen fields\n // a literal config doesn't carry yet).\n return defineExtension(manifest.frontmatter);\n}\n","/**\n * @agentproto/mcp-server — exposes AIP doctype verbs as MCP tools.\n *\n * Hand a list of `DoctypeSpec` instances (one per registered AIP) and\n * optionally a workspace dir; the server registers\n * `create_<name> / load_<name> / list_<name> / update_<name> /\n * resolve_<name> / delete_<name>` for each spec, including AIP-40\n * extensions auto-loaded from `<workspace>/extensions/<slug>/EXTENSION.md`.\n *\n * Two ways to run it:\n * 1. **Embedded** — call `createMcpServer({ specs, workspace })` and\n * attach to your own transport (stdio, websocket, …).\n * 2. **Standalone** — `runStdioServer({ specs, workspace })` wires\n * stdio for you. Useful as a `mcp_servers.<id>` config entry on\n * Claude Desktop / Cursor / any MCP host.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\"\nimport { z } from \"zod\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { isAbsolute, join, resolve } from \"node:path\"\nimport { createVerbs, type DoctypeSpec } from \"@agentproto/manifest\"\nimport {\n parseExtensionManifest,\n specFromExtension,\n} from \"@agentproto/extension\"\n\n// `RegisterableSpec<TParams, THandle>` is just `DoctypeSpec` plus the\n// constraint that callers passing different generics across the array\n// must type-erase via `as unknown as DoctypeSpec<...>` at the boundary.\n// We don't try to express the heterogeneous list in TS — same trick\n// `@agentproto/driver`'s `implementations[]` uses.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySpec = DoctypeSpec<any, any>\n\nexport interface CreateMcpServerOptions {\n /** Doctype specs registered as MCP tools. One per AIP. */\n specs: readonly AnySpec[]\n /**\n * Optional workspace dir. If provided, the server scans\n * `<workspace>/extensions/` for `EXTENSION.md` files and registers\n * each as a local doctype. The parent of each extension is resolved\n * by matching the extension's `extends:` field (`aip-N`) against\n * `specs.find(s => s.aip === N)` — so the spec list MUST include the\n * parents the extensions reference, else loading throws.\n */\n workspace?: string\n /** Server name advertised over MCP. Default `agentproto-mcp-server`. */\n name?: string\n /** Server version advertised over MCP. Default `0.1.0-alpha`. */\n version?: string\n}\n\nexport interface CreateMcpServerResult {\n /** The wired McpServer; attach a transport to start serving. */\n server: McpServer\n /**\n * The list of doctype names the server registered tools for —\n * useful for tests + diagnostics. Includes any extensions loaded\n * from `workspace/extensions/`.\n */\n registered: readonly string[]\n}\n\nexport async function createMcpServer(\n opts: CreateMcpServerOptions,\n): Promise<CreateMcpServerResult> {\n const server = new McpServer({\n name: opts.name ?? \"agentproto-mcp-server\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n\n const allSpecs: AnySpec[] = [...opts.specs]\n\n // Load extensions when a workspace is given.\n if (opts.workspace) {\n const extensions = await loadExtensions(opts.workspace, opts.specs)\n allSpecs.push(...extensions)\n }\n\n // Path-anchoring: when a workspace is set, resolve all relative\n // dir/path arguments against it. Agents pass logical paths like\n // \"tools\" or \"tools/echo/TOOL.md\"; the server pins them to the\n // workspace so they don't leak into process.cwd() (which is\n // wherever the host happened to spawn the server).\n const anchor = (p: string): string =>\n isAbsolute(p) || !opts.workspace ? p : join(opts.workspace, p)\n\n for (const spec of allSpecs) {\n registerVerbs(server, spec, anchor)\n }\n\n return {\n server,\n registered: allSpecs.map((s) => s.name),\n }\n}\n\n/**\n * Wire `createMcpServer` to stdio for use as an `mcp_servers.<id>`\n * entry on Claude Desktop / Cursor / etc. Resolves once the\n * transport closes.\n */\nexport async function runStdioServer(\n opts: CreateMcpServerOptions,\n): Promise<void> {\n const { server } = await createMcpServer(opts)\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n\n// ── verb registration ───────────────────────────────────────────────\n\nfunction registerVerbs(\n server: McpServer,\n spec: AnySpec,\n anchor: (p: string) => string,\n): void {\n const verbs = createVerbs(spec)\n // Tool name uses snake_case to match MCP convention; spec.name may\n // be kebab (driver-cli) or namespaced (acme:deal). Map all to snake.\n const verbName = (verb: string) =>\n `${verb}_${spec.name.replace(/[-:]/g, \"_\")}`\n const description = (verb: string, body: string) =>\n `${verb} the AIP-${spec.aip} ${spec.name} doctype. ${body}`\n\n // create\n server.tool(\n verbName(\"create\"),\n description(\n \"create\",\n \"Author a new manifest from params. Returns { path, rendered }.\",\n ),\n {\n params: z\n .record(z.string(), z.unknown())\n .describe(`The ${spec.name} definition fields.`),\n dir: z.string().describe(\"Workspace-relative or absolute target directory.\"),\n body: z\n .string()\n .optional()\n .describe(\"Markdown body after the frontmatter. Defaults to a stub.\"),\n dryRun: z\n .boolean()\n .optional()\n .describe(\"Render only — don't write to disk.\"),\n },\n async ({ params, dir, body, dryRun }) => {\n const result = await verbs.create(params, {\n dir: anchor(dir),\n body,\n dryRun,\n })\n return contentText({\n path: result.path,\n rendered: result.rendered,\n })\n },\n )\n\n // load\n server.tool(\n verbName(\"load\"),\n description(\"load\", \"Read a manifest from disk. Returns the parsed handle.\"),\n {\n path: z.string().describe(\"Absolute or workspace-relative path to the .md file.\"),\n },\n async ({ path }) => {\n const result = await verbs.load(anchor(path))\n return contentText({ path: result.path, handle: result.handle })\n },\n )\n\n // list\n server.tool(\n verbName(\"list\"),\n description(\n \"list\",\n \"Walk a directory tree and return all manifests of this doctype.\",\n ),\n {\n dir: z.string().describe(\"Directory to walk.\"),\n skipDirs: z\n .array(z.string())\n .optional()\n .describe(\"Subdir names to skip (default: node_modules, .git, dist).\"),\n },\n async ({ dir, skipDirs }) => {\n const handles = await verbs.list(anchor(dir), { skipDirs })\n return contentText({ count: handles.length, handles })\n },\n )\n\n // update\n server.tool(\n verbName(\"update\"),\n description(\n \"update\",\n \"Patch an existing manifest. The patch is shallow-merged into the existing params.\",\n ),\n {\n path: z.string().describe(\"Path to the manifest to update.\"),\n patch: z\n .record(z.string(), z.unknown())\n .describe(\"Partial fields to merge into the existing manifest.\"),\n body: z.string().optional().describe(\"New body markdown (default: keep existing).\"),\n },\n async ({ path, patch, body }) => {\n const result = await verbs.update(\n anchor(path),\n (existing: Record<string, unknown>) => ({ ...existing, ...patch }),\n { body },\n )\n return contentText({ path: result.path, rendered: result.rendered })\n },\n )\n\n // resolve\n server.tool(\n verbName(\"resolve\"),\n description(\n \"resolve\",\n \"Resolve an inline | ref | file block to a fully-typed handle.\",\n ),\n {\n block: z\n .union([\n z.object({ inline: z.record(z.string(), z.unknown()) }),\n z.object({ ref: z.string() }),\n z.object({ file: z.string() }),\n ])\n .describe(\"The composition block.\"),\n baseDir: z\n .string()\n .optional()\n .describe(\"Base dir for `file:` references.\"),\n },\n async ({ block, baseDir }) => {\n const handle = await verbs.resolve(block, {\n baseDir: baseDir ? anchor(baseDir) : undefined,\n })\n return contentText({ handle })\n },\n )\n\n // delete\n server.tool(\n verbName(\"delete\"),\n description(\"delete\", \"Remove a manifest file from disk.\"),\n {\n path: z.string().describe(\"Path to the manifest to delete.\"),\n },\n async ({ path }) => {\n const target = anchor(path)\n await verbs.delete(target)\n return contentText({ deleted: target })\n },\n )\n}\n\n// ── extension loader ────────────────────────────────────────────────\n\nasync function loadExtensions(\n workspace: string,\n specs: readonly AnySpec[],\n): Promise<AnySpec[]> {\n const extDir = resolve(workspace, \"extensions\")\n if (!existsSync(extDir)) return []\n\n const out: AnySpec[] = []\n const { readdir } = await import(\"node:fs/promises\")\n type SimpleDirent = { name: string; isDirectory(): boolean }\n\n let entries: SimpleDirent[]\n try {\n entries = (await readdir(extDir, {\n withFileTypes: true,\n })) as unknown as SimpleDirent[]\n } catch {\n return out\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n const manifestPath = join(extDir, String(entry.name), \"EXTENSION.md\")\n if (!existsSync(manifestPath)) continue\n\n const source = await readFile(manifestPath, \"utf8\")\n const parsed = parseExtensionManifest(source)\n const ext = parsed.frontmatter\n\n let parent: AnySpec | undefined\n if (ext.extends && ext.extends !== \"none\") {\n const aipMatch = ext.extends.match(/^aip-(\\d+)$/)\n if (!aipMatch) {\n throw new Error(\n `mcp-server: extension '${ext.slug}' has invalid extends '${ext.extends}'`,\n )\n }\n const parentAip = Number(aipMatch[1])\n parent = specs.find((s) => s.aip === parentAip)\n if (!parent) {\n throw new Error(\n `mcp-server: extension '${ext.slug}' extends aip-${parentAip}, but no spec for that AIP was registered. Pass the parent spec in opts.specs.`,\n )\n }\n }\n\n out.push(specFromExtension(ext, { parent }) as AnySpec)\n }\n\n return out\n}\n\n// ── tool result helpers ─────────────────────────────────────────────\n\nfunction contentText(payload: unknown): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(payload, null, 2),\n },\n ],\n }\n}\n","/**\n * `.agentproto/` config dir — runtime-managed state at the root of\n * every workspace. Mirrors the `.git/` model: user-content stays at\n * the workspace root (HEARTBEAT.md, conversations/, .agents/) while\n * everything the runtime owns lives in `<workspace>/.agentproto/`.\n *\n * What goes here today:\n * - `runtime.json` — boot-time snapshot of the live config (PID,\n * port, resolved workspace, MCP server name, startedAt). Useful\n * for `cat .agentproto/runtime.json` diagnostics + future tooling\n * that wants to discover a running gateway from disk.\n *\n * What does NOT go here:\n * - HEARTBEAT.md — user-edited content\n * - conversations/ — user-readable chat history\n * - .agents/ — user-authored manifests\n *\n * The `.agentproto/` dir is safe to gitignore. The `runtime.json`\n * file contains a per-boot bearer token used to gate mutating HTTP\n * routes (POST /sessions/*, WS /sessions/:id/pty). The token lives\n * in RAM + on disk only — never logged. File mode 0600 below; only\n * processes running as the workspace user (and the daemon itself)\n * can read it. A browser-loaded localhost page CAN'T read this file,\n * which is what defends against the localhost-DNS-rebinding drive-by\n * spawn vector.\n */\n\nimport { mkdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\n\nexport interface RuntimeMeta {\n /** Absolute path to the workspace root the gateway is bound to. */\n workspace: string\n /** HTTP listener port. */\n port: number\n /** HTTP bind address (loopback or `0.0.0.0`). */\n bind: string\n /** Process id of the running gateway. */\n pid: number\n /** Wall-clock ISO timestamp at boot. */\n startedAt: string\n /** MCP server name advertised in the initialize handshake. */\n name: string\n /** AIP doctype names + extensions registered as MCP CRUD tools. */\n registered: readonly string[]\n /**\n * Per-boot bearer token. Required on mutating routes (POST\n * /sessions/*, POST /sessions/:id/kill, DELETE /sessions/:id, and\n * WS upgrade to /sessions/:id/pty). Random uuid generated at boot\n * by createGateway; regenerated each restart.\n */\n token: string\n}\n\n/**\n * Create `<workspace>/.agentproto/` (idempotent) and write the\n * `runtime.json` snapshot. Errors are logged but non-fatal — losing\n * the meta file shouldn't crash the gateway, the runtime is still\n * fully functional without it.\n */\nexport async function writeRuntimeMeta(\n workspace: string,\n meta: RuntimeMeta,\n): Promise<void> {\n const dir = join(workspace, \".agentproto\")\n try {\n await mkdir(dir, { recursive: true })\n // mode 0600 so other local users can't read the bearer token.\n await writeFile(\n join(dir, \"runtime.json\"),\n JSON.stringify(meta, null, 2) + \"\\n\",\n { encoding: \"utf8\", mode: 0o600 },\n )\n } catch (err) {\n console.error(\"[runtime] failed to write .agentproto/runtime.json:\", err)\n }\n}\n\n/**\n * Delete `<workspace>/.agentproto/runtime.json`. Best-effort — called\n * from the daemon's graceful shutdown path so a CLI looking for the\n * live daemon doesn't pick up a stale token after this process exits.\n * Missing file is a no-op (the daemon may never have written one).\n */\nexport async function unlinkRuntimeMeta(workspace: string): Promise<void> {\n try {\n await unlink(join(workspace, \".agentproto\", \"runtime.json\"))\n } catch {\n // ENOENT / permission — not worth surfacing on shutdown.\n }\n}\n\n/**\n * Read a runtime.json from `<workspace>/.agentproto/`. Returns the\n * parsed object (no validation) plus the on-disk mtime, or null when\n * the file is missing / unreadable / malformed.\n */\nexport async function readRuntimeMeta(workspace: string): Promise<{\n meta: Partial<RuntimeMeta> & Record<string, unknown>\n mtime: Date\n} | null> {\n const path = join(workspace, \".agentproto\", \"runtime.json\")\n try {\n const [raw, st] = await Promise.all([readFile(path, \"utf8\"), stat(path)])\n const meta = JSON.parse(raw) as Record<string, unknown>\n return { meta, mtime: st.mtime }\n } catch {\n return null\n }\n}\n\n/**\n * For each `workspace` path, check whether its runtime.json points\n * at a now-dead PID; if so, delete it. Returns the list of paths\n * that were cleaned. Called by `agentproto serve` at boot to keep\n * the discovery layer's view of \"live daemons\" honest — a stale\n * file with the same port as the new daemon is the classic source\n * of `sessions_unauthorized` 401s.\n *\n * Skips the running daemon's own workspace (passed in as\n * `currentWorkspace`) since that file is OURS to write.\n */\nexport async function sweepStaleRuntimeMetas(\n workspaces: readonly string[],\n currentWorkspace: string,\n): Promise<string[]> {\n const cleaned: string[] = []\n for (const ws of workspaces) {\n if (ws === currentWorkspace) continue\n const meta = await readRuntimeMeta(ws)\n if (!meta) continue\n const pid = meta.meta.pid\n if (typeof pid === \"number\" && !isPidAlive(pid)) {\n try {\n await unlink(join(ws, \".agentproto\", \"runtime.json\"))\n cleaned.push(join(ws, \".agentproto\", \"runtime.json\"))\n } catch {\n // ignore — best-effort\n }\n }\n }\n return cleaned\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code\n if (code === \"EPERM\") return true // exists, foreign user\n return false\n }\n}\n","/**\n * Shell-execution MCP tools for the runtime.\n *\n * The runtime is a remote shell as far as cloud agents are concerned —\n * the workspace lives on the user's machine, so the only place a\n * `claude -p`, `gh pr view`, `pnpm test` etc. can actually run *is*\n * the user's machine. This module exposes one MCP tool,\n * `execute_command`, that any MCP client (cloud Guilde Blake,\n * Claude Code as a sub-agent, …) can call to spawn a subprocess.\n *\n * ## Allowlist\n *\n * Default-deny. The runtime reads\n * `<workspace>/.agentproto/allowed-commands.json` on every call (cheap\n * stat; cached for 1s) for the list of allowed command basenames.\n * Missing / empty file ⇒ no commands run. The error message points the\n * user at the file path so they know exactly where to opt in.\n *\n * Allowlist file shape:\n * { \"version\": 1, \"commands\": [\"claude\", \"gh\", \"pnpm\", \"node\"] }\n *\n * Match is by command BASENAME (`/usr/local/bin/claude` → `claude`)\n * to keep the allowlist short and not break when users have multiple\n * binaries on their PATH.\n *\n * ## Safety notes\n *\n * - We use `spawn()` with `shell: false` so arguments are passed\n * verbatim — no shell interpolation surprises.\n * - `cwd` is anchored to the workspace root via the same path-escape\n * guard used by `fs-tools.ts`. Callers can't run a subprocess in\n * `/etc` unless they also bind-mounted it inside the workspace.\n * - Every spawn has a `timeoutMs` cap (default 60s, max 600s). Hung\n * subprocesses can't pin the runtime forever.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { existsSync } from \"node:fs\"\nimport { readFile, stat } from \"node:fs/promises\"\nimport {\n basename,\n isAbsolute,\n join,\n normalize,\n relative,\n resolve,\n} from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nconst DEFAULT_TIMEOUT_MS = 60_000\nconst MAX_TIMEOUT_MS = 600_000\nconst ALLOWLIST_REL = \".agentproto/allowed-commands.json\"\n\nexport interface RegisterCommandToolsOptions {\n workspace: string\n}\n\ninterface AllowlistFile {\n version?: number\n commands?: string[]\n}\n\ninterface AllowlistCacheEntry {\n mtimeMs: number\n commands: Set<string>\n}\n\nlet allowlistCache: { path: string; entry: AllowlistCacheEntry } | null = null\n\nasync function loadAllowlist(workspace: string): Promise<Set<string>> {\n const path = resolve(workspace, ALLOWLIST_REL)\n if (!existsSync(path)) {\n allowlistCache = null\n return new Set()\n }\n try {\n const s = await stat(path)\n if (\n allowlistCache &&\n allowlistCache.path === path &&\n allowlistCache.entry.mtimeMs === s.mtimeMs\n ) {\n return allowlistCache.entry.commands\n }\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as AllowlistFile\n const list = Array.isArray(parsed.commands) ? parsed.commands : []\n const commands = new Set(\n list\n .filter((x): x is string => typeof x === \"string\" && x.length > 0)\n .map(x => x.trim()),\n )\n allowlistCache = { path, entry: { mtimeMs: s.mtimeMs, commands } }\n return commands\n } catch (err) {\n // Bad JSON / unreadable file ⇒ deny all and surface in the error\n // the next caller gets. Don't poison the cache.\n console.error(\n `[runtime] failed to load ${ALLOWLIST_REL} (will deny all):`,\n err,\n )\n allowlistCache = null\n return new Set()\n }\n}\n\nfunction makeCwdAnchor(workspace: string): (input: string | undefined) => string {\n const root = resolve(workspace)\n return (input?: string) => {\n if (!input || input.length === 0) return root\n const candidate = isAbsolute(input)\n ? normalize(input)\n : normalize(join(root, input))\n const rel = relative(root, candidate)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new Error(\n `cwd escapes the workspace: '${input}' (workspace=${root})`,\n )\n }\n return candidate\n }\n}\n\nexport interface ExecuteResult {\n exitCode: number\n signal: string | null\n stdout: string\n stderr: string\n truncated?: boolean\n durationMs: number\n}\n\n/**\n * Register `execute_command` on the given MCP server. The tool returns\n * a JSON-encoded `ExecuteResult` as a single text content item — that\n * matches the response shape `@modelcontextprotocol/server-filesystem`\n * uses for `read_file` and friends, so the existing\n * `parseReadFileResponse`-style parsers in workspace-providers can\n * decode it without bespoke logic.\n */\nexport function registerCommandTools(\n server: McpServer,\n opts: RegisterCommandToolsOptions,\n): void {\n const anchorCwd = makeCwdAnchor(opts.workspace)\n\n server.tool(\n \"execute_command\",\n \"Run a shell command on the host running the runtime. The command basename must be in `<workspace>/.agentproto/allowed-commands.json`; default-deny otherwise. Captures stdout / stderr / exit code and returns them as JSON. Use this to drive local CLIs (Claude Code, gh, pnpm, …) from a remote agent.\",\n {\n command: z\n .string()\n .min(1)\n .describe(\n \"Executable name or absolute path. Must be allowlisted by basename in the workspace's allowed-commands.json.\",\n ),\n args: z\n .array(z.string())\n .optional()\n .describe(\n \"Argv array. Passed verbatim — no shell expansion (we spawn with shell:false so quoting doesn't bite).\",\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Working directory, workspace-relative or an absolute path inside the workspace. Defaults to the workspace root.\",\n ),\n stdin: z\n .string()\n .optional()\n .describe(\"Optional input piped to the process's stdin.\"),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .max(MAX_TIMEOUT_MS)\n .optional()\n .describe(\n `Hard kill after this many ms. Defaults to ${DEFAULT_TIMEOUT_MS}; capped at ${MAX_TIMEOUT_MS}.`,\n ),\n },\n async ({ command, args, cwd, stdin, timeoutMs }) => {\n const allowlist = await loadAllowlist(opts.workspace)\n const baseName = basename(command)\n if (!allowlist.has(baseName)) {\n const allowed = [...allowlist].sort().join(\", \") || \"(empty)\"\n throw new Error(\n `command '${baseName}' is not in the allowlist. ` +\n `Add it to ${join(opts.workspace, ALLOWLIST_REL)} ` +\n `under \"commands\": [...]. Currently allowed: ${allowed}.`,\n )\n }\n const resolvedCwd = anchorCwd(cwd)\n const limit = Math.min(timeoutMs ?? DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS)\n const result = await runCommand({\n command,\n args: args ?? [],\n cwd: resolvedCwd,\n stdin,\n timeoutMs: limit,\n })\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(result) }],\n }\n },\n )\n}\n\ninterface RunCommandInput {\n command: string\n args: string[]\n cwd: string\n stdin?: string\n timeoutMs: number\n}\n\nconst STREAM_BUFFER_CAP = 1_048_576 // 1 MiB per stream\n\nasync function runCommand(input: RunCommandInput): Promise<ExecuteResult> {\n return new Promise<ExecuteResult>(resolvePromise => {\n const startedAt = Date.now()\n const child = spawn(input.command, input.args, {\n cwd: input.cwd,\n shell: false,\n // Inherit user env so PATH lookups for `claude`, `gh`, etc. work.\n env: process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n })\n\n let stdout = \"\"\n let stderr = \"\"\n let truncated = false\n let timedOut = false\n\n function appendCapped(buf: string, chunk: Buffer): string {\n if (buf.length >= STREAM_BUFFER_CAP) {\n truncated = true\n return buf\n }\n const room = STREAM_BUFFER_CAP - buf.length\n const text = chunk.toString(\"utf8\")\n if (text.length > room) {\n truncated = true\n return buf + text.slice(0, room)\n }\n return buf + text\n }\n child.stdout?.on(\"data\", d => {\n stdout = appendCapped(stdout, d)\n })\n child.stderr?.on(\"data\", d => {\n stderr = appendCapped(stderr, d)\n })\n\n if (input.stdin) {\n child.stdin?.write(input.stdin)\n }\n child.stdin?.end()\n\n const timer = setTimeout(() => {\n timedOut = true\n // SIGTERM first; the close handler resolves either way. Ignore\n // EPERM if the child is already gone.\n try {\n child.kill(\"SIGTERM\")\n } catch {\n /* noop */\n }\n // Hard kill 2s later if it hasn't exited.\n setTimeout(() => {\n try {\n child.kill(\"SIGKILL\")\n } catch {\n /* noop */\n }\n }, 2_000).unref()\n }, input.timeoutMs)\n timer.unref()\n\n child.on(\"error\", err => {\n clearTimeout(timer)\n // spawn errors (ENOENT, EACCES) become exitCode -1 with the\n // message in stderr — the JSON shape stays consistent.\n resolvePromise({\n exitCode: -1,\n signal: null,\n stdout,\n stderr: stderr + (stderr ? \"\\n\" : \"\") + (err as Error).message,\n truncated,\n durationMs: Date.now() - startedAt,\n })\n })\n child.on(\"close\", (code, signal) => {\n clearTimeout(timer)\n resolvePromise({\n exitCode: typeof code === \"number\" ? code : -1,\n signal: signal ?? (timedOut ? \"SIGTERM-timeout\" : null),\n stdout,\n stderr,\n truncated,\n durationMs: Date.now() - startedAt,\n })\n })\n })\n}\n","/**\n * Append-only conversation persistence as plain markdown.\n *\n * Each conversation is a file at `<workspace>/conversations/<id>.md`\n * with a frontmatter header (`schema: conversation/v1`, `id`, `agent`,\n * `started`, `status`) and a body composed of `## <role> — <iso>`\n * blocks. Append-only: turns are concatenated to the body, never\n * rewritten in place. Readers tolerant to clock skew use the timestamp\n * in each block, not file mtime.\n *\n * The format is intentionally trivial — git-diffable, human-editable,\n * survives `cat`. Designed to converge with the AIP runtime/v1 spec\n * (TBD) once it lands.\n */\n\nimport { existsSync } from \"node:fs\"\nimport { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\n\nconst FRONTMATTER_RE = /^---\\n([\\s\\S]*?)\\n---\\n/\n\nexport type ConvRole = \"user\" | \"assistant\" | \"system\"\n\nexport interface ConversationMeta {\n id: string\n agent: string\n started: string\n status: \"open\" | \"closed\"\n}\n\nexport interface ConversationTurn {\n role: ConvRole\n at: string\n /** Optional sub-attribution after the role (e.g. agent id). */\n attribution?: string\n content: string\n}\n\nexport interface ConversationStore {\n /**\n * Open a conversation. If the file doesn't exist, it's created with\n * a frontmatter header. If it exists, no-op (idempotent).\n */\n open(id: string, meta: { agent: string }): Promise<void>\n appendTurn(\n id: string,\n role: ConvRole,\n content: string,\n opts?: { attribution?: string; at?: string },\n ): Promise<void>\n read(\n id: string,\n ): Promise<{ meta: ConversationMeta; turns: ConversationTurn[] }>\n list(): Promise<Array<{ id: string; meta: ConversationMeta }>>\n /** Workspace-relative path to the conv file, for tooling. */\n pathFor(id: string): string\n}\n\nexport interface FileConversationStoreOptions {\n /** Absolute workspace root. */\n workspace: string\n /** Override `<workspace>/conversations`. */\n dir?: string\n}\n\nexport function fileConversationStore(\n opts: FileConversationStoreOptions,\n): ConversationStore {\n const dir = opts.dir ?? join(opts.workspace, \"conversations\")\n\n const filePath = (id: string) => join(dir, `${id}.md`)\n\n return {\n pathFor: filePath,\n\n async open(id, meta) {\n await mkdir(dir, { recursive: true })\n const path = filePath(id)\n if (existsSync(path)) return\n const header = renderHeader({\n id,\n agent: meta.agent,\n started: new Date().toISOString(),\n status: \"open\",\n })\n await writeFile(path, header, \"utf8\")\n },\n\n async appendTurn(id, role, content, options) {\n const path = filePath(id)\n // Lazy-open: if a caller appends without opening, create the\n // file so the operation never silently drops a turn.\n if (!existsSync(path)) {\n await this.open(id, { agent: options?.attribution ?? \"unknown\" })\n }\n const block = renderTurn({\n role,\n at: options?.at ?? new Date().toISOString(),\n attribution: options?.attribution,\n content,\n })\n // Append a leading blank line so the new block is always\n // separated from whatever's above (header or prev turn).\n await writeFile(path, block, { encoding: \"utf8\", flag: \"a\" })\n },\n\n async read(id) {\n const path = filePath(id)\n const source = await readFile(path, \"utf8\")\n return parseConversation(source, id)\n },\n\n async list() {\n if (!existsSync(dir)) return []\n const entries = await readdir(dir, { withFileTypes: true })\n const out: Array<{ id: string; meta: ConversationMeta }> = []\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".md\")) continue\n const id = entry.name.slice(0, -3)\n try {\n const source = await readFile(join(dir, entry.name), \"utf8\")\n const { meta } = parseConversation(source, id)\n out.push({ id, meta })\n } catch {\n // Skip malformed conv files rather than crash list().\n }\n }\n return out\n },\n }\n}\n\n// ── render ───────────────────────────────────────────────────────────\n\nfunction renderHeader(meta: ConversationMeta): string {\n return [\n \"---\",\n `schema: conversation/v1`,\n `id: ${meta.id}`,\n `agent: ${meta.agent}`,\n `started: ${meta.started}`,\n `status: ${meta.status}`,\n \"---\",\n \"\",\n \"\",\n ].join(\"\\n\")\n}\n\nfunction renderTurn(turn: ConversationTurn): string {\n const heading = turn.attribution\n ? `## ${turn.role} — ${turn.at} (${turn.attribution})`\n : `## ${turn.role} — ${turn.at}`\n return `${heading}\\n\\n${turn.content.trimEnd()}\\n\\n`\n}\n\n// ── parse ────────────────────────────────────────────────────────────\n\ninterface ParsedConversation {\n meta: ConversationMeta\n turns: ConversationTurn[]\n}\n\nfunction parseConversation(source: string, fallbackId: string): ParsedConversation {\n const match = source.match(FRONTMATTER_RE)\n let meta: ConversationMeta = {\n id: fallbackId,\n agent: \"unknown\",\n started: \"\",\n status: \"open\",\n }\n let body = source\n if (match) {\n meta = parseFrontmatter(match[1] ?? \"\", fallbackId)\n body = source.slice(match[0].length)\n }\n\n const turns: ConversationTurn[] = []\n // Split on `## <role> — <iso>` headings. Conservative — anything\n // that doesn't match is treated as continuation of the prior turn.\n const lines = body.split(\"\\n\")\n let current: ConversationTurn | null = null\n let buffer: string[] = []\n\n const flush = () => {\n if (!current) return\n current.content = buffer.join(\"\\n\").trim()\n turns.push(current)\n current = null\n buffer = []\n }\n\n const headingRe =\n /^##\\s+(user|assistant|system)\\s+—\\s+(\\S+)(?:\\s+\\(([^)]+)\\))?\\s*$/\n\n for (const line of lines) {\n const m = line.match(headingRe)\n if (m) {\n flush()\n current = {\n role: m[1] as ConvRole,\n at: m[2] ?? \"\",\n attribution: m[3],\n content: \"\",\n }\n continue\n }\n if (current) buffer.push(line)\n }\n flush()\n\n return { meta, turns }\n}\n\nfunction parseFrontmatter(\n raw: string,\n fallbackId: string,\n): ConversationMeta {\n const out: Record<string, string> = {}\n for (const line of raw.split(\"\\n\")) {\n const colon = line.indexOf(\":\")\n if (colon < 1) continue\n const key = line.slice(0, colon).trim()\n const value = line.slice(colon + 1).trim()\n out[key] = value\n }\n return {\n id: out.id ?? fallbackId,\n agent: out.agent ?? \"unknown\",\n started: out.started ?? \"\",\n status: (out.status === \"closed\" ? \"closed\" : \"open\"),\n }\n}\n","/**\n * In-process event bus for the runtime gateway. Anything the daemon\n * does that an external observer might want to watch (heartbeat fired,\n * conversation turn appended, boot completed, …) flows through here.\n *\n * The HTTP server's `/events` SSE stream subscribes to it and forwards\n * each event as a `data: <json>\\n\\n` frame. Tests and embedded usage\n * subscribe directly via `events.on()`.\n */\n\nimport { EventEmitter } from \"node:events\"\n\nexport interface BootEvent {\n type: \"boot\"\n at: string\n workspace: string\n registered: readonly string[]\n}\n\nexport interface HeartbeatFiredEvent {\n type: \"heartbeat-fired\"\n at: string\n agent: string\n conversationId: string\n prompt: string\n reply: string\n durationMs: number\n}\n\nexport interface HeartbeatErrorEvent {\n type: \"heartbeat-error\"\n at: string\n agent?: string\n error: string\n}\n\nexport interface ConvTurnEvent {\n type: \"conv-turn-appended\"\n at: string\n conversationId: string\n role: \"user\" | \"assistant\"\n contentPreview: string\n}\n\n/**\n * One log line from a supervised tunnel provider (cloudflared today).\n * Surfaced verbatim so users can debug \"why didn't my remote URL come\n * up\" by tailing /events.\n */\nexport interface RemoteLogEvent {\n type: \"remote-log\"\n at: string\n line: string\n}\n\nexport type RuntimeEvent =\n | BootEvent\n | HeartbeatFiredEvent\n | HeartbeatErrorEvent\n | ConvTurnEvent\n | RemoteLogEvent\n\nexport interface RuntimeEvents {\n on<E extends RuntimeEvent[\"type\"]>(\n type: E,\n handler: (ev: Extract<RuntimeEvent, { type: E }>) => void,\n ): () => void\n onAny(handler: (ev: RuntimeEvent) => void): () => void\n emit(ev: RuntimeEvent): void\n}\n\nexport function createRuntimeEvents(): RuntimeEvents {\n const ee = new EventEmitter()\n ee.setMaxListeners(50)\n\n return {\n on(type, handler) {\n const wrapped = (ev: RuntimeEvent) => {\n if (ev.type === type) handler(ev as Extract<RuntimeEvent, { type: typeof type }>)\n }\n ee.on(\"event\", wrapped)\n return () => ee.off(\"event\", wrapped)\n },\n onAny(handler) {\n ee.on(\"event\", handler)\n return () => ee.off(\"event\", handler)\n },\n emit(ev) {\n ee.emit(\"event\", ev)\n },\n }\n}\n","/**\n * Filesystem MCP tools registered on the runtime's MCP server.\n *\n * The runtime already exposes AIP CRUD verbs (create_tool, load_agent, …)\n * via @agentproto/mcp-server. To make the workspace genuinely reachable\n * to remote MCP clients (Guilde cloud agents through a tunnel, IDEs,\n * etc.), we also register canonical filesystem tools that match the\n * shape used by `@modelcontextprotocol/server-filesystem` so existing\n * MCP-fs proxy clients can target the runtime without bespoke logic:\n *\n * read_file ({ path }) → string\n * write_file ({ path, content }) → \"ok\"\n * list_directory ({ path? }) → \"[FILE] x\\n[DIR] y\" lines\n * get_file_info ({ path }) → { name, type, size, modified }\n * create_directory ({ path }) → \"ok\"\n * delete_file ({ path }) → \"ok\"\n *\n * All paths are resolved relative to the workspace root via the same\n * escape guard used by `WorkspaceFs`. Absolute paths inside the root\n * are accepted (so callers that prefix `basePath` with the absolute\n * workspace path keep working).\n */\n\nimport {\n mkdir,\n readFile,\n readdir,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\"\nimport { dirname, isAbsolute, join, normalize, relative, resolve } from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nexport interface RegisterFsToolsOptions {\n workspace: string\n}\n\nclass FsPathError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"FsPathError\"\n }\n}\n\nfunction makeAnchor(workspace: string): (input: string) => string {\n const root = resolve(workspace)\n return (input: string) => {\n if (typeof input !== \"string\" || input.length === 0) {\n throw new FsPathError(\"path must be a non-empty string\")\n }\n const candidate = isAbsolute(input)\n ? normalize(input)\n : normalize(join(root, input))\n const rel = relative(root, candidate)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new FsPathError(`path escapes the workspace: '${input}'`)\n }\n return candidate\n }\n}\n\nfunction text(value: string | object): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value),\n },\n ],\n }\n}\n\nexport function registerFsTools(\n server: McpServer,\n opts: RegisterFsToolsOptions,\n): void {\n const anchor = makeAnchor(opts.workspace)\n\n server.tool(\n \"read_file\",\n \"Read a UTF-8 file from the workspace.\",\n { path: z.string().describe(\"Workspace-relative path to the file.\") },\n async ({ path }) => {\n const abs = anchor(path)\n const buf = await readFile(abs)\n return text(buf.toString(\"utf8\"))\n },\n )\n\n server.tool(\n \"write_file\",\n \"Write a file to the workspace. Parent directories are created on demand.\",\n {\n path: z.string().describe(\"Workspace-relative path to the file.\"),\n content: z.string().describe(\"File body (UTF-8).\"),\n },\n async ({ path, content }) => {\n const abs = anchor(path)\n await mkdir(dirname(abs), { recursive: true })\n await writeFile(abs, content, \"utf8\")\n return text(\"ok\")\n },\n )\n\n server.tool(\n \"list_directory\",\n \"List entries of a directory in the workspace. Returns one '[FILE]' or '[DIR]' line per entry, mirroring `@modelcontextprotocol/server-filesystem`.\",\n {\n path: z\n .string()\n .optional()\n .describe(\"Workspace-relative directory (defaults to workspace root).\"),\n },\n async ({ path }) => {\n const abs = anchor(path && path.length > 0 ? path : \".\")\n const entries = await readdir(abs, { withFileTypes: true })\n const lines = entries.map(e =>\n e.isDirectory() ? `[DIR] ${e.name}` : `[FILE] ${e.name}`,\n )\n return text(lines.join(\"\\n\"))\n },\n )\n\n server.tool(\n \"get_file_info\",\n \"Stat a file or directory in the workspace.\",\n { path: z.string().describe(\"Workspace-relative path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n const info = await stat(abs)\n return text({\n name: abs.split(\"/\").pop() ?? path,\n path,\n type: info.isDirectory() ? \"directory\" : \"file\",\n size: info.size,\n modified: info.mtime.toISOString(),\n created: info.birthtime.toISOString(),\n })\n },\n )\n\n server.tool(\n \"create_directory\",\n \"Create a directory (recursive) in the workspace.\",\n { path: z.string().describe(\"Workspace-relative directory path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n await mkdir(abs, { recursive: true })\n return text(\"ok\")\n },\n )\n\n server.tool(\n \"delete_file\",\n \"Delete a file or empty directory in the workspace.\",\n { path: z.string().describe(\"Workspace-relative path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n await rm(abs, { recursive: true, force: true })\n return text(\"ok\")\n },\n )\n}\n","/**\n * Discover MCP servers already configured in the user's local agent\n * tooling — claude-code, cursor, goose, etc. — so the daemon can\n * surface them in the UI without making the user re-enter the same\n * credentials and URLs they already painstakingly configured for\n * one host.\n *\n * v1 is read-only discovery: we report what's there with source\n * attribution. Future v1.1 ships an \"import to daemon\" verb that\n * proxies the discovered server through the daemon's own /mcp\n * endpoint so every operator (cloud Guilde, local agents) sees a\n * unified set without per-host config drift.\n *\n * Sources scanned (in priority order):\n * - ~/.claude.json (claude-code) — `mcpServers` top-level + nested\n * under `projects[<path>].mcpServers`. Most users land here.\n * - ~/.cursor/mcp.json (cursor) — flat `mcpServers` map.\n * - ~/.config/goose/config.yaml (goose) — TOML/YAML hybrid; we\n * only handle the YAML form for now.\n * - any `.mcp.json` under the user's home that follows the\n * standard mcpServers shape.\n *\n * Each source contributes 0..N entries. Errors are caught + logged\n * (broken JSON, missing files, permission denied) — partial\n * discovery beats failing the whole listing on one bad file.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { resolve as resolvePath } from \"node:path\"\nimport {\n loadWorkspacesConfig,\n type WorkspaceEntry,\n} from \"./workspaces-config.js\"\n\nexport interface DiscoveredMcp {\n /** Stable id within (source, scope, name) — for de-dupe and\n * cross-call identity (UI treat as React key). */\n id: string\n /** Where we found it. Lets the UI render a source badge. */\n source: \"claude-code\" | \"cursor\" | \"goose\" | \"workspace\"\n /** \"global\" when the entry sits at the top level of the host's\n * config; \"project:<path>\" when it's scoped to a single\n * workspace. claude-code in particular nests per-project. */\n scope: string\n /** The host's name for the entry (key in the mcpServers map). */\n name: string\n /** Wire transport — `stdio` (command + args) or `http` / `sse` (url). */\n type: \"stdio\" | \"http\" | \"sse\" | \"unknown\"\n /** stdio entries: argv to spawn. */\n command?: string\n args?: string[]\n /** stdio entries: env injected into the child. */\n env?: Record<string, string>\n /** http/sse entries: target URL. */\n url?: string\n /** http/sse entries: extra headers (Authorization, etc.). */\n headers?: Record<string, string>\n /** Free-form tags from the source config — claude-code's project\n * scope is the most common. */\n tags?: string[]\n /** Reason field when `type === \"unknown\"` — surfaces why the\n * parser couldn't classify the entry (e.g. neither command nor\n * url present). */\n parseNote?: string\n}\n\nexport interface DiscoverMcpsOptions {\n /** Override the home dir — handy for tests that pin a tmpdir. */\n home?: string\n}\n\nexport async function discoverMcps(\n opts: DiscoverMcpsOptions = {}\n): Promise<DiscoveredMcp[]> {\n const home = opts.home ?? homedir()\n const out: DiscoveredMcp[] = []\n const errors: string[] = []\n await Promise.all([\n scanClaudeCode(home, out, errors),\n scanCursor(home, out, errors),\n scanGoose(home, out, errors),\n scanRegisteredWorkspaces(out, errors),\n ])\n // De-dupe identical entries that show up in multiple scopes\n // (e.g. user copied a project entry to global) — keep the first\n // occurrence so the source attribution stays meaningful.\n const seen = new Set<string>()\n const dedup: DiscoveredMcp[] = []\n for (const m of out) {\n const key = `${m.source}:${m.scope}:${m.name}`\n if (seen.has(key)) continue\n seen.add(key)\n dedup.push(m)\n }\n if (errors.length > 0) {\n // One log line per error — operators can trace which file\n // failed without us bubbling the whole stack into the response.\n for (const e of errors) console.warn(`[mcp-discovery] ${e}`)\n }\n return dedup.sort((a, b) => {\n if (a.source !== b.source) return a.source.localeCompare(b.source)\n if (a.scope !== b.scope) return a.scope.localeCompare(b.scope)\n return a.name.localeCompare(b.name)\n })\n}\n\ninterface RawMcpEntry {\n type?: string\n command?: string\n args?: string[]\n env?: Record<string, string>\n url?: string\n headers?: Record<string, string>\n}\n\n/** claude-code stores entries either at top-level `mcpServers` OR\n * per-project under `projects[<absolute-path>].mcpServers`. We\n * surface both with `scope` set so the UI can group by project. */\nasync function scanClaudeCode(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n const path = resolvePath(home, \".claude.json\")\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return\n errors.push(`claude-code: read ${path} — ${(err as Error).message}`)\n return\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(`claude-code: JSON parse ${path} — ${(err as Error).message}`)\n return\n }\n if (!parsed || typeof parsed !== \"object\") return\n const root = parsed as Record<string, unknown>\n const top = root.mcpServers\n if (top && typeof top === \"object\") {\n pushMcpMap({\n out,\n source: \"claude-code\",\n scope: \"global\",\n map: top as Record<string, unknown>,\n })\n }\n const projects = root.projects\n if (projects && typeof projects === \"object\") {\n for (const [projPath, proj] of Object.entries(\n projects as Record<string, unknown>\n )) {\n if (!proj || typeof proj !== \"object\") continue\n const projMcps = (proj as Record<string, unknown>).mcpServers\n if (!projMcps || typeof projMcps !== \"object\") continue\n pushMcpMap({\n out,\n source: \"claude-code\",\n scope: `project:${projPath}`,\n map: projMcps as Record<string, unknown>,\n })\n }\n }\n}\n\n/** cursor uses ~/.cursor/mcp.json (standard mcpServers shape).\n * Also supports per-workspace `.cursor/mcp.json` but those need\n * the user's project paths — out of scope for v1. */\nasync function scanCursor(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n const path = resolvePath(home, \".cursor\", \"mcp.json\")\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return\n errors.push(`cursor: read ${path} — ${(err as Error).message}`)\n return\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(`cursor: JSON parse ${path} — ${(err as Error).message}`)\n return\n }\n if (!parsed || typeof parsed !== \"object\") return\n const root = parsed as Record<string, unknown>\n const map = root.mcpServers\n if (map && typeof map === \"object\") {\n pushMcpMap({\n out,\n source: \"cursor\",\n scope: \"global\",\n map: map as Record<string, unknown>,\n })\n }\n}\n\n/** goose stores config in ~/.config/goose/config.yaml. The full\n * parser is non-trivial (yaml + extension manifests); v1 looks for\n * the simple `extensions:` block with `mcp_servers` declarations\n * and emits a parseNote so the user knows we found goose but\n * punted on the details. */\nasync function scanGoose(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n // ~/.config on macOS / Linux; goose hasn't shipped Windows-native yet.\n const path = resolvePath(home, \".config\", \"goose\", \"config.yaml\")\n try {\n await fs.access(path)\n } catch {\n return\n }\n // We don't ship a yaml parser as a runtime dep — record presence\n // but punt on parsing. The user sees \"goose detected — open\n // ~/.config/goose/config.yaml to inspect entries\" which is enough\n // signal to drive a v2 enhancement.\n out.push({\n id: \"goose:global:_detected\",\n source: \"goose\",\n scope: \"global\",\n name: \"(goose config detected)\",\n type: \"unknown\",\n parseNote:\n \"Goose config found but YAML parsing is not yet implemented. \" +\n \"Open ~/.config/goose/config.yaml to inspect MCP entries.\",\n })\n}\n\n/**\n * Per-workspace scan — for each registered workspace, look at the\n * common per-project MCP locations (.mcp.json, .cursor/mcp.json,\n * .vscode/mcp.json). Lets the UI surface \"the agentik-studio\n * workspace ships its own chrome-devtools MCP\" instead of only\n * showing what the user configured globally in claude/cursor.\n */\nasync function scanRegisteredWorkspaces(\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n let workspaces: WorkspaceEntry[] = []\n try {\n const cfg = await loadWorkspacesConfig()\n workspaces = cfg.workspaces\n } catch (err) {\n errors.push(`workspaces: load failed — ${(err as Error).message}`)\n return\n }\n // Walk each workspace + each candidate path. We don't recurse —\n // these are conventional top-level files. Errors per-file are\n // collected; one bad file doesn't fail the rest.\n await Promise.all(\n workspaces.map(async ws => {\n const candidates = [\n resolvePath(ws.path, \".mcp.json\"),\n resolvePath(ws.path, \".cursor\", \"mcp.json\"),\n resolvePath(ws.path, \".vscode\", \"mcp.json\"),\n ]\n for (const path of candidates) {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue\n errors.push(\n `workspace ${ws.slug}: read ${path} — ${(err as Error).message}`\n )\n continue\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(\n `workspace ${ws.slug}: JSON parse ${path} — ${(err as Error).message}`\n )\n continue\n }\n if (!parsed || typeof parsed !== \"object\") continue\n const map = (parsed as Record<string, unknown>).mcpServers\n if (!map || typeof map !== \"object\") continue\n pushMcpMap({\n out,\n source: \"workspace\",\n scope: `workspace:${ws.slug}`,\n map: map as Record<string, unknown>,\n })\n }\n })\n )\n}\n\nfunction pushMcpMap(args: {\n out: DiscoveredMcp[]\n source: DiscoveredMcp[\"source\"]\n scope: string\n map: Record<string, unknown>\n}): void {\n for (const [name, raw] of Object.entries(args.map)) {\n if (!raw || typeof raw !== \"object\") continue\n const entry = raw as RawMcpEntry\n const id = `${args.source}:${args.scope}:${name}`\n const declared = typeof entry.type === \"string\" ? entry.type : null\n const url = typeof entry.url === \"string\" ? entry.url : undefined\n const command = typeof entry.command === \"string\" ? entry.command : undefined\n let type: DiscoveredMcp[\"type\"]\n if (declared === \"http\" || declared === \"sse\" || declared === \"stdio\") {\n type = declared\n } else if (url) {\n type = \"http\"\n } else if (command) {\n type = \"stdio\"\n } else {\n type = \"unknown\"\n }\n const m: DiscoveredMcp = {\n id,\n source: args.source,\n scope: args.scope,\n name,\n type,\n }\n if (command !== undefined) m.command = command\n if (Array.isArray(entry.args)) {\n m.args = entry.args.filter((a): a is string => typeof a === \"string\")\n }\n if (entry.env && typeof entry.env === \"object\") {\n m.env = stringifyValues(entry.env)\n }\n if (url !== undefined) m.url = url\n if (entry.headers && typeof entry.headers === \"object\") {\n m.headers = stringifyValues(entry.headers)\n }\n if (type === \"unknown\") {\n m.parseNote =\n \"Entry has neither `command` nor `url` — couldn't classify transport.\"\n }\n args.out.push(m)\n }\n}\n\nfunction stringifyValues(\n raw: Record<string, unknown>\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(raw)) {\n if (typeof v === \"string\") out[k] = v\n else if (v != null) out[k] = String(v)\n }\n return out\n}\n","/**\n * `~/.agentproto/imported-mcps.json` — the user's curated set of\n * discovered MCPs they want the daemon to know about. v1 is just\n * persistence + read-side; the actual MCP-proxy implementation\n * (where the daemon's /mcp endpoint aggregates the imported\n * servers' tools under namespace prefixes) is v2 work.\n *\n * Purpose: today, \"I see you have chrome-devtools in claude\" is\n * read-only. Once a user imports it, the operator agent can refer\n * to it (\"the user said it's enabled — call it\") and a future\n * proxy layer can actually expose it. We persist the choice now so\n * the data is in place when the proxy lands.\n *\n * File shape:\n * {\n * \"version\": 1,\n * \"imports\": [\n * {\n * \"id\": \"claude-code:project:/path:chrome-devtools\",\n * \"alias\": \"chrome-devtools\",\n * \"addedAt\": \"2026-05-10T...\",\n * \"snapshot\": { ...the DiscoveredMcp at import time }\n * }\n * ]\n * }\n *\n * Snapshotting at import time keeps the daemon resilient to the\n * source config getting deleted (user runs `claude mcp remove ...`).\n * The imported entry stays usable; only the next discovery pass\n * stops listing it as \"available to import.\"\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, resolve as resolvePath } from \"node:path\"\nimport type { DiscoveredMcp } from \"./mcp-discovery.js\"\n\nexport const IMPORTED_MCPS_PATH = (): string =>\n resolvePath(homedir(), \".agentproto\", \"imported-mcps.json\")\n\nexport const IMPORTED_MCPS_VERSION = 1 as const\n\nexport interface ImportedMcpEntry {\n id: string\n alias: string\n addedAt: string\n snapshot: DiscoveredMcp\n}\n\nexport interface ImportedMcpsConfig {\n version: typeof IMPORTED_MCPS_VERSION\n imports: ImportedMcpEntry[]\n}\n\nconst EMPTY: ImportedMcpsConfig = {\n version: IMPORTED_MCPS_VERSION,\n imports: [],\n}\n\nexport async function loadImportedMcps(\n path: string = IMPORTED_MCPS_PATH()\n): Promise<ImportedMcpsConfig> {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return EMPTY\n throw err\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n throw new Error(\n `agentproto: ${path} is not valid JSON (${\n err instanceof Error ? err.message : String(err)\n }). Delete or fix manually.`\n )\n }\n return normalize(parsed)\n}\n\nexport async function saveImportedMcps(\n config: ImportedMcpsConfig,\n path: string = IMPORTED_MCPS_PATH()\n): Promise<void> {\n await fs.mkdir(dirname(path), { recursive: true })\n const tmp = `${path}.tmp.${process.pid}`\n await fs.writeFile(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, path)\n}\n\n/**\n * Add (or replace) an import. Snapshots the discovered MCP at\n * import time so the entry stays usable when the source config\n * disappears.\n */\nexport function addImport(\n config: ImportedMcpsConfig,\n input: { snapshot: DiscoveredMcp; alias?: string }\n): ImportedMcpsConfig {\n const alias = (input.alias ?? input.snapshot.name).trim()\n if (!alias) {\n throw new Error(\"addImport: alias resolves to empty string\")\n }\n const addedAt = new Date().toISOString()\n const next: ImportedMcpEntry = {\n id: input.snapshot.id,\n alias,\n addedAt,\n snapshot: input.snapshot,\n }\n const others = config.imports.filter(e => e.id !== input.snapshot.id)\n return { ...config, imports: [...others, next] }\n}\n\nexport function removeImport(\n config: ImportedMcpsConfig,\n id: string\n): ImportedMcpsConfig {\n return { ...config, imports: config.imports.filter(e => e.id !== id) }\n}\n\nexport function findImport(\n config: ImportedMcpsConfig,\n id: string\n): ImportedMcpEntry | undefined {\n return config.imports.find(e => e.id === id)\n}\n\nfunction normalize(parsed: unknown): ImportedMcpsConfig {\n if (!parsed || typeof parsed !== \"object\") return EMPTY\n const obj = parsed as Record<string, unknown>\n const imports: ImportedMcpEntry[] = []\n if (Array.isArray(obj.imports)) {\n for (const entry of obj.imports) {\n if (!entry || typeof entry !== \"object\") continue\n const e = entry as Record<string, unknown>\n const id = typeof e.id === \"string\" ? e.id : \"\"\n const alias = typeof e.alias === \"string\" ? e.alias : id\n const addedAt =\n typeof e.addedAt === \"string\" ? e.addedAt : new Date().toISOString()\n const snapshot = e.snapshot as DiscoveredMcp | undefined\n if (!id || !snapshot) continue\n imports.push({ id, alias, addedAt, snapshot })\n }\n }\n return { version: IMPORTED_MCPS_VERSION, imports }\n}\n","/**\n * MCP tools that expose the sessions registry to agents connected to\n * the daemon. Lets a remote operator (Mastra agent in cloud Guilde,\n * Claude Code as a sub-agent, …) spawn + drive agent CLIs on the\n * user's machine through the same MCP connection they already use\n * for fs/exec.\n *\n * Five tools:\n * start_agent_session spawn a long-running agent (claude / hermes / …)\n * prompt_agent_session send a follow-up turn to a live session\n * list_agent_sessions browse alive + recent sessions\n * get_agent_session_output tail the ring buffer\n * kill_agent_session SIGTERM the session\n *\n * Auth: same as every other daemon tool — gated by the gateway's\n * auth source (loopback bypass when no tunnel is up).\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\nimport type { SessionsRegistry } from \"./sessions.js\"\nimport type {\n AgentAdapterResolver,\n AgentAdapterLister,\n} from \"./http-server.js\"\nimport {\n loadWorkspacesConfig,\n findWorkspace,\n getActiveWorkspace,\n} from \"./workspaces-config.js\"\nimport { discoverMcps } from \"./mcp-discovery.js\"\nimport {\n loadImportedMcps,\n saveImportedMcps,\n addImport,\n removeImport,\n} from \"./mcp-imports.js\"\nimport type { McpProxyRegistry } from \"./mcp-proxy.js\"\n\ninterface RegisterSessionToolsOptions {\n registry: SessionsRegistry\n /** Optional adapter resolver — required for `start_agent_session`\n * (the others work with raw spawn sessions too). When unset the\n * start tool returns a clear error pointing at the host wiring. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional adapter lister — when wired, exposes `list_adapters`\n * MCP tool. Without it the tool returns a clear \"not configured\"\n * error pointing at the host wiring. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional MCP proxy registry — when wired, exposes 3 tools that\n * let the operator drive imported MCPs (chrome-devtools, goose-bridge,\n * …) through the daemon as a single MCP entry point. */\n mcpProxy?: McpProxyRegistry\n /** Whether the registry was constructed with a PTY factory — when\n * true, expose the four terminal session tools. When false, the\n * tools return a clear \"not configured\" error. */\n ptyEnabled?: boolean\n}\n\nexport function registerSessionTools(\n server: McpServer,\n opts: RegisterSessionToolsOptions\n): void {\n const { registry, resolveAgentAdapter, listAgentAdapters, mcpProxy } = opts\n const ptyEnabled = opts.ptyEnabled === true\n\n // ── start_agent_session ────────────────────────────────────────\n server.tool(\n \"start_agent_session\",\n \"Spawn a long-running agent CLI (claude-code, hermes, …) on the host. \" +\n \"The session stays alive across multiple turns — call `prompt_agent_session` \" +\n \"to continue the conversation. Returns the session id + initial descriptor. \" +\n \"When `workspaceSlug` is set, resolves the cwd via \" +\n \"`~/.agentproto/workspaces.json`; otherwise pass `cwd` explicitly or \" +\n \"fall back to the active workspace.\",\n {\n adapter: z\n .string()\n .min(1)\n .describe(\n \"Adapter slug — one of the installed `@agentproto/adapter-*` packages \" +\n \"(e.g. 'claude-code', 'hermes', 'aider').\"\n ),\n workspaceSlug: z\n .string()\n .optional()\n .describe(\n \"Workspace slug from `agentproto workspace list`. The daemon resolves it \" +\n \"to an absolute path. Omit to use the `cwd` field or the active workspace.\"\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Absolute path to spawn the agent in. Wins over `workspaceSlug` when both are set.\"\n ),\n prompt: z\n .string()\n .optional()\n .describe(\n \"Optional initial prompt. The session is spawned and the prompt dispatched \" +\n \"in one shot — equivalent to `start` then `prompt` back-to-back. Skip to spawn idle.\"\n ),\n label: z\n .string()\n .optional()\n .describe(\n \"Free-text label that surfaces in `list_agent_sessions` and the UI — useful \" +\n \"for tagging sessions with a conversation id or operator name.\"\n ),\n },\n async input => {\n if (!resolveAgentAdapter) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_agent_session is not enabled — the daemon was started without \" +\n \"an adapter resolver. Re-run the daemon with the `@agentproto/cli` \" +\n \"shim wired (see playground/scripts/gateway.ts).\",\n },\n ],\n isError: true,\n }\n }\n // cwd resolution mirrors the HTTP route: explicit cwd wins,\n // then workspaceSlug lookup, then active workspace, then a\n // hard error (the operator probably forgot a step).\n let cwd = input.cwd\n let resolvedSlug = input.workspaceSlug ?? \"default\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = input.workspaceSlug\n ? findWorkspace(config, input.workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n resolvedSlug = ws.slug\n }\n } catch {\n // fall through to error below\n }\n }\n if (!cwd) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_agent_session: no cwd resolvable. Pass `cwd` explicitly, \" +\n \"or pass `workspaceSlug` matching `agentproto workspace list`, \" +\n \"or set an active workspace via `agentproto workspace use <slug>`.\",\n },\n ],\n isError: true,\n }\n }\n const resolved = await resolveAgentAdapter(input.adapter)\n if (!resolved) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_agent_session: adapter \"${input.adapter}\" not found. Try \\`agentproto install <slug>\\` first.`,\n },\n ],\n isError: true,\n }\n }\n try {\n const agentSession = await resolved.startSession({ cwd })\n const desc = registry.spawnAgent({\n workspaceSlug: resolvedSlug,\n cwd,\n agentSession,\n adapterSlug: input.adapter,\n ...(input.prompt ? { initialPrompt: input.prompt } : {}),\n ...(input.label ? { label: input.label } : {}),\n ...(resolved.commandPreview\n ? { commandPreview: resolved.commandPreview }\n : {}),\n })\n return {\n content: [{ type: \"text\", text: JSON.stringify(desc, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_agent_session: spawn failed — ${\n err instanceof Error ? err.message : String(err)\n }`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── prompt_agent_session ───────────────────────────────────────\n server.tool(\n \"prompt_agent_session\",\n \"Send a follow-up prompt to a live agent session — multi-turn continuity \" +\n \"without re-spawning. The session id comes from `start_agent_session` \" +\n \"(or `list_agent_sessions`). Returns immediately; tail output via \" +\n \"`get_agent_session_output` or the SSE /sessions/:id/stream endpoint.\",\n {\n sessionId: z.string().describe(\"Session id returned by start_agent_session.\"),\n prompt: z.string().min(1).describe(\"The next user turn (plain text).\"),\n },\n async input => {\n try {\n // Note: sendPrompt awaits the full turn (drains the event\n // stream into the ring buffer). For long turns the operator\n // would prefer fire-and-forget — kick the promise without\n // awaiting and report \"queued\". The caller polls\n // get_agent_session_output for completion.\n void registry.sendPrompt(input.sessionId, input.prompt).catch(() => {\n // Errors land in the ring buffer; nothing to do here.\n })\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n { ok: true, sessionId: input.sessionId, queued: true },\n null,\n 2\n ),\n },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `prompt_agent_session: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_sessions (canonical lister) ──────────────────────────\n server.tool(\n \"list_sessions\",\n \"List sessions tracked by the daemon — agent-CLI sessions (claude-code, \" +\n \"hermes, …), terminal/PTY sessions (claude TUI, bash, …), and raw \" +\n \"commands. Each entry includes `kind`, `pty` (true for real PTYs), \" +\n \"`name` (when set at spawn), `status`, `command`, age + exit code. Use \" +\n \"this when you need to know what's already running before spawning \" +\n \"anything new, or to discover a session id by name.\",\n {\n kind: z\n .enum([\"terminal\", \"agent-cli\", \"command\", \"all\"])\n .optional()\n .describe(\n \"Filter by session kind. `all` (default) returns every kind. \" +\n \"Use `terminal` to list only PTY sessions, `agent-cli` for \" +\n \"structured ACP agents.\",\n ),\n onlyAlive: z\n .boolean()\n .optional()\n .describe(\"When true, only running/starting sessions. Default false.\"),\n status: z\n .enum([\"starting\", \"running\", \"exited\", \"killed\", \"error\"])\n .optional()\n .describe(\"Filter by exact status (overrides onlyAlive).\"),\n },\n async input => {\n let rows = registry.list()\n if (input.kind && input.kind !== \"all\") {\n rows = rows.filter(s => s.kind === input.kind)\n }\n if (input.status) {\n rows = rows.filter(s => s.status === input.status)\n } else if (input.onlyAlive) {\n rows = rows.filter(\n s => s.status === \"running\" || s.status === \"starting\",\n )\n }\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ sessions: rows }, null, 2) },\n ],\n }\n },\n )\n\n // ── list_agent_sessions (kept for backwards compatibility) ─────\n server.tool(\n \"list_agent_sessions\",\n \"DEPRECATED — prefer `list_sessions` which returns ALL kinds + filters. \" +\n \"Despite the name this tool already returns every kind, not just \" +\n \"agent-cli sessions; the new tool's name reflects the actual surface.\",\n {\n onlyAlive: z\n .boolean()\n .optional()\n .describe(\"Filter to status running/starting only. Default false.\"),\n },\n async input => {\n const all = registry.list()\n const filtered = input.onlyAlive\n ? all.filter(s => s.status === \"running\" || s.status === \"starting\")\n : all\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ sessions: filtered }, null, 2),\n },\n ],\n }\n }\n )\n\n // ── get_agent_session_output ───────────────────────────────────\n server.tool(\n \"get_agent_session_output\",\n \"Tail the recent output of a session. Returns the last N lines of the \" +\n \"ring buffer (stdout + stderr inter-leaved, newest last). Use this to read \" +\n \"an agent's reply after `prompt_agent_session`.\",\n {\n sessionId: z.string().describe(\"Session id.\"),\n lastN: z\n .number()\n .int()\n .min(1)\n .max(500)\n .optional()\n .describe(\"Max lines to return. Default 80, max 500.\"),\n },\n async input => {\n const desc = registry.get(input.sessionId)\n if (!desc) {\n return {\n content: [\n { type: \"text\", text: `get_agent_session_output: no session \"${input.sessionId}\"` },\n ],\n isError: true,\n }\n }\n // Best-effort tail — re-attach with a temp listener, capture\n // backfill (which is the recent ring buffer), unsubscribe.\n const limit = input.lastN ?? 80\n const lines: string[] = []\n const unsub = registry.attach(input.sessionId, (line, _stream) => {\n lines.push(line)\n })\n if (unsub) unsub()\n const tail = lines.slice(-limit)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n sessionId: input.sessionId,\n status: desc.status,\n lastOutputAt: desc.lastOutputAt,\n lines: tail,\n },\n null,\n 2\n ),\n },\n ],\n }\n }\n )\n\n // ── list_adapters ──────────────────────────────────────────────\n server.tool(\n \"list_adapters\",\n \"Enumerate every agent CLI adapter installed on the host (claude-code, \" +\n \"hermes, aider, …). Returns slug + display name + version + protocol so \" +\n \"callers can let users pick from the installed set instead of guessing. \" +\n \"Use before `start_agent_session` when the model doesn't already know \" +\n \"what's available.\",\n {},\n async () => {\n if (!listAgentAdapters) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"list_adapters is not enabled — the daemon was started without \" +\n \"an adapter lister. Wire `@agentproto/cli`'s \" +\n \"`listInstalledAdapters` via `createGateway({ listAgentAdapters })`.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const adapters = await listAgentAdapters()\n return {\n content: [{ type: \"text\", text: JSON.stringify({ adapters }, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_adapters failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_discovered_mcps ───────────────────────────────────────\n server.tool(\n \"list_discovered_mcps\",\n \"Discover MCP servers already configured in the user's other agent \" +\n \"tooling (claude-code, cursor, goose). Returns the union with source \" +\n \"attribution so the operator can suggest 'I see you have a chrome-devtools \" +\n \"MCP set up in claude — want me to use it?' instead of asking the user \" +\n \"to re-configure. Read-only — does not modify any host's config.\",\n {},\n async () => {\n try {\n const mcps = await discoverMcps()\n return {\n content: [{ type: \"text\", text: JSON.stringify({ mcps }, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_discovered_mcps failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_imported_mcps ─────────────────────────────────────────\n server.tool(\n \"list_imported_mcps\",\n \"Return the user's curated set of MCP servers — the ones they've \" +\n \"imported from claude / cursor / workspace configs into the daemon. \" +\n \"Use to know which MCPs the operator may freely call vs. ones still \" +\n \"showing up in `list_discovered_mcps` waiting on the user's blessing.\",\n {},\n async () => {\n try {\n const config = await loadImportedMcps()\n return {\n content: [\n { type: \"text\", text: JSON.stringify(config, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_imported_mcps failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── import_mcp ─────────────────────────────────────────────────\n server.tool(\n \"import_mcp\",\n \"Import a discovered MCP into the daemon's curated set. The agent \" +\n \"calls `list_discovered_mcps` first, asks the user, then commits the \" +\n \"choice via this tool. The snapshot is captured at import time so \" +\n \"the entry stays usable if the source config (claude/cursor) is \" +\n \"later removed.\",\n {\n sourceMcpId: z\n .string()\n .min(1)\n .describe(\n \"The discovered MCP id from `list_discovered_mcps` \" +\n \"(e.g. 'claude-code:project:/path:chrome-devtools').\"\n ),\n alias: z\n .string()\n .optional()\n .describe(\n \"Optional friendly name to display. Defaults to the source MCP's name.\"\n ),\n },\n async input => {\n try {\n const discovered = await discoverMcps()\n const snapshot = discovered.find(d => d.id === input.sourceMcpId)\n if (!snapshot) {\n return {\n content: [\n {\n type: \"text\",\n text: `import_mcp: discovered MCP \"${input.sourceMcpId}\" not found. Re-run list_discovered_mcps to get current ids.`,\n },\n ],\n isError: true,\n }\n }\n const cfg = await loadImportedMcps()\n const next = addImport(cfg, {\n snapshot,\n ...(input.alias ? { alias: input.alias } : {}),\n })\n await saveImportedMcps(next)\n const entry = next.imports.find(e => e.id === snapshot.id)\n return {\n content: [{ type: \"text\", text: JSON.stringify(entry, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `import_mcp failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── remove_imported_mcp ────────────────────────────────────────\n server.tool(\n \"remove_imported_mcp\",\n \"Remove a previously-imported MCP from the daemon's curated set. \" +\n \"Use when the user no longer wants the operator referencing it.\",\n {\n id: z\n .string()\n .min(1)\n .describe(\n \"The imported MCP id (matches the discovered MCP id at import time).\"\n ),\n },\n async input => {\n try {\n const cfg = await loadImportedMcps()\n if (!cfg.imports.some(e => e.id === input.id)) {\n return {\n content: [\n {\n type: \"text\",\n text: `remove_imported_mcp: id \"${input.id}\" not in imports. Use list_imported_mcps to see current entries.`,\n },\n ],\n isError: true,\n }\n }\n await saveImportedMcps(removeImport(cfg, input.id))\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ ok: true, id: input.id }, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `remove_imported_mcp failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── mcp_imported_status ────────────────────────────────────────\n // The 3 proxy tools share the same wiring guard — register them\n // only when the host injected a proxy registry, otherwise emit a\n // clear \"not enabled\" error so the agent doesn't think the daemon\n // silently dropped the call.\n server.tool(\n \"mcp_imported_status\",\n \"Snapshot every imported MCP server with its connection status, \" +\n \"transport type, and tool count. Use this first when an operator \" +\n \"wonders 'what MCPs do I actually have access to right now?' — the \" +\n \"answer covers both 'imported but not yet connected' and 'connected \" +\n \"with N tools'. Errors during connect surface in `lastError`.\",\n {},\n async () => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"mcp_imported_status is not enabled — daemon was started without \" +\n \"an MCP proxy. The host must wire `mcpProxy` in createGateway.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const aliases = await mcpProxy.listAliases()\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ imports: aliases }, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_status failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── mcp_imported_list_tools ────────────────────────────────────\n server.tool(\n \"mcp_imported_list_tools\",\n \"List the tools exposed by one imported MCP server. The proxy \" +\n \"lazily connects on first call — first-use latency includes the \" +\n \"transport handshake (stdio: ~1-2s for npx-spawned servers; \" +\n \"http/sse: <100ms). Returns the upstream `inputSchema` (JSON \" +\n \"Schema) verbatim so the operator can build a valid `arguments` \" +\n \"object for the follow-up `mcp_imported_call` invocation.\",\n {\n alias: z\n .string()\n .min(1)\n .describe(\n \"Alias from `list_imported_mcps` / `mcp_imported_status` \" +\n \"(typically the original MCP name, e.g. 'chrome-devtools').\"\n ),\n },\n async input => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text: \"mcp_imported_list_tools is not enabled — see mcp_imported_status.\",\n },\n ],\n isError: true,\n }\n }\n const out = await mcpProxy.listTools(input.alias)\n if (!out.ok) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_list_tools \"${input.alias}\": ${out.error}`,\n },\n ],\n isError: true,\n }\n }\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ alias: input.alias, tools: out.tools }, null, 2) },\n ],\n }\n }\n )\n\n // ── mcp_imported_call ──────────────────────────────────────────\n server.tool(\n \"mcp_imported_call\",\n \"Invoke a tool on an imported MCP server. The daemon proxies the \" +\n \"call through the live client connection — the upstream server \" +\n \"validates `arguments` against its own input schema (which you \" +\n \"can fetch via `mcp_imported_list_tools`). The full upstream \" +\n \"result is returned verbatim, including `isError` flags so the \" +\n \"operator sees the original failure shape.\",\n {\n alias: z.string().min(1).describe(\"Imported MCP alias.\"),\n toolName: z\n .string()\n .min(1)\n .describe(\n \"Tool name as it appears in `mcp_imported_list_tools` \" +\n \"(NOT a namespaced version — pass the upstream's own name).\"\n ),\n args: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Tool arguments as a JSON object. Schema is the upstream's \" +\n \"— the proxy doesn't validate, only forwards. Default: empty object.\"\n ),\n },\n async input => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text: \"mcp_imported_call is not enabled — see mcp_imported_status.\",\n },\n ],\n isError: true,\n }\n }\n const out = await mcpProxy.callTool(\n input.alias,\n input.toolName,\n input.args ?? {}\n )\n if (!out.ok) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_call \"${input.alias}\".${input.toolName}: ${out.error}`,\n },\n ],\n isError: true,\n }\n }\n // Forward the upstream result. The MCP SDK's CallToolResult is\n // already in the {content, isError?} shape we return — pass it\n // through with a note that it came from the proxy.\n return out.result as {\n content: Array<{ type: \"text\"; text: string }>\n isError?: boolean\n }\n }\n )\n\n // ── kill_agent_session ─────────────────────────────────────────\n server.tool(\n \"kill_agent_session\",\n \"Stop a session — SIGTERM the underlying child + close the agent protocol \" +\n \"session. Use to free resources after the operator is done, or when a \" +\n \"session is wedged.\",\n {\n sessionId: z.string().describe(\"Session id.\"),\n },\n async input => {\n const ok = registry.kill(input.sessionId)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: input.sessionId }, null, 2),\n },\n ],\n }\n }\n )\n\n // ── Terminal session tools ─────────────────────────────────────\n // Four tools that mirror the agent-session set but operate on raw\n // PTY sessions (real terminal, ANSI bytes, multi-subscriber). Use\n // these to drive interactive CLIs like `claude` in TUI mode, or\n // for one agent to orchestrate other shells. Read/write/exit\n // happen over the byte ring buffer; the WS at /sessions/:id/pty\n // is the streaming alternative.\n\n const ptyNotConfigured = (toolName: string): {\n content: Array<{ type: \"text\"; text: string }>\n isError: true\n } => ({\n content: [\n {\n type: \"text\",\n text:\n `${toolName}: PTY support not enabled — the daemon was started without ` +\n \"a node-pty factory. Re-run `agentproto serve` from a build that ships \" +\n \"node-pty (the optional dep ships with @agentproto/cli).\",\n },\n ],\n isError: true,\n })\n\n server.tool(\n \"start_terminal_session\",\n \"Spawn a process under a real PTY (node-pty) on the host. Bytes (including \" +\n \"ANSI escapes, alt-screen sequences) flow through the daemon's byte ring \" +\n \"buffer; subscribers attach via the WS at /sessions/:id/pty. Use for \" +\n \"interactive TUIs (claude, vim, htop) or to orchestrate shells from another \" +\n \"agent. Returns the session descriptor.\",\n {\n argv: z\n .array(z.string())\n .min(1)\n .describe(\n \"Argv array. First element is the binary, rest are arguments. \" +\n \"e.g. ['claude'] or ['bash', '-l'].\"\n ),\n workspaceSlug: z\n .string()\n .optional()\n .describe(\n \"Workspace slug from `agentproto workspace list`. Resolves cwd. Omit \" +\n \"to use `cwd` explicitly or the active workspace.\"\n ),\n cwd: z\n .string()\n .optional()\n .describe(\"Absolute cwd. Wins over workspaceSlug when both set.\"),\n cols: z.number().int().min(1).max(500).optional().describe(\"Initial cols. Default 80.\"),\n rows: z.number().int().min(1).max(200).optional().describe(\"Initial rows. Default 24.\"),\n name: z\n .string()\n .optional()\n .describe(\n \"User-friendly slug. Becomes an alias for the session id in \" +\n \"subsequent tool calls (read/write/kill accept either).\"\n ),\n label: z\n .string()\n .optional()\n .describe(\n \"Free-text label surfaced in list_agent_sessions and the UI.\"\n ),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"start_terminal_session\")\n let cwd = input.cwd\n let resolvedSlug = input.workspaceSlug ?? \"default\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = input.workspaceSlug\n ? findWorkspace(config, input.workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n resolvedSlug = ws.slug\n }\n } catch {\n // fall through to error\n }\n }\n if (!cwd) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_terminal_session: no cwd resolvable. Pass `cwd` explicitly \" +\n \"or `workspaceSlug` matching `agentproto workspace list`.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const desc = registry.spawnPty({\n argv: input.argv,\n cwd,\n workspaceSlug: resolvedSlug,\n cols: input.cols ?? 80,\n rows: input.rows ?? 24,\n ...(input.name ? { name: input.name } : {}),\n ...(input.label ? { label: input.label } : {}),\n })\n return {\n content: [{ type: \"text\", text: JSON.stringify(desc, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_terminal_session: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n server.tool(\n \"write_terminal_input\",\n \"Send keystrokes to a PTY session's stdin. The text is forwarded verbatim — \" +\n \"include trailing newlines if the target needs them (e.g. shell commands). \" +\n \"Use after `start_terminal_session` to drive an interactive CLI.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n text: z.string().describe(\"Text to write. Sent as-is to the PTY's stdin.\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"write_terminal_input\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `write_terminal_input: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const ok = registry.writeTerminalInput(desc.id, input.text)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: desc.id }, null, 2),\n },\n ],\n ...(ok ? {} : { isError: true as const }),\n }\n }\n )\n\n server.tool(\n \"read_terminal_output\",\n \"Snapshot the recent byte buffer of a PTY session. Returns base64-encoded \" +\n \"bytes (the buffer is RAW including ANSI escapes — strip with a regex if \" +\n \"you want plain text). `lastBytes` caps the read from the tail.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n lastBytes: z\n .number()\n .int()\n .min(1)\n .max(64 * 1024)\n .optional()\n .describe(\"Max bytes from the tail. Default: full ring buffer (~64 KiB).\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"read_terminal_output\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `read_terminal_output: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const buf = registry.readTerminalOutput(\n desc.id,\n input.lastBytes,\n )\n if (!buf) {\n return {\n content: [\n {\n type: \"text\",\n text: `read_terminal_output: session \"${desc.id}\" is not a PTY`,\n },\n ],\n isError: true,\n }\n }\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n sessionId: desc.id,\n status: desc.status,\n bytes: buf.byteLength,\n b64: buf.toString(\"base64\"),\n },\n null,\n 2,\n ),\n },\n ],\n }\n }\n )\n\n server.tool(\n \"kill_terminal_session\",\n \"SIGTERM a PTY session and drop it from the alive set. Same effect as \" +\n \"`kill_agent_session` for the PTY family — separate name so it's obvious \" +\n \"what's being stopped.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"kill_terminal_session\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `kill_terminal_session: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const ok = registry.kill(desc.id)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: desc.id }, null, 2),\n },\n ],\n }\n }\n )\n}\n","/**\n * HEARTBEAT.md autonomy loop.\n *\n * A workspace can ship a `HEARTBEAT.md` at its root. Frontmatter:\n *\n * schema: heartbeat/v1\n * agent: <id> (matches `<workspace>/.agents/<id>/AGENT.md`)\n * every: \"60s\" (Ns | Nm | Nh | Nd; cron support TODO)\n * enabled: true (default true; set false to register-but-skip)\n * conversation: heartbeat-{date} (templated id; defaults to per-day)\n *\n * Body = the prompt body the agent receives each tick. Reread fresh\n * on every tick so editing HEARTBEAT.md takes effect without restart.\n *\n * Ticks resolve the agent via the injected `buildAgent` callback,\n * call `agent.generate(prompt)`, and append the prompt + reply to a\n * conversation (default: daily-rolling `heartbeat-YYYY-MM-DD`).\n *\n * When the file is missing, frontmatter is invalid, `enabled: false`,\n * or the resolved agent has no usable model — the runner skips the\n * tick silently and emits a `heartbeat-error` event. The daemon\n * stays up.\n */\n\nimport matter from \"gray-matter\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { ConversationStore } from \"./conversations.js\"\nimport type { RuntimeEvents } from \"./events.js\"\n\nexport interface HeartbeatAgent {\n generate(prompt: string): Promise<{ text: string }>\n}\n\nexport interface BuildHeartbeatAgent {\n (id: string): Promise<HeartbeatAgent | null>\n}\n\nexport interface HeartbeatRunnerOptions {\n workspace: string\n conversations: ConversationStore\n events: RuntimeEvents\n /** Resolves a heartbeat-runnable agent from its workspace id. */\n buildAgent: BuildHeartbeatAgent\n /** Filename inside the workspace root. Default `HEARTBEAT.md`. */\n filename?: string\n /** Skip ticks while this returns false. Default: always true. */\n shouldFire?: () => boolean\n /** Override clock for tests. */\n now?: () => Date\n}\n\nexport interface HeartbeatRunner {\n /** Start the timer loop. Idempotent. */\n start(): void\n /** Stop the timer loop. Pending ticks finish out. */\n stop(): void\n /** Force-fire one tick now (used by `POST /heartbeat/tick`). */\n fireNow(): Promise<void>\n}\n\ninterface ParsedHeartbeat {\n agent: string\n everyMs: number\n enabled: boolean\n conversationTemplate: string\n body: string\n}\n\nexport function startHeartbeat(opts: HeartbeatRunnerOptions): HeartbeatRunner {\n const filename = opts.filename ?? \"HEARTBEAT.md\"\n const path = join(opts.workspace, filename)\n const now = opts.now ?? (() => new Date())\n\n let timer: NodeJS.Timeout | null = null\n let currentEveryMs: number | null = null\n let firing = false\n\n async function load(): Promise<ParsedHeartbeat | null> {\n if (!existsSync(path)) return null\n let source: string\n try {\n source = await readFile(path, \"utf8\")\n } catch {\n return null\n }\n const parsed = matter(source)\n const fm = parsed.data as Record<string, unknown>\n const agent = typeof fm.agent === \"string\" ? fm.agent : null\n if (!agent) return null\n const enabled = fm.enabled === undefined ? true : Boolean(fm.enabled)\n const everyRaw = typeof fm.every === \"string\" ? fm.every : \"60s\"\n const everyMs = parseDuration(everyRaw)\n if (!everyMs) return null\n const conversationTemplate =\n typeof fm.conversation === \"string\"\n ? fm.conversation\n : \"heartbeat-{date}\"\n return {\n agent,\n everyMs,\n enabled,\n conversationTemplate,\n body: parsed.content.trim(),\n }\n }\n\n async function tick(): Promise<void> {\n if (firing) return\n if (opts.shouldFire && !opts.shouldFire()) return\n firing = true\n let agentId: string | undefined\n try {\n const hb = await load()\n if (!hb || !hb.enabled) return\n agentId = hb.agent\n const agent = await opts.buildAgent(hb.agent)\n if (!agent) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: hb.agent,\n error: `buildAgent('${hb.agent}') returned null`,\n })\n return\n }\n if (!hb.body) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: hb.agent,\n error: \"HEARTBEAT.md body is empty\",\n })\n return\n }\n\n const conversationId = expandTemplate(hb.conversationTemplate, now())\n await opts.conversations.open(conversationId, { agent: hb.agent })\n\n const startedAt = now()\n await opts.conversations.appendTurn(\n conversationId,\n \"user\",\n hb.body,\n { at: startedAt.toISOString(), attribution: \"heartbeat\" },\n )\n opts.events.emit({\n type: \"conv-turn-appended\",\n at: startedAt.toISOString(),\n conversationId,\n role: \"user\",\n contentPreview: preview(hb.body),\n })\n\n const t0 = Date.now()\n const reply = await agent.generate(hb.body)\n const durationMs = Date.now() - t0\n\n const finishedAt = now()\n await opts.conversations.appendTurn(\n conversationId,\n \"assistant\",\n reply.text,\n { at: finishedAt.toISOString(), attribution: hb.agent },\n )\n opts.events.emit({\n type: \"conv-turn-appended\",\n at: finishedAt.toISOString(),\n conversationId,\n role: \"assistant\",\n contentPreview: preview(reply.text),\n })\n opts.events.emit({\n type: \"heartbeat-fired\",\n at: finishedAt.toISOString(),\n agent: hb.agent,\n conversationId,\n prompt: hb.body,\n reply: reply.text,\n durationMs,\n })\n\n // Adapt the timer if `every` changed since we started.\n if (currentEveryMs !== null && currentEveryMs !== hb.everyMs) {\n reschedule(hb.everyMs)\n }\n } catch (err) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: agentId,\n error: err instanceof Error ? err.message : String(err),\n })\n } finally {\n firing = false\n }\n }\n\n function reschedule(everyMs: number): void {\n if (timer) clearInterval(timer)\n currentEveryMs = everyMs\n timer = setInterval(() => {\n void tick()\n }, everyMs)\n }\n\n return {\n start() {\n if (timer) return\n // Bootstrap interval from the file (or fall back to 60s if\n // unreadable — first real tick will refresh from disk).\n void load().then((hb) => {\n const everyMs = hb?.everyMs ?? 60_000\n reschedule(everyMs)\n })\n },\n stop() {\n if (timer) {\n clearInterval(timer)\n timer = null\n currentEveryMs = null\n }\n },\n async fireNow() {\n await tick()\n },\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────\n\nconst DURATION_RE = /^(\\d+)\\s*(s|m|h|d)$/\n\n/**\n * Parse `Ns | Nm | Nh | Nd` into milliseconds. Returns `null` if the\n * string doesn't match. (AIP-41 supports more units, but the daemon's\n * heartbeat sticks to coarse durations to keep ticks observable.)\n */\nexport function parseDuration(input: string): number | null {\n const trimmed = input.trim()\n const match = trimmed.match(DURATION_RE)\n if (!match) return null\n const n = Number(match[1])\n if (!Number.isFinite(n) || n <= 0) return null\n switch (match[2]) {\n case \"s\":\n return n * 1_000\n case \"m\":\n return n * 60_000\n case \"h\":\n return n * 3_600_000\n case \"d\":\n return n * 86_400_000\n default:\n return null\n }\n}\n\n/**\n * Replace `{date}` with `YYYY-MM-DD` (UTC) in conversation templates.\n * Other tokens pass through unchanged — extend later if needed.\n */\nfunction expandTemplate(template: string, when: Date): string {\n const date = when.toISOString().slice(0, 10)\n return template.replace(/\\{date\\}/g, date)\n}\n\nfunction preview(text: string, max = 120): string {\n const flat = text.replace(/\\s+/g, \" \").trim()\n return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat\n}\n","/**\n * Tiny node:http server that fronts the runtime gateway.\n *\n * Routes:\n * GET /health — { status, workspace, registered, uptime }\n * GET /events — SSE stream of RuntimeEvent\n * POST /mcp — MCP Streamable HTTP transport (POST)\n * GET /mcp — MCP SSE response stream (GET)\n * DELETE /mcp — close MCP session\n * GET /conversations — JSON list of conversation summaries\n * GET /conversations/<id> — markdown body of one conversation\n * POST /heartbeat/tick — force-fire one heartbeat tick\n *\n * No auth in `mode: \"none\"` (loopback default). `mode: \"bearer\"`\n * checks `Authorization: Bearer <token>` against the configured\n * token. Health is always public so external monitors can probe.\n *\n * MCP transport: stateless mode for v1 — each request is independent.\n * Stateful session pinning can come later when long-running streaming\n * tool calls become a real use case.\n */\n\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\"\nimport type { Duplex } from \"node:stream\"\nimport { mkdir, stat, writeFile } from \"node:fs/promises\"\nimport { isAbsolute, join, resolve as resolvePath } from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\"\nimport { WebSocketServer, type WebSocket } from \"ws\"\nimport type { ConversationStore } from \"./conversations.js\"\nimport type { HeartbeatRunner } from \"./heartbeat.js\"\nimport type { RuntimeEvents, RuntimeEvent } from \"./events.js\"\nimport type { SessionsRegistry, AgentSessionLike } from \"./sessions.js\"\nimport {\n loadWorkspacesConfig,\n findWorkspace,\n getActiveWorkspace,\n} from \"./workspaces-config.js\"\nimport { discoverMcps } from \"./mcp-discovery.js\"\nimport type { McpProxyRegistry } from \"./mcp-proxy.js\"\nimport {\n loadImportedMcps,\n saveImportedMcps,\n addImport,\n removeImport,\n} from \"./mcp-imports.js\"\n\n/**\n * Default Origin allowlist used when `RuntimeHttpServerOptions.allowedOrigins`\n * is undefined. Localhost on any port covers the user's own dev environments\n * (Guilde web dev server, playground demos, embedded panels). Production\n * origins (https://guilde.work, …) are NOT included by default — those are\n * opt-in via `agentproto serve --allow-origin <url>`.\n */\nconst DEFAULT_ALLOWED_ORIGINS: readonly string[] = [\n \"http://localhost:*\",\n \"http://127.0.0.1:*\",\n \"https://localhost:*\",\n]\n\n/**\n * Pluggable adapter resolver — keeps the runtime package free of any\n * @agentproto/cli dep. The host (cli `serve`, playground, embedding\n * apps) builds the resolver and hands it in. Returning null means\n * \"adapter not found\" → 404.\n */\nexport type AgentAdapterResolver = (slug: string) => Promise<{\n /** Build a fresh AgentSessionLike for the given cwd. The driver\n * spawns the adapter binary, opens the protocol, and the\n * registry holds the result.\n *\n * When `resumeSessionId` is set, the driver reattaches to that\n * pre-existing adapter session (claude-code's conversation id,\n * hermes' chat handle, …) rather than starting blank. Same\n * mechanism as `agentproto run --resume <id>` — exposed over\n * HTTP so `agentproto sessions restart` works on agent-cli\n * sessions, not just PTY ones. */\n startSession(opts: {\n cwd: string\n resumeSessionId?: string\n }): Promise<AgentSessionLike>\n /** Display label for the descriptor's `command` field. */\n commandPreview?: string\n} | null>\n\n/**\n * Compact adapter metadata for the discovery endpoints. Independent\n * of the resolver function above — hosts that can list installed\n * adapters wire this; hosts that can only resolve by-slug skip it\n * (the routes 501).\n */\nexport interface AdapterListEntry {\n slug: string\n name: string\n version: string\n description: string\n protocol: string\n streaming: boolean\n packageName: string\n}\n\nexport type AgentAdapterLister = () => Promise<AdapterListEntry[]>\n\nexport interface AuthOptions {\n mode: \"none\" | \"bearer\"\n token?: string\n}\n\n/**\n * Auth can be a fixed value (set at startup) or a getter (re-read on\n * every request). The getter form lets `remote_enable` flip bearer on\n * at runtime without restarting the gateway.\n */\nexport type AuthSource = AuthOptions | (() => AuthOptions)\n\nexport interface RuntimeHttpServerOptions {\n port: number\n bind?: string\n auth?: AuthSource\n /**\n * Per-request McpServer factory.\n *\n * The SDK's `StreamableHTTPServerTransport` is single-use — once a\n * transport has handled one request, the underlying `Protocol`\n * cannot be reattached, so subsequent requests on a shared transport\n * 500. The official stateless pattern (see SDK\n * `examples/server/simpleStatelessStreamableHttp.js`) builds a\n * fresh `McpServer` and `StreamableHTTPServerTransport` per request,\n * connects them, and tears both down on `res.close`. We follow that.\n *\n * The factory is invoked once per `/mcp` POST. It must register\n * tools / resources / prompts on the returned server before\n * resolving — by the time the transport's `handleRequest` fires,\n * the server is locked in.\n */\n mcpServerFactory: () => Promise<McpServer>\n conversations: ConversationStore\n events: RuntimeEvents\n heartbeat: HeartbeatRunner\n /** Optional — when wired, exposes /sessions routes for the CLI\n * TUI and the guilde-web Active tab to navigate live child\n * processes. Daemons that don't spawn anything (pure MCP servers)\n * can omit this and the routes 404. */\n sessions?: SessionsRegistry\n /** Optional — when wired alongside `sessions`, enables\n * `POST /sessions/agent` and `POST /sessions/:id/prompt` routes.\n * Hosts that ship adapters (`agentproto serve`, playground)\n * pass the cli's `resolveAdapter` via a thin shim. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional — when wired, enables `GET /adapters` route + the\n * MCP `list_adapters` tool so UIs can discover what's installed\n * without trial-and-error against the resolver. Hosts ship the\n * cli's `listInstalledAdapters` via a thin shim. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional — MCP proxy registry. When wired, exposes\n * `/mcps/proxy/*` routes that let the browser drive imported MCPs\n * without going through the MCP wire protocol (useful for the\n * /providers/mcp page's \"Local\" tab). */\n mcpProxy?: McpProxyRegistry\n /** Per-boot bearer token. When set, mutating /sessions/* routes\n * + the /sessions/:id/pty WebSocket upgrade require either\n * `Authorization: Bearer <token>` or an `Origin` header that\n * matches `allowedOrigins`. Read-only routes (GET, SSE stream)\n * stay open since the CORS surface already restricts origins\n * enough for them. */\n token?: string\n /** Trusted browser origins. When a mutating request carries an\n * `Origin: <url>` header (browser-set, JS can't forge), and that\n * url is in this list, the request is allowed without a Bearer\n * token. Browsers can't read the daemon's runtime.json (mode 0600)\n * so they can't send the token — Origin-based auth lets a trusted\n * page (Guilde web UI, local dev) drive the daemon. Non-browser\n * callers (curl, the CLI) still use the token.\n *\n * Match policy: exact origin (`https://guilde.work`) OR prefix\n * with `:*` for any-port match (`http://localhost:*` matches\n * `http://localhost:3000`).\n *\n * Default (when undefined): localhost on any port is allowed via\n * `DEFAULT_ALLOWED_ORIGINS`. Production origins are opt-in via\n * `agentproto serve --allow-origin <url>`. Pair with `strictOrigins`\n * to remove the localhost defaults entirely. */\n allowedOrigins?: readonly string[]\n /** When true, skip the localhost-wildcard defaults — only the\n * explicit `allowedOrigins` list is honoured. Useful for daemons\n * on shared hosts or when the user wants to lock dev to a\n * specific port. Default false (current behaviour — any browser\n * on `localhost` is trusted). */\n strictOrigins?: boolean\n /** Whether `POST /sessions/terminal` + WS upgrade are advertised.\n * Reflects whether the host injected a PTY factory into the\n * SessionsRegistry. When false, the terminal HTTP route returns\n * 501 and the WS upgrade rejects. */\n ptyEnabled?: boolean\n /** Static fields surfaced via `/health`. */\n meta: {\n workspace: string\n registered: readonly string[]\n }\n}\n\nexport interface RuntimeHttpServerHandle {\n url: string\n stop(): Promise<void>\n}\n\nexport async function startHttpServer(\n opts: RuntimeHttpServerOptions,\n): Promise<RuntimeHttpServerHandle> {\n const startedAt = Date.now()\n const authSource: AuthSource = opts.auth ?? { mode: \"none\" }\n const readAuth = (): AuthOptions =>\n typeof authSource === \"function\" ? authSource() : authSource\n\n /**\n * Loopback bypass — requests originating from 127.0.0.1 / ::1 with\n * no `X-Forwarded-For` header skip the bearer check even when one is\n * configured. Rationale:\n *\n * 1. The bearer is meant to gate the *public tunnel*, not the\n * loopback socket. Without this, calling `remote_enable` from a\n * local MCP client immediately 401s that same local client —\n * the user locks themselves out and the only recovery is a\n * gateway restart. Hit this in real use; not a theoretical edge.\n *\n * 2. Cloudflared (and any reasonable tunnel) sets X-Forwarded-For\n * when forwarding a public request to the loopback origin. So\n * \"loopback AND no XFF\" is a tight characterisation of \"this\n * request never left the machine.\"\n *\n * 3. Local FS access already trumps bearer (the user can read\n * runtime.json, kill -9 the daemon, etc.). Adding another check\n * here doesn't raise the bar for someone with shell on the box.\n *\n * If your threat model is \"untrusted users on the same loopback\n * interface\" (unusual — usually a multi-tenant container scenario),\n * pass `auth: { mode: \"bearer\", … }` at startup instead of relying\n * on the controller's runtime flip; the auth getter will return the\n * stricter of the two and the bypass still applies (intentional —\n * the operator opted in to bearer with full knowledge of the trade).\n */\n function isLoopback(req: IncomingMessage): boolean {\n const addr = req.socket.remoteAddress ?? \"\"\n const isLocalAddr =\n addr === \"127.0.0.1\" || addr === \"::1\" || addr === \"::ffff:127.0.0.1\"\n if (!isLocalAddr) return false\n // X-Forwarded-For present ⇒ a tunnel is in front of us; the\n // request crossed the public internet to reach this socket.\n if (req.headers[\"x-forwarded-for\"]) return false\n return true\n }\n\n function authorize(req: IncomingMessage, res: ServerResponse): boolean {\n const auth = readAuth()\n if (auth.mode === \"none\") return true\n if (isLoopback(req)) return true\n const header = req.headers.authorization\n const expected = `Bearer ${auth.token}`\n if (header !== expected) {\n res.writeHead(401, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"unauthorized\" }))\n return false\n }\n return true\n }\n\n /**\n * Per-boot auth gate for mutating /sessions/* routes and the WS\n * upgrade for /sessions/:id/pty. Accepts EITHER:\n *\n * 1. `Authorization: Bearer <token>` matching the per-boot token\n * (the CLI path — reads runtime.json mode 0600).\n * 2. A WS-upgrade query-string `?token=<token>` (browser\n * WebSocket can't set headers; some non-browser clients use\n * this too).\n * 3. An `Origin: <url>` header matching `allowedOrigins` — the\n * browser path. Origin is browser-set, JS can't forge.\n *\n * UNLIKE `authorize()`, this does NOT have a loopback bypass: the\n * threat we're defending against (browser drive-by spawning shells\n * via fetch to 127.0.0.1) IS loopback. Browsers can't read\n * runtime.json (mode 0600); a same-origin trusted page can rely on\n * its Origin instead.\n *\n * When `opts.token` is unset (older host integrations), this is a\n * no-op so existing call sites keep working.\n */\n function checkSessionsToken(req: IncomingMessage): \"ok\" | \"missing\" | \"bad\" {\n if (!opts.token) return \"ok\"\n\n // 1. Header bearer token.\n const header = req.headers.authorization\n const expected = `Bearer ${opts.token}`\n if (header === expected) return \"ok\"\n\n // 2. ?token=<token> in the URL (WS upgrade convenience).\n const urlStr = req.url ?? \"\"\n if (urlStr.includes(\"?\")) {\n const qs = new URLSearchParams(urlStr.slice(urlStr.indexOf(\"?\") + 1))\n const qsToken = qs.get(\"token\")\n if (qsToken && qsToken === opts.token) return \"ok\"\n }\n\n // 3. Origin allowlist (browser path).\n const origin = req.headers.origin\n if (typeof origin === \"string\" && originAllowed(origin)) return \"ok\"\n\n return header ? \"bad\" : \"missing\"\n }\n\n function originAllowed(origin: string): boolean {\n // Defaults are normally in effect — `opts.allowedOrigins` extends\n // them rather than replacing. Otherwise setting one production\n // origin via config silently locks out `http://localhost:*`,\n // breaking local dev. Users who genuinely want a curated list\n // (shared host, paranoid local-only ports) set `strictOrigins:true`\n // which drops the defaults entirely.\n const list = opts.strictOrigins\n ? (opts.allowedOrigins ?? [])\n : [...DEFAULT_ALLOWED_ORIGINS, ...(opts.allowedOrigins ?? [])]\n for (const pattern of list) {\n if (pattern === origin) return true\n // `http://localhost:*` style: match the host prefix, any port.\n if (pattern.endsWith(\":*\")) {\n const prefix = pattern.slice(0, -2) // drop \":*\"\n if (origin === prefix || origin.startsWith(prefix + \":\")) return true\n }\n }\n return false\n }\n\n function rejectUnauthorizedSession(\n req: IncomingMessage,\n res: ServerResponse,\n kind: \"missing\" | \"bad\",\n ): void {\n const origin = req.headers.origin ?? null\n const allowList = opts.strictOrigins\n ? (opts.allowedOrigins ?? [])\n : [...DEFAULT_ALLOWED_ORIGINS, ...(opts.allowedOrigins ?? [])]\n res.writeHead(401, { \"content-type\": \"application/json\" })\n const message =\n kind === \"missing\"\n ? origin\n ? `Origin \"${origin}\" not in the daemon's allowlist, and no Bearer token sent. ` +\n `Either add it (\\`agentproto config set daemon.allowedOrigins ${origin}\\` then restart the daemon), ` +\n `or send Authorization: Bearer <token> read from <workspace>/.agentproto/runtime.json.`\n : `Authorization: Bearer <token> required on mutating /sessions/* routes. ` +\n `Read the token from <workspace>/.agentproto/runtime.json. ` +\n `(Browser callers can use an Origin in the allowlist instead.)`\n : `Invalid bearer token. The daemon regenerated its token on its last boot — ` +\n `re-read <workspace>/.agentproto/runtime.json.`\n res.end(\n JSON.stringify({\n error: \"sessions_unauthorized\",\n message,\n // Debug data so a UI / network-tab inspection points the user\n // straight at the fix without needing the daemon's stderr.\n rejectedOrigin: origin,\n allowedOrigins: allowList,\n // We never echo the token; only the absence-or-presence flag.\n receivedAuthHeader: typeof req.headers.authorization === \"string\",\n }),\n )\n }\n\n /**\n * Returns true when this `path` + `method` is a mutating /sessions/*\n * route that should require the per-boot token. Kept narrow: GETs\n * (list, get, SSE stream) stay open for read-only telemetry from\n * existing tools that haven't learned about the token yet.\n */\n function isMutatingSessionsRoute(method: string, path: string): boolean {\n if (!path.startsWith(\"/sessions\")) return false\n if (method === \"POST\" || method === \"DELETE\" || method === \"PUT\" || method === \"PATCH\") {\n return true\n }\n return false\n }\n\n async function handleMcp(req: IncomingMessage, res: ServerResponse): Promise<void> {\n if (!authorize(req, res)) return\n // Per-request server + transport, per the SDK's stateless pattern.\n // Sharing either across requests breaks after the first one because\n // `Protocol.connect` rejects re-attachment.\n const server = await opts.mcpServerFactory()\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n })\n // `onerror` is an unofficial SDK hook — guard before assigning so\n // a future SDK rename doesn't silently drop transport error logs.\n const transportInternal = transport as unknown as Record<string, unknown>\n if (\"onerror\" in (transport as object)) {\n transportInternal[\"onerror\"] = (err: unknown) => {\n console.error(\"[mcp transport.onerror]\", err)\n }\n }\n\n res.on(\"close\", () => {\n void transport.close()\n void server.close()\n })\n\n try {\n await server.connect(transport)\n await transport.handleRequest(req, res)\n } catch (err) {\n console.error(\"[mcp] handleRequest threw:\", err)\n if (!res.headersSent) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"mcp_transport_failed\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n }\n\n function handleHealth(_req: IncomingMessage, res: ServerResponse): void {\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n status: \"ok\",\n workspace: opts.meta.workspace,\n registered: opts.meta.registered,\n uptimeMs: Date.now() - startedAt,\n }),\n )\n }\n\n function handleEvents(req: IncomingMessage, res: ServerResponse): void {\n if (!authorize(req, res)) return\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache, no-transform\",\n connection: \"keep-alive\",\n })\n res.write(`: connected\\n\\n`)\n const off = opts.events.onAny((ev: RuntimeEvent) => {\n res.write(`data: ${JSON.stringify(ev)}\\n\\n`)\n })\n req.on(\"close\", off)\n }\n\n async function handleListConversations(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!authorize(req, res)) return\n const list = await opts.conversations.list()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(list))\n }\n\n async function handleGetConversation(\n req: IncomingMessage,\n res: ServerResponse,\n id: string,\n ): Promise<void> {\n if (!authorize(req, res)) return\n try {\n const data = await opts.conversations.read(id)\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(data))\n } catch (err) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"not_found\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n\n async function handleHeartbeatTick(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!authorize(req, res)) return\n await opts.heartbeat.fireNow()\n res.writeHead(202, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ status: \"fired\" }))\n }\n\n /**\n * POST /files/upload?cwd=<abs-dir>&name=<filename>\n *\n * Writes the raw request body bytes to\n * `{cwd}/.agentproto-attachments/{safe-name}`, creating the\n * subdirectory on demand, and returns `{path}` with the absolute\n * path the agent CLI can read. Used by the host UI's terminal\n * drag-drop: the browser can't read the dragged file's source path\n * (security), so we copy the bytes to a known location and tell the\n * UI to paste THAT path into the terminal — claude-code (and any\n * CLI with a Read tool) picks it up natively.\n *\n * Gated by `checkSessionsToken` so a drive-by HTTP request can't\n * write arbitrary files: only sessions-authorized callers (CLI or\n * an allow-listed browser origin) can hit it.\n *\n * Hardening:\n * - `cwd` must be absolute and exist as a directory.\n * - `name` is basename-sanitized (no `/`, `..`, NULs).\n * - The resolved write target must stay within\n * `{cwd}/.agentproto-attachments/` (defense-in-depth in case the\n * name sanitizer ever drifts).\n * - Body capped at 32 MiB. Larger uploads error 413 instead of\n * filling the daemon's disk.\n */\n async function handleFileUpload(\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n ): Promise<void> {\n const reply = (status: number, body: unknown): void => {\n res.writeHead(status, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(body))\n }\n const qs = new URLSearchParams(url.includes(\"?\") ? url.slice(url.indexOf(\"?\") + 1) : \"\")\n const cwd = qs.get(\"cwd\")\n const rawName = qs.get(\"name\")\n if (!cwd || !rawName) {\n reply(400, { error: \"missing_cwd_or_name\" })\n return\n }\n if (!isAbsolute(cwd)) {\n reply(400, { error: \"cwd_not_absolute\" })\n return\n }\n // basename-style sanitize: strip path separators + parent refs +\n // NUL bytes; collapse leading dots so the file is visible. The\n // resolvePath check below catches anything this misses.\n const safeName = rawName\n .replace(/[\u0000/\\\\]/g, \"_\")\n .replace(/\\.\\.+/g, \".\")\n .replace(/^\\.+/, \"\")\n .slice(0, 200)\n if (safeName.length === 0) {\n reply(400, { error: \"invalid_name\" })\n return\n }\n try {\n const st = await stat(cwd)\n if (!st.isDirectory()) {\n reply(400, { error: \"cwd_not_a_directory\" })\n return\n }\n } catch {\n reply(400, { error: \"cwd_not_found\" })\n return\n }\n const dir = join(cwd, \".agentproto-attachments\")\n const target = resolvePath(dir, safeName)\n // Defense-in-depth: the sanitized name should never escape `dir`,\n // but if the sanitizer ever drifts, this catches the escape.\n if (!target.startsWith(resolvePath(dir) + (dir.endsWith(\"/\") ? \"\" : \"/\"))) {\n reply(400, { error: \"path_traversal_blocked\" })\n return\n }\n const MAX_BYTES = 32 * 1024 * 1024 // 32 MiB\n const chunks: Buffer[] = []\n let total = 0\n let aborted = false\n await new Promise<void>((resolveBody, rejectBody) => {\n req.on(\"data\", chunk => {\n if (aborted) return\n const buf = chunk as Buffer\n total += buf.length\n if (total > MAX_BYTES) {\n aborted = true\n reply(413, { error: \"file_too_large\", maxBytes: MAX_BYTES })\n rejectBody(new Error(\"too_large\"))\n return\n }\n chunks.push(buf)\n })\n req.on(\"end\", () => {\n if (!aborted) resolveBody()\n })\n req.on(\"error\", err => rejectBody(err))\n }).catch(() => undefined)\n if (aborted) return\n try {\n await mkdir(dir, { recursive: true })\n await writeFile(target, Buffer.concat(chunks))\n reply(200, { path: target, bytes: total })\n } catch (err) {\n reply(500, {\n error: \"write_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n // Permissive CORS for the loopback gateway. The Guilde web app\n // (localhost:3041) probes /health from the browser; without these\n // headers the browser blocks the response and the panel says\n // \"not reachable\" even though curl works. Auth still gates the\n // sensitive routes — this just lifts the cross-origin block.\n //\n // Private Network Access (Chrome 105+): when an HTTPS page like\n // https://guilde.work fetches a loopback URL, Chrome sends a\n // preflight with `Access-Control-Request-Private-Network: true`.\n // Without `Access-Control-Allow-Private-Network: true` in the\n // response, the browser blocks the actual GET. Mirror the flag\n // when the request asked for it.\n function applyCors(req: IncomingMessage, res: ServerResponse): void {\n const origin = (req.headers.origin as string | undefined) ?? \"*\"\n res.setHeader(\"Access-Control-Allow-Origin\", origin)\n res.setHeader(\"Vary\", \"Origin\")\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\")\n res.setHeader(\n \"Access-Control-Allow-Headers\",\n req.headers[\"access-control-request-headers\"] ??\n \"authorization,content-type,mcp-session-id\",\n )\n res.setHeader(\n \"Access-Control-Allow-Methods\",\n \"GET,POST,PUT,PATCH,DELETE,OPTIONS\",\n )\n if (req.headers[\"access-control-request-private-network\"] === \"true\") {\n res.setHeader(\"Access-Control-Allow-Private-Network\", \"true\")\n }\n }\n\n const server: Server = createServer((req, res) => {\n void (async () => {\n try {\n const url = req.url ?? \"/\"\n const path = url.split(\"?\")[0] ?? \"/\"\n // Diagnostic: emit forwarded requests (those carrying XFF) onto\n // the events stream so /events tailers can see what cloudflared\n // actually sends. Loopback-only traffic stays quiet to avoid\n // flooding subscribers during normal local use.\n if (req.headers[\"x-forwarded-for\"]) {\n opts.events.emit({\n type: \"remote-log\",\n at: new Date().toISOString(),\n line: `[http-in] ${req.method} ${url} host=${req.headers.host ?? \"?\"} xff=${String(req.headers[\"x-forwarded-for\"])}`,\n })\n }\n\n applyCors(req, res)\n if (req.method === \"OPTIONS\") {\n res.writeHead(204)\n res.end()\n return\n }\n\n if (path === \"/health\" && req.method === \"GET\") {\n handleHealth(req, res)\n return\n }\n if (path === \"/events\" && req.method === \"GET\") {\n handleEvents(req, res)\n return\n }\n if (path === \"/mcp\") {\n await handleMcp(req, res)\n return\n }\n if (path === \"/conversations\" && req.method === \"GET\") {\n await handleListConversations(req, res)\n return\n }\n if (path.startsWith(\"/conversations/\") && req.method === \"GET\") {\n const id = path.slice(\"/conversations/\".length)\n await handleGetConversation(req, res, id)\n return\n }\n if (path === \"/heartbeat/tick\" && req.method === \"POST\") {\n await handleHeartbeatTick(req, res)\n return\n }\n\n if (path === \"/files/upload\" && req.method === \"POST\") {\n // Same auth gate as the mutating /sessions/* routes — drive-by\n // HTTP shouldn't be able to write arbitrary files to disk.\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUnauthorizedSession(req, res, gate)\n return\n }\n await handleFileUpload(req, res, url)\n return\n }\n\n // Sessions routes — only registered when the gateway was\n // built with a SessionsRegistry. /sessions, /sessions/:id,\n // /sessions/:id/stream (SSE), POST /sessions/:id/kill,\n // DELETE /sessions/:id (forget after exit).\n if (opts.sessions && path.startsWith(\"/sessions\")) {\n if (isMutatingSessionsRoute(req.method ?? \"GET\", path)) {\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUnauthorizedSession(req, res, gate)\n return\n }\n }\n const handled = await handleSessions(\n req,\n res,\n path,\n opts.sessions,\n opts.resolveAgentAdapter,\n opts.ptyEnabled === true,\n )\n if (handled) return\n }\n\n if (path === \"/workspaces\" && req.method === \"GET\") {\n // Surface ~/.agentproto/workspaces.json for UIs that\n // want a workspace dropdown (spawn dialog, MCP discovery\n // grouping, etc.). Read-only; mutate via the CLI's\n // `agentproto workspace add/remove/use` verbs.\n try {\n const config = await loadWorkspacesConfig()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(config))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"workspaces_load_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n if (path === \"/mcps/imports\" && req.method === \"GET\") {\n const config = await loadImportedMcps()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(config))\n return\n }\n if (path === \"/mcps/imports\" && req.method === \"POST\") {\n const body = (await readJsonBody(req)) as {\n sourceMcpId?: string\n alias?: string\n } | null\n if (!body || typeof body.sourceMcpId !== \"string\") {\n res.writeHead(400, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"missing_sourceMcpId\" }))\n return\n }\n const discovered = await discoverMcps()\n const snapshot = discovered.find(d => d.id === body.sourceMcpId)\n if (!snapshot) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"discovered_mcp_not_found\",\n sourceMcpId: body.sourceMcpId,\n })\n )\n return\n }\n const cfg = await loadImportedMcps()\n const next = addImport(cfg, {\n snapshot,\n ...(body.alias ? { alias: body.alias } : {}),\n })\n await saveImportedMcps(next)\n res.writeHead(201, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(next.imports.find(e => e.id === snapshot.id)))\n return\n }\n const importMatch = path.match(/^\\/mcps\\/imports\\/(.+)$/)\n if (importMatch && req.method === \"DELETE\") {\n // The id is URL-encoded since it contains colons + slashes\n // (e.g. claude-code:project:/path:name).\n const id = decodeURIComponent(importMatch[1] ?? \"\")\n const cfg = await loadImportedMcps()\n if (!cfg.imports.some(e => e.id === id)) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"import_not_found\", id }))\n return\n }\n await saveImportedMcps(removeImport(cfg, id))\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ ok: true, id }))\n return\n }\n\n if (path === \"/mcps/discovered\" && req.method === \"GET\") {\n // No host wiring needed — the scanner reads\n // ~/.claude.json + ~/.cursor/mcp.json + goose config\n // directly. Always available; cheap (~5ms typical).\n try {\n const mcps = await discoverMcps()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ mcps }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"discovery_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n // Browser-friendly proxy surface — same operations the MCP\n // tools expose (mcp_imported_status / list_tools / call) but\n // over plain HTTP so the /providers/mcp page can render them\n // without embedding an MCP client.\n if (path === \"/mcps/proxy/status\" && req.method === \"GET\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n try {\n const imports = await opts.mcpProxy.listAliases()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ imports }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"proxy_status_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n const proxyToolsMatch = path.match(/^\\/mcps\\/proxy\\/tools\\/(.+)$/)\n if (proxyToolsMatch && req.method === \"GET\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n const alias = decodeURIComponent(proxyToolsMatch[1] ?? \"\")\n const out = await opts.mcpProxy.listTools(alias)\n res.writeHead(out.ok ? 200 : 502, {\n \"content-type\": \"application/json\",\n })\n res.end(JSON.stringify(out))\n return\n }\n if (path === \"/mcps/proxy/call\" && req.method === \"POST\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n const body = (await readJsonBody(req)) as {\n alias?: unknown\n toolName?: unknown\n args?: unknown\n } | null\n if (\n !body ||\n typeof body.alias !== \"string\" ||\n typeof body.toolName !== \"string\"\n ) {\n res.writeHead(400, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"invalid_body\",\n message: \"expected { alias, toolName, args? }\",\n })\n )\n return\n }\n const result = await opts.mcpProxy.callTool(\n body.alias,\n body.toolName,\n body.args ?? {}\n )\n res.writeHead(result.ok ? 200 : 502, {\n \"content-type\": \"application/json\",\n })\n res.end(JSON.stringify(result))\n return\n }\n\n if (path === \"/adapters\" && req.method === \"GET\") {\n if (!opts.listAgentAdapters) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"lister_not_configured\",\n message:\n \"Daemon was started without `listAgentAdapters` — see \" +\n \"@agentproto/cli's `listInstalledAdapters` for the canonical impl.\",\n })\n )\n return\n }\n try {\n const adapters = await opts.listAgentAdapters()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ adapters }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"list_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"not_found\", path }))\n } catch (err) {\n if (!res.headersSent) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"internal_error\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n })()\n })\n\n // ── WebSocket upgrade: /sessions/:id/pty ──\n // Single WSS bound to the HTTP server's `upgrade` event. Connections\n // are accepted only when the SessionsRegistry is wired AND PTY\n // support is advertised. Frames are JSON-encoded over text WS\n // messages (binary mode is a future optimization — JSON keeps\n // wireshark/devtools debuggable):\n // server → client: {kind:\"data\", b64:\"...\"}\n // server → client: {kind:\"exit\", exitCode:0, signal?:1}\n // client → server: {kind:\"input\", b64:\"...\"} (or {kind:\"input\", text:\"...\"})\n // client → server: {kind:\"resize\", cols:80, rows:24}\n // client → server: {kind:\"ping\"} (no-op keepalive)\n const wss = new WebSocketServer({ noServer: true })\n server.on(\"upgrade\", (req, socket, head) => {\n const url = req.url ?? \"/\"\n const path = url.split(\"?\")[0] ?? \"/\"\n const ptyMatch = path.match(/^\\/sessions\\/([^/]+)\\/pty$/)\n if (!ptyMatch) {\n socket.destroy()\n return\n }\n if (!opts.sessions || opts.ptyEnabled !== true) {\n rejectUpgrade(socket, 501, \"pty_not_configured\")\n return\n }\n // Per-boot token gate, no loopback bypass — see comment on\n // checkSessionsToken for why.\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUpgrade(socket, 401, gate === \"missing\" ? \"missing_token\" : \"bad_token\")\n return\n }\n const id = ptyMatch[1]\n if (!id) {\n rejectUpgrade(socket, 400, \"missing_id\")\n return\n }\n // Resolve id-or-name BEFORE upgrading so a typo returns a clean\n // 404 instead of a successful WS that immediately closes.\n const desc = opts.sessions.findByIdOrName(id)\n if (!desc) {\n rejectUpgrade(socket, 404, \"session_not_found\")\n return\n }\n if (desc.pty !== true) {\n rejectUpgrade(socket, 400, \"session_not_pty\")\n return\n }\n // A descriptor for an exited/killed/error session lives on as\n // history — its PTY child is gone. Reject the upgrade with a\n // clear reason so the CLI/web client can suggest `restart`\n // instead of letting the user see a generic 1011 mid-attach.\n if (\n desc.status === \"exited\" ||\n desc.status === \"killed\" ||\n desc.status === \"error\"\n ) {\n rejectUpgrade(\n socket,\n 410,\n `session_${desc.status}`,\n `Session ${desc.id}${desc.name ? ` (${desc.name})` : \"\"} has ${desc.status}. ` +\n `Spawn a fresh one with: agentproto sessions restart ${desc.name ?? desc.id}`,\n )\n return\n }\n wss.handleUpgrade(req, socket, head, ws => {\n handlePtyWebSocket(ws, req, desc.id, opts.sessions!)\n })\n })\n\n const bind = opts.bind ?? \"127.0.0.1\"\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(opts.port, bind, () => resolve())\n })\n\n return {\n url: `http://${bind}:${opts.port}`,\n async stop() {\n // Per-request transports/servers are torn down on `res.close`,\n // so we only need to stop the HTTP listener here. The WSS is\n // bound `noServer:true` so closing the HTTP server also tears\n // down its underlying TCP socket; live WS connections receive\n // a close frame from the kernel.\n wss.close()\n await new Promise<void>((resolve) => server.close(() => resolve()))\n },\n }\n}\n\n/**\n * Reject an HTTP upgrade attempt with a structured plaintext body.\n * `ws.handleUpgrade` is meant to be the success path — if we can't\n * accept the upgrade we write a minimal HTTP response and destroy\n * the socket, matching ws's own internal error path.\n */\nfunction rejectUpgrade(\n socket: Duplex,\n status: number,\n reason: string,\n message?: string,\n): void {\n const reasonText = `${status} ${reason}`\n const body: { error: string; message?: string } = { error: reason }\n if (message) body.message = message\n try {\n socket.write(\n `HTTP/1.1 ${reasonText}\\r\\n` +\n `Content-Type: application/json\\r\\n` +\n `Connection: close\\r\\n\\r\\n` +\n JSON.stringify(body) +\n `\\n`,\n )\n } catch {\n // socket already gone — fall through\n }\n socket.destroy()\n}\n\n/**\n * Per-connection WS handler for /sessions/:id/pty. Attaches as a\n * subscriber to the SessionsRegistry; bridges JSON frames in both\n * directions. Per-subscriber backpressure: if the WS's `bufferedAmount`\n * exceeds a threshold, the next chunk is dropped (slow client must\n * not stall the daemon's fan-out to other subscribers).\n */\nfunction handlePtyWebSocket(\n ws: WebSocket,\n req: IncomingMessage,\n sessionId: string,\n registry: SessionsRegistry,\n): void {\n // Parse cols/rows from the query string for the initial dimension\n // hint. Real clients will send a {kind:\"resize\"} immediately after\n // connecting; this seeds the registry's min-size calculation so the\n // first replay frames render at a sensible width if no resize comes.\n const query = new URLSearchParams(\n (req.url ?? \"\").includes(\"?\") ? (req.url ?? \"\").split(\"?\")[1] : \"\",\n )\n const cols = clampPositiveInt(query.get(\"cols\"), 80)\n const rows = clampPositiveInt(query.get(\"rows\"), 24)\n\n // Backpressure threshold — when the socket has more than 256 KiB\n // queued, drop the next data frame for THIS subscriber rather than\n // letting the registry block on send. Other subscribers stay live.\n const BACKPRESSURE_BYTES = 256 * 1024\n\n const handle = registry.attachPty(\n sessionId,\n { cols, rows },\n chunk => {\n if (ws.readyState !== ws.OPEN) return\n if (ws.bufferedAmount > BACKPRESSURE_BYTES) return // drop\n ws.send(\n JSON.stringify({ kind: \"data\", b64: chunk.toString(\"base64\") }),\n )\n },\n evt => {\n if (ws.readyState !== ws.OPEN) return\n ws.send(\n JSON.stringify({\n kind: \"exit\",\n exitCode: evt.exitCode,\n ...(evt.signal != null ? { signal: evt.signal } : {}),\n }),\n )\n // Close ourselves once we've emitted exit — the session can be\n // reattached for a buffer replay but this socket is done.\n try {\n ws.close(1000, \"session exited\")\n } catch {\n // ignore\n }\n },\n )\n\n if (!handle) {\n // Race: the session may have vanished between the upgrade and\n // attach. Close politely.\n try {\n ws.close(1011, \"session not attachable\")\n } catch {\n // ignore\n }\n return\n }\n\n ws.on(\"message\", (raw, isBinary) => {\n if (isBinary) {\n // Binary frames not supported yet — wire format is JSON-only.\n return\n }\n let frame: unknown\n try {\n frame = JSON.parse(raw.toString(\"utf8\"))\n } catch {\n return // malformed\n }\n if (!frame || typeof frame !== \"object\") return\n const f = frame as Record<string, unknown>\n switch (f.kind) {\n case \"input\": {\n // Accept either {text} (UTF-8) or {b64} (arbitrary bytes,\n // useful for clients sending raw key sequences).\n if (typeof f.text === \"string\") {\n handle.write(f.text)\n } else if (typeof f.b64 === \"string\") {\n try {\n handle.write(Buffer.from(f.b64, \"base64\").toString(\"utf8\"))\n } catch {\n // ignore malformed base64\n }\n }\n break\n }\n case \"resize\": {\n const c =\n typeof f.cols === \"number\" && f.cols > 0 ? Math.floor(f.cols) : null\n const r =\n typeof f.rows === \"number\" && f.rows > 0 ? Math.floor(f.rows) : null\n if (c && r) handle.resize(c, r)\n break\n }\n case \"ping\":\n // Reply with pong so client keepalive logic works. Optional.\n try {\n ws.send(JSON.stringify({ kind: \"pong\" }))\n } catch {\n // ignore\n }\n break\n // Unknown kinds silently dropped; reserved for forward compat.\n }\n })\n\n ws.on(\"close\", () => {\n handle.detach()\n })\n ws.on(\"error\", () => {\n handle.detach()\n })\n}\n\nfunction clampPositiveInt(raw: string | null, fallback: number): number {\n if (!raw) return fallback\n const n = Number.parseInt(raw, 10)\n return Number.isFinite(n) && n > 0 ? n : fallback\n}\n\nfunction clampInt(\n raw: string | null,\n fallback: number,\n min: number,\n max: number,\n): number {\n if (!raw) return fallback\n const n = Number.parseInt(raw, 10)\n if (!Number.isFinite(n)) return fallback\n if (n < min) return min\n if (n > max) return max\n return n\n}\n\n/**\n * /sessions routes — split out of the main switch so the surface\n * stays scannable. Returns `true` when it handled the request, so\n * the dispatcher knows to skip the 404 path.\n *\n * GET /sessions → list of SessionDescriptor[]\n * GET /sessions/:id → one SessionDescriptor\n * GET /sessions/:id/stream → SSE stream {line,stream} events\n * POST /sessions/:id/kill → SIGTERM, returns {ok}\n * DELETE /sessions/:id → forget (drop from registry; only\n * valid for exited/killed/error)\n */\nasync function handleSessions(\n req: IncomingMessage,\n res: ServerResponse,\n path: string,\n registry: SessionsRegistry,\n resolveAgentAdapter?: AgentAdapterResolver,\n ptyEnabled = false,\n): Promise<boolean> {\n const json = (status: number, body: unknown): void => {\n res.writeHead(status, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(body))\n }\n\n if (path === \"/sessions\" && req.method === \"GET\") {\n json(200, { sessions: registry.list() })\n return true\n }\n\n // Long-running agent session — spawn via the cli's adapter\n // resolver, hold across multiple turns. Body shape:\n // {adapter: \"claude-code\"|\"hermes\"|...,\n // workspaceSlug, cwd, prompt?, label?}\n if (path === \"/sessions/agent\" && req.method === \"POST\") {\n if (!resolveAgentAdapter) {\n json(501, {\n error: \"agent_resolver_not_configured\",\n message:\n \"POST /sessions/agent needs the host to inject `resolveAgentAdapter` \" +\n \"(e.g. via @agentproto/cli's resolveAdapter shim).\",\n })\n return true\n }\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const adapter = typeof b.adapter === \"string\" ? b.adapter : \"\"\n if (!adapter) {\n json(400, { error: \"missing_adapter\" })\n return true\n }\n // cwd resolution priority:\n // 1. explicit `cwd` in the body\n // 2. lookup `workspaceSlug` in ~/.agentproto/workspaces.json\n // 3. active workspace from the same config\n // 4. process.cwd() (last resort, almost certainly not what\n // the user wants — log it so the operator notices)\n let cwd: string | null =\n typeof b.cwd === \"string\" && b.cwd.length > 0 ? b.cwd : null\n let workspaceSlug =\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = workspaceSlug\n ? findWorkspace(config, workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n workspaceSlug = ws.slug\n }\n } catch {\n // Config missing / unreadable — fall through to process.cwd()\n }\n }\n if (!cwd) {\n cwd = process.cwd()\n console.warn(\n `[/sessions/agent] no cwd resolvable for adapter=${adapter} ` +\n `(no body.cwd, no workspaceSlug match in ~/.agentproto/workspaces.json, ` +\n `no active workspace) — falling back to daemon's cwd ${cwd}`\n )\n }\n if (!workspaceSlug) workspaceSlug = \"default\"\n const resolved = await resolveAgentAdapter(adapter)\n if (!resolved) {\n json(404, { error: \"adapter_not_found\", adapter })\n return true\n }\n try {\n const resumeSessionId =\n typeof b.resumeSessionId === \"string\" && b.resumeSessionId.length > 0\n ? b.resumeSessionId\n : undefined\n const agentSession = await resolved.startSession({\n cwd,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n })\n const desc = registry.spawnAgent({\n workspaceSlug,\n cwd,\n agentSession,\n adapterSlug: adapter,\n ...(typeof b.prompt === \"string\" ? { initialPrompt: b.prompt } : {}),\n ...(typeof b.label === \"string\" ? { label: b.label } : {}),\n ...(resolved.commandPreview\n ? { commandPreview: resolved.commandPreview }\n : {}),\n })\n json(201, desc)\n } catch (err) {\n json(500, {\n error: \"agent_spawn_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n return true\n }\n\n // Long-running PTY session — spawn argv under node-pty. Bytes flow\n // through the registry's byte ring buffer; attach via the WebSocket\n // upgrade at /sessions/:id/pty. Body shape:\n // {argv: string[], cwd?, workspaceSlug?, cols, rows, env?, name?, label?}\n if (path === \"/sessions/terminal\" && req.method === \"POST\") {\n if (!ptyEnabled) {\n json(501, {\n error: \"pty_not_configured\",\n message:\n \"POST /sessions/terminal needs the host to inject `spawnPty` into createGateway \" +\n \"(node-pty optional dep — install in @agentproto/cli).\",\n })\n return true\n }\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const argv = Array.isArray(b.argv)\n ? (b.argv as unknown[]).filter((v): v is string => typeof v === \"string\")\n : []\n if (argv.length === 0) {\n json(400, { error: \"missing_argv\" })\n return true\n }\n const cols = typeof b.cols === \"number\" && b.cols > 0 ? Math.floor(b.cols) : 80\n const rows = typeof b.rows === \"number\" && b.rows > 0 ? Math.floor(b.rows) : 24\n // cwd resolution mirrors /sessions/agent exactly.\n let cwd: string | null =\n typeof b.cwd === \"string\" && b.cwd.length > 0 ? b.cwd : null\n let workspaceSlug =\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = workspaceSlug\n ? findWorkspace(config, workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n workspaceSlug = ws.slug\n }\n } catch {\n // fall through to process.cwd()\n }\n }\n if (!cwd) {\n cwd = process.cwd()\n console.warn(\n `[/sessions/terminal] no cwd resolvable for argv=${argv.join(\" \")} ` +\n `— falling back to daemon's cwd ${cwd}`\n )\n }\n if (!workspaceSlug) workspaceSlug = \"default\"\n try {\n const desc = registry.spawnPty({\n argv,\n cwd,\n workspaceSlug,\n cols,\n rows,\n ...(b.env && typeof b.env === \"object\"\n ? { env: b.env as Record<string, string> }\n : {}),\n ...(typeof b.name === \"string\" ? { name: b.name } : {}),\n ...(typeof b.label === \"string\" ? { label: b.label } : {}),\n })\n json(201, desc)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n const status = msg.includes(\"already in use\")\n ? 409\n : msg.includes(\"no PTY factory\")\n ? 501\n : 500\n json(status, { error: \"pty_spawn_failed\", message: msg })\n }\n return true\n }\n\n // Send a follow-up turn to a live agent session.\n // Body: { prompt: string | ContentBlock | ContentBlock[] }\n // - string → auto-wrapped to a single text block by\n // the registry (legacy / convenience).\n // - ContentBlock → e.g. `{type:\"image\", source:{...}}`\n // - ContentBlock[] → text + image mix for multimodal turns.\n // Forwarded as-is to `agentSession.send`\n // so the adapter (claude-agent-acp, …)\n // negotiates its own content shape.\n //\n // Validation is intentionally loose — we accept anything object-\n // shaped + non-empty arrays + non-empty strings. The adapter will\n // reject ill-formed blocks with a clear error projected into the\n // session's ring buffer; throwing here would just duplicate that.\n //\n // Query: ?wait=false → fire-and-forget (return 202 after sync\n // validation; output streams via /sessions/:id/stream). Default\n // wait=true keeps the call blocking until the turn drains, which\n // is what curl scripts + the MCP bridge expect.\n const promptMatch = path.match(/^\\/sessions\\/([^/]+)\\/prompt$/)\n if (promptMatch && req.method === \"POST\") {\n const id = promptMatch[1]\n if (!id) return false\n const body = await readJsonBody(req)\n const prompt = (body as { prompt?: unknown } | null)?.prompt\n const validPrompt =\n (typeof prompt === \"string\" && prompt.length > 0) ||\n (Array.isArray(prompt) &&\n prompt.length > 0 &&\n prompt.every(b => b !== null && typeof b === \"object\")) ||\n (prompt !== null && typeof prompt === \"object\" && !Array.isArray(prompt))\n if (!validPrompt) {\n json(400, {\n error: \"missing_prompt\",\n message:\n \"Body `prompt` must be a non-empty string, a content block object, or an array of content blocks.\",\n })\n return true\n }\n const reqUrl = req.url ?? \"\"\n const queryString = reqUrl.includes(\"?\")\n ? reqUrl.slice(reqUrl.indexOf(\"?\") + 1)\n : \"\"\n const wait = new URLSearchParams(queryString).get(\"wait\")\n const fireAndForget = wait === \"false\" || wait === \"0\"\n try {\n if (fireAndForget) {\n registry.enqueuePrompt(id, prompt)\n json(202, { ok: true, id, queued: true })\n } else {\n await registry.sendPrompt(id, prompt)\n json(200, { ok: true, id })\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // Differentiate \"not found\" / \"wrong kind\" / \"busy\" — they\n // surface as readable thrown messages from the registry.\n const status = msg.includes(\"no session\")\n ? 404\n : msg.includes(\"not an agent\")\n ? 400\n : msg.includes(\"mid-turn\")\n ? 409\n : 500\n json(status, { error: \"send_prompt_failed\", message: msg })\n }\n return true\n }\n\n if (path === \"/sessions\" && req.method === \"POST\") {\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const argv = Array.isArray(b.argv)\n ? (b.argv as unknown[]).filter((v): v is string => typeof v === \"string\")\n : []\n if (argv.length === 0) {\n json(400, { error: \"missing_argv\" })\n return true\n }\n try {\n const desc = registry.spawn({\n kind:\n b.kind === \"terminal\" || b.kind === \"agent-cli\" || b.kind === \"command\"\n ? b.kind\n : \"command\",\n workspaceSlug:\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"default\",\n cwd: typeof b.cwd === \"string\" ? b.cwd : process.cwd(),\n argv,\n env:\n b.env && typeof b.env === \"object\"\n ? (b.env as Record<string, string>)\n : undefined,\n label: typeof b.label === \"string\" ? b.label : undefined,\n })\n json(201, desc)\n } catch (err) {\n json(500, {\n error: \"spawn_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n return true\n }\n\n // Per-id routes. The `:id` slot also accepts a session's `name`\n // when one was set at spawn time — `findByIdOrName` resolves both\n // and the rest of the handler operates on the canonical id.\n const idMatch = path.match(\n /^\\/sessions\\/([^/]+)(\\/stream|\\/kill|\\/preview)?$/,\n )\n if (!idMatch) return false\n const [, rawIdOrName, suffix] = idMatch\n if (!rawIdOrName) return false\n const resolvedDesc = registry.findByIdOrName(rawIdOrName)\n const id = resolvedDesc?.id ?? rawIdOrName\n\n if (suffix === \"/preview\" && req.method === \"GET\") {\n // Read-only snapshot of the recent ring buffer — used by the\n // dashboard's detail pane so the user sees what the session was\n // doing without committing to an attach. Returns BOTH lines\n // (for agent-cli/command sessions) and recent-bytes (for PTY).\n // Caller picks whichever is populated.\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n const reqUrl = req.url ?? \"\"\n const qs = new URLSearchParams(\n reqUrl.includes(\"?\") ? reqUrl.slice(reqUrl.indexOf(\"?\") + 1) : \"\",\n )\n const lineCap = clampInt(qs.get(\"lines\"), 10, 1, 200)\n const byteCap = clampInt(qs.get(\"bytes\"), 16 * 1024, 256, 64 * 1024)\n // No registry method exists for \"give me the recent buffer\n // snapshot\" — readTerminalOutput is the closest. For non-PTY\n // sessions, attach with a no-op subscriber, read backfill,\n // detach. Cheap; the backfill is synchronous on attach.\n const lines: string[] = []\n if (resolvedDesc.pty !== true) {\n const unsub = registry.attach(id, line => {\n lines.push(line)\n })\n if (unsub) unsub()\n }\n const bufBytes = registry.readTerminalOutput(id, byteCap)\n json(200, {\n id: resolvedDesc.id,\n lines: lines.slice(-lineCap),\n bytes: bufBytes ? bufBytes.toString(\"base64\") : null,\n })\n return true\n }\n\n if (suffix === \"/stream\" && req.method === \"GET\") {\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n })\n // Keep-alive ping every 25s — proxies / browsers eventually\n // close idle SSE connections; the comment line keeps the pipe\n // warm without confusing the EventSource parser (it ignores\n // anything starting with `:`).\n const ping = setInterval(() => {\n try {\n res.write(`: keep-alive\\n\\n`)\n } catch {\n clearInterval(ping)\n }\n }, 25_000)\n const unsub = registry.attach(id, (line, stream) => {\n try {\n res.write(\n `data: ${JSON.stringify({ line, stream })}\\n\\n`\n )\n } catch {\n // Client gone — cleanup happens on `close`.\n }\n })\n if (!unsub) {\n clearInterval(ping)\n res.end()\n return true\n }\n req.once(\"close\", () => {\n unsub()\n clearInterval(ping)\n })\n return true\n }\n\n if (suffix === \"/kill\" && req.method === \"POST\") {\n const ok = registry.kill(id)\n json(ok ? 200 : 404, { ok, id })\n return true\n }\n\n if (!suffix && req.method === \"GET\") {\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n json(200, resolvedDesc)\n return true\n }\n\n if (!suffix && req.method === \"DELETE\") {\n const ok = registry.forget(id)\n json(ok ? 200 : 404, { ok, id })\n return true\n }\n\n return false\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = []\n for await (const chunk of req) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk)\n }\n if (chunks.length === 0) return null\n try {\n return JSON.parse(Buffer.concat(chunks).toString(\"utf8\"))\n } catch {\n return null\n }\n}\n","/**\n * Per-adapter resume strategies — the daemon's view of \"how do I\n * continue a previous session for THIS adapter?\".\n *\n * The driver already has an `AgentCliContinuation` declaration in\n * the adapter manifest (AIP-45). That covers strategy NAMES\n * (`native-resume`, `pinned-session`, `transcript`, `none`) but is\n * silent on the mechanics that live OUTSIDE the runtime — like\n * \"where on disk does this adapter store its conversations?\" or\n * \"what argv do I pass to resume into PTY mode?\".\n *\n * This table is that practical bridge. Each entry declares three\n * optional hooks:\n *\n * outputHint regex matched against each output line; group 1 is\n * the resume id. Stored as `desc.resumeMetadata[storeAs]`.\n * fsProbe async function that probes a per-adapter directory\n * for a stored session id, scoped to a workspace cwd.\n * Used when `outputHint` never matched.\n * spawnArgs given a captured id, returns the argv to spawn a\n * PTY that resumes the session. agentproto then\n * bypasses ACP/agent-cli and runs the provider\n * directly — the most reliable resume path because\n * it leans on the provider's native UX.\n *\n * Adapters that don't declare anything here fall back to:\n * 1. ACP-level resume via `resumeSessionId` on POST /sessions/agent\n * 2. Fresh spawn (same shape, no continuity)\n *\n * Eventually each adapter should ship its own strategy on\n * `AgentCliHandle.resumeStrategy` (driver-side). This central table\n * is the bootstrap: it lets a new adapter become resume-capable\n * without bumping its npm package; once that lands, entries\n * graduate into the adapter packages.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join, resolve } from \"node:path\"\n\n/** Where on disk the resume id ends up on the session descriptor. */\nexport type ResumeMetadataKey =\n | \"claudeResumeId\"\n | \"hermesResumeId\"\n | \"codexResumeId\"\n | \"openClawResumeId\"\n | \"openCodeResumeId\"\n\nexport interface ResumeStrategy {\n /** When set, run on every output line for this adapter. Group 1\n * captures the resume id. The match is saved on the descriptor\n * as `resumeMetadata[storeAs]`. */\n outputHint?: RegExp\n /** Where the matched id is recorded on the descriptor. */\n storeAs: ResumeMetadataKey\n /** Probe the adapter's on-disk session store for the most-recently\n * modified session in the given workspace. Returns the resume id\n * or null when nothing eligible. Files older than `prevStartedAt`\n * are ignored (avoids resuming an unrelated prior conversation).\n *\n * Skip when the adapter doesn't persist sessions externally. */\n fsProbe?(cwd: string, prevStartedAt: string): Promise<string | null>\n /** Return the argv to spawn a PTY that resumes into the given id.\n * When omitted, the daemon falls back to ACP-level resume via\n * the agent-cli protocol instead of the provider's native CLI. */\n spawnArgs?(id: string): string[]\n}\n\nexport const RESUME_STRATEGIES: Record<string, ResumeStrategy> = {\n \"claude-code\": {\n // Printed by claude on graceful exit when session persistence\n // is on (default). Example: `claude --resume 0e483f81-1a44-4bec-9667-b37158450296`\n outputHint: /claude\\s+--resume\\s+([0-9a-f-]{8,})/i,\n storeAs: \"claudeResumeId\",\n fsProbe: probeMtimeLatestJsonl(\".claude/projects\"),\n spawnArgs: id => [\"claude\", \"--resume\", id],\n },\n\n // Stubs for other shipped adapters — fill in as we learn each\n // provider's resume mechanism. Today they fall back to ACP-level\n // resume (whatever the agent-cli runtime supports) or fresh spawn.\n //\n // hermes: { storeAs: \"hermesResumeId\", ... }\n // codex: { storeAs: \"codexResumeId\", ... }\n // openclaw: { storeAs: \"openClawResumeId\", ... }\n // opencode: { storeAs: \"openCodeResumeId\", ... }\n}\n\n/**\n * Build an `fsProbe` for adapters that store one `.jsonl` per session\n * inside `~/<storeRel>/<cwd-encoded>/`. The encoded cwd is the\n * absolute path with `/` → `-` (claude's convention; others tend to\n * use the same scheme). Returns the UUID of the most-recently\n * modified `.jsonl`, filtered to files at-or-after `prevStartedAt`.\n */\nfunction probeMtimeLatestJsonl(\n storeRel: string,\n): (cwd: string, prevStartedAt: string) => Promise<string | null> {\n return async (cwd, prevStartedAt) => {\n const encoded = cwd.replace(/\\//g, \"-\")\n const dir = resolve(homedir(), storeRel, encoded)\n let entries: string[]\n try {\n entries = await fs.readdir(dir)\n } catch {\n return null\n }\n const jsonl = entries.filter(e => e.endsWith(\".jsonl\"))\n if (jsonl.length === 0) return null\n const startedAtMs = Date.parse(prevStartedAt)\n const candidates: { name: string; mtime: number }[] = []\n for (const f of jsonl) {\n try {\n const st = await fs.stat(join(dir, f))\n if (!Number.isFinite(startedAtMs) || st.mtimeMs >= startedAtMs - 1000) {\n candidates.push({ name: f, mtime: st.mtimeMs })\n }\n } catch {\n // ignore unreadable entry\n }\n }\n if (candidates.length === 0) return null\n candidates.sort((a, b) => b.mtime - a.mtime)\n return candidates[0]!.name.replace(/\\.jsonl$/, \"\")\n }\n}\n\n/**\n * Helper: which adapters declare any resume capability? Used by\n * `agentproto sessions restart` to print a helpful \"this adapter\n * doesn't support resume; falling back to fresh spawn\" hint when\n * applicable.\n */\nexport function hasResumeStrategy(adapterSlug: string | undefined): boolean {\n if (!adapterSlug) return false\n const s = RESUME_STRATEGIES[adapterSlug]\n return !!(s && (s.outputHint || s.fsProbe || s.spawnArgs))\n}\n","/**\n * Sessions registry — tracks long-lived child processes spawned by\n * the agentproto daemon (terminals, agent CLIs, custom commands).\n *\n * The registry lives in-memory for the daemon's lifetime; a recent\n * snapshot also persists to `~/.agentproto/sessions.json` so a fresh\n * daemon restart can show \"you had these running before\" instead of\n * losing all visibility on a crash.\n *\n * Each session owns:\n * - identity: id, kind, workspace slug, command + args, started time\n * - lifecycle: status (starting/running/exited/killed/error)\n * - output: last N lines (ring buffer) for instant attach + a\n * Node EventEmitter for live streaming consumers\n *\n * Consumers:\n * - HTTP routes (GET /sessions, /sessions/:id, /sessions/:id/stream,\n * POST /sessions/:id/kill)\n * - CLI `agentproto sessions` (TUI navigation + attach)\n * - guilde-web Active tab (session cards + terminal viewer)\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\"\nimport { EventEmitter } from \"node:events\"\nimport { mkdirSync, writeFileSync, promises as fs, readFileSync } from \"node:fs\"\nimport { RESUME_STRATEGIES } from \"./resume-strategies.js\"\nimport { dirname, resolve } from \"node:path\"\nimport { homedir } from \"node:os\"\nimport { randomUUID } from \"node:crypto\"\n\n/**\n * Minimal shape we need from a driver-agent-cli session — kept as a\n * structural type so the runtime package doesn't take a hard\n * dependency on @agentproto/driver-agent-cli (the http-server route\n * imports it and passes the constructed session in).\n */\nexport interface AgentSessionLike {\n sessionId: string\n send(message: unknown): AsyncIterable<AgentStreamEvent>\n cancel(): Promise<void>\n close(): Promise<void>\n}\n\n/**\n * Minimal PTY surface — structurally compatible with\n * @agentproto/acp/tunnel's PtyProcess (node-pty's IPty wrapper). The\n * runtime declares its own so this package stays native-free; the\n * cli's pty-factory util constructs values that satisfy both.\n */\nexport interface PtyProcess {\n readonly pid: number\n write(data: string): void\n resize(cols: number, rows: number): void\n kill(signal?: string): void\n onData(handler: (data: string) => void): void\n onExit(handler: (event: { exitCode: number; signal?: number }) => void): void\n}\n\nexport interface PtyFactoryOptions {\n command: string\n args: string[]\n cwd?: string\n env?: Record<string, string>\n cols: number\n rows: number\n}\n\nexport type PtyFactory = (opts: PtyFactoryOptions) => PtyProcess\n\nexport interface AgentStreamEvent {\n kind: string\n text?: string\n toolName?: string\n isError?: boolean\n reason?: string\n error?: { message: string; code?: number; data?: unknown }\n}\n\nexport const SESSIONS_FILE_PATH = (): string =>\n resolve(homedir(), \".agentproto\", \"sessions.json\")\n\nexport type SessionKind = \"terminal\" | \"agent-cli\" | \"command\"\nexport type SessionStatus =\n | \"starting\"\n | \"running\"\n | \"exited\"\n | \"killed\"\n | \"error\"\n\nexport interface SessionDescriptor {\n id: string\n kind: SessionKind\n workspaceSlug: string\n /** What was actually run — quoted joined for display purposes\n * (`bash -lc \"claude --resume xyz\"`). */\n command: string\n pid: number | null\n status: SessionStatus\n startedAt: string\n endedAt?: string\n exitCode?: number\n /** Last time anything was written to stdout/stderr. Lets the UI\n * spot stuck sessions (\"running for 2h, last output 12min ago\"). */\n lastOutputAt?: string\n /** Free-text label the spawner can attach (e.g. conversation id,\n * operator name) so the UI can group/filter. */\n label?: string\n /** True when the session was spawned under a real PTY (node-pty)\n * instead of `child_process.spawn`. PTY sessions carry raw ANSI\n * bytes (alt-screen, key bindings, colors); attach goes through\n * WS /sessions/:id/pty rather than SSE /sessions/:id/stream. */\n pty?: boolean\n /** User-friendly slug supplied at spawn time. Optional; when set,\n * attach/stop/kill commands accept it as an alias for the id. */\n name?: string\n /** Argv that was spawned. Persisted so `agentproto sessions restart`\n * can clone the original shape without re-tokenizing the display\n * `command` string. Empty for agent-cli sessions (we record\n * `adapterSlug` separately). */\n argv?: readonly string[]\n /** Working directory the session was spawned in. Cloned by restart. */\n cwd?: string\n /** Adapter slug for agent-cli sessions — restart uses this with\n * `/sessions/agent` to spin up a fresh ACP runtime. Undefined for\n * pty/command kinds. */\n adapterSlug?: string\n /** ACP-level session id (the adapter's own handle — claude-code's\n * conversation id, hermes' chat id, …). Set at spawnAgent time\n * from `agentSession.sessionId`. Survives across daemon restarts\n * via sessions.json so `restart` can pass it as `resumeSessionId`\n * and reattach to the prior conversation history. */\n adapterSessionId?: string\n /** Provider-specific resume hints sniffed from the session's\n * output. claude-code prints `claude --resume <uuid>` on exit;\n * we capture that uuid as `claudeResumeId`. On `restart`, when a\n * hint is present, agentproto prefers a PTY spawn with the\n * provider's native resume command (`claude --resume <id>`) over\n * the ACP-level resume — works wherever the provider persisted\n * the session, not just when the ACP wrapper did.\n *\n * Keys are adapter-specific so future adapters can add their own\n * (\"hermesResumeId\", etc.) without changing this type. */\n resumeMetadata?: Record<string, string>\n}\n\ninterface SessionRuntime {\n desc: SessionDescriptor\n /** Set when the session is a raw spawn (`kind: \"command\"|\"terminal\"`).\n * Agent sessions don't expose the underlying process — the\n * driver-agent-cli runtime owns it. */\n child?: ChildProcess\n /** Set when the session is an agent-cli (multi-turn). The registry\n * keeps it alive across turns; sendPrompt(id, prompt) re-uses it. */\n agentSession?: AgentSessionLike\n /** Adapter slug — only set for agent sessions, helps the UI render\n * \"claude-code\" / \"hermes\" badges. */\n adapterSlug?: string\n /** Set when the session is a PTY (spawnPty). Bytes flow through\n * pty.onData → recentBytes ring + emitter \"data\" event. */\n pty?: PtyProcess\n /** Per-subscriber size requests for the PTY. Min cols/rows\n * across the live set is what we actually call pty.resize with\n * (mirrors tmux's \"smallest attached client wins\" rule). */\n ptySubscribers?: Map<number, { cols: number; rows: number }>\n /** Ring buffer of recent stdout+stderr lines. Capped so a runaway\n * child can't blow the daemon's heap. */\n recentLines: string[]\n /** Ring buffer of recent PTY bytes for replay-on-attach. Total\n * size capped at RECENT_BYTES_CAP — oldest chunks dropped first. */\n recentBytes: Buffer[]\n recentBytesSize: number\n emitter: EventEmitter\n /** True while a turn is in flight. POST /sessions/:id/prompt rejects\n * with 409 when busy — the agent can only handle one turn at a\n * time per session. */\n busy: boolean\n /** Buffer for partial text-delta fragments — agent text events\n * arrive as chunks, we coalesce them across deltas and split on\n * newlines so each line lands as a discrete ring-buffer entry. */\n textBuf: string\n /** Same as textBuf but for `thought` events. Some agents (hermes)\n * stream chain-of-thought as one delta per token, which made the\n * ring buffer unreadable when each token got its own\n * `[thought]` line — coalesce the same way text-delta does. */\n thoughtBuf: string\n /** In-flight resume promise. Deduplicates concurrent prompt\n * attempts on a dead agent session — only one resume call hits\n * the adapter, the rest await this promise. Cleared once\n * resolved (success or failure). */\n resumePromise?: Promise<void>\n}\n\nconst RECENT_LINES_CAP = 500\nconst RECENT_BYTES_CAP = 64 * 1024\nconst PERSIST_DEBOUNCE_MS = 1_500\n/** Cap on the number of historical descriptors loaded from\n * sessions.json at boot. Older entries (by startedAt) are dropped\n * on overflow — newest history wins. Adjust upward if the file\n * starts feeling sparse; downward if the dashboard takes too long\n * to render. */\nconst HISTORY_CAP = 200\n\n/** Strip CSI / SGR ANSI sequences so resume-pattern matching works\n * on dim/coloured output. Liberal regex covering most cases — we\n * don't need byte-perfect parsing here. */\nfunction stripAnsiCodes(s: string): string {\n return s.replace(/\\x1b\\[[0-9;?]*[A-Za-z]/g, \"\")\n}\n\nexport interface SessionsRegistry {\n spawn(input: SpawnSessionInput): SessionDescriptor\n /** Adopt a ChildProcess that was spawned outside the registry —\n * e.g. by the tunnel server when the host dispatches a spawn\n * frame. The registry attaches its stdout/stderr listeners and\n * tracks the descriptor so the child shows up in /sessions and\n * the LocalDaemonSessionsCard. The caller keeps lifecycle\n * ownership (kill / wait); this is purely for observability.\n * Returns the descriptor for the registered session. */\n register(input: RegisterSessionInput): SessionDescriptor\n /** Register an already-built agent session (caller resolves the\n * adapter + builds the runtime). Sets kind=\"agent-cli\", consumes\n * the optional initial prompt synchronously, returns the\n * descriptor. The agent stays alive — call `sendPrompt(id, ...)`\n * for follow-up turns until `kill(id)` closes it. */\n spawnAgent(input: SpawnAgentInput): SessionDescriptor\n /** Spawn a process under a real PTY (node-pty). Bytes flow through\n * the registry's byte ring buffer + emitter; attach with\n * `attachPty(id, ...)`. Throws when the registry was constructed\n * without a `spawnPty` factory (node-pty optional dep missing). */\n spawnPty(input: SpawnPtyInput): SessionDescriptor\n /** Send a follow-up turn to a live agent session. Throws when the\n * session is missing, not an agent-cli kind, or busy. The events\n * stream into the existing ring buffer + line emitter so /stream\n * consumers see them as they arrive. */\n sendPrompt(id: string, message: unknown): Promise<void>\n /** Fire-and-forget variant of `sendPrompt`. Validates the same\n * preconditions synchronously — throws on missing session / wrong\n * kind / busy — but returns immediately after the turn is started,\n * letting the caller stream output via the SSE endpoint instead of\n * blocking on the full turn. Async errors during the turn are\n * pushed into the ring buffer as `[error]` lines so `/stream`\n * subscribers see them. Used by the web UI's chat input where a\n * long turn would otherwise freeze the textbox. */\n enqueuePrompt(id: string, message: unknown): void\n list(): SessionDescriptor[]\n get(id: string): SessionDescriptor | undefined\n /** Subscribe to a session's output. Returns an unsubscribe fn.\n * Initial backfill: synchronously invokes `onLine` once for each\n * line currently in the ring buffer so attaches show context. */\n attach(\n id: string,\n onLine: (line: string, stream: \"stdout\" | \"stderr\") => void\n ): (() => void) | null\n /** Subscribe to a PTY session's byte stream. Returns a control\n * handle (write/resize/detach) and null when the session is\n * missing or not a PTY kind. Replays the ring buffer\n * synchronously before live frames start. Initial `cols`/`rows`\n * are required so the registry can compute min-size across\n * subscribers; recompute on every `resize` call. */\n attachPty(\n id: string,\n initial: { cols: number; rows: number },\n onData: (chunk: Buffer) => void,\n onExit: (event: { exitCode: number; signal?: number }) => void\n ): {\n write(data: string): void\n resize(cols: number, rows: number): void\n detach(): void\n } | null\n /** Find a session by exact id OR exact name match. Returns the\n * descriptor or undefined. Used by HTTP/MCP routes so callers\n * can refer to \"claude-main\" instead of \"sess_a3f8c1b2\". */\n findByIdOrName(query: string): SessionDescriptor | undefined\n /** Write a chunk of text to a PTY session's stdin. Returns true\n * on success, false when the session is missing or not a PTY.\n * Single-shot variant of attachPty().write — useful for MCP\n * tools that drive a session through tool calls. */\n writeTerminalInput(id: string, data: string): boolean\n /** Snapshot the recent PTY byte buffer as one Buffer. Newest\n * bytes at the end; `lastBytes` caps the returned size from the\n * tail. Returns null when the session is missing or not a PTY. */\n readTerminalOutput(id: string, lastBytes?: number): Buffer | null\n kill(id: string, signal?: NodeJS.Signals): boolean\n /** Stop tracking a session (after it exited and the user clicked\n * \"clear\"). Doesn't kill — use `kill` first. */\n forget(id: string): boolean\n /** Stop persisting + close all sessions. Killed children are not\n * awaited — the daemon shutdown loop handles process tree teardown. */\n shutdown(): void\n}\n\nexport interface RegisterSessionInput {\n /** Pre-existing child process to adopt (e.g. from a tunnel spawn). */\n child: ChildProcess\n /** Stable id — typically the tunnel's execId so callers cross-ref. */\n id: string\n workspaceSlug: string\n /** Display label for the descriptor's `command` field. */\n command: string\n kind?: SessionKind\n label?: string\n}\n\nexport interface SpawnAgentInput {\n workspaceSlug: string\n cwd: string\n /** Driver-built session ready to receive turns. Caller resolves\n * the adapter, calls createAgentCliRuntime(handle).start({cwd}),\n * and hands the result here. */\n agentSession: AgentSessionLike\n /** Adapter slug for the descriptor (display only). */\n adapterSlug: string\n /** Optional initial prompt to dispatch immediately. The promise\n * the registry returns resolves AFTER the spawn — the prompt\n * runs in the background, projecting events into the ring\n * buffer. Skip to spawn idle. */\n initialPrompt?: string\n label?: string\n /** Pretty command for the descriptor (display only). */\n commandPreview?: string\n}\n\nexport interface SpawnSessionInput {\n kind: SessionKind\n workspaceSlug: string\n /** Path of the workspace root (for the child's cwd). The registry\n * doesn't validate it against the workspaces config — caller has\n * already resolved this. */\n cwd: string\n /** Argv. First element is the binary; rest are passed verbatim. */\n argv: string[]\n /** Extra env on top of the daemon's process.env. */\n env?: Record<string, string>\n /** Optional pre-set id (lets the spawner reference the session\n * before the spawn returns — useful for telemetry). */\n id?: string\n label?: string\n /** Keep the child's stdin open (default: closed). Most spawned\n * agents are non-interactive and emit a warning when stdin is a\n * pipe with no writer (claude-code prints \"no stdin data\n * received in 3s, proceeding without it\"). Closing stdin lets\n * them skip the wait. PTY/terminal kinds that genuinely need\n * bidirectional IO should opt in via `keepStdin: true` and the\n * caller is then responsible for writing to `child.stdin`. */\n keepStdin?: boolean\n}\n\nexport interface SpawnPtyInput {\n workspaceSlug: string\n cwd: string\n argv: string[]\n /** Initial PTY dimensions. The registry uses min(cols, rows) across\n * active subscribers thereafter — these are the seed values used\n * before anyone attaches. */\n cols: number\n rows: number\n /** Extra env on top of process.env. TERM/LANG/PATH are forced by\n * the factory layer (node-pty.spawn options); don't try to clear\n * them here. */\n env?: Record<string, string>\n /** User-friendly slug. Used by `findByIdOrName(query)`. Must not\n * collide with an existing session's name. */\n name?: string\n label?: string\n}\n\n/**\n * Hook the registry uses to rebuild a dead agent session on demand.\n * Invoked when a prompt arrives for an agent-cli session whose\n * `agentSession` was lost (typically daemon restart). Returns a fresh\n * `AgentSessionLike` bound to the same upstream conversation via\n * `resumeSessionId`, OR null if resume isn't possible (adapter gone,\n * upstream rejected). When null, the prompt path surfaces the same\n * \"not an agent session\" error as before — caller knows the row is a\n * ghost.\n *\n * The CLI wires this into the registry by passing in a closure that\n * calls `resolveAgentAdapter(slug)?.startSession({cwd, resumeSessionId})`,\n * which is the same path the gateway's POST /sessions/agent uses.\n */\nexport type AgentSessionResumer = (input: {\n adapterSlug: string\n cwd: string\n resumeSessionId: string\n}) => Promise<AgentSessionLike | null>\n\nexport function createSessionsRegistry(opts?: {\n /** Override the persistence path — tests pin a tmpdir. */\n persistPath?: string\n /** Disable persistence entirely. */\n persist?: boolean\n /** PTY factory (node-pty wrapper). When omitted, `spawnPty()`\n * throws — the daemon advertises PTY support only when the cli\n * layer resolved node-pty successfully. */\n spawnPty?: PtyFactory\n /** Hook called when a prompt arrives for an agent-cli session whose\n * agentSession binding is gone (daemon restart). When provided,\n * the registry transparently resumes the session via the adapter's\n * resumeSessionId before dispatching the turn. When omitted,\n * killed agent-cli sessions surface the legacy \"not an agent\n * session\" error and the user must spawn fresh. */\n resumeAgent?: AgentSessionResumer\n}): SessionsRegistry {\n const persistPath = opts?.persistPath ?? SESSIONS_FILE_PATH()\n const persist = opts?.persist ?? true\n const ptyFactory = opts?.spawnPty\n const resumeAgent = opts?.resumeAgent\n const sessions = new Map<string, SessionRuntime>()\n let persistTimer: ReturnType<typeof setTimeout> | null = null\n // Monotonically-growing PTY-subscriber id. Detach is O(1) on\n // Map.delete(subId), so we never reuse — overflow at Number.MAX_-\n // SAFE_INTEGER would take ~285 years at 1M attaches/sec.\n let nextSubId = 1\n // Guards `shutdown()` from running twice — double-stop happens in\n // serve --interactive's Ctrl-C race; without this, the second\n // call writes an empty snapshot over the real one.\n let shutdownDone = false\n\n // ── boot-time history load ──\n // Read sessions.json synchronously at construction so the dashboard\n // shows historical sessions immediately on daemon restart. Anything\n // that was \"running\" or \"starting\" when the daemon last died gets\n // marked \"killed\" — we have no way to know if the orphan child\n // survived the daemon's exit, and pretending it's still alive would\n // make attach calls fail mysteriously.\n //\n // Historical entries are GHOSTS: descriptor only, no child / no\n // agentSession / no pty. Calls like kill(id) / attach(id) work on\n // them but degrade to no-ops (the underlying process is gone). The\n // session's `endedAt` is set to now when we infer a kill, so the\n // dashboard ages them from this boot rather than the daemon's last\n // life.\n if (persist) {\n loadHistorySnapshot(persistPath, sessions)\n }\n\n // Belt-and-suspenders: `process.on(\"exit\")` runs even on uncaught\n // throws, terminal-close (SIGHUP), and any termination path that\n // bypassed the regular SIGINT/SIGTERM cleanup. The handler must be\n // sync (Node won't await async there); we already use sync IO in\n // `shutdown()` so this is safe. Idempotency guard inside shutdown\n // prevents a double-write when both this handler and the explicit\n // SIGINT path fire.\n const onProcessExit = (): void => {\n shutdownImpl()\n }\n if (persist) {\n process.on(\"exit\", onProcessExit)\n }\n\n const schedulePersist = (): void => {\n if (!persist) return\n if (persistTimer) clearTimeout(persistTimer)\n persistTimer = setTimeout(() => {\n void persistSnapshot()\n }, PERSIST_DEBOUNCE_MS)\n }\n\n const persistSnapshot = async (): Promise<void> => {\n try {\n const snapshot = {\n savedAt: new Date().toISOString(),\n sessions: Array.from(sessions.values()).map(s => s.desc),\n }\n await fs.mkdir(dirname(persistPath), { recursive: true })\n await fs.writeFile(persistPath, JSON.stringify(snapshot, null, 2) + \"\\n\")\n } catch (err) {\n // Persistence is best-effort — log only, never throw.\n console.warn(\n `[sessions] persist failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n }\n }\n\n const appendLine = (\n rt: SessionRuntime,\n line: string,\n stream: \"stdout\" | \"stderr\"\n ): void => {\n rt.recentLines.push(line)\n if (rt.recentLines.length > RECENT_LINES_CAP) {\n rt.recentLines.splice(0, rt.recentLines.length - RECENT_LINES_CAP)\n }\n rt.desc.lastOutputAt = new Date().toISOString()\n sniffResumeHints(rt, line)\n rt.emitter.emit(\"line\", { line, stream })\n }\n\n /**\n * Provider-specific resume-hint sniffer. Looks up the adapter's\n * strategy in `RESUME_STRATEGIES` and runs its `outputHint` regex\n * against each agent-cli line. The captured id is recorded on the\n * descriptor so `agentproto sessions restart` can use it.\n *\n * ANSI-stripped before matching so dim/color codes don't break the\n * pattern. Adapters without a strategy entry (or without an\n * outputHint) are skipped — they fall back to ACP-level resume.\n */\n const sniffResumeHints = (rt: SessionRuntime, line: string): void => {\n if (rt.desc.kind !== \"agent-cli\") return\n const strategy = rt.desc.adapterSlug\n ? RESUME_STRATEGIES[rt.desc.adapterSlug]\n : undefined\n if (!strategy?.outputHint) return\n const plain = stripAnsiCodes(line)\n const m = plain.match(strategy.outputHint)\n if (m && m[1]) {\n rt.desc.resumeMetadata = {\n ...(rt.desc.resumeMetadata ?? {}),\n [strategy.storeAs]: m[1],\n }\n schedulePersist()\n }\n }\n\n /**\n * PTY byte ring buffer. Keeps the last ~64 KiB of raw bytes so a\n * fresh attacher sees the current screenful (alt-screen apps like\n * Claude TUI / vim repaint on next interaction but a snapshot is\n * still better than blank). Drops oldest chunks when over cap;\n * never splits within a chunk — Buffer arithmetic on UTF-8 mid-\n * sequence would corrupt multi-byte glyphs.\n */\n const appendBytes = (rt: SessionRuntime, chunk: Buffer): void => {\n rt.recentBytes.push(chunk)\n rt.recentBytesSize += chunk.byteLength\n while (\n rt.recentBytesSize > RECENT_BYTES_CAP &&\n rt.recentBytes.length > 1\n ) {\n const dropped = rt.recentBytes.shift()\n if (dropped) rt.recentBytesSize -= dropped.byteLength\n }\n rt.desc.lastOutputAt = new Date().toISOString()\n rt.emitter.emit(\"data\", chunk)\n }\n\n /**\n * Recompute the smallest cols/rows across the active subscriber\n * set and resize the PTY accordingly (tmux's \"smallest attached\n * client wins\" rule). No-op when the subscriber map is empty.\n */\n const reconcilePtySize = (rt: SessionRuntime): void => {\n if (!rt.pty || !rt.ptySubscribers || rt.ptySubscribers.size === 0) return\n let cols = Infinity\n let rows = Infinity\n for (const dim of rt.ptySubscribers.values()) {\n if (dim.cols < cols) cols = dim.cols\n if (dim.rows < rows) rows = dim.rows\n }\n if (!Number.isFinite(cols) || !Number.isFinite(rows)) return\n try {\n rt.pty.resize(cols, rows)\n } catch {\n // pty may have exited between the emit and the resize — swallow.\n }\n }\n\n /**\n * Project ACP-style stream events into ring-buffer lines. Keeps\n * the line shape simple so the existing /stream SSE consumer\n * (and the xterm panel) just renders them as-is.\n */\n const projectEvent = (rt: SessionRuntime, evt: AgentStreamEvent): void => {\n switch (evt.kind) {\n case \"text-delta\":\n if (evt.text) {\n // text-delta is a stream of chunks — split on newlines so\n // each line lands in the ring buffer separately. Coalesce\n // a trailing fragment via rt.textBuf.\n const combined = rt.textBuf + evt.text\n const lines = combined.split(/\\r?\\n/)\n rt.textBuf = lines.pop() ?? \"\"\n for (const line of lines) appendLine(rt, line, \"stdout\")\n }\n break\n case \"thought\":\n if (evt.text) {\n // Same coalescing as text-delta — some adapters stream\n // chain-of-thought one token at a time, which would\n // otherwise produce ~100 [thought] lines per turn.\n const combined = rt.thoughtBuf + evt.text\n const lines = combined.split(/\\r?\\n/)\n rt.thoughtBuf = lines.pop() ?? \"\"\n for (const line of lines) {\n if (line.trim()) {\n appendLine(rt, `\\x1b[2m[thought] ${line}\\x1b[0m`, \"stdout\")\n }\n }\n }\n break\n case \"tool-call\":\n appendLine(\n rt,\n `\\x1b[36m[tool] ${evt.toolName ?? \"?\"}\\x1b[0m`,\n \"stdout\"\n )\n break\n case \"tool-result\":\n if (evt.isError)\n appendLine(rt, `\\x1b[31m[tool-error]\\x1b[0m`, \"stderr\")\n break\n case \"agent-prompt\":\n appendLine(rt, `\\x1b[33m[awaiting input]\\x1b[0m`, \"stdout\")\n break\n case \"turn-end\": {\n // Flush any buffered text/thought fragments as final lines.\n if (rt.thoughtBuf.trim()) {\n appendLine(\n rt,\n `\\x1b[2m[thought] ${rt.thoughtBuf}\\x1b[0m`,\n \"stdout\"\n )\n }\n rt.thoughtBuf = \"\"\n if (rt.textBuf) {\n appendLine(rt, rt.textBuf, \"stdout\")\n rt.textBuf = \"\"\n }\n appendLine(\n rt,\n `\\x1b[2m── turn-end (${evt.reason ?? \"completed\"}) ──\\x1b[0m`,\n \"stdout\"\n )\n break\n }\n case \"error\": {\n const code =\n typeof evt.error?.code === \"number\" ? ` (code ${evt.error.code})` : \"\"\n appendLine(\n rt,\n `\\x1b[31m[error]${code} ${evt.error?.message ?? \"unknown\"}\\x1b[0m`,\n \"stderr\"\n )\n // Project the child's stderr tail when define-agent-cli\n // attached it — otherwise the user sees only \"Invalid\n // params\" and has to dig into the daemon log for context.\n const data = evt.error?.data as\n | { stderr?: unknown }\n | null\n | undefined\n if (data && typeof data === \"object\" && typeof data.stderr === \"string\") {\n for (const line of data.stderr.split(/\\r?\\n/)) {\n if (line) appendLine(rt, `\\x1b[2m ${line}\\x1b[0m`, \"stderr\")\n }\n }\n break\n }\n }\n }\n\n /**\n * Drive one agent turn. Sets busy=true, drains the event stream\n * into the ring buffer, clears busy on completion. Bumps the\n * descriptor status to \"error\" if the iteration throws (network\n * drop, child died mid-turn).\n */\n /**\n * Shared sync validation for sendPrompt + enqueuePrompt. Throws on\n * missing session / wrong kind / busy so both code paths surface\n * the exact same error messages — the only difference is whether\n * the caller awaits the turn.\n */\n const validateAgentTurn = (id: string, caller: string): SessionRuntime => {\n const rt = sessions.get(id)\n if (!rt) throw new Error(`${caller}: no session \"${id}\"`)\n if (!rt.agentSession) {\n throw new Error(\n `${caller}: session \"${id}\" is not an agent session (kind=${rt.desc.kind})`\n )\n }\n if (rt.busy) {\n throw new Error(\n `${caller}: session \"${id}\" is mid-turn — wait for it to finish or cancel`\n )\n }\n return rt\n }\n\n /**\n * Attempt to resume a dead agent-cli session by re-spawning the\n * adapter with the persisted `adapterSessionId`. The conversation\n * continues from where it left off — ACP's `resumeSessionId`\n * contract guarantees the adapter rehydrates state from the\n * upstream provider (Anthropic / OpenAI / etc.) when supported.\n *\n * Returns silently when:\n * - resumeAgent hook wasn't provided (older daemon embedding)\n * - session is already alive (binding present)\n * - session is a non-agent kind (terminal/command can't resume)\n * - descriptor lacks adapterSessionId or adapterSlug (legacy row\n * persisted before resume metadata was tracked)\n *\n * Concurrent prompt arrivals share one resume attempt via\n * `rt.resumePromise`.\n */\n const maybeResumeAgent = async (rt: SessionRuntime): Promise<void> => {\n if (rt.agentSession) return\n if (!resumeAgent) return\n if (rt.desc.kind !== \"agent-cli\") return\n const adapterSlug = rt.desc.adapterSlug ?? rt.adapterSlug\n const adapterSessionId = rt.desc.adapterSessionId\n const cwd = rt.desc.cwd\n if (!adapterSlug || !adapterSessionId || !cwd) return\n if (rt.resumePromise) {\n await rt.resumePromise\n return\n }\n rt.resumePromise = (async () => {\n appendLine(\n rt,\n `── resuming ${adapterSlug} session ${adapterSessionId} ──`,\n \"stdout\"\n )\n try {\n const fresh = await resumeAgent({\n adapterSlug,\n cwd,\n resumeSessionId: adapterSessionId,\n })\n if (!fresh) {\n appendLine(\n rt,\n `[error] resume failed: adapter '${adapterSlug}' returned null`,\n \"stderr\"\n )\n return\n }\n rt.agentSession = fresh\n rt.adapterSlug = adapterSlug\n rt.desc.adapterSessionId = fresh.sessionId\n if (rt.desc.status !== \"running\") {\n rt.desc.status = \"running\"\n delete rt.desc.endedAt\n delete rt.desc.exitCode\n rt.emitter.emit(\"status\", rt.desc.status)\n }\n schedulePersist()\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n appendLine(rt, `[error] resume failed: ${msg}`, \"stderr\")\n }\n })()\n try {\n await rt.resumePromise\n } finally {\n rt.resumePromise = undefined\n }\n }\n\n const runAgentTurn = async (\n rt: SessionRuntime,\n message: unknown\n ): Promise<void> => {\n if (!rt.agentSession) {\n throw new Error(\"runAgentTurn: session has no agentSession\")\n }\n rt.busy = true\n try {\n appendLine(\n rt,\n `\\x1b[2m── ▶ ${typeof message === \"string\" ? message : JSON.stringify(message)} ──\\x1b[0m`,\n \"stdout\"\n )\n // ACP's `prompt` field expects ContentBlock[] (or a single\n // block). Hosts that send a raw string get auto-wrapped into\n // `{type: \"text\", text: \"...\"}` so callers can hand us\n // human-friendly prompts without shaping the wire format.\n const wrapped =\n typeof message === \"string\" ? { type: \"text\", text: message } : message\n for await (const evt of rt.agentSession.send(wrapped)) {\n projectEvent(rt, evt)\n }\n } catch (err) {\n rt.desc.status = \"error\"\n rt.desc.endedAt = new Date().toISOString()\n appendLine(\n rt,\n `[turn error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n schedulePersist()\n } finally {\n rt.busy = false\n }\n }\n\n const wireOutputStreams = (rt: SessionRuntime): void => {\n const onChunk =\n (stream: \"stdout\" | \"stderr\") =>\n (chunk: Buffer | string): void => {\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\")\n for (const line of text.split(/\\r?\\n/)) {\n if (line.length > 0) appendLine(rt, line, stream)\n }\n }\n // Only called from spawn() which always sets rt.child — narrow\n // here so the stream listeners don't trip the optional-chain.\n if (!rt.child) return\n rt.child.stdout?.on(\"data\", onChunk(\"stdout\"))\n rt.child.stderr?.on(\"data\", onChunk(\"stderr\"))\n }\n\n return {\n spawn(input) {\n const id = input.id ?? `sess_${randomUUID().slice(0, 8)}`\n if (sessions.has(id)) {\n throw new Error(`sessions.spawn: id \"${id}\" already in use`)\n }\n const env = { ...process.env, ...(input.env ?? {}) }\n // Filter out Node bookkeeping that confuses subprocesses.\n delete env.NODE_OPTIONS\n const [bin, ...args] = input.argv\n if (!bin) throw new Error(\"sessions.spawn: argv must include a binary\")\n // Close stdin by default — most agent CLIs spawn-and-prompt\n // (claude/codex/aider/etc.) read argv for the prompt and will\n // otherwise sit waiting for piped input. Caller opts in to a\n // writeable stdin via `keepStdin: true` (terminal/PTY kinds).\n const stdinMode = input.keepStdin ? \"pipe\" : \"ignore\"\n const child = spawn(bin, args, {\n cwd: input.cwd,\n env: env as NodeJS.ProcessEnv,\n stdio: [stdinMode, \"pipe\", \"pipe\"],\n })\n const desc: SessionDescriptor = {\n id,\n kind: input.kind,\n workspaceSlug: input.workspaceSlug,\n command: [bin, ...args].map(quoteArg).join(\" \"),\n pid: child.pid ?? null,\n status: \"starting\",\n startedAt: new Date().toISOString(),\n argv: input.argv,\n cwd: input.cwd,\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n child,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n // Don't crash the daemon when no listener is attached — the\n // emitter's \"error\" event would otherwise propagate.\n rt.emitter.setMaxListeners(50)\n\n sessions.set(id, rt)\n wireOutputStreams(rt)\n\n child.once(\"spawn\", () => {\n desc.status = \"running\"\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n child.once(\"error\", err => {\n desc.status = \"error\"\n desc.endedAt = new Date().toISOString()\n appendLine(rt, `[spawn error] ${err.message}`, \"stderr\")\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n child.once(\"exit\", (code, signal) => {\n if (signal && desc.status !== \"killed\") desc.status = \"killed\"\n else if (desc.status === \"running\" || desc.status === \"starting\") {\n desc.status = \"exited\"\n }\n desc.endedAt = new Date().toISOString()\n if (typeof code === \"number\") desc.exitCode = code\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n register(input) {\n if (sessions.has(input.id)) {\n // Already adopted (re-tracking is a noop). Return the\n // existing descriptor so callers don't have to special-case.\n const existing = sessions.get(input.id)\n if (existing) return existing.desc\n }\n const desc: SessionDescriptor = {\n id: input.id,\n kind: input.kind ?? \"command\",\n workspaceSlug: input.workspaceSlug,\n command: input.command,\n pid: input.child.pid ?? null,\n status: input.child.killed ? \"killed\" : \"running\",\n startedAt: new Date().toISOString(),\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n child: input.child,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(input.id, rt)\n wireOutputStreams(rt)\n // Wire exit so the descriptor flips when the adopted child\n // dies — same handlers as spawn() but registered post-hoc\n // because the child is already alive.\n input.child.once(\"exit\", (code, signal) => {\n if (signal && desc.status !== \"killed\") desc.status = \"killed\"\n else if (desc.status === \"running\") desc.status = \"exited\"\n desc.endedAt = new Date().toISOString()\n if (typeof code === \"number\") desc.exitCode = code\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n input.child.once(\"error\", err => {\n desc.status = \"error\"\n desc.endedAt = new Date().toISOString()\n appendLine(rt, `[child error] ${err.message}`, \"stderr\")\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n spawnAgent(input) {\n const id = `sess_${randomUUID().slice(0, 8)}`\n const desc: SessionDescriptor = {\n id,\n kind: \"agent-cli\",\n workspaceSlug: input.workspaceSlug,\n command: input.commandPreview ?? `${input.adapterSlug} (agent)`,\n pid: null,\n status: \"running\", // driver already started the session\n startedAt: new Date().toISOString(),\n cwd: input.cwd,\n adapterSlug: input.adapterSlug,\n // ACP-level session id — sticks across daemon restart so\n // `agentproto sessions restart <id>` can pass it as\n // `resumeSessionId` and the adapter reattaches to the prior\n // conversation rather than starting blank.\n adapterSessionId: input.agentSession.sessionId,\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n agentSession: input.agentSession,\n adapterSlug: input.adapterSlug,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(id, rt)\n appendLine(\n rt,\n `── ${input.adapterSlug} agent session ${input.agentSession.sessionId} (cwd ${input.cwd}) ──`,\n \"stdout\"\n )\n schedulePersist()\n // Fire-and-forget the initial prompt (if any). Errors land in\n // the ring buffer + bump status to \"error\" but don't reject\n // the spawn — the descriptor was already returned.\n if (input.initialPrompt) {\n void runAgentTurn(rt, input.initialPrompt).catch(err => {\n appendLine(\n rt,\n `[turn error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n })\n }\n return desc\n },\n spawnPty(input) {\n if (!ptyFactory) {\n throw new Error(\n \"sessions.spawnPty: no PTY factory configured (node-pty optional dep missing in the daemon)\"\n )\n }\n const id = `sess_${randomUUID().slice(0, 8)}`\n // Reject the name only when the prior holder is still alive —\n // killed/exited/error sessions keep their descriptor in the\n // registry for history, but their name is free to reuse so\n // `stop X && terminal --name X` round-trips cleanly.\n if (input.name) {\n for (const rt of sessions.values()) {\n if (rt.desc.name !== input.name) continue\n const status = rt.desc.status\n if (status === \"running\" || status === \"starting\") {\n throw new Error(\n `sessions.spawnPty: name \"${input.name}\" already in use by ${rt.desc.id} (status=${status})`,\n )\n }\n // Free the name on the dead session so id-or-name lookup\n // resolves to the NEW one. The old descriptor stays in the\n // registry (you can still find it by id in the list).\n rt.desc.name = undefined\n }\n }\n const [bin, ...args] = input.argv\n if (!bin) {\n throw new Error(\"sessions.spawnPty: argv must include a binary\")\n }\n // node-pty forces its own minimal env unless we forward — pass\n // process.env merged with caller overrides. The factory layer\n // also forces TERM=xterm-256color so alt-screen apps render.\n const env = { ...(process.env as Record<string, string>), ...(input.env ?? {}) }\n delete env.NODE_OPTIONS\n const pty: PtyProcess = ptyFactory({\n command: bin,\n args,\n cwd: input.cwd,\n env,\n cols: input.cols,\n rows: input.rows,\n })\n const desc: SessionDescriptor = {\n id,\n kind: \"terminal\",\n workspaceSlug: input.workspaceSlug,\n command: [bin, ...args].map(quoteArg).join(\" \"),\n pid: pty.pid,\n status: \"running\",\n startedAt: new Date().toISOString(),\n pty: true,\n argv: input.argv,\n cwd: input.cwd,\n ...(input.name ? { name: input.name } : {}),\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n pty,\n ptySubscribers: new Map(),\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(id, rt)\n pty.onData((chunk: string) => {\n // node-pty emits utf-8 strings. Convert once at the boundary\n // so the ring buffer + emitter consumers all see Buffer.\n appendBytes(rt, Buffer.from(chunk, \"utf8\"))\n })\n pty.onExit(evt => {\n if (rt.desc.status !== \"killed\") {\n rt.desc.status = \"exited\"\n }\n rt.desc.endedAt = new Date().toISOString()\n if (typeof evt.exitCode === \"number\") rt.desc.exitCode = evt.exitCode\n rt.emitter.emit(\"exit\", evt)\n rt.emitter.emit(\"status\", rt.desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n async sendPrompt(id, message) {\n const rtPre = sessions.get(id)\n if (rtPre) await maybeResumeAgent(rtPre)\n const rt = validateAgentTurn(id, \"sendPrompt\")\n await runAgentTurn(rt, message)\n },\n enqueuePrompt(id, message) {\n // For sync `enqueuePrompt`, we need to surface an immediate\n // error when the session is missing OR when it's a non-agent\n // kind that can't be resumed at all. But when the session IS\n // an agent-cli with resume metadata, defer validation until\n // after the resume attempt so a dead-but-resumable row Just\n // Works for the caller (no \"not an agent session\" error after\n // a daemon restart).\n const rtPre = sessions.get(id)\n if (!rtPre) {\n throw new Error(`enqueuePrompt: no session \"${id}\"`)\n }\n if (rtPre.desc.kind !== \"agent-cli\") {\n throw new Error(\n `enqueuePrompt: session \"${id}\" is not an agent session (kind=${rtPre.desc.kind})`\n )\n }\n if (rtPre.busy) {\n throw new Error(\n `enqueuePrompt: session \"${id}\" is mid-turn — wait for it to finish or cancel`\n )\n }\n // Fire-and-forget: resume (if needed) then dispatch. Errors\n // during either step land in the ring buffer as `[error]`\n // lines so the SSE consumer sees them.\n void (async () => {\n try {\n await maybeResumeAgent(rtPre)\n const rt = validateAgentTurn(id, \"enqueuePrompt\")\n await runAgentTurn(rt, message)\n } catch (err) {\n appendLine(\n rtPre,\n `[error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n }\n })()\n },\n list() {\n return Array.from(sessions.values())\n .map(s => s.desc)\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n },\n get(id) {\n return sessions.get(id)?.desc\n },\n attach(id, onLine) {\n const rt = sessions.get(id)\n if (!rt) return null\n // Backfill: synchronously replay the ring buffer so attaches\n // see the recent context, then subscribe for new lines.\n for (const line of rt.recentLines) onLine(line, \"stdout\")\n const handler = (evt: {\n line: string\n stream: \"stdout\" | \"stderr\"\n }): void => onLine(evt.line, evt.stream)\n rt.emitter.on(\"line\", handler)\n return () => rt.emitter.off(\"line\", handler)\n },\n attachPty(id, initial, onData, onExit) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty || !rt.ptySubscribers) return null\n // Backfill: flush the byte ring buffer so a fresh attach lands\n // on the recent screenful. Alt-screen apps repaint on next\n // input but a snapshot is still better than blank.\n for (const chunk of rt.recentBytes) onData(chunk)\n // Subscriber registration: a monotonically-growing key so the\n // size map can hold the per-subscriber dims and detach is O(1).\n const subId = nextSubId++\n rt.ptySubscribers.set(subId, { cols: initial.cols, rows: initial.rows })\n reconcilePtySize(rt)\n const dataHandler = (chunk: Buffer): void => onData(chunk)\n const exitHandler = (evt: {\n exitCode: number\n signal?: number\n }): void => onExit(evt)\n rt.emitter.on(\"data\", dataHandler)\n rt.emitter.once(\"exit\", exitHandler)\n return {\n write(data: string): void {\n if (!rt.pty) return\n try {\n rt.pty.write(data)\n } catch {\n // PTY already exited — drop the input silently.\n }\n },\n resize(cols: number, rows: number): void {\n if (!rt.ptySubscribers) return\n rt.ptySubscribers.set(subId, { cols, rows })\n reconcilePtySize(rt)\n },\n detach(): void {\n rt.emitter.off(\"data\", dataHandler)\n rt.emitter.off(\"exit\", exitHandler)\n rt.ptySubscribers?.delete(subId)\n reconcilePtySize(rt)\n },\n }\n },\n findByIdOrName(query) {\n const direct = sessions.get(query)\n if (direct) return direct.desc\n for (const rt of sessions.values()) {\n if (rt.desc.name === query) return rt.desc\n }\n return undefined\n },\n writeTerminalInput(id, data) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty) return false\n try {\n rt.pty.write(data)\n return true\n } catch {\n return false\n }\n },\n readTerminalOutput(id, lastBytes) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty) return null\n const joined = Buffer.concat(rt.recentBytes, rt.recentBytesSize)\n if (typeof lastBytes === \"number\" && lastBytes > 0 && joined.byteLength > lastBytes) {\n return joined.subarray(joined.byteLength - lastBytes)\n }\n return joined\n },\n kill(id, signal = \"SIGTERM\") {\n const rt = sessions.get(id)\n if (!rt) return false\n if (\n rt.desc.status === \"exited\" ||\n rt.desc.status === \"killed\" ||\n rt.desc.status === \"error\"\n ) {\n return false\n }\n rt.desc.status = \"killed\"\n rt.desc.endedAt = new Date().toISOString()\n // Close agent session first (graceful protocol shutdown), then\n // SIGTERM the underlying child/pty if any. Either branch is a\n // best-effort — the descriptor flip is what the UI surfaces.\n if (rt.agentSession) {\n void rt.agentSession.close().catch(() => undefined)\n }\n if (rt.pty) {\n try {\n rt.pty.kill(signal)\n } catch {\n // pty already gone — fall through\n }\n }\n rt.child?.kill(signal)\n schedulePersist()\n return true\n },\n forget(id) {\n const rt = sessions.get(id)\n if (!rt) return false\n // Don't leak: tear down the emitter so backfill listeners stop.\n rt.emitter.removeAllListeners()\n sessions.delete(id)\n schedulePersist()\n return true\n },\n shutdown() {\n shutdownImpl()\n },\n }\n\n /**\n * The actual shutdown logic, hoisted so both the explicit\n * `shutdown()` method AND the `process.on(\"exit\")` safety net\n * can call it. Sync (no awaits) so it works in the `exit` event\n * handler.\n *\n * Idempotent — `serve --interactive` calls gateway.stop() twice in\n * some Ctrl-C race paths (parent SIGINT handler + the child-exit\n * promise both fire), and `process.on(\"exit\")` ALSO fires at the\n * end of every termination path. Without the guard, the second\n * call clears the already-empty sessions Map and writes an empty\n * snapshot back to sessions.json, wiping history.\n */\n function shutdownImpl(): void {\n if (shutdownDone) return\n shutdownDone = true\n if (persistTimer) clearTimeout(persistTimer)\n if (persist) {\n try {\n process.off(\"exit\", onProcessExit)\n } catch {\n // ignore — handler may not be installed\n }\n }\n // Mark any still-alive sessions as killed BEFORE the final\n // flush so the snapshot accurately reflects what happened. On\n // the next boot, load reads these and we won't have to guess\n // (\"was running last time → assume killed\" is then a no-op).\n const nowIso = new Date().toISOString()\n for (const rt of sessions.values()) {\n rt.emitter.removeAllListeners()\n if (\n rt.desc.status === \"running\" ||\n rt.desc.status === \"starting\"\n ) {\n rt.desc.status = \"killed\"\n rt.desc.endedAt = nowIso\n if (rt.agentSession) {\n void rt.agentSession.close().catch(() => undefined)\n }\n if (rt.pty) {\n try {\n rt.pty.kill(\"SIGTERM\")\n } catch {\n // already exited\n }\n }\n rt.child?.kill(\"SIGTERM\")\n }\n }\n // Sync flush so quick sessions (spawned + ended in less than\n // PERSIST_DEBOUNCE_MS) aren't lost. The debounced async write\n // may have been cancelled by clearTimeout above, but a 200-byte\n // sync write at shutdown is cheap and the data needs to land.\n if (persist) {\n try {\n const snapshot = {\n savedAt: nowIso,\n sessions: Array.from(sessions.values()).map(s => s.desc),\n }\n mkdirSync(dirname(persistPath), { recursive: true })\n writeFileSync(persistPath, JSON.stringify(snapshot, null, 2) + \"\\n\")\n } catch {\n // best-effort — same policy as the async path\n }\n }\n sessions.clear()\n }\n}\n\n/**\n * Read the persisted snapshot at boot and reinflate session\n * descriptors as historical \"ghost\" entries. Sync-read because this\n * runs once at construction, the file is small (~200 entries), and\n * keeping it sync avoids making createSessionsRegistry async (would\n * cascade through createGateway + every embedding host).\n *\n * Anything that was \"running\"/\"starting\" when the daemon last died\n * gets re-classified as \"killed\" with endedAt=now — we can't tell\n * if the orphan PID survived the daemon's exit, and pretending it's\n * still alive would make attach/kill calls fail mysteriously. The\n * descriptor stays in the registry for history; the dashboard sees\n * it under SESSIONS, the user can `d` to forget.\n *\n * Ghosts carry NO live child / agentSession / pty — calls that\n * would interact with the underlying process degrade to no-ops.\n * Output ring buffers (lines + bytes) are empty: we don't persist\n * those, only the descriptor metadata.\n */\nfunction loadHistorySnapshot(\n persistPath: string,\n sessions: Map<string, SessionRuntime>,\n): void {\n let raw: string\n try {\n raw = readFileSync(persistPath, \"utf8\")\n } catch {\n return // ENOENT etc. — first boot, no history.\n }\n let parsed: { sessions?: SessionDescriptor[] }\n try {\n parsed = JSON.parse(raw)\n } catch {\n console.warn(\n `[sessions] history file ${persistPath} is malformed — ignoring`,\n )\n return\n }\n if (!Array.isArray(parsed.sessions)) return\n // Newest first so the FIFO cap drops oldest.\n const sorted = parsed.sessions\n .filter((s): s is SessionDescriptor => !!s && typeof s.id === \"string\")\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n .slice(0, HISTORY_CAP)\n const now = new Date().toISOString()\n for (const desc of sorted) {\n if (sessions.has(desc.id)) continue // collision with a live entry — keep live\n const wasAlive = desc.status === \"running\" || desc.status === \"starting\"\n const reclassified: SessionDescriptor = wasAlive\n ? {\n ...desc,\n status: \"killed\",\n endedAt: desc.endedAt ?? now,\n }\n : desc\n const rt: SessionRuntime = {\n desc: reclassified,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(desc.id, rt)\n }\n}\n\n/** Minimal shell-quote — wraps args containing whitespace or quotes\n * so the rendered `command` field is copy-pasteable. */\nfunction quoteArg(arg: string): string {\n if (arg === \"\") return '\"\"'\n if (/^[a-zA-Z0-9._/=:@,+-]+$/.test(arg)) return arg\n return `\"${arg.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`\n}\n","/**\n * mcp-proxy — connect the daemon as an MCP *client* to every server\n * the user imported via `~/.agentproto/imported-mcps.json`, and\n * surface their tools through dedicated MCP tools on the daemon's\n * own server. The chain looks like:\n *\n * operator (cloud Guilde) ──MCP──▶ agentproto-daemon (this proxy)\n * │\n * ├──stdio──▶ chrome-devtools-mcp\n * └──http───▶ goose-bridge\n *\n * v1 design choice: instead of re-registering each upstream tool\n * under a namespaced name (which requires JSON-Schema↔Zod conversion\n * for every exotic shape — recursive refs, oneOf, etc.), the proxy\n * exposes two indirection tools:\n * - `mcp_list_imported_tools(alias?)` lets the operator discover\n * what's available\n * - `mcp_call_imported(alias, toolName, args)` invokes a specific\n * tool, forwarding the JSON args verbatim\n *\n * Trade-off: agents do a 2-step (list → call) instead of seeing the\n * imports directly in their tool palette. We keep tool inputs\n * unconstrained at the MCP layer; validation is the upstream\n * server's job. v2 can re-expose namespaced tools once we ship a\n * solid JSON-Schema → Zod converter.\n *\n * Lifecycle: clients are connected lazily on the first call that\n * touches them and held open until daemon shutdown. The registry\n * notices new/removed imports by stat'ing the imports file's mtime\n * before each call — cheap, avoids forcing the HTTP routes to push.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\"\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\"\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\"\nimport {\n loadImportedMcps,\n IMPORTED_MCPS_PATH,\n type ImportedMcpEntry,\n} from \"./mcp-imports.js\"\nimport type { DiscoveredMcp } from \"./mcp-discovery.js\"\n\ninterface ProxyClient {\n entry: ImportedMcpEntry\n /** Live MCP client. Null while a connect is in-flight or after a\n * connection error — the next call retries. */\n client: Client | null\n /** Tools list cached after the first successful fetch. Cleared on\n * disconnect so stale tool names don't survive a reconnect. */\n tools: ProxyToolDescriptor[] | null\n /** Last connection error message, kept so listAliases can surface\n * diagnostics to the operator without re-throwing on every list. */\n lastError: string | null\n}\n\nexport interface ProxyToolDescriptor {\n name: string\n description?: string\n /** JSON Schema as published by the upstream server. Forwarded to\n * the operator verbatim — they read it to figure out args. */\n inputSchema?: unknown\n}\n\nexport interface ProxyAliasSummary {\n alias: string\n importId: string\n source: DiscoveredMcp[\"source\"]\n type: DiscoveredMcp[\"type\"]\n /** \"connected\" | \"error\" | \"pending\" — pending = never tried yet. */\n status: \"connected\" | \"error\" | \"pending\"\n toolCount: number\n lastError?: string\n}\n\nexport interface CallResult {\n ok: true\n result: unknown\n}\nexport interface CallError {\n ok: false\n error: string\n}\nexport type ProxyCallOutcome = CallResult | CallError\n\nexport class McpProxyRegistry {\n private clients = new Map<string, ProxyClient>()\n private lastMtimeMs = 0\n /** Sentinel so we know whether the file has *ever* been read.\n * Distinguishes \"file missing on first call\" (legit empty state)\n * from \"we've read it before and it's gone\" (treat as empty too,\n * but only after closing live clients). */\n private hasReadOnce = false\n\n /**\n * Reload the imports file when its mtime has advanced. Avoids\n * repeated parsing when nothing changed — most calls are no-ops.\n * Disconnects clients whose import was removed; connects the new\n * set lazily (the first call that touches them).\n */\n async ensureCurrent(): Promise<void> {\n let mtimeMs = 0\n try {\n const st = await fs.stat(IMPORTED_MCPS_PATH())\n mtimeMs = st.mtimeMs\n } catch {\n // ENOENT — empty imports state. If we'd previously loaded\n // some, close them.\n mtimeMs = 0\n }\n if (this.hasReadOnce && mtimeMs === this.lastMtimeMs) return\n\n const config = await loadImportedMcps().catch(() => ({\n version: 1 as const,\n imports: [] as ImportedMcpEntry[],\n }))\n const wantedIds = new Set(config.imports.map(e => e.id))\n\n // Drop clients for imports the user removed.\n for (const [id, c] of this.clients.entries()) {\n if (!wantedIds.has(id)) {\n await safeClose(c.client)\n this.clients.delete(id)\n }\n }\n // Add placeholders for new imports — connect lazily.\n for (const entry of config.imports) {\n const existing = this.clients.get(entry.id)\n if (existing) {\n // Snapshot may have changed (user re-imported same id with\n // different command). Detect by comparing serialised\n // snapshots; on mismatch, force reconnect.\n if (\n JSON.stringify(existing.entry.snapshot) !==\n JSON.stringify(entry.snapshot)\n ) {\n await safeClose(existing.client)\n this.clients.set(entry.id, freshPlaceholder(entry))\n } else {\n existing.entry = entry\n }\n } else {\n this.clients.set(entry.id, freshPlaceholder(entry))\n }\n }\n this.lastMtimeMs = mtimeMs\n this.hasReadOnce = true\n }\n\n /**\n * Lazy connect: the first call to `connectIfNeeded(alias)`\n * actually opens the transport + handshakes. Subsequent calls\n * reuse the live client.\n */\n private async connectIfNeeded(alias: string): Promise<ProxyClient | null> {\n await this.ensureCurrent()\n const handle = this.findByAlias(alias)\n if (!handle) return null\n if (handle.client) return handle\n try {\n const client = await openClient(handle.entry)\n handle.client = client\n handle.lastError = null\n // Eagerly fetch tools so listTools doesn't pay the round-trip\n // on next call. Cheap (single tools/list request).\n const t = await client.listTools()\n handle.tools = t.tools.map(toDescriptor)\n return handle\n } catch (err) {\n handle.client = null\n handle.tools = null\n handle.lastError = err instanceof Error ? err.message : String(err)\n return handle\n }\n }\n\n /** Find a client handle by alias *or* import id (defensive — agents\n * sometimes pass the id from `list_imported_mcps`). */\n private findByAlias(aliasOrId: string): ProxyClient | undefined {\n for (const c of this.clients.values()) {\n if (c.entry.alias === aliasOrId) return c\n if (c.entry.id === aliasOrId) return c\n }\n return undefined\n }\n\n async listAliases(): Promise<ProxyAliasSummary[]> {\n await this.ensureCurrent()\n return Array.from(this.clients.values()).map(c => ({\n alias: c.entry.alias,\n importId: c.entry.id,\n source: c.entry.snapshot.source,\n type: c.entry.snapshot.type,\n status: c.client\n ? \"connected\"\n : c.lastError\n ? \"error\"\n : \"pending\",\n toolCount: c.tools?.length ?? 0,\n ...(c.lastError ? { lastError: c.lastError } : {}),\n }))\n }\n\n async listTools(\n alias: string\n ): Promise<{ ok: true; tools: ProxyToolDescriptor[] } | { ok: false; error: string }> {\n const handle = await this.connectIfNeeded(alias)\n if (!handle) return { ok: false, error: `unknown alias \"${alias}\"` }\n if (!handle.client || !handle.tools) {\n return {\n ok: false,\n error: handle.lastError ?? \"client not connected\",\n }\n }\n return { ok: true, tools: handle.tools }\n }\n\n async callTool(\n alias: string,\n toolName: string,\n args: unknown\n ): Promise<ProxyCallOutcome> {\n const handle = await this.connectIfNeeded(alias)\n if (!handle) return { ok: false, error: `unknown alias \"${alias}\"` }\n if (!handle.client) {\n return {\n ok: false,\n error: handle.lastError ?? \"client not connected\",\n }\n }\n try {\n const result = await handle.client.callTool({\n name: toolName,\n arguments:\n args && typeof args === \"object\"\n ? (args as Record<string, unknown>)\n : {},\n })\n return { ok: true, result }\n } catch (err) {\n // Mark the client as dirty — the connection may have died\n // mid-call (process crash, http server restart). The next call\n // re-opens via connectIfNeeded.\n const msg = err instanceof Error ? err.message : String(err)\n if (/closed|disconnect|EPIPE|ECONNRESET/i.test(msg)) {\n await safeClose(handle.client)\n handle.client = null\n handle.tools = null\n handle.lastError = msg\n }\n return { ok: false, error: msg }\n }\n }\n\n async closeAll(): Promise<void> {\n await Promise.all(\n Array.from(this.clients.values()).map(c => safeClose(c.client))\n )\n this.clients.clear()\n }\n}\n\nfunction freshPlaceholder(entry: ImportedMcpEntry): ProxyClient {\n return { entry, client: null, tools: null, lastError: null }\n}\n\nfunction toDescriptor(tool: {\n name: string\n description?: string\n inputSchema?: unknown\n}): ProxyToolDescriptor {\n return {\n name: tool.name,\n ...(tool.description ? { description: tool.description } : {}),\n ...(tool.inputSchema ? { inputSchema: tool.inputSchema } : {}),\n }\n}\n\n/**\n * Replace `${VAR}` and `${VAR:-default}` placeholders in env values\n * with the corresponding `process.env` entry (or default), the same\n * way claude-code / cursor expand mcp-server env. When the variable\n * is unset and no default is given, the placeholder is dropped — the\n * upstream then sees the env var as absent rather than as the\n * literal `${MISSING_VAR}`, which it usually treats as \"use default\n * config\" rather than \"explicit empty token\".\n */\nfunction expandEnvPlaceholders(\n raw: Record<string, string>\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(raw)) {\n const expanded = v.replace(\n /\\$\\{([A-Z_][A-Z0-9_]*)(?::-([^}]*))?\\}/gi,\n (_match, name: string, fallback: string | undefined) => {\n const fromEnv = process.env[name]\n if (fromEnv !== undefined) return fromEnv\n if (fallback !== undefined) return fallback\n return \"\"\n }\n )\n // Drop the var entirely if it expanded to empty — keeps the\n // upstream from receiving an empty-string token + treating it as\n // a real (but invalid) credential.\n if (expanded.length === 0) continue\n out[k] = expanded\n }\n return out\n}\n\nasync function safeClose(client: Client | null): Promise<void> {\n if (!client) return\n try {\n await client.close()\n } catch {\n // best-effort\n }\n}\n\n/**\n * Open a transport for a discovered MCP. stdio spawns the command;\n * http/sse open over the network. Returns a connected `Client` on\n * success; throws with a useful message on failure.\n */\nasync function openClient(entry: ImportedMcpEntry): Promise<Client> {\n const snap = entry.snapshot\n const client = new Client(\n { name: \"agentproto-daemon-proxy\", version: \"0.1.0\" },\n { capabilities: {} }\n )\n if (snap.type === \"stdio\") {\n if (!snap.command) {\n throw new Error(\n `import \"${entry.alias}\" is stdio but has no command field`\n )\n }\n // claude-code / cursor / vscode all support `${VAR}` placeholders\n // in the env map (and the more permissive `${VAR:-default}`\n // form). Our scanner stores the snapshot verbatim — expand at\n // spawn time so live env changes work without a re-import, and\n // tokens like REPLICATE_API_TOKEN don't end up forwarded as the\n // literal string `${REPLICATE_API_TOKEN}`.\n const expandedEnv = expandEnvPlaceholders(snap.env ?? {})\n const transport = new StdioClientTransport({\n command: snap.command,\n args: snap.args ?? [],\n env: { ...process.env, ...expandedEnv } as Record<string, string>,\n // Pipe stderr so we can include it in the error message instead of\n // surfacing the opaque \"Connection closed\" MCP error code.\n stderr: \"pipe\",\n })\n const stderrBuf: string[] = []\n transport.stderr?.on(\"data\", (chunk: Buffer | string) => {\n stderrBuf.push(typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\"))\n if (stderrBuf.length > 40) stderrBuf.shift()\n })\n try {\n await client.connect(transport)\n } catch (err) {\n const stderrText = stderrBuf.join(\"\").trim()\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(stderrText ? `${msg}\\nstderr: ${stderrText.slice(-600)}` : msg)\n }\n return client\n }\n if (snap.type === \"http\") {\n if (!snap.url) throw new Error(`import \"${entry.alias}\" has no url`)\n const transport = new StreamableHTTPClientTransport(new URL(snap.url), {\n requestInit: {\n headers: snap.headers ?? {},\n },\n })\n await client.connect(transport)\n return client\n }\n if (snap.type === \"sse\") {\n if (!snap.url) throw new Error(`import \"${entry.alias}\" has no url`)\n const transport = new SSEClientTransport(new URL(snap.url), {\n requestInit: {\n headers: snap.headers ?? {},\n },\n })\n await client.connect(transport)\n return client\n }\n throw new Error(\n `import \"${entry.alias}\" has unsupported transport type \"${snap.type}\"`\n )\n}\n","/**\n * Quick Cloudflare Tunnel provider — zero-credential variant.\n *\n * Spawns `cloudflared tunnel --config <ours>` against an isolated\n * config file we write per-tunnel into the workspace, parses the\n * assigned `*.trycloudflare.com` URL out of cloudflared's stderr.\n * No CF account, no API token, no DNS records. Trade-off: URL is\n * ephemeral (different each run) and there's no Cloudflare Access\n * gating — auth happens at the upstream (gateway bearer token, or\n * whatever the tunneled service does for itself).\n *\n * ## Why we don't use `--url`\n *\n * `cloudflared --url http://...` synthesises an inline ingress block\n * but ALSO merges anything from `~/.cloudflared/config.yml`. If a user\n * has prior named-tunnel config there, hostname-specific rules can\n * shadow the inline rule and every request falls through to the\n * built-in `http_status:404` catch-all (the symptom: cloudflared logs\n * `ingressRule=2 originService=http_status:404` for every request,\n * origin never sees traffic). Writing our own config and passing it\n * via `--config` is hermetic — `~/.cloudflared/config.yml` is ignored\n * entirely, so the URL-forward rule always wins.\n *\n * Use this for: ad-hoc demos, \"let me try this from another machine\n * for 10 minutes\", iterating on the remote-MCP UX before committing\n * to a domain.\n *\n * For: persistent URLs / SSO gating, use the named-CF provider (TBD).\n *\n * ## cloudflared discovery\n *\n * Detected on PATH at start time. Missing → throw with a pointer to\n * the install instructions. We deliberately don't bundle binaries —\n * keeps the OSS package free of platform-specific blobs and defers the\n * \"which version\" maintenance tax.\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\"\nimport { promisify } from \"node:util\"\nimport { execFile } from \"node:child_process\"\nimport { mkdir, writeFile, rm } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { randomBytes } from \"node:crypto\"\n\nimport type {\n ProviderStartOptions,\n ProviderStartResult,\n RemoteProvider,\n} from \"../remote-controller.js\"\n\nconst execFileAsync = promisify(execFile)\n\nconst URL_REGEX = /https:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com/i\n\nconst STARTUP_TIMEOUT_MS = 30_000\n\nexport function quickTunnelProvider(): RemoteProvider {\n let child: ChildProcess | null = null\n let configPath: string | null = null\n\n return {\n id: \"quick\",\n async start(opts: ProviderStartOptions): Promise<ProviderStartResult> {\n await assertCloudflaredOnPath()\n const targetUrl = `http://${opts.target.host}:${opts.target.port}`\n\n // Per-tunnel sentinel config — the only reason it exists is to\n // override `~/.cloudflared/config.yml` so its ingress rules can't\n // shadow our inline `--url` rule. We deliberately do NOT include\n // an `ingress:` block here: quick-tunnel mode treats `--url` as\n // the routing source of truth, and a stray top-level `ingress:`\n // would fight it. Random suffix avoids collisions when dev\n // restarts overlap.\n const id = randomBytes(4).toString(\"hex\")\n const dir = join(opts.workspace, \".agentproto\")\n await mkdir(dir, { recursive: true })\n configPath = join(dir, `cloudflared-${id}.yml`)\n const configBody = [\n `# generated by agentproto-runtime — sentinel only`,\n `# overrides ~/.cloudflared/config.yml so its ingress rules`,\n `# don't shadow the inline --url rule. Safe to delete when the`,\n `# tunnel is down.`,\n `no-autoupdate: true`,\n `loglevel: debug`,\n ``,\n ].join(\"\\n\")\n await writeFile(configPath, configBody, \"utf8\")\n const proc = spawn(\n \"cloudflared\",\n [\"tunnel\", \"--config\", configPath, \"--url\", targetUrl],\n { stdio: [\"ignore\", \"pipe\", \"pipe\"], shell: false },\n )\n child = proc\n\n const url = await new Promise<string>((resolve, reject) => {\n let settled = false\n const timer = setTimeout(() => {\n if (settled) return\n settled = true\n try {\n proc.kill(\"SIGTERM\")\n } catch {\n /* noop */\n }\n reject(\n new Error(\n `cloudflared did not emit a public URL within ${STARTUP_TIMEOUT_MS / 1000}s`,\n ),\n )\n }, STARTUP_TIMEOUT_MS)\n\n const onData = (chunk: Buffer) => {\n const text = chunk.toString(\"utf8\")\n for (const line of text.split(/\\r?\\n/)) {\n if (line.length > 0) opts.onLog?.(`[cloudflared] ${line}`)\n }\n if (settled) return\n const match = text.match(URL_REGEX)\n if (match) {\n settled = true\n clearTimeout(timer)\n resolve(match[0])\n }\n }\n // cloudflared writes the URL to stderr (it reserves stdout for\n // proxied traffic / structured output in some modes). Watch\n // both for safety.\n proc.stderr?.on(\"data\", onData)\n proc.stdout?.on(\"data\", onData)\n\n proc.once(\"error\", err => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(err)\n })\n proc.once(\"exit\", (code, signal) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(\n new Error(\n `cloudflared exited before emitting a URL (code=${code}, signal=${signal})`,\n ),\n )\n })\n })\n\n // Detach the resolver listener (we already captured the URL); leave\n // the log-forwarder attached so the gateway's RuntimeEvents stream\n // sees ongoing tunnel chatter.\n proc.once(\"exit\", (code, signal) => {\n opts.onLog?.(\n `[cloudflared] exited (code=${code ?? \"?\"} signal=${signal ?? \"-\"})`,\n )\n })\n\n return { publicUrl: url, pid: proc.pid ?? null }\n },\n\n async stop(): Promise<void> {\n const proc = child\n const cfg = configPath\n child = null\n configPath = null\n // Best-effort cleanup of the sentinel config — losing it means a\n // stale `.agentproto/cloudflared-<id>.yml` file, no functional\n // impact. We do this even if the proc never started.\n if (cfg) {\n try {\n await rm(cfg, { force: true })\n } catch {\n /* noop */\n }\n }\n if (!proc || proc.exitCode !== null) return\n proc.kill(\"SIGTERM\")\n // Hard-kill backstop after 3s if cloudflared ignores SIGTERM.\n const timer = setTimeout(() => {\n try {\n proc.kill(\"SIGKILL\")\n } catch {\n /* noop */\n }\n }, 3_000)\n timer.unref()\n await new Promise<void>(resolve => {\n if (proc.exitCode !== null) {\n clearTimeout(timer)\n resolve()\n return\n }\n proc.once(\"exit\", () => {\n clearTimeout(timer)\n resolve()\n })\n })\n },\n }\n}\n\nasync function assertCloudflaredOnPath(): Promise<void> {\n try {\n await execFileAsync(\"cloudflared\", [\"--version\"], { timeout: 3_000 })\n } catch {\n throw new Error(\n \"cloudflared not found on PATH. Install it first:\\n\" +\n \" macOS: brew install cloudflared\\n\" +\n \" Linux: https://pkg.cloudflare.com/index.html\\n\" +\n \" Windows: winget install --id Cloudflare.cloudflared\\n\" +\n \"Or download a prebuilt binary from https://github.com/cloudflare/cloudflared/releases.\",\n )\n }\n}\n","/**\n * RemoteController — owns the gateway's \"publish to the internet\" state.\n *\n * One singleton per gateway. Holds:\n * - the current tunnel provider's child process (cloudflared, …)\n * - the bearer token gating /mcp once the tunnel is up\n * - persisted state in `<workspace>/.agentproto/remote.json`\n *\n * The controller is the *only* component that mutates auth at runtime.\n * The HTTP server reads auth via a getter (see `AuthSource` in\n * http-server.ts), so flipping `enable() / disable()` here takes effect\n * on the next request — no restart, no race.\n *\n * ## Provider model\n *\n * Each provider implements `RemoteProvider` (start / stop / status).\n * v1 ships only `quick` (Cloudflare Quick Tunnel — no API key, no DNS,\n * ephemeral `*.trycloudflare.com` URL). Named CF Tunnel and Tailscale\n * land as additional implementations.\n *\n * ## Token model\n *\n * On enable we generate a 32-byte random bearer token, return it once\n * to the caller, and persist only its sha256 hash to disk. Same model\n * as a Stripe API key — losing the plaintext means rotating, not\n * recovering. This keeps `.agentproto/remote.json` safe to commit by\n * accident (it leaks the URL, not the credential).\n *\n * ## Security note\n *\n * The CF API token (when used by named-tunnel provider) is *never*\n * accepted as MCP tool input. The controller reads it from\n * `~/.config/agentproto/cloudflare.json` or `$CLOUDFLARE_API_TOKEN`.\n * Otherwise a remote agent could exfiltrate it through `remote_enable`.\n */\n\nimport { randomBytes, createHash } from \"node:crypto\"\nimport { mkdir, writeFile, readFile, chmod, rm } from \"node:fs/promises\"\nimport { existsSync } from \"node:fs\"\nimport { join } from \"node:path\"\n\nimport type { AuthOptions } from \"./http-server.js\"\nimport { quickTunnelProvider } from \"./remote-providers/quick.js\"\n\nexport interface RemoteState {\n provider: \"quick\"\n publicUrl: string\n bearerTokenHash: string\n createdAt: string\n /** PID of the supervised tunnel child process, if any. */\n pid: number | null\n /** Local target the tunnel forwards to (host + port). */\n target: { host: string; port: number }\n /**\n * Whether the tunnel exposes the gateway itself (true) or some other\n * local service (false). Bearer auth + loopback bypass only matter\n * for the gateway path; arbitrary-target tunnels are pure passthrough\n * and the daemon does not gate them.\n */\n exposesGateway: boolean\n}\n\nexport interface EnableInput {\n provider?: \"quick\"\n /**\n * Local port to expose. Defaults to the gateway's own port — i.e.\n * \"publish this MCP server.\" Pass any other port to expose a\n * different local service (Supabase 54371, a Vite dev server, …)\n * without spinning up a separate tunnel manager.\n */\n targetPort?: number\n /**\n * Host the tunnel forwards to. Defaults to `127.0.0.1`. Setting it\n * to `localhost` resolves through DNS (IPv6 first on most systems);\n * keep `127.0.0.1` unless the target is explicitly IPv6-bound.\n */\n targetHost?: string\n}\n\nexport interface EnableResult {\n publicUrl: string\n /**\n * Bearer token issued by this gateway. Only meaningful when the\n * tunnel exposes the gateway itself (default). For arbitrary-target\n * tunnels (`targetPort != gateway.port`) the daemon does not gate\n * the proxied service, and this is omitted.\n */\n bearerToken?: string\n /**\n * `<publicUrl>/mcp`. Only emitted when exposing the gateway.\n */\n mcpEndpoint?: string\n /**\n * Paste-ready `.mcp.json` snippet. Only emitted when exposing the\n * gateway.\n */\n mcpConfigSnippet?: string\n provider: \"quick\"\n target: { host: string; port: number }\n exposesGateway: boolean\n}\n\nexport interface RemoteStatus {\n enabled: boolean\n provider?: \"quick\"\n publicUrl?: string\n pid?: number | null\n createdAt?: string\n target?: { host: string; port: number }\n exposesGateway?: boolean\n /** Last error from the provider, if any (since last enable). */\n lastError?: string\n}\n\n/**\n * A pluggable tunnel provider.\n *\n * `start` returns the public URL once the upstream tunnel is ready\n * (e.g. for cloudflared, after parsing the trycloudflare.com URL out of\n * its stderr). `stop` is idempotent — calling it twice or on an\n * already-dead child must not throw.\n */\nexport interface RemoteProvider {\n readonly id: \"quick\"\n start(opts: ProviderStartOptions): Promise<ProviderStartResult>\n stop(): Promise<void>\n}\n\nexport interface ProviderStartOptions {\n /** Local target the tunnel forwards to. */\n target: { host: string; port: number }\n /** Workspace path — for log / state files. */\n workspace: string\n /** Called whenever the provider has a status update worth logging. */\n onLog?: (line: string) => void\n}\n\nexport interface ProviderStartResult {\n publicUrl: string\n pid: number | null\n}\n\nexport interface RemoteControllerOptions {\n workspace: string\n port: number\n /** Hook for surfacing provider logs through RuntimeEvents. */\n onLog?: (line: string) => void\n}\n\nconst STATE_FILE_REL = \".agentproto/remote.json\"\n\nexport class RemoteController {\n private state: RemoteState | null = null\n private bearerToken: string | null = null\n private provider: RemoteProvider | null = null\n private lastError: string | undefined\n private readonly opts: RemoteControllerOptions\n\n constructor(opts: RemoteControllerOptions) {\n this.opts = opts\n }\n\n /**\n * Auth getter handed to startHttpServer. The HTTP server calls this\n * on every request so flipping enable/disable is effective without\n * a restart.\n */\n readonly readAuth = (): AuthOptions => {\n if (this.bearerToken === null) return { mode: \"none\" }\n return { mode: \"bearer\", token: this.bearerToken }\n }\n\n status(): RemoteStatus {\n if (!this.state) {\n return { enabled: false, lastError: this.lastError }\n }\n return {\n enabled: true,\n provider: this.state.provider,\n publicUrl: this.state.publicUrl,\n pid: this.state.pid,\n createdAt: this.state.createdAt,\n target: this.state.target,\n exposesGateway: this.state.exposesGateway,\n lastError: this.lastError,\n }\n }\n\n async enable(input: EnableInput): Promise<EnableResult> {\n if (this.state) {\n // Idempotent: returning the existing config would leak the\n // bearer token (we only have the hash). Force teardown first so\n // re-enable always rotates the token. Surface this in the docs.\n throw new Error(\n \"remote tunnel already active — call remote_disable first to rotate\",\n )\n }\n const providerId = input.provider ?? \"quick\"\n const provider = pickProvider(providerId)\n this.lastError = undefined\n\n const target = {\n host: input.targetHost ?? \"127.0.0.1\",\n port: input.targetPort ?? this.opts.port,\n }\n const exposesGateway =\n target.host === \"127.0.0.1\" && target.port === this.opts.port\n\n let started: ProviderStartResult\n try {\n started = await provider.start({\n target,\n workspace: this.opts.workspace,\n onLog: line => {\n this.opts.onLog?.(line)\n },\n })\n } catch (err) {\n this.lastError = errToMessage(err)\n throw err\n }\n\n // Bearer auth + token issuance only matter when the tunnel exposes\n // *this* gateway. For arbitrary-target tunnels (e.g. Supabase on\n // 54371) the daemon is just provisioning a public passthrough; the\n // proxied service does its own authn.\n let bearerToken: string | null = null\n let bearerTokenHash = \"\"\n if (exposesGateway) {\n bearerToken = randomBytes(32).toString(\"base64url\")\n bearerTokenHash = sha256(bearerToken)\n }\n\n const state: RemoteState = {\n provider: providerId,\n publicUrl: started.publicUrl,\n bearerTokenHash,\n createdAt: new Date().toISOString(),\n pid: started.pid,\n target,\n exposesGateway,\n }\n\n this.state = state\n this.bearerToken = bearerToken\n this.provider = provider\n\n await persistState(this.opts.workspace, state)\n\n const result: EnableResult = {\n provider: providerId,\n publicUrl: started.publicUrl,\n target,\n exposesGateway,\n }\n if (exposesGateway && bearerToken) {\n const mcpEndpoint = `${started.publicUrl}/mcp`\n result.bearerToken = bearerToken\n result.mcpEndpoint = mcpEndpoint\n result.mcpConfigSnippet = buildMcpConfigSnippet(mcpEndpoint, bearerToken)\n }\n return result\n }\n\n async disable(): Promise<{ disabled: boolean }> {\n if (!this.state) return { disabled: false }\n const provider = this.provider\n this.state = null\n this.bearerToken = null\n this.provider = null\n if (provider) {\n try {\n await provider.stop()\n } catch (err) {\n this.lastError = errToMessage(err)\n }\n }\n await clearState(this.opts.workspace)\n return { disabled: true }\n }\n\n /**\n * Stop the provider on gateway shutdown. Does NOT clear persisted\n * state — that survives across restarts so the user can `remote_status`\n * after rebooting and see \"stale state, run remote_enable to refresh\".\n * (Stale-recovery semantics land in v2; today we just leave the file.)\n */\n async shutdown(): Promise<void> {\n if (this.provider) {\n try {\n await this.provider.stop()\n } catch {\n /* swallow — gateway is shutting down anyway */\n }\n }\n }\n}\n\n// ── helpers ────────────────────────────────────────────────────────────\n\nfunction pickProvider(id: \"quick\"): RemoteProvider {\n if (id === \"quick\") return quickTunnelProvider()\n // Exhaustive guard — adding \"named-cf\" / \"tailscale\" later forces this\n // switch to be updated, otherwise TS will yell.\n const _exhaustive: never = id\n throw new Error(`unknown remote provider: ${String(_exhaustive)}`)\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\")\n}\n\nfunction errToMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nasync function persistState(workspace: string, state: RemoteState): Promise<void> {\n const dir = join(workspace, \".agentproto\")\n await mkdir(dir, { recursive: true })\n const file = join(dir, \"remote.json\")\n await writeFile(file, JSON.stringify(state, null, 2) + \"\\n\", \"utf8\")\n // mode 0600 — even though we only persist the hash, the URL itself\n // is sensitive (knowing it lets an attacker brute-force the token).\n try {\n await chmod(file, 0o600)\n } catch {\n /* best-effort on platforms where chmod is a noop */\n }\n}\n\nasync function clearState(workspace: string): Promise<void> {\n const file = join(workspace, \".agentproto/remote.json\")\n if (!existsSync(file)) return\n await rm(file, { force: true })\n}\n\n/**\n * Best-effort load of persisted state on boot. We don't restore the\n * bearer token from this — the hash is one-way — so a rebooted gateway\n * that finds a stale `remote.json` will surface it via `remote_status`\n * and require a fresh `remote_enable` to mint a new token.\n *\n * Exposed mostly for diagnostics; not used by the controller today.\n */\nexport async function loadPersistedState(\n workspace: string,\n): Promise<RemoteState | null> {\n const file = join(workspace, STATE_FILE_REL)\n if (!existsSync(file)) return null\n try {\n const raw = await readFile(file, \"utf8\")\n return JSON.parse(raw) as RemoteState\n } catch {\n return null\n }\n}\n\nfunction buildMcpConfigSnippet(endpoint: string, token: string): string {\n return JSON.stringify(\n {\n mcpServers: {\n \"agentproto-remote\": {\n transport: \"http\",\n url: endpoint,\n headers: { Authorization: `Bearer ${token}` },\n },\n },\n },\n null,\n 2,\n )\n}\n","/**\n * MCP tools that drive RemoteController — the gateway's \"publish to\n * the internet\" surface.\n *\n * Three tools, mirroring the controller's lifecycle:\n *\n * remote_enable — bring up a tunnel, mint bearer token, return the\n * public /mcp URL + a paste-ready .mcp.json snippet\n * remote_disable — tear down tunnel, revoke token, drop bearer auth\n * remote_status — read-only — provider, URL, pid, lastError\n *\n * Why this lives on the MCP surface (not a separate CLI):\n * - The user already has an MCP client connected (that's how they\n * started talking to the gateway in the first place). One tool call\n * replaces an entire CLI install + auth dance.\n * - The bearer token comes back as part of the MCP response, so it\n * doesn't have to land on the user's clipboard.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nimport type { RemoteController } from \"./remote-controller.js\"\n\nexport interface RegisterRemoteToolsOptions {\n controller: RemoteController\n}\n\nfunction text(value: string | object): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value, null, 2),\n },\n ],\n }\n}\n\nexport function registerRemoteTools(\n server: McpServer,\n opts: RegisterRemoteToolsOptions,\n): void {\n const { controller } = opts\n\n server.tool(\n \"remote_enable\",\n \"Publish a local port to the internet via Cloudflare. By default exposes \" +\n \"this gateway and gates it with a bearer token (returned ONCE in the \" +\n \"response — store it; only its hash is persisted). Pass `targetPort` to \" +\n \"tunnel a different local service (Supabase, dev server, …); in that mode \" +\n \"the daemon does not gate the proxied traffic — the upstream service \" +\n \"handles its own auth. Returns the public URL plus a paste-ready \" +\n \"`.mcp.json` snippet (gateway mode only). Re-running while a tunnel is \" +\n \"already up errors; call `remote_disable` first to rotate.\",\n {\n provider: z\n .enum([\"quick\"])\n .optional()\n .describe(\n \"Tunnel backend. `quick` = Cloudflare Quick Tunnel (no API key, ephemeral *.trycloudflare.com URL). Defaults to `quick`. Named-CF / Tailscale providers TBD.\",\n ),\n targetPort: z\n .number()\n .int()\n .min(1)\n .max(65535)\n .optional()\n .describe(\n \"Local port to expose. Defaults to this gateway's own port (= publish the MCP server). Pass another port to tunnel a different local service (e.g. 54371 for Supabase) — in that mode bearer auth is OFF since the upstream handles its own gating.\",\n ),\n targetHost: z\n .string()\n .optional()\n .describe(\n \"Host the tunnel forwards to. Defaults to `127.0.0.1`. Use `localhost` only if the target is explicitly IPv6-bound; cloudflared resolves DNS and IPv6-first lookups can break IPv4-only origins.\",\n ),\n },\n async ({ provider, targetPort, targetHost }) => {\n const result = await controller.enable({ provider, targetPort, targetHost })\n return text(result)\n },\n )\n\n server.tool(\n \"remote_disable\",\n \"Tear down the active remote tunnel and drop bearer auth back to \" +\n \"loopback-only. Idempotent — calling when no tunnel is active is a no-op.\",\n {},\n async () => {\n const result = await controller.disable()\n return text(result)\n },\n )\n\n server.tool(\n \"remote_status\",\n \"Report whether a remote tunnel is active. When active: provider, \" +\n \"public URL, supervised PID, createdAt. The bearer token itself is \" +\n \"never returned by status — it was shown once at enable.\",\n {},\n async () => {\n return text(controller.status())\n },\n )\n}\n","/**\n * `WorkspaceFs` — minimal `readFile` / `writeFile` adapter over a\n * workspace directory. Mirrors the `McpWorkspace.filesystem` shape\n * used by `@guilde/mcp` so the daemon can be plugged in as the\n * workspace backend for a Guilde MCP server (via its\n * `loadGuildWorkspace` injection point) without re-shimming.\n *\n * All paths are workspace-relative. Absolute paths are rejected to\n * keep the surface predictable when the daemon binds to a public\n * port.\n */\n\nimport { existsSync } from \"node:fs\"\nimport { mkdir, readFile as fsReadFile, writeFile as fsWriteFile } from \"node:fs/promises\"\nimport { dirname, isAbsolute, join, normalize, relative, resolve } from \"node:path\"\n\nexport interface WorkspaceFs {\n readFile(path: string): Promise<string>\n writeFile(path: string, content: string | Uint8Array): Promise<void>\n exists(path: string): Promise<boolean>\n}\n\nexport interface CreateWorkspaceFsOptions {\n /** Absolute path to the workspace root. */\n workspace: string\n}\n\nexport class WorkspacePathError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"WorkspacePathError\"\n }\n}\n\nexport function createWorkspaceFs(opts: CreateWorkspaceFsOptions): WorkspaceFs {\n const root = resolve(opts.workspace)\n\n function resolvePath(path: string): string {\n if (typeof path !== \"string\" || path.length === 0) {\n throw new WorkspacePathError(\"path must be a non-empty string\")\n }\n if (isAbsolute(path)) {\n throw new WorkspacePathError(\n \"absolute paths are not allowed; use a workspace-relative path\",\n )\n }\n const joined = normalize(join(root, path))\n const rel = relative(root, joined)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new WorkspacePathError(\n `path escapes the workspace: '${path}'`,\n )\n }\n return joined\n }\n\n return {\n async readFile(path) {\n const abs = resolvePath(path)\n const buf = await fsReadFile(abs)\n return buf.toString(\"utf8\")\n },\n async writeFile(path, content) {\n const abs = resolvePath(path)\n await mkdir(dirname(abs), { recursive: true })\n await fsWriteFile(abs, content)\n },\n async exists(path) {\n try {\n const abs = resolvePath(path)\n return existsSync(abs)\n } catch {\n return false\n }\n },\n }\n}\n","/**\n * @agentproto/runtime — long-running gateway around an agentproto\n * workspace dir.\n *\n * Composes:\n * - `@agentproto/mcp-server` (CRUD verbs over registered specs)\n * - HTTP transport (Streamable HTTP) on a configurable port\n * - HEARTBEAT.md autonomy loop\n * - Append-only conversation persistence (`conversations/<id>.md`)\n * - Workspace filesystem adapter (compatible with the\n * `McpWorkspace.filesystem` shape used by `@guilde/mcp`)\n *\n * Single entry point: `createGateway(opts)`. Returns a handle with\n * `url` and `stop()` — the rest of the surface lives on the HTTP\n * server.\n */\n\nimport { randomUUID } from \"node:crypto\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { join, resolve } from \"node:path\"\nimport { createMcpServer } from \"@agentproto/mcp-server\"\nimport type { DoctypeSpec } from \"@agentproto/manifest\"\n\nimport { writeRuntimeMeta } from \"./agentproto-dir.js\"\nimport { registerCommandTools } from \"./command-tools.js\"\nimport { fileConversationStore } from \"./conversations.js\"\nimport { createRuntimeEvents } from \"./events.js\"\nimport { registerFsTools } from \"./fs-tools.js\"\nimport { registerSessionTools } from \"./session-tools.js\"\nimport { startHeartbeat, type BuildHeartbeatAgent } from \"./heartbeat.js\"\nimport {\n startHttpServer,\n type AuthOptions,\n type AgentAdapterResolver,\n type AgentAdapterLister,\n} from \"./http-server.js\"\nimport {\n createSessionsRegistry,\n type SessionsRegistry,\n type PtyFactory,\n} from \"./sessions.js\"\nimport { McpProxyRegistry } from \"./mcp-proxy.js\"\n\nexport type {\n AgentAdapterResolver,\n AgentAdapterLister,\n AdapterListEntry,\n} from \"./http-server.js\"\nexport type {\n AgentSessionLike,\n AgentStreamEvent,\n SessionDescriptor,\n SessionKind,\n SessionStatus,\n SpawnSessionInput,\n SpawnAgentInput,\n SessionsRegistry,\n} from \"./sessions.js\"\nimport { RemoteController } from \"./remote-controller.js\"\nimport { registerRemoteTools } from \"./remote-tools.js\"\nimport { createWorkspaceFs, type WorkspaceFs } from \"./workspace-fs.js\"\n\nexport type { ConversationStore, ConversationMeta, ConversationTurn } from \"./conversations.js\"\nexport type { HeartbeatRunner, BuildHeartbeatAgent, HeartbeatAgent } from \"./heartbeat.js\"\nexport type { RuntimeEvent, RuntimeEvents } from \"./events.js\"\nexport type { WorkspaceFs } from \"./workspace-fs.js\"\nexport { parseDuration } from \"./heartbeat.js\"\nexport { createWorkspaceFs } from \"./workspace-fs.js\"\nexport {\n sweepStaleRuntimeMetas,\n unlinkRuntimeMeta,\n readRuntimeMeta,\n type RuntimeMeta,\n} from \"./agentproto-dir.js\"\nexport { fileConversationStore } from \"./conversations.js\"\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySpec = DoctypeSpec<any, any>\n\nexport interface CreateGatewayOptions {\n /** Absolute path to the workspace dir. */\n workspace: string\n /** AIP doctype specs to expose as MCP CRUD verbs. */\n specs: readonly AnySpec[]\n /** Port to bind. Default 18790. */\n port?: number\n /** Bind host. Default `127.0.0.1` (loopback). Set `0.0.0.0` for LAN. */\n bind?: string\n /** Auth mode. Default `none` (safe only on loopback). */\n auth?: AuthOptions\n /**\n * Resolves a heartbeat-runnable agent from its workspace id.\n * Required for HEARTBEAT.md to do anything; without it ticks emit\n * `heartbeat-error` events instead of generating.\n */\n buildAgent?: BuildHeartbeatAgent\n /** Server name advertised over MCP. */\n name?: string\n /** Server version advertised over MCP. */\n version?: string\n /**\n * Run BOOT.md once at startup. Pass `false` to disable. Defaults to\n * `true`. The boot file is plain markdown — frontmatter-free; the\n * agent named in `defaultBootAgent` (or skipped if unset) gets the\n * body as a single prompt and the reply is appended to a `boot-<iso>`\n * conversation.\n */\n boot?: boolean\n /** Agent id used for BOOT.md if no per-file frontmatter. */\n defaultBootAgent?: string\n /** Optional adapter resolver — when provided, enables\n * `POST /sessions/agent` (long-running agent CLIs like\n * claude-code / hermes via the @agentproto/cli adapter system).\n * Without this, /sessions still works for raw `argv` spawns. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional adapter lister — when provided, enables\n * `GET /adapters` HTTP route + `list_adapters` MCP tool so UIs\n * can discover what's installed on the host. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional PTY factory (node-pty wrapper, typically from the cli\n * layer's `loadNodePtyFactory()`). When provided, enables\n * `POST /sessions/terminal`, the `start_terminal_session` MCP\n * tool family, and the `/sessions/:id/pty` WebSocket. Without it,\n * those routes return 501 / the MCP tools aren't registered. */\n spawnPty?: PtyFactory\n /** Override the per-boot bearer token. Default: `randomUUID()`.\n * Tests can pin a known value; production should always let\n * the gateway generate fresh. The token is written into\n * `<workspace>/.agentproto/runtime.json` (mode 0600) and required\n * on mutating `/sessions/*` routes + the PTY WS upgrade. */\n token?: string\n /** Trusted browser origins allowed to drive mutating routes\n * without a bearer token. See `RuntimeHttpServerOptions.allowedOrigins`\n * for match semantics. Default: localhost on any port. */\n allowedOrigins?: readonly string[]\n /** When true, drop the localhost-wildcard defaults — only the\n * explicit `allowedOrigins` list is honoured. */\n strictOrigins?: boolean\n}\n\nexport interface GatewayHandle {\n url: string\n workspace: string\n workspaceFs: WorkspaceFs\n registered: readonly string[]\n /** Sessions registry — exposed so MCP tools / external spawners\n * inside the same process can register their child processes for\n * visibility through /sessions and the CLI TUI. */\n sessions: SessionsRegistry\n /** Per-boot bearer token required on mutating /sessions/* routes\n * + WS PTY upgrades. Exposed so an embedding host (e.g. the CLI\n * shell that hosts the gateway in-process) can pass it to child\n * tools without re-reading the runtime.json file. */\n token: string\n stop(): Promise<void>\n}\n\n/**\n * Spin up the gateway. Order:\n * 1. Build MCP server + load AIP-40 extensions\n * 2. Build conversation store + workspace fs adapter\n * 3. (optional) Run BOOT.md once\n * 4. Start HTTP server\n * 5. Start heartbeat ticker\n *\n * `stop()` reverses 4–5 (heartbeat first, then HTTP). The MCP server\n * is owned by the HTTP server's per-session transports and is closed\n * implicitly when those close.\n */\nexport async function createGateway(\n opts: CreateGatewayOptions,\n): Promise<GatewayHandle> {\n const workspace = resolve(opts.workspace)\n if (!existsSync(workspace)) {\n throw new Error(`runtime: workspace dir does not exist: ${workspace}`)\n }\n const port = opts.port ?? 18790\n\n const events = createRuntimeEvents()\n const conversations = fileConversationStore({ workspace })\n const workspaceFs = createWorkspaceFs({ workspace })\n\n // Singleton controller for \"publish to the internet\" state. Created\n // disabled — auth stays `mode: \"none\"` until `remote_enable` is\n // called. Tunnel logs flow through the events stream so `/events`\n // subscribers see cloudflared chatter.\n const remote = new RemoteController({\n workspace,\n port,\n onLog: line =>\n events.emit({\n type: \"remote-log\",\n at: new Date().toISOString(),\n line,\n }),\n })\n\n // Build a server once eagerly so we can capture `registered` for\n // `/health`. The server is NOT used for serving — every `/mcp`\n // request gets its own freshly-constructed pair, mirroring the\n // SDK's official stateless pattern. See the comment on\n // `RuntimeHttpServerOptions.mcpServerFactory` for why.\n const { registered } = await createMcpServer({\n specs: opts.specs,\n workspace,\n name: opts.name ?? \"agentproto-runtime\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n\n // Sessions registry — single instance per gateway, captured by\n // the per-request mcpServerFactory closure below + handed to\n // startHttpServer for the /sessions HTTP routes. Declared here\n // (above the factory) so its identifier is visible at closure-\n // build time, even though the factory only invokes later.\n const sessions = createSessionsRegistry({\n ...(opts.spawnPty ? { spawnPty: opts.spawnPty } : {}),\n // Resume hook: when a prompt arrives for a dead agent-cli row\n // (typical after daemon restart), the registry calls back into\n // the adapter resolver to re-create the AgentSession with\n // `resumeSessionId = adapterSessionId`. ACP semantics: the\n // upstream provider reattaches to the prior conversation.\n // Unwired (no resolveAgentAdapter) → legacy \"not an agent\n // session\" error, user must spawn fresh.\n ...(opts.resolveAgentAdapter\n ? {\n resumeAgent: async ({ adapterSlug, cwd, resumeSessionId }) => {\n const adapter = await opts.resolveAgentAdapter!(adapterSlug)\n if (!adapter) return null\n try {\n return await adapter.startSession({ cwd, resumeSessionId })\n } catch (err) {\n console.warn(\n `[agentproto] resumeAgent('${adapterSlug}', ${resumeSessionId}) failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n return null\n }\n },\n }\n : {}),\n })\n\n // Per-boot bearer token. Required on mutating /sessions/* routes\n // and on the WS upgrade for /sessions/:id/pty. Persisted to\n // runtime.json (mode 0600) so the same-user CLI can read it; a\n // browser-loaded localhost page can't.\n const token = opts.token ?? randomUUID()\n\n // MCP proxy — single registry that holds open Client connections\n // to every imported MCP server. The per-request mcpServerFactory\n // captures it so each /mcp request reuses the same upstream\n // sessions instead of re-spawning stdio children.\n const mcpProxy = new McpProxyRegistry()\n\n const mcpServerFactory = async () => {\n const { server } = await createMcpServer({\n specs: opts.specs,\n workspace,\n name: opts.name ?? \"agentproto-runtime\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n // Canonical filesystem tools so remote MCP clients (cloud\n // workspace-providers, IDEs, ad-hoc tooling) can read/write the\n // workspace without each implementing AIP-aware glue. Names match\n // `@modelcontextprotocol/server-filesystem` for drop-in compat.\n registerFsTools(server, { workspace })\n // Subprocess execution — the runtime's superpower for cloud\n // agents. Any allowlisted CLI on the user's machine (claude, gh,\n // pnpm, …) is reachable via `execute_command`. Allowlist lives at\n // `.agentproto/allowed-commands.json`; default-deny.\n registerCommandTools(server, { workspace })\n // Remote-tunnel lifecycle. The controller is a singleton on the\n // gateway, so registering its tools per-request is just rebinding\n // the same closures — the underlying state lives in `remote`.\n registerRemoteTools(server, { controller: remote })\n // Agent-session orchestration — operators (Mastra agents in\n // cloud Guilde, Claude Code as a sub-agent, …) drive long-running\n // claude/hermes/aider sessions on the user's machine through\n // these MCP tools. The registry + adapter resolver are\n // singletons on the gateway, same closure-rebind pattern.\n registerSessionTools(server, {\n registry: sessions,\n mcpProxy,\n ptyEnabled: opts.spawnPty != null,\n ...(opts.resolveAgentAdapter\n ? { resolveAgentAdapter: opts.resolveAgentAdapter }\n : {}),\n ...(opts.listAgentAdapters\n ? { listAgentAdapters: opts.listAgentAdapters }\n : {}),\n })\n return server\n }\n\n // ── boot ─────────────────────────────────────────────────────────\n if (opts.boot !== false) {\n await runBoot(workspace, opts, conversations, events).catch((err) => {\n events.emit({\n type: \"heartbeat-error\",\n at: new Date().toISOString(),\n agent: opts.defaultBootAgent,\n error: `BOOT.md failed: ${err instanceof Error ? err.message : String(err)}`,\n })\n })\n }\n\n const heartbeat = startHeartbeat({\n workspace,\n conversations,\n events,\n buildAgent: opts.buildAgent ?? noopBuildAgent,\n })\n\n const http = await startHttpServer({\n port,\n bind: opts.bind,\n // Auth is read on every request via this getter. `opts.auth`\n // (when provided) is the startup default and represents the\n // operator's intent — bearer-only deployments stay bearer-only\n // even when no remote tunnel is up. The controller's auth wins\n // once a tunnel is enabled (it issues a fresh token); on disable\n // we fall back to `opts.auth` if set, otherwise `mode: \"none\"`.\n auth: () => {\n const remoteAuth = remote.readAuth()\n if (remoteAuth.mode === \"bearer\") return remoteAuth\n return opts.auth ?? { mode: \"none\" }\n },\n mcpServerFactory,\n conversations,\n events,\n heartbeat,\n sessions,\n mcpProxy,\n token,\n ptyEnabled: opts.spawnPty != null,\n ...(opts.allowedOrigins ? { allowedOrigins: opts.allowedOrigins } : {}),\n ...(opts.strictOrigins ? { strictOrigins: true } : {}),\n ...(opts.resolveAgentAdapter\n ? { resolveAgentAdapter: opts.resolveAgentAdapter }\n : {}),\n ...(opts.listAgentAdapters\n ? { listAgentAdapters: opts.listAgentAdapters }\n : {}),\n meta: { workspace, registered },\n })\n\n heartbeat.start()\n events.emit({\n type: \"boot\",\n at: new Date().toISOString(),\n workspace,\n registered,\n })\n\n // Record a snapshot of the running config so external tooling /\n // shell users can introspect a live gateway via\n // `cat <workspace>/.agentproto/runtime.json`. Best-effort — failure\n // here doesn't gate the gateway being functional.\n void writeRuntimeMeta(workspace, {\n workspace,\n port,\n bind: opts.bind ?? \"127.0.0.1\",\n pid: process.pid,\n startedAt: new Date().toISOString(),\n name: opts.name ?? \"agentproto-runtime\",\n registered,\n token,\n })\n\n return {\n url: http.url,\n workspace,\n workspaceFs,\n registered,\n sessions,\n token,\n async stop() {\n heartbeat.stop()\n // Kill all live sessions before tearing down HTTP — otherwise\n // long-running children inherit the daemon's listening socket\n // and stay around as zombies after the parent exits.\n sessions.shutdown()\n // Close upstream MCP clients (their stdio children would\n // otherwise leak the same way).\n await mcpProxy.closeAll()\n // Tear the tunnel before the HTTP listener — otherwise cloudflared\n // briefly proxies to a dead port and surfaces 502s to any in-flight\n // remote client.\n await remote.shutdown()\n await http.stop()\n },\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────\n\nconst noopBuildAgent: BuildHeartbeatAgent = async () => null\n\nasync function runBoot(\n workspace: string,\n opts: CreateGatewayOptions,\n conversations: import(\"./conversations.js\").ConversationStore,\n events: import(\"./events.js\").RuntimeEvents,\n): Promise<void> {\n const path = join(workspace, \"BOOT.md\")\n if (!existsSync(path)) return\n const body = (await readFile(path, \"utf8\")).trim()\n if (!body) return\n if (!opts.buildAgent || !opts.defaultBootAgent) return\n\n const agent = await opts.buildAgent(opts.defaultBootAgent)\n if (!agent) return\n\n const conversationId = `boot-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, \"-\")}`\n await conversations.open(conversationId, { agent: opts.defaultBootAgent })\n await conversations.appendTurn(conversationId, \"user\", body, {\n attribution: \"boot\",\n })\n const reply = await agent.generate(body)\n await conversations.appendTurn(conversationId, \"assistant\", reply.text, {\n attribution: opts.defaultBootAgent,\n })\n events.emit({\n type: \"heartbeat-fired\",\n at: new Date().toISOString(),\n agent: opts.defaultBootAgent,\n conversationId,\n prompt: body,\n reply: reply.text,\n durationMs: 0,\n })\n}\n","/**\n * `agentproto workspace <subcommand>`\n *\n * Subcommands:\n * add <path> [--slug <slug>] [--label <text>] register a folder\n * list show registered + active\n * remove <slug> drop an entry\n * use <slug> set the active workspace\n *\n * Reads/writes `~/.agentproto/workspaces.json` via @agentproto/runtime.\n * Pure CLI shell — no daemon needed; the daemon picks up the file on\n * its next read (boot for now, hot reload TBD).\n */\nimport { parseArgs } from \"node:util\"\nimport { resolve, basename } from \"node:path\"\nimport { existsSync } from \"node:fs\"\nimport {\n loadWorkspacesConfig,\n saveWorkspacesConfig,\n addWorkspace,\n removeWorkspace,\n setActiveWorkspace,\n sanitizeSlug,\n DEFAULT_CONFIG_PATH,\n type WorkspaceEntry,\n} from \"@agentproto/runtime/workspaces-config\"\n\nconst USAGE = `agentproto workspace — manage local workspaces\n\nUsage:\n agentproto workspace add <path> [--slug <slug>] [--label <text>]\n agentproto workspace list [--json]\n agentproto workspace remove <slug>\n agentproto workspace use <slug>\n agentproto workspace --help\n\nConfig file: ${DEFAULT_CONFIG_PATH()}\n`\n\nexport async function runWorkspace(args: readonly string[]): Promise<number> {\n if (args.length === 0 || args.includes(\"--help\") || args.includes(\"-h\")) {\n process.stdout.write(USAGE)\n return 0\n }\n const sub = args[0]\n const rest = args.slice(1)\n switch (sub) {\n case \"add\":\n return runAdd(rest)\n case \"list\":\n case \"ls\":\n return runList(rest)\n case \"remove\":\n case \"rm\":\n return runRemove(rest)\n case \"use\":\n return runUse(rest)\n default:\n process.stderr.write(\n `agentproto workspace: unknown subcommand '${sub}'\\n\\n${USAGE}`\n )\n return 2\n }\n}\n\nasync function runAdd(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n slug: { type: \"string\" },\n label: { type: \"string\" },\n },\n })\n const rawPath = positionals[0]\n if (!rawPath) {\n process.stderr.write(\n \"agentproto workspace add: missing <path>. Try: agentproto workspace add ~/code/my-project\\n\"\n )\n return 2\n }\n const absPath = resolve(rawPath.replace(/^~/, process.env.HOME ?? \"~\"))\n if (!existsSync(absPath)) {\n process.stderr.write(\n `agentproto workspace add: \"${absPath}\" doesn't exist. Create the directory first or pass an existing one.\\n`\n )\n return 2\n }\n const slug = sanitizeSlug(values.slug ?? basename(absPath))\n const config = await loadWorkspacesConfig()\n const next = addWorkspace(config, {\n slug,\n path: absPath,\n ...(values.label ? { label: values.label } : {}),\n })\n await saveWorkspacesConfig(next)\n const wasActive = config.active === slug\n const becameActive = next.active === slug && !wasActive\n process.stdout.write(\n `✓ ${slug} → ${absPath}` +\n (becameActive ? \" (set as active — first registered workspace)\" : \"\") +\n \"\\n\"\n )\n return 0\n}\n\nasync function runList(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: { json: { type: \"boolean\" } },\n })\n const config = await loadWorkspacesConfig()\n if (values.json) {\n process.stdout.write(JSON.stringify(config, null, 2) + \"\\n\")\n return 0\n }\n if (config.workspaces.length === 0) {\n process.stdout.write(\n \"No workspaces registered.\\n\" +\n \"Add one with: agentproto workspace add <path>\\n\"\n )\n return 0\n }\n // Compact two-column layout — slug left, path right, with an\n // active marker. Sorted by updatedAt desc so the most recently\n // touched workspace is at the top.\n const sorted = [...config.workspaces].sort((a, b) =>\n b.updatedAt.localeCompare(a.updatedAt)\n )\n const slugCol = Math.max(...sorted.map(w => w.slug.length), 6)\n for (const w of sorted) {\n const marker = w.slug === config.active ? \"●\" : \" \"\n const slugCell = w.slug.padEnd(slugCol)\n const labelSuffix = w.label ? ` (${w.label})` : \"\"\n process.stdout.write(\n `${marker} ${slugCell} ${w.path}${labelSuffix}\\n`\n )\n }\n process.stdout.write(\n `\\n${sorted.length} workspace${sorted.length === 1 ? \"\" : \"s\"}` +\n (config.active ? `, active: ${config.active}` : \", no active\") +\n \"\\n\"\n )\n return 0\n}\n\nasync function runRemove(args: readonly string[]): Promise<number> {\n const { positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {},\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto workspace remove: missing <slug>.\\n\"\n )\n return 2\n }\n const config = await loadWorkspacesConfig()\n const sanitised = sanitizeSlug(slug)\n const existed = config.workspaces.some(w => w.slug === sanitised)\n if (!existed) {\n process.stderr.write(\n `agentproto workspace remove: no workspace named \"${sanitised}\".\\n`\n )\n return 2\n }\n const next = removeWorkspace(config, sanitised)\n await saveWorkspacesConfig(next)\n process.stdout.write(`✗ removed ${sanitised}\\n`)\n if (next.active && next.active !== config.active) {\n process.stdout.write(` active reassigned to: ${next.active}\\n`)\n } else if (!next.active && config.active) {\n process.stdout.write(` no workspaces left — active cleared\\n`)\n }\n return 0\n}\n\nasync function runUse(args: readonly string[]): Promise<number> {\n const { positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {},\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\"agentproto workspace use: missing <slug>.\\n\")\n return 2\n }\n const config = await loadWorkspacesConfig()\n try {\n const next = setActiveWorkspace(config, slug)\n await saveWorkspacesConfig(next)\n const w = next.workspaces.find(x => x.slug === next.active) as\n | WorkspaceEntry\n | undefined\n process.stdout.write(`● active: ${next.active} (${w?.path ?? \"?\"})\\n`)\n return 0\n } catch (err) {\n process.stderr.write(\n `agentproto workspace use: ${\n err instanceof Error ? err.message : String(err)\n }\\n`\n )\n return 2\n }\n}\n","/**\n * `agentproto sessions [--watch] [--attach <id>] [--json]`\n * `agentproto sessions start <slug> [--cwd <dir>] [--workspace <slug>]\n * [--prompt <text>] [--label <text>]\n * [--attach] [--json]`\n * `agentproto sessions stop <id>`\n *\n * Browse and control the daemon's live sessions (terminals, agent\n * CLIs, custom commands) without leaving the shell:\n *\n * agentproto sessions one-shot table dump\n * agentproto sessions --watch re-render every 2s, q to quit\n * agentproto sessions --attach <id> SSE-stream a session's output\n * agentproto sessions start <slug> POST /sessions/agent to spawn\n * a persistent agent-cli session\n * agentproto sessions stop <id> POST /sessions/:id/kill (SIGTERM)\n *\n * The TUI is intentionally minimal — raw stdin keypresses, no inquirer\n * / blessed dep. Terminal emulator quirks (xterm vs iTerm, key\n * sequences for arrow keys) are limited to a couple lines below.\n *\n * Endpoint discovery: reads `~/.agentproto/runtime.json` written by\n * the daemon at startup. Falls back to the env var\n * `AGENTPROTO_DAEMON_URL` when the file is missing or stale.\n */\nimport { parseArgs } from \"node:util\"\nimport { promises as fs } from \"node:fs\"\nimport { resolve } from \"node:path\"\nimport http from \"node:http\"\nimport https from \"node:https\"\nimport WebSocket from \"ws\"\nimport {\n loadWorkspacesConfig,\n getActiveWorkspace,\n} from \"@agentproto/runtime/workspaces-config\"\nimport {\n RESUME_STRATEGIES,\n hasResumeStrategy,\n} from \"@agentproto/runtime/resume-strategies\"\nimport type { SessionDescriptor } from \"@agentproto/runtime\"\n\nconst USAGE = `agentproto sessions — browse and control daemon sessions\n\nUsage:\n agentproto sessions [--watch] [--json]\n agentproto sessions --attach <id-or-name> [--no-color]\n agentproto sessions start <adapter> [--cwd <dir>] [--workspace <slug>]\n [--prompt <text>] [--label <text>]\n [--attach] [--json] [--no-color]\n agentproto sessions terminal -- <argv...> [--cwd <dir>] [--workspace <slug>]\n [--name <slug>] [--label <text>]\n [--cols <n>] [--rows <n>]\n [--attach] [--json] [--no-color]\n agentproto sessions stop <id-or-name> [--json]\n\nDiscovers the daemon via ~/.agentproto/runtime.json. The token in that file\nis sent as Bearer on mutating routes; set AGENTPROTO_DAEMON_URL +\nAGENTPROTO_DAEMON_TOKEN to override.\n\nWhile attached:\n Ctrl-] q detach (session keeps running on the daemon)\n Ctrl-C send to the child (PTY mode) / detach (SSE mode)\n`\n\n// SessionDescriptor is imported from @agentproto/runtime — its\n// canonical shape covers adapterSlug / adapterSessionId / cwd / argv\n// / resumeMetadata, which the resume/restart flow below relies on.\n// Keeping a local re-declaration here in the past drifted out of\n// sync with the runtime, breaking type-check on every field added.\n\nexport async function runSessions(args: readonly string[]): Promise<number> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n process.stdout.write(USAGE)\n return 0\n }\n\n // Route `start` / `stop` / `terminal` subverbs before the flag\n // parser — they take positionals the flag parser would reject.\n const sub = args[0]\n if (sub === \"start\") return runStart(args.slice(1))\n if (sub === \"stop\") return runStop(args.slice(1))\n if (sub === \"terminal\") return runTerminal(args.slice(1))\n if (sub === \"mirror\") return runMirror(args.slice(1))\n if (sub === \"restart\") return runRestart(args.slice(1))\n\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: {\n watch: { type: \"boolean\" },\n json: { type: \"boolean\" },\n attach: { type: \"string\" },\n simple: { type: \"boolean\" },\n \"no-color\": { type: \"boolean\" },\n },\n })\n\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions\")\n return 2\n }\n const endpoint = report.found\n\n if (values.attach) {\n return runAttach({\n endpoint,\n idOrName: values.attach,\n colour: !values[\"no-color\"],\n })\n }\n\n if (values.json) {\n const list = await fetchSessions(endpoint.url)\n process.stdout.write(JSON.stringify(list, null, 2) + \"\\n\")\n return 0\n }\n\n if (values.watch) {\n return values.simple\n ? runWatchSimple(endpoint, !values[\"no-color\"])\n : runWatch(endpoint, !values[\"no-color\"])\n }\n\n // One-shot\n const list = await fetchSessions(endpoint.url)\n printTable(list)\n return 0\n}\n\nasync function runStart(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n cwd: { type: \"string\" },\n workspace: { type: \"string\" },\n prompt: { type: \"string\", short: \"p\" },\n label: { type: \"string\" },\n attach: { type: \"boolean\" },\n json: { type: \"boolean\" },\n \"no-color\": { type: \"boolean\" },\n },\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto sessions start: missing adapter slug.\\n\" +\n \" Try: agentproto sessions start claude-code --attach\\n\"\n )\n return 2\n }\n if (positionals.length > 1) {\n process.stderr.write(\n `agentproto sessions start: unexpected extra positionals: ${positionals\n .slice(1)\n .join(\" \")}\\n`\n )\n return 2\n }\n\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions start\")\n return 2\n }\n const endpoint = report.found\n\n const body: Record<string, string> = { adapter: slug }\n if (values.cwd) body.cwd = resolve(values.cwd)\n if (values.workspace) body.workspaceSlug = values.workspace\n if (values.prompt) body.prompt = values.prompt\n if (values.label) body.label = values.label\n\n let desc: SessionDescriptor\n try {\n desc = await httpPostJson<SessionDescriptor>(\n `${endpoint.url}/sessions/agent`,\n body,\n endpoint.token,\n )\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 401/.test(msg)) {\n process.stderr.write(\n (await explain401(endpoint, \"agentproto sessions start\")) + \"\\n\",\n )\n } else {\n process.stderr.write(`agentproto sessions start: ${msg}\\n`)\n }\n return 1\n }\n\n if (values.json) {\n process.stdout.write(JSON.stringify(desc, null, 2) + \"\\n\")\n } else {\n process.stdout.write(\n `agentproto sessions start: spawned ${desc.kind} ${desc.id}` +\n ` (${desc.status}) — ${desc.command}\\n`\n )\n }\n\n if (values.attach) {\n return runAttach({\n endpoint,\n idOrName: desc.id,\n colour: !values[\"no-color\"],\n })\n }\n return 0\n}\n\nasync function runStop(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n json: { type: \"boolean\" },\n },\n })\n const id = positionals[0]\n if (!id) {\n process.stderr.write(\n \"agentproto sessions stop: missing session id.\\n\" +\n \" Try: agentproto sessions stop <id-or-name> (find ids with `agentproto sessions`)\\n\"\n )\n return 2\n }\n if (positionals.length > 1) {\n process.stderr.write(\n `agentproto sessions stop: unexpected extra positionals: ${positionals\n .slice(1)\n .join(\" \")}\\n`\n )\n return 2\n }\n\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions stop\")\n return 2\n }\n const endpoint = report.found\n\n try {\n const result = await httpPostJson<{ ok: boolean; id: string }>(\n `${endpoint.url}/sessions/${encodeURIComponent(id)}/kill`,\n {},\n endpoint.token,\n )\n if (values.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\")\n } else {\n process.stdout.write(\n result.ok\n ? `agentproto sessions stop: SIGTERM sent to ${id}\\n`\n : `agentproto sessions stop: ${id} not running\\n`\n )\n }\n return result.ok ? 0 : 1\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 401/.test(msg)) {\n process.stderr.write(\n (await explain401(endpoint, \"agentproto sessions stop\")) + \"\\n\",\n )\n return 1\n }\n if (/HTTP 404/.test(msg)) {\n process.stderr.write(\n `agentproto sessions stop: no session \"${id}\".\\n`\n )\n return 2\n }\n process.stderr.write(`agentproto sessions stop: ${msg}\\n`)\n return 1\n }\n}\n\n/**\n * `agentproto sessions terminal -- <argv...>` — spawn a PTY-backed\n * session via POST /sessions/terminal. The `--` separator is the\n * idiomatic way to pass argv that includes flags the verb's own\n * parser would otherwise eat. Without `--`, the first positional is\n * the binary and the rest are arguments.\n */\nasync function runTerminal(args: readonly string[]): Promise<number> {\n // Split on `--` so users can pass arbitrary argv (including flags\n // that look like the verb's own). Everything after `--` is argv;\n // anything before is verb flags.\n const sepIdx = args.indexOf(\"--\")\n const verbArgs = sepIdx === -1 ? [...args] : args.slice(0, sepIdx)\n const argvFromSeparator = sepIdx === -1 ? [] : args.slice(sepIdx + 1)\n\n const { values, positionals } = parseArgs({\n args: verbArgs,\n allowPositionals: true,\n strict: true,\n options: {\n cwd: { type: \"string\" },\n workspace: { type: \"string\" },\n name: { type: \"string\" },\n label: { type: \"string\" },\n cols: { type: \"string\" },\n rows: { type: \"string\" },\n attach: { type: \"boolean\" },\n json: { type: \"boolean\" },\n \"no-color\": { type: \"boolean\" },\n },\n })\n\n // argv = positionals before `--` (none allowed) OR everything after `--`.\n // Pre-`--` positionals are rejected: the user almost certainly typed\n // `agentproto sessions terminal claude`\n // and meant `agentproto sessions terminal -- claude`, but to avoid\n // ambiguity with flags we require the separator.\n if (positionals.length > 0 && argvFromSeparator.length === 0) {\n // Be lenient: if there's only one positional and it doesn't look\n // like a flag, treat it as `--`-prefixed argv. Saves typing for the\n // common case `agentproto sessions terminal bash --attach`.\n // We already consumed verb flags above, so positionals here are\n // the leftovers — safe to use as argv.\n // Fall through.\n }\n const argv =\n argvFromSeparator.length > 0 ? argvFromSeparator : [...positionals]\n if (argv.length === 0) {\n process.stderr.write(\n \"agentproto sessions terminal: missing argv.\\n\" +\n \" Try: agentproto sessions terminal -- bash\\n\" +\n \" agentproto sessions terminal -- claude --resume <id>\\n\",\n )\n return 2\n }\n\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions terminal\")\n return 2\n }\n const endpoint = report.found\n\n const cols = values.cols ? Number.parseInt(values.cols, 10) : undefined\n const rows = values.rows ? Number.parseInt(values.rows, 10) : undefined\n const body: Record<string, unknown> = {\n argv,\n cols:\n cols && Number.isFinite(cols) && cols > 0\n ? cols\n : process.stdout.columns && process.stdout.columns > 0\n ? process.stdout.columns\n : 80,\n rows:\n rows && Number.isFinite(rows) && rows > 0\n ? rows\n : process.stdout.rows && process.stdout.rows > 0\n ? process.stdout.rows\n : 24,\n }\n if (values.cwd) body.cwd = resolve(values.cwd)\n if (values.workspace) body.workspaceSlug = values.workspace\n if (values.name) body.name = values.name\n if (values.label) body.label = values.label\n\n let desc: SessionDescriptor\n try {\n desc = await httpPostJson<SessionDescriptor>(\n `${endpoint.url}/sessions/terminal`,\n body,\n endpoint.token,\n )\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 401/.test(msg)) {\n process.stderr.write(\n (await explain401(endpoint, \"agentproto sessions terminal\")) + \"\\n\",\n )\n } else {\n process.stderr.write(`agentproto sessions terminal: ${msg}\\n`)\n }\n return 1\n }\n\n if (values.json) {\n process.stdout.write(JSON.stringify(desc, null, 2) + \"\\n\")\n } else {\n process.stdout.write(\n `agentproto sessions terminal: spawned ${desc.id}` +\n `${desc.name ? ` (${desc.name})` : \"\"} — ${desc.command}\\n`,\n )\n }\n\n if (values.attach) {\n return runAttach({\n endpoint,\n idOrName: desc.id,\n colour: !values[\"no-color\"],\n })\n }\n return 0\n}\n\ninterface DaemonEndpoint {\n url: string\n token?: string\n /** Path of the runtime.json the endpoint came from. Lets error\n * messages tell the user which file to inspect when something\n * looks wrong. Undefined when the endpoint came from env vars. */\n sourcePath?: string\n}\n\ninterface DaemonDiscoveryReport {\n /** First live endpoint, if any. */\n found: DaemonEndpoint | null\n /** runtime.json files we walked past because their PID was dead. */\n stale: Array<{ path: string; pid: number | null; mtime: Date | null }>\n}\n\nasync function discoverDaemon(): Promise<DaemonDiscoveryReport> {\n // Env overrides win on URL. The token is OPTIONAL via env: when\n // only the URL is set, we still try to find a matching runtime.json\n // on disk so mutating routes don't 401 just because the user\n // (or `serve --interactive`) forgot to forward the token.\n if (process.env.AGENTPROTO_DAEMON_URL) {\n const url = process.env.AGENTPROTO_DAEMON_URL.replace(/\\/+$/, \"\")\n let token: string | undefined = process.env.AGENTPROTO_DAEMON_TOKEN\n if (!token) {\n // Walk every registered workspace looking for a runtime.json\n // whose url matches — that gives us the matching token without\n // forcing the user to copy it manually.\n const config = await loadWorkspacesConfig().catch(() => null)\n if (config) {\n for (const ws of config.workspaces) {\n const ep = await readRuntimeJsonWithStatus(ws.path)\n if (ep.endpoint && ep.endpoint.url === url && ep.endpoint.token) {\n token = ep.endpoint.token\n break\n }\n }\n }\n }\n return {\n found: { url, ...(token ? { token } : {}) },\n stale: [],\n }\n }\n const config = await loadWorkspacesConfig().catch(() => null)\n if (!config) return { found: null, stale: [] }\n const candidates = [\n getActiveWorkspace(config),\n ...config.workspaces,\n ].filter(\n (w, i, arr): w is NonNullable<typeof w> =>\n !!w && arr.findIndex(x => x?.slug === w.slug) === i,\n )\n const stale: DaemonDiscoveryReport[\"stale\"] = []\n for (const w of candidates) {\n const result = await readRuntimeJsonWithStatus(w.path)\n if (result.endpoint) {\n return { found: result.endpoint, stale }\n }\n if (result.stale) {\n stale.push(result.stale)\n }\n }\n return { found: null, stale }\n}\n\nasync function resolveDaemon(): Promise<DaemonEndpoint | null> {\n const report = await discoverDaemon()\n return report.found\n}\n\n/** @deprecated Kept for callers that only need the URL. */\nasync function resolveDaemonUrl(): Promise<string | null> {\n const ep = await resolveDaemon()\n return ep ? ep.url : null\n}\n\n/**\n * Pretty-print a \"no daemon found\" error. When stale runtime.json\n * files exist, list them with their dead pid + age — that's the\n * footgun: the user thinks they have no daemon, but stale files\n * make discovery a guessing game. Suggested fix is at the bottom.\n */\nfunction printNoDaemonError(report: DaemonDiscoveryReport, verb: string): void {\n const lines: string[] = [\n `${verb}: no daemon found.`,\n ` Start one with \\`agentproto serve\\` or set AGENTPROTO_DAEMON_URL.`,\n ]\n if (report.stale.length > 0) {\n lines.push(\n ``,\n ` found ${report.stale.length} stale runtime.json file(s) (PID dead):`,\n )\n for (const s of report.stale) {\n const age = s.mtime ? humaniseDelta(Date.now() - s.mtime.getTime()) : \"?\"\n lines.push(\n ` ${s.path} (pid=${s.pid ?? \"?\"} · ${age} old)`,\n )\n }\n lines.push(\n ``,\n ` these confuse discovery — delete them and re-run:`,\n ...report.stale.map(s => ` rm ${s.path}`),\n )\n }\n process.stderr.write(lines.join(\"\\n\") + \"\\n\")\n}\n\nasync function readRuntimeJson(workspacePath: string): Promise<DaemonEndpoint | null> {\n const out = await readRuntimeJsonWithStatus(workspacePath)\n return out.endpoint\n}\n\ninterface RuntimeJsonRead {\n /** Resolved live endpoint, or null when the file is missing /\n * malformed / has a dead PID. */\n endpoint: DaemonEndpoint | null\n /** Set when the file exists but the PID is dead — caller can list\n * this to the user as a cleanup suggestion. */\n stale?: { path: string; pid: number | null; mtime: Date | null }\n}\n\nasync function readRuntimeJsonWithStatus(workspacePath: string): Promise<RuntimeJsonRead> {\n const path = resolve(workspacePath, \".agentproto\", \"runtime.json\")\n let stat: Awaited<ReturnType<typeof fs.stat>>\n try {\n stat = await fs.stat(path)\n } catch {\n return { endpoint: null } // ENOENT, etc.\n }\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch {\n return { endpoint: null }\n }\n let parsed: { port?: number; bind?: string; token?: string; pid?: number }\n try {\n parsed = JSON.parse(raw)\n } catch {\n return { endpoint: null }\n }\n if (typeof parsed.port !== \"number\") return { endpoint: null }\n // Liveness check — when the daemon dies without graceful shutdown\n // (kill -9, crash, reboot), its runtime.json lingers on disk with\n // a now-stale token. Trusting that token against a freshly-booted\n // daemon (same port, new token) produces a 401 the user can't\n // easily debug. process.kill(pid, 0) returns true when the process\n // exists, throws ESRCH otherwise — costs nothing, fixes the\n // \"I have leftover runtime.json files\" footgun.\n if (typeof parsed.pid === \"number\" && !isPidAlive(parsed.pid)) {\n return {\n endpoint: null,\n stale: {\n path,\n pid: parsed.pid ?? null,\n mtime: stat.mtime ?? null,\n },\n }\n }\n return {\n endpoint: {\n url: `http://${parsed.bind ?? \"127.0.0.1\"}:${parsed.port}`,\n sourcePath: path,\n ...(typeof parsed.token === \"string\" ? { token: parsed.token } : {}),\n },\n }\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n // Signal 0 doesn't deliver — it just checks for the process'\n // existence. EPERM would mean \"exists but you don't own it\",\n // which on a single-user macOS / Linux box won't happen for a\n // user-launched daemon; treat any non-throw as alive.\n process.kill(pid, 0)\n return true\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code\n if (code === \"EPERM\") return true // exists, we just can't signal\n return false // ESRCH (no such process) and anything else → dead\n }\n}\n\nasync function fetchSessions(baseUrl: string): Promise<SessionDescriptor[]> {\n const body = await httpGetJson(`${baseUrl}/sessions`)\n if (!body || !Array.isArray((body as { sessions?: unknown }).sessions)) {\n return []\n }\n return (body as { sessions: SessionDescriptor[] }).sessions\n}\n\nfunction printTable(rows: SessionDescriptor[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"No sessions.\\n\")\n return\n }\n const widths = {\n id: Math.max(...rows.map(r => r.id.length), 4),\n kind: Math.max(...rows.map(r => r.kind.length), 4),\n workspace: Math.max(...rows.map(r => r.workspaceSlug.length), 9),\n status: Math.max(...rows.map(r => r.status.length), 8),\n age: 8,\n }\n const header =\n pad(\"ID\", widths.id) +\n \" \" +\n pad(\"KIND\", widths.kind) +\n \" \" +\n pad(\"WORKSPACE\", widths.workspace) +\n \" \" +\n pad(\"STATUS\", widths.status) +\n \" \" +\n pad(\"AGE\", widths.age) +\n \" COMMAND\"\n process.stdout.write(`\\x1b[2m${header}\\x1b[0m\\n`)\n const now = Date.now()\n for (const r of rows) {\n const age = humaniseDelta(now - new Date(r.startedAt).getTime())\n const tone = statusColour(r.status)\n process.stdout.write(\n pad(r.id, widths.id) +\n \" \" +\n pad(r.kind, widths.kind) +\n \" \" +\n pad(r.workspaceSlug, widths.workspace) +\n \" \" +\n `${tone}${pad(r.status, widths.status)}\\x1b[0m` +\n \" \" +\n pad(age, widths.age) +\n \" \" +\n truncate(r.command, 60) +\n \"\\n\"\n )\n }\n}\n\nfunction statusColour(status: string): string {\n switch (status) {\n case \"running\":\n return \"\\x1b[32m\" // green\n case \"starting\":\n case \"mounting\":\n return \"\\x1b[33m\" // yellow\n case \"exited\":\n return \"\\x1b[2m\" // dim\n case \"killed\":\n case \"error\":\n return \"\\x1b[31m\" // red\n default:\n return \"\"\n }\n}\n\nfunction pad(s: string, n: number): string {\n if (s.length >= n) return s\n return s + \" \".repeat(n - s.length)\n}\n\nfunction truncate(s: string, n: number): string {\n if (s.length <= n) return s\n return s.slice(0, n - 1) + \"…\"\n}\n\nfunction humaniseDelta(ms: number): string {\n if (ms < 60_000) return `${Math.floor(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.floor(ms / 60_000)}m`\n if (ms < 86_400_000) return `${Math.floor(ms / 3_600_000)}h`\n return `${Math.floor(ms / 86_400_000)}d`\n}\n\n/**\n * `agentproto sessions --watch` — interactive TUI picker over the\n * daemon's session list. Auto-refreshes every 2 s; key bindings:\n *\n * ↑/↓ or j/k move selection\n * Enter attach to selected (PTY-aware via runAttach)\n * K kill selected (POST /sessions/:id/kill)\n * d forget selected (DELETE /sessions/:id; exited only)\n * r refresh now\n * q or Ctrl-C quit\n *\n * Non-TTY stdin degrades to a one-shot dump (no live keys, no\n * picker), matching the old behaviour for `agentproto sessions`\n * piped into a pager.\n */\n/**\n * `--watch --simple` — the original flat-table picker. Kept for\n * piping into a pager / external tool. The new default is the\n * 3-pane dashboard `runWatch`.\n */\nasync function runWatchSimple(\n endpoint: DaemonEndpoint,\n colour: boolean,\n): Promise<number> {\n const tty = process.stdin.isTTY === true\n if (!tty) {\n const list = await fetchSessions(endpoint.url)\n printTable(list)\n return 0\n }\n\n process.stdin.setRawMode(true)\n process.stdin.resume()\n process.stdin.setEncoding(\"utf8\")\n\n let stop = false\n let action: \"attach\" | null = null\n let attachTargetId: string | null = null\n let cursor = 0\n let rows: SessionDescriptor[] = []\n let statusMsg = \"\"\n\n const repaint = (): void => {\n process.stdout.write(\"\\x1bc\")\n process.stdout.write(\n `\\x1b[2magentproto sessions · ${endpoint.url} · ↑/↓ move · Enter attach · K kill · d forget · r refresh · q quit\\x1b[0m\\n\\n`,\n )\n if (statusMsg) {\n process.stdout.write(`\\x1b[33m${statusMsg}\\x1b[0m\\n\\n`)\n }\n printPickerTable(rows, cursor)\n }\n\n const refresh = async (): Promise<void> => {\n try {\n rows = await fetchSessions(endpoint.url)\n } catch (err) {\n statusMsg = `fetch error: ${err instanceof Error ? err.message : String(err)}`\n rows = []\n }\n if (cursor >= rows.length) cursor = Math.max(0, rows.length - 1)\n }\n\n const onKey = (key: string): void => {\n // Arrow keys arrive as ESC [ A/B/C/D — match common terminals.\n if (key === \"\\x1b[A\" || key === \"k\") {\n if (cursor > 0) cursor--\n repaint()\n return\n }\n if (key === \"\\x1b[B\" || key === \"j\") {\n if (cursor < rows.length - 1) cursor++\n repaint()\n return\n }\n if (key === \"\\r\" || key === \"\\n\") {\n const target = rows[cursor]\n if (target) {\n action = \"attach\"\n attachTargetId = target.id\n stop = true\n }\n return\n }\n if (key === \"K\") {\n const target = rows[cursor]\n if (!target) return\n void httpPostJson<{ ok: boolean }>(\n `${endpoint.url}/sessions/${encodeURIComponent(target.id)}/kill`,\n {},\n endpoint.token,\n )\n .then(r => {\n statusMsg = r.ok\n ? `sent SIGTERM to ${target.id}`\n : `${target.id} not running`\n return refresh()\n })\n .catch(err => {\n statusMsg = `kill error: ${err instanceof Error ? err.message : String(err)}`\n })\n .finally(() => repaint())\n return\n }\n if (key === \"d\") {\n const target = rows[cursor]\n if (!target) return\n if (\n target.status !== \"exited\" &&\n target.status !== \"killed\" &&\n target.status !== \"error\"\n ) {\n statusMsg = `d: ${target.id} still ${target.status} — use K first`\n repaint()\n return\n }\n void httpDelete(\n `${endpoint.url}/sessions/${encodeURIComponent(target.id)}`,\n endpoint.token,\n )\n .then(() => {\n statusMsg = `forgot ${target.id}`\n return refresh()\n })\n .catch(err => {\n statusMsg = `forget error: ${err instanceof Error ? err.message : String(err)}`\n })\n .finally(() => repaint())\n return\n }\n if (key === \"r\") {\n statusMsg = \"\"\n void refresh().finally(() => repaint())\n return\n }\n if (key === \"q\" || key === \"\u0003\" /* Ctrl-C */) {\n stop = true\n return\n }\n void colour // silence unused-var; reserved for future colour toggle\n }\n\n process.stdin.on(\"data\", onKey)\n const sigintHandler = (): void => {\n stop = true\n }\n process.once(\"SIGINT\", sigintHandler)\n\n try {\n await refresh()\n repaint()\n while (!stop) {\n await new Promise<void>(res => setTimeout(res, 2_000))\n if (stop) break\n await refresh()\n repaint()\n }\n } finally {\n process.stdin.off(\"data\", onKey)\n process.off(\"SIGINT\", sigintHandler)\n process.stdin.setRawMode(false)\n process.stdin.pause()\n process.stdout.write(\"\\n\")\n }\n\n if (action === \"attach\" && attachTargetId) {\n return runAttach({\n endpoint,\n idOrName: attachTargetId,\n colour,\n })\n }\n return 0\n}\n\n/**\n * Same shape as printTable but highlights the cursor row. Lives next\n * to printTable rather than gating it on a flag — the watch picker\n * needs distinct visual treatment that would otherwise add yet more\n * conditionals to the read-only printer.\n */\nfunction printPickerTable(rows: SessionDescriptor[], cursor: number): void {\n if (rows.length === 0) {\n process.stdout.write(\"No sessions.\\n\")\n return\n }\n const widths = {\n id: Math.max(...rows.map(r => r.id.length), 4),\n kind: Math.max(...rows.map(r => r.kind.length), 4),\n workspace: Math.max(...rows.map(r => r.workspaceSlug.length), 9),\n status: Math.max(...rows.map(r => r.status.length), 8),\n age: 8,\n }\n const header =\n \" \" +\n pad(\"ID\", widths.id) +\n \" \" +\n pad(\"KIND\", widths.kind) +\n \" \" +\n pad(\"WORKSPACE\", widths.workspace) +\n \" \" +\n pad(\"STATUS\", widths.status) +\n \" \" +\n pad(\"AGE\", widths.age) +\n \" COMMAND\"\n process.stdout.write(`\\x1b[2m${header}\\x1b[0m\\n`)\n const now = Date.now()\n rows.forEach((r, i) => {\n const age = humaniseDelta(now - new Date(r.startedAt).getTime())\n const tone = statusColour(r.status)\n const marker = i === cursor ? \"\\x1b[7m▸\" : \" \"\n const reset = i === cursor ? \"\\x1b[0m\" : \"\"\n process.stdout.write(\n `${marker} ` +\n pad(r.id, widths.id) +\n \" \" +\n pad(r.kind, widths.kind) +\n \" \" +\n pad(r.workspaceSlug, widths.workspace) +\n \" \" +\n `${tone}${pad(r.status, widths.status)}\\x1b[0m` +\n \" \" +\n pad(age, widths.age) +\n \" \" +\n truncate(r.command, 60) +\n reset +\n \"\\n\",\n )\n })\n}\n\n/**\n * `agentproto sessions --watch` — 3-pane dashboard:\n *\n * ┌─ header (gateway · workspace · pty · origins · mode) ────────────┐\n * │ SESSIONS │ DETAIL │\n * │ ▸ name pty status age │ id / name / kind / status / … │\n * │ … │ │\n * │ │ press Enter to attach │\n * ├─ events strip (last 3 from /events SSE) ───────────────────────── │\n * └─ keys footer ────────────────────────────────────────────────────┘\n *\n * Alt-screen mode so scrollback isn't trashed. Polls /sessions every\n * 2 s; subscribes to /events for the live ticker. Non-TTY stdin →\n * one-shot dump (no live keys), matching --simple.\n */\nasync function runWatch(\n endpoint: DaemonEndpoint,\n colour: boolean,\n): Promise<number> {\n const tty = process.stdin.isTTY === true && process.stdout.isTTY === true\n if (!tty) {\n const list = await fetchSessions(endpoint.url)\n printTable(list)\n return 0\n }\n // Non-colour pass-through: callers can still pipe via --no-color\n // (mostly relevant when tee-ing to a file from a real terminal).\n void colour\n\n // ─── state ─────────────────────────────────────────────────────\n let stop = false\n let action: \"attach\" | \"mirror\" | null = null\n let attachTargetId: string | null = null\n let cursor = 0\n let sessions: SessionDescriptor[] = []\n let recentEvents: { at: string; line: string }[] = []\n let health: {\n workspace?: string\n uptimeMs?: number\n } | null = null\n let statusMsg = \"\"\n let statusMsgUntil = 0\n // Per-session preview cache (last N lines from /sessions/:id/preview).\n // Populated on selection change + on each refresh tick so the panel\n // updates as new output lands. Capped to selected + last 5 to bound\n // memory on dashboards left open across many sessions.\n const previewCache = new Map<string, string[]>()\n let lastPreviewFetch = 0\n\n // ─── terminal setup ────────────────────────────────────────────\n const enterAlt = \"\\x1b[?1049h\"\n const exitAlt = \"\\x1b[?1049l\"\n const hideCur = \"\\x1b[?25l\"\n const showCur = \"\\x1b[?25h\"\n process.stdout.write(enterAlt + hideCur)\n process.stdin.setRawMode(true)\n process.stdin.resume()\n process.stdin.setEncoding(\"utf8\")\n\n const restore = (): void => {\n process.stdout.write(showCur + exitAlt)\n try {\n process.stdin.setRawMode(false)\n } catch {\n /* ignore */\n }\n process.stdin.pause()\n }\n\n // ─── data fetchers ─────────────────────────────────────────────\n const refresh = async (): Promise<void> => {\n try {\n sessions = await fetchSessions(endpoint.url)\n if (cursor >= sessions.length) cursor = Math.max(0, sessions.length - 1)\n } catch (err) {\n flash(\n `fetch error: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n }\n const refreshHealth = async (): Promise<void> => {\n try {\n const body = (await httpGetJson<{\n workspace?: string\n uptimeMs?: number\n }>(`${endpoint.url}/health`))\n health = body\n } catch {\n health = null\n }\n }\n\n /**\n * Fetch the last N lines of the selected session's ring buffer so\n * the detail pane shows what it was doing. Background — call site\n * doesn't await; render() reads from the cache. Throttled because\n * the dashboard tick already polls every second; we only re-fetch\n * the preview on selection change or every ~3 ticks.\n */\n const refreshPreview = async (id: string): Promise<void> => {\n try {\n const body = await httpGetJson<{\n lines?: string[]\n bytes?: string | null\n }>(`${endpoint.url}/sessions/${encodeURIComponent(id)}/preview?lines=10`)\n const lines: string[] = []\n if (Array.isArray(body.lines) && body.lines.length > 0) {\n lines.push(...body.lines)\n } else if (typeof body.bytes === \"string\" && body.bytes.length > 0) {\n // PTY session — split the base64-decoded tail into displayable\n // lines. Strip ANSI escapes; the dashboard's table layout\n // would otherwise show garbled cursor moves / colours.\n try {\n const buf = Buffer.from(body.bytes, \"base64\").toString(\"utf8\")\n const stripped = buf.replace(/\\x1b\\[[0-9;?]*[A-Za-z]/g, \"\")\n const split = stripped.split(\"\\n\").filter(l => l.length > 0)\n lines.push(...split.slice(-10))\n } catch {\n // ignore decode errors\n }\n }\n previewCache.set(id, lines)\n // Bound cache: keep only entries for currently-visible sessions\n // plus a handful of recent ones.\n if (previewCache.size > 12) {\n const stale = [...previewCache.keys()].slice(0, previewCache.size - 12)\n for (const k of stale) previewCache.delete(k)\n }\n } catch {\n // best-effort; leave whatever was cached\n }\n }\n\n // ─── events SSE ────────────────────────────────────────────────\n const eventsUrl = new URL(`${endpoint.url}/events`)\n const lib = eventsUrl.protocol === \"https:\" ? https : http\n const eventsReq = lib.get(\n eventsUrl,\n { headers: { accept: \"text/event-stream\" } },\n res => {\n let buf = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", chunk => {\n buf += chunk\n let idx = buf.indexOf(\"\\n\\n\")\n while (idx !== -1) {\n const event = buf.slice(0, idx)\n buf = buf.slice(idx + 2)\n for (const line of event.split(\"\\n\")) {\n if (!line.startsWith(\"data:\")) continue\n try {\n const payload = JSON.parse(line.slice(5).trim()) as {\n type?: string\n at?: string\n [k: string]: unknown\n }\n const summary = summariseEvent(payload)\n if (summary) {\n recentEvents.push({\n at: shortTime(payload.at ?? new Date().toISOString()),\n line: summary,\n })\n if (recentEvents.length > 5) recentEvents.shift()\n render()\n }\n } catch {\n /* ignore malformed frames */\n }\n }\n idx = buf.indexOf(\"\\n\\n\")\n }\n })\n res.on(\"end\", () => void 0)\n },\n )\n eventsReq.on(\"error\", () => void 0)\n\n // ─── key handling ──────────────────────────────────────────────\n let keyBuf = \"\"\n const onKey = (raw: Buffer | string): void => {\n keyBuf += typeof raw === \"string\" ? raw : raw.toString(\"utf8\")\n while (keyBuf.length > 0) {\n // Try to consume a recognised sequence.\n if (keyBuf.startsWith(\"\\x1b[A\")) {\n keyBuf = keyBuf.slice(3)\n if (cursor > 0) cursor--\n const t = sessions[cursor]\n if (t && !previewCache.has(t.id)) void refreshPreview(t.id).then(render)\n render()\n continue\n }\n if (keyBuf.startsWith(\"\\x1b[B\")) {\n keyBuf = keyBuf.slice(3)\n if (cursor < sessions.length - 1) cursor++\n const t = sessions[cursor]\n if (t && !previewCache.has(t.id)) void refreshPreview(t.id).then(render)\n render()\n continue\n }\n const ch = keyBuf[0]\n keyBuf = keyBuf.slice(1)\n if (ch === \"j\") {\n if (cursor < sessions.length - 1) cursor++\n const t = sessions[cursor]\n if (t && !previewCache.has(t.id)) void refreshPreview(t.id).then(render)\n render()\n } else if (ch === \"k\") {\n if (cursor > 0) cursor--\n const t = sessions[cursor]\n if (t && !previewCache.has(t.id)) void refreshPreview(t.id).then(render)\n render()\n } else if (ch === \"q\" || ch === \"\\x03\" /* Ctrl-C */) {\n stop = true\n return\n } else if (ch === \"r\") {\n flash(\"refreshing…\")\n void Promise.all([refresh(), refreshHealth()]).finally(render)\n } else if (ch === \"\\r\" || ch === \"\\n\") {\n const t = sessions[cursor]\n if (t) {\n action = \"attach\"\n attachTargetId = t.id\n stop = true\n return\n }\n } else if (ch === \"m\") {\n // Read-only mirror — safer than full attach because Ctrl-C\n // cleanly exits without needing the Ctrl-] q chord some\n // terminal emulators swallow.\n const t = sessions[cursor]\n if (t) {\n action = \"mirror\"\n attachTargetId = t.id\n stop = true\n return\n }\n } else if (ch === \"R\") {\n // Restart: respawn from history without leaving the dashboard.\n // Inline httpPostJson (like K kill) so failures flash inline\n // and a successful restart shows up in the next refresh —\n // never tears down the watch loop or the parent daemon.\n const t = sessions[cursor]\n if (!t) continue\n void restartSessionInline(endpoint, t)\n .then(msg => flash(msg))\n .catch(err =>\n flash(\n `restart error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n .finally(() => void refresh().then(render))\n } else if (ch === \"K\") {\n const t = sessions[cursor]\n if (!t) continue\n void httpPostJson<{ ok: boolean }>(\n `${endpoint.url}/sessions/${encodeURIComponent(t.id)}/kill`,\n {},\n endpoint.token,\n )\n .then(out =>\n flash(out.ok ? `SIGTERM sent to ${t.id}` : `${t.id} not running`),\n )\n .catch(err =>\n flash(\n `kill error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n .finally(() => void refresh().then(render))\n } else if (ch === \"d\") {\n const t = sessions[cursor]\n if (!t) continue\n if (\n t.status !== \"exited\" &&\n t.status !== \"killed\" &&\n t.status !== \"error\"\n ) {\n flash(`d: ${t.id} still ${t.status} — use K first`)\n render()\n continue\n }\n void httpDelete(\n `${endpoint.url}/sessions/${encodeURIComponent(t.id)}`,\n endpoint.token,\n )\n .then(() => {\n flash(`forgot ${t.id}`)\n return refresh()\n })\n .catch(err =>\n flash(\n `forget error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n .finally(() => render())\n }\n // Unknown chars silently discarded — TUI stays calm.\n }\n }\n\n const flash = (msg: string): void => {\n statusMsg = msg\n statusMsgUntil = Date.now() + 3_000\n }\n\n // ─── render ────────────────────────────────────────────────────\n const c = colour\n ? {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n reverse: \"\\x1b[7m\",\n green: \"\\x1b[32m\",\n amber: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n red: \"\\x1b[31m\",\n }\n : {\n reset: \"\",\n dim: \"\",\n bold: \"\",\n reverse: \"\",\n green: \"\",\n amber: \"\",\n cyan: \"\",\n red: \"\",\n }\n const statusTone = (s: string): string =>\n s === \"running\"\n ? c.green\n : s === \"starting\"\n ? c.amber\n : s === \"killed\" || s === \"error\"\n ? c.red\n : c.dim\n\n const render = (): void => {\n const cols = process.stdout.columns || 100\n const rows = process.stdout.rows || 30\n // Layout: 1 header, 1 separator, body (rows-5), 1 separator, 1 events, 1 footer.\n const bodyRows = Math.max(5, rows - 5)\n const sidebarWidth = Math.min(48, Math.max(34, Math.floor(cols * 0.4)))\n const detailWidth = cols - sidebarWidth - 1\n const sep = c.dim + \"│\" + c.reset\n const out: string[] = []\n\n // Row 1: header. Truncate to fit `cols` so it doesn't wrap and\n // push the rest of the screen down by a row (which manifested as\n // the title appearing to be missing in narrow terminals).\n const home = process.env.HOME ?? \"\"\n const ws =\n health?.workspace && home && health.workspace.startsWith(home)\n ? \"~\" + health.workspace.slice(home.length)\n : health?.workspace ?? \"?\"\n const headerLeft = `${c.bold}agentproto monitor${c.reset} ${c.dim}·${c.reset} ${c.cyan}${endpoint.url}${c.reset}`\n const headerRight = `${c.dim}workspace${c.reset} ${ws} ${c.dim}·${c.reset} ${c.dim}uptime${c.reset} ${humaniseDelta(health?.uptimeMs ?? 0)}`\n out.push(fitRow(headerLeft, headerRight, cols))\n out.push(c.dim + \"─\".repeat(cols) + c.reset)\n\n // Sidebar + detail (bodyRows lines). padEndVisible counts ANSI\n // escapes as zero-width so the column separator lands at the\n // sidebarWidth-th visible column, not the sidebarWidth-th\n // string-index (which over-pads when colors are on).\n const sidebarLines = renderSidebar(sessions, cursor, sidebarWidth, bodyRows, c, statusTone)\n const selected = sessions[cursor]\n const preview = selected ? previewCache.get(selected.id) : undefined\n const detailLines = renderDetail(selected, detailWidth, bodyRows, c, preview)\n for (let i = 0; i < bodyRows; i++) {\n out.push(\n padEndVisible(sidebarLines[i] ?? \"\", sidebarWidth) +\n sep +\n (detailLines[i] ?? \"\"),\n )\n }\n out.push(c.dim + \"─\".repeat(cols) + c.reset)\n\n // Events strip\n const evLine = recentEvents.length === 0\n ? `${c.dim}events · (no events yet)${c.reset}`\n : `${c.dim}events${c.reset} ` +\n recentEvents\n .map(e => `${c.dim}${e.at}${c.reset} ${e.line}`)\n .join(` ${c.dim}·${c.reset} `)\n out.push(truncateAnsi(evLine, cols))\n\n // Footer\n const showFlash =\n statusMsg && Date.now() < statusMsgUntil\n const selectedDesc = sessions[cursor]\n const isDead =\n selectedDesc &&\n (selectedDesc.status === \"exited\" ||\n selectedDesc.status === \"killed\" ||\n selectedDesc.status === \"error\")\n const footer = showFlash\n ? `${c.amber}${statusMsg}${c.reset}`\n : isDead\n ? `${c.dim}↑/↓ select · ${c.reset}${c.bold}R restart${c.reset}${c.dim} · m mirror · d forget · r refresh · q quit${c.reset}`\n : `${c.dim}↑/↓ select · Enter attach · R restart · m mirror · K kill · d forget · r refresh · q quit${c.reset}`\n out.push(truncateAnsi(footer, cols))\n\n // Paint: clear + home + write.\n process.stdout.write(\"\\x1b[H\\x1b[2J\" + out.join(\"\\n\"))\n }\n\n // ─── signals + cleanup ─────────────────────────────────────────\n const onResize = (): void => render()\n process.stdin.on(\"data\", onKey)\n process.stdout.on(\"resize\", onResize)\n const sigintHandler = (): void => {\n stop = true\n }\n process.once(\"SIGINT\", sigintHandler)\n\n try {\n await Promise.all([refresh(), refreshHealth()])\n // Initial preview for the first session.\n if (sessions[cursor]) void refreshPreview(sessions[cursor]!.id)\n render()\n let ticks = 0\n while (!stop) {\n await new Promise<void>(res => setTimeout(res, 1_000))\n if (stop) break\n ticks++\n // Sessions every 2 s, health every 10 s — health rarely\n // changes after boot, no point hammering it.\n if (ticks % 2 === 0) await refresh()\n if (ticks % 10 === 0) await refreshHealth()\n // Preview every 3 s for the currently-selected session — keep\n // the panel feeling alive without hammering the daemon.\n if (ticks - lastPreviewFetch >= 3) {\n const t = sessions[cursor]\n if (t) void refreshPreview(t.id)\n lastPreviewFetch = ticks\n }\n render()\n }\n } finally {\n eventsReq.destroy()\n process.stdin.off(\"data\", onKey)\n process.stdout.off(\"resize\", onResize)\n process.off(\"SIGINT\", sigintHandler)\n restore()\n }\n\n if (action === \"attach\" && attachTargetId) {\n // Run the attach, then re-enter the watch loop so the dashboard\n // doesn't disappear after a detach. The user gets the natural\n // workflow: peek at a session, drive it, detach, see the list\n // again, pick another one — until they hit q.\n const code = await runAttach({\n endpoint,\n idOrName: attachTargetId,\n colour,\n })\n void code\n return runWatch(endpoint, colour)\n }\n if (action === \"mirror\" && attachTargetId) {\n const code = await runMirror([attachTargetId])\n void code\n return runWatch(endpoint, colour)\n }\n return 0\n}\n\n/**\n * Restart a session without exiting the watch loop. Mirrors what\n * `runRestart` does — looks up the descriptor, picks the right\n * route, sends the body — but returns a short status string for\n * the dashboard's flash banner instead of writing to stderr / exit\n * code. Errors propagate so the caller can format the message.\n *\n * For agent-cli sessions we attempt to resume the conversation via\n * the prior adapter session id. Adapters (claude-code, hermes)\n * persist that id only AFTER the first turn — a session killed\n * before it had any conversation reports \"Resource not found\" on\n * resume. In that case we automatically retry the same shape WITHOUT\n * resumeSessionId so the user at least gets their command back; the\n * banner makes the fallback explicit so they know history was lost.\n */\nasync function restartSessionInline(\n endpoint: DaemonEndpoint,\n prev: SessionDescriptor,\n): Promise<string> {\n const augmented = await augmentWithFsResume(prev)\n const built = buildRestartBody(augmented)\n return executeRestartWithFallback(endpoint, augmented, built)\n}\n\ninterface RestartBody {\n url: string\n body: Record<string, unknown>\n}\n\n/**\n * Generic filesystem-fallback: for each known adapter strategy that\n * defines an `fsProbe`, run it against this session's cwd. If a\n * resume id is found, attach it to the descriptor's resumeMetadata.\n *\n * Lets `restart` recover continuity even when our own output sniffer\n * missed the resume hint (session killed too quickly, output buffered\n * past the kill, …). Eligible only when the file is at-or-after the\n * session's `startedAt` (avoid resuming an unrelated prior session\n * in the same cwd — see ResumeStrategy.fsProbe comment).\n */\n/**\n * Describe which resume path was used for a successful restart, so\n * the CLI/dashboard banner can tell the user what happened. Returns\n * a short phrase like \"resumed via claude --resume\" or \"resumed via\n * ACP\", or an empty string when no resume was attempted.\n */\nfunction describeResumePath(prev: SessionDescriptor): string {\n if (prev.adapterSlug) {\n const s = RESUME_STRATEGIES[prev.adapterSlug]\n if (s?.spawnArgs && s.storeAs && prev.resumeMetadata?.[s.storeAs]) {\n const sample = s.spawnArgs(\"…\")[0] ?? prev.adapterSlug\n return `resumed via ${sample} --resume`\n }\n }\n if (prev.adapterSlug && prev.adapterSessionId) {\n return \"resumed via ACP\"\n }\n return \"\"\n}\n\nasync function augmentWithFsResume(\n prev: SessionDescriptor,\n): Promise<SessionDescriptor> {\n const slug = prev.adapterSlug\n if (!slug) return prev\n const strategy = RESUME_STRATEGIES[slug]\n if (!strategy?.fsProbe) return prev\n // If we already have a captured id for this strategy's storage key,\n // skip the FS probe — the sniffer found it during the session.\n if (prev.resumeMetadata?.[strategy.storeAs]) return prev\n if (!prev.cwd) return prev\n const id = await strategy.fsProbe(prev.cwd, prev.startedAt)\n if (!id) return prev\n return {\n ...prev,\n resumeMetadata: {\n ...(prev.resumeMetadata ?? {}),\n [strategy.storeAs]: id,\n },\n }\n}\n\nfunction buildRestartBody(prev: SessionDescriptor): RestartBody {\n // Provider-native resume takes precedence over ACP-level resume.\n // Look up the adapter's strategy in the central registry; when it\n // defines `spawnArgs` AND we've captured a resume id for it, spawn\n // a PTY running the provider's native resume command. That works\n // whenever the provider persisted the session, regardless of\n // whether the ACP wrapper did — strictly more reliable.\n if (prev.adapterSlug) {\n const strategy = RESUME_STRATEGIES[prev.adapterSlug]\n const id = strategy?.storeAs\n ? prev.resumeMetadata?.[strategy.storeAs]\n : undefined\n if (strategy?.spawnArgs && id) {\n return {\n url: \"__pty__\",\n body: {\n argv: strategy.spawnArgs(id),\n cwd: prev.cwd ?? undefined,\n workspaceSlug: prev.workspaceSlug,\n cols: process.stdout.columns ?? 80,\n rows: process.stdout.rows ?? 24,\n ...(prev.name ? { name: prev.name } : {}),\n ...(prev.label ? { label: prev.label } : {}),\n },\n }\n }\n }\n if (prev.pty === true) {\n const argv = Array.isArray(prev.argv)\n ? prev.argv\n : tokenizeCommand(prev.command)\n return {\n url: \"__pty__\",\n body: {\n argv,\n cwd: prev.cwd ?? undefined,\n workspaceSlug: prev.workspaceSlug,\n cols: process.stdout.columns ?? 80,\n rows: process.stdout.rows ?? 24,\n ...(prev.name ? { name: prev.name } : {}),\n ...(prev.label ? { label: prev.label } : {}),\n },\n }\n }\n if (prev.adapterSlug) {\n return {\n url: \"__agent__\",\n body: {\n adapter: prev.adapterSlug,\n cwd: prev.cwd ?? undefined,\n workspaceSlug: prev.workspaceSlug,\n ...(prev.adapterSessionId\n ? { resumeSessionId: prev.adapterSessionId }\n : {}),\n ...(prev.label ? { label: prev.label } : {}),\n },\n }\n }\n throw new Error(\n `${prev.id} is a generic command session — restart only supports pty + agent-cli`,\n )\n}\n\nasync function executeRestartWithFallback(\n endpoint: DaemonEndpoint,\n prev: SessionDescriptor,\n built: RestartBody,\n): Promise<string> {\n const url =\n built.url === \"__pty__\"\n ? `${endpoint.url}/sessions/terminal`\n : `${endpoint.url}/sessions/agent`\n try {\n const next = await httpPostJson<SessionDescriptor>(\n url,\n built.body,\n endpoint.token,\n )\n const path = describeResumePath(prev)\n return `restarted ${prev.id} → ${next.id}${\n next.name ? ` (${next.name})` : \"\"\n }${path ? ` (${path})` : \"\"}`\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // Adapter doesn't recognize the resume id — typically means the\n // session never got past the spawn (no turn happened). Retry\n // without resume so the user at least gets the command back.\n if (\n built.body.resumeSessionId &&\n /not found|Resource not found/i.test(msg)\n ) {\n const { resumeSessionId, ...rest } = built.body\n void resumeSessionId\n const next = await httpPostJson<SessionDescriptor>(\n url,\n rest,\n endpoint.token,\n )\n return `restarted ${prev.id} → ${next.id}${\n next.name ? ` (${next.name})` : \"\"\n } (fresh — resume not available)`\n }\n throw err\n }\n}\n\nfunction renderSidebar(\n rows: SessionDescriptor[],\n cursor: number,\n width: number,\n height: number,\n c: Record<string, string>,\n statusTone: (s: string) => string,\n): string[] {\n const out: string[] = []\n out.push(`${c.bold}SESSIONS${c.reset} ${c.dim}(${rows.length})${c.reset}`)\n out.push(\"\")\n if (rows.length === 0) {\n out.push(`${c.dim} (none — spawn one)${c.reset}`)\n } else {\n const now = Date.now()\n for (let i = 0; i < rows.length && out.length < height; i++) {\n const r = rows[i]!\n const selected = i === cursor\n const marker = selected ? `${c.cyan}▸${c.reset}` : \" \"\n const ptyBadge = r.pty\n ? `${c.green}PTY${c.reset}`\n : `${c.dim} ${c.reset}`\n const label = r.name ?? r.id\n const tone = statusTone(r.status)\n const age = humaniseDelta(now - new Date(r.startedAt).getTime())\n const labelTrunc = truncate(label, 18)\n const line =\n `${marker} ${ptyBadge} ${labelTrunc.padEnd(18)} ${tone}${r.status.padEnd(7)}${c.reset} ${c.dim}${age.padStart(4)}${c.reset}`\n out.push(selected ? line : line)\n }\n }\n while (out.length < height) out.push(\"\")\n void width\n return out.slice(0, height)\n}\n\nfunction renderDetail(\n s: SessionDescriptor | undefined,\n width: number,\n height: number,\n c: Record<string, string>,\n preview: string[] | undefined,\n): string[] {\n const out: string[] = []\n if (!s) {\n out.push(`${c.bold}DETAIL${c.reset}`)\n out.push(\"\")\n out.push(`${c.dim} no session selected${c.reset}`)\n } else {\n const now = Date.now()\n out.push(`${c.bold}DETAIL${c.reset}`)\n out.push(\"\")\n const kw = (k: string): string => `${c.dim}${k.padEnd(10)}${c.reset}`\n out.push(` ${kw(\"id\")} ${s.id}`)\n if (s.name) out.push(` ${kw(\"name\")} ${c.bold}${s.name}${c.reset}`)\n out.push(` ${kw(\"kind\")} ${s.kind}${s.pty ? ` ${c.green}(pty)${c.reset}` : \"\"}`)\n out.push(` ${kw(\"status\")} ${s.status}`)\n out.push(` ${kw(\"workspace\")} ${s.workspaceSlug}`)\n out.push(` ${kw(\"command\")} ${c.dim}${truncate(s.command, width - 14)}${c.reset}`)\n out.push(` ${kw(\"pid\")} ${s.pid ?? \"—\"}`)\n out.push(` ${kw(\"started\")} ${humaniseDelta(now - new Date(s.startedAt).getTime())} ago`)\n if (s.lastOutputAt)\n out.push(\n ` ${kw(\"last out\")} ${humaniseDelta(now - new Date(s.lastOutputAt).getTime())} ago`,\n )\n if (s.exitCode !== undefined)\n out.push(` ${kw(\"exit code\")} ${s.exitCode}`)\n\n // Resume info — captured ids so the user can verify the\n // continuity machinery actually saw what it needed. claudeResumeId\n // is the most-useful one (provider-native resume); ACP id is the\n // fallback. Both displayed when present.\n if (s.adapterSlug) {\n out.push(` ${kw(\"adapter\")} ${s.adapterSlug}`)\n }\n if (s.adapterSessionId) {\n out.push(\n ` ${kw(\"acp id\")} ${c.dim}${truncate(s.adapterSessionId, width - 14)}${c.reset}`,\n )\n }\n if (s.resumeMetadata) {\n for (const [k, v] of Object.entries(s.resumeMetadata)) {\n out.push(\n ` ${kw(shortKey(k))} ${c.green}${truncate(String(v), width - 14)}${c.reset}`,\n )\n }\n }\n\n out.push(\"\")\n if (s.status === \"running\" || s.status === \"starting\") {\n out.push(` ${c.dim}Enter to attach${c.reset}`)\n } else if (\n s.status === \"exited\" ||\n s.status === \"killed\" ||\n s.status === \"error\"\n ) {\n out.push(` ${c.dim}R to restart${c.reset}`)\n }\n\n // Preview: last N lines from the session's ring buffer, fetched\n // by the dashboard in the background. Helps the user see what\n // the session was doing without committing to an attach.\n if (preview && preview.length > 0) {\n out.push(\"\")\n out.push(` ${c.dim}── recent output ──${c.reset}`)\n for (const line of preview) {\n out.push(` ${c.dim}${truncate(line, width - 4)}${c.reset}`)\n }\n }\n }\n while (out.length < height) out.push(\"\")\n return out.slice(0, height)\n}\n\n/** Compact display label for resumeMetadata keys. */\nfunction shortKey(k: string): string {\n // claudeResumeId → \"claude id\", hermesResumeId → \"hermes id\", …\n const m = k.match(/^([a-z]+)ResumeId$/i)\n return m ? `${m[1]!.toLowerCase()} id` : k\n}\n\n/**\n * Reduce a RuntimeEvent to a one-liner for the events strip. Returns\n * null for events we don't want to surface (heartbeat-error spam,\n * etc).\n */\nfunction summariseEvent(ev: Record<string, unknown>): string | null {\n const type = typeof ev.type === \"string\" ? ev.type : \"?\"\n switch (type) {\n case \"boot\":\n return `boot · ${(ev.workspace as string | undefined)?.split(\"/\").pop() ?? \"?\"}`\n case \"remote-log\":\n return `tunnel: ${truncate(String(ev.line ?? \"\"), 60)}`\n case \"session-spawn\":\n return `spawn ${ev.id ?? \"?\"}`\n case \"session-exit\":\n return `exit ${ev.id ?? \"?\"} (${ev.exitCode ?? \"?\"})`\n case \"heartbeat-error\":\n return `heartbeat error ${truncate(String(ev.error ?? \"\"), 40)}`\n default:\n return `${type}`\n }\n}\n\nfunction shortTime(iso: string): string {\n try {\n const d = new Date(iso)\n return `${d.getHours().toString().padStart(2, \"0\")}:${d.getMinutes().toString().padStart(2, \"0\")}:${d.getSeconds().toString().padStart(2, \"0\")}`\n } catch {\n return \"??:??:??\"\n }\n}\n\n/**\n * Build a left/right justified row that NEVER overflows `cols`. When\n * left + right would exceed the width, the right side is dropped\n * first (it's metadata — keep the title). When even the left side\n * is too wide, truncate with `…`. Without this, the row wraps and\n * pushes the rest of the screen down by a line.\n */\nfunction fitRow(left: string, right: string, cols: number): string {\n const leftLen = stripAnsi(left).length\n const rightLen = stripAnsi(right).length\n if (leftLen + 1 + rightLen <= cols) {\n return left + \" \".repeat(cols - leftLen - rightLen) + right\n }\n if (leftLen <= cols) {\n return left + \" \".repeat(Math.max(0, cols - leftLen))\n }\n return truncateAnsi(left, cols)\n}\n\n/**\n * Right-pad a possibly-ANSI-containing string to a target VISIBLE\n * width. Plain `String.prototype.padEnd` counts ANSI escape bytes\n * as visible characters, which pushes the next column right of its\n * intended position by however many bytes of color codes are in the\n * string. This helper counts visible chars only.\n */\nfunction padEndVisible(s: string, width: number): string {\n const visible = stripAnsi(s).length\n if (visible >= width) return s\n return s + \" \".repeat(width - visible)\n}\n\nfunction truncateAnsi(s: string, max: number): string {\n // ANSI escapes are zero-width so truncation should account for them.\n // Simple approach: strip, count visible, slice raw to roughly the\n // same prefix. Good enough for header / footer fixed strings.\n const visible = stripAnsi(s).length\n if (visible <= max) return s\n // Pessimistic: just cut to `max` chars; rare case anyway.\n return s.slice(0, max - 1) + \"…\"\n}\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*m/g, \"\")\n}\n\nfunction httpDelete(url: string, token?: string): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const u = new URL(url)\n const lib = u.protocol === \"https:\" ? https : http\n const headers: Record<string, string> = {}\n if (token) headers.authorization = `Bearer ${token}`\n const req = lib.request(u, { method: \"DELETE\", headers }, res => {\n let raw = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", c => (raw += c))\n res.on(\"end\", () => {\n const status = res.statusCode ?? 0\n if (status < 200 || status >= 300) {\n reject(new Error(`HTTP ${status}: ${raw.slice(0, 200)}`))\n return\n }\n try {\n resolve(raw ? JSON.parse(raw) : {})\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n })\n })\n req.on(\"error\", reject)\n req.end()\n })\n}\n\ninterface AttachOpts {\n endpoint: DaemonEndpoint\n /** id or name. We fetch the descriptor first and switch transport\n * (SSE vs PTY WS) based on `desc.pty`. */\n idOrName: string\n colour: boolean\n}\n\n/**\n * `agentproto sessions mirror <id-or-name>` — read-only tail of a\n * PTY session. Unlike `--attach`, this NEVER takes stdin: Ctrl-C\n * exits the mirror process cleanly without affecting the underlying\n * session. Great for peeking at what an agent or a long-running TUI\n * is doing without committing to a full duplex attach (and the\n * Ctrl-] q detach chord some terminals swallow).\n *\n * For non-PTY sessions, falls back to the existing line-based SSE\n * stream (also already read-only).\n */\n/**\n * `agentproto sessions restart <id-or-name>` — respawn a session\n * from history. Looks up the descriptor (alive or historical),\n * clones its kind/argv/cwd/workspace/name/label, and starts a fresh\n * instance via the matching route (/sessions/terminal for PTY,\n * /sessions/agent for ACP agents).\n *\n * The new session gets a new id but reuses the original `name`\n * (which the daemon freed when the old session became\n * killed/exited). Output buffers are NOT carried over — we only\n * persist descriptor metadata, not byte streams.\n */\nasync function runRestart(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n attach: { type: \"boolean\" },\n json: { type: \"boolean\" },\n \"no-color\": { type: \"boolean\" },\n },\n })\n const id = positionals[0]\n if (!id) {\n process.stderr.write(\n \"agentproto sessions restart: missing session id or name.\\n\" +\n \" Try: agentproto sessions restart claude-tui\\n\",\n )\n return 2\n }\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions restart\")\n return 2\n }\n const endpoint = report.found\n\n // Fetch the (possibly historical) descriptor.\n let prev: SessionDescriptor\n try {\n prev = await httpGetJson<SessionDescriptor>(\n `${endpoint.url}/sessions/${encodeURIComponent(id)}`,\n )\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 404/.test(msg)) {\n process.stderr.write(\n `agentproto sessions restart: no session \"${id}\" found in registry or history.\\n`,\n )\n return 2\n }\n process.stderr.write(`agentproto sessions restart: ${msg}\\n`)\n return 1\n }\n\n // Augment with provider-fs-derived resume id when our own capture\n // missed it (e.g., the session was killed before printing the\n // resume hint), then build the body.\n prev = await augmentWithFsResume(prev)\n let built: RestartBody\n try {\n built = buildRestartBody(prev)\n } catch (err) {\n process.stderr.write(\n `agentproto sessions restart: ${err instanceof Error ? err.message : String(err)}\\n`,\n )\n return 2\n }\n const body = built.body\n const url =\n built.url === \"__pty__\"\n ? `${endpoint.url}/sessions/terminal`\n : `${endpoint.url}/sessions/agent`\n\n let next: SessionDescriptor\n let resumeFallback = false\n try {\n next = await httpPostJson<SessionDescriptor>(url, body, endpoint.token)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 401/.test(msg)) {\n process.stderr.write(\n (await explain401(endpoint, \"agentproto sessions restart\")) + \"\\n\",\n )\n return 1\n }\n // Adapter doesn't know the resume id — retry without it.\n if (body.resumeSessionId && /not found|Resource not found/i.test(msg)) {\n try {\n const { resumeSessionId: _, ...rest } = body\n void _\n next = await httpPostJson<SessionDescriptor>(\n url,\n rest,\n endpoint.token,\n )\n resumeFallback = true\n } catch (err2) {\n process.stderr.write(\n `agentproto sessions restart: ${err2 instanceof Error ? err2.message : String(err2)}\\n`,\n )\n return 1\n }\n } else {\n process.stderr.write(`agentproto sessions restart: ${msg}\\n`)\n return 1\n }\n }\n\n if (values.json) {\n process.stdout.write(JSON.stringify(next, null, 2) + \"\\n\")\n } else {\n const lineage = resumeFallback\n ? \"fresh — resume not available\"\n : describeResumePath(prev) || \"fresh shape\"\n process.stdout.write(\n `agentproto sessions restart: spawned ${next.id}` +\n `${next.name ? ` (${next.name})` : \"\"} — ${next.command}\\n` +\n ` (${lineage} from ${prev.id})\\n`,\n )\n }\n\n if (values.attach) {\n return runAttach({\n endpoint,\n idOrName: next.id,\n colour: !values[\"no-color\"],\n })\n }\n return 0\n}\n\n/**\n * Shell-style argv tokenizer for legacy descriptors that don't carry\n * `argv` separately. Same rules as the spawn-dialog tokenizer in the\n * web app: whitespace splits, single + double quotes group.\n */\nfunction tokenizeCommand(s: string): string[] {\n const out: string[] = []\n let buf = \"\"\n let inSingle = false\n let inDouble = false\n for (let i = 0; i < s.length; i++) {\n const ch = s[i]\n if (ch === \"'\" && !inDouble) {\n inSingle = !inSingle\n continue\n }\n if (ch === '\"' && !inSingle) {\n inDouble = !inDouble\n continue\n }\n if (!inSingle && !inDouble && /\\s/.test(ch ?? \"\")) {\n if (buf) {\n out.push(buf)\n buf = \"\"\n }\n continue\n }\n buf += ch\n }\n if (buf) out.push(buf)\n return out\n}\n\nasync function runMirror(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: { \"no-color\": { type: \"boolean\" } },\n })\n const id = positionals[0]\n if (!id) {\n process.stderr.write(\n \"agentproto sessions mirror: missing session id or name.\\n\" +\n \" Try: agentproto sessions mirror claude-tui\\n\",\n )\n return 2\n }\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions mirror\")\n return 2\n }\n const endpoint = report.found\n let desc: SessionDescriptor\n try {\n desc = await httpGetJson<SessionDescriptor>(\n `${endpoint.url}/sessions/${encodeURIComponent(id)}`,\n )\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 404/.test(msg)) {\n process.stderr.write(\n `agentproto sessions mirror: no session \"${id}\".\\n`,\n )\n return 2\n }\n process.stderr.write(`agentproto sessions mirror: ${msg}\\n`)\n return 1\n }\n // Pre-attach status check — the underlying PTY process is gone for\n // exited/killed/error sessions; the WS upgrade would only return a\n // confusing close 1011 mid-stream. Tell the user what happened and\n // point at restart.\n if (\n desc.pty === true &&\n (desc.status === \"exited\" ||\n desc.status === \"killed\" ||\n desc.status === \"error\")\n ) {\n printDeadSessionHint(\"agentproto sessions mirror\", desc)\n return 2\n }\n if (desc.pty === true) {\n return runPtyMirror(endpoint, desc)\n }\n // SSE stream is already read-only — same shape as --attach for\n // non-PTY sessions. Reuse it directly so `mirror` is symmetric.\n return runSseAttach(endpoint, desc, !values[\"no-color\"])\n}\n\n/**\n * Read-only WS attach to a PTY session. Bytes flow ONLY from daemon\n * → stdout. stdin stays in the user's normal shell state — Ctrl-C\n * triggers SIGINT to this Node process, which exits cleanly without\n * touching the underlying PTY (the daemon-side handle.detach() runs\n * on WS close, leaving the session alive for other attachers).\n */\nasync function runPtyMirror(\n endpoint: DaemonEndpoint,\n desc: SessionDescriptor,\n): Promise<number> {\n return new Promise(done => {\n const initialCols = process.stdout.columns ?? 80\n const initialRows = process.stdout.rows ?? 24\n const wsUrl = `${endpoint.url.replace(/^http/, \"ws\")}/sessions/${desc.id}/pty?cols=${initialCols}&rows=${initialRows}`\n const ws = new WebSocket(wsUrl, {\n headers: endpoint.token\n ? { authorization: `Bearer ${endpoint.token}` }\n : {},\n })\n\n process.stderr.write(\n `\\x1b[2m─ mirroring ${desc.id}${desc.name ? ` (${desc.name})` : \"\"} · read-only · Ctrl-C to exit ·\\x1b[0m\\n`,\n )\n\n let closed = false\n const close = (code: number): void => {\n if (closed) return\n closed = true\n try {\n ws.close(1000, \"client mirror end\")\n } catch {\n // ignore\n }\n done(code)\n }\n\n ws.on(\"message\", raw => {\n let frame: unknown\n try {\n frame = JSON.parse(raw.toString(\"utf8\"))\n } catch {\n return\n }\n if (!frame || typeof frame !== \"object\") return\n const f = frame as Record<string, unknown>\n if (f.kind === \"data\" && typeof f.b64 === \"string\") {\n try {\n process.stdout.write(Buffer.from(f.b64, \"base64\"))\n } catch {\n /* ignore */\n }\n } else if (f.kind === \"exit\") {\n const code = typeof f.exitCode === \"number\" ? f.exitCode : 0\n process.stderr.write(\n `\\n\\x1b[2m─ session ${desc.id} exited (code ${code}) ·\\x1b[0m\\n`,\n )\n close(code)\n }\n })\n ws.on(\"error\", err => {\n process.stderr.write(`agentproto sessions mirror: ${err.message}\\n`)\n close(1)\n })\n ws.on(\"close\", () => close(0))\n process.on(\"SIGINT\", () => {\n process.stderr.write(\n `\\n\\x1b[2m─ mirror ended · session still running on daemon ·\\x1b[0m\\n`,\n )\n close(0)\n })\n })\n}\n\nasync function runAttach(opts: AttachOpts): Promise<number> {\n // Fetch the descriptor first. The daemon's GET handler resolves\n // id-or-name (see findByIdOrName in sessions.ts), so a typo\n // surfaces as a clean 404 here rather than mid-stream silence.\n let desc: SessionDescriptor\n try {\n desc = await httpGetJson<SessionDescriptor>(\n `${opts.endpoint.url}/sessions/${encodeURIComponent(opts.idOrName)}`,\n )\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 404/.test(msg)) {\n process.stderr.write(\n `agentproto sessions --attach: no session \"${opts.idOrName}\".\\n`,\n )\n return 2\n }\n process.stderr.write(`agentproto sessions --attach: ${msg}\\n`)\n return 1\n }\n if (\n desc.status === \"exited\" ||\n desc.status === \"killed\" ||\n desc.status === \"error\"\n ) {\n printDeadSessionHint(\"agentproto sessions --attach\", desc)\n return 2\n }\n if (desc.pty === true) {\n return runPtyAttach(opts.endpoint, desc, opts.colour)\n }\n return runSseAttach(opts.endpoint, desc, opts.colour)\n}\n\n/**\n * Pretty error for attach attempts against a dead session. Surfaces\n * the status + age + the exact restart command. Saves the user from\n * the cryptic \"close 1011 — session not attachable\" they'd otherwise\n * see when the WS upgrade fails mid-flight.\n */\nfunction printDeadSessionHint(\n verb: string,\n desc: SessionDescriptor,\n): void {\n const handle = desc.name ?? desc.id\n const exitInfo =\n typeof desc.exitCode === \"number\" ? ` exit ${desc.exitCode}` : \"\"\n const age = desc.endedAt\n ? humaniseDelta(Date.now() - new Date(desc.endedAt).getTime()) + \" ago\"\n : \"previously\"\n process.stderr.write(\n `${verb}: session ${desc.id}${desc.name ? ` (${desc.name})` : \"\"} ` +\n `is \\x1b[31m${desc.status}\\x1b[0m (${age}${exitInfo}).\\n` +\n ` Spawn a fresh instance with the same shape:\\n` +\n ` agentproto sessions restart ${handle}\\n` +\n ` Or look at its descriptor only:\\n` +\n ` agentproto sessions # see all\\n`,\n )\n}\n\nasync function runSseAttach(\n endpoint: DaemonEndpoint,\n desc: SessionDescriptor,\n colour: boolean,\n): Promise<number> {\n return new Promise(done => {\n const url = new URL(`${endpoint.url}/sessions/${desc.id}/stream`)\n const lib = url.protocol === \"https:\" ? https : http\n const headers: Record<string, string> = { accept: \"text/event-stream\" }\n if (endpoint.token) headers.authorization = `Bearer ${endpoint.token}`\n process.stderr.write(\n `\\x1b[2m─ attached to ${desc.id}${desc.name ? ` (${desc.name})` : \"\"} · Ctrl-C to detach ·\\x1b[0m\\n`,\n )\n const req = lib.get(url, { headers }, res => {\n if (res.statusCode === 404) {\n process.stderr.write(\n `agentproto sessions --attach: no session \"${desc.id}\".\\n`,\n )\n done(2)\n return\n }\n if (res.statusCode !== 200) {\n process.stderr.write(\n `agentproto sessions --attach: HTTP ${res.statusCode}\\n`,\n )\n done(1)\n return\n }\n let buf = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", chunk => {\n buf += chunk\n let idx = buf.indexOf(\"\\n\\n\")\n while (idx !== -1) {\n const event = buf.slice(0, idx)\n buf = buf.slice(idx + 2)\n for (const line of event.split(\"\\n\")) {\n if (line.startsWith(\"data:\")) {\n const payload = line.slice(5).trim()\n try {\n const json = JSON.parse(payload) as {\n line?: string\n stream?: \"stdout\" | \"stderr\"\n }\n if (typeof json.line !== \"string\") continue\n if (colour && json.stream === \"stderr\") {\n process.stdout.write(`\\x1b[31m${json.line}\\x1b[0m\\n`)\n } else {\n process.stdout.write(json.line + \"\\n\")\n }\n } catch {\n // Ignore ill-formed frames silently — daemon may have\n // sent a comment / heartbeat the parser doesn't model.\n }\n }\n }\n idx = buf.indexOf(\"\\n\\n\")\n }\n })\n res.on(\"end\", () => done(0))\n })\n req.on(\"error\", err => {\n process.stderr.write(`agentproto sessions --attach: ${err.message}\\n`)\n done(1)\n })\n process.on(\"SIGINT\", () => {\n req.destroy()\n done(0)\n })\n })\n}\n\n/**\n * PTY attach via the daemon's `/sessions/:id/pty` WebSocket. Sets the\n * caller's stdin to raw mode so every keystroke flows to the child\n * verbatim (including Ctrl-C → SIGINT in the PTY). Detach chord:\n * Ctrl-] q close the WS, restore terminal modes, exit code 0\n * Without the chord the session stays alive on the daemon when the\n * process exits / closes. Resize is bridged via SIGWINCH.\n */\nasync function runPtyAttach(\n endpoint: DaemonEndpoint,\n desc: SessionDescriptor,\n _colour: boolean,\n): Promise<number> {\n return new Promise(done => {\n const stdoutTty = process.stdout.isTTY === true\n const stdinTty = process.stdin.isTTY === true\n const initialCols =\n stdoutTty && process.stdout.columns ? process.stdout.columns : 80\n const initialRows =\n stdoutTty && process.stdout.rows ? process.stdout.rows : 24\n const wsUrl = `${endpoint.url.replace(/^http/, \"ws\")}/sessions/${desc.id}/pty?cols=${initialCols}&rows=${initialRows}`\n\n // Reconnect policy. close 1006 (\"abnormal closure\" — the daemon\n // process vanished mid-WS) triggers up to 5 retries with\n // 1s/2s/4s/4s/4s backoff. close 1000 (clean), 4xxx (app-level),\n // and 410/etc on initial handshake all exit immediately. The user\n // gets \"── reconnecting (n/5)…\" while we try; on success the\n // daemon replays its ring buffer so they see what they missed.\n const RECONNECT_DELAYS_MS = [1_000, 2_000, 4_000, 4_000, 4_000]\n let attempt = 0\n // The active WebSocket — re-pointed on each reconnect so the\n // stdin handler (registered once below) always sends to the\n // current connection.\n let ws: WebSocket = new WebSocket(wsUrl, {\n headers: endpoint.token\n ? { authorization: `Bearer ${endpoint.token}` }\n : {},\n })\n\n let armed = false\n // Triple-Ctrl-C detach: AZERTY-friendly alternative to Ctrl-] q\n // that doesn't conflict with Claude's own \"press Ctrl-C again to\n // exit\" UX. Claude exits on the 2nd Ctrl-C → child gone → WS\n // closes naturally. For non-Claude TUIs (bash, vim, htop, …)\n // three Ctrl-Cs in 1s is a deliberate signal we use to detach\n // without taking the child down; the extras forwarded to the\n // child are no-ops in those shells.\n const TRIPLE_CTRLC_WINDOW_MS = 1_000\n const ctrlCTimestamps: number[] = []\n let exitCode = 0\n let restored = false\n const restore = (): void => {\n if (restored) return\n restored = true\n if (stdinTty) {\n try {\n process.stdin.setRawMode(false)\n } catch {\n // ignore\n }\n process.stdin.pause()\n }\n process.stdin.off(\"data\", onStdin)\n process.stdout.off(\"resize\", onResize)\n process.off(\"SIGWINCH\", onResize)\n }\n\n const onStdin = (raw: Buffer | string): void => {\n if (ws.readyState !== WebSocket.OPEN) return\n // stdin's encoding mode may have been left in \"utf8\" by a prior\n // helper (printPickerTable, runWatch, …). Coerce to Buffer at\n // the boundary so byte-comparisons in the detach-chord scan are\n // reliable AND multi-byte chars survive base64 round-trip\n // (sending each byte as its own frame would split a 2-byte é).\n const chunk = typeof raw === \"string\" ? Buffer.from(raw, \"utf8\") : raw\n\n // Triple-Ctrl-C detach. Track the last few Ctrl-C timestamps;\n // when three of them fall inside TRIPLE_CTRLC_WINDOW_MS we\n // detach. Each individual Ctrl-C is ALSO forwarded to the\n // child so the user's normal interrupt UX is preserved —\n // Claude's \"press Ctrl-C again to exit\" still works (it\n // happens on the 2nd press; the 3rd never fires because the\n // child is already gone, no detach is triggered there).\n if (chunk.length === 1 && chunk[0] === 0x03) {\n const now = Date.now()\n ctrlCTimestamps.push(now)\n // Keep only timestamps inside the window.\n while (\n ctrlCTimestamps.length > 0 &&\n now - ctrlCTimestamps[0]! > TRIPLE_CTRLC_WINDOW_MS\n ) {\n ctrlCTimestamps.shift()\n }\n if (ctrlCTimestamps.length >= 3) {\n ctrlCTimestamps.length = 0\n try {\n ws.close(1000, \"client detach (triple-ctrlc)\")\n } catch {\n // ignore\n }\n return\n }\n // Fall through to forward this Ctrl-C to the child.\n }\n\n // Detach chord scan: Ctrl-] (0x1d) then q/Q. Either part of the\n // chord may straddle two stdin chunks, so we keep `armed` across\n // invocations.\n let scan = chunk\n if (armed) {\n // Previous chunk ended with 0x1d. If THIS chunk starts with\n // q/Q, detach; otherwise emit the held 0x1d and the new bytes.\n const first = scan[0]\n if (first === 0x71 || first === 0x51) {\n armed = false\n try {\n ws.close(1000, \"client detach\")\n } catch {\n // ignore\n }\n return\n }\n // Not the chord — flush the held 0x1d as a leading byte by\n // prepending it before further processing.\n scan = Buffer.concat([Buffer.from([0x1d]), scan])\n armed = false\n }\n\n // Look for an in-chunk 0x1d. If found at the LAST position, hold\n // it for the next stdin event (it might pair with q/Q). If found\n // mid-chunk, check the very next byte — q/Q → detach, else let\n // both through.\n const idx = scan.indexOf(0x1d)\n if (idx === -1) {\n ws.send(JSON.stringify({ kind: \"input\", b64: scan.toString(\"base64\") }))\n return\n }\n if (idx === scan.length - 1) {\n // Trailing 0x1d — defer.\n armed = true\n const head = scan.subarray(0, idx)\n if (head.length > 0) {\n ws.send(JSON.stringify({ kind: \"input\", b64: head.toString(\"base64\") }))\n }\n return\n }\n const next = scan[idx + 1]\n if (next === 0x71 || next === 0x51) {\n // Detach mid-chunk. Send the head (bytes before 0x1d), drop\n // both chord bytes, then close. Anything after the chord is\n // discarded — typing past the detach chord is a user error.\n const head = scan.subarray(0, idx)\n if (head.length > 0) {\n ws.send(JSON.stringify({ kind: \"input\", b64: head.toString(\"base64\") }))\n }\n try {\n ws.close(1000, \"client detach\")\n } catch {\n // ignore\n }\n return\n }\n // 0x1d followed by something other than q/Q — emit the whole\n // chunk as-is (the 0x1d may legitimately be Ctrl-] -> some app\n // command, e.g. less's prefix). The remote pty figures it out.\n ws.send(JSON.stringify({ kind: \"input\", b64: scan.toString(\"base64\") }))\n }\n\n const onResize = (): void => {\n if (ws.readyState !== WebSocket.OPEN) return\n const cols =\n stdoutTty && process.stdout.columns ? process.stdout.columns : 80\n const rows = stdoutTty && process.stdout.rows ? process.stdout.rows : 24\n ws.send(JSON.stringify({ kind: \"resize\", cols, rows }))\n }\n\n let inputWired = false\n let sessionExited = false\n\n const wireWs = (sock: WebSocket): void => {\n sock.on(\"open\", () => {\n if (attempt === 0) {\n process.stderr.write(\n `\\x1b[2m─\\x1b[0m attached to \\x1b[1m${desc.id}${desc.name ? ` (${desc.name})` : \"\"}\\x1b[0m · ` +\n `\\x1b[7m triple Ctrl-C \\x1b[0m or \\x1b[7m Ctrl-] then q \\x1b[0m to detach · ` +\n `Ctrl-C reaches the child (works with Claude's exit)\\n`,\n )\n } else {\n process.stderr.write(\n `\\x1b[32m─ reconnected to ${desc.id} (attempt ${attempt + 1})\\x1b[0m\\n`,\n )\n }\n attempt = 0\n if (!inputWired) {\n if (stdinTty) {\n try {\n process.stdin.setRawMode(true)\n } catch {\n // ignore\n }\n process.stdin.resume()\n }\n process.stdin.on(\"data\", onStdin)\n process.stdout.on(\"resize\", onResize)\n process.on(\"SIGWINCH\", onResize)\n inputWired = true\n }\n onResize()\n })\n\n sock.on(\"message\", raw => {\n let frame: unknown\n try {\n frame = JSON.parse(raw.toString(\"utf8\"))\n } catch {\n return\n }\n if (!frame || typeof frame !== \"object\") return\n const f = frame as Record<string, unknown>\n switch (f.kind) {\n case \"data\": {\n if (typeof f.b64 === \"string\") {\n try {\n process.stdout.write(Buffer.from(f.b64, \"base64\"))\n } catch {\n // ignore\n }\n }\n break\n }\n case \"exit\": {\n const code = typeof f.exitCode === \"number\" ? f.exitCode : 0\n process.stderr.write(\n `\\n\\x1b[2m─ session ${desc.id} exited (code ${code}) ·\\x1b[0m\\n`,\n )\n exitCode = code\n sessionExited = true\n break\n }\n // pong / unknown — ignore\n }\n })\n\n sock.on(\"close\", (code: number, reason: Buffer) => {\n // 1000 = clean: either we initiated (detach) or daemon shut\n // us down cleanly. Either way we're done.\n // 1006 = abnormal: daemon process vanished without a close\n // frame. Worth retrying — they may be coming back up.\n // 4xxx / 410 / 401 / etc. = app-level rejection (session\n // exited, auth, etc.) — surfaced before WS upgrade. Done.\n if (sessionExited || code === 1000) {\n restore()\n done(exitCode)\n return\n }\n if (code === 1006 && attempt < RECONNECT_DELAYS_MS.length) {\n const delay = RECONNECT_DELAYS_MS[attempt] ?? 4_000\n attempt++\n process.stderr.write(\n `\\x1b[33m─ disconnected (close ${code}) · reconnecting in ${Math.round(delay / 1000)}s (${attempt}/${RECONNECT_DELAYS_MS.length})…\\x1b[0m\\n`,\n )\n setTimeout(() => {\n ws = new WebSocket(wsUrl, {\n headers: endpoint.token\n ? { authorization: `Bearer ${endpoint.token}` }\n : {},\n })\n wireWs(ws)\n }, delay)\n return\n }\n // Out of retries or unknown close — surface clearly.\n const reasonText = reason && reason.length > 0 ? ` — ${reason.toString(\"utf8\")}` : \"\"\n process.stderr.write(\n `\\n\\x1b[31m─ disconnected (close ${code}${reasonText})\\x1b[0m\\n` +\n ` daemon may be down. Restart it (\\`agentproto serve\\`) then re-attach:\\n` +\n ` agentproto sessions --attach ${desc.name ?? desc.id}\\n`,\n )\n restore()\n done(1)\n })\n\n sock.on(\"error\", () => {\n // Don't write a noisy error line — 'close' will fire next\n // with the actual reason. WS errors during reconnect attempts\n // are expected and we don't want to spam the terminal.\n })\n }\n\n wireWs(ws)\n\n process.on(\"SIGINT\", () => {\n // In PTY mode, Ctrl-C SHOULD go to the child. The terminal\n // emulator forwards \\x03 directly through stdin. SIGINT here\n // only fires when stdin isn't a TTY — in which case we detach.\n try {\n ws.close(1000, \"sigint\")\n } catch {\n // ignore\n }\n })\n })\n}\n\n/**\n * Probe `<base>/health` to determine whether the daemon at this URL\n * is reachable. Used to disambiguate \"no daemon listening\" vs\n * \"daemon listening but rejected my token\" when a mutating call\n * 401s. Times out after 500ms so a hung process doesn't stall the\n * CLI error path.\n */\nasync function probeDaemonHealth(baseUrl: string): Promise<boolean> {\n return new Promise<boolean>(resolve => {\n try {\n const u = new URL(`${baseUrl}/health`)\n const lib = u.protocol === \"https:\" ? https : http\n const req = lib.get(u, { timeout: 500 }, res => {\n resolve((res.statusCode ?? 0) >= 200 && (res.statusCode ?? 0) < 300)\n res.resume()\n })\n req.on(\"error\", () => resolve(false))\n req.on(\"timeout\", () => {\n req.destroy()\n resolve(false)\n })\n } catch {\n resolve(false)\n }\n })\n}\n\n/**\n * Build a clear error message for a sessions_unauthorized response.\n * The 401 from the daemon is almost always one of three things:\n * 1. The token in this runtime.json is stale (daemon restarted).\n * 2. The CLI's Origin doesn't match the daemon's allowlist\n * (irrelevant from CLI — there's no Origin header — but kept\n * in the daemon side for browser callers).\n * 3. AGENTPROTO_DAEMON_TOKEN env var is set to a wrong value.\n *\n * We do NOT have the daemon's true token, so we can't auto-recover.\n * Instead we tell the user exactly which file the token came from\n * + how to get the right one.\n */\nasync function explain401(\n endpoint: DaemonEndpoint,\n verb: string,\n): Promise<string> {\n const alive = await probeDaemonHealth(endpoint.url)\n const lines: string[] = [\n `${verb}: 401 sessions_unauthorized from ${endpoint.url}`,\n ]\n if (!alive) {\n lines.push(\n ` the daemon at ${endpoint.url} is NOT reachable (no /health response).`,\n ` the runtime.json may point at a stopped port — try \\`agentproto serve\\`.`,\n )\n return lines.join(\"\\n\")\n }\n // Daemon is alive — definitely a token mismatch.\n if (process.env.AGENTPROTO_DAEMON_TOKEN) {\n lines.push(\n ` daemon /health is reachable. AGENTPROTO_DAEMON_TOKEN is set in your env —`,\n ` it may be from a previous daemon boot. Clear it: \\`unset AGENTPROTO_DAEMON_TOKEN\\`,`,\n ` or set it to the live token: \\`export AGENTPROTO_DAEMON_TOKEN=$(jq -r .token <runtime.json>)\\`.`,\n )\n } else if (endpoint.sourcePath) {\n lines.push(\n ` daemon /health is reachable — token mismatch is the cause.`,\n ` this CLI used the token from:`,\n ` ${endpoint.sourcePath}`,\n ` if you have multiple daemons or restarted the daemon since this file was written,`,\n ` that file's token is stale. Restart the live daemon (\\`agentproto serve\\`) which`,\n ` rewrites its own runtime.json, then re-run.`,\n )\n } else {\n lines.push(\n ` daemon /health is reachable — token mismatch is the cause.`,\n ` unable to identify which file the token came from (env override?).`,\n )\n }\n return lines.join(\"\\n\")\n}\n\nfunction httpPostJson<T>(\n url: string,\n body: unknown,\n token?: string,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const u = new URL(url)\n const payload = Buffer.from(JSON.stringify(body), \"utf8\")\n const lib = u.protocol === \"https:\" ? https : http\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n \"content-length\": payload.byteLength.toString(),\n }\n if (token) headers.authorization = `Bearer ${token}`\n const req = lib.request(\n u,\n { method: \"POST\", headers },\n res => {\n let raw = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", c => (raw += c))\n res.on(\"end\", () => {\n const status = res.statusCode ?? 0\n if (status < 200 || status >= 300) {\n reject(new Error(`HTTP ${status}: ${raw.slice(0, 200)}`))\n return\n }\n try {\n resolve(JSON.parse(raw) as T)\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n })\n }\n )\n req.on(\"error\", reject)\n req.write(payload)\n req.end()\n })\n}\n\nasync function httpGetJson<T = unknown>(url: string): Promise<T> {\n return (await httpGetJsonImpl(url)) as T\n}\n\nfunction httpGetJsonImpl(url: string): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const u = new URL(url)\n const lib = u.protocol === \"https:\" ? https : http\n lib\n .get(u, res => {\n let body = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", c => (body += c))\n res.on(\"end\", () => {\n if ((res.statusCode ?? 0) < 200 || (res.statusCode ?? 0) >= 300) {\n reject(new Error(`HTTP ${res.statusCode}: ${body.slice(0, 200)}`))\n return\n }\n try {\n resolve(JSON.parse(body))\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n })\n })\n .on(\"error\", reject)\n })\n}\n","#!/usr/bin/env node\n/**\n * `agentproto` — the binary entry. Three verbs:\n *\n * agentproto install <slug> install an adapter's underlying CLI\n * agentproto run <slug> [--cwd <dir>] spawn the adapter and stream a turn\n * agentproto serve --connect <url> daemon — relay spawns over WS\n *\n * Adapter slugs resolve through the registry (see ./registry/resolve.ts).\n * Out of the box we ship `claude-code`, `hermes` etc. via npm-installed\n * `@agentproto/adapter-<slug>` packages.\n *\n * argv handling: we identify the verb manually (first non-flag token)\n * and hand the rest verbatim to the verb's parser. Going through one\n * top-level parseArgs would either need to know every flag of every\n * verb up front (lossy) or use `strict: false` (which then eats verb\n * flags as positionals — see commit history for the bug this caused).\n */\n\nimport { runAuth } from \"./commands/auth.js\"\nimport { runConfig } from \"./commands/config.js\"\nimport { runInstall } from \"./commands/install.js\"\nimport { runSetupCommand } from \"./commands/setup.js\"\nimport { runRun } from \"./commands/run.js\"\nimport { runServe } from \"./commands/serve.js\"\nimport { runWorkspace } from \"./commands/workspace.js\"\nimport { runSessions } from \"./commands/sessions.js\"\n\nconst USAGE = `agentproto — AIP-45 agent CLI host\n\nUsage:\n agentproto auth <login|status|logout> [--host <url>] [--label <name>]\n agentproto config <show|path|get|set|unset|edit> [args]\n agentproto daemon <install|uninstall|start|stop|status|logs> [args]\n agentproto install <slug> [--force] [--dry-run] [--skip-setup]\n agentproto setup <slug> [--force] [--dry-run] [--only <stepId>...]\n agentproto run <slug> [--cwd <dir>] [--prompt <text>] [--resume <session-id>]\n agentproto serve [--workspace <dir>] [--port <n>] [--bind <ip>]\n [--connect <url> [--token <jwt>] [--label <name>]]\n [--allow-origin <url> …] [--interactive | -i]\n agentproto workspace <add|list|remove|use> [args]\n agentproto sessions [--watch] [--attach <id-or-name>] [--json]\n agentproto sessions start <adapter> [--cwd <dir>] [--workspace <slug>]\n [--prompt <text>] [--label <text>] [--attach]\n agentproto sessions terminal -- <argv...> [--cwd <dir>] [--workspace <slug>]\n [--name <slug>] [--label <text>]\n [--cols <n>] [--rows <n>] [--attach]\n agentproto sessions mirror <id-or-name> read-only tail (Ctrl-C to exit)\n agentproto sessions stop <id-or-name>\n agentproto --help\n agentproto --version\n\nExamples:\n agentproto auth login --host wss://guilde.work # device flow → ~/.agentproto/credentials.json\n agentproto install claude-code\n agentproto setup openclaw # re-run setup (idempotent via skip_if + ledger)\n agentproto run claude-code --cwd . --prompt \"summarise this repo\"\n agentproto workspace add ~/code/my-project --slug my-project\n agentproto workspace list\n agentproto serve --connect wss://guilde.work/api/v1/agentproto/tunnel\n agentproto sessions start claude-code --workspace agentik-studio --attach\n agentproto sessions terminal --name claude-tui --attach -- claude\n agentproto sessions stop claude-tui\n agentproto config set daemon.port 18791\n agentproto config set daemon.allowedOrigins https://guilde.work\n agentproto daemon install # write launchd plist + start (macOS)\n agentproto daemon status # plist? loaded? /health probe?\n`\n\nconst VERBS = new Set([\n \"auth\",\n \"config\",\n \"daemon\",\n \"install\",\n \"setup\",\n \"run\",\n \"serve\",\n \"workspace\",\n \"sessions\",\n])\n\nasync function main(argv: readonly string[]): Promise<number> {\n // Find the verb — first token that matches a known verb. Anything\n // before it is a top-level flag (--help/--version); anything after\n // is forwarded to the verb's own parser.\n const verbIdx = argv.findIndex((a) => VERBS.has(a))\n\n if (verbIdx === -1) {\n if (argv.includes(\"--version\") || argv.includes(\"-v\")) {\n process.stdout.write(\"agentproto 0.1.0-alpha\\n\")\n return 0\n }\n if (argv.includes(\"--help\") || argv.includes(\"-h\") || argv.length === 0) {\n process.stdout.write(USAGE)\n return 0\n }\n process.stderr.write(\n `agentproto: unrecognised argument(s): ${argv.join(\" \")}\\n\\n${USAGE}`\n )\n return 2\n }\n\n const verb = argv[verbIdx]\n const rest = argv.slice(verbIdx + 1)\n\n switch (verb) {\n case \"auth\":\n return runAuth(rest)\n case \"config\":\n return runConfig(rest)\n case \"daemon\": {\n // Lazy-import the daemon command — its launchctl/systemd\n // shims pull in platform-specific code (plist templating,\n // shell-out helpers) we don't need until the verb fires.\n const { runDaemon } = await import(\"./commands/daemon.js\")\n return runDaemon(rest)\n }\n case \"install\":\n return runInstall(rest)\n case \"setup\":\n return runSetupCommand(rest)\n case \"run\":\n return runRun(rest)\n case \"serve\":\n return runServe(rest)\n case \"workspace\":\n return runWorkspace(rest)\n case \"sessions\":\n return runSessions(rest)\n default:\n // Unreachable — VERBS membership checked above.\n process.stderr.write(`agentproto: unknown verb '${verb}'\\n\\n${USAGE}`)\n return 2\n }\n}\n\nmain(process.argv.slice(2)).then(\n (code) => {\n process.exitCode = code\n },\n (err: unknown) => {\n const msg = err instanceof Error ? err.stack ?? err.message : String(err)\n process.stderr.write(`agentproto: ${msg}\\n`)\n process.exitCode = 1\n }\n)\n"]}
1
+ {"version":3,"sources":["../../runtime/src/config.ts","../src/commands/daemon.ts","../src/util/credentials.ts","../src/commands/auth.ts","../src/commands/config.ts","../src/registry/resolve.ts","../src/commands/setup.ts","../src/commands/install-profile.ts","../src/commands/install.ts","../src/registry/manifest.ts","../src/registry/runtime.ts","../src/registry/manifest-loader.ts","../src/commands/plugins.ts","../src/util/stdin.ts","../src/commands/run.ts","../../agent-runtime/src/runtime.ts","../../agent-runtime/src/manifest.ts","../../agent-runtime/src/adapters/telemetry.ts","../../agent-runtime/src/adapters/substrate-file.ts","../../agent-runtime/src/util/mention-parser.mjs","../../agent-runtime/src/adapters/dispatcher-mention.ts","../../agent-runtime/src/adapters/state-fs.ts","../../agent-runtime/src/adapters/participant-agent-cli.ts","../src/registry/builtins.ts","../src/registry/plugins.ts","../src/commands/run-swarm.ts","../src/util/pty-factory.ts","../src/commands/serve.ts","../../runtime/src/workspaces-config.ts","../../define-doctype/src/index.ts","../../manifest/src/index.ts","../../extension/src/schema.ts","../../extension/src/define-extension.ts","../../extension/src/manifest/index.ts","../../extension/src/spec-from-extension.ts","../../mcp-server/src/index.ts","../../runtime/src/agentproto-dir.ts","../../runtime/src/command-tools.ts","../../runtime/src/conversations.ts","../../runtime/src/events.ts","../../runtime/src/fs-tools.ts","../../runtime/src/mcp-discovery.ts","../../runtime/src/mcp-imports.ts","../../runtime/src/session-tools.ts","../../runtime/src/heartbeat.ts","../../runtime/src/http-server.ts","../../runtime/src/resume-strategies.ts","../../runtime/src/sessions.ts","../../runtime/src/mcp-proxy.ts","../../runtime/src/remote-providers/quick.ts","../../runtime/src/remote-controller.ts","../../runtime/src/remote-tools.ts","../../runtime/src/workspace-fs.ts","../../runtime/src/index.ts","../src/commands/workspace.ts","../src/commands/sessions.ts","../src/cli.ts"],"names":["fs","dirname","join","homedir","USAGE","osPlatform","runInstall","runUninstall","runStart","runStop","parseArgs","resolve","spawn","text","resolvePath","stat","platform","input","output","readFile","mkdir","writeFile","chmod","ledgerPathFor","loadLedger","saveLedger","createHash","runShow","loadConfig","spawnInherit","saveConfig","z","matter","ensureDir","isNotFound","configPath","sleep","executors","isAbsolute","rm","readdir","unlink","existsSync","normalize","relative","WORKSPACES_CONFIG_VERSION","DEFAULT_CONFIG_DIR","DEFAULT_CONFIG_PATH","sanitizeSlug","loadWorkspacesConfig","normalizeConfig","findWorkspace","getActiveWorkspace","server","id","EventEmitter","rt","nowIso","randomBytes","sha256","fsReadFile","fsWriteFile","randomUUID","http","userInfo","hostname","createAgentCliRuntime","paths","WebSocket","headers","runList","basename","RESUME_STRATEGIES","probeMtimeLatestJsonl","list","config","isPidAlive","truncate","preview","runDaemon"],"mappings":"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","file":"cli.mjs","sourcesContent":["/**\n * `~/.agentproto/config.json` — single hand-editable JSON for the\n * agentproto control plane's defaults. Sits alongside the existing\n * surface files (workspaces.json, credentials.json, sessions.json):\n *\n * workspaces.json which directories are workspaces + which is active\n * credentials.json tunnel host bearer tokens (mode 0600)\n * sessions.json last-known snapshot of the registry (informational)\n * config.json daemon defaults: port, bind, allowed origins,\n * tunnel host, feature toggles\n *\n * Resolution order for every daemon knob is:\n * 1. CLI flag (e.g. --port)\n * 2. Env var (where one exists, e.g. AGENTPROTO_TOKEN)\n * 3. config.json\n * 4. Hardcoded default\n *\n * This means a user can call `agentproto config set daemon.port 18791`\n * once and never re-pass `--port 18791` to `serve install` etc. CLI\n * flags still win for one-off overrides.\n *\n * Schema is intentionally narrow + extensible — unknown keys are\n * preserved on save (deep-merge), so a newer CLI writing a new\n * field won't drop one an older CLI doesn't know about. No secrets\n * here; credentials stay in credentials.json (mode 0600).\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\n\nexport const CONFIG_VERSION = 1 as const\n\nexport interface DaemonConfig {\n /** Absolute path to the workspace the daemon binds to at boot. */\n workspace?: string\n /** HTTP port. Default 18790. */\n port?: number\n /** Bind addr. Default 127.0.0.1. */\n bind?: string\n /** Trusted browser origins for mutating /sessions/* routes (in\n * addition to the hardcoded localhost defaults). */\n allowedOrigins?: string[]\n /** When true, the daemon does NOT auto-trust localhost-on-any-port.\n * Only origins explicitly listed in `allowedOrigins` are allowed.\n * Pair with a curated list (e.g. `[\"http://localhost:3000\"]`) for\n * hardened setups. Default false. */\n strictOrigins?: boolean\n /** Server label sent in tunnel hello frames. */\n label?: string\n}\n\nexport interface TunnelConfig {\n /** Cloud WS URL. When set + autoconnect=true, `agentproto serve`\n * bootstraps with `--connect <host>`. */\n host?: string\n /** apt_ daemon token to present at the tunnel upgrade. When set,\n * `agentproto serve` uses this BEFORE falling back to\n * credentials.json — handy in profiles where the token-per-host\n * mapping in credentials.json doesn't fit (e.g. host = tunnel URL\n * but credentials were minted against the api URL). */\n token?: string\n /** Whether `agentproto daemon start` connects the tunnel by\n * default. v0 only — implementer can ignore until daemon needs it. */\n autoconnect?: boolean\n}\n\nexport interface FeaturesConfig {\n /** Hint that PTY is desired — informational; the daemon still\n * detects node-pty's presence at runtime. */\n pty?: boolean\n}\n\n/**\n * Per-environment connection bundle. A profile overrides specific\n * fields of the top-level `daemon` / `tunnel` / `features` blocks\n * when selected via `--profile <name>` (or the top-level\n * `activeProfile` setting). Missing fields fall through to the\n * top-level config, so a profile only needs to declare what's\n * different — typically just `tunnel.host` + `tunnel.token`.\n *\n * Example:\n * {\n * \"daemon\": { \"workspace\": \"/code\", \"port\": 18790 },\n * \"activeProfile\": \"local\",\n * \"profiles\": {\n * \"local\": { \"tunnel\": { \"host\": \"ws://localhost:3200/connect\",\n * \"token\": \"apt_local\", \"autoconnect\": true } },\n * \"prod\": { \"tunnel\": { \"host\": \"wss://tunnel.guilde.work/connect\",\n * \"token\": \"apt_prod\", \"autoconnect\": true },\n * \"daemon\": { \"port\": 18791 } }\n * }\n * }\n *\n * Sandbox daemons generate per-sandbox profile entries at provision\n * time so the daemon inside the sandbox boots with\n * `agentproto serve --profile sandbox-<id>` and no extra plumbing.\n */\nexport interface ProfileConfig {\n daemon?: DaemonConfig\n tunnel?: TunnelConfig\n features?: FeaturesConfig\n}\n\nexport interface AgentprotoConfig {\n version?: number\n daemon?: DaemonConfig\n tunnel?: TunnelConfig\n features?: FeaturesConfig\n /** Named connection profiles. See `ProfileConfig` for the merge\n * semantics — a profile's fields shallow-override the top-level\n * defaults for the selected run. */\n profiles?: Record<string, ProfileConfig>\n /** Profile name to use when `--profile` isn't passed. When unset,\n * the top-level `daemon` / `tunnel` blocks are used directly. */\n activeProfile?: string\n /** Unknown keys preserved across save round-trips. */\n [unknown: string]: unknown\n}\n\nexport const CONFIG_FILE_PATH = (): string =>\n join(homedir(), \".agentproto\", \"config.json\")\n\n/**\n * Load config.json. Returns an empty object (NOT null) when the file\n * is missing, malformed, or unreadable — callers can `cfg.daemon?.port`\n * safely without null-guards. Errors during a malformed-read are\n * logged once so the user notices the file is broken without the\n * daemon refusing to boot.\n */\nexport async function loadConfig(path?: string): Promise<AgentprotoConfig> {\n const target = path ?? CONFIG_FILE_PATH()\n try {\n const raw = await fs.readFile(target, \"utf8\")\n const parsed = JSON.parse(raw) as unknown\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as AgentprotoConfig\n }\n console.warn(\n `[runtime/config] ${target}: top-level value is not an object — ignoring`,\n )\n return {}\n } catch (err) {\n // ENOENT is the common case; only warn on other shapes.\n const code = (err as NodeJS.ErrnoException).code\n if (code && code !== \"ENOENT\") {\n console.warn(\n `[runtime/config] failed to read ${target}: ${\n err instanceof Error ? err.message : String(err)\n }`,\n )\n }\n return {}\n }\n}\n\n/**\n * Write config.json atomically (tmp + rename) so a concurrent\n * `agentproto config edit` can't half-truncate the file. Writes\n * `next` AS-IS — callers are expected to pass the full desired\n * state (loaded the existing config, mutated, passed it back).\n *\n * Earlier versions deep-merged with the on-disk file, but that made\n * deletions impossible: `setConfigKey(cfg, \"x\", undefined)` would\n * remove the key from memory, then the deep-merge would silently\n * re-add it from disk. The current design trusts the caller's\n * snapshot and uses atomic rename for crash safety.\n */\nexport async function saveConfig(\n next: AgentprotoConfig,\n path?: string,\n): Promise<void> {\n const target = path ?? CONFIG_FILE_PATH()\n const payload = { ...next, version: CONFIG_VERSION }\n const dir = dirname(target)\n await fs.mkdir(dir, { recursive: true })\n const tmp = `${target}.tmp`\n await fs.writeFile(tmp, JSON.stringify(payload, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, target)\n}\n\n/**\n * Read a dot-notation key (`daemon.port`) out of a config. Returns\n * `undefined` when any segment is missing.\n */\nexport function getConfigKey(\n cfg: AgentprotoConfig,\n dotted: string,\n): unknown {\n let cur: unknown = cfg\n for (const part of dotted.split(\".\")) {\n if (cur == null || typeof cur !== \"object\") return undefined\n cur = (cur as Record<string, unknown>)[part]\n }\n return cur\n}\n\n/**\n * Set a dot-notation key in a config. Returns a new object — does\n * NOT mutate. Creates intermediate objects as needed. Setting\n * `value: undefined` is treated as a delete.\n */\nexport function setConfigKey(\n cfg: AgentprotoConfig,\n dotted: string,\n value: unknown,\n): AgentprotoConfig {\n const parts = dotted.split(\".\")\n const out: AgentprotoConfig = { ...cfg }\n let cur: Record<string, unknown> = out as Record<string, unknown>\n for (let i = 0; i < parts.length - 1; i++) {\n const k = parts[i]!\n const next = cur[k]\n if (next && typeof next === \"object\" && !Array.isArray(next)) {\n cur[k] = { ...(next as Record<string, unknown>) }\n } else {\n cur[k] = {}\n }\n cur = cur[k] as Record<string, unknown>\n }\n const leaf = parts[parts.length - 1]!\n if (value === undefined) {\n delete cur[leaf]\n } else {\n cur[leaf] = value\n }\n return out\n}\n\n/**\n * Deep merge — objects are recursively combined, everything else\n * (arrays, primitives) is replaced wholesale by `b`. Mirrors what\n * `Object.assign({}, a, b)` does for shallow keys.\n */\nfunction deepMerge<A extends Record<string, unknown>, B extends Record<string, unknown>>(\n a: A,\n b: B,\n): A & B {\n const out: Record<string, unknown> = { ...a }\n for (const [k, v] of Object.entries(b)) {\n const cur = out[k]\n if (\n v &&\n typeof v === \"object\" &&\n !Array.isArray(v) &&\n cur &&\n typeof cur === \"object\" &&\n !Array.isArray(cur)\n ) {\n out[k] = deepMerge(\n cur as Record<string, unknown>,\n v as Record<string, unknown>,\n )\n } else {\n out[k] = v\n }\n }\n return out as A & B\n}\n","/**\n * `agentproto daemon <install|uninstall|start|stop|status|logs>`\n *\n * Service-management shim. On macOS we wrap `launchctl` with a\n * generated `~/Library/LaunchAgents/sh.agentproto.plist`; on Linux\n * we'll wrap `systemctl --user` once that path is finished (the\n * verb prints \"not yet\" until then). Windows: same, NSSM/Task\n * Scheduler is on the followup list.\n *\n * The plist's `ProgramArguments` is built from `~/.agentproto/config.json`'s\n * `daemon.*` keys (workspace, port, bind, allowedOrigins). The user\n * configures once via `agentproto config set …`, then `daemon install`\n * captures that snapshot. Re-run `install` after any config change\n * to refresh the plist.\n *\n * Logs go to `~/.agentproto/daemon.log` (stdout + stderr merged).\n *\n * Sub-verbs:\n * install write the plist + launchctl bootstrap\n * uninstall launchctl bootout + delete plist\n * start launchctl kickstart (one-shot; honours KeepAlive)\n * stop launchctl kill SIGTERM\n * status plist installed? launchctl loaded? /health probe?\n * last 10 lines of daemon.log\n * logs tail daemon.log (10 lines by default, --lines <N>)\n */\n\nimport { spawn } from \"node:child_process\"\nimport { promises as fs } from \"node:fs\"\nimport { homedir, platform as osPlatform } from \"node:os\"\nimport { dirname, join } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport { loadConfig, CONFIG_FILE_PATH } from \"@agentproto/runtime/config\"\n\nconst LABEL = \"sh.agentproto\"\nconst USAGE = `agentproto daemon — run agentproto serve as a background service\n\nUsage:\n agentproto daemon install [--dry-run] register service + start it (macOS launchd today)\n agentproto daemon uninstall stop + deregister service\n agentproto daemon start launchctl kickstart\n agentproto daemon stop launchctl kill SIGTERM\n agentproto daemon status installed? loaded? /health reachable?\n agentproto daemon logs [--lines <N>] tail daemon.log\n\nConfigure defaults via \\`agentproto config set\\` before \\`install\\`:\n agentproto config set daemon.workspace /path/to/project\n agentproto config set daemon.port 18790\n agentproto config set daemon.allowedOrigins https://guilde.work\n`\n\nexport async function runDaemon(args: readonly string[]): Promise<number> {\n if (args.includes(\"--help\") || args.includes(\"-h\") || args.length === 0) {\n process.stdout.write(USAGE)\n return args.length === 0 ? 2 : 0\n }\n if (osPlatform() !== \"darwin\") {\n process.stderr.write(\n `agentproto daemon: ${osPlatform()} not yet supported. macOS (launchd) ships today; ` +\n \"Linux (systemd --user) and Windows are on the follow-up list. \" +\n \"In the meantime: `agentproto serve &; disown` will detach the daemon from your shell.\\n\",\n )\n return 2\n }\n const sub = args[0]\n const rest = args.slice(1)\n switch (sub) {\n case \"install\":\n return runInstall(rest)\n case \"uninstall\":\n return runUninstall()\n case \"start\":\n return runStart()\n case \"stop\":\n return runStop()\n case \"status\":\n return runStatus()\n case \"logs\":\n return runLogs(rest)\n default:\n process.stderr.write(\n `agentproto daemon: unknown sub-verb \"${sub}\".\\n\\n${USAGE}`,\n )\n return 2\n }\n}\n\ninterface Paths {\n plist: string\n log: string\n /** `node /path/to/cli.mjs` — what launchd should exec. The CLI\n * ships as an ESM `.mjs` file with no shebang; the pnpm/npm bin\n * shim execs `node cli.mjs $@`. launchd doesn't run shell shims,\n * so we reconstruct the `node + script` pair here. */\n argv: [string, string]\n}\n\nfunction paths(): Paths {\n return {\n plist: join(homedir(), \"Library\", \"LaunchAgents\", `${LABEL}.plist`),\n log: join(homedir(), \".agentproto\", \"daemon.log\"),\n // process.execPath is the Node binary running THIS process (the\n // one running `agentproto daemon install`). Captures fnm / nvm /\n // homebrew / system Node correctly. argv[1] is the cli.mjs entry\n // resolved by the shim.\n argv: [\n process.execPath,\n process.argv[1] ?? \"/dev/null\",\n ],\n }\n}\n\nasync function runInstall(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: { \"dry-run\": { type: \"boolean\" } },\n })\n const cfg = await loadConfig()\n const daemon = cfg.daemon ?? {}\n const p = paths()\n const argv = [\"serve\"]\n if (daemon.workspace) argv.push(\"--workspace\", daemon.workspace)\n if (typeof daemon.port === \"number\") argv.push(\"--port\", String(daemon.port))\n if (daemon.bind) argv.push(\"--bind\", daemon.bind)\n for (const origin of daemon.allowedOrigins ?? []) {\n argv.push(\"--allow-origin\", origin)\n }\n if (daemon.label) argv.push(\"--label\", daemon.label)\n const tunnelHost = cfg.tunnel?.host\n const autoconnect = cfg.tunnel?.autoconnect === true\n if (tunnelHost && autoconnect) argv.push(\"--connect\", tunnelHost)\n\n const plist = renderPlist({\n label: LABEL,\n // `node /path/to/cli.mjs` first, then the serve verb + flags.\n fullArgv: [...p.argv, ...argv],\n logPath: p.log,\n })\n\n if (values[\"dry-run\"]) {\n process.stdout.write(\n `# Would write ${p.plist}:\\n\\n${plist}\\n# launchctl bootstrap gui/$(id -u) ${p.plist}\\n`,\n )\n return 0\n }\n\n await fs.mkdir(dirname(p.plist), { recursive: true })\n await fs.mkdir(dirname(p.log), { recursive: true })\n await fs.writeFile(p.plist, plist, \"utf8\")\n process.stdout.write(`agentproto daemon: wrote ${p.plist}\\n`)\n\n // If a previous version is loaded, bootout first so bootstrap\n // doesn't fail with \"service already bootstrapped\".\n await launchctl([\"bootout\", `gui/${process.getuid?.() ?? 0}/${LABEL}`]).catch(\n () => undefined,\n )\n\n const boot = await launchctl([\n \"bootstrap\",\n `gui/${process.getuid?.() ?? 0}`,\n p.plist,\n ])\n if (boot.code !== 0) {\n process.stderr.write(\n `agentproto daemon install: launchctl bootstrap failed (exit ${boot.code})\\n${boot.stderr}\\n`,\n )\n return 1\n }\n process.stdout.write(\n `agentproto daemon: loaded via launchd. Tail logs: agentproto daemon logs\\n`,\n )\n return 0\n}\n\nasync function runUninstall(): Promise<number> {\n const p = paths()\n const target = `gui/${process.getuid?.() ?? 0}/${LABEL}`\n const out = await launchctl([\"bootout\", target])\n if (out.code !== 0 && !/No such process/i.test(out.stderr)) {\n process.stderr.write(\n `agentproto daemon uninstall: launchctl bootout failed (exit ${out.code})\\n${out.stderr}\\n`,\n )\n }\n try {\n await fs.unlink(p.plist)\n process.stdout.write(`agentproto daemon: removed ${p.plist}\\n`)\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code\n if (code === \"ENOENT\") {\n process.stdout.write(`agentproto daemon: ${p.plist} already absent\\n`)\n } else {\n process.stderr.write(\n `agentproto daemon uninstall: failed to remove plist: ${\n err instanceof Error ? err.message : String(err)\n }\\n`,\n )\n return 1\n }\n }\n return 0\n}\n\nasync function runStart(): Promise<number> {\n const target = `gui/${process.getuid?.() ?? 0}/${LABEL}`\n const out = await launchctl([\"kickstart\", \"-k\", target])\n if (out.code !== 0) {\n process.stderr.write(\n `agentproto daemon start: ${out.stderr || \"launchctl exited \" + out.code}\\n` +\n ` Run \\`agentproto daemon install\\` first.\\n`,\n )\n return out.code\n }\n process.stdout.write(\"agentproto daemon: kickstart sent\\n\")\n return 0\n}\n\nasync function runStop(): Promise<number> {\n const target = `gui/${process.getuid?.() ?? 0}/${LABEL}`\n const out = await launchctl([\"kill\", \"SIGTERM\", target])\n if (out.code !== 0) {\n process.stderr.write(\n `agentproto daemon stop: ${out.stderr || \"launchctl exited \" + out.code}\\n`,\n )\n return out.code\n }\n process.stdout.write(\"agentproto daemon: SIGTERM sent\\n\")\n return 0\n}\n\nasync function runStatus(): Promise<number> {\n const p = paths()\n const cfg = await loadConfig()\n const port = cfg.daemon?.port ?? 18790\n const bind = cfg.daemon?.bind ?? \"127.0.0.1\"\n\n // 1. plist installed?\n let plistOk = false\n try {\n await fs.access(p.plist)\n plistOk = true\n } catch {\n /* not installed */\n }\n\n // 2. launchctl loaded?\n const target = `gui/${process.getuid?.() ?? 0}/${LABEL}`\n const printOut = await launchctl([\"print\", target])\n const loaded = printOut.code === 0\n // Extract pid (or state) from the print output — best-effort regex\n // so a launchctl output format change doesn't crash us.\n const pidMatch = printOut.stdout.match(/^\\s*pid\\s*=\\s*(\\d+)/m)\n const stateMatch = printOut.stdout.match(/^\\s*state\\s*=\\s*(\\w+)/m)\n\n // 3. /health probe.\n let health: string | null = null\n try {\n const res = await fetch(`http://${bind}:${port}/health`, {\n signal: AbortSignal.timeout(800),\n })\n if (res.ok) {\n const body = (await res.json().catch(() => ({}))) as {\n workspace?: string\n uptimeMs?: number\n }\n health = `ok · workspace=${body.workspace ?? \"?\"} · up ${humaniseUptime(body.uptimeMs ?? 0)}`\n } else {\n health = `HTTP ${res.status}`\n }\n } catch {\n health = \"unreachable\"\n }\n\n process.stdout.write(\n `agentproto daemon status\\n` +\n ` plist: ${plistOk ? \"installed\" : \"not installed\"} (${p.plist})\\n` +\n ` launchd: ${loaded ? \"loaded\" : \"not loaded\"}` +\n (pidMatch ? ` · pid=${pidMatch[1]}` : \"\") +\n (stateMatch ? ` · state=${stateMatch[1]}` : \"\") +\n `\\n` +\n ` /health: ${health} (http://${bind}:${port})\\n` +\n ` config: ${CONFIG_FILE_PATH()}\\n` +\n ` logs: ${p.log}\\n`,\n )\n\n // Tail the last 5 lines so users see what the daemon is up to.\n try {\n const buf = await fs.readFile(p.log, \"utf8\")\n const tail = buf.split(\"\\n\").slice(-6).join(\"\\n\").trim()\n if (tail) {\n process.stdout.write(`\\n recent logs:\\n${indent(tail, \" \")}\\n`)\n }\n } catch {\n /* no log yet */\n }\n return plistOk && loaded ? 0 : 1\n}\n\nasync function runLogs(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: { lines: { type: \"string\", short: \"n\" } },\n })\n const n = values.lines ? Number.parseInt(values.lines, 10) : 10\n const p = paths()\n try {\n const buf = await fs.readFile(p.log, \"utf8\")\n const lines = buf.split(\"\\n\")\n process.stdout.write(lines.slice(-n - 1).join(\"\\n\"))\n if (!buf.endsWith(\"\\n\")) process.stdout.write(\"\\n\")\n return 0\n } catch (err) {\n process.stderr.write(\n `agentproto daemon logs: ${err instanceof Error ? err.message : String(err)}\\n`,\n )\n return 1\n }\n}\n\ninterface PlistOpts {\n label: string\n /** Full argv launchd execs — `[node, cli.mjs, serve, …]`. */\n fullArgv: string[]\n logPath: string\n}\n\nfunction renderPlist(opts: PlistOpts): string {\n const argEls = opts.fullArgv\n .map(a => ` <string>${xmlEscape(a)}</string>`)\n .join(\"\\n\")\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key><string>${xmlEscape(opts.label)}</string>\n <key>ProgramArguments</key>\n <array>\n${argEls}\n </array>\n <key>RunAtLoad</key><true/>\n <key>KeepAlive</key><true/>\n <key>ProcessType</key><string>Interactive</string>\n <key>StandardOutPath</key><string>${xmlEscape(opts.logPath)}</string>\n <key>StandardErrorPath</key><string>${xmlEscape(opts.logPath)}</string>\n <key>EnvironmentVariables</key>\n <dict>\n <key>PATH</key><string>${xmlEscape(process.env.PATH ?? \"/usr/local/bin:/usr/bin:/bin\")}</string>\n <key>HOME</key><string>${xmlEscape(process.env.HOME ?? homedir())}</string>\n </dict>\n</dict>\n</plist>\n`\n}\n\nfunction xmlEscape(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n}\n\ninterface LaunchctlResult {\n code: number\n stdout: string\n stderr: string\n}\n\nfunction launchctl(args: string[]): Promise<LaunchctlResult> {\n return new Promise(resolve => {\n const child = spawn(\"launchctl\", args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] })\n let stdout = \"\"\n let stderr = \"\"\n child.stdout?.setEncoding(\"utf8\").on(\"data\", c => (stdout += c))\n child.stderr?.setEncoding(\"utf8\").on(\"data\", c => (stderr += c))\n child.on(\"error\", err =>\n resolve({ code: 127, stdout, stderr: err.message }),\n )\n child.on(\"exit\", code => resolve({ code: code ?? 1, stdout, stderr }))\n })\n}\n\nfunction humaniseUptime(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n if (ms < 60_000) return `${Math.floor(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.floor(ms / 60_000)}m`\n if (ms < 86_400_000) return `${Math.floor(ms / 3_600_000)}h`\n return `${Math.floor(ms / 86_400_000)}d`\n}\n\nfunction indent(s: string, prefix: string): string {\n return s\n .split(\"\\n\")\n .map(l => prefix + l)\n .join(\"\\n\")\n}\n","/**\n * Credential store for `agentproto auth login`.\n *\n * Format on disk (JSON, mode 0600):\n *\n * {\n * \"version\": 1,\n * \"hosts\": {\n * \"wss://guilde.work/api/v1/agentproto/tunnel\": {\n * \"token\": \"eyJ…\",\n * \"tokenType\": \"Bearer\",\n * \"expiresAt\": \"2026-08-08T12:34:56.000Z\",\n * \"refreshToken\": \"rt_…\", // optional\n * \"scope\": \"tunnel:connect\",\n * \"subject\": \"user_abc\",\n * \"obtainedAt\": \"2026-05-10T08:21:11.000Z\",\n * \"deviceLabel\": \"jeremy@laptop\"\n * }\n * }\n * }\n *\n * One file per *user*, multiple hosts under the same file. Hosts are\n * keyed by the URL the user passed to `agentproto auth login --host`,\n * stripped of trailing slash. `agentproto serve --connect <url>` looks\n * up the same key when no `--token` is passed.\n *\n * Storage location:\n * - `$AGENTPROTO_HOME/credentials.json`, falling back to\n * - `~/.agentproto/credentials.json`\n *\n * The file holds bearer tokens, so it's chmod'd 0600 on every write.\n * On Windows we rely on the per-user profile path being already\n * private and skip chmod. Never log the token contents.\n */\n\nimport { mkdir, readFile, writeFile, chmod, unlink } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { join, dirname } from \"node:path\"\n\nexport interface HostCredential {\n /** Bearer token. Bearer-form is the only one supported for v1. */\n token: string\n /** Always \"Bearer\" today; reserved for future schemes. */\n tokenType: \"Bearer\"\n /** ISO-8601. May be in the past — callers must check `isExpired`. */\n expiresAt: string\n /** OAuth 2.0 refresh token. Present when the host issues one. */\n refreshToken?: string\n /** Space-separated scopes the token was issued with. */\n scope?: string\n /** Human-readable subject — usually the user id, surfaced in `auth status`. */\n subject?: string\n /** ISO-8601 of when this credential was minted. */\n obtainedAt: string\n /** Friendly device label shown on the host's Machine-tokens page. */\n deviceLabel?: string\n /** Opaque revocation hint surfaced by the host (e.g. JTI). The CLI\n * passes it back on `auth logout` so the host can revoke the right\n * row server-side, not just delete the local copy. */\n revocationId?: string\n}\n\ninterface CredentialsFile {\n version: 1\n hosts: Record<string, HostCredential>\n}\n\nconst FILE_VERSION = 1 as const\n\nexport function credentialsPath(): string {\n const base = process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n return join(base, \"credentials.json\")\n}\n\nexport function normaliseHost(host: string): string {\n return host.replace(/\\/+$/, \"\")\n}\n\nexport async function loadCredentials(): Promise<CredentialsFile> {\n const path = credentialsPath()\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as CredentialsFile\n if (parsed.version !== FILE_VERSION) {\n throw new Error(\n `credentials.json: unknown version ${parsed.version}; expected ${FILE_VERSION}. ` +\n `Delete the file and re-run \\`agentproto auth login\\`.`\n )\n }\n return parsed\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { version: FILE_VERSION, hosts: {} }\n }\n throw err\n }\n}\n\nexport async function saveCredentials(file: CredentialsFile): Promise<void> {\n const path = credentialsPath()\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, JSON.stringify(file, null, 2))\n await chmod(path, 0o600).catch(() => {\n // Windows + some sandboxed FSes (e.g. WSL on a Windows mount) don't\n // honour chmod. The file lives under the user profile in those\n // cases, which is already user-private; not worth refusing.\n })\n}\n\nexport async function readHost(host: string): Promise<HostCredential | null> {\n const f = await loadCredentials()\n return f.hosts[normaliseHost(host)] ?? null\n}\n\nexport async function writeHost(\n host: string,\n cred: HostCredential\n): Promise<void> {\n const f = await loadCredentials()\n f.hosts[normaliseHost(host)] = cred\n await saveCredentials(f)\n}\n\nexport async function deleteHost(host: string): Promise<HostCredential | null> {\n const f = await loadCredentials()\n const key = normaliseHost(host)\n const prev = f.hosts[key] ?? null\n if (prev) {\n delete f.hosts[key]\n if (Object.keys(f.hosts).length === 0) {\n // Empty file is a valid state (`auth login` re-creates), but\n // unlinking is cleaner — `auth status` then prints \"no credentials\".\n await unlink(credentialsPath()).catch(() => {})\n } else {\n await saveCredentials(f)\n }\n }\n return prev\n}\n\nexport function isExpired(cred: HostCredential, gracePeriodMs = 30_000): boolean {\n const exp = Date.parse(cred.expiresAt)\n if (!Number.isFinite(exp)) return false // unparseable expiry → trust the host\n return exp - gracePeriodMs <= Date.now()\n}\n\nexport function formatExpiry(cred: HostCredential): string {\n const exp = new Date(cred.expiresAt)\n if (Number.isNaN(exp.getTime())) return \"unknown\"\n const ms = exp.getTime() - Date.now()\n if (ms < 0) return `expired ${formatRelative(-ms)} ago`\n return `expires in ${formatRelative(ms)}`\n}\n\nfunction formatRelative(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`\n if (ms < 86_400_000) return `${Math.round(ms / 3_600_000)}h`\n return `${Math.round(ms / 86_400_000)}d`\n}\n","/**\n * `agentproto auth <login | status | logout>`\n *\n * Implements the **host-binding** flow — the JWT that authenticates\n * `agentproto serve --connect <host>` to its tunnel host (Guilde,\n * a self-hosted gateway, …). Different from per-adapter setup tokens,\n * which are per-CLI and live in adapter `setup[]` blocks.\n *\n * Mechanism: OAuth 2.0 Device Authorization Grant (RFC 8628), the\n * same flow Claude Code, gh, gcloud, and stripe-cli use. Three steps:\n *\n * 1. Discovery — fetch `<host>/.well-known/agentproto-host.json`\n * to learn the device + token endpoints.\n * 2. Authorize — POST device endpoint → user_code + verification_uri.\n * 3. Poll — POST token endpoint with grant_type=device_code\n * until the user approves in the browser, then\n * persist {access_token, refresh_token, expires_in}\n * to `~/.agentproto/credentials.json`.\n *\n * Everything else in `agentproto` (serve, install, run) treats this\n * file as the source of truth when no `--token` is supplied.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { hostname, platform, userInfo } from \"node:os\"\nimport { parseArgs } from \"node:util\"\nimport {\n credentialsPath,\n deleteHost,\n formatExpiry,\n isExpired,\n loadCredentials,\n normaliseHost,\n readHost,\n writeHost,\n type HostCredential,\n} from \"../util/credentials.js\"\n\nexport async function runAuth(args: readonly string[]): Promise<number> {\n const sub = args[0]\n const rest = args.slice(1)\n switch (sub) {\n case \"login\":\n return runAuthLogin(rest)\n case \"status\":\n return runAuthStatus(rest)\n case \"logout\":\n return runAuthLogout(rest)\n case undefined:\n case \"--help\":\n case \"-h\":\n process.stdout.write(USAGE)\n return 0\n default:\n process.stderr.write(\n `agentproto auth: unknown subcommand '${sub}'.\\n\\n${USAGE}`\n )\n return 2\n }\n}\n\nconst USAGE = `agentproto auth — host-binding tokens (RFC 8628 device flow)\n\nUsage:\n agentproto auth login [--host <url>] [--label <name>] [--no-browser]\n agentproto auth status [--host <url>] [--json]\n agentproto auth logout [--host <url>]\n\nThe default host is the one most recently logged into; on first use,\n\\`--host\\` is required. Examples:\n\n agentproto auth login --host wss://guilde.work\n agentproto auth status\n agentproto auth logout --host wss://guilde.work\n`\n\n// ── login ────────────────────────────────────────────────────────────\n\ninterface HostDiscovery {\n /** RFC 8414 issuer string, surfaced for \"logged in to X\" UI. */\n issuer: string\n /** RFC 8628 device authorization endpoint. */\n device_authorization_endpoint: string\n /** RFC 6749 token endpoint. */\n token_endpoint: string\n /** Optional revocation endpoint (RFC 7009). */\n revocation_endpoint?: string\n /** OAuth client_id the agentproto CLI presents. Hosts that don't\n * enforce per-client metadata MAY return the constant\n * `agentproto-cli`; hosts that do MUST register the CLI as a\n * public client and put the registered id here. */\n client_id: string\n /** Optional scopes the CLI may request. Subset of host's offer. */\n scopes_supported?: string[]\n}\n\ninterface DeviceAuthResponse {\n device_code: string\n user_code: string\n verification_uri: string\n /** Optional pre-filled URL with the user_code embedded. RFC 8628 §3.3.1. */\n verification_uri_complete?: string\n expires_in: number\n /** Polling interval in seconds. RFC 8628 default 5. */\n interval?: number\n}\n\ninterface TokenSuccessResponse {\n access_token: string\n token_type: \"Bearer\" | \"bearer\"\n expires_in: number\n refresh_token?: string\n scope?: string\n /** Custom (not in RFC 6749): host's revocation hint, e.g. JTI or\n * internal token row id. We pass it back on logout. */\n revocation_id?: string\n /** Custom: subject id surfaced in `auth status`. */\n subject?: string\n}\n\ninterface TokenErrorResponse {\n error:\n | \"authorization_pending\"\n | \"slow_down\"\n | \"access_denied\"\n | \"expired_token\"\n | \"invalid_client\"\n | \"invalid_grant\"\n | \"unsupported_grant_type\"\n | string\n error_description?: string\n}\n\nasync function runAuthLogin(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n strict: true,\n options: {\n host: { type: \"string\" },\n label: { type: \"string\" },\n \"no-browser\": { type: \"boolean\" },\n scope: { type: \"string\" },\n },\n })\n const host = values.host ?? (await pickDefaultHost())\n if (!host) {\n process.stderr.write(\n \"agentproto auth login: pass --host <url> on first login (e.g. --host wss://guilde.work).\\n\"\n )\n return 2\n }\n const label = values.label ?? `${userInfo().username}@${hostname()}`\n const requestedScope = values.scope ?? \"tunnel:connect agent-cli:dispatch\"\n\n const httpHost = toHttp(host)\n const discoveryUrl = `${httpHost}/.well-known/agentproto-host.json`\n process.stdout.write(`agentproto auth: discovering ${discoveryUrl}\\n`)\n let discovery: HostDiscovery\n try {\n discovery = await fetchJson<HostDiscovery>(discoveryUrl)\n } catch (err) {\n process.stderr.write(\n `agentproto auth: failed to fetch host metadata: ${err instanceof Error ? err.message : String(err)}\\n` +\n ` Hosts SHOULD expose /.well-known/agentproto-host.json with device_authorization_endpoint + token_endpoint.\\n`\n )\n return 1\n }\n\n // Step 1 — request a device code.\n let deviceRes: DeviceAuthResponse\n try {\n deviceRes = await postForm<DeviceAuthResponse>(\n discovery.device_authorization_endpoint,\n {\n client_id: discovery.client_id,\n scope: requestedScope,\n // Custom field; hosts that ignore it stay compliant. The\n // approval UI uses it to render \"approve <label>\" so the user\n // recognises the device they're authorising.\n device_label: label,\n }\n )\n } catch (err) {\n process.stderr.write(\n `agentproto auth: device authorization request failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n }\n\n // Step 2 — show the code, open the browser.\n const verifyUrl =\n deviceRes.verification_uri_complete ?? deviceRes.verification_uri\n process.stdout.write(\n `\\nagentproto auth: open\\n ${verifyUrl}\\nand enter code ${deviceRes.user_code}\\n\\n`\n )\n if (!values[\"no-browser\"]) {\n void openBrowser(verifyUrl)\n }\n process.stdout.write(\n `agentproto auth: waiting for approval (expires in ${formatDuration(deviceRes.expires_in * 1000)})…\\n`\n )\n\n // Step 3 — poll the token endpoint.\n const interval = Math.max(1, deviceRes.interval ?? 5)\n const deadline = Date.now() + deviceRes.expires_in * 1000\n let pollIntervalMs = interval * 1000\n let token: TokenSuccessResponse | null = null\n while (Date.now() < deadline) {\n await sleep(pollIntervalMs)\n let res: TokenSuccessResponse | TokenErrorResponse\n try {\n res = await postForm<TokenSuccessResponse | TokenErrorResponse>(\n discovery.token_endpoint,\n {\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceRes.device_code,\n client_id: discovery.client_id,\n }\n )\n } catch (err) {\n process.stderr.write(\n `agentproto auth: token poll failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n }\n if (\"access_token\" in res) {\n token = res\n break\n }\n if (res.error === \"authorization_pending\") continue\n if (res.error === \"slow_down\") {\n // Back off as RFC 8628 §3.5 recommends; poll cadence stays slower\n // for the rest of the flow.\n pollIntervalMs += 5_000\n continue\n }\n if (res.error === \"access_denied\") {\n process.stderr.write(`agentproto auth: approval denied. Aborting.\\n`)\n return 1\n }\n if (res.error === \"expired_token\") {\n process.stderr.write(\n `agentproto auth: device code expired before approval. Re-run \\`agentproto auth login\\`.\\n`\n )\n return 1\n }\n process.stderr.write(\n `agentproto auth: token endpoint returned '${res.error}'${\n res.error_description ? `: ${res.error_description}` : \"\"\n }\\n`\n )\n return 1\n }\n if (!token) {\n process.stderr.write(\n `agentproto auth: timed out waiting for approval. Re-run \\`agentproto auth login\\`.\\n`\n )\n return 1\n }\n\n // Persist.\n const cred: HostCredential = {\n token: token.access_token,\n tokenType: \"Bearer\",\n expiresAt: new Date(Date.now() + token.expires_in * 1000).toISOString(),\n obtainedAt: new Date().toISOString(),\n ...(token.refresh_token ? { refreshToken: token.refresh_token } : {}),\n ...(token.scope ? { scope: token.scope } : {}),\n ...(token.subject ? { subject: token.subject } : {}),\n ...(token.revocation_id ? { revocationId: token.revocation_id } : {}),\n deviceLabel: label,\n }\n await writeHost(host, cred)\n process.stdout.write(\n `agentproto auth: ✓ logged in to ${normaliseHost(host)}\\n` +\n ` saved to ${credentialsPath()} (mode 0600)\\n` +\n ` ${formatExpiry(cred)}${cred.subject ? `, subject ${cred.subject}` : \"\"}\\n`\n )\n return 0\n}\n\n// ── status ───────────────────────────────────────────────────────────\n\nasync function runAuthStatus(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n strict: true,\n options: {\n host: { type: \"string\" },\n json: { type: \"boolean\" },\n },\n })\n const file = await loadCredentials()\n const entries = Object.entries(file.hosts)\n if (entries.length === 0) {\n if (values.json) {\n process.stdout.write(`{\"hosts\": []}\\n`)\n } else {\n process.stdout.write(\n `agentproto auth: no credentials. Try: agentproto auth login --host wss://guilde.work\\n`\n )\n }\n return 0\n }\n const filtered = values.host\n ? entries.filter(([h]) => h === normaliseHost(values.host!))\n : entries\n if (values.json) {\n process.stdout.write(\n JSON.stringify(\n {\n hosts: filtered.map(([host, c]) => ({\n host,\n subject: c.subject ?? null,\n scope: c.scope ?? null,\n obtainedAt: c.obtainedAt,\n expiresAt: c.expiresAt,\n expired: isExpired(c),\n deviceLabel: c.deviceLabel ?? null,\n })),\n },\n null,\n 2\n ) + \"\\n\"\n )\n return 0\n }\n for (const [host, c] of filtered) {\n const status = isExpired(c) ? \"✗ EXPIRED\" : \"✓ active\"\n process.stdout.write(\n `${status} ${host}\\n` +\n ` subject: ${c.subject ?? \"(none)\"}\\n` +\n ` scope: ${c.scope ?? \"(none)\"}\\n` +\n ` label: ${c.deviceLabel ?? \"(none)\"}\\n` +\n ` ${formatExpiry(c)} (obtained ${c.obtainedAt})\\n`\n )\n }\n return 0\n}\n\n// ── logout ───────────────────────────────────────────────────────────\n\nasync function runAuthLogout(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n strict: true,\n options: { host: { type: \"string\" } },\n })\n const host = values.host ?? (await pickDefaultHost())\n if (!host) {\n process.stderr.write(\n `agentproto auth logout: no credentials to revoke. Pass --host <url> if you stored one.\\n`\n )\n return 0\n }\n const prev = await readHost(host)\n if (!prev) {\n process.stderr.write(\n `agentproto auth logout: no credential found for ${host}.\\n`\n )\n return 0\n }\n\n // Best-effort server-side revocation. RFC 7009 token revocation is\n // optional in the host metadata; when missing, we just delete the\n // local copy. When present, we call it but don't fail logout if it\n // errors — the local delete still happens so the user is logged out\n // on this machine even if the host is unreachable.\n let serverRevoked: \"ok\" | \"skipped\" | \"failed\" = \"skipped\"\n try {\n const httpHost = toHttp(host)\n const discovery = await fetchJson<HostDiscovery>(\n `${httpHost}/.well-known/agentproto-host.json`\n )\n if (discovery.revocation_endpoint) {\n const params: Record<string, string> = {\n client_id: discovery.client_id,\n token: prev.token,\n }\n if (prev.revocationId) params[\"revocation_id\"] = prev.revocationId\n await postForm(discovery.revocation_endpoint, params)\n serverRevoked = \"ok\"\n }\n } catch {\n serverRevoked = \"failed\"\n }\n\n await deleteHost(host)\n const note =\n serverRevoked === \"ok\"\n ? \" (server revoked)\"\n : serverRevoked === \"failed\"\n ? \" (server revocation failed; local copy still removed)\"\n : \" (no revocation endpoint advertised; local copy removed)\"\n process.stdout.write(`agentproto auth: ✓ logged out of ${host}${note}\\n`)\n return 0\n}\n\n// ── helpers ──────────────────────────────────────────────────────────\n\nasync function pickDefaultHost(): Promise<string | null> {\n const f = await loadCredentials()\n const keys = Object.keys(f.hosts)\n if (keys.length === 0) return null\n // Most-recently-issued wins. Status command surfaces the full list\n // so the heuristic is just for omitted --host on a single-host setup.\n let best: { host: string; obtainedAt: number } | null = null\n for (const [host, cred] of Object.entries(f.hosts)) {\n const t = Date.parse(cred.obtainedAt)\n if (!Number.isFinite(t)) continue\n if (!best || t > best.obtainedAt) best = { host, obtainedAt: t }\n }\n return best?.host ?? keys[0] ?? null\n}\n\n/**\n * The host URL the user passes is typically a wss:// (tunnel) URL.\n * The OAuth metadata document lives at the http(s) origin of the same\n * host. This converter assumes wss → https, ws → http; everything\n * else passes through.\n */\nfunction toHttp(host: string): string {\n const trimmed = host.replace(/\\/+$/, \"\")\n if (trimmed.startsWith(\"wss://\")) return \"https://\" + trimmed.slice(6)\n if (trimmed.startsWith(\"ws://\")) return \"http://\" + trimmed.slice(5)\n return trimmed\n}\n\nasync function fetchJson<T>(url: string): Promise<T> {\n const res = await fetch(url, { headers: { Accept: \"application/json\" } })\n if (!res.ok) {\n throw new Error(`GET ${url} → ${res.status} ${res.statusText}`)\n }\n return (await res.json()) as T\n}\n\nasync function postForm<T>(\n url: string,\n body: Record<string, string>\n): Promise<T> {\n const params = new URLSearchParams(body)\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body: params.toString(),\n })\n // OAuth error responses return 400 with a JSON `{error, ...}` body.\n // Hand them back to the caller verbatim; let it discriminate.\n if (!res.ok && res.status !== 400) {\n const text = await res.text().catch(() => \"\")\n throw new Error(\n `POST ${url} → ${res.status} ${res.statusText}${text ? \": \" + text.slice(0, 200) : \"\"}`\n )\n }\n return (await res.json()) as T\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`\n return `${Math.round(ms / 3_600_000)}h`\n}\n\nfunction openBrowser(url: string): Promise<void> {\n // best-effort; failure is non-fatal — the URL is already on screen.\n const p = platform()\n const cmd = p === \"darwin\" ? \"open\" : p === \"win32\" ? \"cmd\" : \"xdg-open\"\n const args = p === \"win32\" ? [\"/c\", \"start\", url] : [url]\n return new Promise((resolve) => {\n try {\n const child = spawn(cmd, args, { stdio: \"ignore\", detached: true })\n child.once(\"error\", () => resolve())\n child.once(\"spawn\", () => {\n child.unref()\n resolve()\n })\n } catch {\n resolve()\n }\n })\n}\n","/**\n * `agentproto config <get|set|unset|edit|show> [args]`\n *\n * Hand-editable defaults at `~/.agentproto/config.json`. Sub-verbs:\n *\n * show dump the whole config (pretty JSON)\n * get <key> read one dot-notation key\n * set <key> <value> write one key. Value parsed as JSON when valid,\n * otherwise stored as a string. Arrays accept a\n * comma-separated form (`a,b,c`) for convenience.\n * unset <key> delete one key\n * edit open the file in $EDITOR (or vi)\n * path print the config file path (scripting helper)\n *\n * The daemon reads this file at boot — `serve` falls back to these\n * values when neither CLI flags nor env vars supply one. CLI flags\n * still win, so a config can hold sensible defaults without locking\n * out one-off overrides.\n */\n\nimport { parseArgs } from \"node:util\"\nimport { spawn } from \"node:child_process\"\nimport {\n loadConfig,\n saveConfig,\n getConfigKey,\n setConfigKey,\n CONFIG_FILE_PATH,\n} from \"@agentproto/runtime/config\"\n\nconst USAGE = `agentproto config — manage ~/.agentproto/config.json\n\nUsage:\n agentproto config show dump the full config as JSON\n agentproto config path print the config file path\n agentproto config get <key> read one dot-notation key\n agentproto config set <key> <value> write a key (JSON-parsed when valid)\n agentproto config unset <key> delete a key\n agentproto config edit open the file in $EDITOR\n\nExamples:\n agentproto config set daemon.port 18791\n agentproto config set daemon.allowedOrigins https://guilde.work,https://app.example.com\n agentproto config set tunnel.host wss://guilde.work/api/v1/agentproto/tunnel\n agentproto config get daemon.port\n`\n\nexport async function runConfig(args: readonly string[]): Promise<number> {\n if (args.includes(\"--help\") || args.includes(\"-h\") || args.length === 0) {\n process.stdout.write(USAGE)\n return args.length === 0 ? 2 : 0\n }\n const sub = args[0]\n const rest = args.slice(1)\n switch (sub) {\n case \"show\":\n return runShow(rest)\n case \"path\":\n return runPath()\n case \"get\":\n return runGet(rest)\n case \"set\":\n return runSet(rest)\n case \"unset\":\n return runUnset(rest)\n case \"edit\":\n return runEdit()\n default:\n process.stderr.write(\n `agentproto config: unknown sub-verb \"${sub}\".\\n\\n${USAGE}`,\n )\n return 2\n }\n}\n\nasync function runShow(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: { json: { type: \"boolean\" } },\n })\n void values // json is the only output today, accept flag for forward-compat\n const cfg = await loadConfig()\n process.stdout.write(JSON.stringify(cfg, null, 2) + \"\\n\")\n return 0\n}\n\nasync function runPath(): Promise<number> {\n process.stdout.write(CONFIG_FILE_PATH() + \"\\n\")\n return 0\n}\n\nasync function runGet(args: readonly string[]): Promise<number> {\n const key = args[0]\n if (!key) {\n process.stderr.write(\n \"agentproto config get: missing key.\\n Try: agentproto config get daemon.port\\n\",\n )\n return 2\n }\n const cfg = await loadConfig()\n const val = getConfigKey(cfg, key)\n if (val === undefined) {\n process.stderr.write(`agentproto config get: \"${key}\" not set\\n`)\n return 1\n }\n process.stdout.write(JSON.stringify(val, null, 2) + \"\\n\")\n return 0\n}\n\nasync function runSet(args: readonly string[]): Promise<number> {\n const [key, ...valueParts] = args\n if (!key || valueParts.length === 0) {\n process.stderr.write(\n \"agentproto config set: missing key and/or value.\\n\" +\n ' Try: agentproto config set daemon.port 18791\\n' +\n ' agentproto config set daemon.allowedOrigins https://guilde.work,https://x.com\\n',\n )\n return 2\n }\n // Joined back so `set key 1 2 3` (whitespace-split argv) becomes\n // \"1 2 3\" as a string — caller can quote at the shell to control.\n const raw = valueParts.join(\" \")\n const parsed = parseValue(raw)\n const cfg = await loadConfig()\n const next = setConfigKey(cfg, key, parsed)\n await saveConfig(next)\n process.stdout.write(\n `agentproto config: set ${key} = ${JSON.stringify(parsed)}\\n` +\n ` (${CONFIG_FILE_PATH()})\\n`,\n )\n return 0\n}\n\nasync function runUnset(args: readonly string[]): Promise<number> {\n const key = args[0]\n if (!key) {\n process.stderr.write(\n \"agentproto config unset: missing key.\\n Try: agentproto config unset tunnel.host\\n\",\n )\n return 2\n }\n const cfg = await loadConfig()\n if (getConfigKey(cfg, key) === undefined) {\n process.stderr.write(`agentproto config unset: \"${key}\" not set\\n`)\n return 0\n }\n const next = setConfigKey(cfg, key, undefined)\n await saveConfig(next)\n process.stdout.write(`agentproto config: unset ${key}\\n`)\n return 0\n}\n\nasync function runEdit(): Promise<number> {\n // First make sure the file exists — a non-existent file would fail\n // to open in some editors. saveConfig() with the current state is\n // a no-op write that materializes the file when missing.\n const cfg = await loadConfig()\n await saveConfig(cfg)\n const editor = process.env.EDITOR ?? process.env.VISUAL ?? \"vi\"\n return new Promise<number>(resolve => {\n const child = spawn(editor, [CONFIG_FILE_PATH()], {\n stdio: \"inherit\",\n })\n child.on(\"error\", err => {\n process.stderr.write(\n `agentproto config edit: failed to launch ${editor}: ${err.message}\\n`,\n )\n resolve(1)\n })\n child.on(\"exit\", code => resolve(code ?? 0))\n })\n}\n\n/**\n * Parse a value string with these rules, in order:\n * 1. `true`, `false`, `null` → corresponding JSON literal\n * 2. valid JSON → parsed (numbers, arrays, objects)\n * 3. comma in value → split into array of trimmed strings\n * 4. otherwise → raw string\n *\n * Rationale: people set `daemon.port 18791` and expect a number, set\n * `daemon.allowedOrigins https://a.com,https://b.com` and expect a\n * string array — those are the two common cases. Quoting tricks via\n * JSON-literal mode (`'[\"a\",\"b\"]'`) are the escape hatch.\n */\nfunction parseValue(raw: string): unknown {\n const trimmed = raw.trim()\n if (trimmed === \"true\") return true\n if (trimmed === \"false\") return false\n if (trimmed === \"null\") return null\n // JSON first — covers numbers, arrays, objects, quoted strings.\n if (/^[\\d\\[{\"-]/.test(trimmed) || trimmed === \"true\" || trimmed === \"false\") {\n try {\n return JSON.parse(trimmed)\n } catch {\n // fall through\n }\n }\n // CSV → string array (only when there's at least one unquoted comma).\n if (trimmed.includes(\",\") && !trimmed.startsWith('\"')) {\n return trimmed.split(\",\").map(s => s.trim()).filter(Boolean)\n }\n return trimmed\n}\n","/**\n * Resolve a slug like \"claude-code\" to a runnable `AgentCliHandle`.\n *\n * Resolution order:\n * 1. `@agentproto/adapter-<slug>` from npm (must default-export or\n * named-export an `AgentCliHandle` — convention is the camelCased\n * slug, e.g. `claudeCode`).\n * 2. (TODO) `~/.agentproto/adapters/<slug>/AGENT-CLI.md` on disk.\n * 3. (TODO) bundled fallbacks for the canonical adapters.\n *\n * Step 1 covers 100% of v0 usage. The on-disk path is only there for\n * users authoring their own adapters; we'll add it once `defineAgentCli`\n * supports MD-source authoring end to end.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { resolve as resolvePath } from \"node:path\"\nimport type { AgentCliHandle } from \"@agentproto/driver-agent-cli\"\n\nexport interface ResolvedAdapter {\n readonly slug: string\n readonly handle: AgentCliHandle\n readonly source: \"npm\" | \"file\" | \"bundled\"\n readonly packageName?: string\n}\n\n/**\n * Compact metadata about an installed adapter — the shape returned\n * by `listInstalledAdapters()` and exposed via the daemon's\n * `GET /adapters` route + `list_adapters` MCP tool. Only fields\n * safe to surface in a UI list (no install scripts, no env keys).\n * For full handle access call `resolveAdapter(slug)`.\n */\nexport interface AdapterInfo {\n slug: string\n /** Display name from the manifest. */\n name: string\n /** Adapter package version (matches npm package.json `version`). */\n version: string\n /** One-line user-facing description. */\n description: string\n /** Wire protocol — informs prompt/multi-turn semantics. */\n protocol: string\n /** True when the adapter advertises a streaming session contract. */\n streaming: boolean\n /** npm package name (for install hints / \"open in npmjs.com\" links). */\n packageName: string\n}\n\nconst slugToCamel = (slug: string): string =>\n slug.replace(/-([a-z0-9])/g, (_, c: string) => c.toUpperCase())\n\nexport async function resolveAdapter(slug: string): Promise<ResolvedAdapter> {\n if (!/^[a-z][a-z0-9-]*$/.test(slug)) {\n throw new Error(\n `agentproto: invalid adapter slug '${slug}'. Slugs are lower-kebab.`\n )\n }\n\n const packageName = `@agentproto/adapter-${slug}`\n let mod: Record<string, unknown>\n try {\n mod = (await import(packageName)) as Record<string, unknown>\n } catch (err) {\n const cause = err instanceof Error ? err.message : String(err)\n throw new Error(\n `agentproto: could not load adapter '${slug}'. ` +\n `Tried '${packageName}'. Install it with: npm i -g ${packageName}\\n cause: ${cause}`\n )\n }\n\n const camel = slugToCamel(slug)\n const candidate =\n (mod[camel] as AgentCliHandle | undefined) ??\n (mod.default as AgentCliHandle | undefined) ??\n (mod.handle as AgentCliHandle | undefined)\n\n if (!candidate || typeof candidate !== \"object\" || !(\"name\" in candidate)) {\n throw new Error(\n `agentproto: adapter '${packageName}' does not export an AgentCliHandle ` +\n `(looked for export '${camel}', 'default', or 'handle').`\n )\n }\n\n return { slug, handle: candidate, source: \"npm\", packageName }\n}\n\n/**\n * Enumerate every `@agentproto/adapter-*` package reachable from the\n * current node module-resolution path. Used by the daemon's\n * `GET /adapters` route and `list_adapters` MCP tool so UIs (web\n * spawn dialog) and operators can pick from the installed set\n * without trial-and-error against `resolveAdapter(slug)`.\n *\n * Implementation: walk `node_modules/@agentproto` looking for\n * `adapter-*` directories; for each, dynamic-import the package +\n * extract the AgentCliHandle's display fields. Failures (broken\n * exports, missing dist) are collected as warnings rather than\n * thrown — partial discovery beats failing the whole listing on\n * one bad adapter.\n *\n * Discovery is async + reads disk on every call; cache at the\n * caller layer if you list often. v0 does no caching here because\n * adapter sets typically change rarely (npm i / rm) and a fresh\n * scan stays fast (~10 packages worth of dynamic imports).\n */\nexport async function listInstalledAdapters(opts?: {\n /** Override the search root. Defaults to walking up from the cli\n * package's own location until we hit a `node_modules/@agentproto`. */\n searchRoot?: string\n}): Promise<AdapterInfo[]> {\n const roots = await collectAgentprotoNamespaceRoots(opts?.searchRoot)\n const seen = new Set<string>()\n const out: AdapterInfo[] = []\n // Two failure buckets so we can produce ONE summary line for the\n // expected case (adapter dir found by the walker but not importable\n // from the daemon's resolution path — i.e. workspace-hoisted, not\n // globally installed) and keep per-adapter warnings only for the\n // genuinely surprising ones (broken exports, missing dist, etc.).\n const notImportable: string[] = []\n\n for (const root of roots) {\n let entries: string[] = []\n try {\n entries = await fs.readdir(root)\n } catch {\n continue\n }\n for (const entry of entries) {\n if (!entry.startsWith(\"adapter-\")) continue\n const slug = entry.slice(\"adapter-\".length)\n if (seen.has(slug)) continue\n seen.add(slug)\n try {\n const resolved = await resolveAdapter(slug)\n const handle = resolved.handle as Record<string, unknown>\n const info: AdapterInfo = {\n slug,\n name: typeof handle.name === \"string\" ? handle.name : slug,\n version: typeof handle.version === \"string\" ? handle.version : \"?\",\n description:\n typeof handle.description === \"string\" ? handle.description : \"\",\n protocol:\n typeof handle.protocol === \"string\" ? handle.protocol : \"unknown\",\n streaming: !!(handle.capabilities as { streaming?: boolean })\n ?.streaming,\n packageName: resolved.packageName ?? `@agentproto/adapter-${slug}`,\n }\n out.push(info)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // ERR_MODULE_NOT_FOUND / \"Cannot find package\" is the expected\n // shape when the walker finds an adapter dir hoisted in a\n // workspace's node_modules but that dir isn't reachable from\n // the daemon binary's NODE_PATH. Collapse those into a single\n // summary line below; anything else (broken handle export,\n // syntax error in dist, etc.) still warns individually.\n if (\n /Cannot find package|ERR_MODULE_NOT_FOUND/i.test(msg) &&\n msg.includes(`@agentproto/adapter-${slug}`)\n ) {\n notImportable.push(slug)\n } else {\n console.warn(\n `[agentproto/cli] listInstalledAdapters: skipping broken adapter '${slug}': ${msg}`\n )\n }\n }\n }\n }\n\n // We deliberately do NOT log `notImportable` to console. The\n // discovery walker often finds adapter directories hoisted in a\n // workspace's node_modules that aren't reachable from the daemon's\n // own NODE_PATH — that's a normal state for a fresh checkout and\n // not actionable from a daemon log line. Callers who want the info\n // can inspect the `listInstalledAdapters` return value (importable\n // adapters only); a future `agentproto adapters doctor` verb is the\n // right home for surfacing the unimportable slugs interactively.\n void notImportable\n\n return out.sort((a, b) => a.slug.localeCompare(b.slug))\n}\n\n/**\n * Walk up from the cli package looking for `node_modules/@agentproto`\n * directories. Returns every match (pnpm + global + nvm hoisting can\n * produce more than one) so adapters installed in any reachable\n * scope are discoverable.\n */\nasync function collectAgentprotoNamespaceRoots(\n start?: string\n): Promise<string[]> {\n const roots: string[] = []\n // Start from this package's own dir — works in ESM (import.meta.url\n // route would be cleaner but isn't needed; cwd is reliable enough\n // for the daemon use case where it boots from a known dir).\n let cur = start ?? process.cwd()\n // Both classic + pnpm-hoist locations. Classic npm puts the\n // namespace at node_modules/@agentproto; pnpm hoists to\n // node_modules/.pnpm/node_modules/@agentproto and symlinks\n // individual packages from there. We need to scan the hoist dir\n // for the listing because the namespace dir is the only place\n // where every adapter package is enumerable.\n const candidatesAt = (dir: string): string[] => [\n resolvePath(dir, \"node_modules\", \"@agentproto\"),\n resolvePath(dir, \"node_modules\", \".pnpm\", \"node_modules\", \"@agentproto\"),\n ]\n for (let depth = 0; depth < 16; depth++) {\n for (const candidate of candidatesAt(cur)) {\n try {\n const stat = await fs.stat(candidate)\n if (stat.isDirectory()) roots.push(candidate)\n } catch {\n /* not present at this level */\n }\n }\n const parent = resolvePath(cur, \"..\")\n if (parent === cur) break\n cur = parent\n }\n return roots\n}\n","/**\n * `agentproto setup <slug>` + `runSetup()` engine.\n *\n * Implements AIP-29 § Setup — the post-install configuration pipeline.\n * Steps run in declared order. Idempotency comes from three layers:\n *\n * 1. Manifest's `version_check` — already covered by `install`. If the\n * binary's version answers, install steps are skipped entirely\n * before setup ever runs.\n *\n * 2. Per-step `skip_if.cmd` — runs first; matching exit code skips\n * the step. Asks the live system, so it works on fresh machines\n * without any local state.\n *\n * 3. Setup ledger — `~/.agentproto/setup/<slug>.json`, records each\n * successful step with timestamp + (when applicable) which slot\n * received the value. Re-runs short-circuit ledger-known steps\n * unless --force is passed.\n *\n * The `runSetup()` export is what `agentproto install` calls after the\n * install array succeeds; `runSetupCommand()` is the standalone verb\n * (re-runs only setup, no install).\n *\n * Step `kind` matrix (current support):\n *\n * - cmd ✓ — shell command, optional skip_if + persist (stdout)\n * - prompt ✓ — text / boolean / select / secret; persist via env / secret_slug / cmd\n * - oauth ✗ — placeholder; needs a SECRETS.md driver wire-up\n * - external ⚠ — opens URL via xdg-open/open; callback polling not yet wired\n *\n * The unsupported kinds surface a clear \"not yet implemented\" message\n * so adapter authors can lean on cmd + prompt today and migrate later.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { mkdir, readFile, writeFile, chmod } from \"node:fs/promises\"\nimport { homedir, platform } from \"node:os\"\nimport { join, dirname } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport { createInterface } from \"node:readline/promises\"\nimport { stdin as input, stdout as output } from \"node:process\"\nimport type {\n AgentCliHandle,\n AgentCliSetupStep,\n AgentCliSetupSkipIf,\n AgentCliSetupPersist,\n} from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\n\ninterface LedgerEntry {\n /** Step id from the manifest. */\n stepId: string\n /** ISO-8601 timestamp the step succeeded (or was skipped via skip_if). */\n completedAt: string\n /** What kind of step this was — for forensic scrubbing. Persist values\n * are NEVER stored in the ledger; only the slot name where they\n * landed. */\n kind: AgentCliSetupStep[\"kind\"]\n /** Slot the captured value went into, when applicable. Format:\n * - `env:OPENCLAW_GATEWAY_URL`\n * - `secret:openclaw/gateway-token`\n * - `cmd` (the value was piped to a config command, not stored here)\n */\n persistedTo?: string\n /** True when the step short-circuited via skip_if instead of running. */\n skippedViaSkipIf?: boolean\n}\n\ninterface Ledger {\n /** Bundle id, matches the manifest's `id`. */\n slug: string\n /** When the ledger was last touched. */\n updatedAt: string\n /** One per step id. Most recent run wins. */\n steps: Record<string, LedgerEntry>\n /** Captured env-bound values — persist.env steps land here. The\n * installer + runner read from the secrets backend in production;\n * for the local CLI host we mirror them into the ledger so\n * `agentproto run` can lift them onto the spawn env without hitting\n * a remote vault. Restricted to 0600 perms by the writer. */\n envValues?: Record<string, string>\n}\n\nexport interface RunSetupOptions {\n slug: string\n handle: AgentCliHandle\n /** When true, ignore the ledger AND skip_if; re-runs every step. */\n force?: boolean\n /** When true, log what would happen but don't spawn / prompt. */\n dryRun?: boolean\n /** When set, only run the named step ids (in declared order). Useful\n * for re-running a single step after a manual fix. */\n only?: string[]\n}\n\nexport async function runSetup(opts: RunSetupOptions): Promise<number> {\n const steps = opts.handle.setup ?? []\n if (steps.length === 0) {\n process.stdout.write(`agentproto setup: no setup steps for '${opts.slug}'.\\n`)\n return 0\n }\n\n const ledgerPath = ledgerPathFor(opts.slug)\n const ledger = await loadLedger(ledgerPath, opts.slug)\n const onlySet = opts.only && opts.only.length > 0 ? new Set(opts.only) : null\n\n for (const [i, step] of steps.entries()) {\n if (onlySet && !onlySet.has(step.id)) continue\n\n const idx = `[${i + 1}/${steps.length}]`\n const head = `${idx} ${step.kind}/${step.id}`\n\n // Layer 3: ledger short-circuit (skipped on --force).\n const prev = ledger.steps[step.id]\n if (!opts.force && prev) {\n process.stdout.write(\n `${head} ✓ already completed (${prev.completedAt}${prev.skippedViaSkipIf ? \", via skip_if\" : \"\"}). Pass --force to re-run.\\n`\n )\n continue\n }\n\n // Layer 2: per-step skip_if.\n if (step.skip_if && !opts.force) {\n const ok = await checkSkipIf(step.skip_if)\n if (ok) {\n process.stdout.write(`${head} ✓ skip_if matched — skipping.\\n`)\n ledger.steps[step.id] = {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n skippedViaSkipIf: true,\n }\n continue\n }\n }\n\n if (opts.dryRun) {\n process.stdout.write(`${head} (dry-run) — would execute.\\n`)\n continue\n }\n\n // Run the step.\n let entry: LedgerEntry | null = null\n try {\n switch (step.kind) {\n case \"cmd\":\n entry = await runCmdStep(step, ledger, head)\n break\n case \"prompt\":\n entry = await runPromptStep(step, ledger, head)\n break\n case \"external\":\n entry = await runExternalStep(step, ledger, head)\n break\n case \"oauth\":\n process.stderr.write(\n `${head} ✗ kind=oauth is not yet implemented in the local CLI host. ` +\n `Run the OAuth flow on the host that ships a SECRETS.md driver, then re-invoke.\\n`\n )\n return 1\n }\n } catch (err) {\n process.stderr.write(\n `${head} ✗ failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n await saveLedger(ledgerPath, ledger)\n return 1\n }\n\n if (entry) {\n ledger.steps[step.id] = entry\n // Persist incrementally so a later step's failure doesn't lose\n // earlier successes (avoids re-prompting on next run).\n await saveLedger(ledgerPath, ledger)\n }\n }\n\n process.stdout.write(`agentproto: setup for '${opts.slug}' complete.\\n`)\n return 0\n}\n\n/**\n * `agentproto setup <slug>` — re-run the setup pipeline for an\n * already-installed bundle. Useful when adding new steps to an\n * adapter, fixing a broken step, or after a `--skip-setup` install.\n */\nexport async function runSetupCommand(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n force: { type: \"boolean\", short: \"f\" },\n \"dry-run\": { type: \"boolean\" },\n only: { type: \"string\", multiple: true },\n },\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto setup: missing adapter slug. Try: agentproto setup openclaw\\n\"\n )\n return 2\n }\n const adapter = await resolveAdapter(slug)\n return runSetup({\n slug,\n handle: adapter.handle,\n force: values.force ?? false,\n dryRun: values[\"dry-run\"] ?? false,\n ...(values.only ? { only: values.only } : {}),\n })\n}\n\n// ── Step runners ─────────────────────────────────────────────────────\n\nasync function runCmdStep(\n step: Extract<AgentCliSetupStep, { kind: \"cmd\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n process.stdout.write(`${head} $ ${step.cmd}\\n`)\n const captured = await runShellCapturing(step.cmd, {\n timeoutMs: step.timeout_ms ?? 60_000,\n interactive: step.interactive ?? false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(\n `cmd exited ${captured.exitCode}${captured.stderr ? \": \" + truncate(captured.stderr, 400) : \"\"}`\n )\n }\n // Persist the trimmed stdout when the step asks for it.\n let persistedTo: string | undefined\n if (step.persist) {\n const value = captured.stdout.trim()\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\nasync function runPromptStep(\n step: Extract<AgentCliSetupStep, { kind: \"prompt\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n const type = step.type ?? \"text\"\n\n let value: string\n switch (type) {\n case \"text\":\n case \"secret\":\n value = await promptString(step.prompt, {\n defaultValue: step.default,\n masked: type === \"secret\",\n })\n break\n case \"boolean\":\n value = (await promptBoolean(step.prompt, step.default === \"true\"))\n ? \"true\"\n : \"false\"\n break\n case \"select\": {\n const options = await resolveSelectOptions(step.options)\n if (options.length === 0) {\n throw new Error(\"select prompt has no options to choose from\")\n }\n value = await promptSelect(step.prompt, options, step.default)\n break\n }\n }\n\n let persistedTo: string | undefined\n if (step.persist) {\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\nasync function runExternalStep(\n step: Extract<AgentCliSetupStep, { kind: \"external\" }>,\n ledger: Ledger,\n head: string\n): Promise<LedgerEntry> {\n if (step.description) process.stdout.write(`${head} ${step.description}\\n`)\n process.stdout.write(`${head} opening ${step.url}\\n`)\n const opener =\n platform() === \"darwin\"\n ? \"open\"\n : platform() === \"win32\"\n ? \"cmd\"\n : \"xdg-open\"\n const args = platform() === \"win32\" ? [\"/c\", \"start\", step.url] : [step.url]\n await new Promise<void>((resolve) => {\n const child = spawn(opener, args, { stdio: \"ignore\", detached: true })\n child.once(\"error\", () => resolve()) // best-effort\n child.once(\"spawn\", () => resolve())\n })\n\n // Callback polling (a host-allocated callback URL holding the result)\n // requires a local HTTP listener, which is reasonable in some hosts\n // but overkill for the agentproto CLI in v0.1. For now we fall back\n // to \"paste the result\" when the step declares a callback param;\n // the URL was opened above to start the flow.\n let value = \"\"\n if (step.callback?.param) {\n value = await promptString(\n `Paste the value of '${step.callback.param}' from the redirect`,\n { masked: false }\n )\n } else {\n process.stdout.write(`${head} done — press Enter when finished.\\n`)\n await promptString(\"(press Enter to continue)\", { masked: false })\n }\n\n let persistedTo: string | undefined\n if (step.persist && value) {\n persistedTo = await applyPersist(step.persist, value, ledger)\n }\n return {\n stepId: step.id,\n kind: step.kind,\n completedAt: new Date().toISOString(),\n ...(persistedTo ? { persistedTo } : {}),\n }\n}\n\n// ── skip_if check ────────────────────────────────────────────────────\n\nasync function checkSkipIf(skip: AgentCliSetupSkipIf): Promise<boolean> {\n const expectedCode = skip.exit_code ?? 0\n const captured = await runShellCapturing(skip.cmd, {\n timeoutMs: skip.timeout_ms ?? 5_000,\n interactive: false,\n })\n return captured.exitCode === expectedCode\n}\n\n// ── persist (env / secret_slug / cmd) ────────────────────────────────\n\nasync function applyPersist(\n persist: AgentCliSetupPersist,\n value: string,\n ledger: Ledger\n): Promise<string> {\n if (\"env\" in persist && persist.env) {\n if (!ledger.envValues) ledger.envValues = {}\n ledger.envValues[persist.env] = value\n return `env:${persist.env}`\n }\n if (\"secret_slug\" in persist && persist.secret_slug) {\n // The secrets backend is host-supplied. The local CLI host doesn't\n // ship one yet; we surface the slug so the operator can pipe the\n // value into their vault out-of-band. Recording the slug (NOT the\n // value) in the ledger is intentional — the ledger isn't a vault.\n process.stdout.write(\n `agentproto setup: store the prompted value in your secrets backend under slug '${persist.secret_slug}' ` +\n `(value not echoed; ledger records the slot only).\\n`\n )\n return `secret:${persist.secret_slug}`\n }\n if (\"cmd\" in persist && persist.cmd) {\n const cmd = persist.cmd.replace(/\\$\\{value\\}/g, shellEscape(value))\n const captured = await runShellCapturing(cmd, {\n timeoutMs: 60_000,\n interactive: false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(`persist cmd exited ${captured.exitCode}`)\n }\n return \"cmd\"\n }\n throw new Error(\"persist block must declare exactly one of env / secret_slug / cmd\")\n}\n\n// ── prompt helpers ───────────────────────────────────────────────────\n\nasync function promptString(\n question: string,\n opts: { defaultValue?: string; masked?: boolean }\n): Promise<string> {\n // Node's readline doesn't natively mask; for `masked: true` we set\n // the terminal to no-echo for the duration of the prompt. Best-effort\n // — some non-TTY environments fall back to plain input with a warning.\n const isTty = process.stdin.isTTY ?? false\n const suffix = opts.defaultValue ? ` [${opts.defaultValue}]` : \"\"\n const prompt = `${question}${suffix}: `\n if (opts.masked && !isTty) {\n process.stdout.write(\n `agentproto: stdin is not a TTY — masked input falls back to plain. Avoid piping secrets in non-interactive mode.\\n`\n )\n }\n const rl = createInterface({ input, output, terminal: isTty })\n if (opts.masked && isTty) {\n // Toggle echo off via raw mode.\n process.stdin.setRawMode?.(true)\n let buf = \"\"\n process.stdout.write(prompt)\n return new Promise<string>((resolve) => {\n const onData = (chunk: Buffer) => {\n for (const code of chunk) {\n if (code === 0x0d /* CR */ || code === 0x0a /* LF */) {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode?.(false)\n process.stdout.write(\"\\n\")\n rl.close()\n resolve(buf || opts.defaultValue || \"\")\n return\n }\n if (code === 0x03 /* Ctrl-C */) {\n process.stdin.off(\"data\", onData)\n process.stdin.setRawMode?.(false)\n rl.close()\n process.exit(130)\n }\n if (code === 0x7f /* DEL / backspace */ || code === 0x08) {\n buf = buf.slice(0, -1)\n continue\n }\n buf += String.fromCharCode(code)\n process.stdout.write(\"•\")\n }\n }\n process.stdin.on(\"data\", onData)\n })\n }\n try {\n const ans = (await rl.question(prompt)).trim()\n return ans || opts.defaultValue || \"\"\n } finally {\n rl.close()\n }\n}\n\nasync function promptBoolean(\n question: string,\n defaultYes: boolean\n): Promise<boolean> {\n const def = defaultYes ? \"Y/n\" : \"y/N\"\n const ans = await promptString(`${question} [${def}]`, { masked: false })\n if (!ans) return defaultYes\n return /^y(es)?$/i.test(ans)\n}\n\nasync function promptSelect(\n question: string,\n options: { value: string; label?: string }[],\n defaultValue: string | undefined\n): Promise<string> {\n process.stdout.write(`${question}\\n`)\n for (const [i, o] of options.entries()) {\n const star =\n defaultValue && o.value === defaultValue ? \"*\" : i === 0 ? \" \" : \" \"\n process.stdout.write(\n ` ${star} ${i + 1}) ${o.label ?? o.value}${o.label ? ` (${o.value})` : \"\"}\\n`\n )\n }\n const ans = await promptString(\n `Choose 1-${options.length}`,\n defaultValue ? { defaultValue } : { masked: false }\n )\n // Accept either the numeric index or a literal value.\n const asNum = Number.parseInt(ans, 10)\n if (Number.isFinite(asNum) && asNum >= 1 && asNum <= options.length) {\n return options[asNum - 1]!.value\n }\n const exact = options.find((o) => o.value === ans)\n if (exact) return exact.value\n if (defaultValue && options.some((o) => o.value === defaultValue)) {\n return defaultValue\n }\n throw new Error(\n `invalid selection '${ans}'; expected one of ${options.map((o) => o.value).join(\", \")}`\n )\n}\n\nasync function resolveSelectOptions(\n options: Extract<AgentCliSetupStep, { kind: \"prompt\" }>[\"options\"]\n): Promise<{ value: string; label?: string }[]> {\n if (!options) return []\n if (Array.isArray(options)) {\n return options.map((v) => ({ value: v }))\n }\n // Dynamic options: run the cmd, parse stdout (one option per line,\n // optional `value\\tlabel`).\n const captured = await runShellCapturing(options.cmd, {\n timeoutMs: options.timeout_ms ?? 30_000,\n interactive: false,\n })\n if (captured.exitCode !== 0) {\n throw new Error(\n `select options cmd exited ${captured.exitCode}: ${truncate(captured.stderr, 400)}`\n )\n }\n return captured.stdout\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean)\n .map((line) => {\n const [value, label] = line.split(\"\\t\")\n const out: { value: string; label?: string } = { value: value! }\n if (label) out.label = label\n return out\n })\n}\n\n// ── shell helper ─────────────────────────────────────────────────────\n\nasync function runShellCapturing(\n cmd: string,\n opts: { timeoutMs: number; interactive: boolean }\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n return new Promise((resolve) => {\n const child = spawn(\"bash\", [\"-lc\", cmd], {\n stdio: opts.interactive\n ? \"inherit\"\n : [\"ignore\", \"pipe\", \"pipe\"],\n })\n let stdout = \"\"\n let stderr = \"\"\n child.stdout?.on(\"data\", (c: Buffer) => {\n stdout += c.toString(\"utf8\")\n })\n child.stderr?.on(\"data\", (c: Buffer) => {\n stderr += c.toString(\"utf8\")\n })\n const timer = setTimeout(() => {\n child.kill(\"SIGTERM\")\n setTimeout(() => child.kill(\"SIGKILL\"), 1000)\n }, opts.timeoutMs)\n child.once(\"error\", () => {\n clearTimeout(timer)\n resolve({ exitCode: 127, stdout, stderr: stderr || \"spawn error\" })\n })\n child.once(\"exit\", (code) => {\n clearTimeout(timer)\n resolve({ exitCode: code ?? 0, stdout, stderr })\n })\n })\n}\n\nfunction shellEscape(s: string): string {\n // POSIX-style single-quote escape — wraps in single quotes and\n // closes/reopens around any literal single quote in the value.\n return `'${s.replace(/'/g, `'\"'\"'`)}'`\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length <= max ? s : s.slice(0, max - 3) + \"…\"\n}\n\n// ── ledger ───────────────────────────────────────────────────────────\n\nfunction ledgerPathFor(slug: string): string {\n const base =\n process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n return join(base, \"setup\", `${slug}.json`)\n}\n\nasync function loadLedger(path: string, slug: string): Promise<Ledger> {\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as Ledger\n if (parsed.slug === slug && typeof parsed.steps === \"object\") return parsed\n } catch {\n // No ledger yet, or malformed — start fresh.\n }\n return {\n slug,\n updatedAt: new Date().toISOString(),\n steps: {},\n }\n}\n\nasync function saveLedger(path: string, ledger: Ledger): Promise<void> {\n ledger.updatedAt = new Date().toISOString()\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, JSON.stringify(ledger, null, 2))\n await chmod(path, 0o600).catch(() => {\n // chmod failures on Windows are non-fatal — the file lives in\n // %USERPROFILE% which is already user-private.\n })\n}\n","/**\n * `agentproto install runtime-profile/<name>` — copy a declared file\n * tree from `@agentproto/runtime-profile-<name>` into the user's repo.\n *\n * Source of truth: the profile package's `profile.json` manifest +\n * `files/` tree. The handler is dumb on purpose — it copies declared\n * files with per-entry merge strategies and records what landed in a\n * local ledger so re-runs can be idempotent and detect drift.\n */\n\nimport { readFile, writeFile, mkdir, stat, chmod } from \"node:fs/promises\"\nimport { dirname, resolve as resolvePath, join } from \"node:path\"\nimport { createHash } from \"node:crypto\"\nimport { homedir } from \"node:os\"\nimport { parseArgs } from \"node:util\"\n\ntype Strategy = \"overwrite\" | \"preserve\" | \"merge-json-deep\" | \"append\"\n\ntype ProfileFile = {\n src: string\n dest: string\n strategy: Strategy\n executable?: boolean\n}\n\ntype ProfileManifest = {\n schema: string\n slug: string\n version: string\n name: string\n description: string\n files: ProfileFile[]\n}\n\ntype LedgerEntry = {\n dest: string\n strategy: Strategy\n hashAfter: string\n appliedAt: string\n}\n\ntype Ledger = {\n slug: string\n version: string\n installedAt: string\n updatedAt: string\n files: LedgerEntry[]\n}\n\nexport async function runInstallProfile(\n slug: string,\n args: readonly string[]\n): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n force: { type: \"boolean\", short: \"f\" },\n \"dry-run\": { type: \"boolean\" },\n \"skip-setup\": { type: \"boolean\" },\n cwd: { type: \"string\" },\n package: { type: \"string\" },\n },\n })\n\n if (!slug.startsWith(\"runtime-profile/\")) {\n process.stderr.write(\n `agentproto install: expected slug starting with 'runtime-profile/', got '${slug}'.\\n`\n )\n return 2\n }\n const profileName = slug.slice(\"runtime-profile/\".length)\n if (!/^[a-z][a-z0-9-]*$/.test(profileName)) {\n process.stderr.write(\n `agentproto install: invalid profile name '${profileName}'. Lower-kebab only.\\n`\n )\n return 2\n }\n\n // Resolution order for the backing npm package:\n // 1. Explicit `--package <name>` override.\n // 2. `profileAliases[<slug>]` in `~/.agentproto/config.json`.\n // 3. Default convention: `@agentproto/runtime-profile-<slug>`.\n let packageName: string\n if (typeof values.package === \"string\" && values.package) {\n packageName = values.package\n } else {\n const aliased = await readProfileAlias(profileName)\n packageName = aliased ?? `@agentproto/runtime-profile-${profileName}`\n }\n let mod: Record<string, unknown>\n try {\n mod = (await import(packageName)) as Record<string, unknown>\n } catch (err) {\n const cause = err instanceof Error ? err.message : String(err)\n process.stderr.write(\n `agentproto install: could not load profile package '${packageName}'. Install it first with: npm i -g ${packageName}\\n cause: ${cause}\\n`\n )\n return 1\n }\n const filesDir =\n typeof mod.FILES_DIR === \"string\" ? (mod.FILES_DIR as string) : null\n const loadProfileManifest = mod.loadProfileManifest as\n | (() => Promise<ProfileManifest>)\n | undefined\n if (!filesDir || !loadProfileManifest) {\n process.stderr.write(\n `agentproto install: profile package '${packageName}' does not export FILES_DIR + loadProfileManifest.\\n`\n )\n return 1\n }\n\n const manifest = await loadProfileManifest()\n\n const cwd = values.cwd ? resolvePath(values.cwd) : process.cwd()\n const dryRun = values[\"dry-run\"] === true\n const force = values.force === true\n\n process.stdout.write(\n `agentproto install ${slug} v${manifest.version} → ${cwd}\\n` +\n ` ${manifest.description}\\n`\n )\n\n const ledgerPath = ledgerPathFor(profileName)\n const prevLedger = await loadLedger(ledgerPath)\n\n const newLedger: Ledger = {\n slug,\n version: manifest.version,\n installedAt: prevLedger?.installedAt ?? new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n files: [],\n }\n\n let applied = 0\n let skipped = 0\n let failed = 0\n\n for (const entry of manifest.files) {\n const src = resolvePath(filesDir, entry.src)\n const dest = resolvePath(cwd, entry.dest)\n const prev = prevLedger?.files.find((f) => f.dest === entry.dest) ?? null\n\n try {\n const srcBuf = await readFile(src)\n const result = await applyStrategy({\n strategy: entry.strategy,\n srcBuf,\n dest,\n prev,\n force,\n dryRun,\n })\n newLedger.files.push({\n dest: entry.dest,\n strategy: entry.strategy,\n hashAfter: result.hashAfter,\n appliedAt: result.wrote ? new Date().toISOString() : prev?.appliedAt ?? new Date().toISOString(),\n })\n if (result.wrote) {\n applied += 1\n process.stdout.write(` ${result.action.padEnd(10)} ${entry.dest}\\n`)\n if (entry.executable && !dryRun) {\n await chmod(dest, 0o755)\n }\n } else {\n skipped += 1\n process.stdout.write(` ${result.action.padEnd(10)} ${entry.dest}\\n`)\n }\n } catch (err) {\n failed += 1\n const msg = err instanceof Error ? err.message : String(err)\n process.stderr.write(` FAIL ${entry.dest} — ${msg}\\n`)\n }\n }\n\n if (!dryRun) {\n await saveLedger(ledgerPath, newLedger)\n }\n\n process.stdout.write(\n `agentproto install ${slug}: ${applied} applied, ${skipped} skipped, ${failed} failed${dryRun ? \" (dry-run)\" : \"\"}\\n`\n )\n\n return failed === 0 ? 0 : 1\n}\n\ntype ApplyResult = {\n wrote: boolean\n action: string\n hashAfter: string\n}\n\nasync function applyStrategy(opts: {\n strategy: Strategy\n srcBuf: Buffer\n dest: string\n prev: LedgerEntry | null\n force: boolean\n dryRun: boolean\n}): Promise<ApplyResult> {\n const { strategy, srcBuf, dest, prev, force, dryRun } = opts\n\n const destExists = await fileExists(dest)\n\n if (strategy === \"preserve\") {\n if (destExists) {\n const currentHash = await hashFile(dest)\n return { wrote: false, action: \"preserve\", hashAfter: currentHash }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, srcBuf)\n }\n return { wrote: true, action: \"create\", hashAfter: sha256(srcBuf) }\n }\n\n if (strategy === \"overwrite\") {\n const srcHash = sha256(srcBuf)\n if (destExists && !force) {\n const destHash = await hashFile(dest)\n if (destHash === srcHash) {\n return { wrote: false, action: \"unchanged\", hashAfter: destHash }\n }\n if (prev && prev.hashAfter !== destHash) {\n // The user edited this file after our last install. Don't\n // clobber without --force.\n return {\n wrote: false,\n action: \"user-edit\",\n hashAfter: destHash,\n }\n }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, srcBuf)\n }\n return {\n wrote: true,\n action: destExists ? \"update\" : \"create\",\n hashAfter: srcHash,\n }\n }\n\n if (strategy === \"merge-json-deep\") {\n const srcJson = parseJsonOrThrow(srcBuf.toString(\"utf8\"), \"src\")\n let merged: unknown = srcJson\n if (destExists) {\n const destRaw = await readFile(dest, \"utf8\")\n const destJson = parseJsonOrThrow(destRaw, \"dest\")\n merged = deepMerge(destJson, srcJson)\n }\n const out = `${JSON.stringify(merged, null, 2)}\\n`\n const outBuf = Buffer.from(out, \"utf8\")\n const outHash = sha256(outBuf)\n if (destExists) {\n const destHash = await hashFile(dest)\n if (destHash === outHash) {\n return { wrote: false, action: \"unchanged\", hashAfter: destHash }\n }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, outBuf)\n }\n return {\n wrote: true,\n action: destExists ? \"merge\" : \"create\",\n hashAfter: outHash,\n }\n }\n\n if (strategy === \"append\") {\n const srcText = srcBuf.toString(\"utf8\")\n if (destExists) {\n const destText = await readFile(dest, \"utf8\")\n if (destText.includes(srcText)) {\n return {\n wrote: false,\n action: \"unchanged\",\n hashAfter: sha256(Buffer.from(destText, \"utf8\")),\n }\n }\n const out = `${destText.endsWith(\"\\n\") ? destText : `${destText}\\n`}${srcText}`\n const outBuf = Buffer.from(out, \"utf8\")\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, outBuf)\n }\n return { wrote: true, action: \"append\", hashAfter: sha256(outBuf) }\n }\n if (!dryRun) {\n await ensureDir(dirname(dest))\n await writeFile(dest, srcBuf)\n }\n return { wrote: true, action: \"create\", hashAfter: sha256(srcBuf) }\n }\n\n throw new Error(`Unknown strategy: ${strategy}`)\n}\n\nfunction deepMerge(target: unknown, source: unknown): unknown {\n if (\n target &&\n source &&\n typeof target === \"object\" &&\n typeof source === \"object\" &&\n !Array.isArray(target) &&\n !Array.isArray(source)\n ) {\n const out: Record<string, unknown> = { ...(target as Record<string, unknown>) }\n for (const [k, v] of Object.entries(source as Record<string, unknown>)) {\n out[k] = deepMerge((target as Record<string, unknown>)[k], v)\n }\n return out\n }\n if (Array.isArray(target) && Array.isArray(source)) {\n // Concat + dedup-by-JSON. Cheap and safe for hook arrays and\n // permission lists (which are the realistic merge targets).\n const seen = new Set<string>()\n const out: unknown[] = []\n for (const item of [...target, ...source]) {\n const key = JSON.stringify(item)\n if (seen.has(key)) continue\n seen.add(key)\n out.push(item)\n }\n return out\n }\n return source ?? target\n}\n\nfunction parseJsonOrThrow(raw: string, side: \"src\" | \"dest\"): unknown {\n try {\n return JSON.parse(raw)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(`merge-json-deep ${side} not valid JSON: ${msg}`)\n }\n}\n\nfunction sha256(buf: Buffer): string {\n return createHash(\"sha256\").update(buf).digest(\"hex\")\n}\n\nasync function hashFile(path: string): Promise<string> {\n const buf = await readFile(path)\n return sha256(buf)\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n}\n\nasync function ensureDir(dir: string): Promise<void> {\n try {\n await stat(dir)\n } catch {\n await mkdir(dir, { recursive: true })\n }\n}\n\nfunction ledgerPathFor(profileName: string): string {\n return join(homedir(), \".agentproto\", \"profiles\", `${profileName}.json`)\n}\n\nasync function loadLedger(path: string): Promise<Ledger | null> {\n try {\n const raw = await readFile(path, \"utf8\")\n return JSON.parse(raw) as Ledger\n } catch {\n return null\n }\n}\n\nasync function saveLedger(path: string, ledger: Ledger): Promise<void> {\n await ensureDir(dirname(path))\n await writeFile(path, `${JSON.stringify(ledger, null, 2)}\\n`)\n}\n\n/**\n * Look up a profile-slug → npm-package alias in\n * `~/.agentproto/config.json` (or `$AGENTPROTO_HOME/config.json`).\n *\n * { \"profileAliases\": { \"guilde\": \"@guilde/runtime-profile-guilde\" } }\n *\n * Returns the resolved package name, or `null` if no alias is set.\n */\nasync function readProfileAlias(profileName: string): Promise<string | null> {\n const base =\n process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n const path = join(base, \"config.json\")\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as {\n profileAliases?: Record<string, string>\n }\n const aliased = parsed.profileAliases?.[profileName]\n return typeof aliased === \"string\" ? aliased : null\n } catch {\n return null\n }\n}\n","/**\n * `agentproto install <slug>`\n *\n * Reads the adapter manifest's `install` block and shells out to the\n * declared package manager. Idempotent: if `version_check` passes, we\n * skip and report \"already installed\" (override with --force).\n *\n * The adapter package itself must already be in node_modules (we resolve\n * it before reading its manifest). Bootstrapping the adapter package is\n * a separate concern — `npm i -g @agentproto/adapter-<slug>` first.\n *\n * Method support matrix:\n * - `npm` ✓\n * - `brew` ✓ (macOS / Linux Homebrew)\n * - `curl` ✓ (with optional verify_sha256)\n * - `download` ✓ (tarball/zip + extract_bin + optional verify_sha256)\n * - `pip` ✓ (with optional `user: true`)\n * - `cargo` ✓\n * - `go` ✓\n * - `apt/dnf/pacman` ✗ (privilege escalation needs explicit sudo policy)\n * - `choco/scoop` ✗ (Windows-only; not yet platform-detected)\n * - `vendored` ✗ (workspace-relative; needs a workspace root)\n *\n * After install, runs the optional `setup[]` pipeline (AIP-29 § Setup).\n */\n\nimport { spawn } from \"node:child_process\"\nimport { createHash } from \"node:crypto\"\nimport { mkdir, mkdtemp, rm, writeFile, chmod } from \"node:fs/promises\"\nimport { tmpdir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport type { AgentCliInstallMethod } from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\nimport { runSetup } from \"./setup.js\"\nimport { runInstallProfile } from \"./install-profile.js\"\n\nexport async function runInstall(args: readonly string[]): Promise<number> {\n // Peek at the slug before parseArgs — it influences which option set is\n // valid. Adapter slugs and runtime-profile/* slugs share the verb but\n // route through separate handlers with different flags.\n const slugPeek = args.find((a) => !a.startsWith(\"-\"))\n if (slugPeek?.startsWith(\"runtime-profile/\")) {\n return runInstallProfile(\n slugPeek,\n args.filter((a) => a !== slugPeek)\n )\n }\n\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n force: { type: \"boolean\", short: \"f\" },\n \"dry-run\": { type: \"boolean\" },\n \"skip-setup\": { type: \"boolean\" },\n },\n })\n\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto install: missing adapter slug. Try: agentproto install claude-code\\n\"\n )\n return 2\n }\n\n const adapter = await resolveAdapter(slug)\n const installSteps: AgentCliInstallMethod[] = adapter.handle.install ?? []\n if (installSteps.length === 0) {\n process.stderr.write(\n `agentproto install: adapter '${slug}' declares no install steps.\\n`\n )\n return 0\n }\n\n let alreadyInstalled = false\n if (!values.force) {\n const checked = await runVersionCheck(adapter.handle.version_check)\n if (checked.ok) {\n process.stdout.write(\n `agentproto: '${slug}' already installed (${checked.message}). Pass --force to reinstall.\\n`\n )\n alreadyInstalled = true\n }\n }\n\n if (!alreadyInstalled) {\n let lastFailure: { step: AgentCliInstallMethod; code: number } | null = null\n let succeeded = false\n for (const [i, step] of installSteps.entries()) {\n // Spec: hosts try install methods *in order until one succeeds*.\n // Pre-this-fix the runner aborted on the first failure, which made\n // the curl-fallback pattern in opencode/openclaw unreachable\n // whenever npm wasn't viable. Now we collect failures and only\n // surface the last one if every method falls through.\n if (step.experimental) {\n process.stdout.write(\n `agentproto install [${i + 1}/${installSteps.length}] ${describeStep(step)} (experimental — skipping)\\n`\n )\n continue\n }\n process.stdout.write(\n `agentproto install [${i + 1}/${installSteps.length}] ${describeStep(step)}\\n`\n )\n if (values[\"dry-run\"]) {\n succeeded = true\n continue\n }\n const code = await runStep(step)\n if (code === 0) {\n succeeded = true\n break\n }\n lastFailure = { step, code }\n process.stdout.write(\n `agentproto install: method '${step.method}' returned ${code}; trying next.\\n`\n )\n }\n if (!succeeded && lastFailure) {\n process.stderr.write(\n `agentproto install: all ${installSteps.length} install methods failed. Last failure: ${lastFailure.step.method} → exit ${lastFailure.code}.\\n`\n )\n return lastFailure.code\n }\n if (!succeeded && !lastFailure) {\n // Every method was experimental/skipped.\n process.stderr.write(\n `agentproto install: no usable install method found for '${slug}'.\\n`\n )\n return 1\n }\n process.stdout.write(`agentproto: '${slug}' installed.\\n`)\n }\n\n // Run the AIP-29 § Setup pipeline (post-install configuration). Skipped\n // when --skip-setup is passed or the manifest declares no setup. The\n // setup engine is idempotent — already-satisfied steps short-circuit\n // via skip_if; previously-completed steps short-circuit via the ledger.\n if (!values[\"skip-setup\"] && (adapter.handle.setup?.length ?? 0) > 0) {\n process.stdout.write(`agentproto: running setup for '${slug}'…\\n`)\n const setupCode = await runSetup({\n slug,\n handle: adapter.handle,\n force: values.force ?? false,\n dryRun: values[\"dry-run\"] ?? false,\n })\n if (setupCode !== 0) return setupCode\n }\n\n return 0\n}\n\nfunction describeStep(step: AgentCliInstallMethod): string {\n switch (step.method) {\n case \"npm\":\n return `npm install ${step.global ? \"-g \" : \"\"}${step.package ?? \"(?)\"}`\n case \"brew\":\n return `brew install ${step.package ?? \"(?)\"}`\n case \"pip\":\n return `pip install ${step.user ? \"--user \" : \"\"}${step.package ?? \"(?)\"}`\n case \"cargo\":\n return `cargo install ${step.package ?? \"(?)\"}`\n case \"go\":\n return `go install ${step.package ?? \"(?)\"}`\n case \"curl\":\n return `curl ${step.url ?? \"(?)\"} | bash`\n case \"download\":\n return `download ${step.url ?? \"(?)\"} → ${step.extract_bin ?? \"(?)\"}`\n default:\n return `${step.method} ${step.package ?? step.url ?? step.path ?? \"(?)\"}`\n }\n}\n\nasync function runStep(step: AgentCliInstallMethod): Promise<number> {\n switch (step.method) {\n case \"npm\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: npm step missing package.\\n\")\n return 2\n }\n const argv = [\"install\"]\n if (step.global) argv.push(\"-g\")\n argv.push(step.package)\n return spawnInherit(\"npm\", argv)\n }\n case \"brew\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: brew step missing package.\\n\")\n return 2\n }\n // Namespaced packages (e.g. `stripe/stripe-cli/stripe`) need an\n // implicit `brew tap`; `brew install` accepts the fully-qualified\n // form, so we pass it through verbatim. Bare names work too.\n return spawnInherit(\"brew\", [\"install\", step.package])\n }\n case \"pip\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: pip step missing package.\\n\")\n return 2\n }\n const argv = [\"install\"]\n if (step.user) argv.push(\"--user\")\n argv.push(step.package)\n // Prefer pip3 when it exists; fall back to pip. We just call `pip`\n // here because the user's PATH ordering is the right authority.\n return spawnInherit(\"pip\", argv)\n }\n case \"cargo\": {\n if (!step.package) {\n process.stderr.write(\n \"agentproto install: cargo step missing package.\\n\"\n )\n return 2\n }\n return spawnInherit(\"cargo\", [\"install\", step.package])\n }\n case \"go\": {\n if (!step.package) {\n process.stderr.write(\"agentproto install: go step missing package.\\n\")\n return 2\n }\n return spawnInherit(\"go\", [\"install\", step.package])\n }\n case \"curl\": {\n if (!step.url) {\n process.stderr.write(\"agentproto install: curl step missing url.\\n\")\n return 2\n }\n return runCurlInstaller(step.url, step.verify_sha256)\n }\n case \"download\": {\n if (!step.url || !step.extract_bin) {\n process.stderr.write(\n \"agentproto install: download step missing url or extract_bin.\\n\"\n )\n return 2\n }\n return runDownloadInstaller({\n url: step.url,\n extractBin: step.extract_bin,\n verifySha256: step.verify_sha256,\n })\n }\n default:\n process.stderr.write(\n `agentproto install: method '${step.method}' not yet implemented in this CLI version. ` +\n `Run it manually for now (see the adapter's docs).\\n`\n )\n return 1\n }\n}\n\n/**\n * `curl <url> | bash` with optional SHA-256 verification of the\n * installer script *before* executing it. Spec posture (AIP-29 §\n * Install methods → §curl): hosts SHOULD refuse curl-style installers\n * without a verify_sha256 in production. We surface a warning when\n * one is missing but still execute — the agentproto CLI runs in\n * developer / first-run contexts where the trade-off is acceptable.\n */\nasync function runCurlInstaller(\n url: string,\n verifySha256?: string\n): Promise<number> {\n if (!verifySha256) {\n process.stdout.write(\n `agentproto install: curl ${url} (⚠ no verify_sha256 declared — installer integrity not verified)\\n`\n )\n }\n const dir = await mkdtemp(join(tmpdir(), \"agentproto-curl-\"))\n const scriptPath = join(dir, \"install.sh\")\n try {\n const res = await fetch(url, { redirect: \"follow\" })\n if (!res.ok) {\n process.stderr.write(\n `agentproto install: curl fetch failed: ${res.status} ${res.statusText}\\n`\n )\n return res.status\n }\n const buf = Buffer.from(await res.arrayBuffer())\n if (verifySha256) {\n const got = createHash(\"sha256\").update(buf).digest(\"hex\")\n if (got !== verifySha256.toLowerCase()) {\n process.stderr.write(\n `agentproto install: SHA-256 mismatch for ${url}\\n expected: ${verifySha256}\\n got: ${got}\\n`\n )\n return 4\n }\n process.stdout.write(\n `agentproto install: SHA-256 verified (${got.slice(0, 16)}…)\\n`\n )\n }\n await writeFile(scriptPath, buf)\n await chmod(scriptPath, 0o755)\n return spawnInherit(\"bash\", [scriptPath])\n } catch (err) {\n process.stderr.write(\n `agentproto install: curl install failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {})\n }\n}\n\n/**\n * Download an archive, optionally verify SHA-256, extract the binary\n * named in `extract_bin`, drop it into `~/.local/bin/<id>` (or the\n * AGENTPROTO_BIN_DIR override), and chmod +x. Supports tar.gz, tgz,\n * zip via the host's `tar` and `unzip`. The CLI doesn't decide the\n * binary's final name — `extract_bin`'s basename becomes the symlink\n * name on PATH.\n */\nasync function runDownloadInstaller(opts: {\n url: string\n extractBin: string\n verifySha256?: string\n}): Promise<number> {\n const dir = await mkdtemp(join(tmpdir(), \"agentproto-dl-\"))\n try {\n const filename = opts.url.split(\"/\").pop() || \"archive.bin\"\n const archivePath = join(dir, filename)\n const res = await fetch(opts.url, { redirect: \"follow\" })\n if (!res.ok) {\n process.stderr.write(\n `agentproto install: download fetch failed: ${res.status} ${res.statusText}\\n`\n )\n return res.status\n }\n const buf = Buffer.from(await res.arrayBuffer())\n if (opts.verifySha256) {\n const got = createHash(\"sha256\").update(buf).digest(\"hex\")\n if (got !== opts.verifySha256.toLowerCase()) {\n process.stderr.write(\n `agentproto install: SHA-256 mismatch\\n expected: ${opts.verifySha256}\\n got: ${got}\\n`\n )\n return 4\n }\n }\n await writeFile(archivePath, buf)\n\n const extractDir = join(dir, \"extract\")\n await mkdir(extractDir, { recursive: true })\n let extractCode: number\n if (\n filename.endsWith(\".tar.gz\") ||\n filename.endsWith(\".tgz\") ||\n filename.endsWith(\".tar\")\n ) {\n extractCode = await spawnInherit(\"tar\", [\n \"-xf\",\n archivePath,\n \"-C\",\n extractDir,\n ])\n } else if (filename.endsWith(\".zip\")) {\n extractCode = await spawnInherit(\"unzip\", [\n \"-q\",\n archivePath,\n \"-d\",\n extractDir,\n ])\n } else {\n process.stderr.write(\n `agentproto install: unsupported archive format for ${filename}. ` +\n `Supported: .tar, .tar.gz, .tgz, .zip.\\n`\n )\n return 5\n }\n if (extractCode !== 0) return extractCode\n\n const srcBin = join(extractDir, opts.extractBin)\n const binDir =\n process.env[\"AGENTPROTO_BIN_DIR\"] ?? join(homedir(), \".local\", \"bin\")\n await mkdir(binDir, { recursive: true })\n const destBin = join(binDir, opts.extractBin.split(\"/\").pop()!)\n // Use cp -p to preserve mode bits then chmod +x to be safe.\n const cpCode = await spawnInherit(\"cp\", [\"-p\", srcBin, destBin])\n if (cpCode !== 0) return cpCode\n await chmod(destBin, 0o755)\n process.stdout.write(`agentproto install: ${destBin}\\n`)\n if (!process.env[\"PATH\"]?.includes(binDir)) {\n process.stdout.write(\n `agentproto install: ⚠ ${binDir} is not on PATH — add it to your shell profile so the binary is reachable.\\n`\n )\n }\n return 0\n } catch (err) {\n process.stderr.write(\n `agentproto install: download failed: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {})\n }\n}\n\nfunction homedir(): string {\n return process.env[\"HOME\"] ?? process.env[\"USERPROFILE\"] ?? \"/\"\n}\n\nfunction spawnInherit(cmd: string, argv: string[]): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, argv, { stdio: \"inherit\" })\n child.once(\"error\", reject)\n child.once(\"exit\", (code) => resolve(code ?? 0))\n })\n}\n\nasync function runVersionCheck(\n check: Awaited<\n ReturnType<typeof resolveAdapter>\n >[\"handle\"][\"version_check\"]\n): Promise<{ ok: boolean; message: string }> {\n if (!check) return { ok: false, message: \"no version_check declared\" }\n return new Promise((resolve) => {\n const child = spawn(\"bash\", [\"-lc\", check.cmd], {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n let buf = \"\"\n child.stdout.on(\"data\", (c: Buffer) => {\n buf += c.toString(\"utf8\")\n })\n child.once(\"error\", () => resolve({ ok: false, message: \"check failed\" }))\n child.once(\"exit\", (code) => {\n if (code !== 0) {\n resolve({ ok: false, message: `check exited ${code}` })\n return\n }\n const re = new RegExp(check.parse)\n const m = buf.match(re)\n if (!m || !m[1]) {\n resolve({ ok: false, message: \"could not parse version\" })\n return\n }\n // semver-range matching is left to a future helper; we report\n // the captured version and trust it. --force remains the\n // escape hatch when range gating actually matters.\n resolve({ ok: true, message: `version ${m[1]}` })\n })\n })\n}\n","/**\n * Plugin manifest — `agentproto/plugin/v1`.\n *\n * Plugins declare what they provide in either:\n * - their `package.json` under the `agentproto` key, OR\n * - a standalone `agentproto.json` next to their `package.json`.\n *\n * The CLI reads this manifest, dynamic-imports each adapter entry,\n * and registers it with the runtime registry. Plugins don't need\n * side-effect imports any more — they just export their factory\n * functions and let the manifest do the wiring.\n *\n * Example (in @guilde/agentproto-bridge's package.json):\n *\n * {\n * \"name\": \"@guilde/agentproto-bridge\",\n * \"agentproto\": {\n * \"schema\": \"agentproto/plugin/v1\",\n * \"substrates\": [\n * {\n * \"kind\": \"guilde-mcp\",\n * \"entry\": \"./dist/index.mjs\",\n * \"export\": \"guildeMcpSubstrateFactory\",\n * \"capabilities\": [\"mentions\", \"reactions\", \"identity\"],\n * \"description\": \"Reads/writes turns through Guilde's MCP server.\"\n * }\n * ],\n * \"executors\": [\n * {\n * \"kind\": \"db-operator\",\n * \"entry\": \"./dist/index.mjs\",\n * \"export\": \"dbOperatorExecutorFactory\",\n * \"description\": \"Delegates to Mastra operators via run_operator.\"\n * }\n * ]\n * }\n * }\n */\n\nimport { z } from \"zod\"\n\nexport const PLUGIN_MANIFEST_SCHEMA = \"agentproto/plugin/v1\" as const\n\nconst AdapterEntrySchema = z\n .object({\n /** The `kind` string the manifest's substrate/dispatcher/etc. block uses. */\n kind: z.string().min(1),\n /**\n * Path to the entry module, relative to the plugin package root.\n * Resolved via the plugin's `package.json#main`/`exports` (i.e. you\n * can use a subpath like `./dist/substrates.mjs` or an export name\n * like `.` if the plugin re-exports everything from its root).\n */\n entry: z.string().min(1),\n /** Named export inside `entry` — the factory function. */\n export: z.string().min(1),\n /** Free-form description; shown by `agentproto plugins show`. */\n description: z.string().optional(),\n })\n .loose()\n\nconst SubstrateEntrySchema = AdapterEntrySchema.extend({\n /**\n * Free-form capability tags. Not gated by the kernel yet, but\n * surfaced by `agentproto plugins show` so users can see what the\n * substrate claims to support (mentions, reactions, visibility, …).\n */\n capabilities: z.array(z.string()).optional(),\n})\n\nexport const PluginManifestSchema = z\n .object({\n schema: z.literal(PLUGIN_MANIFEST_SCHEMA),\n substrates: z.array(SubstrateEntrySchema).default([]),\n dispatchers: z.array(AdapterEntrySchema).default([]),\n executors: z.array(AdapterEntrySchema).default([]),\n stateStores: z.array(AdapterEntrySchema).default([]),\n })\n .loose()\n\nexport type PluginManifest = z.infer<typeof PluginManifestSchema>\nexport type AdapterEntry = z.infer<typeof AdapterEntrySchema>\nexport type SubstrateEntry = z.infer<typeof SubstrateEntrySchema>\n","/**\n * MultiAgentRuntime adapter registry — the seam third-party packages\n * use to plug substrates, dispatchers, participant executors, and\n * state stores into `agentproto run-swarm` without forking the CLI.\n *\n * A plugin module exports nothing required by name — it just imports\n * `register*` helpers from `@agentproto/cli/registry/runtime` and\n * calls them at module load. The CLI discovers plugins via:\n *\n * 1. `--plugin <module-id>` flags on `run-swarm`\n * 2. The `plugins[]` array in `~/.agentproto/config.json`\n * 3. Auto-registered built-ins (file substrate, mention dispatcher,\n * fs state, agent-cli participant) — registered by\n * `registerBuiltins()` at startup.\n *\n * Manifest `kind` strings are resolved through the registry: the kind\n * is the lookup key; the factory builds the concrete adapter from the\n * (loose) manifest config + shared context.\n */\n\nimport type {\n Dispatcher,\n ParticipantExecutor,\n StateStore,\n Substrate,\n} from \"@agentproto/agent-runtime\"\n\n// ── Context passed to every factory ──\n\n/**\n * Shared context every factory receives. Carries the manifest's base\n * directory (for resolving relative paths declared in adapter configs)\n * and a `cleanup` collector so adapters that hold disposable resources\n * (MCP clients, sockets, child processes) can register teardown callbacks\n * that the CLI runs on shutdown.\n */\nexport interface AdapterContext {\n /** Absolute directory of the manifest file. */\n readonly baseDir: string\n /** Register a teardown callback to run when the swarm shuts down. */\n registerCleanup(fn: () => Promise<void> | void): void\n}\n\n// ── Loose config shape ──\n\n/**\n * Manifest adapter blocks are loose: `{ kind: string, ...host-extension }`.\n * Each factory pulls its own typed fields off the config and validates\n * them inline.\n */\nexport interface AdapterConfig {\n readonly kind: string\n readonly [extension: string]: unknown\n}\n\n// ── Factory signatures ──\n\nexport type SubstrateFactory = (\n config: AdapterConfig,\n ctx: AdapterContext\n) => Promise<Substrate> | Substrate\n\nexport type DispatcherFactory = (\n config: AdapterConfig,\n ctx: AdapterContext\n) => Promise<Dispatcher> | Dispatcher\n\nexport type ExecutorFactory = (\n config: AdapterConfig,\n ctx: AdapterContext\n) => Promise<ParticipantExecutor> | ParticipantExecutor\n\nexport type StateStoreFactory = (\n config: AdapterConfig,\n ctx: AdapterContext\n) => Promise<StateStore> | StateStore\n\n// ── Registry state ──\n\nconst substrates = new Map<string, SubstrateFactory>()\nconst dispatchers = new Map<string, DispatcherFactory>()\nconst executors = new Map<string, ExecutorFactory>()\nconst stateStores = new Map<string, StateStoreFactory>()\n\n// ── Public registration API ──\n\nexport function registerSubstrate(kind: string, factory: SubstrateFactory): void {\n substrates.set(kind, factory)\n}\n\nexport function registerDispatcher(\n kind: string,\n factory: DispatcherFactory\n): void {\n dispatchers.set(kind, factory)\n}\n\nexport function registerExecutor(kind: string, factory: ExecutorFactory): void {\n executors.set(kind, factory)\n}\n\nexport function registerStateStore(\n kind: string,\n factory: StateStoreFactory\n): void {\n stateStores.set(kind, factory)\n}\n\n// ── Lookup API (used by run-swarm wiring) ──\n\nexport function getSubstrateFactory(kind: string): SubstrateFactory | undefined {\n return substrates.get(kind)\n}\n\nexport function getDispatcherFactory(\n kind: string\n): DispatcherFactory | undefined {\n return dispatchers.get(kind)\n}\n\nexport function getExecutorFactory(kind: string): ExecutorFactory | undefined {\n return executors.get(kind)\n}\n\nexport function getStateStoreFactory(\n kind: string\n): StateStoreFactory | undefined {\n return stateStores.get(kind)\n}\n\nexport function listRegisteredKinds(): {\n substrates: readonly string[]\n dispatchers: readonly string[]\n executors: readonly string[]\n stateStores: readonly string[]\n} {\n return {\n substrates: [...substrates.keys()],\n dispatchers: [...dispatchers.keys()],\n executors: [...executors.keys()],\n stateStores: [...stateStores.keys()],\n }\n}\n\n/**\n * Test-only: drop every registration. Plugin registrations persist for\n * the lifetime of the process, so tests that load + unload plugins use\n * this to start from a clean slate.\n */\nexport function _resetRegistryForTests(): void {\n substrates.clear()\n dispatchers.clear()\n executors.clear()\n stateStores.clear()\n}\n","/**\n * Manifest-based plugin wiring.\n *\n * Given a plugin package id, locate its plugin manifest, validate it,\n * and register every declared adapter (substrate, dispatcher,\n * executor, state store) with the runtime registry. The plugin\n * doesn't need to call register* itself — the manifest declares what\n * it provides, this loader handles the wiring.\n *\n * Discovery order, per plugin:\n * 1. `<package-root>/agentproto.json`\n * 2. `<package-root>/package.json` → `.agentproto` block\n *\n * Returns the manifest (so callers like `agentproto plugins show` can\n * print it) or `null` if neither location declares one. A `null`\n * return is not an error — the caller may fall back to side-effect\n * imports for legacy plugins.\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport { dirname, join } from \"node:path\"\nimport { createRequire } from \"node:module\"\nimport { pathToFileURL } from \"node:url\"\nimport {\n PluginManifestSchema,\n type PluginManifest,\n} from \"./manifest.js\"\nimport {\n registerDispatcher,\n registerExecutor,\n registerStateStore,\n registerSubstrate,\n type DispatcherFactory,\n type ExecutorFactory,\n type StateStoreFactory,\n type SubstrateFactory,\n} from \"./runtime.js\"\n\n/**\n * Load and register every adapter declared in a plugin's manifest.\n * Returns the manifest on success, `null` if the plugin doesn't ship\n * one (so the caller can fall back to side-effect import).\n */\nexport async function loadPluginFromManifest(\n pluginId: string\n): Promise<PluginManifest | null> {\n const result = await readPluginManifest(pluginId)\n if (!result) return null\n const { manifest, packageRoot } = result\n\n for (const sub of manifest.substrates) {\n const factory = await importFactory<SubstrateFactory>(\n packageRoot,\n pluginId,\n sub.entry,\n sub.export\n )\n registerSubstrate(sub.kind, factory)\n }\n for (const dis of manifest.dispatchers) {\n const factory = await importFactory<DispatcherFactory>(\n packageRoot,\n pluginId,\n dis.entry,\n dis.export\n )\n registerDispatcher(dis.kind, factory)\n }\n for (const exe of manifest.executors) {\n const factory = await importFactory<ExecutorFactory>(\n packageRoot,\n pluginId,\n exe.entry,\n exe.export\n )\n registerExecutor(exe.kind, factory)\n }\n for (const st of manifest.stateStores) {\n const factory = await importFactory<StateStoreFactory>(\n packageRoot,\n pluginId,\n st.entry,\n st.export\n )\n registerStateStore(st.kind, factory)\n }\n\n return manifest\n}\n\n/**\n * Read + validate a plugin's manifest without registering anything.\n * Used by `agentproto plugins show` to introspect installed plugins.\n */\nexport async function readPluginManifest(\n pluginId: string\n): Promise<{ manifest: PluginManifest; packageRoot: string } | null> {\n const packageJsonPath = resolvePluginPackageJson(pluginId)\n if (!packageJsonPath) return null\n\n const packageRoot = dirname(packageJsonPath)\n\n // 1. Try standalone agentproto.json first.\n const standalonePath = join(packageRoot, \"agentproto.json\")\n const standalone = await readJsonIfExists(standalonePath)\n if (standalone !== undefined) {\n return {\n manifest: PluginManifestSchema.parse(standalone),\n packageRoot,\n }\n }\n\n // 2. Fall back to package.json#agentproto.\n const pkgJson = (await readJsonIfExists(packageJsonPath)) as\n | { agentproto?: unknown }\n | undefined\n if (pkgJson && typeof pkgJson === \"object\" && pkgJson.agentproto) {\n return {\n manifest: PluginManifestSchema.parse(pkgJson.agentproto),\n packageRoot,\n }\n }\n\n return null\n}\n\nasync function importFactory<TFactory>(\n packageRoot: string,\n pluginId: string,\n entry: string,\n exportName: string\n): Promise<TFactory> {\n // Resolve the entry path relative to the package root. We dynamic-\n // import via file:// URL so an absolute path works without going\n // through Node's package resolver (which would need the export to\n // be declared in `exports`).\n const abs = entry.startsWith(\".\") ? join(packageRoot, entry) : entry\n const url = entry.startsWith(\".\") ? pathToFileURL(abs).href : entry\n const mod = (await import(url)) as Record<string, unknown>\n const exported = mod[exportName]\n if (typeof exported !== \"function\") {\n throw new Error(\n `agentproto plugin '${pluginId}': manifest entry '${entry}' has no callable export '${exportName}' (got ${typeof exported}).`\n )\n }\n return exported as TFactory\n}\n\nfunction resolvePluginPackageJson(pluginId: string): string | null {\n // Try the cli's own resolution first (global install + monorepo\n // workspace deps), then the user's cwd (locally-installed plugins).\n // `require.resolve` needs `createRequire` since we're an ESM bundle.\n const candidates = [\n import.meta.url,\n pathToFileURL(join(process.cwd(), \"package.json\")).href,\n ]\n for (const root of candidates) {\n try {\n return createRequire(root).resolve(`${pluginId}/package.json`)\n } catch {\n // try next root\n }\n }\n return null\n}\n\nasync function readJsonIfExists(path: string): Promise<unknown> {\n try {\n const raw = await readFile(path, \"utf8\")\n return JSON.parse(raw)\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return undefined\n throw err\n }\n}\n","/**\n * `agentproto plugins <subverb>` — manage runtime plugins.\n *\n * plugins list Show enabled plugins + what they provide\n * plugins show <pkg> Print a plugin's manifest summary\n * plugins install <pkg> `npm i -g <pkg>` + add to config\n * plugins uninstall <pkg> Remove from config (+ optional npm rm)\n * plugins enable <pkg> Add to config (assumes installed)\n * plugins disable <pkg> Remove from config (keep installed)\n *\n * Plugin list lives in `~/.agentproto/config.json`:\n *\n * { \"plugins\": [\"@guilde/agentproto-bridge\", \"@acme/agentproto-slack\"] }\n *\n * Plugins are loaded by `agentproto run-swarm` in the order they\n * appear. Last one to register a `kind` wins — useful for overriding\n * a built-in or another plugin's adapter.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { dirname, join } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport { readPluginManifest } from \"../registry/manifest-loader.js\"\nimport type {\n AdapterEntry,\n PluginManifest,\n SubstrateEntry,\n} from \"../registry/manifest.js\"\n\nconst USAGE = `agentproto plugins — manage runtime plugins\n\nUsage:\n agentproto plugins list Show enabled plugins + adapters\n agentproto plugins show <pkg> Print a plugin's manifest\n agentproto plugins install <pkg> npm i -g + add to config\n agentproto plugins uninstall <pkg> Remove from config (+ npm rm)\n agentproto plugins enable <pkg> Add to config (assume installed)\n agentproto plugins disable <pkg> Remove from config (keep installed)\n agentproto plugins --help\n\nPlugin list lives in ~/.agentproto/config.json under \\`plugins[]\\`.\n`\n\nexport async function runPlugins(args: readonly string[]): Promise<number> {\n const sub = args[0]\n const rest = args.slice(1)\n switch (sub) {\n case undefined:\n case \"-h\":\n case \"--help\":\n process.stdout.write(USAGE)\n return 0\n case \"list\":\n return runList(rest)\n case \"show\":\n return runShow(rest)\n case \"install\":\n return runInstall(rest)\n case \"uninstall\":\n return runUninstall(rest)\n case \"enable\":\n return runEnable(rest)\n case \"disable\":\n return runDisable(rest)\n default:\n process.stderr.write(\n `agentproto plugins: unknown subcommand '${sub}'.\\n\\n${USAGE}`\n )\n return 2\n }\n}\n\n// ── list ──────────────────────────────────────────────────────────────\n\nasync function runList(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n options: { json: { type: \"boolean\" } },\n strict: true,\n })\n const cfg = await loadConfig()\n const plugins = cfg.plugins ?? []\n if (plugins.length === 0) {\n if (values.json) process.stdout.write(\"[]\\n\")\n else\n process.stdout.write(\n \"agentproto plugins: no plugins enabled. Try `agentproto plugins install <pkg>`.\\n\"\n )\n return 0\n }\n\n const entries: Array<{\n id: string\n manifest: PluginManifest | null\n error?: string\n }> = []\n for (const id of plugins) {\n try {\n const result = await readPluginManifest(id)\n entries.push({ id, manifest: result?.manifest ?? null })\n } catch (err) {\n entries.push({\n id,\n manifest: null,\n error: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n if (values.json) {\n process.stdout.write(`${JSON.stringify(entries, null, 2)}\\n`)\n return 0\n }\n\n for (const e of entries) {\n process.stdout.write(`• ${e.id}\\n`)\n if (e.error) {\n process.stdout.write(` error: ${e.error}\\n`)\n continue\n }\n if (!e.manifest) {\n process.stdout.write(` (no manifest — legacy side-effect plugin)\\n`)\n continue\n }\n printAdapterSummary(\"substrates\", e.manifest.substrates)\n printAdapterSummary(\"dispatchers\", e.manifest.dispatchers)\n printAdapterSummary(\"executors\", e.manifest.executors)\n printAdapterSummary(\"state stores\", e.manifest.stateStores)\n }\n return 0\n}\n\nfunction printAdapterSummary(\n label: string,\n entries: ReadonlyArray<AdapterEntry | SubstrateEntry>\n): void {\n if (entries.length === 0) return\n const kinds = entries.map((e) => e.kind).join(\", \")\n process.stdout.write(` ${label}: ${kinds}\\n`)\n}\n\n// ── show ──────────────────────────────────────────────────────────────\n\nasync function runShow(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n options: { json: { type: \"boolean\" } },\n strict: true,\n })\n const pkg = positionals[0]\n if (!pkg) {\n process.stderr.write(\n \"agentproto plugins show: missing <pkg>. Try: agentproto plugins show @guilde/agentproto-bridge\\n\"\n )\n return 2\n }\n\n let result: Awaited<ReturnType<typeof readPluginManifest>>\n try {\n result = await readPluginManifest(pkg)\n } catch (err) {\n process.stderr.write(\n `agentproto plugins show: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return 1\n }\n if (!result) {\n process.stderr.write(\n `agentproto plugins show: '${pkg}' is not installed (or doesn't declare an agentproto manifest).\\n`\n )\n return 1\n }\n\n if (values.json) {\n process.stdout.write(`${JSON.stringify(result.manifest, null, 2)}\\n`)\n return 0\n }\n\n const m = result.manifest\n process.stdout.write(`${pkg}\\n`)\n process.stdout.write(` schema: ${m.schema}\\n`)\n printAdapterDetail(\"substrates\", m.substrates)\n printAdapterDetail(\"dispatchers\", m.dispatchers)\n printAdapterDetail(\"executors\", m.executors)\n printAdapterDetail(\"state stores\", m.stateStores)\n return 0\n}\n\nfunction printAdapterDetail(\n label: string,\n entries: ReadonlyArray<AdapterEntry | SubstrateEntry>\n): void {\n if (entries.length === 0) return\n process.stdout.write(` ${label}:\\n`)\n for (const e of entries) {\n process.stdout.write(` • kind: ${e.kind}\\n`)\n process.stdout.write(` entry: ${e.entry} → ${e.export}\\n`)\n const caps = \"capabilities\" in e ? e.capabilities : undefined\n if (Array.isArray(caps) && caps.length > 0) {\n process.stdout.write(` capabilities: ${caps.join(\", \")}\\n`)\n }\n if (e.description) {\n process.stdout.write(` ${e.description}\\n`)\n }\n }\n}\n\n// ── install / uninstall / enable / disable ────────────────────────────\n\nasync function runInstall(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n options: {\n local: { type: \"boolean\" },\n \"skip-npm\": { type: \"boolean\" },\n },\n strict: true,\n })\n const pkg = positionals[0]\n if (!pkg) {\n process.stderr.write(\"agentproto plugins install: missing <pkg>.\\n\")\n return 2\n }\n\n if (!values[\"skip-npm\"]) {\n const code = await spawnInherit(\"npm\", [\n \"install\",\n values.local ? \"\" : \"-g\",\n pkg,\n ].filter(Boolean))\n if (code !== 0) {\n process.stderr.write(\n `agentproto plugins install: npm failed with exit ${code}; config not modified.\\n`\n )\n return code\n }\n }\n\n await addToConfig(pkg)\n process.stdout.write(`agentproto plugins: enabled '${pkg}'.\\n`)\n return 0\n}\n\nasync function runUninstall(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n options: {\n local: { type: \"boolean\" },\n \"skip-npm\": { type: \"boolean\" },\n },\n strict: true,\n })\n const pkg = positionals[0]\n if (!pkg) {\n process.stderr.write(\"agentproto plugins uninstall: missing <pkg>.\\n\")\n return 2\n }\n\n await removeFromConfig(pkg)\n\n if (!values[\"skip-npm\"]) {\n const code = await spawnInherit(\"npm\", [\n \"uninstall\",\n values.local ? \"\" : \"-g\",\n pkg,\n ].filter(Boolean))\n if (code !== 0) {\n process.stderr.write(\n `agentproto plugins uninstall: removed from config but npm uninstall failed with exit ${code}.\\n`\n )\n return code\n }\n }\n\n process.stdout.write(`agentproto plugins: disabled '${pkg}'.\\n`)\n return 0\n}\n\nasync function runEnable(args: readonly string[]): Promise<number> {\n const [pkg] = args\n if (!pkg) {\n process.stderr.write(\"agentproto plugins enable: missing <pkg>.\\n\")\n return 2\n }\n await addToConfig(pkg)\n process.stdout.write(`agentproto plugins: enabled '${pkg}'.\\n`)\n return 0\n}\n\nasync function runDisable(args: readonly string[]): Promise<number> {\n const [pkg] = args\n if (!pkg) {\n process.stderr.write(\"agentproto plugins disable: missing <pkg>.\\n\")\n return 2\n }\n await removeFromConfig(pkg)\n process.stdout.write(`agentproto plugins: disabled '${pkg}'.\\n`)\n return 0\n}\n\n// ── config helpers ────────────────────────────────────────────────────\n\ninterface AgentprotoConfig {\n plugins?: string[]\n [key: string]: unknown\n}\n\nfunction configPath(): string {\n const base = process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n return join(base, \"config.json\")\n}\n\nasync function loadConfig(): Promise<AgentprotoConfig> {\n try {\n const raw = await readFile(configPath(), \"utf8\")\n return JSON.parse(raw) as AgentprotoConfig\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return {}\n throw err\n }\n}\n\nasync function saveConfig(cfg: AgentprotoConfig): Promise<void> {\n const path = configPath()\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, `${JSON.stringify(cfg, null, 2)}\\n`)\n}\n\nasync function addToConfig(pkg: string): Promise<void> {\n const cfg = await loadConfig()\n const plugins = cfg.plugins ?? []\n if (!plugins.includes(pkg)) plugins.push(pkg)\n cfg.plugins = plugins\n await saveConfig(cfg)\n}\n\nasync function removeFromConfig(pkg: string): Promise<void> {\n const cfg = await loadConfig()\n cfg.plugins = (cfg.plugins ?? []).filter((p) => p !== pkg)\n await saveConfig(cfg)\n}\n\nfunction spawnInherit(cmd: string, argv: string[]): Promise<number> {\n return new Promise((resolveP, rejectP) => {\n const child = spawn(cmd, argv, { stdio: \"inherit\" })\n child.once(\"error\", rejectP)\n child.once(\"exit\", (code) => resolveP(code ?? 0))\n })\n}\n","/**\n * Read piped stdin to a string. Returns null if stdin is a TTY (no pipe).\n * Used by `agentproto run` to accept prompts via:\n * echo \"summarise this repo\" | agentproto run claude-code\n */\n\nexport async function readStdinIfPiped(): Promise<string | null> {\n if (process.stdin.isTTY) return null\n const chunks: Buffer[] = []\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n const text = Buffer.concat(chunks).toString(\"utf8\").trim()\n return text.length > 0 ? text : null\n}\n","/**\n * `agentproto run <slug> [--cwd <dir>] [--prompt <text>] [--resume <id>]`\n *\n * Boots the named adapter, dispatches a single user turn, streams events\n * to stdout, then exits. Designed for two use-cases:\n * - one-shot scripting (pipe a prompt in, get stream back)\n * - quick smoke-test from a fresh checkout (\"does claude even spawn?\")\n *\n * Long-lived multiplexing belongs to `agentproto serve`, not here.\n */\n\nimport { resolve as resolvePath } from \"node:path\"\nimport { parseArgs } from \"node:util\"\nimport {\n createAgentCliRuntime,\n type AgentCliRuntimeSession,\n type StreamEvent,\n} from \"@agentproto/driver-agent-cli\"\nimport { resolveAdapter } from \"../registry/resolve.js\"\nimport { readStdinIfPiped } from \"../util/stdin.js\"\n\nexport async function runRun(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n cwd: { type: \"string\" },\n prompt: { type: \"string\", short: \"p\" },\n resume: { type: \"string\" },\n json: { type: \"boolean\" },\n },\n })\n\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto run: missing adapter slug. Try: agentproto run claude-code\\n\"\n )\n return 2\n }\n\n const cwd = values.cwd ? resolvePath(values.cwd) : process.cwd()\n const promptArg = values.prompt ?? (await readStdinIfPiped())\n if (!promptArg) {\n process.stderr.write(\n \"agentproto run: no prompt provided. Pass --prompt or pipe one over stdin.\\n\"\n )\n return 2\n }\n\n const adapter = await resolveAdapter(slug)\n const runtime = createAgentCliRuntime(adapter.handle)\n\n const controller = new AbortController()\n const onSignal = (sig: NodeJS.Signals) => {\n process.stderr.write(`\\nagentproto: received ${sig}, cancelling…\\n`)\n controller.abort()\n }\n process.once(\"SIGINT\", onSignal)\n process.once(\"SIGTERM\", onSignal)\n\n let session: AgentCliRuntimeSession | null = null\n try {\n session = await runtime.start({\n cwd,\n signal: controller.signal,\n resumeSessionId: values.resume,\n })\n\n const printer = values.json ? printJson : printPretty\n let exit = 0\n for await (const ev of session.send(promptArg)) {\n printer(ev)\n if (ev.kind === \"turn-end\" && ev.reason !== \"completed\") exit = 1\n if (ev.kind === \"error\") exit = 1\n }\n return exit\n } finally {\n process.off(\"SIGINT\", onSignal)\n process.off(\"SIGTERM\", onSignal)\n if (session) await session.close().catch(() => {})\n }\n}\n\nfunction printJson(ev: StreamEvent): void {\n process.stdout.write(`${JSON.stringify(ev)}\\n`)\n}\n\nfunction printPretty(ev: StreamEvent): void {\n switch (ev.kind) {\n case \"text-delta\":\n process.stdout.write(ev.text)\n break\n case \"thought\":\n process.stderr.write(`\\x1b[2m[thought] ${ev.text}\\x1b[0m\\n`)\n break\n case \"tool-call\":\n process.stderr.write(`\\x1b[36m[tool] ${ev.toolName}\\x1b[0m\\n`)\n break\n case \"tool-result\":\n if (ev.isError)\n process.stderr.write(`\\x1b[31m[tool-error]\\x1b[0m\\n`)\n break\n case \"agent-prompt\":\n process.stderr.write(`\\x1b[33m[agent-prompt: needs input]\\x1b[0m\\n`)\n break\n case \"turn-end\":\n process.stdout.write(`\\n\\x1b[2m[turn-end: ${ev.reason}]\\x1b[0m\\n`)\n break\n case \"error\": {\n const code =\n typeof ev.error.code === \"number\" ? ` (code ${ev.error.code})` : \"\"\n process.stderr.write(\n `\\x1b[31m[error]${code} ${ev.error.message}\\x1b[0m\\n`,\n )\n // Attached child stderr (added by define-agent-cli) — usually\n // the most useful line (\"not authenticated\", \"model gated\",\n // missing binary path). Print after the headline so the\n // headline still scans first.\n const data = ev.error.data\n if (data && typeof data === \"object\") {\n const stderr = (data as { stderr?: unknown }).stderr\n if (typeof stderr === \"string\" && stderr.trim()) {\n process.stderr.write(`\\x1b[2m── child stderr ──\\n${stderr}\\x1b[0m\\n`)\n }\n // Surface any non-stderr fields as JSON so callers don't\n // have to switch to --json to see what payload was rejected.\n const rest = { ...(data as Record<string, unknown>) }\n delete rest.stderr\n if (Object.keys(rest).length > 0) {\n process.stderr.write(\n `\\x1b[2m── error.data ──\\n${JSON.stringify(rest, null, 2)}\\x1b[0m\\n`,\n )\n }\n }\n break\n }\n }\n}\n","/**\n * Runtime orchestrator. One cycle =\n * read substrate → dispatch → execute selected participants → append → fire lifecycle.\n *\n * The kernel knows nothing about specific substrates, dispatchers, or\n * executors — it only routes through the port interfaces. Telemetry,\n * if wired, receives a structured event at every phase boundary; the\n * cycleId on each event lets a sink rebuild OTEL-style spans by\n * grouping.\n */\n\nimport { randomBytes } from \"node:crypto\"\nimport type {\n ParticipantDescriptor,\n RuntimePorts,\n Telemetry,\n TelemetryEvent,\n Turn,\n TurnId,\n} from \"./ports.js\"\n\nexport type RunTurnOptions = {\n /** How far back to read from the substrate when building dispatcher input. Default 30. */\n readonly historyLimit?: number\n /** Read turns strictly newer than this id. Default undefined (full snapshot, truncated by historyLimit). */\n readonly since?: TurnId\n /** Abort signal forwarded to participant executors. */\n readonly signal?: AbortSignal\n}\n\nexport type RunTurnResult = {\n readonly cycle: \"executed\" | \"idle\"\n readonly selected: readonly string[]\n readonly turnsAppended: readonly Turn[]\n}\n\n/**\n * Run a single dispatcher cycle. Returns synchronously after one round of\n * dispatch + execute + append. Callers loop for continuous operation.\n */\nexport async function runTurn(\n ports: RuntimePorts,\n options: RunTurnOptions = {}\n): Promise<RunTurnResult> {\n const historyLimit = options.historyLimit ?? 30\n const cycleId = newCycleId()\n const cycleStart = Date.now()\n\n emit(ports.telemetry, {\n kind: \"cycle.started\",\n cycleId,\n at: nowIso(),\n ...(options.since !== undefined ? { since: options.since } : {}),\n })\n\n const readStart = Date.now()\n const all = await ports.substrate.read(options.since)\n const recentTurns = all.slice(-historyLimit)\n emit(ports.telemetry, {\n kind: \"substrate.read\",\n cycleId,\n at: nowIso(),\n substrateKind: ports.substrate.kind,\n turnCount: recentTurns.length,\n durationMs: Date.now() - readStart,\n })\n\n const dispatchStart = Date.now()\n const selected = await ports.dispatcher.selectNext({\n recentTurns,\n participants: ports.participants,\n })\n emit(ports.telemetry, {\n kind: \"dispatch.decided\",\n cycleId,\n at: nowIso(),\n dispatcherKind: ports.dispatcher.kind,\n selected,\n durationMs: Date.now() - dispatchStart,\n })\n\n if (selected.length === 0) {\n await ports.lifecycle?.onIdle?.()\n emit(ports.telemetry, { kind: \"cycle.idle\", cycleId, at: nowIso() })\n emit(ports.telemetry, {\n kind: \"cycle.finished\",\n cycleId,\n at: nowIso(),\n outcome: \"idle\",\n turnsAppended: 0,\n durationMs: Date.now() - cycleStart,\n })\n return { cycle: \"idle\", selected: [], turnsAppended: [] }\n }\n\n const triggerTurn = recentTurns[recentTurns.length - 1]\n if (!triggerTurn) {\n // Dispatcher selected someone but there's no recent turn to trigger off.\n // Treat as idle — dispatchers should not pick speakers from an empty substrate.\n await ports.lifecycle?.onIdle?.()\n emit(ports.telemetry, { kind: \"cycle.idle\", cycleId, at: nowIso() })\n emit(ports.telemetry, {\n kind: \"cycle.finished\",\n cycleId,\n at: nowIso(),\n outcome: \"idle\",\n turnsAppended: 0,\n durationMs: Date.now() - cycleStart,\n })\n return { cycle: \"idle\", selected: [], turnsAppended: [] }\n }\n\n const appended: Turn[] = []\n\n for (const participantId of selected) {\n const participant = findParticipant(ports.participants, participantId)\n if (!participant) {\n // Dispatcher hallucinated an unknown participant. Skip rather than crash —\n // a malformed dispatcher shouldn't take down the loop.\n continue\n }\n const executor = ports.executors.get(participant.executor)\n if (!executor) {\n // Manifest declared a participant whose executor isn't registered.\n // Skip; misconfiguration shows up in logs but the loop survives.\n continue\n }\n\n await ports.lifecycle?.onMention?.(participantId, triggerTurn)\n\n const state = await ports.state.read(participantId)\n\n emit(ports.telemetry, {\n kind: \"participant.started\",\n cycleId,\n at: nowIso(),\n participantId,\n executorKind: participant.executor,\n })\n\n const execStart = Date.now()\n let output\n try {\n output = await executor.executeTurn({\n participant,\n recentTurns,\n triggerTurn,\n state,\n signal: options.signal,\n })\n } catch (err) {\n emit(ports.telemetry, {\n kind: \"participant.failed\",\n cycleId,\n at: nowIso(),\n participantId,\n executorKind: participant.executor,\n error: err instanceof Error ? err.message : String(err),\n })\n throw err\n }\n\n emit(ports.telemetry, {\n kind: \"participant.finished\",\n cycleId,\n at: nowIso(),\n participantId,\n executorKind: participant.executor,\n durationMs: Date.now() - execStart,\n contentLength: output.content.length,\n })\n\n const turn = await ports.substrate.append({\n participantId,\n content: output.content,\n meta: output.meta,\n })\n appended.push(turn)\n emit(ports.telemetry, {\n kind: \"substrate.appended\",\n cycleId,\n at: nowIso(),\n turnId: turn.id,\n participantId,\n })\n\n if (output.stateUpdate) {\n await ports.state.write(participantId, output.stateUpdate)\n emit(ports.telemetry, {\n kind: \"state.written\",\n cycleId,\n at: nowIso(),\n participantId,\n })\n }\n\n await ports.lifecycle?.onTurnEnd?.(turn)\n }\n\n emit(ports.telemetry, {\n kind: \"cycle.finished\",\n cycleId,\n at: nowIso(),\n outcome: \"executed\",\n turnsAppended: appended.length,\n durationMs: Date.now() - cycleStart,\n })\n\n return { cycle: \"executed\", selected, turnsAppended: appended }\n}\n\nfunction findParticipant(\n participants: readonly ParticipantDescriptor[],\n id: string\n): ParticipantDescriptor | undefined {\n for (const p of participants) {\n if (p.id === id) return p\n }\n return undefined\n}\n\nfunction emit(telemetry: Telemetry | undefined, event: TelemetryEvent): void {\n // Sinks throwing must not take down the cycle — observability is\n // non-load-bearing for the conversation.\n if (!telemetry) return\n try {\n telemetry.emit(event)\n } catch {\n // Swallow. Better to lose a metric than to corrupt a turn.\n }\n}\n\nfunction nowIso(): string {\n return new Date().toISOString()\n}\n\nfunction newCycleId(): string {\n // 96-bit random id, base32-ish — short enough to read, wide enough\n // to be unique within a swarm process's lifetime.\n return `c_${randomBytes(6).toString(\"hex\")}`\n}\n","/**\n * MultiAgentRuntime manifest schema + loader.\n *\n * The manifest is markdown with YAML frontmatter (matching @agentproto's\n * doctype convention used by ROLE.md, OPERATOR.md, etc.). The frontmatter\n * is the structured contract; the markdown body is human-readable\n * documentation of what the swarm does.\n *\n * Loader is filesystem-bound but parsing is pure — the schema can be used\n * by tests with inline strings via `parseManifest()`.\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport { resolve as resolvePath, dirname } from \"node:path\"\nimport matter from \"gray-matter\"\nimport { z } from \"zod\"\n\nexport const MULTI_AGENT_RUNTIME_SCHEMA = \"agentruntimes/v1\"\nexport const MULTI_AGENT_RUNTIME_KIND = \"MultiAgentRuntime\"\n\nconst AdapterConfigSchema = z\n .object({\n kind: z.string().min(1),\n })\n .loose()\n\nconst ParticipantManifestSchema = z\n .object({\n id: z.string().min(1),\n executor: z.string().min(1),\n displayName: z.string().min(1).optional(),\n role: z.string().optional(),\n meta: z.record(z.string(), z.unknown()).optional(),\n })\n .loose()\n\nexport const MultiAgentRuntimeManifestSchema = z\n .object({\n schema: z.literal(MULTI_AGENT_RUNTIME_SCHEMA),\n kind: z.literal(MULTI_AGENT_RUNTIME_KIND),\n id: z.string().min(1),\n participants: z.array(ParticipantManifestSchema).min(1),\n substrate: AdapterConfigSchema,\n dispatcher: AdapterConfigSchema,\n state: AdapterConfigSchema.optional(),\n lifecycle: z\n .object({\n onTurnEnd: z.boolean().optional(),\n onMention: z.boolean().optional(),\n onIdle: z.boolean().optional(),\n })\n .optional(),\n })\n .loose()\n\nexport type MultiAgentRuntimeManifest = z.infer<\n typeof MultiAgentRuntimeManifestSchema\n>\n\nexport type LoadedManifest = {\n readonly manifest: MultiAgentRuntimeManifest\n readonly body: string\n readonly path: string\n /** Absolute directory of the manifest file — adapter configs that reference paths resolve relative to this. */\n readonly baseDir: string\n}\n\nexport function parseManifest(source: string): MultiAgentRuntimeManifest {\n const parsed = matter(source)\n return MultiAgentRuntimeManifestSchema.parse(parsed.data)\n}\n\nexport async function loadManifest(path: string): Promise<LoadedManifest> {\n const abs = resolvePath(path)\n const raw = await readFile(abs, \"utf8\")\n const parsed = matter(raw)\n const manifest = MultiAgentRuntimeManifestSchema.parse(parsed.data)\n return {\n manifest,\n body: parsed.content,\n path: abs,\n baseDir: dirname(abs),\n }\n}\n\n/** Resolve a path string from a manifest field, relative to the manifest's directory. */\nexport function resolveManifestPath(loaded: LoadedManifest, value: string): string {\n return resolvePath(loaded.baseDir, value)\n}\n","/**\n * Reference Telemetry adapters.\n *\n * Wire `RuntimePorts.telemetry` to one of these (or your own\n * implementation) to receive structured events from each cycle.\n * Sinks may also be composed via `composeTelemetry()`.\n */\n\nimport type { Telemetry, TelemetryEvent } from \"../ports.js\"\n\n/** No-op sink. Equivalent to leaving `telemetry` undefined on RuntimePorts. */\nexport const noopTelemetry: Telemetry = {\n emit() {\n // intentionally blank\n },\n}\n\nexport interface StderrTelemetryOptions {\n /** Event kinds to include. Omit to emit all kinds. */\n readonly include?: ReadonlySet<TelemetryEvent[\"kind\"]>\n /** Event kinds to suppress. Wins over `include`. */\n readonly exclude?: ReadonlySet<TelemetryEvent[\"kind\"]>\n /** Prefix prepended to every line. Default \"agentproto: \". */\n readonly prefix?: string\n}\n\n/**\n * Human-readable stderr sink — one line per event. Cheaper than wiring\n * a real exporter; good default for `--verbose` mode.\n */\nexport function stderrTelemetry(\n options: StderrTelemetryOptions = {}\n): Telemetry {\n const prefix = options.prefix ?? \"agentproto: \"\n return {\n emit(event) {\n if (options.exclude?.has(event.kind)) return\n if (options.include && !options.include.has(event.kind)) return\n process.stderr.write(`${prefix}${formatEvent(event)}\\n`)\n },\n }\n}\n\n/**\n * In-memory sink — every event pushed onto an array. Intended for\n * tests; reach into `events` after `runTurn` to assert.\n */\nexport function arrayTelemetry(): Telemetry & {\n readonly events: readonly TelemetryEvent[]\n} {\n const events: TelemetryEvent[] = []\n return {\n events,\n emit(event) {\n events.push(event)\n },\n }\n}\n\n/**\n * Fan-out — emits every event to all wrapped sinks in order. Useful\n * for \"log to stderr AND export to OTEL\" setups.\n */\nexport function composeTelemetry(...sinks: readonly Telemetry[]): Telemetry {\n return {\n emit(event) {\n for (const sink of sinks) {\n try {\n sink.emit(event)\n } catch {\n // Each sink is independently isolated.\n }\n }\n },\n }\n}\n\nfunction formatEvent(event: TelemetryEvent): string {\n switch (event.kind) {\n case \"cycle.started\":\n return `${event.cycleId} cycle.started${event.since !== undefined ? ` since=${event.since}` : \"\"}`\n case \"substrate.read\":\n return `${event.cycleId} substrate.read ${event.substrateKind} turns=${event.turnCount} ${event.durationMs}ms`\n case \"dispatch.decided\":\n return `${event.cycleId} dispatch.decided ${event.dispatcherKind} selected=[${event.selected.join(\",\") || \"(none)\"}] ${event.durationMs}ms`\n case \"participant.started\":\n return `${event.cycleId} participant.started ${event.participantId} (${event.executorKind})`\n case \"participant.finished\":\n return `${event.cycleId} participant.finished ${event.participantId} ${event.durationMs}ms content=${event.contentLength}b`\n case \"participant.failed\":\n return `${event.cycleId} participant.failed ${event.participantId} — ${event.error}`\n case \"substrate.appended\":\n return `${event.cycleId} substrate.appended turn=${event.turnId} by=${event.participantId}`\n case \"state.written\":\n return `${event.cycleId} state.written ${event.participantId}`\n case \"cycle.idle\":\n return `${event.cycleId} cycle.idle`\n case \"cycle.finished\":\n return `${event.cycleId} cycle.finished ${event.outcome} appended=${event.turnsAppended} ${event.durationMs}ms`\n default: {\n // Forward-compat — render unknown kinds as JSON so a future\n // kernel version doesn't blank-line the log.\n const _exhaustive: never = event\n return JSON.stringify(_exhaustive)\n }\n }\n}\n","/**\n * File substrate — append-only markdown journal.\n *\n * Each turn is delimited by a header line:\n * === TURN id=<id> participant=<pid> ts=<iso> ===\n * <body lines…>\n *\n * Ids are content-hashed, so re-running an append with the same body\n * is idempotent at the row level.\n *\n * Caveats:\n * - `appendFile` does not fsync. A power-loss between buffered write\n * and disk flush can lose the most recent turn(s); callers that\n * need durability across crashes should layer their own fsync.\n * - The parser splits on lines matching `=== TURN ... ===`. Turn\n * content containing such a line will corrupt subsequent parses.\n * Treat turn content as untrusted? Sanitize before append.\n */\n\nimport { appendFile, readFile, writeFile, mkdir, stat } from \"node:fs/promises\"\nimport { dirname } from \"node:path\"\nimport { createHash } from \"node:crypto\"\nimport type { Substrate, Turn, TurnInput, TurnId } from \"../ports.js\"\n\nexport type FileSubstrateOptions = {\n /** Absolute path to the journal file. */\n readonly path: string\n}\n\nconst HEADER_RE =\n /^=== TURN id=([^\\s]+) participant=([^\\s]+) ts=([^\\s]+) ===$/\n\nexport class FileSubstrate implements Substrate {\n readonly kind = \"file\"\n\n constructor(private readonly opts: FileSubstrateOptions) {}\n\n async append(input: TurnInput): Promise<Turn> {\n const timestamp = input.timestamp ?? new Date().toISOString()\n const id = hashTurnId(input.participantId, timestamp, input.content)\n const turn: Turn = {\n id,\n participantId: input.participantId,\n timestamp,\n content: input.content,\n meta: input.meta,\n }\n await ensureDir(this.opts.path)\n const block = formatTurnBlock(turn)\n await appendFile(this.opts.path, block, \"utf8\")\n return turn\n }\n\n async read(since?: TurnId): Promise<readonly Turn[]> {\n let raw: string\n try {\n raw = await readFile(this.opts.path, \"utf8\")\n } catch (err) {\n if (isNotFound(err)) return []\n throw err\n }\n const turns = parseJournal(raw)\n if (since === undefined) return turns\n const cutoff = turns.findIndex((t) => t.id === since)\n if (cutoff === -1) return turns\n return turns.slice(cutoff + 1)\n }\n}\n\n/**\n * Reset the journal by truncating it. Useful for tests. Not part of the\n * Substrate interface — callers must reach for the adapter directly.\n */\nexport async function resetFileSubstrate(path: string): Promise<void> {\n await ensureDir(path)\n await writeFile(path, \"\", \"utf8\")\n}\n\nfunction formatTurnBlock(turn: Turn): string {\n const header = `=== TURN id=${turn.id} participant=${turn.participantId} ts=${turn.timestamp} ===\\n`\n const body = turn.content.endsWith(\"\\n\") ? turn.content : `${turn.content}\\n`\n return `${header}${body}`\n}\n\nfunction parseJournal(raw: string): Turn[] {\n const lines = raw.split(\"\\n\")\n const turns: Turn[] = []\n let current: { id: string; pid: string; ts: string; buf: string[] } | null = null\n\n for (const line of lines) {\n const match = HEADER_RE.exec(line)\n if (match && match[1] && match[2] && match[3]) {\n if (current) turns.push(materialise(current))\n current = { id: match[1], pid: match[2], ts: match[3], buf: [] }\n continue\n }\n if (current) current.buf.push(line)\n }\n if (current) turns.push(materialise(current))\n return turns\n}\n\nfunction materialise(c: {\n id: string\n pid: string\n ts: string\n buf: string[]\n}): Turn {\n // Drop the trailing empty line that appendFile leaves between blocks.\n let body = c.buf.join(\"\\n\")\n while (body.endsWith(\"\\n\")) body = body.slice(0, -1)\n return {\n id: c.id,\n participantId: c.pid,\n timestamp: c.ts,\n content: body,\n }\n}\n\nfunction hashTurnId(pid: string, ts: string, content: string): string {\n const h = createHash(\"sha256\")\n h.update(pid)\n h.update(\"\\x00\")\n h.update(ts)\n h.update(\"\\x00\")\n h.update(content)\n return `t_${h.digest(\"hex\").slice(0, 12)}`\n}\n\nasync function ensureDir(path: string): Promise<void> {\n const dir = dirname(path)\n try {\n await stat(dir)\n } catch (err) {\n if (isNotFound(err)) {\n await mkdir(dir, { recursive: true })\n return\n }\n throw err\n }\n}\n\nfunction isNotFound(err: unknown): boolean {\n return (\n typeof err === \"object\" &&\n err !== null &&\n \"code\" in err &&\n (err as { code: string }).code === \"ENOENT\"\n )\n}\n","/**\n * Canonical @-mention parser.\n *\n * Lives as raw JavaScript (no types) because it's consumed in two\n * places that don't share a build:\n *\n * 1. The kernel imports `textContainsMention` from this file as a\n * normal ESM module (the dispatcher in `adapters/dispatcher-mention.ts`).\n *\n * 2. Runtime profiles inline this file's source into Claude Code\n * hooks at profile-build time, because `.claude/` has no\n * module-resolution at hook-execution time. The build script\n * reads this file as text and stamps it into the hook template.\n *\n * Two cases:\n * 1. Literal `@<name>` substring (case-sensitive, full name).\n * 2. For multi-word names, also `@<firstName>` with non-word\n * boundary (case-insensitive).\n *\n * Edit here only — both consumers stay in sync via build pipelines.\n */\n\n/** @param {string} text @param {string} name @returns {boolean} */\nexport function textContainsMention(text, name) {\n if (text.includes(`@${name}`)) return true\n if (name.includes(\" \")) {\n const firstName = name.split(\" \")[0]?.trim()\n if (!firstName) return false\n const regex = new RegExp(`@${firstName}(?!\\\\w)`, \"i\")\n return regex.test(text)\n }\n return false\n}\n","/**\n * Mention dispatcher — selects participants whose displayName is\n * @-mentioned in the most recent turn.\n *\n * Skip rules:\n * - never re-select the participant who authored the trigger turn\n * (otherwise they'd reply to themselves indefinitely)\n * - never dispatch on a trigger we already processed (in-memory cursor —\n * prevents the loop from re-firing on the same @mention every poll\n * when the kernel's own reply isn't yet visible in the next read).\n * Per-dispatcher-instance state; a fresh swarm process starts with\n * no cursor and naturally responds to the latest unhandled mention\n * exactly once.\n * - if no mentions match any known participant, return [] (idle)\n *\n * The parser itself lives in `../util/mention-parser.mjs` (vanilla JS)\n * so runtime profiles can stamp the same implementation into Claude\n * Code hooks at build time without depending on the TS build pipeline.\n */\n\nimport type {\n Dispatcher,\n DispatcherInput,\n ParticipantId,\n TurnId,\n} from \"../ports.js\"\nimport { textContainsMention } from \"../util/mention-parser.mjs\"\n\nexport class MentionDispatcher implements Dispatcher {\n readonly kind = \"mention\"\n private lastProcessedTriggerId: TurnId | undefined\n\n async selectNext(input: DispatcherInput): Promise<readonly ParticipantId[]> {\n const trigger = input.recentTurns[input.recentTurns.length - 1]\n if (!trigger) return []\n if (trigger.id === this.lastProcessedTriggerId) return []\n const text = trigger.content\n\n const selected: ParticipantId[] = []\n for (const p of input.participants) {\n if (p.id === trigger.participantId) continue\n if (textContainsMention(text, p.displayName)) {\n selected.push(p.id)\n }\n }\n\n if (selected.length > 0) {\n this.lastProcessedTriggerId = trigger.id\n }\n return selected\n }\n}\n\n// Re-exported so callers writing their own adapters can detect\n// mentions with identical semantics.\nexport { textContainsMention }\n","/**\n * Filesystem state store — one JSON file per participant.\n *\n * <stateDir>/<participantId>.json\n *\n * Missing files read as {}. Writes are full overwrites; callers\n * pass the merged state, the adapter doesn't merge on its own.\n */\n\nimport { readFile, writeFile, mkdir, stat } from \"node:fs/promises\"\nimport { resolve as resolvePath } from \"node:path\"\nimport type { ParticipantId, StateStore } from \"../ports.js\"\n\nexport type FileStateStoreOptions = {\n /** Directory to hold the per-participant JSON files. */\n readonly dir: string\n}\n\nexport class FileStateStore implements StateStore {\n readonly kind = \"fs\"\n\n constructor(private readonly opts: FileStateStoreOptions) {}\n\n async read(participantId: ParticipantId): Promise<Readonly<Record<string, unknown>>> {\n const path = this.pathFor(participantId)\n try {\n const raw = await readFile(path, \"utf8\")\n return JSON.parse(raw) as Record<string, unknown>\n } catch (err) {\n if (isNotFound(err)) return Object.freeze({})\n throw err\n }\n }\n\n async write(\n participantId: ParticipantId,\n state: Readonly<Record<string, unknown>>\n ): Promise<void> {\n await ensureDir(this.opts.dir)\n const path = this.pathFor(participantId)\n await writeFile(path, JSON.stringify(state, null, 2), \"utf8\")\n }\n\n private pathFor(participantId: ParticipantId): string {\n // Sanitize: participant ids are user-controlled. Disallow path traversal.\n const safe = participantId.replace(/[^a-zA-Z0-9._-]/g, \"_\")\n return resolvePath(this.opts.dir, `${safe}.json`)\n }\n}\n\nasync function ensureDir(dir: string): Promise<void> {\n try {\n await stat(dir)\n } catch (err) {\n if (isNotFound(err)) {\n await mkdir(dir, { recursive: true })\n return\n }\n throw err\n }\n}\n\nfunction isNotFound(err: unknown): boolean {\n return (\n typeof err === \"object\" &&\n err !== null &&\n \"code\" in err &&\n (err as { code: string }).code === \"ENOENT\"\n )\n}\n","/**\n * Agent-CLI participant — spawns a CLI binary, pipes the assembled prompt\n * over stdin, and uses captured stdout as the turn content.\n *\n * Works for any CLI that supports a one-shot \"read prompt from stdin,\n * print response to stdout\" mode (claude-code's `--print`, hermes' `-p`,\n * etc.).\n */\n\nimport { spawn } from \"node:child_process\"\nimport { readFile } from \"node:fs/promises\"\nimport matter from \"gray-matter\"\nimport type {\n ParticipantExecuteInput,\n ParticipantExecuteOutput,\n ParticipantExecutor,\n} from \"../ports.js\"\n\nexport type AgentCliParticipantOptions = {\n /** Executable to invoke. Examples: \"claude\", \"hermes\", \"goose\". */\n readonly command: string\n /** Static args. The prompt is fed over stdin, not as an argument. */\n readonly args?: readonly string[]\n /** Working directory. Defaults to process.cwd(). */\n readonly cwd?: string\n /** Hard timeout in ms. Default 90000. */\n readonly timeoutMs?: number\n /** Optional output parser — if returns null, content falls back to raw stdout. */\n readonly parseOutput?: (stdout: string) => string | null\n}\n\nexport class AgentCliParticipant implements ParticipantExecutor {\n readonly kind = \"agent-cli\"\n\n constructor(private readonly opts: AgentCliParticipantOptions) {}\n\n async executeTurn(\n input: ParticipantExecuteInput\n ): Promise<ParticipantExecuteOutput> {\n const prompt = await assemblePrompt(input)\n const stdout = await spawnWithStdin({\n command: this.opts.command,\n args: this.opts.args ?? [],\n cwd: this.opts.cwd ?? process.cwd(),\n timeoutMs: this.opts.timeoutMs ?? 90000,\n stdin: prompt,\n signal: input.signal,\n })\n const parsed = this.opts.parseOutput?.(stdout) ?? null\n const content = parsed ?? stdout.trimEnd()\n return { content }\n }\n}\n\nasync function assemblePrompt(\n input: ParticipantExecuteInput\n): Promise<string> {\n const roleText = input.participant.role\n ? await loadRole(input.participant.role)\n : \"\"\n\n const transcript = input.recentTurns\n .map((t) => `[${t.participantId}] ${t.content}`)\n .join(\"\\n\\n\")\n\n return [\n roleText && `# Your role\\n\\n${roleText}`,\n `# Recent conversation\\n\\n${transcript}`,\n `# Your turn\\n\\nYou are ${input.participant.displayName}. The latest message in the conversation triggered you (most likely because it mentions you). Read the transcript above and reply in character. Keep it conversational unless the trigger asks for detailed work. Output only your reply — no preamble, no role labels, no quotes around the response.`,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\")\n}\n\n// File extensions we treat as a path-to-role-file. Anything else is\n// inline role text — even strings that contain `/`, which are common\n// in normal sentences (\"I am an AI/ML reviewer\").\nconst ROLE_FILE_EXTENSIONS = [\".md\", \".markdown\", \".txt\"]\n\nasync function loadRole(roleField: string): Promise<string> {\n if (!looksLikeRoleFile(roleField)) return roleField\n try {\n const raw = await readFile(roleField, \"utf8\")\n // Strip optional YAML frontmatter — lets a Claude Code agent\n // definition file (.claude/agents/*.md) double as a swarm role\n // without ferrying the agent's metadata into the prompt.\n const parsed = matter(raw)\n return parsed.content.trim()\n } catch (err) {\n // The string had a role-file extension but the file isn't readable\n // — surface a hint on stderr so authors don't silently get the\n // literal path as a prompt. Still fall back to inline so the swarm\n // doesn't crash on a typo.\n const code = (err as NodeJS.ErrnoException).code\n process.stderr.write(\n `agent-cli participant: role path '${roleField}' not readable (${code ?? \"unknown\"}); using the literal string as inline role text.\\n`\n )\n return roleField\n }\n}\n\nfunction looksLikeRoleFile(s: string): boolean {\n const lower = s.toLowerCase()\n return ROLE_FILE_EXTENSIONS.some((ext) => lower.endsWith(ext))\n}\n\ntype SpawnArgs = {\n command: string\n args: readonly string[]\n cwd: string\n timeoutMs: number\n stdin: string\n signal?: AbortSignal\n}\n\nasync function spawnWithStdin(args: SpawnArgs): Promise<string> {\n return new Promise((resolveP, rejectP) => {\n const proc = spawn(args.command, [...args.args], {\n cwd: args.cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n })\n\n let stdout = \"\"\n let stderr = \"\"\n const onAbort = () => proc.kill(\"SIGTERM\")\n args.signal?.addEventListener(\"abort\", onAbort)\n\n const timer = setTimeout(() => {\n proc.kill(\"SIGTERM\")\n }, args.timeoutMs)\n\n proc.stdout.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString(\"utf8\")\n })\n proc.stderr.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString(\"utf8\")\n })\n proc.on(\"error\", (err) => {\n clearTimeout(timer)\n args.signal?.removeEventListener(\"abort\", onAbort)\n rejectP(err)\n })\n proc.on(\"close\", (code) => {\n clearTimeout(timer)\n args.signal?.removeEventListener(\"abort\", onAbort)\n if (code === 0) {\n resolveP(stdout)\n return\n }\n rejectP(\n new Error(\n `agent-cli participant \"${args.command}\" exited with code ${code}: ${stderr.trim() || \"(no stderr)\"}`\n )\n )\n })\n\n proc.stdin.write(args.stdin)\n proc.stdin.end()\n })\n}\n\n/**\n * Parser for `claude --output-format=json` responses. Returns the\n * `result` field as the turn content, or null if the JSON doesn't have\n * the expected shape (caller falls back to raw stdout).\n */\nexport function parseClaudeJsonOutput(stdout: string): string | null {\n try {\n const parsed = JSON.parse(stdout) as unknown\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"result\" in parsed &&\n typeof (parsed as { result: unknown }).result === \"string\"\n ) {\n return (parsed as { result: string }).result\n }\n return null\n } catch {\n return null\n }\n}\n","/**\n * Built-in MultiAgentRuntime adapters. Registers reference adapters\n * shipped by `@agentproto/agent-runtime` against the runtime registry\n * so a vanilla `agentproto run-swarm` works without any plugins.\n *\n * Built-in `kind` strings: `file`, `mention`, `fs`, `agent-cli`.\n */\n\nimport { resolve as resolvePath } from \"node:path\"\nimport { FileSubstrate } from \"@agentproto/agent-runtime/adapters/substrate-file\"\nimport { MentionDispatcher } from \"@agentproto/agent-runtime/adapters/dispatcher-mention\"\nimport { FileStateStore } from \"@agentproto/agent-runtime/adapters/state-fs\"\nimport {\n AgentCliParticipant,\n parseClaudeJsonOutput,\n} from \"@agentproto/agent-runtime/adapters/participant-agent-cli\"\nimport {\n registerDispatcher,\n registerExecutor,\n registerStateStore,\n registerSubstrate,\n type AdapterConfig,\n type AdapterContext,\n} from \"./runtime.js\"\n\nexport function registerBuiltins(): void {\n registerSubstrate(\"file\", (cfg, ctx) => {\n const path = typeof cfg.path === \"string\" ? cfg.path : \".runtime/conversation.md\"\n return new FileSubstrate({ path: resolvePath(ctx.baseDir, path) })\n })\n\n registerDispatcher(\"mention\", () => new MentionDispatcher())\n\n registerStateStore(\"fs\", (cfg, ctx) => {\n const dir = typeof cfg.dir === \"string\" ? cfg.dir : \".runtime/state\"\n return new FileStateStore({ dir: resolvePath(ctx.baseDir, dir) })\n })\n\n registerExecutor(\"agent-cli\", (cfg) => buildAgentCli(cfg))\n}\n\nfunction buildAgentCli(cfg: AdapterConfig): AgentCliParticipant {\n const command = typeof cfg.command === \"string\" ? cfg.command : \"claude\"\n const args = Array.isArray(cfg.args)\n ? cfg.args.filter((a): a is string => typeof a === \"string\")\n : [\"--print\", \"--output-format=json\"]\n const useClaudeJson = cfg.parseJson !== false && command === \"claude\"\n return new AgentCliParticipant({\n command,\n args,\n parseOutput: useClaudeJson ? parseClaudeJsonOutput : undefined,\n })\n}\n\n// Suppress unused-context warning on registrations that don't read it.\nexport type { AdapterContext }\n","/**\n * Plugin loader. For each plugin id:\n *\n * 1. Try manifest-based wiring — read the plugin's\n * `package.json#agentproto` (or standalone `agentproto.json`),\n * validate the `agentproto/plugin/v1` schema, dynamic-import\n * each declared adapter entry, register with the runtime\n * registry.\n * 2. Fall back to side-effect import — older plugins that just\n * `registerSubstrate(...)` at module load are still supported.\n *\n * Discovery sources for plugin ids:\n * - `--plugin <module-id>` flag(s) on the verb\n * - `plugins[]` array in `~/.agentproto/config.json`\n *\n * Failures: a plugin that throws on load is reported on stderr and\n * the load skips it. The CLI continues — a single bad plugin\n * shouldn't take down the swarm.\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { loadPluginFromManifest } from \"./manifest-loader.js\"\n\ninterface AgentprotoConfig {\n plugins?: readonly string[]\n}\n\nexport async function loadPluginsFromConfig(): Promise<readonly string[]> {\n const path = configPath()\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as AgentprotoConfig\n return parsed.plugins ?? []\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return []\n process.stderr.write(\n `agentproto: failed to read ${path} — ${err instanceof Error ? err.message : String(err)}\\n`\n )\n return []\n }\n}\n\nexport async function loadPlugins(moduleIds: readonly string[]): Promise<void> {\n for (const id of moduleIds) {\n try {\n const manifest = await loadPluginFromManifest(id)\n if (manifest === null) {\n // No manifest declared → side-effect import for legacy plugins.\n await import(id)\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n process.stderr.write(\n `agentproto: plugin '${id}' failed to load — ${msg}\\n`\n )\n }\n }\n}\n\nfunction configPath(): string {\n const base = process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n return join(base, \"config.json\")\n}\n","/**\n * `agentproto run-swarm --manifest <path>`\n *\n * Loads a MultiAgentRuntime manifest and runs cycles in a loop. One\n * cycle = read substrate → dispatch → execute selected participants →\n * append → fire lifecycle.\n *\n * Adapter wiring goes through the runtime registry — built-in adapters\n * (file substrate, mention dispatcher, fs state, agent-cli participant)\n * are pre-registered; transport-specific adapters ship as separate\n * packages and register themselves when loaded via `--plugin <id>` or\n * the `plugins[]` array in `~/.agentproto/config.json`.\n */\n\nimport { parseArgs } from \"node:util\"\nimport { resolve as resolvePath } from \"node:path\"\nimport {\n loadManifest,\n runTurn,\n type LoadedManifest,\n type MultiAgentRuntimeManifest,\n type ParticipantDescriptor,\n type ParticipantExecutor,\n type RuntimePorts,\n type StateStore,\n type Substrate,\n type Telemetry,\n} from \"@agentproto/agent-runtime\"\nimport { stderrTelemetry } from \"@agentproto/agent-runtime/adapters/telemetry\"\nimport {\n getDispatcherFactory,\n getExecutorFactory,\n getStateStoreFactory,\n getSubstrateFactory,\n listRegisteredKinds,\n type AdapterConfig,\n type AdapterContext,\n} from \"../registry/runtime.js\"\nimport { registerBuiltins } from \"../registry/builtins.js\"\nimport {\n loadPlugins,\n loadPluginsFromConfig,\n} from \"../registry/plugins.js\"\n\nexport async function runRunSwarm(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: {\n manifest: { type: \"string\", short: \"m\" },\n once: { type: \"boolean\" },\n interval: { type: \"string\" },\n verbose: { type: \"boolean\", short: \"v\" },\n plugin: { type: \"string\", multiple: true },\n },\n })\n\n if (!values.manifest) {\n process.stderr.write(\n \"agentproto run-swarm: --manifest <path> is required.\\n\"\n )\n return 2\n }\n\n registerBuiltins()\n const cliPlugins = values.plugin ?? []\n const configPlugins = await loadPluginsFromConfig()\n await loadPlugins([...configPlugins, ...cliPlugins])\n\n const loaded = await loadManifest(resolvePath(values.manifest))\n const verbose = values.verbose === true\n\n const cleanups: Array<() => Promise<void> | void> = []\n const ctx: AdapterContext = {\n baseDir: loaded.baseDir,\n registerCleanup: (fn) => cleanups.push(fn),\n }\n\n const telemetry: Telemetry | undefined = verbose\n ? stderrTelemetry({ prefix: \"agentproto run-swarm: \" })\n : undefined\n\n let ports: RuntimePorts\n try {\n ports = await buildPorts(loaded, ctx, telemetry)\n } catch (err) {\n process.stderr.write(\n `agentproto run-swarm: ${err instanceof Error ? err.message : String(err)}\\n`\n )\n await runCleanups(cleanups)\n return 1\n }\n\n const onceMode = values.once === true\n const intervalMs = parseInterval(values.interval) ?? 2000\n\n if (verbose) {\n logVerbose(`loaded manifest \"${loaded.manifest.id}\" from ${loaded.path}`)\n logVerbose(\n `participants: ${ports.participants.map((p) => p.displayName).join(\", \")}`\n )\n logVerbose(\n `substrate=${ports.substrate.kind} dispatcher=${ports.dispatcher.kind} state=${ports.state.kind}`\n )\n const registered = listRegisteredKinds()\n logVerbose(\n `registered: substrates=[${registered.substrates.join(\",\")}] dispatchers=[${registered.dispatchers.join(\",\")}] executors=[${registered.executors.join(\",\")}] stateStores=[${registered.stateStores.join(\",\")}]`\n )\n }\n\n const controller = new AbortController()\n process.once(\"SIGINT\", () => {\n if (verbose) logVerbose(\"SIGINT received, draining current cycle…\")\n controller.abort()\n })\n\n try {\n do {\n if (controller.signal.aborted) break\n try {\n // Per-cycle progress is now emitted via the Telemetry port\n // (see stderrTelemetry above). The return value is still\n // useful for error context.\n await runTurn(ports, { signal: controller.signal })\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n process.stderr.write(`agentproto run-swarm: cycle failed — ${msg}\\n`)\n }\n if (onceMode) break\n await sleep(intervalMs, controller.signal)\n } while (!controller.signal.aborted)\n } finally {\n await runCleanups(cleanups)\n }\n\n return 0\n}\n\nasync function buildPorts(\n loaded: LoadedManifest,\n ctx: AdapterContext,\n telemetry: Telemetry | undefined\n): Promise<RuntimePorts> {\n const manifest = loaded.manifest\n\n const substrate = await buildSubstrate(manifest, ctx)\n const dispatcher = await buildDispatcher(manifest, ctx)\n const state = await buildState(manifest, ctx)\n const participants = buildParticipants(manifest)\n const executors = await buildExecutors(manifest, ctx)\n\n return {\n substrate,\n dispatcher,\n state,\n participants,\n executors,\n ...(telemetry ? { telemetry } : {}),\n }\n}\n\nasync function buildSubstrate(\n manifest: MultiAgentRuntimeManifest,\n ctx: AdapterContext\n): Promise<Substrate> {\n const cfg = manifest.substrate as AdapterConfig\n const factory = getSubstrateFactory(cfg.kind)\n if (!factory) {\n throw new Error(\n `unknown substrate kind '${cfg.kind}'. Registered kinds: [${listRegisteredKinds().substrates.join(\", \") || \"(none)\"}]. Pass --plugin <module-id> or add it to ~/.agentproto/config.json plugins[] to register a third-party substrate.`\n )\n }\n return factory(cfg, ctx)\n}\n\nasync function buildDispatcher(\n manifest: MultiAgentRuntimeManifest,\n ctx: AdapterContext\n) {\n const cfg = manifest.dispatcher as AdapterConfig\n const factory = getDispatcherFactory(cfg.kind)\n if (!factory) {\n throw new Error(\n `unknown dispatcher kind '${cfg.kind}'. Registered kinds: [${listRegisteredKinds().dispatchers.join(\", \") || \"(none)\"}].`\n )\n }\n return factory(cfg, ctx)\n}\n\nasync function buildState(\n manifest: MultiAgentRuntimeManifest,\n ctx: AdapterContext\n): Promise<StateStore> {\n const cfg = (manifest.state ?? { kind: \"fs\" }) as AdapterConfig\n const factory = getStateStoreFactory(cfg.kind)\n if (!factory) {\n throw new Error(\n `unknown state-store kind '${cfg.kind}'. Registered kinds: [${listRegisteredKinds().stateStores.join(\", \") || \"(none)\"}].`\n )\n }\n return factory(cfg, ctx)\n}\n\nfunction buildParticipants(\n manifest: MultiAgentRuntimeManifest\n): readonly ParticipantDescriptor[] {\n return manifest.participants.map((p) => ({\n id: p.id,\n displayName: p.displayName ?? p.id,\n executor: p.executor,\n role: p.role,\n meta: p.meta,\n }))\n}\n\nasync function buildExecutors(\n manifest: MultiAgentRuntimeManifest,\n ctx: AdapterContext\n): Promise<ReadonlyMap<string, ParticipantExecutor>> {\n const map = new Map<string, ParticipantExecutor>()\n const kinds = new Set(manifest.participants.map((p) => p.executor))\n for (const kind of kinds) {\n const factory = getExecutorFactory(kind)\n if (!factory) {\n throw new Error(\n `unknown executor kind '${kind}'. Registered kinds: [${listRegisteredKinds().executors.join(\", \") || \"(none)\"}]. Pass --plugin <module-id> or add the executor's package to ~/.agentproto/config.json plugins[].`\n )\n }\n map.set(kind, await factory({ kind }, ctx))\n }\n return map\n}\n\nasync function runCleanups(\n cleanups: ReadonlyArray<() => Promise<void> | void>\n): Promise<void> {\n for (const fn of cleanups) {\n try {\n await fn()\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n process.stderr.write(`agentproto run-swarm: cleanup failed — ${msg}\\n`)\n }\n }\n}\n\nfunction parseInterval(value: string | undefined): number | undefined {\n if (!value) return undefined\n const match = /^(\\d+)(ms|s)?$/.exec(value)\n if (!match) return undefined\n const n = Number(match[1])\n const unit = match[2] ?? \"ms\"\n return unit === \"s\" ? n * 1000 : n\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolveP) => {\n if (signal.aborted) {\n resolveP()\n return\n }\n const t = setTimeout(() => resolveP(), ms)\n signal.addEventListener(\"abort\", () => {\n clearTimeout(t)\n resolveP()\n })\n })\n}\n\nfunction logVerbose(msg: string): void {\n process.stderr.write(`agentproto run-swarm: ${msg}\\n`)\n}\n","/**\n * Shared PTY factory loader.\n *\n * `node-pty` is an optional native dep — when present, the factory\n * returns a function that spawns child processes under a real PTY\n * (so ANSI escapes, alt-screen apps, key bindings and resize all\n * work). When absent, returns null and callers degrade to\n * `child_process.spawn` (no PTY).\n *\n * Two consumers today:\n * - `createTunnelServer` (packages/acp/src/tunnel/server.ts) — cloud-\n * dispatched spawns over the tunnel use this factory when the\n * spawn frame requests `pty: true`.\n * - `createGateway` (packages/runtime/src/index.ts) — local\n * `POST /sessions/terminal` route + MCP `start_terminal_session`\n * tool use this factory to register PTY-backed sessions in the\n * daemon's registry.\n *\n * Both consumers agree on the same minimal `PtyProcess` shape\n * (defined in `@agentproto/acp/tunnel`); the function we return here\n * satisfies both their `spawnPty` option types structurally.\n */\n\nimport type { PtyProcess } from \"@agentproto/acp/tunnel\"\n\nexport interface PtyFactoryOptions {\n command: string\n args: string[]\n cwd?: string\n env?: Record<string, string>\n cols: number\n rows: number\n}\n\nexport type PtyFactory = (opts: PtyFactoryOptions) => PtyProcess\n\nexport async function loadNodePtyFactory(): Promise<PtyFactory | null> {\n try {\n const nodePtyMod = await import(\"node-pty\")\n // node-pty is CJS — `import()` wraps the module under `.default` in ESM.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const nodePty = (nodePtyMod as any).default ?? nodePtyMod\n if (typeof nodePty.spawn !== \"function\") return null\n return (opts) => {\n const pty = nodePty.spawn(opts.command, opts.args, {\n name: \"xterm-256color\",\n cols: opts.cols,\n rows: opts.rows,\n cwd: opts.cwd,\n env: {\n ...(process.env as Record<string, string>),\n ...(opts.env ?? {}),\n },\n })\n const proc: PtyProcess = {\n get pid() {\n return pty.pid\n },\n write(data: string) {\n pty.write(data)\n },\n resize(cols: number, rows: number) {\n pty.resize(cols, rows)\n },\n kill(signal?: string) {\n pty.kill(signal)\n },\n onData(handler: (data: string) => void) {\n pty.onData(handler)\n },\n onExit(handler: (event: { exitCode: number; signal?: number }) => void) {\n pty.onExit(handler)\n },\n }\n return proc\n }\n } catch {\n return null\n }\n}\n","/**\n * `agentproto serve [--workspace <dir>] [--port <n>] [--connect <wss>]`\n *\n * The single canonical agentproto daemon. Boots a local gateway\n * (HTTP + MCP server + sessions registry + workspace fs +\n * heartbeat) on `--port` (default 18790), and OPTIONALLY opens an\n * outbound WebSocket tunnel to a host (Guilde-shaped API) when\n * `--connect <url>` is set. With or without the tunnel:\n *\n * - HTTP /sessions, /sessions/agent, /sessions/:id/* routes work\n * - MCP tools (start_agent_session, prompt_agent_session, …) are\n * reachable via the daemon's /mcp transport\n * - the LocalDaemonSessionsCard in guilde-web sees every spawn\n *\n * When the tunnel is up, every tunnel-driven spawn is also adopted\n * into the gateway's sessions registry via the\n * `createTunnelServer.onChildSpawned` hook, so an operator\n * dispatching from the cloud lands in the same /sessions list as a\n * user spawning locally — single source of truth for what's running\n * on the user's machine.\n *\n * Replaces the old `playground/scripts/gateway.ts` for production\n * use (the playground keeps its own script for the MCP CRUD\n * doctype demo). v1 reuses createGateway with empty specs + a\n * noop heartbeat; the playground variant adds toolSpec/agentSpec/\n * etc. for its specific spec-authoring use case.\n *\n * Reconnect-with-backoff is built in for the tunnel. The local\n * gateway stays up across reconnects — only the tunnel cycles.\n *\n * Authorization: v0 trusts every spawn frame the host sends — there\n * is no policy file. Future work will gate spawn requests on a\n * `~/.agentproto/policy.toml` allowlist (see project_agentproto_repos\n * memory). The token is the only access control today.\n */\n\nimport { parseArgs } from \"node:util\"\nimport { hostname, userInfo } from \"node:os\"\nimport { resolve as resolvePath } from \"node:path\"\nimport { promises as fs } from \"node:fs\"\nimport { randomUUID } from \"node:crypto\"\nimport * as childProc from \"node:child_process\"\nimport {\n readHost,\n isExpired,\n formatExpiry,\n} from \"../util/credentials.js\"\nimport { loadNodePtyFactory, type PtyFactory } from \"../util/pty-factory.js\"\nimport { loadConfig } from \"@agentproto/runtime/config\"\nimport { loadWorkspacesConfig } from \"@agentproto/runtime/workspaces-config\"\nimport {\n createTunnelServer,\n wrapWebSocket,\n type FrameSink,\n} from \"@agentproto/acp/tunnel\"\nimport {\n createGateway,\n sweepStaleRuntimeMetas,\n unlinkRuntimeMeta,\n type AgentAdapterResolver,\n type GatewayHandle,\n} from \"@agentproto/runtime\"\nimport { createAgentCliRuntime } from \"@agentproto/driver-agent-cli\"\nimport {\n resolveAdapter,\n listInstalledAdapters,\n} from \"../registry/resolve.js\"\nimport WebSocket from \"ws\"\n\ninterface ServeOpts {\n /** Workspace dir. Defaults to cwd. */\n workspace: string\n /** Local HTTP port. Default 18790. */\n port: number\n /** Bind addr. Default 127.0.0.1. */\n bind: string\n /** Optional cloud WS URL. When unset, daemon runs local-only. */\n connect?: string\n token?: string\n label: string\n /** Initial reconnect delay in ms; doubled on each failure up to 30s. */\n reconnectMinMs?: number\n reconnectMaxMs?: number\n /** Extra Origin patterns trusted to drive mutating /sessions/* routes\n * + the PTY WS without a Bearer token. Localhost is always trusted\n * by default; add production origins via repeatable `--allow-origin`. */\n allowedOrigins?: readonly string[]\n /** When true, drop the localhost-wildcard default. Only `allowedOrigins`\n * is honoured. Useful for hardened / shared-host setups. */\n strictOrigins?: boolean\n}\n\nexport async function runServe(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: {\n connect: { type: \"string\", short: \"c\" },\n token: { type: \"string\", short: \"t\" },\n label: { type: \"string\", short: \"l\" },\n workspace: { type: \"string\", short: \"w\" },\n port: { type: \"string\", short: \"p\" },\n bind: { type: \"string\", short: \"b\" },\n \"allow-origin\": { type: \"string\", multiple: true },\n interactive: { type: \"boolean\", short: \"i\" },\n profile: { type: \"string\" },\n },\n })\n\n // Load ~/.agentproto/config.json once and fall back through it for\n // every knob below. Order: CLI flag → env var → config.json →\n // hardcoded default. Errors during read are non-fatal — the file\n // is optional. Resolves to an empty object when missing.\n const cfg = await loadConfig()\n\n // ── Profile resolution ─────────────────────────────────────────\n // `--profile <name>` (or `activeProfile` in config.json) picks a\n // named bundle from `profiles[name]` and shallow-merges it OVER the\n // top-level daemon/tunnel. A profile only needs to declare the\n // fields that differ from the top-level (typically tunnel.host +\n // tunnel.token); everything else falls through.\n //\n // Explicit `--profile <name>` is fatal if the profile doesn't\n // exist (better than silently using top-level defaults — that\n // path led to \"why is it connecting to prod?\" head-scratching).\n // An `activeProfile` pointing at a missing profile only warns,\n // since the user may have just deleted it.\n const profileName = values.profile ?? cfg.activeProfile\n const profile = profileName ? cfg.profiles?.[profileName] : undefined\n if (values.profile && !profile) {\n process.stderr.write(\n `agentproto serve: profile \"${values.profile}\" not found in ` +\n `~/.agentproto/config.json. Available: ${\n cfg.profiles ? Object.keys(cfg.profiles).join(\", \") || \"(none)\" : \"(no profiles block)\"\n }\\n`\n )\n return 2\n }\n if (cfg.activeProfile && !values.profile && !profile) {\n process.stderr.write(\n `agentproto serve: ⚠ activeProfile=\"${cfg.activeProfile}\" but no matching ` +\n `entry in profiles[]; falling back to top-level config.\\n`\n )\n }\n if (profile && process.stdout.isTTY) {\n process.stdout.write(\n `agentproto serve: using profile \"${profileName}\"\\n`\n )\n }\n\n const cfgDaemon = { ...(cfg.daemon ?? {}), ...(profile?.daemon ?? {}) }\n const cfgTunnel = { ...(cfg.tunnel ?? {}), ...(profile?.tunnel ?? {}) }\n\n // Workspace defaults: --workspace > config.json > cwd. Validated\n // below — must exist + be a directory.\n const workspace = resolvePath(\n values.workspace ?? cfgDaemon.workspace ?? process.cwd(),\n )\n try {\n const stat = await fs.stat(workspace)\n if (!stat.isDirectory()) {\n process.stderr.write(\n `agentproto serve: --workspace \"${workspace}\" is not a directory.\\n`\n )\n return 2\n }\n } catch {\n process.stderr.write(\n `agentproto serve: --workspace \"${workspace}\" does not exist.\\n` +\n ` Create it first: mkdir -p \"${workspace}\"\\n`\n )\n return 2\n }\n\n const port = values.port\n ? Number.parseInt(values.port, 10)\n : typeof cfgDaemon.port === \"number\"\n ? cfgDaemon.port\n : 18790\n if (!Number.isFinite(port) || port <= 0 || port > 65535) {\n process.stderr.write(`agentproto serve: invalid --port \"${values.port}\".\\n`)\n return 2\n }\n\n // Default label is informative — the host's UI shows it next to\n // every spawn so users know which laptop is executing what.\n const label = values.label ?? cfgDaemon.label ?? `${userInfo().username}@${hostname()}`\n\n // tunnel.host + tunnel.autoconnect from config feed --connect when\n // the user hasn't passed one. autoconnect=false leaves it CLI-only.\n const connectFlag =\n values.connect ??\n (cfgTunnel.autoconnect && cfgTunnel.host ? cfgTunnel.host : undefined)\n\n // Token resolution precedence:\n // 1. --token <jwt> — explicit override\n // 2. $AGENTPROTO_TOKEN — env, useful for CI / docker\n // 3. config.json `tunnel.token` (or profile.tunnel.token) — set\n // via `agentproto config set tunnel.token` or hand-edited.\n // Profiles use this so a per-environment token lives next to\n // its host without the credentials.json host-key footgun.\n // 4. ~/.agentproto/credentials.json[host] — `agentproto auth login`\n //\n // Step 4 only applies when --connect is set (we have a host to look\n // up) and the credential isn't expired. Expiry is non-fatal: we log\n // a warning and let the host reject the connect; that surfaces a\n // clearer error than a silent 401 mid-tunnel.\n let token: string | undefined =\n values.token ?? process.env.AGENTPROTO_TOKEN ?? cfgTunnel.token\n if (!token && connectFlag) {\n const cred = await readHost(connectFlag)\n if (cred) {\n if (isExpired(cred)) {\n process.stderr.write(\n `agentproto serve: ⚠ credentials for ${connectFlag} are expired (${formatExpiry(cred)}). ` +\n `Re-run \\`agentproto auth login --host ${connectFlag}\\`.\\n`\n )\n }\n token = cred.token\n process.stdout.write(\n `agentproto serve: using token from credentials.json (${formatExpiry(cred)})\\n`\n )\n }\n }\n\n // `--allow-origin <url>` is repeatable. parseArgs gives us a string[]\n // when `multiple: true` is set. Origins are merged with config's\n // daemon.allowedOrigins so CLI flags ADD to (not replace) the config.\n const allowOriginRaw = values[\"allow-origin\"]\n const cliOrigins = Array.isArray(allowOriginRaw) ? allowOriginRaw : []\n const cfgOrigins = Array.isArray(cfgDaemon.allowedOrigins)\n ? cfgDaemon.allowedOrigins\n : []\n const merged = [...new Set([...cfgOrigins, ...cliOrigins])]\n const allowedOrigins = merged.length > 0 ? merged : undefined\n\n const opts: ServeOpts = {\n workspace,\n port,\n bind: values.bind ?? cfgDaemon.bind ?? \"127.0.0.1\",\n ...(connectFlag ? { connect: connectFlag } : {}),\n ...(token ? { token } : {}),\n label,\n ...(allowedOrigins ? { allowedOrigins } : {}),\n ...(cfgDaemon.strictOrigins === true ? { strictOrigins: true } : {}),\n }\n\n // ── adapter resolver (powers MCP start_agent_session) ──\n // Wires the cli's adapter registry into the gateway's\n // /sessions/agent route + the start_agent_session MCP tool.\n // When unwired, those routes return 501 with a clear message.\n const resolveAgentAdapter: AgentAdapterResolver = async slug => {\n try {\n const adapter = await resolveAdapter(slug)\n const runtime = createAgentCliRuntime(adapter.handle)\n return {\n async startSession({ cwd, resumeSessionId }) {\n return runtime.start({\n cwd,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n })\n },\n commandPreview:\n `${adapter.handle.bin} ${(adapter.handle.bin_args ?? []).join(\" \")}`.trim(),\n }\n } catch (err) {\n console.warn(\n `[agentproto serve] resolveAgentAdapter('${slug}') failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n return null\n }\n }\n\n // ── pty factory ──\n // Resolved once at boot and shared between the local gateway (powers\n // POST /sessions/terminal + the four start_terminal_session MCP\n // tools + the WS /sessions/:id/pty bridge) AND the tunnel server\n // below (cloud-driven spawns with pty:true on the spawn frame).\n // When node-pty is missing, the factory is null and both paths\n // gracefully degrade — PTY routes return 501 / the tunnel rejects\n // pty:true spawns.\n const spawnPty = await loadNodePtyFactory()\n\n // ── boot the gateway ──\n // Empty specs + noop buildAgent. The playground gateway script\n // still has its own setup for spec authoring + Mastra heartbeat.\n let gateway: GatewayHandle\n try {\n gateway = await createGateway({\n workspace: opts.workspace,\n port: opts.port,\n bind: opts.bind,\n specs: [],\n name: \"agentproto-serve\",\n // BOOT.md is silly for a tunnel daemon — skip it.\n boot: false,\n resolveAgentAdapter,\n // Discovery for UIs / operators — `GET /adapters` + `list_adapters`\n // MCP tool. Walks node_modules @agentproto/adapter-* on each call;\n // cheap enough that we don't bother caching here.\n listAgentAdapters: listInstalledAdapters,\n ...(spawnPty ? { spawnPty } : {}),\n ...(opts.allowedOrigins\n ? { allowedOrigins: opts.allowedOrigins }\n : {}),\n ...(opts.strictOrigins ? { strictOrigins: true } : {}),\n })\n } catch (err) {\n process.stderr.write(\n `agentproto serve: gateway boot failed — ${\n err instanceof Error ? err.message : String(err)\n }\\n`\n )\n return 1\n }\n\n printBootBanner({\n url: gateway.url,\n workspace: gateway.workspace,\n ptyEnabled: spawnPty != null,\n allowedOrigins: opts.allowedOrigins,\n strictOrigins: opts.strictOrigins === true,\n connect: opts.connect,\n })\n\n // ── stale runtime.json sweep ──\n // Other workspaces may carry leftover runtime.json files from\n // previous daemon processes that didn't shut down gracefully\n // (kill -9, crash, reboot). Their tokens are stale; the CLI's\n // discovery layer would otherwise pick them up and send wrong\n // tokens to THIS daemon, producing a confusing 401. Clean them\n // here at boot so the user doesn't have to.\n try {\n const wsConfig = await loadWorkspacesConfig()\n const paths = wsConfig.workspaces.map(w => w.path)\n const cleaned = await sweepStaleRuntimeMetas(paths, opts.workspace)\n if (cleaned.length > 0) {\n process.stderr.write(\n `${color.dim}cleaned ${cleaned.length} stale runtime.json file(s) (dead PID)${color.reset}\\n`,\n )\n }\n } catch {\n // workspaces.json may not exist yet — no cleanup needed.\n }\n\n // ── shutdown wiring (covers both local-only and tunnel modes) ──\n const aborter = new AbortController()\n let shuttingDown = false\n const shutdown = async (signal: NodeJS.Signals): Promise<void> => {\n if (shuttingDown) return\n shuttingDown = true\n process.stderr.write(\n `\\n${color.dim}── shutting down (${signal}) ──${color.reset}\\n`,\n )\n aborter.abort()\n await gateway.stop().catch(() => undefined)\n // Delete our own runtime.json so the next CLI invocation doesn't\n // discover it as a \"live daemon\". Best-effort — the next boot\n // would clean it up anyway via the sweep above.\n await unlinkRuntimeMeta(opts.workspace).catch(() => undefined)\n process.exit(0)\n }\n process.once(\"SIGINT\", () => void shutdown(\"SIGINT\"))\n process.once(\"SIGTERM\", () => void shutdown(\"SIGTERM\"))\n // Terminal-window close / SSH-disconnect / logout → SIGHUP. Without\n // a handler, Node default-terminates the process which bypasses our\n // gateway.stop() — sessions.json then never gets the final flush.\n // Registry's `process.on(\"exit\")` belt-and-suspenders catches it\n // too, but firing the same logical path here gives a clean shutdown\n // banner + tunnel teardown.\n process.once(\"SIGHUP\", () => void shutdown(\"SIGHUP\"))\n\n // ── interactive mode: chain into the watch TUI as a child ─────\n // Spawn `agentproto sessions --watch` in the same terminal,\n // inheriting stdio. When the child exits (q / Ctrl-C in the TUI),\n // we treat it as a shutdown request for the daemon too — running\n // the TUI WITHOUT a daemon underneath would just show \"no\n // sessions\" forever, which isn't what `serve --interactive`\n // promised. The user can still detach with Ctrl-] then q\n // (PTY-attach detach chord) to leave the TUI but keep the daemon\n // running — but a Ctrl-C / q in the watch view tears the lot.\n if (values.interactive) {\n process.stderr.write(\n `${color.dim}entering interactive monitor — q in the TUI to quit (daemon + TUI both).${color.reset}\\n`,\n )\n // Use process.argv[0] (this node) + process.argv[1] (this script)\n // for the child so we don't depend on $PATH finding the right\n // shim. argv carries `sessions --watch` plus an env override so\n // the child discovers THIS daemon's URL + token directly without\n // re-walking workspaces.json.\n const childArgv = [process.argv[1] ?? \"\", \"sessions\", \"--watch\"]\n const child = childProc.spawn(process.execPath, childArgv, {\n stdio: \"inherit\",\n env: {\n ...process.env,\n AGENTPROTO_DAEMON_URL: gateway.url,\n // `gateway.token` is the per-boot daemon bearer (different\n // from `token`, which was the tunnel JWT). Without this, the\n // child's restart/kill calls would 401 against its own\n // parent — exactly the bug that closed --interactive after\n // any failed action.\n AGENTPROTO_DAEMON_TOKEN: gateway.token,\n },\n })\n await new Promise<void>(resolve => {\n child.once(\"exit\", () => resolve())\n aborter.signal.addEventListener(\"abort\", () => {\n try {\n child.kill(\"SIGTERM\")\n } catch {\n /* ignore */\n }\n })\n })\n // TUI quit → tear daemon down. If the SIGINT handler already\n // started a shutdown (parent + child both saw Ctrl-C from the\n // same process group), skip — the handler will finish on its\n // own. Otherwise drive the shutdown ourselves. The\n // `shuttingDown` flag in the outer scope is the source of truth.\n if (!shuttingDown) {\n aborter.abort()\n await gateway.stop().catch(() => undefined)\n await unlinkRuntimeMeta(opts.workspace).catch(() => undefined)\n }\n return 0\n }\n\n // ── local-only mode: nothing else to do ──\n if (!opts.connect) {\n // Banner already covered the \"local-only\" state. Just park.\n process.stderr.write(\n `${color.dim}Press Ctrl-C to stop.${color.reset}\\n`,\n )\n await new Promise<void>(resolve => {\n aborter.signal.addEventListener(\"abort\", () => resolve())\n })\n return 0\n }\n\n process.stderr.write(\n `${color.dim}tunnel · connecting to ${opts.connect} as '${opts.label}'…${color.reset}\\n`,\n )\n\n let backoffMs = opts.reconnectMinMs ?? 1_000\n const backoffMax = opts.reconnectMaxMs ?? 30_000\n // Shared flag — flipped by the `reconnect_soon` handler inside\n // runOneTunnel to skip the 2s post-clean-close pause. Lets a host\n // doing a graceful preStop drain finish its rollover in ~2s instead\n // of the daemon's normal ~30s backoff (or even the 2s settle).\n const reconnectState = { immediate: false }\n while (!aborter.signal.aborted) {\n try {\n await runOneTunnel(opts, gateway, spawnPty, aborter.signal, reconnectState)\n backoffMs = opts.reconnectMinMs ?? 1_000 // success resets backoff\n if (reconnectState.immediate) {\n reconnectState.immediate = false\n // Host signaled graceful drain — skip the settle pause and\n // reconnect right away (the new replica is already listening).\n continue\n }\n // Brief pause before reconnecting even on a clean close. This prevents\n // an infinite reconnect fight when two daemon processes are running with\n // the same token — each close-then-reconnect gets a minimum delay rather\n // than spinning at CPU speed.\n await sleep(2_000, aborter.signal)\n } catch (err) {\n if (aborter.signal.aborted) break\n const msg = err instanceof Error ? err.message : String(err)\n process.stderr.write(\n `agentproto serve: tunnel error: ${msg}\\n reconnecting in ${backoffMs}ms…\\n`\n )\n await sleep(backoffMs, aborter.signal)\n backoffMs = Math.min(backoffMs * 2, backoffMax)\n }\n }\n\n return 0\n}\n\n/**\n * One end-to-end tunnel attempt. Resolves when the socket closes\n * cleanly (host hung up); rejects on connection error or unexpected\n * close. The reconnect loop catches both and retries.\n */\nasync function runOneTunnel(\n opts: ServeOpts,\n gateway: GatewayHandle,\n spawnPty: PtyFactory | null,\n signal: AbortSignal,\n reconnectState: { immediate: boolean }\n): Promise<void> {\n if (!opts.connect) throw new Error(\"runOneTunnel: --connect not set\")\n const headers: Record<string, string> = {\n \"user-agent\": \"agentproto/0.1.0-alpha\",\n }\n if (opts.token) headers.authorization = `Bearer ${opts.token}`\n\n const ws = new WebSocket(opts.connect, { headers })\n\n // Wait for OPEN (or fail).\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n ws.off(\"error\", onError)\n resolve()\n }\n const onError = (err: Error) => {\n ws.off(\"open\", onOpen)\n reject(err)\n }\n ws.once(\"open\", onOpen)\n ws.once(\"error\", onError)\n if (signal.aborted) {\n ws.close()\n reject(new Error(\"Aborted before WS opened.\"))\n }\n signal.addEventListener(\"abort\", () => {\n ws.close()\n reject(new Error(\"Aborted while WS connecting.\"))\n })\n })\n\n process.stderr.write(`agentproto serve: tunnel up.\\n`)\n\n const sink: FrameSink = wrapWebSocket(ws as unknown as Parameters<typeof wrapWebSocket>[0])\n\n // Keep-alive: Cloud Run (and most reverse-proxies) close idle WebSocket\n // connections after ~5 minutes. Send a ping every 30s so the connection\n // stays alive between infrequent agent calls.\n const keepaliveInterval = setInterval(() => {\n try {\n sink.send({ t: \"ping\", nonce: randomUUID() })\n } catch {\n // sink already closing — the onClose handler below will clear us\n }\n }, 30_000)\n\n const server = createTunnelServer({\n sink,\n label: opts.label,\n pty: spawnPty !== null,\n ...(spawnPty ? { spawnPty } : {}),\n // Generic HTTP-relay upstream for tunnel `http_request` frames.\n // Cloud-side callers (e.g. the API's local-daemon filesystem\n // provider) can now route MCP JSON-RPC + any other HTTP through\n // the daemon without needing a public URL. We point at the local\n // gateway since that's where `/mcp`, `/sessions`, `/events` live.\n httpUpstream: gateway.url,\n // WS forwarding upstream — daemon dials the local gateway's WS\n // endpoints (/sessions/:id/pty, etc) and pipes frames to the host.\n // Used by the cloud tunnel pod so browsers on mobile can attach to\n // interactive PTY sessions even though the daemon is only reachable\n // through the host (not directly).\n dialUpstreamWs: async ({ url, protocols, headers }) => {\n // Dial with the same `ws` lib already used for the host tunnel.\n // Resolve once we receive `open`; reject on `error` / `unexpected-response`.\n //\n // Origin gotcha: the daemon's own HTTP gateway requires Origin in\n // its allowlist for mutating + WS routes. When we self-dial here\n // (no browser in the path), `ws` doesn't set Origin and the\n // request gets 401'd by the daemon's own auth. Inject a loopback\n // Origin matching the URL — `http://127.0.0.1:*` is always in the\n // default allowlist.\n const upstreamHeaders: Record<string, string> = {\n ...(headers as Record<string, string> | undefined),\n }\n if (!upstreamHeaders[\"origin\"] && !upstreamHeaders[\"Origin\"]) {\n try {\n const u = new URL(url)\n const httpScheme = u.protocol === \"wss:\" ? \"https:\" : \"http:\"\n upstreamHeaders[\"Origin\"] = `${httpScheme}//${u.host}`\n } catch {\n /* malformed url — daemon will reject with a clear error */\n }\n }\n return await new Promise((resolve, reject) => {\n const sock = new WebSocket(url, protocols ? [...protocols] : undefined, {\n headers: upstreamHeaders,\n })\n const onceOpen = () => {\n sock.off(\"error\", onceError)\n sock.off(\"unexpected-response\", onceUnexpected)\n resolve({\n protocol: sock.protocol ?? \"\",\n send: (data, sendOpts) => {\n sock.send(data, { binary: sendOpts.binary })\n },\n close: (code, reason) => {\n try {\n sock.close(code, reason)\n } catch {\n /* defensive — socket may already be closed */\n }\n },\n onMessage: handler => {\n sock.on(\"message\", (raw: Buffer, isBinary: boolean) => {\n handler(raw, isBinary)\n })\n },\n onClose: handler => {\n sock.on(\"close\", (code: number, reason: Buffer) => {\n handler(code, reason.toString(\"utf8\"))\n })\n },\n onError: handler => {\n sock.on(\"error\", (err: Error) => handler(err))\n },\n })\n }\n const onceError = (err: Error) => {\n sock.off(\"open\", onceOpen)\n reject(err)\n }\n const onceUnexpected = (\n _req: unknown,\n res: { statusCode?: number }\n ) => {\n sock.off(\"open\", onceOpen)\n reject(new Error(`Unexpected server response: ${res.statusCode ?? 0}`))\n }\n sock.once(\"open\", onceOpen)\n sock.once(\"error\", onceError)\n sock.once(\"unexpected-response\", onceUnexpected)\n })\n },\n // v0 authorize hook: trust the bearer-authenticated host completely.\n // Token possession proves the host was provisioned for this daemon.\n // Per-spawn policy filtering will land alongside the policy.toml.\n authorize: req => req,\n // ── AIP-46 bridge: tunnel spawns land in the gateway registry ──\n // Every cloud-driven spawn shows up in `gateway.url/sessions`\n // and the LocalDaemonSessionsCard, alongside spawns originated\n // through MCP tools or POST /sessions/agent. The execId is the\n // host's stable id — keep it so cloud cli_sessions rows can\n // cross-ref the daemon-side descriptor.\n onChildSpawned: ({ execId, child, request }) => {\n gateway.sessions.register({\n id: execId,\n child,\n workspaceSlug: opts.label,\n command: [request.command, ...request.args].join(\" \"),\n kind: \"agent-cli\",\n label: `tunnel: ${request.command.split(\"/\").pop() ?? request.command}`,\n })\n },\n // Graceful drain hook — flip the outer loop's \"reconnect immediately\"\n // flag and close the WS so the supervisor reconnects without backoff.\n // Host will follow up with close(1012) ~2s later as a hard backstop.\n onReconnectSoon: ({ reasonMs }) => {\n process.stderr.write(\n `agentproto serve: host signaled drain (reasonMs=${reasonMs ?? \"?\"}) — reconnecting immediately\\n`\n )\n reconnectState.immediate = true\n try {\n ws.close(1000, \"host_drain\")\n } catch {\n /* socket already closing */\n }\n },\n })\n\n // Block until the sink closes (peer disconnect or our shutdown).\n await new Promise<void>(resolve => {\n const offClose = sink.onClose(() => {\n clearInterval(keepaliveInterval)\n offClose()\n resolve()\n })\n if (signal.aborted) {\n clearInterval(keepaliveInterval)\n server.close().finally(() => resolve())\n }\n signal.addEventListener(\"abort\", () => {\n clearInterval(keepaliveInterval)\n server.close().finally(() => resolve())\n })\n })\n\n process.stderr.write(`agentproto serve: tunnel closed.\\n`)\n}\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise(resolve => {\n if (signal.aborted) return resolve()\n const timer = setTimeout(resolve, ms)\n signal.addEventListener(\"abort\", () => {\n clearTimeout(timer)\n resolve()\n })\n })\n}\n\n/**\n * Boot banner. Single block so the user sees the whole \"gateway up\"\n * picture in one place, with subtle color when stdout is a TTY. The\n * old format was:\n *\n * agentproto serve: gateway up on http://...\n * workspace: /abs/path\n * mcp: http://.../mcp\n * …\n *\n * What this prints instead:\n *\n * ─ agentproto · gateway up · http://127.0.0.1:18790 ─\n * workspace /abs/path\n * pty enabled (node-pty)\n * origins localhost:* (default)\n * endpoints /mcp · /sessions · /events · /sessions/:id/pty (WS)\n * mode local-only\n */\nfunction printBootBanner(opts: {\n url: string\n workspace: string\n ptyEnabled: boolean\n allowedOrigins?: readonly string[]\n strictOrigins?: boolean\n connect?: string\n}): void {\n const c = color\n const home = process.env.HOME ?? \"\"\n const workspace =\n home && opts.workspace.startsWith(home)\n ? \"~\" + opts.workspace.slice(home.length)\n : opts.workspace\n const ptyState = opts.ptyEnabled\n ? `${c.green}enabled${c.reset} ${c.dim}(node-pty)${c.reset}`\n : `${c.amber}disabled${c.reset} ${c.dim}(install node-pty to enable)${c.reset}`\n let origins: string\n if (opts.strictOrigins) {\n origins =\n opts.allowedOrigins && opts.allowedOrigins.length > 0\n ? `${c.amber}STRICT${c.reset} ${opts.allowedOrigins.join(\" · \")} ${c.dim}(localhost defaults disabled)${c.reset}`\n : `${c.red}STRICT · empty allowlist${c.reset} ${c.dim}(every Origin will 401 — only Bearer-token works)${c.reset}`\n } else {\n origins =\n opts.allowedOrigins && opts.allowedOrigins.length > 0\n ? opts.allowedOrigins.join(\" · \") +\n ` ${c.dim}+ localhost (default)${c.reset}`\n : `${c.dim}localhost:* only (default)${c.reset}`\n }\n const mode = opts.connect\n ? `${c.cyan}tunnel${c.reset} ${c.dim}→ ${opts.connect}${c.reset}`\n : `${c.dim}local-only${c.reset}`\n const line = `${c.dim}─${c.reset}`\n process.stderr.write(\n `\\n${line} ${c.bold}agentproto${c.reset} ${c.dim}·${c.reset} gateway up ${c.dim}·${c.reset} ${c.cyan}${opts.url}${c.reset} ${line}\\n` +\n ` ${c.dim}workspace${c.reset} ${workspace}\\n` +\n ` ${c.dim}pty${c.reset} ${ptyState}\\n` +\n ` ${c.dim}origins${c.reset} ${origins}\\n` +\n ` ${c.dim}endpoints${c.reset} /mcp · /sessions · /events · /sessions/:id/pty ${c.dim}(WS)${c.reset}\\n` +\n ` ${c.dim}mode${c.reset} ${mode}\\n` +\n `\\n`,\n )\n}\n\n/**\n * Tiny ANSI palette gated on stdout being a TTY. Writing colors into\n * a logfile (launchd `StandardOutPath`) would litter the file with\n * `\\x1b[…m` noise; this strips when piped.\n */\nconst _isTty = !!(process.stderr as NodeJS.WriteStream).isTTY\nconst color = _isTty\n ? {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n amber: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n red: \"\\x1b[31m\",\n }\n : {\n reset: \"\",\n bold: \"\",\n dim: \"\",\n green: \"\",\n amber: \"\",\n cyan: \"\",\n red: \"\",\n }\n","/**\n * `~/.agentproto/workspaces.json` — single source of truth for the\n * local agentproto control plane. Tracks which directories the user\n * has opted into as agentproto workspaces, plus which one is \"active\"\n * (the daemon's default working set when no workspace is named in\n * a tool call).\n *\n * Why a config file instead of recreating an MCP entry per workspace:\n * - One daemon = one MCP entry in the user's IDE (clean to read in\n * `claude mcp list`, no `dapper_willow` / `noble_lantern` spam).\n * - The daemon walks `workspaces[]` at boot and exposes them all;\n * tools that need a target take an optional `workspace` arg and\n * fall back to `active` when omitted.\n * - The CLI (`agentproto workspace add/list/remove/use`), the daemon,\n * and the guilde-web onboarding dialog all read+write the same\n * file, so changes from one surface are immediately visible to\n * the others.\n *\n * File layout is intentionally boring (small, hand-editable JSON) —\n * future fields go on top, never break v1 readers.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, isAbsolute, resolve } from \"node:path\"\n\nexport const WORKSPACES_CONFIG_VERSION = 1 as const\n\nexport interface WorkspaceEntry {\n /** Stable handle — what tools accept as `workspace`. Lowercase\n * ASCII, hyphen-only. The CLI sanitises arbitrary names down to\n * this shape so paste-from-finder Just Works. */\n slug: string\n /** Absolute filesystem path. Required absolute so the daemon can\n * serve the workspace regardless of its own cwd. */\n path: string\n /** ISO-8601 — first time the entry was added. Pure metadata, no\n * behavioural impact. */\n addedAt: string\n /** Last time the entry was touched (renamed, path edited, used as\n * active). Lets the CLI sort by recency without an N+1 stat. */\n updatedAt: string\n /** Free-text label the user can attach so workspaces with similar\n * slugs stay distinguishable in `agentproto workspace list`. */\n label?: string\n}\n\nexport interface WorkspacesConfig {\n version: typeof WORKSPACES_CONFIG_VERSION\n /** Active workspace slug — daemon defaults to this when no\n * `workspace` arg is passed. May be undefined when no workspaces\n * are registered yet. */\n active?: string\n workspaces: WorkspaceEntry[]\n}\n\nexport const DEFAULT_CONFIG_DIR = (): string =>\n resolve(homedir(), \".agentproto\")\nexport const DEFAULT_CONFIG_PATH = (): string =>\n resolve(DEFAULT_CONFIG_DIR(), \"workspaces.json\")\n\n/** Reduce arbitrary user input to a safe slug. Aligns with what most\n * tooling validates against (`/^[a-z0-9][a-z0-9-]{0,63}$/`) so the\n * daemon never has to encode it for URLs or filesystem paths. */\nexport function sanitizeSlug(input: string): string {\n const trimmed = input.trim().toLowerCase()\n const cleaned = trimmed\n .replace(/[^a-z0-9_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 64)\n // Edge case: input was entirely non-conforming — fall back to a\n // generic so we never return an empty string.\n return cleaned || \"workspace\"\n}\n\n/** Read the config from disk. Returns an empty config (no workspaces,\n * no active) when the file is missing — this is the legitimate\n * first-boot state, not an error. */\nexport async function loadWorkspacesConfig(\n path: string = DEFAULT_CONFIG_PATH()\n): Promise<WorkspacesConfig> {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { version: WORKSPACES_CONFIG_VERSION, workspaces: [] }\n }\n throw err\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n throw new Error(\n `agentproto: ${path} is not valid JSON (${\n err instanceof Error ? err.message : String(err)\n }). Delete the file or fix it manually.`\n )\n }\n return normalizeConfig(parsed)\n}\n\n/** Write the config back. Creates the parent directory if missing.\n * Atomic-ish: writes to a temp file first, then renames over the\n * target — avoids the partial-write window where a concurrent reader\n * sees half a JSON object. */\nexport async function saveWorkspacesConfig(\n config: WorkspacesConfig,\n path: string = DEFAULT_CONFIG_PATH()\n): Promise<void> {\n const normalized = normalizeConfig(config)\n await fs.mkdir(dirname(path), { recursive: true })\n const tmp = `${path}.tmp.${process.pid}`\n await fs.writeFile(tmp, JSON.stringify(normalized, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, path)\n}\n\n/**\n * Pure helpers — caller manages persistence. Returns a NEW config\n * (never mutates) so callers can compose multiple updates before\n * a single save.\n */\nexport function addWorkspace(\n config: WorkspacesConfig,\n input: { slug: string; path: string; label?: string }\n): WorkspacesConfig {\n if (!isAbsolute(input.path)) {\n throw new Error(\n `addWorkspace: path must be absolute, got \"${input.path}\".`\n )\n }\n const slug = sanitizeSlug(input.slug)\n const now = new Date().toISOString()\n const existingIdx = config.workspaces.findIndex(w => w.slug === slug)\n const next: WorkspaceEntry = existingIdx >= 0\n ? {\n ...config.workspaces[existingIdx]!,\n path: input.path,\n ...(input.label !== undefined ? { label: input.label } : {}),\n updatedAt: now,\n }\n : {\n slug,\n path: input.path,\n ...(input.label ? { label: input.label } : {}),\n addedAt: now,\n updatedAt: now,\n }\n const workspaces = [...config.workspaces]\n if (existingIdx >= 0) workspaces[existingIdx] = next\n else workspaces.push(next)\n // First-add becomes active automatically — saves the user a\n // separate `workspace use` call right after a fresh `add`.\n const active = config.active ?? slug\n return { ...config, workspaces, active }\n}\n\nexport function removeWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspacesConfig {\n const sanitised = sanitizeSlug(slug)\n const workspaces = config.workspaces.filter(w => w.slug !== sanitised)\n // If the removed workspace was active, hand off to whatever's\n // first — predictable and avoids leaving the daemon in an\n // unreachable state when the user removes the only one.\n let active = config.active\n if (active === sanitised) {\n active = workspaces[0]?.slug\n }\n const next: WorkspacesConfig = { ...config, workspaces }\n if (active !== undefined) next.active = active\n else delete next.active\n return next\n}\n\nexport function setActiveWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspacesConfig {\n const sanitised = sanitizeSlug(slug)\n if (!config.workspaces.some(w => w.slug === sanitised)) {\n throw new Error(\n `setActiveWorkspace: no workspace registered with slug \"${sanitised}\". ` +\n `Run \\`agentproto workspace add <path> --slug ${sanitised}\\` first.`\n )\n }\n return { ...config, active: sanitised }\n}\n\nexport function findWorkspace(\n config: WorkspacesConfig,\n slug: string\n): WorkspaceEntry | undefined {\n return config.workspaces.find(w => w.slug === sanitizeSlug(slug))\n}\n\n/** The active workspace, or undefined when none is registered. Pure\n * convenience to avoid re-implementing the lookup at every caller. */\nexport function getActiveWorkspace(\n config: WorkspacesConfig\n): WorkspaceEntry | undefined {\n if (!config.active) return config.workspaces[0]\n return findWorkspace(config, config.active) ?? config.workspaces[0]\n}\n\n/**\n * Coerce arbitrary parsed JSON into a valid config. Skips entries\n * with missing required fields rather than throwing — partial recovery\n * is friendlier than \"your config file is corrupted, here's a stack\n * trace\". Logs nothing here; the CLI shells that consume this should\n * decide whether to surface a warning.\n */\nfunction normalizeConfig(parsed: unknown): WorkspacesConfig {\n if (!parsed || typeof parsed !== \"object\") {\n return { version: WORKSPACES_CONFIG_VERSION, workspaces: [] }\n }\n const obj = parsed as Record<string, unknown>\n const workspaces: WorkspaceEntry[] = []\n if (Array.isArray(obj.workspaces)) {\n for (const entry of obj.workspaces) {\n if (!entry || typeof entry !== \"object\") continue\n const e = entry as Record<string, unknown>\n const slug = typeof e.slug === \"string\" ? sanitizeSlug(e.slug) : \"\"\n const path = typeof e.path === \"string\" ? e.path : \"\"\n if (!slug || !path) continue\n const addedAt =\n typeof e.addedAt === \"string\" ? e.addedAt : new Date().toISOString()\n const updatedAt = typeof e.updatedAt === \"string\" ? e.updatedAt : addedAt\n const we: WorkspaceEntry = { slug, path, addedAt, updatedAt }\n if (typeof e.label === \"string\" && e.label.trim()) {\n we.label = e.label.trim()\n }\n workspaces.push(we)\n }\n }\n // De-dupe by slug (last wins) — the file is hand-editable so a\n // typo could have produced two entries with the same slug.\n const dedup = new Map<string, WorkspaceEntry>()\n for (const w of workspaces) dedup.set(w.slug, w)\n const finalList = Array.from(dedup.values())\n const active =\n typeof obj.active === \"string\" && finalList.some(w => w.slug === obj.active)\n ? (obj.active as string)\n : finalList[0]?.slug\n const out: WorkspacesConfig = {\n version: WORKSPACES_CONFIG_VERSION,\n workspaces: finalList,\n }\n if (active !== undefined) out.active = active\n return out\n}\n","/**\n * @agentproto/define-doctype — meta-factory for AIP `defineX` constructors.\n *\n * Every AIP that defines a markdown-with-frontmatter doctype ships a\n * `defineX(definition)` constructor (`defineTool` for AIP-14, `defineDriver`\n * for AIP-30, future `defineSkill` / `defineKnowledge` / …). Those\n * constructors share a small invariant prologue: validate the `id`\n * against a regex, validate `description` length, throw with a canonical\n * error prefix, freeze the returned handle.\n *\n * `createDoctype` lifts that prologue to one place. Each per-AIP\n * package supplies the spec-specific bits via `validate(def)` and\n * `build(def)`; the factory wires them together with the shared rules.\n *\n * Recommended scaffold for new AIPs (referenced from AIP-1).\n */\n\n/**\n * Default shape every AIP definition is assumed to satisfy when no\n * custom `readIdentity` / `readDescription` extractors are passed.\n *\n * Most AIPs (AIP-14 TOOL, AIP-30 DRIVER, AIP-3 SKILL, …) carry\n * `id` + `description`. AIPs that depart from this convention (e.g.\n * AIP-7 POLICY uses `slug` + `name`, with `description` optional)\n * supply their own extractors via `DoctypeOptions`.\n */\nexport interface DoctypeDefinitionBase {\n id: string\n description: string\n}\n\nexport interface DoctypeOptions<TDef, THandle> {\n /**\n * AIP number — surfaces in error messages so a thrown stack frame\n * inside a framework adapter still tells you which spec rejected\n * the definition.\n */\n aip: number\n /**\n * Doctype name (lower-case singular). Used to build the error\n * prefix: `name = \"tool\"` → \"defineTool: …\".\n */\n name: string\n /**\n * Extract the identity string (kebab-id, slug, …) to validate against\n * `idPattern`. Default: `(def) => (def as { id: string }).id` —\n * works for any AIP whose definition has an `id` field. AIPs whose\n * identity field has a different name (e.g. AIP-7 POLICY's `slug`)\n * supply their own reader.\n */\n readIdentity?: (def: TDef) => string\n /**\n * Override the default identity pattern. Default:\n * `/^[a-z0-9][a-z0-9._-]{1,79}$/` — kebab/snake/dot separated,\n * 2-80 chars, leading alphanumeric. AIPs with stricter rules\n * (AIP-7 POLICY uses `^[a-z0-9][a-z0-9-]*$`, no dots) override.\n */\n idPattern?: RegExp\n /**\n * Extract the LLM-facing prose used by the length check. Default:\n * `(def) => (def as { description: string }).description`. Pass\n * `false` to skip the length validation (e.g. AIPs where\n * description is optional, or where the human-readable string lives\n * in a different field).\n */\n readDescription?: ((def: TDef) => string | undefined) | false\n /**\n * Override the maximum prose length. Default 2000. AIPs whose\n * doctypes carry longer normative text on the doctype itself can\n * raise this; most should keep the default for prompt-injection\n * resistance.\n */\n maxDescriptionLen?: number\n /**\n * Spec-specific validations that run AFTER the default id and\n * description checks. Throw on failure. Stays out of `build()` so\n * the build path can assume a validated definition.\n */\n validate?: (def: TDef) => void\n /**\n * Build the immutable handle from a validated definition. Apply\n * defaults, freeze nested arrays/objects per the spec's freezing\n * rules, return the handle. The factory takes care of the\n * top-level `Object.freeze`.\n */\n build: (def: TDef) => THandle\n}\n\nconst DEFAULT_ID_PATTERN = /^[a-z0-9][a-z0-9._-]{1,79}$/\nconst MAX_DESCRIPTION_LEN = 2000\n\n/**\n * Build a `defineX(definition)` constructor that enforces the\n * cross-AIP invariants and delegates spec-specific behaviour to\n * `validate` / `build`.\n *\n * Usage (from `@agentproto/tool/src/define-tool.ts`):\n *\n * export const defineTool = createDoctype<ToolDefinition, ToolHandle>({\n * aip: 14,\n * name: \"tool\",\n * validate(def) { ...spec-14 checks... },\n * build(def) { ...defaulting + nested freezing... },\n * })\n */\nexport function createDoctype<TDef, THandle>(\n opts: DoctypeOptions<TDef, THandle>,\n): (def: TDef) => THandle {\n const idPattern = opts.idPattern ?? DEFAULT_ID_PATTERN\n const readIdentity =\n opts.readIdentity ?? ((def: TDef) => (def as { id: string }).id)\n const readDescription =\n opts.readDescription === false\n ? null\n : (opts.readDescription ??\n ((def: TDef) => (def as { description: string }).description))\n const maxLen = opts.maxDescriptionLen ?? MAX_DESCRIPTION_LEN\n const prefix = `define${capitalize(opts.name)}`\n const aipTag = `(AIP-${opts.aip})`\n\n return function constructDoctype(def: TDef): THandle {\n const identity = readIdentity(def)\n if (typeof identity !== \"string\" || !idPattern.test(identity)) {\n throw new Error(\n `${prefix} ${aipTag}: invalid id '${String(\n identity,\n )}' — must match ${idPattern}`,\n )\n }\n if (readDescription) {\n const description = readDescription(def)\n if (\n typeof description !== \"string\" ||\n description.length === 0 ||\n description.length > maxLen\n ) {\n throw new Error(\n `${prefix} ${aipTag}: id='${identity}' description must be 1–${maxLen} chars`,\n )\n }\n }\n opts.validate?.(def)\n return Object.freeze(opts.build(def)) as THandle\n }\n}\n\nfunction capitalize(s: string): string {\n return s.length === 0 ? s : s.charAt(0).toUpperCase() + s.slice(1)\n}\n\nexport const DOCTYPE_DEFAULT_ID_PATTERN = DEFAULT_ID_PATTERN\nexport const DOCTYPE_MAX_DESCRIPTION_LEN = MAX_DESCRIPTION_LEN\n\n/**\n * Filter a value to its YAML-serialisable subset:\n * - functions removed (e.g. driver `execute[id]: ExecuteFn`)\n * - zod schemas removed (e.g. tool `inputSchema`, `outputSchema`,\n * `contextSchema` — they live in TS, not in frontmatter)\n * - `undefined` values dropped from objects (so the YAML output\n * doesn't carry empty keys; `null` is preserved as a real value)\n *\n * Used by per-AIP `createX(params, opts)` to project a validated\n * definition into a manifest-shaped object before writing to disk.\n * Pure function; no I/O.\n */\nexport function filterSerializable(value: unknown): unknown {\n if (value === null || value === undefined) return value\n if (typeof value === \"function\") return undefined\n if (\n typeof value === \"object\" &&\n value !== null &&\n Object.prototype.hasOwnProperty.call(value, \"_def\") &&\n \"parse\" in value &&\n typeof (value as { parse?: unknown }).parse === \"function\"\n ) {\n return undefined\n }\n if (Array.isArray(value)) {\n return value.map(filterSerializable).filter((v) => v !== undefined)\n }\n if (typeof value === \"object\") {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n const filtered = filterSerializable(v)\n if (filtered !== undefined) out[k] = filtered\n }\n return out\n }\n return value\n}\n","/**\n * @agentproto/manifest — generic verbs for AIP doctypes.\n *\n * Every per-AIP package (`@agentproto/tool`, `@agentproto/driver`, …)\n * supplies a `DoctypeSpec` describing the per-package knobs (name,\n * AIP number, schema literal, path convention, validator, parser).\n * `createVerbs(spec)` returns the full lifecycle:\n *\n * create(params, opts) params → .md on disk\n * load(path) .md on disk → handle\n * list(dir, filter?) walk → handle[]\n * update(path, mutator) load → patch → write back\n * resolve(block, ctx?) { inline | ref | file } → handle\n * delete(path) fs.unlink\n *\n * Adding a new verb is a single place; every package picks it up\n * automatically — same model as `createDoctype` for the validation\n * pipeline.\n */\n\nimport { filterSerializable } from \"@agentproto/define-doctype\"\nimport matter from \"gray-matter\"\nimport type { Dirent } from \"node:fs\"\nimport { mkdir, readFile, readdir, rm, writeFile } from \"node:fs/promises\"\nimport { dirname, isAbsolute, join } from \"node:path\"\n\n/**\n * Per-package descriptor consumed by `createVerbs`.\n *\n * Generic over the params shape (input to `define`) and the handle\n * shape (output of `define`). For most AIPs `THandle` extends\n * `TParams` — handles are just frozen, defaulted definitions.\n */\nexport interface DoctypeSpec<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n> {\n /** Lower-case singular: \"tool\", \"driver\", \"operator\". Used in errors. */\n name: string\n /** AIP number — surfaces in error messages for provenance. */\n aip: number\n /** Frontmatter `schema:` literal (e.g. \"agentproto/tool/v1\"). */\n schemaLiteral: string\n /**\n * Filename of the doctype's manifest. By default `<DOCTYPE>.md`,\n * derived from `name.toUpperCase()`. Override only when the\n * doctype's filename diverges from convention.\n */\n filename?: string\n /**\n * Path-of-handle convention. Given a validated handle, return the\n * workspace-relative path the manifest lives at. Examples:\n * tool: `(h) => `${h.id}/TOOL.md``\n * policy: `(h) => `policies/${h.slug}/POLICY.md``\n * operator: `(h) => `${h.id}/OPERATOR.md``\n */\n pathOf(handle: THandle): string\n /** TS authoring path: validates params + applies defaults. */\n define(params: TParams): THandle\n /** MD authoring path: parses YAML+body. Throws on invalid frontmatter. */\n parse(source: string): { frontmatter: Record<string, unknown>; body: string }\n /**\n * Optional projection: handle → manifest-shaped frontmatter object.\n * Default: pass the params through `filterSerializable` (drops zod\n * schemas + functions). Override when the handle and frontmatter\n * shapes diverge non-trivially.\n */\n toFrontmatter?(params: TParams): Record<string, unknown>\n}\n\nexport interface CreateOptions {\n /** Workspace-relative or absolute base directory. */\n dir: string\n /** Body markdown after the frontmatter. Defaults to a one-line stub. */\n body?: string\n /** Render only — don't write. Returns the rendered string. */\n dryRun?: boolean\n}\n\nexport interface VerbResult<THandle> {\n path: string\n handle: THandle\n rendered: string\n}\n\nexport interface ListOptions {\n /** Filter the discovered handles. Receives the loaded handle. */\n filter?: <H>(handle: H) => boolean\n /** Skip subdirectories matching these names. Default: [\"node_modules\", \".git\", \"dist\", \".next\"]. */\n skipDirs?: readonly string[]\n}\n\nexport type RefBlock<TParams> =\n | { inline: TParams }\n | { ref: string }\n | { file: string }\n\nexport interface ResolveContext {\n /** Base dir for `file:` references. Required when resolving file blocks. */\n baseDir?: string\n /**\n * Registry resolver for `ref:` strings (e.g. `@agentik/runners/python-3.12`\n * → handle). Optional; throws when an unresolvable ref is encountered.\n */\n resolveRef?: (ref: string) => Promise<unknown> | unknown\n}\n\nexport interface Verbs<TParams, THandle> {\n /** TS-authored params → write `<dir>/<pathOf(handle)>` on disk. */\n create(params: TParams, opts: CreateOptions): Promise<VerbResult<THandle>>\n /** Read a manifest from disk → handle. */\n load(path: string): Promise<{ path: string; handle: THandle; body: string }>\n /** Walk `dir` for the doctype's `*.md` files; return loaded handles. */\n list(dir: string, opts?: ListOptions): Promise<THandle[]>\n /** Load → mutate → write back. Mutator receives the loaded params. */\n update(\n path: string,\n mutator: (params: TParams, ctx: { handle: THandle; body: string }) => TParams | Promise<TParams>,\n opts?: { body?: string; dryRun?: boolean },\n ): Promise<VerbResult<THandle>>\n /**\n * Resolve a `{ inline | ref | file }` block to a handle. Used by\n * doctypes that compose other doctypes (AIP-17/30/36 pattern).\n */\n resolve(\n block: RefBlock<TParams>,\n ctx?: ResolveContext,\n ): Promise<THandle>\n /** Remove the manifest file. Does NOT recurse into the containing dir. */\n delete(path: string): Promise<void>\n}\n\nconst DEFAULT_SKIP_DIRS: readonly string[] = [\n \"node_modules\",\n \".git\",\n \"dist\",\n \".next\",\n \".turbo\",\n]\n\nexport function createVerbs<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n>(spec: DoctypeSpec<TParams, THandle>): Verbs<TParams, THandle> {\n const filename = spec.filename ?? `${spec.name.toUpperCase()}.md`\n const toFrontmatter =\n spec.toFrontmatter ??\n ((params: TParams) =>\n filterSerializable({\n schema: spec.schemaLiteral,\n ...params,\n }) as Record<string, unknown>)\n\n async function create(\n params: TParams,\n opts: CreateOptions,\n ): Promise<VerbResult<THandle>> {\n const handle = spec.define(params)\n const relativePath = spec.pathOf(handle)\n const path = join(opts.dir, relativePath)\n const frontmatter = toFrontmatter(params)\n const rendered = matter.stringify(\n opts.body ?? defaultBody(spec, frontmatter),\n frontmatter,\n )\n if (!opts.dryRun) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, rendered, \"utf8\")\n }\n return { path, handle, rendered }\n }\n\n async function load(\n path: string,\n ): Promise<{ path: string; handle: THandle; body: string }> {\n const source = await readFile(path, \"utf8\")\n const { frontmatter, body } = spec.parse(source)\n // The frontmatter is already zod-validated by `parse` (each per-\n // package parser runs the schema). Cast through `define` so the\n // cross-AIP invariants run too — same path the TS authoring uses.\n const handle = spec.define(frontmatter as unknown as TParams)\n return { path, handle, body }\n }\n\n async function list(\n dir: string,\n opts: ListOptions = {},\n ): Promise<THandle[]> {\n const skip = new Set(opts.skipDirs ?? DEFAULT_SKIP_DIRS)\n const out: THandle[] = []\n\n async function walk(current: string): Promise<void> {\n // The Dirent overload returns `Dirent<NonSharedBuffer>[]` in\n // Node 22+'s @types/node when called with non-string buffer\n // input. Coerce by typing the entries as `Dirent[]` (string\n // names by default) since we always pass a string path.\n let entries: Dirent[]\n try {\n entries = (await readdir(current, { withFileTypes: true })) as Dirent[]\n } catch {\n return\n }\n for (const entry of entries) {\n const entryName = String(entry.name)\n if (entry.isDirectory()) {\n if (skip.has(entryName)) continue\n await walk(join(current, entryName))\n continue\n }\n if (!entry.isFile()) continue\n if (entryName !== filename) continue\n try {\n const { handle } = await load(join(current, entryName))\n if (!opts.filter || opts.filter(handle)) out.push(handle)\n } catch {\n // Malformed manifests skip the list — `load` will throw the\n // useful diagnostic when a caller wants to see it.\n }\n }\n }\n\n await walk(dir)\n return out\n }\n\n async function update(\n path: string,\n mutator: (\n params: TParams,\n ctx: { handle: THandle; body: string },\n ) => TParams | Promise<TParams>,\n opts: { body?: string; dryRun?: boolean } = {},\n ): Promise<VerbResult<THandle>> {\n const { handle, body } = await load(path)\n // Reconstruct params from the frontmatter — the load path already\n // validated, so this is just a reverse projection.\n const source = await readFile(path, \"utf8\")\n const { frontmatter } = spec.parse(source)\n const params = frontmatter as unknown as TParams\n const mutated = await mutator(params, { handle, body })\n const newHandle = spec.define(mutated)\n const newFrontmatter = toFrontmatter(mutated)\n const rendered = matter.stringify(\n opts.body ?? body,\n newFrontmatter,\n )\n if (!opts.dryRun) {\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, rendered, \"utf8\")\n }\n return { path, handle: newHandle, rendered }\n }\n\n async function resolve(\n block: RefBlock<TParams>,\n ctx: ResolveContext = {},\n ): Promise<THandle> {\n if (\"inline\" in block) {\n return spec.define(block.inline)\n }\n if (\"file\" in block) {\n const baseDir = ctx.baseDir ?? \".\"\n const path = isAbsolute(block.file) ? block.file : join(baseDir, block.file)\n const { handle } = await load(path)\n return handle\n }\n if (\"ref\" in block) {\n if (!ctx.resolveRef) {\n throw new Error(\n `${spec.name}.resolve (AIP-${spec.aip}): block has \\`ref: '${block.ref}'\\` but no resolveRef provided in context — registries must inject their own resolver`,\n )\n }\n const resolved = await ctx.resolveRef(block.ref)\n return spec.define(resolved as TParams)\n }\n throw new Error(\n `${spec.name}.resolve (AIP-${spec.aip}): block must have one of inline | ref | file`,\n )\n }\n\n async function deleteFn(path: string): Promise<void> {\n await rm(path, { force: true })\n }\n\n return { create, load, list, update, resolve, delete: deleteFn }\n}\n\nfunction defaultBody<P, H>(\n spec: DoctypeSpec<P extends { id?: string; slug?: string; name?: string } ? P : never, H>,\n frontmatter: Record<string, unknown>,\n): string {\n const id =\n typeof frontmatter.name === \"string\"\n ? frontmatter.name\n : typeof frontmatter.id === \"string\"\n ? frontmatter.id\n : typeof frontmatter.slug === \"string\"\n ? frontmatter.slug\n : spec.name\n return `# ${id}\\n`\n}\n\n","/**\n * AIP-40 EXTENSION.md frontmatter zod schema.\n *\n * Generated from `resources/aip-40/draft/EXTENSION.schema.json` via\n * json-schema-to-zod. Imported by both `define-extension.ts` (TS path\n * validation) and `manifest/index.ts` (.md path validation) so every\n * field-level constraint runs in both authoring paths from a single\n * source of truth — re-run scaffold-aip to refresh after spec changes.\n *\n * Cross-field rules (if/then/allOf in JSON Schema) don't translate\n * cleanly and live in `define-extension.ts`'s `validate(def)` instead.\n */\n\nimport { z } from \"zod\"\n\nexport const extensionFrontmatterSchema = z.object({ \"schema\": z.literal(\"agentproto/extension/v1\").describe(\"Pins the spec version this manifest conforms to.\"), \"slug\": z.string().regex(new RegExp(\"^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*[a-z0-9]$\")).describe(\"Namespaced identifier — `<namespace>:<name>`. Lowercase, digits, dashes; single colon separator. Example: `acme:deal`.\"), \"title\": z.string().min(1).max(80).describe(\"Human-readable display name.\"), \"description\": z.string().min(1).max(2000).describe(\"One-paragraph statement of the extension's purpose.\"), \"version\": z.string().regex(new RegExp(\"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+(?:[-+][a-zA-Z0-9.-]+)?$\")).describe(\"Extension's own semver. Bump on breaking change.\"), \"status\": z.literal(\"Local\").describe(\"Extensions are perpetually Local — they never enter the public registry's Draft/Review/Final lifecycle.\"), \"extends\": z.union([z.string().regex(new RegExp(\"^aip-\\\\d+$\")).describe(\"Inherit a public AIP's schema (e.g. `aip-14`).\"), z.literal(\"none\").describe(\"Brand-new doctype, no inheritance.\")]).describe(\"Parent AIP this extension inherits from, or `none` for a root doctype.\"), \"add_fields\": z.object({ \"properties\": z.record(z.string(), z.any()).describe(\"JSON Schema property definitions to merge into the parent's properties. Collisions are an error — use `tighten` to narrow an existing field.\").optional(), \"required\": z.array(z.string()).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), { message: \"All items must be unique!\" }).describe(\"Field names that become required in addition to parent's required[]. Unioned with parent's required, never replaces.\").default([] as never) }).strict().describe(\"Schema-level additions: new properties + new required entries.\").optional(), \"tighten\": z.record(z.string(), z.object({ \"pattern\": z.string().optional(), \"enum\": z.array(z.any()).optional(), \"minLength\": z.number().int().gte(0).optional(), \"maxLength\": z.number().int().gte(0).optional(), \"minimum\": z.number().optional(), \"maximum\": z.number().optional() }).strict()).describe(\"Per-field constraint overrides. Each entry MUST tighten (not loosen) the parent's constraints; runtimes verify monotonicity at registration.\").optional(), \"defaults\": z.record(z.string(), z.any()).describe(\"Default values applied when a field is omitted. Layered on top of parent's defaults; extension's value wins on the same key.\").optional(), \"path_convention\": z.string().min(1).describe(\"Filesystem convention template, e.g. `\\\"deals/<slug>/DEAL.md\\\"`. Tokens: `<slug>` (doctype identity), `<DOCTYPE>` (extension's slug name part). Falls back to parent's convention when omitted.\").optional(), \"requires\": z.array(z.number().int().gte(1)).refine((arr) => arr.every((item, i) => arr.indexOf(item) == i), { message: \"All items must be unique!\" }).describe(\"Public AIPs the extension depends on, in addition to its parent.\").default([] as never), \"metadata\": z.record(z.string(), z.any()).describe(\"Free-form vendor extensions under namespaced keys (`metadata.<vendor>.<field>`).\").default({} as never) }).strict().describe(\"Validates the YAML frontmatter portion of an AIP-40 EXTENSION.md manifest. An extension declares a workspace-local doctype that inherits a public AIP's schema and may add fields, tighten constraints, set defaults, and override the path convention.\")\n\nexport type ExtensionFrontmatter = z.infer<typeof extensionFrontmatterSchema>\n","import { createDoctype } from \"@agentproto/define-doctype\"\nimport { extensionFrontmatterSchema } from \"./schema.js\"\nimport type { ExtensionDefinition, ExtensionHandle } from \"./types.js\"\n\n/**\n * AIP-40 reference implementation of `defineExtension`.\n *\n * Built on `createDoctype` so the cross-AIP invariants (id pattern,\n * description length, top-level freeze, \"defineExtension (AIP-40): …\"\n * error prefix) run uniformly with every other AIP defineX.\n *\n * Field-level validation runs the schema-derived zod from\n * `./schema.ts` against the input. Same source of truth as the .md\n * path uses (`parseExtensionManifest`), so a malformed TS-authored\n * definition fails with the same diagnostic as a malformed manifest.\n * Cross-field rules go in `validate(def)` after the zod check.\n *\n * Identity / description extractors detected from the JSON Schema:\n * readIdentity: def.slug\n * readDescription: def.description.\n */\nexport const defineExtension = createDoctype<ExtensionDefinition, ExtensionHandle>({\n aip: 40,\n name: \"extension\",\n // Extension slugs are namespaced: `<namespace>:<name>` (e.g.\n // `acme:deal`). Override the default kebab-only pattern.\n idPattern: /^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*[a-z0-9]$/,\n readIdentity: (def) => def.slug,\n validate(def) {\n const result = extensionFrontmatterSchema.safeParse(def)\n if (!result.success) {\n throw new Error(\n `defineExtension (AIP-40): ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`,\n )\n }\n // TODO: spec-40-specific cross-field rules (if/then/allOf in\n // the JSON Schema) — those don't translate to zod cleanly and\n // belong here. See @agentproto/operator's autonomy=gated rule.\n },\n build(def) {\n // Default build: spread the validated definition into a fresh object.\n // Hand-tune for nested freezing (Object.freeze on arrays/objects) and\n // for fields that need defaults applied — see @agentproto/operator\n // for a reference shape.\n return { ...def } as ExtensionHandle\n },\n})\n","/**\n * AIP-40 EXTENSION.md sidecar parser + manifest-to-handle constructor.\n *\n * Mirror of `@agentproto/tool/manifest` and `@agentproto/driver/manifest`:\n * the .md provides metadata; the TS module supplies any spec-specific\n * runtime bits (schemas, execute bodies, …) that can't live in\n * frontmatter. Both inputs end up in `defineExtension` so the cross-AIP\n * invariants run uniformly.\n *\n *\n * The frontmatter zod schema below was generated from\n * `resources/aip-40/draft/EXTENSION.schema.json` via json-schema-to-zod.\n * Re-run scaffold-aip to refresh after spec changes (or hand-tune\n * any constraint the converter doesn't capture cleanly).\n */\n\nimport matter from \"gray-matter\"\nimport { extensionFrontmatterSchema, type ExtensionFrontmatter } from \"../schema.js\"\nimport { defineExtension } from \"../define-extension.js\"\nimport type { ExtensionDefinition, ExtensionHandle } from \"../types.js\"\n\n// Re-export so consumers can import the schema + inferred type either\n// from \"@@agentproto/extension/manifest\" or directly from \"@@agentproto/extension/schema\".\nexport { extensionFrontmatterSchema, type ExtensionFrontmatter }\n\nexport interface ExtensionManifest {\n frontmatter: ExtensionFrontmatter\n body: string\n}\n\nexport function parseExtensionManifest(source: string): ExtensionManifest {\n const parsed = matter(source)\n if (Object.keys(parsed.data).length === 0) {\n throw new Error(\"parseExtensionManifest: missing or empty frontmatter\")\n }\n const result = extensionFrontmatterSchema.safeParse(parsed.data)\n if (!result.success) {\n throw new Error(\n `parseExtensionManifest: invalid frontmatter — ${result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \")}`,\n )\n }\n return { frontmatter: result.data, body: parsed.content }\n}\n\nexport function extensionFromManifest(manifest: ExtensionManifest): ExtensionHandle {\n // The zod-validated frontmatter is structurally compatible with\n // ExtensionDefinition; the cast pins the typing once the manifest\n // schema and the TS interface diverge (e.g. handle has frozen fields\n // a literal config doesn't carry yet).\n return defineExtension(manifest.frontmatter as unknown as ExtensionDefinition)\n}\n","/**\n * `specFromExtension(handle, parent)` — turn a parsed EXTENSION.md\n * into a runtime `DoctypeSpec` consumable by\n * `@agentproto/manifest.createVerbs`.\n *\n * The parent argument is the public AIP's spec (e.g. `toolSpec` from\n * `@agentproto/tool`). The function composes:\n *\n * schema parent.schema ∪ ext.add_fields, then ext.tighten\n * path ext.path_convention ?? parent.pathOf\n * defaults parent defaults ⨁ ext.defaults\n * define wraps parent.define with default-application\n * parse parent.parse (frontmatter shape stays compatible)\n *\n * Tightening monotonicity is verified by-field: pattern subset\n * (cheap heuristic — full regex-language inclusion is undecidable),\n * enum subset (set membership), minLength/minimum ≥, maxLength/maximum ≤.\n *\n * For `extends: none`, `parent` is null/undefined and the extension\n * acts as a root doctype: the `add_fields` becomes its full schema,\n * `path_convention` is required (no parent fallback).\n */\n\nimport type { DoctypeSpec } from \"@agentproto/manifest\"\nimport type { ExtensionDefinition } from \"./types.js\"\n\nexport interface SpecFromExtensionOptions<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n> {\n /**\n * Parent doctype spec. Required when `extension.extends !== \"none\"`.\n * Pass e.g. `toolSpec` from `@agentproto/tool`.\n */\n parent?: DoctypeSpec<TParams, THandle>\n}\n\nexport function specFromExtension<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n>(\n extension: ExtensionDefinition,\n opts: SpecFromExtensionOptions<TParams, THandle> = {},\n): DoctypeSpec<TParams, THandle> {\n const { parent } = opts\n const isRoot = extension.extends === \"none\"\n\n if (!isRoot && !parent) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' extends '${extension.extends}' but no parent spec was provided in opts.parent`,\n )\n }\n if (isRoot && !extension.path_convention) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' is a root doctype (extends: none) and MUST declare path_convention`,\n )\n }\n\n // Tightening monotonicity check — see Specification §\"Composition rules\" #3.\n if (parent && extension.tighten) {\n verifyTightening(extension, parent)\n }\n\n const slugName = extension.slug.split(\":\")[1] ?? extension.slug\n const pathTemplate = extension.path_convention ?? null\n\n // Keys the extension is authoritative over — anything declared in\n // `add_fields.properties`. Computed once at spec-composition time so\n // the per-call `define` is a hot-path lookup, not a re-derivation.\n const extensionKeys = new Set(\n Object.keys(extension.add_fields?.properties ?? {}),\n )\n\n const define = (params: TParams) => {\n // Layered defaults: parent defaults are baked into parent.define;\n // extension defaults apply on top, only for keys the user omitted.\n const withDefaults = { ...params } as Record<string, unknown>\n if (extension.defaults) {\n for (const [key, value] of Object.entries(extension.defaults)) {\n if (withDefaults[key] === undefined && value !== undefined) {\n withDefaults[key] = value\n }\n }\n }\n if (isRoot) {\n // Root doctype — no parent.define to delegate to. Return the\n // params verbatim, frozen. (A more disciplined runtime would\n // compile the add_fields schema to zod and validate; deferred\n // because root doctypes are rare and the manifest layer's\n // schema-level zod catches malformed input.)\n return Object.freeze(withDefaults) as unknown as THandle\n }\n // Split params before delegating: parent specs typically validate\n // through `zod.strict()` (e.g. AIP-42 `agentFrontmatterSchema`),\n // which rejects extension-owned keys as \"Unrecognized\". Hand the\n // parent only what it owns, then re-attach extension fields onto\n // the resulting handle. Extension-side validation of these fields\n // is the manifest layer's responsibility (compiled from\n // `add_fields` JSON Schema at parse time); the runtime trusts\n // input it received via that path.\n const parentOnly: Record<string, unknown> = {}\n const extensionOnly: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(withDefaults)) {\n if (extensionKeys.has(key)) extensionOnly[key] = value\n else parentOnly[key] = value\n }\n const parentHandle = parent!.define(parentOnly as unknown as TParams)\n return Object.freeze({\n ...(parentHandle as object),\n ...extensionOnly,\n }) as unknown as THandle\n }\n\n const parse = isRoot ? rootParse(extension) : parent!.parse\n\n const pathOf = (handle: THandle) => {\n if (pathTemplate) {\n return resolvePathTemplate(\n pathTemplate,\n handle as unknown as Record<string, unknown>,\n slugName,\n )\n }\n return parent!.pathOf(handle)\n }\n\n return {\n name: extension.slug,\n aip: 40,\n schemaLiteral: parent?.schemaLiteral ?? `agentproto/extension/v1`,\n pathOf,\n define,\n parse,\n }\n}\n\nfunction verifyTightening<\n TParams extends { id?: string; slug?: string; name?: string },\n THandle,\n>(\n extension: ExtensionDefinition,\n parent: DoctypeSpec<TParams, THandle>,\n): void {\n // Best-effort: the manifest layer doesn't expose the parent's raw\n // JSON Schema, so we can only verify what the spec ships in\n // `extension.tighten` against itself for self-consistency. Full\n // parent-vs-extension monotonicity verification belongs to a future\n // version once parent specs expose `schema:` introspection.\n const t = extension.tighten ?? {}\n for (const [field, override] of Object.entries(t)) {\n if (\n typeof override.minLength === \"number\" &&\n typeof override.maxLength === \"number\" &&\n override.minLength > override.maxLength\n ) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: minLength (${override.minLength}) > maxLength (${override.maxLength})`,\n )\n }\n if (\n typeof override.minimum === \"number\" &&\n typeof override.maximum === \"number\" &&\n override.minimum > override.maximum\n ) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: minimum (${override.minimum}) > maximum (${override.maximum})`,\n )\n }\n if (override.enum !== undefined && !Array.isArray(override.enum)) {\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' tighten.${field}: enum must be an array`,\n )\n }\n }\n}\n\nfunction rootParse(extension: ExtensionDefinition) {\n return (source: string) => {\n // Root doctypes don't have a parent parser — fall back to bare\n // gray-matter. The manifest layer applies `define` afterwards.\n // We don't import gray-matter here to keep this module dependency-\n // light; the caller wires their own parse if they really want a\n // root doctype, or uses the standard parse from a sibling package.\n void source\n void extension\n throw new Error(\n `specFromExtension (AIP-40): extension '${extension.slug}' is a root doctype — supply your own parser or extend a public AIP for parser inheritance`,\n )\n }\n}\n\nfunction resolvePathTemplate(\n template: string,\n handle: Record<string, unknown>,\n doctypeSlug: string,\n): string {\n // Tokens supported in v1: <slug> (the doctype's identity field —\n // tries id, slug, name in that order) and <DOCTYPE> (uppercase\n // version of the extension's slug name part, e.g. \"DEAL\").\n const identity =\n (typeof handle.id === \"string\" && handle.id) ||\n (typeof handle.slug === \"string\" && handle.slug) ||\n (typeof handle.name === \"string\" && handle.name) ||\n \"unknown\"\n return template\n .replace(/<slug>/g, identity)\n .replace(/<DOCTYPE>/g, doctypeSlug.toUpperCase())\n}\n","/**\n * @agentproto/mcp-server — exposes AIP doctype verbs as MCP tools.\n *\n * Hand a list of `DoctypeSpec` instances (one per registered AIP) and\n * optionally a workspace dir; the server registers\n * `create_<name> / load_<name> / list_<name> / update_<name> /\n * resolve_<name> / delete_<name>` for each spec, including AIP-40\n * extensions auto-loaded from `<workspace>/extensions/<slug>/EXTENSION.md`.\n *\n * Two ways to run it:\n * 1. **Embedded** — call `createMcpServer({ specs, workspace })` and\n * attach to your own transport (stdio, websocket, …).\n * 2. **Standalone** — `runStdioServer({ specs, workspace })` wires\n * stdio for you. Useful as a `mcp_servers.<id>` config entry on\n * Claude Desktop / Cursor / any MCP host.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\"\nimport { z } from \"zod\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { isAbsolute, join, resolve } from \"node:path\"\nimport { createVerbs, type DoctypeSpec } from \"@agentproto/manifest\"\nimport {\n parseExtensionManifest,\n specFromExtension,\n} from \"@agentproto/extension\"\n\n// `RegisterableSpec<TParams, THandle>` is just `DoctypeSpec` plus the\n// constraint that callers passing different generics across the array\n// must type-erase via `as unknown as DoctypeSpec<...>` at the boundary.\n// We don't try to express the heterogeneous list in TS — same trick\n// `@agentproto/driver`'s `implementations[]` uses.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySpec = DoctypeSpec<any, any>\n\nexport interface CreateMcpServerOptions {\n /** Doctype specs registered as MCP tools. One per AIP. */\n specs: readonly AnySpec[]\n /**\n * Optional workspace dir. If provided, the server scans\n * `<workspace>/extensions/` for `EXTENSION.md` files and registers\n * each as a local doctype. The parent of each extension is resolved\n * by matching the extension's `extends:` field (`aip-N`) against\n * `specs.find(s => s.aip === N)` — so the spec list MUST include the\n * parents the extensions reference, else loading throws.\n */\n workspace?: string\n /** Server name advertised over MCP. Default `agentproto-mcp-server`. */\n name?: string\n /** Server version advertised over MCP. Default `0.1.0-alpha`. */\n version?: string\n}\n\nexport interface CreateMcpServerResult {\n /** The wired McpServer; attach a transport to start serving. */\n server: McpServer\n /**\n * The list of doctype names the server registered tools for —\n * useful for tests + diagnostics. Includes any extensions loaded\n * from `workspace/extensions/`.\n */\n registered: readonly string[]\n}\n\nexport async function createMcpServer(\n opts: CreateMcpServerOptions,\n): Promise<CreateMcpServerResult> {\n const server = new McpServer({\n name: opts.name ?? \"agentproto-mcp-server\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n\n const allSpecs: AnySpec[] = [...opts.specs]\n\n // Load extensions when a workspace is given.\n if (opts.workspace) {\n const extensions = await loadExtensions(opts.workspace, opts.specs)\n allSpecs.push(...extensions)\n }\n\n // Path-anchoring: when a workspace is set, resolve all relative\n // dir/path arguments against it. Agents pass logical paths like\n // \"tools\" or \"tools/echo/TOOL.md\"; the server pins them to the\n // workspace so they don't leak into process.cwd() (which is\n // wherever the host happened to spawn the server).\n const anchor = (p: string): string =>\n isAbsolute(p) || !opts.workspace ? p : join(opts.workspace, p)\n\n for (const spec of allSpecs) {\n registerVerbs(server, spec, anchor)\n }\n\n return {\n server,\n registered: allSpecs.map((s) => s.name),\n }\n}\n\n/**\n * Wire `createMcpServer` to stdio for use as an `mcp_servers.<id>`\n * entry on Claude Desktop / Cursor / etc. Resolves once the\n * transport closes.\n */\nexport async function runStdioServer(\n opts: CreateMcpServerOptions,\n): Promise<void> {\n const { server } = await createMcpServer(opts)\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n\n// ── verb registration ───────────────────────────────────────────────\n\nfunction registerVerbs(\n server: McpServer,\n spec: AnySpec,\n anchor: (p: string) => string,\n): void {\n const verbs = createVerbs(spec)\n // Tool name uses snake_case to match MCP convention; spec.name may\n // be kebab (driver-cli) or namespaced (acme:deal). Map all to snake.\n const verbName = (verb: string) =>\n `${verb}_${spec.name.replace(/[-:]/g, \"_\")}`\n const description = (verb: string, body: string) =>\n `${verb} the AIP-${spec.aip} ${spec.name} doctype. ${body}`\n\n // create\n server.tool(\n verbName(\"create\"),\n description(\n \"create\",\n \"Author a new manifest from params. Returns { path, rendered }.\",\n ),\n {\n params: z\n .record(z.string(), z.unknown())\n .describe(`The ${spec.name} definition fields.`),\n dir: z.string().describe(\"Workspace-relative or absolute target directory.\"),\n body: z\n .string()\n .optional()\n .describe(\"Markdown body after the frontmatter. Defaults to a stub.\"),\n dryRun: z\n .boolean()\n .optional()\n .describe(\"Render only — don't write to disk.\"),\n },\n async ({ params, dir, body, dryRun }) => {\n const result = await verbs.create(params, {\n dir: anchor(dir),\n body,\n dryRun,\n })\n return contentText({\n path: result.path,\n rendered: result.rendered,\n })\n },\n )\n\n // load\n server.tool(\n verbName(\"load\"),\n description(\"load\", \"Read a manifest from disk. Returns the parsed handle.\"),\n {\n path: z.string().describe(\"Absolute or workspace-relative path to the .md file.\"),\n },\n async ({ path }) => {\n const result = await verbs.load(anchor(path))\n return contentText({ path: result.path, handle: result.handle })\n },\n )\n\n // list\n server.tool(\n verbName(\"list\"),\n description(\n \"list\",\n \"Walk a directory tree and return all manifests of this doctype.\",\n ),\n {\n dir: z.string().describe(\"Directory to walk.\"),\n skipDirs: z\n .array(z.string())\n .optional()\n .describe(\"Subdir names to skip (default: node_modules, .git, dist).\"),\n },\n async ({ dir, skipDirs }) => {\n const handles = await verbs.list(anchor(dir), { skipDirs })\n return contentText({ count: handles.length, handles })\n },\n )\n\n // update\n server.tool(\n verbName(\"update\"),\n description(\n \"update\",\n \"Patch an existing manifest. The patch is shallow-merged into the existing params.\",\n ),\n {\n path: z.string().describe(\"Path to the manifest to update.\"),\n patch: z\n .record(z.string(), z.unknown())\n .describe(\"Partial fields to merge into the existing manifest.\"),\n body: z.string().optional().describe(\"New body markdown (default: keep existing).\"),\n },\n async ({ path, patch, body }) => {\n const result = await verbs.update(\n anchor(path),\n (existing: Record<string, unknown>) => ({ ...existing, ...patch }),\n { body },\n )\n return contentText({ path: result.path, rendered: result.rendered })\n },\n )\n\n // resolve\n server.tool(\n verbName(\"resolve\"),\n description(\n \"resolve\",\n \"Resolve an inline | ref | file block to a fully-typed handle.\",\n ),\n {\n block: z\n .union([\n z.object({ inline: z.record(z.string(), z.unknown()) }),\n z.object({ ref: z.string() }),\n z.object({ file: z.string() }),\n ])\n .describe(\"The composition block.\"),\n baseDir: z\n .string()\n .optional()\n .describe(\"Base dir for `file:` references.\"),\n },\n async ({ block, baseDir }) => {\n const handle = await verbs.resolve(block, {\n baseDir: baseDir ? anchor(baseDir) : undefined,\n })\n return contentText({ handle })\n },\n )\n\n // delete\n server.tool(\n verbName(\"delete\"),\n description(\"delete\", \"Remove a manifest file from disk.\"),\n {\n path: z.string().describe(\"Path to the manifest to delete.\"),\n },\n async ({ path }) => {\n const target = anchor(path)\n await verbs.delete(target)\n return contentText({ deleted: target })\n },\n )\n}\n\n// ── extension loader ────────────────────────────────────────────────\n\nasync function loadExtensions(\n workspace: string,\n specs: readonly AnySpec[],\n): Promise<AnySpec[]> {\n const extDir = resolve(workspace, \"extensions\")\n if (!existsSync(extDir)) return []\n\n const out: AnySpec[] = []\n const { readdir } = await import(\"node:fs/promises\")\n type SimpleDirent = { name: string; isDirectory(): boolean }\n\n let entries: SimpleDirent[]\n try {\n entries = (await readdir(extDir, {\n withFileTypes: true,\n })) as unknown as SimpleDirent[]\n } catch {\n return out\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n const manifestPath = join(extDir, String(entry.name), \"EXTENSION.md\")\n if (!existsSync(manifestPath)) continue\n\n const source = await readFile(manifestPath, \"utf8\")\n const parsed = parseExtensionManifest(source)\n const ext = parsed.frontmatter\n\n let parent: AnySpec | undefined\n if (ext.extends && ext.extends !== \"none\") {\n const aipMatch = ext.extends.match(/^aip-(\\d+)$/)\n if (!aipMatch) {\n throw new Error(\n `mcp-server: extension '${ext.slug}' has invalid extends '${ext.extends}'`,\n )\n }\n const parentAip = Number(aipMatch[1])\n parent = specs.find((s) => s.aip === parentAip)\n if (!parent) {\n throw new Error(\n `mcp-server: extension '${ext.slug}' extends aip-${parentAip}, but no spec for that AIP was registered. Pass the parent spec in opts.specs.`,\n )\n }\n }\n\n out.push(specFromExtension(ext, { parent }) as AnySpec)\n }\n\n return out\n}\n\n// ── tool result helpers ─────────────────────────────────────────────\n\nfunction contentText(payload: unknown): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(payload, null, 2),\n },\n ],\n }\n}\n","/**\n * `.agentproto/` config dir — runtime-managed state at the root of\n * every workspace. Mirrors the `.git/` model: user-content stays at\n * the workspace root (HEARTBEAT.md, conversations/, .agents/) while\n * everything the runtime owns lives in `<workspace>/.agentproto/`.\n *\n * What goes here today:\n * - `runtime.json` — boot-time snapshot of the live config (PID,\n * port, resolved workspace, MCP server name, startedAt). Useful\n * for `cat .agentproto/runtime.json` diagnostics + future tooling\n * that wants to discover a running gateway from disk.\n *\n * What does NOT go here:\n * - HEARTBEAT.md — user-edited content\n * - conversations/ — user-readable chat history\n * - .agents/ — user-authored manifests\n *\n * The `.agentproto/` dir is safe to gitignore. The `runtime.json`\n * file contains a per-boot bearer token used to gate mutating HTTP\n * routes (POST /sessions/*, WS /sessions/:id/pty). The token lives\n * in RAM + on disk only — never logged. File mode 0600 below; only\n * processes running as the workspace user (and the daemon itself)\n * can read it. A browser-loaded localhost page CAN'T read this file,\n * which is what defends against the localhost-DNS-rebinding drive-by\n * spawn vector.\n */\n\nimport { mkdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\n\nexport interface RuntimeMeta {\n /** Absolute path to the workspace root the gateway is bound to. */\n workspace: string\n /** HTTP listener port. */\n port: number\n /** HTTP bind address (loopback or `0.0.0.0`). */\n bind: string\n /** Process id of the running gateway. */\n pid: number\n /** Wall-clock ISO timestamp at boot. */\n startedAt: string\n /** MCP server name advertised in the initialize handshake. */\n name: string\n /** AIP doctype names + extensions registered as MCP CRUD tools. */\n registered: readonly string[]\n /**\n * Per-boot bearer token. Required on mutating routes (POST\n * /sessions/*, POST /sessions/:id/kill, DELETE /sessions/:id, and\n * WS upgrade to /sessions/:id/pty). Random uuid generated at boot\n * by createGateway; regenerated each restart.\n */\n token: string\n}\n\n/**\n * Create `<workspace>/.agentproto/` (idempotent) and write the\n * `runtime.json` snapshot. Errors are logged but non-fatal — losing\n * the meta file shouldn't crash the gateway, the runtime is still\n * fully functional without it.\n */\nexport async function writeRuntimeMeta(\n workspace: string,\n meta: RuntimeMeta,\n): Promise<void> {\n const dir = join(workspace, \".agentproto\")\n try {\n await mkdir(dir, { recursive: true })\n // mode 0600 so other local users can't read the bearer token.\n await writeFile(\n join(dir, \"runtime.json\"),\n JSON.stringify(meta, null, 2) + \"\\n\",\n { encoding: \"utf8\", mode: 0o600 },\n )\n } catch (err) {\n console.error(\"[runtime] failed to write .agentproto/runtime.json:\", err)\n }\n}\n\n/**\n * Delete `<workspace>/.agentproto/runtime.json`. Best-effort — called\n * from the daemon's graceful shutdown path so a CLI looking for the\n * live daemon doesn't pick up a stale token after this process exits.\n * Missing file is a no-op (the daemon may never have written one).\n */\nexport async function unlinkRuntimeMeta(workspace: string): Promise<void> {\n try {\n await unlink(join(workspace, \".agentproto\", \"runtime.json\"))\n } catch {\n // ENOENT / permission — not worth surfacing on shutdown.\n }\n}\n\n/**\n * Read a runtime.json from `<workspace>/.agentproto/`. Returns the\n * parsed object (no validation) plus the on-disk mtime, or null when\n * the file is missing / unreadable / malformed.\n */\nexport async function readRuntimeMeta(workspace: string): Promise<{\n meta: Partial<RuntimeMeta> & Record<string, unknown>\n mtime: Date\n} | null> {\n const path = join(workspace, \".agentproto\", \"runtime.json\")\n try {\n const [raw, st] = await Promise.all([readFile(path, \"utf8\"), stat(path)])\n const meta = JSON.parse(raw) as Record<string, unknown>\n return { meta, mtime: st.mtime }\n } catch {\n return null\n }\n}\n\n/**\n * For each `workspace` path, check whether its runtime.json points\n * at a now-dead PID; if so, delete it. Returns the list of paths\n * that were cleaned. Called by `agentproto serve` at boot to keep\n * the discovery layer's view of \"live daemons\" honest — a stale\n * file with the same port as the new daemon is the classic source\n * of `sessions_unauthorized` 401s.\n *\n * Skips the running daemon's own workspace (passed in as\n * `currentWorkspace`) since that file is OURS to write.\n */\nexport async function sweepStaleRuntimeMetas(\n workspaces: readonly string[],\n currentWorkspace: string,\n): Promise<string[]> {\n const cleaned: string[] = []\n for (const ws of workspaces) {\n if (ws === currentWorkspace) continue\n const meta = await readRuntimeMeta(ws)\n if (!meta) continue\n const pid = meta.meta.pid\n if (typeof pid === \"number\" && !isPidAlive(pid)) {\n try {\n await unlink(join(ws, \".agentproto\", \"runtime.json\"))\n cleaned.push(join(ws, \".agentproto\", \"runtime.json\"))\n } catch {\n // ignore — best-effort\n }\n }\n }\n return cleaned\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code\n if (code === \"EPERM\") return true // exists, foreign user\n return false\n }\n}\n","/**\n * Shell-execution MCP tools for the runtime.\n *\n * The runtime is a remote shell as far as cloud agents are concerned —\n * the workspace lives on the user's machine, so the only place a\n * `claude -p`, `gh pr view`, `pnpm test` etc. can actually run *is*\n * the user's machine. This module exposes one MCP tool,\n * `execute_command`, that any MCP client (cloud Guilde Blake,\n * Claude Code as a sub-agent, …) can call to spawn a subprocess.\n *\n * ## Allowlist\n *\n * Default-deny. The runtime reads\n * `<workspace>/.agentproto/allowed-commands.json` on every call (cheap\n * stat; cached for 1s) for the list of allowed command basenames.\n * Missing / empty file ⇒ no commands run. The error message points the\n * user at the file path so they know exactly where to opt in.\n *\n * Allowlist file shape:\n * { \"version\": 1, \"commands\": [\"claude\", \"gh\", \"pnpm\", \"node\"] }\n *\n * Match is by command BASENAME (`/usr/local/bin/claude` → `claude`)\n * to keep the allowlist short and not break when users have multiple\n * binaries on their PATH.\n *\n * ## Safety notes\n *\n * - We use `spawn()` with `shell: false` so arguments are passed\n * verbatim — no shell interpolation surprises.\n * - `cwd` is anchored to the workspace root via the same path-escape\n * guard used by `fs-tools.ts`. Callers can't run a subprocess in\n * `/etc` unless they also bind-mounted it inside the workspace.\n * - Every spawn has a `timeoutMs` cap (default 60s, max 600s). Hung\n * subprocesses can't pin the runtime forever.\n */\n\nimport { spawn } from \"node:child_process\"\nimport { existsSync } from \"node:fs\"\nimport { readFile, stat } from \"node:fs/promises\"\nimport {\n basename,\n isAbsolute,\n join,\n normalize,\n relative,\n resolve,\n} from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nconst DEFAULT_TIMEOUT_MS = 60_000\nconst MAX_TIMEOUT_MS = 600_000\nconst ALLOWLIST_REL = \".agentproto/allowed-commands.json\"\n\nexport interface RegisterCommandToolsOptions {\n workspace: string\n}\n\ninterface AllowlistFile {\n version?: number\n commands?: string[]\n}\n\ninterface AllowlistCacheEntry {\n mtimeMs: number\n commands: Set<string>\n}\n\nlet allowlistCache: { path: string; entry: AllowlistCacheEntry } | null = null\n\nasync function loadAllowlist(workspace: string): Promise<Set<string>> {\n const path = resolve(workspace, ALLOWLIST_REL)\n if (!existsSync(path)) {\n allowlistCache = null\n return new Set()\n }\n try {\n const s = await stat(path)\n if (\n allowlistCache &&\n allowlistCache.path === path &&\n allowlistCache.entry.mtimeMs === s.mtimeMs\n ) {\n return allowlistCache.entry.commands\n }\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as AllowlistFile\n const list = Array.isArray(parsed.commands) ? parsed.commands : []\n const commands = new Set(\n list\n .filter((x): x is string => typeof x === \"string\" && x.length > 0)\n .map(x => x.trim()),\n )\n allowlistCache = { path, entry: { mtimeMs: s.mtimeMs, commands } }\n return commands\n } catch (err) {\n // Bad JSON / unreadable file ⇒ deny all and surface in the error\n // the next caller gets. Don't poison the cache.\n console.error(\n `[runtime] failed to load ${ALLOWLIST_REL} (will deny all):`,\n err,\n )\n allowlistCache = null\n return new Set()\n }\n}\n\nfunction makeCwdAnchor(workspace: string): (input: string | undefined) => string {\n const root = resolve(workspace)\n return (input?: string) => {\n if (!input || input.length === 0) return root\n const candidate = isAbsolute(input)\n ? normalize(input)\n : normalize(join(root, input))\n const rel = relative(root, candidate)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new Error(\n `cwd escapes the workspace: '${input}' (workspace=${root})`,\n )\n }\n return candidate\n }\n}\n\nexport interface ExecuteResult {\n exitCode: number\n signal: string | null\n stdout: string\n stderr: string\n truncated?: boolean\n durationMs: number\n}\n\n/**\n * Register `execute_command` on the given MCP server. The tool returns\n * a JSON-encoded `ExecuteResult` as a single text content item — that\n * matches the response shape `@modelcontextprotocol/server-filesystem`\n * uses for `read_file` and friends, so the existing\n * `parseReadFileResponse`-style parsers in workspace-providers can\n * decode it without bespoke logic.\n */\nexport function registerCommandTools(\n server: McpServer,\n opts: RegisterCommandToolsOptions,\n): void {\n const anchorCwd = makeCwdAnchor(opts.workspace)\n\n server.tool(\n \"execute_command\",\n \"Run a shell command on the host running the runtime. The command basename must be in `<workspace>/.agentproto/allowed-commands.json`; default-deny otherwise. Captures stdout / stderr / exit code and returns them as JSON. Use this to drive local CLIs (Claude Code, gh, pnpm, …) from a remote agent.\",\n {\n command: z\n .string()\n .min(1)\n .describe(\n \"Executable name or absolute path. Must be allowlisted by basename in the workspace's allowed-commands.json.\",\n ),\n args: z\n .array(z.string())\n .optional()\n .describe(\n \"Argv array. Passed verbatim — no shell expansion (we spawn with shell:false so quoting doesn't bite).\",\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Working directory, workspace-relative or an absolute path inside the workspace. Defaults to the workspace root.\",\n ),\n stdin: z\n .string()\n .optional()\n .describe(\"Optional input piped to the process's stdin.\"),\n timeoutMs: z\n .number()\n .int()\n .positive()\n .max(MAX_TIMEOUT_MS)\n .optional()\n .describe(\n `Hard kill after this many ms. Defaults to ${DEFAULT_TIMEOUT_MS}; capped at ${MAX_TIMEOUT_MS}.`,\n ),\n },\n async ({ command, args, cwd, stdin, timeoutMs }) => {\n const allowlist = await loadAllowlist(opts.workspace)\n const baseName = basename(command)\n if (!allowlist.has(baseName)) {\n const allowed = [...allowlist].sort().join(\", \") || \"(empty)\"\n throw new Error(\n `command '${baseName}' is not in the allowlist. ` +\n `Add it to ${join(opts.workspace, ALLOWLIST_REL)} ` +\n `under \"commands\": [...]. Currently allowed: ${allowed}.`,\n )\n }\n const resolvedCwd = anchorCwd(cwd)\n const limit = Math.min(timeoutMs ?? DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS)\n const result = await runCommand({\n command,\n args: args ?? [],\n cwd: resolvedCwd,\n stdin,\n timeoutMs: limit,\n })\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(result) }],\n }\n },\n )\n}\n\ninterface RunCommandInput {\n command: string\n args: string[]\n cwd: string\n stdin?: string\n timeoutMs: number\n}\n\nconst STREAM_BUFFER_CAP = 1_048_576 // 1 MiB per stream\n\nasync function runCommand(input: RunCommandInput): Promise<ExecuteResult> {\n return new Promise<ExecuteResult>(resolvePromise => {\n const startedAt = Date.now()\n const child = spawn(input.command, input.args, {\n cwd: input.cwd,\n shell: false,\n // Inherit user env so PATH lookups for `claude`, `gh`, etc. work.\n env: process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n })\n\n let stdout = \"\"\n let stderr = \"\"\n let truncated = false\n let timedOut = false\n\n function appendCapped(buf: string, chunk: Buffer): string {\n if (buf.length >= STREAM_BUFFER_CAP) {\n truncated = true\n return buf\n }\n const room = STREAM_BUFFER_CAP - buf.length\n const text = chunk.toString(\"utf8\")\n if (text.length > room) {\n truncated = true\n return buf + text.slice(0, room)\n }\n return buf + text\n }\n child.stdout?.on(\"data\", d => {\n stdout = appendCapped(stdout, d)\n })\n child.stderr?.on(\"data\", d => {\n stderr = appendCapped(stderr, d)\n })\n\n if (input.stdin) {\n child.stdin?.write(input.stdin)\n }\n child.stdin?.end()\n\n const timer = setTimeout(() => {\n timedOut = true\n // SIGTERM first; the close handler resolves either way. Ignore\n // EPERM if the child is already gone.\n try {\n child.kill(\"SIGTERM\")\n } catch {\n /* noop */\n }\n // Hard kill 2s later if it hasn't exited.\n setTimeout(() => {\n try {\n child.kill(\"SIGKILL\")\n } catch {\n /* noop */\n }\n }, 2_000).unref()\n }, input.timeoutMs)\n timer.unref()\n\n child.on(\"error\", err => {\n clearTimeout(timer)\n // spawn errors (ENOENT, EACCES) become exitCode -1 with the\n // message in stderr — the JSON shape stays consistent.\n resolvePromise({\n exitCode: -1,\n signal: null,\n stdout,\n stderr: stderr + (stderr ? \"\\n\" : \"\") + (err as Error).message,\n truncated,\n durationMs: Date.now() - startedAt,\n })\n })\n child.on(\"close\", (code, signal) => {\n clearTimeout(timer)\n resolvePromise({\n exitCode: typeof code === \"number\" ? code : -1,\n signal: signal ?? (timedOut ? \"SIGTERM-timeout\" : null),\n stdout,\n stderr,\n truncated,\n durationMs: Date.now() - startedAt,\n })\n })\n })\n}\n","/**\n * Append-only conversation persistence as plain markdown.\n *\n * Each conversation is a file at `<workspace>/conversations/<id>.md`\n * with a frontmatter header (`schema: conversation/v1`, `id`, `agent`,\n * `started`, `status`) and a body composed of `## <role> — <iso>`\n * blocks. Append-only: turns are concatenated to the body, never\n * rewritten in place. Readers tolerant to clock skew use the timestamp\n * in each block, not file mtime.\n *\n * The format is intentionally trivial — git-diffable, human-editable,\n * survives `cat`. Designed to converge with the AIP runtime/v1 spec\n * (TBD) once it lands.\n */\n\nimport { existsSync } from \"node:fs\"\nimport { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\n\nconst FRONTMATTER_RE = /^---\\n([\\s\\S]*?)\\n---\\n/\n\nexport type ConvRole = \"user\" | \"assistant\" | \"system\"\n\nexport interface ConversationMeta {\n id: string\n agent: string\n started: string\n status: \"open\" | \"closed\"\n}\n\nexport interface ConversationTurn {\n role: ConvRole\n at: string\n /** Optional sub-attribution after the role (e.g. agent id). */\n attribution?: string\n content: string\n}\n\nexport interface ConversationStore {\n /**\n * Open a conversation. If the file doesn't exist, it's created with\n * a frontmatter header. If it exists, no-op (idempotent).\n */\n open(id: string, meta: { agent: string }): Promise<void>\n appendTurn(\n id: string,\n role: ConvRole,\n content: string,\n opts?: { attribution?: string; at?: string },\n ): Promise<void>\n read(\n id: string,\n ): Promise<{ meta: ConversationMeta; turns: ConversationTurn[] }>\n list(): Promise<Array<{ id: string; meta: ConversationMeta }>>\n /** Workspace-relative path to the conv file, for tooling. */\n pathFor(id: string): string\n}\n\nexport interface FileConversationStoreOptions {\n /** Absolute workspace root. */\n workspace: string\n /** Override `<workspace>/conversations`. */\n dir?: string\n}\n\nexport function fileConversationStore(\n opts: FileConversationStoreOptions,\n): ConversationStore {\n const dir = opts.dir ?? join(opts.workspace, \"conversations\")\n\n const filePath = (id: string) => join(dir, `${id}.md`)\n\n return {\n pathFor: filePath,\n\n async open(id, meta) {\n await mkdir(dir, { recursive: true })\n const path = filePath(id)\n if (existsSync(path)) return\n const header = renderHeader({\n id,\n agent: meta.agent,\n started: new Date().toISOString(),\n status: \"open\",\n })\n await writeFile(path, header, \"utf8\")\n },\n\n async appendTurn(id, role, content, options) {\n const path = filePath(id)\n // Lazy-open: if a caller appends without opening, create the\n // file so the operation never silently drops a turn.\n if (!existsSync(path)) {\n await this.open(id, { agent: options?.attribution ?? \"unknown\" })\n }\n const block = renderTurn({\n role,\n at: options?.at ?? new Date().toISOString(),\n attribution: options?.attribution,\n content,\n })\n // Append a leading blank line so the new block is always\n // separated from whatever's above (header or prev turn).\n await writeFile(path, block, { encoding: \"utf8\", flag: \"a\" })\n },\n\n async read(id) {\n const path = filePath(id)\n const source = await readFile(path, \"utf8\")\n return parseConversation(source, id)\n },\n\n async list() {\n if (!existsSync(dir)) return []\n const entries = await readdir(dir, { withFileTypes: true })\n const out: Array<{ id: string; meta: ConversationMeta }> = []\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(\".md\")) continue\n const id = entry.name.slice(0, -3)\n try {\n const source = await readFile(join(dir, entry.name), \"utf8\")\n const { meta } = parseConversation(source, id)\n out.push({ id, meta })\n } catch {\n // Skip malformed conv files rather than crash list().\n }\n }\n return out\n },\n }\n}\n\n// ── render ───────────────────────────────────────────────────────────\n\nfunction renderHeader(meta: ConversationMeta): string {\n return [\n \"---\",\n `schema: conversation/v1`,\n `id: ${meta.id}`,\n `agent: ${meta.agent}`,\n `started: ${meta.started}`,\n `status: ${meta.status}`,\n \"---\",\n \"\",\n \"\",\n ].join(\"\\n\")\n}\n\nfunction renderTurn(turn: ConversationTurn): string {\n const heading = turn.attribution\n ? `## ${turn.role} — ${turn.at} (${turn.attribution})`\n : `## ${turn.role} — ${turn.at}`\n return `${heading}\\n\\n${turn.content.trimEnd()}\\n\\n`\n}\n\n// ── parse ────────────────────────────────────────────────────────────\n\ninterface ParsedConversation {\n meta: ConversationMeta\n turns: ConversationTurn[]\n}\n\nfunction parseConversation(source: string, fallbackId: string): ParsedConversation {\n const match = source.match(FRONTMATTER_RE)\n let meta: ConversationMeta = {\n id: fallbackId,\n agent: \"unknown\",\n started: \"\",\n status: \"open\",\n }\n let body = source\n if (match) {\n meta = parseFrontmatter(match[1] ?? \"\", fallbackId)\n body = source.slice(match[0].length)\n }\n\n const turns: ConversationTurn[] = []\n // Split on `## <role> — <iso>` headings. Conservative — anything\n // that doesn't match is treated as continuation of the prior turn.\n const lines = body.split(\"\\n\")\n let current: ConversationTurn | null = null\n let buffer: string[] = []\n\n const flush = () => {\n if (!current) return\n current.content = buffer.join(\"\\n\").trim()\n turns.push(current)\n current = null\n buffer = []\n }\n\n const headingRe =\n /^##\\s+(user|assistant|system)\\s+—\\s+(\\S+)(?:\\s+\\(([^)]+)\\))?\\s*$/\n\n for (const line of lines) {\n const m = line.match(headingRe)\n if (m) {\n flush()\n current = {\n role: m[1] as ConvRole,\n at: m[2] ?? \"\",\n attribution: m[3],\n content: \"\",\n }\n continue\n }\n if (current) buffer.push(line)\n }\n flush()\n\n return { meta, turns }\n}\n\nfunction parseFrontmatter(\n raw: string,\n fallbackId: string,\n): ConversationMeta {\n const out: Record<string, string> = {}\n for (const line of raw.split(\"\\n\")) {\n const colon = line.indexOf(\":\")\n if (colon < 1) continue\n const key = line.slice(0, colon).trim()\n const value = line.slice(colon + 1).trim()\n out[key] = value\n }\n return {\n id: out.id ?? fallbackId,\n agent: out.agent ?? \"unknown\",\n started: out.started ?? \"\",\n status: (out.status === \"closed\" ? \"closed\" : \"open\"),\n }\n}\n","/**\n * In-process event bus for the runtime gateway. Anything the daemon\n * does that an external observer might want to watch (heartbeat fired,\n * conversation turn appended, boot completed, …) flows through here.\n *\n * The HTTP server's `/events` SSE stream subscribes to it and forwards\n * each event as a `data: <json>\\n\\n` frame. Tests and embedded usage\n * subscribe directly via `events.on()`.\n */\n\nimport { EventEmitter } from \"node:events\"\n\nexport interface BootEvent {\n type: \"boot\"\n at: string\n workspace: string\n registered: readonly string[]\n}\n\nexport interface HeartbeatFiredEvent {\n type: \"heartbeat-fired\"\n at: string\n agent: string\n conversationId: string\n prompt: string\n reply: string\n durationMs: number\n}\n\nexport interface HeartbeatErrorEvent {\n type: \"heartbeat-error\"\n at: string\n agent?: string\n error: string\n}\n\nexport interface ConvTurnEvent {\n type: \"conv-turn-appended\"\n at: string\n conversationId: string\n role: \"user\" | \"assistant\"\n contentPreview: string\n}\n\n/**\n * One log line from a supervised tunnel provider (cloudflared today).\n * Surfaced verbatim so users can debug \"why didn't my remote URL come\n * up\" by tailing /events.\n */\nexport interface RemoteLogEvent {\n type: \"remote-log\"\n at: string\n line: string\n}\n\nexport type RuntimeEvent =\n | BootEvent\n | HeartbeatFiredEvent\n | HeartbeatErrorEvent\n | ConvTurnEvent\n | RemoteLogEvent\n\nexport interface RuntimeEvents {\n on<E extends RuntimeEvent[\"type\"]>(\n type: E,\n handler: (ev: Extract<RuntimeEvent, { type: E }>) => void,\n ): () => void\n onAny(handler: (ev: RuntimeEvent) => void): () => void\n emit(ev: RuntimeEvent): void\n}\n\nexport function createRuntimeEvents(): RuntimeEvents {\n const ee = new EventEmitter()\n ee.setMaxListeners(50)\n\n return {\n on(type, handler) {\n const wrapped = (ev: RuntimeEvent) => {\n if (ev.type === type) handler(ev as Extract<RuntimeEvent, { type: typeof type }>)\n }\n ee.on(\"event\", wrapped)\n return () => ee.off(\"event\", wrapped)\n },\n onAny(handler) {\n ee.on(\"event\", handler)\n return () => ee.off(\"event\", handler)\n },\n emit(ev) {\n ee.emit(\"event\", ev)\n },\n }\n}\n","/**\n * Filesystem MCP tools registered on the runtime's MCP server.\n *\n * The runtime already exposes AIP CRUD verbs (create_tool, load_agent, …)\n * via @agentproto/mcp-server. To make the workspace genuinely reachable\n * to remote MCP clients (Guilde cloud agents through a tunnel, IDEs,\n * etc.), we also register canonical filesystem tools that match the\n * shape used by `@modelcontextprotocol/server-filesystem` so existing\n * MCP-fs proxy clients can target the runtime without bespoke logic:\n *\n * read_file ({ path }) → string\n * write_file ({ path, content }) → \"ok\"\n * list_directory ({ path? }) → \"[FILE] x\\n[DIR] y\" lines\n * get_file_info ({ path }) → { name, type, size, modified }\n * create_directory ({ path }) → \"ok\"\n * delete_file ({ path }) → \"ok\"\n *\n * All paths are resolved relative to the workspace root via the same\n * escape guard used by `WorkspaceFs`. Absolute paths inside the root\n * are accepted (so callers that prefix `basePath` with the absolute\n * workspace path keep working).\n */\n\nimport {\n mkdir,\n readFile,\n readdir,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\"\nimport { dirname, isAbsolute, join, normalize, relative, resolve } from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nexport interface RegisterFsToolsOptions {\n workspace: string\n}\n\nclass FsPathError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"FsPathError\"\n }\n}\n\nfunction makeAnchor(workspace: string): (input: string) => string {\n const root = resolve(workspace)\n return (input: string) => {\n if (typeof input !== \"string\" || input.length === 0) {\n throw new FsPathError(\"path must be a non-empty string\")\n }\n const candidate = isAbsolute(input)\n ? normalize(input)\n : normalize(join(root, input))\n const rel = relative(root, candidate)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new FsPathError(`path escapes the workspace: '${input}'`)\n }\n return candidate\n }\n}\n\nfunction text(value: string | object): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value),\n },\n ],\n }\n}\n\nexport function registerFsTools(\n server: McpServer,\n opts: RegisterFsToolsOptions,\n): void {\n const anchor = makeAnchor(opts.workspace)\n\n server.tool(\n \"read_file\",\n \"Read a UTF-8 file from the workspace.\",\n { path: z.string().describe(\"Workspace-relative path to the file.\") },\n async ({ path }) => {\n const abs = anchor(path)\n const buf = await readFile(abs)\n return text(buf.toString(\"utf8\"))\n },\n )\n\n server.tool(\n \"write_file\",\n \"Write a file to the workspace. Parent directories are created on demand.\",\n {\n path: z.string().describe(\"Workspace-relative path to the file.\"),\n content: z.string().describe(\"File body (UTF-8).\"),\n },\n async ({ path, content }) => {\n const abs = anchor(path)\n await mkdir(dirname(abs), { recursive: true })\n await writeFile(abs, content, \"utf8\")\n return text(\"ok\")\n },\n )\n\n server.tool(\n \"list_directory\",\n \"List entries of a directory in the workspace. Returns one '[FILE]' or '[DIR]' line per entry, mirroring `@modelcontextprotocol/server-filesystem`.\",\n {\n path: z\n .string()\n .optional()\n .describe(\"Workspace-relative directory (defaults to workspace root).\"),\n },\n async ({ path }) => {\n const abs = anchor(path && path.length > 0 ? path : \".\")\n const entries = await readdir(abs, { withFileTypes: true })\n const lines = entries.map(e =>\n e.isDirectory() ? `[DIR] ${e.name}` : `[FILE] ${e.name}`,\n )\n return text(lines.join(\"\\n\"))\n },\n )\n\n server.tool(\n \"get_file_info\",\n \"Stat a file or directory in the workspace.\",\n { path: z.string().describe(\"Workspace-relative path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n const info = await stat(abs)\n return text({\n name: abs.split(\"/\").pop() ?? path,\n path,\n type: info.isDirectory() ? \"directory\" : \"file\",\n size: info.size,\n modified: info.mtime.toISOString(),\n created: info.birthtime.toISOString(),\n })\n },\n )\n\n server.tool(\n \"create_directory\",\n \"Create a directory (recursive) in the workspace.\",\n { path: z.string().describe(\"Workspace-relative directory path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n await mkdir(abs, { recursive: true })\n return text(\"ok\")\n },\n )\n\n server.tool(\n \"delete_file\",\n \"Delete a file or empty directory in the workspace.\",\n { path: z.string().describe(\"Workspace-relative path.\") },\n async ({ path }) => {\n const abs = anchor(path)\n await rm(abs, { recursive: true, force: true })\n return text(\"ok\")\n },\n )\n}\n","/**\n * Discover MCP servers already configured in the user's local agent\n * tooling — claude-code, cursor, goose, etc. — so the daemon can\n * surface them in the UI without making the user re-enter the same\n * credentials and URLs they already painstakingly configured for\n * one host.\n *\n * v1 is read-only discovery: we report what's there with source\n * attribution. Future v1.1 ships an \"import to daemon\" verb that\n * proxies the discovered server through the daemon's own /mcp\n * endpoint so every operator (cloud Guilde, local agents) sees a\n * unified set without per-host config drift.\n *\n * Sources scanned (in priority order):\n * - ~/.claude.json (claude-code) — `mcpServers` top-level + nested\n * under `projects[<path>].mcpServers`. Most users land here.\n * - ~/.cursor/mcp.json (cursor) — flat `mcpServers` map.\n * - ~/.config/goose/config.yaml (goose) — TOML/YAML hybrid; we\n * only handle the YAML form for now.\n * - any `.mcp.json` under the user's home that follows the\n * standard mcpServers shape.\n *\n * Each source contributes 0..N entries. Errors are caught + logged\n * (broken JSON, missing files, permission denied) — partial\n * discovery beats failing the whole listing on one bad file.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { resolve as resolvePath } from \"node:path\"\nimport {\n loadWorkspacesConfig,\n type WorkspaceEntry,\n} from \"./workspaces-config.js\"\n\nexport interface DiscoveredMcp {\n /** Stable id within (source, scope, name) — for de-dupe and\n * cross-call identity (UI treat as React key). */\n id: string\n /** Where we found it. Lets the UI render a source badge. */\n source: \"claude-code\" | \"cursor\" | \"goose\" | \"workspace\"\n /** \"global\" when the entry sits at the top level of the host's\n * config; \"project:<path>\" when it's scoped to a single\n * workspace. claude-code in particular nests per-project. */\n scope: string\n /** The host's name for the entry (key in the mcpServers map). */\n name: string\n /** Wire transport — `stdio` (command + args) or `http` / `sse` (url). */\n type: \"stdio\" | \"http\" | \"sse\" | \"unknown\"\n /** stdio entries: argv to spawn. */\n command?: string\n args?: string[]\n /** stdio entries: env injected into the child. */\n env?: Record<string, string>\n /** http/sse entries: target URL. */\n url?: string\n /** http/sse entries: extra headers (Authorization, etc.). */\n headers?: Record<string, string>\n /** Free-form tags from the source config — claude-code's project\n * scope is the most common. */\n tags?: string[]\n /** Reason field when `type === \"unknown\"` — surfaces why the\n * parser couldn't classify the entry (e.g. neither command nor\n * url present). */\n parseNote?: string\n}\n\nexport interface DiscoverMcpsOptions {\n /** Override the home dir — handy for tests that pin a tmpdir. */\n home?: string\n}\n\nexport async function discoverMcps(\n opts: DiscoverMcpsOptions = {}\n): Promise<DiscoveredMcp[]> {\n const home = opts.home ?? homedir()\n const out: DiscoveredMcp[] = []\n const errors: string[] = []\n await Promise.all([\n scanClaudeCode(home, out, errors),\n scanCursor(home, out, errors),\n scanGoose(home, out, errors),\n scanRegisteredWorkspaces(out, errors),\n ])\n // De-dupe identical entries that show up in multiple scopes\n // (e.g. user copied a project entry to global) — keep the first\n // occurrence so the source attribution stays meaningful.\n const seen = new Set<string>()\n const dedup: DiscoveredMcp[] = []\n for (const m of out) {\n const key = `${m.source}:${m.scope}:${m.name}`\n if (seen.has(key)) continue\n seen.add(key)\n dedup.push(m)\n }\n if (errors.length > 0) {\n // One log line per error — operators can trace which file\n // failed without us bubbling the whole stack into the response.\n for (const e of errors) console.warn(`[mcp-discovery] ${e}`)\n }\n return dedup.sort((a, b) => {\n if (a.source !== b.source) return a.source.localeCompare(b.source)\n if (a.scope !== b.scope) return a.scope.localeCompare(b.scope)\n return a.name.localeCompare(b.name)\n })\n}\n\ninterface RawMcpEntry {\n type?: string\n command?: string\n args?: string[]\n env?: Record<string, string>\n url?: string\n headers?: Record<string, string>\n}\n\n/** claude-code stores entries either at top-level `mcpServers` OR\n * per-project under `projects[<absolute-path>].mcpServers`. We\n * surface both with `scope` set so the UI can group by project. */\nasync function scanClaudeCode(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n const path = resolvePath(home, \".claude.json\")\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return\n errors.push(`claude-code: read ${path} — ${(err as Error).message}`)\n return\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(`claude-code: JSON parse ${path} — ${(err as Error).message}`)\n return\n }\n if (!parsed || typeof parsed !== \"object\") return\n const root = parsed as Record<string, unknown>\n const top = root.mcpServers\n if (top && typeof top === \"object\") {\n pushMcpMap({\n out,\n source: \"claude-code\",\n scope: \"global\",\n map: top as Record<string, unknown>,\n })\n }\n const projects = root.projects\n if (projects && typeof projects === \"object\") {\n for (const [projPath, proj] of Object.entries(\n projects as Record<string, unknown>\n )) {\n if (!proj || typeof proj !== \"object\") continue\n const projMcps = (proj as Record<string, unknown>).mcpServers\n if (!projMcps || typeof projMcps !== \"object\") continue\n pushMcpMap({\n out,\n source: \"claude-code\",\n scope: `project:${projPath}`,\n map: projMcps as Record<string, unknown>,\n })\n }\n }\n}\n\n/** cursor uses ~/.cursor/mcp.json (standard mcpServers shape).\n * Also supports per-workspace `.cursor/mcp.json` but those need\n * the user's project paths — out of scope for v1. */\nasync function scanCursor(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n const path = resolvePath(home, \".cursor\", \"mcp.json\")\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return\n errors.push(`cursor: read ${path} — ${(err as Error).message}`)\n return\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(`cursor: JSON parse ${path} — ${(err as Error).message}`)\n return\n }\n if (!parsed || typeof parsed !== \"object\") return\n const root = parsed as Record<string, unknown>\n const map = root.mcpServers\n if (map && typeof map === \"object\") {\n pushMcpMap({\n out,\n source: \"cursor\",\n scope: \"global\",\n map: map as Record<string, unknown>,\n })\n }\n}\n\n/** goose stores config in ~/.config/goose/config.yaml. The full\n * parser is non-trivial (yaml + extension manifests); v1 looks for\n * the simple `extensions:` block with `mcp_servers` declarations\n * and emits a parseNote so the user knows we found goose but\n * punted on the details. */\nasync function scanGoose(\n home: string,\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n // ~/.config on macOS / Linux; goose hasn't shipped Windows-native yet.\n const path = resolvePath(home, \".config\", \"goose\", \"config.yaml\")\n try {\n await fs.access(path)\n } catch {\n return\n }\n // We don't ship a yaml parser as a runtime dep — record presence\n // but punt on parsing. The user sees \"goose detected — open\n // ~/.config/goose/config.yaml to inspect entries\" which is enough\n // signal to drive a v2 enhancement.\n out.push({\n id: \"goose:global:_detected\",\n source: \"goose\",\n scope: \"global\",\n name: \"(goose config detected)\",\n type: \"unknown\",\n parseNote:\n \"Goose config found but YAML parsing is not yet implemented. \" +\n \"Open ~/.config/goose/config.yaml to inspect MCP entries.\",\n })\n}\n\n/**\n * Per-workspace scan — for each registered workspace, look at the\n * common per-project MCP locations (.mcp.json, .cursor/mcp.json,\n * .vscode/mcp.json). Lets the UI surface \"this workspace ships\n * its own chrome-devtools MCP\" instead of only\n * showing what the user configured globally in claude/cursor.\n */\nasync function scanRegisteredWorkspaces(\n out: DiscoveredMcp[],\n errors: string[]\n): Promise<void> {\n let workspaces: WorkspaceEntry[] = []\n try {\n const cfg = await loadWorkspacesConfig()\n workspaces = cfg.workspaces\n } catch (err) {\n errors.push(`workspaces: load failed — ${(err as Error).message}`)\n return\n }\n // Walk each workspace + each candidate path. We don't recurse —\n // these are conventional top-level files. Errors per-file are\n // collected; one bad file doesn't fail the rest.\n await Promise.all(\n workspaces.map(async ws => {\n const candidates = [\n resolvePath(ws.path, \".mcp.json\"),\n resolvePath(ws.path, \".cursor\", \"mcp.json\"),\n resolvePath(ws.path, \".vscode\", \"mcp.json\"),\n ]\n for (const path of candidates) {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") continue\n errors.push(\n `workspace ${ws.slug}: read ${path} — ${(err as Error).message}`\n )\n continue\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n errors.push(\n `workspace ${ws.slug}: JSON parse ${path} — ${(err as Error).message}`\n )\n continue\n }\n if (!parsed || typeof parsed !== \"object\") continue\n const map = (parsed as Record<string, unknown>).mcpServers\n if (!map || typeof map !== \"object\") continue\n pushMcpMap({\n out,\n source: \"workspace\",\n scope: `workspace:${ws.slug}`,\n map: map as Record<string, unknown>,\n })\n }\n })\n )\n}\n\nfunction pushMcpMap(args: {\n out: DiscoveredMcp[]\n source: DiscoveredMcp[\"source\"]\n scope: string\n map: Record<string, unknown>\n}): void {\n for (const [name, raw] of Object.entries(args.map)) {\n if (!raw || typeof raw !== \"object\") continue\n const entry = raw as RawMcpEntry\n const id = `${args.source}:${args.scope}:${name}`\n const declared = typeof entry.type === \"string\" ? entry.type : null\n const url = typeof entry.url === \"string\" ? entry.url : undefined\n const command = typeof entry.command === \"string\" ? entry.command : undefined\n let type: DiscoveredMcp[\"type\"]\n if (declared === \"http\" || declared === \"sse\" || declared === \"stdio\") {\n type = declared\n } else if (url) {\n type = \"http\"\n } else if (command) {\n type = \"stdio\"\n } else {\n type = \"unknown\"\n }\n const m: DiscoveredMcp = {\n id,\n source: args.source,\n scope: args.scope,\n name,\n type,\n }\n if (command !== undefined) m.command = command\n if (Array.isArray(entry.args)) {\n m.args = entry.args.filter((a): a is string => typeof a === \"string\")\n }\n if (entry.env && typeof entry.env === \"object\") {\n m.env = stringifyValues(entry.env)\n }\n if (url !== undefined) m.url = url\n if (entry.headers && typeof entry.headers === \"object\") {\n m.headers = stringifyValues(entry.headers)\n }\n if (type === \"unknown\") {\n m.parseNote =\n \"Entry has neither `command` nor `url` — couldn't classify transport.\"\n }\n args.out.push(m)\n }\n}\n\nfunction stringifyValues(\n raw: Record<string, unknown>\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(raw)) {\n if (typeof v === \"string\") out[k] = v\n else if (v != null) out[k] = String(v)\n }\n return out\n}\n","/**\n * `~/.agentproto/imported-mcps.json` — the user's curated set of\n * discovered MCPs they want the daemon to know about. v1 is just\n * persistence + read-side; the actual MCP-proxy implementation\n * (where the daemon's /mcp endpoint aggregates the imported\n * servers' tools under namespace prefixes) is v2 work.\n *\n * Purpose: today, \"I see you have chrome-devtools in claude\" is\n * read-only. Once a user imports it, the operator agent can refer\n * to it (\"the user said it's enabled — call it\") and a future\n * proxy layer can actually expose it. We persist the choice now so\n * the data is in place when the proxy lands.\n *\n * File shape:\n * {\n * \"version\": 1,\n * \"imports\": [\n * {\n * \"id\": \"claude-code:project:/path:chrome-devtools\",\n * \"alias\": \"chrome-devtools\",\n * \"addedAt\": \"2026-05-10T...\",\n * \"snapshot\": { ...the DiscoveredMcp at import time }\n * }\n * ]\n * }\n *\n * Snapshotting at import time keeps the daemon resilient to the\n * source config getting deleted (user runs `claude mcp remove ...`).\n * The imported entry stays usable; only the next discovery pass\n * stops listing it as \"available to import.\"\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { dirname, resolve as resolvePath } from \"node:path\"\nimport type { DiscoveredMcp } from \"./mcp-discovery.js\"\n\nexport const IMPORTED_MCPS_PATH = (): string =>\n resolvePath(homedir(), \".agentproto\", \"imported-mcps.json\")\n\nexport const IMPORTED_MCPS_VERSION = 1 as const\n\nexport interface ImportedMcpEntry {\n id: string\n alias: string\n addedAt: string\n snapshot: DiscoveredMcp\n}\n\nexport interface ImportedMcpsConfig {\n version: typeof IMPORTED_MCPS_VERSION\n imports: ImportedMcpEntry[]\n}\n\nconst EMPTY: ImportedMcpsConfig = {\n version: IMPORTED_MCPS_VERSION,\n imports: [],\n}\n\nexport async function loadImportedMcps(\n path: string = IMPORTED_MCPS_PATH()\n): Promise<ImportedMcpsConfig> {\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return EMPTY\n throw err\n }\n let parsed: unknown\n try {\n parsed = JSON.parse(raw)\n } catch (err) {\n throw new Error(\n `agentproto: ${path} is not valid JSON (${\n err instanceof Error ? err.message : String(err)\n }). Delete or fix manually.`\n )\n }\n return normalize(parsed)\n}\n\nexport async function saveImportedMcps(\n config: ImportedMcpsConfig,\n path: string = IMPORTED_MCPS_PATH()\n): Promise<void> {\n await fs.mkdir(dirname(path), { recursive: true })\n const tmp = `${path}.tmp.${process.pid}`\n await fs.writeFile(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf8\")\n await fs.rename(tmp, path)\n}\n\n/**\n * Add (or replace) an import. Snapshots the discovered MCP at\n * import time so the entry stays usable when the source config\n * disappears.\n */\nexport function addImport(\n config: ImportedMcpsConfig,\n input: { snapshot: DiscoveredMcp; alias?: string }\n): ImportedMcpsConfig {\n const alias = (input.alias ?? input.snapshot.name).trim()\n if (!alias) {\n throw new Error(\"addImport: alias resolves to empty string\")\n }\n const addedAt = new Date().toISOString()\n const next: ImportedMcpEntry = {\n id: input.snapshot.id,\n alias,\n addedAt,\n snapshot: input.snapshot,\n }\n const others = config.imports.filter(e => e.id !== input.snapshot.id)\n return { ...config, imports: [...others, next] }\n}\n\nexport function removeImport(\n config: ImportedMcpsConfig,\n id: string\n): ImportedMcpsConfig {\n return { ...config, imports: config.imports.filter(e => e.id !== id) }\n}\n\nexport function findImport(\n config: ImportedMcpsConfig,\n id: string\n): ImportedMcpEntry | undefined {\n return config.imports.find(e => e.id === id)\n}\n\nfunction normalize(parsed: unknown): ImportedMcpsConfig {\n if (!parsed || typeof parsed !== \"object\") return EMPTY\n const obj = parsed as Record<string, unknown>\n const imports: ImportedMcpEntry[] = []\n if (Array.isArray(obj.imports)) {\n for (const entry of obj.imports) {\n if (!entry || typeof entry !== \"object\") continue\n const e = entry as Record<string, unknown>\n const id = typeof e.id === \"string\" ? e.id : \"\"\n const alias = typeof e.alias === \"string\" ? e.alias : id\n const addedAt =\n typeof e.addedAt === \"string\" ? e.addedAt : new Date().toISOString()\n const snapshot = e.snapshot as DiscoveredMcp | undefined\n if (!id || !snapshot) continue\n imports.push({ id, alias, addedAt, snapshot })\n }\n }\n return { version: IMPORTED_MCPS_VERSION, imports }\n}\n","/**\n * MCP tools that expose the sessions registry to agents connected to\n * the daemon. Lets a remote operator (Mastra agent in cloud Guilde,\n * Claude Code as a sub-agent, …) spawn + drive agent CLIs on the\n * user's machine through the same MCP connection they already use\n * for fs/exec.\n *\n * Five tools:\n * start_agent_session spawn a long-running agent (claude / hermes / …)\n * prompt_agent_session send a follow-up turn to a live session\n * list_agent_sessions browse alive + recent sessions\n * get_agent_session_output tail the ring buffer\n * kill_agent_session SIGTERM the session\n *\n * Auth: same as every other daemon tool — gated by the gateway's\n * auth source (loopback bypass when no tunnel is up).\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\nimport type { SessionsRegistry } from \"./sessions.js\"\nimport type {\n AgentAdapterResolver,\n AgentAdapterLister,\n} from \"./http-server.js\"\nimport {\n loadWorkspacesConfig,\n findWorkspace,\n getActiveWorkspace,\n} from \"./workspaces-config.js\"\nimport { discoverMcps } from \"./mcp-discovery.js\"\nimport {\n loadImportedMcps,\n saveImportedMcps,\n addImport,\n removeImport,\n} from \"./mcp-imports.js\"\nimport type { McpProxyRegistry } from \"./mcp-proxy.js\"\n\ninterface RegisterSessionToolsOptions {\n registry: SessionsRegistry\n /** Optional adapter resolver — required for `start_agent_session`\n * (the others work with raw spawn sessions too). When unset the\n * start tool returns a clear error pointing at the host wiring. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional adapter lister — when wired, exposes `list_adapters`\n * MCP tool. Without it the tool returns a clear \"not configured\"\n * error pointing at the host wiring. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional MCP proxy registry — when wired, exposes 3 tools that\n * let the operator drive imported MCPs (chrome-devtools, goose-bridge,\n * …) through the daemon as a single MCP entry point. */\n mcpProxy?: McpProxyRegistry\n /** Whether the registry was constructed with a PTY factory — when\n * true, expose the four terminal session tools. When false, the\n * tools return a clear \"not configured\" error. */\n ptyEnabled?: boolean\n}\n\nexport function registerSessionTools(\n server: McpServer,\n opts: RegisterSessionToolsOptions\n): void {\n const { registry, resolveAgentAdapter, listAgentAdapters, mcpProxy } = opts\n const ptyEnabled = opts.ptyEnabled === true\n\n // ── start_agent_session ────────────────────────────────────────\n server.tool(\n \"start_agent_session\",\n \"Spawn a long-running agent CLI (claude-code, hermes, …) on the host. \" +\n \"The session stays alive across multiple turns — call `prompt_agent_session` \" +\n \"to continue the conversation. Returns the session id + initial descriptor. \" +\n \"When `workspaceSlug` is set, resolves the cwd via \" +\n \"`~/.agentproto/workspaces.json`; otherwise pass `cwd` explicitly or \" +\n \"fall back to the active workspace.\",\n {\n adapter: z\n .string()\n .min(1)\n .describe(\n \"Adapter slug — one of the installed `@agentproto/adapter-*` packages \" +\n \"(e.g. 'claude-code', 'hermes', 'aider').\"\n ),\n workspaceSlug: z\n .string()\n .optional()\n .describe(\n \"Workspace slug from `agentproto workspace list`. The daemon resolves it \" +\n \"to an absolute path. Omit to use the `cwd` field or the active workspace.\"\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Absolute path to spawn the agent in. Wins over `workspaceSlug` when both are set.\"\n ),\n prompt: z\n .string()\n .optional()\n .describe(\n \"Optional initial prompt. The session is spawned and the prompt dispatched \" +\n \"in one shot — equivalent to `start` then `prompt` back-to-back. Skip to spawn idle.\"\n ),\n label: z\n .string()\n .optional()\n .describe(\n \"Free-text label that surfaces in `list_agent_sessions` and the UI — useful \" +\n \"for tagging sessions with a conversation id or operator name.\"\n ),\n },\n async input => {\n if (!resolveAgentAdapter) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_agent_session is not enabled — the daemon was started without \" +\n \"an adapter resolver. Re-run the daemon with the `@agentproto/cli` \" +\n \"shim wired (see playground/scripts/gateway.ts).\",\n },\n ],\n isError: true,\n }\n }\n // cwd resolution mirrors the HTTP route: explicit cwd wins,\n // then workspaceSlug lookup, then active workspace, then a\n // hard error (the operator probably forgot a step).\n let cwd = input.cwd\n let resolvedSlug = input.workspaceSlug ?? \"default\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = input.workspaceSlug\n ? findWorkspace(config, input.workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n resolvedSlug = ws.slug\n }\n } catch {\n // fall through to error below\n }\n }\n if (!cwd) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_agent_session: no cwd resolvable. Pass `cwd` explicitly, \" +\n \"or pass `workspaceSlug` matching `agentproto workspace list`, \" +\n \"or set an active workspace via `agentproto workspace use <slug>`.\",\n },\n ],\n isError: true,\n }\n }\n const resolved = await resolveAgentAdapter(input.adapter)\n if (!resolved) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_agent_session: adapter \"${input.adapter}\" not found. Try \\`agentproto install <slug>\\` first.`,\n },\n ],\n isError: true,\n }\n }\n try {\n const agentSession = await resolved.startSession({ cwd })\n const desc = registry.spawnAgent({\n workspaceSlug: resolvedSlug,\n cwd,\n agentSession,\n adapterSlug: input.adapter,\n ...(input.prompt ? { initialPrompt: input.prompt } : {}),\n ...(input.label ? { label: input.label } : {}),\n ...(resolved.commandPreview\n ? { commandPreview: resolved.commandPreview }\n : {}),\n })\n return {\n content: [{ type: \"text\", text: JSON.stringify(desc, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_agent_session: spawn failed — ${\n err instanceof Error ? err.message : String(err)\n }`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── prompt_agent_session ───────────────────────────────────────\n server.tool(\n \"prompt_agent_session\",\n \"Send a follow-up prompt to a live agent session — multi-turn continuity \" +\n \"without re-spawning. The session id comes from `start_agent_session` \" +\n \"(or `list_agent_sessions`). Returns immediately; tail output via \" +\n \"`get_agent_session_output` or the SSE /sessions/:id/stream endpoint.\",\n {\n sessionId: z.string().describe(\"Session id returned by start_agent_session.\"),\n prompt: z.string().min(1).describe(\"The next user turn (plain text).\"),\n },\n async input => {\n try {\n // Note: sendPrompt awaits the full turn (drains the event\n // stream into the ring buffer). For long turns the operator\n // would prefer fire-and-forget — kick the promise without\n // awaiting and report \"queued\". The caller polls\n // get_agent_session_output for completion.\n void registry.sendPrompt(input.sessionId, input.prompt).catch(() => {\n // Errors land in the ring buffer; nothing to do here.\n })\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n { ok: true, sessionId: input.sessionId, queued: true },\n null,\n 2\n ),\n },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `prompt_agent_session: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_sessions (canonical lister) ──────────────────────────\n server.tool(\n \"list_sessions\",\n \"List sessions tracked by the daemon — agent-CLI sessions (claude-code, \" +\n \"hermes, …), terminal/PTY sessions (claude TUI, bash, …), and raw \" +\n \"commands. Each entry includes `kind`, `pty` (true for real PTYs), \" +\n \"`name` (when set at spawn), `status`, `command`, age + exit code. Use \" +\n \"this when you need to know what's already running before spawning \" +\n \"anything new, or to discover a session id by name.\",\n {\n kind: z\n .enum([\"terminal\", \"agent-cli\", \"command\", \"all\"])\n .optional()\n .describe(\n \"Filter by session kind. `all` (default) returns every kind. \" +\n \"Use `terminal` to list only PTY sessions, `agent-cli` for \" +\n \"structured ACP agents.\",\n ),\n onlyAlive: z\n .boolean()\n .optional()\n .describe(\"When true, only running/starting sessions. Default false.\"),\n status: z\n .enum([\"starting\", \"running\", \"exited\", \"killed\", \"error\"])\n .optional()\n .describe(\"Filter by exact status (overrides onlyAlive).\"),\n },\n async input => {\n let rows = registry.list()\n if (input.kind && input.kind !== \"all\") {\n rows = rows.filter(s => s.kind === input.kind)\n }\n if (input.status) {\n rows = rows.filter(s => s.status === input.status)\n } else if (input.onlyAlive) {\n rows = rows.filter(\n s => s.status === \"running\" || s.status === \"starting\",\n )\n }\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ sessions: rows }, null, 2) },\n ],\n }\n },\n )\n\n // ── list_agent_sessions (kept for backwards compatibility) ─────\n server.tool(\n \"list_agent_sessions\",\n \"DEPRECATED — prefer `list_sessions` which returns ALL kinds + filters. \" +\n \"Despite the name this tool already returns every kind, not just \" +\n \"agent-cli sessions; the new tool's name reflects the actual surface.\",\n {\n onlyAlive: z\n .boolean()\n .optional()\n .describe(\"Filter to status running/starting only. Default false.\"),\n },\n async input => {\n const all = registry.list()\n const filtered = input.onlyAlive\n ? all.filter(s => s.status === \"running\" || s.status === \"starting\")\n : all\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ sessions: filtered }, null, 2),\n },\n ],\n }\n }\n )\n\n // ── get_agent_session_output ───────────────────────────────────\n server.tool(\n \"get_agent_session_output\",\n \"Tail the recent output of a session. Returns the last N lines of the \" +\n \"ring buffer (stdout + stderr inter-leaved, newest last). Use this to read \" +\n \"an agent's reply after `prompt_agent_session`.\",\n {\n sessionId: z.string().describe(\"Session id.\"),\n lastN: z\n .number()\n .int()\n .min(1)\n .max(500)\n .optional()\n .describe(\"Max lines to return. Default 80, max 500.\"),\n },\n async input => {\n const desc = registry.get(input.sessionId)\n if (!desc) {\n return {\n content: [\n { type: \"text\", text: `get_agent_session_output: no session \"${input.sessionId}\"` },\n ],\n isError: true,\n }\n }\n // Best-effort tail — re-attach with a temp listener, capture\n // backfill (which is the recent ring buffer), unsubscribe.\n const limit = input.lastN ?? 80\n const lines: string[] = []\n const unsub = registry.attach(input.sessionId, (line, _stream) => {\n lines.push(line)\n })\n if (unsub) unsub()\n const tail = lines.slice(-limit)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n sessionId: input.sessionId,\n status: desc.status,\n lastOutputAt: desc.lastOutputAt,\n lines: tail,\n },\n null,\n 2\n ),\n },\n ],\n }\n }\n )\n\n // ── list_adapters ──────────────────────────────────────────────\n server.tool(\n \"list_adapters\",\n \"Enumerate every agent CLI adapter installed on the host (claude-code, \" +\n \"hermes, aider, …). Returns slug + display name + version + protocol so \" +\n \"callers can let users pick from the installed set instead of guessing. \" +\n \"Use before `start_agent_session` when the model doesn't already know \" +\n \"what's available.\",\n {},\n async () => {\n if (!listAgentAdapters) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"list_adapters is not enabled — the daemon was started without \" +\n \"an adapter lister. Wire `@agentproto/cli`'s \" +\n \"`listInstalledAdapters` via `createGateway({ listAgentAdapters })`.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const adapters = await listAgentAdapters()\n return {\n content: [{ type: \"text\", text: JSON.stringify({ adapters }, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_adapters failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_discovered_mcps ───────────────────────────────────────\n server.tool(\n \"list_discovered_mcps\",\n \"Discover MCP servers already configured in the user's other agent \" +\n \"tooling (claude-code, cursor, goose). Returns the union with source \" +\n \"attribution so the operator can suggest 'I see you have a chrome-devtools \" +\n \"MCP set up in claude — want me to use it?' instead of asking the user \" +\n \"to re-configure. Read-only — does not modify any host's config.\",\n {},\n async () => {\n try {\n const mcps = await discoverMcps()\n return {\n content: [{ type: \"text\", text: JSON.stringify({ mcps }, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_discovered_mcps failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── list_imported_mcps ─────────────────────────────────────────\n server.tool(\n \"list_imported_mcps\",\n \"Return the user's curated set of MCP servers — the ones they've \" +\n \"imported from claude / cursor / workspace configs into the daemon. \" +\n \"Use to know which MCPs the operator may freely call vs. ones still \" +\n \"showing up in `list_discovered_mcps` waiting on the user's blessing.\",\n {},\n async () => {\n try {\n const config = await loadImportedMcps()\n return {\n content: [\n { type: \"text\", text: JSON.stringify(config, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `list_imported_mcps failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── import_mcp ─────────────────────────────────────────────────\n server.tool(\n \"import_mcp\",\n \"Import a discovered MCP into the daemon's curated set. The agent \" +\n \"calls `list_discovered_mcps` first, asks the user, then commits the \" +\n \"choice via this tool. The snapshot is captured at import time so \" +\n \"the entry stays usable if the source config (claude/cursor) is \" +\n \"later removed.\",\n {\n sourceMcpId: z\n .string()\n .min(1)\n .describe(\n \"The discovered MCP id from `list_discovered_mcps` \" +\n \"(e.g. 'claude-code:project:/path:chrome-devtools').\"\n ),\n alias: z\n .string()\n .optional()\n .describe(\n \"Optional friendly name to display. Defaults to the source MCP's name.\"\n ),\n },\n async input => {\n try {\n const discovered = await discoverMcps()\n const snapshot = discovered.find(d => d.id === input.sourceMcpId)\n if (!snapshot) {\n return {\n content: [\n {\n type: \"text\",\n text: `import_mcp: discovered MCP \"${input.sourceMcpId}\" not found. Re-run list_discovered_mcps to get current ids.`,\n },\n ],\n isError: true,\n }\n }\n const cfg = await loadImportedMcps()\n const next = addImport(cfg, {\n snapshot,\n ...(input.alias ? { alias: input.alias } : {}),\n })\n await saveImportedMcps(next)\n const entry = next.imports.find(e => e.id === snapshot.id)\n return {\n content: [{ type: \"text\", text: JSON.stringify(entry, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `import_mcp failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── remove_imported_mcp ────────────────────────────────────────\n server.tool(\n \"remove_imported_mcp\",\n \"Remove a previously-imported MCP from the daemon's curated set. \" +\n \"Use when the user no longer wants the operator referencing it.\",\n {\n id: z\n .string()\n .min(1)\n .describe(\n \"The imported MCP id (matches the discovered MCP id at import time).\"\n ),\n },\n async input => {\n try {\n const cfg = await loadImportedMcps()\n if (!cfg.imports.some(e => e.id === input.id)) {\n return {\n content: [\n {\n type: \"text\",\n text: `remove_imported_mcp: id \"${input.id}\" not in imports. Use list_imported_mcps to see current entries.`,\n },\n ],\n isError: true,\n }\n }\n await saveImportedMcps(removeImport(cfg, input.id))\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ ok: true, id: input.id }, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `remove_imported_mcp failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── mcp_imported_status ────────────────────────────────────────\n // The 3 proxy tools share the same wiring guard — register them\n // only when the host injected a proxy registry, otherwise emit a\n // clear \"not enabled\" error so the agent doesn't think the daemon\n // silently dropped the call.\n server.tool(\n \"mcp_imported_status\",\n \"Snapshot every imported MCP server with its connection status, \" +\n \"transport type, and tool count. Use this first when an operator \" +\n \"wonders 'what MCPs do I actually have access to right now?' — the \" +\n \"answer covers both 'imported but not yet connected' and 'connected \" +\n \"with N tools'. Errors during connect surface in `lastError`.\",\n {},\n async () => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"mcp_imported_status is not enabled — daemon was started without \" +\n \"an MCP proxy. The host must wire `mcpProxy` in createGateway.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const aliases = await mcpProxy.listAliases()\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ imports: aliases }, null, 2) },\n ],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_status failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n // ── mcp_imported_list_tools ────────────────────────────────────\n server.tool(\n \"mcp_imported_list_tools\",\n \"List the tools exposed by one imported MCP server. The proxy \" +\n \"lazily connects on first call — first-use latency includes the \" +\n \"transport handshake (stdio: ~1-2s for npx-spawned servers; \" +\n \"http/sse: <100ms). Returns the upstream `inputSchema` (JSON \" +\n \"Schema) verbatim so the operator can build a valid `arguments` \" +\n \"object for the follow-up `mcp_imported_call` invocation.\",\n {\n alias: z\n .string()\n .min(1)\n .describe(\n \"Alias from `list_imported_mcps` / `mcp_imported_status` \" +\n \"(typically the original MCP name, e.g. 'chrome-devtools').\"\n ),\n },\n async input => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text: \"mcp_imported_list_tools is not enabled — see mcp_imported_status.\",\n },\n ],\n isError: true,\n }\n }\n const out = await mcpProxy.listTools(input.alias)\n if (!out.ok) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_list_tools \"${input.alias}\": ${out.error}`,\n },\n ],\n isError: true,\n }\n }\n return {\n content: [\n { type: \"text\", text: JSON.stringify({ alias: input.alias, tools: out.tools }, null, 2) },\n ],\n }\n }\n )\n\n // ── mcp_imported_call ──────────────────────────────────────────\n server.tool(\n \"mcp_imported_call\",\n \"Invoke a tool on an imported MCP server. The daemon proxies the \" +\n \"call through the live client connection — the upstream server \" +\n \"validates `arguments` against its own input schema (which you \" +\n \"can fetch via `mcp_imported_list_tools`). The full upstream \" +\n \"result is returned verbatim, including `isError` flags so the \" +\n \"operator sees the original failure shape.\",\n {\n alias: z.string().min(1).describe(\"Imported MCP alias.\"),\n toolName: z\n .string()\n .min(1)\n .describe(\n \"Tool name as it appears in `mcp_imported_list_tools` \" +\n \"(NOT a namespaced version — pass the upstream's own name).\"\n ),\n args: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Tool arguments as a JSON object. Schema is the upstream's \" +\n \"— the proxy doesn't validate, only forwards. Default: empty object.\"\n ),\n },\n async input => {\n if (!mcpProxy) {\n return {\n content: [\n {\n type: \"text\",\n text: \"mcp_imported_call is not enabled — see mcp_imported_status.\",\n },\n ],\n isError: true,\n }\n }\n const out = await mcpProxy.callTool(\n input.alias,\n input.toolName,\n input.args ?? {}\n )\n if (!out.ok) {\n return {\n content: [\n {\n type: \"text\",\n text: `mcp_imported_call \"${input.alias}\".${input.toolName}: ${out.error}`,\n },\n ],\n isError: true,\n }\n }\n // Forward the upstream result. The MCP SDK's CallToolResult is\n // already in the {content, isError?} shape we return — pass it\n // through with a note that it came from the proxy.\n return out.result as {\n content: Array<{ type: \"text\"; text: string }>\n isError?: boolean\n }\n }\n )\n\n // ── kill_agent_session ─────────────────────────────────────────\n server.tool(\n \"kill_agent_session\",\n \"Stop a session — SIGTERM the underlying child + close the agent protocol \" +\n \"session. Use to free resources after the operator is done, or when a \" +\n \"session is wedged.\",\n {\n sessionId: z.string().describe(\"Session id.\"),\n },\n async input => {\n const ok = registry.kill(input.sessionId)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: input.sessionId }, null, 2),\n },\n ],\n }\n }\n )\n\n // ── Terminal session tools ─────────────────────────────────────\n // Four tools that mirror the agent-session set but operate on raw\n // PTY sessions (real terminal, ANSI bytes, multi-subscriber). Use\n // these to drive interactive CLIs like `claude` in TUI mode, or\n // for one agent to orchestrate other shells. Read/write/exit\n // happen over the byte ring buffer; the WS at /sessions/:id/pty\n // is the streaming alternative.\n\n const ptyNotConfigured = (toolName: string): {\n content: Array<{ type: \"text\"; text: string }>\n isError: true\n } => ({\n content: [\n {\n type: \"text\",\n text:\n `${toolName}: PTY support not enabled — the daemon was started without ` +\n \"a node-pty factory. Re-run `agentproto serve` from a build that ships \" +\n \"node-pty (the optional dep ships with @agentproto/cli).\",\n },\n ],\n isError: true,\n })\n\n server.tool(\n \"start_terminal_session\",\n \"Spawn a process under a real PTY (node-pty) on the host. Bytes (including \" +\n \"ANSI escapes, alt-screen sequences) flow through the daemon's byte ring \" +\n \"buffer; subscribers attach via the WS at /sessions/:id/pty. Use for \" +\n \"interactive TUIs (claude, vim, htop) or to orchestrate shells from another \" +\n \"agent. Returns the session descriptor.\",\n {\n argv: z\n .array(z.string())\n .min(1)\n .describe(\n \"Argv array. First element is the binary, rest are arguments. \" +\n \"e.g. ['claude'] or ['bash', '-l'].\"\n ),\n workspaceSlug: z\n .string()\n .optional()\n .describe(\n \"Workspace slug from `agentproto workspace list`. Resolves cwd. Omit \" +\n \"to use `cwd` explicitly or the active workspace.\"\n ),\n cwd: z\n .string()\n .optional()\n .describe(\"Absolute cwd. Wins over workspaceSlug when both set.\"),\n cols: z.number().int().min(1).max(500).optional().describe(\"Initial cols. Default 80.\"),\n rows: z.number().int().min(1).max(200).optional().describe(\"Initial rows. Default 24.\"),\n name: z\n .string()\n .optional()\n .describe(\n \"User-friendly slug. Becomes an alias for the session id in \" +\n \"subsequent tool calls (read/write/kill accept either).\"\n ),\n label: z\n .string()\n .optional()\n .describe(\n \"Free-text label surfaced in list_agent_sessions and the UI.\"\n ),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"start_terminal_session\")\n let cwd = input.cwd\n let resolvedSlug = input.workspaceSlug ?? \"default\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = input.workspaceSlug\n ? findWorkspace(config, input.workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n resolvedSlug = ws.slug\n }\n } catch {\n // fall through to error\n }\n }\n if (!cwd) {\n return {\n content: [\n {\n type: \"text\",\n text:\n \"start_terminal_session: no cwd resolvable. Pass `cwd` explicitly \" +\n \"or `workspaceSlug` matching `agentproto workspace list`.\",\n },\n ],\n isError: true,\n }\n }\n try {\n const desc = registry.spawnPty({\n argv: input.argv,\n cwd,\n workspaceSlug: resolvedSlug,\n cols: input.cols ?? 80,\n rows: input.rows ?? 24,\n ...(input.name ? { name: input.name } : {}),\n ...(input.label ? { label: input.label } : {}),\n })\n return {\n content: [{ type: \"text\", text: JSON.stringify(desc, null, 2) }],\n }\n } catch (err) {\n return {\n content: [\n {\n type: \"text\",\n text: `start_terminal_session: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n }\n }\n }\n )\n\n server.tool(\n \"write_terminal_input\",\n \"Send keystrokes to a PTY session's stdin. The text is forwarded verbatim — \" +\n \"include trailing newlines if the target needs them (e.g. shell commands). \" +\n \"Use after `start_terminal_session` to drive an interactive CLI.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n text: z.string().describe(\"Text to write. Sent as-is to the PTY's stdin.\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"write_terminal_input\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `write_terminal_input: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const ok = registry.writeTerminalInput(desc.id, input.text)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: desc.id }, null, 2),\n },\n ],\n ...(ok ? {} : { isError: true as const }),\n }\n }\n )\n\n server.tool(\n \"read_terminal_output\",\n \"Snapshot the recent byte buffer of a PTY session. Returns base64-encoded \" +\n \"bytes (the buffer is RAW including ANSI escapes — strip with a regex if \" +\n \"you want plain text). `lastBytes` caps the read from the tail.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n lastBytes: z\n .number()\n .int()\n .min(1)\n .max(64 * 1024)\n .optional()\n .describe(\"Max bytes from the tail. Default: full ring buffer (~64 KiB).\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"read_terminal_output\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `read_terminal_output: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const buf = registry.readTerminalOutput(\n desc.id,\n input.lastBytes,\n )\n if (!buf) {\n return {\n content: [\n {\n type: \"text\",\n text: `read_terminal_output: session \"${desc.id}\" is not a PTY`,\n },\n ],\n isError: true,\n }\n }\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n sessionId: desc.id,\n status: desc.status,\n bytes: buf.byteLength,\n b64: buf.toString(\"base64\"),\n },\n null,\n 2,\n ),\n },\n ],\n }\n }\n )\n\n server.tool(\n \"kill_terminal_session\",\n \"SIGTERM a PTY session and drop it from the alive set. Same effect as \" +\n \"`kill_agent_session` for the PTY family — separate name so it's obvious \" +\n \"what's being stopped.\",\n {\n sessionId: z\n .string()\n .describe(\"Session id OR name from start_terminal_session.\"),\n },\n async input => {\n if (!ptyEnabled) return ptyNotConfigured(\"kill_terminal_session\")\n const desc = registry.findByIdOrName(input.sessionId)\n if (!desc) {\n return {\n content: [\n {\n type: \"text\",\n text: `kill_terminal_session: no session \"${input.sessionId}\"`,\n },\n ],\n isError: true,\n }\n }\n const ok = registry.kill(desc.id)\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ ok, sessionId: desc.id }, null, 2),\n },\n ],\n }\n }\n )\n}\n","/**\n * HEARTBEAT.md autonomy loop.\n *\n * A workspace can ship a `HEARTBEAT.md` at its root. Frontmatter:\n *\n * schema: heartbeat/v1\n * agent: <id> (matches `<workspace>/.agents/<id>/AGENT.md`)\n * every: \"60s\" (Ns | Nm | Nh | Nd; cron support TODO)\n * enabled: true (default true; set false to register-but-skip)\n * conversation: heartbeat-{date} (templated id; defaults to per-day)\n *\n * Body = the prompt body the agent receives each tick. Reread fresh\n * on every tick so editing HEARTBEAT.md takes effect without restart.\n *\n * Ticks resolve the agent via the injected `buildAgent` callback,\n * call `agent.generate(prompt)`, and append the prompt + reply to a\n * conversation (default: daily-rolling `heartbeat-YYYY-MM-DD`).\n *\n * When the file is missing, frontmatter is invalid, `enabled: false`,\n * or the resolved agent has no usable model — the runner skips the\n * tick silently and emits a `heartbeat-error` event. The daemon\n * stays up.\n */\n\nimport matter from \"gray-matter\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { ConversationStore } from \"./conversations.js\"\nimport type { RuntimeEvents } from \"./events.js\"\n\nexport interface HeartbeatAgent {\n generate(prompt: string): Promise<{ text: string }>\n}\n\nexport interface BuildHeartbeatAgent {\n (id: string): Promise<HeartbeatAgent | null>\n}\n\nexport interface HeartbeatRunnerOptions {\n workspace: string\n conversations: ConversationStore\n events: RuntimeEvents\n /** Resolves a heartbeat-runnable agent from its workspace id. */\n buildAgent: BuildHeartbeatAgent\n /** Filename inside the workspace root. Default `HEARTBEAT.md`. */\n filename?: string\n /** Skip ticks while this returns false. Default: always true. */\n shouldFire?: () => boolean\n /** Override clock for tests. */\n now?: () => Date\n}\n\nexport interface HeartbeatRunner {\n /** Start the timer loop. Idempotent. */\n start(): void\n /** Stop the timer loop. Pending ticks finish out. */\n stop(): void\n /** Force-fire one tick now (used by `POST /heartbeat/tick`). */\n fireNow(): Promise<void>\n}\n\ninterface ParsedHeartbeat {\n agent: string\n everyMs: number\n enabled: boolean\n conversationTemplate: string\n body: string\n}\n\nexport function startHeartbeat(opts: HeartbeatRunnerOptions): HeartbeatRunner {\n const filename = opts.filename ?? \"HEARTBEAT.md\"\n const path = join(opts.workspace, filename)\n const now = opts.now ?? (() => new Date())\n\n let timer: NodeJS.Timeout | null = null\n let currentEveryMs: number | null = null\n let firing = false\n\n async function load(): Promise<ParsedHeartbeat | null> {\n if (!existsSync(path)) return null\n let source: string\n try {\n source = await readFile(path, \"utf8\")\n } catch {\n return null\n }\n const parsed = matter(source)\n const fm = parsed.data as Record<string, unknown>\n const agent = typeof fm.agent === \"string\" ? fm.agent : null\n if (!agent) return null\n const enabled = fm.enabled === undefined ? true : Boolean(fm.enabled)\n const everyRaw = typeof fm.every === \"string\" ? fm.every : \"60s\"\n const everyMs = parseDuration(everyRaw)\n if (!everyMs) return null\n const conversationTemplate =\n typeof fm.conversation === \"string\"\n ? fm.conversation\n : \"heartbeat-{date}\"\n return {\n agent,\n everyMs,\n enabled,\n conversationTemplate,\n body: parsed.content.trim(),\n }\n }\n\n async function tick(): Promise<void> {\n if (firing) return\n if (opts.shouldFire && !opts.shouldFire()) return\n firing = true\n let agentId: string | undefined\n try {\n const hb = await load()\n if (!hb || !hb.enabled) return\n agentId = hb.agent\n const agent = await opts.buildAgent(hb.agent)\n if (!agent) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: hb.agent,\n error: `buildAgent('${hb.agent}') returned null`,\n })\n return\n }\n if (!hb.body) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: hb.agent,\n error: \"HEARTBEAT.md body is empty\",\n })\n return\n }\n\n const conversationId = expandTemplate(hb.conversationTemplate, now())\n await opts.conversations.open(conversationId, { agent: hb.agent })\n\n const startedAt = now()\n await opts.conversations.appendTurn(\n conversationId,\n \"user\",\n hb.body,\n { at: startedAt.toISOString(), attribution: \"heartbeat\" },\n )\n opts.events.emit({\n type: \"conv-turn-appended\",\n at: startedAt.toISOString(),\n conversationId,\n role: \"user\",\n contentPreview: preview(hb.body),\n })\n\n const t0 = Date.now()\n const reply = await agent.generate(hb.body)\n const durationMs = Date.now() - t0\n\n const finishedAt = now()\n await opts.conversations.appendTurn(\n conversationId,\n \"assistant\",\n reply.text,\n { at: finishedAt.toISOString(), attribution: hb.agent },\n )\n opts.events.emit({\n type: \"conv-turn-appended\",\n at: finishedAt.toISOString(),\n conversationId,\n role: \"assistant\",\n contentPreview: preview(reply.text),\n })\n opts.events.emit({\n type: \"heartbeat-fired\",\n at: finishedAt.toISOString(),\n agent: hb.agent,\n conversationId,\n prompt: hb.body,\n reply: reply.text,\n durationMs,\n })\n\n // Adapt the timer if `every` changed since we started.\n if (currentEveryMs !== null && currentEveryMs !== hb.everyMs) {\n reschedule(hb.everyMs)\n }\n } catch (err) {\n opts.events.emit({\n type: \"heartbeat-error\",\n at: now().toISOString(),\n agent: agentId,\n error: err instanceof Error ? err.message : String(err),\n })\n } finally {\n firing = false\n }\n }\n\n function reschedule(everyMs: number): void {\n if (timer) clearInterval(timer)\n currentEveryMs = everyMs\n timer = setInterval(() => {\n void tick()\n }, everyMs)\n }\n\n return {\n start() {\n if (timer) return\n // Bootstrap interval from the file (or fall back to 60s if\n // unreadable — first real tick will refresh from disk).\n void load().then((hb) => {\n const everyMs = hb?.everyMs ?? 60_000\n reschedule(everyMs)\n })\n },\n stop() {\n if (timer) {\n clearInterval(timer)\n timer = null\n currentEveryMs = null\n }\n },\n async fireNow() {\n await tick()\n },\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────\n\nconst DURATION_RE = /^(\\d+)\\s*(s|m|h|d)$/\n\n/**\n * Parse `Ns | Nm | Nh | Nd` into milliseconds. Returns `null` if the\n * string doesn't match. (AIP-41 supports more units, but the daemon's\n * heartbeat sticks to coarse durations to keep ticks observable.)\n */\nexport function parseDuration(input: string): number | null {\n const trimmed = input.trim()\n const match = trimmed.match(DURATION_RE)\n if (!match) return null\n const n = Number(match[1])\n if (!Number.isFinite(n) || n <= 0) return null\n switch (match[2]) {\n case \"s\":\n return n * 1_000\n case \"m\":\n return n * 60_000\n case \"h\":\n return n * 3_600_000\n case \"d\":\n return n * 86_400_000\n default:\n return null\n }\n}\n\n/**\n * Replace `{date}` with `YYYY-MM-DD` (UTC) in conversation templates.\n * Other tokens pass through unchanged — extend later if needed.\n */\nfunction expandTemplate(template: string, when: Date): string {\n const date = when.toISOString().slice(0, 10)\n return template.replace(/\\{date\\}/g, date)\n}\n\nfunction preview(text: string, max = 120): string {\n const flat = text.replace(/\\s+/g, \" \").trim()\n return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat\n}\n","/**\n * Tiny node:http server that fronts the runtime gateway.\n *\n * Routes:\n * GET /health — { status, workspace, registered, uptime }\n * GET /events — SSE stream of RuntimeEvent\n * POST /mcp — MCP Streamable HTTP transport (POST)\n * GET /mcp — MCP SSE response stream (GET)\n * DELETE /mcp — close MCP session\n * GET /conversations — JSON list of conversation summaries\n * GET /conversations/<id> — markdown body of one conversation\n * POST /heartbeat/tick — force-fire one heartbeat tick\n *\n * No auth in `mode: \"none\"` (loopback default). `mode: \"bearer\"`\n * checks `Authorization: Bearer <token>` against the configured\n * token. Health is always public so external monitors can probe.\n *\n * MCP transport: stateless mode for v1 — each request is independent.\n * Stateful session pinning can come later when long-running streaming\n * tool calls become a real use case.\n */\n\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\"\nimport type { Duplex } from \"node:stream\"\nimport { mkdir, stat, writeFile } from \"node:fs/promises\"\nimport { isAbsolute, join, resolve as resolvePath } from \"node:path\"\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\"\nimport { WebSocketServer, type WebSocket } from \"ws\"\nimport type { ConversationStore } from \"./conversations.js\"\nimport type { HeartbeatRunner } from \"./heartbeat.js\"\nimport type { RuntimeEvents, RuntimeEvent } from \"./events.js\"\nimport type { SessionsRegistry, AgentSessionLike } from \"./sessions.js\"\nimport {\n loadWorkspacesConfig,\n findWorkspace,\n getActiveWorkspace,\n} from \"./workspaces-config.js\"\nimport { discoverMcps } from \"./mcp-discovery.js\"\nimport type { McpProxyRegistry } from \"./mcp-proxy.js\"\nimport {\n loadImportedMcps,\n saveImportedMcps,\n addImport,\n removeImport,\n} from \"./mcp-imports.js\"\n\n/**\n * Default Origin allowlist used when `RuntimeHttpServerOptions.allowedOrigins`\n * is undefined. Localhost on any port covers the user's own dev environments\n * (Guilde web dev server, playground demos, embedded panels). Production\n * origins (https://guilde.work, …) are NOT included by default — those are\n * opt-in via `agentproto serve --allow-origin <url>`.\n */\nconst DEFAULT_ALLOWED_ORIGINS: readonly string[] = [\n \"http://localhost:*\",\n \"http://127.0.0.1:*\",\n \"https://localhost:*\",\n]\n\n/**\n * Pluggable adapter resolver — keeps the runtime package free of any\n * @agentproto/cli dep. The host (cli `serve`, playground, embedding\n * apps) builds the resolver and hands it in. Returning null means\n * \"adapter not found\" → 404.\n */\nexport type AgentAdapterResolver = (slug: string) => Promise<{\n /** Build a fresh AgentSessionLike for the given cwd. The driver\n * spawns the adapter binary, opens the protocol, and the\n * registry holds the result.\n *\n * When `resumeSessionId` is set, the driver reattaches to that\n * pre-existing adapter session (claude-code's conversation id,\n * hermes' chat handle, …) rather than starting blank. Same\n * mechanism as `agentproto run --resume <id>` — exposed over\n * HTTP so `agentproto sessions restart` works on agent-cli\n * sessions, not just PTY ones. */\n startSession(opts: {\n cwd: string\n resumeSessionId?: string\n }): Promise<AgentSessionLike>\n /** Display label for the descriptor's `command` field. */\n commandPreview?: string\n} | null>\n\n/**\n * Compact adapter metadata for the discovery endpoints. Independent\n * of the resolver function above — hosts that can list installed\n * adapters wire this; hosts that can only resolve by-slug skip it\n * (the routes 501).\n */\nexport interface AdapterListEntry {\n slug: string\n name: string\n version: string\n description: string\n protocol: string\n streaming: boolean\n packageName: string\n}\n\nexport type AgentAdapterLister = () => Promise<AdapterListEntry[]>\n\nexport interface AuthOptions {\n mode: \"none\" | \"bearer\"\n token?: string\n}\n\n/**\n * Auth can be a fixed value (set at startup) or a getter (re-read on\n * every request). The getter form lets `remote_enable` flip bearer on\n * at runtime without restarting the gateway.\n */\nexport type AuthSource = AuthOptions | (() => AuthOptions)\n\nexport interface RuntimeHttpServerOptions {\n port: number\n bind?: string\n auth?: AuthSource\n /**\n * Per-request McpServer factory.\n *\n * The SDK's `StreamableHTTPServerTransport` is single-use — once a\n * transport has handled one request, the underlying `Protocol`\n * cannot be reattached, so subsequent requests on a shared transport\n * 500. The official stateless pattern (see SDK\n * `examples/server/simpleStatelessStreamableHttp.js`) builds a\n * fresh `McpServer` and `StreamableHTTPServerTransport` per request,\n * connects them, and tears both down on `res.close`. We follow that.\n *\n * The factory is invoked once per `/mcp` POST. It must register\n * tools / resources / prompts on the returned server before\n * resolving — by the time the transport's `handleRequest` fires,\n * the server is locked in.\n */\n mcpServerFactory: () => Promise<McpServer>\n conversations: ConversationStore\n events: RuntimeEvents\n heartbeat: HeartbeatRunner\n /** Optional — when wired, exposes /sessions routes for the CLI\n * TUI and the guilde-web Active tab to navigate live child\n * processes. Daemons that don't spawn anything (pure MCP servers)\n * can omit this and the routes 404. */\n sessions?: SessionsRegistry\n /** Optional — when wired alongside `sessions`, enables\n * `POST /sessions/agent` and `POST /sessions/:id/prompt` routes.\n * Hosts that ship adapters (`agentproto serve`, playground)\n * pass the cli's `resolveAdapter` via a thin shim. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional — when wired, enables `GET /adapters` route + the\n * MCP `list_adapters` tool so UIs can discover what's installed\n * without trial-and-error against the resolver. Hosts ship the\n * cli's `listInstalledAdapters` via a thin shim. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional — MCP proxy registry. When wired, exposes\n * `/mcps/proxy/*` routes that let the browser drive imported MCPs\n * without going through the MCP wire protocol (useful for the\n * /providers/mcp page's \"Local\" tab). */\n mcpProxy?: McpProxyRegistry\n /** Per-boot bearer token. When set, mutating /sessions/* routes\n * + the /sessions/:id/pty WebSocket upgrade require either\n * `Authorization: Bearer <token>` or an `Origin` header that\n * matches `allowedOrigins`. Read-only routes (GET, SSE stream)\n * stay open since the CORS surface already restricts origins\n * enough for them. */\n token?: string\n /** Trusted browser origins. When a mutating request carries an\n * `Origin: <url>` header (browser-set, JS can't forge), and that\n * url is in this list, the request is allowed without a Bearer\n * token. Browsers can't read the daemon's runtime.json (mode 0600)\n * so they can't send the token — Origin-based auth lets a trusted\n * page (Guilde web UI, local dev) drive the daemon. Non-browser\n * callers (curl, the CLI) still use the token.\n *\n * Match policy: exact origin (`https://guilde.work`) OR prefix\n * with `:*` for any-port match (`http://localhost:*` matches\n * `http://localhost:3000`).\n *\n * Default (when undefined): localhost on any port is allowed via\n * `DEFAULT_ALLOWED_ORIGINS`. Production origins are opt-in via\n * `agentproto serve --allow-origin <url>`. Pair with `strictOrigins`\n * to remove the localhost defaults entirely. */\n allowedOrigins?: readonly string[]\n /** When true, skip the localhost-wildcard defaults — only the\n * explicit `allowedOrigins` list is honoured. Useful for daemons\n * on shared hosts or when the user wants to lock dev to a\n * specific port. Default false (current behaviour — any browser\n * on `localhost` is trusted). */\n strictOrigins?: boolean\n /** Whether `POST /sessions/terminal` + WS upgrade are advertised.\n * Reflects whether the host injected a PTY factory into the\n * SessionsRegistry. When false, the terminal HTTP route returns\n * 501 and the WS upgrade rejects. */\n ptyEnabled?: boolean\n /** Static fields surfaced via `/health`. */\n meta: {\n workspace: string\n registered: readonly string[]\n }\n}\n\nexport interface RuntimeHttpServerHandle {\n url: string\n stop(): Promise<void>\n}\n\nexport async function startHttpServer(\n opts: RuntimeHttpServerOptions,\n): Promise<RuntimeHttpServerHandle> {\n const startedAt = Date.now()\n const authSource: AuthSource = opts.auth ?? { mode: \"none\" }\n const readAuth = (): AuthOptions =>\n typeof authSource === \"function\" ? authSource() : authSource\n\n /**\n * Loopback bypass — requests originating from 127.0.0.1 / ::1 with\n * no `X-Forwarded-For` header skip the bearer check even when one is\n * configured. Rationale:\n *\n * 1. The bearer is meant to gate the *public tunnel*, not the\n * loopback socket. Without this, calling `remote_enable` from a\n * local MCP client immediately 401s that same local client —\n * the user locks themselves out and the only recovery is a\n * gateway restart. Hit this in real use; not a theoretical edge.\n *\n * 2. Cloudflared (and any reasonable tunnel) sets X-Forwarded-For\n * when forwarding a public request to the loopback origin. So\n * \"loopback AND no XFF\" is a tight characterisation of \"this\n * request never left the machine.\"\n *\n * 3. Local FS access already trumps bearer (the user can read\n * runtime.json, kill -9 the daemon, etc.). Adding another check\n * here doesn't raise the bar for someone with shell on the box.\n *\n * If your threat model is \"untrusted users on the same loopback\n * interface\" (unusual — usually a multi-tenant container scenario),\n * pass `auth: { mode: \"bearer\", … }` at startup instead of relying\n * on the controller's runtime flip; the auth getter will return the\n * stricter of the two and the bypass still applies (intentional —\n * the operator opted in to bearer with full knowledge of the trade).\n */\n function isLoopback(req: IncomingMessage): boolean {\n const addr = req.socket.remoteAddress ?? \"\"\n const isLocalAddr =\n addr === \"127.0.0.1\" || addr === \"::1\" || addr === \"::ffff:127.0.0.1\"\n if (!isLocalAddr) return false\n // X-Forwarded-For present ⇒ a tunnel is in front of us; the\n // request crossed the public internet to reach this socket.\n if (req.headers[\"x-forwarded-for\"]) return false\n return true\n }\n\n function authorize(req: IncomingMessage, res: ServerResponse): boolean {\n const auth = readAuth()\n if (auth.mode === \"none\") return true\n if (isLoopback(req)) return true\n const header = req.headers.authorization\n const expected = `Bearer ${auth.token}`\n if (header !== expected) {\n res.writeHead(401, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"unauthorized\" }))\n return false\n }\n return true\n }\n\n /**\n * Per-boot auth gate for mutating /sessions/* routes and the WS\n * upgrade for /sessions/:id/pty. Accepts EITHER:\n *\n * 1. `Authorization: Bearer <token>` matching the per-boot token\n * (the CLI path — reads runtime.json mode 0600).\n * 2. A WS-upgrade query-string `?token=<token>` (browser\n * WebSocket can't set headers; some non-browser clients use\n * this too).\n * 3. An `Origin: <url>` header matching `allowedOrigins` — the\n * browser path. Origin is browser-set, JS can't forge.\n *\n * UNLIKE `authorize()`, this does NOT have a loopback bypass: the\n * threat we're defending against (browser drive-by spawning shells\n * via fetch to 127.0.0.1) IS loopback. Browsers can't read\n * runtime.json (mode 0600); a same-origin trusted page can rely on\n * its Origin instead.\n *\n * When `opts.token` is unset (older host integrations), this is a\n * no-op so existing call sites keep working.\n */\n function checkSessionsToken(req: IncomingMessage): \"ok\" | \"missing\" | \"bad\" {\n if (!opts.token) return \"ok\"\n\n // 1. Header bearer token.\n const header = req.headers.authorization\n const expected = `Bearer ${opts.token}`\n if (header === expected) return \"ok\"\n\n // 2. ?token=<token> in the URL (WS upgrade convenience).\n const urlStr = req.url ?? \"\"\n if (urlStr.includes(\"?\")) {\n const qs = new URLSearchParams(urlStr.slice(urlStr.indexOf(\"?\") + 1))\n const qsToken = qs.get(\"token\")\n if (qsToken && qsToken === opts.token) return \"ok\"\n }\n\n // 3. Origin allowlist (browser path).\n const origin = req.headers.origin\n if (typeof origin === \"string\" && originAllowed(origin)) return \"ok\"\n\n return header ? \"bad\" : \"missing\"\n }\n\n function originAllowed(origin: string): boolean {\n // Defaults are normally in effect — `opts.allowedOrigins` extends\n // them rather than replacing. Otherwise setting one production\n // origin via config silently locks out `http://localhost:*`,\n // breaking local dev. Users who genuinely want a curated list\n // (shared host, paranoid local-only ports) set `strictOrigins:true`\n // which drops the defaults entirely.\n const list = opts.strictOrigins\n ? (opts.allowedOrigins ?? [])\n : [...DEFAULT_ALLOWED_ORIGINS, ...(opts.allowedOrigins ?? [])]\n for (const pattern of list) {\n if (pattern === origin) return true\n // `http://localhost:*` style: match the host prefix, any port.\n if (pattern.endsWith(\":*\")) {\n const prefix = pattern.slice(0, -2) // drop \":*\"\n if (origin === prefix || origin.startsWith(prefix + \":\")) return true\n }\n }\n return false\n }\n\n function rejectUnauthorizedSession(\n req: IncomingMessage,\n res: ServerResponse,\n kind: \"missing\" | \"bad\",\n ): void {\n const origin = req.headers.origin ?? null\n const allowList = opts.strictOrigins\n ? (opts.allowedOrigins ?? [])\n : [...DEFAULT_ALLOWED_ORIGINS, ...(opts.allowedOrigins ?? [])]\n res.writeHead(401, { \"content-type\": \"application/json\" })\n const message =\n kind === \"missing\"\n ? origin\n ? `Origin \"${origin}\" not in the daemon's allowlist, and no Bearer token sent. ` +\n `Either add it (\\`agentproto config set daemon.allowedOrigins ${origin}\\` then restart the daemon), ` +\n `or send Authorization: Bearer <token> read from <workspace>/.agentproto/runtime.json.`\n : `Authorization: Bearer <token> required on mutating /sessions/* routes. ` +\n `Read the token from <workspace>/.agentproto/runtime.json. ` +\n `(Browser callers can use an Origin in the allowlist instead.)`\n : `Invalid bearer token. The daemon regenerated its token on its last boot — ` +\n `re-read <workspace>/.agentproto/runtime.json.`\n res.end(\n JSON.stringify({\n error: \"sessions_unauthorized\",\n message,\n // Debug data so a UI / network-tab inspection points the user\n // straight at the fix without needing the daemon's stderr.\n rejectedOrigin: origin,\n allowedOrigins: allowList,\n // We never echo the token; only the absence-or-presence flag.\n receivedAuthHeader: typeof req.headers.authorization === \"string\",\n }),\n )\n }\n\n /**\n * Returns true when this `path` + `method` is a mutating /sessions/*\n * route that should require the per-boot token. Kept narrow: GETs\n * (list, get, SSE stream) stay open for read-only telemetry from\n * existing tools that haven't learned about the token yet.\n */\n function isMutatingSessionsRoute(method: string, path: string): boolean {\n if (!path.startsWith(\"/sessions\")) return false\n if (method === \"POST\" || method === \"DELETE\" || method === \"PUT\" || method === \"PATCH\") {\n return true\n }\n return false\n }\n\n async function handleMcp(req: IncomingMessage, res: ServerResponse): Promise<void> {\n if (!authorize(req, res)) return\n // Per-request server + transport, per the SDK's stateless pattern.\n // Sharing either across requests breaks after the first one because\n // `Protocol.connect` rejects re-attachment.\n const server = await opts.mcpServerFactory()\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined,\n })\n // `onerror` is an unofficial SDK hook — guard before assigning so\n // a future SDK rename doesn't silently drop transport error logs.\n const transportInternal = transport as unknown as Record<string, unknown>\n if (\"onerror\" in (transport as object)) {\n transportInternal[\"onerror\"] = (err: unknown) => {\n console.error(\"[mcp transport.onerror]\", err)\n }\n }\n\n res.on(\"close\", () => {\n void transport.close()\n void server.close()\n })\n\n try {\n await server.connect(transport)\n await transport.handleRequest(req, res)\n } catch (err) {\n console.error(\"[mcp] handleRequest threw:\", err)\n if (!res.headersSent) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"mcp_transport_failed\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n }\n\n function handleHealth(_req: IncomingMessage, res: ServerResponse): void {\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n status: \"ok\",\n workspace: opts.meta.workspace,\n registered: opts.meta.registered,\n uptimeMs: Date.now() - startedAt,\n }),\n )\n }\n\n function handleEvents(req: IncomingMessage, res: ServerResponse): void {\n if (!authorize(req, res)) return\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache, no-transform\",\n connection: \"keep-alive\",\n })\n res.write(`: connected\\n\\n`)\n const off = opts.events.onAny((ev: RuntimeEvent) => {\n res.write(`data: ${JSON.stringify(ev)}\\n\\n`)\n })\n req.on(\"close\", off)\n }\n\n async function handleListConversations(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!authorize(req, res)) return\n const list = await opts.conversations.list()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(list))\n }\n\n async function handleGetConversation(\n req: IncomingMessage,\n res: ServerResponse,\n id: string,\n ): Promise<void> {\n if (!authorize(req, res)) return\n try {\n const data = await opts.conversations.read(id)\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(data))\n } catch (err) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"not_found\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n\n async function handleHeartbeatTick(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n if (!authorize(req, res)) return\n await opts.heartbeat.fireNow()\n res.writeHead(202, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ status: \"fired\" }))\n }\n\n /**\n * POST /files/upload?cwd=<abs-dir>&name=<filename>\n *\n * Writes the raw request body bytes to\n * `{cwd}/.agentproto-attachments/{safe-name}`, creating the\n * subdirectory on demand, and returns `{path}` with the absolute\n * path the agent CLI can read. Used by the host UI's terminal\n * drag-drop: the browser can't read the dragged file's source path\n * (security), so we copy the bytes to a known location and tell the\n * UI to paste THAT path into the terminal — claude-code (and any\n * CLI with a Read tool) picks it up natively.\n *\n * Gated by `checkSessionsToken` so a drive-by HTTP request can't\n * write arbitrary files: only sessions-authorized callers (CLI or\n * an allow-listed browser origin) can hit it.\n *\n * Hardening:\n * - `cwd` must be absolute and exist as a directory.\n * - `name` is basename-sanitized (no `/`, `..`, NULs).\n * - The resolved write target must stay within\n * `{cwd}/.agentproto-attachments/` (defense-in-depth in case the\n * name sanitizer ever drifts).\n * - Body capped at 32 MiB. Larger uploads error 413 instead of\n * filling the daemon's disk.\n */\n async function handleFileUpload(\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n ): Promise<void> {\n const reply = (status: number, body: unknown): void => {\n res.writeHead(status, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(body))\n }\n const qs = new URLSearchParams(url.includes(\"?\") ? url.slice(url.indexOf(\"?\") + 1) : \"\")\n const cwd = qs.get(\"cwd\")\n const rawName = qs.get(\"name\")\n if (!cwd || !rawName) {\n reply(400, { error: \"missing_cwd_or_name\" })\n return\n }\n if (!isAbsolute(cwd)) {\n reply(400, { error: \"cwd_not_absolute\" })\n return\n }\n // basename-style sanitize: strip path separators + parent refs +\n // NUL bytes; collapse leading dots so the file is visible. The\n // resolvePath check below catches anything this misses.\n const safeName = rawName\n .replace(/[\u0000/\\\\]/g, \"_\")\n .replace(/\\.\\.+/g, \".\")\n .replace(/^\\.+/, \"\")\n .slice(0, 200)\n if (safeName.length === 0) {\n reply(400, { error: \"invalid_name\" })\n return\n }\n try {\n const st = await stat(cwd)\n if (!st.isDirectory()) {\n reply(400, { error: \"cwd_not_a_directory\" })\n return\n }\n } catch {\n reply(400, { error: \"cwd_not_found\" })\n return\n }\n const dir = join(cwd, \".agentproto-attachments\")\n const target = resolvePath(dir, safeName)\n // Defense-in-depth: the sanitized name should never escape `dir`,\n // but if the sanitizer ever drifts, this catches the escape.\n if (!target.startsWith(resolvePath(dir) + (dir.endsWith(\"/\") ? \"\" : \"/\"))) {\n reply(400, { error: \"path_traversal_blocked\" })\n return\n }\n const MAX_BYTES = 32 * 1024 * 1024 // 32 MiB\n const chunks: Buffer[] = []\n let total = 0\n let aborted = false\n await new Promise<void>((resolveBody, rejectBody) => {\n req.on(\"data\", chunk => {\n if (aborted) return\n const buf = chunk as Buffer\n total += buf.length\n if (total > MAX_BYTES) {\n aborted = true\n reply(413, { error: \"file_too_large\", maxBytes: MAX_BYTES })\n rejectBody(new Error(\"too_large\"))\n return\n }\n chunks.push(buf)\n })\n req.on(\"end\", () => {\n if (!aborted) resolveBody()\n })\n req.on(\"error\", err => rejectBody(err))\n }).catch(() => undefined)\n if (aborted) return\n try {\n await mkdir(dir, { recursive: true })\n await writeFile(target, Buffer.concat(chunks))\n reply(200, { path: target, bytes: total })\n } catch (err) {\n reply(500, {\n error: \"write_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n }\n\n // Permissive CORS for the loopback gateway. The Guilde web app\n // (localhost:3041) probes /health from the browser; without these\n // headers the browser blocks the response and the panel says\n // \"not reachable\" even though curl works. Auth still gates the\n // sensitive routes — this just lifts the cross-origin block.\n //\n // Private Network Access (Chrome 105+): when an HTTPS page like\n // https://guilde.work fetches a loopback URL, Chrome sends a\n // preflight with `Access-Control-Request-Private-Network: true`.\n // Without `Access-Control-Allow-Private-Network: true` in the\n // response, the browser blocks the actual GET. Mirror the flag\n // when the request asked for it.\n function applyCors(req: IncomingMessage, res: ServerResponse): void {\n const origin = (req.headers.origin as string | undefined) ?? \"*\"\n res.setHeader(\"Access-Control-Allow-Origin\", origin)\n res.setHeader(\"Vary\", \"Origin\")\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\")\n res.setHeader(\n \"Access-Control-Allow-Headers\",\n req.headers[\"access-control-request-headers\"] ??\n \"authorization,content-type,mcp-session-id\",\n )\n res.setHeader(\n \"Access-Control-Allow-Methods\",\n \"GET,POST,PUT,PATCH,DELETE,OPTIONS\",\n )\n if (req.headers[\"access-control-request-private-network\"] === \"true\") {\n res.setHeader(\"Access-Control-Allow-Private-Network\", \"true\")\n }\n }\n\n const server: Server = createServer((req, res) => {\n void (async () => {\n try {\n const url = req.url ?? \"/\"\n const path = url.split(\"?\")[0] ?? \"/\"\n // Diagnostic: emit forwarded requests (those carrying XFF) onto\n // the events stream so /events tailers can see what cloudflared\n // actually sends. Loopback-only traffic stays quiet to avoid\n // flooding subscribers during normal local use.\n if (req.headers[\"x-forwarded-for\"]) {\n opts.events.emit({\n type: \"remote-log\",\n at: new Date().toISOString(),\n line: `[http-in] ${req.method} ${url} host=${req.headers.host ?? \"?\"} xff=${String(req.headers[\"x-forwarded-for\"])}`,\n })\n }\n\n applyCors(req, res)\n if (req.method === \"OPTIONS\") {\n res.writeHead(204)\n res.end()\n return\n }\n\n if (path === \"/health\" && req.method === \"GET\") {\n handleHealth(req, res)\n return\n }\n if (path === \"/events\" && req.method === \"GET\") {\n handleEvents(req, res)\n return\n }\n if (path === \"/mcp\") {\n await handleMcp(req, res)\n return\n }\n if (path === \"/conversations\" && req.method === \"GET\") {\n await handleListConversations(req, res)\n return\n }\n if (path.startsWith(\"/conversations/\") && req.method === \"GET\") {\n const id = path.slice(\"/conversations/\".length)\n await handleGetConversation(req, res, id)\n return\n }\n if (path === \"/heartbeat/tick\" && req.method === \"POST\") {\n await handleHeartbeatTick(req, res)\n return\n }\n\n if (path === \"/files/upload\" && req.method === \"POST\") {\n // Same auth gate as the mutating /sessions/* routes — drive-by\n // HTTP shouldn't be able to write arbitrary files to disk.\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUnauthorizedSession(req, res, gate)\n return\n }\n await handleFileUpload(req, res, url)\n return\n }\n\n // Sessions routes — only registered when the gateway was\n // built with a SessionsRegistry. /sessions, /sessions/:id,\n // /sessions/:id/stream (SSE), POST /sessions/:id/kill,\n // DELETE /sessions/:id (forget after exit).\n if (opts.sessions && path.startsWith(\"/sessions\")) {\n if (isMutatingSessionsRoute(req.method ?? \"GET\", path)) {\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUnauthorizedSession(req, res, gate)\n return\n }\n }\n const handled = await handleSessions(\n req,\n res,\n path,\n opts.sessions,\n opts.resolveAgentAdapter,\n opts.ptyEnabled === true,\n )\n if (handled) return\n }\n\n if (path === \"/workspaces\" && req.method === \"GET\") {\n // Surface ~/.agentproto/workspaces.json for UIs that\n // want a workspace dropdown (spawn dialog, MCP discovery\n // grouping, etc.). Read-only; mutate via the CLI's\n // `agentproto workspace add/remove/use` verbs.\n try {\n const config = await loadWorkspacesConfig()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(config))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"workspaces_load_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n if (path === \"/mcps/imports\" && req.method === \"GET\") {\n const config = await loadImportedMcps()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(config))\n return\n }\n if (path === \"/mcps/imports\" && req.method === \"POST\") {\n const body = (await readJsonBody(req)) as {\n sourceMcpId?: string\n alias?: string\n } | null\n if (!body || typeof body.sourceMcpId !== \"string\") {\n res.writeHead(400, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"missing_sourceMcpId\" }))\n return\n }\n const discovered = await discoverMcps()\n const snapshot = discovered.find(d => d.id === body.sourceMcpId)\n if (!snapshot) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"discovered_mcp_not_found\",\n sourceMcpId: body.sourceMcpId,\n })\n )\n return\n }\n const cfg = await loadImportedMcps()\n const next = addImport(cfg, {\n snapshot,\n ...(body.alias ? { alias: body.alias } : {}),\n })\n await saveImportedMcps(next)\n res.writeHead(201, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(next.imports.find(e => e.id === snapshot.id)))\n return\n }\n const importMatch = path.match(/^\\/mcps\\/imports\\/(.+)$/)\n if (importMatch && req.method === \"DELETE\") {\n // The id is URL-encoded since it contains colons + slashes\n // (e.g. claude-code:project:/path:name).\n const id = decodeURIComponent(importMatch[1] ?? \"\")\n const cfg = await loadImportedMcps()\n if (!cfg.imports.some(e => e.id === id)) {\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"import_not_found\", id }))\n return\n }\n await saveImportedMcps(removeImport(cfg, id))\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ ok: true, id }))\n return\n }\n\n if (path === \"/mcps/discovered\" && req.method === \"GET\") {\n // No host wiring needed — the scanner reads\n // ~/.claude.json + ~/.cursor/mcp.json + goose config\n // directly. Always available; cheap (~5ms typical).\n try {\n const mcps = await discoverMcps()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ mcps }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"discovery_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n // Browser-friendly proxy surface — same operations the MCP\n // tools expose (mcp_imported_status / list_tools / call) but\n // over plain HTTP so the /providers/mcp page can render them\n // without embedding an MCP client.\n if (path === \"/mcps/proxy/status\" && req.method === \"GET\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n try {\n const imports = await opts.mcpProxy.listAliases()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ imports }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"proxy_status_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n const proxyToolsMatch = path.match(/^\\/mcps\\/proxy\\/tools\\/(.+)$/)\n if (proxyToolsMatch && req.method === \"GET\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n const alias = decodeURIComponent(proxyToolsMatch[1] ?? \"\")\n const out = await opts.mcpProxy.listTools(alias)\n res.writeHead(out.ok ? 200 : 502, {\n \"content-type\": \"application/json\",\n })\n res.end(JSON.stringify(out))\n return\n }\n if (path === \"/mcps/proxy/call\" && req.method === \"POST\") {\n if (!opts.mcpProxy) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"mcp_proxy_not_configured\" }))\n return\n }\n const body = (await readJsonBody(req)) as {\n alias?: unknown\n toolName?: unknown\n args?: unknown\n } | null\n if (\n !body ||\n typeof body.alias !== \"string\" ||\n typeof body.toolName !== \"string\"\n ) {\n res.writeHead(400, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"invalid_body\",\n message: \"expected { alias, toolName, args? }\",\n })\n )\n return\n }\n const result = await opts.mcpProxy.callTool(\n body.alias,\n body.toolName,\n body.args ?? {}\n )\n res.writeHead(result.ok ? 200 : 502, {\n \"content-type\": \"application/json\",\n })\n res.end(JSON.stringify(result))\n return\n }\n\n if (path === \"/adapters\" && req.method === \"GET\") {\n if (!opts.listAgentAdapters) {\n res.writeHead(501, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"lister_not_configured\",\n message:\n \"Daemon was started without `listAgentAdapters` — see \" +\n \"@agentproto/cli's `listInstalledAdapters` for the canonical impl.\",\n })\n )\n return\n }\n try {\n const adapters = await opts.listAgentAdapters()\n res.writeHead(200, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ adapters }))\n } catch (err) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"list_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n )\n }\n return\n }\n\n res.writeHead(404, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify({ error: \"not_found\", path }))\n } catch (err) {\n if (!res.headersSent) {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: \"internal_error\",\n message: err instanceof Error ? err.message : String(err),\n }),\n )\n }\n }\n })()\n })\n\n // ── WebSocket upgrade: /sessions/:id/pty ──\n // Single WSS bound to the HTTP server's `upgrade` event. Connections\n // are accepted only when the SessionsRegistry is wired AND PTY\n // support is advertised. Frames are JSON-encoded over text WS\n // messages (binary mode is a future optimization — JSON keeps\n // wireshark/devtools debuggable):\n // server → client: {kind:\"data\", b64:\"...\"}\n // server → client: {kind:\"exit\", exitCode:0, signal?:1}\n // client → server: {kind:\"input\", b64:\"...\"} (or {kind:\"input\", text:\"...\"})\n // client → server: {kind:\"resize\", cols:80, rows:24}\n // client → server: {kind:\"ping\"} (no-op keepalive)\n const wss = new WebSocketServer({ noServer: true })\n server.on(\"upgrade\", (req, socket, head) => {\n const url = req.url ?? \"/\"\n const path = url.split(\"?\")[0] ?? \"/\"\n const ptyMatch = path.match(/^\\/sessions\\/([^/]+)\\/pty$/)\n if (!ptyMatch) {\n socket.destroy()\n return\n }\n if (!opts.sessions || opts.ptyEnabled !== true) {\n rejectUpgrade(socket, 501, \"pty_not_configured\")\n return\n }\n // Per-boot token gate, no loopback bypass — see comment on\n // checkSessionsToken for why.\n const gate = checkSessionsToken(req)\n if (gate !== \"ok\") {\n rejectUpgrade(socket, 401, gate === \"missing\" ? \"missing_token\" : \"bad_token\")\n return\n }\n const id = ptyMatch[1]\n if (!id) {\n rejectUpgrade(socket, 400, \"missing_id\")\n return\n }\n // Resolve id-or-name BEFORE upgrading so a typo returns a clean\n // 404 instead of a successful WS that immediately closes.\n const desc = opts.sessions.findByIdOrName(id)\n if (!desc) {\n rejectUpgrade(socket, 404, \"session_not_found\")\n return\n }\n if (desc.pty !== true) {\n rejectUpgrade(socket, 400, \"session_not_pty\")\n return\n }\n // A descriptor for an exited/killed/error session lives on as\n // history — its PTY child is gone. Reject the upgrade with a\n // clear reason so the CLI/web client can suggest `restart`\n // instead of letting the user see a generic 1011 mid-attach.\n if (\n desc.status === \"exited\" ||\n desc.status === \"killed\" ||\n desc.status === \"error\"\n ) {\n rejectUpgrade(\n socket,\n 410,\n `session_${desc.status}`,\n `Session ${desc.id}${desc.name ? ` (${desc.name})` : \"\"} has ${desc.status}. ` +\n `Spawn a fresh one with: agentproto sessions restart ${desc.name ?? desc.id}`,\n )\n return\n }\n wss.handleUpgrade(req, socket, head, ws => {\n handlePtyWebSocket(ws, req, desc.id, opts.sessions!)\n })\n })\n\n const bind = opts.bind ?? \"127.0.0.1\"\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(opts.port, bind, () => resolve())\n })\n\n return {\n url: `http://${bind}:${opts.port}`,\n async stop() {\n // Per-request transports/servers are torn down on `res.close`,\n // so we only need to stop the HTTP listener here. The WSS is\n // bound `noServer:true` so closing the HTTP server also tears\n // down its underlying TCP socket; live WS connections receive\n // a close frame from the kernel.\n wss.close()\n await new Promise<void>((resolve) => server.close(() => resolve()))\n },\n }\n}\n\n/**\n * Reject an HTTP upgrade attempt with a structured plaintext body.\n * `ws.handleUpgrade` is meant to be the success path — if we can't\n * accept the upgrade we write a minimal HTTP response and destroy\n * the socket, matching ws's own internal error path.\n */\nfunction rejectUpgrade(\n socket: Duplex,\n status: number,\n reason: string,\n message?: string,\n): void {\n const reasonText = `${status} ${reason}`\n const body: { error: string; message?: string } = { error: reason }\n if (message) body.message = message\n try {\n socket.write(\n `HTTP/1.1 ${reasonText}\\r\\n` +\n `Content-Type: application/json\\r\\n` +\n `Connection: close\\r\\n\\r\\n` +\n JSON.stringify(body) +\n `\\n`,\n )\n } catch {\n // socket already gone — fall through\n }\n socket.destroy()\n}\n\n/**\n * Per-connection WS handler for /sessions/:id/pty. Attaches as a\n * subscriber to the SessionsRegistry; bridges JSON frames in both\n * directions. Per-subscriber backpressure: if the WS's `bufferedAmount`\n * exceeds a threshold, the next chunk is dropped (slow client must\n * not stall the daemon's fan-out to other subscribers).\n */\nfunction handlePtyWebSocket(\n ws: WebSocket,\n req: IncomingMessage,\n sessionId: string,\n registry: SessionsRegistry,\n): void {\n // Parse cols/rows from the query string for the initial dimension\n // hint. Real clients will send a {kind:\"resize\"} immediately after\n // connecting; this seeds the registry's min-size calculation so the\n // first replay frames render at a sensible width if no resize comes.\n const query = new URLSearchParams(\n (req.url ?? \"\").includes(\"?\") ? (req.url ?? \"\").split(\"?\")[1] : \"\",\n )\n const cols = clampPositiveInt(query.get(\"cols\"), 80)\n const rows = clampPositiveInt(query.get(\"rows\"), 24)\n\n // Backpressure threshold — when the socket has more than 256 KiB\n // queued, drop the next data frame for THIS subscriber rather than\n // letting the registry block on send. Other subscribers stay live.\n const BACKPRESSURE_BYTES = 256 * 1024\n\n const handle = registry.attachPty(\n sessionId,\n { cols, rows },\n chunk => {\n if (ws.readyState !== ws.OPEN) return\n if (ws.bufferedAmount > BACKPRESSURE_BYTES) return // drop\n ws.send(\n JSON.stringify({ kind: \"data\", b64: chunk.toString(\"base64\") }),\n )\n },\n evt => {\n if (ws.readyState !== ws.OPEN) return\n ws.send(\n JSON.stringify({\n kind: \"exit\",\n exitCode: evt.exitCode,\n ...(evt.signal != null ? { signal: evt.signal } : {}),\n }),\n )\n // Close ourselves once we've emitted exit — the session can be\n // reattached for a buffer replay but this socket is done.\n try {\n ws.close(1000, \"session exited\")\n } catch {\n // ignore\n }\n },\n )\n\n if (!handle) {\n // Race: the session may have vanished between the upgrade and\n // attach. Close politely.\n try {\n ws.close(1011, \"session not attachable\")\n } catch {\n // ignore\n }\n return\n }\n\n ws.on(\"message\", (raw, isBinary) => {\n if (isBinary) {\n // Binary frames not supported yet — wire format is JSON-only.\n return\n }\n let frame: unknown\n try {\n frame = JSON.parse(raw.toString(\"utf8\"))\n } catch {\n return // malformed\n }\n if (!frame || typeof frame !== \"object\") return\n const f = frame as Record<string, unknown>\n switch (f.kind) {\n case \"input\": {\n // Accept either {text} (UTF-8) or {b64} (arbitrary bytes,\n // useful for clients sending raw key sequences).\n if (typeof f.text === \"string\") {\n handle.write(f.text)\n } else if (typeof f.b64 === \"string\") {\n try {\n handle.write(Buffer.from(f.b64, \"base64\").toString(\"utf8\"))\n } catch {\n // ignore malformed base64\n }\n }\n break\n }\n case \"resize\": {\n const c =\n typeof f.cols === \"number\" && f.cols > 0 ? Math.floor(f.cols) : null\n const r =\n typeof f.rows === \"number\" && f.rows > 0 ? Math.floor(f.rows) : null\n if (c && r) handle.resize(c, r)\n break\n }\n case \"ping\":\n // Reply with pong so client keepalive logic works. Optional.\n try {\n ws.send(JSON.stringify({ kind: \"pong\" }))\n } catch {\n // ignore\n }\n break\n // Unknown kinds silently dropped; reserved for forward compat.\n }\n })\n\n ws.on(\"close\", () => {\n handle.detach()\n })\n ws.on(\"error\", () => {\n handle.detach()\n })\n}\n\nfunction clampPositiveInt(raw: string | null, fallback: number): number {\n if (!raw) return fallback\n const n = Number.parseInt(raw, 10)\n return Number.isFinite(n) && n > 0 ? n : fallback\n}\n\nfunction clampInt(\n raw: string | null,\n fallback: number,\n min: number,\n max: number,\n): number {\n if (!raw) return fallback\n const n = Number.parseInt(raw, 10)\n if (!Number.isFinite(n)) return fallback\n if (n < min) return min\n if (n > max) return max\n return n\n}\n\n/**\n * /sessions routes — split out of the main switch so the surface\n * stays scannable. Returns `true` when it handled the request, so\n * the dispatcher knows to skip the 404 path.\n *\n * GET /sessions → list of SessionDescriptor[]\n * GET /sessions/:id → one SessionDescriptor\n * GET /sessions/:id/stream → SSE stream {line,stream} events\n * POST /sessions/:id/kill → SIGTERM, returns {ok}\n * DELETE /sessions/:id → forget (drop from registry; only\n * valid for exited/killed/error)\n */\nasync function handleSessions(\n req: IncomingMessage,\n res: ServerResponse,\n path: string,\n registry: SessionsRegistry,\n resolveAgentAdapter?: AgentAdapterResolver,\n ptyEnabled = false,\n): Promise<boolean> {\n const json = (status: number, body: unknown): void => {\n res.writeHead(status, { \"content-type\": \"application/json\" })\n res.end(JSON.stringify(body))\n }\n\n if (path === \"/sessions\" && req.method === \"GET\") {\n json(200, { sessions: registry.list() })\n return true\n }\n\n // Long-running agent session — spawn via the cli's adapter\n // resolver, hold across multiple turns. Body shape:\n // {adapter: \"claude-code\"|\"hermes\"|...,\n // workspaceSlug, cwd, prompt?, label?}\n if (path === \"/sessions/agent\" && req.method === \"POST\") {\n if (!resolveAgentAdapter) {\n json(501, {\n error: \"agent_resolver_not_configured\",\n message:\n \"POST /sessions/agent needs the host to inject `resolveAgentAdapter` \" +\n \"(e.g. via @agentproto/cli's resolveAdapter shim).\",\n })\n return true\n }\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const adapter = typeof b.adapter === \"string\" ? b.adapter : \"\"\n if (!adapter) {\n json(400, { error: \"missing_adapter\" })\n return true\n }\n // cwd resolution priority:\n // 1. explicit `cwd` in the body\n // 2. lookup `workspaceSlug` in ~/.agentproto/workspaces.json\n // 3. active workspace from the same config\n // 4. process.cwd() (last resort, almost certainly not what\n // the user wants — log it so the operator notices)\n let cwd: string | null =\n typeof b.cwd === \"string\" && b.cwd.length > 0 ? b.cwd : null\n let workspaceSlug =\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = workspaceSlug\n ? findWorkspace(config, workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n workspaceSlug = ws.slug\n }\n } catch {\n // Config missing / unreadable — fall through to process.cwd()\n }\n }\n if (!cwd) {\n cwd = process.cwd()\n console.warn(\n `[/sessions/agent] no cwd resolvable for adapter=${adapter} ` +\n `(no body.cwd, no workspaceSlug match in ~/.agentproto/workspaces.json, ` +\n `no active workspace) — falling back to daemon's cwd ${cwd}`\n )\n }\n if (!workspaceSlug) workspaceSlug = \"default\"\n const resolved = await resolveAgentAdapter(adapter)\n if (!resolved) {\n json(404, { error: \"adapter_not_found\", adapter })\n return true\n }\n try {\n const resumeSessionId =\n typeof b.resumeSessionId === \"string\" && b.resumeSessionId.length > 0\n ? b.resumeSessionId\n : undefined\n const agentSession = await resolved.startSession({\n cwd,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n })\n const desc = registry.spawnAgent({\n workspaceSlug,\n cwd,\n agentSession,\n adapterSlug: adapter,\n ...(typeof b.prompt === \"string\" ? { initialPrompt: b.prompt } : {}),\n ...(typeof b.label === \"string\" ? { label: b.label } : {}),\n ...(resolved.commandPreview\n ? { commandPreview: resolved.commandPreview }\n : {}),\n })\n json(201, desc)\n } catch (err) {\n json(500, {\n error: \"agent_spawn_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n return true\n }\n\n // Long-running PTY session — spawn argv under node-pty. Bytes flow\n // through the registry's byte ring buffer; attach via the WebSocket\n // upgrade at /sessions/:id/pty. Body shape:\n // {argv: string[], cwd?, workspaceSlug?, cols, rows, env?, name?, label?}\n if (path === \"/sessions/terminal\" && req.method === \"POST\") {\n if (!ptyEnabled) {\n json(501, {\n error: \"pty_not_configured\",\n message:\n \"POST /sessions/terminal needs the host to inject `spawnPty` into createGateway \" +\n \"(node-pty optional dep — install in @agentproto/cli).\",\n })\n return true\n }\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const argv = Array.isArray(b.argv)\n ? (b.argv as unknown[]).filter((v): v is string => typeof v === \"string\")\n : []\n if (argv.length === 0) {\n json(400, { error: \"missing_argv\" })\n return true\n }\n const cols = typeof b.cols === \"number\" && b.cols > 0 ? Math.floor(b.cols) : 80\n const rows = typeof b.rows === \"number\" && b.rows > 0 ? Math.floor(b.rows) : 24\n // cwd resolution mirrors /sessions/agent exactly.\n let cwd: string | null =\n typeof b.cwd === \"string\" && b.cwd.length > 0 ? b.cwd : null\n let workspaceSlug =\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"\"\n if (!cwd) {\n try {\n const config = await loadWorkspacesConfig()\n const ws = workspaceSlug\n ? findWorkspace(config, workspaceSlug)\n : getActiveWorkspace(config)\n if (ws) {\n cwd = ws.path\n workspaceSlug = ws.slug\n }\n } catch {\n // fall through to process.cwd()\n }\n }\n if (!cwd) {\n cwd = process.cwd()\n console.warn(\n `[/sessions/terminal] no cwd resolvable for argv=${argv.join(\" \")} ` +\n `— falling back to daemon's cwd ${cwd}`\n )\n }\n if (!workspaceSlug) workspaceSlug = \"default\"\n try {\n const desc = registry.spawnPty({\n argv,\n cwd,\n workspaceSlug,\n cols,\n rows,\n ...(b.env && typeof b.env === \"object\"\n ? { env: b.env as Record<string, string> }\n : {}),\n ...(typeof b.name === \"string\" ? { name: b.name } : {}),\n ...(typeof b.label === \"string\" ? { label: b.label } : {}),\n })\n json(201, desc)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n const status = msg.includes(\"already in use\")\n ? 409\n : msg.includes(\"no PTY factory\")\n ? 501\n : 500\n json(status, { error: \"pty_spawn_failed\", message: msg })\n }\n return true\n }\n\n // Send a follow-up turn to a live agent session.\n // Body: { prompt: string | ContentBlock | ContentBlock[] }\n // - string → auto-wrapped to a single text block by\n // the registry (legacy / convenience).\n // - ContentBlock → e.g. `{type:\"image\", source:{...}}`\n // - ContentBlock[] → text + image mix for multimodal turns.\n // Forwarded as-is to `agentSession.send`\n // so the adapter (claude-agent-acp, …)\n // negotiates its own content shape.\n //\n // Validation is intentionally loose — we accept anything object-\n // shaped + non-empty arrays + non-empty strings. The adapter will\n // reject ill-formed blocks with a clear error projected into the\n // session's ring buffer; throwing here would just duplicate that.\n //\n // Query: ?wait=false → fire-and-forget (return 202 after sync\n // validation; output streams via /sessions/:id/stream). Default\n // wait=true keeps the call blocking until the turn drains, which\n // is what curl scripts + the MCP bridge expect.\n const promptMatch = path.match(/^\\/sessions\\/([^/]+)\\/prompt$/)\n if (promptMatch && req.method === \"POST\") {\n const id = promptMatch[1]\n if (!id) return false\n const body = await readJsonBody(req)\n const prompt = (body as { prompt?: unknown } | null)?.prompt\n const validPrompt =\n (typeof prompt === \"string\" && prompt.length > 0) ||\n (Array.isArray(prompt) &&\n prompt.length > 0 &&\n prompt.every(b => b !== null && typeof b === \"object\")) ||\n (prompt !== null && typeof prompt === \"object\" && !Array.isArray(prompt))\n if (!validPrompt) {\n json(400, {\n error: \"missing_prompt\",\n message:\n \"Body `prompt` must be a non-empty string, a content block object, or an array of content blocks.\",\n })\n return true\n }\n const reqUrl = req.url ?? \"\"\n const queryString = reqUrl.includes(\"?\")\n ? reqUrl.slice(reqUrl.indexOf(\"?\") + 1)\n : \"\"\n const wait = new URLSearchParams(queryString).get(\"wait\")\n const fireAndForget = wait === \"false\" || wait === \"0\"\n try {\n if (fireAndForget) {\n registry.enqueuePrompt(id, prompt)\n json(202, { ok: true, id, queued: true })\n } else {\n await registry.sendPrompt(id, prompt)\n json(200, { ok: true, id })\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // Differentiate \"not found\" / \"wrong kind\" / \"busy\" — they\n // surface as readable thrown messages from the registry.\n const status = msg.includes(\"no session\")\n ? 404\n : msg.includes(\"not an agent\")\n ? 400\n : msg.includes(\"mid-turn\")\n ? 409\n : 500\n json(status, { error: \"send_prompt_failed\", message: msg })\n }\n return true\n }\n\n if (path === \"/sessions\" && req.method === \"POST\") {\n const body = await readJsonBody(req)\n if (!body || typeof body !== \"object\") {\n json(400, { error: \"invalid_body\" })\n return true\n }\n const b = body as Record<string, unknown>\n const argv = Array.isArray(b.argv)\n ? (b.argv as unknown[]).filter((v): v is string => typeof v === \"string\")\n : []\n if (argv.length === 0) {\n json(400, { error: \"missing_argv\" })\n return true\n }\n try {\n const desc = registry.spawn({\n kind:\n b.kind === \"terminal\" || b.kind === \"agent-cli\" || b.kind === \"command\"\n ? b.kind\n : \"command\",\n workspaceSlug:\n typeof b.workspaceSlug === \"string\" ? b.workspaceSlug : \"default\",\n cwd: typeof b.cwd === \"string\" ? b.cwd : process.cwd(),\n argv,\n env:\n b.env && typeof b.env === \"object\"\n ? (b.env as Record<string, string>)\n : undefined,\n label: typeof b.label === \"string\" ? b.label : undefined,\n })\n json(201, desc)\n } catch (err) {\n json(500, {\n error: \"spawn_failed\",\n message: err instanceof Error ? err.message : String(err),\n })\n }\n return true\n }\n\n // Per-id routes. The `:id` slot also accepts a session's `name`\n // when one was set at spawn time — `findByIdOrName` resolves both\n // and the rest of the handler operates on the canonical id.\n const idMatch = path.match(\n /^\\/sessions\\/([^/]+)(\\/stream|\\/kill|\\/preview)?$/,\n )\n if (!idMatch) return false\n const [, rawIdOrName, suffix] = idMatch\n if (!rawIdOrName) return false\n const resolvedDesc = registry.findByIdOrName(rawIdOrName)\n const id = resolvedDesc?.id ?? rawIdOrName\n\n if (suffix === \"/preview\" && req.method === \"GET\") {\n // Read-only snapshot of the recent ring buffer — used by the\n // dashboard's detail pane so the user sees what the session was\n // doing without committing to an attach. Returns BOTH lines\n // (for agent-cli/command sessions) and recent-bytes (for PTY).\n // Caller picks whichever is populated.\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n const reqUrl = req.url ?? \"\"\n const qs = new URLSearchParams(\n reqUrl.includes(\"?\") ? reqUrl.slice(reqUrl.indexOf(\"?\") + 1) : \"\",\n )\n const lineCap = clampInt(qs.get(\"lines\"), 10, 1, 200)\n const byteCap = clampInt(qs.get(\"bytes\"), 16 * 1024, 256, 64 * 1024)\n // No registry method exists for \"give me the recent buffer\n // snapshot\" — readTerminalOutput is the closest. For non-PTY\n // sessions, attach with a no-op subscriber, read backfill,\n // detach. Cheap; the backfill is synchronous on attach.\n const lines: string[] = []\n if (resolvedDesc.pty !== true) {\n const unsub = registry.attach(id, line => {\n lines.push(line)\n })\n if (unsub) unsub()\n }\n const bufBytes = registry.readTerminalOutput(id, byteCap)\n json(200, {\n id: resolvedDesc.id,\n lines: lines.slice(-lineCap),\n bytes: bufBytes ? bufBytes.toString(\"base64\") : null,\n })\n return true\n }\n\n if (suffix === \"/stream\" && req.method === \"GET\") {\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n res.writeHead(200, {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n })\n // Keep-alive ping every 25s — proxies / browsers eventually\n // close idle SSE connections; the comment line keeps the pipe\n // warm without confusing the EventSource parser (it ignores\n // anything starting with `:`).\n const ping = setInterval(() => {\n try {\n res.write(`: keep-alive\\n\\n`)\n } catch {\n clearInterval(ping)\n }\n }, 25_000)\n const unsub = registry.attach(id, (line, stream) => {\n try {\n res.write(\n `data: ${JSON.stringify({ line, stream })}\\n\\n`\n )\n } catch {\n // Client gone — cleanup happens on `close`.\n }\n })\n if (!unsub) {\n clearInterval(ping)\n res.end()\n return true\n }\n req.once(\"close\", () => {\n unsub()\n clearInterval(ping)\n })\n return true\n }\n\n if (suffix === \"/kill\" && req.method === \"POST\") {\n const ok = registry.kill(id)\n json(ok ? 200 : 404, { ok, id })\n return true\n }\n\n if (!suffix && req.method === \"GET\") {\n if (!resolvedDesc) {\n json(404, { error: \"session_not_found\", id: rawIdOrName })\n return true\n }\n json(200, resolvedDesc)\n return true\n }\n\n if (!suffix && req.method === \"DELETE\") {\n const ok = registry.forget(id)\n json(ok ? 200 : 404, { ok, id })\n return true\n }\n\n return false\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = []\n for await (const chunk of req) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk)\n }\n if (chunks.length === 0) return null\n try {\n return JSON.parse(Buffer.concat(chunks).toString(\"utf8\"))\n } catch {\n return null\n }\n}\n","/**\n * Per-adapter resume strategies — the daemon's view of \"how do I\n * continue a previous session for THIS adapter?\".\n *\n * The driver already has an `AgentCliContinuation` declaration in\n * the adapter manifest (AIP-45). That covers strategy NAMES\n * (`native-resume`, `pinned-session`, `transcript`, `none`) but is\n * silent on the mechanics that live OUTSIDE the runtime — like\n * \"where on disk does this adapter store its conversations?\" or\n * \"what argv do I pass to resume into PTY mode?\".\n *\n * This table is that practical bridge. Each entry declares three\n * optional hooks:\n *\n * outputHint regex matched against each output line; group 1 is\n * the resume id. Stored as `desc.resumeMetadata[storeAs]`.\n * fsProbe async function that probes a per-adapter directory\n * for a stored session id, scoped to a workspace cwd.\n * Used when `outputHint` never matched.\n * spawnArgs given a captured id, returns the argv to spawn a\n * PTY that resumes the session. agentproto then\n * bypasses ACP/agent-cli and runs the provider\n * directly — the most reliable resume path because\n * it leans on the provider's native UX.\n *\n * Adapters that don't declare anything here fall back to:\n * 1. ACP-level resume via `resumeSessionId` on POST /sessions/agent\n * 2. Fresh spawn (same shape, no continuity)\n *\n * Eventually each adapter should ship its own strategy on\n * `AgentCliHandle.resumeStrategy` (driver-side). This central table\n * is the bootstrap: it lets a new adapter become resume-capable\n * without bumping its npm package; once that lands, entries\n * graduate into the adapter packages.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join, resolve } from \"node:path\"\n\n/** Where on disk the resume id ends up on the session descriptor. */\nexport type ResumeMetadataKey =\n | \"claudeResumeId\"\n | \"hermesResumeId\"\n | \"codexResumeId\"\n | \"openClawResumeId\"\n | \"openCodeResumeId\"\n\nexport interface ResumeStrategy {\n /** When set, run on every output line for this adapter. Group 1\n * captures the resume id. The match is saved on the descriptor\n * as `resumeMetadata[storeAs]`. */\n outputHint?: RegExp\n /** Where the matched id is recorded on the descriptor. */\n storeAs: ResumeMetadataKey\n /** Probe the adapter's on-disk session store for the most-recently\n * modified session in the given workspace. Returns the resume id\n * or null when nothing eligible. Files older than `prevStartedAt`\n * are ignored (avoids resuming an unrelated prior conversation).\n *\n * Skip when the adapter doesn't persist sessions externally. */\n fsProbe?(cwd: string, prevStartedAt: string): Promise<string | null>\n /** Return the argv to spawn a PTY that resumes into the given id.\n * When omitted, the daemon falls back to ACP-level resume via\n * the agent-cli protocol instead of the provider's native CLI. */\n spawnArgs?(id: string): string[]\n}\n\nexport const RESUME_STRATEGIES: Record<string, ResumeStrategy> = {\n \"claude-code\": {\n // Printed by claude on graceful exit when session persistence\n // is on (default). Example: `claude --resume 0e483f81-1a44-4bec-9667-b37158450296`\n outputHint: /claude\\s+--resume\\s+([0-9a-f-]{8,})/i,\n storeAs: \"claudeResumeId\",\n fsProbe: probeMtimeLatestJsonl(\".claude/projects\"),\n spawnArgs: id => [\"claude\", \"--resume\", id],\n },\n\n // Stubs for other shipped adapters — fill in as we learn each\n // provider's resume mechanism. Today they fall back to ACP-level\n // resume (whatever the agent-cli runtime supports) or fresh spawn.\n //\n // hermes: { storeAs: \"hermesResumeId\", ... }\n // codex: { storeAs: \"codexResumeId\", ... }\n // openclaw: { storeAs: \"openClawResumeId\", ... }\n // opencode: { storeAs: \"openCodeResumeId\", ... }\n}\n\n/**\n * Build an `fsProbe` for adapters that store one `.jsonl` per session\n * inside `~/<storeRel>/<cwd-encoded>/`. The encoded cwd is the\n * absolute path with `/` → `-` (claude's convention; others tend to\n * use the same scheme). Returns the UUID of the most-recently\n * modified `.jsonl`, filtered to files at-or-after `prevStartedAt`.\n */\nfunction probeMtimeLatestJsonl(\n storeRel: string,\n): (cwd: string, prevStartedAt: string) => Promise<string | null> {\n return async (cwd, prevStartedAt) => {\n const encoded = cwd.replace(/\\//g, \"-\")\n const dir = resolve(homedir(), storeRel, encoded)\n let entries: string[]\n try {\n entries = await fs.readdir(dir)\n } catch {\n return null\n }\n const jsonl = entries.filter(e => e.endsWith(\".jsonl\"))\n if (jsonl.length === 0) return null\n const startedAtMs = Date.parse(prevStartedAt)\n const candidates: { name: string; mtime: number }[] = []\n for (const f of jsonl) {\n try {\n const st = await fs.stat(join(dir, f))\n if (!Number.isFinite(startedAtMs) || st.mtimeMs >= startedAtMs - 1000) {\n candidates.push({ name: f, mtime: st.mtimeMs })\n }\n } catch {\n // ignore unreadable entry\n }\n }\n if (candidates.length === 0) return null\n candidates.sort((a, b) => b.mtime - a.mtime)\n return candidates[0]!.name.replace(/\\.jsonl$/, \"\")\n }\n}\n\n/**\n * Helper: which adapters declare any resume capability? Used by\n * `agentproto sessions restart` to print a helpful \"this adapter\n * doesn't support resume; falling back to fresh spawn\" hint when\n * applicable.\n */\nexport function hasResumeStrategy(adapterSlug: string | undefined): boolean {\n if (!adapterSlug) return false\n const s = RESUME_STRATEGIES[adapterSlug]\n return !!(s && (s.outputHint || s.fsProbe || s.spawnArgs))\n}\n","/**\n * Sessions registry — tracks long-lived child processes spawned by\n * the agentproto daemon (terminals, agent CLIs, custom commands).\n *\n * The registry lives in-memory for the daemon's lifetime; a recent\n * snapshot also persists to `~/.agentproto/sessions.json` so a fresh\n * daemon restart can show \"you had these running before\" instead of\n * losing all visibility on a crash.\n *\n * Each session owns:\n * - identity: id, kind, workspace slug, command + args, started time\n * - lifecycle: status (starting/running/exited/killed/error)\n * - output: last N lines (ring buffer) for instant attach + a\n * Node EventEmitter for live streaming consumers\n *\n * Consumers:\n * - HTTP routes (GET /sessions, /sessions/:id, /sessions/:id/stream,\n * POST /sessions/:id/kill)\n * - CLI `agentproto sessions` (TUI navigation + attach)\n * - guilde-web Active tab (session cards + terminal viewer)\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\"\nimport { EventEmitter } from \"node:events\"\nimport { mkdirSync, writeFileSync, promises as fs, readFileSync } from \"node:fs\"\nimport { RESUME_STRATEGIES } from \"./resume-strategies.js\"\nimport { dirname, resolve } from \"node:path\"\nimport { homedir } from \"node:os\"\nimport { randomUUID } from \"node:crypto\"\n\n/**\n * Minimal shape we need from a driver-agent-cli session — kept as a\n * structural type so the runtime package doesn't take a hard\n * dependency on @agentproto/driver-agent-cli (the http-server route\n * imports it and passes the constructed session in).\n */\nexport interface AgentSessionLike {\n sessionId: string\n send(message: unknown): AsyncIterable<AgentStreamEvent>\n cancel(): Promise<void>\n close(): Promise<void>\n}\n\n/**\n * Minimal PTY surface — structurally compatible with\n * @agentproto/acp/tunnel's PtyProcess (node-pty's IPty wrapper). The\n * runtime declares its own so this package stays native-free; the\n * cli's pty-factory util constructs values that satisfy both.\n */\nexport interface PtyProcess {\n readonly pid: number\n write(data: string): void\n resize(cols: number, rows: number): void\n kill(signal?: string): void\n onData(handler: (data: string) => void): void\n onExit(handler: (event: { exitCode: number; signal?: number }) => void): void\n}\n\nexport interface PtyFactoryOptions {\n command: string\n args: string[]\n cwd?: string\n env?: Record<string, string>\n cols: number\n rows: number\n}\n\nexport type PtyFactory = (opts: PtyFactoryOptions) => PtyProcess\n\nexport interface AgentStreamEvent {\n kind: string\n text?: string\n toolName?: string\n isError?: boolean\n reason?: string\n error?: { message: string; code?: number; data?: unknown }\n}\n\nexport const SESSIONS_FILE_PATH = (): string =>\n resolve(homedir(), \".agentproto\", \"sessions.json\")\n\nexport type SessionKind = \"terminal\" | \"agent-cli\" | \"command\"\nexport type SessionStatus =\n | \"starting\"\n | \"running\"\n | \"exited\"\n | \"killed\"\n | \"error\"\n\nexport interface SessionDescriptor {\n id: string\n kind: SessionKind\n workspaceSlug: string\n /** What was actually run — quoted joined for display purposes\n * (`bash -lc \"claude --resume xyz\"`). */\n command: string\n pid: number | null\n status: SessionStatus\n startedAt: string\n endedAt?: string\n exitCode?: number\n /** Last time anything was written to stdout/stderr. Lets the UI\n * spot stuck sessions (\"running for 2h, last output 12min ago\"). */\n lastOutputAt?: string\n /** Free-text label the spawner can attach (e.g. conversation id,\n * operator name) so the UI can group/filter. */\n label?: string\n /** True when the session was spawned under a real PTY (node-pty)\n * instead of `child_process.spawn`. PTY sessions carry raw ANSI\n * bytes (alt-screen, key bindings, colors); attach goes through\n * WS /sessions/:id/pty rather than SSE /sessions/:id/stream. */\n pty?: boolean\n /** User-friendly slug supplied at spawn time. Optional; when set,\n * attach/stop/kill commands accept it as an alias for the id. */\n name?: string\n /** Argv that was spawned. Persisted so `agentproto sessions restart`\n * can clone the original shape without re-tokenizing the display\n * `command` string. Empty for agent-cli sessions (we record\n * `adapterSlug` separately). */\n argv?: readonly string[]\n /** Working directory the session was spawned in. Cloned by restart. */\n cwd?: string\n /** Adapter slug for agent-cli sessions — restart uses this with\n * `/sessions/agent` to spin up a fresh ACP runtime. Undefined for\n * pty/command kinds. */\n adapterSlug?: string\n /** ACP-level session id (the adapter's own handle — claude-code's\n * conversation id, hermes' chat id, …). Set at spawnAgent time\n * from `agentSession.sessionId`. Survives across daemon restarts\n * via sessions.json so `restart` can pass it as `resumeSessionId`\n * and reattach to the prior conversation history. */\n adapterSessionId?: string\n /** Provider-specific resume hints sniffed from the session's\n * output. claude-code prints `claude --resume <uuid>` on exit;\n * we capture that uuid as `claudeResumeId`. On `restart`, when a\n * hint is present, agentproto prefers a PTY spawn with the\n * provider's native resume command (`claude --resume <id>`) over\n * the ACP-level resume — works wherever the provider persisted\n * the session, not just when the ACP wrapper did.\n *\n * Keys are adapter-specific so future adapters can add their own\n * (\"hermesResumeId\", etc.) without changing this type. */\n resumeMetadata?: Record<string, string>\n}\n\ninterface SessionRuntime {\n desc: SessionDescriptor\n /** Set when the session is a raw spawn (`kind: \"command\"|\"terminal\"`).\n * Agent sessions don't expose the underlying process — the\n * driver-agent-cli runtime owns it. */\n child?: ChildProcess\n /** Set when the session is an agent-cli (multi-turn). The registry\n * keeps it alive across turns; sendPrompt(id, prompt) re-uses it. */\n agentSession?: AgentSessionLike\n /** Adapter slug — only set for agent sessions, helps the UI render\n * \"claude-code\" / \"hermes\" badges. */\n adapterSlug?: string\n /** Set when the session is a PTY (spawnPty). Bytes flow through\n * pty.onData → recentBytes ring + emitter \"data\" event. */\n pty?: PtyProcess\n /** Per-subscriber size requests for the PTY. Min cols/rows\n * across the live set is what we actually call pty.resize with\n * (mirrors tmux's \"smallest attached client wins\" rule). */\n ptySubscribers?: Map<number, { cols: number; rows: number }>\n /** Ring buffer of recent stdout+stderr lines. Capped so a runaway\n * child can't blow the daemon's heap. */\n recentLines: string[]\n /** Ring buffer of recent PTY bytes for replay-on-attach. Total\n * size capped at RECENT_BYTES_CAP — oldest chunks dropped first. */\n recentBytes: Buffer[]\n recentBytesSize: number\n emitter: EventEmitter\n /** True while a turn is in flight. POST /sessions/:id/prompt rejects\n * with 409 when busy — the agent can only handle one turn at a\n * time per session. */\n busy: boolean\n /** Buffer for partial text-delta fragments — agent text events\n * arrive as chunks, we coalesce them across deltas and split on\n * newlines so each line lands as a discrete ring-buffer entry. */\n textBuf: string\n /** Same as textBuf but for `thought` events. Some agents (hermes)\n * stream chain-of-thought as one delta per token, which made the\n * ring buffer unreadable when each token got its own\n * `[thought]` line — coalesce the same way text-delta does. */\n thoughtBuf: string\n /** In-flight resume promise. Deduplicates concurrent prompt\n * attempts on a dead agent session — only one resume call hits\n * the adapter, the rest await this promise. Cleared once\n * resolved (success or failure). */\n resumePromise?: Promise<void>\n}\n\nconst RECENT_LINES_CAP = 500\nconst RECENT_BYTES_CAP = 64 * 1024\nconst PERSIST_DEBOUNCE_MS = 1_500\n/** Cap on the number of historical descriptors loaded from\n * sessions.json at boot. Older entries (by startedAt) are dropped\n * on overflow — newest history wins. Adjust upward if the file\n * starts feeling sparse; downward if the dashboard takes too long\n * to render. */\nconst HISTORY_CAP = 200\n\n/** Strip CSI / SGR ANSI sequences so resume-pattern matching works\n * on dim/coloured output. Liberal regex covering most cases — we\n * don't need byte-perfect parsing here. */\nfunction stripAnsiCodes(s: string): string {\n return s.replace(/\\x1b\\[[0-9;?]*[A-Za-z]/g, \"\")\n}\n\nexport interface SessionsRegistry {\n spawn(input: SpawnSessionInput): SessionDescriptor\n /** Adopt a ChildProcess that was spawned outside the registry —\n * e.g. by the tunnel server when the host dispatches a spawn\n * frame. The registry attaches its stdout/stderr listeners and\n * tracks the descriptor so the child shows up in /sessions and\n * the LocalDaemonSessionsCard. The caller keeps lifecycle\n * ownership (kill / wait); this is purely for observability.\n * Returns the descriptor for the registered session. */\n register(input: RegisterSessionInput): SessionDescriptor\n /** Register an already-built agent session (caller resolves the\n * adapter + builds the runtime). Sets kind=\"agent-cli\", consumes\n * the optional initial prompt synchronously, returns the\n * descriptor. The agent stays alive — call `sendPrompt(id, ...)`\n * for follow-up turns until `kill(id)` closes it. */\n spawnAgent(input: SpawnAgentInput): SessionDescriptor\n /** Spawn a process under a real PTY (node-pty). Bytes flow through\n * the registry's byte ring buffer + emitter; attach with\n * `attachPty(id, ...)`. Throws when the registry was constructed\n * without a `spawnPty` factory (node-pty optional dep missing). */\n spawnPty(input: SpawnPtyInput): SessionDescriptor\n /** Send a follow-up turn to a live agent session. Throws when the\n * session is missing, not an agent-cli kind, or busy. The events\n * stream into the existing ring buffer + line emitter so /stream\n * consumers see them as they arrive. */\n sendPrompt(id: string, message: unknown): Promise<void>\n /** Fire-and-forget variant of `sendPrompt`. Validates the same\n * preconditions synchronously — throws on missing session / wrong\n * kind / busy — but returns immediately after the turn is started,\n * letting the caller stream output via the SSE endpoint instead of\n * blocking on the full turn. Async errors during the turn are\n * pushed into the ring buffer as `[error]` lines so `/stream`\n * subscribers see them. Used by the web UI's chat input where a\n * long turn would otherwise freeze the textbox. */\n enqueuePrompt(id: string, message: unknown): void\n list(): SessionDescriptor[]\n get(id: string): SessionDescriptor | undefined\n /** Subscribe to a session's output. Returns an unsubscribe fn.\n * Initial backfill: synchronously invokes `onLine` once for each\n * line currently in the ring buffer so attaches show context. */\n attach(\n id: string,\n onLine: (line: string, stream: \"stdout\" | \"stderr\") => void\n ): (() => void) | null\n /** Subscribe to a PTY session's byte stream. Returns a control\n * handle (write/resize/detach) and null when the session is\n * missing or not a PTY kind. Replays the ring buffer\n * synchronously before live frames start. Initial `cols`/`rows`\n * are required so the registry can compute min-size across\n * subscribers; recompute on every `resize` call. */\n attachPty(\n id: string,\n initial: { cols: number; rows: number },\n onData: (chunk: Buffer) => void,\n onExit: (event: { exitCode: number; signal?: number }) => void\n ): {\n write(data: string): void\n resize(cols: number, rows: number): void\n detach(): void\n } | null\n /** Find a session by exact id OR exact name match. Returns the\n * descriptor or undefined. Used by HTTP/MCP routes so callers\n * can refer to \"claude-main\" instead of \"sess_a3f8c1b2\". */\n findByIdOrName(query: string): SessionDescriptor | undefined\n /** Write a chunk of text to a PTY session's stdin. Returns true\n * on success, false when the session is missing or not a PTY.\n * Single-shot variant of attachPty().write — useful for MCP\n * tools that drive a session through tool calls. */\n writeTerminalInput(id: string, data: string): boolean\n /** Snapshot the recent PTY byte buffer as one Buffer. Newest\n * bytes at the end; `lastBytes` caps the returned size from the\n * tail. Returns null when the session is missing or not a PTY. */\n readTerminalOutput(id: string, lastBytes?: number): Buffer | null\n kill(id: string, signal?: NodeJS.Signals): boolean\n /** Stop tracking a session (after it exited and the user clicked\n * \"clear\"). Doesn't kill — use `kill` first. */\n forget(id: string): boolean\n /** Stop persisting + close all sessions. Killed children are not\n * awaited — the daemon shutdown loop handles process tree teardown. */\n shutdown(): void\n}\n\nexport interface RegisterSessionInput {\n /** Pre-existing child process to adopt (e.g. from a tunnel spawn). */\n child: ChildProcess\n /** Stable id — typically the tunnel's execId so callers cross-ref. */\n id: string\n workspaceSlug: string\n /** Display label for the descriptor's `command` field. */\n command: string\n kind?: SessionKind\n label?: string\n}\n\nexport interface SpawnAgentInput {\n workspaceSlug: string\n cwd: string\n /** Driver-built session ready to receive turns. Caller resolves\n * the adapter, calls createAgentCliRuntime(handle).start({cwd}),\n * and hands the result here. */\n agentSession: AgentSessionLike\n /** Adapter slug for the descriptor (display only). */\n adapterSlug: string\n /** Optional initial prompt to dispatch immediately. The promise\n * the registry returns resolves AFTER the spawn — the prompt\n * runs in the background, projecting events into the ring\n * buffer. Skip to spawn idle. */\n initialPrompt?: string\n label?: string\n /** Pretty command for the descriptor (display only). */\n commandPreview?: string\n}\n\nexport interface SpawnSessionInput {\n kind: SessionKind\n workspaceSlug: string\n /** Path of the workspace root (for the child's cwd). The registry\n * doesn't validate it against the workspaces config — caller has\n * already resolved this. */\n cwd: string\n /** Argv. First element is the binary; rest are passed verbatim. */\n argv: string[]\n /** Extra env on top of the daemon's process.env. */\n env?: Record<string, string>\n /** Optional pre-set id (lets the spawner reference the session\n * before the spawn returns — useful for telemetry). */\n id?: string\n label?: string\n /** Keep the child's stdin open (default: closed). Most spawned\n * agents are non-interactive and emit a warning when stdin is a\n * pipe with no writer (claude-code prints \"no stdin data\n * received in 3s, proceeding without it\"). Closing stdin lets\n * them skip the wait. PTY/terminal kinds that genuinely need\n * bidirectional IO should opt in via `keepStdin: true` and the\n * caller is then responsible for writing to `child.stdin`. */\n keepStdin?: boolean\n}\n\nexport interface SpawnPtyInput {\n workspaceSlug: string\n cwd: string\n argv: string[]\n /** Initial PTY dimensions. The registry uses min(cols, rows) across\n * active subscribers thereafter — these are the seed values used\n * before anyone attaches. */\n cols: number\n rows: number\n /** Extra env on top of process.env. TERM/LANG/PATH are forced by\n * the factory layer (node-pty.spawn options); don't try to clear\n * them here. */\n env?: Record<string, string>\n /** User-friendly slug. Used by `findByIdOrName(query)`. Must not\n * collide with an existing session's name. */\n name?: string\n label?: string\n}\n\n/**\n * Hook the registry uses to rebuild a dead agent session on demand.\n * Invoked when a prompt arrives for an agent-cli session whose\n * `agentSession` was lost (typically daemon restart). Returns a fresh\n * `AgentSessionLike` bound to the same upstream conversation via\n * `resumeSessionId`, OR null if resume isn't possible (adapter gone,\n * upstream rejected). When null, the prompt path surfaces the same\n * \"not an agent session\" error as before — caller knows the row is a\n * ghost.\n *\n * The CLI wires this into the registry by passing in a closure that\n * calls `resolveAgentAdapter(slug)?.startSession({cwd, resumeSessionId})`,\n * which is the same path the gateway's POST /sessions/agent uses.\n */\nexport type AgentSessionResumer = (input: {\n adapterSlug: string\n cwd: string\n resumeSessionId: string\n}) => Promise<AgentSessionLike | null>\n\nexport function createSessionsRegistry(opts?: {\n /** Override the persistence path — tests pin a tmpdir. */\n persistPath?: string\n /** Disable persistence entirely. */\n persist?: boolean\n /** PTY factory (node-pty wrapper). When omitted, `spawnPty()`\n * throws — the daemon advertises PTY support only when the cli\n * layer resolved node-pty successfully. */\n spawnPty?: PtyFactory\n /** Hook called when a prompt arrives for an agent-cli session whose\n * agentSession binding is gone (daemon restart). When provided,\n * the registry transparently resumes the session via the adapter's\n * resumeSessionId before dispatching the turn. When omitted,\n * killed agent-cli sessions surface the legacy \"not an agent\n * session\" error and the user must spawn fresh. */\n resumeAgent?: AgentSessionResumer\n}): SessionsRegistry {\n const persistPath = opts?.persistPath ?? SESSIONS_FILE_PATH()\n const persist = opts?.persist ?? true\n const ptyFactory = opts?.spawnPty\n const resumeAgent = opts?.resumeAgent\n const sessions = new Map<string, SessionRuntime>()\n let persistTimer: ReturnType<typeof setTimeout> | null = null\n // Monotonically-growing PTY-subscriber id. Detach is O(1) on\n // Map.delete(subId), so we never reuse — overflow at Number.MAX_-\n // SAFE_INTEGER would take ~285 years at 1M attaches/sec.\n let nextSubId = 1\n // Guards `shutdown()` from running twice — double-stop happens in\n // serve --interactive's Ctrl-C race; without this, the second\n // call writes an empty snapshot over the real one.\n let shutdownDone = false\n\n // ── boot-time history load ──\n // Read sessions.json synchronously at construction so the dashboard\n // shows historical sessions immediately on daemon restart. Anything\n // that was \"running\" or \"starting\" when the daemon last died gets\n // marked \"killed\" — we have no way to know if the orphan child\n // survived the daemon's exit, and pretending it's still alive would\n // make attach calls fail mysteriously.\n //\n // Historical entries are GHOSTS: descriptor only, no child / no\n // agentSession / no pty. Calls like kill(id) / attach(id) work on\n // them but degrade to no-ops (the underlying process is gone). The\n // session's `endedAt` is set to now when we infer a kill, so the\n // dashboard ages them from this boot rather than the daemon's last\n // life.\n if (persist) {\n loadHistorySnapshot(persistPath, sessions)\n }\n\n // Belt-and-suspenders: `process.on(\"exit\")` runs even on uncaught\n // throws, terminal-close (SIGHUP), and any termination path that\n // bypassed the regular SIGINT/SIGTERM cleanup. The handler must be\n // sync (Node won't await async there); we already use sync IO in\n // `shutdown()` so this is safe. Idempotency guard inside shutdown\n // prevents a double-write when both this handler and the explicit\n // SIGINT path fire.\n const onProcessExit = (): void => {\n shutdownImpl()\n }\n if (persist) {\n process.on(\"exit\", onProcessExit)\n }\n\n const schedulePersist = (): void => {\n if (!persist) return\n if (persistTimer) clearTimeout(persistTimer)\n persistTimer = setTimeout(() => {\n void persistSnapshot()\n }, PERSIST_DEBOUNCE_MS)\n }\n\n const persistSnapshot = async (): Promise<void> => {\n try {\n const snapshot = {\n savedAt: new Date().toISOString(),\n sessions: Array.from(sessions.values()).map(s => s.desc),\n }\n await fs.mkdir(dirname(persistPath), { recursive: true })\n await fs.writeFile(persistPath, JSON.stringify(snapshot, null, 2) + \"\\n\")\n } catch (err) {\n // Persistence is best-effort — log only, never throw.\n console.warn(\n `[sessions] persist failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n }\n }\n\n const appendLine = (\n rt: SessionRuntime,\n line: string,\n stream: \"stdout\" | \"stderr\"\n ): void => {\n rt.recentLines.push(line)\n if (rt.recentLines.length > RECENT_LINES_CAP) {\n rt.recentLines.splice(0, rt.recentLines.length - RECENT_LINES_CAP)\n }\n rt.desc.lastOutputAt = new Date().toISOString()\n sniffResumeHints(rt, line)\n rt.emitter.emit(\"line\", { line, stream })\n }\n\n /**\n * Provider-specific resume-hint sniffer. Looks up the adapter's\n * strategy in `RESUME_STRATEGIES` and runs its `outputHint` regex\n * against each agent-cli line. The captured id is recorded on the\n * descriptor so `agentproto sessions restart` can use it.\n *\n * ANSI-stripped before matching so dim/color codes don't break the\n * pattern. Adapters without a strategy entry (or without an\n * outputHint) are skipped — they fall back to ACP-level resume.\n */\n const sniffResumeHints = (rt: SessionRuntime, line: string): void => {\n if (rt.desc.kind !== \"agent-cli\") return\n const strategy = rt.desc.adapterSlug\n ? RESUME_STRATEGIES[rt.desc.adapterSlug]\n : undefined\n if (!strategy?.outputHint) return\n const plain = stripAnsiCodes(line)\n const m = plain.match(strategy.outputHint)\n if (m && m[1]) {\n rt.desc.resumeMetadata = {\n ...(rt.desc.resumeMetadata ?? {}),\n [strategy.storeAs]: m[1],\n }\n schedulePersist()\n }\n }\n\n /**\n * PTY byte ring buffer. Keeps the last ~64 KiB of raw bytes so a\n * fresh attacher sees the current screenful (alt-screen apps like\n * Claude TUI / vim repaint on next interaction but a snapshot is\n * still better than blank). Drops oldest chunks when over cap;\n * never splits within a chunk — Buffer arithmetic on UTF-8 mid-\n * sequence would corrupt multi-byte glyphs.\n */\n const appendBytes = (rt: SessionRuntime, chunk: Buffer): void => {\n rt.recentBytes.push(chunk)\n rt.recentBytesSize += chunk.byteLength\n while (\n rt.recentBytesSize > RECENT_BYTES_CAP &&\n rt.recentBytes.length > 1\n ) {\n const dropped = rt.recentBytes.shift()\n if (dropped) rt.recentBytesSize -= dropped.byteLength\n }\n rt.desc.lastOutputAt = new Date().toISOString()\n rt.emitter.emit(\"data\", chunk)\n }\n\n /**\n * Recompute the smallest cols/rows across the active subscriber\n * set and resize the PTY accordingly (tmux's \"smallest attached\n * client wins\" rule). No-op when the subscriber map is empty.\n */\n const reconcilePtySize = (rt: SessionRuntime): void => {\n if (!rt.pty || !rt.ptySubscribers || rt.ptySubscribers.size === 0) return\n let cols = Infinity\n let rows = Infinity\n for (const dim of rt.ptySubscribers.values()) {\n if (dim.cols < cols) cols = dim.cols\n if (dim.rows < rows) rows = dim.rows\n }\n if (!Number.isFinite(cols) || !Number.isFinite(rows)) return\n try {\n rt.pty.resize(cols, rows)\n } catch {\n // pty may have exited between the emit and the resize — swallow.\n }\n }\n\n /**\n * Project ACP-style stream events into ring-buffer lines. Keeps\n * the line shape simple so the existing /stream SSE consumer\n * (and the xterm panel) just renders them as-is.\n */\n const projectEvent = (rt: SessionRuntime, evt: AgentStreamEvent): void => {\n switch (evt.kind) {\n case \"text-delta\":\n if (evt.text) {\n // text-delta is a stream of chunks — split on newlines so\n // each line lands in the ring buffer separately. Coalesce\n // a trailing fragment via rt.textBuf.\n const combined = rt.textBuf + evt.text\n const lines = combined.split(/\\r?\\n/)\n rt.textBuf = lines.pop() ?? \"\"\n for (const line of lines) appendLine(rt, line, \"stdout\")\n }\n break\n case \"thought\":\n if (evt.text) {\n // Same coalescing as text-delta — some adapters stream\n // chain-of-thought one token at a time, which would\n // otherwise produce ~100 [thought] lines per turn.\n const combined = rt.thoughtBuf + evt.text\n const lines = combined.split(/\\r?\\n/)\n rt.thoughtBuf = lines.pop() ?? \"\"\n for (const line of lines) {\n if (line.trim()) {\n appendLine(rt, `\\x1b[2m[thought] ${line}\\x1b[0m`, \"stdout\")\n }\n }\n }\n break\n case \"tool-call\":\n appendLine(\n rt,\n `\\x1b[36m[tool] ${evt.toolName ?? \"?\"}\\x1b[0m`,\n \"stdout\"\n )\n break\n case \"tool-result\":\n if (evt.isError)\n appendLine(rt, `\\x1b[31m[tool-error]\\x1b[0m`, \"stderr\")\n break\n case \"agent-prompt\":\n appendLine(rt, `\\x1b[33m[awaiting input]\\x1b[0m`, \"stdout\")\n break\n case \"turn-end\": {\n // Flush any buffered text/thought fragments as final lines.\n if (rt.thoughtBuf.trim()) {\n appendLine(\n rt,\n `\\x1b[2m[thought] ${rt.thoughtBuf}\\x1b[0m`,\n \"stdout\"\n )\n }\n rt.thoughtBuf = \"\"\n if (rt.textBuf) {\n appendLine(rt, rt.textBuf, \"stdout\")\n rt.textBuf = \"\"\n }\n appendLine(\n rt,\n `\\x1b[2m── turn-end (${evt.reason ?? \"completed\"}) ──\\x1b[0m`,\n \"stdout\"\n )\n break\n }\n case \"error\": {\n const code =\n typeof evt.error?.code === \"number\" ? ` (code ${evt.error.code})` : \"\"\n appendLine(\n rt,\n `\\x1b[31m[error]${code} ${evt.error?.message ?? \"unknown\"}\\x1b[0m`,\n \"stderr\"\n )\n // Project the child's stderr tail when define-agent-cli\n // attached it — otherwise the user sees only \"Invalid\n // params\" and has to dig into the daemon log for context.\n const data = evt.error?.data as\n | { stderr?: unknown }\n | null\n | undefined\n if (data && typeof data === \"object\" && typeof data.stderr === \"string\") {\n for (const line of data.stderr.split(/\\r?\\n/)) {\n if (line) appendLine(rt, `\\x1b[2m ${line}\\x1b[0m`, \"stderr\")\n }\n }\n break\n }\n }\n }\n\n /**\n * Drive one agent turn. Sets busy=true, drains the event stream\n * into the ring buffer, clears busy on completion. Bumps the\n * descriptor status to \"error\" if the iteration throws (network\n * drop, child died mid-turn).\n */\n /**\n * Shared sync validation for sendPrompt + enqueuePrompt. Throws on\n * missing session / wrong kind / busy so both code paths surface\n * the exact same error messages — the only difference is whether\n * the caller awaits the turn.\n */\n const validateAgentTurn = (id: string, caller: string): SessionRuntime => {\n const rt = sessions.get(id)\n if (!rt) throw new Error(`${caller}: no session \"${id}\"`)\n if (!rt.agentSession) {\n throw new Error(\n `${caller}: session \"${id}\" is not an agent session (kind=${rt.desc.kind})`\n )\n }\n if (rt.busy) {\n throw new Error(\n `${caller}: session \"${id}\" is mid-turn — wait for it to finish or cancel`\n )\n }\n return rt\n }\n\n /**\n * Attempt to resume a dead agent-cli session by re-spawning the\n * adapter with the persisted `adapterSessionId`. The conversation\n * continues from where it left off — ACP's `resumeSessionId`\n * contract guarantees the adapter rehydrates state from the\n * upstream provider (Anthropic / OpenAI / etc.) when supported.\n *\n * Returns silently when:\n * - resumeAgent hook wasn't provided (older daemon embedding)\n * - session is already alive (binding present)\n * - session is a non-agent kind (terminal/command can't resume)\n * - descriptor lacks adapterSessionId or adapterSlug (legacy row\n * persisted before resume metadata was tracked)\n *\n * Concurrent prompt arrivals share one resume attempt via\n * `rt.resumePromise`.\n */\n const maybeResumeAgent = async (rt: SessionRuntime): Promise<void> => {\n if (rt.agentSession) return\n if (!resumeAgent) return\n if (rt.desc.kind !== \"agent-cli\") return\n const adapterSlug = rt.desc.adapterSlug ?? rt.adapterSlug\n const adapterSessionId = rt.desc.adapterSessionId\n const cwd = rt.desc.cwd\n if (!adapterSlug || !adapterSessionId || !cwd) return\n if (rt.resumePromise) {\n await rt.resumePromise\n return\n }\n rt.resumePromise = (async () => {\n appendLine(\n rt,\n `── resuming ${adapterSlug} session ${adapterSessionId} ──`,\n \"stdout\"\n )\n try {\n const fresh = await resumeAgent({\n adapterSlug,\n cwd,\n resumeSessionId: adapterSessionId,\n })\n if (!fresh) {\n appendLine(\n rt,\n `[error] resume failed: adapter '${adapterSlug}' returned null`,\n \"stderr\"\n )\n return\n }\n rt.agentSession = fresh\n rt.adapterSlug = adapterSlug\n rt.desc.adapterSessionId = fresh.sessionId\n if (rt.desc.status !== \"running\") {\n rt.desc.status = \"running\"\n delete rt.desc.endedAt\n delete rt.desc.exitCode\n rt.emitter.emit(\"status\", rt.desc.status)\n }\n schedulePersist()\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n appendLine(rt, `[error] resume failed: ${msg}`, \"stderr\")\n }\n })()\n try {\n await rt.resumePromise\n } finally {\n rt.resumePromise = undefined\n }\n }\n\n const runAgentTurn = async (\n rt: SessionRuntime,\n message: unknown\n ): Promise<void> => {\n if (!rt.agentSession) {\n throw new Error(\"runAgentTurn: session has no agentSession\")\n }\n rt.busy = true\n try {\n appendLine(\n rt,\n `\\x1b[2m── ▶ ${typeof message === \"string\" ? message : JSON.stringify(message)} ──\\x1b[0m`,\n \"stdout\"\n )\n // ACP's `prompt` field expects ContentBlock[] (or a single\n // block). Hosts that send a raw string get auto-wrapped into\n // `{type: \"text\", text: \"...\"}` so callers can hand us\n // human-friendly prompts without shaping the wire format.\n const wrapped =\n typeof message === \"string\" ? { type: \"text\", text: message } : message\n for await (const evt of rt.agentSession.send(wrapped)) {\n projectEvent(rt, evt)\n }\n } catch (err) {\n rt.desc.status = \"error\"\n rt.desc.endedAt = new Date().toISOString()\n appendLine(\n rt,\n `[turn error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n schedulePersist()\n } finally {\n rt.busy = false\n }\n }\n\n const wireOutputStreams = (rt: SessionRuntime): void => {\n const onChunk =\n (stream: \"stdout\" | \"stderr\") =>\n (chunk: Buffer | string): void => {\n const text = typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\")\n for (const line of text.split(/\\r?\\n/)) {\n if (line.length > 0) appendLine(rt, line, stream)\n }\n }\n // Only called from spawn() which always sets rt.child — narrow\n // here so the stream listeners don't trip the optional-chain.\n if (!rt.child) return\n rt.child.stdout?.on(\"data\", onChunk(\"stdout\"))\n rt.child.stderr?.on(\"data\", onChunk(\"stderr\"))\n }\n\n return {\n spawn(input) {\n const id = input.id ?? `sess_${randomUUID().slice(0, 8)}`\n if (sessions.has(id)) {\n throw new Error(`sessions.spawn: id \"${id}\" already in use`)\n }\n const env = { ...process.env, ...(input.env ?? {}) }\n // Filter out Node bookkeeping that confuses subprocesses.\n delete env.NODE_OPTIONS\n const [bin, ...args] = input.argv\n if (!bin) throw new Error(\"sessions.spawn: argv must include a binary\")\n // Close stdin by default — most agent CLIs spawn-and-prompt\n // (claude/codex/aider/etc.) read argv for the prompt and will\n // otherwise sit waiting for piped input. Caller opts in to a\n // writeable stdin via `keepStdin: true` (terminal/PTY kinds).\n const stdinMode = input.keepStdin ? \"pipe\" : \"ignore\"\n const child = spawn(bin, args, {\n cwd: input.cwd,\n env: env as NodeJS.ProcessEnv,\n stdio: [stdinMode, \"pipe\", \"pipe\"],\n })\n const desc: SessionDescriptor = {\n id,\n kind: input.kind,\n workspaceSlug: input.workspaceSlug,\n command: [bin, ...args].map(quoteArg).join(\" \"),\n pid: child.pid ?? null,\n status: \"starting\",\n startedAt: new Date().toISOString(),\n argv: input.argv,\n cwd: input.cwd,\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n child,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n // Don't crash the daemon when no listener is attached — the\n // emitter's \"error\" event would otherwise propagate.\n rt.emitter.setMaxListeners(50)\n\n sessions.set(id, rt)\n wireOutputStreams(rt)\n\n child.once(\"spawn\", () => {\n desc.status = \"running\"\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n child.once(\"error\", err => {\n desc.status = \"error\"\n desc.endedAt = new Date().toISOString()\n appendLine(rt, `[spawn error] ${err.message}`, \"stderr\")\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n child.once(\"exit\", (code, signal) => {\n if (signal && desc.status !== \"killed\") desc.status = \"killed\"\n else if (desc.status === \"running\" || desc.status === \"starting\") {\n desc.status = \"exited\"\n }\n desc.endedAt = new Date().toISOString()\n if (typeof code === \"number\") desc.exitCode = code\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n register(input) {\n if (sessions.has(input.id)) {\n // Already adopted (re-tracking is a noop). Return the\n // existing descriptor so callers don't have to special-case.\n const existing = sessions.get(input.id)\n if (existing) return existing.desc\n }\n const desc: SessionDescriptor = {\n id: input.id,\n kind: input.kind ?? \"command\",\n workspaceSlug: input.workspaceSlug,\n command: input.command,\n pid: input.child.pid ?? null,\n status: input.child.killed ? \"killed\" : \"running\",\n startedAt: new Date().toISOString(),\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n child: input.child,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(input.id, rt)\n wireOutputStreams(rt)\n // Wire exit so the descriptor flips when the adopted child\n // dies — same handlers as spawn() but registered post-hoc\n // because the child is already alive.\n input.child.once(\"exit\", (code, signal) => {\n if (signal && desc.status !== \"killed\") desc.status = \"killed\"\n else if (desc.status === \"running\") desc.status = \"exited\"\n desc.endedAt = new Date().toISOString()\n if (typeof code === \"number\") desc.exitCode = code\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n input.child.once(\"error\", err => {\n desc.status = \"error\"\n desc.endedAt = new Date().toISOString()\n appendLine(rt, `[child error] ${err.message}`, \"stderr\")\n rt.emitter.emit(\"status\", desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n spawnAgent(input) {\n const id = `sess_${randomUUID().slice(0, 8)}`\n const desc: SessionDescriptor = {\n id,\n kind: \"agent-cli\",\n workspaceSlug: input.workspaceSlug,\n command: input.commandPreview ?? `${input.adapterSlug} (agent)`,\n pid: null,\n status: \"running\", // driver already started the session\n startedAt: new Date().toISOString(),\n cwd: input.cwd,\n adapterSlug: input.adapterSlug,\n // ACP-level session id — sticks across daemon restart so\n // `agentproto sessions restart <id>` can pass it as\n // `resumeSessionId` and the adapter reattaches to the prior\n // conversation rather than starting blank.\n adapterSessionId: input.agentSession.sessionId,\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n agentSession: input.agentSession,\n adapterSlug: input.adapterSlug,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(id, rt)\n appendLine(\n rt,\n `── ${input.adapterSlug} agent session ${input.agentSession.sessionId} (cwd ${input.cwd}) ──`,\n \"stdout\"\n )\n schedulePersist()\n // Fire-and-forget the initial prompt (if any). Errors land in\n // the ring buffer + bump status to \"error\" but don't reject\n // the spawn — the descriptor was already returned.\n if (input.initialPrompt) {\n void runAgentTurn(rt, input.initialPrompt).catch(err => {\n appendLine(\n rt,\n `[turn error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n })\n }\n return desc\n },\n spawnPty(input) {\n if (!ptyFactory) {\n throw new Error(\n \"sessions.spawnPty: no PTY factory configured (node-pty optional dep missing in the daemon)\"\n )\n }\n const id = `sess_${randomUUID().slice(0, 8)}`\n // Reject the name only when the prior holder is still alive —\n // killed/exited/error sessions keep their descriptor in the\n // registry for history, but their name is free to reuse so\n // `stop X && terminal --name X` round-trips cleanly.\n if (input.name) {\n for (const rt of sessions.values()) {\n if (rt.desc.name !== input.name) continue\n const status = rt.desc.status\n if (status === \"running\" || status === \"starting\") {\n throw new Error(\n `sessions.spawnPty: name \"${input.name}\" already in use by ${rt.desc.id} (status=${status})`,\n )\n }\n // Free the name on the dead session so id-or-name lookup\n // resolves to the NEW one. The old descriptor stays in the\n // registry (you can still find it by id in the list).\n rt.desc.name = undefined\n }\n }\n const [bin, ...args] = input.argv\n if (!bin) {\n throw new Error(\"sessions.spawnPty: argv must include a binary\")\n }\n // node-pty forces its own minimal env unless we forward — pass\n // process.env merged with caller overrides. The factory layer\n // also forces TERM=xterm-256color so alt-screen apps render.\n const env = { ...(process.env as Record<string, string>), ...(input.env ?? {}) }\n delete env.NODE_OPTIONS\n const pty: PtyProcess = ptyFactory({\n command: bin,\n args,\n cwd: input.cwd,\n env,\n cols: input.cols,\n rows: input.rows,\n })\n const desc: SessionDescriptor = {\n id,\n kind: \"terminal\",\n workspaceSlug: input.workspaceSlug,\n command: [bin, ...args].map(quoteArg).join(\" \"),\n pid: pty.pid,\n status: \"running\",\n startedAt: new Date().toISOString(),\n pty: true,\n argv: input.argv,\n cwd: input.cwd,\n ...(input.name ? { name: input.name } : {}),\n ...(input.label ? { label: input.label } : {}),\n }\n const rt: SessionRuntime = {\n desc,\n pty,\n ptySubscribers: new Map(),\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(id, rt)\n pty.onData((chunk: string) => {\n // node-pty emits utf-8 strings. Convert once at the boundary\n // so the ring buffer + emitter consumers all see Buffer.\n appendBytes(rt, Buffer.from(chunk, \"utf8\"))\n })\n pty.onExit(evt => {\n if (rt.desc.status !== \"killed\") {\n rt.desc.status = \"exited\"\n }\n rt.desc.endedAt = new Date().toISOString()\n if (typeof evt.exitCode === \"number\") rt.desc.exitCode = evt.exitCode\n rt.emitter.emit(\"exit\", evt)\n rt.emitter.emit(\"status\", rt.desc.status)\n schedulePersist()\n })\n schedulePersist()\n return desc\n },\n async sendPrompt(id, message) {\n const rtPre = sessions.get(id)\n if (rtPre) await maybeResumeAgent(rtPre)\n const rt = validateAgentTurn(id, \"sendPrompt\")\n await runAgentTurn(rt, message)\n },\n enqueuePrompt(id, message) {\n // For sync `enqueuePrompt`, we need to surface an immediate\n // error when the session is missing OR when it's a non-agent\n // kind that can't be resumed at all. But when the session IS\n // an agent-cli with resume metadata, defer validation until\n // after the resume attempt so a dead-but-resumable row Just\n // Works for the caller (no \"not an agent session\" error after\n // a daemon restart).\n const rtPre = sessions.get(id)\n if (!rtPre) {\n throw new Error(`enqueuePrompt: no session \"${id}\"`)\n }\n if (rtPre.desc.kind !== \"agent-cli\") {\n throw new Error(\n `enqueuePrompt: session \"${id}\" is not an agent session (kind=${rtPre.desc.kind})`\n )\n }\n if (rtPre.busy) {\n throw new Error(\n `enqueuePrompt: session \"${id}\" is mid-turn — wait for it to finish or cancel`\n )\n }\n // Fire-and-forget: resume (if needed) then dispatch. Errors\n // during either step land in the ring buffer as `[error]`\n // lines so the SSE consumer sees them.\n void (async () => {\n try {\n await maybeResumeAgent(rtPre)\n const rt = validateAgentTurn(id, \"enqueuePrompt\")\n await runAgentTurn(rt, message)\n } catch (err) {\n appendLine(\n rtPre,\n `[error] ${err instanceof Error ? err.message : String(err)}`,\n \"stderr\"\n )\n }\n })()\n },\n list() {\n return Array.from(sessions.values())\n .map(s => s.desc)\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n },\n get(id) {\n return sessions.get(id)?.desc\n },\n attach(id, onLine) {\n const rt = sessions.get(id)\n if (!rt) return null\n // Backfill: synchronously replay the ring buffer so attaches\n // see the recent context, then subscribe for new lines.\n for (const line of rt.recentLines) onLine(line, \"stdout\")\n const handler = (evt: {\n line: string\n stream: \"stdout\" | \"stderr\"\n }): void => onLine(evt.line, evt.stream)\n rt.emitter.on(\"line\", handler)\n return () => rt.emitter.off(\"line\", handler)\n },\n attachPty(id, initial, onData, onExit) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty || !rt.ptySubscribers) return null\n // Backfill: flush the byte ring buffer so a fresh attach lands\n // on the recent screenful. Alt-screen apps repaint on next\n // input but a snapshot is still better than blank.\n for (const chunk of rt.recentBytes) onData(chunk)\n // Subscriber registration: a monotonically-growing key so the\n // size map can hold the per-subscriber dims and detach is O(1).\n const subId = nextSubId++\n rt.ptySubscribers.set(subId, { cols: initial.cols, rows: initial.rows })\n reconcilePtySize(rt)\n const dataHandler = (chunk: Buffer): void => onData(chunk)\n const exitHandler = (evt: {\n exitCode: number\n signal?: number\n }): void => onExit(evt)\n rt.emitter.on(\"data\", dataHandler)\n rt.emitter.once(\"exit\", exitHandler)\n return {\n write(data: string): void {\n if (!rt.pty) return\n try {\n rt.pty.write(data)\n } catch {\n // PTY already exited — drop the input silently.\n }\n },\n resize(cols: number, rows: number): void {\n if (!rt.ptySubscribers) return\n rt.ptySubscribers.set(subId, { cols, rows })\n reconcilePtySize(rt)\n },\n detach(): void {\n rt.emitter.off(\"data\", dataHandler)\n rt.emitter.off(\"exit\", exitHandler)\n rt.ptySubscribers?.delete(subId)\n reconcilePtySize(rt)\n },\n }\n },\n findByIdOrName(query) {\n const direct = sessions.get(query)\n if (direct) return direct.desc\n for (const rt of sessions.values()) {\n if (rt.desc.name === query) return rt.desc\n }\n return undefined\n },\n writeTerminalInput(id, data) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty) return false\n try {\n rt.pty.write(data)\n return true\n } catch {\n return false\n }\n },\n readTerminalOutput(id, lastBytes) {\n const rt = sessions.get(id)\n if (!rt || !rt.pty) return null\n const joined = Buffer.concat(rt.recentBytes, rt.recentBytesSize)\n if (typeof lastBytes === \"number\" && lastBytes > 0 && joined.byteLength > lastBytes) {\n return joined.subarray(joined.byteLength - lastBytes)\n }\n return joined\n },\n kill(id, signal = \"SIGTERM\") {\n const rt = sessions.get(id)\n if (!rt) return false\n if (\n rt.desc.status === \"exited\" ||\n rt.desc.status === \"killed\" ||\n rt.desc.status === \"error\"\n ) {\n return false\n }\n rt.desc.status = \"killed\"\n rt.desc.endedAt = new Date().toISOString()\n // Close agent session first (graceful protocol shutdown), then\n // SIGTERM the underlying child/pty if any. Either branch is a\n // best-effort — the descriptor flip is what the UI surfaces.\n if (rt.agentSession) {\n void rt.agentSession.close().catch(() => undefined)\n }\n if (rt.pty) {\n try {\n rt.pty.kill(signal)\n } catch {\n // pty already gone — fall through\n }\n }\n rt.child?.kill(signal)\n schedulePersist()\n return true\n },\n forget(id) {\n const rt = sessions.get(id)\n if (!rt) return false\n // Don't leak: tear down the emitter so backfill listeners stop.\n rt.emitter.removeAllListeners()\n sessions.delete(id)\n schedulePersist()\n return true\n },\n shutdown() {\n shutdownImpl()\n },\n }\n\n /**\n * The actual shutdown logic, hoisted so both the explicit\n * `shutdown()` method AND the `process.on(\"exit\")` safety net\n * can call it. Sync (no awaits) so it works in the `exit` event\n * handler.\n *\n * Idempotent — `serve --interactive` calls gateway.stop() twice in\n * some Ctrl-C race paths (parent SIGINT handler + the child-exit\n * promise both fire), and `process.on(\"exit\")` ALSO fires at the\n * end of every termination path. Without the guard, the second\n * call clears the already-empty sessions Map and writes an empty\n * snapshot back to sessions.json, wiping history.\n */\n function shutdownImpl(): void {\n if (shutdownDone) return\n shutdownDone = true\n if (persistTimer) clearTimeout(persistTimer)\n if (persist) {\n try {\n process.off(\"exit\", onProcessExit)\n } catch {\n // ignore — handler may not be installed\n }\n }\n // Mark any still-alive sessions as killed BEFORE the final\n // flush so the snapshot accurately reflects what happened. On\n // the next boot, load reads these and we won't have to guess\n // (\"was running last time → assume killed\" is then a no-op).\n const nowIso = new Date().toISOString()\n for (const rt of sessions.values()) {\n rt.emitter.removeAllListeners()\n if (\n rt.desc.status === \"running\" ||\n rt.desc.status === \"starting\"\n ) {\n rt.desc.status = \"killed\"\n rt.desc.endedAt = nowIso\n if (rt.agentSession) {\n void rt.agentSession.close().catch(() => undefined)\n }\n if (rt.pty) {\n try {\n rt.pty.kill(\"SIGTERM\")\n } catch {\n // already exited\n }\n }\n rt.child?.kill(\"SIGTERM\")\n }\n }\n // Sync flush so quick sessions (spawned + ended in less than\n // PERSIST_DEBOUNCE_MS) aren't lost. The debounced async write\n // may have been cancelled by clearTimeout above, but a 200-byte\n // sync write at shutdown is cheap and the data needs to land.\n if (persist) {\n try {\n const snapshot = {\n savedAt: nowIso,\n sessions: Array.from(sessions.values()).map(s => s.desc),\n }\n mkdirSync(dirname(persistPath), { recursive: true })\n writeFileSync(persistPath, JSON.stringify(snapshot, null, 2) + \"\\n\")\n } catch {\n // best-effort — same policy as the async path\n }\n }\n sessions.clear()\n }\n}\n\n/**\n * Read the persisted snapshot at boot and reinflate session\n * descriptors as historical \"ghost\" entries. Sync-read because this\n * runs once at construction, the file is small (~200 entries), and\n * keeping it sync avoids making createSessionsRegistry async (would\n * cascade through createGateway + every embedding host).\n *\n * Anything that was \"running\"/\"starting\" when the daemon last died\n * gets re-classified as \"killed\" with endedAt=now — we can't tell\n * if the orphan PID survived the daemon's exit, and pretending it's\n * still alive would make attach/kill calls fail mysteriously. The\n * descriptor stays in the registry for history; the dashboard sees\n * it under SESSIONS, the user can `d` to forget.\n *\n * Ghosts carry NO live child / agentSession / pty — calls that\n * would interact with the underlying process degrade to no-ops.\n * Output ring buffers (lines + bytes) are empty: we don't persist\n * those, only the descriptor metadata.\n */\nfunction loadHistorySnapshot(\n persistPath: string,\n sessions: Map<string, SessionRuntime>,\n): void {\n let raw: string\n try {\n raw = readFileSync(persistPath, \"utf8\")\n } catch {\n return // ENOENT etc. — first boot, no history.\n }\n let parsed: { sessions?: SessionDescriptor[] }\n try {\n parsed = JSON.parse(raw)\n } catch {\n console.warn(\n `[sessions] history file ${persistPath} is malformed — ignoring`,\n )\n return\n }\n if (!Array.isArray(parsed.sessions)) return\n // Newest first so the FIFO cap drops oldest.\n const sorted = parsed.sessions\n .filter((s): s is SessionDescriptor => !!s && typeof s.id === \"string\")\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt))\n .slice(0, HISTORY_CAP)\n const now = new Date().toISOString()\n for (const desc of sorted) {\n if (sessions.has(desc.id)) continue // collision with a live entry — keep live\n const wasAlive = desc.status === \"running\" || desc.status === \"starting\"\n const reclassified: SessionDescriptor = wasAlive\n ? {\n ...desc,\n status: \"killed\",\n endedAt: desc.endedAt ?? now,\n }\n : desc\n const rt: SessionRuntime = {\n desc: reclassified,\n recentLines: [],\n recentBytes: [],\n recentBytesSize: 0,\n emitter: new EventEmitter(),\n busy: false,\n textBuf: \"\",\n thoughtBuf: \"\",\n }\n rt.emitter.setMaxListeners(50)\n sessions.set(desc.id, rt)\n }\n}\n\n/** Minimal shell-quote — wraps args containing whitespace or quotes\n * so the rendered `command` field is copy-pasteable. */\nfunction quoteArg(arg: string): string {\n if (arg === \"\") return '\"\"'\n if (/^[a-zA-Z0-9._/=:@,+-]+$/.test(arg)) return arg\n return `\"${arg.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`\n}\n","/**\n * mcp-proxy — connect the daemon as an MCP *client* to every server\n * the user imported via `~/.agentproto/imported-mcps.json`, and\n * surface their tools through dedicated MCP tools on the daemon's\n * own server. The chain looks like:\n *\n * operator (cloud Guilde) ──MCP──▶ agentproto-daemon (this proxy)\n * │\n * ├──stdio──▶ chrome-devtools-mcp\n * └──http───▶ goose-bridge\n *\n * v1 design choice: instead of re-registering each upstream tool\n * under a namespaced name (which requires JSON-Schema↔Zod conversion\n * for every exotic shape — recursive refs, oneOf, etc.), the proxy\n * exposes two indirection tools:\n * - `mcp_list_imported_tools(alias?)` lets the operator discover\n * what's available\n * - `mcp_call_imported(alias, toolName, args)` invokes a specific\n * tool, forwarding the JSON args verbatim\n *\n * Trade-off: agents do a 2-step (list → call) instead of seeing the\n * imports directly in their tool palette. We keep tool inputs\n * unconstrained at the MCP layer; validation is the upstream\n * server's job. v2 can re-expose namespaced tools once we ship a\n * solid JSON-Schema → Zod converter.\n *\n * Lifecycle: clients are connected lazily on the first call that\n * touches them and held open until daemon shutdown. The registry\n * notices new/removed imports by stat'ing the imports file's mtime\n * before each call — cheap, avoids forcing the HTTP routes to push.\n */\n\nimport { promises as fs } from \"node:fs\"\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\"\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\"\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\"\nimport {\n loadImportedMcps,\n IMPORTED_MCPS_PATH,\n type ImportedMcpEntry,\n} from \"./mcp-imports.js\"\nimport type { DiscoveredMcp } from \"./mcp-discovery.js\"\n\ninterface ProxyClient {\n entry: ImportedMcpEntry\n /** Live MCP client. Null while a connect is in-flight or after a\n * connection error — the next call retries. */\n client: Client | null\n /** Tools list cached after the first successful fetch. Cleared on\n * disconnect so stale tool names don't survive a reconnect. */\n tools: ProxyToolDescriptor[] | null\n /** Last connection error message, kept so listAliases can surface\n * diagnostics to the operator without re-throwing on every list. */\n lastError: string | null\n}\n\nexport interface ProxyToolDescriptor {\n name: string\n description?: string\n /** JSON Schema as published by the upstream server. Forwarded to\n * the operator verbatim — they read it to figure out args. */\n inputSchema?: unknown\n}\n\nexport interface ProxyAliasSummary {\n alias: string\n importId: string\n source: DiscoveredMcp[\"source\"]\n type: DiscoveredMcp[\"type\"]\n /** \"connected\" | \"error\" | \"pending\" — pending = never tried yet. */\n status: \"connected\" | \"error\" | \"pending\"\n toolCount: number\n lastError?: string\n}\n\nexport interface CallResult {\n ok: true\n result: unknown\n}\nexport interface CallError {\n ok: false\n error: string\n}\nexport type ProxyCallOutcome = CallResult | CallError\n\nexport class McpProxyRegistry {\n private clients = new Map<string, ProxyClient>()\n private lastMtimeMs = 0\n /** Sentinel so we know whether the file has *ever* been read.\n * Distinguishes \"file missing on first call\" (legit empty state)\n * from \"we've read it before and it's gone\" (treat as empty too,\n * but only after closing live clients). */\n private hasReadOnce = false\n\n /**\n * Reload the imports file when its mtime has advanced. Avoids\n * repeated parsing when nothing changed — most calls are no-ops.\n * Disconnects clients whose import was removed; connects the new\n * set lazily (the first call that touches them).\n */\n async ensureCurrent(): Promise<void> {\n let mtimeMs = 0\n try {\n const st = await fs.stat(IMPORTED_MCPS_PATH())\n mtimeMs = st.mtimeMs\n } catch {\n // ENOENT — empty imports state. If we'd previously loaded\n // some, close them.\n mtimeMs = 0\n }\n if (this.hasReadOnce && mtimeMs === this.lastMtimeMs) return\n\n const config = await loadImportedMcps().catch(() => ({\n version: 1 as const,\n imports: [] as ImportedMcpEntry[],\n }))\n const wantedIds = new Set(config.imports.map(e => e.id))\n\n // Drop clients for imports the user removed.\n for (const [id, c] of this.clients.entries()) {\n if (!wantedIds.has(id)) {\n await safeClose(c.client)\n this.clients.delete(id)\n }\n }\n // Add placeholders for new imports — connect lazily.\n for (const entry of config.imports) {\n const existing = this.clients.get(entry.id)\n if (existing) {\n // Snapshot may have changed (user re-imported same id with\n // different command). Detect by comparing serialised\n // snapshots; on mismatch, force reconnect.\n if (\n JSON.stringify(existing.entry.snapshot) !==\n JSON.stringify(entry.snapshot)\n ) {\n await safeClose(existing.client)\n this.clients.set(entry.id, freshPlaceholder(entry))\n } else {\n existing.entry = entry\n }\n } else {\n this.clients.set(entry.id, freshPlaceholder(entry))\n }\n }\n this.lastMtimeMs = mtimeMs\n this.hasReadOnce = true\n }\n\n /**\n * Lazy connect: the first call to `connectIfNeeded(alias)`\n * actually opens the transport + handshakes. Subsequent calls\n * reuse the live client.\n */\n private async connectIfNeeded(alias: string): Promise<ProxyClient | null> {\n await this.ensureCurrent()\n const handle = this.findByAlias(alias)\n if (!handle) return null\n if (handle.client) return handle\n try {\n const client = await openClient(handle.entry)\n handle.client = client\n handle.lastError = null\n // Eagerly fetch tools so listTools doesn't pay the round-trip\n // on next call. Cheap (single tools/list request).\n const t = await client.listTools()\n handle.tools = t.tools.map(toDescriptor)\n return handle\n } catch (err) {\n handle.client = null\n handle.tools = null\n handle.lastError = err instanceof Error ? err.message : String(err)\n return handle\n }\n }\n\n /** Find a client handle by alias *or* import id (defensive — agents\n * sometimes pass the id from `list_imported_mcps`). */\n private findByAlias(aliasOrId: string): ProxyClient | undefined {\n for (const c of this.clients.values()) {\n if (c.entry.alias === aliasOrId) return c\n if (c.entry.id === aliasOrId) return c\n }\n return undefined\n }\n\n async listAliases(): Promise<ProxyAliasSummary[]> {\n await this.ensureCurrent()\n return Array.from(this.clients.values()).map(c => ({\n alias: c.entry.alias,\n importId: c.entry.id,\n source: c.entry.snapshot.source,\n type: c.entry.snapshot.type,\n status: c.client\n ? \"connected\"\n : c.lastError\n ? \"error\"\n : \"pending\",\n toolCount: c.tools?.length ?? 0,\n ...(c.lastError ? { lastError: c.lastError } : {}),\n }))\n }\n\n async listTools(\n alias: string\n ): Promise<{ ok: true; tools: ProxyToolDescriptor[] } | { ok: false; error: string }> {\n const handle = await this.connectIfNeeded(alias)\n if (!handle) return { ok: false, error: `unknown alias \"${alias}\"` }\n if (!handle.client || !handle.tools) {\n return {\n ok: false,\n error: handle.lastError ?? \"client not connected\",\n }\n }\n return { ok: true, tools: handle.tools }\n }\n\n async callTool(\n alias: string,\n toolName: string,\n args: unknown\n ): Promise<ProxyCallOutcome> {\n const handle = await this.connectIfNeeded(alias)\n if (!handle) return { ok: false, error: `unknown alias \"${alias}\"` }\n if (!handle.client) {\n return {\n ok: false,\n error: handle.lastError ?? \"client not connected\",\n }\n }\n try {\n const result = await handle.client.callTool({\n name: toolName,\n arguments:\n args && typeof args === \"object\"\n ? (args as Record<string, unknown>)\n : {},\n })\n return { ok: true, result }\n } catch (err) {\n // Mark the client as dirty — the connection may have died\n // mid-call (process crash, http server restart). The next call\n // re-opens via connectIfNeeded.\n const msg = err instanceof Error ? err.message : String(err)\n if (/closed|disconnect|EPIPE|ECONNRESET/i.test(msg)) {\n await safeClose(handle.client)\n handle.client = null\n handle.tools = null\n handle.lastError = msg\n }\n return { ok: false, error: msg }\n }\n }\n\n async closeAll(): Promise<void> {\n await Promise.all(\n Array.from(this.clients.values()).map(c => safeClose(c.client))\n )\n this.clients.clear()\n }\n}\n\nfunction freshPlaceholder(entry: ImportedMcpEntry): ProxyClient {\n return { entry, client: null, tools: null, lastError: null }\n}\n\nfunction toDescriptor(tool: {\n name: string\n description?: string\n inputSchema?: unknown\n}): ProxyToolDescriptor {\n return {\n name: tool.name,\n ...(tool.description ? { description: tool.description } : {}),\n ...(tool.inputSchema ? { inputSchema: tool.inputSchema } : {}),\n }\n}\n\n/**\n * Replace `${VAR}` and `${VAR:-default}` placeholders in env values\n * with the corresponding `process.env` entry (or default), the same\n * way claude-code / cursor expand mcp-server env. When the variable\n * is unset and no default is given, the placeholder is dropped — the\n * upstream then sees the env var as absent rather than as the\n * literal `${MISSING_VAR}`, which it usually treats as \"use default\n * config\" rather than \"explicit empty token\".\n */\nfunction expandEnvPlaceholders(\n raw: Record<string, string>\n): Record<string, string> {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(raw)) {\n const expanded = v.replace(\n /\\$\\{([A-Z_][A-Z0-9_]*)(?::-([^}]*))?\\}/gi,\n (_match, name: string, fallback: string | undefined) => {\n const fromEnv = process.env[name]\n if (fromEnv !== undefined) return fromEnv\n if (fallback !== undefined) return fallback\n return \"\"\n }\n )\n // Drop the var entirely if it expanded to empty — keeps the\n // upstream from receiving an empty-string token + treating it as\n // a real (but invalid) credential.\n if (expanded.length === 0) continue\n out[k] = expanded\n }\n return out\n}\n\nasync function safeClose(client: Client | null): Promise<void> {\n if (!client) return\n try {\n await client.close()\n } catch {\n // best-effort\n }\n}\n\n/**\n * Open a transport for a discovered MCP. stdio spawns the command;\n * http/sse open over the network. Returns a connected `Client` on\n * success; throws with a useful message on failure.\n */\nasync function openClient(entry: ImportedMcpEntry): Promise<Client> {\n const snap = entry.snapshot\n const client = new Client(\n { name: \"agentproto-daemon-proxy\", version: \"0.1.0\" },\n { capabilities: {} }\n )\n if (snap.type === \"stdio\") {\n if (!snap.command) {\n throw new Error(\n `import \"${entry.alias}\" is stdio but has no command field`\n )\n }\n // claude-code / cursor / vscode all support `${VAR}` placeholders\n // in the env map (and the more permissive `${VAR:-default}`\n // form). Our scanner stores the snapshot verbatim — expand at\n // spawn time so live env changes work without a re-import, and\n // tokens like REPLICATE_API_TOKEN don't end up forwarded as the\n // literal string `${REPLICATE_API_TOKEN}`.\n const expandedEnv = expandEnvPlaceholders(snap.env ?? {})\n const transport = new StdioClientTransport({\n command: snap.command,\n args: snap.args ?? [],\n env: { ...process.env, ...expandedEnv } as Record<string, string>,\n // Pipe stderr so we can include it in the error message instead of\n // surfacing the opaque \"Connection closed\" MCP error code.\n stderr: \"pipe\",\n })\n const stderrBuf: string[] = []\n transport.stderr?.on(\"data\", (chunk: Buffer | string) => {\n stderrBuf.push(typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\"))\n if (stderrBuf.length > 40) stderrBuf.shift()\n })\n try {\n await client.connect(transport)\n } catch (err) {\n const stderrText = stderrBuf.join(\"\").trim()\n const msg = err instanceof Error ? err.message : String(err)\n throw new Error(stderrText ? `${msg}\\nstderr: ${stderrText.slice(-600)}` : msg)\n }\n return client\n }\n if (snap.type === \"http\") {\n if (!snap.url) throw new Error(`import \"${entry.alias}\" has no url`)\n const transport = new StreamableHTTPClientTransport(new URL(snap.url), {\n requestInit: {\n headers: snap.headers ?? {},\n },\n })\n await client.connect(transport)\n return client\n }\n if (snap.type === \"sse\") {\n if (!snap.url) throw new Error(`import \"${entry.alias}\" has no url`)\n const transport = new SSEClientTransport(new URL(snap.url), {\n requestInit: {\n headers: snap.headers ?? {},\n },\n })\n await client.connect(transport)\n return client\n }\n throw new Error(\n `import \"${entry.alias}\" has unsupported transport type \"${snap.type}\"`\n )\n}\n","/**\n * Quick Cloudflare Tunnel provider — zero-credential variant.\n *\n * Spawns `cloudflared tunnel --config <ours>` against an isolated\n * config file we write per-tunnel into the workspace, parses the\n * assigned `*.trycloudflare.com` URL out of cloudflared's stderr.\n * No CF account, no API token, no DNS records. Trade-off: URL is\n * ephemeral (different each run) and there's no Cloudflare Access\n * gating — auth happens at the upstream (gateway bearer token, or\n * whatever the tunneled service does for itself).\n *\n * ## Why we don't use `--url`\n *\n * `cloudflared --url http://...` synthesises an inline ingress block\n * but ALSO merges anything from `~/.cloudflared/config.yml`. If a user\n * has prior named-tunnel config there, hostname-specific rules can\n * shadow the inline rule and every request falls through to the\n * built-in `http_status:404` catch-all (the symptom: cloudflared logs\n * `ingressRule=2 originService=http_status:404` for every request,\n * origin never sees traffic). Writing our own config and passing it\n * via `--config` is hermetic — `~/.cloudflared/config.yml` is ignored\n * entirely, so the URL-forward rule always wins.\n *\n * Use this for: ad-hoc demos, \"let me try this from another machine\n * for 10 minutes\", iterating on the remote-MCP UX before committing\n * to a domain.\n *\n * For: persistent URLs / SSO gating, use the named-CF provider (TBD).\n *\n * ## cloudflared discovery\n *\n * Detected on PATH at start time. Missing → throw with a pointer to\n * the install instructions. We deliberately don't bundle binaries —\n * keeps the OSS package free of platform-specific blobs and defers the\n * \"which version\" maintenance tax.\n */\n\nimport { spawn, type ChildProcess } from \"node:child_process\"\nimport { promisify } from \"node:util\"\nimport { execFile } from \"node:child_process\"\nimport { mkdir, writeFile, rm } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { randomBytes } from \"node:crypto\"\n\nimport type {\n ProviderStartOptions,\n ProviderStartResult,\n RemoteProvider,\n} from \"../remote-controller.js\"\n\nconst execFileAsync = promisify(execFile)\n\nconst URL_REGEX = /https:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com/i\n\nconst STARTUP_TIMEOUT_MS = 30_000\n\nexport function quickTunnelProvider(): RemoteProvider {\n let child: ChildProcess | null = null\n let configPath: string | null = null\n\n return {\n id: \"quick\",\n async start(opts: ProviderStartOptions): Promise<ProviderStartResult> {\n await assertCloudflaredOnPath()\n const targetUrl = `http://${opts.target.host}:${opts.target.port}`\n\n // Per-tunnel sentinel config — the only reason it exists is to\n // override `~/.cloudflared/config.yml` so its ingress rules can't\n // shadow our inline `--url` rule. We deliberately do NOT include\n // an `ingress:` block here: quick-tunnel mode treats `--url` as\n // the routing source of truth, and a stray top-level `ingress:`\n // would fight it. Random suffix avoids collisions when dev\n // restarts overlap.\n const id = randomBytes(4).toString(\"hex\")\n const dir = join(opts.workspace, \".agentproto\")\n await mkdir(dir, { recursive: true })\n configPath = join(dir, `cloudflared-${id}.yml`)\n const configBody = [\n `# generated by agentproto-runtime — sentinel only`,\n `# overrides ~/.cloudflared/config.yml so its ingress rules`,\n `# don't shadow the inline --url rule. Safe to delete when the`,\n `# tunnel is down.`,\n `no-autoupdate: true`,\n `loglevel: debug`,\n ``,\n ].join(\"\\n\")\n await writeFile(configPath, configBody, \"utf8\")\n const proc = spawn(\n \"cloudflared\",\n [\"tunnel\", \"--config\", configPath, \"--url\", targetUrl],\n { stdio: [\"ignore\", \"pipe\", \"pipe\"], shell: false },\n )\n child = proc\n\n const url = await new Promise<string>((resolve, reject) => {\n let settled = false\n const timer = setTimeout(() => {\n if (settled) return\n settled = true\n try {\n proc.kill(\"SIGTERM\")\n } catch {\n /* noop */\n }\n reject(\n new Error(\n `cloudflared did not emit a public URL within ${STARTUP_TIMEOUT_MS / 1000}s`,\n ),\n )\n }, STARTUP_TIMEOUT_MS)\n\n const onData = (chunk: Buffer) => {\n const text = chunk.toString(\"utf8\")\n for (const line of text.split(/\\r?\\n/)) {\n if (line.length > 0) opts.onLog?.(`[cloudflared] ${line}`)\n }\n if (settled) return\n const match = text.match(URL_REGEX)\n if (match) {\n settled = true\n clearTimeout(timer)\n resolve(match[0])\n }\n }\n // cloudflared writes the URL to stderr (it reserves stdout for\n // proxied traffic / structured output in some modes). Watch\n // both for safety.\n proc.stderr?.on(\"data\", onData)\n proc.stdout?.on(\"data\", onData)\n\n proc.once(\"error\", err => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(err)\n })\n proc.once(\"exit\", (code, signal) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(\n new Error(\n `cloudflared exited before emitting a URL (code=${code}, signal=${signal})`,\n ),\n )\n })\n })\n\n // Detach the resolver listener (we already captured the URL); leave\n // the log-forwarder attached so the gateway's RuntimeEvents stream\n // sees ongoing tunnel chatter.\n proc.once(\"exit\", (code, signal) => {\n opts.onLog?.(\n `[cloudflared] exited (code=${code ?? \"?\"} signal=${signal ?? \"-\"})`,\n )\n })\n\n return { publicUrl: url, pid: proc.pid ?? null }\n },\n\n async stop(): Promise<void> {\n const proc = child\n const cfg = configPath\n child = null\n configPath = null\n // Best-effort cleanup of the sentinel config — losing it means a\n // stale `.agentproto/cloudflared-<id>.yml` file, no functional\n // impact. We do this even if the proc never started.\n if (cfg) {\n try {\n await rm(cfg, { force: true })\n } catch {\n /* noop */\n }\n }\n if (!proc || proc.exitCode !== null) return\n proc.kill(\"SIGTERM\")\n // Hard-kill backstop after 3s if cloudflared ignores SIGTERM.\n const timer = setTimeout(() => {\n try {\n proc.kill(\"SIGKILL\")\n } catch {\n /* noop */\n }\n }, 3_000)\n timer.unref()\n await new Promise<void>(resolve => {\n if (proc.exitCode !== null) {\n clearTimeout(timer)\n resolve()\n return\n }\n proc.once(\"exit\", () => {\n clearTimeout(timer)\n resolve()\n })\n })\n },\n }\n}\n\nasync function assertCloudflaredOnPath(): Promise<void> {\n try {\n await execFileAsync(\"cloudflared\", [\"--version\"], { timeout: 3_000 })\n } catch {\n throw new Error(\n \"cloudflared not found on PATH. Install it first:\\n\" +\n \" macOS: brew install cloudflared\\n\" +\n \" Linux: https://pkg.cloudflare.com/index.html\\n\" +\n \" Windows: winget install --id Cloudflare.cloudflared\\n\" +\n \"Or download a prebuilt binary from https://github.com/cloudflare/cloudflared/releases.\",\n )\n }\n}\n","/**\n * RemoteController — owns the gateway's \"publish to the internet\" state.\n *\n * One singleton per gateway. Holds:\n * - the current tunnel provider's child process (cloudflared, …)\n * - the bearer token gating /mcp once the tunnel is up\n * - persisted state in `<workspace>/.agentproto/remote.json`\n *\n * The controller is the *only* component that mutates auth at runtime.\n * The HTTP server reads auth via a getter (see `AuthSource` in\n * http-server.ts), so flipping `enable() / disable()` here takes effect\n * on the next request — no restart, no race.\n *\n * ## Provider model\n *\n * Each provider implements `RemoteProvider` (start / stop / status).\n * v1 ships only `quick` (Cloudflare Quick Tunnel — no API key, no DNS,\n * ephemeral `*.trycloudflare.com` URL). Named CF Tunnel and Tailscale\n * land as additional implementations.\n *\n * ## Token model\n *\n * On enable we generate a 32-byte random bearer token, return it once\n * to the caller, and persist only its sha256 hash to disk. Same model\n * as a Stripe API key — losing the plaintext means rotating, not\n * recovering. This keeps `.agentproto/remote.json` safe to commit by\n * accident (it leaks the URL, not the credential).\n *\n * ## Security note\n *\n * The CF API token (when used by named-tunnel provider) is *never*\n * accepted as MCP tool input. The controller reads it from\n * `~/.config/agentproto/cloudflare.json` or `$CLOUDFLARE_API_TOKEN`.\n * Otherwise a remote agent could exfiltrate it through `remote_enable`.\n */\n\nimport { randomBytes, createHash } from \"node:crypto\"\nimport { mkdir, writeFile, readFile, chmod, rm } from \"node:fs/promises\"\nimport { existsSync } from \"node:fs\"\nimport { join } from \"node:path\"\n\nimport type { AuthOptions } from \"./http-server.js\"\nimport { quickTunnelProvider } from \"./remote-providers/quick.js\"\n\nexport interface RemoteState {\n provider: \"quick\"\n publicUrl: string\n bearerTokenHash: string\n createdAt: string\n /** PID of the supervised tunnel child process, if any. */\n pid: number | null\n /** Local target the tunnel forwards to (host + port). */\n target: { host: string; port: number }\n /**\n * Whether the tunnel exposes the gateway itself (true) or some other\n * local service (false). Bearer auth + loopback bypass only matter\n * for the gateway path; arbitrary-target tunnels are pure passthrough\n * and the daemon does not gate them.\n */\n exposesGateway: boolean\n}\n\nexport interface EnableInput {\n provider?: \"quick\"\n /**\n * Local port to expose. Defaults to the gateway's own port — i.e.\n * \"publish this MCP server.\" Pass any other port to expose a\n * different local service (Supabase 54371, a Vite dev server, …)\n * without spinning up a separate tunnel manager.\n */\n targetPort?: number\n /**\n * Host the tunnel forwards to. Defaults to `127.0.0.1`. Setting it\n * to `localhost` resolves through DNS (IPv6 first on most systems);\n * keep `127.0.0.1` unless the target is explicitly IPv6-bound.\n */\n targetHost?: string\n}\n\nexport interface EnableResult {\n publicUrl: string\n /**\n * Bearer token issued by this gateway. Only meaningful when the\n * tunnel exposes the gateway itself (default). For arbitrary-target\n * tunnels (`targetPort != gateway.port`) the daemon does not gate\n * the proxied service, and this is omitted.\n */\n bearerToken?: string\n /**\n * `<publicUrl>/mcp`. Only emitted when exposing the gateway.\n */\n mcpEndpoint?: string\n /**\n * Paste-ready `.mcp.json` snippet. Only emitted when exposing the\n * gateway.\n */\n mcpConfigSnippet?: string\n provider: \"quick\"\n target: { host: string; port: number }\n exposesGateway: boolean\n}\n\nexport interface RemoteStatus {\n enabled: boolean\n provider?: \"quick\"\n publicUrl?: string\n pid?: number | null\n createdAt?: string\n target?: { host: string; port: number }\n exposesGateway?: boolean\n /** Last error from the provider, if any (since last enable). */\n lastError?: string\n}\n\n/**\n * A pluggable tunnel provider.\n *\n * `start` returns the public URL once the upstream tunnel is ready\n * (e.g. for cloudflared, after parsing the trycloudflare.com URL out of\n * its stderr). `stop` is idempotent — calling it twice or on an\n * already-dead child must not throw.\n */\nexport interface RemoteProvider {\n readonly id: \"quick\"\n start(opts: ProviderStartOptions): Promise<ProviderStartResult>\n stop(): Promise<void>\n}\n\nexport interface ProviderStartOptions {\n /** Local target the tunnel forwards to. */\n target: { host: string; port: number }\n /** Workspace path — for log / state files. */\n workspace: string\n /** Called whenever the provider has a status update worth logging. */\n onLog?: (line: string) => void\n}\n\nexport interface ProviderStartResult {\n publicUrl: string\n pid: number | null\n}\n\nexport interface RemoteControllerOptions {\n workspace: string\n port: number\n /** Hook for surfacing provider logs through RuntimeEvents. */\n onLog?: (line: string) => void\n}\n\nconst STATE_FILE_REL = \".agentproto/remote.json\"\n\nexport class RemoteController {\n private state: RemoteState | null = null\n private bearerToken: string | null = null\n private provider: RemoteProvider | null = null\n private lastError: string | undefined\n private readonly opts: RemoteControllerOptions\n\n constructor(opts: RemoteControllerOptions) {\n this.opts = opts\n }\n\n /**\n * Auth getter handed to startHttpServer. The HTTP server calls this\n * on every request so flipping enable/disable is effective without\n * a restart.\n */\n readonly readAuth = (): AuthOptions => {\n if (this.bearerToken === null) return { mode: \"none\" }\n return { mode: \"bearer\", token: this.bearerToken }\n }\n\n status(): RemoteStatus {\n if (!this.state) {\n return { enabled: false, lastError: this.lastError }\n }\n return {\n enabled: true,\n provider: this.state.provider,\n publicUrl: this.state.publicUrl,\n pid: this.state.pid,\n createdAt: this.state.createdAt,\n target: this.state.target,\n exposesGateway: this.state.exposesGateway,\n lastError: this.lastError,\n }\n }\n\n async enable(input: EnableInput): Promise<EnableResult> {\n if (this.state) {\n // Idempotent: returning the existing config would leak the\n // bearer token (we only have the hash). Force teardown first so\n // re-enable always rotates the token. Surface this in the docs.\n throw new Error(\n \"remote tunnel already active — call remote_disable first to rotate\",\n )\n }\n const providerId = input.provider ?? \"quick\"\n const provider = pickProvider(providerId)\n this.lastError = undefined\n\n const target = {\n host: input.targetHost ?? \"127.0.0.1\",\n port: input.targetPort ?? this.opts.port,\n }\n const exposesGateway =\n target.host === \"127.0.0.1\" && target.port === this.opts.port\n\n let started: ProviderStartResult\n try {\n started = await provider.start({\n target,\n workspace: this.opts.workspace,\n onLog: line => {\n this.opts.onLog?.(line)\n },\n })\n } catch (err) {\n this.lastError = errToMessage(err)\n throw err\n }\n\n // Bearer auth + token issuance only matter when the tunnel exposes\n // *this* gateway. For arbitrary-target tunnels (e.g. Supabase on\n // 54371) the daemon is just provisioning a public passthrough; the\n // proxied service does its own authn.\n let bearerToken: string | null = null\n let bearerTokenHash = \"\"\n if (exposesGateway) {\n bearerToken = randomBytes(32).toString(\"base64url\")\n bearerTokenHash = sha256(bearerToken)\n }\n\n const state: RemoteState = {\n provider: providerId,\n publicUrl: started.publicUrl,\n bearerTokenHash,\n createdAt: new Date().toISOString(),\n pid: started.pid,\n target,\n exposesGateway,\n }\n\n this.state = state\n this.bearerToken = bearerToken\n this.provider = provider\n\n await persistState(this.opts.workspace, state)\n\n const result: EnableResult = {\n provider: providerId,\n publicUrl: started.publicUrl,\n target,\n exposesGateway,\n }\n if (exposesGateway && bearerToken) {\n const mcpEndpoint = `${started.publicUrl}/mcp`\n result.bearerToken = bearerToken\n result.mcpEndpoint = mcpEndpoint\n result.mcpConfigSnippet = buildMcpConfigSnippet(mcpEndpoint, bearerToken)\n }\n return result\n }\n\n async disable(): Promise<{ disabled: boolean }> {\n if (!this.state) return { disabled: false }\n const provider = this.provider\n this.state = null\n this.bearerToken = null\n this.provider = null\n if (provider) {\n try {\n await provider.stop()\n } catch (err) {\n this.lastError = errToMessage(err)\n }\n }\n await clearState(this.opts.workspace)\n return { disabled: true }\n }\n\n /**\n * Stop the provider on gateway shutdown. Does NOT clear persisted\n * state — that survives across restarts so the user can `remote_status`\n * after rebooting and see \"stale state, run remote_enable to refresh\".\n * (Stale-recovery semantics land in v2; today we just leave the file.)\n */\n async shutdown(): Promise<void> {\n if (this.provider) {\n try {\n await this.provider.stop()\n } catch {\n /* swallow — gateway is shutting down anyway */\n }\n }\n }\n}\n\n// ── helpers ────────────────────────────────────────────────────────────\n\nfunction pickProvider(id: \"quick\"): RemoteProvider {\n if (id === \"quick\") return quickTunnelProvider()\n // Exhaustive guard — adding \"named-cf\" / \"tailscale\" later forces this\n // switch to be updated, otherwise TS will yell.\n const _exhaustive: never = id\n throw new Error(`unknown remote provider: ${String(_exhaustive)}`)\n}\n\nfunction sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\")\n}\n\nfunction errToMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err)\n}\n\nasync function persistState(workspace: string, state: RemoteState): Promise<void> {\n const dir = join(workspace, \".agentproto\")\n await mkdir(dir, { recursive: true })\n const file = join(dir, \"remote.json\")\n await writeFile(file, JSON.stringify(state, null, 2) + \"\\n\", \"utf8\")\n // mode 0600 — even though we only persist the hash, the URL itself\n // is sensitive (knowing it lets an attacker brute-force the token).\n try {\n await chmod(file, 0o600)\n } catch {\n /* best-effort on platforms where chmod is a noop */\n }\n}\n\nasync function clearState(workspace: string): Promise<void> {\n const file = join(workspace, \".agentproto/remote.json\")\n if (!existsSync(file)) return\n await rm(file, { force: true })\n}\n\n/**\n * Best-effort load of persisted state on boot. We don't restore the\n * bearer token from this — the hash is one-way — so a rebooted gateway\n * that finds a stale `remote.json` will surface it via `remote_status`\n * and require a fresh `remote_enable` to mint a new token.\n *\n * Exposed mostly for diagnostics; not used by the controller today.\n */\nexport async function loadPersistedState(\n workspace: string,\n): Promise<RemoteState | null> {\n const file = join(workspace, STATE_FILE_REL)\n if (!existsSync(file)) return null\n try {\n const raw = await readFile(file, \"utf8\")\n return JSON.parse(raw) as RemoteState\n } catch {\n return null\n }\n}\n\nfunction buildMcpConfigSnippet(endpoint: string, token: string): string {\n return JSON.stringify(\n {\n mcpServers: {\n \"agentproto-remote\": {\n transport: \"http\",\n url: endpoint,\n headers: { Authorization: `Bearer ${token}` },\n },\n },\n },\n null,\n 2,\n )\n}\n","/**\n * MCP tools that drive RemoteController — the gateway's \"publish to\n * the internet\" surface.\n *\n * Three tools, mirroring the controller's lifecycle:\n *\n * remote_enable — bring up a tunnel, mint bearer token, return the\n * public /mcp URL + a paste-ready .mcp.json snippet\n * remote_disable — tear down tunnel, revoke token, drop bearer auth\n * remote_status — read-only — provider, URL, pid, lastError\n *\n * Why this lives on the MCP surface (not a separate CLI):\n * - The user already has an MCP client connected (that's how they\n * started talking to the gateway in the first place). One tool call\n * replaces an entire CLI install + auth dance.\n * - The bearer token comes back as part of the MCP response, so it\n * doesn't have to land on the user's clipboard.\n */\n\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\"\nimport { z } from \"zod\"\n\nimport type { RemoteController } from \"./remote-controller.js\"\n\nexport interface RegisterRemoteToolsOptions {\n controller: RemoteController\n}\n\nfunction text(value: string | object): {\n content: Array<{ type: \"text\"; text: string }>\n} {\n return {\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value, null, 2),\n },\n ],\n }\n}\n\nexport function registerRemoteTools(\n server: McpServer,\n opts: RegisterRemoteToolsOptions,\n): void {\n const { controller } = opts\n\n server.tool(\n \"remote_enable\",\n \"Publish a local port to the internet via Cloudflare. By default exposes \" +\n \"this gateway and gates it with a bearer token (returned ONCE in the \" +\n \"response — store it; only its hash is persisted). Pass `targetPort` to \" +\n \"tunnel a different local service (Supabase, dev server, …); in that mode \" +\n \"the daemon does not gate the proxied traffic — the upstream service \" +\n \"handles its own auth. Returns the public URL plus a paste-ready \" +\n \"`.mcp.json` snippet (gateway mode only). Re-running while a tunnel is \" +\n \"already up errors; call `remote_disable` first to rotate.\",\n {\n provider: z\n .enum([\"quick\"])\n .optional()\n .describe(\n \"Tunnel backend. `quick` = Cloudflare Quick Tunnel (no API key, ephemeral *.trycloudflare.com URL). Defaults to `quick`. Named-CF / Tailscale providers TBD.\",\n ),\n targetPort: z\n .number()\n .int()\n .min(1)\n .max(65535)\n .optional()\n .describe(\n \"Local port to expose. Defaults to this gateway's own port (= publish the MCP server). Pass another port to tunnel a different local service (e.g. 54371 for Supabase) — in that mode bearer auth is OFF since the upstream handles its own gating.\",\n ),\n targetHost: z\n .string()\n .optional()\n .describe(\n \"Host the tunnel forwards to. Defaults to `127.0.0.1`. Use `localhost` only if the target is explicitly IPv6-bound; cloudflared resolves DNS and IPv6-first lookups can break IPv4-only origins.\",\n ),\n },\n async ({ provider, targetPort, targetHost }) => {\n const result = await controller.enable({ provider, targetPort, targetHost })\n return text(result)\n },\n )\n\n server.tool(\n \"remote_disable\",\n \"Tear down the active remote tunnel and drop bearer auth back to \" +\n \"loopback-only. Idempotent — calling when no tunnel is active is a no-op.\",\n {},\n async () => {\n const result = await controller.disable()\n return text(result)\n },\n )\n\n server.tool(\n \"remote_status\",\n \"Report whether a remote tunnel is active. When active: provider, \" +\n \"public URL, supervised PID, createdAt. The bearer token itself is \" +\n \"never returned by status — it was shown once at enable.\",\n {},\n async () => {\n return text(controller.status())\n },\n )\n}\n","/**\n * `WorkspaceFs` — minimal `readFile` / `writeFile` adapter over a\n * workspace directory. Mirrors the `McpWorkspace.filesystem` shape\n * used by `@guilde/mcp` so the daemon can be plugged in as the\n * workspace backend for a Guilde MCP server (via its\n * `loadGuildWorkspace` injection point) without re-shimming.\n *\n * All paths are workspace-relative. Absolute paths are rejected to\n * keep the surface predictable when the daemon binds to a public\n * port.\n */\n\nimport { existsSync } from \"node:fs\"\nimport { mkdir, readFile as fsReadFile, writeFile as fsWriteFile } from \"node:fs/promises\"\nimport { dirname, isAbsolute, join, normalize, relative, resolve } from \"node:path\"\n\nexport interface WorkspaceFs {\n readFile(path: string): Promise<string>\n writeFile(path: string, content: string | Uint8Array): Promise<void>\n exists(path: string): Promise<boolean>\n}\n\nexport interface CreateWorkspaceFsOptions {\n /** Absolute path to the workspace root. */\n workspace: string\n}\n\nexport class WorkspacePathError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"WorkspacePathError\"\n }\n}\n\nexport function createWorkspaceFs(opts: CreateWorkspaceFsOptions): WorkspaceFs {\n const root = resolve(opts.workspace)\n\n function resolvePath(path: string): string {\n if (typeof path !== \"string\" || path.length === 0) {\n throw new WorkspacePathError(\"path must be a non-empty string\")\n }\n if (isAbsolute(path)) {\n throw new WorkspacePathError(\n \"absolute paths are not allowed; use a workspace-relative path\",\n )\n }\n const joined = normalize(join(root, path))\n const rel = relative(root, joined)\n if (rel.startsWith(\"..\") || isAbsolute(rel)) {\n throw new WorkspacePathError(\n `path escapes the workspace: '${path}'`,\n )\n }\n return joined\n }\n\n return {\n async readFile(path) {\n const abs = resolvePath(path)\n const buf = await fsReadFile(abs)\n return buf.toString(\"utf8\")\n },\n async writeFile(path, content) {\n const abs = resolvePath(path)\n await mkdir(dirname(abs), { recursive: true })\n await fsWriteFile(abs, content)\n },\n async exists(path) {\n try {\n const abs = resolvePath(path)\n return existsSync(abs)\n } catch {\n return false\n }\n },\n }\n}\n","/**\n * @agentproto/runtime — long-running gateway around an agentproto\n * workspace dir.\n *\n * Composes:\n * - `@agentproto/mcp-server` (CRUD verbs over registered specs)\n * - HTTP transport (Streamable HTTP) on a configurable port\n * - HEARTBEAT.md autonomy loop\n * - Append-only conversation persistence (`conversations/<id>.md`)\n * - Workspace filesystem adapter (compatible with the\n * `McpWorkspace.filesystem` shape used by `@guilde/mcp`)\n *\n * Single entry point: `createGateway(opts)`. Returns a handle with\n * `url` and `stop()` — the rest of the surface lives on the HTTP\n * server.\n */\n\nimport { randomUUID } from \"node:crypto\"\nimport { existsSync } from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport { join, resolve } from \"node:path\"\nimport { createMcpServer } from \"@agentproto/mcp-server\"\nimport type { DoctypeSpec } from \"@agentproto/manifest\"\n\nimport { writeRuntimeMeta } from \"./agentproto-dir.js\"\nimport { registerCommandTools } from \"./command-tools.js\"\nimport { fileConversationStore } from \"./conversations.js\"\nimport { createRuntimeEvents } from \"./events.js\"\nimport { registerFsTools } from \"./fs-tools.js\"\nimport { registerSessionTools } from \"./session-tools.js\"\nimport { startHeartbeat, type BuildHeartbeatAgent } from \"./heartbeat.js\"\nimport {\n startHttpServer,\n type AuthOptions,\n type AgentAdapterResolver,\n type AgentAdapterLister,\n} from \"./http-server.js\"\nimport {\n createSessionsRegistry,\n type SessionsRegistry,\n type PtyFactory,\n} from \"./sessions.js\"\nimport { McpProxyRegistry } from \"./mcp-proxy.js\"\n\nexport type {\n AgentAdapterResolver,\n AgentAdapterLister,\n AdapterListEntry,\n} from \"./http-server.js\"\nexport type {\n AgentSessionLike,\n AgentStreamEvent,\n SessionDescriptor,\n SessionKind,\n SessionStatus,\n SpawnSessionInput,\n SpawnAgentInput,\n SessionsRegistry,\n} from \"./sessions.js\"\nimport { RemoteController } from \"./remote-controller.js\"\nimport { registerRemoteTools } from \"./remote-tools.js\"\nimport { createWorkspaceFs, type WorkspaceFs } from \"./workspace-fs.js\"\n\nexport type { ConversationStore, ConversationMeta, ConversationTurn } from \"./conversations.js\"\nexport type { HeartbeatRunner, BuildHeartbeatAgent, HeartbeatAgent } from \"./heartbeat.js\"\nexport type { RuntimeEvent, RuntimeEvents } from \"./events.js\"\nexport type { WorkspaceFs } from \"./workspace-fs.js\"\nexport { parseDuration } from \"./heartbeat.js\"\nexport { createWorkspaceFs } from \"./workspace-fs.js\"\nexport {\n sweepStaleRuntimeMetas,\n unlinkRuntimeMeta,\n readRuntimeMeta,\n type RuntimeMeta,\n} from \"./agentproto-dir.js\"\nexport { fileConversationStore } from \"./conversations.js\"\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySpec = DoctypeSpec<any, any>\n\nexport interface CreateGatewayOptions {\n /** Absolute path to the workspace dir. */\n workspace: string\n /** AIP doctype specs to expose as MCP CRUD verbs. */\n specs: readonly AnySpec[]\n /** Port to bind. Default 18790. */\n port?: number\n /** Bind host. Default `127.0.0.1` (loopback). Set `0.0.0.0` for LAN. */\n bind?: string\n /** Auth mode. Default `none` (safe only on loopback). */\n auth?: AuthOptions\n /**\n * Resolves a heartbeat-runnable agent from its workspace id.\n * Required for HEARTBEAT.md to do anything; without it ticks emit\n * `heartbeat-error` events instead of generating.\n */\n buildAgent?: BuildHeartbeatAgent\n /** Server name advertised over MCP. */\n name?: string\n /** Server version advertised over MCP. */\n version?: string\n /**\n * Run BOOT.md once at startup. Pass `false` to disable. Defaults to\n * `true`. The boot file is plain markdown — frontmatter-free; the\n * agent named in `defaultBootAgent` (or skipped if unset) gets the\n * body as a single prompt and the reply is appended to a `boot-<iso>`\n * conversation.\n */\n boot?: boolean\n /** Agent id used for BOOT.md if no per-file frontmatter. */\n defaultBootAgent?: string\n /** Optional adapter resolver — when provided, enables\n * `POST /sessions/agent` (long-running agent CLIs like\n * claude-code / hermes via the @agentproto/cli adapter system).\n * Without this, /sessions still works for raw `argv` spawns. */\n resolveAgentAdapter?: AgentAdapterResolver\n /** Optional adapter lister — when provided, enables\n * `GET /adapters` HTTP route + `list_adapters` MCP tool so UIs\n * can discover what's installed on the host. */\n listAgentAdapters?: AgentAdapterLister\n /** Optional PTY factory (node-pty wrapper, typically from the cli\n * layer's `loadNodePtyFactory()`). When provided, enables\n * `POST /sessions/terminal`, the `start_terminal_session` MCP\n * tool family, and the `/sessions/:id/pty` WebSocket. Without it,\n * those routes return 501 / the MCP tools aren't registered. */\n spawnPty?: PtyFactory\n /** Override the per-boot bearer token. Default: `randomUUID()`.\n * Tests can pin a known value; production should always let\n * the gateway generate fresh. The token is written into\n * `<workspace>/.agentproto/runtime.json` (mode 0600) and required\n * on mutating `/sessions/*` routes + the PTY WS upgrade. */\n token?: string\n /** Trusted browser origins allowed to drive mutating routes\n * without a bearer token. See `RuntimeHttpServerOptions.allowedOrigins`\n * for match semantics. Default: localhost on any port. */\n allowedOrigins?: readonly string[]\n /** When true, drop the localhost-wildcard defaults — only the\n * explicit `allowedOrigins` list is honoured. */\n strictOrigins?: boolean\n}\n\nexport interface GatewayHandle {\n url: string\n workspace: string\n workspaceFs: WorkspaceFs\n registered: readonly string[]\n /** Sessions registry — exposed so MCP tools / external spawners\n * inside the same process can register their child processes for\n * visibility through /sessions and the CLI TUI. */\n sessions: SessionsRegistry\n /** Per-boot bearer token required on mutating /sessions/* routes\n * + WS PTY upgrades. Exposed so an embedding host (e.g. the CLI\n * shell that hosts the gateway in-process) can pass it to child\n * tools without re-reading the runtime.json file. */\n token: string\n stop(): Promise<void>\n}\n\n/**\n * Spin up the gateway. Order:\n * 1. Build MCP server + load AIP-40 extensions\n * 2. Build conversation store + workspace fs adapter\n * 3. (optional) Run BOOT.md once\n * 4. Start HTTP server\n * 5. Start heartbeat ticker\n *\n * `stop()` reverses 4–5 (heartbeat first, then HTTP). The MCP server\n * is owned by the HTTP server's per-session transports and is closed\n * implicitly when those close.\n */\nexport async function createGateway(\n opts: CreateGatewayOptions,\n): Promise<GatewayHandle> {\n const workspace = resolve(opts.workspace)\n if (!existsSync(workspace)) {\n throw new Error(`runtime: workspace dir does not exist: ${workspace}`)\n }\n const port = opts.port ?? 18790\n\n const events = createRuntimeEvents()\n const conversations = fileConversationStore({ workspace })\n const workspaceFs = createWorkspaceFs({ workspace })\n\n // Singleton controller for \"publish to the internet\" state. Created\n // disabled — auth stays `mode: \"none\"` until `remote_enable` is\n // called. Tunnel logs flow through the events stream so `/events`\n // subscribers see cloudflared chatter.\n const remote = new RemoteController({\n workspace,\n port,\n onLog: line =>\n events.emit({\n type: \"remote-log\",\n at: new Date().toISOString(),\n line,\n }),\n })\n\n // Build a server once eagerly so we can capture `registered` for\n // `/health`. The server is NOT used for serving — every `/mcp`\n // request gets its own freshly-constructed pair, mirroring the\n // SDK's official stateless pattern. See the comment on\n // `RuntimeHttpServerOptions.mcpServerFactory` for why.\n const { registered } = await createMcpServer({\n specs: opts.specs,\n workspace,\n name: opts.name ?? \"agentproto-runtime\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n\n // Sessions registry — single instance per gateway, captured by\n // the per-request mcpServerFactory closure below + handed to\n // startHttpServer for the /sessions HTTP routes. Declared here\n // (above the factory) so its identifier is visible at closure-\n // build time, even though the factory only invokes later.\n const sessions = createSessionsRegistry({\n ...(opts.spawnPty ? { spawnPty: opts.spawnPty } : {}),\n // Resume hook: when a prompt arrives for a dead agent-cli row\n // (typical after daemon restart), the registry calls back into\n // the adapter resolver to re-create the AgentSession with\n // `resumeSessionId = adapterSessionId`. ACP semantics: the\n // upstream provider reattaches to the prior conversation.\n // Unwired (no resolveAgentAdapter) → legacy \"not an agent\n // session\" error, user must spawn fresh.\n ...(opts.resolveAgentAdapter\n ? {\n resumeAgent: async ({ adapterSlug, cwd, resumeSessionId }) => {\n const adapter = await opts.resolveAgentAdapter!(adapterSlug)\n if (!adapter) return null\n try {\n return await adapter.startSession({ cwd, resumeSessionId })\n } catch (err) {\n console.warn(\n `[agentproto] resumeAgent('${adapterSlug}', ${resumeSessionId}) failed: ${\n err instanceof Error ? err.message : String(err)\n }`\n )\n return null\n }\n },\n }\n : {}),\n })\n\n // Per-boot bearer token. Required on mutating /sessions/* routes\n // and on the WS upgrade for /sessions/:id/pty. Persisted to\n // runtime.json (mode 0600) so the same-user CLI can read it; a\n // browser-loaded localhost page can't.\n const token = opts.token ?? randomUUID()\n\n // MCP proxy — single registry that holds open Client connections\n // to every imported MCP server. The per-request mcpServerFactory\n // captures it so each /mcp request reuses the same upstream\n // sessions instead of re-spawning stdio children.\n const mcpProxy = new McpProxyRegistry()\n\n const mcpServerFactory = async () => {\n const { server } = await createMcpServer({\n specs: opts.specs,\n workspace,\n name: opts.name ?? \"agentproto-runtime\",\n version: opts.version ?? \"0.1.0-alpha\",\n })\n // Canonical filesystem tools so remote MCP clients (cloud\n // workspace-providers, IDEs, ad-hoc tooling) can read/write the\n // workspace without each implementing AIP-aware glue. Names match\n // `@modelcontextprotocol/server-filesystem` for drop-in compat.\n registerFsTools(server, { workspace })\n // Subprocess execution — the runtime's superpower for cloud\n // agents. Any allowlisted CLI on the user's machine (claude, gh,\n // pnpm, …) is reachable via `execute_command`. Allowlist lives at\n // `.agentproto/allowed-commands.json`; default-deny.\n registerCommandTools(server, { workspace })\n // Remote-tunnel lifecycle. The controller is a singleton on the\n // gateway, so registering its tools per-request is just rebinding\n // the same closures — the underlying state lives in `remote`.\n registerRemoteTools(server, { controller: remote })\n // Agent-session orchestration — operators (Mastra agents in\n // cloud Guilde, Claude Code as a sub-agent, …) drive long-running\n // claude/hermes/aider sessions on the user's machine through\n // these MCP tools. The registry + adapter resolver are\n // singletons on the gateway, same closure-rebind pattern.\n registerSessionTools(server, {\n registry: sessions,\n mcpProxy,\n ptyEnabled: opts.spawnPty != null,\n ...(opts.resolveAgentAdapter\n ? { resolveAgentAdapter: opts.resolveAgentAdapter }\n : {}),\n ...(opts.listAgentAdapters\n ? { listAgentAdapters: opts.listAgentAdapters }\n : {}),\n })\n return server\n }\n\n // ── boot ─────────────────────────────────────────────────────────\n if (opts.boot !== false) {\n await runBoot(workspace, opts, conversations, events).catch((err) => {\n events.emit({\n type: \"heartbeat-error\",\n at: new Date().toISOString(),\n agent: opts.defaultBootAgent,\n error: `BOOT.md failed: ${err instanceof Error ? err.message : String(err)}`,\n })\n })\n }\n\n const heartbeat = startHeartbeat({\n workspace,\n conversations,\n events,\n buildAgent: opts.buildAgent ?? noopBuildAgent,\n })\n\n const http = await startHttpServer({\n port,\n bind: opts.bind,\n // Auth is read on every request via this getter. `opts.auth`\n // (when provided) is the startup default and represents the\n // operator's intent — bearer-only deployments stay bearer-only\n // even when no remote tunnel is up. The controller's auth wins\n // once a tunnel is enabled (it issues a fresh token); on disable\n // we fall back to `opts.auth` if set, otherwise `mode: \"none\"`.\n auth: () => {\n const remoteAuth = remote.readAuth()\n if (remoteAuth.mode === \"bearer\") return remoteAuth\n return opts.auth ?? { mode: \"none\" }\n },\n mcpServerFactory,\n conversations,\n events,\n heartbeat,\n sessions,\n mcpProxy,\n token,\n ptyEnabled: opts.spawnPty != null,\n ...(opts.allowedOrigins ? { allowedOrigins: opts.allowedOrigins } : {}),\n ...(opts.strictOrigins ? { strictOrigins: true } : {}),\n ...(opts.resolveAgentAdapter\n ? { resolveAgentAdapter: opts.resolveAgentAdapter }\n : {}),\n ...(opts.listAgentAdapters\n ? { listAgentAdapters: opts.listAgentAdapters }\n : {}),\n meta: { workspace, registered },\n })\n\n heartbeat.start()\n events.emit({\n type: \"boot\",\n at: new Date().toISOString(),\n workspace,\n registered,\n })\n\n // Record a snapshot of the running config so external tooling /\n // shell users can introspect a live gateway via\n // `cat <workspace>/.agentproto/runtime.json`. Best-effort — failure\n // here doesn't gate the gateway being functional.\n void writeRuntimeMeta(workspace, {\n workspace,\n port,\n bind: opts.bind ?? \"127.0.0.1\",\n pid: process.pid,\n startedAt: new Date().toISOString(),\n name: opts.name ?? \"agentproto-runtime\",\n registered,\n token,\n })\n\n return {\n url: http.url,\n workspace,\n workspaceFs,\n registered,\n sessions,\n token,\n async stop() {\n heartbeat.stop()\n // Kill all live sessions before tearing down HTTP — otherwise\n // long-running children inherit the daemon's listening socket\n // and stay around as zombies after the parent exits.\n sessions.shutdown()\n // Close upstream MCP clients (their stdio children would\n // otherwise leak the same way).\n await mcpProxy.closeAll()\n // Tear the tunnel before the HTTP listener — otherwise cloudflared\n // briefly proxies to a dead port and surfaces 502s to any in-flight\n // remote client.\n await remote.shutdown()\n await http.stop()\n },\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────\n\nconst noopBuildAgent: BuildHeartbeatAgent = async () => null\n\nasync function runBoot(\n workspace: string,\n opts: CreateGatewayOptions,\n conversations: import(\"./conversations.js\").ConversationStore,\n events: import(\"./events.js\").RuntimeEvents,\n): Promise<void> {\n const path = join(workspace, \"BOOT.md\")\n if (!existsSync(path)) return\n const body = (await readFile(path, \"utf8\")).trim()\n if (!body) return\n if (!opts.buildAgent || !opts.defaultBootAgent) return\n\n const agent = await opts.buildAgent(opts.defaultBootAgent)\n if (!agent) return\n\n const conversationId = `boot-${new Date().toISOString().slice(0, 19).replace(/[:.]/g, \"-\")}`\n await conversations.open(conversationId, { agent: opts.defaultBootAgent })\n await conversations.appendTurn(conversationId, \"user\", body, {\n attribution: \"boot\",\n })\n const reply = await agent.generate(body)\n await conversations.appendTurn(conversationId, \"assistant\", reply.text, {\n attribution: opts.defaultBootAgent,\n })\n events.emit({\n type: \"heartbeat-fired\",\n at: new Date().toISOString(),\n agent: opts.defaultBootAgent,\n conversationId,\n prompt: body,\n reply: reply.text,\n durationMs: 0,\n })\n}\n","/**\n * `agentproto workspace <subcommand>`\n *\n * Subcommands:\n * add <path> [--slug <slug>] [--label <text>] register a folder\n * list show registered + active\n * remove <slug> drop an entry\n * use <slug> set the active workspace\n *\n * Reads/writes `~/.agentproto/workspaces.json` via @agentproto/runtime.\n * Pure CLI shell — no daemon needed; the daemon picks up the file on\n * its next read (boot for now, hot reload TBD).\n */\nimport { parseArgs } from \"node:util\"\nimport { resolve, basename } from \"node:path\"\nimport { existsSync } from \"node:fs\"\nimport {\n loadWorkspacesConfig,\n saveWorkspacesConfig,\n addWorkspace,\n removeWorkspace,\n setActiveWorkspace,\n sanitizeSlug,\n DEFAULT_CONFIG_PATH,\n type WorkspaceEntry,\n} from \"@agentproto/runtime/workspaces-config\"\n\nconst USAGE = `agentproto workspace — manage local workspaces\n\nUsage:\n agentproto workspace add <path> [--slug <slug>] [--label <text>]\n agentproto workspace list [--json]\n agentproto workspace remove <slug>\n agentproto workspace use <slug>\n agentproto workspace --help\n\nConfig file: ${DEFAULT_CONFIG_PATH()}\n`\n\nexport async function runWorkspace(args: readonly string[]): Promise<number> {\n if (args.length === 0 || args.includes(\"--help\") || args.includes(\"-h\")) {\n process.stdout.write(USAGE)\n return 0\n }\n const sub = args[0]\n const rest = args.slice(1)\n switch (sub) {\n case \"add\":\n return runAdd(rest)\n case \"list\":\n case \"ls\":\n return runList(rest)\n case \"remove\":\n case \"rm\":\n return runRemove(rest)\n case \"use\":\n return runUse(rest)\n default:\n process.stderr.write(\n `agentproto workspace: unknown subcommand '${sub}'\\n\\n${USAGE}`\n )\n return 2\n }\n}\n\nasync function runAdd(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n slug: { type: \"string\" },\n label: { type: \"string\" },\n },\n })\n const rawPath = positionals[0]\n if (!rawPath) {\n process.stderr.write(\n \"agentproto workspace add: missing <path>. Try: agentproto workspace add ~/code/my-project\\n\"\n )\n return 2\n }\n const absPath = resolve(rawPath.replace(/^~/, process.env.HOME ?? \"~\"))\n if (!existsSync(absPath)) {\n process.stderr.write(\n `agentproto workspace add: \"${absPath}\" doesn't exist. Create the directory first or pass an existing one.\\n`\n )\n return 2\n }\n const slug = sanitizeSlug(values.slug ?? basename(absPath))\n const config = await loadWorkspacesConfig()\n const next = addWorkspace(config, {\n slug,\n path: absPath,\n ...(values.label ? { label: values.label } : {}),\n })\n await saveWorkspacesConfig(next)\n const wasActive = config.active === slug\n const becameActive = next.active === slug && !wasActive\n process.stdout.write(\n `✓ ${slug} → ${absPath}` +\n (becameActive ? \" (set as active — first registered workspace)\" : \"\") +\n \"\\n\"\n )\n return 0\n}\n\nasync function runList(args: readonly string[]): Promise<number> {\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: { json: { type: \"boolean\" } },\n })\n const config = await loadWorkspacesConfig()\n if (values.json) {\n process.stdout.write(JSON.stringify(config, null, 2) + \"\\n\")\n return 0\n }\n if (config.workspaces.length === 0) {\n process.stdout.write(\n \"No workspaces registered.\\n\" +\n \"Add one with: agentproto workspace add <path>\\n\"\n )\n return 0\n }\n // Compact two-column layout — slug left, path right, with an\n // active marker. Sorted by updatedAt desc so the most recently\n // touched workspace is at the top.\n const sorted = [...config.workspaces].sort((a, b) =>\n b.updatedAt.localeCompare(a.updatedAt)\n )\n const slugCol = Math.max(...sorted.map(w => w.slug.length), 6)\n for (const w of sorted) {\n const marker = w.slug === config.active ? \"●\" : \" \"\n const slugCell = w.slug.padEnd(slugCol)\n const labelSuffix = w.label ? ` (${w.label})` : \"\"\n process.stdout.write(\n `${marker} ${slugCell} ${w.path}${labelSuffix}\\n`\n )\n }\n process.stdout.write(\n `\\n${sorted.length} workspace${sorted.length === 1 ? \"\" : \"s\"}` +\n (config.active ? `, active: ${config.active}` : \", no active\") +\n \"\\n\"\n )\n return 0\n}\n\nasync function runRemove(args: readonly string[]): Promise<number> {\n const { positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {},\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto workspace remove: missing <slug>.\\n\"\n )\n return 2\n }\n const config = await loadWorkspacesConfig()\n const sanitised = sanitizeSlug(slug)\n const existed = config.workspaces.some(w => w.slug === sanitised)\n if (!existed) {\n process.stderr.write(\n `agentproto workspace remove: no workspace named \"${sanitised}\".\\n`\n )\n return 2\n }\n const next = removeWorkspace(config, sanitised)\n await saveWorkspacesConfig(next)\n process.stdout.write(`✗ removed ${sanitised}\\n`)\n if (next.active && next.active !== config.active) {\n process.stdout.write(` active reassigned to: ${next.active}\\n`)\n } else if (!next.active && config.active) {\n process.stdout.write(` no workspaces left — active cleared\\n`)\n }\n return 0\n}\n\nasync function runUse(args: readonly string[]): Promise<number> {\n const { positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {},\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\"agentproto workspace use: missing <slug>.\\n\")\n return 2\n }\n const config = await loadWorkspacesConfig()\n try {\n const next = setActiveWorkspace(config, slug)\n await saveWorkspacesConfig(next)\n const w = next.workspaces.find(x => x.slug === next.active) as\n | WorkspaceEntry\n | undefined\n process.stdout.write(`● active: ${next.active} (${w?.path ?? \"?\"})\\n`)\n return 0\n } catch (err) {\n process.stderr.write(\n `agentproto workspace use: ${\n err instanceof Error ? err.message : String(err)\n }\\n`\n )\n return 2\n }\n}\n","/**\n * `agentproto sessions [--watch] [--attach <id>] [--json]`\n * `agentproto sessions start <slug> [--cwd <dir>] [--workspace <slug>]\n * [--prompt <text>] [--label <text>]\n * [--attach] [--json]`\n * `agentproto sessions stop <id>`\n *\n * Browse and control the daemon's live sessions (terminals, agent\n * CLIs, custom commands) without leaving the shell:\n *\n * agentproto sessions one-shot table dump\n * agentproto sessions --watch re-render every 2s, q to quit\n * agentproto sessions --attach <id> SSE-stream a session's output\n * agentproto sessions start <slug> POST /sessions/agent to spawn\n * a persistent agent-cli session\n * agentproto sessions stop <id> POST /sessions/:id/kill (SIGTERM)\n *\n * The TUI is intentionally minimal — raw stdin keypresses, no inquirer\n * / blessed dep. Terminal emulator quirks (xterm vs iTerm, key\n * sequences for arrow keys) are limited to a couple lines below.\n *\n * Endpoint discovery: reads `~/.agentproto/runtime.json` written by\n * the daemon at startup. Falls back to the env var\n * `AGENTPROTO_DAEMON_URL` when the file is missing or stale.\n */\nimport { parseArgs } from \"node:util\"\nimport { promises as fs } from \"node:fs\"\nimport { resolve } from \"node:path\"\nimport http from \"node:http\"\nimport https from \"node:https\"\nimport WebSocket from \"ws\"\nimport {\n loadWorkspacesConfig,\n getActiveWorkspace,\n} from \"@agentproto/runtime/workspaces-config\"\nimport {\n RESUME_STRATEGIES,\n hasResumeStrategy,\n} from \"@agentproto/runtime/resume-strategies\"\nimport type { SessionDescriptor } from \"@agentproto/runtime\"\n\nconst USAGE = `agentproto sessions — browse and control daemon sessions\n\nUsage:\n agentproto sessions [--watch] [--json]\n agentproto sessions --attach <id-or-name> [--no-color]\n agentproto sessions start <adapter> [--cwd <dir>] [--workspace <slug>]\n [--prompt <text>] [--label <text>]\n [--attach] [--json] [--no-color]\n agentproto sessions terminal -- <argv...> [--cwd <dir>] [--workspace <slug>]\n [--name <slug>] [--label <text>]\n [--cols <n>] [--rows <n>]\n [--attach] [--json] [--no-color]\n agentproto sessions stop <id-or-name> [--json]\n\nDiscovers the daemon via ~/.agentproto/runtime.json. The token in that file\nis sent as Bearer on mutating routes; set AGENTPROTO_DAEMON_URL +\nAGENTPROTO_DAEMON_TOKEN to override.\n\nWhile attached:\n Ctrl-] q detach (session keeps running on the daemon)\n Ctrl-C send to the child (PTY mode) / detach (SSE mode)\n`\n\n// SessionDescriptor is imported from @agentproto/runtime — its\n// canonical shape covers adapterSlug / adapterSessionId / cwd / argv\n// / resumeMetadata, which the resume/restart flow below relies on.\n// Keeping a local re-declaration here in the past drifted out of\n// sync with the runtime, breaking type-check on every field added.\n\nexport async function runSessions(args: readonly string[]): Promise<number> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n process.stdout.write(USAGE)\n return 0\n }\n\n // Route `start` / `stop` / `terminal` subverbs before the flag\n // parser — they take positionals the flag parser would reject.\n const sub = args[0]\n if (sub === \"start\") return runStart(args.slice(1))\n if (sub === \"stop\") return runStop(args.slice(1))\n if (sub === \"terminal\") return runTerminal(args.slice(1))\n if (sub === \"mirror\") return runMirror(args.slice(1))\n if (sub === \"restart\") return runRestart(args.slice(1))\n\n const { values } = parseArgs({\n args: [...args],\n allowPositionals: false,\n strict: true,\n options: {\n watch: { type: \"boolean\" },\n json: { type: \"boolean\" },\n attach: { type: \"string\" },\n simple: { type: \"boolean\" },\n \"no-color\": { type: \"boolean\" },\n },\n })\n\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions\")\n return 2\n }\n const endpoint = report.found\n\n if (values.attach) {\n return runAttach({\n endpoint,\n idOrName: values.attach,\n colour: !values[\"no-color\"],\n })\n }\n\n if (values.json) {\n const list = await fetchSessions(endpoint.url)\n process.stdout.write(JSON.stringify(list, null, 2) + \"\\n\")\n return 0\n }\n\n if (values.watch) {\n return values.simple\n ? runWatchSimple(endpoint, !values[\"no-color\"])\n : runWatch(endpoint, !values[\"no-color\"])\n }\n\n // One-shot\n const list = await fetchSessions(endpoint.url)\n printTable(list)\n return 0\n}\n\nasync function runStart(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n cwd: { type: \"string\" },\n workspace: { type: \"string\" },\n prompt: { type: \"string\", short: \"p\" },\n label: { type: \"string\" },\n attach: { type: \"boolean\" },\n json: { type: \"boolean\" },\n \"no-color\": { type: \"boolean\" },\n },\n })\n const slug = positionals[0]\n if (!slug) {\n process.stderr.write(\n \"agentproto sessions start: missing adapter slug.\\n\" +\n \" Try: agentproto sessions start claude-code --attach\\n\"\n )\n return 2\n }\n if (positionals.length > 1) {\n process.stderr.write(\n `agentproto sessions start: unexpected extra positionals: ${positionals\n .slice(1)\n .join(\" \")}\\n`\n )\n return 2\n }\n\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions start\")\n return 2\n }\n const endpoint = report.found\n\n const body: Record<string, string> = { adapter: slug }\n if (values.cwd) body.cwd = resolve(values.cwd)\n if (values.workspace) body.workspaceSlug = values.workspace\n if (values.prompt) body.prompt = values.prompt\n if (values.label) body.label = values.label\n\n let desc: SessionDescriptor\n try {\n desc = await httpPostJson<SessionDescriptor>(\n `${endpoint.url}/sessions/agent`,\n body,\n endpoint.token,\n )\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 401/.test(msg)) {\n process.stderr.write(\n (await explain401(endpoint, \"agentproto sessions start\")) + \"\\n\",\n )\n } else {\n process.stderr.write(`agentproto sessions start: ${msg}\\n`)\n }\n return 1\n }\n\n if (values.json) {\n process.stdout.write(JSON.stringify(desc, null, 2) + \"\\n\")\n } else {\n process.stdout.write(\n `agentproto sessions start: spawned ${desc.kind} ${desc.id}` +\n ` (${desc.status}) — ${desc.command}\\n`\n )\n }\n\n if (values.attach) {\n return runAttach({\n endpoint,\n idOrName: desc.id,\n colour: !values[\"no-color\"],\n })\n }\n return 0\n}\n\nasync function runStop(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n json: { type: \"boolean\" },\n },\n })\n const id = positionals[0]\n if (!id) {\n process.stderr.write(\n \"agentproto sessions stop: missing session id.\\n\" +\n \" Try: agentproto sessions stop <id-or-name> (find ids with `agentproto sessions`)\\n\"\n )\n return 2\n }\n if (positionals.length > 1) {\n process.stderr.write(\n `agentproto sessions stop: unexpected extra positionals: ${positionals\n .slice(1)\n .join(\" \")}\\n`\n )\n return 2\n }\n\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions stop\")\n return 2\n }\n const endpoint = report.found\n\n try {\n const result = await httpPostJson<{ ok: boolean; id: string }>(\n `${endpoint.url}/sessions/${encodeURIComponent(id)}/kill`,\n {},\n endpoint.token,\n )\n if (values.json) {\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\")\n } else {\n process.stdout.write(\n result.ok\n ? `agentproto sessions stop: SIGTERM sent to ${id}\\n`\n : `agentproto sessions stop: ${id} not running\\n`\n )\n }\n return result.ok ? 0 : 1\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 401/.test(msg)) {\n process.stderr.write(\n (await explain401(endpoint, \"agentproto sessions stop\")) + \"\\n\",\n )\n return 1\n }\n if (/HTTP 404/.test(msg)) {\n process.stderr.write(\n `agentproto sessions stop: no session \"${id}\".\\n`\n )\n return 2\n }\n process.stderr.write(`agentproto sessions stop: ${msg}\\n`)\n return 1\n }\n}\n\n/**\n * `agentproto sessions terminal -- <argv...>` — spawn a PTY-backed\n * session via POST /sessions/terminal. The `--` separator is the\n * idiomatic way to pass argv that includes flags the verb's own\n * parser would otherwise eat. Without `--`, the first positional is\n * the binary and the rest are arguments.\n */\nasync function runTerminal(args: readonly string[]): Promise<number> {\n // Split on `--` so users can pass arbitrary argv (including flags\n // that look like the verb's own). Everything after `--` is argv;\n // anything before is verb flags.\n const sepIdx = args.indexOf(\"--\")\n const verbArgs = sepIdx === -1 ? [...args] : args.slice(0, sepIdx)\n const argvFromSeparator = sepIdx === -1 ? [] : args.slice(sepIdx + 1)\n\n const { values, positionals } = parseArgs({\n args: verbArgs,\n allowPositionals: true,\n strict: true,\n options: {\n cwd: { type: \"string\" },\n workspace: { type: \"string\" },\n name: { type: \"string\" },\n label: { type: \"string\" },\n cols: { type: \"string\" },\n rows: { type: \"string\" },\n attach: { type: \"boolean\" },\n json: { type: \"boolean\" },\n \"no-color\": { type: \"boolean\" },\n },\n })\n\n // argv = positionals before `--` (none allowed) OR everything after `--`.\n // Pre-`--` positionals are rejected: the user almost certainly typed\n // `agentproto sessions terminal claude`\n // and meant `agentproto sessions terminal -- claude`, but to avoid\n // ambiguity with flags we require the separator.\n if (positionals.length > 0 && argvFromSeparator.length === 0) {\n // Be lenient: if there's only one positional and it doesn't look\n // like a flag, treat it as `--`-prefixed argv. Saves typing for the\n // common case `agentproto sessions terminal bash --attach`.\n // We already consumed verb flags above, so positionals here are\n // the leftovers — safe to use as argv.\n // Fall through.\n }\n const argv =\n argvFromSeparator.length > 0 ? argvFromSeparator : [...positionals]\n if (argv.length === 0) {\n process.stderr.write(\n \"agentproto sessions terminal: missing argv.\\n\" +\n \" Try: agentproto sessions terminal -- bash\\n\" +\n \" agentproto sessions terminal -- claude --resume <id>\\n\",\n )\n return 2\n }\n\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions terminal\")\n return 2\n }\n const endpoint = report.found\n\n const cols = values.cols ? Number.parseInt(values.cols, 10) : undefined\n const rows = values.rows ? Number.parseInt(values.rows, 10) : undefined\n const body: Record<string, unknown> = {\n argv,\n cols:\n cols && Number.isFinite(cols) && cols > 0\n ? cols\n : process.stdout.columns && process.stdout.columns > 0\n ? process.stdout.columns\n : 80,\n rows:\n rows && Number.isFinite(rows) && rows > 0\n ? rows\n : process.stdout.rows && process.stdout.rows > 0\n ? process.stdout.rows\n : 24,\n }\n if (values.cwd) body.cwd = resolve(values.cwd)\n if (values.workspace) body.workspaceSlug = values.workspace\n if (values.name) body.name = values.name\n if (values.label) body.label = values.label\n\n let desc: SessionDescriptor\n try {\n desc = await httpPostJson<SessionDescriptor>(\n `${endpoint.url}/sessions/terminal`,\n body,\n endpoint.token,\n )\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 401/.test(msg)) {\n process.stderr.write(\n (await explain401(endpoint, \"agentproto sessions terminal\")) + \"\\n\",\n )\n } else {\n process.stderr.write(`agentproto sessions terminal: ${msg}\\n`)\n }\n return 1\n }\n\n if (values.json) {\n process.stdout.write(JSON.stringify(desc, null, 2) + \"\\n\")\n } else {\n process.stdout.write(\n `agentproto sessions terminal: spawned ${desc.id}` +\n `${desc.name ? ` (${desc.name})` : \"\"} — ${desc.command}\\n`,\n )\n }\n\n if (values.attach) {\n return runAttach({\n endpoint,\n idOrName: desc.id,\n colour: !values[\"no-color\"],\n })\n }\n return 0\n}\n\ninterface DaemonEndpoint {\n url: string\n token?: string\n /** Path of the runtime.json the endpoint came from. Lets error\n * messages tell the user which file to inspect when something\n * looks wrong. Undefined when the endpoint came from env vars. */\n sourcePath?: string\n}\n\ninterface DaemonDiscoveryReport {\n /** First live endpoint, if any. */\n found: DaemonEndpoint | null\n /** runtime.json files we walked past because their PID was dead. */\n stale: Array<{ path: string; pid: number | null; mtime: Date | null }>\n}\n\nasync function discoverDaemon(): Promise<DaemonDiscoveryReport> {\n // Env overrides win on URL. The token is OPTIONAL via env: when\n // only the URL is set, we still try to find a matching runtime.json\n // on disk so mutating routes don't 401 just because the user\n // (or `serve --interactive`) forgot to forward the token.\n if (process.env.AGENTPROTO_DAEMON_URL) {\n const url = process.env.AGENTPROTO_DAEMON_URL.replace(/\\/+$/, \"\")\n let token: string | undefined = process.env.AGENTPROTO_DAEMON_TOKEN\n if (!token) {\n // Walk every registered workspace looking for a runtime.json\n // whose url matches — that gives us the matching token without\n // forcing the user to copy it manually.\n const config = await loadWorkspacesConfig().catch(() => null)\n if (config) {\n for (const ws of config.workspaces) {\n const ep = await readRuntimeJsonWithStatus(ws.path)\n if (ep.endpoint && ep.endpoint.url === url && ep.endpoint.token) {\n token = ep.endpoint.token\n break\n }\n }\n }\n }\n return {\n found: { url, ...(token ? { token } : {}) },\n stale: [],\n }\n }\n const config = await loadWorkspacesConfig().catch(() => null)\n if (!config) return { found: null, stale: [] }\n const candidates = [\n getActiveWorkspace(config),\n ...config.workspaces,\n ].filter(\n (w, i, arr): w is NonNullable<typeof w> =>\n !!w && arr.findIndex(x => x?.slug === w.slug) === i,\n )\n const stale: DaemonDiscoveryReport[\"stale\"] = []\n for (const w of candidates) {\n const result = await readRuntimeJsonWithStatus(w.path)\n if (result.endpoint) {\n return { found: result.endpoint, stale }\n }\n if (result.stale) {\n stale.push(result.stale)\n }\n }\n return { found: null, stale }\n}\n\nasync function resolveDaemon(): Promise<DaemonEndpoint | null> {\n const report = await discoverDaemon()\n return report.found\n}\n\n/** @deprecated Kept for callers that only need the URL. */\nasync function resolveDaemonUrl(): Promise<string | null> {\n const ep = await resolveDaemon()\n return ep ? ep.url : null\n}\n\n/**\n * Pretty-print a \"no daemon found\" error. When stale runtime.json\n * files exist, list them with their dead pid + age — that's the\n * footgun: the user thinks they have no daemon, but stale files\n * make discovery a guessing game. Suggested fix is at the bottom.\n */\nfunction printNoDaemonError(report: DaemonDiscoveryReport, verb: string): void {\n const lines: string[] = [\n `${verb}: no daemon found.`,\n ` Start one with \\`agentproto serve\\` or set AGENTPROTO_DAEMON_URL.`,\n ]\n if (report.stale.length > 0) {\n lines.push(\n ``,\n ` found ${report.stale.length} stale runtime.json file(s) (PID dead):`,\n )\n for (const s of report.stale) {\n const age = s.mtime ? humaniseDelta(Date.now() - s.mtime.getTime()) : \"?\"\n lines.push(\n ` ${s.path} (pid=${s.pid ?? \"?\"} · ${age} old)`,\n )\n }\n lines.push(\n ``,\n ` these confuse discovery — delete them and re-run:`,\n ...report.stale.map(s => ` rm ${s.path}`),\n )\n }\n process.stderr.write(lines.join(\"\\n\") + \"\\n\")\n}\n\nasync function readRuntimeJson(workspacePath: string): Promise<DaemonEndpoint | null> {\n const out = await readRuntimeJsonWithStatus(workspacePath)\n return out.endpoint\n}\n\ninterface RuntimeJsonRead {\n /** Resolved live endpoint, or null when the file is missing /\n * malformed / has a dead PID. */\n endpoint: DaemonEndpoint | null\n /** Set when the file exists but the PID is dead — caller can list\n * this to the user as a cleanup suggestion. */\n stale?: { path: string; pid: number | null; mtime: Date | null }\n}\n\nasync function readRuntimeJsonWithStatus(workspacePath: string): Promise<RuntimeJsonRead> {\n const path = resolve(workspacePath, \".agentproto\", \"runtime.json\")\n let stat: Awaited<ReturnType<typeof fs.stat>>\n try {\n stat = await fs.stat(path)\n } catch {\n return { endpoint: null } // ENOENT, etc.\n }\n let raw: string\n try {\n raw = await fs.readFile(path, \"utf8\")\n } catch {\n return { endpoint: null }\n }\n let parsed: { port?: number; bind?: string; token?: string; pid?: number }\n try {\n parsed = JSON.parse(raw)\n } catch {\n return { endpoint: null }\n }\n if (typeof parsed.port !== \"number\") return { endpoint: null }\n // Liveness check — when the daemon dies without graceful shutdown\n // (kill -9, crash, reboot), its runtime.json lingers on disk with\n // a now-stale token. Trusting that token against a freshly-booted\n // daemon (same port, new token) produces a 401 the user can't\n // easily debug. process.kill(pid, 0) returns true when the process\n // exists, throws ESRCH otherwise — costs nothing, fixes the\n // \"I have leftover runtime.json files\" footgun.\n if (typeof parsed.pid === \"number\" && !isPidAlive(parsed.pid)) {\n return {\n endpoint: null,\n stale: {\n path,\n pid: parsed.pid ?? null,\n mtime: stat.mtime ?? null,\n },\n }\n }\n return {\n endpoint: {\n url: `http://${parsed.bind ?? \"127.0.0.1\"}:${parsed.port}`,\n sourcePath: path,\n ...(typeof parsed.token === \"string\" ? { token: parsed.token } : {}),\n },\n }\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n // Signal 0 doesn't deliver — it just checks for the process'\n // existence. EPERM would mean \"exists but you don't own it\",\n // which on a single-user macOS / Linux box won't happen for a\n // user-launched daemon; treat any non-throw as alive.\n process.kill(pid, 0)\n return true\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code\n if (code === \"EPERM\") return true // exists, we just can't signal\n return false // ESRCH (no such process) and anything else → dead\n }\n}\n\nasync function fetchSessions(baseUrl: string): Promise<SessionDescriptor[]> {\n const body = await httpGetJson(`${baseUrl}/sessions`)\n if (!body || !Array.isArray((body as { sessions?: unknown }).sessions)) {\n return []\n }\n return (body as { sessions: SessionDescriptor[] }).sessions\n}\n\nfunction printTable(rows: SessionDescriptor[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"No sessions.\\n\")\n return\n }\n const widths = {\n id: Math.max(...rows.map(r => r.id.length), 4),\n kind: Math.max(...rows.map(r => r.kind.length), 4),\n workspace: Math.max(...rows.map(r => r.workspaceSlug.length), 9),\n status: Math.max(...rows.map(r => r.status.length), 8),\n age: 8,\n }\n const header =\n pad(\"ID\", widths.id) +\n \" \" +\n pad(\"KIND\", widths.kind) +\n \" \" +\n pad(\"WORKSPACE\", widths.workspace) +\n \" \" +\n pad(\"STATUS\", widths.status) +\n \" \" +\n pad(\"AGE\", widths.age) +\n \" COMMAND\"\n process.stdout.write(`\\x1b[2m${header}\\x1b[0m\\n`)\n const now = Date.now()\n for (const r of rows) {\n const age = humaniseDelta(now - new Date(r.startedAt).getTime())\n const tone = statusColour(r.status)\n process.stdout.write(\n pad(r.id, widths.id) +\n \" \" +\n pad(r.kind, widths.kind) +\n \" \" +\n pad(r.workspaceSlug, widths.workspace) +\n \" \" +\n `${tone}${pad(r.status, widths.status)}\\x1b[0m` +\n \" \" +\n pad(age, widths.age) +\n \" \" +\n truncate(r.command, 60) +\n \"\\n\"\n )\n }\n}\n\nfunction statusColour(status: string): string {\n switch (status) {\n case \"running\":\n return \"\\x1b[32m\" // green\n case \"starting\":\n case \"mounting\":\n return \"\\x1b[33m\" // yellow\n case \"exited\":\n return \"\\x1b[2m\" // dim\n case \"killed\":\n case \"error\":\n return \"\\x1b[31m\" // red\n default:\n return \"\"\n }\n}\n\nfunction pad(s: string, n: number): string {\n if (s.length >= n) return s\n return s + \" \".repeat(n - s.length)\n}\n\nfunction truncate(s: string, n: number): string {\n if (s.length <= n) return s\n return s.slice(0, n - 1) + \"…\"\n}\n\nfunction humaniseDelta(ms: number): string {\n if (ms < 60_000) return `${Math.floor(ms / 1000)}s`\n if (ms < 3_600_000) return `${Math.floor(ms / 60_000)}m`\n if (ms < 86_400_000) return `${Math.floor(ms / 3_600_000)}h`\n return `${Math.floor(ms / 86_400_000)}d`\n}\n\n/**\n * `agentproto sessions --watch` — interactive TUI picker over the\n * daemon's session list. Auto-refreshes every 2 s; key bindings:\n *\n * ↑/↓ or j/k move selection\n * Enter attach to selected (PTY-aware via runAttach)\n * K kill selected (POST /sessions/:id/kill)\n * d forget selected (DELETE /sessions/:id; exited only)\n * r refresh now\n * q or Ctrl-C quit\n *\n * Non-TTY stdin degrades to a one-shot dump (no live keys, no\n * picker), matching the old behaviour for `agentproto sessions`\n * piped into a pager.\n */\n/**\n * `--watch --simple` — the original flat-table picker. Kept for\n * piping into a pager / external tool. The new default is the\n * 3-pane dashboard `runWatch`.\n */\nasync function runWatchSimple(\n endpoint: DaemonEndpoint,\n colour: boolean,\n): Promise<number> {\n const tty = process.stdin.isTTY === true\n if (!tty) {\n const list = await fetchSessions(endpoint.url)\n printTable(list)\n return 0\n }\n\n process.stdin.setRawMode(true)\n process.stdin.resume()\n process.stdin.setEncoding(\"utf8\")\n\n let stop = false\n let action: \"attach\" | null = null\n let attachTargetId: string | null = null\n let cursor = 0\n let rows: SessionDescriptor[] = []\n let statusMsg = \"\"\n\n const repaint = (): void => {\n process.stdout.write(\"\\x1bc\")\n process.stdout.write(\n `\\x1b[2magentproto sessions · ${endpoint.url} · ↑/↓ move · Enter attach · K kill · d forget · r refresh · q quit\\x1b[0m\\n\\n`,\n )\n if (statusMsg) {\n process.stdout.write(`\\x1b[33m${statusMsg}\\x1b[0m\\n\\n`)\n }\n printPickerTable(rows, cursor)\n }\n\n const refresh = async (): Promise<void> => {\n try {\n rows = await fetchSessions(endpoint.url)\n } catch (err) {\n statusMsg = `fetch error: ${err instanceof Error ? err.message : String(err)}`\n rows = []\n }\n if (cursor >= rows.length) cursor = Math.max(0, rows.length - 1)\n }\n\n const onKey = (key: string): void => {\n // Arrow keys arrive as ESC [ A/B/C/D — match common terminals.\n if (key === \"\\x1b[A\" || key === \"k\") {\n if (cursor > 0) cursor--\n repaint()\n return\n }\n if (key === \"\\x1b[B\" || key === \"j\") {\n if (cursor < rows.length - 1) cursor++\n repaint()\n return\n }\n if (key === \"\\r\" || key === \"\\n\") {\n const target = rows[cursor]\n if (target) {\n action = \"attach\"\n attachTargetId = target.id\n stop = true\n }\n return\n }\n if (key === \"K\") {\n const target = rows[cursor]\n if (!target) return\n void httpPostJson<{ ok: boolean }>(\n `${endpoint.url}/sessions/${encodeURIComponent(target.id)}/kill`,\n {},\n endpoint.token,\n )\n .then(r => {\n statusMsg = r.ok\n ? `sent SIGTERM to ${target.id}`\n : `${target.id} not running`\n return refresh()\n })\n .catch(err => {\n statusMsg = `kill error: ${err instanceof Error ? err.message : String(err)}`\n })\n .finally(() => repaint())\n return\n }\n if (key === \"d\") {\n const target = rows[cursor]\n if (!target) return\n if (\n target.status !== \"exited\" &&\n target.status !== \"killed\" &&\n target.status !== \"error\"\n ) {\n statusMsg = `d: ${target.id} still ${target.status} — use K first`\n repaint()\n return\n }\n void httpDelete(\n `${endpoint.url}/sessions/${encodeURIComponent(target.id)}`,\n endpoint.token,\n )\n .then(() => {\n statusMsg = `forgot ${target.id}`\n return refresh()\n })\n .catch(err => {\n statusMsg = `forget error: ${err instanceof Error ? err.message : String(err)}`\n })\n .finally(() => repaint())\n return\n }\n if (key === \"r\") {\n statusMsg = \"\"\n void refresh().finally(() => repaint())\n return\n }\n if (key === \"q\" || key === \"\u0003\" /* Ctrl-C */) {\n stop = true\n return\n }\n void colour // silence unused-var; reserved for future colour toggle\n }\n\n process.stdin.on(\"data\", onKey)\n const sigintHandler = (): void => {\n stop = true\n }\n process.once(\"SIGINT\", sigintHandler)\n\n try {\n await refresh()\n repaint()\n while (!stop) {\n await new Promise<void>(res => setTimeout(res, 2_000))\n if (stop) break\n await refresh()\n repaint()\n }\n } finally {\n process.stdin.off(\"data\", onKey)\n process.off(\"SIGINT\", sigintHandler)\n process.stdin.setRawMode(false)\n process.stdin.pause()\n process.stdout.write(\"\\n\")\n }\n\n if (action === \"attach\" && attachTargetId) {\n return runAttach({\n endpoint,\n idOrName: attachTargetId,\n colour,\n })\n }\n return 0\n}\n\n/**\n * Same shape as printTable but highlights the cursor row. Lives next\n * to printTable rather than gating it on a flag — the watch picker\n * needs distinct visual treatment that would otherwise add yet more\n * conditionals to the read-only printer.\n */\nfunction printPickerTable(rows: SessionDescriptor[], cursor: number): void {\n if (rows.length === 0) {\n process.stdout.write(\"No sessions.\\n\")\n return\n }\n const widths = {\n id: Math.max(...rows.map(r => r.id.length), 4),\n kind: Math.max(...rows.map(r => r.kind.length), 4),\n workspace: Math.max(...rows.map(r => r.workspaceSlug.length), 9),\n status: Math.max(...rows.map(r => r.status.length), 8),\n age: 8,\n }\n const header =\n \" \" +\n pad(\"ID\", widths.id) +\n \" \" +\n pad(\"KIND\", widths.kind) +\n \" \" +\n pad(\"WORKSPACE\", widths.workspace) +\n \" \" +\n pad(\"STATUS\", widths.status) +\n \" \" +\n pad(\"AGE\", widths.age) +\n \" COMMAND\"\n process.stdout.write(`\\x1b[2m${header}\\x1b[0m\\n`)\n const now = Date.now()\n rows.forEach((r, i) => {\n const age = humaniseDelta(now - new Date(r.startedAt).getTime())\n const tone = statusColour(r.status)\n const marker = i === cursor ? \"\\x1b[7m▸\" : \" \"\n const reset = i === cursor ? \"\\x1b[0m\" : \"\"\n process.stdout.write(\n `${marker} ` +\n pad(r.id, widths.id) +\n \" \" +\n pad(r.kind, widths.kind) +\n \" \" +\n pad(r.workspaceSlug, widths.workspace) +\n \" \" +\n `${tone}${pad(r.status, widths.status)}\\x1b[0m` +\n \" \" +\n pad(age, widths.age) +\n \" \" +\n truncate(r.command, 60) +\n reset +\n \"\\n\",\n )\n })\n}\n\n/**\n * `agentproto sessions --watch` — 3-pane dashboard:\n *\n * ┌─ header (gateway · workspace · pty · origins · mode) ────────────┐\n * │ SESSIONS │ DETAIL │\n * │ ▸ name pty status age │ id / name / kind / status / … │\n * │ … │ │\n * │ │ press Enter to attach │\n * ├─ events strip (last 3 from /events SSE) ───────────────────────── │\n * └─ keys footer ────────────────────────────────────────────────────┘\n *\n * Alt-screen mode so scrollback isn't trashed. Polls /sessions every\n * 2 s; subscribes to /events for the live ticker. Non-TTY stdin →\n * one-shot dump (no live keys), matching --simple.\n */\nasync function runWatch(\n endpoint: DaemonEndpoint,\n colour: boolean,\n): Promise<number> {\n const tty = process.stdin.isTTY === true && process.stdout.isTTY === true\n if (!tty) {\n const list = await fetchSessions(endpoint.url)\n printTable(list)\n return 0\n }\n // Non-colour pass-through: callers can still pipe via --no-color\n // (mostly relevant when tee-ing to a file from a real terminal).\n void colour\n\n // ─── state ─────────────────────────────────────────────────────\n let stop = false\n let action: \"attach\" | \"mirror\" | null = null\n let attachTargetId: string | null = null\n let cursor = 0\n let sessions: SessionDescriptor[] = []\n let recentEvents: { at: string; line: string }[] = []\n let health: {\n workspace?: string\n uptimeMs?: number\n } | null = null\n let statusMsg = \"\"\n let statusMsgUntil = 0\n // Per-session preview cache (last N lines from /sessions/:id/preview).\n // Populated on selection change + on each refresh tick so the panel\n // updates as new output lands. Capped to selected + last 5 to bound\n // memory on dashboards left open across many sessions.\n const previewCache = new Map<string, string[]>()\n let lastPreviewFetch = 0\n\n // ─── terminal setup ────────────────────────────────────────────\n const enterAlt = \"\\x1b[?1049h\"\n const exitAlt = \"\\x1b[?1049l\"\n const hideCur = \"\\x1b[?25l\"\n const showCur = \"\\x1b[?25h\"\n process.stdout.write(enterAlt + hideCur)\n process.stdin.setRawMode(true)\n process.stdin.resume()\n process.stdin.setEncoding(\"utf8\")\n\n const restore = (): void => {\n process.stdout.write(showCur + exitAlt)\n try {\n process.stdin.setRawMode(false)\n } catch {\n /* ignore */\n }\n process.stdin.pause()\n }\n\n // ─── data fetchers ─────────────────────────────────────────────\n const refresh = async (): Promise<void> => {\n try {\n sessions = await fetchSessions(endpoint.url)\n if (cursor >= sessions.length) cursor = Math.max(0, sessions.length - 1)\n } catch (err) {\n flash(\n `fetch error: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n }\n const refreshHealth = async (): Promise<void> => {\n try {\n const body = (await httpGetJson<{\n workspace?: string\n uptimeMs?: number\n }>(`${endpoint.url}/health`))\n health = body\n } catch {\n health = null\n }\n }\n\n /**\n * Fetch the last N lines of the selected session's ring buffer so\n * the detail pane shows what it was doing. Background — call site\n * doesn't await; render() reads from the cache. Throttled because\n * the dashboard tick already polls every second; we only re-fetch\n * the preview on selection change or every ~3 ticks.\n */\n const refreshPreview = async (id: string): Promise<void> => {\n try {\n const body = await httpGetJson<{\n lines?: string[]\n bytes?: string | null\n }>(`${endpoint.url}/sessions/${encodeURIComponent(id)}/preview?lines=10`)\n const lines: string[] = []\n if (Array.isArray(body.lines) && body.lines.length > 0) {\n lines.push(...body.lines)\n } else if (typeof body.bytes === \"string\" && body.bytes.length > 0) {\n // PTY session — split the base64-decoded tail into displayable\n // lines. Strip ANSI escapes; the dashboard's table layout\n // would otherwise show garbled cursor moves / colours.\n try {\n const buf = Buffer.from(body.bytes, \"base64\").toString(\"utf8\")\n const stripped = buf.replace(/\\x1b\\[[0-9;?]*[A-Za-z]/g, \"\")\n const split = stripped.split(\"\\n\").filter(l => l.length > 0)\n lines.push(...split.slice(-10))\n } catch {\n // ignore decode errors\n }\n }\n previewCache.set(id, lines)\n // Bound cache: keep only entries for currently-visible sessions\n // plus a handful of recent ones.\n if (previewCache.size > 12) {\n const stale = [...previewCache.keys()].slice(0, previewCache.size - 12)\n for (const k of stale) previewCache.delete(k)\n }\n } catch {\n // best-effort; leave whatever was cached\n }\n }\n\n // ─── events SSE ────────────────────────────────────────────────\n const eventsUrl = new URL(`${endpoint.url}/events`)\n const lib = eventsUrl.protocol === \"https:\" ? https : http\n const eventsReq = lib.get(\n eventsUrl,\n { headers: { accept: \"text/event-stream\" } },\n res => {\n let buf = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", chunk => {\n buf += chunk\n let idx = buf.indexOf(\"\\n\\n\")\n while (idx !== -1) {\n const event = buf.slice(0, idx)\n buf = buf.slice(idx + 2)\n for (const line of event.split(\"\\n\")) {\n if (!line.startsWith(\"data:\")) continue\n try {\n const payload = JSON.parse(line.slice(5).trim()) as {\n type?: string\n at?: string\n [k: string]: unknown\n }\n const summary = summariseEvent(payload)\n if (summary) {\n recentEvents.push({\n at: shortTime(payload.at ?? new Date().toISOString()),\n line: summary,\n })\n if (recentEvents.length > 5) recentEvents.shift()\n render()\n }\n } catch {\n /* ignore malformed frames */\n }\n }\n idx = buf.indexOf(\"\\n\\n\")\n }\n })\n res.on(\"end\", () => void 0)\n },\n )\n eventsReq.on(\"error\", () => void 0)\n\n // ─── key handling ──────────────────────────────────────────────\n let keyBuf = \"\"\n const onKey = (raw: Buffer | string): void => {\n keyBuf += typeof raw === \"string\" ? raw : raw.toString(\"utf8\")\n while (keyBuf.length > 0) {\n // Try to consume a recognised sequence.\n if (keyBuf.startsWith(\"\\x1b[A\")) {\n keyBuf = keyBuf.slice(3)\n if (cursor > 0) cursor--\n const t = sessions[cursor]\n if (t && !previewCache.has(t.id)) void refreshPreview(t.id).then(render)\n render()\n continue\n }\n if (keyBuf.startsWith(\"\\x1b[B\")) {\n keyBuf = keyBuf.slice(3)\n if (cursor < sessions.length - 1) cursor++\n const t = sessions[cursor]\n if (t && !previewCache.has(t.id)) void refreshPreview(t.id).then(render)\n render()\n continue\n }\n const ch = keyBuf[0]\n keyBuf = keyBuf.slice(1)\n if (ch === \"j\") {\n if (cursor < sessions.length - 1) cursor++\n const t = sessions[cursor]\n if (t && !previewCache.has(t.id)) void refreshPreview(t.id).then(render)\n render()\n } else if (ch === \"k\") {\n if (cursor > 0) cursor--\n const t = sessions[cursor]\n if (t && !previewCache.has(t.id)) void refreshPreview(t.id).then(render)\n render()\n } else if (ch === \"q\" || ch === \"\\x03\" /* Ctrl-C */) {\n stop = true\n return\n } else if (ch === \"r\") {\n flash(\"refreshing…\")\n void Promise.all([refresh(), refreshHealth()]).finally(render)\n } else if (ch === \"\\r\" || ch === \"\\n\") {\n const t = sessions[cursor]\n if (t) {\n action = \"attach\"\n attachTargetId = t.id\n stop = true\n return\n }\n } else if (ch === \"m\") {\n // Read-only mirror — safer than full attach because Ctrl-C\n // cleanly exits without needing the Ctrl-] q chord some\n // terminal emulators swallow.\n const t = sessions[cursor]\n if (t) {\n action = \"mirror\"\n attachTargetId = t.id\n stop = true\n return\n }\n } else if (ch === \"R\") {\n // Restart: respawn from history without leaving the dashboard.\n // Inline httpPostJson (like K kill) so failures flash inline\n // and a successful restart shows up in the next refresh —\n // never tears down the watch loop or the parent daemon.\n const t = sessions[cursor]\n if (!t) continue\n void restartSessionInline(endpoint, t)\n .then(msg => flash(msg))\n .catch(err =>\n flash(\n `restart error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n .finally(() => void refresh().then(render))\n } else if (ch === \"K\") {\n const t = sessions[cursor]\n if (!t) continue\n void httpPostJson<{ ok: boolean }>(\n `${endpoint.url}/sessions/${encodeURIComponent(t.id)}/kill`,\n {},\n endpoint.token,\n )\n .then(out =>\n flash(out.ok ? `SIGTERM sent to ${t.id}` : `${t.id} not running`),\n )\n .catch(err =>\n flash(\n `kill error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n .finally(() => void refresh().then(render))\n } else if (ch === \"d\") {\n const t = sessions[cursor]\n if (!t) continue\n if (\n t.status !== \"exited\" &&\n t.status !== \"killed\" &&\n t.status !== \"error\"\n ) {\n flash(`d: ${t.id} still ${t.status} — use K first`)\n render()\n continue\n }\n void httpDelete(\n `${endpoint.url}/sessions/${encodeURIComponent(t.id)}`,\n endpoint.token,\n )\n .then(() => {\n flash(`forgot ${t.id}`)\n return refresh()\n })\n .catch(err =>\n flash(\n `forget error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n )\n .finally(() => render())\n }\n // Unknown chars silently discarded — TUI stays calm.\n }\n }\n\n const flash = (msg: string): void => {\n statusMsg = msg\n statusMsgUntil = Date.now() + 3_000\n }\n\n // ─── render ────────────────────────────────────────────────────\n const c = colour\n ? {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n reverse: \"\\x1b[7m\",\n green: \"\\x1b[32m\",\n amber: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n red: \"\\x1b[31m\",\n }\n : {\n reset: \"\",\n dim: \"\",\n bold: \"\",\n reverse: \"\",\n green: \"\",\n amber: \"\",\n cyan: \"\",\n red: \"\",\n }\n const statusTone = (s: string): string =>\n s === \"running\"\n ? c.green\n : s === \"starting\"\n ? c.amber\n : s === \"killed\" || s === \"error\"\n ? c.red\n : c.dim\n\n const render = (): void => {\n const cols = process.stdout.columns || 100\n const rows = process.stdout.rows || 30\n // Layout: 1 header, 1 separator, body (rows-5), 1 separator, 1 events, 1 footer.\n const bodyRows = Math.max(5, rows - 5)\n const sidebarWidth = Math.min(48, Math.max(34, Math.floor(cols * 0.4)))\n const detailWidth = cols - sidebarWidth - 1\n const sep = c.dim + \"│\" + c.reset\n const out: string[] = []\n\n // Row 1: header. Truncate to fit `cols` so it doesn't wrap and\n // push the rest of the screen down by a row (which manifested as\n // the title appearing to be missing in narrow terminals).\n const home = process.env.HOME ?? \"\"\n const ws =\n health?.workspace && home && health.workspace.startsWith(home)\n ? \"~\" + health.workspace.slice(home.length)\n : health?.workspace ?? \"?\"\n const headerLeft = `${c.bold}agentproto monitor${c.reset} ${c.dim}·${c.reset} ${c.cyan}${endpoint.url}${c.reset}`\n const headerRight = `${c.dim}workspace${c.reset} ${ws} ${c.dim}·${c.reset} ${c.dim}uptime${c.reset} ${humaniseDelta(health?.uptimeMs ?? 0)}`\n out.push(fitRow(headerLeft, headerRight, cols))\n out.push(c.dim + \"─\".repeat(cols) + c.reset)\n\n // Sidebar + detail (bodyRows lines). padEndVisible counts ANSI\n // escapes as zero-width so the column separator lands at the\n // sidebarWidth-th visible column, not the sidebarWidth-th\n // string-index (which over-pads when colors are on).\n const sidebarLines = renderSidebar(sessions, cursor, sidebarWidth, bodyRows, c, statusTone)\n const selected = sessions[cursor]\n const preview = selected ? previewCache.get(selected.id) : undefined\n const detailLines = renderDetail(selected, detailWidth, bodyRows, c, preview)\n for (let i = 0; i < bodyRows; i++) {\n out.push(\n padEndVisible(sidebarLines[i] ?? \"\", sidebarWidth) +\n sep +\n (detailLines[i] ?? \"\"),\n )\n }\n out.push(c.dim + \"─\".repeat(cols) + c.reset)\n\n // Events strip\n const evLine = recentEvents.length === 0\n ? `${c.dim}events · (no events yet)${c.reset}`\n : `${c.dim}events${c.reset} ` +\n recentEvents\n .map(e => `${c.dim}${e.at}${c.reset} ${e.line}`)\n .join(` ${c.dim}·${c.reset} `)\n out.push(truncateAnsi(evLine, cols))\n\n // Footer\n const showFlash =\n statusMsg && Date.now() < statusMsgUntil\n const selectedDesc = sessions[cursor]\n const isDead =\n selectedDesc &&\n (selectedDesc.status === \"exited\" ||\n selectedDesc.status === \"killed\" ||\n selectedDesc.status === \"error\")\n const footer = showFlash\n ? `${c.amber}${statusMsg}${c.reset}`\n : isDead\n ? `${c.dim}↑/↓ select · ${c.reset}${c.bold}R restart${c.reset}${c.dim} · m mirror · d forget · r refresh · q quit${c.reset}`\n : `${c.dim}↑/↓ select · Enter attach · R restart · m mirror · K kill · d forget · r refresh · q quit${c.reset}`\n out.push(truncateAnsi(footer, cols))\n\n // Paint: clear + home + write.\n process.stdout.write(\"\\x1b[H\\x1b[2J\" + out.join(\"\\n\"))\n }\n\n // ─── signals + cleanup ─────────────────────────────────────────\n const onResize = (): void => render()\n process.stdin.on(\"data\", onKey)\n process.stdout.on(\"resize\", onResize)\n const sigintHandler = (): void => {\n stop = true\n }\n process.once(\"SIGINT\", sigintHandler)\n\n try {\n await Promise.all([refresh(), refreshHealth()])\n // Initial preview for the first session.\n if (sessions[cursor]) void refreshPreview(sessions[cursor]!.id)\n render()\n let ticks = 0\n while (!stop) {\n await new Promise<void>(res => setTimeout(res, 1_000))\n if (stop) break\n ticks++\n // Sessions every 2 s, health every 10 s — health rarely\n // changes after boot, no point hammering it.\n if (ticks % 2 === 0) await refresh()\n if (ticks % 10 === 0) await refreshHealth()\n // Preview every 3 s for the currently-selected session — keep\n // the panel feeling alive without hammering the daemon.\n if (ticks - lastPreviewFetch >= 3) {\n const t = sessions[cursor]\n if (t) void refreshPreview(t.id)\n lastPreviewFetch = ticks\n }\n render()\n }\n } finally {\n eventsReq.destroy()\n process.stdin.off(\"data\", onKey)\n process.stdout.off(\"resize\", onResize)\n process.off(\"SIGINT\", sigintHandler)\n restore()\n }\n\n if (action === \"attach\" && attachTargetId) {\n // Run the attach, then re-enter the watch loop so the dashboard\n // doesn't disappear after a detach. The user gets the natural\n // workflow: peek at a session, drive it, detach, see the list\n // again, pick another one — until they hit q.\n const code = await runAttach({\n endpoint,\n idOrName: attachTargetId,\n colour,\n })\n void code\n return runWatch(endpoint, colour)\n }\n if (action === \"mirror\" && attachTargetId) {\n const code = await runMirror([attachTargetId])\n void code\n return runWatch(endpoint, colour)\n }\n return 0\n}\n\n/**\n * Restart a session without exiting the watch loop. Mirrors what\n * `runRestart` does — looks up the descriptor, picks the right\n * route, sends the body — but returns a short status string for\n * the dashboard's flash banner instead of writing to stderr / exit\n * code. Errors propagate so the caller can format the message.\n *\n * For agent-cli sessions we attempt to resume the conversation via\n * the prior adapter session id. Adapters (claude-code, hermes)\n * persist that id only AFTER the first turn — a session killed\n * before it had any conversation reports \"Resource not found\" on\n * resume. In that case we automatically retry the same shape WITHOUT\n * resumeSessionId so the user at least gets their command back; the\n * banner makes the fallback explicit so they know history was lost.\n */\nasync function restartSessionInline(\n endpoint: DaemonEndpoint,\n prev: SessionDescriptor,\n): Promise<string> {\n const augmented = await augmentWithFsResume(prev)\n const built = buildRestartBody(augmented)\n return executeRestartWithFallback(endpoint, augmented, built)\n}\n\ninterface RestartBody {\n url: string\n body: Record<string, unknown>\n}\n\n/**\n * Generic filesystem-fallback: for each known adapter strategy that\n * defines an `fsProbe`, run it against this session's cwd. If a\n * resume id is found, attach it to the descriptor's resumeMetadata.\n *\n * Lets `restart` recover continuity even when our own output sniffer\n * missed the resume hint (session killed too quickly, output buffered\n * past the kill, …). Eligible only when the file is at-or-after the\n * session's `startedAt` (avoid resuming an unrelated prior session\n * in the same cwd — see ResumeStrategy.fsProbe comment).\n */\n/**\n * Describe which resume path was used for a successful restart, so\n * the CLI/dashboard banner can tell the user what happened. Returns\n * a short phrase like \"resumed via claude --resume\" or \"resumed via\n * ACP\", or an empty string when no resume was attempted.\n */\nfunction describeResumePath(prev: SessionDescriptor): string {\n if (prev.adapterSlug) {\n const s = RESUME_STRATEGIES[prev.adapterSlug]\n if (s?.spawnArgs && s.storeAs && prev.resumeMetadata?.[s.storeAs]) {\n const sample = s.spawnArgs(\"…\")[0] ?? prev.adapterSlug\n return `resumed via ${sample} --resume`\n }\n }\n if (prev.adapterSlug && prev.adapterSessionId) {\n return \"resumed via ACP\"\n }\n return \"\"\n}\n\nasync function augmentWithFsResume(\n prev: SessionDescriptor,\n): Promise<SessionDescriptor> {\n const slug = prev.adapterSlug\n if (!slug) return prev\n const strategy = RESUME_STRATEGIES[slug]\n if (!strategy?.fsProbe) return prev\n // If we already have a captured id for this strategy's storage key,\n // skip the FS probe — the sniffer found it during the session.\n if (prev.resumeMetadata?.[strategy.storeAs]) return prev\n if (!prev.cwd) return prev\n const id = await strategy.fsProbe(prev.cwd, prev.startedAt)\n if (!id) return prev\n return {\n ...prev,\n resumeMetadata: {\n ...(prev.resumeMetadata ?? {}),\n [strategy.storeAs]: id,\n },\n }\n}\n\nfunction buildRestartBody(prev: SessionDescriptor): RestartBody {\n // Provider-native resume takes precedence over ACP-level resume.\n // Look up the adapter's strategy in the central registry; when it\n // defines `spawnArgs` AND we've captured a resume id for it, spawn\n // a PTY running the provider's native resume command. That works\n // whenever the provider persisted the session, regardless of\n // whether the ACP wrapper did — strictly more reliable.\n if (prev.adapterSlug) {\n const strategy = RESUME_STRATEGIES[prev.adapterSlug]\n const id = strategy?.storeAs\n ? prev.resumeMetadata?.[strategy.storeAs]\n : undefined\n if (strategy?.spawnArgs && id) {\n return {\n url: \"__pty__\",\n body: {\n argv: strategy.spawnArgs(id),\n cwd: prev.cwd ?? undefined,\n workspaceSlug: prev.workspaceSlug,\n cols: process.stdout.columns ?? 80,\n rows: process.stdout.rows ?? 24,\n ...(prev.name ? { name: prev.name } : {}),\n ...(prev.label ? { label: prev.label } : {}),\n },\n }\n }\n }\n if (prev.pty === true) {\n const argv = Array.isArray(prev.argv)\n ? prev.argv\n : tokenizeCommand(prev.command)\n return {\n url: \"__pty__\",\n body: {\n argv,\n cwd: prev.cwd ?? undefined,\n workspaceSlug: prev.workspaceSlug,\n cols: process.stdout.columns ?? 80,\n rows: process.stdout.rows ?? 24,\n ...(prev.name ? { name: prev.name } : {}),\n ...(prev.label ? { label: prev.label } : {}),\n },\n }\n }\n if (prev.adapterSlug) {\n return {\n url: \"__agent__\",\n body: {\n adapter: prev.adapterSlug,\n cwd: prev.cwd ?? undefined,\n workspaceSlug: prev.workspaceSlug,\n ...(prev.adapterSessionId\n ? { resumeSessionId: prev.adapterSessionId }\n : {}),\n ...(prev.label ? { label: prev.label } : {}),\n },\n }\n }\n throw new Error(\n `${prev.id} is a generic command session — restart only supports pty + agent-cli`,\n )\n}\n\nasync function executeRestartWithFallback(\n endpoint: DaemonEndpoint,\n prev: SessionDescriptor,\n built: RestartBody,\n): Promise<string> {\n const url =\n built.url === \"__pty__\"\n ? `${endpoint.url}/sessions/terminal`\n : `${endpoint.url}/sessions/agent`\n try {\n const next = await httpPostJson<SessionDescriptor>(\n url,\n built.body,\n endpoint.token,\n )\n const path = describeResumePath(prev)\n return `restarted ${prev.id} → ${next.id}${\n next.name ? ` (${next.name})` : \"\"\n }${path ? ` (${path})` : \"\"}`\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n // Adapter doesn't recognize the resume id — typically means the\n // session never got past the spawn (no turn happened). Retry\n // without resume so the user at least gets the command back.\n if (\n built.body.resumeSessionId &&\n /not found|Resource not found/i.test(msg)\n ) {\n const { resumeSessionId, ...rest } = built.body\n void resumeSessionId\n const next = await httpPostJson<SessionDescriptor>(\n url,\n rest,\n endpoint.token,\n )\n return `restarted ${prev.id} → ${next.id}${\n next.name ? ` (${next.name})` : \"\"\n } (fresh — resume not available)`\n }\n throw err\n }\n}\n\nfunction renderSidebar(\n rows: SessionDescriptor[],\n cursor: number,\n width: number,\n height: number,\n c: Record<string, string>,\n statusTone: (s: string) => string,\n): string[] {\n const out: string[] = []\n out.push(`${c.bold}SESSIONS${c.reset} ${c.dim}(${rows.length})${c.reset}`)\n out.push(\"\")\n if (rows.length === 0) {\n out.push(`${c.dim} (none — spawn one)${c.reset}`)\n } else {\n const now = Date.now()\n for (let i = 0; i < rows.length && out.length < height; i++) {\n const r = rows[i]!\n const selected = i === cursor\n const marker = selected ? `${c.cyan}▸${c.reset}` : \" \"\n const ptyBadge = r.pty\n ? `${c.green}PTY${c.reset}`\n : `${c.dim} ${c.reset}`\n const label = r.name ?? r.id\n const tone = statusTone(r.status)\n const age = humaniseDelta(now - new Date(r.startedAt).getTime())\n const labelTrunc = truncate(label, 18)\n const line =\n `${marker} ${ptyBadge} ${labelTrunc.padEnd(18)} ${tone}${r.status.padEnd(7)}${c.reset} ${c.dim}${age.padStart(4)}${c.reset}`\n out.push(selected ? line : line)\n }\n }\n while (out.length < height) out.push(\"\")\n void width\n return out.slice(0, height)\n}\n\nfunction renderDetail(\n s: SessionDescriptor | undefined,\n width: number,\n height: number,\n c: Record<string, string>,\n preview: string[] | undefined,\n): string[] {\n const out: string[] = []\n if (!s) {\n out.push(`${c.bold}DETAIL${c.reset}`)\n out.push(\"\")\n out.push(`${c.dim} no session selected${c.reset}`)\n } else {\n const now = Date.now()\n out.push(`${c.bold}DETAIL${c.reset}`)\n out.push(\"\")\n const kw = (k: string): string => `${c.dim}${k.padEnd(10)}${c.reset}`\n out.push(` ${kw(\"id\")} ${s.id}`)\n if (s.name) out.push(` ${kw(\"name\")} ${c.bold}${s.name}${c.reset}`)\n out.push(` ${kw(\"kind\")} ${s.kind}${s.pty ? ` ${c.green}(pty)${c.reset}` : \"\"}`)\n out.push(` ${kw(\"status\")} ${s.status}`)\n out.push(` ${kw(\"workspace\")} ${s.workspaceSlug}`)\n out.push(` ${kw(\"command\")} ${c.dim}${truncate(s.command, width - 14)}${c.reset}`)\n out.push(` ${kw(\"pid\")} ${s.pid ?? \"—\"}`)\n out.push(` ${kw(\"started\")} ${humaniseDelta(now - new Date(s.startedAt).getTime())} ago`)\n if (s.lastOutputAt)\n out.push(\n ` ${kw(\"last out\")} ${humaniseDelta(now - new Date(s.lastOutputAt).getTime())} ago`,\n )\n if (s.exitCode !== undefined)\n out.push(` ${kw(\"exit code\")} ${s.exitCode}`)\n\n // Resume info — captured ids so the user can verify the\n // continuity machinery actually saw what it needed. claudeResumeId\n // is the most-useful one (provider-native resume); ACP id is the\n // fallback. Both displayed when present.\n if (s.adapterSlug) {\n out.push(` ${kw(\"adapter\")} ${s.adapterSlug}`)\n }\n if (s.adapterSessionId) {\n out.push(\n ` ${kw(\"acp id\")} ${c.dim}${truncate(s.adapterSessionId, width - 14)}${c.reset}`,\n )\n }\n if (s.resumeMetadata) {\n for (const [k, v] of Object.entries(s.resumeMetadata)) {\n out.push(\n ` ${kw(shortKey(k))} ${c.green}${truncate(String(v), width - 14)}${c.reset}`,\n )\n }\n }\n\n out.push(\"\")\n if (s.status === \"running\" || s.status === \"starting\") {\n out.push(` ${c.dim}Enter to attach${c.reset}`)\n } else if (\n s.status === \"exited\" ||\n s.status === \"killed\" ||\n s.status === \"error\"\n ) {\n out.push(` ${c.dim}R to restart${c.reset}`)\n }\n\n // Preview: last N lines from the session's ring buffer, fetched\n // by the dashboard in the background. Helps the user see what\n // the session was doing without committing to an attach.\n if (preview && preview.length > 0) {\n out.push(\"\")\n out.push(` ${c.dim}── recent output ──${c.reset}`)\n for (const line of preview) {\n out.push(` ${c.dim}${truncate(line, width - 4)}${c.reset}`)\n }\n }\n }\n while (out.length < height) out.push(\"\")\n return out.slice(0, height)\n}\n\n/** Compact display label for resumeMetadata keys. */\nfunction shortKey(k: string): string {\n // claudeResumeId → \"claude id\", hermesResumeId → \"hermes id\", …\n const m = k.match(/^([a-z]+)ResumeId$/i)\n return m ? `${m[1]!.toLowerCase()} id` : k\n}\n\n/**\n * Reduce a RuntimeEvent to a one-liner for the events strip. Returns\n * null for events we don't want to surface (heartbeat-error spam,\n * etc).\n */\nfunction summariseEvent(ev: Record<string, unknown>): string | null {\n const type = typeof ev.type === \"string\" ? ev.type : \"?\"\n switch (type) {\n case \"boot\":\n return `boot · ${(ev.workspace as string | undefined)?.split(\"/\").pop() ?? \"?\"}`\n case \"remote-log\":\n return `tunnel: ${truncate(String(ev.line ?? \"\"), 60)}`\n case \"session-spawn\":\n return `spawn ${ev.id ?? \"?\"}`\n case \"session-exit\":\n return `exit ${ev.id ?? \"?\"} (${ev.exitCode ?? \"?\"})`\n case \"heartbeat-error\":\n return `heartbeat error ${truncate(String(ev.error ?? \"\"), 40)}`\n default:\n return `${type}`\n }\n}\n\nfunction shortTime(iso: string): string {\n try {\n const d = new Date(iso)\n return `${d.getHours().toString().padStart(2, \"0\")}:${d.getMinutes().toString().padStart(2, \"0\")}:${d.getSeconds().toString().padStart(2, \"0\")}`\n } catch {\n return \"??:??:??\"\n }\n}\n\n/**\n * Build a left/right justified row that NEVER overflows `cols`. When\n * left + right would exceed the width, the right side is dropped\n * first (it's metadata — keep the title). When even the left side\n * is too wide, truncate with `…`. Without this, the row wraps and\n * pushes the rest of the screen down by a line.\n */\nfunction fitRow(left: string, right: string, cols: number): string {\n const leftLen = stripAnsi(left).length\n const rightLen = stripAnsi(right).length\n if (leftLen + 1 + rightLen <= cols) {\n return left + \" \".repeat(cols - leftLen - rightLen) + right\n }\n if (leftLen <= cols) {\n return left + \" \".repeat(Math.max(0, cols - leftLen))\n }\n return truncateAnsi(left, cols)\n}\n\n/**\n * Right-pad a possibly-ANSI-containing string to a target VISIBLE\n * width. Plain `String.prototype.padEnd` counts ANSI escape bytes\n * as visible characters, which pushes the next column right of its\n * intended position by however many bytes of color codes are in the\n * string. This helper counts visible chars only.\n */\nfunction padEndVisible(s: string, width: number): string {\n const visible = stripAnsi(s).length\n if (visible >= width) return s\n return s + \" \".repeat(width - visible)\n}\n\nfunction truncateAnsi(s: string, max: number): string {\n // ANSI escapes are zero-width so truncation should account for them.\n // Simple approach: strip, count visible, slice raw to roughly the\n // same prefix. Good enough for header / footer fixed strings.\n const visible = stripAnsi(s).length\n if (visible <= max) return s\n // Pessimistic: just cut to `max` chars; rare case anyway.\n return s.slice(0, max - 1) + \"…\"\n}\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*m/g, \"\")\n}\n\nfunction httpDelete(url: string, token?: string): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const u = new URL(url)\n const lib = u.protocol === \"https:\" ? https : http\n const headers: Record<string, string> = {}\n if (token) headers.authorization = `Bearer ${token}`\n const req = lib.request(u, { method: \"DELETE\", headers }, res => {\n let raw = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", c => (raw += c))\n res.on(\"end\", () => {\n const status = res.statusCode ?? 0\n if (status < 200 || status >= 300) {\n reject(new Error(`HTTP ${status}: ${raw.slice(0, 200)}`))\n return\n }\n try {\n resolve(raw ? JSON.parse(raw) : {})\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n })\n })\n req.on(\"error\", reject)\n req.end()\n })\n}\n\ninterface AttachOpts {\n endpoint: DaemonEndpoint\n /** id or name. We fetch the descriptor first and switch transport\n * (SSE vs PTY WS) based on `desc.pty`. */\n idOrName: string\n colour: boolean\n}\n\n/**\n * `agentproto sessions mirror <id-or-name>` — read-only tail of a\n * PTY session. Unlike `--attach`, this NEVER takes stdin: Ctrl-C\n * exits the mirror process cleanly without affecting the underlying\n * session. Great for peeking at what an agent or a long-running TUI\n * is doing without committing to a full duplex attach (and the\n * Ctrl-] q detach chord some terminals swallow).\n *\n * For non-PTY sessions, falls back to the existing line-based SSE\n * stream (also already read-only).\n */\n/**\n * `agentproto sessions restart <id-or-name>` — respawn a session\n * from history. Looks up the descriptor (alive or historical),\n * clones its kind/argv/cwd/workspace/name/label, and starts a fresh\n * instance via the matching route (/sessions/terminal for PTY,\n * /sessions/agent for ACP agents).\n *\n * The new session gets a new id but reuses the original `name`\n * (which the daemon freed when the old session became\n * killed/exited). Output buffers are NOT carried over — we only\n * persist descriptor metadata, not byte streams.\n */\nasync function runRestart(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: {\n attach: { type: \"boolean\" },\n json: { type: \"boolean\" },\n \"no-color\": { type: \"boolean\" },\n },\n })\n const id = positionals[0]\n if (!id) {\n process.stderr.write(\n \"agentproto sessions restart: missing session id or name.\\n\" +\n \" Try: agentproto sessions restart claude-tui\\n\",\n )\n return 2\n }\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions restart\")\n return 2\n }\n const endpoint = report.found\n\n // Fetch the (possibly historical) descriptor.\n let prev: SessionDescriptor\n try {\n prev = await httpGetJson<SessionDescriptor>(\n `${endpoint.url}/sessions/${encodeURIComponent(id)}`,\n )\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 404/.test(msg)) {\n process.stderr.write(\n `agentproto sessions restart: no session \"${id}\" found in registry or history.\\n`,\n )\n return 2\n }\n process.stderr.write(`agentproto sessions restart: ${msg}\\n`)\n return 1\n }\n\n // Augment with provider-fs-derived resume id when our own capture\n // missed it (e.g., the session was killed before printing the\n // resume hint), then build the body.\n prev = await augmentWithFsResume(prev)\n let built: RestartBody\n try {\n built = buildRestartBody(prev)\n } catch (err) {\n process.stderr.write(\n `agentproto sessions restart: ${err instanceof Error ? err.message : String(err)}\\n`,\n )\n return 2\n }\n const body = built.body\n const url =\n built.url === \"__pty__\"\n ? `${endpoint.url}/sessions/terminal`\n : `${endpoint.url}/sessions/agent`\n\n let next: SessionDescriptor\n let resumeFallback = false\n try {\n next = await httpPostJson<SessionDescriptor>(url, body, endpoint.token)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 401/.test(msg)) {\n process.stderr.write(\n (await explain401(endpoint, \"agentproto sessions restart\")) + \"\\n\",\n )\n return 1\n }\n // Adapter doesn't know the resume id — retry without it.\n if (body.resumeSessionId && /not found|Resource not found/i.test(msg)) {\n try {\n const { resumeSessionId: _, ...rest } = body\n void _\n next = await httpPostJson<SessionDescriptor>(\n url,\n rest,\n endpoint.token,\n )\n resumeFallback = true\n } catch (err2) {\n process.stderr.write(\n `agentproto sessions restart: ${err2 instanceof Error ? err2.message : String(err2)}\\n`,\n )\n return 1\n }\n } else {\n process.stderr.write(`agentproto sessions restart: ${msg}\\n`)\n return 1\n }\n }\n\n if (values.json) {\n process.stdout.write(JSON.stringify(next, null, 2) + \"\\n\")\n } else {\n const lineage = resumeFallback\n ? \"fresh — resume not available\"\n : describeResumePath(prev) || \"fresh shape\"\n process.stdout.write(\n `agentproto sessions restart: spawned ${next.id}` +\n `${next.name ? ` (${next.name})` : \"\"} — ${next.command}\\n` +\n ` (${lineage} from ${prev.id})\\n`,\n )\n }\n\n if (values.attach) {\n return runAttach({\n endpoint,\n idOrName: next.id,\n colour: !values[\"no-color\"],\n })\n }\n return 0\n}\n\n/**\n * Shell-style argv tokenizer for legacy descriptors that don't carry\n * `argv` separately. Same rules as the spawn-dialog tokenizer in the\n * web app: whitespace splits, single + double quotes group.\n */\nfunction tokenizeCommand(s: string): string[] {\n const out: string[] = []\n let buf = \"\"\n let inSingle = false\n let inDouble = false\n for (let i = 0; i < s.length; i++) {\n const ch = s[i]\n if (ch === \"'\" && !inDouble) {\n inSingle = !inSingle\n continue\n }\n if (ch === '\"' && !inSingle) {\n inDouble = !inDouble\n continue\n }\n if (!inSingle && !inDouble && /\\s/.test(ch ?? \"\")) {\n if (buf) {\n out.push(buf)\n buf = \"\"\n }\n continue\n }\n buf += ch\n }\n if (buf) out.push(buf)\n return out\n}\n\nasync function runMirror(args: readonly string[]): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...args],\n allowPositionals: true,\n strict: true,\n options: { \"no-color\": { type: \"boolean\" } },\n })\n const id = positionals[0]\n if (!id) {\n process.stderr.write(\n \"agentproto sessions mirror: missing session id or name.\\n\" +\n \" Try: agentproto sessions mirror claude-tui\\n\",\n )\n return 2\n }\n const report = await discoverDaemon()\n if (!report.found) {\n printNoDaemonError(report, \"agentproto sessions mirror\")\n return 2\n }\n const endpoint = report.found\n let desc: SessionDescriptor\n try {\n desc = await httpGetJson<SessionDescriptor>(\n `${endpoint.url}/sessions/${encodeURIComponent(id)}`,\n )\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 404/.test(msg)) {\n process.stderr.write(\n `agentproto sessions mirror: no session \"${id}\".\\n`,\n )\n return 2\n }\n process.stderr.write(`agentproto sessions mirror: ${msg}\\n`)\n return 1\n }\n // Pre-attach status check — the underlying PTY process is gone for\n // exited/killed/error sessions; the WS upgrade would only return a\n // confusing close 1011 mid-stream. Tell the user what happened and\n // point at restart.\n if (\n desc.pty === true &&\n (desc.status === \"exited\" ||\n desc.status === \"killed\" ||\n desc.status === \"error\")\n ) {\n printDeadSessionHint(\"agentproto sessions mirror\", desc)\n return 2\n }\n if (desc.pty === true) {\n return runPtyMirror(endpoint, desc)\n }\n // SSE stream is already read-only — same shape as --attach for\n // non-PTY sessions. Reuse it directly so `mirror` is symmetric.\n return runSseAttach(endpoint, desc, !values[\"no-color\"])\n}\n\n/**\n * Read-only WS attach to a PTY session. Bytes flow ONLY from daemon\n * → stdout. stdin stays in the user's normal shell state — Ctrl-C\n * triggers SIGINT to this Node process, which exits cleanly without\n * touching the underlying PTY (the daemon-side handle.detach() runs\n * on WS close, leaving the session alive for other attachers).\n */\nasync function runPtyMirror(\n endpoint: DaemonEndpoint,\n desc: SessionDescriptor,\n): Promise<number> {\n return new Promise(done => {\n const initialCols = process.stdout.columns ?? 80\n const initialRows = process.stdout.rows ?? 24\n const wsUrl = `${endpoint.url.replace(/^http/, \"ws\")}/sessions/${desc.id}/pty?cols=${initialCols}&rows=${initialRows}`\n const ws = new WebSocket(wsUrl, {\n headers: endpoint.token\n ? { authorization: `Bearer ${endpoint.token}` }\n : {},\n })\n\n process.stderr.write(\n `\\x1b[2m─ mirroring ${desc.id}${desc.name ? ` (${desc.name})` : \"\"} · read-only · Ctrl-C to exit ·\\x1b[0m\\n`,\n )\n\n let closed = false\n const close = (code: number): void => {\n if (closed) return\n closed = true\n try {\n ws.close(1000, \"client mirror end\")\n } catch {\n // ignore\n }\n done(code)\n }\n\n ws.on(\"message\", raw => {\n let frame: unknown\n try {\n frame = JSON.parse(raw.toString(\"utf8\"))\n } catch {\n return\n }\n if (!frame || typeof frame !== \"object\") return\n const f = frame as Record<string, unknown>\n if (f.kind === \"data\" && typeof f.b64 === \"string\") {\n try {\n process.stdout.write(Buffer.from(f.b64, \"base64\"))\n } catch {\n /* ignore */\n }\n } else if (f.kind === \"exit\") {\n const code = typeof f.exitCode === \"number\" ? f.exitCode : 0\n process.stderr.write(\n `\\n\\x1b[2m─ session ${desc.id} exited (code ${code}) ·\\x1b[0m\\n`,\n )\n close(code)\n }\n })\n ws.on(\"error\", err => {\n process.stderr.write(`agentproto sessions mirror: ${err.message}\\n`)\n close(1)\n })\n ws.on(\"close\", () => close(0))\n process.on(\"SIGINT\", () => {\n process.stderr.write(\n `\\n\\x1b[2m─ mirror ended · session still running on daemon ·\\x1b[0m\\n`,\n )\n close(0)\n })\n })\n}\n\nasync function runAttach(opts: AttachOpts): Promise<number> {\n // Fetch the descriptor first. The daemon's GET handler resolves\n // id-or-name (see findByIdOrName in sessions.ts), so a typo\n // surfaces as a clean 404 here rather than mid-stream silence.\n let desc: SessionDescriptor\n try {\n desc = await httpGetJson<SessionDescriptor>(\n `${opts.endpoint.url}/sessions/${encodeURIComponent(opts.idOrName)}`,\n )\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n if (/HTTP 404/.test(msg)) {\n process.stderr.write(\n `agentproto sessions --attach: no session \"${opts.idOrName}\".\\n`,\n )\n return 2\n }\n process.stderr.write(`agentproto sessions --attach: ${msg}\\n`)\n return 1\n }\n if (\n desc.status === \"exited\" ||\n desc.status === \"killed\" ||\n desc.status === \"error\"\n ) {\n printDeadSessionHint(\"agentproto sessions --attach\", desc)\n return 2\n }\n if (desc.pty === true) {\n return runPtyAttach(opts.endpoint, desc, opts.colour)\n }\n return runSseAttach(opts.endpoint, desc, opts.colour)\n}\n\n/**\n * Pretty error for attach attempts against a dead session. Surfaces\n * the status + age + the exact restart command. Saves the user from\n * the cryptic \"close 1011 — session not attachable\" they'd otherwise\n * see when the WS upgrade fails mid-flight.\n */\nfunction printDeadSessionHint(\n verb: string,\n desc: SessionDescriptor,\n): void {\n const handle = desc.name ?? desc.id\n const exitInfo =\n typeof desc.exitCode === \"number\" ? ` exit ${desc.exitCode}` : \"\"\n const age = desc.endedAt\n ? humaniseDelta(Date.now() - new Date(desc.endedAt).getTime()) + \" ago\"\n : \"previously\"\n process.stderr.write(\n `${verb}: session ${desc.id}${desc.name ? ` (${desc.name})` : \"\"} ` +\n `is \\x1b[31m${desc.status}\\x1b[0m (${age}${exitInfo}).\\n` +\n ` Spawn a fresh instance with the same shape:\\n` +\n ` agentproto sessions restart ${handle}\\n` +\n ` Or look at its descriptor only:\\n` +\n ` agentproto sessions # see all\\n`,\n )\n}\n\nasync function runSseAttach(\n endpoint: DaemonEndpoint,\n desc: SessionDescriptor,\n colour: boolean,\n): Promise<number> {\n return new Promise(done => {\n const url = new URL(`${endpoint.url}/sessions/${desc.id}/stream`)\n const lib = url.protocol === \"https:\" ? https : http\n const headers: Record<string, string> = { accept: \"text/event-stream\" }\n if (endpoint.token) headers.authorization = `Bearer ${endpoint.token}`\n process.stderr.write(\n `\\x1b[2m─ attached to ${desc.id}${desc.name ? ` (${desc.name})` : \"\"} · Ctrl-C to detach ·\\x1b[0m\\n`,\n )\n const req = lib.get(url, { headers }, res => {\n if (res.statusCode === 404) {\n process.stderr.write(\n `agentproto sessions --attach: no session \"${desc.id}\".\\n`,\n )\n done(2)\n return\n }\n if (res.statusCode !== 200) {\n process.stderr.write(\n `agentproto sessions --attach: HTTP ${res.statusCode}\\n`,\n )\n done(1)\n return\n }\n let buf = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", chunk => {\n buf += chunk\n let idx = buf.indexOf(\"\\n\\n\")\n while (idx !== -1) {\n const event = buf.slice(0, idx)\n buf = buf.slice(idx + 2)\n for (const line of event.split(\"\\n\")) {\n if (line.startsWith(\"data:\")) {\n const payload = line.slice(5).trim()\n try {\n const json = JSON.parse(payload) as {\n line?: string\n stream?: \"stdout\" | \"stderr\"\n }\n if (typeof json.line !== \"string\") continue\n if (colour && json.stream === \"stderr\") {\n process.stdout.write(`\\x1b[31m${json.line}\\x1b[0m\\n`)\n } else {\n process.stdout.write(json.line + \"\\n\")\n }\n } catch {\n // Ignore ill-formed frames silently — daemon may have\n // sent a comment / heartbeat the parser doesn't model.\n }\n }\n }\n idx = buf.indexOf(\"\\n\\n\")\n }\n })\n res.on(\"end\", () => done(0))\n })\n req.on(\"error\", err => {\n process.stderr.write(`agentproto sessions --attach: ${err.message}\\n`)\n done(1)\n })\n process.on(\"SIGINT\", () => {\n req.destroy()\n done(0)\n })\n })\n}\n\n/**\n * PTY attach via the daemon's `/sessions/:id/pty` WebSocket. Sets the\n * caller's stdin to raw mode so every keystroke flows to the child\n * verbatim (including Ctrl-C → SIGINT in the PTY). Detach chord:\n * Ctrl-] q close the WS, restore terminal modes, exit code 0\n * Without the chord the session stays alive on the daemon when the\n * process exits / closes. Resize is bridged via SIGWINCH.\n */\nasync function runPtyAttach(\n endpoint: DaemonEndpoint,\n desc: SessionDescriptor,\n _colour: boolean,\n): Promise<number> {\n return new Promise(done => {\n const stdoutTty = process.stdout.isTTY === true\n const stdinTty = process.stdin.isTTY === true\n const initialCols =\n stdoutTty && process.stdout.columns ? process.stdout.columns : 80\n const initialRows =\n stdoutTty && process.stdout.rows ? process.stdout.rows : 24\n const wsUrl = `${endpoint.url.replace(/^http/, \"ws\")}/sessions/${desc.id}/pty?cols=${initialCols}&rows=${initialRows}`\n\n // Reconnect policy. close 1006 (\"abnormal closure\" — the daemon\n // process vanished mid-WS) triggers up to 5 retries with\n // 1s/2s/4s/4s/4s backoff. close 1000 (clean), 4xxx (app-level),\n // and 410/etc on initial handshake all exit immediately. The user\n // gets \"── reconnecting (n/5)…\" while we try; on success the\n // daemon replays its ring buffer so they see what they missed.\n const RECONNECT_DELAYS_MS = [1_000, 2_000, 4_000, 4_000, 4_000]\n let attempt = 0\n // The active WebSocket — re-pointed on each reconnect so the\n // stdin handler (registered once below) always sends to the\n // current connection.\n let ws: WebSocket = new WebSocket(wsUrl, {\n headers: endpoint.token\n ? { authorization: `Bearer ${endpoint.token}` }\n : {},\n })\n\n let armed = false\n // Triple-Ctrl-C detach: AZERTY-friendly alternative to Ctrl-] q\n // that doesn't conflict with Claude's own \"press Ctrl-C again to\n // exit\" UX. Claude exits on the 2nd Ctrl-C → child gone → WS\n // closes naturally. For non-Claude TUIs (bash, vim, htop, …)\n // three Ctrl-Cs in 1s is a deliberate signal we use to detach\n // without taking the child down; the extras forwarded to the\n // child are no-ops in those shells.\n const TRIPLE_CTRLC_WINDOW_MS = 1_000\n const ctrlCTimestamps: number[] = []\n let exitCode = 0\n let restored = false\n const restore = (): void => {\n if (restored) return\n restored = true\n if (stdinTty) {\n try {\n process.stdin.setRawMode(false)\n } catch {\n // ignore\n }\n process.stdin.pause()\n }\n process.stdin.off(\"data\", onStdin)\n process.stdout.off(\"resize\", onResize)\n process.off(\"SIGWINCH\", onResize)\n }\n\n const onStdin = (raw: Buffer | string): void => {\n if (ws.readyState !== WebSocket.OPEN) return\n // stdin's encoding mode may have been left in \"utf8\" by a prior\n // helper (printPickerTable, runWatch, …). Coerce to Buffer at\n // the boundary so byte-comparisons in the detach-chord scan are\n // reliable AND multi-byte chars survive base64 round-trip\n // (sending each byte as its own frame would split a 2-byte é).\n const chunk = typeof raw === \"string\" ? Buffer.from(raw, \"utf8\") : raw\n\n // Triple-Ctrl-C detach. Track the last few Ctrl-C timestamps;\n // when three of them fall inside TRIPLE_CTRLC_WINDOW_MS we\n // detach. Each individual Ctrl-C is ALSO forwarded to the\n // child so the user's normal interrupt UX is preserved —\n // Claude's \"press Ctrl-C again to exit\" still works (it\n // happens on the 2nd press; the 3rd never fires because the\n // child is already gone, no detach is triggered there).\n if (chunk.length === 1 && chunk[0] === 0x03) {\n const now = Date.now()\n ctrlCTimestamps.push(now)\n // Keep only timestamps inside the window.\n while (\n ctrlCTimestamps.length > 0 &&\n now - ctrlCTimestamps[0]! > TRIPLE_CTRLC_WINDOW_MS\n ) {\n ctrlCTimestamps.shift()\n }\n if (ctrlCTimestamps.length >= 3) {\n ctrlCTimestamps.length = 0\n try {\n ws.close(1000, \"client detach (triple-ctrlc)\")\n } catch {\n // ignore\n }\n return\n }\n // Fall through to forward this Ctrl-C to the child.\n }\n\n // Detach chord scan: Ctrl-] (0x1d) then q/Q. Either part of the\n // chord may straddle two stdin chunks, so we keep `armed` across\n // invocations.\n let scan = chunk\n if (armed) {\n // Previous chunk ended with 0x1d. If THIS chunk starts with\n // q/Q, detach; otherwise emit the held 0x1d and the new bytes.\n const first = scan[0]\n if (first === 0x71 || first === 0x51) {\n armed = false\n try {\n ws.close(1000, \"client detach\")\n } catch {\n // ignore\n }\n return\n }\n // Not the chord — flush the held 0x1d as a leading byte by\n // prepending it before further processing.\n scan = Buffer.concat([Buffer.from([0x1d]), scan])\n armed = false\n }\n\n // Look for an in-chunk 0x1d. If found at the LAST position, hold\n // it for the next stdin event (it might pair with q/Q). If found\n // mid-chunk, check the very next byte — q/Q → detach, else let\n // both through.\n const idx = scan.indexOf(0x1d)\n if (idx === -1) {\n ws.send(JSON.stringify({ kind: \"input\", b64: scan.toString(\"base64\") }))\n return\n }\n if (idx === scan.length - 1) {\n // Trailing 0x1d — defer.\n armed = true\n const head = scan.subarray(0, idx)\n if (head.length > 0) {\n ws.send(JSON.stringify({ kind: \"input\", b64: head.toString(\"base64\") }))\n }\n return\n }\n const next = scan[idx + 1]\n if (next === 0x71 || next === 0x51) {\n // Detach mid-chunk. Send the head (bytes before 0x1d), drop\n // both chord bytes, then close. Anything after the chord is\n // discarded — typing past the detach chord is a user error.\n const head = scan.subarray(0, idx)\n if (head.length > 0) {\n ws.send(JSON.stringify({ kind: \"input\", b64: head.toString(\"base64\") }))\n }\n try {\n ws.close(1000, \"client detach\")\n } catch {\n // ignore\n }\n return\n }\n // 0x1d followed by something other than q/Q — emit the whole\n // chunk as-is (the 0x1d may legitimately be Ctrl-] -> some app\n // command, e.g. less's prefix). The remote pty figures it out.\n ws.send(JSON.stringify({ kind: \"input\", b64: scan.toString(\"base64\") }))\n }\n\n const onResize = (): void => {\n if (ws.readyState !== WebSocket.OPEN) return\n const cols =\n stdoutTty && process.stdout.columns ? process.stdout.columns : 80\n const rows = stdoutTty && process.stdout.rows ? process.stdout.rows : 24\n ws.send(JSON.stringify({ kind: \"resize\", cols, rows }))\n }\n\n let inputWired = false\n let sessionExited = false\n\n const wireWs = (sock: WebSocket): void => {\n sock.on(\"open\", () => {\n if (attempt === 0) {\n process.stderr.write(\n `\\x1b[2m─\\x1b[0m attached to \\x1b[1m${desc.id}${desc.name ? ` (${desc.name})` : \"\"}\\x1b[0m · ` +\n `\\x1b[7m triple Ctrl-C \\x1b[0m or \\x1b[7m Ctrl-] then q \\x1b[0m to detach · ` +\n `Ctrl-C reaches the child (works with Claude's exit)\\n`,\n )\n } else {\n process.stderr.write(\n `\\x1b[32m─ reconnected to ${desc.id} (attempt ${attempt + 1})\\x1b[0m\\n`,\n )\n }\n attempt = 0\n if (!inputWired) {\n if (stdinTty) {\n try {\n process.stdin.setRawMode(true)\n } catch {\n // ignore\n }\n process.stdin.resume()\n }\n process.stdin.on(\"data\", onStdin)\n process.stdout.on(\"resize\", onResize)\n process.on(\"SIGWINCH\", onResize)\n inputWired = true\n }\n onResize()\n })\n\n sock.on(\"message\", raw => {\n let frame: unknown\n try {\n frame = JSON.parse(raw.toString(\"utf8\"))\n } catch {\n return\n }\n if (!frame || typeof frame !== \"object\") return\n const f = frame as Record<string, unknown>\n switch (f.kind) {\n case \"data\": {\n if (typeof f.b64 === \"string\") {\n try {\n process.stdout.write(Buffer.from(f.b64, \"base64\"))\n } catch {\n // ignore\n }\n }\n break\n }\n case \"exit\": {\n const code = typeof f.exitCode === \"number\" ? f.exitCode : 0\n process.stderr.write(\n `\\n\\x1b[2m─ session ${desc.id} exited (code ${code}) ·\\x1b[0m\\n`,\n )\n exitCode = code\n sessionExited = true\n break\n }\n // pong / unknown — ignore\n }\n })\n\n sock.on(\"close\", (code: number, reason: Buffer) => {\n // 1000 = clean: either we initiated (detach) or daemon shut\n // us down cleanly. Either way we're done.\n // 1006 = abnormal: daemon process vanished without a close\n // frame. Worth retrying — they may be coming back up.\n // 4xxx / 410 / 401 / etc. = app-level rejection (session\n // exited, auth, etc.) — surfaced before WS upgrade. Done.\n if (sessionExited || code === 1000) {\n restore()\n done(exitCode)\n return\n }\n if (code === 1006 && attempt < RECONNECT_DELAYS_MS.length) {\n const delay = RECONNECT_DELAYS_MS[attempt] ?? 4_000\n attempt++\n process.stderr.write(\n `\\x1b[33m─ disconnected (close ${code}) · reconnecting in ${Math.round(delay / 1000)}s (${attempt}/${RECONNECT_DELAYS_MS.length})…\\x1b[0m\\n`,\n )\n setTimeout(() => {\n ws = new WebSocket(wsUrl, {\n headers: endpoint.token\n ? { authorization: `Bearer ${endpoint.token}` }\n : {},\n })\n wireWs(ws)\n }, delay)\n return\n }\n // Out of retries or unknown close — surface clearly.\n const reasonText = reason && reason.length > 0 ? ` — ${reason.toString(\"utf8\")}` : \"\"\n process.stderr.write(\n `\\n\\x1b[31m─ disconnected (close ${code}${reasonText})\\x1b[0m\\n` +\n ` daemon may be down. Restart it (\\`agentproto serve\\`) then re-attach:\\n` +\n ` agentproto sessions --attach ${desc.name ?? desc.id}\\n`,\n )\n restore()\n done(1)\n })\n\n sock.on(\"error\", () => {\n // Don't write a noisy error line — 'close' will fire next\n // with the actual reason. WS errors during reconnect attempts\n // are expected and we don't want to spam the terminal.\n })\n }\n\n wireWs(ws)\n\n process.on(\"SIGINT\", () => {\n // In PTY mode, Ctrl-C SHOULD go to the child. The terminal\n // emulator forwards \\x03 directly through stdin. SIGINT here\n // only fires when stdin isn't a TTY — in which case we detach.\n try {\n ws.close(1000, \"sigint\")\n } catch {\n // ignore\n }\n })\n })\n}\n\n/**\n * Probe `<base>/health` to determine whether the daemon at this URL\n * is reachable. Used to disambiguate \"no daemon listening\" vs\n * \"daemon listening but rejected my token\" when a mutating call\n * 401s. Times out after 500ms so a hung process doesn't stall the\n * CLI error path.\n */\nasync function probeDaemonHealth(baseUrl: string): Promise<boolean> {\n return new Promise<boolean>(resolve => {\n try {\n const u = new URL(`${baseUrl}/health`)\n const lib = u.protocol === \"https:\" ? https : http\n const req = lib.get(u, { timeout: 500 }, res => {\n resolve((res.statusCode ?? 0) >= 200 && (res.statusCode ?? 0) < 300)\n res.resume()\n })\n req.on(\"error\", () => resolve(false))\n req.on(\"timeout\", () => {\n req.destroy()\n resolve(false)\n })\n } catch {\n resolve(false)\n }\n })\n}\n\n/**\n * Build a clear error message for a sessions_unauthorized response.\n * The 401 from the daemon is almost always one of three things:\n * 1. The token in this runtime.json is stale (daemon restarted).\n * 2. The CLI's Origin doesn't match the daemon's allowlist\n * (irrelevant from CLI — there's no Origin header — but kept\n * in the daemon side for browser callers).\n * 3. AGENTPROTO_DAEMON_TOKEN env var is set to a wrong value.\n *\n * We do NOT have the daemon's true token, so we can't auto-recover.\n * Instead we tell the user exactly which file the token came from\n * + how to get the right one.\n */\nasync function explain401(\n endpoint: DaemonEndpoint,\n verb: string,\n): Promise<string> {\n const alive = await probeDaemonHealth(endpoint.url)\n const lines: string[] = [\n `${verb}: 401 sessions_unauthorized from ${endpoint.url}`,\n ]\n if (!alive) {\n lines.push(\n ` the daemon at ${endpoint.url} is NOT reachable (no /health response).`,\n ` the runtime.json may point at a stopped port — try \\`agentproto serve\\`.`,\n )\n return lines.join(\"\\n\")\n }\n // Daemon is alive — definitely a token mismatch.\n if (process.env.AGENTPROTO_DAEMON_TOKEN) {\n lines.push(\n ` daemon /health is reachable. AGENTPROTO_DAEMON_TOKEN is set in your env —`,\n ` it may be from a previous daemon boot. Clear it: \\`unset AGENTPROTO_DAEMON_TOKEN\\`,`,\n ` or set it to the live token: \\`export AGENTPROTO_DAEMON_TOKEN=$(jq -r .token <runtime.json>)\\`.`,\n )\n } else if (endpoint.sourcePath) {\n lines.push(\n ` daemon /health is reachable — token mismatch is the cause.`,\n ` this CLI used the token from:`,\n ` ${endpoint.sourcePath}`,\n ` if you have multiple daemons or restarted the daemon since this file was written,`,\n ` that file's token is stale. Restart the live daemon (\\`agentproto serve\\`) which`,\n ` rewrites its own runtime.json, then re-run.`,\n )\n } else {\n lines.push(\n ` daemon /health is reachable — token mismatch is the cause.`,\n ` unable to identify which file the token came from (env override?).`,\n )\n }\n return lines.join(\"\\n\")\n}\n\nfunction httpPostJson<T>(\n url: string,\n body: unknown,\n token?: string,\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const u = new URL(url)\n const payload = Buffer.from(JSON.stringify(body), \"utf8\")\n const lib = u.protocol === \"https:\" ? https : http\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n \"content-length\": payload.byteLength.toString(),\n }\n if (token) headers.authorization = `Bearer ${token}`\n const req = lib.request(\n u,\n { method: \"POST\", headers },\n res => {\n let raw = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", c => (raw += c))\n res.on(\"end\", () => {\n const status = res.statusCode ?? 0\n if (status < 200 || status >= 300) {\n reject(new Error(`HTTP ${status}: ${raw.slice(0, 200)}`))\n return\n }\n try {\n resolve(JSON.parse(raw) as T)\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n })\n }\n )\n req.on(\"error\", reject)\n req.write(payload)\n req.end()\n })\n}\n\nasync function httpGetJson<T = unknown>(url: string): Promise<T> {\n return (await httpGetJsonImpl(url)) as T\n}\n\nfunction httpGetJsonImpl(url: string): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const u = new URL(url)\n const lib = u.protocol === \"https:\" ? https : http\n lib\n .get(u, res => {\n let body = \"\"\n res.setEncoding(\"utf8\")\n res.on(\"data\", c => (body += c))\n res.on(\"end\", () => {\n if ((res.statusCode ?? 0) < 200 || (res.statusCode ?? 0) >= 300) {\n reject(new Error(`HTTP ${res.statusCode}: ${body.slice(0, 200)}`))\n return\n }\n try {\n resolve(JSON.parse(body))\n } catch (err) {\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n })\n })\n .on(\"error\", reject)\n })\n}\n","#!/usr/bin/env node\n/**\n * `agentproto` — the binary entry. Three verbs:\n *\n * agentproto install <slug> install an adapter's underlying CLI\n * agentproto run <slug> [--cwd <dir>] spawn the adapter and stream a turn\n * agentproto serve --connect <url> daemon — relay spawns over WS\n *\n * Adapter slugs resolve through the registry (see ./registry/resolve.ts).\n * Out of the box we ship `claude-code`, `hermes` etc. via npm-installed\n * `@agentproto/adapter-<slug>` packages.\n *\n * argv handling: we identify the verb manually (first non-flag token)\n * and hand the rest verbatim to the verb's parser. Going through one\n * top-level parseArgs would either need to know every flag of every\n * verb up front (lossy) or use `strict: false` (which then eats verb\n * flags as positionals — see commit history for the bug this caused).\n */\n\nimport { runAuth } from \"./commands/auth.js\"\nimport { runConfig } from \"./commands/config.js\"\nimport { runInstall } from \"./commands/install.js\"\nimport { runSetupCommand } from \"./commands/setup.js\"\nimport { runPlugins } from \"./commands/plugins.js\"\nimport { runRun } from \"./commands/run.js\"\nimport { runRunSwarm } from \"./commands/run-swarm.js\"\nimport { runServe } from \"./commands/serve.js\"\nimport { runWorkspace } from \"./commands/workspace.js\"\nimport { runSessions } from \"./commands/sessions.js\"\n\nconst USAGE = `agentproto — AIP-45 agent CLI host\n\nUsage:\n agentproto auth <login|status|logout> [--host <url>] [--label <name>]\n agentproto config <show|path|get|set|unset|edit> [args]\n agentproto daemon <install|uninstall|start|stop|status|logs> [args]\n agentproto install <slug> [--force] [--dry-run] [--skip-setup]\n <slug> ∈ { <adapter-slug> | runtime-profile/<name> }\n agentproto plugins <list|show|install|uninstall|enable|disable> [args]\n agentproto setup <slug> [--force] [--dry-run] [--only <stepId>...]\n agentproto run <slug> [--cwd <dir>] [--prompt <text>] [--resume <session-id>]\n agentproto run-swarm --manifest <path> [--once] [--interval <ms|Ns>] [--verbose]\n agentproto serve [--profile <name>]\n [--workspace <dir>] [--port <n>] [--bind <ip>]\n [--connect <url> [--token <jwt>] [--label <name>]]\n [--allow-origin <url> …] [--interactive | -i]\n agentproto workspace <add|list|remove|use> [args]\n agentproto sessions [--watch] [--attach <id-or-name>] [--json]\n agentproto sessions start <adapter> [--cwd <dir>] [--workspace <slug>]\n [--prompt <text>] [--label <text>] [--attach]\n agentproto sessions terminal -- <argv...> [--cwd <dir>] [--workspace <slug>]\n [--name <slug>] [--label <text>]\n [--cols <n>] [--rows <n>] [--attach]\n agentproto sessions mirror <id-or-name> read-only tail (Ctrl-C to exit)\n agentproto sessions stop <id-or-name>\n agentproto --help\n agentproto --version\n\nExamples:\n agentproto auth login --host wss://guilde.work # device flow → ~/.agentproto/credentials.json\n agentproto install claude-code\n agentproto install runtime-profile/standard # drops .claude/ swarm scaffolding into the cwd\n agentproto setup openclaw # re-run setup (idempotent via skip_if + ledger)\n agentproto run claude-code --cwd . --prompt \"summarise this repo\"\n agentproto run-swarm --manifest .runtime/local.yaml --verbose\n agentproto workspace add ~/code/my-project --slug my-project\n agentproto workspace list\n agentproto serve --connect wss://guilde.work/api/v1/agentproto/tunnel\n agentproto sessions start claude-code --workspace my-app --attach\n agentproto sessions terminal --name claude-tui --attach -- claude\n agentproto sessions stop claude-tui\n agentproto config set daemon.port 18791\n agentproto config set daemon.allowedOrigins https://guilde.work\n agentproto daemon install # write launchd plist + start (macOS)\n agentproto daemon status # plist? loaded? /health probe?\n`\n\nconst VERBS = new Set([\n \"auth\",\n \"config\",\n \"daemon\",\n \"install\",\n \"plugins\",\n \"setup\",\n \"run\",\n \"run-swarm\",\n \"serve\",\n \"workspace\",\n \"sessions\",\n])\n\nasync function main(argv: readonly string[]): Promise<number> {\n // Find the verb — first token that matches a known verb. Anything\n // before it is a top-level flag (--help/--version); anything after\n // is forwarded to the verb's own parser.\n const verbIdx = argv.findIndex((a) => VERBS.has(a))\n\n if (verbIdx === -1) {\n if (argv.includes(\"--version\") || argv.includes(\"-v\")) {\n process.stdout.write(\"agentproto 0.1.0-alpha\\n\")\n return 0\n }\n if (argv.includes(\"--help\") || argv.includes(\"-h\") || argv.length === 0) {\n process.stdout.write(USAGE)\n return 0\n }\n process.stderr.write(\n `agentproto: unrecognised argument(s): ${argv.join(\" \")}\\n\\n${USAGE}`\n )\n return 2\n }\n\n const verb = argv[verbIdx]\n const rest = argv.slice(verbIdx + 1)\n\n switch (verb) {\n case \"auth\":\n return runAuth(rest)\n case \"config\":\n return runConfig(rest)\n case \"daemon\": {\n // Lazy-import the daemon command — its launchctl/systemd\n // shims pull in platform-specific code (plist templating,\n // shell-out helpers) we don't need until the verb fires.\n const { runDaemon } = await import(\"./commands/daemon.js\")\n return runDaemon(rest)\n }\n case \"install\":\n return runInstall(rest)\n case \"plugins\":\n return runPlugins(rest)\n case \"setup\":\n return runSetupCommand(rest)\n case \"run\":\n return runRun(rest)\n case \"run-swarm\":\n return runRunSwarm(rest)\n case \"serve\":\n return runServe(rest)\n case \"workspace\":\n return runWorkspace(rest)\n case \"sessions\":\n return runSessions(rest)\n default:\n // Unreachable — VERBS membership checked above.\n process.stderr.write(`agentproto: unknown verb '${verb}'\\n\\n${USAGE}`)\n return 2\n }\n}\n\nmain(process.argv.slice(2)).then(\n (code) => {\n process.exitCode = code\n },\n (err: unknown) => {\n const msg = err instanceof Error ? err.stack ?? err.message : String(err)\n process.stderr.write(`agentproto: ${msg}\\n`)\n process.exitCode = 1\n }\n)\n"]}