dominus-cli 0.6.0 → 2.0.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/index.js +2714 -512
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +3786 -294
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
- package/plugin/Dominus.rbxm +0 -0
- package/plugin/src/Properties.lua +69 -9
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/config.ts","../src/transport/protocol.ts","../src/transport/ws-server.ts","../src/transport/ws-client.ts","../src/agent/internal-memory.ts","../src/memory/store.ts","../src/tools/studio/read-script.ts","../src/tools/studio/edit-script.ts","../src/tools/studio/run-code.ts","../src/tools/studio/get-explorer.ts","../src/tools/studio/get-properties.ts","../src/tools/studio/get-descendants-properties.ts","../src/tools/studio/set-properties.ts","../src/tools/studio/insert-instance.ts","../src/tools/studio/delete-instance.ts","../src/tools/studio/get-output.ts","../src/tools/studio/get-selection.ts","../src/tools/studio/search-scripts.ts","../src/tools/studio/run-tests.ts","../src/tools/studio/get-class-info.ts","../src/tools/studio/create-ui.ts","../src/tools/studio/execute-run-test.ts","../src/tools/studio/execute-play-test.ts","../src/tools/studio/create-part.ts","../src/tools/studio/clone-instance.ts","../src/tools/studio/group-instances.ts","../src/tools/studio/build-multiple.ts","../src/tools/studio/serialize-ui.ts","../src/tools/studio/move-instance.ts","../src/tools/studio/bulk-set-properties.ts","../src/tools/studio/find-replace-scripts.ts","../src/tools/memory/recall.ts","../src/tools/memory/remember.ts","../src/tools/cloud/upload-asset.ts","../src/tools/studio/undo-redo.ts","../src/mcp/server.ts","../src/ui/components/Welcome.tsx","../src/ui/components/Setup.tsx","../src/ui/components/StatusBar.tsx","../src/ui/components/OutputPane.tsx","../src/ui/components/ChatPane.tsx","../src/utils/clipboard.ts","../src/ui/components/InputBar.tsx","../src/ui/components/Explorer.tsx","../src/ui/components/ToolCallView.tsx","../src/ui/components/Layout.tsx","../src/ui/hooks/useStudio.ts","../src/app.tsx","../src/index.tsx","../src/ai/provider.ts","../src/agent/system-prompt.ts","../src/agent/context-builder.ts","../src/ai/models.ts","../src/agent/loop.ts","../src/tools/registry.ts","../src/utils/update-checker.ts"],"names":["fs","path","os","WebSocket","EventEmitter","result","tool","React","jsxs","Box","jsx","Text","Fragment","formatTime","useState","useInput","TextInput","useRef","useEffect","useCallback","nanoid","recallFacts","storeFact","getScriptIndex","execSync","__dirname","startMcpServer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgGO,SAAS,qBAAA,GAA6E;AAC3F,EAAA,MAAM,WAA6B,CAAC,QAAA,EAAU,WAAA,EAAa,QAAA,EAAU,OAAO,YAAY,CAAA;AACxF,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,MAAM,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,CAAC,EAAE,MAAM,CAAA;AAC3C,IAAA,IAAI,KAAK,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,QAAQ,GAAA,EAAI;AAAA,EAC7C;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,wBAAwB,MAAA,EAGtC;AACA,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,SAAS,MAAA,CAAO,UAAA,IAAc,YAAA,EAAc,OAAA,IAAW,UAAU,UAAA,CAAW,OAAA;AAAA,IAC5E,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,YAAA,EAAc,YAAA,IAAgB;AAAA,GACvD;AACF;AAgBA,SAAS,SAAA,GAAkB;AACzB,EAAA,IAAI,CAACA,GAAA,CAAG,UAAA,CAAW,WAAW,CAAA,EAAG;AAC/B,IAAAA,GAAA,CAAG,SAAA,CAAU,WAAA,EAAa,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC/C;AACF;AAEA,SAAS,QAAA,CAAY,UAAkB,QAAA,EAAgB;AACrD,EAAA,IAAI;AACF,IAAA,IAAIA,GAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,MAAA,MAAM,GAAA,GAAMA,GAAA,CAAG,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC7C,MAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAE;AAAA,IAC3C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAE,GAAG,QAAA,EAAS;AACvB;AAEA,SAAS,SAAA,CAAU,UAAkB,IAAA,EAAqB;AACxD,EAAA,SAAA,EAAU;AACV,EAAAA,GAAA,CAAG,aAAA,CAAc,UAAU,IAAA,CAAK,SAAA,CAAU,MAAM,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AACnE;AAEO,SAAS,UAAA,GAA4B;AAC1C,EAAA,SAAA,EAAU;AACV,EAAA,OAAO,QAAA,CAAS,aAAa,QAAQ,CAAA;AACvC;AAEO,SAAS,WAAW,MAAA,EAA6B;AACtD,EAAA,SAAA,CAAU,aAAa,MAAM,CAAA;AAC/B;AAEO,SAAS,eAA8C,GAAA,EAA0B;AACtF,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,OAAO,OAAO,GAAG,CAAA;AACnB;AAEO,SAAS,cAAA,CACd,KACA,KAAA,EACM;AACN,EAAA,MAAM,SAAS,UAAA,EAAW;AAE1B,EAAC,MAAA,CAAe,GAAG,CAAA,GAAI,KAAA;AACvB,EAAA,UAAA,CAAW,MAAM,CAAA;AACnB;AAEO,SAAS,SAAA,GAA0B;AACxC,EAAA,SAAA,EAAU;AACV,EAAA,OAAO,QAAA,CAAS,YAAY,aAAa,CAAA;AAC3C;AAEO,SAAS,UAAU,KAAA,EAA2B;AACnD,EAAA,SAAA,CAAU,YAAY,KAAK,CAAA;AAC7B;AAEO,SAAS,aAAA,GAAwB;AACtC,EAAA,SAAA,EAAU;AACV,EAAA,OAAO,WAAA;AACT;AAEO,SAAS,SAAA,GAAoB;AAClC,EAAA,SAAA,EAAU;AACV,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,kBAAA,GAAmC;AACjD,EAAA,OAAO;AAAA,IACL,IAAO,GAAA,EAA4B;AACjC,MAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,MAAA,OAAO,OAAO,GAAG,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,GAAA,CAAI,KAAa,KAAA,EAAsB;AACrC,MAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AACd,MAAA,UAAA,CAAW,MAAkC,CAAA;AAAA,IAC/C,CAAA;AAAA,IACA,MAAA,GAAkC;AAChC,MAAA,OAAO,UAAA,EAAW;AAAA,IACpB;AAAA,GACF;AACF;AAtNA,IAKM,WAAA,EACA,WAAA,EACA,OAAA,EACA,UAAA,EAiBO,WAsDP,QAAA,EA+CA,aAAA;AA9HN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sBAAA,GAAA;AAKA,IAAM,cAAcC,KAAA,CAAK,IAAA,CAAKC,GAAA,CAAG,OAAA,IAAW,UAAU,CAAA;AACtD,IAAM,WAAA,GAAcD,KAAA,CAAK,IAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AACxD,IAAM,OAAA,GAAUA,KAAA,CAAK,IAAA,CAAK,WAAA,EAAa,YAAY,CAAA;AACnD,IAAM,UAAA,GAAaA,KAAA,CAAK,IAAA,CAAK,WAAA,EAAa,YAAY,CAAA;AAiB/C,IAAM,SAAA,GAAoD;AAAA,MAC/D,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,2BAAA;AAAA,QACT,MAAA,EAAQ,gBAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,+BAAA;AAAA,QACT,MAAA,EAAQ,mBAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,eAAA;AAAA,QACN,OAAA,EAAS,yDAAA;AAAA,QACT,MAAA,EAAQ,gBAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,qBAAA;AAAA,QACT,MAAA,EAAQ,aAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,8BAAA;AAAA,QACT,MAAA,EAAQ,oBAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,EAAA;AAAA,QACT,MAAA,EAAQ,EAAA;AAAA,QACR,YAAA,EAAc;AAAA;AAChB,KACF;AAiBA,IAAM,QAAA,GAA0B;AAAA,MAC9B,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY,EAAA;AAAA,MACZ,KAAA,EAAO,EAAA;AAAA,MACP,IAAA,EAAM,KAAA;AAAA,MACN,iBAAA,EAAmB,EAAA;AAAA,MACnB,gBAAA,EAAkB,CAAA;AAAA,MAClB,WAAA,EAAa,KAAA;AAAA,MACb,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,IAAA;AAAA,MACX,QAAA,EAAU;AAAA,KACZ;AAoCA,IAAM,aAAA,GAA8B;AAAA,MAClC,IAAI,EAAC;AAAA,MACL,MAAM,EAAC;AAAA,MACP,aAAa,EAAC;AAAA,MACd,OAAA,EAAS;AAAA,KACX;AAAA,EAAA;AAAA,CAAA,CAAA;AC6BO,SAAS,aAAA,CAAiB,MAAc,OAAA,EAA0B;AACvE,EAAA,OAAO,EAAE,IAAI,MAAA,EAAO,EAAG,MAAM,OAAA,EAAS,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,EAAE;AACvD;AAMO,SAAS,aAAa,GAAA,EAAwB;AACnD,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,MAAM,CAAA,mCAAA,EAAsC,GAAA,CAAI,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3E;AACF;AAEO,SAAS,iBAAiB,GAAA,EAAwB;AACvD,EAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAC3B;AAlLA,IASa,SAAA,EAcA,MAAA;AAvBb,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AASO,IAAM,SAAA,GAAY;AAAA,MACvB,SAAA,EAAW,kBAAA;AAAA,MACX,YAAA,EAAc,qBAAA;AAAA,MACd,QAAA,EAAU,iBAAA;AAAA,MACV,MAAA,EAAQ,eAAA;AAAA,MACR,KAAA,EAAO,cAAA;AAAA,MACP,SAAA,EAAW,kBAAA;AAAA,MACX,cAAA,EAAgB,uBAAA;AAAA,MAChB,cAAA,EAAgB,uBAAA;AAAA,MAChB,QAAA,EAAU,iBAAA;AAAA,MACV,UAAA,EAAY,mBAAA;AAAA,MACZ,YAAA,EAAc;AAAA,KAChB;AAEO,IAAM,MAAA,GAAS;AAAA,MACpB,YAAA,EAAc,kBAAA;AAAA,MACd,UAAA,EAAY,gBAAA;AAAA,MACZ,UAAA,EAAY,gBAAA;AAAA,MACZ,QAAA,EAAU,SAAA;AAAA,MACV,cAAA,EAAgB,oBAAA;AAAA,MAChB,0BAAA,EAA4B,gCAAA;AAAA,MAC5B,cAAA,EAAgB,oBAAA;AAAA,MAChB,eAAA,EAAiB,YAAA;AAAA,MACjB,eAAA,EAAiB,YAAA;AAAA,MACjB,aAAA,EAAe,mBAAA;AAAA,MACf,MAAA,EAAQ,YAAA;AAAA,MACR,cAAA,EAAgB,oBAAA;AAAA,MAChB,UAAA,EAAY,gBAAA;AAAA,MACZ,SAAA,EAAW,eAAA;AAAA,MACX,gBAAA,EAAkB,cAAA;AAAA,MAClB,iBAAA,EAAmB,eAAA;AAAA,MACnB,QAAA,EAAU,cAAA;AAAA,MACV,QAAA,EAAU,cAAA;AAAA,MACV,cAAA,EAAgB,oBAAA;AAAA,MAChB,YAAA,EAAc,kBAAA;AAAA,MACd,YAAA,EAAc,kBAAA;AAAA,MACd,aAAA,EAAe,mBAAA;AAAA,MACf,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,mBAAA,EAAqB,yBAAA;AAAA,MACrB,oBAAA,EAAsB;AAAA,KACxB;AAAA,EAAA;AAAA,CAAA,CAAA;AClDA,IAwCa,aAAA;AAxCb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEA,IAAA,aAAA,EAAA;AAsCO,IAAM,aAAA,GAAN,cAA4B,YAAA,CAAqC;AAAA,MAC9D,GAAA,GAA8B,IAAA;AAAA;AAAA,MAE9B,aAAA,uBAAoB,GAAA,EAA8B;AAAA;AAAA,MAElD,WAAA,uBAAkB,GAAA,EAAuB;AAAA;AAAA,MAEzC,aAAA,GAAgB,CAAA;AAAA,MAChB,WAAA,uBAAkB,GAAA,EAAe;AAAA,MACjC,eAAA,uBAAsB,GAAA,EAG5B;AAAA,MACM,aAAA,uBAAoB,GAAA,EAAuB;AAAA,MAC3C,IAAA;AAAA,MAER,WAAA,CAAY,OAAO,KAAA,EAAO;AACxB,QAAA,KAAA,EAAM;AACN,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,MACd;AAAA,MAEA,KAAA,CAAM,aAAa,CAAA,EAAkB;AACnC,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,UAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAc,OAAA,KAAoB;AACjD,YAAA,MAAM,GAAA,GAAM,IAAI,eAAA,CAAgB,EAAE,MAAM,CAAA;AAExC,YAAA,GAAA,CAAI,EAAA,CAAG,aAAa,MAAM;AACxB,cAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,cAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,cAAA,IAAA,CAAK,GAAA,CAAI,GAAG,YAAA,EAAc,CAAC,OAAO,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAC,CAAA;AAC3D,cAAA,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,EAAE,IAAA,EAAM,CAAA;AACpC,cAAA,OAAA,EAAQ;AAAA,YACV,CAAC,CAAA;AAED,YAAA,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAA+B;AAC9C,cAAA,IAAI,GAAA,CAAI,IAAA,KAAS,YAAA,IAAgB,OAAA,GAAU,UAAA,EAAY;AACrD,gBAAA,GAAA,CAAI,KAAA,EAAM;AACV,gBAAA,OAAA,CAAQ,IAAA,GAAO,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA;AAAA,cAC/B,CAAA,MAAO;AACL,gBAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAC7B,gBAAA,MAAA,CAAO,GAAG,CAAA;AAAA,cACZ;AAAA,YACF,CAAC,CAAA;AAAA,UACH,CAAA;AAEA,UAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,QACtB,CAAC,CAAA;AAAA,MACH;AAAA,MAEQ,iBAAiB,EAAA,EAAqB;AAC5C,QAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,QAAA,EAAA,CAAG,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,KAAQ;AACxB,UAAA,IAAI;AACF,YAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,CAAA;AAEvC,YAAA,IAAI,CAAC,UAAA,EAAY;AACf,cAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,CAAU,SAAA,EAAW;AACpC,gBAAA,UAAA,GAAa,IAAA;AACb,gBAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,GAAG,CAAA;AAC5B,gBAAA;AAAA,cACF;AACA,cAAA,IAAI,GAAA,CAAI,SAAS,oBAAA,EAAsB;AACrC,gBAAA,UAAA,GAAa,IAAA;AACb,gBAAA,IAAA,CAAK,cAAc,EAAE,CAAA;AACrB,gBAAA,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,aAAA,CAAc,oBAAA,EAAsB;AAAA,kBAC3D,eAAA,EAAiB,KAAK,WAAA,EAAY;AAAA,kBAClC,MAAM,IAAA,CAAK,IAAA;AAAA,kBACX,WAAA,EAAa,KAAK,eAAA,EAAgB;AAAA,kBAClC,eAAe,IAAA,CAAK;AAAA,iBACrB,CAAC,CAAC,CAAA;AACH,gBAAA;AAAA,cACF;AAAA,YACF;AAEA,YAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AAC5B,cAAA,IAAA,CAAK,uBAAA,CAAwB,IAAI,GAAG,CAAA;AAAA,YACtC,CAAA,MAAO;AACL,cAAA,IAAA,CAAK,mBAAA,CAAoB,IAAI,GAAG,CAAA;AAAA,YAClC;AAAA,UACF,SAAS,GAAA,EAAK;AACZ,YAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAAA,UAC/B;AAAA,QACF,CAAC,CAAA;AAED,QAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AACnB,UAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AAC5B,YAAA,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAC1B,YAAA,KAAA,MAAW,CAAC,EAAA,EAAI,YAAY,CAAA,IAAK,KAAK,aAAA,EAAe;AACnD,cAAA,IAAI,YAAA,KAAiB,EAAA,EAAI,IAAA,CAAK,aAAA,CAAc,OAAO,EAAE,CAAA;AAAA,YACvD;AAAA,UACF,CAAA,MAAO;AACL,YAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACvC,YAAA,IAAI,YAAY,MAAA,EAAW;AACzB,cAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAC3C,cAAA,IAAA,CAAK,aAAA,CAAc,OAAO,OAAO,CAAA;AACjC,cAAA,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAC1B,cAAA,IAAA,CAAK,KAAK,qBAAA,EAAuB,EAAE,SAAS,SAAA,EAAW,IAAA,EAAM,WAAW,CAAA;AACxE,cAAA,IAAA,CAAK,uBAAuB,qBAAA,EAAuB,EAAE,SAAS,SAAA,EAAW,IAAA,EAAM,WAAW,CAAA;AAE1F,cAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,KAAK,eAAA,EAAiB;AAChD,gBAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,gBAAA,OAAA,CAAQ,OAAO,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,GAAG,CAAC,CAAA;AAClE,gBAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,EAAE,CAAA;AAAA,cAChC;AAEA,cAAA,IAAI,IAAA,CAAK,kBAAkB,OAAA,EAAS;AAClC,gBAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AAAA,cACvB;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAED,QAAA,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACtB,UAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAAA,QAC/B,CAAC,CAAA;AAAA,MACH;AAAA,MAEQ,eAAA,CAAgB,IAAe,GAAA,EAAsB;AAC3D,QAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,QAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AAGnC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAC/C,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,EAAA,KAAO,EAAA,EAAI;AAClC,UAAA,QAAA,CAAS,GAAG,KAAA,EAAM;AAClB,UAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,QACrC;AAEA,QAAA,MAAM,IAAA,GAAyB;AAAA,UAC7B,EAAA;AAAA,UACA,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,UACtB,eAAe,OAAA,CAAQ,aAAA;AAAA,UACvB,OAAA;AAAA,UACA,WAAW,OAAA,CAAQ;AAAA,SACrB;AACA,QAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AACpC,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAEhC,QAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB,EAAE,GAAG,OAAA,EAAS,SAAS,CAAA;AACrD,QAAA,IAAA,CAAK,uBAAuB,kBAAA,EAAoB,EAAE,GAAG,OAAA,EAAS,SAAS,CAAA;AAAA,MACzE;AAAA,MAEQ,cAAc,EAAA,EAAqB;AACzC,QAAA,IAAA,CAAK,WAAA,CAAY,IAAI,EAAE,CAAA;AACvB,QAAA,IAAA,CAAK,KAAK,sBAAsB,CAAA;AAAA,MAClC;AAAA,MAEQ,sBAAA,CAAuB,MAAc,OAAA,EAAwB;AACnE,QAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,aAAA,CAAc,IAAA,EAAM,OAAO,CAAC,CAAA;AACzD,QAAA,KAAA,MAAW,EAAA,IAAM,KAAK,WAAA,EAAa;AACjC,UAAA,IAAI,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AACpC,YAAA,EAAA,CAAG,KAAK,GAAG,CAAA;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,uBAAA,CAAwB,cAAyB,GAAA,EAAsB;AAC7E,QAAA,MAAM,MAAA,GAAS,KAAK,aAAA,EAAc;AAClC,QAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACtD,UAAA,YAAA,CAAa,KAAK,gBAAA,CAAiB;AAAA,YACjC,IAAI,GAAA,CAAI,EAAA;AAAA,YACR,MAAM,SAAA,CAAU,QAAA;AAAA,YAChB,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,gBAAe,EAAE;AAAA,YACxC,EAAA,EAAI,KAAK,GAAA;AAAI,WACd,CAAC,CAAA;AACF,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,YAAY,CAAA;AAC3C,QAAA,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,MACtC;AAAA,MAEQ,mBAAA,CAAoB,IAAe,GAAA,EAAsB;AAC/D,QAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,CAAU,SAAA,EAAW;AAEpC,UAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACvC,UAAA,IAAI,YAAY,MAAA,EAAW;AACzB,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA;AAC3C,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAC7B,cAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,cAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAAA,YAC3B;AAAA,UACF;AACA,UAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,OAAO,CAAA;AACrC,UAAA,IAAA,CAAK,sBAAA,CAAuB,oBAAoB,OAAO,CAAA;AACvD,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,CAAU,QAAA,EAAU;AAEnC,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,EAAE,CAAA;AAClD,UAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAC9D,YAAA,YAAA,CAAa,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AACvC,YAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,EAAE,CAAA;AAC/C,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,YAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACnB,YAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,UACpC;AACA,UAAA;AAAA,QACF;AAGA,QAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAO,CAAA;AAC/B,QAAA,IAAA,CAAK,IAAA,CAAK,WAAW,GAAG,CAAA;AACxB,QAAA,IAAA,CAAK,sBAAA,CAAuB,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAO,CAAA;AAAA,MACnD;AAAA;AAAA,MAGQ,aAAA,GAAyC;AAC/C,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AAG1C,QAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,EAAG;AAC5B,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,aAAa,CAAA;AACtD,UAAA,IAAI,QAAQ,IAAA,CAAK,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,MAAM,OAAO,IAAA;AAC1D,UAAA,OAAO,IAAA;AAAA,QACT;AAGA,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,IAAA,KAAS,CAAA,EAAG;AACjC,UAAA,MAAM,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AAChD,UAAA,IAAI,IAAA,CAAK,EAAA,CAAG,UAAA,KAAe,SAAA,CAAU,MAAM,OAAO,IAAA;AAClD,UAAA,OAAO,IAAA;AAAA,QACT;AAGA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA;AAAA,MAGQ,cAAA,GAAyB;AAC/B,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,IAAA,KAAS,CAAA,EAAG,OAAO,sBAAA;AAC1C,QAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,EAAG;AAC5B,UAAA,OAAO,CAAA,aAAA,EAAgB,KAAK,aAAa,CAAA,4DAAA,CAAA;AAAA,QAC3C;AACA,QAAA,MAAM,SAAS,CAAC,GAAG,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,SAAA,IAAa,SAAS,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAA,CAAG,CAAA;AACrG,QAAA,OAAO,CAAA,qCAAA,EAAwC,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,qCAAA,CAAA;AAAA,MAClE;AAAA,MAEA,WAAA,CAAyB,IAAA,EAAc,OAAA,EAAkB,SAAA,GAAY,GAAA,EAA8B;AACjG,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,UAAA,MAAM,MAAA,GAAS,KAAK,aAAA,EAAc;AAClC,UAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACtD,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,IAAA,CAAK,cAAA,EAAgB,CAAC,CAAA;AACvC,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAEvC,UAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,YAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAClC,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAI,EAAE,CAAC,CAAA;AAAA,UAChD,GAAG,SAAS,CAAA;AAEZ,UAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI;AAAA,YAC/B,OAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,WACD,CAAA;AAED,UAAA,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,QACtC,CAAC,CAAA;AAAA,MACH;AAAA,MAEA,gBAAA,CAAiB,MAAc,OAAA,EAAwB;AACrD,QAAA,MAAM,MAAA,GAAS,KAAK,aAAA,EAAc;AAClC,QAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,EAAA,CAAG,UAAA,KAAe,UAAU,IAAA,EAAM;AACxD,QAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AACvC,QAAA,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,MACtC;AAAA,MAEA,WAAA,GAAuB;AACrB,QAAA,OAAO,IAAA,CAAK,eAAc,KAAM,IAAA;AAAA,MAClC;AAAA,MAEA,iBAAA,GAA6C;AAC3C,QAAA,OAAO,KAAK,aAAA,EAAc;AAAA,MAC5B;AAAA,MAEA,eAAA,GAA+B;AAC7B,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,CAAA,CACnC,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,UAAA,KAAe,SAAA,CAAU,IAAI,CAAA,CAC9C,IAAI,CAAA,CAAA,MAAM;AAAA,UACT,OAAA,EAAS,EAAE,OAAA,IAAW,CAAA;AAAA,UACtB,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,eAAe,CAAA,CAAE,aAAA;AAAA,UACjB,aAAa,CAAA,CAAE;AAAA,SACjB,CAAE,CAAA;AAAA,MACN;AAAA,MAEA,gBAAA,GAA2B;AACzB,QAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACd;AAAA,MAEA,iBAAiB,OAAA,EAAuB;AACtC,QAAA,IAAA,CAAK,aAAA,GAAgB,OAAA;AAAA,MACvB;AAAA,MAEA,OAAA,GAAkB;AAChB,QAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACd;AAAA,MAEA,IAAA,GAAsB;AACpB,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,UAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,aAAA,CAAc,MAAA,EAAO,EAAG;AAC9C,YAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,UAChB;AACA,UAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,UAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,UAAA,KAAA,MAAW,EAAA,IAAM,KAAK,WAAA,EAAa;AACjC,YAAA,EAAA,CAAG,KAAA,EAAM;AAAA,UACX;AACA,UAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,UAAA,KAAA,MAAW,GAAG,OAAO,CAAA,IAAK,KAAK,eAAA,EAAiB;AAC9C,YAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,YAAA,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,UAClD;AACA,UAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,UAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAEzB,UAAA,IAAI,KAAK,GAAA,EAAK;AACZ,YAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAM,OAAA,EAAS,CAAA;AAAA,UAChC,CAAA,MAAO;AACL,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;AClJA,eAAsB,YAAY,IAAA,EAAgC;AAChE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAIE,SAAAA,CAAU,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,GAAG,GAAI,CAAA;AAEP,IAAA,EAAA,CAAG,EAAA,CAAG,QAAQ,MAAM;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAC,CAAA;AAED,IAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AACnB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAzPA,IAiBa,aAAA;AAjBb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEA,IAAA,aAAA,EAAA;AAeO,IAAM,aAAA,GAAN,cAA4BC,YAAAA,CAAqC;AAAA,MAC9D,EAAA,GAAuB,IAAA;AAAA,MACvB,IAAA;AAAA,MACA,eAAA,GAAkB,KAAA;AAAA,MAClB,WAAA,uBAAkB,GAAA,EAA0C;AAAA,MAC5D,aAAA,GAAgB,CAAA;AAAA,MAChB,eAAA,uBAAsB,GAAA,EAG5B;AAAA,MAEF,WAAA,CAAY,OAAO,KAAA,EAAO;AACxB,QAAA,KAAA,EAAM;AACN,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,MACd;AAAA,MAEA,OAAA,GAAyB;AACvB,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,UAAA,MAAM,GAAA,GAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,IAAI,CAAA,CAAA;AACvC,UAAA,MAAM,EAAA,GAAK,IAAID,SAAAA,CAAU,GAAG,CAAA;AAE5B,UAAA,EAAA,CAAG,EAAA,CAAG,QAAQ,MAAM;AAClB,YAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,YAAA,EAAA,CAAG,KAAK,gBAAA,CAAiB,aAAA,CAAc,sBAAsB,EAAE,CAAC,CAAC,CAAA;AACjE,YAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAC5D,YAAA,OAAA,EAAQ;AAAA,UACV,CAAC,CAAA;AAED,UAAA,EAAA,CAAG,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,KAAQ;AACxB,YAAA,IAAI;AACF,cAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,CAAA;AACvC,cAAA,IAAA,CAAK,cAAc,GAAG,CAAA;AAAA,YACxB,SAAS,GAAA,EAAK;AACZ,cAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAAA,YAC/B;AAAA,UACF,CAAC,CAAA;AAED,UAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AACnB,YAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,YAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,YAAA,IAAA,CAAK,KAAK,qBAAqB,CAAA;AAC/B,YAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,KAAK,eAAA,EAAiB;AAChD,cAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,cAAA,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,uBAAuB,CAAC,CAAA;AACjD,cAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,EAAE,CAAA;AAAA,YAChC;AAAA,UACF,CAAC,CAAA;AAED,UAAA,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACtB,YAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,MAAA,CAAO,GAAG,CAAA;AACxB,YAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,GAAG,CAAA;AAAA,UAC/B,CAAC,CAAA;AAAA,QACH,CAAC,CAAA;AAAA,MACH;AAAA,MAEQ,cAAc,GAAA,EAAsB;AAC1C,QAAA,IAAI,GAAA,CAAI,SAAS,oBAAA,EAAsB;AACrC,UAAA,MAAM,IAAI,GAAA,CAAI,OAAA;AAKd,UAAA,IAAA,CAAK,kBAAkB,CAAA,CAAE,eAAA;AACzB,UAAA,IAAI,EAAE,WAAA,EAAa;AACjB,YAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,YAAA,KAAA,MAAW,CAAA,IAAK,EAAE,WAAA,EAAa;AAC7B,cAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,OAAA,EAAS;AAAA,gBAC9B,aAAa,CAAA,CAAE,WAAA;AAAA,gBACf,eAAe,CAAA,CAAE,aAAA;AAAA,gBACjB,SAAS,CAAA,CAAE,OAAA;AAAA,gBACX,WAAW,CAAA,CAAE;AAAA,eACd,CAAA;AAAA,YACH;AAAA,UACF;AACA,UAAA,IAAI,CAAA,CAAE,kBAAkB,MAAA,EAAW;AACjC,YAAA,IAAA,CAAK,gBAAgB,CAAA,CAAE,aAAA;AAAA,UACzB;AACA,UAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,YAAA,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,EAAE,CAAA;AAAA,UAClC;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,CAAI,SAAS,kBAAA,EAAoB;AACnC,UAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,UAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,UAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AACnC,UAAA,IAAA,CAAK,WAAA,CAAY,IAAI,OAAA,EAAS;AAAA,YAC5B,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,YACtB,eAAe,OAAA,CAAQ,aAAA;AAAA,YACvB,OAAA;AAAA,YACA,WAAW,OAAA,CAAQ;AAAA,WACpB,CAAA;AACD,UAAA,IAAA,CAAK,IAAA,CAAK,oBAAoB,OAAO,CAAA;AACrC,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,CAAI,SAAS,qBAAA,EAAuB;AACtC,UAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,UAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,CAAA;AACnC,UAAA,IAAA,CAAK,WAAA,CAAY,OAAO,OAAO,CAAA;AAC/B,UAAA,IAAI,IAAA,CAAK,WAAA,CAAY,IAAA,KAAS,CAAA,EAAG;AAC/B,YAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,UACzB;AACA,UAAA,IAAI,IAAA,CAAK,kBAAkB,OAAA,EAAS;AAClC,YAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AAAA,UACvB;AACA,UAAA,IAAA,CAAK,IAAA,CAAK,uBAAuB,OAAO,CAAA;AACxC,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,CAAU,QAAA,EAAU;AACnC,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,EAAE,CAAA;AAC/C,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,YAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACnB,YAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,UACpC;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAO,CAAA;AAC/B,QAAA,IAAA,CAAK,IAAA,CAAK,WAAW,GAAG,CAAA;AAAA,MAC1B;AAAA,MAEA,WAAA,CAAyB,IAAA,EAAc,OAAA,EAAkB,SAAA,GAAY,GAAA,EAA8B;AACjG,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,UAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAeA,UAAU,IAAA,EAAM;AACrD,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,iCAAiC,CAAC,CAAA;AACnD,YAAA;AAAA,UACF;AACA,UAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AACxC,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAEvC,UAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,YAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAClC,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAI,EAAE,CAAC,CAAA;AAAA,UAChD,GAAG,SAAS,CAAA;AAEZ,UAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI;AAAA,YAC/B,OAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,WACD,CAAA;AAED,UAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,QACpC,CAAC,CAAA;AAAA,MACH;AAAA,MAEA,gBAAA,CAAiB,MAAc,OAAA,EAAwB;AACrD,QAAA,IAAI,CAAC,IAAA,CAAK,EAAA,IAAM,KAAK,EAAA,CAAG,UAAA,KAAeA,UAAU,IAAA,EAAM;AACvD,QAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AACvC,QAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,MACpC;AAAA,MAEA,WAAA,GAAuB;AACrB,QAAA,OAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAA,CAAY,IAAA,GAAO,CAAA;AAAA,MACzD;AAAA,MAEA,iBAAA,GAA6C;AAC3C,QAAA,IAAI,IAAA,CAAK,WAAA,CAAY,IAAA,KAAS,CAAA,EAAG,OAAO,IAAA;AAExC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,KAAkB,CAAA,GAClC,KAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,aAAa,IACvC,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AACrC,QAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,QAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,EAAA,EAAI,KAAK,EAAA,EAAI;AAAA,MACnC;AAAA,MAEA,eAAA,GAA+B;AAC7B,QAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,CAAE,IAAI,CAAA,CAAA,MAAM;AAAA,UAC9C,OAAA,EAAS,EAAE,OAAA,IAAW,CAAA;AAAA,UACtB,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,eAAe,CAAA,CAAE,aAAA;AAAA,UACjB,aAAa,CAAA,CAAE;AAAA,SACjB,CAAE,CAAA;AAAA,MACJ;AAAA,MAEA,gBAAA,GAA2B;AACzB,QAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACd;AAAA,MAEA,iBAAiB,OAAA,EAAuB;AACtC,QAAA,IAAA,CAAK,aAAA,GAAgB,OAAA;AAAA,MACvB;AAAA,MAEA,OAAA,GAAkB;AAChB,QAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACd;AAAA,MAEA,IAAA,GAAsB;AACpB,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,UAAA,KAAA,MAAW,GAAG,OAAO,CAAA,IAAK,KAAK,eAAA,EAAiB;AAC9C,YAAA,YAAA,CAAa,QAAQ,KAAK,CAAA;AAC1B,YAAA,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,UAClD;AACA,UAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,UAAA,IAAI,KAAK,EAAA,EAAI;AACX,YAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,YAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,UACZ;AACA,UAAA,OAAA,EAAQ;AAAA,QACV,CAAC,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjOA,IAUa,eAAA;AAVb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAUO,IAAM,eAAA,GAAkB,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;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;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACV/B,IAAA,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,YAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAwDA,SAAS,OAAA,GAAgB;AACvB,EAAA,IAAI,CAAC,EAAA,EAAI;AACT,EAAA,MAAM,IAAA,GAAO,GAAG,MAAA,EAAO;AACvB,EAAAH,IAAG,aAAA,CAAc,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAC5C;AAEA,eAAsB,eAAA,GAAiC;AACrD,EAAA,IAAI,EAAA,EAAI;AACR,EAAA,MAAA,GAAS,SAAA,EAAU;AACnB,EAAA,MAAM,GAAA,GAAM,MAAM,SAAA,EAAU;AAE5B,EAAA,IAAIA,GAAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AACzB,IAAA,MAAM,MAAA,GAASA,GAAAA,CAAG,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,EAAA,GAAK,IAAI,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA;AAAA,EAC9B,CAAA,MAAO;AACL,IAAA,EAAA,GAAK,IAAI,IAAI,QAAA,EAAS;AAAA,EACxB;AAEA,EAAA,EAAA,CAAG,IAAI,MAAM,CAAA;AACb,EAAA,OAAA,EAAQ;AACV;AAEO,SAAS,KAAA,GAAkB;AAChC,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,MAAM,6DAA6D,CAAA;AACtF,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,gBAAA,GAAyB;AACvC,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,OAAA,EAAQ;AACR,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,EAAA,GAAK,IAAA;AAAA,EACP;AACF;AAIO,SAAS,UAAU,IAAA,EAAgC;AACxD,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,CAAA,CAAE,GAAA;AAAA,IACA,CAAA;AAAA,iCAAA,CAAA;AAAA,IAEA;AAAA,MACE,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,OAAA;AAAA,MACL,IAAA,CAAK,QAAA;AAAA,MACL,KAAK,MAAA,IAAU,IAAA;AAAA,MACf,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK;AAAA;AACP,GACF;AACA,EAAA,OAAA,EAAQ;AACR,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,CAAQ,4BAA4B,CAAA;AACnD,EAAA,IAAA,CAAK,IAAA,EAAK;AACV,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,IAAA,CAAK,IAAA,EAAK;AACV,EAAA,OAAQ,GAAA,GAAM,CAAC,CAAA,IAAgB,CAAA;AACjC;AAEO,SAAS,WAAA,CAAY,SAAA,EAAmB,KAAA,EAAe,KAAA,GAAQ,EAAA,EAAY;AAChF,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,QAAA,GAAW,KAAA,CACd,WAAA,EAAY,CACZ,KAAA,CAAM,KAAK,CAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAE7B,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAMK,UAAS,CAAA,CAAE,IAAA;AAAA,MACf,CAAA,0FAAA,CAAA;AAAA,MACA,CAAC,WAAW,KAAK;AAAA,KACnB;AACA,IAAA,OAAO,YAAYA,OAAM,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,cAAc,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,qBAAA,CAAuB,CAAA,CAAE,KAAK,MAAM,CAAA;AAC3E,EAAA,MAAM,aAAa,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAE/C,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,iDAAiD,WAAW,CAAA;AAAA,sDAAA,CAAA;AAAA,IAE5D,CAAC,SAAA,EAAW,GAAG,UAAA,EAAY,KAAK;AAAA,GAClC;AAEA,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,CAAA;AAGhC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,CAAA,CAAE,GAAA,CAAI,iDAAiD,CAAC,IAAA,CAAK,KAAI,EAAG,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC9E;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAA,EAAQ;AAE9B,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,YAAY,SAAA,EAA2B;AACrD,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,CAAA,gEAAA,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,OAAO,YAAY,MAAM,CAAA;AAC3B;AAEA,SAAS,YAAY,MAAA,EAAmC;AACtD,EAAA,IAAI,CAAC,MAAA,CAAO,CAAC,CAAA,SAAU,EAAC;AACxB,EAAA,OAAO,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACpC,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACT,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,IACd,QAAA,EAAU,IAAI,CAAC,CAAA;AAAA,IACf,MAAA,EAAQ,IAAI,CAAC,CAAA;AAAA,IACb,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,UAAA,EAAY,IAAI,CAAC;AAAA,GACnB,CAAE,CAAA;AACJ;AAIO,SAAS,aAAa,GAAA,EAAoC;AAC/D,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,CAAA,CAAE,GAAA;AAAA,IACA,CAAA;AAAA,2BAAA,CAAA;AAAA,IAEA,CAAC,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,QAAA,IAAY,IAAA,EAAM,GAAA,CAAI,SAAS;AAAA,GAC5E;AACA,EAAA,OAAA,EAAQ;AACV;AAEO,SAAS,kBAAA,CAAmB,SAAA,EAAmB,KAAA,GAAQ,GAAA,EAAoB;AAChF,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,CAAA,2EAAA,CAAA;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,GACnB;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,CAAC,CAAA,SAAU,EAAC;AACxB,EAAA,OAAO,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACpC,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACT,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,IACX,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,IACd,QAAA,EAAW,GAAA,CAAI,CAAC,CAAA,IAAgB,MAAA;AAAA,IAChC,SAAA,EAAW,IAAI,CAAC;AAAA,GAClB,CAAE,CAAA;AACJ;AAIO,SAAS,aAAa,OAAA,EAA2C;AACtE,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,CAAA,CAAE,GAAA;AAAA,IACA,CAAA;AAAA,wBAAA,CAAA;AAAA,IAEA,CAAC,QAAQ,SAAA,EAAW,OAAA,CAAQ,WAAW,OAAA,CAAQ,OAAA,EAAS,QAAQ,SAAS;AAAA,GAC3E;AACA,EAAA,OAAA,EAAQ;AACV;AAEO,SAAS,mBAAA,CAAoB,SAAA,EAAmB,KAAA,GAAQ,EAAA,EAAsB;AACnF,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,CAAA,6EAAA,CAAA;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,GACnB;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,CAAC,CAAA,SAAU,EAAC;AACxB,EAAA,OAAO,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACpC,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACT,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,IACd,SAAA,EAAW,IAAI,CAAC;AAAA,GAClB,CAAE,CAAA;AACJ;AAIO,SAAS,aAAa,KAAA,EAAsC;AACjE,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,WAAW,CAAA,CAAE,IAAA;AAAA,IACjB,CAAA,6DAAA,CAAA;AAAA,IACA,CAAC,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,IAAI;AAAA,GAC9B;AAEA,EAAA,IAAI,QAAA,CAAS,CAAC,CAAA,EAAG,MAAA,CAAO,MAAA,EAAQ;AAC9B,IAAA,CAAA,CAAE,GAAA;AAAA,MACA,CAAA;AAAA,wCAAA,CAAA;AAAA,MAEA;AAAA,QACE,KAAA,CAAM,SAAA;AAAA,QACN,MAAM,OAAA,IAAW,IAAA;AAAA,QACjB,MAAM,SAAA,IAAa,IAAA;AAAA,QACnB,MAAM,QAAA,IAAY,IAAA;AAAA,QAClB,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM;AAAA;AACR,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,CAAA,CAAE,GAAA;AAAA,MACA,CAAA;AAAA,mCAAA,CAAA;AAAA,MAEA;AAAA,QACE,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM,IAAA;AAAA,QACN,KAAA,CAAM,SAAA;AAAA,QACN,MAAM,OAAA,IAAW,IAAA;AAAA,QACjB,MAAM,SAAA,IAAa,IAAA;AAAA,QACnB,MAAM,QAAA,IAAY,IAAA;AAAA,QAClB,KAAA,CAAM;AAAA;AACR,KACF;AAAA,EACF;AACA,EAAA,OAAA,EAAQ;AACV;AAEO,SAAS,eACd,SAAA,EACyD;AACzD,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,CAAA,qFAAA,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,CAAC,CAAA,SAAU,EAAC;AACxB,EAAA,OAAO,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACpC,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,IACX,OAAA,EAAU,GAAA,CAAI,CAAC,CAAA,IAAgB,MAAA;AAAA,IAC/B,SAAA,EAAW,IAAI,CAAC;AAAA,GAClB,CAAE,CAAA;AACJ;AAEO,SAAS,cAAA,CAAe,WAAmB,UAAA,EAAwC;AACxF,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,MAAM,SAAS,CAAA,CAAE,IAAA;AAAA,IACf,CAAA,4DAAA,CAAA;AAAA,IACA,CAAC,WAAW,UAAU;AAAA,GACxB;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,CAAO,QAAQ,OAAO,IAAA;AACtC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,CAAE,OAAO,CAAC,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACT,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,IACX,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,IAChB,OAAA,EAAU,GAAA,CAAI,CAAC,CAAA,IAAgB,MAAA;AAAA,IAC/B,SAAA,EAAY,GAAA,CAAI,CAAC,CAAA,IAAgB,MAAA;AAAA,IACjC,QAAA,EAAW,GAAA,CAAI,CAAC,CAAA,IAAgB,MAAA;AAAA,IAChC,SAAA,EAAW,IAAI,CAAC;AAAA,GAClB;AACF;AAIO,SAAS,cAAA,CAAe,SAAA,EAAmB,MAAA,GAAS,IAAA,EAAY;AACrE,EAAA,MAAM,IAAI,KAAA,EAAM;AAChB,EAAA,CAAA,CAAE,GAAA,CAAI,CAAA,+DAAA,CAAA,EAAmE,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAC5F,EAAA,OAAA,EAAQ;AACV;AA5TA,IAMI,IACA,MAAA,EAEE,MAAA;AATN,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AAGA,IAAA,WAAA,EAAA;AAGA,IAAI,EAAA,GAAsB,IAAA;AAG1B,IAAM,MAAA,GAAS;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;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACTf,IAAA,mBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,mBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAIa,IAAA;AAJb,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAM,IAAA,GAAa;AAAA,MACxB,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EACE,8HAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAMJ,QAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAmC,OAAO,UAAA,EAAY,EAAE,IAAA,EAAAA,KAAAA,EAAM,CAAA;AAEzF,QAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,kBAAA,EAAqBA,KAAI,CAAA,CAAA,EAAG;AAAA,QAC9D;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,SAAS,OAAA,CAAQ,IAAA;AAAA,YACvB,SAAA,EAAW,SAAS,OAAA,CAAQ,SAAA;AAAA,YAC5B,MAAA,EAAQ,SAAS,OAAA,CAAQ,MAAA;AAAA,YACzB,SAAA,EAAW,SAAS,OAAA,CAAQ;AAAA;AAC9B,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzCA,IAAA,mBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,mBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAK;AAAA,CAAA,CAAA;AAAA,IAGaA,KAAAA;AAHb,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EACE,6GAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAA,EAAQ,QAAQ;AAAA,OAC7B;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAML,QAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,YAAY,EAAE,IAAA,EAAAA,KAAAA,EAAM,MAAA,EAAQ,CAAA;AAC3E,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAEzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,uBAAA,EAAwB;AAAA,QAC3E;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,EAAE,IAAA,EAAAA,KAAAA,EAAM,YAAA,EAAc,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,QAAO,EAAE;AAAA,MAClF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvCA,IAAA,gBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAK;AAAA,CAAA,CAAA;AAAA,IAIaA,KAAAA;AAJb,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,UAAA;AAAA,MACN,WAAA,EACE,sIAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAqC,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AACzF,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAEzB,QAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,EAAE;AAAA,QAClF;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,MAAM,EAAE,MAAA,EAAQ,QAAQ,MAAA,EAAQ,QAAA,EAAU,QAAQ,QAAA;AAAS,SAC7D;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrCA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,KAAAA;AAJb,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,cAAA;AAAA,MACN,WAAA,EACE,qGAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,wCAAA;AAAA,YACb,OAAA,EAAS;AAAA;AACX;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAuC,OAAO,YAAA,EAAc;AAAA,UACrF,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,UAC7B,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,SAC9B,CAAA;AAED,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnCA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,KAAAA;AAJb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EAAa,4OAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,OAAA,GAAU,OAAO,OAAA,KAAY,KAAA;AAEnC,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA;AAAA,UACzB,MAAA,CAAO,cAAA;AAAA,UACP,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,OAAA;AAAQ,SAC/B;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpCA,IAAA,kCAAA,GAAA,EAAA;AAAA,QAAA,CAAA,kCAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,KAAAA;AAHb,IAAA,+BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gDAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,4BAAA;AAAA,MACN,WAAA,EAAa,yNAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,OAAA,GAAU,OAAO,OAAA,KAAY,KAAA;AAEnC,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA;AAAA,UACzB,MAAA,CAAO,0BAAA;AAAA,UACP,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,OAAA,EAAQ;AAAA,UAC7B,MAAO,EAAA,GAAK;AAAA;AAAA,SACd;AAEA,QAAA,IAAI,MAAA,CAAO,UAAA,IAAc,OAAO,MAAA,CAAO,eAAe,QAAA,EAAU;AAC5D,UAAA,MAAMN,GAAAA,GAAK,MAAM,OAAO,aAAa,CAAA;AACrC,UAAA,MAAMC,KAAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAChC,UAAA,MAAM,aAAaA,KAAAA,CAAK,OAAA,CAAQ,QAAQ,GAAA,EAAI,EAAG,OAAO,UAAU,CAAA;AAChE,UAAA,MAAMD,GAAAA,CAAG,SAAA,CAAU,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,SAAS,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AACjF,UAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,CAAA,kCAAA,EAAqC,UAAU,CAAA,CAAA,EAAG;AAAA,QACpF;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChDA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAM;AAAA,CAAA,CAAA;AAAA,IAGaA,KAAAA;AAHb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EAAa,iDAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAA,EAAQ,YAAY;AAAA,OACjC;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,cAAA,EAAgB;AAAA,UAC7D,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,YAAY,MAAA,CAAO;AAAA,SACpB,CAAA;AAED,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,0BAAA,EAA2B;AAAA,QAC9E;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,UAAoB,GAAE,EAAE;AAAA,MACzG;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtCA,IAAA,uBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,uBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,KAAAA;AAHb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EAAa,yDAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,WAAA,EAAa,YAAA,EAAc,MAAM;AAAA,OAC9C;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,eAAA,EAAiB;AAAA,UAC9D,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc;AAAC,SACnC,CAAA;AAED,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,2BAAA,EAA4B;AAAA,QAC/E;AAEA,QAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAK,EAAE;AAAA,MACvD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChDA,IAAA,uBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,uBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,KAAAA;AAHb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,KAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EAAa,8DAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,iBAAiB,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AACrF,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAEzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,2BAAA,EAA4B;AAAA,QAC/E;AAEA,QAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,CAAO,MAAK,EAAE;AAAA,MACzD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/BA,IAAA,kBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,YAAA;AAAA,MACN,WAAA,EAAa,8EAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,uDAAA;AAAA,YACb,OAAA,EAAS;AAAA,WACX;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,qBAAA;AAAA,YACb,IAAA,EAAM,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO;AAAA;AAChC;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAA2C,OAAO,UAAA,EAAY;AAAA,UACvF,KAAA,EAAO,OAAO,KAAA,IAAS,EAAA;AAAA,UACvB,KAAA,EAAO,OAAO,KAAA,IAAS;AAAA,SACxB,CAAA;AAED,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnCA,IAAA,qBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,qBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,eAAA;AAAA,MACN,WAAA,EAAa,wDAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,YAAY;AAAC,OACf;AAAA,MAEA,MAAM,OAAA,CAAQ,OAAA,EAAkC,GAAA,EAAuC;AACrF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,WAAW,MAAM,GAAA,CAAI,aAA+B,MAAA,CAAO,aAAA,EAAe,EAAE,CAAA;AAClF,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpBA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EACE,qGAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,gDAAA;AAAA,YACb,OAAA,EAAS;AAAA;AACX,SACF;AAAA,QACA,QAAA,EAAU,CAAC,OAAO;AAAA,OACpB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAAkC,OAAO,cAAA,EAAgB;AAAA,UAClF,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,UAAA,EAAY,OAAO,UAAA,IAAc;AAAA,SAClC,CAAA;AAED,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,SAAS,OAAA,EAAQ;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpCA,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EACE,mGAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAA+C,OAAO,SAAA,EAAW;AAAA,UAC1F,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,SAC9B,CAAA;AAED,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,OAAA,IAAW,EAAC;AAC7C,QAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAC/C,QAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAEhD,QAAA,OAAO;AAAA,UACL,SAAS,MAAA,KAAW,CAAA;AAAA,UACpB,MAAM,EAAE,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,OAAA;AAAQ,SACzD;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpCA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EACE,iWAAA;AAAA,MAIF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,WAAW;AAAA,OACxB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAQxB,MAAA,CAAO,gBAAgB,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,CAAA;AAEzD,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,QAAQ,KAAA,EAAM;AAAA,QAChD;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,MACxC;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3CA,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EACE,kkCAAA;AAAA,MA2BF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EACE;AAAA,WAeJ;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAKxB,OAAO,QAAA,EAAU;AAAA,UAClB,MAAA,EAAQ,OAAO,MAAA,IAAU,YAAA;AAAA,UACzB,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,MAAM,MAAA,CAAO;AAAA,SACd,CAAA;AAED,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,iBAAA,EAAkB;AAAA,QACrE;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,MAAM,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,aAAA,EAAe,QAAQ,aAAA;AAAc,SACnE;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7FA,IAAA,wBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,wBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,kBAAA;AAAA,MACN,WAAA,EACE,iWAAA;AAAA,MAKF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,WAAA,EACE;AAAA;AAEJ;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA;AAAA,UACzB,MAAA,CAAO,gBAAA;AAAA,UACP,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,IAAA,EAAK;AAAA,UAC5B;AAAA,SACF;AAEA,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,sBAAA,EAAuB;AAAA,QAC1E;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,UAAU,OAAA,CAAQ;AAAA;AACpB,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/CA,IAAA,yBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,yBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,mBAAA;AAAA,MACN,WAAA,EACE,4VAAA;AAAA,MAKF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,WAAA,EACE;AAAA;AAEJ;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA;AAAA,UACzB,MAAA,CAAO,iBAAA;AAAA,UACP,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,IAAA,EAAK;AAAA,UAC5B;AAAA,SACF;AAEA,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,uBAAA,EAAwB;AAAA,QAC3E;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,UAAU,OAAA,CAAQ;AAAA;AACpB,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/CA,IAAA,mBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,mBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EACE,oKAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mBAAA,EAAoB;AAAA,UACzD,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,MAAM,CAAC,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,SAAS,aAAa,CAAA;AAAA,YAC1D,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,YAAY,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,YAClF,WAAA,EAAa;AAAA,WACf;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,YAAY,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,YAClF,WAAA,EAAa;AAAA,WACf;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,6BAAA,EAA8B;AAAA,UAC3E,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,8CAAA,EAA+C;AAAA,UACzF,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,aAAa,gCAAA;AAAiC,SAC/E;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,MAAA,GAAU,OAAO,MAAA,IAAqB,WAAA;AAC5C,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,MAAM,MAAA,CAAO,QAAA;AACnB,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAEpB,QAAA,MAAM,aAAsC,EAAC;AAE7C,QAAA,IAAI,GAAA,EAAK,UAAA,CAAW,QAAA,GAAW,EAAE,GAAG,GAAA,CAAI,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,EAAE;AAC7E,QAAA,IAAI,IAAA,EAAM,UAAA,CAAW,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAE;AAC7E,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AACjB,UAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACrB,YAAA,UAAA,CAAW,KAAA,GAAQ,CAAA;AAAA,UACrB,CAAA,MAAA,IAAW,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AAC9B,YAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA;AAC1B,YAAA,IAAI,CAAA,IAAK,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG;AACtB,cAAA,UAAA,CAAW,QAAQ,EAAE,GAAA,EAAK,SAAS,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,KAAA,EAAO,SAAS,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,IAAA,EAAM,SAAS,CAAA,CAAE,CAAC,CAAC,CAAA,EAAE;AAAA,YACxF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,UAAA,CAAW,UAAA,GAAa,CAAA;AAAA,UAC1B;AAAA,QACF;AACA,QAAA,IAAI,MAAA,CAAO,QAAA,EAAU,UAAA,CAAW,QAAA,GAAW,MAAA,CAAO,QAAA;AAClD,QAAA,IAAI,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW,UAAA,CAAW,eAAe,MAAA,CAAO,YAAA;AACxE,QAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,UAAA,CAAW,WAAW,MAAA,CAAO,QAAA;AAAA,wBAChD,QAAA,GAAW,IAAA;AAC3B,QAAA,IAAI,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW,UAAA,CAAW,aAAa,MAAA,CAAO,UAAA;AACpE,QAAA,IAAI,OAAO,KAAA,IAAS,MAAA,CAAO,UAAU,OAAA,EAAS,UAAA,CAAW,QAAQ,MAAA,CAAO,KAAA;AAExE,QAAA,MAAM,SAAA,GAAa,OAAO,KAAA,KAAU,OAAA,GAAW,cAC1C,MAAA,CAAO,KAAA,KAAU,gBAAiB,iBAAA,GACnC,MAAA;AAEJ,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,eAAA,EAAiB;AAAA,UACzD,SAAA;AAAA,UACA,UAAA,EAAY,MAAA;AAAA,UACZ,IAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,uBAAA,EAAwB;AAAA,QAC3E;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAM,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAE,SAClE;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpGA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAuCA,SAAS,eAAe,MAAA,EAAyC;AAC/D,EAAA,MAAML,QAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,IAAI,OAAA,GAAU,MAAA;AACd,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,OAAA,IAAW,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,gBAAgB,OAAO,CAAA,CAAA;AAAA,IACvB,CAAA,0BAAA;AAAA,GACF;AAEA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,MAAA,CAAO,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,MAAM,WAAA,GAAe,MAAA,CAAO,SAAA,CAAqB,KAAA,CAAM,GAAG,CAAA;AAC1D,IAAA,IAAI,aAAA,GAAgB,MAAA;AACpB,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,aAAA,IAAiB,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,IACzB;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,aAAa,CAAA,CAAE,CAAA;AAAA,EAC9C,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,CAAA,0BAAA,CAA4B,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,CAAM,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gDAAA,EAAmD,MAAA,CAAO,CAAA,IAAK,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,IAAK,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,CAAA,IAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAClH,IAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAAA,EAClB;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,wCAAA,CAA0C,CAAA;AACrD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AA5EA,IAGaK,MAAAA;AAHb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EACE,wIAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2BAAA,EAA4B;AAAA,UACjE,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+BAAA,EAAgC;AAAA,UACxE,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+DAAA,EAAgE;AAAA,UAC1G,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,YAAY,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAE;AAAA,YAClF,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,IAAA,GAAO,eAAe,MAAM,CAAA;AAClC,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AAC5D,QAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAEpB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,iBAAA,EAAkB;AAAA,QACrE;AAEA,QAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAO,EAAE;AAAA,MAC3D;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrCA,IAAA,uBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,uBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EACE,qJAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,wBAAA,EAAyB;AAAA,UACnE,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,CAAC,OAAA,EAAS,QAAQ,CAAA;AAAA,YACxB,WAAA,EAAa;AAAA,WACf;AAAA,UACA,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kCAAA;AAAmC,SAC5E;AAAA,QACA,QAAA,EAAU,CAAC,OAAA,EAAS,WAAW;AAAA,OACjC;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,QAAA,MAAM,UAAA,GAAc,OAAO,UAAA,IAAyB,OAAA;AACpD,QAAA,MAAM,MAAA,GAAU,OAAO,MAAA,IAAqB,WAAA;AAE5C,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAChC,UAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AACzB,UAAA,IAAI,CAAA,GAAI,MAAA;AACR,UAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,CAAA,IAAK,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,CAAA;AACxC,UAAA,OAAO,CAAA;AAAA,QACT,CAAC,CAAA;AAED,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACpC,QAAA,IAAI,aAAA,GAAgB,MAAA;AACpB,QAAA,KAAA,MAAW,CAAA,IAAK,WAAA,EAAa,aAAA,IAAiB,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,CAAA;AAEpD,QAAA,MAAM,IAAA,GAAO;AAAA,UACX,+BAA+B,UAAU,CAAA,EAAA,CAAA;AAAA,UACzC,iBAAiB,SAAS,CAAA,CAAA,CAAA;AAAA,UAC1B,kBAAkB,aAAa,CAAA,CAAA;AAAA,UAC/B,GAAG,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,eAAA,CAAiB,CAAA;AAAA,UAC5C,UAAA,KAAe,UAAU,CAAA,4EAAA,CAAA,GAAiF,EAAA;AAAA,UAC1G,CAAA,eAAA,EAAkB,MAAM,MAAM,CAAA,0CAAA;AAAA,SAChC,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAE3B,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AAC5D,QAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAEpB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,iBAAA,EAAkB;AAAA,QACrE;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,EAAE,SAAA,EAAW,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,KAAA,EAAO,KAAA,CAAM,QAAO,EAAE;AAAA,MAC7F;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjEA,IAAA,sBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,sBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAyFA,SAAS,iBAAA,CAAkB,KAAA,EAAmB,SAAA,EAAoB,WAAA,EAA8B;AAC9F,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,SAAS,cAAcL,KAAAA,EAAsB;AAC3C,IAAA,MAAM,IAAA,GAAOA,KAAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,IAAI,CAAA,GAAI,MAAA;AACR,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,CAAA,IAAK,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,CAAA;AACjC,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,WAA0B,CAAA;AACnD,IAAA,KAAA,CAAM,KAAK,CAAA,oCAAA,CAAsC,CAAA;AACjD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,CAAG,CAAA;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,EAAE,CAAA,CAAE,CAAA;AAAA,EACpC;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA,CAAA;AACtB,IAAA,MAAM,KAAK,CAAA,CAAE,SAAA,KAAc,CAAA,CAAE,KAAA,KAAU,UAAU,WAAA,GAAc,MAAA,CAAA;AAE/D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,OAAO,CAAA,iBAAA,EAAoB,EAAE,CAAA,EAAA,CAAI,CAAA;AACrD,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA;AAE1C,IAAA,IAAI,EAAE,QAAA,EAAU;AACd,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,2BAA2B,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,EAAA,EAAK,EAAE,QAAA,CAAS,CAAA,IAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAClH;AACA,IAAA,IAAI,EAAE,IAAA,EAAM;AACV,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,uBAAuB,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,EAAK,EAAE,IAAA,CAAK,CAAA,IAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAClG;AACA,IAAA,IAAI,EAAE,KAAA,EAAO;AACX,MAAA,IAAI,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,QAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,yBAAA,EAA4B,CAAA,CAAE,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,MAC9D,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,8BAAA,EAAiC,CAAA,CAAE,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,MACnE;AAAA,IACF;AACA,IAAA,IAAI,EAAE,QAAA,EAAU;AACd,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,0BAAA,EAA6B,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,CAAA,CAAE,iBAAiB,MAAA,EAAW;AAChC,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,gBAAA,EAAmB,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,CAAA,CAAE,aAAa,MAAA,EAAW;AAC5B,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,YAAA,EAAe,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACzC;AACA,IAAA,IAAI,EAAE,KAAA,IAAS,CAAA,CAAE,KAAA,KAAU,OAAA,IAAW,OAAO,MAAA,EAAQ;AACnD,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,CAAA,uBAAA,EAA0B,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,EAAE,MAAA,IAAU,WAAA;AAC3B,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,OAAO,aAAa,aAAA,CAAc,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,MAAM,CAAA,MAAA,EAAS,YAAY,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA,EAAA,CAAI,CAAA;AACvF,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAxJA,IAgBaK,MAAAA;AAhBb,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAeO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EACE,mOAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,UAAA,EAAY;AAAA,gBACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,WAAA,EAAY;AAAA,gBACjD,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2BAAA,EAA4B;AAAA,gBACtE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kCAAA,EAAmC;AAAA,gBAC1E,QAAA,EAAU;AAAA,kBACR,IAAA,EAAM,QAAA;AAAA,kBACN,YAAY,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS;AAAE,iBACpF;AAAA,gBACA,IAAA,EAAM;AAAA,kBACJ,IAAA,EAAM,QAAA;AAAA,kBACN,YAAY,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS,EAAG,CAAA,EAAG,EAAE,IAAA,EAAM,UAAS;AAAE,iBACpF;AAAA,gBACA,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kCAAA,EAAmC;AAAA,gBACzE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC3B,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,gBAC/B,QAAA,EAAU,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,gBAC5B,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA;AAAE,eACxE;AAAA,cACA,QAAA,EAAU,CAAC,MAAM;AAAA,aACnB;AAAA,YACA,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,OAAO;AAAA,OACpB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,QAAA,MAAM,WAAA,GAAe,OAAO,WAAA,IAA0B,WAAA;AAEtD,QAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,KAAA,EAAO,SAAA,EAAW,WAAW,CAAA;AAC5D,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,YAAA,CAAa,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AAC5D,QAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAEpB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,oBAAA,EAAqB;AAAA,QACxE;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,OAAO,KAAA,CAAM,MAAA;AAAA,YACb,OAAO,SAAA,IAAa,IAAA;AAAA,YACpB,QAAQ,OAAA,CAAQ;AAAA;AAClB,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvFA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,cAAA;AAAA,MACN,WAAA,EACE,2cAAA;AAAA,MAKF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA,OACnB;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAIxB,OAAO,YAAA,EAAc;AAAA,UACtB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,SAC/B,EAAG,GAAA,GAAO,EAAA,GAAK,CAAC,CAAA;AAEhB,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,sBAAA,EAAuB;AAAA,QAC1E;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,MAC7C;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/CA,IAAA,qBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,qBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,eAAA;AAAA,MACN,WAAA,EACE,8NAAA;AAAA,MAGF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAA,EAAQ,WAAW;AAAA,OAChC;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAIxB,OAAO,aAAA,EAAe;AAAA,UACvB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AAED,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,aAAA,EAAc;AAAA,QACjE;AAEA,QAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,EAAE,OAAA,EAAS,OAAA,CAAQ,SAAQ,EAAE;AAAA,MAC7D;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7CA,IAAA,2BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,2BAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,wBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,qBAAA;AAAA,MACN,WAAA,EACE,sfAAA;AAAA,MAMF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,OAAA;AAAA,YACN,WAAA,EAAa,wDAAA;AAAA,YACb,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,QAAA;AAAA,cACN,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf;AACF,OACF;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAKxB,OAAO,mBAAA,EAAqB;AAAA,UAC7B,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,YAAY,MAAA,CAAO;AAAA,SACrB,EAAG,MAAO,EAAE,CAAA;AAEZ,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,iBAAA,EAAkB;AAAA,QACrE;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,MAAA,GAAS,QAAQ,MAAA,GAAS;AAAA;AACpD,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpEA,IAAA,4BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,4BAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,yBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,sBAAA;AAAA,MACN,WAAA,EACE,yTAAA;AAAA,MAIF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAA,EAAQ,SAAS;AAAA,OAC9B;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,YAAA,CAMxB,OAAO,oBAAA,EAAsB;AAAA,UAC9B,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,UAAA,EAAY,OAAO,UAAA,IAAc,KAAA;AAAA,UACjC,MAAA,EAAQ,OAAO,MAAA,IAAU;AAAA,SAC3B,EAAG,GAAA,GAAO,EAAA,GAAK,CAAC,CAAA;AAEhB,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,qBAAA,EAAsB;AAAA,QACzE;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,YAAY,OAAA,CAAQ,UAAA;AAAA,YACpB,cAAc,OAAA,CAAQ,YAAA;AAAA,YACtB,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,MAAA,EAAQ,OAAO,MAAA,IAAU;AAAA;AAC3B,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvEA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAGaA,MAAAA;AAHb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AACA,IAAA,UAAA,EAAA;AAEO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,eAAA;AAAA,MACN,WAAA,EACE,kKAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,6CAAA;AAAA,YACb,OAAA,EAAS;AAAA;AACX,SACF;AAAA,QACA,QAAA,EAAU,CAAC,OAAO;AAAA,OACpB;AAAA,MAEA,MAAM,QAAQ,MAAA,EAAsD;AAClE,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,QAAA,MAAM,KAAA,GAAS,OAAO,KAAA,IAAoB,EAAA;AAC1C,QAAA,MAAM,SAAA,GAAY,SAAA;AAElB,QAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,SAAA,EAAW,KAAA,EAAO,KAAK,CAAA;AACjD,QAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,SAAA,EAAW,CAAC,CAAA;AAElD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACJ,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,QAAA,EAAU,CAAA,CAAE,QAAA,EAAS,CAAE,CAAA;AAAA,YACtE,gBAAgB,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,OAAO;AAAA;AAChD,SACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvCA,IAAA,gBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AACA,IAAA,UAAA,EAAA;AAGO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,UAAA;AAAA,MACN,WAAA,EACE,gMAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,sBAAA;AAAA,YACb,MAAM,CAAC,cAAA,EAAgB,WAAW,YAAA,EAAc,KAAA,EAAO,OAAO,SAAS;AAAA;AACzE,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAA,EAAQ,UAAU;AAAA,OAC/B;AAAA,MAEA,MAAM,QAAQ,MAAA,EAAsD;AAClE,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,QAAA,GAAY,OAAO,QAAA,IAA6B,SAAA;AACtD,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,QAAA,SAAA,CAAU;AAAA,UACR,SAAA,EAAW,SAAA;AAAA,UACX,OAAA,EAAS,IAAA;AAAA,UACT,QAAA;AAAA,UACA,MAAA,EAAQ,OAAA;AAAA,UACR,SAAA,EAAW,CAAA;AAAA,UACX,SAAA,EAAW,GAAA;AAAA,UACX,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,UAAS,EAAE;AAAA,MAC3D;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzCA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,IAAA,EAAA,MAAAA;AAAA,CAAA,CAAA;AAAA,IAIaA,MAAAA;AAJb,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAIO,IAAMA,MAAAA,GAAa;AAAA,MACxB,IAAA,EAAM,cAAA;AAAA,MACN,WAAA,EACE,mIAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,SAAA,EAAW;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,eAAA;AAAA,YACb,IAAA,EAAM,CAAC,OAAA,EAAS,OAAA,EAAS,OAAO;AAAA,WAClC;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,UAAA,EAAY,WAAA,EAAa,MAAM;AAAA,OAC5C;AAAA,MAEA,MAAM,OAAA,CAAQ,MAAA,EAAiC,GAAA,EAAuC;AACpF,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,GAAA,CAAY,iBAAiB,CAAA;AACvD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO;AAAA,WACT;AAAA,QACF;AAEA,QAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,QAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,WAAA,GAAe,OAAO,WAAA,IAA0B,EAAA;AAEtD,QAAA,IAAI,CAACN,GAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAA,EAAG;AAAA,QAChE;AAEA,QAAA,MAAM,UAAA,GAAaA,GAAAA,CAAG,YAAA,CAAa,QAAQ,CAAA;AAC3C,QAAA,MAAM,QAAA,GAAWC,KAAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAEvC,QAAA,MAAM,WAAA,GAAsC;AAAA,UAC1C,KAAA,EAAO,OAAA;AAAA,UACP,KAAA,EAAO,OAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACT;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,UAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,UAAU,CAAC,CAAA;AAClC,UAAA,QAAA,CAAS,MAAA,CAAO,aAAA,EAAe,IAAA,EAAM,QAAQ,CAAA;AAC7C,UAAA,QAAA,CAAS,MAAA;AAAA,YACP,SAAA;AAAA,YACA,KAAK,SAAA,CAAU;AAAA,cACb,SAAA,EAAW,WAAA,CAAY,SAAS,CAAA,IAAK,SAAA;AAAA,cACrC,WAAA,EAAa,IAAA;AAAA,cACb,WAAA;AAAA,cACA,iBAAiB,EAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAK;AAAE,aAC9C;AAAA,WACH;AAEA,UAAA,MAAM,WAAW,MAAM,KAAA;AAAA,YACrB,0CAAA;AAAA,YACA;AAAA,cACE,MAAA,EAAQ,MAAA;AAAA,cACR,OAAA,EAAS;AAAA,gBACP,WAAA,EAAa;AAAA,eACf;AAAA,cACA,IAAA,EAAM;AAAA;AACR,WACF;AAEA,UAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,YAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,YAAA,OAAO,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,kBAAkB,QAAA,CAAS,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAG;AAAA,UAChF;AAEA,UAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,IAAA,EAAM;AAAA,cACJ,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,EAAA;AAAA,cAC9B,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,IAAA;AAAA,cACtC,IAAA;AAAA,cACA,IAAA,EAAM;AAAA;AACR,WACF;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,iBAAiB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,WAC1E;AAAA,QACF;AAAA,MACF;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1GA,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,QAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAGa,QAAA,EA6BA,QAAA;AAhCb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEO,IAAM,QAAA,GAAiB;AAAA,MAC5B,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EACE,2HAAA;AAAA,MAEF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,YAAY;AAAC,OACf;AAAA,MAEA,MAAM,OAAA,CAAQ,OAAA,EAAkC,GAAA,EAAuC;AACrF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,WAAW,MAAM,GAAA,CAAI,aAGxB,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA;AAElB,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,aAAA,EAAc;AAAA,QACjE;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,gBAAA,EAAiB;AAAA,MACjD;AAAA,KACF;AAEO,IAAM,QAAA,GAAiB;AAAA,MAC5B,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EACE,kGAAA;AAAA,MAEF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,YAAY;AAAC,OACf;AAAA,MAEA,MAAM,OAAA,CAAQ,OAAA,EAAkC,GAAA,EAAuC;AACrF,QAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,EAAkB,EAAG;AAC5B,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,QAC5D;AAEA,QAAA,MAAM,WAAW,MAAM,GAAA,CAAI,aAGxB,MAAA,CAAO,IAAA,EAAM,EAAE,CAAA;AAElB,QAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,UAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,SAAS,aAAA,EAAc;AAAA,QACjE;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,gBAAA,EAAiB;AAAA,MACjD;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3DA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,cAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAYA,eAAsB,cAAA,GAAgC;AACpD,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,eAAA,EAAgB;AAEtB,EAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA;AAC/C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAC5C,IAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,IAAA,MAAA,GAAS,MAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAC5C,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,MAAA,GAAS,MAAA;AAAA,EACX;AAEA,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU;AAAA,IACxB,IAAA,EAAM,SAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX,EAAG;AAAA,IACD,YAAA,EAAc;AAAA,GACf,CAAA;AAID,EAAA,SAAS,OAAO,CAAA,EAAmB;AACjC,IAAA,OAAO,IAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,MAAM,EAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CAAE,QAAQ,KAAA,EAAO,KAAK,EAAE,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EACtG;AAEA,EAAA,SAAS,YAAY,OAAA,EAAyB;AAC5C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAA,IAAI,CAAA,GAAI,MAAA;AACR,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO,CAAA,IAAK,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,CAAA;AACzC,IAAA,OAAO,CAAA;AAAA,EACT;AAKA,EAAA,SAAS,SAAS,CAAA,EAAmB;AACnC,IAAA,IAAI,OAAO,SAAA,CAAU,CAAC,CAAA,EAAG,OAAO,OAAO,CAAC,CAAA;AAExC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA;AACvC,IAAA,OAAO,OAAO,OAAO,CAAA;AAAA,EACvB;AAGA,EAAA,SAAS,qBAAA,CACP,IAAA,EACA,aAAA,EACA,SAAA,EACQ;AACR,IAAA,MAAM,UAAU,SAAA,KAAc,OAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,UAAU,OAAA,GAAU,OAAA;AAEhC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,GAAG,8CAA8C,OAAA,GAAU,OAAA,GAAU,OAAO,CAAA,CAAA,CAAG,CAAA;AACnG,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAAA,IAC5C;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,aAAa,CAAA,EAAA,CAAI,CAAA;AAC9C,IAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAY,UAAA,CAAW,IAAA,EAAM,CAAC,CAAC,CAAA,CAAE,CAAA;AAC5C,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,aAAa,CAAA,CAAE,CAAA;AAEpC,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,SAAS,UAAA,CAAW,MAA+B,KAAA,EAAuB;AACxE,IAAA,MAAM,MAAA,GAAS,GAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAChC,IAAA,MAAM,OAAA,GAAU,GAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA;AACrC,IAAA,MAAM,SAAA,GAAa,KAAK,SAAA,IAAwB,OAAA;AAChD,IAAA,MAAM,QAAA,GAAY,IAAA,CAAK,QAAA,IAA0C,EAAC;AAClE,IAAa,IAAA,CAAK;AAGlB,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,QAAA,mBAAW,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,QAAQ,UAAA,EAAY,WAAA,EAAa,MAAA,EAAQ,UAAU,CAAC,CAAA;AAC3F,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC7C,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,CAAA,GAAA,EAAM,QAAA,CAAS,GAAA,EAAK,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAM,SAAA,GAAa,KAAA,CAAM,IAAA,IAAoB,KAAA,CAAM,SAAA,IAAwB,OAAA;AAC3E,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,EAAG,SAAS,CAAA,GAAA,EAAM,UAAA,CAAW,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/E;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GAAS,CAAA;AAChC,IAAA,MAAM,WAAA,GAAc,aAAa,MAAA,GAAS,CAAA;AAE1C,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,WAAA,EAAa;AAC7B,MAAA,OAAO,MAAM,SAAS,CAAA,MAAA,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,SAAS,CAAA,IAAA,CAAM,CAAA;AAChC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,IAAA,CAAM,CAAA;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,YAAY,CAAA;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAA,CAAI,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,EAAA,CAAI,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,SAAS,QAAA,CAAS,KAAc,MAAA,EAAwB;AACtD,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW,OAAO,KAAA;AAC9C,IAAA,IAAI,OAAO,GAAA,KAAQ,SAAA,EAAW,OAAO,OAAO,GAAG,CAAA;AAC/C,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,SAAS,GAAG,CAAA;AAChD,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAE3B,MAAA,IAAI,IAAI,UAAA,CAAW,GAAG,CAAA,IAAK,GAAA,CAAI,WAAW,CAAA,EAAG;AAC3C,QAAA,OAAO,mBAAmB,GAAG,CAAA,EAAA,CAAA;AAAA,MAC/B;AAEA,MAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,GAAG,CAAA,EAAG;AAChC,QAAA,OAAO,IAAI,GAAG,CAAA,CAAA,CAAA;AAAA,MAChB;AACA,MAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAEtB,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AAC7D,QAAA,OAAO,aAAa,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MAClD;AAEA,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AAC7D,QAAA,OAAO,eAAe,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACpD;AAEA,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,IAAK,GAAA,CAAI,MAAM,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AAC7D,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,CAAA,CAAA,KAAM,KAAgB,CAAC,CAAA;AAClD,QAAA,IAAI,QAAA,SAAiB,CAAA,WAAA,EAAc,GAAA,CAAI,IAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAC/D,QAAA,OAAO,CAAA,eAAA,EAAkB,GAAA,CAAI,GAAA,CAAI,CAAA,CAAA,KAAK,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAW,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACnF;AACA,MAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,CAAA,EAAG,MAAM,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA;AAC7D,MAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,MAAA,OAAO,CAAA;AAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,GAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,GAAA,EAAM,QAAA,CAAS,CAAA,EAAG,MAAA,GAAS,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC;AAAA,EAAK,GAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA,CAAA;AAAA,IACzI;AACA,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AAIA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,aAAA;AAAA,IACA,mDAAA;AAAA,IACA,EAAE,IAAA,EAAM,CAAA,CAAE,QAAO,CAAE,QAAA,CAAS,4DAA4D,CAAA,EAAE;AAAA,IAC1F,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAK,KAAM;AAClB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAkC,OAAO,UAAA,EAAY,EAAE,IAAA,EAAAA,KAAAA,EAAM,CAAA;AACtF,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,aAAA;AAAA,IACA,6DAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA,MAC9C,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0BAA0B;AAAA,KACxD;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,QAAO,KAAM;AAC1B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,YAAY,EAAE,IAAA,EAAAA,KAAAA,EAAM,MAAA,EAAQ,CAAA;AACxE,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG,CAAA,EAAE;AAAA,IACnF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,UAAA;AAAA,IACA,6fAAA;AAAA,IAIA,EAAE,IAAA,EAAM,CAAA,CAAE,QAAO,CAAE,QAAA,CAAS,sBAAsB,CAAA,EAAE;AAAA,IACpD,OAAO,EAAE,IAAA,EAAK,KAAM;AAClB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAoC,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AACtF,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,cAAA;AAAA,IACA,oDAAA;AAAA,IACA;AAAA,MACE,UAAU,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,gDAAgD,CAAA;AAAA,MACzF,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,oBAAoB;AAAA,KAC1E;AAAA,IACA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAS,KAAM;AAChC,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAsC,OAAO,YAAA,EAAc;AAAA,QAClF,UAAU,QAAA,IAAY,IAAA;AAAA,QACtB;AAAA,OACD,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,8OAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qEAAqE,CAAA;AAAA,MAC/F,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,GAAW,OAAA,CAAQ,IAAI,CAAA,CAAE,QAAA,CAAS,0GAA0G;AAAA,KACnK;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,SAAQ,KAAM;AAC3B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAA6C,MAAA,CAAO,gBAAgB,EAAE,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,CAAA;AAC9G,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,4BAAA;AAAA,IACA,yNAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qEAAqE,CAAA;AAAA,MAC/F,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,GAAW,OAAA,CAAQ,IAAI,CAAA,CAAE,QAAA,CAAS,yEAAyE,CAAA;AAAA,MAChI,YAAY,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8DAA8D;AAAA,KAC3G;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,YAAW,KAAM;AACvC,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAqB,OAAO,0BAAA,EAA4B,EAAE,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,UAAA,EAAW,EAAG,GAAA,GAAO,KAAK,CAAC,CAAA;AAC7H,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,gDAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA,MAC9C,UAAA,EAAY,EAAE,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,CAAE,SAAS,sCAAsC;AAAA,KACnF;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,YAAW,KAAM;AAC9B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,gBAAgB,EAAE,IAAA,EAAAA,KAAAA,EAAM,UAAA,EAAY,CAAA;AAChF,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG,CAAA,EAAE;AAAA,IACnF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,iBAAA;AAAA,IACA,sDAAA;AAAA,IACA;AAAA,MACE,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oCAAoC,CAAA;AAAA,MACnE,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sBAAsB,CAAA;AAAA,MACtD,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,MACrD,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,4BAA4B;AAAA,KACpF;AAAA,IACA,OAAO,EAAE,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,YAAW,KAAM;AACrD,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAY,OAAO,eAAA,EAAiB;AAAA,QAC3D,SAAA;AAAA,QAAW,UAAA;AAAA,QAAY,IAAA;AAAA,QAAM,UAAA,EAAY,cAAc;AAAC,OACzD,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG,CAAA,EAAE;AAAA,IACnF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,iBAAA;AAAA,IACA,qDAAA;AAAA,IACA,EAAE,IAAA,EAAM,CAAA,CAAE,QAAO,CAAE,QAAA,CAAS,8BAA8B,CAAA,EAAE;AAAA,IAC5D,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAK,KAAM;AAClB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAY,OAAO,eAAA,EAAiB,EAAE,IAAA,EAAAA,KAAAA,EAAM,CAAA;AACrE,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG,CAAA,EAAE;AAAA,IACnF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,eAAA;AAAA,IACA,6QAAA;AAAA,IAGA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,MAAM,MAAM,MAAA,CAAO,YAA8B,MAAA,CAAO,aAAA,EAAe,EAAE,CAAA;AAC/E,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,wDAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA,MAC/C,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,OAAA,CAAQ,EAAE,CAAA,CAAE,QAAA,CAAS,aAAa;AAAA,KACtE;AAAA,IACA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAW,KAAM;AAC/B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAiC,OAAO,cAAA,EAAgB,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AACtG,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,YAAA;AAAA,IACA,0CAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,OAAA,CAAQ,EAAE,CAAA,CAAE,QAAA,CAAS,aAAa,CAAA;AAAA,MAC/D,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,iBAAiB;AAAA,KAChF;AAAA,IACA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAM,KAAM;AAC1B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAA0C,OAAO,UAAA,EAAY;AAAA,QACpF,KAAA;AAAA,QAAO,OAAO,KAAA,IAAS;AAAA,OACxB,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,iPAAA;AAAA,IAEA,EAAE,SAAA,EAAW,CAAA,CAAE,QAAO,CAAE,QAAA,CAAS,kEAAkE,CAAA,EAAE;AAAA,IACrG,OAAO,EAAE,SAAA,EAAU,KAAM;AACvB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAqB,OAAO,cAAA,EAAgB,EAAE,WAAW,CAAA;AAClF,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,WAAA;AAAA,IACA,6TAAA;AAAA,IAGA;AAAA,MACE,QAAQ,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iEAAiE,CAAA;AAAA,MACxG,MAAM,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAAA,QAC1B;AAAA,OAEF;AAAA,MACA,SAAS,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,wGAAwG;AAAA,KACnJ;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAQ,KAAM;AACnC,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA;AAAA,QACvB,MAAA,CAAO,QAAA;AAAA,QAAU,EAAE,MAAA,EAAQ,MAAA,IAAU,YAAA,EAAc,MAAM,OAAA;AAAQ,OACnE;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,WAAA;AAAA,IACA,wJAAA;AAAA,IACA,EAAE,UAAU,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAA,CAAS,wCAAwC,CAAA,EAAE;AAAA,IACrF,OAAO,EAAE,QAAA,EAAS,KAAM;AACtB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAA8C,OAAO,SAAA,EAAW;AAAA,QACvF,UAAU,QAAA,IAAY;AAAA,OACvB,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,kBAAA;AAAA,IACA,sVAAA;AAAA,IAIA,EAAE,MAAM,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAA,CAAS,mGAAmG,CAAA,EAAE;AAAA,IAC7I,OAAO,EAAE,IAAA,EAAK,KAAM;AAClB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAqC,MAAA,CAAO,gBAAA,EAAkB,EAAE,IAAA,EAAM,IAAA,IAAQ,IAAA,EAAK,EAAG,IAAO,CAAA;AACtH,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,mBAAA;AAAA,IACA,uWAAA;AAAA,IAIA,EAAE,MAAM,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAA,CAAS,mGAAmG,CAAA,EAAE;AAAA,IAC7I,OAAO,EAAE,IAAA,EAAK,KAAM;AAClB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAqC,MAAA,CAAO,iBAAA,EAAmB,EAAE,IAAA,EAAM,IAAA,IAAQ,IAAA,EAAK,EAAG,IAAO,CAAA;AACvH,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAIA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,aAAA;AAAA,IACA,0HAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mBAAmB,CAAA;AAAA,MAC7C,QAAQ,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kCAAkC,CAAA;AAAA,MACzE,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,CAAC,SAAS,MAAA,EAAQ,UAAA,EAAY,OAAA,EAAS,aAAa,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,YAAY,CAAA;AAAA,MACrG,QAAA,EAAU,EAAE,MAAA,CAAO,EAAE,GAAG,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,CAAA,EAAG,EAAE,MAAA,EAAO,EAAG,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,gBAAgB,CAAA;AAAA,MACxG,IAAA,EAAM,EAAE,MAAA,CAAO,EAAE,GAAG,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,CAAA,EAAG,EAAE,MAAA,EAAO,EAAG,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,eAAe,CAAA;AAAA,MACnG,OAAO,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mDAAmD,CAAA;AAAA,MACzF,UAAU,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yCAAyC,CAAA;AAAA,MAClF,cAAc,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uBAAuB,CAAA;AAAA,MACpE,UAAU,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,0BAA0B,CAAA;AAAA,MACpE,YAAY,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,eAAe;AAAA,KAC7D;AAAA,IACA,OAAO,MAAA,KAAW;AAChB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,aAAsC,EAAC;AAC7C,MAAA,IAAI,OAAO,QAAA,EAAU,UAAA,CAAW,QAAA,GAAW,EAAE,GAAG,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,OAAO,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA,EAAE;AAC9G,MAAA,IAAI,OAAO,IAAA,EAAM,UAAA,CAAW,IAAA,GAAO,EAAE,GAAG,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,OAAO,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,EAAE;AAC1F,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AACjB,QAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,aAAc,KAAA,GAAQ,CAAA;AAAA,aAAA,IACjC,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AAC5B,UAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA;AAC1B,UAAA,IAAI,CAAA,IAAK,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,UAAA,CAAW,QAAQ,EAAE,GAAA,EAAK,QAAA,CAAS,CAAA,CAAE,CAAC,CAAC,GAAG,KAAA,EAAO,QAAA,CAAS,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,MAAM,QAAA,CAAS,CAAA,CAAE,CAAC,CAAC,CAAA,EAAE;AAAA,QAChH,CAAA,iBAAkB,UAAA,GAAa,CAAA;AAAA,MACjC;AACA,MAAA,IAAI,MAAA,CAAO,QAAA,EAAU,UAAA,CAAW,QAAA,GAAW,MAAA,CAAO,QAAA;AAClD,MAAA,IAAI,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW,UAAA,CAAW,eAAe,MAAA,CAAO,YAAA;AACxE,MAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW,UAAA,CAAW,WAAW,MAAA,CAAO,QAAA;AAAA,sBAChD,QAAA,GAAW,IAAA;AAC3B,MAAA,IAAI,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW,UAAA,CAAW,aAAa,MAAA,CAAO,UAAA;AACpE,MAAA,IAAI,OAAO,KAAA,IAAS,MAAA,CAAO,UAAU,OAAA,EAAS,UAAA,CAAW,QAAQ,MAAA,CAAO,KAAA;AAExE,MAAA,MAAM,SAAA,GAAY,OAAO,KAAA,KAAU,OAAA,GAAU,cAAc,MAAA,CAAO,KAAA,KAAU,gBAAgB,iBAAA,GAAoB,MAAA;AAEhH,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAiE,OAAO,eAAA,EAAiB;AAAA,QAChH,SAAA;AAAA,QACA,UAAA,EAAY,OAAO,MAAA,IAAU,WAAA;AAAA,QAC7B,MAAM,MAAA,CAAO,IAAA;AAAA,QACb;AAAA,OACD,CAAA;AACD,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,mFAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,MACrD,SAAS,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,oBAAoB,CAAA;AAAA,MAC5D,WAAW,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,2BAA2B,CAAA;AAAA,MACrE,MAAA,EAAQ,EAAE,MAAA,CAAO,EAAE,GAAG,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,CAAA,EAAG,EAAE,MAAA,EAAO,EAAG,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,+BAA+B;AAAA,KACvH;AAAA,IACA,OAAO,MAAA,KAAW;AAChB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,aAAA,EAAgB,WAAA,CAAY,OAAO,IAAI,CAAC,IAAI,CAAA,0BAAA,CAA4B,CAAA;AACvF,MAAA,IAAI,MAAA,CAAO,SAAS,KAAA,CAAM,IAAA,CAAK,gBAAgB,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,CAAA;AACvE,MAAA,IAAI,OAAO,SAAA,EAAW;AACpB,QAAA,KAAA,CAAM,KAAK,CAAA,eAAA,EAAkB,WAAA,CAAY,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,MAC9D,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,KAAK,CAAA,0BAAA,CAA4B,CAAA;AAAA,MACzC;AACA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,KAAA,CAAM,KAAK,CAAA,6BAAA,CAA+B,CAAA;AAC1C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gDAAA,EAAmD,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AACxH,QAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAAA,MAClB;AACA,MAAA,KAAA,CAAM,KAAK,CAAA,wCAAA,CAA0C,CAAA;AAErD,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAoC,MAAA,CAAO,QAAA,EAAU,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AACxG,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,iBAAA;AAAA,IACA,yGAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,EAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,kCAAkC,CAAA;AAAA,MACtE,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA,MACnD,UAAA,EAAY,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,kCAAkC,CAAA;AAAA,MAC9F,QAAQ,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kCAAkC;AAAA,KAC3E;AAAA,IACA,OAAO,MAAA,KAAW;AAChB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,EAAA,GAAK,OAAO,UAAA,IAAc,OAAA;AAChC,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,WAAA;AAEhC,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,CAAA,2BAAA,EAA8B,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,CAAA;AAAA,QACxC,CAAA,aAAA,EAAgB,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAAA,QACxC,CAAA,eAAA,EAAkB,WAAA,CAAY,MAAM,CAAC,CAAA,CAAA;AAAA,QACrC,GAAG,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,WAAA,CAAY,CAAC,CAAC,CAAA,eAAA,CAAiB,CAAA;AAAA,QAC7D,CAAA,eAAA,EAAkB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,0CAAA;AAAA,OACvC,CAAE,KAAK,IAAI,CAAA;AAEX,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAoC,OAAO,QAAA,EAAU,EAAE,MAAM,CAAA;AACtF,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,gBAAA;AAAA,IACA,kNAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,QACtB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,QACf,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC/B,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC5B,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,CAAA,EAAG,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,EAAE,QAAA,EAAS;AAAA,QAC7E,MAAM,CAAA,CAAE,MAAA,CAAO,EAAE,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,CAAA,EAAG,CAAA,CAAE,MAAA,IAAU,CAAA,EAAG,CAAA,CAAE,QAAO,EAAG,EAAE,QAAA,EAAS;AAAA,QACzE,OAAO,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD,CAAA;AAAA,QACvF,UAAU,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,sDAAsD,CAAA;AAAA,QAC/F,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAClC,QAAA,EAAU,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,QAC/B,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,QACjC,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,QAAQ,UAAA,EAAY,OAAO,CAAC,CAAA,CAAE,QAAA;AAAS,OAChE,CAAC,CAAA,CAAE,QAAA,CAAS,8BAA8B,CAAA;AAAA,MAC3C,WAAW,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,6CAA6C,CAAA;AAAA,MACvF,aAAa,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,2CAA2C;AAAA,KACzF;AAAA,IACA,OAAO,MAAA,KAAW;AAChB,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,MAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AACzB,MAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe,WAAA;AAE1C,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,KAAA,CAAM,KAAK,CAAA,oCAAA,CAAsC,CAAA;AACjD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,CAAA;AAC/C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,WAAA,CAAY,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,MAC1D;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,QAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA,CAAA;AAChB,QAAA,MAAM,KAAK,CAAA,CAAE,SAAA,KAAc,CAAA,CAAE,KAAA,KAAU,UAAU,WAAA,GAAc,MAAA,CAAA;AAC/D,QAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,CAAC,mBAAmB,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AACrD,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,CAAA;AAC1C,QAAA,IAAI,EAAE,QAAA,EAAU,KAAA,CAAM,KAAK,CAAA,EAAG,CAAC,2BAA2B,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAA,EAAK,EAAE,QAAA,CAAS,CAAC,KAAK,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,CAAA,CAAG,CAAA;AAC3G,QAAA,IAAI,EAAE,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,EAAG,CAAC,uBAAuB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAA,EAAK,EAAE,IAAA,CAAK,CAAC,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AACvF,QAAA,IAAI,EAAE,KAAA,EAAO;AACX,UAAA,IAAI,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,YAAA,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,wBAAA,EAA2B,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,UAC9D,CAAA,MAAA,IAAW,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA,EAAG;AACrC,YAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,4CAA4C,CAAA;AACpE,YAAA,IAAI,GAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAC,2BAA2B,CAAA,CAAE,CAAC,CAAC,CAAA,EAAA,EAAK,EAAE,CAAC,CAAC,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,UAC5E,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,6BAAA,EAAgC,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,UACnE;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,UAAU,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,0BAAA,EAA6B,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AACxE,QAAA,IAAI,CAAA,CAAE,YAAA,KAAiB,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,gBAAA,EAAmB,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA;AACpF,QAAA,KAAA,CAAM,KAAK,CAAA,EAAG,CAAC,eAAe,CAAA,CAAE,QAAA,IAAY,IAAI,CAAA,CAAE,CAAA;AAClD,QAAA,IAAI,CAAA,CAAE,UAAA,KAAe,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,cAAA,EAAiB,CAAA,CAAE,UAAU,CAAA,CAAE,CAAA;AAC9E,QAAA,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,KAAU,WAAW,EAAA,KAAO,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,uBAAA,EAA0B,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACvG,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,UAAA,EAAa,SAAA,GAAY,QAAA,GAAW,WAAA,CAAY,CAAA,CAAE,MAAA,IAAU,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,MAC3F;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,MAAM,CAAA,MAAA,EAAS,YAAY,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA,EAAA,CAAI,CAAA;AAEvF,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA,CAAoC,MAAA,CAAO,QAAA,EAAU,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AACxG,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IAC5F;AAAA,GACF;AAIA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,cAAA;AAAA,IACA,mfAAA;AAAA,IAKA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4DAA4D,CAAA;AAAA,MACtF,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,OAAA,CAAQ,EAAE,CAAA,CAAE,QAAA,CAAS,iCAAiC;AAAA,KACxF;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,UAAS,KAAM;AAC5B,MAAA,eAAA,EAAgB;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA;AAAA,QACvB,MAAA,CAAO,YAAA;AAAA,QAAc,EAAE,IAAA,EAAAA,KAAAA,EAAM,QAAA,EAAS;AAAA,QAAG,MAAO,EAAA,GAAK;AAAA,OACvD;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS;AACxB,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,CAAA,OAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,KAAA,IAAS,sBAAsB,CAAA,CAAA,EAAI,CAAA,EAAE;AAAA,MAC/G;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IACjG;AAAA,GACF;AAMA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,mBAAA;AAAA,IACA,CAAA,6SAAA,CAAA;AAAA,IAGA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,eAAA,EAAgB;AAEhB,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,YAA8B,MAAA,CAAO,aAAA,EAAe,EAAE,CAAA;AAClF,MAAA,MAAM,KAAA,GAAkB,MAAA,CAAO,OAAA,EAAS,KAAA,IAAS,EAAC;AAClD,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,kCAAA,EAAoC,CAAA,EAAE;AAAA,MAC1F;AAGA,MAAA,MAAM,UAAmC,EAAC;AAC1C,MAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG;AAClC,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,WAAA;AAAA,YAC3B,MAAA,CAAO,cAAA;AAAA,YAAgB,EAAE,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,IAAA;AAAK,WAClD;AACA,UAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,cAAc,OAAA,CAAQ,OAAA;AAAA,QACrD,CAAA,CAAA,MAAQ;AACN,UAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAE,KAAA,EAAO,2BAAA,EAA4B;AAAA,QACpD;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,EAAA,EAAI;AACrB,QAAA,OAAA,CAAQ,YAAY,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,SAAS,EAAE,CAAA,yBAAA,CAAA;AAAA,MAC9C;AAEA,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAE;AAAA,IACxF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,kBAAA;AAAA,IACA,4NAAA;AAAA,IAGA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+CAA+C,CAAA;AAAA,MACzE,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,gDAAgD;AAAA,KACxG;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,YAAW,KAAM;AAC9B,MAAA,eAAA,EAAgB;AAEhB,MAAA,MAAM,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAC3C,MAAA,CAAO,WAAA;AAAA,UACL,MAAA,CAAO,cAAA;AAAA,UAAgB,EAAE,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,IAAA;AAAK,SAC/C;AAAA,QACA,MAAA,CAAO,WAAA;AAAA,UACL,MAAA,CAAO,YAAA;AAAA,UAAc,EAAE,QAAA,EAAUA,KAAAA,EAAM,QAAA,EAAU,cAAc,CAAA;AAAE;AACnE,OACD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,OAAA;AAAA,YAClD,QAAA,EAAU,OAAA,CAAQ,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ;AAAA,WAC5C,EAAG,MAAM,CAAC;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,oBAAA;AAAA,IACA,mQAAA;AAAA,IAGA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8EAA8E,CAAA;AAAA,MACxG,SAAA,EAAW,CAAA,CAAE,IAAA,CAAK,CAAC,SAAS,OAAO,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,OAAO,CAAA,CAAE,SAAS,oEAAoE,CAAA;AAAA,MAC/I,eAAe,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8DAA8D;AAAA,KAC9G;AAAA,IACA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,SAAA,EAAW,eAAc,KAAM;AAC5C,MAAA,eAAA,EAAgB;AAEhB,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,WAAA;AAAA,QACvB,MAAA,CAAO,YAAA;AAAA,QAAc,EAAE,IAAA,EAAAA,KAAAA,EAAM,QAAA,EAAU,EAAA,EAAG;AAAA,QAAG,MAAO,EAAA,GAAK;AAAA,OAC3D;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAC,GAAA,CAAI,QAAQ,IAAA,EAAM;AAC7C,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,CAAA,sBAAA,EAAyB,GAAA,CAAI,OAAA,CAAQ,KAAA,IAAS,eAAe,CAAA,CAAA,EAAI,CAAA,EAAE;AAAA,MACvH;AAEA,MAAA,MAAM,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAA;AACzB,MAAA,MAAM,IAAA,GAAO,aAAA,IAAkB,IAAA,CAAK,IAAA,IAAmB,oBAAA;AACvD,MAAA,MAAM,KAAK,SAAA,IAAa,OAAA;AAGxB,MAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AACjD,MAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,EAAM,CAAA,EAAE;AAAA,IAC5D;AAAA,GACF;AAIA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,kBAAA;AAAA,IACA,8KAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,MAAM,WAAA,GAAc,OAAO,eAAA,EAAgB;AAC3C,MAAA,MAAM,aAAA,GAAgB,OAAO,gBAAA,EAAiB;AAC9C,MAAA,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,eAAe,aAAA,IAAiB,MAAA;AAAA,YAChC,WAAA,EAAa,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,cACjC,GAAG,CAAA;AAAA,cACH,MAAA,EAAQ,kBAAkB,CAAA,IAAK,WAAA,CAAY,WAAW,CAAA,GAAI,IAAA,GACtD,EAAE,OAAA,KAAY;AAAA,aACpB,CAAE;AAAA,WACJ,EAAG,MAAM,CAAC;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,kBAAA;AAAA,IACA,yMAAA;AAAA,IAEA;AAAA,MACE,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uDAAuD;AAAA,KACtF;AAAA,IACA,OAAO,EAAE,OAAA,EAAQ,KAAM;AACrB,MAAA,MAAM,WAAA,GAAc,OAAO,eAAA,EAAgB;AAC3C,MAAA,IAAI,OAAA,KAAY,KAAK,CAAC,WAAA,CAAY,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,KAAY,OAAO,CAAA,EAAG;AAClE,QAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,SAAA,IAAa,SAAS,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAC9F,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA,MAAA,EAAS,OAAO,CAAA,8BAAA,EAAiC,aAAa,MAAM,CAAA;AAAA,WAC3E;AAAA,SACH;AAAA,MACF;AACA,MAAA,MAAA,CAAO,iBAAiB,OAAO,CAAA;AAC/B,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,oCAAA,EAAsC,CAAA,EAAE;AAAA,MAC5F;AACA,MAAA,MAAM,SAAS,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,OAAO,CAAA;AAC1D,MAAA,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,IAAA,EAAM,MAAA;AAAA,UACN,MAAM,CAAA,oBAAA,EAAuB,MAAA,EAAQ,SAAA,IAAa,SAAS,KAAK,OAAO,CAAA,CAAA;AAAA,SACxE;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAIA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,eAAA;AAAA,IACA,qEAAA;AAAA,IACA,EAAE,KAAA,EAAO,CAAA,CAAE,QAAO,CAAE,QAAA,CAAS,oBAAoB,CAAA,EAAE;AAAA,IACnD,OAAO,EAAE,KAAA,EAAM,KAAM;AACnB,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,SAAA,EAAW,KAAA,EAAO,EAAE,CAAA;AAC9C,MAAA,MAAM,OAAA,GAAU,eAAe,SAAS,CAAA;AACxC,MAAA,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,EAAG,WAAA,EAAa,OAAA,EAAQ,EAAG,MAAM,CAAC;AAAA,SACzF;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,IAAA;AAAA,IACF,UAAA;AAAA,IACA,yEAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sBAAsB,CAAA;AAAA,MAChD,QAAA,EAAU,CAAA,CAAE,IAAA,CAAK,CAAC,cAAA,EAAgB,SAAA,EAAW,YAAA,EAAc,KAAA,EAAO,KAAA,EAAO,SAAS,CAAC,CAAA,CAAE,SAAS,UAAU;AAAA,KAC1G;AAAA,IACA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAS,KAAM;AAC5B,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,SAAA,CAAU,EAAE,SAAA,EAAW,SAAA,EAAW,OAAA,EAAS,MAAM,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,CAAA,EAAK,SAAA,EAAW,GAAA,EAAK,UAAA,EAAY,KAAK,CAAA;AAC3H,MAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,CAAA,YAAA,EAAe,IAAI,CAAA,CAAA,EAAI,CAAA,EAAE;AAAA,IAC7E;AAAA,GACF;AAIA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,YAAY;AACV,MAAA,MAAM,IAAA,GAAO,OAAO,iBAAA,EAAkB;AACtC,MAAA,OAAO;AAAA,QACL,UAAU,CAAC;AAAA,UACT,GAAA,EAAK,iBAAA;AAAA,UACL,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,SAAA,EAAW,OAAO,WAAA,EAAY;AAAA,YAC9B,WAAW,IAAA,EAAM,SAAA;AAAA,YACjB,SAAS,IAAA,EAAM,OAAA;AAAA,YACf,eAAe,IAAA,EAAM,aAAA;AAAA,YACrB,IAAA,EAAM,OAAO,OAAA;AAAQ,WACvB,EAAG,MAAM,CAAC,CAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAGA,EAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,EAAqB;AAC3C,EAAA,MAAM,GAAA,CAAI,QAAQ,SAAS,CAAA;AAC7B;AAEA,SAAS,eAAA,GAAwB;AAC/B,EAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAY,EAAG;AACzB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AAv0BA,IAUI,MAAA;AAVJ,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mBAAA,GAAA;AAGA,IAAA,cAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,aAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACLA,IAAM,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA;AAAA,0GAAA,CAAA;AAMlB,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,IAAA,GAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,QAAA,EAAS;AACjC,EAAA,IAAI,QAAQ,CAAA,IAAK,IAAA,GAAO,EAAA,EAAI,OAAO,gBAAgB,IAAI,CAAA,CAAA,CAAA;AACvD,EAAA,IAAI,QAAQ,EAAA,IAAM,IAAA,GAAO,EAAA,EAAI,OAAO,kBAAkB,IAAI,CAAA,CAAA,CAAA;AAC1D,EAAA,IAAI,QAAQ,EAAA,IAAM,IAAA,GAAO,EAAA,EAAI,OAAO,gBAAgB,IAAI,CAAA,CAAA,CAAA;AACxD,EAAA,OAAO,6BAA6B,IAAI,CAAA,CAAA,CAAA;AAC1C;AAaO,IAAM,OAAA,GAAkCM,MAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EACzD,QAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,QAAA,GAAW,YAAY,QAAQ,CAAA;AAErC,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,OAAM,MAAA,EAEhC,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAY,OAAA;AAAA,QACZ,WAAA,EAAY,SAAA;AAAA,QACZ,QAAA,EAAU,CAAA;AAAA,QACV,cAAA,EAAe,eAAA;AAAA,QAEf,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,SAAA,EAAU,QAAA,EAAA;AAAA,YAAA,WAAA;AAAA,YACf;AAAA,WAAA,EACZ,CAAA;AAAA,0BACA,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,gCAAA,EAA8B;AAAA;AAAA;AAAA,KAC/C;AAAA,yBAGC,GAAA,EAAA,EAEC,QAAA,EAAA;AAAA,sBAAA,IAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,QAAA;AAAA,UACd,WAAA,EAAY,OAAA;AAAA,UACZ,WAAA,EAAY,MAAA;AAAA,UACZ,QAAA,EAAU,CAAA;AAAA,UACV,QAAA,EAAU,CAAA;AAAA,UACV,KAAA,EAAM,KAAA;AAAA,UAEN,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,QACd,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,4BACA,GAAA,CAAC,QAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,YAEN,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,CAAE,IAAI,CAAC,IAAA,EAAM,CAAA,qBAChC,GAAA,CAAC,IAAA,EAAA,EAAa,KAAA,EAAM,QAAA,EACjB,QAAA,EAAA,IAAA,EAAA,EADQ,CAEX,CACD,CAAA;AAAA,4BAED,GAAA,CAAC,QAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,4BACP,IAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EACX,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,cAAS,QAAA;AAAA,cAAI,KAAA,IAAS;AAAA,aAAA,EACzB,CAAA;AAAA,4BACA,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAE,QAAA,EAAA,GAAA,EAAI;AAAA;AAAA;AAAA,OACtB;AAAA,sBAGA,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,QAAA;AAAA,UACd,WAAA,EAAY,OAAA;AAAA,UACZ,WAAA,EAAY,MAAA;AAAA,UACZ,QAAA,EAAU,CAAA;AAAA,UACV,QAAA,EAAU,CAAA;AAAA,UACV,KAAA,EAAM,KAAA;AAAA,UAEL,sCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,UAAS,QAAA,EAAA,0BAAA,EAE1B,CAAA;AAAA,4BACA,GAAA,CAAC,QAAK,QAAA,EAAA,+CAAA,EAEN,CAAA;AAAA,iCACC,IAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,MAAA;AAAA,8BACA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,cAAO;AAAA,aAAA,EACrC,CAAA;AAAA,iCACC,IAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,MAAA;AAAA,8BACA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA;AAAA,gBAAA,OAAA;AAAA,gBAAM;AAAA,eAAA,EAAS,CAAA;AAAA,cAAO;AAAA,aAAA,EAC/C,CAAA;AAAA,4BACA,GAAA,CAAC,QAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,gCACN,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,UAAS,QAAA,EAAA,mBAAA,EAE1B,CAAA;AAAA,YACC,4BACC,GAAA,CAAC,IAAA,EAAA,EAAK,OAAM,OAAA,EAAQ,QAAA,EAAA,mCAAA,EAA4B,oBAEhD,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,qCAAA,EAA8B,CAAA;AAAA,8BAChD,IAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,gBAAA,2BAAA;AAAA,gBAA0B;AAAA,eAAA,EAAK,CAAA;AAAA,8BAC9C,IAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,gBAAA,MAAA;AAAA,gCACT,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,gBAAO;AAAA,eAAA,EACtD;AAAA,aAAA,EACF;AAAA,WAAA,EAEJ,oBAEA,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,KAAA,EAAM,UAAS,QAAA,EAAA,gCAAA,EAE1B,CAAA;AAAA,4BACA,GAAA,CAAC,QAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,iCACN,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACpC,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACnB,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,gBAAA,EAAc;AAAA,aAAA,EACnC,CAAA;AAAA,iCACC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACpC,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACnB,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,mBAAA,EAAiB;AAAA,aAAA,EACtC,CAAA;AAAA,iCACC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACpC,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACnB,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,gBAAA,EAAc;AAAA,aAAA,EACnC,CAAA;AAAA,iCACC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACpC,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACnB,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,aAAA,EAAW;AAAA,aAAA,EAChC,CAAA;AAAA,iCACC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BACpC,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACnB,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,oBAAA,EAAkB;AAAA,aAAA,EACvC,CAAA;AAAA,4BACA,GAAA,CAAC,QAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,4BACP,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,wBAAA,EAAsB,CAAA;AAAA,gCACpC,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAA,EAAM,MAAA,EAAO,gDAAkC,CAAA,EACvD,CAAA;AAAA,gCACC,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAA,EAAM,MAAA,EAAO,8CAAgC,CAAA,EACrD;AAAA,WAAA,EACF;AAAA;AAAA;AAEJ,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC,CAAA;;;ACrKD,WAAA,EAAA;AAMA,IAAM,gBAAA,GAA2E;AAAA,EAC/E,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,MAAM,2BAAA,EAA4B;AAAA,EACpE,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,MAAM,6BAAA,EAA8B;AAAA,EAC5E,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,eAAA,EAAiB,MAAM,2BAAA,EAA4B;AAAA,EAC3E,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,YAAA,EAAc,MAAM,kBAAA,EAAmB;AAAA,EAC5D,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,YAAA,EAAc,MAAM,sBAAA;AAClD,CAAA;AAEO,IAAM,KAAA,GAA8B,CAAC,EAAE,UAAA,EAAW,KAAM;AAC7D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAA6B,UAAU,CAAA;AAC/D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAyB,QAAQ,CAAA;AACjF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,EAAE,CAAA;AAEvC,EAAA,QAAA,CAAS,CAAC,OAAO,GAAA,KAAQ;AACvB,IAAA,IAAI,SAAS,UAAA,EAAY;AAEzB,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,IAChD,CAAA,MAAA,IAAW,IAAI,SAAA,EAAW;AACxB,MAAA,cAAA,CAAe,CAAC,SAAS,IAAA,CAAK,GAAA,CAAI,iBAAiB,MAAA,GAAS,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,IAC1E,CAAA,MAAA,IAAW,IAAI,MAAA,EAAQ;AACrB,MAAA,mBAAA,CAAoB,gBAAA,CAAiB,WAAW,CAAA,CAAE,GAAG,CAAA;AACrD,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAkB;AACzC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,UAAA,CAAW,kBAAkB,OAAO,CAAA;AAAA,IACtC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,UAAU,gBAAgB,CAAA;AAE/C,EAAA,uBACEC,KAACC,GAAAA,EAAA,EAAI,eAAc,QAAA,EAAS,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,CAAA,EACjD,QAAA,EAAA;AAAA,oBAAAC,IAACC,IAAAA,EAAA,EAAK,MAAI,IAAA,EAAC,KAAA,EAAM,WAAU,QAAA,EAAA,wCAAA,EAE3B,CAAA;AAAA,oBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,IAEN,IAAA,KAAS,UAAA,oBACRH,IAAAA,CAAAI,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAC,QAAA,EAAA,0BAAA,EAAwB,CAAA;AAAA,sBACnCD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,MACN,gBAAA,CAAiB,IAAI,CAAC,GAAA,EAAK,sBAC1BH,IAAAA,CAACC,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,IAAAA,CAACG,IAAAA,EAAA,EAAK,KAAA,EAAO,CAAA,KAAM,cAAc,MAAA,GAAS,MAAA,EAAW,IAAA,EAAM,CAAA,KAAM,WAAA,EAC9D,QAAA,EAAA;AAAA,UAAA,CAAA,KAAM,cAAc,UAAA,GAAQ,KAAA;AAAA,UAC5B,GAAA,CAAI;AAAA,SAAA,EACP,CAAA;AAAA,wBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UAAG,GAAA,CAAI;AAAA,SAAA,EAAK;AAAA,OAAA,EAAA,EALnB,GAAA,CAAI,GAMd,CACD,CAAA;AAAA,sBACDD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACPD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,2CAAA,EAA+B;AAAA,KAAA,EAChD,CAAA;AAAA,IAGD,IAAA,KAAS,KAAA,oBACRH,IAAAA,CAAAI,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAJ,IAAAA,CAACG,MAAA,EAAK,QAAA,EAAA;AAAA,QAAA,YAAA;AAAA,wBACMD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,IAAA,EAAI,IAAA,EAAE,QAAA,EAAA,SAAA,CAAU,gBAAgB,CAAA,CAAE,IAAA,EAAK;AAAA,OAAA,EACtE,CAAA;AAAA,sBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,iBAAA;AAAA,wBACWD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAS,uBAAa,YAAA,EAAa;AAAA,OAAA,EAChE,CAAA;AAAA,sBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACPD,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAI,MAAC,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,sBAC9BD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,wCAAA,EAEf,CAAA;AAAA,sBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACPH,IAAAA,CAACC,GAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,QAAO,QAAA,EAAA,SAAA,EAAE,CAAA;AAAA,wBACrBD,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,MAAA;AAAA,YACP,QAAA,EAAU,SAAA;AAAA,YACV,QAAA,EAAU,eAAA;AAAA,YACV,IAAA,EAAK,GAAA;AAAA,YACL,WAAA,EAAY;AAAA;AAAA;AACd,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAA;ACvFO,IAAM,SAAA,GAAsCH,MAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EAC7D,SAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,WAAA,GAAc,YAAY,OAAA,GAAU,KAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,eAAA,KAAoB,SAAA,GAAY,CAAA,GAAI,CAAA,CAAA;AAClD,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,UAAA,GAAa,qBAAA;AAAA,EACf,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AACpB,IAAA,UAAA,GAAa,UAAK,KAAK,CAAA,QAAA,EAAW,YAAY,CAAA,gBAAA,EAAc,SAAS,KAAK,EAAE,CAAA,CAAA;AAAA,EAC9E,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,CAAA,gBAAA,EAAc,SAAA,GAAY,CAAA,QAAA,EAAM,SAAS,KAAK,EAAE,CAAA,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,aAAa,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,KAAA;AAE7C,EAAA,uBACEC,IAAAA;AAAA,IAACC,GAAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAY,QAAA;AAAA,MACZ,WAAA,EAAY,MAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,cAAA,EAAe,eAAA;AAAA,MACf,KAAA,EAAM,MAAA;AAAA,MAEN,QAAA,EAAA;AAAA,wBAAAD,IAAAA,CAACC,GAAAA,EAAA,EAAI,GAAA,EAAK,CAAA,EACR,QAAA,EAAA;AAAA,0BAAAC,IAACC,IAAAA,EAAA,EAAK,MAAI,IAAA,EAAC,KAAA,EAAM,WAAU,QAAA,EAAA,SAAA,EAE3B,CAAA;AAAA,0BACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,aAAc,QAAA,EAAA,UAAA,EAAW;AAAA,SAAA,EACxC,CAAA;AAAA,wBACAH,IAAAA,CAACC,GAAAA,EAAA,EAAI,KAAK,CAAA,EACP,QAAA,EAAA;AAAA,UAAA,aAAA,KAAkB,0BACjBD,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YAAE,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,GAAI,CAAA;AAAA,YAAE;AAAA,WAAA,EAAQ,CAAA;AAAA,0BAE5DD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,QAAQ,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,0BAC/BD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,gBAAA,EAAc;AAAA,SAAA,EAC/B;AAAA;AAAA;AAAA,GACF;AAEJ,CAAC,CAAA;ACtCD,SAAS,WAAW,EAAA,EAAoB;AACtC,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,EAAE,CAAA;AACrB,EAAA,OAAO,EAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,MAAA,EAAQ,OAAO,CAAA;AACxD;AAEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,IAAA,EAAM,OAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,WAAA,GAAsC;AAAA,EAC1C,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEO,IAAM,UAAA,GAAwCJ,OAAM,IAAA,CAAK,CAAC,EAAE,OAAA,EAAS,QAAA,GAAW,IAAG,KAAM;AAC9F,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,QAAQ,CAAA;AAEvC,EAAA,uBACEC,IAAAA,CAACC,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,WAAA,EAAY,QAAA,EAAS,WAAA,EAAY,MAAA,EAAO,QAAA,EAAU,CAAA,EAC5E,QAAA,EAAA;AAAA,oBAAAC,IAACC,IAAAA,EAAA,EAAK,MAAI,IAAA,EAAC,QAAA,EAAQ,MAAC,QAAA,EAAA,QAAA,EAEpB,CAAA;AAAA,IACC,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAClBD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,MAAA,EAAM,IAAA,EAAC,QAAA,EAAA,8BAAA,EAEtB,CAAA,GAEA,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBAClBH,IAAAA,CAACG,IAAAA,EAAA,EAAa,KAAA,EAAO,YAAA,CAAa,KAAA,CAAM,KAAK,CAAA,IAAK,OAAA,EAChD,QAAA,EAAA;AAAA,sBAAAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE,UAAA,CAAW,MAAM,SAAS,CAAA;AAAA,QAAE;AAAA,OAAA,EAAC,CAAA;AAAA,MAAQ,GAAA;AAAA,sBACtDD,IAACC,IAAAA,EAAA,EAAM,sBAAY,KAAA,CAAM,KAAK,KAAK,QAAA,EAAI,CAAA;AAAA,MAAO,GAAA;AAAA,MAAE,KAAA,CAAM;AAAA,KAAA,EAAA,EAF7C,CAGX,CACD;AAAA,GAAA,EAEL,CAAA;AAEJ,CAAC,CAAA;ACtCD,SAASE,YAAW,EAAA,EAAoB;AACtC,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,EAAE,CAAA;AACrB,EAAA,OAAO,EAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,MAAA,EAAQ,OAAO,CAAA;AACxD;AAEO,IAAM,QAAA,GAAoCN,OAAM,IAAA,CAAK,CAAC,EAAE,OAAA,EAAS,SAAA,EAAW,QAAA,GAAW,EAAA,EAAG,KAAM;AACrG,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,QAAQ,CAAA;AAEvC,EAAA,uBACEC,KAACC,GAAAA,EAAA,EAAI,eAAc,QAAA,EAAS,QAAA,EAAU,CAAA,EAAG,QAAA,EAAU,CAAA,EAChD,QAAA,EAAA;AAAA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBACnBD,IAAAA,CAACC,GAAAA,EAAA,EAAY,aAAA,EAAc,UAAS,YAAA,EAAc,KAAA,CAAM,IAAA,KAAS,MAAA,GAAS,IAAI,CAAA,EAC3E,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,IAAA,KAAS,MAAA,oBACdD,IAAAA,CAACC,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,KAACG,IAAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,MAAI,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAClB;AAAA,SAAA,EACN,CAAA;AAAA,wBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UAAEE,WAAAA,CAAW,MAAM,SAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC;AAAA,OAAA,EAChD,CAAA;AAAA,MAED,MAAM,IAAA,KAAS,WAAA,oBACdL,IAAAA,CAACC,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,KAACG,IAAAA,EAAA,EAAK,KAAA,EAAM,SAAA,EAAU,MAAI,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UACjB;AAAA,SAAA,EACV,CAAA;AAAA,wBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UAAEE,WAAAA,CAAW,MAAM,SAAS,CAAA;AAAA,UAAE;AAAA,SAAA,EAAC;AAAA,OAAA,EAChD,CAAA;AAAA,MAED,KAAA,CAAM,SAAS,MAAA,oBACdL,KAACG,IAAAA,EAAA,EAAK,OAAM,QAAA,EAAS,QAAA,EAAA;AAAA,QAAA,SAAA;AAAA,QAChB,MAAM,QAAA,IAAY,MAAA;AAAA,QAAO,IAAA;AAAA,QAAG,KAAA,CAAM;AAAA,OAAA,EACvC,CAAA;AAAA,MAED,KAAA,CAAM,IAAA,KAAS,QAAA,oBACdD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EAAS,IAAA,EAAI,IAAA,EAAC,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,MAEnC,KAAA,CAAM,SAAS,OAAA,oBACdH,KAACG,IAAAA,EAAA,EAAK,OAAM,KAAA,EAAM,QAAA,EAAA;AAAA,QAAA,gBAAA;AAAA,QAAU,KAAA,CAAM;AAAA,OAAA,EAAQ,CAAA;AAAA,MAAA,CAE1C,MAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,IAAA,KAAS,eAAe,KAAA,CAAM,IAAA,KAAS,QAAA,qBACtED,IAACC,IAAAA,EAAA,EAAK,IAAA,EAAK,MAAA,EAAQ,gBAAM,OAAA,EAAQ;AAAA,KAAA,EAAA,EA7B3B,CA+BV,CACD,CAAA;AAAA,IAEA,6BACCH,IAAAA,CAACC,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,sBAAAD,IAAAA,CAACC,KAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,KAACG,IAAAA,EAAA,EAAK,KAAA,EAAM,SAAA,EAAU,MAAI,IAAA,EAAC,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UACjB;AAAA,SAAA,EACV,CAAA;AAAA,wBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,aAAA,EAAW;AAAA,OAAA,EAC5B,CAAA;AAAA,sBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAK,QAAQ,QAAA,EAAA,SAAA,EAAU;AAAA,KAAA,EAC/B;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAC,CAAA;ACnDM,SAAS,iBAAA,GAA2C;AACzD,EAAA,IAAI,OAAA,CAAQ,aAAa,OAAA,EAAS;AAChC,IAAA,OAAO,qBAAA,EAAsB;AAAA,EAC/B;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,EAAO,EAAG,CAAA,aAAA,EAAgB,WAAA,CAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,IAAA,CAAM,CAAA;AAEnF,EAAA,IAAI;AACF,IAAA,QAAA;AAAA,MACE,CAAA,6KAAA,EAAgL,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,8DAAA,CAAA;AAAA,MAC3M,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA;AAAK,KACjC;AAEA,IAAA,IAAI,CAAC,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AAEjC,IAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,IAAA,UAAA,CAAW,OAAO,CAAA;AAElB,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,GAAA,EAAK,OAAO,IAAA;AAEhC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,MAChC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI;AAAE,MAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG,UAAA,CAAW,OAAO,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAe;AAC3E,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,qBAAA,GAA+C;AACtD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,EAAO,EAAG,CAAA,aAAA,EAAgB,WAAA,CAAY,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,IAAA,CAAM,CAAA;AAEnF,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,CAAQ,aAAa,QAAA,EAAU;AACjC,MAAA,QAAA,CAAS,CAAA,yGAAA,EAAsG,OAAO,CAAA,gEAAA,CAAA,EAAoE,EAAE,OAAO,MAAA,EAAQ,OAAA,EAAS,KAAM,CAAA;AAAA,IAC5N,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,CAAA,8CAAA,EAAiD,OAAO,CAAA,CAAA,CAAA,EAAK,EAAE,OAAO,MAAA,EAAQ,OAAA,EAAS,KAAM,CAAA;AAAA,IACxG;AAEA,IAAA,IAAI,CAAC,UAAA,CAAW,OAAO,CAAA,EAAG,OAAO,IAAA;AAEjC,IAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AACnC,IAAA,UAAA,CAAW,OAAO,CAAA;AAElB,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,GAAA,EAAK,OAAO,IAAA;AAEhC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,MAChC,QAAA,EAAU;AAAA,KACZ;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,IAAI;AAAE,MAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG,UAAA,CAAW,OAAO,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAA,IAAe;AAC3E,IAAA,OAAO,IAAA;AAAA,EACT;AACF;ACpEA,IAAM,QAAA,GAAgC;AAAA,EACpC,EAAE,OAAA,EAAS,OAAA,EAAS,WAAA,EAAa,kCAAA,EAAmC;AAAA,EACpE,EAAE,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,qBAAA,EAAsB;AAAA,EACxD,EAAE,OAAA,EAAS,SAAA,EAAW,WAAA,EAAa,8CAAA,EAA+C;AAAA,EAClF,EAAE,OAAA,EAAS,SAAA,EAAW,WAAA,EAAa,mCAAA,EAAoC;AAAA,EACvE,EAAE,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,oBAAA,EAAqB;AAAA,EACvD,EAAE,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,uCAAA;AACpC,CAAA;AAgBA,IAAM,gBAAqFJ,MAAAA,CAAM,IAAA;AAAA,EAC/F,CAAC,EAAE,WAAA,EAAa,WAAA,EAAY,qBAC1BC,IAAAA,CAACC,GAAAA,EAAA,EAAI,aAAA,EAAc,UAAS,QAAA,EAAU,CAAA,EAAG,WAAA,EAAY,QAAA,EAAS,aAAY,MAAA,EACvE,QAAA,EAAA;AAAA,IAAA,WAAA,CAAY,IAAI,CAAC,CAAA,EAAG,sBACnBD,IAAAA,CAACC,KAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,WAAA,GAAc,MAAA,GAAS,MAAA,EAAW,IAAA,EAAM,CAAA,KAAM,WAAA,EAC9D,QAAA,EAAA,CAAA,KAAM,WAAA,GAAc,YAAO,IAAA,EAC9B,CAAA;AAAA,sBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,WAAA,GAAc,MAAA,GAAS,OAAA,EAAS,IAAA,EAAM,MAAM,WAAA,EAC5D,QAAA,EAAA,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA,EACtB,CAAA;AAAA,sBACAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAE,YAAE,WAAA,EAAY;AAAA,KAAA,EAAA,EAPtB,CAAA,CAAE,OAQZ,CACD,CAAA;AAAA,oBACDD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,6DAAA,EAA2C;AAAA,GAAA,EAC5D;AAEJ,CAAA;AAEO,IAAM,QAAA,GAAoCJ,MAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EAC3D,QAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,gDAAA;AAAA,EACd,aAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIO,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAA2C,MAAM,CAAA;AACvF,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAEnB,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IAAK,MAAM,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,EAAC;AAC3D,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAChC,IAAA,OAAO,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,EAC3D,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,MAAM,MAAA,GAAS,CAAA;AAEjE,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,IAAI,CAAC,cAAc,OAAO,KAAA;AAC1B,IAAA,cAAA,CAAe,UAAU,CAAA;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,YAAA,CAAa,GAAG,CAAA;AAChB,QAAA,cAAA,CAAe,MAAM,CAAA;AACrB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAe;AACvB,IAAA,cAAA,CAAe,UAAU,CAAA;AACzB,IAAA,UAAA,CAAW,MAAM,cAAA,CAAe,MAAM,CAAA,EAAG,GAAI,CAAA;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAiB;AAChC,MAAA,IAAI,YAAA,EAAc;AAClB,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,EAAS;AAE1B,MAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,OAAA,EAAS;AACtC,QAAA,aAAA,EAAc;AACd,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,GAAA,EAAQ;AAClB,QAAA,aAAA,EAAc;AACd,QAAA;AAAA,MACF;AAAA,IACF,CAAA;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,OAAO,CAAA;AAChC,IAAA,OAAO,MAAM;AAAE,MAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AAAA,IAAG,CAAA;AAAA,EACrD,CAAA,EAAG,CAAC,YAAA,EAAc,aAAa,CAAC,CAAA;AAEhC,EAAAC,QAAAA,CAAS,CAAC,MAAA,EAAQ,GAAA,KAAQ;AACxB,IAAA,IAAI,YAAA,EAAc;AAElB,IAAA,IAAI,CAAC,eAAA,EAAiB;AAEtB,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,IAChD,CAAA,MAAA,IAAW,IAAI,SAAA,EAAW;AACxB,MAAA,cAAA,CAAe,CAAC,SAAS,IAAA,CAAK,GAAA,CAAI,YAAY,MAAA,GAAS,CAAA,EAAG,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,IACrE,CAAA,MAAA,IAAW,IAAI,GAAA,EAAK;AAClB,MAAA,MAAM,QAAA,GAAW,YAAY,WAAW,CAAA;AACxC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,QAAA,CAAS,UAAU,GAAG,CAAA;AAC/B,QAAA,cAAA,CAAe,CAAC,CAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAc;AAC9C,IAAA,QAAA,CAAS,CAAC,CAAA;AACV,IAAA,cAAA,CAAe,CAAC,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,IAAA,KAAiB;AACjD,IAAA,IAAI,YAAA,EAAc;AAGlB,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,OAAkB,QAAA,EAAU;AAC1C,MAAA,aAAA,EAAc;AACd,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eAAe,QAAA,CAAS,OAAA;AAC9B,IAAA,MAAM,qBAAqB,QAAA,CAAS,MAAA;AAAA,MAClC,CAAC,CAAA,KAAM,YAAA,CAAa,UAAA,CAAW,GAAG,KAAK,CAAC,YAAA,CAAa,QAAA,CAAS,GAAG,KAAK,CAAA,CAAE,OAAA,CAAQ,UAAA,CAAW,YAAA,CAAa,aAAa;AAAA,KACvH;AACA,IAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,MAAA,GAAS,CAAA,IAAK,aAAa,MAAA,GAAS,CAAA;AAE9E,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,CAAC,CAAA,EAAG,OAAA;AACnC,MAAA,IAAI,OAAO,YAAA,KAAiB,GAAA,IAAO,CAAC,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9D,QAAA,MAAM,YAAY,CAAC,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,WAAW,QAAQ,CAAA;AACpE,QAAA,QAAA,CAAS,OAAO,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA;AACnD,QAAA,cAAA,CAAe,CAAC,CAAA;AAChB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AACf,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AACpB,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,cAAA,CAAe,CAAC,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,QAAA,EAAU,aAAa,CAAC,CAAA;AAE1C,EAAA,uBACEP,IAAAA,CAACC,GAAAA,EAAA,EAAI,eAAc,QAAA,EAChB,QAAA,EAAA;AAAA,IAAA,eAAA,oBACCC,GAAAA,CAAC,aAAA,EAAA,EAAc,WAAA,EAA0B,WAAA,EAA0B,CAAA;AAAA,IAGpE,aAAA,oBACCF,IAAAA,CAACC,GAAAA,EAAA,EAAI,QAAA,EAAU,CAAA,EAAG,KAAK,CAAA,EACrB,QAAA,EAAA;AAAA,sBAAAC,IAACC,IAAAA,EAAA,EAAK,OAAM,OAAA,EAAQ,IAAA,EAAI,MAAC,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,sBAClCD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,QAAA,EAAA,wCAAA,EAAiC;AAAA,KAAA,EAClD,CAAA;AAAA,IAGD,WAAA,KAAgB,UAAA,oBACfD,GAAAA,CAACD,KAAA,EAAI,QAAA,EAAU,CAAA,EACb,QAAA,kBAAAC,IAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EAAS,mCAAqB,CAAA,EAC5C,CAAA;AAAA,IAGD,WAAA,KAAgB,UAAA,oBACfD,GAAAA,CAACD,KAAA,EAAI,QAAA,EAAU,CAAA,EACb,QAAA,kBAAAC,IAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAM,gGAAkF,CAAA,EACtG,CAAA;AAAA,oBAGFH,IAAAA,CAACC,GAAAA,EAAA,EAAI,WAAA,EAAY,QAAA,EAAS,WAAA,EAAa,YAAA,GAAe,QAAA,GAAW,aAAA,GAAgB,OAAA,GAAU,MAAA,EAAQ,UAAU,CAAA,EAC3G,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAO,YAAA,GAAe,QAAA,GAAW,MAAA,EAAQ,IAAA,EAAI,IAAA,EAChD,QAAA,EAAA,YAAA,GAAe,SAAA,GAAO,aAAA,GAAgB,eAAQ,SAAA,EACjD,CAAA;AAAA,MACC,YAAA,mBACCD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,QAAA,EAAA,eAAA,EAAa,CAAA,mBAE5BD,GAAAA;AAAA,QAACM,SAAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,QAAA,EAAU,YAAA;AAAA,UACV,QAAA,EAAU,YAAA;AAAA,UACV,WAAA,EAAa,gBAAgB,4CAAA,GAA+C;AAAA;AAAA;AAC9E,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC,CAAA;AC5MD,IAAM,WAAA,GAAsC;AAAA,EAC1C,SAAA,EAAW,WAAA;AAAA,EACX,mBAAA,EAAqB,cAAA;AAAA,EACrB,iBAAA,EAAmB,WAAA;AAAA,EACnB,eAAA,EAAiB,WAAA;AAAA,EACjB,UAAA,EAAY,iBAAA;AAAA,EACZ,WAAA,EAAa,WAAA;AAAA,EACb,aAAA,EAAe,WAAA;AAAA,EACf,OAAA,EAAS,WAAA;AAAA,EACT,QAAA,EAAU,WAAA;AAAA,EACV,YAAA,EAAc,WAAA;AAAA,EACd,MAAA,EAAQ,WAAA;AAAA,EACR,WAAA,EAAa,WAAA;AAAA,EACb,YAAA,EAAc,WAAA;AAAA,EACd,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,WAAA;AAAA,EACP,MAAA,EAAQ,WAAA;AAAA,EACR,WAAA,EAAa,WAAA;AAAA,EACb,cAAA,EAAgB,WAAA;AAAA,EAChB,aAAA,EAAe;AACjB,CAAA;AAEA,SAAS,QAAQ,SAAA,EAA2B;AAC1C,EAAA,OAAO,WAAA,CAAY,SAAS,CAAA,IAAK,QAAA;AACnC;AAQA,IAAM,WAKD,CAAC,EAAE,MAAM,KAAA,EAAO,QAAA,EAAU,cAAa,KAAM;AAChD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAChC,EAAA,MAAM,UAAA,GAAa,KAAK,IAAA,KAAS,YAAA;AACjC,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AAC5D,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAEnC,EAAA,uBACER,IAAAA,CAACC,GAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAACG,MAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,MAAE,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,sBACvBD,GAAAA,CAACC,IAAAA,EAAA,EAAM,QAAA,EAAA,WAAA,GAAc,YAAO,IAAA,EAAK,CAAA;AAAA,sBACjCH,IAAAA,CAACG,IAAAA,EAAA,EAAM,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QAAK;AAAA,OAAA,EAAC,CAAA;AAAA,sBACbD,GAAAA,CAACC,IAAAA,EAAA,EAAK,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,GAAa,MAAA,GAAS,MAAA,EAClD,QAAA,EAAA,IAAA,CAAK,IAAA,EACR,CAAA;AAAA,sBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QAAG,IAAA,CAAK,SAAA;AAAA,QAAU;AAAA,OAAA,EAAC;AAAA,KAAA,EACpC,CAAA;AAAA,IACC,WAAA,IACC,QAAQ,QAAA,IACR,IAAA,CAAK,SAAU,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,qBACzBD,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAM,KAAA;AAAA,QACN,OAAO,KAAA,GAAQ,CAAA;AAAA,QACf,QAAA;AAAA,QACA;AAAA,OAAA;AAAA,MAJK,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,KAM1B;AAAA,GAAA,EACL,CAAA;AAEJ,CAAA;AAEO,IAAM,YAAA,GAA4CH,MAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EACnE,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,KAAM;AACJ,EAAA,uBACEC,IAAAA;AAAA,IAACC,GAAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAc,QAAA;AAAA,MACd,WAAA,EAAY,QAAA;AAAA,MACZ,WAAA,EAAY,MAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,KAAA,EAAO,EAAA;AAAA,MACP,QAAA,EAAU,EAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAC,IAACC,IAAAA,EAAA,EAAK,MAAI,IAAA,EAAC,QAAA,EAAQ,MAAC,QAAA,EAAA,UAAA,EAEpB,CAAA;AAAA,QACC,KAAK,MAAA,KAAW,CAAA,mBACfD,GAAAA,CAACC,IAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,MAAA,EAAM,IAAA,EAAC,sCAEtB,CAAA,GAEA,IAAA,CAAK,IAAI,CAAC,IAAA,EAAM,sBACdD,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA;AAAA,YACA,KAAA,EAAO,CAAA;AAAA,YACP,QAAA;AAAA,YACA;AAAA,WAAA;AAAA,UAJK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,SAMzB;AAAA;AAAA;AAAA,GAEL;AAEJ,CAAC,CAAA;AC3FD,SAAS,cAAc,IAAA,EAAuC;AAC5D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,MAAM,MAAM,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AACpE,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,MAAA,GAAS,EAAA,GAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA,GAAQ,GAAG,CAAA,CAAE,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,IAAM,eAA4CH,MAAAA,CAAM,IAAA,CAAK,CAAC,EAAE,OAAM,KAAM;AACjF,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,uBACEG,GAAAA,CAACD,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,UAAU,CAAA,EACnC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,qBAChBD,KAACC,GAAAA,EAAA,EAAY,KAAK,CAAA,EACf,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,MAAA,KAAW,SAAA,oBACfC,GAAAA,CAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EACV,QAAA,kBAAAD,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAO,CAAA,EACvB,CAAA;AAAA,IAED,IAAA,CAAK,WAAW,MAAA,oBAAUA,IAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,IAC/C,IAAA,CAAK,WAAW,OAAA,oBAAWD,IAACC,IAAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,oBAC/CD,IAACC,IAAAA,EAAA,EAAK,OAAM,QAAA,EAAS,IAAA,EAAI,IAAA,EACtB,QAAA,EAAA,IAAA,CAAK,IAAA,EACR,CAAA;AAAA,oBACAH,IAAAA,CAACG,IAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE,aAAA,CAAc,KAAK,IAAI,CAAA;AAAA,MAAE;AAAA,KAAA,EAAC,CAAA;AAAA,IAC1C,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,oBAC3BH,IAAAA,CAACG,IAAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA;AAAA,MAAA,UAAA;AAAA,MAAI,KAAK,MAAA,CAAO;AAAA,KAAA,EAAM;AAAA,GAAA,EAAA,EAblC,CAeV,CACD,CAAA,EACH,CAAA;AAEJ,CAAC,CAAA;ACvBM,IAAM,MAAA,GAAgCJ,MAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EACvD,SAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,uBACEC,IAAAA,CAACC,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,OAAM,MAAA,EAChC,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAsB,SAAA,EAAsB,iBAAkC,KAAA,EAAc,CAAA;AAAA,oBAEvGF,IAAAA,CAACC,GAAAA,EAAA,EAAI,UAAU,CAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,YAAA,EAAc,CAAA;AAAA,sBAElCF,IAAAA,CAACC,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,UAAU,CAAA,EACpC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,WAAA,EAAa,SAAA,EAAsB,CAAA;AAAA,QACrD,UAAU,MAAA,GAAS,CAAA,oBAAKA,GAAAA,CAAC,YAAA,EAAA,EAAa,OAAO,SAAA,EAAW;AAAA,OAAA,EAC3D;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,aAAA,EAAe,UAAU,CAAA,EAAG,CAAA;AAAA,oBACjDA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ,CAAC,CAAA;;;AC/DD,aAAA,EAAA;AAYO,SAAS,UAAU,MAAA,EAAsB;AAC9C,EAAA,MAAM,QAAA,GAAW,OAAO,iBAAA,EAAkB;AAC1C,EAAA,MAAM,WAAA,GAAc,OAAO,eAAA,EAAgB;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAII,QAAAA,CAAsB;AAAA,IAC9C,SAAA,EAAW,OAAO,WAAA,EAAY;AAAA,IAC9B,WAAW,QAAA,EAAU,SAAA;AAAA,IACrB,SAAS,QAAA,EAAU,OAAA;AAAA,IACnB,iBAAiB,WAAA,CAAY,MAAA;AAAA,IAC7B,cAAc,EAAC;AAAA,IACf,WAAW;AAAC,GACb,CAAA;AAED,EAAA,MAAM,QAAA,GAAWG,OAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAEnB,EAAAC,UAAU,MAAM;AAEd,IAAA,IAAI,OAAO,WAAA,EAAY,IAAK,CAAC,QAAA,CAAS,QAAQ,SAAA,EAAW;AACvD,MAAA,MAAM,IAAA,GAAO,OAAO,iBAAA,EAAkB;AACtC,MAAA,MAAM,KAAA,GAAQ,OAAO,eAAA,EAAgB;AACrC,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW,IAAA;AAAA,QACX,WAAW,IAAA,EAAM,SAAA;AAAA,QACjB,SAAS,IAAA,EAAM,OAAA;AAAA,QACf,iBAAiB,KAAA,CAAM;AAAA,OACzB,CAAE,CAAA;AAAA,IACJ;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,OAAA,KAAoC;AACvD,MAAA,MAAM,KAAA,GAAQ,OAAO,eAAA,EAAgB;AACrC,MAAA,MAAM,IAAA,GAAO,OAAO,iBAAA,EAAkB;AACtC,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAW,IAAA,EAAM,SAAA,IAAa,OAAA,CAAQ,aAAa,IAAA,CAAK,SAAA;AAAA,QACxD,OAAA,EAAS,IAAA,EAAM,OAAA,IAAW,OAAA,CAAQ,WAAW,IAAA,CAAK,OAAA;AAAA,QAClD,iBAAiB,KAAA,CAAM;AAAA,OACzB,CAAE,CAAA;AAAA,IACJ,CAAA;AAEA,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,MAAM,KAAA,GAAQ,OAAO,eAAA,EAAgB;AACrC,MAAA,MAAM,IAAA,GAAO,OAAO,iBAAA,EAAkB;AACtC,MAAA,MAAM,cAAA,GAAiB,MAAM,MAAA,GAAS,CAAA;AACtC,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW,cAAA;AAAA,QACX,SAAA,EAAW,cAAA,GAAiB,IAAA,EAAM,SAAA,GAAY,MAAA;AAAA,QAC9C,OAAA,EAAS,cAAA,GAAiB,IAAA,EAAM,OAAA,GAAU,MAAA;AAAA,QAC1C,iBAAiB,KAAA,CAAM;AAAA,OACzB,CAAE,CAAA;AAAA,IACJ,CAAA;AAEA,IAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAAsC;AACxD,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,cAAc,OAAA,CAAQ,IAAA,IAAQ,EAAC,EAAE,CAAE,CAAA;AAAA,IACpE,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAA2B;AAC3C,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW;AAAA,UACT,GAAG,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,UAC5B;AAAA,YACE,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,YACzC,QAAQ,OAAA,CAAQ;AAAA;AAClB;AACF,OACF,CAAE,CAAA;AAAA,IACJ,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,KAA2B;AAC1C,MAAA,QAAA,CAAS,CAAC,IAAA,MAAU;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW;AAAA,UACT,GAAG,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,UAC5B;AAAA,YACE,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,KAAA,EAAO,OAAA;AAAA,YACP,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAAA,YACzC,QAAQ,OAAA,CAAQ;AAAA;AAClB;AACF,OACF,CAAE,CAAA;AAAA,IACJ,CAAA;AAEA,IAAA,MAAA,CAAO,EAAA,CAAG,oBAAoB,WAAW,CAAA;AACzC,IAAA,MAAA,CAAO,EAAA,CAAG,uBAAuB,cAAc,CAAA;AAC/C,IAAA,MAAA,CAAO,EAAA,CAAG,SAAA,CAAU,QAAA,EAAU,UAAU,CAAA;AACxC,IAAA,MAAA,CAAO,EAAA,CAAG,SAAA,CAAU,MAAA,EAAQ,QAAQ,CAAA;AACpC,IAAA,MAAA,CAAO,EAAA,CAAG,SAAA,CAAU,KAAA,EAAO,OAAO,CAAA;AAElC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,GAAA,CAAI,oBAAoB,WAAW,CAAA;AAC1C,MAAA,MAAA,CAAO,GAAA,CAAI,uBAAuB,cAAc,CAAA;AAChD,MAAA,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,QAAA,EAAU,UAAU,CAAA;AACzC,MAAA,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,QAAQ,CAAA;AACrC,MAAA,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,KAAA,EAAO,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,WAAA,GAAcC,YAAY,MAAM;AACpC,IAAA,QAAA,CAAS,CAAC,UAAU,EAAE,GAAG,MAAM,SAAA,EAAW,IAAG,CAAE,CAAA;AAAA,EACjD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,WAAA,EAAY;AACjC;;;AChHA,WAAA,EAAA;AAQO,IAAM,MAA0B,CAAC,EAAE,QAAQ,KAAA,EAAO,YAAA,EAAc,SAAQ,KAAM;AACnF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIL,SAAS,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA,CAAsB,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA,CAA0B,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,YAAY,CAAA;AAE/C,EAAA,MAAM,MAAA,GAAS,UAAU,MAAM,CAAA;AAC/B,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,MAAA,CAAO,MAAA;AAC3B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,QAAAA,CAAS,CAAC,SAAS,CAAA;AACvD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAiC,IAAI,CAAA;AAC7E,EAAA,MAAM,eAAA,GAAkBG,OAA+B,IAAI,CAAA;AAE3D,EAAA,MAAM,gBAAA,GAAmBE,WAAAA,CAAY,CAAC,KAAA,KAA2B;AAC/D,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,mBAAA,GAAsBA,WAAAA,CAAY,CAAC,QAAA,EAA0B,MAAA,KAAmB;AACpF,IAAA,cAAA,CAAe,YAAY,QAAQ,CAAA;AACnC,IAAA,cAAA,CAAe,UAAU,MAAM,CAAA;AAC/B,IAAA,MAAM,YAAA,GAAe,UAAU,QAAQ,CAAA;AACvC,IAAA,cAAA,CAAe,YAAA,EAAc,aAAa,OAAO,CAAA;AACjD,IAAA,cAAA,CAAe,OAAA,EAAS,aAAa,YAAY,CAAA;AACjD,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,WAAAA,CAAY,CAAC,OAAA,KAAoB;AACxD,IAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,MACvB,GAAG,IAAA;AAAA,MACH,EAAE,IAAA,EAAM,QAAA,EAAmB,SAAS,SAAA,EAAW,IAAA,CAAK,KAAI;AAAE,KAC3D,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,IAAA,KAA0B;AACzB,MAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,CAAW,GAAG,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AACrD,MAAA,MAAM,CAAC,GAAA,EAAK,GAAG,IAAI,CAAA,GAAI,KAAA,CAAM,MAAM,GAAG,CAAA;AACtC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AACzB,MAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AAEjC,MAAA,MAAM,eAAe,KAAA,EAAO,QAAA,EAAS,IAAK,uBAAA,CAAwB,MAAM,CAAA,CAAE,KAAA;AAC1E,MAAA,MAAM,eAAe,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA,EAAG,QAAQ,MAAA,CAAO,QAAA;AAChE,MAAA,MAAM,YAAY,MAAA,CAAO,MAAA,GACrB,CAAA,EAAG,MAAA,CAAO,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,MAAM,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA,GACzD,SAAA;AAEJ,MAAA,QAAQ,QAAA;AAAU,QAChB,KAAK,MAAA;AAAA,QACL,KAAK,GAAA;AAAA,QACL,KAAK,GAAA;AACH,UAAA,gBAAA,CAAiB;AAAA,YACf,yMAAA;AAAA,YACA,gBAAgB,YAAY,CAAA,CAAA;AAAA,YAC5B,gBAAgB,YAAY,CAAA,CAAA;AAAA,YAC5B,gBAAgB,SAAS,CAAA,CAAA;AAAA,YACzB,CAAA,aAAA,EAAgB,MAAA,CAAO,SAAA,GAAY,kBAAA,IAAiB,MAAA,CAAO,SAAA,GAAY,CAAA,EAAA,EAAK,MAAA,CAAO,SAAS,CAAA,CAAA,CAAA,GAAM,EAAA,CAAA,GAAM,qBAAgB,CAAA,CAAA;AAAA,YACxH,EAAA;AAAA,YACA,wNAAA;AAAA,YACA,qCAAA;AAAA,YACA,sCAAA;AAAA,YACA,4CAAA;AAAA,YACA,wCAAA;AAAA,YACA,yCAAA;AAAA,YACA,EAAA;AAAA,YACA,oHAAA;AAAA,YACA,sCAAA;AAAA,YACA,8DAAA;AAAA,YACA,mCAAA;AAAA,YACA,uBAAA;AAAA,YACA,0BAAA;AAAA,YACA,uBAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AACZ,UAAA,OAAO,IAAA;AAAA,QAET,KAAK,OAAA;AACH,UAAA,KAAA,EAAO,YAAA,EAAa;AACpB,UAAA,cAAA,CAAe,EAAE,CAAA;AACjB,UAAA,YAAA,CAAa,EAAE,CAAA;AACf,UAAA,OAAO,IAAA;AAAA,QAET,KAAK,OAAA;AACH,UAAA,IAAI,OAAO,KAAA,EAAO;AAChB,YAAA,KAAA,CAAM,SAAS,GAAG,CAAA;AAClB,YAAA,gBAAA,CAAiB,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAE,CAAA;AAAA,UAC9C,CAAA,MAAO;AACL,YAAA,gBAAA,CAAiB,4BAA4B,CAAA;AAAA,UAC/C;AACA,UAAA,OAAO,IAAA;AAAA,QAET,KAAK,QAAA,EAAU;AACb,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,gBAAA,CAAiB,mDAA8C,CAAA;AAC/D,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,gBAAA,CAAiB,CAAA,qBAAA,EAAwB,YAAY,CAAA,GAAA,CAAK,CAAA;AAC1D,UAAA,KAAA,CAAM,UAAA,EAAW,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAClC,YAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,cAAA,gBAAA,CAAiB,6CAA6C,CAAA;AAC9D,cAAA;AAAA,YACF;AACA,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAA,CAAE,EAAE,CAAA,CAAE,CAAA;AACxD,YAAA,gBAAA,CAAiB;AAAA,cACf,CAAA,aAAA,EAAM,YAAY,CAAA,SAAA,EAAY,MAAA,CAAO,MAAM,CAAA,oBAAA,CAAA;AAAA,cAC3C,GAAG,KAAA;AAAA,cACH,OAAO,MAAA,GAAS,EAAA,GAAK,aAAa,MAAA,CAAO,MAAA,GAAS,EAAE,CAAA,KAAA,CAAA,GAAU,EAAA;AAAA,cAC9D,EAAA;AAAA,cACA,cAAc,YAAY,CAAA,CAAA;AAAA,cAC1B;AAAA,aACF,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,UACd,CAAC,CAAA;AACD,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,QAEA,KAAK,QAAA;AACH,UAAA,gBAAA,CAAiB;AAAA,YACf,kOAAA;AAAA,YACA,gBAAgB,YAAY,CAAA,CAAA;AAAA,YAC5B,gBAAgB,YAAY,CAAA,CAAA;AAAA,YAC5B,gBAAgB,SAAS,CAAA,CAAA;AAAA,YACzB,CAAA,aAAA,EAAgB,MAAA,CAAO,OAAA,EAAS,CAAA,CAAA;AAAA,YAChC,CAAA,aAAA,EAAgB,MAAA,CAAO,SAAA,GAAY,kBAAA,IAAiB,MAAA,CAAO,SAAA,GAAY,CAAA,EAAA,EAAK,MAAA,CAAO,SAAS,CAAA,CAAA,CAAA,GAAM,EAAA,CAAA,GAAM,qBAAgB,CAAA;AAAA,WAC1H,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AACZ,UAAA,OAAO,IAAA;AAAA,QAET;AACE,UAAA,OAAO,KAAA;AAAA;AACX,IACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAQ,gBAAgB;AAAA,GAClD;AAEA,EAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,IACnB,OAAO,IAAA,KAAiB;AACtB,MAAA,IAAI,YAAA,EAAc;AAIlB,MAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY,KAAM,QAAA,IAAY,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY,KAAM,OAAA,EAAS;AAErF,MAAA,MAAM,SAAA,GAAY,KAAK,UAAA,CAAW,GAAG,KAAK,CAAC,MAAA,EAAQ,GAAA,EAAK,GAAA,EAAK,OAAA,EAAS,OAAA,EAAS,UAAU,QAAQ,CAAA,CAAE,SAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA;AAC5I,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,aAAA,CAAc,IAAI,CAAA;AAClB,QAAA;AAAA,MACF;AAGA,MAAA,cAAA,CAAe,KAAK,CAAA;AAEpB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,UACvB,GAAG,IAAA;AAAA,UACH,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,SAAA,EAAW,IAAA,CAAK,KAAI,EAAE;AAAA,UACrD;AAAA,YACE,IAAA,EAAM,OAAA;AAAA,YACN,OAAA,EAAS,6IAAA;AAAA,YACT,SAAA,EAAW,KAAK,GAAA;AAAI;AACtB,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,QAAQ,eAAA,CAAgB,OAAA;AAC9B,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAE1B,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,YAAA,CAAa,EAAE,CAAA;AAEf,MAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,CAAA,EAAG,IAAI;AAAA,SAAA,CAAA,GAAgB,IAAA;AACnD,MAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,QACvB,GAAG,IAAA;AAAA,QACH,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,aAAa,SAAA,EAAW,IAAA,CAAK,KAAI;AAAE,OAC7D,CAAA;AAED,MAAA,IAAI,QAAA,GAAW,EAAA;AAEf,MAAA,IAAI;AACF,QAAA,WAAA,MAAiB,KAAA,IAAS,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,QAAQ,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS,GAAI,MAAS,CAAA,EAAG;AACjH,UAAA,QAAQ,MAAM,IAAA;AAAM,YAClB,KAAK,MAAA;AACH,cAAA,QAAA,IAAY,KAAA,CAAM,OAAA;AAClB,cAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,cAAA;AAAA,YAEF,KAAK,WAAA;AACH,cAAA,YAAA,CAAa,CAAC,IAAA,KAAS;AAAA,gBACrB,GAAG,IAAA;AAAA,gBACH,EAAE,MAAM,KAAA,CAAM,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA,EAAM,QAAQ,SAAA;AAAU,eACzD,CAAA;AACD,cAAA;AAAA,YAEF,KAAK,aAAA;AACH,cAAA,YAAA;AAAA,gBAAa,CAAC,SACZ,IAAA,CAAK,GAAA;AAAA,kBAAI,CAAC,OACR,EAAA,CAAG,IAAA,KAAS,MAAM,IAAA,IAAQ,EAAA,CAAG,WAAW,SAAA,GACpC,EAAE,GAAG,EAAA,EAAI,MAAA,EAAQ,MAAM,MAAA,CAAO,OAAA,GAAU,SAAS,OAAA,EAAS,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO,GAC/E;AAAA;AACN,eACF;AACA,cAAA;AAAA,YAEF,KAAK,OAAA;AACH,cAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,gBACvB,GAAG,IAAA;AAAA,gBACH,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,MAAM,OAAA,EAAS,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI;AAAE,eAChE,CAAA;AACD,cAAA;AAAA;AACJ,QACF;AAEA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,YACvB,GAAG,IAAA;AAAA,YACH,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,UAAU,SAAA,EAAW,IAAA,CAAK,KAAI;AAAE,WAC/D,CAAA;AAAA,QACH;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AAAA,UACvB,GAAG,IAAA;AAAA,UACH;AAAA,YACE,IAAA,EAAM,OAAA;AAAA,YACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,YACxD,SAAA,EAAW,KAAK,GAAA;AAAI;AACtB,SACD,CAAA;AAAA,MACH,CAAA,SAAE;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,QAAA,YAAA,CAAa,EAAE,CAAA;AACf,QAAA,YAAA,CAAa,EAAE,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,YAAA,EAAc,aAAa;AAAA,GACrC;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBAAOT,GAAAA,CAAC,KAAA,EAAA,EAAM,UAAA,EAAY,mBAAA,EAAqB,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,uBACEF,IAAAA,CAACC,GAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,OAAM,MAAA,EAChC,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,OAAA;AAAA,UACA,KAAA,EAAO,uBAAA,CAAwB,MAAM,CAAA,CAAE,KAAA;AAAA,UACvC,UAAU,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA,EAAG,QAAQ,MAAA,CAAO,QAAA;AAAA,UACrD,IAAA,EAAM,OAAO,OAAA,EAAQ;AAAA,UACrB,SAAA;AAAA,UACA,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,GAAA,EAAK,QAAQ,GAAA;AAAI;AAAA,OACnB;AAAA,sBACAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,YAAA;AAAA,UACV,YAAA,EAAc,gBAAA;AAAA,UACd,YAAA,EAAc,KAAA;AAAA,UACd,aAAA,EAAe,CAAC,CAAC,YAAA;AAAA,UACjB,YAAA,EAAc,gBAAA;AAAA,UACd,WAAA,EACE,YACI,yDAAA,GACA;AAAA;AAAA;AAER,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,OAAO,KAAA,EAAO,QAAA,EAAS,IAAK,uBAAA,CAAwB,MAAM,CAAA,CAAE,KAAA;AAAA,MAC5D,WAAA;AAAA,MACA,eAAe,MAAA,CAAO,SAAA;AAAA,MACtB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,SAAA;AAAA,MACA,WAAW,SAAA,IAAa,MAAA;AAAA,MACxB,YAAA;AAAA,MACA,QAAA,EAAU,YAAA;AAAA,MACV,YAAA,EAAc,gBAAA;AAAA,MACd,aAAA,EAAe,CAAC,CAAC,YAAA;AAAA,MACjB,YAAA,EAAc;AAAA;AAAA,GAChB;AAEJ,CAAA;;;ACxTA,cAAA,EAAA;AACA,cAAA,EAAA;;;ACJA,WAAA,EAAA;AAgBO,IAAM,aAAN,MAAiB;AAAA,EACd,MAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EAER,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAA,MAAM,IAAI,MAAM,mEAAmE,CAAA;AAAA,IACrF;AAEA,IAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,wBAAwB,MAAM,CAAA;AACzD,IAAA,IAAA,CAAK,eAAe,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA,EAAG,QAAQ,MAAA,CAAO,QAAA;AAE/D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO;AAAA,MACvB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,SAAS,KAAA,EAAqB;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,eAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,MAAM,UAAA,GAA2D;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,EAAK;AAC3C,MAAA,MAAM,SAA8C,EAAC;AACrD,MAAA,WAAA,MAAiB,KAAK,IAAA,EAAM;AAC1B,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,CAAA,CAAE,IAAI,QAAA,EAAU,CAAA,CAAE,UAAU,CAAA;AAAA,MAChD;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAC,CAAA;AAC9C,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CACJ,QAAA,EACA,KAAA,EACqB;AACrB,IAAA,MAAM,WAAA,GAAc,KAAA,EAAO,GAAA,CAAI,YAAY,CAAA;AAE3C,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MACzD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,KAAA,EAAO,WAAA,EAAa,MAAA,GAAS,WAAA,GAAc,MAAA;AAAA,MAC3C,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAElD,IAAA,MAAM,SAAA,GAAA,CAAyB,OAAO,OAAA,CAAQ,UAAA,IAAc,EAAC,EAAG,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,MAC3E,IAAI,EAAA,CAAG,EAAA;AAAA,MACP,IAAA,EAAM,GAAG,QAAA,CAAS,IAAA;AAAA,MAClB,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,SAAS,SAAS;AAAA,KAC7C,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,OAAA,CAAQ,OAAA;AAAA,MACxB,SAAA;AAAA,MACA,YAAA,EAAc,OAAO,aAAA,IAAiB,MAAA;AAAA,MACtC,KAAA,EAAO,SAAS,KAAA,GACZ;AAAA,QACE,YAAA,EAAc,SAAS,KAAA,CAAM,aAAA;AAAA,QAC7B,gBAAA,EAAkB,SAAS,KAAA,CAAM,iBAAA;AAAA,QACjC,WAAA,EAAa,SAAS,KAAA,CAAM;AAAA,OAC9B,GACA;AAAA,KACN;AAAA,EACF;AAAA,EAEA,OAAO,UAAA,CACL,QAAA,EACA,KAAA,EAC6B;AAC7B,IAAA,MAAM,WAAA,GAAc,KAAA,EAAO,GAAA,CAAI,YAAY,CAAA;AAE3C,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MACvD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA;AAAA,MACA,KAAA,EAAO,WAAA,EAAa,MAAA,GAAS,WAAA,GAAc,MAAA;AAAA,MAC3C,WAAA,EAAa,GAAA;AAAA,MACb,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAwD;AAEpF,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA;AAChC,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,MAC/C;AAEA,MAAA,IAAI,MAAM,UAAA,EAAY;AACpB,QAAA,KAAA,MAAW,EAAA,IAAM,MAAM,UAAA,EAAY;AACjC,UAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,EAAG;AAClC,YAAA,eAAA,CAAgB,GAAA,CAAI,GAAG,KAAA,EAAO;AAAA,cAC5B,EAAA,EAAI,GAAG,EAAA,IAAM,EAAA;AAAA,cACb,IAAA,EAAM,EAAA,CAAG,QAAA,EAAU,IAAA,IAAQ,EAAA;AAAA,cAC3B,IAAA,EAAM;AAAA,aACP,CAAA;AACD,YAAA,IAAI,EAAA,CAAG,UAAU,IAAA,EAAM;AACrB,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,iBAAA;AAAA,gBACN,QAAA,EAAU,EAAE,EAAA,EAAI,EAAA,CAAG,IAAI,IAAA,EAAM,EAAA,CAAG,SAAS,IAAA;AAAK,eAChD;AAAA,YACF;AAAA,UACF;AAEA,UAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA;AAC3C,UAAA,IAAI,EAAA,CAAG,EAAA,EAAI,MAAA,CAAO,EAAA,GAAK,EAAA,CAAG,EAAA;AAC1B,UAAA,IAAI,GAAG,QAAA,EAAU,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,GAAG,QAAA,CAAS,IAAA;AACjD,UAAA,IAAI,EAAA,CAAG,UAAU,SAAA,EAAW;AAC1B,YAAA,MAAA,CAAO,IAAA,IAAQ,GAAG,QAAA,CAAS,SAAA;AAC3B,YAAA,MAAM;AAAA,cACJ,IAAA,EAAM,iBAAA;AAAA,cACN,OAAA,EAAS,GAAG,QAAA,CAAS,SAAA;AAAA,cACrB,UAAU,EAAE,EAAA,EAAI,OAAO,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA;AAAK,aAC/C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,kBAAkB,YAAA,EAAc;AACpD,QAAA,KAAA,MAAW,GAAG,MAAM,CAAA,IAAK,eAAA,EAAiB;AACxC,UAAA,IAAI,OAAgC,EAAC;AACrC,UAAA,IAAI;AACF,YAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAAA,UAC/B,CAAA,CAAA,MAAQ;AAAA,UAER;AACA,UAAA,MAAM;AAAA,YACJ,IAAA,EAAM,eAAA;AAAA,YACN,QAAA,EAAU,EAAE,EAAA,EAAI,MAAA,CAAO,IAAI,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,SAAA,EAAW,IAAA;AAAK,WAChE;AAAA,QACF;AACA,QAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,EACvB;AACF,CAAA;AAEA,SAAS,aAAaJ,MAAAA,EAAuC;AAC3D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAMA,MAAAA,CAAK,IAAA;AAAA,MACX,aAAaA,MAAAA,CAAK,WAAA;AAAA,MAClB,YAAYA,MAAAA,CAAK;AAAA;AACnB,GACF;AACF;;;ACrLA,oBAAA,EAAA;AAEO,SAAS,kBAAkB,IAAA,EAQvB;AACT,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA;AAAA,WAAA,EACA,KAAK,QAAQ,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,+CAAA,CA+BsB,CAAA;AAG9C,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA,mBAAA,EACM,IAAA,CAAK,SAAA,GAAY,CAAA,EAAA,EAAK,IAAA,CAAK,SAAS,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,IAAA,CAAK,OAAA,GAAU,CAAA,WAAA,EAAc,IAAA,CAAK,OAAO,MAAM,EAAE;AAAA,+BAAA,CACrF,CAAA;AAAA,EAC9B,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA,6DAAA,CAG+C,CAAA;AAAA,EAC5D;AAGA,EAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,IAAA,KAAA,CAAM,KAAK,sBAAsB,CAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,CAAY,GAAA;AAAA,MAC7B,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,SAAS,CAAA,CAAA,EAAI,EAAE,OAAA,GAAU,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,KAAK,EAAE,CAAA;AAAA,KACzE;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,EAAA,EAAI;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AACxC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,KAAA,CAAM,MAAA,GAAS,EAAE,CAAA,aAAA,CAAe,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAQ;AACtB,IAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,IAAA,KAAA,MAAW,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG;AAC1C,MAAA,KAAA,CAAM,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAAA,IACnD;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAC3B,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI;AAChC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACxB;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAC/B,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM;AAClC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACxB;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACrC,MAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa;AACzC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACxB;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,MAAM,OAAA,EAAS;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA;AAAA,EAAyB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC1D;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK;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;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;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;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,EA+IX,eAAe,CAAA,CAAE,CAAA;AAEjB,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AC5PA,UAAA,EAAA;AACA,WAAA,EAAA;;;ACOO,IAAM,cAAA,GAA8B;AAAA;AAAA,EAEzC,EAAE,EAAA,EAAI,eAAA,EAAiB,IAAA,EAAM,eAAA,EAAiB,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA,EAC7G,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA,EACjG,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA,EAC/F,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,eAAe,GAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA;AAAA,EAGjG,EAAE,EAAA,EAAI,iBAAA,EAAmB,IAAA,EAAM,iBAAA,EAAmB,eAAe,GAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,WAAA,EAAY;AAAA,EACpH,EAAE,EAAA,EAAI,mBAAA,EAAqB,IAAA,EAAM,mBAAA,EAAqB,eAAe,GAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,WAAA,EAAY;AAAA;AAAA,EAGxH,EAAE,EAAA,EAAI,gBAAA,EAAkB,IAAA,EAAM,gBAAA,EAAkB,eAAe,OAAA,EAAS,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA,EAChH,EAAE,EAAA,EAAI,kBAAA,EAAoB,IAAA,EAAM,kBAAA,EAAoB,eAAe,OAAA,EAAS,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,QAAA,EAAS;AAAA;AAAA,EAGpH,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM;AAAA,EAChG,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,eAAe,MAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM;AAAA;AAAA,EAG5F,EAAE,EAAA,EAAI,2BAAA,EAA6B,IAAA,EAAM,iBAAA,EAAmB,eAAe,GAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EAC/H,EAAE,EAAA,EAAI,6BAAA,EAA+B,IAAA,EAAM,mBAAA,EAAqB,eAAe,GAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EACnI,EAAE,EAAA,EAAI,sBAAA,EAAwB,IAAA,EAAM,eAAA,EAAiB,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EACxH,EAAE,EAAA,EAAI,gBAAA,EAAkB,IAAA,EAAM,SAAA,EAAW,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EAC5G,EAAE,EAAA,EAAI,uBAAA,EAAyB,IAAA,EAAM,gBAAA,EAAkB,eAAe,OAAA,EAAS,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EAC3H,EAAE,EAAA,EAAI,eAAA,EAAiB,IAAA,EAAM,UAAA,EAAY,eAAe,KAAA,EAAQ,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA,EAAa;AAAA,EAC5G,EAAE,EAAA,EAAI,wBAAA,EAA0B,IAAA,EAAM,eAAA,EAAiB,eAAe,GAAA,EAAS,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,YAAA;AAChH,CAAA;AAEO,SAAS,aAAa,OAAA,EAAwC;AACnE,EAAA,OAAO,eAAe,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACpD;AAMO,SAAS,iBAAiB,OAAA,EAAyB;AACxD,EAAA,OAAO,YAAA,CAAa,OAAO,CAAA,EAAG,aAAA,IAAiB,KAAA;AACjD;;;ADzCA,IAAM,eAAA,GAAkB,CAAA;AAOjB,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,eAAe,CAAA;AAChD;AAEO,SAAS,aAAa,IAAA,EAMN;AACrB,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,MAAA,CAAO,KAAK,CAAA;AAGnD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,IAAI,CAAA;AACpD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,IAAI,CAAA;AACpD,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,IAAI,CAAA;AAI1D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,iBAAA,EAAkB;AAC/C,EAAA,MAAM,QAAQ,WAAA,CAAY,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,aAAa,EAAE,CAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA;AACjD,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,IAAA,CAAK,SAAA,EAAW,CAAC,CAAA;AAEvD,EAAA,IAAI,eAAe,iBAAA,CAAkB;AAAA,IACnC,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,WAAA,EAAY;AAAA,IACnC,WAAW,QAAA,EAAU,SAAA;AAAA,IACrB,SAAS,QAAA,EAAU,OAAA;AAAA,IACnB,WAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,cAAA,CAAe,YAAY,CAAA,GAAI,YAAA,EAAc;AAC/C,IAAA,YAAA,GAAe,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,YAAA,GAAe,eAAe,CAAA;AAAA,EACrE;AAGA,EAAA,MAAM,QAAA,GAAgD;AAAA,IACpD,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,YAAA;AAAa,GAC1C;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,MAAM,WAAA,GAAc,UACjB,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,OAAO,CAAA,CACpB,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,IAAK,YAAA,EAAc;AAC/C,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS,CAAA;AAAA,EAAgC,WAAW,CAAA;AAAA,OACrD,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,MAAM,kBAAuD,EAAC;AAG9D,EAAA,MAAM,UAAA,GAAgD;AAAA,IACpD,IAAA,EAAM,MAAA;AAAA,IACN,SAAS,IAAA,CAAK;AAAA,GAChB;AAGA,EAAA,KAAA,IAAS,IAAI,IAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,mBAAA,CAAoB,CAAC,CAAA;AACtC,IAAA,MAAM,OAAA,GACJ,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC5E,IAAA,MAAM,MAAA,GAAS,eAAe,OAAO,CAAA;AAErC,IAAA,IAAI,aAAA,GAAgB,SAAS,kBAAA,EAAoB;AACjD,IAAA,aAAA,IAAiB,MAAA;AACjB,IAAA,eAAA,CAAgB,QAAQ,GAAG,CAAA;AAAA,EAC7B;AAEA,EAAA,QAAA,CAAS,IAAA,CAAK,GAAG,eAAA,EAAiB,UAAU,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAc,cAAA;AAAA,IAClB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAO,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,CAAA,CAAE,OAAA,GAAU,EAAG,CAAA,CAAE,KAAK,EAAE;AAAA,GAC/E;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,aAAA,EAAe,WAAA,EAAY;AAChD;;;AEpGA,WAAA,EAAA;AACA,WAAA,EAAA;AACA,UAAA,EAAA;AAMO,IAAM,YAAN,MAAgB;AAAA,EACb,EAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,sBAA2D,EAAC;AAAA,EAC5D,SAAA,GAAY,SAAA;AAAA,EACZ,SAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EAER,WAAA,CAAY,QAAsB,KAAA,EAAqB;AACrD,IAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,IAAA,IAAA,CAAK,EAAA,GAAK,IAAI,UAAA,CAAW,MAAM,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,YAAYc,MAAAA,EAAO;AACxB,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,iBAAA;AAC5B,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,gBAAA;AAAA,EAC3B;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,SAAS,KAAA,EAAqB;AAC5B,IAAA,IAAA,CAAK,EAAA,CAAG,SAAS,KAAK,CAAA;AAAA,EACxB;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,GAAG,QAAA,EAAS;AAAA,EAC1B;AAAA,EAEA,MAAM,UAAA,GAA2D;AAC/D,IAAA,OAAO,IAAA,CAAK,GAAG,UAAA,EAAW;AAAA,EAC5B;AAAA,EAEA,aAAa,SAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,OAAO,GAAA,CACL,WAAA,EACA,eAAA,EAC4B;AAC5B,IAAA,YAAA,CAAa;AAAA,MACX,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,WAAA,IAAe,eAAA,GAAkB,mBAAA,GAAsB,EAAA,CAAA;AAAA,MAChE,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAED,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,YAAA,CAAa;AAAA,MAChC,WAAA;AAAA,MACA,qBAAqB,IAAA,CAAK,mBAAA;AAAA,MAC1B,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AAGD,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAC5C,MAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAQ;AACtC,QAAC,QAAgB,OAAA,GAAU;AAAA,UACzB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAO,QAAQ,OAAA,KAAY,QAAA,GAAW,OAAA,CAAQ,OAAA,GAAU,WAAA,EAAY;AAAA,UAC1F;AAAA,YACE,IAAA,EAAM,WAAA;AAAA,YACN,SAAA,EAAW;AAAA,cACT,KAAK,CAAA,KAAA,EAAQ,eAAA,CAAgB,QAAQ,CAAA,QAAA,EAAW,gBAAgB,MAAM,CAAA,CAAA;AAAA,cACtE,MAAA,EAAQ;AAAA;AACV;AACF,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,iBAAA,EAAkB;AACvC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AACnC,IAAA,IAAI,eAAA,GAAkB,CAAC,GAAG,QAAQ,CAAA;AAClC,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,OAAO,SAAA,GAAY,KAAK,aAAA,EAAe;AACrC,MAAA,SAAA,EAAA;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AAG7D,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,OAAA,EAAQ;AAEhD,UAAA,YAAA,CAAa;AAAA,YACX,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,IAAA,EAAM,WAAA;AAAA,YACN,SAAS,QAAA,CAAS,OAAA;AAAA,YAClB,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAED,UAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,QAAA,CAAS,SAAS,CAAA;AAAA,QAChF;AAGA,QAAA,IAAI,QAAA,CAAS,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACnC,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,cAAwD,EAAC;AAE/D,QAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,SAAA,EAAW;AACrC,UAAA,MAAM,EAAE,MAAM,WAAA,EAAa,IAAA,EAAM,KAAK,IAAA,EAAM,IAAA,EAAM,KAAK,SAAA,EAAU;AAEjE,UAAA,MAAM,SAAS,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,OAAO,CAAA;AACrD,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AAEjC,UAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,IAAA,CAAK,MAAM,MAAA,EAAO;AAErD,UAAA,YAAA,CAAa;AAAA,YACX,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,IAAA,EAAM,WAAA;AAAA,YACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,SAAA,EAAW,CAAA;AAAA,YACjE,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAED,UAAA,YAAA,CAAa;AAAA,YACX,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,IAAA,EAAM,aAAA;AAAA,YACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,YAC9B,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,SAAA,EAAW,KAAK,GAAA;AAAI,WACrB,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,YAAA,GAA2D;AAAA,UAC/D,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,UAC7B,UAAA,EAAY,QAAA,CAAS,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,YAC1C,IAAI,EAAA,CAAG,EAAA;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,QAAA,EAAU,EAAE,IAAA,EAAM,EAAA,CAAG,IAAA,EAAM,WAAW,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,SAAS,CAAA;AAAE,WACrE,CAAE;AAAA,SACJ;AACA,QAAA,eAAA,CAAgB,KAAK,YAAY,CAAA;AAGjC,QAAA,KAAA,MAAW,EAAE,IAAA,EAAM,MAAA,EAAO,IAAK,WAAA,EAAa;AAC1C,UAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,YACnB,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,YAC9B,cAAc,IAAA,CAAK;AAAA,WACpB,CAAA;AAAA,QACH;AAEA,QAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,YAAY,CAAA;AAC1C,QAAA,KAAA,MAAW,EAAE,IAAA,EAAM,MAAA,EAAO,IAAK,WAAA,EAAa;AAC1C,UAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK;AAAA,YAC5B,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,YAC9B,cAAc,IAAA,CAAK;AAAA,WACpB,CAAA;AAAA,QACH;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAQ;AAC/B,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,EACvB;AAAA,EAEA,OAAO,SAAA,CACL,WAAA,EACA,eAAA,EAC4B;AAC5B,IAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,eAAe,CAAA,EAAG;AAChE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,iBAAA,GAAiC;AACvC,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,CAAc,IAAA,EAAc,OAAA,EAAkB,SAAA,KAA8C;AACxG,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,CAAe,IAAA,EAAM,SAAS,SAAS,CAAA;AAAA,MAC5D,CAAA;AAAA,MACA,iBAAA,EAAmB,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,EAAY;AAAA,MACjD,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,CAAC,KAAA,EAAe,SAAA,EAAmB,KAAA,KAAmB;AAC5D,UAAA,MAAM,EAAE,WAAA,EAAAC,YAAAA,EAAY,IAAI,UAAA,EAAA,EAAA,YAAA,CAAA,aAAA,CAAA,CAAA;AACxB,UAAA,MAAM,QAAQA,YAAAA,CAAY,SAAA,IAAa,IAAA,CAAK,SAAA,EAAW,OAAO,KAAK,CAAA;AACnE,UAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAA2B,EAAE,OAAO,CAAA;AAAA,QACxD,CAAA;AAAA,QACA,KAAA,EAAO,CAAC,SAAA,EAAmB,KAAA,KAAmD;AAC5E,UAAA,MAAM,EAAE,SAAA,EAAAC,UAAAA,EAAU,IAAI,UAAA,EAAA,EAAA,YAAA,CAAA,aAAA,CAAA,CAAA;AACtB,UAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,UAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,YAAAA,UAAAA,CAAU;AAAA,cACR,SAAA,EAAW,aAAa,IAAA,CAAK,SAAA;AAAA,cAC7B,SAAS,CAAA,CAAE,OAAA;AAAA,cACX,UAAU,CAAA,CAAE,QAAA;AAAA,cACZ,MAAA,EAAQ,OAAA;AAAA,cACR,SAAA,EAAW,CAAA;AAAA,cACX,SAAA,EAAW,GAAA;AAAA,cACX,UAAA,EAAY;AAAA,aACb,CAAA;AAAA,UACH;AAAA,QACF,CAAA;AAAA,QACA,cAAA,EAAgB,CAAC,SAAA,KAAsB;AACrC,UAAA,MAAM,EAAE,cAAA,EAAAC,eAAAA,EAAe,IAAI,UAAA,EAAA,EAAA,YAAA,CAAA,aAAA,CAAA,CAAA;AAC3B,UAAA,OAAOA,eAAAA,CAAe,SAAA,IAAa,IAAA,CAAK,SAAS,CAAA;AAAA,QACnD;AAAA,OACF;AAAA,MACA,QAAQ,kBAAA;AAAmB,KAC7B;AAAA,EACF;AAAA,EAEA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,sBAAsB,EAAC;AAC5B,IAAA,IAAA,CAAK,YAAYH,MAAAA,EAAO;AAAA,EAC1B;AACF,CAAA;;;ACxOO,IAAM,eAAN,MAAmB;AAAA,EAChB,KAAA,uBAAY,GAAA,EAAkB;AAAA,EAEtC,SAASd,MAAAA,EAAkB;AACzB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIA,MAAAA,CAAK,IAAI,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4BA,MAAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IACzD;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIA,MAAAA,CAAK,IAAA,EAAMA,MAAI,CAAA;AAAA,EAChC;AAAA,EAEA,IAAI,IAAA,EAAgC;AAClC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAA,GAAiB;AACf,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EACvC;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAgB,GAAA,EAAuC;AACnE,IAAA,MAAMA,MAAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AACrC,IAAA,IAAI,CAACA,MAAAA,EAAM;AACT,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,CAAA,EAAG;AAAA,IAC/D;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAMA,MAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,WAAW,GAAG,CAAA;AAAA,IAC/C,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,EAAQ;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,SAAA,GAAsB;AACpB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,EACrC;AACF,CAAA;AAEO,SAAS,qBAAA,GAAsC;AACpD,EAAA,MAAM,QAAA,GAAW,IAAI,YAAA,EAAa;AAGlC,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,gBAAA,EAAA,EAAA,mBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,gBAAA,EAAA,EAAA,mBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,+BAAA,EAAA,EAAA,kCAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,oBAAA,EAAA,EAAA,uBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,oBAAA,EAAA,EAAA,uBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,kBAAA,EAAA,EAAA,qBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,qBAAA,EAAA,EAAA,wBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,sBAAA,EAAA,EAAA,yBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,gBAAA,EAAA,EAAA,mBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,oBAAA,EAAA,EAAA,uBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,mBAAA,EAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,kBAAA,EAAA,EAAA,qBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,wBAAA,EAAA,EAAA,2BAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,yBAAA,EAAA,EAAA,4BAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAAA,IACA,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA;AAAA,GACF;AAIA,EAAA,KAAK,OAAA,CAAQ,GAAA;AAAA,IACX,WAAA,CAAY,GAAA,CAAI,OAAO,GAAA,KAAQ;AAC7B,MAAA,MAAM,IAAI,MAAM,GAAA;AAChB,MAAA,IAAI,CAAA,CAAE,IAAA,EAAM,QAAA,CAAS,QAAA,CAAS,EAAE,IAAI,CAAA;AAAA,IACtC,CAAC;AAAA,GACH;AAGA,EAAA,KAAK,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA,CAAgC,IAAA,CAAK,CAAC,CAAA,KAAM;AAC/C,IAAA,QAAA,CAAS,QAAA,CAAS,EAAE,QAAQ,CAAA;AAC5B,IAAA,QAAA,CAAS,QAAA,CAAS,EAAE,QAAQ,CAAA;AAAA,EAC9B,CAAC,CAAA;AAED,EAAA,OAAO,QAAA;AACT;;;ANtFA,UAAA,EAAA;AACA,WAAA,EAAA;AOHA,IAAM,YAAYL,KAAAA,CAAK,IAAA,CAAKC,GAAAA,CAAG,OAAA,IAAW,UAAU,CAAA;AACpD,IAAM,UAAA,GAAaD,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,mBAAmB,CAAA;AAC3D,IAAM,iBAAA,GAAoB,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,GAAA;AACxC,IAAM,WAAA,GAAc,aAAA;AAOpB,SAAS,SAAA,GAAyB;AAChC,EAAA,IAAI;AACF,IAAA,IAAID,GAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7B,MAAA,OAAO,KAAK,KAAA,CAAMA,GAAAA,CAAG,YAAA,CAAa,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,IACxD;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAC;AACT,EAAA,OAAO,EAAE,SAAA,EAAW,CAAA,EAAG,aAAA,EAAe,IAAA,EAAK;AAC7C;AAEA,SAAS,WAAW,KAAA,EAA0B;AAC5C,EAAA,IAAI;AACF,IAAA,IAAI,CAACA,GAAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAGA,GAAAA,CAAG,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1E,IAAAA,IAAG,aAAA,CAAc,UAAA,EAAY,KAAK,SAAA,CAAU,KAAK,GAAG,OAAO,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AAAA,EAAC;AACX;AAEA,SAAS,kBAAA,GAA6C;AACpD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,MAAM,KAAA,CAAM,GAAA;AAAA,MAChB,8BAA8B,WAAW,CAAA,OAAA,CAAA;AAAA,MACzC,EAAE,OAAA,EAAS,EAAE,QAAQ,kBAAA,EAAmB,EAAG,SAAS,GAAA,EAAK;AAAA,MACzD,CAAC,GAAA,KAAQ;AACP,QAAA,IAAI,GAAA,CAAI,eAAe,GAAA,EAAK;AAAE,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAG,UAAA,GAAA,CAAI,MAAA,EAAO;AAAG,UAAA;AAAA,QAAQ;AACnE,QAAA,IAAI,IAAA,GAAO,EAAA;AACX,QAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAO,QAAQ,CAAE,CAAA;AACjC,QAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,UAAA,IAAI;AAAE,YAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,WAAW,IAAI,CAAA;AAAA,UAAG,CAAA,CAAA,MAC3C;AAAE,YAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,UAAG;AAAA,QACzB,CAAC,CAAA;AAAA,MACH;AAAA,KACF;AACA,IAAA,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAC,CAAA;AACnC,IAAA,GAAA,CAAI,EAAA,CAAG,WAAW,MAAM;AAAE,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAG,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IAAG,CAAC,CAAA;AAAA,EAC3D,CAAC,CAAA;AACH;AAEA,SAAS,eAAA,CAAgB,SAAiB,MAAA,EAAwB;AAChE,EAAA,MAAM,IAAI,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACvC,EAAA,MAAM,IAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,KAAM,EAAE,CAAC,CAAA,IAAK,IAAI,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,KAAM,EAAE,CAAC,CAAA,IAAK,IAAI,OAAO,EAAA;AAAA,EACxC;AACA,EAAA,OAAO,CAAA;AACT;AAYA,eAAsB,eAAe,cAAA,EAAoD;AACvF,EAAA,IAAI;AACF,IAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,GAAA,GAAM,KAAA,CAAM,SAAA,GAAY,iBAAA,IAAqB,MAAM,aAAA,EAAe;AACpE,MAAA,IAAI,eAAA,CAAgB,cAAA,EAAgB,KAAA,CAAM,aAAa,IAAI,CAAA,EAAG;AAC5D,QAAA,OAAO,EAAE,eAAA,EAAiB,IAAA,EAAM,cAAA,EAAgB,aAAA,EAAe,MAAM,aAAA,EAAc;AAAA,MACrF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,EAAmB;AACxC,IAAA,UAAA,CAAW,EAAE,SAAA,EAAW,GAAA,EAAK,aAAA,EAAe,QAAQ,CAAA;AAEpD,IAAA,IAAI,MAAA,IAAU,eAAA,CAAgB,cAAA,EAAgB,MAAM,IAAI,CAAA,EAAG;AACzD,MAAA,OAAO,EAAE,eAAA,EAAiB,IAAA,EAAM,cAAA,EAAgB,eAAe,MAAA,EAAO;AAAA,IACxE;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAAC;AACT,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,oBAAoB,IAAA,EAA0B;AAC5D,EAAA,MAAM,QAAQ,CAAA,kBAAA,EAAqB,IAAA,CAAK,cAAc,CAAA,QAAA,EAAM,KAAK,aAAa,CAAA,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAQ,iBAAiB,WAAW,CAAA,CAAA;AAC1C,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,MAAA,EAAQ,KAAA,CAAM,MAAM,CAAA,GAAI,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAc,CAAA,UAAA,EAAQ,CAAC,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,CAAA,CAAE,MAAA,GAAS,CAAC,CAAC,CAAA,QAAA,CAAA;AACvE,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,CAAA,QAAA,EAAM,QAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,MAAA,CAAA;AAAA,IACvB,IAAI,KAAK,CAAA;AAAA,IACT,IAAI,KAAK,CAAA;AAAA,IACT,CAAA,QAAA,EAAM,QAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,MAAA,CAAA;AAAA,IACvB;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACb;AAMA,eAAsB,WAAW,cAAA,EAAiG;AAChI,EAAA,MAAM,IAAA,GAAO,MAAM,cAAA,CAAe,cAAc,CAAA;AAChD,EAAA,IAAI,CAAC,MAAM,eAAA,EAAiB;AAC1B,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,cAAA,EAAgB,IAAI,cAAA,EAAe;AAAA,EACnE;AAGA,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,0BAAA,EAA4B,KAAK,gCAAA,EAAiC;AAAA,IACzF,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA2B,KAAK,mCAAA,EAAoC;AAAA,IAC1F,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,wCAAA,EAA0C,KAAK,oCAAA;AAAqC,GAC7G;AAEA,EAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMwB,QAAAA,CAAS,GAAA,CAAI,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAO,CAAA,CAAE,QAAA,EAAS;AAC5E,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,aAAa,CAAA,EAAG;AAC/B,QAAA,UAAA,GAAa,GAAA,CAAI,GAAA;AACjB,QAAA;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAGA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMA,QAAAA,CAAS,0BAAA,EAA4B,EAAE,KAAA,EAAO,QAAQ,OAAA,EAAS,GAAA,EAAO,CAAA,CAAE,QAAA,EAAS;AAC7F,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,EAAG;AAEzB,QAAA,MAAM,OAAA,GAAUvB,KAAAA,CAAK,OAAA,CAAQwB,WAAA,EAAW,IAAI,CAAA;AAC5C,QAAA,IAAIzB,IAAG,UAAA,CAAWC,KAAAA,CAAK,KAAK,OAAA,EAAS,MAAM,CAAC,CAAA,EAAG;AAC7C,UAAA,IAAI;AACF,YAAAuB,QAAAA,CAAS,YAAY,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAO,CAAA;AACpE,YAAAA,QAAAA,CAAS,gBAAgB,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAO,CAAA;AACxE,YAAAA,QAAAA,CAAS,cAAc,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAO,CAAA;AACtE,YAAAA,QAAAA,CAAS,qBAAqB,EAAE,GAAA,EAAK,SAAS,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAO,CAAA;AAC7E,YAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAM,cAAA,EAAgB,EAAA,EAAI,KAAK,aAAA,EAAc;AAAA,UACvE,SAAS,GAAA,EAAK;AACZ,YAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,EAAA,EAAI,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,CAAA,yBAAA,EAA4B,GAAG,CAAA,CAAA,EAAG;AAAA,UAClH;AAAA,QACF;AACA,QAAA,OAAO,EAAE,SAAS,KAAA,EAAO,IAAA,EAAM,gBAAgB,EAAA,EAAI,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,yEAAA,EAAqE;AAAA,MACrJ;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,UAAA,GAAa,kBAAkB,WAAW,CAAA,OAAA,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI;AACF,IAAAA,SAAS,UAAA,EAAY,EAAE,OAAO,MAAA,EAAQ,OAAA,EAAS,MAAQ,CAAA;AAEvD,IAAA,UAAA,CAAW,EAAE,SAAA,EAAW,CAAA,EAAG,aAAA,EAAe,MAAM,CAAA;AAChD,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAM,cAAA,EAAgB,EAAA,EAAI,KAAK,aAAA,EAAc;AAAA,EACvE,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,cAAA,EAAgB,EAAA,EAAI,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,CAAA,uBAAA,EAA0B,GAAG,CAAA,CAAA,EAAG;AAAA,EAChH;AACF;AAGA,IAAMC,WAAA,GAAYxB,KAAAA,CAAK,OAAA,CAAQ,IAAI,GAAA,CAAI,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAe,IAAI,CAAC,CAAA;APpJ7F,IAAMwB,aAAYxB,KAAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC7D,IAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAMD,GAAAA,CAAG,YAAA,CAAaC,KAAAA,CAAK,IAAA,CAAKwB,UAAAA,EAAW,IAAA,EAAM,cAAc,CAAA,EAAG,OAAO,CAAC,CAAA,CAAE,OAAA;AAEjG,IAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAE5B,OAAA,CACG,KAAK,SAAS,CAAA,CACd,YAAY,2DAA2D,CAAA,CACvE,QAAQ,OAAO,CAAA;AAGlB,OAAA,CACG,QAAQ,OAAA,EAAS,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA,CACpC,WAAA,CAAY,8BAA8B,CAAA,CAC1C,OAAO,mBAAA,EAAqB,uBAAA,EAAyB,OAAO,CAAA,CAC5D,MAAA,CAAO,OAAO,IAAA,KAAS;AACtB,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,IAAI,KAAK,MAAA,CAAO,IAAA;AAG3C,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,IAAA,MAAM,WAAW,qBAAA,EAAsB;AACvC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,cAAA,CAAe,UAAA,EAAY,SAAS,QAAQ,CAAA;AAC5C,MAAA,cAAA,CAAe,QAAA,EAAU,SAAS,MAAM,CAAA;AAAA,IAC1C;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,aAAa,WAAA,EAAa;AACnC,IAAA,MAAM,UAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,IAAQ,OAAA,CAAQ,IAAI,QAAA,IAAY,WAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACtC,IAAA,IAAI,SAAA,IAAa,cAAc,WAAA,EAAa;AAC1C,MAAA,cAAA,CAAe,YAAY,SAAS,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,cAAA,CAAe,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AACrC,IAAA,IAAI,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,EAC1D,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AAEjB,EAAA,MAAM,UAAU,IAAI,CAAA;AACtB,CAAC,CAAA;AAGH,IAAM,YAAY,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,CAAE,YAAY,8BAA8B,CAAA;AAEtF,SAAA,CACG,OAAA,CAAQ,mBAAmB,CAAA,CAC3B,WAAA,CAAY,oBAAoB,CAAA,CAChC,MAAA,CAAO,CAAC,GAAA,EAAa,KAAA,KAAkB;AACtC,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,EAAQ,mBAAA,EAAqB,oBAAoB,aAAa,CAAA;AACnF,EAAA,MAAM,WAAA,GAAc,CAAC,WAAA,EAAa,WAAW,CAAA;AAC7C,EAAA,MAAM,iBAAiB,CAAC,QAAA,EAAU,aAAa,QAAA,EAAU,KAAA,EAAO,cAAc,QAAQ,CAAA;AAEtF,EAAA,IAAI,MAAA,GAAkB,KAAA;AACtB,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7B,IAAA,MAAA,GAAS,SAAS,KAAK,CAAA;AAAA,EACzB,CAAA,MAAA,IAAW,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG;AACpC,IAAA,MAAA,GAAS,KAAA,KAAU,MAAA;AAAA,EACrB,CAAA,MAAA,IAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,IAAI,CAAC,cAAA,CAAe,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAAyB,KAAK,CAAA,CAAE,CAAA;AAC5C,MAAA,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAsB,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,UAAU,KAAuB,CAAA;AACtD,IAAA,cAAA,CAAe,YAAA,EAAc,aAAa,OAAO,CAAA;AACjD,IAAA,cAAA,CAAe,OAAA,EAAS,aAAa,YAAY,CAAA;AAAA,EACnD;AAEA,EAAA,cAAA,CAAe,KAA4B,MAA4C,CAAA;AACvF,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAW,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AACvC,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,CAAA,GAAI,UAAU,KAAuB,CAAA;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAiB,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACxC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAAsB,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA;AAAA,EACpD;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAuB,aAAA,EAAe,CAAA,YAAA,CAAc,CAAA;AAClE,CAAC,CAAA;AAEH,SAAA,CACG,OAAA,CAAQ,WAAW,CAAA,CACnB,WAAA,CAAY,oBAAoB,CAAA,CAChC,MAAA,CAAO,CAAC,GAAA,KAAgB;AACvB,EAAA,MAAM,KAAA,GAAQ,eAAe,GAA0B,CAAA;AACvD,EAAA,IAAI,GAAA,CAAI,aAAY,CAAE,QAAA,CAAS,KAAK,CAAA,IAAK,OAAO,UAAU,QAAA,EAAU;AAClE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,GAAG,CAAA,GAAA,EAAM,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACpE,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,GAAG,CAAA,GAAA,EAAM,KAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EACnD;AACF,CAAC,CAAA;AAEH,SAAA,CACG,QAAQ,MAAM,CAAA,CACd,YAAY,wBAAwB,CAAA,CACpC,OAAO,MAAM;AACZ,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AACtC,EAAA,OAAA,CAAQ,IAAI,kIAAyB,CAAA;AACrC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,MAAM,OAAA,GACJ,GAAA,CAAI,WAAA,EAAY,CAAE,QAAA,CAAS,KAAK,CAAA,IAAK,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,EAAA,GAC7E,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,EAAM,KAAA,CAAM,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA,GACzC,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,EACpC;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,aAAA,EAAe,CAAA,YAAA,CAAc,CAAA;AAC3D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB,CAAC,CAAA;AAGH,IAAM,WAAW,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,CAAE,YAAY,+BAAgC,CAAA;AAEtF,QAAA,CACG,OAAA,CAAQ,eAAe,CAAA,CACvB,WAAA,CAAY,yCAAyC,CAAA,CACrD,MAAA,CAAO,CAAC,IAAA,KAAiB;AACxB,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,KAAA,CAAM,EAAA,CAAG,KAAK,IAAI,CAAA;AAClB,EAAA,SAAA,CAAU,KAAK,CAAA;AACf,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAAsB,IAAI,CAAA,CAAE,CAAA;AAC1C,CAAC,CAAA;AAEH,QAAA,CACG,OAAA,CAAQ,iBAAiB,CAAA,CACzB,WAAA,CAAY,6CAA6C,CAAA,CACzD,MAAA,CAAO,CAAC,IAAA,KAAiB;AACxB,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACpB,EAAA,SAAA,CAAU,KAAK,CAAA;AACf,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAAyB,IAAI,CAAA,CAAE,CAAA;AAC7C,CAAC,CAAA;AAEH,QAAA,CACG,QAAQ,MAAM,CAAA,CACd,YAAY,gBAAgB,CAAA,CAC5B,OAAO,MAAM;AACZ,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,GAAG,MAAA,EAAQ;AACnB,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE,CAAC,CAAA;AAAA,EAC9D;AACA,EAAA,IAAI,KAAA,CAAM,KAAK,MAAA,EAAQ;AACrB,IAAA,OAAA,CAAQ,IAAI,UAAU,CAAA;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAQ;AAC5B,IAAA,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAC5B,IAAA,KAAA,CAAM,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,CAAC,EAAE,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,EAAA,CAAG,MAAA,IAAU,CAAC,KAAA,CAAM,IAAA,CAAK,MAAA,IAAU,CAAC,KAAA,CAAM,WAAA,CAAY,MAAA,EAAQ;AACvE,IAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AACxC,IAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,IAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AAAA,EACzE;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB,CAAC,CAAA;AAGH,OAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,2CAA2C,CAAA,CACvD,OAAO,YAAY;AAClB,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAE,CAAA;AAC3C,EAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAEvC,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAO,CAAA;AACvC,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,EAAA,IAAM,OAAO,OAAA,EAAS;AAC/C,IAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAC9C,IAAA;AAAA,EACF;AACA,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAA,CAAQ,IAAI,CAAA,kBAAA,EAAgB,MAAA,CAAO,IAAI,CAAA,QAAA,EAAM,MAAA,CAAO,EAAE,CAAA,CAAE,CAAA;AACxD,IAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AAAA,EACzD,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAAsB,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EACpD;AACF,CAAC,CAAA;AAEH,OAAA,CACG,QAAQ,gBAAgB,CAAA,CACxB,YAAY,uDAAuD,CAAA,CACnE,OAAO,YAAY;AAClB,EAAA,MAAM,EAAE,QAAA,EAAAD,SAAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AAEtD,EAAA,MAAM,cAAcvB,KAAAA,CAAK,OAAA,CAAQ,MAAA,CAAA,IAAA,CAAY,OAAA,IAAWwB,YAAW,IAAI,CAAA;AACvE,EAAA,MAAM,SAAA,GAAYxB,KAAAA,CAAK,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgBA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,sBAAsB,CAAA;AACjE,EAAA,MAAM,gBAAgBA,KAAAA,CAAK,IAAA;AAAA,IACzBC,IAAG,OAAA,EAAQ;AAAA,IACX,SAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,QAAA,GAAWD,KAAAA,CAAK,IAAA,CAAK,aAAA,EAAe,cAAc,CAAA;AAExD,EAAA,IAAI,CAACD,GAAAA,CAAG,UAAA,CAAW,aAAa,CAAA,EAAG;AACjC,IAAA,OAAA,CAAQ,IAAI,mCAA8B,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAE,CAAA;AACzC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAACA,GAAAA,CAAG,UAAA,CAAW,aAAa,CAAA,EAAG;AACjC,IAAAA,IAAG,SAAA,CAAU,aAAA,EAAe,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACjD;AAGA,EAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,EAAA,IAAI;AACF,IAAAwB,SAAAA,CAAS,gBAAA,EAAkB,EAAE,KAAA,EAAO,QAAQ,CAAA;AAC5C,IAAA,aAAA,GAAgB,IAAA;AAAA,EAClB,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAC5C,MAAAA,SAAAA,CAAS,eAAe,SAAS,CAAA,MAAA,EAAS,QAAQ,CAAA,CAAA,CAAA,EAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AACxE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wCAAA,EAAsC,QAAQ,CAAA,CAAE,CAAA;AAC5D,MAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AAAA,IAC3D,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAI,CAAA,4BAAA,EAA0B,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,GAAG,CAAA,CAAE,CAAA;AAAA,IAClF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,OAAA,CAAQ,IAAI,qDAAgD,CAAA;AAC5D,IAAA,cAAA,CAAe,SAAA,EAAW,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,EAC/D;AACF,CAAC,CAAA;AAGH,OAAA,CACG,OAAA,CAAQ,KAAK,CAAA,CACb,WAAA,CAAY,iEAAiE,CAAA,CAC7E,MAAA,CAAO,mBAAA,EAAqB,6CAAA,EAA+C,OAAO,CAAA,CAClF,MAAA,CAAO,YAAY;AAClB,EAAA,MAAM,EAAE,cAAA,EAAAE,eAAAA,EAAe,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACjC,EAAA,MAAMA,eAAAA,EAAe;AACvB,CAAC,CAAA;AASH,SAAS,aAAA,GAA6B;AACpC,EAAA,MAAM,IAAA,GAAOxB,IAAG,OAAA,EAAQ;AACxB,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,OAAA,IAAWD,MAAK,IAAA,CAAK,IAAA,EAAM,WAAW,SAAS,CAAA;AAC3E,EAAA,MAAM,YAAA,GAAe,QAAQ,GAAA,CAAI,YAAA,IAAgBA,MAAK,IAAA,CAAK,IAAA,EAAM,WAAW,OAAO,CAAA;AACnF,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAExB,EAAA,OAAO;AAAA,IACL;AAAA,MACE,IAAA,EAAM,kBAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,WAAW,UAAU,CAAA;AAAA,MAChD,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,iBAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,WAAW,UAAU,CAAA;AAAA,MACjD,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,gBAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,UAAU,4BAA4B,CAAA;AAAA,MACrE,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,cAAc,CAAA;AAAA,MAC1C,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,oBAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,aAAa,UAAU,CAAA;AAAA,MAClD,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,mBAAA;AAAA,MACN,YAAYA,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,YAAY,iBAAiB,CAAA;AAAA,MACrE,OAAA,EAAS,CAAC,YAAY;AAAA,KACxB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,mBAAA;AAAA,MACN,UAAA,EAAYA,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,WAAW,UAAU,CAAA;AAAA,MAChD,OAAA,EAAS,CAAC,SAAS;AAAA,KACrB;AAAA,IACA;AAAA,MACE,IAAA,EAAM,kBAAA;AAAA,MACN,YAAYA,KAAAA,CAAK,IAAA,CAAK,YAAA,EAAc,MAAA,EAAQ,QAAQ,eAAe,CAAA;AAAA,MACnE,OAAA,EAAS,CAAC,KAAA,EAAO,SAAS;AAAA;AAC5B,GACF;AACF;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,EACZ,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,gBAAgB,MAAA,EAAoE;AAC3F,EAAA,IAAI,SAAkC,EAAC;AACvC,EAAA,IAAID,GAAAA,CAAG,UAAA,CAAW,MAAA,CAAO,UAAU,CAAA,EAAG;AACpC,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,KAAK,KAAA,CAAMA,GAAAA,CAAG,aAAa,MAAA,CAAO,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,IACjE,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,GAAS,EAAC;AAAA,IACZ;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,GAAM,MAAA;AACV,EAAA,KAAA,MAAW,GAAA,IAAO,OAAO,OAAA,EAAS;AAChC,IAAA,IAAI,CAAC,IAAI,GAAG,CAAA,IAAK,OAAO,GAAA,CAAI,GAAG,MAAM,QAAA,EAAU;AAC7C,MAAA,GAAA,CAAI,GAAG,IAAI,EAAC;AAAA,IACd;AACA,IAAA,GAAA,GAAM,IAAI,GAAG,CAAA;AAAA,EACf;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,IAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,EAC7B;AAEA,EAAA,GAAA,CAAI,SAAS,CAAA,GAAI,EAAE,GAAG,YAAA,EAAa;AAEnC,EAAA,MAAM,GAAA,GAAMC,KAAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAC1C,EAAA,IAAI,CAACD,GAAAA,CAAG,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,IAAAA,IAAG,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACvC;AACA,EAAAA,GAAAA,CAAG,aAAA,CAAc,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAE5E,EAAA,OAAO,EAAE,QAAQA,GAAAA,CAAG,UAAA,CAAW,OAAO,UAAU,CAAA,GAAI,cAAc,SAAA,EAAU;AAC9E;AAEA,OAAA,CACG,OAAA,CAAQ,aAAa,CAAA,CACrB,WAAA,CAAY,+EAA+E,CAAA,CAC3F,MAAA,CAAO,WAAA,EAAa,iCAAiC,CAAA,CACrD,MAAA,CAAO,OAAO,IAAA,KAAS;AACtB,EAAA,MAAM,UAAU,aAAA,EAAc;AAE9B,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAC1C,EAAA,OAAA,CAAQ,IAAI,0JAA6B,CAAA;AACzC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,IAAI,KAAK,GAAA,EAAK;AACZ,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,MAAA,GAAS,gBAAgB,MAAM,CAAA;AACrC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,KAAW,SAAA,GAAY,QAAA,GAAM,QAAA;AACjD,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,KAAW,SAAA,GAAY,oBAAA,GAAuB,WAAA;AACjE,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAAA,IAChD;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAqD,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC7E,MAAA,EAAQ,CAAA;AAAA,IACR,QAAQA,GAAAA,CAAG,UAAA,CAAWC,MAAK,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAC;AAAA,GAClD,CAAE,CAAA;AAEF,EAAA,MAAM,YAAY,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAEjD,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAC9C,IAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AACzD,IAAA,OAAA,CAAQ,IAAI,gDAAiD,CAAA;AAC7D,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,IAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,IAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AACzC,IAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AACnC,IAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,IAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AACjC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,KAAA,MAAW,EAAE,MAAA,EAAO,IAAK,SAAA,EAAW;AAClC,IAAA,MAAM,MAAA,GAAS,gBAAgB,MAAM,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,KAAW,SAAA,GAAY,QAAA,GAAM,QAAA;AACjD,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,KAAW,SAAA,GAAY,oBAAA,GAAuB,WAAA;AACjE,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,CAAA;AAC9C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,UAAU,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AACvC,IAAA,KAAA,MAAW,EAAE,MAAA,EAAO,IAAK,OAAA,EAAS;AAChC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAS,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAClE,EAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB,CAAC,CAAA;AAGH,OAAA,CACG,QAAQ,WAAW,CAAA,CACnB,YAAY,0CAA0C,CAAA,CACtD,OAAO,MAAM;AACZ,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,mCAA8B,CAAA;AAC1C,EAAA,OAAA,CAAQ,IAAI,0JAA6B,CAAA;AACzC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AACvE,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,yCAA0C,CAAA;AACtD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,EAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,EAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AACzC,EAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AACnC,EAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,EAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AACjB,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AACtC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACrD,EAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,EAAA,OAAA,CAAQ,IAAI,oEAAoE,CAAA;AAChF,EAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AACnD,EAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,EAAA,OAAA,CAAQ,IAAI,4DAA4D,CAAA;AACxE,EAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACrD,EAAA,OAAA,CAAQ,IAAI,+DAA+D,CAAA;AAC3E,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,+DAA+D,CAAA;AAC3E,EAAA,OAAA,CAAQ,IAAI,qEAAqE,CAAA;AACjF,EAAA,OAAA,CAAQ,IAAI,yDAAyD,CAAA;AACrE,EAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AACvC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB,CAAC,CAAA;AAEH,SAAS,cAAA,CAAe,WAAmB,QAAA,EAAwB;AACjE,EAAA,MAAM,MAAA,GAASA,KAAAA,CAAK,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AACzC,EAAA,IAAI,CAACD,GAAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4CAAA,EAA0C,MAAM,CAAA,CAAE,CAAA;AAC9D,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQA,GAAAA,CAAG,WAAA,CAAY,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AACrE,EAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,MAAM,iBAAiB,CAAA;AAC1D,EAAA,MAAM,cAAc,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,iBAAiB,CAAA;AAE/D,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAA,CAAQ,IAAI,qDAAgD,CAAA;AAC5D,IAAA;AAAA,EACF;AAKA,EAAA,MAAM,UAAA,GAAaA,IAAG,YAAA,CAAaC,KAAAA,CAAK,KAAK,MAAA,EAAQ,QAAQ,GAAG,OAAO,CAAA;AAEvE,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAC5B,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACrC,IAAA,MAAM,SAAA,GAAYD,IAAG,YAAA,CAAaC,KAAAA,CAAK,KAAK,MAAA,EAAQ,EAAE,GAAG,OAAO,CAAA;AAChE,IAAA,WAAA,IAAe;AAAA,2CAAA,EAC0B,OAAO,CAAA;AAAA;AAAA,8BAAA,EAEpB,OAAO,CAAA;AAAA,kDAAA,EACa,SAAS,CAAA;AAAA;AAAA,aAAA,CAAA;AAAA,EAG3D;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,8CAAA,EAIgC,UAAU,CAAA;AAAA;AAAA,iBAAA,EAEvC,WAAW;AAAA;AAAA,SAAA,CAAA;AAI5B,EAAAD,GAAAA,CAAG,aAAA,CAAc,QAAA,EAAU,KAAA,EAAO,OAAO,CAAA;AACzC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8BAAA,EAA4B,QAAQ,CAAA,CAAE,CAAA;AAClD,EAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AAC3D;AAEA,eAAe,UAAU,IAAA,EAA6B;AACpD,EAAA,MAAM,eAAA,EAAgB;AAEtB,EAAA,IAAI,MAAA;AAEJ,EAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,IAAI,CAAA;AACxC,EAAA,IAAI,SAAA,EAAW;AAEb,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,IAAA,MAAA,GAAS,MAAA;AAAA,EACX,CAAA,MAAO;AACL,IAAA,MAAM,GAAA,GAAM,IAAI,aAAA,CAAc,IAAI,CAAA;AAClC,IAAA,MAAM,IAAI,KAAA,EAAM;AAChB,IAAA,MAAA,GAAS,GAAA;AAAA,EACX;AAEA,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,IAAI,KAAA,GAA0B,IAAA;AAE9B,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAM,QAAQ,qBAAA,EAAsB;AACpC,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3C,IAAA,KAAA,GAAQ,IAAI,SAAA,CAAU,MAAA,EAAQ,KAAK,CAAA;AAAA,EACrC;AAEA,EAAA,MAAM,EAAE,eAAc,GAAI,MAAA;AAAA,oBACxBU,GAAAA,CAAC,GAAA,EAAA,EAAI,MAAA,EAAgB,KAAA,EAAc,SAAS,OAAA,EAAS;AAAA,GACvD;AAEA,EAAA,MAAM,UAAU,YAAY;AAC1B,IAAA,gBAAA,EAAiB;AACjB,IAAA,MAAM,OAAO,IAAA,EAAK;AAAA,EACpB,CAAA;AAEA,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,YAAY;AAC/B,IAAA,MAAM,OAAA,EAAQ;AACd,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,YAAY;AAChC,IAAA,MAAM,OAAA,EAAQ;AACd,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,MAAM,aAAA,EAAc;AACpB,EAAA,MAAM,OAAA,EAAQ;AAChB;AAEA,OAAA,CAAQ,KAAA,EAAM","file":"index.js","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { ConfigAccess } from '../tools/types.js';\n\nconst DOMINUS_DIR = path.join(os.homedir(), '.dominus');\nconst CONFIG_PATH = path.join(DOMINUS_DIR, 'config.json');\nconst DB_PATH = path.join(DOMINUS_DIR, 'dominus.db');\nconst RULES_PATH = path.join(DOMINUS_DIR, 'rules.json');\n\nexport type AIProviderType =\n | 'openai'\n | 'anthropic'\n | 'gemini'\n | 'xai'\n | 'openrouter'\n | 'custom';\n\nexport interface ProviderConfig {\n name: string;\n baseUrl: string;\n envVar: string;\n defaultModel: string;\n}\n\nexport const PROVIDERS: Record<AIProviderType, ProviderConfig> = {\n openai: {\n name: 'OpenAI',\n baseUrl: 'https://api.openai.com/v1',\n envVar: 'OPENAI_API_KEY',\n defaultModel: 'gpt-5.3-codex',\n },\n anthropic: {\n name: 'Anthropic',\n baseUrl: 'https://api.anthropic.com/v1/',\n envVar: 'ANTHROPIC_API_KEY',\n defaultModel: 'claude-sonnet-4-6',\n },\n gemini: {\n name: 'Google Gemini',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n envVar: 'GEMINI_API_KEY',\n defaultModel: 'gemini-3.1-pro',\n },\n xai: {\n name: 'xAI (Grok)',\n baseUrl: 'https://api.x.ai/v1',\n envVar: 'XAI_API_KEY',\n defaultModel: 'grok-4.2',\n },\n openrouter: {\n name: 'OpenRouter',\n baseUrl: 'https://openrouter.ai/api/v1',\n envVar: 'OPENROUTER_API_KEY',\n defaultModel: 'anthropic/claude-sonnet-4-6',\n },\n custom: {\n name: 'Custom',\n baseUrl: '',\n envVar: '',\n defaultModel: '',\n },\n};\n\nexport interface DominusConfig {\n provider: AIProviderType;\n apiKey?: string;\n apiBaseUrl: string;\n model: string;\n port: number;\n maxToolIterations: number;\n maxVerifyRetries: number;\n tokenBudget: number;\n autoIndex: boolean;\n autoLearn: boolean;\n userName: string;\n openCloudApiKey?: string;\n}\n\nconst DEFAULTS: DominusConfig = {\n provider: 'openai',\n apiBaseUrl: '',\n model: '',\n port: 18088,\n maxToolIterations: 25,\n maxVerifyRetries: 3,\n tokenBudget: 128000,\n autoIndex: true,\n autoLearn: true,\n userName: 'Developer',\n};\n\n/**\n * Auto-detect provider from environment variables.\n * Returns the first provider whose env var is set, or null.\n */\nexport function detectProviderFromEnv(): { provider: AIProviderType; apiKey: string } | null {\n const priority: AIProviderType[] = ['openai', 'anthropic', 'gemini', 'xai', 'openrouter'];\n for (const p of priority) {\n const key = process.env[PROVIDERS[p].envVar];\n if (key) return { provider: p, apiKey: key };\n }\n return null;\n}\n\n/**\n * Resolve the effective base URL and model for a provider config.\n */\nexport function resolveProviderSettings(config: DominusConfig): {\n baseUrl: string;\n model: string;\n} {\n const providerInfo = PROVIDERS[config.provider];\n return {\n baseUrl: config.apiBaseUrl || providerInfo?.baseUrl || PROVIDERS.openrouter.baseUrl,\n model: config.model || providerInfo?.defaultModel || 'gpt-4o',\n };\n}\n\nexport interface DominusRules {\n do: string[];\n dont: string[];\n conventions: string[];\n context: string;\n}\n\nconst DEFAULT_RULES: DominusRules = {\n do: [],\n dont: [],\n conventions: [],\n context: '',\n};\n\nfunction ensureDir(): void {\n if (!fs.existsSync(DOMINUS_DIR)) {\n fs.mkdirSync(DOMINUS_DIR, { recursive: true });\n }\n}\n\nfunction readJson<T>(filePath: string, defaults: T): T {\n try {\n if (fs.existsSync(filePath)) {\n const raw = fs.readFileSync(filePath, 'utf-8');\n return { ...defaults, ...JSON.parse(raw) };\n }\n } catch {\n // Corrupted file; reset to defaults\n }\n return { ...defaults };\n}\n\nfunction writeJson(filePath: string, data: unknown): void {\n ensureDir();\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\nexport function loadConfig(): DominusConfig {\n ensureDir();\n return readJson(CONFIG_PATH, DEFAULTS);\n}\n\nexport function saveConfig(config: DominusConfig): void {\n writeJson(CONFIG_PATH, config);\n}\n\nexport function getConfigValue<K extends keyof DominusConfig>(key: K): DominusConfig[K] {\n const config = loadConfig();\n return config[key];\n}\n\nexport function setConfigValue<K extends keyof DominusConfig>(\n key: K,\n value: DominusConfig[K],\n): void {\n const config = loadConfig();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (config as any)[key] = value;\n saveConfig(config);\n}\n\nexport function loadRules(): DominusRules {\n ensureDir();\n return readJson(RULES_PATH, DEFAULT_RULES);\n}\n\nexport function saveRules(rules: DominusRules): void {\n writeJson(RULES_PATH, rules);\n}\n\nexport function getDominusDir(): string {\n ensureDir();\n return DOMINUS_DIR;\n}\n\nexport function getDbPath(): string {\n ensureDir();\n return DB_PATH;\n}\n\nexport function createConfigAccess(): ConfigAccess {\n return {\n get<T>(key: string): T | undefined {\n const config = loadConfig() as unknown as Record<string, unknown>;\n return config[key] as T | undefined;\n },\n set(key: string, value: unknown): void {\n const config = loadConfig() as unknown as Record<string, unknown>;\n config[key] = value;\n saveConfig(config as unknown as DominusConfig);\n },\n getAll(): Record<string, unknown> {\n return loadConfig() as unknown as Record<string, unknown>;\n },\n };\n}\n","import { nanoid } from 'nanoid';\r\n\r\nexport interface WsMessage<T = unknown> {\r\n id: string;\r\n type: string;\r\n payload: T;\r\n ts: number;\r\n}\r\n\r\nexport const StudioMsg = {\r\n CONNECTED: 'studio:connected',\r\n DISCONNECTED: 'studio:disconnected',\r\n EXPLORER: 'studio:explorer',\r\n OUTPUT: 'studio:output',\r\n ERROR: 'studio:error',\r\n SELECTION: 'studio:selection',\r\n SCRIPT_CONTENT: 'studio:script:content',\r\n SCRIPT_CHANGED: 'studio:script:changed',\r\n RESPONSE: 'studio:response',\r\n REFLECTION: 'studio:reflection',\r\n TEST_RESULTS: 'studio:test:results',\r\n} as const;\r\n\r\nexport const CliMsg = {\r\n GET_EXPLORER: 'cli:get:explorer',\r\n GET_SCRIPT: 'cli:get:script',\r\n SET_SCRIPT: 'cli:set:script',\r\n RUN_CODE: 'cli:run',\r\n GET_PROPERTIES: 'cli:get:properties',\r\n GET_DESCENDANTS_PROPERTIES: 'cli:get:descendants:properties',\r\n SET_PROPERTIES: 'cli:set:properties',\r\n INSERT_INSTANCE: 'cli:insert',\r\n DELETE_INSTANCE: 'cli:delete',\r\n GET_SELECTION: 'cli:get:selection',\r\n SELECT: 'cli:select',\r\n SEARCH_SCRIPTS: 'cli:search:scripts',\r\n GET_OUTPUT: 'cli:get:output',\r\n RUN_TESTS: 'cli:run:tests',\r\n EXECUTE_RUN_TEST: 'cli:test:run',\r\n EXECUTE_PLAY_TEST: 'cli:test:play',\r\n END_TEST: 'cli:test:end',\r\n BUILD_UI: 'cli:build:ui',\r\n GET_REFLECTION: 'cli:get:reflection',\r\n UPLOAD_ASSET: 'cli:upload:asset',\r\n SERIALIZE_UI: 'cli:serialize:ui',\r\n MOVE_INSTANCE: 'cli:move:instance',\r\n UNDO: 'cli:undo',\r\n REDO: 'cli:redo',\r\n BULK_SET_PROPERTIES: 'cli:bulk:set:properties',\r\n FIND_REPLACE_SCRIPTS: 'cli:find:replace:scripts',\r\n} as const;\r\n\r\nexport type StudioMsgType = (typeof StudioMsg)[keyof typeof StudioMsg];\r\nexport type CliMsgType = (typeof CliMsg)[keyof typeof CliMsg];\r\n\r\nexport interface ExplorerNode {\r\n name: string;\r\n className: string;\r\n path: string;\r\n children?: ExplorerNode[];\r\n}\r\n\r\nexport interface StudioConnectedPayload {\r\n studioVersion: string;\r\n placeId?: number;\r\n placeName?: string;\r\n engineVersion?: string;\r\n}\r\n\r\nexport interface ScriptContentPayload {\r\n path: string;\r\n className: 'Script' | 'LocalScript' | 'ModuleScript';\r\n source: string;\r\n lineCount: number;\r\n}\r\n\r\nexport interface ScriptChangedPayload {\r\n path: string;\r\n source: string;\r\n}\r\n\r\nexport interface OutputPayload {\r\n message: string;\r\n level: 'info' | 'warn' | 'error';\r\n timestamp: number;\r\n source?: string;\r\n}\r\n\r\nexport interface SelectionPayload {\r\n paths: string[];\r\n classNames: string[];\r\n}\r\n\r\nexport interface PropertyEntry {\r\n name: string;\r\n value: string;\r\n type: string;\r\n category?: string;\r\n}\r\n\r\nexport interface TestResultPayload {\r\n name: string;\r\n passed: boolean;\r\n duration: number;\r\n error?: string;\r\n}\r\n\r\nexport interface StudioTestPayload {\r\n args?: unknown;\r\n}\r\n\r\nexport interface StudioTestResultPayload {\r\n success: boolean;\r\n result?: unknown;\r\n error?: string;\r\n duration?: number;\r\n}\r\n\r\nexport interface ReflectionPayload {\r\n className: string;\r\n properties: { name: string; type: string; category: string }[];\r\n methods: { name: string; parameters: string[] }[];\r\n events: { name: string; parameters: string[] }[];\r\n}\r\n\r\nexport interface RunCodePayload {\r\n code: string;\r\n}\r\n\r\nexport interface RunCodeResponsePayload {\r\n output: string;\r\n error?: string;\r\n duration: number;\r\n}\r\n\r\nexport interface SearchScriptsPayload {\r\n query: string;\r\n maxResults?: number;\r\n}\r\n\r\nexport interface SearchResultPayload {\r\n results: {\r\n path: string;\r\n className: string;\r\n matches: { line: number; text: string }[];\r\n }[];\r\n}\r\n\r\nexport interface InsertInstancePayload {\r\n className: string;\r\n parentPath: string;\r\n name: string;\r\n properties?: Record<string, unknown>;\r\n}\r\n\r\nexport interface SetPropertiesPayload {\r\n path: string;\r\n properties: Record<string, unknown>;\r\n}\r\n\r\nexport function createMessage<T>(type: string, payload: T): WsMessage<T> {\r\n return { id: nanoid(), type, payload, ts: Date.now() };\r\n}\r\n\r\nexport function createRequest<T>(type: string, payload: T): WsMessage<T> {\r\n return createMessage(type, payload);\r\n}\r\n\r\nexport function parseMessage(raw: string): WsMessage {\r\n try {\r\n return JSON.parse(raw) as WsMessage;\r\n } catch {\r\n throw new Error(`Failed to parse WebSocket message: ${raw.slice(0, 100)}`);\r\n }\r\n}\r\n\r\nexport function serializeMessage(msg: WsMessage): string {\r\n return JSON.stringify(msg);\r\n}\r\n","import { WebSocketServer, WebSocket } from 'ws';\nimport { EventEmitter } from 'node:events';\nimport {\n parseMessage,\n serializeMessage,\n createMessage,\n StudioMsg,\n type WsMessage,\n type StudioConnectedPayload,\n} from './protocol.js';\n\nexport interface StudioConnection {\n ws: WebSocket;\n studioVersion?: string;\n placeId?: number;\n placeName?: string;\n connectedAt: number;\n}\n\nexport interface PlaceInfo {\n placeId: number;\n placeName?: string;\n studioVersion?: string;\n connectedAt: number;\n}\n\nexport interface StudioBridge extends EventEmitter {\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs?: number): Promise<WsMessage<T>>;\n sendNotification(type: string, payload: unknown): void;\n isConnected(): boolean;\n getConnectionInfo(): StudioConnection | null;\n getPort(): number;\n stop(): Promise<void>;\n /** List all connected Studio instances */\n listConnections(): PlaceInfo[];\n /** Get/set which placeId is the active target. 0 = auto (single connection). */\n getActivePlaceId(): number;\n setActivePlaceId(placeId: number): void;\n}\n\nexport class DominusServer extends EventEmitter implements StudioBridge {\n private wss: WebSocketServer | null = null;\n /** All connected Studio instances, keyed by placeId (0 for unknown) */\n private studioClients = new Map<number, StudioConnection>();\n /** Reverse lookup: ws → placeId */\n private wsToPlaceId = new Map<WebSocket, number>();\n /** Which placeId to target. 0 = auto-select if only one is connected. */\n private activePlaceId = 0;\n private controllers = new Set<WebSocket>();\n private pendingRequests = new Map<\n string,\n { resolve: (msg: WsMessage) => void; reject: (err: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\n private relayRequests = new Map<string, WebSocket>();\n private port: number;\n\n constructor(port = 18088) {\n super();\n this.port = port;\n }\n\n start(maxRetries = 0): Promise<void> {\n return new Promise((resolve, reject) => {\n const tryPort = (port: number, attempt: number) => {\n const wss = new WebSocketServer({ port });\n\n wss.on('listening', () => {\n this.wss = wss;\n this.port = port;\n this.wss.on('connection', (ws) => this.handleConnection(ws));\n this.emit('server:started', { port });\n resolve();\n });\n\n wss.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE' && attempt < maxRetries) {\n wss.close();\n tryPort(port + 1, attempt + 1);\n } else {\n this.emit('server:error', err);\n reject(err);\n }\n });\n };\n\n tryPort(this.port, 0);\n });\n }\n\n private handleConnection(ws: WebSocket): void {\n let identified = false;\n\n ws.on('message', (raw) => {\n try {\n const msg = parseMessage(raw.toString());\n\n if (!identified) {\n if (msg.type === StudioMsg.CONNECTED) {\n identified = true;\n this.setStudioClient(ws, msg);\n return;\n }\n if (msg.type === 'controller:connect') {\n identified = true;\n this.addController(ws);\n ws.send(serializeMessage(createMessage('controller:welcome', {\n studioConnected: this.isConnected(),\n port: this.port,\n connections: this.listConnections(),\n activePlaceId: this.activePlaceId,\n })));\n return;\n }\n }\n\n if (this.controllers.has(ws)) {\n this.handleControllerMessage(ws, msg);\n } else {\n this.handleStudioMessage(ws, msg);\n }\n } catch (err) {\n this.emit('server:error', err);\n }\n });\n\n ws.on('close', () => {\n if (this.controllers.has(ws)) {\n this.controllers.delete(ws);\n for (const [id, controllerWs] of this.relayRequests) {\n if (controllerWs === ws) this.relayRequests.delete(id);\n }\n } else {\n const placeId = this.wsToPlaceId.get(ws);\n if (placeId !== undefined) {\n const conn = this.studioClients.get(placeId);\n this.studioClients.delete(placeId);\n this.wsToPlaceId.delete(ws);\n this.emit('studio:disconnected', { placeId, placeName: conn?.placeName });\n this.broadcastToControllers('studio:disconnected', { placeId, placeName: conn?.placeName });\n // Reject pending requests that were targeting this ws\n for (const [id, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error(`Studio disconnected (place ${placeId})`));\n this.pendingRequests.delete(id);\n }\n // If the active place disconnected, reset to auto\n if (this.activePlaceId === placeId) {\n this.activePlaceId = 0;\n }\n }\n }\n });\n\n ws.on('error', (err) => {\n this.emit('server:error', err);\n });\n }\n\n private setStudioClient(ws: WebSocket, msg: WsMessage): void {\n const payload = msg.payload as StudioConnectedPayload;\n const placeId = payload.placeId ?? 0;\n\n // If same placeId reconnects, close the old one\n const existing = this.studioClients.get(placeId);\n if (existing && existing.ws !== ws) {\n existing.ws.close();\n this.wsToPlaceId.delete(existing.ws);\n }\n\n const conn: StudioConnection = {\n ws,\n connectedAt: Date.now(),\n studioVersion: payload.studioVersion,\n placeId,\n placeName: payload.placeName,\n };\n this.studioClients.set(placeId, conn);\n this.wsToPlaceId.set(ws, placeId);\n\n this.emit('studio:connected', { ...payload, placeId });\n this.broadcastToControllers('studio:connected', { ...payload, placeId });\n }\n\n private addController(ws: WebSocket): void {\n this.controllers.add(ws);\n this.emit('controller:connected');\n }\n\n private broadcastToControllers(type: string, payload: unknown): void {\n const msg = serializeMessage(createMessage(type, payload));\n for (const ws of this.controllers) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(msg);\n }\n }\n }\n\n private handleControllerMessage(controllerWs: WebSocket, msg: WsMessage): void {\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) {\n controllerWs.send(serializeMessage({\n id: msg.id,\n type: StudioMsg.RESPONSE,\n payload: { error: this.getTargetError() },\n ts: Date.now(),\n }));\n return;\n }\n\n this.relayRequests.set(msg.id, controllerWs);\n target.ws.send(serializeMessage(msg));\n }\n\n private handleStudioMessage(ws: WebSocket, msg: WsMessage): void {\n if (msg.type === StudioMsg.CONNECTED) {\n // Re-handshake — update existing connection info\n const payload = msg.payload as StudioConnectedPayload;\n const placeId = this.wsToPlaceId.get(ws);\n if (placeId !== undefined) {\n const conn = this.studioClients.get(placeId);\n if (conn) {\n conn.studioVersion = payload.studioVersion;\n conn.placeId = payload.placeId;\n conn.placeName = payload.placeName;\n }\n }\n this.emit('studio:connected', payload);\n this.broadcastToControllers('studio:connected', payload);\n return;\n }\n\n if (msg.type === StudioMsg.RESPONSE) {\n // Check if this is a relayed request from a controller\n const controllerWs = this.relayRequests.get(msg.id);\n if (controllerWs && controllerWs.readyState === WebSocket.OPEN) {\n controllerWs.send(serializeMessage(msg));\n this.relayRequests.delete(msg.id);\n return;\n }\n\n // Otherwise handle locally (MCP or direct)\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n pending.resolve(msg);\n this.pendingRequests.delete(msg.id);\n }\n return;\n }\n\n // Forward events to controllers and local listeners\n this.emit(msg.type, msg.payload);\n this.emit('message', msg);\n this.broadcastToControllers(msg.type, msg.payload);\n }\n\n /** Resolve which Studio connection to target */\n private resolveTarget(): StudioConnection | null {\n if (this.studioClients.size === 0) return null;\n\n // Explicit active place\n if (this.activePlaceId !== 0) {\n const conn = this.studioClients.get(this.activePlaceId);\n if (conn && conn.ws.readyState === WebSocket.OPEN) return conn;\n return null;\n }\n\n // Auto: if exactly one connection, use it\n if (this.studioClients.size === 1) {\n const conn = this.studioClients.values().next().value!;\n if (conn.ws.readyState === WebSocket.OPEN) return conn;\n return null;\n }\n\n // Multiple connections, no active set — return null (ambiguous)\n return null;\n }\n\n /** Generate an appropriate error message when no target found */\n private getTargetError(): string {\n if (this.studioClients.size === 0) return 'No Studio connection';\n if (this.activePlaceId !== 0) {\n return `Active place ${this.activePlaceId} is not connected. Use set_active_place or list_connections.`;\n }\n const places = [...this.studioClients.values()].map(c => `${c.placeName ?? 'Unknown'} (${c.placeId})`);\n return `Multiple Studio instances connected: ${places.join(', ')}. Use set_active_place to choose one.`;\n }\n\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 10000): Promise<WsMessage<T>> {\n return new Promise((resolve, reject) => {\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) {\n reject(new Error(this.getTargetError()));\n return;\n }\n\n const msg = createMessage(type, payload);\n\n const timer = setTimeout(() => {\n this.pendingRequests.delete(msg.id);\n reject(new Error(`Request timed out: ${type}`));\n }, timeoutMs);\n\n this.pendingRequests.set(msg.id, {\n resolve: resolve as (msg: WsMessage) => void,\n reject,\n timer,\n });\n\n target.ws.send(serializeMessage(msg));\n });\n }\n\n sendNotification(type: string, payload: unknown): void {\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) return;\n const msg = createMessage(type, payload);\n target.ws.send(serializeMessage(msg));\n }\n\n isConnected(): boolean {\n return this.resolveTarget() !== null;\n }\n\n getConnectionInfo(): StudioConnection | null {\n return this.resolveTarget();\n }\n\n listConnections(): PlaceInfo[] {\n return [...this.studioClients.values()]\n .filter(c => c.ws.readyState === WebSocket.OPEN)\n .map(c => ({\n placeId: c.placeId ?? 0,\n placeName: c.placeName,\n studioVersion: c.studioVersion,\n connectedAt: c.connectedAt,\n }));\n }\n\n getActivePlaceId(): number {\n return this.activePlaceId;\n }\n\n setActivePlaceId(placeId: number): void {\n this.activePlaceId = placeId;\n }\n\n getPort(): number {\n return this.port;\n }\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n for (const conn of this.studioClients.values()) {\n conn.ws.close();\n }\n this.studioClients.clear();\n this.wsToPlaceId.clear();\n for (const ws of this.controllers) {\n ws.close();\n }\n this.controllers.clear();\n for (const [, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Server shutting down'));\n }\n this.pendingRequests.clear();\n this.relayRequests.clear();\n\n if (this.wss) {\n this.wss.close(() => resolve());\n } else {\n resolve();\n }\n });\n }\n}\n","import { WebSocket } from 'ws';\r\nimport { EventEmitter } from 'node:events';\r\nimport {\r\n parseMessage,\r\n serializeMessage,\r\n createMessage,\r\n StudioMsg,\r\n type WsMessage,\r\n type StudioConnectedPayload,\r\n} from './protocol.js';\r\nimport type { StudioBridge, StudioConnection, PlaceInfo } from './ws-server.js';\r\n\r\n/**\r\n * Connects as a relay client to an existing DominusServer.\r\n * Has the same interface as DominusServer so the TUI/Agent\r\n * can use either transparently.\r\n */\r\nexport class DominusClient extends EventEmitter implements StudioBridge {\r\n private ws: WebSocket | null = null;\r\n private port: number;\r\n private studioConnected = false;\r\n private connections = new Map<number, Omit<StudioConnection, 'ws'>>();\r\n private activePlaceId = 0;\r\n private pendingRequests = new Map<\r\n string,\r\n { resolve: (msg: WsMessage) => void; reject: (err: Error) => void; timer: ReturnType<typeof setTimeout> }\r\n >();\r\n\r\n constructor(port = 18088) {\r\n super();\r\n this.port = port;\r\n }\r\n\r\n connect(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const url = `ws://localhost:${this.port}`;\r\n const ws = new WebSocket(url);\r\n\r\n ws.on('open', () => {\r\n this.ws = ws;\r\n ws.send(serializeMessage(createMessage('controller:connect', {})));\r\n this.emit('server:started', { port: this.port, relay: true });\r\n resolve();\r\n });\r\n\r\n ws.on('message', (raw) => {\r\n try {\r\n const msg = parseMessage(raw.toString());\r\n this.handleMessage(msg);\r\n } catch (err) {\r\n this.emit('server:error', err);\r\n }\r\n });\r\n\r\n ws.on('close', () => {\r\n this.ws = null;\r\n this.studioConnected = false;\r\n this.emit('studio:disconnected');\r\n for (const [id, pending] of this.pendingRequests) {\r\n clearTimeout(pending.timer);\r\n pending.reject(new Error('Relay connection lost'));\r\n this.pendingRequests.delete(id);\r\n }\r\n });\r\n\r\n ws.on('error', (err) => {\r\n if (!this.ws) reject(err);\r\n this.emit('server:error', err);\r\n });\r\n });\r\n }\r\n\r\n private handleMessage(msg: WsMessage): void {\r\n if (msg.type === 'controller:welcome') {\r\n const p = msg.payload as {\r\n studioConnected: boolean;\r\n connections?: PlaceInfo[];\r\n activePlaceId?: number;\r\n };\r\n this.studioConnected = p.studioConnected;\r\n if (p.connections) {\r\n this.connections.clear();\r\n for (const c of p.connections) {\r\n this.connections.set(c.placeId, {\r\n connectedAt: c.connectedAt,\r\n studioVersion: c.studioVersion,\r\n placeId: c.placeId,\r\n placeName: c.placeName,\r\n });\r\n }\r\n }\r\n if (p.activePlaceId !== undefined) {\r\n this.activePlaceId = p.activePlaceId;\r\n }\r\n if (this.studioConnected) {\r\n this.emit('studio:connected', {});\r\n }\r\n return;\r\n }\r\n\r\n if (msg.type === 'studio:connected') {\r\n this.studioConnected = true;\r\n const payload = msg.payload as StudioConnectedPayload & { placeId?: number };\r\n const placeId = payload.placeId ?? 0;\r\n this.connections.set(placeId, {\r\n connectedAt: Date.now(),\r\n studioVersion: payload.studioVersion,\r\n placeId,\r\n placeName: payload.placeName,\r\n });\r\n this.emit('studio:connected', payload);\r\n return;\r\n }\r\n\r\n if (msg.type === 'studio:disconnected') {\r\n const payload = msg.payload as { placeId?: number };\r\n const placeId = payload.placeId ?? 0;\r\n this.connections.delete(placeId);\r\n if (this.connections.size === 0) {\r\n this.studioConnected = false;\r\n }\r\n if (this.activePlaceId === placeId) {\r\n this.activePlaceId = 0;\r\n }\r\n this.emit('studio:disconnected', payload);\r\n return;\r\n }\r\n\r\n if (msg.type === StudioMsg.RESPONSE) {\r\n const pending = this.pendingRequests.get(msg.id);\r\n if (pending) {\r\n clearTimeout(pending.timer);\r\n pending.resolve(msg);\r\n this.pendingRequests.delete(msg.id);\r\n }\r\n return;\r\n }\r\n\r\n this.emit(msg.type, msg.payload);\r\n this.emit('message', msg);\r\n }\r\n\r\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 10000): Promise<WsMessage<T>> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\r\n reject(new Error('Not connected to Dominus server'));\r\n return;\r\n }\r\n if (!this.studioConnected) {\r\n reject(new Error('Studio not connected'));\r\n return;\r\n }\r\n\r\n const msg = createMessage(type, payload);\r\n\r\n const timer = setTimeout(() => {\r\n this.pendingRequests.delete(msg.id);\r\n reject(new Error(`Request timed out: ${type}`));\r\n }, timeoutMs);\r\n\r\n this.pendingRequests.set(msg.id, {\r\n resolve: resolve as (msg: WsMessage) => void,\r\n reject,\r\n timer,\r\n });\r\n\r\n this.ws.send(serializeMessage(msg));\r\n });\r\n }\r\n\r\n sendNotification(type: string, payload: unknown): void {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\r\n const msg = createMessage(type, payload);\r\n this.ws.send(serializeMessage(msg));\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.studioConnected && this.connections.size > 0;\r\n }\r\n\r\n getConnectionInfo(): StudioConnection | null {\r\n if (this.connections.size === 0) return null;\r\n // Return active or first connection\r\n const target = this.activePlaceId !== 0\r\n ? this.connections.get(this.activePlaceId)\r\n : this.connections.values().next().value;\r\n if (!target) return null;\r\n return { ...target, ws: this.ws! } as StudioConnection;\r\n }\r\n\r\n listConnections(): PlaceInfo[] {\r\n return [...this.connections.values()].map(c => ({\r\n placeId: c.placeId ?? 0,\r\n placeName: c.placeName,\r\n studioVersion: c.studioVersion,\r\n connectedAt: c.connectedAt,\r\n }));\r\n }\r\n\r\n getActivePlaceId(): number {\r\n return this.activePlaceId;\r\n }\r\n\r\n setActivePlaceId(placeId: number): void {\r\n this.activePlaceId = placeId;\r\n }\r\n\r\n getPort(): number {\r\n return this.port;\r\n }\r\n\r\n stop(): Promise<void> {\r\n return new Promise((resolve) => {\r\n for (const [, pending] of this.pendingRequests) {\r\n clearTimeout(pending.timer);\r\n pending.reject(new Error('Client shutting down'));\r\n }\r\n this.pendingRequests.clear();\r\n if (this.ws) {\r\n this.ws.close();\r\n this.ws = null;\r\n }\r\n resolve();\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Check if a Dominus server is already running on the given port.\r\n */\r\nexport async function isPortInUse(port: number): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const ws = new WebSocket(`ws://localhost:${port}`);\r\n const timer = setTimeout(() => {\r\n ws.close();\r\n resolve(false);\r\n }, 1000);\r\n\r\n ws.on('open', () => {\r\n clearTimeout(timer);\r\n ws.close();\r\n resolve(true);\r\n });\r\n\r\n ws.on('error', () => {\r\n clearTimeout(timer);\r\n resolve(false);\r\n });\r\n });\r\n}\r\n","/**\r\n * INTERNAL_MEMORY — lessons learned and quirks that ship with Dominus.\r\n *\r\n * These are baked into every system prompt so the agent doesn't repeat\r\n * known mistakes. Add entries here when you discover a pattern that caused\r\n * a failure, an unintuitive API, or a workaround that should be remembered.\r\n *\r\n * Keep entries short, specific, and actionable. Prefer bullet points over prose.\r\n */\r\n\r\nexport const INTERNAL_MEMORY = `## Internal Memory — Known Quirks & Lessons\r\n\r\nThese are built-in lessons that ship with Dominus. Follow them exactly.\r\n\r\n### create_ui — property format\r\n- Each node accepts properties in **either** of two shapes:\r\n - **Flattened (preferred)**: props as top-level keys next to \\`ClassName\\`, \\`Name\\`, \\`Children\\`.\r\n \\`\\`\\`json\r\n { \"ClassName\": \"TextButton\", \"Name\": \"Btn\", \"Text\": \"OK\", \"Size\": [0, 100, 0, 40] }\r\n \\`\\`\\`\r\n - **Nested bag**: props grouped under \\`properties\\` / \\`Properties\\` / \\`props\\` / \\`Props\\`.\r\n \\`\\`\\`json\r\n { \"ClassName\": \"TextButton\", \"Name\": \"Btn\",\r\n \"properties\": { \"Text\": \"OK\", \"Size\": [0, 100, 0, 40] } }\r\n \\`\\`\\`\r\n- Do NOT mix a nested \\`properties\\` bag with flattened props of the same name — the bag wins.\r\n- Reserved keys (never treated as instance properties): \\`ClassName\\`, \\`className\\`, \\`Name\\`, \\`name\\`, \\`Children\\`, \\`children\\`, \\`properties\\`, \\`Properties\\`, \\`props\\`, \\`Props\\`.\r\n\r\n### build_multiple — schema is strict\r\n- Top-level keys only: \\`name\\`, \\`className\\`, \\`position\\`, \\`size\\`, \\`color\\`, \\`material\\`, \\`anchored\\`, \\`shape\\`, \\`transparency\\`, \\`parent\\`, \\`canCollide\\`.\r\n- Does NOT accept a nested \\`properties\\` bag. For anything outside those fields use \\`insert_instance\\` + \\`set_properties\\`.\r\n- \\`shape\\` values: \\`Block\\`, \\`Ball\\`, \\`Cylinder\\`, \\`Wedge\\`.\r\n\r\n### Color formats (accepted everywhere)\r\n- Hex: \\`\"#RRGGBB\"\\`\r\n- RGB string: \\`\"rgb(255, 128, 0)\"\\`\r\n- BrickColor name: \\`\"Bright red\"\\`, \\`\"Institutional white\"\\`, \\`\"Really black\"\\`, etc.\r\n- Array: \\`[r, g, b]\\` (0–1 floats) or \\`[255, 128, 0]\\` (auto-detected if any value > 1)\r\n\r\n### UDim2 / UDim / Vector2 / Color3 coercion (create_ui)\r\n- UDim2: \\`[xScale, xOffset, yScale, yOffset]\\` or \\`{XScale, XOffset, YScale, YOffset}\\`.\r\n- UDim: \\`[scale, offset]\\` or a plain number (treated as pixels).\r\n- Vector2 (e.g. \\`AnchorPoint\\`): \\`[x, y]\\` or \\`{x, y}\\`.\r\n- 2-element arrays are auto-disambiguated by property name (\\`AnchorPoint\\` → Vector2, \\`CornerRadius\\` → UDim).\r\n\r\n### Common GUI property names\r\n- GUI uses \\`Size\\`/\\`Position\\` as **UDim2** — never Vector3.\r\n- \\`BackgroundColor3\\`, \\`TextColor3\\`, \\`BorderColor3\\`, \\`ImageColor3\\` → Color3.\r\n- \\`Font\\` accepts a string enum name like \\`\"GothamBold\"\\`, \\`\"SourceSans\"\\`.\r\n- Enum properties take the string name: \\`\"Center\"\\`, \\`\"Left\"\\`, \\`\"Fit\"\\`.\r\n\r\n### Tool selection cheat-sheet\r\n- Single 3D part → \\`create_part\\`\r\n- Many 3D parts (tree, building, vehicle) → \\`build_multiple\\` with \\`groupName\\`\r\n- Full UI tree → \\`create_ui\\` (one call, never loop \\`insert_instance\\` for UI)\r\n- **Convert/export existing UI → \\`serialize_ui\\`** (NOT get_descendants_properties)\r\n- Adjusting an existing instance → \\`set_properties\\` (not \\`run_code\\`)\r\n- **Inspecting user's selection → \\`get_selection\\`, then \\`get_properties\\` or \\`serialize_ui\\`**\r\n- **Reading properties → \\`get_properties\\` (NEVER \\`run_code\\` with dump scripts)**\r\n- **Browsing the tree → \\`get_explorer\\`**\r\n- **Multiple Studios open → \\`list_connections\\` to see all, \\`set_active_place\\` to target one**\r\n- Anything exotic or procedural → \\`run_code\\` as last resort\r\n\r\n### NEVER use run_code for:\r\n- Getting properties of an instance → use \\`get_properties\\` or \\`serialize_ui\\`\r\n- Dumping selection info → use \\`inspect_selection\\` (ONE call does it all)\r\n- Inspecting an instance + its children → use \\`inspect_instance\\`\r\n- Converting UI to Roact/React → use \\`convert_ui_to_code\\`\r\n- Creating instances → use \\`create_part\\`, \\`create_ui\\`, \\`insert_instance\\`, \\`build_multiple\\`\r\n- Modifying properties → use \\`set_properties\\` or \\`bulk_set_properties\\`\r\n- Reading scripts → use \\`read_script\\`\r\n- Browsing the explorer → use \\`get_explorer\\`\r\n\\`run_code\\` is ONLY for procedural logic, terrain generation, raycasts, physics queries, or custom algorithms with no tool equivalent.\r\n\r\n### Composite skill tools (prefer these over chaining)\r\n- \\`inspect_selection\\` — Returns paths + compact properties for all selected instances in ONE call. Use when user says \"my selection\" or \"what I selected\".\r\n- \\`inspect_instance\\` — Returns compact properties + children tree for a single instance in ONE call. Combines get_properties + get_explorer.\r\n- \\`convert_ui_to_code\\` — Serializes a UI tree and generates a Roact/React component. Use when user says \"turn this into a component\" or \"convert to React\".\r\n\r\n### Verification habits\r\n- After a build, call \\`get_explorer\\` or \\`get_selection\\` to confirm the tree looks right.\r\n- After editing a script, read it back.\r\n- After \\`run_code\\`, check \\`get_output\\` for errors.\r\n\r\n### serialize_ui — the RIGHT tool for UI conversion\r\n- **Use \\`serialize_ui\\` when converting existing UI to Roact/React/Fusion components.** It returns a minimal JSON tree with only non-default properties, already in JSON-friendly formats.\r\n- **Do NOT use \\`get_descendants_properties\\` for UI conversion** — it returns a flat list with ~50+ properties per instance (including read-only, deprecated, nil, and default values), which bloats context and confuses conversion.\r\n- \\`serialize_ui\\` output maps 1:1 to \\`create_ui\\` input — you can round-trip UI through it.\r\n- The tree structure preserves parent-child hierarchy, so Roact/React children mapping is direct.\r\n\r\n### UI → Roact/React conversion cheat-sheet\r\n- \\`serialize_ui\\` path → JSON tree → map each node to \\`Roact.createElement(ClassName, props, childrenDict)\\`\r\n- UDim2 arrays \\`[xS, xO, yS, yO]\\` → \\`UDim2.new(xS, xO, yS, yO)\\`\r\n- Color3 hex strings → \\`Color3.fromHex(\"#RRGGBB\")\\`\r\n- Vector2 arrays → \\`Vector2.new(x, y)\\`\r\n- UDim arrays → \\`UDim.new(s, o)\\`\r\n- Enum strings like \\`\"Center\"\\` → \\`Enum.TextXAlignment.Center\\`\r\n- FontFace → \\`Font.new(family, weight, style)\\`\r\n- UI modifiers (UICorner, UIStroke, UIGradient, UIListLayout, UIPadding) are CHILDREN not props\r\n- Use instance Name as dictionary key in children table\r\n`;\r\n","import fs from 'node:fs';\r\nimport initSqlJs from 'sql.js';\r\nimport type { Database, QueryExecResult } from 'sql.js';\r\nimport { getDbPath } from '../config/config.js';\r\nimport type { Fact, FactCategory, SessionSummary, ChatMessage, ScriptEntry } from './types.js';\r\n\r\nlet db: Database | null = null;\r\nlet dbPath: string;\r\n\r\nconst SCHEMA = `\r\nCREATE TABLE IF NOT EXISTS facts (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n content TEXT NOT NULL,\r\n category TEXT NOT NULL,\r\n source TEXT,\r\n relevance REAL DEFAULT 1.0,\r\n created_at INTEGER NOT NULL,\r\n accessed_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS summaries (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n session_id TEXT NOT NULL,\r\n summary TEXT NOT NULL,\r\n created_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS messages (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n session_id TEXT NOT NULL,\r\n role TEXT NOT NULL,\r\n content TEXT NOT NULL,\r\n tool_name TEXT,\r\n created_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS script_index (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n path TEXT NOT NULL,\r\n class_name TEXT NOT NULL,\r\n summary TEXT,\r\n line_count INTEGER,\r\n last_hash TEXT,\r\n updated_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE INDEX IF NOT EXISTS idx_facts_project ON facts(project_id);\r\nCREATE INDEX IF NOT EXISTS idx_facts_category ON facts(project_id, category);\r\nCREATE INDEX IF NOT EXISTS idx_scripts_project ON script_index(project_id);\r\nCREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);\r\nCREATE INDEX IF NOT EXISTS idx_summaries_project ON summaries(project_id);\r\n`;\r\n\r\nfunction persist(): void {\r\n if (!db) return;\r\n const data = db.export();\r\n fs.writeFileSync(dbPath, Buffer.from(data));\r\n}\r\n\r\nexport async function initMemoryStore(): Promise<void> {\r\n if (db) return;\r\n dbPath = getDbPath();\r\n const SQL = await initSqlJs();\r\n\r\n if (fs.existsSync(dbPath)) {\r\n const buffer = fs.readFileSync(dbPath);\r\n db = new SQL.Database(buffer);\r\n } else {\r\n db = new SQL.Database();\r\n }\r\n\r\n db.run(SCHEMA);\r\n persist();\r\n}\r\n\r\nexport function getDb(): Database {\r\n if (!db) throw new Error('Memory store not initialized. Call initMemoryStore() first.');\r\n return db;\r\n}\r\n\r\nexport function closeMemoryStore(): void {\r\n if (db) {\r\n persist();\r\n db.close();\r\n db = null;\r\n }\r\n}\r\n\r\n// --- Facts ---\r\n\r\nexport function storeFact(fact: Omit<Fact, 'id'>): number {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO facts (project_id, content, category, source, relevance, created_at, accessed_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n fact.projectId,\r\n fact.content,\r\n fact.category,\r\n fact.source ?? null,\r\n fact.relevance,\r\n fact.createdAt,\r\n fact.accessedAt,\r\n ],\r\n );\r\n persist();\r\n const stmt = d.prepare('SELECT last_insert_rowid()');\r\n stmt.step();\r\n const row = stmt.get();\r\n stmt.free();\r\n return (row?.[0] as number) ?? 0;\r\n}\r\n\r\nexport function recallFacts(projectId: string, query: string, limit = 10): Fact[] {\r\n const d = getDb();\r\n const keywords = query\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter((w) => w.length > 2);\r\n\r\n if (keywords.length === 0) {\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? ORDER BY relevance DESC, accessed_at DESC LIMIT ?`,\r\n [projectId, limit],\r\n );\r\n return rowsToFacts(result);\r\n }\r\n\r\n const likeClauses = keywords.map(() => `LOWER(content) LIKE ?`).join(' OR ');\r\n const likeParams = keywords.map((k) => `%${k}%`);\r\n\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? AND (${likeClauses})\r\n ORDER BY relevance DESC, accessed_at DESC LIMIT ?`,\r\n [projectId, ...likeParams, limit],\r\n );\r\n\r\n const facts = rowsToFacts(result);\r\n\r\n // Update accessed_at for recalled facts\r\n for (const fact of facts) {\r\n if (fact.id) {\r\n d.run(`UPDATE facts SET accessed_at = ? WHERE id = ?`, [Date.now(), fact.id]);\r\n }\r\n }\r\n if (facts.length > 0) persist();\r\n\r\n return facts;\r\n}\r\n\r\nexport function getAllFacts(projectId: string): Fact[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? ORDER BY relevance DESC`,\r\n [projectId],\r\n );\r\n return rowsToFacts(result);\r\n}\r\n\r\nfunction rowsToFacts(result: QueryExecResult[]): Fact[] {\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n content: row[2] as string,\r\n category: row[3] as FactCategory,\r\n source: row[4] as string | undefined,\r\n relevance: row[5] as number,\r\n createdAt: row[6] as number,\r\n accessedAt: row[7] as number,\r\n }));\r\n}\r\n\r\n// --- Messages ---\r\n\r\nexport function storeMessage(msg: Omit<ChatMessage, 'id'>): void {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO messages (session_id, role, content, tool_name, created_at)\r\n VALUES (?, ?, ?, ?, ?)`,\r\n [msg.sessionId, msg.role, msg.content, msg.toolName ?? null, msg.createdAt],\r\n );\r\n persist();\r\n}\r\n\r\nexport function getSessionMessages(sessionId: string, limit = 100): ChatMessage[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM messages WHERE session_id = ? ORDER BY created_at ASC LIMIT ?`,\r\n [sessionId, limit],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n sessionId: row[1] as string,\r\n role: row[2] as ChatMessage['role'],\r\n content: row[3] as string,\r\n toolName: (row[4] as string) || undefined,\r\n createdAt: row[5] as number,\r\n }));\r\n}\r\n\r\n// --- Summaries ---\r\n\r\nexport function storeSummary(summary: Omit<SessionSummary, 'id'>): void {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO summaries (project_id, session_id, summary, created_at)\r\n VALUES (?, ?, ?, ?)`,\r\n [summary.projectId, summary.sessionId, summary.summary, summary.createdAt],\r\n );\r\n persist();\r\n}\r\n\r\nexport function getProjectSummaries(projectId: string, limit = 20): SessionSummary[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM summaries WHERE project_id = ? ORDER BY created_at DESC LIMIT ?`,\r\n [projectId, limit],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n sessionId: row[2] as string,\r\n summary: row[3] as string,\r\n createdAt: row[4] as number,\r\n }));\r\n}\r\n\r\n// --- Script Index ---\r\n\r\nexport function upsertScript(entry: Omit<ScriptEntry, 'id'>): void {\r\n const d = getDb();\r\n const existing = d.exec(\r\n `SELECT id FROM script_index WHERE project_id = ? AND path = ?`,\r\n [entry.projectId, entry.path],\r\n );\r\n\r\n if (existing[0]?.values.length) {\r\n d.run(\r\n `UPDATE script_index SET class_name = ?, summary = ?, line_count = ?, last_hash = ?, updated_at = ?\r\n WHERE project_id = ? AND path = ?`,\r\n [\r\n entry.className,\r\n entry.summary ?? null,\r\n entry.lineCount ?? null,\r\n entry.lastHash ?? null,\r\n entry.updatedAt,\r\n entry.projectId,\r\n entry.path,\r\n ],\r\n );\r\n } else {\r\n d.run(\r\n `INSERT INTO script_index (project_id, path, class_name, summary, line_count, last_hash, updated_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n entry.projectId,\r\n entry.path,\r\n entry.className,\r\n entry.summary ?? null,\r\n entry.lineCount ?? null,\r\n entry.lastHash ?? null,\r\n entry.updatedAt,\r\n ],\r\n );\r\n }\r\n persist();\r\n}\r\n\r\nexport function getScriptIndex(\r\n projectId: string,\r\n): { path: string; summary?: string; className: string }[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT path, summary, class_name FROM script_index WHERE project_id = ? ORDER BY path`,\r\n [projectId],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n path: row[0] as string,\r\n summary: (row[1] as string) || undefined,\r\n className: row[2] as string,\r\n }));\r\n}\r\n\r\nexport function getScriptEntry(projectId: string, scriptPath: string): ScriptEntry | null {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM script_index WHERE project_id = ? AND path = ?`,\r\n [projectId, scriptPath],\r\n );\r\n if (!result[0]?.values.length) return null;\r\n const row = result[0].values[0];\r\n return {\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n path: row[2] as string,\r\n className: row[3] as string,\r\n summary: (row[4] as string) || undefined,\r\n lineCount: (row[5] as number) || undefined,\r\n lastHash: (row[6] as string) || undefined,\r\n updatedAt: row[7] as number,\r\n };\r\n}\r\n\r\n// --- Decay ---\r\n\r\nexport function decayRelevance(projectId: string, factor = 0.95): void {\r\n const d = getDb();\r\n d.run(`UPDATE facts SET relevance = relevance * ? WHERE project_id = ?`, [factor, projectId]);\r\n persist();\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { ScriptContentPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'read_script',\r\n description:\r\n 'Read the source code of a script in Roblox Studio. Provide the full instance path (e.g., \"ServerScriptService.GameManager\").',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path of the script (e.g., \"ServerScriptService.GameManager\")',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const path = params.path as string;\r\n const response = await ctx.sendToStudio<ScriptContentPayload>(CliMsg.GET_SCRIPT, { path });\r\n\r\n if (!response.payload) {\r\n return { success: false, error: `Script not found: ${path}` };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n path: response.payload.path,\r\n className: response.payload.className,\r\n source: response.payload.source,\r\n lineCount: response.payload.lineCount,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'edit_script',\r\n description:\r\n 'Replace the entire source code of a script in Roblox Studio. Provide the full path and the new source code.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path of the script',\r\n },\r\n source: {\r\n type: 'string',\r\n description: 'The new complete source code for the script',\r\n },\r\n },\r\n required: ['path', 'source'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const path = params.path as string;\r\n const source = params.source as string;\r\n\r\n const response = await ctx.sendToStudio(CliMsg.SET_SCRIPT, { path, source });\r\n const payload = response.payload as { success: boolean; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to edit script' };\r\n }\r\n\r\n return { success: true, data: { path, linesWritten: source.split('\\n').length } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { RunCodeResponsePayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'run_code',\r\n description:\r\n 'Execute arbitrary Luau code in Roblox Studio and return the output. The code runs in the Studio plugin context with full API access.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n code: {\r\n type: 'string',\r\n description: 'Luau code to execute in Studio',\r\n },\r\n },\r\n required: ['code'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const code = params.code as string;\r\n const response = await ctx.sendToStudio<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n const payload = response.payload;\r\n\r\n if (payload.error) {\r\n return { success: false, error: payload.error, data: { output: payload.output } };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { output: payload.output, duration: payload.duration },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_explorer',\r\n description:\r\n 'Get the DataModel explorer tree from Roblox Studio. Optionally filter by a root path and max depth.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n rootPath: {\r\n type: 'string',\r\n description: 'Root path to start from (e.g., \"ServerScriptService\"). Omit for entire tree.',\r\n },\r\n maxDepth: {\r\n type: 'number',\r\n description: 'Maximum depth of the tree (default: 3)',\r\n default: 3,\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ tree: ExplorerNode[] }>(CliMsg.GET_EXPLORER, {\r\n rootPath: params.rootPath ?? null,\r\n maxDepth: params.maxDepth ?? 3,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { PropertyEntry } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_properties',\r\n description: 'Get all properties of a single instance in Roblox Studio. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties. For inspecting UI trees, prefer serialize_ui or get_descendants_properties.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\")',\r\n },\r\n compact: {\r\n type: 'boolean',\r\n description: 'Strip read-only, nil, deprecated, and default-valued properties (default true). Set false for full dump.',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const compact = params.compact !== false;\r\n\r\n const response = await ctx.sendToStudio<{ properties: PropertyEntry[] }>(\r\n CliMsg.GET_PROPERTIES,\r\n { path: params.path, compact },\r\n );\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_descendants_properties',\r\n description: 'Easily get all descendants of a UI instance (or any instance) and all of their properties. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties to keep responses small.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\", \"StarterGui.ScreenGui\")',\r\n },\r\n compact: {\r\n type: 'boolean',\r\n description: 'When true (default), strips read-only, nil, deprecated, and default-valued properties to massively reduce response size. Set to false for full property dump.',\r\n },\r\n outputFile: {\r\n type: 'string',\r\n description: 'Optional file path to write the JSON result to, useful for very large trees where context limits apply.',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const compact = params.compact !== false; // default true\r\n\r\n const response = await ctx.sendToStudio<{ success: boolean; descendants?: unknown }>(\r\n CliMsg.GET_DESCENDANTS_PROPERTIES,\r\n { path: params.path, compact },\r\n 1000 * 60 * 5, // 5 minute timeout since getting ALL descendants can take a very long time\r\n );\r\n\r\n if (params.outputFile && typeof params.outputFile === 'string') {\r\n const fs = await import('fs/promises');\r\n const path = await import('path');\r\n const outputPath = path.resolve(process.cwd(), params.outputFile);\r\n await fs.writeFile(outputPath, JSON.stringify(response.payload, null, 2), 'utf-8');\r\n return { success: true, data: `Successfully saved descendants to ${outputPath}` };\r\n }\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'set_properties',\r\n description: 'Set properties on an instance in Roblox Studio.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\")',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Key-value pairs of properties to set (e.g., {\"Name\": \"MyPart\", \"BrickColor\": \"Bright red\"})',\r\n },\r\n },\r\n required: ['path', 'properties'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.SET_PROPERTIES, {\r\n path: params.path,\r\n properties: params.properties,\r\n });\r\n\r\n const payload = response.payload as { success: boolean; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to set properties' };\r\n }\r\n\r\n return { success: true, data: { path: params.path, updated: Object.keys(params.properties as object) } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'insert_instance',\r\n description: 'Insert a new instance into the Roblox Studio DataModel.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n className: {\r\n type: 'string',\r\n description: 'Class name of the instance to create (e.g., \"Part\", \"Script\", \"ModuleScript\")',\r\n },\r\n parentPath: {\r\n type: 'string',\r\n description: 'Full path of the parent instance (e.g., \"Workspace\", \"ServerScriptService\")',\r\n },\r\n name: {\r\n type: 'string',\r\n description: 'Name for the new instance',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Optional properties to set on the new instance',\r\n },\r\n },\r\n required: ['className', 'parentPath', 'name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.INSERT_INSTANCE, {\r\n className: params.className,\r\n parentPath: params.parentPath,\r\n name: params.name,\r\n properties: params.properties ?? {},\r\n });\r\n\r\n const payload = response.payload as { success: boolean; path?: string; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to insert instance' };\r\n }\r\n\r\n return { success: true, data: { path: payload.path } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'delete_instance',\r\n description: 'Delete an instance from the Roblox Studio DataModel by path.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path to delete (e.g., \"Workspace.OldPart\")',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.DELETE_INSTANCE, { path: params.path });\r\n const payload = response.payload as { success: boolean; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to delete instance' };\r\n }\r\n\r\n return { success: true, data: { deleted: params.path } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { OutputPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_output',\r\n description: 'Get recent output log entries from Roblox Studio (prints, warnings, errors).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n limit: {\r\n type: 'number',\r\n description: 'Maximum number of log entries to return (default: 50)',\r\n default: 50,\r\n },\r\n level: {\r\n type: 'string',\r\n description: 'Filter by log level',\r\n enum: ['info', 'warn', 'error'],\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ entries: OutputPayload[] }>(CliMsg.GET_OUTPUT, {\r\n limit: params.limit ?? 50,\r\n level: params.level ?? null,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { SelectionPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_selection',\r\n description: 'Get the currently selected instances in Roblox Studio.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { SearchResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'search_scripts',\r\n description:\r\n 'Search across all scripts in Roblox Studio for a text pattern. Returns matching lines with context.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n query: {\r\n type: 'string',\r\n description: 'Text or pattern to search for in script sources',\r\n },\r\n maxResults: {\r\n type: 'number',\r\n description: 'Maximum number of script results (default: 20)',\r\n default: 20,\r\n },\r\n },\r\n required: ['query'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<SearchResultPayload>(CliMsg.SEARCH_SCRIPTS, {\r\n query: params.query,\r\n maxResults: params.maxResults ?? 20,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { TestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'run_tests',\r\n description:\r\n 'Run tests in Roblox Studio using StudioTestService. Can run all tests or a specific test by name.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n testName: {\r\n type: 'string',\r\n description: 'Specific test name to run. Omit to run all tests.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ results: TestResultPayload[] }>(CliMsg.RUN_TESTS, {\r\n testName: params.testName ?? null,\r\n });\r\n\r\n const results = response.payload.results ?? [];\r\n const passed = results.filter((r) => r.passed).length;\r\n const failed = results.filter((r) => !r.passed).length;\r\n\r\n return {\r\n success: failed === 0,\r\n data: { total: results.length, passed, failed, results },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_class_info',\r\n description:\r\n 'Look up the full schema of a Roblox class using ReflectionService. ' +\r\n 'Returns all properties (with their types), methods (with parameters), and events. ' +\r\n 'ALWAYS call this before creating or modifying GUI/UI elements (Frame, TextLabel, ImageLabel, etc.) ' +\r\n 'to know the correct property names and expected types (e.g., Size is UDim2 for GUI, Vector3 for Parts).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n className: {\r\n type: 'string',\r\n description: 'Roblox class name, e.g. \"Frame\", \"TextLabel\", \"Part\", \"MeshPart\", \"Camera\"',\r\n },\r\n },\r\n required: ['className'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n className: string;\r\n properties: { name: string; type: string; category?: string; owner?: string }[];\r\n methods: { name: string; parameters: { name: string; type: string }[]; owner?: string }[];\r\n events: { name: string; parameters: { name: string; type: string }[]; owner?: string }[];\r\n superclass?: string;\r\n creatable?: boolean;\r\n error?: string;\r\n }>(CliMsg.GET_REFLECTION, { className: params.className });\r\n\r\n const payload = response.payload;\r\n if (payload.error) {\r\n return { success: false, error: payload.error };\r\n }\r\n\r\n return { success: true, data: payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'create_ui',\r\n description:\r\n 'Create an entire UI tree in Roblox Studio in a SINGLE call. ' +\r\n 'Pass a declarative JSON tree with ClassName, Name, properties, and Children. ' +\r\n 'All types are auto-coerced natively in Luau — UDim2, Color3, Font, enums all work. ' +\r\n 'This is 10x faster than run_code for UI because it handles everything in one round-trip ' +\r\n 'with no Luau syntax issues. Replaces any existing instance with the same name.\\n\\n' +\r\n 'Example: create a pastel hello world screen:\\n' +\r\n '{\\n' +\r\n ' \"parent\": \"StarterGui\",\\n' +\r\n ' \"tree\": {\\n' +\r\n ' \"ClassName\": \"ScreenGui\",\\n' +\r\n ' \"Name\": \"HelloWorld\",\\n' +\r\n ' \"ResetOnSpawn\": false,\\n' +\r\n ' \"Children\": [{\\n' +\r\n ' \"ClassName\": \"Frame\",\\n' +\r\n ' \"Name\": \"Background\",\\n' +\r\n ' \"Size\": [1, 0, 1, 0],\\n' +\r\n ' \"BackgroundColor3\": \"#F0E6FF\",\\n' +\r\n ' \"Children\": [\\n' +\r\n ' { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 12] },\\n' +\r\n ' { \"ClassName\": \"TextLabel\", \"Name\": \"Title\", \"Text\": \"Hello World!\",\\n' +\r\n ' \"Size\": [0.5, 0, 0.1, 0], \"Position\": [0.25, 0, 0.45, 0],\\n' +\r\n ' \"BackgroundTransparency\": 1, \"TextColor3\": \"#6C5CE7\",\\n' +\r\n ' \"TextScaled\": true, \"Font\": \"GothamBold\" }\\n' +\r\n ' ]\\n' +\r\n ' }]\\n' +\r\n ' }\\n' +\r\n '}',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n parent: {\r\n type: 'string',\r\n description: 'Parent path: \"StarterGui\", \"PlayerGui\", or any instance path. Default: StarterGui',\r\n },\r\n tree: {\r\n type: 'object',\r\n description:\r\n 'The root UI node. Each node has: ClassName (string), Name (string), ' +\r\n 'Children (array of child nodes), and properties. Properties may be ' +\r\n 'specified either flattened at the top level of the node, OR nested ' +\r\n 'under a \"properties\" / \"Properties\" / \"props\" key — both work. ' +\r\n 'Property values are auto-coerced:\\n' +\r\n ' UDim2: [xScale, xOffset, yScale, yOffset] or {XScale, XOffset, YScale, YOffset}\\n' +\r\n ' Color3: \"#hex\", \"rgb(r,g,b)\", [r,g,b], or BrickColor name\\n' +\r\n ' UDim: [scale, offset] or number\\n' +\r\n ' Vector2: [x, y] or {x, y} (auto-disambiguated from UDim by property name)\\n' +\r\n ' NumberRange: [min, max] or number\\n' +\r\n ' Rect: [minX, minY, maxX, maxY] or {MinX, MinY, MaxX, MaxY}\\n' +\r\n ' Font: \"GothamBold\", \"SourceSans\", etc. (Enum.Font names)\\n' +\r\n ' Enums: string name like \"Center\", \"Left\", \"Fit\"\\n' +\r\n ' FontFace: {Family, Weight, Style}\\n' +\r\n ' 2-element arrays are auto-disambiguated: AnchorPoint→Vector2, CornerRadius/Padding→UDim, etc.',\r\n },\r\n animate: {\r\n type: 'boolean',\r\n description: 'If true, task.wait() will be injected between creation of nodes so that the UI writes out dynamically.',\r\n },\r\n },\r\n required: ['tree'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n path?: string;\r\n instanceCount?: number;\r\n error?: string;\r\n }>(CliMsg.BUILD_UI, {\r\n parent: params.parent ?? 'StarterGui',\r\n animate: params.animate,\r\n tree: params.tree,\r\n });\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'UI build failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { path: payload.path, instanceCount: payload.instanceCount },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { StudioTestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'execute_run_test',\r\n description:\r\n 'Start a Run mode test session in Roblox Studio using StudioTestService:ExecuteRunModeAsync(). ' +\r\n 'Passes args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until the session ends (via EndTest or manual stop). ' +\r\n 'Returns the value passed to EndTest(). ' +\r\n 'Use this for headless automated tests — no player character, just server scripts running.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n args: {\r\n description:\r\n 'Arguments to pass to the test session. Server scripts retrieve this with StudioTestService:GetTestArgs(). ' +\r\n 'Can be a string (e.g. test suite name), table, or any serializable value.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<StudioTestResultPayload>(\r\n CliMsg.EXECUTE_RUN_TEST,\r\n { args: params.args ?? null },\r\n 120_000,\r\n );\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Run mode test failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n result: payload.result,\r\n duration: payload.duration,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { StudioTestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'execute_play_test',\r\n description:\r\n 'Start a solo Play mode test session in Roblox Studio using StudioTestService:ExecutePlayModeAsync(). ' +\r\n 'Passes args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until the session ends (via EndTest or manual stop). ' +\r\n 'Returns the value passed to EndTest(). ' +\r\n 'Use this for tests that need a player character and full client-server simulation.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n args: {\r\n description:\r\n 'Arguments to pass to the test session. Server scripts retrieve this with StudioTestService:GetTestArgs(). ' +\r\n 'Can be a string (e.g. test suite name), table, or any serializable value.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<StudioTestResultPayload>(\r\n CliMsg.EXECUTE_PLAY_TEST,\r\n { args: params.args ?? null },\r\n 120_000,\r\n );\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Play mode test failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n result: payload.result,\r\n duration: payload.duration,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'create_part',\r\n description:\r\n 'Create a Part in Roblox Studio with position, size, color, material and more — all in one call. Much faster than insert_instance + set_properties separately.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Name for the part' },\r\n parent: {\r\n type: 'string',\r\n description: 'Parent path (default: \"Workspace\")',\r\n },\r\n shape: {\r\n type: 'string',\r\n enum: ['Block', 'Ball', 'Cylinder', 'Wedge', 'CornerWedge'],\r\n description: 'Part shape (default: Block)',\r\n },\r\n position: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'World position {x, y, z}',\r\n },\r\n size: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'Size in studs {x, y, z} (default: {4, 1, 2})',\r\n },\r\n color: {\r\n type: 'string',\r\n description: 'Color as hex \"#FF0000\", BrickColor name \"Bright red\", or RGB \"rgb(255,0,0)\"',\r\n },\r\n material: {\r\n type: 'string',\r\n description: 'Material name: Plastic, Wood, Grass, Ice, Metal, Concrete, Sand, Neon, Glass, etc.',\r\n },\r\n transparency: { type: 'number', description: '0 (opaque) to 1 (invisible)' },\r\n anchored: { type: 'boolean', description: 'Whether the part is anchored (default: true)' },\r\n canCollide: { type: 'boolean', description: 'Whether the part has collision' },\r\n },\r\n required: ['name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const parent = (params.parent as string) || 'Workspace';\r\n const name = params.name as string;\r\n const pos = params.position as { x?: number; y?: number; z?: number } | undefined;\r\n const size = params.size as { x?: number; y?: number; z?: number } | undefined;\r\n\r\n const properties: Record<string, unknown> = {};\r\n\r\n if (pos) properties.Position = { X: pos.x ?? 0, Y: pos.y ?? 0, Z: pos.z ?? 0 };\r\n if (size) properties.Size = { X: size.x ?? 4, Y: size.y ?? 1, Z: size.z ?? 2 };\r\n if (params.color) {\r\n const c = params.color as string;\r\n if (c.startsWith('#')) {\r\n properties.Color = c;\r\n } else if (c.startsWith('rgb')) {\r\n const m = c.match(/(\\d+)/g);\r\n if (m && m.length >= 3) {\r\n properties.Color = { red: parseInt(m[0]), green: parseInt(m[1]), blue: parseInt(m[2]) };\r\n }\r\n } else {\r\n properties.BrickColor = c;\r\n }\r\n }\r\n if (params.material) properties.Material = params.material;\r\n if (params.transparency !== undefined) properties.Transparency = params.transparency;\r\n if (params.anchored !== undefined) properties.Anchored = params.anchored;\r\n else properties.Anchored = true;\r\n if (params.canCollide !== undefined) properties.CanCollide = params.canCollide;\r\n if (params.shape && params.shape !== 'Block') properties.Shape = params.shape;\r\n\r\n const className = (params.shape === 'Wedge') ? 'WedgePart'\r\n : (params.shape === 'CornerWedge') ? 'CornerWedgePart'\r\n : 'Part';\r\n\r\n const res = await ctx.sendToStudio(CliMsg.INSERT_INSTANCE, {\r\n className,\r\n parentPath: parent,\r\n name,\r\n properties,\r\n });\r\n\r\n const payload = res.payload as { success: boolean; path?: string; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to create part' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { path: payload.path, properties: Object.keys(properties) },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'clone_instance',\r\n description:\r\n 'Clone an existing instance in Roblox Studio and optionally reposition/rename it. Great for duplicating parts, models, or entire trees.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: { type: 'string', description: 'Path of instance to clone' },\r\n newName: { type: 'string', description: 'Name for the clone (optional)' },\r\n newParent: { type: 'string', description: 'Parent path for the clone (optional, defaults to same parent)' },\r\n offset: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'Position offset from original {x, y, z}',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const code = buildCloneCode(params);\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to clone' };\r\n }\r\n\r\n return { success: true, data: { output: payload.output } };\r\n },\r\n};\r\n\r\nfunction buildCloneCode(params: Record<string, unknown>): string {\r\n const path = params.path as string;\r\n const parts = path.split('.');\r\n let resolve = 'game';\r\n for (const p of parts) {\r\n resolve += `[\"${p}\"]`;\r\n }\r\n\r\n const lines = [\r\n `local orig = ${resolve}`,\r\n `local clone = orig:Clone()`,\r\n ];\r\n\r\n if (params.newName) {\r\n lines.push(`clone.Name = \"${params.newName}\"`);\r\n }\r\n\r\n if (params.newParent) {\r\n const parentParts = (params.newParent as string).split('.');\r\n let parentResolve = 'game';\r\n for (const p of parentParts) {\r\n parentResolve += `[\"${p}\"]`;\r\n }\r\n lines.push(`clone.Parent = ${parentResolve}`);\r\n } else {\r\n lines.push(`clone.Parent = orig.Parent`);\r\n }\r\n\r\n const offset = params.offset as { x?: number; y?: number; z?: number } | undefined;\r\n if (offset) {\r\n lines.push(`if clone:IsA(\"BasePart\") then`);\r\n lines.push(` clone.Position = clone.Position + Vector3.new(${offset.x ?? 0}, ${offset.y ?? 0}, ${offset.z ?? 0})`);\r\n lines.push(`end`);\r\n }\r\n\r\n lines.push(`print(\"Cloned: \" .. clone:GetFullName())`);\r\n return lines.join('\\n');\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'group_instances',\r\n description:\r\n 'Group multiple instances under a new Model or Folder. Useful for organizing parts into objects (e.g., grouping trunk + leaves into a \"Tree\" model).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n paths: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of instance paths to group together',\r\n },\r\n groupName: { type: 'string', description: 'Name for the new group' },\r\n groupClass: {\r\n type: 'string',\r\n enum: ['Model', 'Folder'],\r\n description: 'Class for the group container (default: Model)',\r\n },\r\n parent: { type: 'string', description: 'Parent path (default: Workspace)' },\r\n },\r\n required: ['paths', 'groupName'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const paths = params.paths as string[];\r\n const groupName = params.groupName as string;\r\n const groupClass = (params.groupClass as string) || 'Model';\r\n const parent = (params.parent as string) || 'Workspace';\r\n\r\n const resolves = paths.map((p) => {\r\n const parts = p.split('.');\r\n let r = 'game';\r\n for (const part of parts) r += `[\"${part}\"]`;\r\n return r;\r\n });\r\n\r\n const parentParts = parent.split('.');\r\n let parentResolve = 'game';\r\n for (const p of parentParts) parentResolve += `[\"${p}\"]`;\r\n\r\n const code = [\r\n `local group = Instance.new(\"${groupClass}\")`,\r\n `group.Name = \"${groupName}\"`,\r\n `group.Parent = ${parentResolve}`,\r\n ...resolves.map((r) => `${r}.Parent = group`),\r\n groupClass === 'Model' ? `if group:IsA(\"Model\") then group:MoveTo(group:GetBoundingBox().Position) end` : '',\r\n `print(\"Grouped ${paths.length} instances into: \" .. group:GetFullName())`,\r\n ].filter(Boolean).join('\\n');\r\n\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to group' };\r\n }\r\n\r\n return { success: true, data: { groupPath: `${parent}.${groupName}`, count: paths.length } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\ninterface PartSpec {\r\n name: string;\r\n className?: string;\r\n parent?: string;\r\n position?: { x: number; y: number; z: number };\r\n size?: { x: number; y: number; z: number };\r\n color?: string;\r\n material?: string;\r\n transparency?: number;\r\n anchored?: boolean;\r\n shape?: string;\r\n}\r\n\r\nexport const tool: Tool = {\r\n name: 'build_multiple',\r\n description:\r\n 'Create multiple parts/instances in one batch call. Send an array of specs and they all get created in a single Studio round-trip. Ideal for building trees, houses, vehicles, terrain — anything composed of multiple parts.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n parts: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Part name' },\r\n className: { type: 'string', description: 'ClassName (default: Part)' },\r\n parent: { type: 'string', description: 'Parent path (default: Workspace)' },\r\n position: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n },\r\n size: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n },\r\n color: { type: 'string', description: 'Hex \"#RRGGBB\" or BrickColor name' },\r\n material: { type: 'string' },\r\n transparency: { type: 'number' },\r\n anchored: { type: 'boolean' },\r\n shape: { type: 'string', enum: ['Block', 'Ball', 'Cylinder', 'Wedge'] },\r\n },\r\n required: ['name'],\r\n },\r\n description: 'Array of part specifications',\r\n },\r\n groupName: {\r\n type: 'string',\r\n description: 'Optional: group all parts under a Model with this name',\r\n },\r\n groupParent: {\r\n type: 'string',\r\n description: 'Parent for the group Model (default: Workspace)',\r\n },\r\n },\r\n required: ['parts'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const parts = params.parts as PartSpec[];\r\n const groupName = params.groupName as string | undefined;\r\n const groupParent = (params.groupParent as string) || 'Workspace';\r\n\r\n const code = generateBatchCode(parts, groupName, groupParent);\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Batch build failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n count: parts.length,\r\n group: groupName ?? null,\r\n output: payload.output,\r\n },\r\n };\r\n },\r\n};\r\n\r\nfunction generateBatchCode(parts: PartSpec[], groupName?: string, groupParent?: string): string {\r\n const lines: string[] = [];\r\n\r\n function resolveParent(path: string): string {\r\n const segs = path.split('.');\r\n let r = 'game';\r\n for (const s of segs) r += `[\"${s}\"]`;\r\n return r;\r\n }\r\n\r\n if (groupName) {\r\n const gp = resolveParent(groupParent || 'Workspace');\r\n lines.push(`local _group = Instance.new(\"Model\")`);\r\n lines.push(`_group.Name = \"${groupName}\"`);\r\n lines.push(`_group.Parent = ${gp}`);\r\n }\r\n\r\n for (let i = 0; i < parts.length; i++) {\r\n const p = parts[i];\r\n const varName = `_p${i}`;\r\n const cn = p.className || (p.shape === 'Wedge' ? 'WedgePart' : 'Part');\r\n\r\n lines.push(`local ${varName} = Instance.new(\"${cn}\")`);\r\n lines.push(`${varName}.Name = \"${p.name}\"`);\r\n\r\n if (p.position) {\r\n lines.push(`${varName}.Position = Vector3.new(${p.position.x ?? 0}, ${p.position.y ?? 0}, ${p.position.z ?? 0})`);\r\n }\r\n if (p.size) {\r\n lines.push(`${varName}.Size = Vector3.new(${p.size.x ?? 4}, ${p.size.y ?? 1}, ${p.size.z ?? 2})`);\r\n }\r\n if (p.color) {\r\n if (p.color.startsWith('#')) {\r\n lines.push(`${varName}.Color = Color3.fromHex(\"${p.color}\")`);\r\n } else {\r\n lines.push(`${varName}.BrickColor = BrickColor.new(\"${p.color}\")`);\r\n }\r\n }\r\n if (p.material) {\r\n lines.push(`${varName}.Material = Enum.Material.${p.material}`);\r\n }\r\n if (p.transparency !== undefined) {\r\n lines.push(`${varName}.Transparency = ${p.transparency}`);\r\n }\r\n if (p.anchored !== undefined) {\r\n lines.push(`${varName}.Anchored = ${p.anchored}`);\r\n } else {\r\n lines.push(`${varName}.Anchored = true`);\r\n }\r\n if (p.shape && p.shape !== 'Block' && cn === 'Part') {\r\n lines.push(`${varName}.Shape = Enum.PartType.${p.shape}`);\r\n }\r\n\r\n if (groupName) {\r\n lines.push(`${varName}.Parent = _group`);\r\n } else {\r\n const parent = p.parent || 'Workspace';\r\n lines.push(`${varName}.Parent = ${resolveParent(parent)}`);\r\n }\r\n }\r\n\r\n lines.push(`print(\"Built ${parts.length} parts${groupName ? ` in ${groupName}` : ''}\")`);\r\n return lines.join('\\n');\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'serialize_ui',\r\n description:\r\n 'Serialize an existing UI tree from Roblox Studio into create_ui-compatible JSON. ' +\r\n 'This is the reverse of create_ui — read any instance and get back a declarative JSON tree ' +\r\n 'you can modify and pass back to create_ui. Perfect for cloning, templating, or refactoring UIs.\\n\\n' +\r\n 'The output includes ClassName, Name, all non-default properties (with values converted to ' +\r\n 'JSON-friendly formats like [r,g,b] for Color3, [xS,xO,yS,yO] for UDim2, etc.), and Children.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Instance path to serialize (e.g. \"StarterGui.MyScreenGui\")',\r\n },\r\n maxDepth: {\r\n type: 'number',\r\n description: 'Maximum depth to serialize (default: 50)',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n tree?: unknown;\r\n error?: string;\r\n }>(CliMsg.SERIALIZE_UI, {\r\n path: params.path,\r\n maxDepth: params.maxDepth ?? 50,\r\n }, 1000 * 60 * 2);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Serialization failed' };\r\n }\r\n\r\n return { success: true, data: payload.tree };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'move_instance',\r\n description:\r\n 'Move (reparent) an instance to a new parent in Roblox Studio. ' +\r\n 'This preserves the instance and all its descendants — much better than delete + recreate. ' +\r\n 'Sets a ChangeHistoryService waypoint so the move can be undone.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full path of the instance to move (e.g. \"Workspace.OldFolder.MyPart\")',\r\n },\r\n newParent: {\r\n type: 'string',\r\n description: 'Full path of the new parent (e.g. \"Workspace.NewFolder\")',\r\n },\r\n },\r\n required: ['path', 'newParent'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n newPath?: string;\r\n error?: string;\r\n }>(CliMsg.MOVE_INSTANCE, {\r\n path: params.path,\r\n newParent: params.newParent,\r\n });\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Move failed' };\r\n }\r\n\r\n return { success: true, data: { newPath: payload.newPath } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'bulk_set_properties',\r\n description:\r\n 'Set properties on multiple instances at once in a single call. ' +\r\n 'Much faster than calling set_properties repeatedly. Supports two modes:\\n' +\r\n '1. Explicit paths: provide an array of {path, properties} objects\\n' +\r\n '2. By class filter: provide a root path, className filter, and properties to apply to all matches\\n\\n' +\r\n 'Example (explicit): [{\"path\": \"StarterGui.HUD.Title\", \"properties\": {\"TextColor3\": \"#fff\"}}, ...]\\n' +\r\n 'Example (filter): root=\"StarterGui.HUD\", className=\"TextLabel\", properties={\"Font\": \"GothamBold\"}',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n targets: {\r\n type: 'array',\r\n description: 'Array of {path, properties} objects for explicit mode.',\r\n items: {\r\n type: 'object',\r\n description: 'A target with path and properties to set.',\r\n },\r\n },\r\n root: {\r\n type: 'string',\r\n description: 'Root instance path to search under (filter mode)',\r\n },\r\n className: {\r\n type: 'string',\r\n description: 'Only apply to instances of this ClassName (filter mode)',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Properties to set on all matched instances (filter mode)',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n modified?: number;\r\n errors?: string[];\r\n error?: string;\r\n }>(CliMsg.BULK_SET_PROPERTIES, {\r\n targets: params.targets,\r\n root: params.root,\r\n className: params.className,\r\n properties: params.properties,\r\n }, 1000 * 60);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Bulk set failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n modified: payload.modified,\r\n errors: payload.errors?.length ? payload.errors : undefined,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'find_replace_scripts',\r\n description:\r\n 'Find and replace text across all scripts in the game (or under a root path). ' +\r\n 'Supports plain text and Lua pattern matching. Returns a list of modified scripts with match counts.\\n\\n' +\r\n 'Use dryRun=true to preview changes without applying them.\\n' +\r\n 'Example: find=\"workspace\" replace=\"Workspace\" root=\"ServerScriptService\"',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n find: {\r\n type: 'string',\r\n description: 'Text or Lua pattern to search for',\r\n },\r\n replace: {\r\n type: 'string',\r\n description: 'Replacement text (supports Lua pattern captures like %1, %2)',\r\n },\r\n root: {\r\n type: 'string',\r\n description: 'Root path to limit search scope (optional, searches entire game if omitted)',\r\n },\r\n usePattern: {\r\n type: 'boolean',\r\n description: 'If true, treat find/replace as Lua patterns. Default: false (plain text)',\r\n },\r\n dryRun: {\r\n type: 'boolean',\r\n description: 'If true, report matches but do not modify scripts. Default: false',\r\n },\r\n },\r\n required: ['find', 'replace'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n modified?: { path: string; matches: number }[];\r\n totalMatches?: number;\r\n totalFiles?: number;\r\n error?: string;\r\n }>(CliMsg.FIND_REPLACE_SCRIPTS, {\r\n find: params.find,\r\n replace: params.replace,\r\n root: params.root,\r\n usePattern: params.usePattern ?? false,\r\n dryRun: params.dryRun ?? false,\r\n }, 1000 * 60 * 5);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Find/replace failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n totalFiles: payload.totalFiles,\r\n totalMatches: payload.totalMatches,\r\n modified: payload.modified,\r\n dryRun: params.dryRun ?? false,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolResult } from '../types.js';\r\nimport { recallFacts, getProjectSummaries } from '../../memory/store.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'recall_memory',\r\n description:\r\n 'Search your memory for previously learned facts about the current project. Use this to recall architecture decisions, patterns, known bugs, or user preferences.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n query: {\r\n type: 'string',\r\n description: 'What to search for in memory (e.g., \"player data storage\", \"combat system architecture\")',\r\n },\r\n limit: {\r\n type: 'number',\r\n description: 'Max number of facts to return (default: 10)',\r\n default: 10,\r\n },\r\n },\r\n required: ['query'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\r\n const query = params.query as string;\r\n const limit = (params.limit as number) ?? 10;\r\n const projectId = 'current';\r\n\r\n const facts = recallFacts(projectId, query, limit);\r\n const summaries = getProjectSummaries(projectId, 5);\r\n\r\n return {\r\n success: true,\r\n data: {\r\n facts: facts.map((f) => ({ content: f.content, category: f.category })),\r\n recentSessions: summaries.map((s) => s.summary),\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolResult } from '../types.js';\r\nimport { storeFact } from '../../memory/store.js';\r\nimport type { FactCategory } from '../../memory/types.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'remember',\r\n description:\r\n 'Store a fact about the current project in persistent memory. Use this to remember architecture decisions, patterns, bugs found, or user preferences so you can recall them in future sessions.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n fact: {\r\n type: 'string',\r\n description: 'The fact to remember (e.g., \"PlayerData DataStore uses key format Player_{UserId}\")',\r\n },\r\n category: {\r\n type: 'string',\r\n description: 'Category of the fact',\r\n enum: ['architecture', 'pattern', 'preference', 'bug', 'api', 'general'],\r\n },\r\n },\r\n required: ['fact', 'category'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\r\n const fact = params.fact as string;\r\n const category = (params.category as FactCategory) ?? 'general';\r\n const now = Date.now();\r\n\r\n storeFact({\r\n projectId: 'current',\r\n content: fact,\r\n category,\r\n source: 'agent',\r\n relevance: 1.0,\r\n createdAt: now,\r\n accessedAt: now,\r\n });\r\n\r\n return { success: true, data: { stored: fact, category } };\r\n },\r\n};\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport type { Tool, ToolContext, ToolResult } from '../types.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'upload_asset',\r\n description:\r\n 'Upload a local file (image, model, audio) to Roblox via the Open Cloud API. Requires an Open Cloud API key configured in dominus.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n filePath: {\r\n type: 'string',\r\n description: 'Local file path of the asset to upload',\r\n },\r\n assetType: {\r\n type: 'string',\r\n description: 'Type of asset',\r\n enum: ['Image', 'Audio', 'Model'],\r\n },\r\n name: {\r\n type: 'string',\r\n description: 'Display name for the asset on Roblox',\r\n },\r\n description: {\r\n type: 'string',\r\n description: 'Description of the asset',\r\n },\r\n },\r\n required: ['filePath', 'assetType', 'name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n const apiKey = ctx.config.get<string>('openCloudApiKey');\r\n if (!apiKey) {\r\n return {\r\n success: false,\r\n error: 'Open Cloud API key not configured. Run: dominus config set openCloudApiKey <key>',\r\n };\r\n }\r\n\r\n const filePath = params.filePath as string;\r\n const assetType = params.assetType as string;\r\n const name = params.name as string;\r\n const description = (params.description as string) ?? '';\r\n\r\n if (!fs.existsSync(filePath)) {\r\n return { success: false, error: `File not found: ${filePath}` };\r\n }\r\n\r\n const fileBuffer = fs.readFileSync(filePath);\r\n const fileName = path.basename(filePath);\r\n\r\n const typeMapping: Record<string, string> = {\r\n Image: 'Decal',\r\n Audio: 'Audio',\r\n Model: 'Model',\r\n };\r\n\r\n try {\r\n const formData = new FormData();\r\n const blob = new Blob([fileBuffer]);\r\n formData.append('fileContent', blob, fileName);\r\n formData.append(\r\n 'request',\r\n JSON.stringify({\r\n assetType: typeMapping[assetType] ?? assetType,\r\n displayName: name,\r\n description,\r\n creationContext: { creator: { userId: 'me' } },\r\n }),\r\n );\r\n\r\n const response = await fetch(\r\n 'https://apis.roblox.com/assets/v1/assets',\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'x-api-key': apiKey,\r\n },\r\n body: formData,\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n return { success: false, error: `Upload failed (${response.status}): ${text}` };\r\n }\r\n\r\n const data = await response.json();\r\n return {\r\n success: true,\r\n data: {\r\n assetId: data.assetId ?? data.id,\r\n operationId: data.operationId ?? data.path,\r\n name,\r\n type: assetType,\r\n },\r\n };\r\n } catch (err) {\r\n return {\r\n success: false,\r\n error: `Upload error: ${err instanceof Error ? err.message : String(err)}`,\r\n };\r\n }\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const undoTool: Tool = {\r\n name: 'undo',\r\n description:\r\n 'Undo the last action in Roblox Studio using ChangeHistoryService. ' +\r\n 'Works just like Ctrl+Z. Use this to roll back mistakes.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n error?: string;\r\n }>(CliMsg.UNDO, {});\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Undo failed' };\r\n }\r\n\r\n return { success: true, data: 'Undo performed' };\r\n },\r\n};\r\n\r\nexport const redoTool: Tool = {\r\n name: 'redo',\r\n description:\r\n 'Redo the last undone action in Roblox Studio using ChangeHistoryService. ' +\r\n 'Works just like Ctrl+Y.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n error?: string;\r\n }>(CliMsg.REDO, {});\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Redo failed' };\r\n }\r\n\r\n return { success: true, data: 'Redo performed' };\r\n },\r\n};\r\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { z } from 'zod';\r\nimport { DominusServer, type StudioBridge } from '../transport/ws-server.js';\r\nimport { DominusClient, isPortInUse } from '../transport/ws-client.js';\r\nimport { CliMsg, type ExplorerNode, type ScriptContentPayload, type RunCodeResponsePayload, type SearchResultPayload, type OutputPayload, type SelectionPayload, type PropertyEntry, type TestResultPayload, type StudioTestResultPayload } from '../transport/protocol.js';\r\nimport { initMemoryStore, recallFacts, storeFact, getScriptIndex } from '../memory/store.js';\r\nimport { loadConfig } from '../config/config.js';\r\nimport { INTERNAL_MEMORY } from '../agent/internal-memory.js';\r\n\r\nlet bridge: StudioBridge;\r\n\r\nexport async function startMcpServer(): Promise<void> {\r\n const config = loadConfig();\r\n await initMemoryStore();\r\n\r\n const portTaken = await isPortInUse(config.port);\r\n if (portTaken) {\r\n const client = new DominusClient(config.port);\r\n await client.connect();\r\n bridge = client;\r\n } else {\r\n const server = new DominusServer(config.port);\r\n await server.start();\r\n bridge = server;\r\n }\r\n\r\n const mcp = new McpServer({\r\n name: 'dominus',\r\n version: '0.6.0',\r\n }, {\r\n instructions: INTERNAL_MEMORY,\r\n });\r\n\r\n // --- Helpers: safe Lua string generation ---\r\n /** Escape a string for safe embedding in Lua code */\r\n function luaStr(s: string): string {\r\n return `\"${s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r')}\"`;\r\n }\r\n /** Convert a dot-path like \"Workspace.Folder.Part\" to game[\"Workspace\"][\"Folder\"][\"Part\"] */\r\n function resolvePath(dotPath: string): string {\r\n const parts = dotPath.split('.');\r\n let r = 'game';\r\n for (const p of parts) r += `[${luaStr(p)}]`;\r\n return r;\r\n }\r\n\r\n // --- Code Generation Helpers ---\r\n\r\n /** Round a number to 3 decimal places, drop trailing zeros. Integers stay as-is. */\r\n function cleanNum(n: number): string {\r\n if (Number.isInteger(n)) return String(n);\r\n // Round to 3 decimals, strip trailing zeros\r\n const rounded = Math.round(n * 1000) / 1000;\r\n return String(rounded);\r\n }\r\n\r\n /** Convert a serialized UI tree node into a Roact/React createElement call */\r\n function generateComponentCode(\r\n tree: Record<string, unknown>,\r\n componentName: string,\r\n framework: string,\r\n ): string {\r\n const isReact = framework === 'react';\r\n const lib = isReact ? 'React' : 'Roact';\r\n\r\n const lines: string[] = [];\r\n lines.push(`local ${lib} = require(game.ReplicatedStorage.Packages.${isReact ? 'React' : 'Roact'})`);\r\n if (isReact) {\r\n lines.push(`local e = React.createElement`);\r\n } else {\r\n lines.push(`local e = Roact.createElement`);\r\n }\r\n lines.push('');\r\n\r\n // Collect all ClassName types used so we can note them\r\n lines.push(`local function ${componentName}()`);\r\n lines.push(`\\treturn ${renderNode(tree, 1)}`);\r\n lines.push('end');\r\n lines.push('');\r\n lines.push(`return ${componentName}`);\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n function renderNode(node: Record<string, unknown>, depth: number): string {\r\n const indent = '\\t'.repeat(depth);\r\n const indent2 = '\\t'.repeat(depth + 1);\r\n const className = (node.ClassName as string) || 'Frame';\r\n const children = (node.Children as Record<string, unknown>[]) || [];\r\n const name = node.Name as string | undefined;\r\n\r\n // Build props table\r\n const props: string[] = [];\r\n const skipKeys = new Set(['ClassName', 'Name', 'Children', 'className', 'name', 'children']);\r\n for (const [key, val] of Object.entries(node)) {\r\n if (skipKeys.has(key)) continue;\r\n props.push(`${indent2}${key} = ${luaValue(val, depth + 1)},`);\r\n }\r\n\r\n // Build children table\r\n const childEntries: string[] = [];\r\n for (const child of children) {\r\n const childName = (child.Name as string) || (child.ClassName as string) || 'Child';\r\n childEntries.push(`${indent2}${childName} = ${renderNode(child, depth + 1)},`);\r\n }\r\n\r\n // Combine\r\n const hasProps = props.length > 0;\r\n const hasChildren = childEntries.length > 0;\r\n\r\n if (!hasProps && !hasChildren) {\r\n return `e(\"${className}\", {})`;\r\n }\r\n\r\n const parts: string[] = [];\r\n parts.push(`e(\"${className}\", {`);\r\n if (hasProps) {\r\n parts.push(...props);\r\n }\r\n if (hasChildren) {\r\n parts.push(`${indent2}}, {`);\r\n parts.push(...childEntries);\r\n parts.push(`${indent}})`);\r\n } else {\r\n parts.push(`${indent}})`);\r\n }\r\n\r\n return parts.join('\\n');\r\n }\r\n\r\n function luaValue(val: unknown, _depth: number): string {\r\n if (val === null || val === undefined) return 'nil';\r\n if (typeof val === 'boolean') return String(val);\r\n if (typeof val === 'number') return cleanNum(val);\r\n if (typeof val === 'string') {\r\n // Detect special Roblox types from serialize_ui output\r\n if (val.startsWith('#') && val.length === 7) {\r\n return `Color3.fromHex(\"${val}\")`;\r\n }\r\n // Enum-like strings (single word, PascalCase)\r\n if (/^[A-Z][a-zA-Z]+$/.test(val)) {\r\n return `\"${val}\"`; // keep as string, Roact handles enum coercion\r\n }\r\n return `\"${val.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')}\"`;\r\n }\r\n if (Array.isArray(val)) {\r\n // UDim2: [xS, xO, yS, yO]\r\n if (val.length === 4 && val.every(v => typeof v === 'number')) {\r\n return `UDim2.new(${val.map(cleanNum).join(', ')})`;\r\n }\r\n // Vector2 / UDim: [x, y]\r\n if (val.length === 2 && val.every(v => typeof v === 'number')) {\r\n return `Vector2.new(${val.map(cleanNum).join(', ')})`;\r\n }\r\n // Color3: [r, g, b]\r\n if (val.length === 3 && val.every(v => typeof v === 'number')) {\r\n const allSmall = val.every(v => (v as number) <= 1);\r\n if (allSmall) return `Color3.new(${val.map(cleanNum).join(', ')})`;\r\n return `Color3.fromRGB(${val.map(v => String(Math.round(v as number))).join(', ')})`;\r\n }\r\n return `{${val.map(v => luaValue(v, _depth)).join(', ')}}`;\r\n }\r\n if (typeof val === 'object') {\r\n const entries = Object.entries(val as Record<string, unknown>);\r\n if (entries.length === 0) return '{}';\r\n return `{\\n${entries.map(([k, v]) => `${'\\t'.repeat(_depth + 1)}${k} = ${luaValue(v, _depth + 1)}`).join(',\\n')}\\n${'\\t'.repeat(_depth)}}`;\r\n }\r\n return String(val);\r\n }\r\n\r\n // --- Studio Tools ---\r\n\r\n mcp.tool(\r\n 'read_script',\r\n 'Read the source code of a script in Roblox Studio',\r\n { path: z.string().describe('Full instance path, e.g. \"ServerScriptService.GameManager\"') },\r\n async ({ path }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<ScriptContentPayload>(CliMsg.GET_SCRIPT, { path });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'edit_script',\r\n 'Replace the entire source code of a script in Roblox Studio',\r\n {\r\n path: z.string().describe('Full instance path'),\r\n source: z.string().describe('New complete source code'),\r\n },\r\n async ({ path, source }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.SET_SCRIPT, { path, source });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'run_code',\r\n 'Execute arbitrary Luau code in Roblox Studio. LAST RESORT — only use when no dedicated tool exists. ' +\r\n 'Do NOT use for: reading properties (use get_properties/inspect_selection/serialize_ui), creating instances (use create_part/create_ui/insert_instance/build_multiple), ' +\r\n 'modifying properties (use set_properties/bulk_set_properties), or inspecting the tree (use get_explorer). ' +\r\n 'Valid uses: complex procedural generation, terrain algorithms, raycasting, physics queries, custom logic with no tool equivalent.',\r\n { code: z.string().describe('Luau code to execute') },\r\n async ({ code }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_explorer',\r\n 'Get the DataModel explorer tree from Roblox Studio',\r\n {\r\n rootPath: z.string().optional().describe('Root path to start from. Omit for entire tree.'),\r\n maxDepth: z.number().optional().default(3).describe('Maximum tree depth'),\r\n },\r\n async ({ rootPath, maxDepth }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ tree: ExplorerNode[] }>(CliMsg.GET_EXPLORER, {\r\n rootPath: rootPath ?? null,\r\n maxDepth,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_properties',\r\n 'Get all properties of a single instance in Roblox Studio. Returns property name, value, type, and category. For inspecting UI trees, prefer serialize_ui (structured tree) or get_descendants_properties (flat list with compact filtering).',\r\n {\r\n path: z.string().describe('Full instance path (e.g. \"Workspace.Part\", \"StarterGui.MyUI.Frame\")'),\r\n compact: z.boolean().optional().default(true).describe('Strip read-only, nil, deprecated, and default-valued properties (default true). Set false for full dump.'),\r\n },\r\n async ({ path, compact }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ properties: PropertyEntry[] }>(CliMsg.GET_PROPERTIES, { path, compact });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_descendants_properties',\r\n 'Easily get all descendants of a UI instance (or any instance) and all of their properties. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties to keep responses small.',\r\n { \r\n path: z.string().describe('Full instance path (e.g., \"Workspace.Part\", \"StarterGui.ScreenGui\")'),\r\n compact: z.boolean().optional().default(true).describe('Strip noisy/default properties (default true). Set false for full dump.'),\r\n outputFile: z.string().optional().describe('Optional file path to write to prevent limit errors/timeouts'),\r\n },\r\n async ({ path, compact, outputFile }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<unknown>(CliMsg.GET_DESCENDANTS_PROPERTIES, { path, compact, outputFile }, 1000 * 60 * 5);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'set_properties',\r\n 'Set properties on an instance in Roblox Studio',\r\n {\r\n path: z.string().describe('Full instance path'),\r\n properties: z.record(z.unknown()).describe('Key-value pairs of properties to set'),\r\n },\r\n async ({ path, properties }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.SET_PROPERTIES, { path, properties });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'insert_instance',\r\n 'Create a new instance in the Roblox Studio DataModel',\r\n {\r\n className: z.string().describe('Class name (e.g. \"Part\", \"Script\")'),\r\n parentPath: z.string().describe('Parent instance path'),\r\n name: z.string().describe('Name for the new instance'),\r\n properties: z.record(z.unknown()).optional().describe('Optional properties to set'),\r\n },\r\n async ({ className, parentPath, name, properties }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.INSERT_INSTANCE, {\r\n className, parentPath, name, properties: properties ?? {},\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'delete_instance',\r\n 'Delete an instance from the Roblox Studio DataModel',\r\n { path: z.string().describe('Full instance path to delete') },\r\n async ({ path }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.DELETE_INSTANCE, { path });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_selection',\r\n 'Get the currently selected instances in Roblox Studio. Returns paths and class names of all selected objects. ' +\r\n 'Use this FIRST when the user says \"my selection\" or \"what I have selected\". ' +\r\n 'Then use get_properties or serialize_ui on the returned paths to inspect details.',\r\n {},\r\n async () => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'search_scripts',\r\n 'Search all scripts in Roblox Studio for a text pattern',\r\n {\r\n query: z.string().describe('Text to search for'),\r\n maxResults: z.number().optional().default(20).describe('Max results'),\r\n },\r\n async ({ query, maxResults }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<SearchResultPayload>(CliMsg.SEARCH_SCRIPTS, { query, maxResults });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_output',\r\n 'Get recent output log from Roblox Studio',\r\n {\r\n limit: z.number().optional().default(50).describe('Max entries'),\r\n level: z.enum(['info', 'warn', 'error']).optional().describe('Filter by level'),\r\n },\r\n async ({ limit, level }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ entries: OutputPayload[] }>(CliMsg.GET_OUTPUT, {\r\n limit, level: level ?? null,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_class_info',\r\n 'Look up the schema of any Roblox class using ReflectionService. Returns all properties (with types), methods (with parameters), and events. ' +\r\n 'ALWAYS use this before creating or modifying GUI elements to know correct property names and types.',\r\n { className: z.string().describe('Roblox class name, e.g. \"Frame\", \"TextLabel\", \"Part\", \"MeshPart\"') },\r\n async ({ className }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<unknown>(CliMsg.GET_REFLECTION, { className });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'create_ui',\r\n 'Create an entire UI tree in one call. Pass a declarative JSON tree — ClassName, Name, properties, Children. ' +\r\n 'All types auto-coerced in Luau (UDim2, Color3, Font, enums). 10x faster than run_code. ' +\r\n 'UDim2: [xScale, xOffset, yScale, yOffset]. Color3: \"#hex\" or \"rgb(r,g,b)\". Font: \"GothamBold\". Enums: string names.',\r\n {\r\n parent: z.string().optional().describe('Parent: \"StarterGui\", \"PlayerGui\", or path. Default: StarterGui'),\r\n tree: z.record(z.unknown()).describe(\r\n 'Root UI node: {ClassName, Name, properties..., Children: [{...}, ...]}. ' +\r\n 'UDim2 as [xScale, xOffset, yScale, yOffset], Color3 as \"#hex\", Font as \"GothamBold\"',\r\n ),\r\n animate: z.boolean().optional().describe('If true, task.wait() will be injected between creation of nodes so that the UI writes out dynamically.'),\r\n },\r\n async ({ parent, tree, animate }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ success: boolean; path?: string; instanceCount?: number; error?: string }>(\r\n CliMsg.BUILD_UI, { parent: parent ?? 'StarterGui', tree, animate },\r\n );\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'run_tests',\r\n 'Run tests by requiring ModuleScripts matching test naming conventions (*.test, *.spec, *Test, *Spec). Lightweight — does not enter Run/Play mode.',\r\n { testName: z.string().optional().describe('Specific test name, or omit to run all') },\r\n async ({ testName }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ results: TestResultPayload[] }>(CliMsg.RUN_TESTS, {\r\n testName: testName ?? null,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'execute_run_test',\r\n 'Start a Run mode test session using StudioTestService:ExecuteRunModeAsync(). ' +\r\n 'This actually enters Run mode in Studio. Pass args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until EndTest() is called or the session stops. Returns the value from EndTest(). ' +\r\n 'Use for headless automated tests — no player, just server scripts.',\r\n { args: z.unknown().optional().describe('Arguments passed to the test session. Server scripts get this via StudioTestService:GetTestArgs()') },\r\n async ({ args }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<StudioTestResultPayload>(CliMsg.EXECUTE_RUN_TEST, { args: args ?? null }, 120_000);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'execute_play_test',\r\n 'Start a solo Play mode test session using StudioTestService:ExecutePlayModeAsync(). ' +\r\n 'This enters Play mode with a player character. Pass args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until EndTest() is called or the session stops. Returns the value from EndTest(). ' +\r\n 'Use for tests needing a player character and full client-server simulation.',\r\n { args: z.unknown().optional().describe('Arguments passed to the test session. Server scripts get this via StudioTestService:GetTestArgs()') },\r\n async ({ args }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<StudioTestResultPayload>(CliMsg.EXECUTE_PLAY_TEST, { args: args ?? null }, 120_000);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- Builder Tools ---\r\n\r\n mcp.tool(\r\n 'create_part',\r\n 'Create a Part with position, size, color, material — all in one call. Faster than insert_instance + set_properties.',\r\n {\r\n name: z.string().describe('Name for the part'),\r\n parent: z.string().optional().describe('Parent path (default: Workspace)'),\r\n shape: z.enum(['Block', 'Ball', 'Cylinder', 'Wedge', 'CornerWedge']).optional().describe('Part shape'),\r\n position: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('World position'),\r\n size: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('Size in studs'),\r\n color: z.string().optional().describe('Hex \"#00FF00\", BrickColor name, or \"rgb(0,255,0)\"'),\r\n material: z.string().optional().describe('Plastic, Wood, Grass, Neon, Metal, etc.'),\r\n transparency: z.number().optional().describe('0=opaque, 1=invisible'),\r\n anchored: z.boolean().optional().describe('Anchored (default: true)'),\r\n canCollide: z.boolean().optional().describe('Has collision'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const properties: Record<string, unknown> = {};\r\n if (params.position) properties.Position = { X: params.position.x, Y: params.position.y, Z: params.position.z };\r\n if (params.size) properties.Size = { X: params.size.x, Y: params.size.y, Z: params.size.z };\r\n if (params.color) {\r\n const c = params.color;\r\n if (c.startsWith('#')) properties.Color = c;\r\n else if (c.startsWith('rgb')) {\r\n const m = c.match(/(\\d+)/g);\r\n if (m && m.length >= 3) properties.Color = { red: parseInt(m[0]), green: parseInt(m[1]), blue: parseInt(m[2]) };\r\n } else properties.BrickColor = c;\r\n }\r\n if (params.material) properties.Material = params.material;\r\n if (params.transparency !== undefined) properties.Transparency = params.transparency;\r\n if (params.anchored !== undefined) properties.Anchored = params.anchored;\r\n else properties.Anchored = true;\r\n if (params.canCollide !== undefined) properties.CanCollide = params.canCollide;\r\n if (params.shape && params.shape !== 'Block') properties.Shape = params.shape;\r\n\r\n const className = params.shape === 'Wedge' ? 'WedgePart' : params.shape === 'CornerWedge' ? 'CornerWedgePart' : 'Part';\r\n\r\n const res = await bridge.sendRequest<{ success: boolean; path?: string; error?: string }>(CliMsg.INSERT_INSTANCE, {\r\n className,\r\n parentPath: params.parent ?? 'Workspace',\r\n name: params.name,\r\n properties,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'clone_instance',\r\n 'Clone an existing instance, optionally rename it, move it, or offset its position',\r\n {\r\n path: z.string().describe('Path of instance to clone'),\r\n newName: z.string().optional().describe('Name for the clone'),\r\n newParent: z.string().optional().describe('Parent path for the clone'),\r\n offset: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('Position offset from original'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const lines = [`local orig = ${resolvePath(params.path)}`, `local clone = orig:Clone()`];\r\n if (params.newName) lines.push(`clone.Name = ${luaStr(params.newName)}`);\r\n if (params.newParent) {\r\n lines.push(`clone.Parent = ${resolvePath(params.newParent)}`);\r\n } else {\r\n lines.push(`clone.Parent = orig.Parent`);\r\n }\r\n if (params.offset) {\r\n lines.push(`if clone:IsA(\"BasePart\") then`);\r\n lines.push(` clone.Position = clone.Position + Vector3.new(${params.offset.x}, ${params.offset.y}, ${params.offset.z})`);\r\n lines.push(`end`);\r\n }\r\n lines.push(`print(\"Cloned: \" .. clone:GetFullName())`);\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code: lines.join('\\n') });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'group_instances',\r\n 'Group multiple instances into a Model or Folder. All listed instances become children of the new group.',\r\n {\r\n paths: z.array(z.string()).describe('Array of instance paths to group'),\r\n groupName: z.string().describe('Name for the group'),\r\n groupClass: z.enum(['Model', 'Folder']).optional().describe('Container class (default: Model)'),\r\n parent: z.string().optional().describe('Parent path (default: Workspace)'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const gc = params.groupClass ?? 'Model';\r\n const parent = params.parent ?? 'Workspace';\r\n\r\n const code = [\r\n `local group = Instance.new(${luaStr(gc)})`,\r\n `group.Name = ${luaStr(params.groupName)}`,\r\n `group.Parent = ${resolvePath(parent)}`,\r\n ...params.paths.map((p) => `${resolvePath(p)}.Parent = group`),\r\n `print(\"Grouped ${params.paths.length} instances into: \" .. group:GetFullName())`,\r\n ].join('\\n');\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'build_multiple',\r\n 'Create many parts/instances in one batch. Send an array of specs — all created in a single round-trip. Ideal for building trees, houses, vehicles. Supports hex colors, rgb() colors, and BrickColor names.',\r\n {\r\n parts: z.array(z.object({\r\n name: z.string(),\r\n className: z.string().optional(),\r\n parent: z.string().optional(),\r\n position: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional(),\r\n size: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional(),\r\n color: z.string().optional().describe('Hex \"#RRGGBB\", \"rgb(r,g,b)\", or BrickColor name'),\r\n material: z.string().optional().describe('Enum.Material name: Plastic, Wood, Neon, Glass, etc.'),\r\n transparency: z.number().optional(),\r\n anchored: z.boolean().optional(),\r\n canCollide: z.boolean().optional(),\r\n shape: z.enum(['Block', 'Ball', 'Cylinder', 'Wedge']).optional(),\r\n })).describe('Array of part specifications'),\r\n groupName: z.string().optional().describe('Group all parts into a Model with this name'),\r\n groupParent: z.string().optional().describe('Parent for the group (default: Workspace)'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const parts = params.parts;\r\n const groupName = params.groupName;\r\n const groupParent = params.groupParent ?? 'Workspace';\r\n\r\n const lines: string[] = [];\r\n if (groupName) {\r\n lines.push(`local _group = Instance.new(\"Model\")`);\r\n lines.push(`_group.Name = ${luaStr(groupName)}`);\r\n lines.push(`_group.Parent = ${resolvePath(groupParent)}`);\r\n }\r\n for (let i = 0; i < parts.length; i++) {\r\n const p = parts[i];\r\n const v = `_p${i}`;\r\n const cn = p.className ?? (p.shape === 'Wedge' ? 'WedgePart' : 'Part');\r\n lines.push(`local ${v} = Instance.new(${luaStr(cn)})`);\r\n lines.push(`${v}.Name = ${luaStr(p.name)}`);\r\n if (p.position) lines.push(`${v}.Position = Vector3.new(${p.position.x}, ${p.position.y}, ${p.position.z})`);\r\n if (p.size) lines.push(`${v}.Size = Vector3.new(${p.size.x}, ${p.size.y}, ${p.size.z})`);\r\n if (p.color) {\r\n if (p.color.startsWith('#')) {\r\n lines.push(`${v}.Color = Color3.fromHex(${luaStr(p.color)})`);\r\n } else if (p.color.startsWith('rgb(')) {\r\n const m = p.color.match(/rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/);\r\n if (m) lines.push(`${v}.Color = Color3.fromRGB(${m[1]}, ${m[2]}, ${m[3]})`);\r\n } else {\r\n lines.push(`${v}.BrickColor = BrickColor.new(${luaStr(p.color)})`);\r\n }\r\n }\r\n if (p.material) lines.push(`${v}.Material = Enum.Material.${p.material}`);\r\n if (p.transparency !== undefined) lines.push(`${v}.Transparency = ${p.transparency}`);\r\n lines.push(`${v}.Anchored = ${p.anchored ?? true}`);\r\n if (p.canCollide !== undefined) lines.push(`${v}.CanCollide = ${p.canCollide}`);\r\n if (p.shape && p.shape !== 'Block' && cn === 'Part') lines.push(`${v}.Shape = Enum.PartType.${p.shape}`);\r\n lines.push(`${v}.Parent = ${groupName ? '_group' : resolvePath(p.parent ?? 'Workspace')}`);\r\n }\r\n lines.push(`print(\"Built ${parts.length} parts${groupName ? ` in ${groupName}` : ''}\")`);\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code: lines.join('\\n') });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- UI Serialization ---\r\n\r\n mcp.tool(\r\n 'serialize_ui',\r\n 'Serialize an existing Roblox UI tree into a compact, create_ui-compatible JSON tree. ' +\r\n 'This is the reverse of create_ui — reads any GUI instance and returns a declarative JSON tree ' +\r\n 'with ClassName, Name, non-default properties (Color3 as hex, UDim2 as arrays, etc.), and Children. ' +\r\n 'Perfect for: converting existing UI to Roact/React components, cloning/templating, understanding UI structure, ' +\r\n 'or refactoring. Use this INSTEAD of get_descendants_properties when you need to recreate or convert UI.',\r\n {\r\n path: z.string().describe('Instance path to serialize (e.g. \"StarterGui.MyScreenGui\")'),\r\n maxDepth: z.number().optional().default(50).describe('Maximum tree depth (default 50)'),\r\n },\r\n async ({ path, maxDepth }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ success: boolean; tree?: unknown; error?: string }>(\r\n CliMsg.SERIALIZE_UI, { path, maxDepth }, 1000 * 60 * 2,\r\n );\r\n if (!res.payload.success) {\r\n return { content: [{ type: 'text' as const, text: `Error: ${res.payload.error ?? 'Serialization failed'}` }] };\r\n }\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload.tree, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- Composite Skill Tools ---\r\n // Higher-level tools that combine multiple operations into a single call.\r\n // These prevent LLMs from falling back to run_code for common workflows.\r\n\r\n mcp.tool(\r\n 'inspect_selection',\r\n 'Inspect the user\\'s current selection in Roblox Studio. Returns the selected instance paths AND their properties (compact) in a single call. ' +\r\n 'Use this FIRST when the user says \"my selection\", \"what I selected\", or \"the selected thing\". ' +\r\n 'Much better than calling get_selection + get_properties separately.',\r\n {},\r\n async () => {\r\n assertConnected();\r\n // Step 1: get selection\r\n const selRes = await bridge.sendRequest<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n const paths: string[] = selRes.payload?.paths ?? [];\r\n if (paths.length === 0) {\r\n return { content: [{ type: 'text' as const, text: 'No instances selected in Studio.' }] };\r\n }\r\n\r\n // Step 2: get compact properties for each selected instance\r\n const results: Record<string, unknown> = {};\r\n for (const p of paths.slice(0, 10)) { // cap at 10 to avoid huge payloads\r\n try {\r\n const propRes = await bridge.sendRequest<{ properties?: PropertyEntry[]; error?: string }>(\r\n CliMsg.GET_PROPERTIES, { path: p, compact: true },\r\n );\r\n results[p] = propRes.payload.properties ?? propRes.payload;\r\n } catch {\r\n results[p] = { error: 'Failed to read properties' };\r\n }\r\n }\r\n if (paths.length > 10) {\r\n results['_truncated'] = `${paths.length - 10} more instances not shown`;\r\n }\r\n\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(results, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'inspect_instance',\r\n 'Inspect a single instance: returns its compact properties AND its children tree in one call. ' +\r\n 'Combines get_properties + get_explorer into a single round-trip. ' +\r\n 'Use when you need to understand an instance and its subtree.',\r\n {\r\n path: z.string().describe('Full instance path (e.g. \"Workspace.MyModel\")'),\r\n childDepth: z.number().optional().default(2).describe('How deep to show the children tree (default 2)'),\r\n },\r\n async ({ path, childDepth }) => {\r\n assertConnected();\r\n // Parallel: get properties + get children tree\r\n const [propRes, treeRes] = await Promise.all([\r\n bridge.sendRequest<{ properties?: PropertyEntry[]; error?: string }>(\r\n CliMsg.GET_PROPERTIES, { path, compact: true },\r\n ),\r\n bridge.sendRequest<{ tree?: ExplorerNode; error?: string }>(\r\n CliMsg.GET_EXPLORER, { rootPath: path, maxDepth: childDepth ?? 2 },\r\n ),\r\n ]);\r\n\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({\r\n properties: propRes.payload.properties ?? propRes.payload,\r\n children: treeRes.payload.tree ?? treeRes.payload,\r\n }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'convert_ui_to_code',\r\n 'Convert an existing Roblox UI tree into Roact/React-lua component code. ' +\r\n 'Serializes the UI at the given path, then generates a ready-to-use Luau component. ' +\r\n 'Use when the user asks to \"turn this into a component\", \"convert to React\", or \"make a Roact version\".',\r\n {\r\n path: z.string().describe('Path to the UI instance to convert (e.g. \"StarterGui.MyScreenGui.MainFrame\")'),\r\n framework: z.enum(['roact', 'react']).optional().default('react').describe('Target framework: \"roact\" (legacy) or \"react\" (react-lua, default)'),\r\n componentName: z.string().optional().describe('Name for the generated component (defaults to instance Name)'),\r\n },\r\n async ({ path, framework, componentName }) => {\r\n assertConnected();\r\n // Step 1: serialize the UI tree\r\n const res = await bridge.sendRequest<{ success: boolean; tree?: Record<string, unknown>; error?: string }>(\r\n CliMsg.SERIALIZE_UI, { path, maxDepth: 50 }, 1000 * 60 * 2,\r\n );\r\n if (!res.payload.success || !res.payload.tree) {\r\n return { content: [{ type: 'text' as const, text: `Error serializing UI: ${res.payload.error ?? 'Unknown error'}` }] };\r\n }\r\n\r\n const tree = res.payload.tree;\r\n const name = componentName || (tree.Name as string) || 'GeneratedComponent';\r\n const fw = framework || 'react';\r\n\r\n // Step 2: generate code from the serialized tree\r\n const code = generateComponentCode(tree, name, fw);\r\n return { content: [{ type: 'text' as const, text: code }] };\r\n },\r\n );\r\n\r\n // --- Connection Management Tools ---\r\n\r\n mcp.tool(\r\n 'list_connections',\r\n 'List all Roblox Studio instances currently connected to Dominus. Shows placeId, placeName, and connection time for each. Use this when working with multiple Studio windows.',\r\n {},\r\n async () => {\r\n const connections = bridge.listConnections();\r\n const activePlaceId = bridge.getActivePlaceId();\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({\r\n activePlaceId: activePlaceId || 'auto',\r\n connections: connections.map(c => ({\r\n ...c,\r\n active: activePlaceId === 0 && connections.length === 1 ? true\r\n : c.placeId === activePlaceId,\r\n })),\r\n }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'set_active_place',\r\n 'Set which Roblox Studio instance to target when multiple are connected. Pass placeId=0 to reset to auto mode (works when only one is connected). ' +\r\n 'Call list_connections first to see available placeIds.',\r\n {\r\n placeId: z.number().describe('The placeId to target. Use 0 to reset to auto-select.'),\r\n },\r\n async ({ placeId }) => {\r\n const connections = bridge.listConnections();\r\n if (placeId !== 0 && !connections.some(c => c.placeId === placeId)) {\r\n const available = connections.map(c => `${c.placeName ?? 'Unknown'} (${c.placeId})`).join(', ');\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: `Place ${placeId} is not connected. Available: ${available || 'none'}`,\r\n }],\r\n };\r\n }\r\n bridge.setActivePlaceId(placeId);\r\n if (placeId === 0) {\r\n return { content: [{ type: 'text' as const, text: 'Active place reset to auto-select.' }] };\r\n }\r\n const target = connections.find(c => c.placeId === placeId);\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: `Active place set to ${target?.placeName ?? 'Unknown'} (${placeId})`,\r\n }],\r\n };\r\n },\r\n );\r\n\r\n // --- Memory Tools ---\r\n\r\n mcp.tool(\r\n 'recall_memory',\r\n 'Search persistent memory for facts about the current Roblox project',\r\n { query: z.string().describe('What to search for') },\r\n async ({ query }) => {\r\n const facts = recallFacts('current', query, 15);\r\n const scripts = getScriptIndex('current');\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({ facts: facts.map(f => f.content), scriptIndex: scripts }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'remember',\r\n 'Store a fact about the project in persistent memory for future sessions',\r\n {\r\n fact: z.string().describe('The fact to remember'),\r\n category: z.enum(['architecture', 'pattern', 'preference', 'bug', 'api', 'general']).describe('Category'),\r\n },\r\n async ({ fact, category }) => {\r\n const now = Date.now();\r\n storeFact({ projectId: 'current', content: fact, category, source: 'mcp', relevance: 1.0, createdAt: now, accessedAt: now });\r\n return { content: [{ type: 'text' as const, text: `Remembered: ${fact}` }] };\r\n },\r\n );\r\n\r\n // --- Resources ---\r\n\r\n mcp.resource(\r\n 'studio://status',\r\n 'studio://status',\r\n async () => {\r\n const info = bridge.getConnectionInfo();\r\n return {\r\n contents: [{\r\n uri: 'studio://status',\r\n text: JSON.stringify({\r\n connected: bridge.isConnected(),\r\n placeName: info?.placeName,\r\n placeId: info?.placeId,\r\n studioVersion: info?.studioVersion,\r\n port: bridge.getPort(),\r\n }, null, 2),\r\n mimeType: 'application/json',\r\n }],\r\n };\r\n },\r\n );\r\n\r\n // Start the MCP server on stdio\r\n const transport = new StdioServerTransport();\r\n await mcp.connect(transport);\r\n}\r\n\r\nfunction assertConnected(): void {\r\n if (!bridge.isConnected()) {\r\n throw new Error(\r\n 'Roblox Studio is not connected. Open Studio and click the Dominus plugin Connect button.',\r\n );\r\n }\r\n}\r\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nconst CROWN_ART = ` ◆ ◆ ◆\n ╔█╗ ╔█╗ ╔█╗\n ║█║ ║█║ ║█║\n ╚█╚═════╝█╚═════╝█╝\n ╚═══════════════╝`;\n\nfunction getGreeting(name: string): string {\n const hour = new Date().getHours();\n if (hour >= 5 && hour < 12) return `Good morning ${name}!`;\n if (hour >= 12 && hour < 17) return `Good afternoon ${name}!`;\n if (hour >= 17 && hour < 21) return `Good evening ${name}!`;\n return `Burning the midnight oil, ${name}!`;\n}\n\ninterface WelcomeProps {\n userName: string;\n version: string;\n model: string;\n provider: string;\n port: number;\n hasApiKey: boolean;\n connected: boolean;\n cwd: string;\n}\n\nexport const Welcome: React.FC<WelcomeProps> = React.memo(({\n userName,\n version,\n model,\n provider,\n port,\n hasApiKey,\n connected,\n cwd,\n}) => {\n const greeting = getGreeting(userName);\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {/* Header */}\n <Box\n borderStyle=\"round\"\n borderColor=\"magenta\"\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text bold color=\"magenta\">\n Dominus v{version}\n </Text>\n <Text dimColor>AI-Powered Roblox Studio Agent</Text>\n </Box>\n\n {/* Main content: two columns */}\n <Box>\n {/* Left column: greeting + mascot */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n width=\"50%\"\n >\n <Text bold color=\"cyan\">\n {greeting}\n </Text>\n <Text> </Text>\n\n {CROWN_ART.split('\\n').map((line, i) => (\n <Text key={i} color=\"yellow\">\n {line}\n </Text>\n ))}\n\n <Text> </Text>\n <Text dimColor>\n {provider} · {model || 'no model set'}\n </Text>\n <Text dimColor>{cwd}</Text>\n </Box>\n\n {/* Right column: tips or setup */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n width=\"50%\"\n >\n {hasApiKey ? (\n <>\n <Text bold color=\"yellow\">\n Tips for getting started\n </Text>\n <Text>\n Just type a message to chat with the AI agent\n </Text>\n <Text>\n Use <Text color=\"cyan\">/help</Text> to see all commands\n </Text>\n <Text>\n Use <Text color=\"cyan\">/run {'<code>'}</Text> to execute Luau in Studio\n </Text>\n <Text> </Text>\n <Text bold color=\"yellow\">\n Studio connection\n </Text>\n {connected ? (\n <Text color=\"green\">● Connected to Roblox Studio</Text>\n ) : (\n <>\n <Text color=\"red\">○ Waiting for Studio plugin...</Text>\n <Text dimColor>WebSocket server on port {port}</Text>\n <Text dimColor>\n Run <Text color=\"cyan\">dominus install-plugin</Text> if needed\n </Text>\n </>\n )}\n </>\n ) : (\n <>\n <Text bold color=\"yellow\">\n Setup — pick any provider\n </Text>\n <Text> </Text>\n <Text>\n <Text color=\"green\" bold>OpenAI </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">OPENAI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Anthropic </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">ANTHROPIC_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Gemini </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">GEMINI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Grok (xAI) </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">XAI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>OpenRouter </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">OPENROUTER_API_KEY</Text>\n </Text>\n <Text> </Text>\n <Text dimColor>Or configure manually:</Text>\n <Text>\n <Text color=\"cyan\">dominus config set provider openai</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">dominus config set apiKey sk-...</Text>\n </Text>\n </>\n )}\n </Box>\n </Box>\n </Box>\n );\n});\n","import React, { useState } from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport TextInput from 'ink-text-input';\r\nimport { PROVIDERS, type AIProviderType } from '../../config/config.js';\r\n\r\ninterface SetupProps {\r\n onComplete: (provider: AIProviderType, apiKey: string) => void;\r\n}\r\n\r\nconst PROVIDER_OPTIONS: { key: AIProviderType; label: string; hint: string }[] = [\r\n { key: 'openai', label: 'OpenAI', hint: 'GPT-5.3, GPT-5.2, o3-mini' },\r\n { key: 'anthropic', label: 'Anthropic', hint: 'Claude Opus 4-6, Sonnet 4-6' },\r\n { key: 'gemini', label: 'Google Gemini', hint: 'Gemini 3.1 Pro, 2.0 Flash' },\r\n { key: 'xai', label: 'xAI (Grok)', hint: 'Grok 4.2, Grok 3' },\r\n { key: 'openrouter', label: 'OpenRouter', hint: '300+ models, one key' },\r\n];\r\n\r\nexport const Setup: React.FC<SetupProps> = ({ onComplete }) => {\r\n const [step, setStep] = useState<'provider' | 'key'>('provider');\r\n const [selectedIdx, setSelectedIdx] = useState(0);\r\n const [selectedProvider, setSelectedProvider] = useState<AIProviderType>('openai');\r\n const [apiKey, setApiKey] = useState('');\r\n\r\n useInput((input, key) => {\r\n if (step !== 'provider') return;\r\n\r\n if (key.upArrow) {\r\n setSelectedIdx((prev) => Math.max(0, prev - 1));\r\n } else if (key.downArrow) {\r\n setSelectedIdx((prev) => Math.min(PROVIDER_OPTIONS.length - 1, prev + 1));\r\n } else if (key.return) {\r\n setSelectedProvider(PROVIDER_OPTIONS[selectedIdx].key);\r\n setStep('key');\r\n }\r\n });\r\n\r\n const handleKeySubmit = (value: string) => {\r\n const trimmed = value.trim();\r\n if (trimmed) {\r\n onComplete(selectedProvider, trimmed);\r\n }\r\n };\r\n\r\n const providerInfo = PROVIDERS[selectedProvider];\r\n\r\n return (\r\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\r\n <Text bold color=\"magenta\">\r\n ◆ Dominus — First Time Setup\r\n </Text>\r\n <Text> </Text>\r\n\r\n {step === 'provider' && (\r\n <>\r\n <Text bold>Select your AI provider:</Text>\r\n <Text> </Text>\r\n {PROVIDER_OPTIONS.map((opt, i) => (\r\n <Box key={opt.key}>\r\n <Text color={i === selectedIdx ? 'cyan' : undefined} bold={i === selectedIdx}>\r\n {i === selectedIdx ? ' ❯ ' : ' '}\r\n {opt.label}\r\n </Text>\r\n <Text dimColor> {opt.hint}</Text>\r\n </Box>\r\n ))}\r\n <Text> </Text>\r\n <Text dimColor>↑/↓ to select, Enter to confirm</Text>\r\n </>\r\n )}\r\n\r\n {step === 'key' && (\r\n <>\r\n <Text>\r\n Provider: <Text color=\"cyan\" bold>{PROVIDERS[selectedProvider].name}</Text>\r\n </Text>\r\n <Text>\r\n Default model: <Text color=\"green\">{providerInfo.defaultModel}</Text>\r\n </Text>\r\n <Text> </Text>\r\n <Text bold>Enter your API key:</Text>\r\n <Text dimColor>\r\n Get one from your provider's dashboard\r\n </Text>\r\n <Text> </Text>\r\n <Box>\r\n <Text color=\"cyan\">❯ </Text>\r\n <TextInput\r\n value={apiKey}\r\n onChange={setApiKey}\r\n onSubmit={handleKeySubmit}\r\n mask=\"*\"\r\n placeholder=\"sk-...\"\r\n />\r\n </Box>\r\n </>\r\n )}\r\n </Box>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\ninterface StatusBarProps {\r\n connected: boolean;\r\n placeName?: string;\r\n connectionCount?: number;\r\n model: string;\r\n sessionTokens?: number;\r\n}\r\n\r\nexport const StatusBar: React.FC<StatusBarProps> = React.memo(({\r\n connected,\r\n placeName,\r\n connectionCount,\r\n model,\r\n sessionTokens,\r\n}) => {\r\n const statusColor = connected ? 'green' : 'red';\r\n const count = connectionCount ?? (connected ? 1 : 0);\r\n let statusText: string;\r\n if (!connected) {\r\n statusText = '○ Disconnected';\r\n } else if (count > 1) {\r\n statusText = `● ${count} Studios${placeName ? ` — active: ${placeName}` : ''}`;\r\n } else {\r\n statusText = `● Connected${placeName ? ` — ${placeName}` : ''}`;\r\n }\r\n const shortModel = model.split('/').pop() ?? model;\r\n\r\n return (\r\n <Box\r\n borderStyle=\"single\"\r\n borderColor=\"gray\"\r\n paddingX={1}\r\n justifyContent=\"space-between\"\r\n width=\"100%\"\r\n >\r\n <Box gap={2}>\r\n <Text bold color=\"magenta\">\r\n DOMINUS\r\n </Text>\r\n <Text color={statusColor}>{statusText}</Text>\r\n </Box>\r\n <Box gap={2}>\r\n {sessionTokens !== undefined && (\r\n <Text dimColor>~{Math.round(sessionTokens / 1000)}k tokens</Text>\r\n )}\r\n <Text color=\"cyan\">{shortModel}</Text>\r\n <Text dimColor>Ctrl+C to quit</Text>\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface OutputEntry {\r\n message: string;\r\n level: 'info' | 'warn' | 'error';\r\n timestamp: number;\r\n source?: string;\r\n}\r\n\r\ninterface OutputPaneProps {\r\n entries: OutputEntry[];\r\n maxLines?: number;\r\n}\r\n\r\nfunction formatTime(ts: number): string {\r\n const d = new Date(ts);\r\n return d.toLocaleTimeString('en-US', { hour12: false });\r\n}\r\n\r\nconst LEVEL_COLORS: Record<string, string> = {\r\n info: 'white',\r\n warn: 'yellow',\r\n error: 'red',\r\n};\r\n\r\nconst LEVEL_ICONS: Record<string, string> = {\r\n info: '│',\r\n warn: '⚠',\r\n error: '✖',\r\n};\r\n\r\nexport const OutputPane: React.FC<OutputPaneProps> = React.memo(({ entries, maxLines = 10 }) => {\r\n const visible = entries.slice(-maxLines);\r\n\r\n return (\r\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\r\n <Text bold dimColor>\r\n Output\r\n </Text>\r\n {visible.length === 0 ? (\r\n <Text dimColor italic>\r\n Waiting for Studio output...\r\n </Text>\r\n ) : (\r\n visible.map((entry, i) => (\r\n <Text key={i} color={LEVEL_COLORS[entry.level] ?? 'white'}>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>{' '}\r\n <Text>{LEVEL_ICONS[entry.level] ?? '│'}</Text> {entry.message}\r\n </Text>\r\n ))\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface ChatEntry {\r\n role: 'user' | 'assistant' | 'tool' | 'error' | 'system';\r\n content: string;\r\n toolName?: string;\r\n timestamp: number;\r\n}\r\n\r\ninterface ChatPaneProps {\r\n entries: ChatEntry[];\r\n streaming?: string;\r\n maxLines?: number;\r\n}\r\n\r\nfunction formatTime(ts: number): string {\r\n const d = new Date(ts);\r\n return d.toLocaleTimeString('en-US', { hour12: false });\r\n}\r\n\r\nexport const ChatPane: React.FC<ChatPaneProps> = React.memo(({ entries, streaming, maxLines = 20 }) => {\r\n const visible = entries.slice(-maxLines);\r\n\r\n return (\r\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\r\n {visible.map((entry, i) => (\r\n <Box key={i} flexDirection=\"column\" marginBottom={entry.role === 'user' ? 1 : 0}>\r\n {entry.role === 'user' && (\r\n <Box>\r\n <Text color=\"cyan\" bold>\r\n You{' '}\r\n </Text>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>\r\n </Box>\r\n )}\r\n {entry.role === 'assistant' && (\r\n <Box>\r\n <Text color=\"magenta\" bold>\r\n Dominus{' '}\r\n </Text>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>\r\n </Box>\r\n )}\r\n {entry.role === 'tool' && (\r\n <Text color=\"yellow\">\r\n ⚡ {entry.toolName ?? 'tool'}: {entry.content}\r\n </Text>\r\n )}\r\n {entry.role === 'system' && (\r\n <Text color=\"yellow\" bold>Dominus </Text>\r\n )}\r\n {entry.role === 'error' && (\r\n <Text color=\"red\">✖ Error: {entry.content}</Text>\r\n )}\r\n {(entry.role === 'user' || entry.role === 'assistant' || entry.role === 'system') && (\r\n <Text wrap=\"wrap\">{entry.content}</Text>\r\n )}\r\n </Box>\r\n ))}\r\n\r\n {streaming && (\r\n <Box flexDirection=\"column\">\r\n <Box>\r\n <Text color=\"magenta\" bold>\r\n Dominus{' '}\r\n </Text>\r\n <Text dimColor>(typing...)</Text>\r\n </Box>\r\n <Text wrap=\"wrap\">{streaming}</Text>\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import { execSync } from 'node:child_process';\r\nimport { tmpdir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { readFileSync, unlinkSync, existsSync } from 'node:fs';\r\nimport { randomBytes } from 'node:crypto';\r\n\r\nexport interface ClipboardImage {\r\n base64: string;\r\n mimeType: 'image/png';\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nconst PS_SCRIPT = `\r\nAdd-Type -AssemblyName System.Windows.Forms\r\n$img = [System.Windows.Forms.Clipboard]::GetImage()\r\nif ($img -eq $null) { exit 1 }\r\n$path = $args[0]\r\n$img.Save($path, [System.Drawing.Imaging.ImageFormat]::Png)\r\n$img.Dispose()\r\nWrite-Host \"$($img.Width)x$($img.Height)\"\r\n`;\r\n\r\nexport function getClipboardImage(): ClipboardImage | null {\r\n if (process.platform !== 'win32') {\r\n return getClipboardImageUnix();\r\n }\r\n\r\n const tmpPath = join(tmpdir(), `dominus-clip-${randomBytes(4).toString('hex')}.png`);\r\n\r\n try {\r\n execSync(\r\n `powershell -NoProfile -Command \"Add-Type -AssemblyName System.Windows.Forms; $img = [System.Windows.Forms.Clipboard]::GetImage(); if ($img -eq $null) { exit 1 }; $img.Save('${tmpPath.replace(/'/g, \"''\")}', [System.Drawing.Imaging.ImageFormat]::Png); $img.Dispose()\"`,\r\n { stdio: 'pipe', timeout: 5000 },\r\n );\r\n\r\n if (!existsSync(tmpPath)) return null;\r\n\r\n const buffer = readFileSync(tmpPath);\r\n unlinkSync(tmpPath);\r\n\r\n if (buffer.length < 100) return null;\r\n\r\n return {\r\n base64: buffer.toString('base64'),\r\n mimeType: 'image/png',\r\n };\r\n } catch {\r\n try { if (existsSync(tmpPath)) unlinkSync(tmpPath); } catch { /* ignore */ }\r\n return null;\r\n }\r\n}\r\n\r\nfunction getClipboardImageUnix(): ClipboardImage | null {\r\n const tmpPath = join(tmpdir(), `dominus-clip-${randomBytes(4).toString('hex')}.png`);\r\n\r\n try {\r\n if (process.platform === 'darwin') {\r\n execSync(`osascript -e 'set png to (the clipboard as «class PNGf»)' -e 'set f to open for access POSIX file \"${tmpPath}\" with write permission' -e 'write png to f' -e 'close access f'`, { stdio: 'pipe', timeout: 5000 });\r\n } else {\r\n execSync(`xclip -selection clipboard -t image/png -o > \"${tmpPath}\"`, { stdio: 'pipe', timeout: 5000 });\r\n }\r\n\r\n if (!existsSync(tmpPath)) return null;\r\n\r\n const buffer = readFileSync(tmpPath);\r\n unlinkSync(tmpPath);\r\n\r\n if (buffer.length < 100) return null;\r\n\r\n return {\r\n base64: buffer.toString('base64'),\r\n mimeType: 'image/png',\r\n };\r\n } catch {\r\n try { if (existsSync(tmpPath)) unlinkSync(tmpPath); } catch { /* ignore */ }\r\n return null;\r\n }\r\n}\r\n","import React, { useState, useMemo, useRef, useCallback, useEffect } from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport TextInput from 'ink-text-input';\r\nimport { getClipboardImage } from '../../utils/clipboard.js';\r\n\r\ninterface CommandSuggestion {\r\n command: string;\r\n description: string;\r\n}\r\n\r\nconst COMMANDS: CommandSuggestion[] = [\r\n { command: '/help', description: 'Show help and available commands' },\r\n { command: '/model', description: 'Switch the AI model' },\r\n { command: '/models', description: 'List all available models from your provider' },\r\n { command: '/status', description: 'Show connection and config status' },\r\n { command: '/clear', description: 'Clear chat history' },\r\n { command: '/paste', description: 'Paste image from clipboard (or Alt+V)' },\r\n];\r\n\r\nexport interface ImageAttachment {\r\n base64: string;\r\n mimeType: 'image/png';\r\n}\r\n\r\ninterface InputBarProps {\r\n onSubmit: (text: string, image?: ImageAttachment) => void;\r\n onImagePaste?: (image: ImageAttachment) => void;\r\n isProcessing: boolean;\r\n placeholder?: string;\r\n imageAttached?: boolean;\r\n onClearImage?: () => void;\r\n}\r\n\r\nconst SuggestionBox: React.FC<{ suggestions: CommandSuggestion[]; selectedIdx: number }> = React.memo(\r\n ({ suggestions, selectedIdx }) => (\r\n <Box flexDirection=\"column\" paddingX={1} borderStyle=\"single\" borderColor=\"gray\">\r\n {suggestions.map((s, i) => (\r\n <Box key={s.command}>\r\n <Text color={i === selectedIdx ? 'cyan' : undefined} bold={i === selectedIdx}>\r\n {i === selectedIdx ? '❯ ' : ' '}\r\n </Text>\r\n <Text color={i === selectedIdx ? 'cyan' : 'white'} bold={i === selectedIdx}>\r\n {s.command.padEnd(16)}\r\n </Text>\r\n <Text dimColor>{s.description}</Text>\r\n </Box>\r\n ))}\r\n <Text dimColor> ↑↓ navigate · Tab complete · Enter select</Text>\r\n </Box>\r\n ),\r\n);\r\n\r\nexport const InputBar: React.FC<InputBarProps> = React.memo(({\r\n onSubmit,\r\n onImagePaste,\r\n isProcessing,\r\n placeholder = 'Ask Dominus anything, or /help for commands...',\r\n imageAttached,\r\n onClearImage,\r\n}) => {\r\n const [value, setValue] = useState('');\r\n const [selectedIdx, setSelectedIdx] = useState(0);\r\n const [pasteStatus, setPasteStatus] = useState<'none' | 'checking' | 'no_image'>('none');\r\n const valueRef = useRef(value);\r\n valueRef.current = value;\r\n\r\n const suggestions = useMemo(() => {\r\n if (!value.startsWith('/') || value.includes(' ')) return [];\r\n const query = value.toLowerCase();\r\n return COMMANDS.filter((c) => c.command.startsWith(query));\r\n }, [value]);\r\n\r\n const showSuggestions = suggestions.length > 0 && value.length > 0;\r\n\r\n const tryPasteImage = useCallback(() => {\r\n if (!onImagePaste) return false;\r\n setPasteStatus('checking');\r\n try {\r\n const img = getClipboardImage();\r\n if (img) {\r\n onImagePaste(img);\r\n setPasteStatus('none');\r\n return true;\r\n }\r\n } catch { /* ignore */ }\r\n setPasteStatus('no_image');\r\n setTimeout(() => setPasteStatus('none'), 2000);\r\n return false;\r\n }, [onImagePaste]);\r\n\r\n // Listen for raw stdin to catch Alt+V and Ctrl+V\r\n useEffect(() => {\r\n const handler = (data: Buffer) => {\r\n if (isProcessing) return;\r\n const str = data.toString();\r\n // Alt+V: ESC + v (0x1B 0x76)\r\n if (str === '\\x1bv' || str === '\\x1bV') {\r\n tryPasteImage();\r\n return;\r\n }\r\n // Ctrl+V: 0x16 (works if terminal doesn't intercept it)\r\n if (str === '\\x16') {\r\n tryPasteImage();\r\n return;\r\n }\r\n };\r\n process.stdin.on('data', handler);\r\n return () => { process.stdin.off('data', handler); };\r\n }, [isProcessing, tryPasteImage]);\r\n\r\n useInput((_input, key) => {\r\n if (isProcessing) return;\r\n\r\n if (!showSuggestions) return;\r\n\r\n if (key.upArrow) {\r\n setSelectedIdx((prev) => Math.max(0, prev - 1));\r\n } else if (key.downArrow) {\r\n setSelectedIdx((prev) => Math.min(suggestions.length - 1, prev + 1));\r\n } else if (key.tab) {\r\n const selected = suggestions[selectedIdx];\r\n if (selected) {\r\n setValue(selected.command + ' ');\r\n setSelectedIdx(0);\r\n }\r\n }\r\n });\r\n\r\n const handleChange = useCallback((v: string) => {\r\n setValue(v);\r\n setSelectedIdx(0);\r\n }, []);\r\n\r\n const handleSubmit = useCallback((text: string) => {\r\n if (isProcessing) return;\r\n\r\n // /paste command\r\n if (text.trim().toLowerCase() === '/paste') {\r\n tryPasteImage();\r\n setValue('');\r\n return;\r\n }\r\n\r\n const currentValue = valueRef.current;\r\n const currentSuggestions = COMMANDS.filter(\r\n (c) => currentValue.startsWith('/') && !currentValue.includes(' ') && c.command.startsWith(currentValue.toLowerCase()),\r\n );\r\n const hasSuggestions = currentSuggestions.length > 0 && currentValue.length > 0;\r\n\r\n if (hasSuggestions) {\r\n const cmd = currentSuggestions[0]?.command;\r\n if (cmd && currentValue !== cmd && !currentValue.includes(' ')) {\r\n const noArgCmds = ['/clear', '/help', '/status', '/models', '/paste'];\r\n setValue(cmd + (noArgCmds.includes(cmd) ? '' : ' '));\r\n setSelectedIdx(0);\r\n return;\r\n }\r\n }\r\n\r\n if (text.trim()) {\r\n onSubmit(text.trim());\r\n setValue('');\r\n setSelectedIdx(0);\r\n }\r\n }, [isProcessing, onSubmit, tryPasteImage]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {showSuggestions && (\r\n <SuggestionBox suggestions={suggestions} selectedIdx={selectedIdx} />\r\n )}\r\n\r\n {imageAttached && (\r\n <Box paddingX={1} gap={1}>\r\n <Text color=\"green\" bold>[image 1]</Text>\r\n <Text dimColor>pasted — send a message to use it</Text>\r\n </Box>\r\n )}\r\n\r\n {pasteStatus === 'checking' && (\r\n <Box paddingX={1}>\r\n <Text color=\"yellow\">Checking clipboard...</Text>\r\n </Box>\r\n )}\r\n\r\n {pasteStatus === 'no_image' && (\r\n <Box paddingX={1}>\r\n <Text color=\"red\">No image found in clipboard. Copy an image first (screenshot, snipping tool, etc.)</Text>\r\n </Box>\r\n )}\r\n\r\n <Box borderStyle=\"single\" borderColor={isProcessing ? 'yellow' : imageAttached ? 'green' : 'cyan'} paddingX={1}>\r\n <Text color={isProcessing ? 'yellow' : 'cyan'} bold>\r\n {isProcessing ? '⟳ ' : imageAttached ? '📎 ' : '❯ '}\r\n </Text>\r\n {isProcessing ? (\r\n <Text dimColor>Processing...</Text>\r\n ) : (\r\n <TextInput\r\n value={value}\r\n onChange={handleChange}\r\n onSubmit={handleSubmit}\r\n placeholder={imageAttached ? 'Describe what you want (image attached)...' : placeholder}\r\n />\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\nconst CLASS_ICONS: Record<string, string> = {\r\n Workspace: '🌍',\r\n ServerScriptService: '⚙️',\r\n ReplicatedStorage: '📦',\r\n ReplicatedFirst: '🚀',\r\n StarterGui: '🖥️',\r\n StarterPack: '🎒',\r\n StarterPlayer: '🧑',\r\n Players: '👥',\r\n Lighting: '💡',\r\n SoundService: '🔊',\r\n Script: '📜',\r\n LocalScript: '📱',\r\n ModuleScript: '📘',\r\n Part: '🧱',\r\n Model: '📐',\r\n Folder: '📁',\r\n RemoteEvent: '📡',\r\n RemoteFunction: '📡',\r\n BindableEvent: '🔗',\r\n};\r\n\r\nfunction getIcon(className: string): string {\r\n return CLASS_ICONS[className] ?? '◇';\r\n}\r\n\r\ninterface ExplorerPaneProps {\r\n tree: ExplorerNode[];\r\n selectedPath?: string;\r\n maxDepth?: number;\r\n}\r\n\r\nconst TreeNode: React.FC<{\r\n node: ExplorerNode;\r\n depth: number;\r\n maxDepth: number;\r\n selectedPath?: string;\r\n}> = ({ node, depth, maxDepth, selectedPath }) => {\r\n const indent = ' '.repeat(depth);\r\n const isSelected = node.path === selectedPath;\r\n const hasChildren = node.children && node.children.length > 0;\r\n const icon = getIcon(node.className);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text>\r\n <Text dimColor>{indent}</Text>\r\n <Text>{hasChildren ? '▾ ' : ' '}</Text>\r\n <Text>{icon} </Text>\r\n <Text bold={isSelected} color={isSelected ? 'cyan' : undefined}>\r\n {node.name}\r\n </Text>\r\n <Text dimColor> ({node.className})</Text>\r\n </Text>\r\n {hasChildren &&\r\n depth < maxDepth &&\r\n node.children!.map((child, i) => (\r\n <TreeNode\r\n key={`${child.path}-${i}`}\r\n node={child}\r\n depth={depth + 1}\r\n maxDepth={maxDepth}\r\n selectedPath={selectedPath}\r\n />\r\n ))}\r\n </Box>\r\n );\r\n};\r\n\r\nexport const ExplorerPane: React.FC<ExplorerPaneProps> = React.memo(({\r\n tree,\r\n selectedPath,\r\n maxDepth = 4,\r\n}) => {\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n borderStyle=\"single\"\r\n borderColor=\"gray\"\r\n paddingX={1}\r\n width={36}\r\n minWidth={30}\r\n >\r\n <Text bold dimColor>\r\n Explorer\r\n </Text>\r\n {tree.length === 0 ? (\r\n <Text dimColor italic>\r\n Connect Studio plugin...\r\n </Text>\r\n ) : (\r\n tree.map((node, i) => (\r\n <TreeNode\r\n key={`${node.path}-${i}`}\r\n node={node}\r\n depth={0}\r\n maxDepth={maxDepth}\r\n selectedPath={selectedPath}\r\n />\r\n ))\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport Spinner from 'ink-spinner';\r\nimport type { ToolResult } from '../../tools/types.js';\r\n\r\nexport interface ToolCallEntry {\r\n name: string;\r\n args: Record<string, unknown>;\r\n result?: ToolResult;\r\n status: 'running' | 'done' | 'error';\r\n}\r\n\r\ninterface ToolCallViewProps {\r\n calls: ToolCallEntry[];\r\n}\r\n\r\nfunction summarizeArgs(args: Record<string, unknown>): string {\r\n const parts: string[] = [];\r\n for (const [key, value] of Object.entries(args)) {\r\n const str = typeof value === 'string' ? value : JSON.stringify(value);\r\n parts.push(`${key}=${str.length > 40 ? str.slice(0, 40) + '...' : str}`);\r\n }\r\n return parts.join(', ');\r\n}\r\n\r\nexport const ToolCallView: React.FC<ToolCallViewProps> = React.memo(({ calls }) => {\r\n if (calls.length === 0) return null;\r\n\r\n return (\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n {calls.map((call, i) => (\r\n <Box key={i} gap={1}>\r\n {call.status === 'running' && (\r\n <Text color=\"yellow\">\r\n <Spinner type=\"dots\" />\r\n </Text>\r\n )}\r\n {call.status === 'done' && <Text color=\"green\">✔</Text>}\r\n {call.status === 'error' && <Text color=\"red\">✖</Text>}\r\n <Text color=\"yellow\" bold>\r\n {call.name}\r\n </Text>\r\n <Text dimColor>({summarizeArgs(call.args)})</Text>\r\n {call.result && !call.result.success && (\r\n <Text color=\"red\"> — {call.result.error}</Text>\r\n )}\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box } from 'ink';\r\nimport { StatusBar } from './StatusBar.js';\r\nimport { OutputPane, type OutputEntry } from './OutputPane.js';\r\nimport { ChatPane, type ChatEntry } from './ChatPane.js';\r\nimport { InputBar, type ImageAttachment } from './InputBar.js';\r\nimport { ExplorerPane } from './Explorer.js';\r\nimport { ToolCallView, type ToolCallEntry } from './ToolCallView.js';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\ninterface LayoutProps {\r\n connected: boolean;\r\n placeName?: string;\r\n connectionCount?: number;\r\n model: string;\r\n chatEntries: ChatEntry[];\r\n outputEntries: OutputEntry[];\r\n explorerTree: ExplorerNode[];\r\n toolCalls: ToolCallEntry[];\r\n streaming?: string;\r\n isProcessing: boolean;\r\n onSubmit: (text: string, image?: ImageAttachment) => void;\r\n onImagePaste?: (image: ImageAttachment) => void;\r\n imageAttached?: boolean;\r\n onClearImage?: () => void;\r\n}\r\n\r\nexport const Layout: React.FC<LayoutProps> = React.memo(({\r\n connected,\r\n placeName,\r\n connectionCount,\r\n model,\r\n chatEntries,\r\n outputEntries,\r\n explorerTree,\r\n toolCalls,\r\n streaming,\r\n isProcessing,\r\n onSubmit,\r\n onImagePaste,\r\n imageAttached,\r\n onClearImage,\r\n}) => {\r\n return (\r\n <Box flexDirection=\"column\" width=\"100%\">\r\n <StatusBar connected={connected} placeName={placeName} connectionCount={connectionCount} model={model} />\r\n\r\n <Box flexGrow={1}>\r\n <ExplorerPane tree={explorerTree} />\r\n\r\n <Box flexDirection=\"column\" flexGrow={1}>\r\n <ChatPane entries={chatEntries} streaming={streaming} />\r\n {toolCalls.length > 0 && <ToolCallView calls={toolCalls} />}\r\n </Box>\r\n </Box>\r\n\r\n <OutputPane entries={outputEntries} maxLines={6} />\r\n <InputBar\r\n onSubmit={onSubmit}\r\n onImagePaste={onImagePaste}\r\n isProcessing={isProcessing}\r\n imageAttached={imageAttached}\r\n onClearImage={onClearImage}\r\n />\r\n </Box>\r\n );\r\n});\r\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { StudioBridge } from '../../transport/ws-server.js';\nimport type { ExplorerNode, OutputPayload, StudioConnectedPayload } from '../../transport/protocol.js';\nimport { StudioMsg } from '../../transport/protocol.js';\nimport type { OutputEntry } from '../components/OutputPane.js';\n\ninterface StudioState {\n connected: boolean;\n placeName?: string;\n placeId?: number;\n connectionCount: number;\n explorerTree: ExplorerNode[];\n outputLog: OutputEntry[];\n}\n\nexport function useStudio(server: StudioBridge) {\n const connInfo = server.getConnectionInfo();\n const connections = server.listConnections();\n const [state, setState] = useState<StudioState>({\n connected: server.isConnected(),\n placeName: connInfo?.placeName,\n placeId: connInfo?.placeId,\n connectionCount: connections.length,\n explorerTree: [],\n outputLog: [],\n });\n\n const stateRef = useRef(state);\n stateRef.current = state;\n\n useEffect(() => {\n // Sync initial state in case connection happened before mount\n if (server.isConnected() && !stateRef.current.connected) {\n const info = server.getConnectionInfo();\n const conns = server.listConnections();\n setState((prev) => ({\n ...prev,\n connected: true,\n placeName: info?.placeName,\n placeId: info?.placeId,\n connectionCount: conns.length,\n }));\n }\n\n const onConnected = (payload: StudioConnectedPayload) => {\n const conns = server.listConnections();\n const info = server.getConnectionInfo();\n setState((prev) => ({\n ...prev,\n connected: true,\n placeName: info?.placeName ?? payload.placeName ?? prev.placeName,\n placeId: info?.placeId ?? payload.placeId ?? prev.placeId,\n connectionCount: conns.length,\n }));\n };\n\n const onDisconnected = () => {\n const conns = server.listConnections();\n const info = server.getConnectionInfo();\n const stillConnected = conns.length > 0;\n setState((prev) => ({\n ...prev,\n connected: stillConnected,\n placeName: stillConnected ? info?.placeName : undefined,\n placeId: stillConnected ? info?.placeId : undefined,\n connectionCount: conns.length,\n }));\n };\n\n const onExplorer = (payload: { tree: ExplorerNode[] }) => {\n setState((prev) => ({ ...prev, explorerTree: payload.tree ?? [] }));\n };\n\n const onOutput = (payload: OutputPayload) => {\n setState((prev) => ({\n ...prev,\n outputLog: [\n ...prev.outputLog.slice(-200),\n {\n message: payload.message,\n level: payload.level,\n timestamp: payload.timestamp ?? Date.now(),\n source: payload.source,\n },\n ],\n }));\n };\n\n const onError = (payload: OutputPayload) => {\n setState((prev) => ({\n ...prev,\n outputLog: [\n ...prev.outputLog.slice(-200),\n {\n message: payload.message,\n level: 'error',\n timestamp: payload.timestamp ?? Date.now(),\n source: payload.source,\n },\n ],\n }));\n };\n\n server.on('studio:connected', onConnected);\n server.on('studio:disconnected', onDisconnected);\n server.on(StudioMsg.EXPLORER, onExplorer);\n server.on(StudioMsg.OUTPUT, onOutput);\n server.on(StudioMsg.ERROR, onError);\n\n return () => {\n server.off('studio:connected', onConnected);\n server.off('studio:disconnected', onDisconnected);\n server.off(StudioMsg.EXPLORER, onExplorer);\n server.off(StudioMsg.OUTPUT, onOutput);\n server.off(StudioMsg.ERROR, onError);\n };\n }, [server]);\n\n const clearOutput = useCallback(() => {\n setState((prev) => ({ ...prev, outputLog: [] }));\n }, []);\n\n return { ...state, clearOutput };\n}\n","import React, { useState, useCallback, useRef } from 'react';\nimport { Box } from 'ink';\nimport { Welcome } from './ui/components/Welcome.js';\nimport { Setup } from './ui/components/Setup.js';\nimport { Layout } from './ui/components/Layout.js';\nimport { InputBar, type ImageAttachment } from './ui/components/InputBar.js';\nimport { useStudio } from './ui/hooks/useStudio.js';\nimport type { StudioBridge } from './transport/ws-server.js';\nimport type { AgentLoop } from './agent/loop.js';\nimport type { ChatEntry } from './ui/components/ChatPane.js';\nimport type { ToolCallEntry } from './ui/components/ToolCallView.js';\nimport { loadConfig, setConfigValue, PROVIDERS, resolveProviderSettings, type AIProviderType } from './config/config.js';\n\ninterface AppProps {\n server: StudioBridge;\n agent: AgentLoop | null;\n version: string;\n}\n\nexport const App: React.FC<AppProps> = ({ server, agent: initialAgent, version }) => {\n const [showWelcome, setShowWelcome] = useState(true);\n const [chatEntries, setChatEntries] = useState<ChatEntry[]>([]);\n const [toolCalls, setToolCalls] = useState<ToolCallEntry[]>([]);\n const [streaming, setStreaming] = useState('');\n const [isProcessing, setIsProcessing] = useState(false);\n const [agent, setAgent] = useState(initialAgent);\n\n const studio = useStudio(server);\n const config = loadConfig();\n const hasApiKey = !!config.apiKey;\n const [needsSetup, setNeedsSetup] = useState(!hasApiKey);\n const [pendingImage, setPendingImage] = useState<ImageAttachment | null>(null);\n const pendingImageRef = useRef<ImageAttachment | null>(null);\n\n const handleImagePaste = useCallback((image: ImageAttachment) => {\n setPendingImage(image);\n pendingImageRef.current = image;\n }, []);\n\n const handleClearImage = useCallback(() => {\n setPendingImage(null);\n pendingImageRef.current = null;\n }, []);\n\n const handleSetupComplete = useCallback((provider: AIProviderType, apiKey: string) => {\n setConfigValue('provider', provider);\n setConfigValue('apiKey', apiKey);\n const providerInfo = PROVIDERS[provider];\n setConfigValue('apiBaseUrl', providerInfo.baseUrl);\n setConfigValue('model', providerInfo.defaultModel);\n setNeedsSetup(false);\n }, []);\n\n const addSystemMessage = useCallback((content: string) => {\n setChatEntries((prev) => [\n ...prev,\n { role: 'system' as const, content, timestamp: Date.now() },\n ]);\n }, []);\n\n const handleCommand = useCallback(\n (text: string): boolean => {\n const input = text.startsWith('/') ? text.slice(1) : text;\n const [cmd, ...args] = input.split(' ');\n const arg = args.join(' ');\n const lowerCmd = cmd.toLowerCase();\n\n const currentModel = agent?.getModel() ?? resolveProviderSettings(config).model;\n const providerName = PROVIDERS[config.provider]?.name ?? config.provider;\n const keyStatus = config.apiKey\n ? `${config.apiKey.slice(0, 6)}...${config.apiKey.slice(-4)}`\n : 'NOT SET';\n\n switch (lowerCmd) {\n case 'help':\n case 'h':\n case '?':\n addSystemMessage([\n '── Your Config ─────────────────────────────',\n ` Provider: ${providerName}`,\n ` Model: ${currentModel}`,\n ` API Key: ${keyStatus}`,\n ` Studio: ${studio.connected ? '● Connected' + (studio.placeName ? ` (${studio.placeName})` : '') : '○ Disconnected'}`,\n '',\n '── Commands ────────────────────────────────',\n ' /help Show this help',\n ' /model <name> Switch AI model',\n ' /models List available models',\n ' /status Connection status',\n ' /clear Clear chat history',\n '',\n '── Setup (run in your terminal) ────────────',\n ' dominus config set provider <name>',\n ' Providers: openai, anthropic, gemini, xai, openrouter',\n ' dominus config set apiKey <key>',\n ' dominus config list',\n ' dominus install-plugin',\n ' dominus mcp-install',\n '',\n 'Or just type a message to chat with Dominus!',\n ].join('\\n'));\n return true;\n\n case 'clear':\n agent?.clearHistory();\n setChatEntries([]);\n setToolCalls([]);\n return true;\n\n case 'model':\n if (arg && agent) {\n agent.setModel(arg);\n addSystemMessage(`Model switched to: ${arg}`);\n } else {\n addSystemMessage('Usage: /model <model-name>');\n }\n return true;\n\n case 'models': {\n if (!agent) {\n addSystemMessage('No API key configured — cannot fetch models.');\n return true;\n }\n addSystemMessage(`Fetching models from ${providerName}...`);\n agent.listModels().then((models) => {\n if (models.length === 0) {\n addSystemMessage('Could not fetch models. Check your API key.');\n return;\n }\n const lines = models.slice(0, 40).map((m) => ` ${m.id}`);\n addSystemMessage([\n `── ${providerName} Models (${models.length} total) ──`,\n ...lines,\n models.length > 40 ? ` ... and ${models.length - 40} more` : '',\n '',\n ` Current: ${currentModel}`,\n ' Switch with: /model <name>',\n ].join('\\n'));\n });\n return true;\n }\n\n case 'status':\n addSystemMessage([\n '── Status ──────────────────────────────────',\n ` Provider: ${providerName}`,\n ` Model: ${currentModel}`,\n ` API Key: ${keyStatus}`,\n ` Port: ${server.getPort()}`,\n ` Studio: ${studio.connected ? '● Connected' + (studio.placeName ? ` (${studio.placeName})` : '') : '○ Disconnected'}`,\n ].join('\\n'));\n return true;\n\n default:\n return false;\n }\n },\n [agent, studio, server, config, addSystemMessage],\n );\n\n const handleSubmit = useCallback(\n async (text: string) => {\n if (isProcessing) return;\n\n // Check for commands first (with or without /)\n // /paste is handled directly by InputBar, skip it here\n if (text.trim().toLowerCase() === '/paste' || text.trim().toLowerCase() === 'paste') return;\n\n const isCommand = text.startsWith('/') || ['help', 'h', '?', 'clear', 'model', 'models', 'status'].includes(text.split(' ')[0].toLowerCase());\n if (isCommand) {\n setShowWelcome(false);\n handleCommand(text);\n return;\n }\n\n // Dismiss welcome for regular messages\n setShowWelcome(false);\n\n if (!agent) {\n setChatEntries((prev) => [\n ...prev,\n { role: 'user', content: text, timestamp: Date.now() },\n {\n role: 'error',\n content: 'No API key configured. Set OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, or XAI_API_KEY — or run: dominus config set apiKey <key>',\n timestamp: Date.now(),\n },\n ]);\n return;\n }\n\n // Grab and clear any pending image\n const image = pendingImageRef.current;\n setPendingImage(null);\n pendingImageRef.current = null;\n\n setIsProcessing(true);\n setToolCalls([]);\n\n const displayText = image ? `${text}\\n[image 1]` : text;\n setChatEntries((prev) => [\n ...prev,\n { role: 'user', content: displayText, timestamp: Date.now() },\n ]);\n\n let fullText = '';\n\n try {\n for await (const event of agent.run(text, image ? { base64: image.base64, mimeType: image.mimeType } : undefined)) {\n switch (event.type) {\n case 'text':\n fullText += event.content;\n setStreaming(fullText);\n break;\n\n case 'tool_call':\n setToolCalls((prev) => [\n ...prev,\n { name: event.tool, args: event.args, status: 'running' },\n ]);\n break;\n\n case 'tool_result':\n setToolCalls((prev) =>\n prev.map((tc) =>\n tc.name === event.tool && tc.status === 'running'\n ? { ...tc, status: event.result.success ? 'done' : 'error', result: event.result }\n : tc,\n ),\n );\n break;\n\n case 'error':\n setChatEntries((prev) => [\n ...prev,\n { role: 'error', content: event.message, timestamp: Date.now() },\n ]);\n break;\n }\n }\n\n if (fullText) {\n setChatEntries((prev) => [\n ...prev,\n { role: 'assistant', content: fullText, timestamp: Date.now() },\n ]);\n }\n } catch (err) {\n setChatEntries((prev) => [\n ...prev,\n {\n role: 'error',\n content: err instanceof Error ? err.message : String(err),\n timestamp: Date.now(),\n },\n ]);\n } finally {\n setIsProcessing(false);\n setStreaming('');\n setToolCalls([]);\n }\n },\n [agent, isProcessing, handleCommand],\n );\n\n if (needsSetup) {\n return <Setup onComplete={handleSetupComplete} />;\n }\n\n if (showWelcome) {\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <Welcome\n userName={config.userName}\n version={version}\n model={resolveProviderSettings(config).model}\n provider={PROVIDERS[config.provider]?.name ?? config.provider}\n port={server.getPort()}\n hasApiKey={hasApiKey}\n connected={studio.connected}\n cwd={process.cwd()}\n />\n <InputBar\n onSubmit={handleSubmit}\n onImagePaste={handleImagePaste}\n isProcessing={false}\n imageAttached={!!pendingImage}\n onClearImage={handleClearImage}\n placeholder={\n hasApiKey\n ? 'Type a message to begin, or Ctrl+V to paste an image...'\n : 'Set up your API key to get started, or type /help...'\n }\n />\n </Box>\n );\n }\n\n return (\n <Layout\n connected={studio.connected}\n placeName={studio.placeName}\n connectionCount={studio.connectionCount}\n model={agent?.getModel() ?? resolveProviderSettings(config).model}\n chatEntries={chatEntries}\n outputEntries={studio.outputLog}\n explorerTree={studio.explorerTree}\n toolCalls={toolCalls}\n streaming={streaming || undefined}\n isProcessing={isProcessing}\n onSubmit={handleSubmit}\n onImagePaste={handleImagePaste}\n imageAttached={!!pendingImage}\n onClearImage={handleClearImage}\n />\n );\n};\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { App } from './app.js';\nimport { DominusServer, type StudioBridge } from './transport/ws-server.js';\nimport { DominusClient, isPortInUse } from './transport/ws-client.js';\nimport { AgentLoop } from './agent/loop.js';\nimport { ToolRegistry, createDefaultRegistry } from './tools/registry.js';\nimport { initMemoryStore, closeMemoryStore } from './memory/store.js';\nimport {\n loadConfig,\n setConfigValue,\n getConfigValue,\n loadRules,\n saveRules,\n getDominusDir,\n detectProviderFromEnv,\n PROVIDERS,\n type DominusConfig,\n type AIProviderType,\n} from './config/config.js';\nimport { checkForUpdate, formatUpdateMessage, autoUpdate } from './utils/update-checker.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst VERSION = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf-8')).version;\n\nconst program = new Command();\n\nprogram\n .name('dominus')\n .description('AI-powered autonomous agent for Roblox Studio development')\n .version(VERSION);\n\n// Main start command (default)\nprogram\n .command('start', { isDefault: true })\n .description('Launch the Dominus TUI agent')\n .option('-p, --port <port>', 'WebSocket server port', '18088')\n .action(async (opts) => {\n const config = loadConfig();\n const port = parseInt(opts.port) || config.port;\n\n // Auto-detect API key from environment variables\n if (!config.apiKey) {\n const detected = detectProviderFromEnv();\n if (detected) {\n setConfigValue('provider', detected.provider);\n setConfigValue('apiKey', detected.apiKey);\n }\n }\n\n // Auto-detect user name\n if (config.userName === 'Developer') {\n const envUser = process.env.USER || process.env.USERNAME || 'Developer';\n const firstName = envUser.split(' ')[0];\n if (firstName && firstName !== 'Developer') {\n setConfigValue('userName', firstName);\n }\n }\n\n checkForUpdate(VERSION).then((info) => {\n if (info) process.stderr.write(formatUpdateMessage(info));\n }).catch(() => {});\n\n await launchApp(port);\n });\n\n// Config commands\nconst configCmd = program.command('config').description('Manage Dominus configuration');\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a config value')\n .action((key: string, value: string) => {\n const numericKeys = ['port', 'maxToolIterations', 'maxVerifyRetries', 'tokenBudget'];\n const booleanKeys = ['autoIndex', 'autoLearn'];\n const validProviders = ['openai', 'anthropic', 'gemini', 'xai', 'openrouter', 'custom'];\n\n let parsed: unknown = value;\n if (numericKeys.includes(key)) {\n parsed = parseInt(value);\n } else if (booleanKeys.includes(key)) {\n parsed = value === 'true';\n } else if (key === 'provider') {\n if (!validProviders.includes(value)) {\n console.log(` ✖ Invalid provider: ${value}`);\n console.log(` Valid providers: ${validProviders.join(', ')}`);\n return;\n }\n // When changing provider, also update model and base URL defaults\n const providerInfo = PROVIDERS[value as AIProviderType];\n setConfigValue('apiBaseUrl', providerInfo.baseUrl);\n setConfigValue('model', providerInfo.defaultModel);\n }\n\n setConfigValue(key as keyof DominusConfig, parsed as DominusConfig[keyof DominusConfig]);\n console.log(` ✔ Set ${key} = ${value}`);\n if (key === 'provider') {\n const p = PROVIDERS[value as AIProviderType];\n console.log(` → Base URL: ${p.baseUrl}`);\n console.log(` → Default model: ${p.defaultModel}`);\n }\n console.log(` Config stored at: ${getDominusDir()}/config.json`);\n });\n\nconfigCmd\n .command('get <key>')\n .description('Get a config value')\n .action((key: string) => {\n const value = getConfigValue(key as keyof DominusConfig);\n if (key.toLowerCase().includes('key') && typeof value === 'string') {\n console.log(` ${key} = ${value.slice(0, 8)}...${value.slice(-4)}`);\n } else {\n console.log(` ${key} = ${JSON.stringify(value)}`);\n }\n });\n\nconfigCmd\n .command('list')\n .description('List all config values')\n .action(() => {\n const config = loadConfig();\n console.log('');\n console.log(' Dominus Configuration:');\n console.log(' ─────────────────────');\n for (const [key, value] of Object.entries(config)) {\n const display =\n key.toLowerCase().includes('key') && typeof value === 'string' && value.length > 12\n ? `${value.slice(0, 8)}...${value.slice(-4)}`\n : JSON.stringify(value);\n console.log(` ${key}: ${display}`);\n }\n console.log('');\n console.log(` Config file: ${getDominusDir()}/config.json`);\n console.log('');\n });\n\n// Rules commands\nconst rulesCmd = program.command('rules').description('Manage agent rules (do/don\\'t)');\n\nrulesCmd\n .command('add-do <rule>')\n .description('Add a rule for things Dominus should do')\n .action((rule: string) => {\n const rules = loadRules();\n rules.do.push(rule);\n saveRules(rules);\n console.log(` ✔ Added DO rule: ${rule}`);\n });\n\nrulesCmd\n .command('add-dont <rule>')\n .description('Add a rule for things Dominus should NOT do')\n .action((rule: string) => {\n const rules = loadRules();\n rules.dont.push(rule);\n saveRules(rules);\n console.log(` ✔ Added DON'T rule: ${rule}`);\n });\n\nrulesCmd\n .command('list')\n .description('List all rules')\n .action(() => {\n const rules = loadRules();\n console.log('');\n console.log(' Dominus Rules:');\n if (rules.do.length) {\n console.log(' DO:');\n rules.do.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (rules.dont.length) {\n console.log(\" DON'T:\");\n rules.dont.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (rules.conventions.length) {\n console.log(' CONVENTIONS:');\n rules.conventions.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (!rules.do.length && !rules.dont.length && !rules.conventions.length) {\n console.log(' No rules configured yet.');\n console.log(' Use: dominus rules add-do \"Always use strict typing\"');\n console.log(' Use: dominus rules add-dont \"Never use deprecated APIs\"');\n }\n console.log('');\n });\n\n// Plugin install command\nprogram\n .command('update')\n .description('Auto-update Dominus to the latest version')\n .action(async () => {\n console.log(` Current version: ${VERSION}`);\n console.log(' Checking for updates...');\n\n const result = await autoUpdate(VERSION);\n if (result.from === result.to && result.success) {\n console.log(' Already on the latest version.');\n return;\n }\n if (result.success) {\n console.log(` ✔ Updated: ${result.from} → ${result.to}`);\n console.log(' Restart dominus to use the new version.');\n } else {\n console.error(` ✘ Update failed: ${result.error}`);\n }\n });\n\nprogram\n .command('install-plugin')\n .description('Build & install the Dominus plugin into Roblox Studio')\n .action(async () => {\n const { execSync } = await import('node:child_process');\n\n const packageRoot = path.resolve(import.meta.dirname ?? __dirname, '..');\n const pluginDir = path.join(packageRoot, 'plugin');\n const pluginProject = path.join(pluginDir, 'default.project.json');\n const studioPlugins = path.join(\n os.homedir(),\n 'AppData',\n 'Local',\n 'Roblox',\n 'Plugins',\n );\n const destFile = path.join(studioPlugins, 'Dominus.rbxm');\n\n if (!fs.existsSync(pluginProject)) {\n console.log(' ✖ Plugin source not found.');\n console.log(` Expected at: ${pluginDir}`);\n return;\n }\n\n if (!fs.existsSync(studioPlugins)) {\n fs.mkdirSync(studioPlugins, { recursive: true });\n }\n\n // Try building with Rojo\n let rojoAvailable = false;\n try {\n execSync('rojo --version', { stdio: 'pipe' });\n rojoAvailable = true;\n } catch {\n // Rojo not installed\n }\n\n if (rojoAvailable) {\n try {\n console.log(' Building plugin with Rojo...');\n execSync(`rojo build \"${pluginDir}\" -o \"${destFile}\"`, { stdio: 'pipe' });\n console.log(` ✔ Plugin built and installed to: ${destFile}`);\n console.log(' Restart Roblox Studio to load the plugin.');\n } catch (err) {\n console.log(` ✖ Rojo build failed: ${err instanceof Error ? err.message : err}`);\n }\n } else {\n // Fallback: build a simple .rbxmx (XML model) that Studio can load\n console.log(' Rojo not found — building plugin manually...');\n buildPluginXml(pluginDir, destFile.replace('.rbxm', '.rbxmx'));\n }\n });\n\n// MCP server command\nprogram\n .command('mcp')\n .description('Start the Dominus MCP server (for Cursor, Claude Desktop, etc.)')\n .option('-p, --port <port>', 'WebSocket server port for Studio connection', '18088')\n .action(async () => {\n const { startMcpServer } = await import('./mcp/server.js');\n await startMcpServer();\n });\n\n// MCP install — auto-write config into supported editors\ninterface McpTarget {\n name: string;\n configPath: string;\n keyPath: string[];\n}\n\nfunction getMcpTargets(): McpTarget[] {\n const home = os.homedir();\n const appData = process.env.APPDATA || path.join(home, 'AppData', 'Roaming');\n const localAppData = process.env.LOCALAPPDATA || path.join(home, 'AppData', 'Local');\n const cwd = process.cwd();\n\n return [\n {\n name: 'Cursor (project)',\n configPath: path.join(cwd, '.cursor', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Cursor (global)',\n configPath: path.join(home, '.cursor', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Claude Desktop',\n configPath: path.join(appData, 'Claude', 'claude_desktop_config.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Claude Code',\n configPath: path.join(home, '.claude.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Windsurf (project)',\n configPath: path.join(cwd, '.windsurf', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Windsurf (global)',\n configPath: path.join(home, '.codeium', 'windsurf', 'mcp_config.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'VS Code (project)',\n configPath: path.join(cwd, '.vscode', 'mcp.json'),\n keyPath: ['servers'],\n },\n {\n name: 'VS Code (global)',\n configPath: path.join(localAppData, 'Code', 'User', 'settings.json'),\n keyPath: ['mcp', 'servers'],\n },\n ];\n}\n\nconst dominusEntry = {\n command: 'dominus',\n args: ['mcp'],\n type: 'stdio',\n};\n\nfunction injectMcpConfig(target: McpTarget): { status: 'installed' | 'already' | 'created' } {\n let config: Record<string, unknown> = {};\n if (fs.existsSync(target.configPath)) {\n try {\n config = JSON.parse(fs.readFileSync(target.configPath, 'utf-8'));\n } catch {\n config = {};\n }\n }\n\n // Navigate to the nested key, creating objects along the way\n let obj = config as Record<string, unknown>;\n for (const key of target.keyPath) {\n if (!obj[key] || typeof obj[key] !== 'object') {\n obj[key] = {};\n }\n obj = obj[key] as Record<string, unknown>;\n }\n\n if (obj['dominus']) {\n return { status: 'already' };\n }\n\n obj['dominus'] = { ...dominusEntry };\n\n const dir = path.dirname(target.configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(target.configPath, JSON.stringify(config, null, 2), 'utf-8');\n\n return { status: fs.existsSync(target.configPath) ? 'installed' : 'created' };\n}\n\nprogram\n .command('mcp-install')\n .description('Auto-install Dominus MCP into Cursor, VS Code, Claude Desktop, Windsurf, etc.')\n .option('-a, --all', 'Install to all detected editors')\n .action(async (opts) => {\n const targets = getMcpTargets();\n\n console.log('');\n console.log(' Dominus MCP Auto-Installer');\n console.log(' ═════════════════════════');\n console.log('');\n\n if (opts.all) {\n for (const target of targets) {\n const result = injectMcpConfig(target);\n const icon = result.status === 'already' ? '●' : '✔';\n const msg = result.status === 'already' ? 'already configured' : 'installed';\n console.log(` ${icon} ${target.name}: ${msg}`);\n }\n console.log('');\n console.log(' Restart your editors to load the Dominus MCP server.');\n console.log('');\n return;\n }\n\n // Interactive: show which editors are detected\n const detected: { target: McpTarget; exists: boolean }[] = targets.map((t) => ({\n target: t,\n exists: fs.existsSync(path.dirname(t.configPath)),\n }));\n\n const toInstall = detected.filter((d) => d.exists);\n\n if (toInstall.length === 0) {\n console.log(' No supported editors detected.');\n console.log(' Run with --all to install configs anyway,');\n console.log(' or manually add to your editor\\'s MCP config:');\n console.log('');\n console.log(' {');\n console.log(' \"dominus\": {');\n console.log(' \"command\": \"dominus\",');\n console.log(' \"args\": [\"mcp\"]');\n console.log(' }');\n console.log(' }');\n console.log('');\n return;\n }\n\n console.log(' Detected editors:');\n console.log('');\n\n for (const { target } of toInstall) {\n const result = injectMcpConfig(target);\n const icon = result.status === 'already' ? '●' : '✔';\n const msg = result.status === 'already' ? 'already configured' : 'installed';\n console.log(` ${icon} ${target.name}: ${msg}`);\n console.log(` ${target.configPath}`);\n }\n\n const skipped = detected.filter((d) => !d.exists);\n if (skipped.length > 0) {\n console.log('');\n console.log(' Skipped (not detected):');\n for (const { target } of skipped) {\n console.log(` ○ ${target.name}`);\n }\n }\n\n console.log('');\n console.log(' Provides 14 Roblox Studio tools to your AI editor.');\n console.log(' Restart your editors to load the Dominus MCP server.');\n console.log('');\n });\n\n// MCP setup helper (print-only)\nprogram\n .command('mcp-setup')\n .description('Print MCP configuration for manual setup')\n .action(() => {\n console.log('');\n console.log(' Dominus MCP — Manual Setup');\n console.log(' ═════════════════════════');\n console.log('');\n console.log(' Tip: Run `dominus mcp-install` to auto-install instead!');\n console.log('');\n console.log(' Add this to your editor\\'s MCP config:');\n console.log('');\n console.log(' {');\n console.log(' \"dominus\": {');\n console.log(' \"command\": \"dominus\",');\n console.log(' \"args\": [\"mcp\"]');\n console.log(' }');\n console.log(' }');\n console.log('');\n console.log(' Config file locations:');\n console.log('');\n console.log(' Cursor (project) .cursor/mcp.json');\n console.log(' Cursor (global) ~/.cursor/mcp.json');\n console.log(' Claude Desktop %APPDATA%/Claude/claude_desktop_config.json');\n console.log(' Claude Code ~/.claude.json');\n console.log(' Windsurf (project) .windsurf/mcp.json');\n console.log(' Windsurf (global) ~/.codeium/windsurf/mcp_config.json');\n console.log(' VS Code (project) .vscode/mcp.json');\n console.log(' VS Code (global) %LOCALAPPDATA%/Code/User/settings.json');\n console.log('');\n console.log(' 14 tools: read_script, edit_script, run_code, get_explorer,');\n console.log(' get_properties, set_properties, insert_instance, delete_instance,');\n console.log(' get_selection, search_scripts, get_output, run_tests,');\n console.log(' recall_memory, remember');\n console.log('');\n });\n\nfunction buildPluginXml(pluginDir: string, destFile: string): void {\n const srcDir = path.join(pluginDir, 'src');\n if (!fs.existsSync(srcDir)) {\n console.log(` ✖ Plugin source directory not found: ${srcDir}`);\n return;\n }\n\n const files = fs.readdirSync(srcDir).filter((f) => f.endsWith('.lua'));\n const mainFile = files.find((f) => f === 'init.server.lua');\n const moduleFiles = files.filter((f) => f !== 'init.server.lua');\n\n if (!mainFile) {\n console.log(' ✖ init.server.lua not found in plugin source');\n return;\n }\n\n const escapeXml = (s: string) =>\n s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n\n const mainSource = fs.readFileSync(path.join(srcDir, mainFile), 'utf-8');\n\n let moduleItems = '';\n for (const mf of moduleFiles) {\n const modName = mf.replace('.lua', '');\n const modSource = fs.readFileSync(path.join(srcDir, mf), 'utf-8');\n moduleItems += `\n <Item class=\"ModuleScript\" referent=\"${modName}\">\n <Properties>\n <string name=\"Name\">${modName}</string>\n <ProtectedString name=\"Source\"><![CDATA[${modSource}]]></ProtectedString>\n </Properties>\n </Item>`;\n }\n\n const rbxmx = `<roblox version=\"4\">\n <Item class=\"Script\" referent=\"Dominus\">\n <Properties>\n <string name=\"Name\">Dominus</string>\n <ProtectedString name=\"Source\"><![CDATA[${mainSource}]]></ProtectedString>\n <token name=\"RunContext\">1</token>\n </Properties>${moduleItems}\n </Item>\n</roblox>`;\n\n fs.writeFileSync(destFile, rbxmx, 'utf-8');\n console.log(` ✔ Plugin installed to: ${destFile}`);\n console.log(' Restart Roblox Studio to load the plugin.');\n}\n\nasync function launchApp(port: number): Promise<void> {\n await initMemoryStore();\n\n let server: StudioBridge;\n\n const portTaken = await isPortInUse(port);\n if (portTaken) {\n // Another Dominus instance (MCP) already owns the port — connect as relay\n const client = new DominusClient(port);\n await client.connect();\n server = client;\n } else {\n const srv = new DominusServer(port);\n await srv.start();\n server = srv;\n }\n\n const config = loadConfig();\n let agent: AgentLoop | null = null;\n\n if (config.apiKey) {\n const tools = createDefaultRegistry();\n await new Promise((r) => setTimeout(r, 100));\n agent = new AgentLoop(server, tools);\n }\n\n const { waitUntilExit } = render(\n <App server={server} agent={agent} version={VERSION} />,\n );\n\n const cleanup = async () => {\n closeMemoryStore();\n await server.stop();\n };\n\n process.on('SIGINT', async () => {\n await cleanup();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n await cleanup();\n process.exit(0);\n });\n\n await waitUntilExit();\n await cleanup();\n}\n\nprogram.parse();\n","import OpenAI from 'openai';\nimport { type DominusConfig, resolveProviderSettings, PROVIDERS } from '../config/config.js';\nimport type { Tool, ToolCall } from '../tools/types.js';\n\nexport interface AIResponse {\n content: string | null;\n toolCalls: ToolCall[];\n finishReason: string;\n usage?: { promptTokens: number; completionTokens: number; totalTokens: number };\n}\n\nexport interface StreamChunk {\n type: 'text' | 'tool_call_start' | 'tool_call_delta' | 'tool_call_end' | 'done';\n content?: string;\n toolCall?: Partial<ToolCall>;\n}\n\nexport class AIProvider {\n private client: OpenAI;\n private model: string;\n private providerName: string;\n\n constructor(config: DominusConfig) {\n if (!config.apiKey) {\n throw new Error('API key not configured. Run: dominus config set apiKey <your-key>');\n }\n\n const { baseUrl, model } = resolveProviderSettings(config);\n this.providerName = PROVIDERS[config.provider]?.name ?? config.provider;\n\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: baseUrl,\n });\n this.model = model;\n }\n\n setModel(model: string): void {\n this.model = model;\n }\n\n getModel(): string {\n return this.model;\n }\n\n getProviderName(): string {\n return this.providerName;\n }\n\n async listModels(): Promise<{ id: string; owned_by?: string }[]> {\n try {\n const list = await this.client.models.list();\n const models: { id: string; owned_by?: string }[] = [];\n for await (const m of list) {\n models.push({ id: m.id, owned_by: m.owned_by });\n }\n models.sort((a, b) => a.id.localeCompare(b.id));\n return models;\n } catch {\n return [];\n }\n }\n\n async chat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools?: Tool[],\n ): Promise<AIResponse> {\n const openAITools = tools?.map(toolToOpenAI);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: openAITools?.length ? openAITools : undefined,\n temperature: 0.3,\n });\n\n const choice = response.choices[0];\n if (!choice) throw new Error('No response from AI');\n\n const toolCalls: ToolCall[] = (choice.message.tool_calls ?? []).map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n }));\n\n return {\n content: choice.message.content,\n toolCalls,\n finishReason: choice.finish_reason ?? 'stop',\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n };\n }\n\n async *streamChat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools?: Tool[],\n ): AsyncGenerator<StreamChunk> {\n const openAITools = tools?.map(toolToOpenAI);\n\n const stream = await this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: openAITools?.length ? openAITools : undefined,\n temperature: 0.3,\n stream: true,\n });\n\n const toolCallBuffers = new Map<number, { id: string; name: string; args: string }>();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n yield { type: 'text', content: delta.content };\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (!toolCallBuffers.has(tc.index)) {\n toolCallBuffers.set(tc.index, {\n id: tc.id ?? '',\n name: tc.function?.name ?? '',\n args: '',\n });\n if (tc.function?.name) {\n yield {\n type: 'tool_call_start',\n toolCall: { id: tc.id, name: tc.function.name },\n };\n }\n }\n\n const buffer = toolCallBuffers.get(tc.index)!;\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name = tc.function.name;\n if (tc.function?.arguments) {\n buffer.args += tc.function.arguments;\n yield {\n type: 'tool_call_delta',\n content: tc.function.arguments,\n toolCall: { id: buffer.id, name: buffer.name },\n };\n }\n }\n }\n\n if (chunk.choices[0]?.finish_reason === 'tool_calls') {\n for (const [, buffer] of toolCallBuffers) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(buffer.args);\n } catch {\n /* empty args */\n }\n yield {\n type: 'tool_call_end',\n toolCall: { id: buffer.id, name: buffer.name, arguments: args },\n };\n }\n toolCallBuffers.clear();\n }\n }\n\n yield { type: 'done' };\n }\n}\n\nfunction toolToOpenAI(tool: Tool): OpenAI.ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters as unknown as Record<string, unknown>,\n },\n };\n}\n","import type { DominusRules } from '../config/config.js';\r\nimport type { Fact } from '../memory/types.js';\r\nimport { INTERNAL_MEMORY } from './internal-memory.js';\r\n\r\nexport function buildSystemPrompt(opts: {\r\n userName: string;\r\n connected: boolean;\r\n placeName?: string;\r\n placeId?: number;\r\n scriptIndex?: { path: string; summary?: string; className: string }[];\r\n facts?: Fact[];\r\n rules?: DominusRules;\r\n}): string {\r\n const parts: string[] = [];\r\n\r\n parts.push(`You are Dominus, an expert AI agent for Roblox Studio development.\r\nYou assist ${opts.userName} with building, debugging, and refactoring Roblox experiences.\r\n\r\nYou are deeply knowledgeable about:\r\n- Luau (Roblox's programming language): syntax, idioms, metatables, type annotations, coroutines\r\n- Roblox Engine API: all services (Players, Workspace, DataStoreService, ReplicatedStorage, etc.)\r\n- Roblox architecture patterns: client-server model, remotes, replication, DataStores\r\n- Common frameworks: Knit, ProfileService, Rodux, Roact, Fusion\r\n- Studio workflows: plugins, packages, team collaboration, testing\r\n- Performance: memory management, heartbeat optimization, streaming, LOD\r\n\r\nYou have direct access to Roblox Studio through tools. You can read/edit scripts, run code, browse the explorer tree, manage instances, and run tests -- all in real-time via WebSocket.\r\n\r\n## CRITICAL: NEVER use run_code for tasks that have a dedicated tool\r\nrun_code is a LAST RESORT. You have 30+ specialized tools — use them.\r\n- Reading properties → get_properties, get_descendants_properties\r\n- Inspecting selection → inspect_selection (ONE call returns paths + properties)\r\n- Inspecting an instance → inspect_instance (ONE call returns properties + children)\r\n- Converting UI to code → convert_ui_to_code (ONE call serializes + generates component)\r\n- Creating parts → create_part, build_multiple\r\n- Creating UI → create_ui\r\n- Modifying properties → set_properties, bulk_set_properties\r\n- Browsing the tree → get_explorer\r\n- Reading/editing scripts → read_script, edit_script\r\n- Serializing UI → serialize_ui\r\nOnly use run_code for: procedural generation, terrain algorithms, raycasting, physics queries, or other logic that no tool covers.\r\n\r\nWhen the user asks you to do something, you should:\r\n1. Use your tools to gather context (read scripts, check explorer, recall memory)\r\n2. Plan your approach for complex tasks\r\n3. Execute changes using the appropriate dedicated tools (NOT run_code unless truly necessary)\r\n4. Verify your changes worked (read back, check output for errors)\r\n5. Remember important facts for future sessions`);\r\n\r\n // Connection status\r\n if (opts.connected) {\r\n parts.push(`\\n## Current Session\r\n- Studio: CONNECTED${opts.placeName ? ` (${opts.placeName})` : ''}${opts.placeId ? ` [PlaceID: ${opts.placeId}]` : ''}\r\n- You can use all Studio tools.`);\r\n } else {\r\n parts.push(`\\n## Current Session\r\n- Studio: NOT CONNECTED\r\n- You cannot use Studio tools until the plugin connects.\r\n- You can still use memory tools and answer Roblox questions.`);\r\n }\r\n\r\n // Project index\r\n if (opts.scriptIndex?.length) {\r\n parts.push('\\n## Project Scripts');\r\n const lines = opts.scriptIndex.map(\r\n (s) => `- ${s.path} (${s.className})${s.summary ? `: ${s.summary}` : ''}`,\r\n );\r\n if (lines.length > 40) {\r\n parts.push(lines.slice(0, 40).join('\\n'));\r\n parts.push(`... and ${lines.length - 40} more scripts`);\r\n } else {\r\n parts.push(lines.join('\\n'));\r\n }\r\n }\r\n\r\n // Recalled facts\r\n if (opts.facts?.length) {\r\n parts.push('\\n## Remembered Context');\r\n for (const fact of opts.facts.slice(0, 20)) {\r\n parts.push(`- [${fact.category}] ${fact.content}`);\r\n }\r\n }\r\n\r\n // User rules\r\n if (opts.rules) {\r\n if (opts.rules.do.length > 0) {\r\n parts.push('\\n## Rules: DO');\r\n for (const rule of opts.rules.do) {\r\n parts.push(`- ${rule}`);\r\n }\r\n }\r\n if (opts.rules.dont.length > 0) {\r\n parts.push('\\n## Rules: DO NOT');\r\n for (const rule of opts.rules.dont) {\r\n parts.push(`- ${rule}`);\r\n }\r\n }\r\n if (opts.rules.conventions.length > 0) {\r\n parts.push('\\n## Coding Conventions');\r\n for (const conv of opts.rules.conventions) {\r\n parts.push(`- ${conv}`);\r\n }\r\n }\r\n if (opts.rules.context) {\r\n parts.push(`\\n## Project Context\\n${opts.rules.context}`);\r\n }\r\n }\r\n\r\n parts.push(`\\n## Tool Usage Guidelines\r\n- Always verify your work: after editing a script, read it back to confirm.\r\n- After running code, check the output for errors.\r\n- Use remember to store important facts you discover about the project.\r\n- Use recall_memory before complex tasks to check if you already know relevant context.\r\n- When searching scripts, be specific with your query terms.\r\n- For multi-step changes, explain your plan before executing.\r\n\r\n## Building & Construction\r\nWhen the user asks you to build or create objects (parts, trees, houses, terrain, etc.):\r\n\r\n**PREFER these builder tools over raw run_code:**\r\n- \\`create_part\\` — create a single part with position, size, color, material, shape in one call\r\n- \\`build_multiple\\` — create many parts in a single batch round-trip (FASTEST for complex builds)\r\n- \\`clone_instance\\` — duplicate an existing object, optionally offset/rename it\r\n- \\`group_instances\\` — organize parts into a Model or Folder\r\n- \\`set_properties\\` — adjust properties on existing instances (supports Vector3, Color3, enums, hex colors)\r\n\r\n**Why use builder tools instead of run_code?**\r\n- Tool calls are structured — the AI sends typed parameters, no string interpolation bugs\r\n- Properties are auto-coerced (hex → Color3, tables → Vector3, strings → Enum values)\r\n- \\`build_multiple\\` sends one batch of Luau to Studio, creating many parts in a single round-trip\r\n- Easier for the agent to plan, verify, and iterate\r\n\r\n**Building strategy:**\r\n1. For a single part: use \\`create_part\\`\r\n2. For multi-part objects (trees, buildings, vehicles): use \\`build_multiple\\` with \\`groupName\\`\r\n3. For repeating/duplicating: use \\`clone_instance\\` with offset\r\n4. For organizing: use \\`group_instances\\`\r\n5. Only fall back to \\`run_code\\` for complex logic (loops, raycasts, terrain generation algorithms)\r\n\r\n## GUI / UI Elements — CRITICAL\r\n**ALWAYS use \\`create_ui\\` for building UI.** It creates the entire UI tree in ONE call — no run_code, no get_class_info needed.\r\nDo NOT use run_code for UI creation. Do NOT call get_class_info before create_ui — it already handles all types natively.\r\n\r\n\\`create_ui\\` takes a declarative JSON tree and builds everything in a single Studio round-trip:\r\n\\`\\`\\`json\r\n{\r\n \"parent\": \"StarterGui\",\r\n \"tree\": {\r\n \"ClassName\": \"ScreenGui\", \"Name\": \"MyUI\", \"ResetOnSpawn\": false,\r\n \"Children\": [\r\n { \"ClassName\": \"Frame\", \"Size\": [1, 0, 1, 0], \"BackgroundColor3\": \"#F0E6FF\",\r\n \"Children\": [\r\n { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 12] },\r\n { \"ClassName\": \"TextLabel\", \"Text\": \"Hello!\", \"Size\": [0.5, 0, 0.1, 0],\r\n \"Position\": [0.25, 0, 0.45, 0], \"BackgroundTransparency\": 1,\r\n \"TextColor3\": \"#6C5CE7\", \"TextScaled\": true, \"Font\": \"GothamBold\" }\r\n ]\r\n }\r\n ]\r\n }\r\n}\r\n\\`\\`\\`\r\n\r\nGUI classes use DIFFERENT property types than 3D parts:\r\n\r\n**Key type differences:**\r\n- GUI Size/Position = \\`UDim2\\` (NOT Vector3). Format: \\`{XScale: 0.5, XOffset: 0, YScale: 0.5, YOffset: 0}\\` or \\`[xScale, xOffset, yScale, yOffset]\\`\r\n- GUI AnchorPoint = \\`Vector2\\` = \\`{x: 0.5, y: 0.5}\\`\r\n- BackgroundColor3 = \\`Color3\\` = \\`\"#FF0000\"\\` or \\`{R: 1, G: 0, B: 0}\\` or \\`\"rgb(255,0,0)\"\\`\r\n- Font = \\`Font\\` = \\`{Family: \"rbxasset://fonts/families/SourceSansPro.json\", Weight: \"Bold\"}\\`\r\n- BorderSizePixel = \\`number\\`\r\n- TextSize = \\`number\\`\r\n- Enum properties (e.g., TextXAlignment) = string name like \\`\"Center\"\\`, \\`\"Left\"\\`\r\n\r\n**Property coercion handles automatically:**\r\n- UDim2: tables, arrays, \"0.5, 0, 0.3, 0\" strings\r\n- UDim: {Scale, Offset} or number\r\n- Vector3, Vector2, Color3, BrickColor, CFrame, Rect, NumberRange\r\n- NumberSequence, ColorSequence (for gradients)\r\n- All enum properties from string names\r\n- Color3 from hex \"#RRGGBB\", \"rgb(r,g,b)\", or BrickColor name strings\r\n\r\n## Serializing & Converting Existing UI\r\nWhen the user asks to convert, export, recreate, or turn an existing UI into a React/Roact component:\r\n\r\n**Use \\`serialize_ui\\` — NOT \\`get_descendants_properties\\`.**\r\n\\`serialize_ui\\` returns a clean, minimal JSON tree with only non-default properties, values already in JSON-friendly formats (hex colors, UDim2 arrays, enum names), and a proper parent-child hierarchy. It's purpose-built for this exact workflow.\r\n\r\n\\`get_descendants_properties\\` returns a flat list with ALL properties (including read-only, defaults, deprecated) — it's much larger and harder to convert.\r\n\r\n### Roblox UI → Roact/React Conversion Workflow\r\n1. Call \\`serialize_ui\\` with the path (e.g. \\`StarterGui.MyScreenGui.MyFrame\\`)\r\n2. The result is a tree like:\r\n\\`\\`\\`json\r\n{\r\n \"ClassName\": \"Frame\", \"Name\": \"MyFrame\",\r\n \"Size\": [0.5, 0, 0.3, 0], \"BackgroundColor3\": \"#1a1a2e\",\r\n \"Children\": [\r\n { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 8] },\r\n { \"ClassName\": \"TextLabel\", \"Name\": \"Title\", \"Text\": \"Hello\",\r\n \"Size\": [1, 0, 0.2, 0], \"TextColor3\": \"#ffffff\", \"BackgroundTransparency\": 1 }\r\n ]\r\n}\r\n\\`\\`\\`\r\n3. Convert to Roact/React-lua using these mappings:\r\n - Each JSON node → \\`Roact.createElement(ClassName, props, children)\\` or \\`React.createElement\\`\r\n - \\`UDim2\\` arrays \\`[xS, xO, yS, yO]\\` → \\`UDim2.new(xS, xO, yS, yO)\\`\r\n - \\`Color3\\` hex \\`\"#RRGGBB\"\\` → \\`Color3.fromHex(\"#RRGGBB\")\\`\r\n - \\`Vector2\\` arrays \\`[x, y]\\` → \\`Vector2.new(x, y)\\`\r\n - \\`UDim\\` arrays \\`[s, o]\\` → \\`UDim.new(s, o)\\`\r\n - Enum strings \\`\"Center\"\\` → \\`Enum.TextXAlignment.Center\\` (resolve the full enum path)\r\n - \\`Children\\` array → child elements table\r\n - UI modifiers (UICorner, UIStroke, UIGradient, UIListLayout, UIPadding, UIScale) → children of the parent element\r\n\r\n### Example Roact output:\r\n\\`\\`\\`lua\r\nlocal function MyFrame()\r\n return Roact.createElement(\"Frame\", {\r\n Size = UDim2.new(0.5, 0, 0.3, 0),\r\n BackgroundColor3 = Color3.fromHex(\"#1a1a2e\"),\r\n }, {\r\n Corner = Roact.createElement(\"UICorner\", {\r\n CornerRadius = UDim.new(0, 8),\r\n }),\r\n Title = Roact.createElement(\"TextLabel\", {\r\n Size = UDim2.new(1, 0, 0.2, 0),\r\n Text = \"Hello\",\r\n TextColor3 = Color3.fromHex(\"#ffffff\"),\r\n BackgroundTransparency = 1,\r\n }),\r\n })\r\nend\r\n\\`\\`\\`\r\n\r\n### Key rules for conversion:\r\n- Use the instance \\`Name\\` as the dictionary key in the children table\r\n- UI modifiers (UICorner, UIStroke, etc.) are CHILDREN, not props\r\n- Keep the exact property values from serialize_ui — don't guess or approximate\r\n- For Fusion: \\`New \"Frame\" { Size = UDim2.new(...), [Children] = { ... } }\\`\r\n- Preserve ZIndex ordering when relevant\r\n- FontFace objects → \\`Font.new(\"rbxasset://fonts/families/...\", Enum.FontWeight.Bold)\\`\r\n\r\n## ReflectionService\r\nThe \\`get_class_info\\` tool queries Roblox's ReflectionService to return the complete API surface for any class:\r\n- All properties with their exact ValueType\r\n- All methods with parameter names and types\r\n- All events with parameter types\r\n- Superclass, creatability, serialization info\r\n\r\nUse it whenever you're unsure about property names or types. It's fast and cached.\r\n\r\n${INTERNAL_MEMORY}`);\r\n\r\n return parts.join('\\n');\r\n}\r\n","import type OpenAI from 'openai';\nimport { buildSystemPrompt } from './system-prompt.js';\nimport { recallFacts, getScriptIndex, getProjectSummaries } from '../memory/store.js';\nimport { loadConfig, loadRules } from '../config/config.js';\nimport { getContextWindow } from '../ai/models.js';\nimport type { StudioBridge } from '../transport/ws-server.js';\nimport type { ChatMessage } from '../memory/types.js';\n\nconst CHARS_PER_TOKEN = 4; // rough estimate\n\ninterface ContextBuildResult {\n messages: OpenAI.ChatCompletionMessageParam[];\n tokenEstimate: number;\n}\n\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\nexport function buildContext(opts: {\n userMessage: string;\n conversationHistory: OpenAI.ChatCompletionMessageParam[];\n server: StudioBridge;\n projectId: string;\n sessionId: string;\n}): ContextBuildResult {\n const config = loadConfig();\n const rules = loadRules();\n const contextWindow = getContextWindow(config.model);\n\n // Token budget allocation\n const systemBudget = Math.floor(contextWindow * 0.15);\n const memoryBudget = Math.floor(contextWindow * 0.15);\n const conversationBudget = Math.floor(contextWindow * 0.45);\n // 25% reserved for response + tool calls\n\n // Build system prompt\n const connInfo = opts.server.getConnectionInfo();\n const facts = recallFacts(opts.projectId, opts.userMessage, 15);\n const scriptIndex = getScriptIndex(opts.projectId);\n const summaries = getProjectSummaries(opts.projectId, 5);\n\n let systemPrompt = buildSystemPrompt({\n userName: config.userName,\n connected: opts.server.isConnected(),\n placeName: connInfo?.placeName,\n placeId: connInfo?.placeId,\n scriptIndex,\n facts,\n rules,\n });\n\n // Trim system prompt if over budget\n if (estimateTokens(systemPrompt) > systemBudget) {\n systemPrompt = systemPrompt.slice(0, systemBudget * CHARS_PER_TOKEN);\n }\n\n // Build conversation messages, trimming old ones if over budget\n const messages: OpenAI.ChatCompletionMessageParam[] = [\n { role: 'system', content: systemPrompt },\n ];\n\n // Add session summaries as context\n if (summaries.length > 0) {\n const summaryText = summaries\n .map((s) => s.summary)\n .join('\\n');\n if (estimateTokens(summaryText) <= memoryBudget) {\n messages.push({\n role: 'system',\n content: `Previous session summaries:\\n${summaryText}`,\n });\n }\n }\n\n // Add conversation history, newest first, respecting budget\n let historyTokens = 0;\n const historyMessages: OpenAI.ChatCompletionMessageParam[] = [];\n\n // Always include the current user message\n const currentMsg: OpenAI.ChatCompletionMessageParam = {\n role: 'user',\n content: opts.userMessage,\n };\n\n // Add historical messages from newest to oldest\n for (let i = opts.conversationHistory.length - 1; i >= 0; i--) {\n const msg = opts.conversationHistory[i];\n const content =\n typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n const tokens = estimateTokens(content);\n\n if (historyTokens + tokens > conversationBudget) break;\n historyTokens += tokens;\n historyMessages.unshift(msg);\n }\n\n messages.push(...historyMessages, currentMsg);\n\n const totalTokens = estimateTokens(\n messages.map((m) => (typeof m.content === 'string' ? m.content : '')).join(''),\n );\n\n return { messages, tokenEstimate: totalTokens };\n}\n\nexport function chatMessageToOpenAI(\n msg: ChatMessage,\n): OpenAI.ChatCompletionMessageParam | null {\n switch (msg.role) {\n case 'user':\n return { role: 'user', content: msg.content };\n case 'assistant':\n return { role: 'assistant', content: msg.content };\n case 'system':\n return { role: 'system', content: msg.content };\n case 'tool_result':\n return {\n role: 'tool' as const,\n content: msg.content,\n tool_call_id: msg.toolName ?? 'unknown',\n };\n default:\n return null;\n }\n}\n","import type { AIProviderType } from '../config/config.js';\n\nexport interface ModelInfo {\n id: string;\n name: string;\n contextWindow: number;\n supportsTools: boolean;\n provider: AIProviderType;\n}\n\nexport const POPULAR_MODELS: ModelInfo[] = [\n // --- OpenAI ---\n { id: 'gpt-5.3-codex', name: 'GPT-5.3 Codex', contextWindow: 256000, supportsTools: true, provider: 'openai' },\n { id: 'gpt-5.2', name: 'GPT-5.2', contextWindow: 256000, supportsTools: true, provider: 'openai' },\n { id: 'gpt-4o', name: 'GPT-4o', contextWindow: 128000, supportsTools: true, provider: 'openai' },\n { id: 'o3-mini', name: 'o3-mini', contextWindow: 200000, supportsTools: true, provider: 'openai' },\n\n // --- Anthropic ---\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6', contextWindow: 200000, supportsTools: true, provider: 'anthropic' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6', contextWindow: 200000, supportsTools: true, provider: 'anthropic' },\n\n // --- Google Gemini ---\n { id: 'gemini-3.1-pro', name: 'Gemini 3.1 Pro', contextWindow: 2097152, supportsTools: true, provider: 'gemini' },\n { id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', contextWindow: 1048576, supportsTools: true, provider: 'gemini' },\n\n // --- xAI / Grok ---\n { id: 'grok-4.2', name: 'Grok 4.2', contextWindow: 256000, supportsTools: true, provider: 'xai' },\n { id: 'grok-3', name: 'Grok 3', contextWindow: 131072, supportsTools: true, provider: 'xai' },\n\n // --- OpenRouter (routes to any model) ---\n { id: 'anthropic/claude-opus-4-6', name: 'Claude Opus 4.6', contextWindow: 200000, supportsTools: true, provider: 'openrouter' },\n { id: 'anthropic/claude-sonnet-4-6', name: 'Claude Sonnet 4.6', contextWindow: 200000, supportsTools: true, provider: 'openrouter' },\n { id: 'openai/gpt-5.3-codex', name: 'GPT-5.3 Codex', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'openai/gpt-5.2', name: 'GPT-5.2', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'google/gemini-3.1-pro', name: 'Gemini 3.1 Pro', contextWindow: 2097152, supportsTools: true, provider: 'openrouter' },\n { id: 'x-ai/grok-4.2', name: 'Grok 4.2', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'deepseek/deepseek-v3.2', name: 'DeepSeek V3.2', contextWindow: 1000000, supportsTools: true, provider: 'openrouter' },\n];\n\nexport function getModelInfo(modelId: string): ModelInfo | undefined {\n return POPULAR_MODELS.find((m) => m.id === modelId);\n}\n\nexport function getModelsForProvider(provider: AIProviderType): ModelInfo[] {\n return POPULAR_MODELS.filter((m) => m.provider === provider);\n}\n\nexport function getContextWindow(modelId: string): number {\n return getModelInfo(modelId)?.contextWindow ?? 128000;\n}\n","import type OpenAI from 'openai';\nimport { nanoid } from 'nanoid';\nimport { AIProvider } from '../ai/provider.js';\nimport { buildContext } from './context-builder.js';\nimport { loadConfig } from '../config/config.js';\nimport { createConfigAccess } from '../config/config.js';\nimport { storeMessage } from '../memory/store.js';\nimport type { StudioBridge } from '../transport/ws-server.js';\nimport { ToolRegistry } from '../tools/registry.js';\nimport type { AgentEvent, ToolContext, ToolCall, ToolResult } from '../tools/types.js';\nimport type { WsMessage } from '../transport/protocol.js';\n\nexport class AgentLoop {\n private ai: AIProvider;\n private server: StudioBridge;\n private tools: ToolRegistry;\n private conversationHistory: OpenAI.ChatCompletionMessageParam[] = [];\n private projectId = 'current';\n private sessionId: string;\n private maxIterations: number;\n private maxRetries: number;\n\n constructor(server: StudioBridge, tools: ToolRegistry) {\n const config = loadConfig();\n this.ai = new AIProvider(config);\n this.server = server;\n this.tools = tools;\n this.sessionId = nanoid();\n this.maxIterations = config.maxToolIterations;\n this.maxRetries = config.maxVerifyRetries;\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n setModel(model: string): void {\n this.ai.setModel(model);\n }\n\n getModel(): string {\n return this.ai.getModel();\n }\n\n async listModels(): Promise<{ id: string; owned_by?: string }[]> {\n return this.ai.listModels();\n }\n\n setProjectId(projectId: string): void {\n this.projectId = projectId;\n }\n\n async *run(\n userMessage: string,\n imageAttachment?: { base64: string; mimeType: string },\n ): AsyncGenerator<AgentEvent> {\n storeMessage({\n sessionId: this.sessionId,\n role: 'user',\n content: userMessage + (imageAttachment ? ' [image attached]' : ''),\n createdAt: Date.now(),\n });\n\n const { messages } = buildContext({\n userMessage,\n conversationHistory: this.conversationHistory,\n server: this.server,\n projectId: this.projectId,\n sessionId: this.sessionId,\n });\n\n // If image attached, convert the last user message to multipart content\n if (imageAttachment) {\n const lastMsg = messages[messages.length - 1];\n if (lastMsg && lastMsg.role === 'user') {\n (lastMsg as any).content = [\n { type: 'text', text: typeof lastMsg.content === 'string' ? lastMsg.content : userMessage },\n {\n type: 'image_url',\n image_url: {\n url: `data:${imageAttachment.mimeType};base64,${imageAttachment.base64}`,\n detail: 'high',\n },\n },\n ];\n }\n }\n\n const toolCtx = this.createToolContext();\n const allTools = this.tools.getAll();\n let currentMessages = [...messages];\n let iteration = 0;\n\n while (iteration < this.maxIterations) {\n iteration++;\n\n try {\n const response = await this.ai.chat(currentMessages, allTools);\n\n // Handle text response\n if (response.content) {\n yield { type: 'text', content: response.content };\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'assistant',\n content: response.content,\n createdAt: Date.now(),\n });\n\n this.conversationHistory.push({ role: 'assistant', content: response.content });\n }\n\n // No tool calls -- we're done\n if (response.toolCalls.length === 0) {\n break;\n }\n\n // Execute tool calls\n const toolResults: { call: ToolCall; result: ToolResult }[] = [];\n\n for (const call of response.toolCalls) {\n yield { type: 'tool_call', tool: call.name, args: call.arguments };\n\n const result = await this.tools.execute(call, toolCtx);\n toolResults.push({ call, result });\n\n yield { type: 'tool_result', tool: call.name, result };\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'tool_call',\n content: JSON.stringify({ name: call.name, args: call.arguments }),\n toolName: call.name,\n createdAt: Date.now(),\n });\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'tool_result',\n content: JSON.stringify(result),\n toolName: call.name,\n createdAt: Date.now(),\n });\n }\n\n // Add assistant message with tool calls to conversation\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n content: response.content ?? null,\n tool_calls: response.toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: { name: tc.name, arguments: JSON.stringify(tc.arguments) },\n })),\n };\n currentMessages.push(assistantMsg);\n\n // Add tool results to messages\n for (const { call, result } of toolResults) {\n currentMessages.push({\n role: 'tool',\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n }\n\n this.conversationHistory.push(assistantMsg);\n for (const { call, result } of toolResults) {\n this.conversationHistory.push({\n role: 'tool' as const,\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n yield { type: 'error', message };\n break;\n }\n }\n\n yield { type: 'done' };\n }\n\n async *streamRun(\n userMessage: string,\n imageAttachment?: { base64: string; mimeType: string },\n ): AsyncGenerator<AgentEvent> {\n for await (const event of this.run(userMessage, imageAttachment)) {\n yield event;\n }\n }\n\n private createToolContext(): ToolContext {\n return {\n sendToStudio: <T = unknown>(type: string, payload: unknown, timeoutMs?: number): Promise<WsMessage<T>> => {\n return this.server.sendRequest<T>(type, payload, timeoutMs);\n },\n isStudioConnected: () => this.server.isConnected(),\n memory: {\n recall: (query: string, projectId: string, limit?: number) => {\n const { recallFacts } = require('../memory/store.js');\n const facts = recallFacts(projectId || this.projectId, query, limit);\n return facts.map((f: { content: string }) => f.content);\n },\n learn: (projectId: string, facts: { content: string; category: string }[]) => {\n const { storeFact } = require('../memory/store.js');\n const now = Date.now();\n for (const f of facts) {\n storeFact({\n projectId: projectId || this.projectId,\n content: f.content,\n category: f.category as any,\n source: 'agent',\n relevance: 1.0,\n createdAt: now,\n accessedAt: now,\n });\n }\n },\n getScriptIndex: (projectId: string) => {\n const { getScriptIndex } = require('../memory/store.js');\n return getScriptIndex(projectId || this.projectId);\n },\n },\n config: createConfigAccess(),\n };\n }\n\n clearHistory(): void {\n this.conversationHistory = [];\n this.sessionId = nanoid();\n }\n}\n","import type { Tool, ToolCall, ToolResult, ToolContext } from './types.js';\r\n\r\nexport class ToolRegistry {\r\n private tools = new Map<string, Tool>();\r\n\r\n register(tool: Tool): void {\r\n if (this.tools.has(tool.name)) {\r\n throw new Error(`Tool already registered: ${tool.name}`);\r\n }\r\n this.tools.set(tool.name, tool);\r\n }\r\n\r\n get(name: string): Tool | undefined {\r\n return this.tools.get(name);\r\n }\r\n\r\n getAll(): Tool[] {\r\n return Array.from(this.tools.values());\r\n }\r\n\r\n getSchemas(): Tool[] {\r\n return this.getAll();\r\n }\r\n\r\n async execute(call: ToolCall, ctx: ToolContext): Promise<ToolResult> {\r\n const tool = this.tools.get(call.name);\r\n if (!tool) {\r\n return { success: false, error: `Unknown tool: ${call.name}` };\r\n }\r\n\r\n try {\r\n return await tool.execute(call.arguments, ctx);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n return { success: false, error: message };\r\n }\r\n }\r\n\r\n listNames(): string[] {\r\n return Array.from(this.tools.keys());\r\n }\r\n}\r\n\r\nexport function createDefaultRegistry(): ToolRegistry {\r\n const registry = new ToolRegistry();\r\n\r\n // Dynamic imports to avoid circular deps\r\n const toolModules = [\r\n import('./studio/read-script.js'),\r\n import('./studio/edit-script.js'),\r\n import('./studio/run-code.js'),\r\n import('./studio/get-explorer.js'),\r\n import('./studio/get-properties.js'),\r\n import('./studio/get-descendants-properties.js'),\r\n import('./studio/set-properties.js'),\r\n import('./studio/insert-instance.js'),\r\n import('./studio/delete-instance.js'),\r\n import('./studio/get-output.js'),\r\n import('./studio/get-selection.js'),\r\n import('./studio/search-scripts.js'),\r\n import('./studio/run-tests.js'),\r\n import('./studio/get-class-info.js'),\r\n import('./studio/create-ui.js'),\r\n import('./studio/execute-run-test.js'),\r\n import('./studio/execute-play-test.js'),\r\n import('./studio/create-part.js'),\r\n import('./studio/clone-instance.js'),\r\n import('./studio/group-instances.js'),\r\n import('./studio/build-multiple.js'),\r\n import('./studio/serialize-ui.js'),\r\n import('./studio/move-instance.js'),\r\n import('./studio/bulk-set-properties.js'),\r\n import('./studio/find-replace-scripts.js'),\r\n import('./memory/recall.js'),\r\n import('./memory/remember.js'),\r\n import('./cloud/upload-asset.js'),\r\n ];\r\n\r\n // Register all tools asynchronously, return immediately\r\n // Tools will be available by the time the agent loop starts\r\n void Promise.all(\r\n toolModules.map(async (mod) => {\r\n const m = await mod;\r\n if (m.tool) registry.register(m.tool);\r\n }),\r\n );\r\n\r\n // Register undo/redo (dual-export module)\r\n void import('./studio/undo-redo.js').then((m) => {\r\n registry.register(m.undoTool);\r\n registry.register(m.redoTool);\r\n });\r\n\r\n return registry;\r\n}\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport https from 'node:https';\r\nimport { execSync } from 'node:child_process';\r\n\r\nconst CACHE_DIR = path.join(os.homedir(), '.dominus');\r\nconst CACHE_FILE = path.join(CACHE_DIR, 'update-check.json');\r\nconst CHECK_INTERVAL_MS = 4 * 60 * 60 * 1000; // 4 hours\r\nconst NPM_PACKAGE = 'dominus-cli';\r\n\r\ninterface UpdateCache {\r\n lastCheck: number;\r\n latestVersion: string | null;\r\n}\r\n\r\nfunction readCache(): UpdateCache {\r\n try {\r\n if (fs.existsSync(CACHE_FILE)) {\r\n return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8'));\r\n }\r\n } catch {}\r\n return { lastCheck: 0, latestVersion: null };\r\n}\r\n\r\nfunction writeCache(cache: UpdateCache): void {\r\n try {\r\n if (!fs.existsSync(CACHE_DIR)) fs.mkdirSync(CACHE_DIR, { recursive: true });\r\n fs.writeFileSync(CACHE_FILE, JSON.stringify(cache), 'utf-8');\r\n } catch {}\r\n}\r\n\r\nfunction fetchLatestVersion(): Promise<string | null> {\r\n return new Promise((resolve) => {\r\n const req = https.get(\r\n `https://registry.npmjs.org/${NPM_PACKAGE}/latest`,\r\n { headers: { Accept: 'application/json' }, timeout: 5000 },\r\n (res) => {\r\n if (res.statusCode !== 200) { resolve(null); res.resume(); return; }\r\n let body = '';\r\n res.on('data', (c) => (body += c));\r\n res.on('end', () => {\r\n try { resolve(JSON.parse(body).version ?? null); }\r\n catch { resolve(null); }\r\n });\r\n },\r\n );\r\n req.on('error', () => resolve(null));\r\n req.on('timeout', () => { req.destroy(); resolve(null); });\r\n });\r\n}\r\n\r\nfunction compareVersions(current: string, latest: string): number {\r\n const a = current.split('.').map(Number);\r\n const b = latest.split('.').map(Number);\r\n for (let i = 0; i < 3; i++) {\r\n if ((b[i] ?? 0) > (a[i] ?? 0)) return 1;\r\n if ((b[i] ?? 0) < (a[i] ?? 0)) return -1;\r\n }\r\n return 0;\r\n}\r\n\r\nexport interface UpdateInfo {\r\n updateAvailable: boolean;\r\n currentVersion: string;\r\n latestVersion: string;\r\n}\r\n\r\n/**\r\n * Non-blocking update check. Fires off a network request in the background\r\n * and returns immediately if the cache is fresh. Never throws.\r\n */\r\nexport async function checkForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\r\n try {\r\n const cache = readCache();\r\n const now = Date.now();\r\n\r\n if (now - cache.lastCheck < CHECK_INTERVAL_MS && cache.latestVersion) {\r\n if (compareVersions(currentVersion, cache.latestVersion) > 0) {\r\n return { updateAvailable: true, currentVersion, latestVersion: cache.latestVersion };\r\n }\r\n return null;\r\n }\r\n\r\n const latest = await fetchLatestVersion();\r\n writeCache({ lastCheck: now, latestVersion: latest });\r\n\r\n if (latest && compareVersions(currentVersion, latest) > 0) {\r\n return { updateAvailable: true, currentVersion, latestVersion: latest };\r\n }\r\n } catch {}\r\n return null;\r\n}\r\n\r\nexport function formatUpdateMessage(info: UpdateInfo): string {\r\n const line1 = `Update available: ${info.currentVersion} → ${info.latestVersion}`;\r\n const line2 = `Run: npm i -g ${NPM_PACKAGE}`;\r\n const width = Math.max(line1.length, line2.length) + 4;\r\n const pad = (s: string) => ` │ ${s}${' '.repeat(width - s.length - 4)} │`;\r\n return [\r\n '',\r\n ` ╭${'─'.repeat(width)}╮`,\r\n pad(line1),\r\n pad(line2),\r\n ` ╰${'─'.repeat(width)}╯`,\r\n '',\r\n ].join('\\n');\r\n}\r\n\r\n/**\r\n * Auto-update: detects the package manager used to install dominus-cli\r\n * and runs the appropriate update command. Returns true if the update succeeded.\r\n */\r\nexport async function autoUpdate(currentVersion: string): Promise<{ success: boolean; from: string; to: string; error?: string }> {\r\n const info = await checkForUpdate(currentVersion);\r\n if (!info?.updateAvailable) {\r\n return { success: true, from: currentVersion, to: currentVersion };\r\n }\r\n\r\n // Detect which package manager installed us\r\n const managers = [\r\n { name: 'pnpm', check: 'pnpm list -g dominus-cli', cmd: 'pnpm add -g dominus-cli@latest' },\r\n { name: 'npm', check: 'npm list -g dominus-cli', cmd: 'npm install -g dominus-cli@latest' },\r\n { name: 'yarn', check: 'yarn global list --pattern dominus-cli', cmd: 'yarn global add dominus-cli@latest' },\r\n ];\r\n\r\n let installCmd: string | null = null;\r\n for (const mgr of managers) {\r\n try {\r\n const out = execSync(mgr.check, { stdio: 'pipe', timeout: 10000 }).toString();\r\n if (out.includes('dominus-cli')) {\r\n installCmd = mgr.cmd;\r\n break;\r\n }\r\n } catch {}\r\n }\r\n\r\n // Check if we're a linked install (dev workflow)\r\n if (!installCmd) {\r\n try {\r\n const out = execSync('pnpm list -g dominus-cli', { stdio: 'pipe', timeout: 10000 }).toString();\r\n if (out.includes('link:')) {\r\n // Linked install — pull + rebuild\r\n const pkgPath = path.resolve(__dirname, '..');\r\n if (fs.existsSync(path.join(pkgPath, '.git'))) {\r\n try {\r\n execSync('git pull', { cwd: pkgPath, stdio: 'pipe', timeout: 30000 });\r\n execSync('pnpm install', { cwd: pkgPath, stdio: 'pipe', timeout: 60000 });\r\n execSync('pnpm build', { cwd: pkgPath, stdio: 'pipe', timeout: 60000 });\r\n execSync('pnpm build:plugin', { cwd: pkgPath, stdio: 'pipe', timeout: 30000 });\r\n return { success: true, from: currentVersion, to: info.latestVersion };\r\n } catch (err) {\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: `Git pull/rebuild failed: ${err}` };\r\n }\r\n }\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: 'Linked install without git — run \"pnpm build\" manually in the repo' };\r\n }\r\n } catch {}\r\n }\r\n\r\n if (!installCmd) {\r\n installCmd = `npm install -g ${NPM_PACKAGE}@latest`;\r\n }\r\n\r\n try {\r\n execSync(installCmd, { stdio: 'pipe', timeout: 120000 });\r\n // Clear the update cache so next run shows the new version\r\n writeCache({ lastCheck: 0, latestVersion: null });\r\n return { success: true, from: currentVersion, to: info.latestVersion };\r\n } catch (err) {\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: `Update command failed: ${err}` };\r\n }\r\n}\r\n\r\n// Needed for linked install detection\r\nconst __dirname = path.dirname(new URL(import.meta.url).pathname.replace(/^\\/([A-Z]:)/, '$1'));\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/config.ts","../src/transport/protocol.ts","../src/transport/ws-server.ts","../src/transport/ws-client.ts","../src/ai/provider.ts","../src/agent/internal-memory.ts","../src/memory/store.ts","../src/agent/json-response.ts","../src/agent/verifier.ts","../src/agent/multi-agent/conflicts.ts","../src/agent/multi-agent/worker.ts","../src/agent/multi-agent/coordinator.ts","../src/tools/studio/read-script.ts","../src/tools/studio/edit-script.ts","../src/tools/studio/run-code.ts","../src/tools/studio/get-explorer.ts","../src/tools/studio/get-properties.ts","../src/tools/studio/get-descendants-properties.ts","../src/tools/studio/set-properties.ts","../src/tools/studio/insert-instance.ts","../src/tools/studio/delete-instance.ts","../src/tools/studio/get-output.ts","../src/tools/studio/get-selection.ts","../src/tools/studio/search-scripts.ts","../src/tools/studio/run-tests.ts","../src/tools/studio/get-class-info.ts","../src/tools/studio/create-ui.ts","../src/tools/studio/execute-run-test.ts","../src/tools/studio/execute-play-test.ts","../src/tools/studio/create-part.ts","../src/tools/studio/clone-instance.ts","../src/tools/studio/group-instances.ts","../src/tools/studio/build-multiple.ts","../src/tools/studio/serialize-ui.ts","../src/tools/studio/move-instance.ts","../src/tools/studio/bulk-set-properties.ts","../src/tools/studio/find-replace-scripts.ts","../src/docs/roblox-api.ts","../src/tools/docs/search-roblox-api.ts","../src/tools/docs/get-roblox-api-reference.ts","../src/tools/memory/recall.ts","../src/tools/memory/remember.ts","../src/tools/cloud/upload-asset.ts","../src/tools/studio/undo-redo.ts","../src/tools/registry.ts","../src/mcp/server.ts","../src/ui/components/Welcome.tsx","../src/ui/components/Setup.tsx","../src/ui/components/StatusBar.tsx","../src/ui/components/OutputPane.tsx","../src/ui/components/ChatPane.tsx","../src/utils/clipboard.ts","../src/ui/components/InputBar.tsx","../src/ui/components/Explorer.tsx","../src/ui/components/ToolCallView.tsx","../src/ui/components/Layout.tsx","../src/ui/hooks/useStudio.ts","../src/app.tsx","../src/index.tsx","../src/agent/loop.ts","../src/agent/system-prompt.ts","../src/agent/context-builder.ts","../src/ai/models.ts","../src/agent/planner.ts","../src/agent/task-profile.ts","../src/agent/critic.ts","../src/utils/update-checker.ts"],"names":["fs","path","os","WebSocket","EventEmitter","tool","result","nanoid","React","jsxs","Box","jsx","Text","Fragment","formatTime","useState","useInput","TextInput","useRef","useEffect","useCallback","recallFacts","storeFact","getScriptIndex","execSync","__dirname","startMcpServer"],"mappings":"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","file":"index.js","sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { ConfigAccess } from '../tools/types.js';\n\nconst DOMINUS_DIR = path.join(os.homedir(), '.dominus');\nconst CONFIG_PATH = path.join(DOMINUS_DIR, 'config.json');\nconst DB_PATH = path.join(DOMINUS_DIR, 'dominus.db');\nconst RULES_PATH = path.join(DOMINUS_DIR, 'rules.json');\n\nexport type AIProviderType =\n | 'openai'\n | 'anthropic'\n | 'gemini'\n | 'xai'\n | 'openrouter'\n | 'custom';\n\nexport interface ProviderConfig {\n name: string;\n baseUrl: string;\n envVar: string;\n defaultModel: string;\n}\n\nexport const PROVIDERS: Record<AIProviderType, ProviderConfig> = {\n openai: {\n name: 'OpenAI',\n baseUrl: 'https://api.openai.com/v1',\n envVar: 'OPENAI_API_KEY',\n defaultModel: 'gpt-5.3-codex',\n },\n anthropic: {\n name: 'Anthropic',\n baseUrl: 'https://api.anthropic.com/v1/',\n envVar: 'ANTHROPIC_API_KEY',\n defaultModel: 'claude-sonnet-4-6',\n },\n gemini: {\n name: 'Google Gemini',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai',\n envVar: 'GEMINI_API_KEY',\n defaultModel: 'gemini-3.1-pro',\n },\n xai: {\n name: 'xAI (Grok)',\n baseUrl: 'https://api.x.ai/v1',\n envVar: 'XAI_API_KEY',\n defaultModel: 'grok-4.2',\n },\n openrouter: {\n name: 'OpenRouter',\n baseUrl: 'https://openrouter.ai/api/v1',\n envVar: 'OPENROUTER_API_KEY',\n defaultModel: 'anthropic/claude-sonnet-4-6',\n },\n custom: {\n name: 'Custom',\n baseUrl: '',\n envVar: '',\n defaultModel: '',\n },\n};\n\nexport interface DominusConfig {\n provider: AIProviderType;\n apiKey?: string;\n apiBaseUrl: string;\n model: string;\n port: number;\n maxToolIterations: number;\n maxVerifyRetries: number;\n tokenBudget: number;\n autoIndex: boolean;\n autoLearn: boolean;\n userName: string;\n openCloudApiKey?: string;\n}\n\nconst DEFAULTS: DominusConfig = {\n provider: 'openai',\n apiBaseUrl: '',\n model: '',\n port: 18088,\n maxToolIterations: 25,\n maxVerifyRetries: 3,\n tokenBudget: 128000,\n autoIndex: true,\n autoLearn: true,\n userName: 'Developer',\n};\n\n/**\n * Auto-detect provider from environment variables.\n * Returns the first provider whose env var is set, or null.\n */\nexport function detectProviderFromEnv(): { provider: AIProviderType; apiKey: string } | null {\n const priority: AIProviderType[] = ['openai', 'anthropic', 'gemini', 'xai', 'openrouter'];\n for (const p of priority) {\n const key = process.env[PROVIDERS[p].envVar];\n if (key) return { provider: p, apiKey: key };\n }\n return null;\n}\n\n/**\n * Resolve the effective base URL and model for a provider config.\n */\nexport function resolveProviderSettings(config: DominusConfig): {\n baseUrl: string;\n model: string;\n} {\n const providerInfo = PROVIDERS[config.provider];\n return {\n baseUrl: config.apiBaseUrl || providerInfo?.baseUrl || PROVIDERS.openrouter.baseUrl,\n model: config.model || providerInfo?.defaultModel || 'gpt-4o',\n };\n}\n\nexport interface DominusRules {\n do: string[];\n dont: string[];\n conventions: string[];\n context: string;\n}\n\nconst DEFAULT_RULES: DominusRules = {\n do: [],\n dont: [],\n conventions: [],\n context: '',\n};\n\nfunction ensureDir(): void {\n if (!fs.existsSync(DOMINUS_DIR)) {\n fs.mkdirSync(DOMINUS_DIR, { recursive: true });\n }\n}\n\nfunction readJson<T>(filePath: string, defaults: T): T {\n try {\n if (fs.existsSync(filePath)) {\n const raw = fs.readFileSync(filePath, 'utf-8');\n return { ...defaults, ...JSON.parse(raw) };\n }\n } catch {\n // Corrupted file; reset to defaults\n }\n return { ...defaults };\n}\n\nfunction writeJson(filePath: string, data: unknown): void {\n ensureDir();\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\nexport function loadConfig(): DominusConfig {\n ensureDir();\n return readJson(CONFIG_PATH, DEFAULTS);\n}\n\nexport function saveConfig(config: DominusConfig): void {\n writeJson(CONFIG_PATH, config);\n}\n\nexport function getConfigValue<K extends keyof DominusConfig>(key: K): DominusConfig[K] {\n const config = loadConfig();\n return config[key];\n}\n\nexport function setConfigValue<K extends keyof DominusConfig>(\n key: K,\n value: DominusConfig[K],\n): void {\n const config = loadConfig();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (config as any)[key] = value;\n saveConfig(config);\n}\n\nexport function loadRules(): DominusRules {\n ensureDir();\n return readJson(RULES_PATH, DEFAULT_RULES);\n}\n\nexport function saveRules(rules: DominusRules): void {\n writeJson(RULES_PATH, rules);\n}\n\nexport function getDominusDir(): string {\n ensureDir();\n return DOMINUS_DIR;\n}\n\nexport function getDbPath(): string {\n ensureDir();\n return DB_PATH;\n}\n\nexport function createConfigAccess(): ConfigAccess {\n return {\n get<T>(key: string): T | undefined {\n const config = loadConfig() as unknown as Record<string, unknown>;\n return config[key] as T | undefined;\n },\n set(key: string, value: unknown): void {\n const config = loadConfig() as unknown as Record<string, unknown>;\n config[key] = value;\n saveConfig(config as unknown as DominusConfig);\n },\n getAll(): Record<string, unknown> {\n return loadConfig() as unknown as Record<string, unknown>;\n },\n };\n}\n","import { nanoid } from 'nanoid';\r\n\r\nexport interface WsMessage<T = unknown> {\r\n id: string;\r\n type: string;\r\n payload: T;\r\n ts: number;\r\n}\r\n\r\nexport const StudioMsg = {\r\n CONNECTED: 'studio:connected',\r\n DISCONNECTED: 'studio:disconnected',\r\n EXPLORER: 'studio:explorer',\r\n OUTPUT: 'studio:output',\r\n ERROR: 'studio:error',\r\n SELECTION: 'studio:selection',\r\n SCRIPT_CONTENT: 'studio:script:content',\r\n SCRIPT_CHANGED: 'studio:script:changed',\r\n RESPONSE: 'studio:response',\r\n REFLECTION: 'studio:reflection',\r\n TEST_RESULTS: 'studio:test:results',\r\n} as const;\r\n\r\nexport const CliMsg = {\r\n GET_EXPLORER: 'cli:get:explorer',\r\n GET_SCRIPT: 'cli:get:script',\r\n SET_SCRIPT: 'cli:set:script',\r\n RUN_CODE: 'cli:run',\r\n GET_PROPERTIES: 'cli:get:properties',\r\n GET_DESCENDANTS_PROPERTIES: 'cli:get:descendants:properties',\r\n SET_PROPERTIES: 'cli:set:properties',\r\n INSERT_INSTANCE: 'cli:insert',\r\n DELETE_INSTANCE: 'cli:delete',\r\n GET_SELECTION: 'cli:get:selection',\r\n SELECT: 'cli:select',\r\n SEARCH_SCRIPTS: 'cli:search:scripts',\r\n GET_OUTPUT: 'cli:get:output',\r\n RUN_TESTS: 'cli:run:tests',\r\n EXECUTE_RUN_TEST: 'cli:test:run',\r\n EXECUTE_PLAY_TEST: 'cli:test:play',\r\n END_TEST: 'cli:test:end',\r\n BUILD_UI: 'cli:build:ui',\r\n GET_REFLECTION: 'cli:get:reflection',\r\n UPLOAD_ASSET: 'cli:upload:asset',\r\n SERIALIZE_UI: 'cli:serialize:ui',\r\n MOVE_INSTANCE: 'cli:move:instance',\r\n UNDO: 'cli:undo',\r\n REDO: 'cli:redo',\r\n BULK_SET_PROPERTIES: 'cli:bulk:set:properties',\r\n FIND_REPLACE_SCRIPTS: 'cli:find:replace:scripts',\r\n} as const;\r\n\r\nexport type StudioMsgType = (typeof StudioMsg)[keyof typeof StudioMsg];\r\nexport type CliMsgType = (typeof CliMsg)[keyof typeof CliMsg];\r\n\r\nexport interface ExplorerNode {\r\n name: string;\r\n className: string;\r\n path: string;\r\n children?: ExplorerNode[];\r\n}\r\n\r\nexport interface StudioConnectedPayload {\n studioVersion: string;\n connectionId?: string;\n placeId?: number;\n placeName?: string;\n engineVersion?: string;\n}\n\r\nexport interface ScriptContentPayload {\r\n path: string;\r\n className: 'Script' | 'LocalScript' | 'ModuleScript';\r\n source: string;\r\n lineCount: number;\r\n}\r\n\r\nexport interface ScriptChangedPayload {\r\n path: string;\r\n source: string;\r\n}\r\n\r\nexport interface OutputPayload {\r\n message: string;\r\n level: 'info' | 'warn' | 'error';\r\n timestamp: number;\r\n source?: string;\r\n}\r\n\r\nexport interface SelectionPayload {\r\n paths: string[];\r\n classNames: string[];\r\n}\r\n\r\nexport interface PropertyEntry {\r\n name: string;\r\n value: string;\r\n type: string;\r\n category?: string;\r\n}\r\n\r\nexport interface TestResultPayload {\r\n name: string;\r\n passed: boolean;\r\n duration: number;\r\n error?: string;\r\n}\r\n\r\nexport interface StudioTestPayload {\r\n args?: unknown;\r\n}\r\n\r\nexport interface StudioTestResultPayload {\r\n success: boolean;\r\n result?: unknown;\r\n error?: string;\r\n duration?: number;\r\n}\r\n\r\nexport interface ReflectionPayload {\r\n className: string;\r\n properties: { name: string; type: string; category: string }[];\r\n methods: { name: string; parameters: string[] }[];\r\n events: { name: string; parameters: string[] }[];\r\n}\r\n\r\nexport interface RunCodePayload {\r\n code: string;\r\n}\r\n\r\nexport interface RunCodeResponsePayload {\r\n output: string;\r\n error?: string;\r\n duration: number;\r\n}\r\n\r\nexport interface SearchScriptsPayload {\r\n query: string;\r\n maxResults?: number;\r\n}\r\n\r\nexport interface SearchResultPayload {\r\n results: {\r\n path: string;\r\n className: string;\r\n matches: { line: number; text: string }[];\r\n }[];\r\n}\r\n\r\nexport interface InsertInstancePayload {\r\n className: string;\r\n parentPath: string;\r\n name: string;\r\n properties?: Record<string, unknown>;\r\n}\r\n\r\nexport interface SetPropertiesPayload {\r\n path: string;\r\n properties: Record<string, unknown>;\r\n}\r\n\r\nexport function createMessage<T>(type: string, payload: T): WsMessage<T> {\r\n return { id: nanoid(), type, payload, ts: Date.now() };\r\n}\r\n\r\nexport function createRequest<T>(type: string, payload: T): WsMessage<T> {\r\n return createMessage(type, payload);\r\n}\r\n\r\nexport function parseMessage(raw: string): WsMessage {\r\n try {\r\n return JSON.parse(raw) as WsMessage;\r\n } catch {\r\n throw new Error(`Failed to parse WebSocket message: ${raw.slice(0, 100)}`);\r\n }\r\n}\r\n\r\nexport function serializeMessage(msg: WsMessage): string {\r\n return JSON.stringify(msg);\r\n}\r\n","import { WebSocketServer, WebSocket } from 'ws';\nimport { EventEmitter } from 'node:events';\nimport {\n parseMessage,\n serializeMessage,\n createMessage,\n StudioMsg,\n type WsMessage,\n type StudioConnectedPayload,\n} from './protocol.js';\n\nexport interface StudioConnection {\n ws: WebSocket;\n connectionId: string;\n studioVersion?: string;\n placeId?: number;\n placeName?: string;\n connectedAt: number;\n}\n\nexport interface PlaceInfo {\n placeId: number;\n connectionId: string;\n placeName?: string;\n studioVersion?: string;\n connectedAt: number;\n active: boolean;\n}\n\nexport interface StudioBridge extends EventEmitter {\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs?: number): Promise<WsMessage<T>>;\n sendNotification(type: string, payload: unknown): void;\n isConnected(): boolean;\n getConnectionInfo(): StudioConnection | null;\n getPort(): number;\n stop(): Promise<void>;\n /** List all connected Studio instances */\n listConnections(): PlaceInfo[];\n /** Get/set which placeId is the active target. 0 = auto (single connection). */\n getActivePlaceId(): number;\n setActivePlaceId(placeId: number): void;\n}\n\nexport class DominusServer extends EventEmitter implements StudioBridge {\n private wss: WebSocketServer | null = null;\n /** All connected Studio instances, keyed by placeId (0 for unknown) */\n private studioClients = new Map<number, StudioConnection>();\n /** Reverse lookup: ws → placeId */\n private wsToPlaceId = new Map<WebSocket, number>();\n /** Which placeId to target. 0 = auto-select if only one is connected. */\n private activePlaceId = 0;\n private controllers = new Set<WebSocket>();\n private pendingRequests = new Map<\n string,\n {\n resolve: (msg: WsMessage) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n targetWs: WebSocket;\n targetPlaceId: number;\n }\n >();\n private relayRequests = new Map<\n string,\n {\n controllerWs: WebSocket;\n targetWs: WebSocket;\n targetPlaceId: number;\n }\n >();\n private port: number;\n\n constructor(port = 18088) {\n super();\n this.port = port;\n }\n\n start(maxRetries = 0): Promise<void> {\n return new Promise((resolve, reject) => {\n const tryPort = (port: number, attempt: number) => {\n const wss = new WebSocketServer({ port });\n\n wss.on('listening', () => {\n this.wss = wss;\n this.port = port;\n this.wss.on('connection', (ws) => this.handleConnection(ws));\n this.emit('server:started', { port });\n resolve();\n });\n\n wss.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE' && attempt < maxRetries) {\n wss.close();\n tryPort(port + 1, attempt + 1);\n } else {\n this.emit('server:error', err);\n reject(err);\n }\n });\n };\n\n tryPort(this.port, 0);\n });\n }\n\n private handleConnection(ws: WebSocket): void {\n let identified = false;\n\n ws.on('message', (raw) => {\n try {\n const msg = parseMessage(raw.toString());\n\n if (!identified) {\n if (msg.type === StudioMsg.CONNECTED) {\n identified = true;\n this.setStudioClient(ws, msg);\n return;\n }\n if (msg.type === 'controller:connect') {\n identified = true;\n this.addController(ws);\n ws.send(serializeMessage(createMessage('controller:welcome', {\n studioConnected: this.isConnected(),\n port: this.port,\n connections: this.listConnections(),\n activePlaceId: this.activePlaceId,\n })));\n return;\n }\n }\n\n if (this.controllers.has(ws)) {\n this.handleControllerMessage(ws, msg);\n } else {\n this.handleStudioMessage(ws, msg);\n }\n } catch (err) {\n this.emit('server:error', err);\n }\n });\n\n ws.on('close', () => {\n if (this.controllers.has(ws)) {\n this.controllers.delete(ws);\n for (const [id, relay] of this.relayRequests) {\n if (relay.controllerWs === ws) this.relayRequests.delete(id);\n }\n } else {\n const placeId = this.wsToPlaceId.get(ws);\n if (placeId !== undefined) {\n const conn = this.studioClients.get(placeId);\n this.studioClients.delete(placeId);\n this.wsToPlaceId.delete(ws);\n this.emit('studio:disconnected', { placeId, placeName: conn?.placeName });\n this.broadcastToControllers('studio:disconnected', { placeId, placeName: conn?.placeName });\n // Reject pending requests that were targeting this ws\n for (const [id, pending] of this.pendingRequests) {\n if (pending.targetWs === ws) {\n clearTimeout(pending.timer);\n pending.reject(new Error(`Studio disconnected (place ${placeId})`));\n this.pendingRequests.delete(id);\n }\n }\n for (const [id, relay] of this.relayRequests) {\n if (relay.targetWs === ws) {\n if (relay.controllerWs.readyState === WebSocket.OPEN) {\n relay.controllerWs.send(serializeMessage({\n id,\n type: StudioMsg.RESPONSE,\n payload: { error: `Studio disconnected (place ${placeId})` },\n ts: Date.now(),\n }));\n }\n this.relayRequests.delete(id);\n }\n }\n // If the active place disconnected, reset to auto\n if (this.activePlaceId === placeId) {\n this.activePlaceId = 0;\n this.broadcastTargetState();\n }\n }\n }\n });\n\n ws.on('error', (err) => {\n this.emit('server:error', err);\n });\n }\n\n private setStudioClient(ws: WebSocket, msg: WsMessage): void {\n const payload = msg.payload as StudioConnectedPayload;\n const placeId = payload.placeId ?? 0;\n\n // If same placeId reconnects, close the old one\n const existing = this.studioClients.get(placeId);\n if (existing && existing.ws !== ws) {\n existing.ws.close();\n this.wsToPlaceId.delete(existing.ws);\n }\n\n const conn: StudioConnection = {\n ws,\n connectionId: `${placeId}:${Date.now()}:${Math.random().toString(36).slice(2, 8)}`,\n connectedAt: Date.now(),\n studioVersion: payload.studioVersion,\n placeId,\n placeName: payload.placeName,\n };\n this.studioClients.set(placeId, conn);\n this.wsToPlaceId.set(ws, placeId);\n\n if (this.studioClients.size === 1 && this.activePlaceId === 0) {\n this.activePlaceId = placeId;\n }\n\n this.emit('studio:connected', { ...payload, placeId, connectionId: conn.connectionId });\n this.broadcastToControllers('studio:connected', { ...payload, placeId, connectionId: conn.connectionId });\n this.broadcastTargetState();\n }\n\n private addController(ws: WebSocket): void {\n this.controllers.add(ws);\n this.emit('controller:connected');\n }\n\n private broadcastToControllers(type: string, payload: unknown): void {\n const msg = serializeMessage(createMessage(type, payload));\n for (const ws of this.controllers) {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(msg);\n }\n }\n }\n\n private handleControllerMessage(controllerWs: WebSocket, msg: WsMessage): void {\n if (msg.type === 'controller:set_active_place') {\n const payload = msg.payload as { placeId?: number };\n try {\n this.setActivePlaceId(Number(payload.placeId ?? 0));\n } catch (err) {\n controllerWs.send(serializeMessage({\n id: msg.id,\n type: StudioMsg.RESPONSE,\n payload: { success: false, error: err instanceof Error ? err.message : String(err) },\n ts: Date.now(),\n }));\n return;\n }\n controllerWs.send(serializeMessage({\n id: msg.id,\n type: StudioMsg.RESPONSE,\n payload: { success: true, activePlaceId: this.activePlaceId, connections: this.listConnections() },\n ts: Date.now(),\n }));\n return;\n }\n\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) {\n controllerWs.send(serializeMessage({\n id: msg.id,\n type: StudioMsg.RESPONSE,\n payload: { error: this.getTargetError() },\n ts: Date.now(),\n }));\n return;\n }\n\n this.relayRequests.set(msg.id, {\n controllerWs,\n targetWs: target.ws,\n targetPlaceId: target.placeId ?? 0,\n });\n target.ws.send(serializeMessage(msg));\n }\n\n private handleStudioMessage(ws: WebSocket, msg: WsMessage): void {\n if (msg.type === StudioMsg.CONNECTED) {\n // Re-handshake — update existing connection info\n const payload = msg.payload as StudioConnectedPayload;\n const placeId = this.wsToPlaceId.get(ws);\n if (placeId !== undefined) {\n const conn = this.studioClients.get(placeId);\n if (conn) {\n conn.studioVersion = payload.studioVersion;\n conn.placeId = payload.placeId;\n conn.placeName = payload.placeName;\n }\n }\n this.emit('studio:connected', payload);\n this.broadcastToControllers('studio:connected', payload);\n return;\n }\n\n if (msg.type === StudioMsg.RESPONSE) {\n if (!this.wsToPlaceId.has(ws)) return;\n // Check if this is a relayed request from a controller\n const relay = this.relayRequests.get(msg.id);\n if (relay) {\n if (relay.targetWs !== ws) {\n this.emit('server:error', new Error(`Ignoring relayed response ${msg.id} from non-target Studio`));\n return;\n }\n if (relay.controllerWs.readyState === WebSocket.OPEN) {\n relay.controllerWs.send(serializeMessage(msg));\n }\n this.relayRequests.delete(msg.id);\n return;\n }\n\n // Otherwise handle locally (MCP or direct)\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n if (pending.targetWs !== ws) {\n this.emit('server:error', new Error(`Ignoring response ${msg.id} from non-target Studio`));\n return;\n }\n clearTimeout(pending.timer);\n pending.resolve(msg);\n this.pendingRequests.delete(msg.id);\n }\n return;\n }\n\n // Forward events to controllers and local listeners\n this.emit(msg.type, msg.payload);\n this.emit('message', msg);\n this.broadcastToControllers(msg.type, msg.payload);\n }\n\n /** Resolve which Studio connection to target */\n private resolveTarget(): StudioConnection | null {\n if (this.studioClients.size === 0) return null;\n\n // Explicit active place\n if (this.activePlaceId !== 0) {\n const conn = this.studioClients.get(this.activePlaceId);\n if (conn && conn.ws.readyState === WebSocket.OPEN) return conn;\n return null;\n }\n\n // Auto: if exactly one connection, use it\n if (this.studioClients.size === 1) {\n const conn = this.studioClients.values().next().value!;\n if (conn.ws.readyState === WebSocket.OPEN) return conn;\n return null;\n }\n\n // Multiple connections, no active set — return null (ambiguous)\n return null;\n }\n\n /** Generate an appropriate error message when no target found */\n private getTargetError(): string {\n if (this.studioClients.size === 0) return 'No Studio connection';\n if (this.activePlaceId !== 0) {\n return `Active place ${this.activePlaceId} is not connected. Use set_active_place or list_connections.`;\n }\n const places = [...this.studioClients.values()].map(c => `${c.placeName ?? 'Unknown'} (${c.placeId})`);\n return `Multiple Studio instances connected: ${places.join(', ')}. Use set_active_place to choose one.`;\n }\n\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 10000): Promise<WsMessage<T>> {\n return new Promise((resolve, reject) => {\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) {\n reject(new Error(this.getTargetError()));\n return;\n }\n\n const msg = createMessage(type, payload);\n\n const timer = setTimeout(() => {\n this.pendingRequests.delete(msg.id);\n reject(new Error(`Request timed out: ${type}`));\n }, timeoutMs);\n\n this.pendingRequests.set(msg.id, {\n resolve: resolve as (msg: WsMessage) => void,\n reject,\n timer,\n targetWs: target.ws,\n targetPlaceId: target.placeId ?? 0,\n });\n\n target.ws.send(serializeMessage(msg));\n });\n }\n\n sendNotification(type: string, payload: unknown): void {\n const target = this.resolveTarget();\n if (!target || target.ws.readyState !== WebSocket.OPEN) return;\n const msg = createMessage(type, payload);\n target.ws.send(serializeMessage(msg));\n }\n\n isConnected(): boolean {\n return this.resolveTarget() !== null;\n }\n\n getConnectionInfo(): StudioConnection | null {\n return this.resolveTarget();\n }\n\n listConnections(): PlaceInfo[] {\n return [...this.studioClients.values()]\n .filter(c => c.ws.readyState === WebSocket.OPEN)\n .map(c => ({\n placeId: c.placeId ?? 0,\n connectionId: c.connectionId,\n placeName: c.placeName,\n studioVersion: c.studioVersion,\n connectedAt: c.connectedAt,\n active: (this.activePlaceId === 0 && this.studioClients.size === 1)\n || c.placeId === this.activePlaceId,\n }));\n }\n\n getActivePlaceId(): number {\n return this.activePlaceId;\n }\n\n setActivePlaceId(placeId: number): void {\n if (placeId !== 0 && !this.studioClients.has(placeId)) {\n throw new Error(`Place ${placeId} is not connected`);\n }\n this.activePlaceId = placeId;\n this.broadcastTargetState();\n }\n\n private broadcastTargetState(): void {\n this.broadcastToControllers('controller:target_state', {\n activePlaceId: this.activePlaceId,\n connections: this.listConnections(),\n });\n }\n\n getPort(): number {\n return this.port;\n }\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n for (const conn of this.studioClients.values()) {\n conn.ws.close();\n }\n this.studioClients.clear();\n this.wsToPlaceId.clear();\n for (const ws of this.controllers) {\n ws.close();\n }\n this.controllers.clear();\n for (const [, pending] of this.pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Server shutting down'));\n }\n this.pendingRequests.clear();\n this.relayRequests.clear();\n\n if (this.wss) {\n this.wss.close(() => resolve());\n } else {\n resolve();\n }\n });\n }\n}\n","import { WebSocket } from 'ws';\r\nimport { EventEmitter } from 'node:events';\r\nimport {\r\n parseMessage,\r\n serializeMessage,\r\n createMessage,\r\n StudioMsg,\r\n type WsMessage,\r\n type StudioConnectedPayload,\r\n} from './protocol.js';\r\nimport type { StudioBridge, StudioConnection, PlaceInfo } from './ws-server.js';\r\n\r\n/**\r\n * Connects as a relay client to an existing DominusServer.\r\n * Has the same interface as DominusServer so the TUI/Agent\r\n * can use either transparently.\r\n */\r\nexport class DominusClient extends EventEmitter implements StudioBridge {\r\n private ws: WebSocket | null = null;\r\n private port: number;\r\n private studioConnected = false;\r\n private connections = new Map<number, Omit<StudioConnection, 'ws'>>();\r\n private activePlaceId = 0;\r\n private pendingRequests = new Map<\n string,\n { resolve: (msg: WsMessage) => void; reject: (err: Error) => void; timer: ReturnType<typeof setTimeout> }\n >();\n\r\n constructor(port = 18088) {\r\n super();\r\n this.port = port;\r\n }\r\n\r\n connect(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const url = `ws://localhost:${this.port}`;\r\n const ws = new WebSocket(url);\r\n\r\n ws.on('open', () => {\r\n this.ws = ws;\r\n ws.send(serializeMessage(createMessage('controller:connect', {})));\r\n this.emit('server:started', { port: this.port, relay: true });\r\n resolve();\r\n });\r\n\r\n ws.on('message', (raw) => {\r\n try {\r\n const msg = parseMessage(raw.toString());\r\n this.handleMessage(msg);\r\n } catch (err) {\r\n this.emit('server:error', err);\r\n }\r\n });\r\n\r\n ws.on('close', () => {\r\n this.ws = null;\r\n this.studioConnected = false;\r\n this.emit('studio:disconnected');\r\n for (const [id, pending] of this.pendingRequests) {\r\n clearTimeout(pending.timer);\r\n pending.reject(new Error('Relay connection lost'));\r\n this.pendingRequests.delete(id);\r\n }\r\n });\r\n\r\n ws.on('error', (err) => {\r\n if (!this.ws) reject(err);\r\n this.emit('server:error', err);\r\n });\r\n });\r\n }\r\n\r\n private handleMessage(msg: WsMessage): void {\r\n if (msg.type === 'controller:welcome') {\n const p = msg.payload as {\r\n studioConnected: boolean;\r\n connections?: PlaceInfo[];\r\n activePlaceId?: number;\r\n };\r\n this.studioConnected = p.studioConnected;\r\n if (p.connections) {\n this.connections.clear();\n for (const c of p.connections) {\n this.connections.set(c.placeId, toConnectionInfo(c));\n }\n }\n if (p.activePlaceId !== undefined) {\r\n this.activePlaceId = p.activePlaceId;\r\n }\r\n if (this.studioConnected) {\r\n this.emit('studio:connected', {});\r\n }\r\n return;\n }\n\n if (msg.type === 'controller:target_state') {\n const payload = msg.payload as { activePlaceId?: number; connections?: PlaceInfo[] };\n this.applyTargetState(payload);\n this.emit('controller:target_state', payload);\n return;\n }\n\r\n if (msg.type === 'studio:connected') {\r\n this.studioConnected = true;\r\n const payload = msg.payload as StudioConnectedPayload & { placeId?: number };\r\n const placeId = payload.placeId ?? 0;\n this.connections.set(placeId, {\n connectedAt: Date.now(),\n connectionId: payload.connectionId ?? `${placeId}`,\n studioVersion: payload.studioVersion,\n placeId,\n placeName: payload.placeName,\n });\r\n this.emit('studio:connected', payload);\r\n return;\r\n }\r\n\r\n if (msg.type === 'studio:disconnected') {\r\n const payload = msg.payload as { placeId?: number };\r\n const placeId = payload.placeId ?? 0;\r\n this.connections.delete(placeId);\r\n if (this.connections.size === 0) {\r\n this.studioConnected = false;\r\n }\r\n if (this.activePlaceId === placeId) {\n this.activePlaceId = 0;\n }\n this.studioConnected = this.resolveTargetInfo() !== null;\n this.emit('studio:disconnected', payload);\n return;\n }\n\r\n if (msg.type === StudioMsg.RESPONSE) {\r\n const pending = this.pendingRequests.get(msg.id);\r\n if (pending) {\r\n clearTimeout(pending.timer);\r\n pending.resolve(msg);\r\n this.pendingRequests.delete(msg.id);\r\n }\r\n return;\r\n }\r\n\r\n this.emit(msg.type, msg.payload);\r\n this.emit('message', msg);\r\n }\r\n\r\n sendRequest<T = unknown>(type: string, payload: unknown, timeoutMs = 10000): Promise<WsMessage<T>> {\n return new Promise((resolve, reject) => {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\r\n reject(new Error('Not connected to Dominus server'));\r\n return;\r\n }\r\n if (!this.studioConnected) {\r\n reject(new Error('Studio not connected'));\r\n return;\r\n }\r\n\r\n const msg = createMessage(type, payload);\r\n\r\n const timer = setTimeout(() => {\r\n this.pendingRequests.delete(msg.id);\r\n reject(new Error(`Request timed out: ${type}`));\r\n }, timeoutMs);\r\n\r\n this.pendingRequests.set(msg.id, {\r\n resolve: resolve as (msg: WsMessage) => void,\r\n reject,\r\n timer,\r\n });\r\n\r\n this.ws.send(serializeMessage(msg));\r\n });\r\n }\r\n\r\n sendNotification(type: string, payload: unknown): void {\r\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\r\n const msg = createMessage(type, payload);\r\n this.ws.send(serializeMessage(msg));\r\n }\r\n\r\n isConnected(): boolean {\n return this.resolveTargetInfo() !== null;\n }\n\n getConnectionInfo(): StudioConnection | null {\n const target = this.resolveTargetInfo();\n if (!target) return null;\n return { ...target, ws: this.ws! } as StudioConnection;\n }\n\n listConnections(): PlaceInfo[] {\n return [...this.connections.values()].map(c => ({\n placeId: c.placeId ?? 0,\n connectionId: c.connectionId,\n placeName: c.placeName,\n studioVersion: c.studioVersion,\n connectedAt: c.connectedAt,\n active: (this.activePlaceId === 0 && this.connections.size === 1)\n || c.placeId === this.activePlaceId,\n }));\n }\n\r\n getActivePlaceId(): number {\r\n return this.activePlaceId;\r\n }\r\n\r\n setActivePlaceId(placeId: number): void {\n if (placeId !== 0 && !this.connections.has(placeId)) {\n throw new Error(`Place ${placeId} is not connected`);\n }\n this.activePlaceId = placeId;\n if (this.ws?.readyState === WebSocket.OPEN) {\n const msg = createMessage('controller:set_active_place', { placeId });\n this.ws.send(serializeMessage(msg));\n }\n }\n\n private applyTargetState(payload: TargetStatePayload): void {\n if (payload.activePlaceId !== undefined) {\n this.activePlaceId = payload.activePlaceId;\n }\n if (payload.connections) {\n this.connections.clear();\n for (const c of payload.connections) {\n this.connections.set(c.placeId, toConnectionInfo(c));\n }\n }\n this.studioConnected = this.resolveTargetInfo() !== null;\n }\n\n private resolveTargetInfo(): Omit<StudioConnection, 'ws'> | null {\n if (this.connections.size === 0) return null;\n\n if (this.activePlaceId !== 0) {\n return this.connections.get(this.activePlaceId) ?? null;\n }\n\n if (this.connections.size === 1) {\n return this.connections.values().next().value ?? null;\n }\n\n return null;\n }\n\n getPort(): number {\n return this.port;\n }\r\n\r\n stop(): Promise<void> {\r\n return new Promise((resolve) => {\r\n for (const [, pending] of this.pendingRequests) {\r\n clearTimeout(pending.timer);\r\n pending.reject(new Error('Client shutting down'));\r\n }\r\n this.pendingRequests.clear();\r\n if (this.ws) {\r\n this.ws.close();\r\n this.ws = null;\r\n }\r\n resolve();\r\n });\r\n }\r\n}\n\ninterface TargetStatePayload {\n activePlaceId?: number;\n connections?: PlaceInfo[];\n}\n\nfunction toConnectionInfo(c: PlaceInfo): Omit<StudioConnection, 'ws'> {\n return {\n connectedAt: c.connectedAt,\n connectionId: c.connectionId,\n studioVersion: c.studioVersion,\n placeId: c.placeId,\n placeName: c.placeName,\n };\n}\n\r\n/**\r\n * Check if a Dominus server is already running on the given port.\r\n */\r\nexport async function isPortInUse(port: number): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const ws = new WebSocket(`ws://localhost:${port}`);\r\n const timer = setTimeout(() => {\r\n ws.close();\r\n resolve(false);\r\n }, 1000);\r\n\r\n ws.on('open', () => {\r\n clearTimeout(timer);\r\n ws.close();\r\n resolve(true);\r\n });\r\n\r\n ws.on('error', () => {\r\n clearTimeout(timer);\r\n resolve(false);\r\n });\r\n });\r\n}\r\n","import OpenAI from 'openai';\nimport { type DominusConfig, resolveProviderSettings, PROVIDERS } from '../config/config.js';\nimport type { Tool, ToolCall } from '../tools/types.js';\n\nexport interface AIResponse {\n content: string | null;\n toolCalls: ToolCall[];\n finishReason: string;\n usage?: { promptTokens: number; completionTokens: number; totalTokens: number };\n}\n\nexport interface StreamChunk {\n type: 'text' | 'tool_call_start' | 'tool_call_delta' | 'tool_call_end' | 'done';\n content?: string;\n toolCall?: Partial<ToolCall>;\n}\n\nexport class AIProvider {\n private client: OpenAI;\n private model: string;\n private providerName: string;\n\n constructor(config: DominusConfig) {\n if (!config.apiKey) {\n throw new Error('API key not configured. Run: dominus config set apiKey <your-key>');\n }\n\n const { baseUrl, model } = resolveProviderSettings(config);\n this.providerName = PROVIDERS[config.provider]?.name ?? config.provider;\n\n this.client = new OpenAI({\n apiKey: config.apiKey,\n baseURL: baseUrl,\n });\n this.model = model;\n }\n\n setModel(model: string): void {\n this.model = model;\n }\n\n getModel(): string {\n return this.model;\n }\n\n getProviderName(): string {\n return this.providerName;\n }\n\n async listModels(): Promise<{ id: string; owned_by?: string }[]> {\n try {\n const list = await this.client.models.list();\n const models: { id: string; owned_by?: string }[] = [];\n for await (const m of list) {\n models.push({ id: m.id, owned_by: m.owned_by });\n }\n models.sort((a, b) => a.id.localeCompare(b.id));\n return models;\n } catch {\n return [];\n }\n }\n\n async chat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools?: Tool[],\n ): Promise<AIResponse> {\n const openAITools = tools?.map(toolToOpenAI);\n\n const response = await this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: openAITools?.length ? openAITools : undefined,\n temperature: 0.3,\n });\n\n const choice = response.choices[0];\n if (!choice) throw new Error('No response from AI');\n\n const toolCalls: ToolCall[] = (choice.message.tool_calls ?? []).map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n }));\n\n return {\n content: choice.message.content,\n toolCalls,\n finishReason: choice.finish_reason ?? 'stop',\n usage: response.usage\n ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n }\n : undefined,\n };\n }\n\n async *streamChat(\n messages: OpenAI.ChatCompletionMessageParam[],\n tools?: Tool[],\n ): AsyncGenerator<StreamChunk> {\n const openAITools = tools?.map(toolToOpenAI);\n\n const stream = await this.client.chat.completions.create({\n model: this.model,\n messages,\n tools: openAITools?.length ? openAITools : undefined,\n temperature: 0.3,\n stream: true,\n });\n\n const toolCallBuffers = new Map<number, { id: string; name: string; args: string }>();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n yield { type: 'text', content: delta.content };\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (!toolCallBuffers.has(tc.index)) {\n toolCallBuffers.set(tc.index, {\n id: tc.id ?? '',\n name: tc.function?.name ?? '',\n args: '',\n });\n if (tc.function?.name) {\n yield {\n type: 'tool_call_start',\n toolCall: { id: tc.id, name: tc.function.name },\n };\n }\n }\n\n const buffer = toolCallBuffers.get(tc.index)!;\n if (tc.id) buffer.id = tc.id;\n if (tc.function?.name) buffer.name = tc.function.name;\n if (tc.function?.arguments) {\n buffer.args += tc.function.arguments;\n yield {\n type: 'tool_call_delta',\n content: tc.function.arguments,\n toolCall: { id: buffer.id, name: buffer.name },\n };\n }\n }\n }\n\n if (chunk.choices[0]?.finish_reason === 'tool_calls') {\n for (const [, buffer] of toolCallBuffers) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(buffer.args);\n } catch {\n /* empty args */\n }\n yield {\n type: 'tool_call_end',\n toolCall: { id: buffer.id, name: buffer.name, arguments: args },\n };\n }\n toolCallBuffers.clear();\n }\n }\n\n yield { type: 'done' };\n }\n}\n\nfunction toolToOpenAI(tool: Tool): OpenAI.ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters as unknown as Record<string, unknown>,\n },\n };\n}\n","/**\r\n * INTERNAL_MEMORY — lessons learned and quirks that ship with Dominus.\r\n *\r\n * These are baked into every system prompt so the agent doesn't repeat\r\n * known mistakes. Add entries here when you discover a pattern that caused\r\n * a failure, an unintuitive API, or a workaround that should be remembered.\r\n *\r\n * Keep entries short, specific, and actionable. Prefer bullet points over prose.\r\n */\r\n\r\nexport const INTERNAL_MEMORY = `## Internal Memory — Known Quirks & Lessons\r\n\r\nThese are built-in lessons that ship with Dominus. Follow them exactly.\r\n\r\n### create_ui — property format\r\n- Each node accepts properties in **either** of two shapes:\r\n - **Flattened (preferred)**: props as top-level keys next to \\`ClassName\\`, \\`Name\\`, \\`Children\\`.\r\n \\`\\`\\`json\r\n { \"ClassName\": \"TextButton\", \"Name\": \"Btn\", \"Text\": \"OK\", \"Size\": [0, 100, 0, 40] }\r\n \\`\\`\\`\r\n - **Nested bag**: props grouped under \\`properties\\` / \\`Properties\\` / \\`props\\` / \\`Props\\`.\r\n \\`\\`\\`json\r\n { \"ClassName\": \"TextButton\", \"Name\": \"Btn\",\r\n \"properties\": { \"Text\": \"OK\", \"Size\": [0, 100, 0, 40] } }\r\n \\`\\`\\`\r\n- Do NOT mix a nested \\`properties\\` bag with flattened props of the same name — the bag wins.\r\n- Reserved keys (never treated as instance properties): \\`ClassName\\`, \\`className\\`, \\`Name\\`, \\`name\\`, \\`Children\\`, \\`children\\`, \\`properties\\`, \\`Properties\\`, \\`props\\`, \\`Props\\`.\r\n\r\n### build_multiple — schema is strict\r\n- Top-level keys only: \\`name\\`, \\`className\\`, \\`position\\`, \\`size\\`, \\`color\\`, \\`material\\`, \\`anchored\\`, \\`shape\\`, \\`transparency\\`, \\`parent\\`, \\`canCollide\\`.\r\n- Does NOT accept a nested \\`properties\\` bag. For anything outside those fields use \\`insert_instance\\` + \\`set_properties\\`.\r\n- \\`shape\\` values: \\`Block\\`, \\`Ball\\`, \\`Cylinder\\`, \\`Wedge\\`.\r\n\r\n### Color formats (accepted everywhere)\r\n- Hex: \\`\"#RRGGBB\"\\`\r\n- RGB string: \\`\"rgb(255, 128, 0)\"\\`\r\n- BrickColor name: \\`\"Bright red\"\\`, \\`\"Institutional white\"\\`, \\`\"Really black\"\\`, etc.\r\n- Array: \\`[r, g, b]\\` (0–1 floats) or \\`[255, 128, 0]\\` (auto-detected if any value > 1)\r\n\r\n### UDim2 / UDim / Vector2 / Color3 coercion (create_ui)\r\n- UDim2: \\`[xScale, xOffset, yScale, yOffset]\\` or \\`{XScale, XOffset, YScale, YOffset}\\`.\r\n- UDim: \\`[scale, offset]\\` or a plain number (treated as pixels).\r\n- Vector2 (e.g. \\`AnchorPoint\\`): \\`[x, y]\\` or \\`{x, y}\\`.\r\n- 2-element arrays are auto-disambiguated by property name (\\`AnchorPoint\\` → Vector2, \\`CornerRadius\\` → UDim).\r\n\r\n### Common GUI property names\r\n- GUI uses \\`Size\\`/\\`Position\\` as **UDim2** — never Vector3.\r\n- \\`BackgroundColor3\\`, \\`TextColor3\\`, \\`BorderColor3\\`, \\`ImageColor3\\` → Color3.\r\n- \\`Font\\` accepts a string enum name like \\`\"GothamBold\"\\`, \\`\"SourceSans\"\\`.\r\n- Enum properties take the string name: \\`\"Center\"\\`, \\`\"Left\"\\`, \\`\"Fit\"\\`.\r\n\r\n### Tool selection cheat-sheet\r\n- Single 3D part → \\`create_part\\`\r\n- Many 3D parts (tree, building, vehicle) → \\`build_multiple\\` with \\`groupName\\`\r\n- Full UI tree → \\`create_ui\\` (one call, never loop \\`insert_instance\\` for UI)\r\n- **Convert/export existing UI → \\`serialize_ui\\`** (NOT get_descendants_properties)\r\n- Adjusting an existing instance → \\`set_properties\\` (not \\`run_code\\`)\r\n- **Inspecting user's selection → \\`get_selection\\`, then \\`get_properties\\` or \\`serialize_ui\\`**\r\n- **Reading properties → \\`get_properties\\` (NEVER \\`run_code\\` with dump scripts)**\r\n- **Browsing the tree → \\`get_explorer\\`**\r\n- **Multiple Studios open → \\`list_connections\\` to see all, \\`set_active_place\\` to target one**\r\n- Anything exotic or procedural → \\`run_code\\` as last resort\r\n\r\n### NEVER use run_code for:\r\n- Getting properties of an instance → use \\`get_properties\\` or \\`serialize_ui\\`\r\n- Dumping selection info → use \\`inspect_selection\\` (ONE call does it all)\r\n- Inspecting an instance + its children → use \\`inspect_instance\\`\r\n- Converting UI to Roact/React → use \\`convert_ui_to_code\\`\r\n- Creating instances → use \\`create_part\\`, \\`create_ui\\`, \\`insert_instance\\`, \\`build_multiple\\`\r\n- Modifying properties → use \\`set_properties\\` or \\`bulk_set_properties\\`\r\n- Bulk font/style/scaling changes → use \\`bulk_set_properties\\` with filter mode (root + className + properties)\r\n- Adding UIStroke/UICorner to many instances → use \\`bulk_set_properties\\` with \\`addChildren\\` (idempotent)\r\n- Reading scripts → use \\`read_script\\`\r\n- Browsing the explorer → use \\`get_explorer\\`\r\n\\`run_code\\` is ONLY for procedural logic, terrain generation, raycasts, physics queries, or custom algorithms with no tool equivalent.\r\n\r\n### Composite skill tools (prefer these over chaining)\r\n- \\`inspect_selection\\` — Returns paths + compact properties for all selected instances in ONE call. Use when user says \"my selection\" or \"what I selected\".\r\n- \\`inspect_instance\\` — Returns compact properties + children tree for a single instance in ONE call. Combines get_properties + get_explorer.\r\n- \\`convert_ui_to_code\\` — Serializes a UI tree and generates a Roact/React component. Use when user says \"turn this into a component\" or \"convert to React\".\r\n\r\n### UI Pre-Flight — ASK BEFORE BUILDING\r\nBefore creating any non-trivial UI (more than a single element), **ask the user these questions** to avoid rework:\r\n- **A) Device scaling** — \"Should this UI scale for mobile/tablet, or is it PC-only?\"\r\n - Mobile: use Scale-based sizing, UIAspectRatioConstraint, TextScaled or AutomaticSize, avoid large pixel offsets.\r\n - PC-only: pixel offsets are fine.\r\n- **B) ScreenGui structure** — \"All panels in one ScreenGui, or separate ScreenGuis per panel?\"\r\n - One: simpler, easy to toggle all at once.\r\n - Separate: independent ZIndex, modular show/hide.\r\n- **C) Font & style** — \"Any preferred font, color scheme, or style reference?\"\r\n - Default to Roboto if user has no preference. Use FontFace with Weight=Bold for bold.\r\n - Match screenshots closely (transparency, stroke, spacing).\r\n- Skip these only if the user already specified preferences or the task is trivially small.\r\n\r\n### Verification habits\r\n- After a build, call \\`get_explorer\\` or \\`get_selection\\` to confirm the tree looks right.\r\n- After editing a script, read it back.\r\n- After \\`run_code\\`, check \\`get_output\\` for errors.\r\n\r\n### serialize_ui — the RIGHT tool for UI conversion\r\n- **Use \\`serialize_ui\\` when converting existing UI to Roact/React/Fusion components.** It returns a minimal JSON tree with only non-default properties, already in JSON-friendly formats.\r\n- **Do NOT use \\`get_descendants_properties\\` for UI conversion** — it returns a flat list with ~50+ properties per instance (including read-only, deprecated, nil, and default values), which bloats context and confuses conversion.\r\n- \\`serialize_ui\\` output maps 1:1 to \\`create_ui\\` input — you can round-trip UI through it.\r\n- The tree structure preserves parent-child hierarchy, so Roact/React children mapping is direct.\r\n\r\n### UI → Roact/React conversion cheat-sheet\r\n- \\`serialize_ui\\` path → JSON tree → map each node to \\`Roact.createElement(ClassName, props, childrenDict)\\`\r\n- UDim2 arrays \\`[xS, xO, yS, yO]\\` → \\`UDim2.new(xS, xO, yS, yO)\\`\r\n- Color3 hex strings → \\`Color3.fromHex(\"#RRGGBB\")\\`\r\n- Vector2 arrays → \\`Vector2.new(x, y)\\`\r\n- UDim arrays → \\`UDim.new(s, o)\\`\r\n- Enum strings like \\`\"Center\"\\` → \\`Enum.TextXAlignment.Center\\`\r\n- FontFace → \\`Font.new(family, weight, style)\\`\r\n- UI modifiers (UICorner, UIStroke, UIGradient, UIListLayout, UIPadding) are CHILDREN not props\r\n- Use instance Name as dictionary key in children table\r\n`;\r\n","import fs from 'node:fs';\r\nimport initSqlJs from 'sql.js';\r\nimport type { Database, QueryExecResult } from 'sql.js';\r\nimport { getDbPath } from '../config/config.js';\r\nimport type { Fact, FactCategory, SessionSummary, ChatMessage, ScriptEntry } from './types.js';\r\n\r\nlet db: Database | null = null;\r\nlet dbPath: string;\r\n\r\nconst SCHEMA = `\r\nCREATE TABLE IF NOT EXISTS facts (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n content TEXT NOT NULL,\r\n category TEXT NOT NULL,\r\n source TEXT,\r\n relevance REAL DEFAULT 1.0,\r\n created_at INTEGER NOT NULL,\r\n accessed_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS summaries (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n session_id TEXT NOT NULL,\r\n summary TEXT NOT NULL,\r\n created_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS messages (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n session_id TEXT NOT NULL,\r\n role TEXT NOT NULL,\r\n content TEXT NOT NULL,\r\n tool_name TEXT,\r\n created_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE TABLE IF NOT EXISTS script_index (\r\n id INTEGER PRIMARY KEY AUTOINCREMENT,\r\n project_id TEXT NOT NULL,\r\n path TEXT NOT NULL,\r\n class_name TEXT NOT NULL,\r\n summary TEXT,\r\n line_count INTEGER,\r\n last_hash TEXT,\r\n updated_at INTEGER NOT NULL\r\n);\r\n\r\nCREATE INDEX IF NOT EXISTS idx_facts_project ON facts(project_id);\r\nCREATE INDEX IF NOT EXISTS idx_facts_category ON facts(project_id, category);\r\nCREATE INDEX IF NOT EXISTS idx_scripts_project ON script_index(project_id);\r\nCREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);\r\nCREATE INDEX IF NOT EXISTS idx_summaries_project ON summaries(project_id);\r\n`;\r\n\r\nfunction persist(): void {\r\n if (!db) return;\r\n const data = db.export();\r\n fs.writeFileSync(dbPath, Buffer.from(data));\r\n}\r\n\r\nexport async function initMemoryStore(): Promise<void> {\r\n if (db) return;\r\n dbPath = getDbPath();\r\n const SQL = await initSqlJs();\r\n\r\n if (fs.existsSync(dbPath)) {\r\n const buffer = fs.readFileSync(dbPath);\r\n db = new SQL.Database(buffer);\r\n } else {\r\n db = new SQL.Database();\r\n }\r\n\r\n db.run(SCHEMA);\r\n persist();\r\n}\r\n\r\nexport function getDb(): Database {\r\n if (!db) throw new Error('Memory store not initialized. Call initMemoryStore() first.');\r\n return db;\r\n}\r\n\r\nexport function closeMemoryStore(): void {\r\n if (db) {\r\n persist();\r\n db.close();\r\n db = null;\r\n }\r\n}\r\n\r\n// --- Facts ---\r\n\r\nexport function storeFact(fact: Omit<Fact, 'id'>): number {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO facts (project_id, content, category, source, relevance, created_at, accessed_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n fact.projectId,\r\n fact.content,\r\n fact.category,\r\n fact.source ?? null,\r\n fact.relevance,\r\n fact.createdAt,\r\n fact.accessedAt,\r\n ],\r\n );\r\n persist();\r\n const stmt = d.prepare('SELECT last_insert_rowid()');\r\n stmt.step();\r\n const row = stmt.get();\r\n stmt.free();\r\n return (row?.[0] as number) ?? 0;\r\n}\r\n\r\nexport function recallFacts(projectId: string, query: string, limit = 10): Fact[] {\r\n const d = getDb();\r\n const keywords = query\r\n .toLowerCase()\r\n .split(/\\s+/)\r\n .filter((w) => w.length > 2);\r\n\r\n if (keywords.length === 0) {\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? ORDER BY relevance DESC, accessed_at DESC LIMIT ?`,\r\n [projectId, limit],\r\n );\r\n return rowsToFacts(result);\r\n }\r\n\r\n const likeClauses = keywords.map(() => `LOWER(content) LIKE ?`).join(' OR ');\r\n const likeParams = keywords.map((k) => `%${k}%`);\r\n\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? AND (${likeClauses})\r\n ORDER BY relevance DESC, accessed_at DESC LIMIT ?`,\r\n [projectId, ...likeParams, limit],\r\n );\r\n\r\n const facts = rowsToFacts(result);\r\n\r\n // Update accessed_at for recalled facts\r\n for (const fact of facts) {\r\n if (fact.id) {\r\n d.run(`UPDATE facts SET accessed_at = ? WHERE id = ?`, [Date.now(), fact.id]);\r\n }\r\n }\r\n if (facts.length > 0) persist();\r\n\r\n return facts;\r\n}\r\n\r\nexport function getAllFacts(projectId: string): Fact[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM facts WHERE project_id = ? ORDER BY relevance DESC`,\r\n [projectId],\r\n );\r\n return rowsToFacts(result);\r\n}\r\n\r\nfunction rowsToFacts(result: QueryExecResult[]): Fact[] {\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n content: row[2] as string,\r\n category: row[3] as FactCategory,\r\n source: row[4] as string | undefined,\r\n relevance: row[5] as number,\r\n createdAt: row[6] as number,\r\n accessedAt: row[7] as number,\r\n }));\r\n}\r\n\r\n// --- Messages ---\r\n\r\nexport function storeMessage(msg: Omit<ChatMessage, 'id'>): void {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO messages (session_id, role, content, tool_name, created_at)\r\n VALUES (?, ?, ?, ?, ?)`,\r\n [msg.sessionId, msg.role, msg.content, msg.toolName ?? null, msg.createdAt],\r\n );\r\n persist();\r\n}\r\n\r\nexport function getSessionMessages(sessionId: string, limit = 100): ChatMessage[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM messages WHERE session_id = ? ORDER BY created_at ASC LIMIT ?`,\r\n [sessionId, limit],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n sessionId: row[1] as string,\r\n role: row[2] as ChatMessage['role'],\r\n content: row[3] as string,\r\n toolName: (row[4] as string) || undefined,\r\n createdAt: row[5] as number,\r\n }));\r\n}\r\n\r\n// --- Summaries ---\r\n\r\nexport function storeSummary(summary: Omit<SessionSummary, 'id'>): void {\r\n const d = getDb();\r\n d.run(\r\n `INSERT INTO summaries (project_id, session_id, summary, created_at)\r\n VALUES (?, ?, ?, ?)`,\r\n [summary.projectId, summary.sessionId, summary.summary, summary.createdAt],\r\n );\r\n persist();\r\n}\r\n\r\nexport function getProjectSummaries(projectId: string, limit = 20): SessionSummary[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM summaries WHERE project_id = ? ORDER BY created_at DESC LIMIT ?`,\r\n [projectId, limit],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n sessionId: row[2] as string,\r\n summary: row[3] as string,\r\n createdAt: row[4] as number,\r\n }));\r\n}\r\n\r\n// --- Script Index ---\r\n\r\nexport function upsertScript(entry: Omit<ScriptEntry, 'id'>): void {\r\n const d = getDb();\r\n const existing = d.exec(\r\n `SELECT id FROM script_index WHERE project_id = ? AND path = ?`,\r\n [entry.projectId, entry.path],\r\n );\r\n\r\n if (existing[0]?.values.length) {\r\n d.run(\r\n `UPDATE script_index SET class_name = ?, summary = ?, line_count = ?, last_hash = ?, updated_at = ?\r\n WHERE project_id = ? AND path = ?`,\r\n [\r\n entry.className,\r\n entry.summary ?? null,\r\n entry.lineCount ?? null,\r\n entry.lastHash ?? null,\r\n entry.updatedAt,\r\n entry.projectId,\r\n entry.path,\r\n ],\r\n );\r\n } else {\r\n d.run(\r\n `INSERT INTO script_index (project_id, path, class_name, summary, line_count, last_hash, updated_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n entry.projectId,\r\n entry.path,\r\n entry.className,\r\n entry.summary ?? null,\r\n entry.lineCount ?? null,\r\n entry.lastHash ?? null,\r\n entry.updatedAt,\r\n ],\r\n );\r\n }\r\n persist();\r\n}\r\n\r\nexport function getScriptIndex(\r\n projectId: string,\r\n): { path: string; summary?: string; className: string }[] {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT path, summary, class_name FROM script_index WHERE project_id = ? ORDER BY path`,\r\n [projectId],\r\n );\r\n if (!result[0]) return [];\r\n return result[0].values.map((row) => ({\r\n path: row[0] as string,\r\n summary: (row[1] as string) || undefined,\r\n className: row[2] as string,\r\n }));\r\n}\r\n\r\nexport function getScriptEntry(projectId: string, scriptPath: string): ScriptEntry | null {\r\n const d = getDb();\r\n const result = d.exec(\r\n `SELECT * FROM script_index WHERE project_id = ? AND path = ?`,\r\n [projectId, scriptPath],\r\n );\r\n if (!result[0]?.values.length) return null;\r\n const row = result[0].values[0];\r\n return {\r\n id: row[0] as number,\r\n projectId: row[1] as string,\r\n path: row[2] as string,\r\n className: row[3] as string,\r\n summary: (row[4] as string) || undefined,\r\n lineCount: (row[5] as number) || undefined,\r\n lastHash: (row[6] as string) || undefined,\r\n updatedAt: row[7] as number,\r\n };\r\n}\r\n\r\n// --- Decay ---\r\n\r\nexport function decayRelevance(projectId: string, factor = 0.95): void {\r\n const d = getDb();\r\n d.run(`UPDATE facts SET relevance = relevance * ? WHERE project_id = ?`, [factor, projectId]);\r\n persist();\r\n}\r\n","export function parseJsonResponse<T>(content: string | null): T | null {\n if (!content) return null;\n\n const trimmed = content.trim();\n const candidates = [\n trimmed,\n ...extractMarkdownJsonBlocks(trimmed),\n ...extractBalancedJsonBlocks(trimmed),\n ];\n\n for (const candidate of candidates) {\n try {\n return JSON.parse(candidate) as T;\n } catch {\n // Try the next candidate.\n }\n }\n\n return null;\n}\n\nfunction extractMarkdownJsonBlocks(content: string): string[] {\n const matches = content.match(/```(?:json)?\\s*([\\s\\S]*?)```/gi) ?? [];\n return matches\n .map((block) => block.replace(/```(?:json)?/i, '').replace(/```$/, '').trim())\n .filter(Boolean);\n}\n\nfunction extractBalancedJsonBlocks(content: string): string[] {\n const blocks: string[] = [];\n const openers = ['{', '['];\n\n for (let start = 0; start < content.length; start++) {\n if (!openers.includes(content[start])) continue;\n\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n\n for (let end = start; end < content.length; end++) {\n const ch = content[end];\n\n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n\n if (ch === '\\\\') {\n escapeNext = true;\n continue;\n }\n\n if (ch === '\"') {\n inString = !inString;\n continue;\n }\n\n if (inString) continue;\n\n if (ch === '{' || ch === '[') depth++;\n if (ch === '}' || ch === ']') depth--;\n\n if (depth === 0) {\n blocks.push(content.slice(start, end + 1).trim());\n break;\n }\n }\n }\n\n return blocks;\n}\n","import type { ToolCall, ToolResult, ToolContext } from '../tools/types.js';\nimport { CliMsg } from '../transport/protocol.js';\nimport type {\n PropertyEntry,\n RunCodeResponsePayload,\n ScriptContentPayload,\n} from '../transport/protocol.js';\n\nexport interface VerifyCheck {\n type: 'script_edit' | 'code_run' | 'instance_create' | 'property_set';\n path?: string;\n expectedContent?: string;\n expectedProperties?: Record<string, unknown>;\n}\n\r\nexport async function verifyAction(\r\n check: VerifyCheck,\r\n ctx: ToolContext,\r\n): Promise<ToolResult> {\r\n switch (check.type) {\r\n case 'script_edit':\r\n return verifyScriptEdit(check.path!, check.expectedContent, ctx);\r\n case 'code_run':\r\n return verifyCodeRun(ctx);\r\n case 'instance_create':\n return verifyInstanceExists(check.path!, ctx);\n case 'property_set':\n return verifyPropertySet(check.path!, check.expectedProperties ?? {}, ctx);\n default:\n return { success: true };\n }\n}\n\nexport function inferVerifyChecks(call: ToolCall, result: ToolResult): VerifyCheck[] {\n if (!result.success) return [];\n\n switch (call.name) {\n case 'edit_script':\n return [\n {\n type: 'script_edit',\n path: typeof call.arguments.path === 'string' ? call.arguments.path : undefined,\n expectedContent: typeof call.arguments.source === 'string' ? call.arguments.source : undefined,\n },\n ];\n\n case 'run_code':\n case 'execute_run_test':\n case 'execute_play_test':\n return [{ type: 'code_run' }];\n\n case 'create_ui':\n case 'create_part':\n case 'clone_instance':\n case 'insert_instance':\n case 'group_instances': {\n const createdPath = extractPath(result.data) ?? extractStringArg(call.arguments, 'path');\n return createdPath ? [{ type: 'instance_create', path: createdPath }] : [];\n }\n\n case 'set_properties':\n return [\n {\n type: 'property_set',\n path: extractStringArg(call.arguments, 'path'),\n expectedProperties: asRecord(call.arguments.properties),\n },\n ];\n\n case 'bulk_set_properties': {\n const path = extractPath(result.data) ?? extractStringArg(call.arguments, 'path');\n const properties = asRecord(call.arguments.properties);\n return path && properties ? [{ type: 'property_set', path, expectedProperties: properties }] : [];\n }\n\n default:\n return [];\n }\n}\n\r\nasync function verifyScriptEdit(\r\n scriptPath: string,\r\n expectedContent: string | undefined,\r\n ctx: ToolContext,\r\n): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio disconnected during verification' };\r\n }\r\n\r\n try {\r\n const response = await ctx.sendToStudio<ScriptContentPayload>(CliMsg.GET_SCRIPT, {\r\n path: scriptPath,\r\n });\r\n\r\n if (!response.payload?.source) {\r\n return { success: false, error: `Could not read back script: ${scriptPath}` };\r\n }\r\n\r\n if (expectedContent && response.payload.source !== expectedContent) {\r\n return {\r\n success: false,\r\n error: 'Script content does not match expected output',\r\n data: {\r\n expected: expectedContent.slice(0, 200),\r\n actual: response.payload.source.slice(0, 200),\r\n },\r\n };\r\n }\r\n\r\n return { success: true, data: { verified: scriptPath } };\r\n } catch (err) {\r\n return {\r\n success: false,\r\n error: `Verification failed: ${err instanceof Error ? err.message : String(err)}`,\r\n };\r\n }\r\n}\r\n\r\nasync function verifyCodeRun(ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio disconnected during verification' };\r\n }\r\n\r\n try {\r\n const response = await ctx.sendToStudio<{ entries: { level: string; message: string }[] }>(\r\n CliMsg.GET_OUTPUT,\r\n { limit: 5, level: 'error' },\r\n );\r\n\r\n const errors = response.payload?.entries?.filter((e) => e.level === 'error') ?? [];\r\n if (errors.length > 0) {\r\n return {\r\n success: false,\r\n error: 'Errors detected after code execution',\r\n data: { errors: errors.map((e) => e.message) },\r\n };\r\n }\r\n\r\n return { success: true };\r\n } catch {\r\n return { success: true }; // Can't verify, assume OK\r\n }\r\n}\r\n\r\nasync function verifyInstanceExists(instancePath: string, ctx: ToolContext): Promise<ToolResult> {\n if (!ctx.isStudioConnected()) {\n return { success: false, error: 'Studio disconnected during verification' };\n }\n\n try {\n const response = await ctx.sendToStudio<RunCodeResponsePayload>(CliMsg.RUN_CODE, {\n code: buildInstanceExistsCode(instancePath),\n });\n\n if (response.payload.error) {\n return { success: false, error: `Instance verification failed: ${response.payload.error}` };\n }\n\n const exists = String(response.payload.output ?? '').trim().toLowerCase();\n if (!exists.includes('true')) {\n return { success: false, error: `Instance not found after creation: ${instancePath}` };\n }\n\n return { success: true, data: { exists: instancePath } };\n } catch {\n return { success: true };\n }\n}\n\nasync function verifyPropertySet(\n instancePath: string,\n expectedProperties: Record<string, unknown>,\n ctx: ToolContext,\n): Promise<ToolResult> {\n if (!ctx.isStudioConnected()) {\n return { success: false, error: 'Studio disconnected during verification' };\n }\n\n if (!instancePath || Object.keys(expectedProperties).length === 0) {\n return { success: true, data: { verified: instancePath } };\n }\n\n try {\n const response = await ctx.sendToStudio<{ properties: PropertyEntry[] }>(CliMsg.GET_PROPERTIES, {\n path: instancePath,\n compact: false,\n });\n\n const entries = response.payload?.properties ?? [];\n const byName = new Map(entries.map((entry) => [entry.name, entry.value]));\n const mismatches: string[] = [];\n\n for (const [name, expected] of Object.entries(expectedProperties)) {\n const actual = byName.get(name);\n if (actual == null) {\n mismatches.push(`${name}: missing`);\n continue;\n }\n\n if (!matchesPropertyValue(actual, expected)) {\n mismatches.push(`${name}: expected ${stringifyExpected(expected)}, got ${actual}`);\n }\n }\n\n if (mismatches.length > 0) {\n return {\n success: false,\n error: 'Property verification failed',\n data: { path: instancePath, mismatches },\n };\n }\n\n return {\n success: true,\n data: { verified: instancePath, properties: Object.keys(expectedProperties) },\n };\n } catch (err) {\n return {\n success: false,\n error: `Property verification failed: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nfunction extractPath(data: unknown): string | undefined {\n if (!data || typeof data !== 'object') return undefined;\n const candidate = (data as Record<string, unknown>).path;\n return typeof candidate === 'string' ? candidate : undefined;\n}\n\nfunction extractStringArg(args: Record<string, unknown>, key: string): string | undefined {\n const value = args[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction buildInstanceExistsCode(instancePath: string): string {\n const parts = instancePath.split('.').filter(Boolean);\n const lines = ['local node = game'];\n\n for (const part of parts) {\n lines.push(`node = node and node:FindFirstChild(${luaString(part)})`);\n }\n\n lines.push('return node ~= nil');\n return lines.join('\\n');\n}\n\nfunction luaString(value: string): string {\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction matchesPropertyValue(actual: string, expected: unknown): boolean {\n const normalizedActual = normalizeValue(actual);\n\n if (typeof expected === 'boolean' || typeof expected === 'number') {\n return normalizedActual === normalizeValue(String(expected));\n }\n\n if (typeof expected === 'string') {\n const normalizedExpected = normalizeValue(expected);\n return normalizedActual === normalizedExpected || normalizedActual.includes(normalizedExpected);\n }\n\n if (Array.isArray(expected)) {\n const normalizedExpected = normalizeValue(expected.join(','));\n return normalizedActual.includes(normalizedExpected);\n }\n\n if (expected && typeof expected === 'object') {\n const compactExpected = normalizeValue(JSON.stringify(expected));\n return normalizedActual.includes(compactExpected);\n }\n\n return true;\n}\n\nfunction normalizeValue(value: string): string {\n return value.replace(/[\\s{}\\[\\]\"]/g, '').toLowerCase();\n}\n\nfunction stringifyExpected(value: unknown): string {\n return typeof value === 'string' ? value : JSON.stringify(value);\n}\n","import type {\n AcceptedProposal,\n ProposedToolCall,\n RejectedProposal,\n WorkerAssignment,\n WorkerProposal,\n} from './types.js';\n\nexport const READ_ONLY_TOOL_NAMES = new Set([\n 'get_explorer',\n 'get_properties',\n 'get_descendants_properties',\n 'get_selection',\n 'search_scripts',\n 'read_script',\n 'get_output',\n 'get_class_info',\n 'serialize_ui',\n 'recall_memory',\n 'search_roblox_api',\n 'get_roblox_api_reference',\n]);\n\nexport const COORDINATOR_WRITE_TOOL_NAMES = new Set([\n 'create_ui',\n 'set_properties',\n 'bulk_set_properties',\n 'insert_instance',\n 'move_instance',\n]);\n\nexport const FORBIDDEN_WORKER_WRITE_TOOL_NAMES = new Set([\n 'run_code',\n 'edit_script',\n 'delete_instance',\n 'create_part',\n 'build_multiple',\n 'clone_instance',\n 'group_instances',\n 'find_replace_scripts',\n 'undo',\n 'redo',\n]);\n\nexport function normalizeScopePath(pathValue: string): string {\n return pathValue\n .trim()\n .replace(/\\[(?:\"|')([^\"']+)(?:\"|')\\]/g, '.$1')\n .replace(/^game\\./i, '')\n .replace(/\\.+/g, '.')\n .replace(/^\\./, '')\n .replace(/\\.$/, '');\n}\n\nexport function pathsOverlap(a: string, b: string): boolean {\n const left = normalizeScopePath(a).toLowerCase();\n const right = normalizeScopePath(b).toLowerCase();\n if (!left || !right) return false;\n return left === right || left.startsWith(`${right}.`) || right.startsWith(`${left}.`);\n}\n\nexport function isPathWithinScopes(pathValue: string, scopes: string[]): boolean {\n const target = normalizeScopePath(pathValue).toLowerCase();\n if (!target) return scopes.length === 0;\n\n return scopes.some((scope) => {\n const normalizedScope = normalizeScopePath(scope).toLowerCase();\n return target === normalizedScope || target.startsWith(`${normalizedScope}.`);\n });\n}\n\nexport function inferTargetPath(call: ProposedToolCall): string | undefined {\n if (call.targetPath) return call.targetPath;\n\n const args = call.args ?? {};\n for (const key of ['path', 'root', 'rootPath', 'parent', 'parentPath']) {\n const value = args[key];\n if (typeof value === 'string' && value.trim()) return value;\n }\n\n const targets = args.targets;\n if (Array.isArray(targets)) {\n const first = targets.find(\n (target) => target && typeof target === 'object' && typeof target.path === 'string',\n ) as { path?: string } | undefined;\n if (first?.path) return first.path;\n }\n\n return undefined;\n}\n\nexport function validateWorkerProposal(\n assignment: WorkerAssignment,\n proposal: WorkerProposal,\n): string[] {\n const errors: string[] = [];\n\n if (proposal.workerId !== assignment.id) {\n errors.push(`Proposal workerId \"${proposal.workerId}\" does not match assignment \"${assignment.id}\"`);\n }\n\n if (!proposal.summary?.trim()) {\n errors.push('Proposal summary is required');\n }\n\n for (const call of proposal.proposedToolCalls ?? []) {\n if (FORBIDDEN_WORKER_WRITE_TOOL_NAMES.has(call.tool)) {\n errors.push(`Worker proposed forbidden write tool \"${call.tool}\"`);\n continue;\n }\n\n if (!COORDINATOR_WRITE_TOOL_NAMES.has(call.tool)) {\n errors.push(`Worker proposed unsupported coordinator write tool \"${call.tool}\"`);\n continue;\n }\n\n const targetPath = inferTargetPath(call);\n if (!targetPath) {\n errors.push(`Proposed ${call.tool} call is missing a target path`);\n continue;\n }\n\n if (!isPathWithinScopes(targetPath, assignment.ownedScopes)) {\n errors.push(`Proposed ${call.tool} target \"${targetPath}\" is outside owned scopes`);\n }\n }\n\n return errors;\n}\n\nexport function rejectConflictingAcceptedProposals(\n accepted: AcceptedProposal[],\n): { accepted: AcceptedProposal[]; rejected: RejectedProposal[] } {\n const finalAccepted: AcceptedProposal[] = [];\n const rejected: RejectedProposal[] = [];\n const claimed: { workerId: string; path: string }[] = [];\n\n for (const item of accepted) {\n const conflict = findConflict(item.proposal, claimed);\n if (conflict) {\n rejected.push({\n workerId: item.workerId,\n proposal: item.proposal,\n reason: `Conflicts with accepted worker ${conflict.workerId} on ${conflict.path}`,\n });\n continue;\n }\n\n finalAccepted.push(item);\n for (const call of item.proposal.proposedToolCalls) {\n const targetPath = inferTargetPath(call);\n if (targetPath) claimed.push({ workerId: item.workerId, path: targetPath });\n }\n }\n\n return { accepted: finalAccepted, rejected };\n}\n\nfunction findConflict(\n proposal: WorkerProposal,\n claimed: { workerId: string; path: string }[],\n): { workerId: string; path: string } | null {\n for (const call of proposal.proposedToolCalls) {\n const targetPath = inferTargetPath(call);\n if (!targetPath) continue;\n\n for (const existing of claimed) {\n if (pathsOverlap(targetPath, existing.path)) return existing;\n }\n }\n\n return null;\n}\n","import type OpenAI from 'openai';\nimport type { AIProvider } from '../../ai/provider.js';\nimport type { Tool, ToolCall, ToolContext, ToolResult } from '../../tools/types.js';\nimport { parseJsonResponse } from '../json-response.js';\nimport type { WorkerAssignment, WorkerProposal, WorkerRunResult } from './types.js';\n\nexport class WorkerAgent {\n constructor(\n private readonly ai: Pick<AIProvider, 'chat'>,\n private readonly tools: Tool[],\n private readonly toolCtx: ToolContext,\n ) {}\n\n async run(goal: string, assignment: WorkerAssignment): Promise<WorkerRunResult> {\n const messages: OpenAI.ChatCompletionMessageParam[] = [\n {\n role: 'system',\n content: buildWorkerPrompt(goal, assignment),\n },\n ];\n const toolResults: { call: ToolCall; result: ToolResult }[] = [];\n\n for (let iteration = 0; iteration < 4; iteration++) {\n const response = await this.ai.chat(messages, this.tools);\n\n const assistantMessage: OpenAI.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n content: response.content ?? null,\n ...(response.toolCalls.length > 0\n ? {\n tool_calls: response.toolCalls.map((call) => ({\n id: call.id,\n type: 'function' as const,\n function: { name: call.name, arguments: JSON.stringify(call.arguments) },\n })),\n }\n : {}),\n };\n messages.push(assistantMessage);\n\n if (response.toolCalls.length === 0) {\n const proposal = normalizeProposal(\n assignment.id,\n parseJsonResponse<Partial<WorkerProposal>>(response.content),\n );\n if (!proposal) {\n return {\n assignment,\n error: 'Worker did not return a valid WorkerProposal JSON object',\n toolResults,\n };\n }\n return { assignment, proposal, toolResults };\n }\n\n for (const call of response.toolCalls) {\n const tool = this.tools.find((candidate) => candidate.name === call.name);\n const result = tool\n ? await tool.execute(call.arguments, this.toolCtx)\n : { success: false, error: `Read-only worker cannot use tool: ${call.name}` };\n\n toolResults.push({ call, result });\n messages.push({\n role: 'tool',\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n }\n }\n\n return {\n assignment,\n error: 'Worker exhausted its iteration budget before returning a proposal',\n toolResults,\n };\n }\n}\n\nfunction buildWorkerPrompt(goal: string, assignment: WorkerAssignment): string {\n return [\n 'You are a Dominus worker agent. You are not the coordinator.',\n 'You may inspect and reason, but you must not mutate Roblox Studio.',\n 'Use only the read tools provided to gather evidence.',\n 'Your final answer must be JSON only with this shape:',\n '{\"workerId\":\"...\",\"summary\":\"...\",\"evidence\":[{\"source\":\"...\",\"summary\":\"...\",\"data\":{}}],\"proposedToolCalls\":[{\"tool\":\"set_properties\",\"args\":{},\"targetPath\":\"...\",\"rationale\":\"...\"}],\"risks\":[\"...\"],\"verificationSuggestions\":[\"...\"]}',\n '',\n `Global goal: ${goal}`,\n `Worker id: ${assignment.id}`,\n `Role: ${assignment.role}`,\n `Objective: ${assignment.objective}`,\n `Owned scopes: ${assignment.ownedScopes.join(', ') || '(none)'}`,\n `Allowed read tools: ${assignment.allowedReadTools.join(', ')}`,\n 'Acceptance criteria:',\n ...assignment.acceptanceCriteria.map((criterion) => `- ${criterion}`),\n '',\n 'Proposal rules:',\n '- Propose only coordinator-owned write tools: create_ui, set_properties, bulk_set_properties, insert_instance, move_instance.',\n '- Every proposed write must include targetPath and stay inside your owned scopes.',\n '- If you need no changes, return proposedToolCalls as an empty array and explain why.',\n ].join('\\n');\n}\n\nfunction normalizeProposal(\n workerId: string,\n parsed: Partial<WorkerProposal> | null,\n): WorkerProposal | null {\n if (!parsed || typeof parsed !== 'object') return null;\n\n return {\n workerId: typeof parsed.workerId === 'string' ? parsed.workerId : workerId,\n summary: typeof parsed.summary === 'string' ? parsed.summary : '',\n evidence: Array.isArray(parsed.evidence)\n ? parsed.evidence.map((item) => ({\n source: String(item?.source ?? 'worker'),\n summary: String(item?.summary ?? ''),\n data: item?.data,\n }))\n : [],\n proposedToolCalls: Array.isArray(parsed.proposedToolCalls)\n ? parsed.proposedToolCalls.map((call) => ({\n tool: String(call?.tool ?? ''),\n args: call?.args && typeof call.args === 'object' ? call.args : {},\n targetPath: typeof call?.targetPath === 'string' ? call.targetPath : undefined,\n rationale: typeof call?.rationale === 'string' ? call.rationale : undefined,\n }))\n : [],\n risks: Array.isArray(parsed.risks) ? parsed.risks.map(String) : [],\n verificationSuggestions: Array.isArray(parsed.verificationSuggestions)\n ? parsed.verificationSuggestions.map(String)\n : [],\n };\n}\n","import { nanoid } from 'nanoid';\nimport type OpenAI from 'openai';\nimport type { AIProvider } from '../../ai/provider.js';\nimport type { AgentEvent, Tool, ToolCall, ToolContext, ToolResult } from '../../tools/types.js';\nimport { inferVerifyChecks, verifyAction } from '../verifier.js';\nimport { parseJsonResponse } from '../json-response.js';\nimport {\n COORDINATOR_WRITE_TOOL_NAMES,\n READ_ONLY_TOOL_NAMES,\n inferTargetPath,\n rejectConflictingAcceptedProposals,\n validateWorkerProposal,\n} from './conflicts.js';\nimport type {\n AcceptedProposal,\n CoordinatorDecision,\n MultiAgentResult,\n ParallelTaskArgs,\n RejectedProposal,\n WorkerAssignment,\n WorkerProposal,\n WorkerRunResult,\n} from './types.js';\nimport { WorkerAgent } from './worker.js';\n\ntype EmitEvent = (event: AgentEvent) => void;\n\nexport class MultiAgentCoordinator {\n constructor(\n private readonly ai: Pick<AIProvider, 'chat'>,\n private readonly allTools: Tool[],\n ) {}\n\n async execute(\n args: ParallelTaskArgs,\n toolCtx: ToolContext,\n emit?: EmitEvent,\n ): Promise<MultiAgentResult> {\n const normalized = normalizeArgs(args);\n const readTools = this.getReadOnlyTools();\n const assignments = await this.createAssignments(normalized, toolCtx, readTools);\n\n emit?.({ type: 'multi_agent_start', goal: normalized.goal, workerCount: assignments.length });\n\n const workerResults = await Promise.allSettled(\n assignments.map(async (assignment) => {\n emit?.({\n type: 'multi_agent_worker_start',\n workerId: assignment.id,\n role: assignment.role,\n scopes: assignment.ownedScopes,\n });\n\n const worker = new WorkerAgent(this.ai, readTools, toolCtx);\n const result = await worker.run(normalized.goal, assignment);\n emit?.({\n type: 'multi_agent_worker_done',\n workerId: assignment.id,\n summary: result.proposal?.summary ?? result.error ?? 'Worker failed',\n proposedToolCallCount: result.proposal?.proposedToolCalls.length ?? 0,\n });\n return result;\n }),\n );\n\n const { accepted, rejected } = this.validateWorkerResults(assignments, workerResults, emit);\n const conflictChecked = rejectConflictingAcceptedProposals(accepted);\n for (const item of conflictChecked.rejected) {\n emit?.({ type: 'multi_agent_proposal', workerId: item.workerId, accepted: false, reason: item.reason });\n }\n\n const finalAccepted = conflictChecked.accepted;\n const finalRejected = [...rejected, ...conflictChecked.rejected];\n const finalToolCalls = await this.synthesizeFinalToolCalls(normalized.goal, finalAccepted);\n const decision: CoordinatorDecision = {\n accepted: finalAccepted,\n rejected: finalRejected,\n finalToolCalls,\n };\n\n emit?.({\n type: 'multi_agent_decision',\n acceptedCount: decision.accepted.length,\n rejectedCount: decision.rejected.length,\n finalToolCallCount: decision.finalToolCalls.length,\n });\n\n emit?.({ type: 'multi_agent_apply_start', toolCallCount: decision.finalToolCalls.length });\n const applied = await this.applyFinalToolCalls(decision.finalToolCalls, toolCtx);\n const verificationFailures = await this.verifyAppliedCalls(applied, toolCtx);\n emit?.({\n type: 'multi_agent_apply_done',\n appliedCount: applied.length,\n verificationFailureCount: verificationFailures.length,\n });\n\n return {\n goal: normalized.goal,\n assignments,\n decision,\n applied,\n verificationFailures,\n };\n }\n\n getReadOnlyTools(): Tool[] {\n return this.allTools.filter((tool) => READ_ONLY_TOOL_NAMES.has(tool.name));\n }\n\n getMetaTool(): Tool {\n return {\n name: 'run_parallel_task',\n description:\n 'Split a broad task into coordinated read-only worker agents. Workers inspect and propose scoped changes; the coordinator validates proposals and applies safe serial writes.',\n parameters: {\n type: 'object',\n properties: {\n goal: {\n type: 'string',\n description: 'The task to coordinate across sub-agents.',\n },\n rootPath: {\n type: 'string',\n description: 'Optional root instance path to partition work under, e.g. StarterGui.HUD.',\n },\n maxWorkers: {\n type: 'number',\n description: 'Number of workers to use. Defaults to 3, max 5.',\n default: 3,\n },\n constraints: {\n type: 'string',\n description: 'Extra constraints the workers and coordinator must follow.',\n },\n taskType: {\n type: 'string',\n description: 'Optional task type hint such as ui, script, build, refactor, or general.',\n },\n },\n required: ['goal'],\n },\n execute: async () => ({\n success: false,\n error: 'run_parallel_task is a meta-tool handled by AgentLoop or MCP, not ToolRegistry.',\n }),\n };\n }\n\n shouldAutoTrigger(userMessage: string): boolean {\n const lower = userMessage.toLowerCase();\n return [\n 'parallel',\n 'sub-agent',\n 'subagent',\n 'agents',\n 'split this',\n 'entire ui',\n 'whole ui',\n 'organize all',\n 'organize entire',\n 'large task',\n ].some((cue) => lower.includes(cue));\n }\n\n private async createAssignments(\n args: Required<Pick<ParallelTaskArgs, 'goal' | 'maxWorkers'>> &\n Omit<ParallelTaskArgs, 'goal' | 'maxWorkers'>,\n toolCtx: ToolContext,\n readTools: Tool[],\n ): Promise<WorkerAssignment[]> {\n const scopes = await this.discoverScopes(args, toolCtx);\n const fallback = buildFallbackAssignments(args, scopes, readTools);\n\n try {\n const response = await this.ai.chat([\n {\n role: 'system',\n content: buildAssignmentPrompt(args, scopes, readTools),\n },\n ]);\n const parsed = parseJsonResponse<{ assignments?: Partial<WorkerAssignment>[] }>(response.content);\n const assignments = normalizeAssignments(parsed?.assignments, args, scopes, readTools);\n return assignments.length > 0 ? assignments : fallback;\n } catch {\n return fallback;\n }\n }\n\n private async discoverScopes(\n args: Required<Pick<ParallelTaskArgs, 'goal' | 'maxWorkers'>> &\n Omit<ParallelTaskArgs, 'goal' | 'maxWorkers'>,\n toolCtx: ToolContext,\n ): Promise<string[]> {\n if (!args.rootPath || !toolCtx.isStudioConnected()) {\n return args.rootPath ? [args.rootPath] : ['Workspace', 'StarterGui', 'ReplicatedStorage'];\n }\n\n const serializeTool = this.allTools.find((tool) => tool.name === 'serialize_ui');\n const looksUi = (args.taskType ?? '').toLowerCase().includes('ui') || args.rootPath.includes('Gui');\n if (serializeTool && looksUi) {\n const result = await serializeTool.execute({ path: args.rootPath, maxDepth: 2 }, toolCtx);\n const childScopes = result.success ? getSerializedChildScopes(args.rootPath, result.data) : [];\n if (childScopes.length > 0) return childScopes.slice(0, args.maxWorkers);\n }\n\n const explorerTool = this.allTools.find((tool) => tool.name === 'get_explorer');\n if (explorerTool) {\n const result = await explorerTool.execute({ rootPath: args.rootPath, maxDepth: 2 }, toolCtx);\n const childScopes = result.success ? getExplorerChildScopes(args.rootPath, result.data) : [];\n if (childScopes.length > 0) return childScopes.slice(0, args.maxWorkers);\n }\n\n return [args.rootPath];\n }\n\n private validateWorkerResults(\n assignments: WorkerAssignment[],\n settledResults: PromiseSettledResult<WorkerRunResult>[],\n emit?: EmitEvent,\n ): { accepted: AcceptedProposal[]; rejected: RejectedProposal[] } {\n const accepted: AcceptedProposal[] = [];\n const rejected: RejectedProposal[] = [];\n\n for (let i = 0; i < settledResults.length; i++) {\n const assignment = assignments[i];\n const result = settledResults[i];\n\n if (result.status === 'rejected') {\n const reason = result.reason instanceof Error ? result.reason.message : String(result.reason);\n rejected.push({ workerId: assignment.id, reason });\n emit?.({ type: 'multi_agent_proposal', workerId: assignment.id, accepted: false, reason });\n continue;\n }\n\n if (!result.value.proposal) {\n const reason = result.value.error ?? 'Worker returned no proposal';\n rejected.push({ workerId: assignment.id, reason });\n emit?.({ type: 'multi_agent_proposal', workerId: assignment.id, accepted: false, reason });\n continue;\n }\n\n const errors = validateWorkerProposal(assignment, result.value.proposal);\n if (errors.length > 0) {\n const reason = errors.join('; ');\n rejected.push({ workerId: assignment.id, proposal: result.value.proposal, reason });\n emit?.({ type: 'multi_agent_proposal', workerId: assignment.id, accepted: false, reason });\n continue;\n }\n\n accepted.push({ workerId: assignment.id, proposal: result.value.proposal });\n emit?.({ type: 'multi_agent_proposal', workerId: assignment.id, accepted: true });\n }\n\n return { accepted, rejected };\n }\n\n private async synthesizeFinalToolCalls(\n goal: string,\n accepted: AcceptedProposal[],\n ): Promise<ToolCall[]> {\n const proposed = accepted.flatMap((item) => item.proposal.proposedToolCalls);\n const safeCalls = proposed\n .filter((call) => COORDINATOR_WRITE_TOOL_NAMES.has(call.tool))\n .map((call) => toToolCall(call.tool, call.args));\n\n if (safeCalls.length <= 1) return safeCalls;\n\n try {\n const response = await this.ai.chat([\n {\n role: 'system',\n content: [\n 'You are the Dominus multi-agent coordinator.',\n 'Merge accepted worker proposals into a deterministic serial write plan.',\n 'Return JSON only: {\"toolCalls\":[{\"tool\":\"set_properties\",\"args\":{}}]}',\n 'Only use these tools: create_ui, set_properties, bulk_set_properties, insert_instance, move_instance.',\n 'Do not include run_code, delete_instance, edit_script, undo, or redo.',\n `Goal: ${goal}`,\n 'Accepted proposals:',\n JSON.stringify(accepted, null, 2),\n ].join('\\n'),\n },\n ]);\n const parsed = parseJsonResponse<{ toolCalls?: { tool?: string; args?: Record<string, unknown> }[] }>(\n response.content,\n );\n const merged = (parsed?.toolCalls ?? [])\n .filter((call) => call.tool && COORDINATOR_WRITE_TOOL_NAMES.has(call.tool))\n .map((call) => toToolCall(call.tool!, call.args ?? {}));\n return merged.length > 0 ? merged : safeCalls;\n } catch {\n return safeCalls;\n }\n }\n\n private async applyFinalToolCalls(\n calls: ToolCall[],\n toolCtx: ToolContext,\n ): Promise<{ call: ToolCall; result: ToolResult }[]> {\n const applied: { call: ToolCall; result: ToolResult }[] = [];\n\n for (const call of calls) {\n const targetPath = inferTargetPath({ tool: call.name, args: call.arguments });\n if (!targetPath) {\n applied.push({ call, result: { success: false, error: `Missing target path for ${call.name}` } });\n continue;\n }\n\n const tool = this.allTools.find((candidate) => candidate.name === call.name);\n if (!tool) {\n applied.push({ call, result: { success: false, error: `Unknown coordinator tool: ${call.name}` } });\n continue;\n }\n\n applied.push({ call, result: await tool.execute(call.arguments, toolCtx) });\n }\n\n return applied;\n }\n\n private async verifyAppliedCalls(\n applied: { call: ToolCall; result: ToolResult }[],\n toolCtx: ToolContext,\n ): Promise<ToolResult[]> {\n const failures: ToolResult[] = [];\n\n for (const { call, result } of applied) {\n for (const check of inferVerifyChecks(call, result)) {\n const verified = await verifyAction(check, toolCtx);\n if (!verified.success) failures.push(verified);\n }\n }\n\n return failures;\n }\n}\n\nfunction normalizeArgs(args: ParallelTaskArgs): Required<Pick<ParallelTaskArgs, 'goal' | 'maxWorkers'>> &\n Omit<ParallelTaskArgs, 'goal' | 'maxWorkers'> {\n return {\n ...args,\n goal: String(args.goal ?? '').trim(),\n maxWorkers: Math.max(1, Math.min(Number(args.maxWorkers ?? 3), 5)),\n };\n}\n\nfunction buildAssignmentPrompt(\n args: ParallelTaskArgs & { goal: string; maxWorkers: number },\n scopes: string[],\n readTools: Tool[],\n): string {\n return [\n 'You are the Dominus multi-agent assignment planner.',\n 'Create non-overlapping worker assignments for a proposal-only parallel task.',\n 'Return JSON only: {\"assignments\":[{\"id\":\"worker-1\",\"role\":\"...\",\"objective\":\"...\",\"ownedScopes\":[\"...\"],\"allowedReadTools\":[\"...\"],\"acceptanceCriteria\":[\"...\"]}]}',\n `Goal: ${args.goal}`,\n `Root path: ${args.rootPath ?? '(none)'}`,\n `Task type: ${args.taskType ?? 'general'}`,\n `Constraints: ${args.constraints ?? '(none)'}`,\n `Max workers: ${args.maxWorkers}`,\n `Candidate scopes: ${scopes.join(', ')}`,\n `Read tools: ${readTools.map((tool) => tool.name).join(', ')}`,\n ].join('\\n');\n}\n\nfunction buildFallbackAssignments(\n args: ParallelTaskArgs & { goal: string; maxWorkers: number },\n scopes: string[],\n readTools: Tool[],\n): WorkerAssignment[] {\n const selectedScopes = scopes.slice(0, args.maxWorkers);\n const allowedReadTools = readTools.map((tool) => tool.name);\n const criteria = [\n 'Gather concrete evidence with read-only tools.',\n 'Propose only scoped coordinator-owned write calls.',\n 'Explain risks and verification suggestions.',\n ];\n\n return selectedScopes.map((scope, index) => ({\n id: `worker-${index + 1}`,\n role: index === 0 ? 'Inspector' : index === selectedScopes.length - 1 ? 'Verifier' : 'Specialist',\n objective: `Inspect ${scope} for: ${args.goal}`,\n ownedScopes: [scope],\n allowedReadTools,\n acceptanceCriteria: args.constraints ? [...criteria, args.constraints] : criteria,\n }));\n}\n\nfunction normalizeAssignments(\n rawAssignments: Partial<WorkerAssignment>[] | undefined,\n args: ParallelTaskArgs & { goal: string; maxWorkers: number },\n scopes: string[],\n readTools: Tool[],\n): WorkerAssignment[] {\n if (!Array.isArray(rawAssignments)) return [];\n\n const allowedReadTools = readTools.map((tool) => tool.name);\n return rawAssignments\n .slice(0, args.maxWorkers)\n .map((assignment, index) => ({\n id: assignment.id?.trim() || `worker-${index + 1}`,\n role: assignment.role?.trim() || 'Specialist',\n objective: assignment.objective?.trim() || `Inspect assigned scope for: ${args.goal}`,\n ownedScopes:\n Array.isArray(assignment.ownedScopes) && assignment.ownedScopes.length > 0\n ? assignment.ownedScopes.map(String)\n : [scopes[index] ?? scopes[0] ?? args.rootPath ?? 'Workspace'],\n allowedReadTools: allowedReadTools.filter((tool) =>\n assignment.allowedReadTools?.length ? assignment.allowedReadTools.includes(tool) : true,\n ),\n acceptanceCriteria:\n Array.isArray(assignment.acceptanceCriteria) && assignment.acceptanceCriteria.length > 0\n ? assignment.acceptanceCriteria.map(String)\n : ['Gather evidence and propose scoped changes only.'],\n }))\n .filter((assignment) => assignment.ownedScopes.length > 0);\n}\n\nfunction getSerializedChildScopes(rootPath: string, data: unknown): string[] {\n const node = data && typeof data === 'object' ? (data as Record<string, unknown>) : null;\n const children = Array.isArray(node?.Children)\n ? node.Children\n : Array.isArray(node?.children)\n ? node.children\n : [];\n\n return children\n .map((child) => (child && typeof child === 'object' ? (child as Record<string, unknown>).Name : undefined))\n .filter((name): name is string => typeof name === 'string' && name.length > 0)\n .map((name) => `${rootPath}.${name}`);\n}\n\nfunction getExplorerChildScopes(rootPath: string, data: unknown): string[] {\n const payload = data && typeof data === 'object' ? (data as Record<string, unknown>) : null;\n const tree = Array.isArray(payload?.tree) ? payload.tree : [];\n const root = tree[0] && typeof tree[0] === 'object' ? (tree[0] as Record<string, unknown>) : null;\n const children = Array.isArray(root?.children) ? root.children : [];\n\n return children\n .map((child) => (child && typeof child === 'object' ? (child as Record<string, unknown>).path : undefined))\n .filter((pathValue): pathValue is string => typeof pathValue === 'string' && pathValue.length > 0)\n .map((pathValue) => pathValue || rootPath);\n}\n\nfunction toToolCall(name: string, args: Record<string, unknown>): ToolCall {\n return {\n id: `multi_${nanoid()}`,\n name,\n arguments: args,\n };\n}\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { ScriptContentPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'read_script',\r\n description:\r\n 'Read the source code of a script in Roblox Studio. Provide the full instance path (e.g., \"ServerScriptService.GameManager\").',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path of the script (e.g., \"ServerScriptService.GameManager\")',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const path = params.path as string;\r\n const response = await ctx.sendToStudio<ScriptContentPayload>(CliMsg.GET_SCRIPT, { path });\r\n\r\n if (!response.payload) {\r\n return { success: false, error: `Script not found: ${path}` };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n path: response.payload.path,\r\n className: response.payload.className,\r\n source: response.payload.source,\r\n lineCount: response.payload.lineCount,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'edit_script',\r\n description:\r\n 'Replace the entire source code of a script in Roblox Studio. Provide the full path and the new source code.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path of the script',\r\n },\r\n source: {\r\n type: 'string',\r\n description: 'The new complete source code for the script',\r\n },\r\n },\r\n required: ['path', 'source'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const path = params.path as string;\r\n const source = params.source as string;\r\n\r\n const response = await ctx.sendToStudio(CliMsg.SET_SCRIPT, { path, source });\r\n const payload = response.payload as { success: boolean; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to edit script' };\r\n }\r\n\r\n return { success: true, data: { path, linesWritten: source.split('\\n').length } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { RunCodeResponsePayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'run_code',\r\n description:\r\n 'Execute arbitrary Luau code in Roblox Studio and return the output. The code runs in the Studio plugin context with full API access.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n code: {\r\n type: 'string',\r\n description: 'Luau code to execute in Studio',\r\n },\r\n },\r\n required: ['code'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const code = params.code as string;\r\n const response = await ctx.sendToStudio<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n const payload = response.payload;\r\n\r\n if (payload.error) {\r\n return { success: false, error: payload.error, data: { output: payload.output } };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { output: payload.output, duration: payload.duration },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_explorer',\r\n description:\r\n 'Get the DataModel explorer tree from Roblox Studio. Optionally filter by a root path and max depth.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n rootPath: {\r\n type: 'string',\r\n description: 'Root path to start from (e.g., \"ServerScriptService\"). Omit for entire tree.',\r\n },\r\n maxDepth: {\r\n type: 'number',\r\n description: 'Maximum depth of the tree (default: 3)',\r\n default: 3,\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ tree: ExplorerNode[] }>(CliMsg.GET_EXPLORER, {\r\n rootPath: params.rootPath ?? null,\r\n maxDepth: params.maxDepth ?? 3,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { PropertyEntry } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_properties',\r\n description: 'Get all properties of a single instance in Roblox Studio. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties. For inspecting UI trees, prefer serialize_ui or get_descendants_properties.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\")',\r\n },\r\n compact: {\r\n type: 'boolean',\r\n description: 'Strip read-only, nil, deprecated, and default-valued properties (default true). Set false for full dump.',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const compact = params.compact !== false;\r\n\r\n const response = await ctx.sendToStudio<{ properties: PropertyEntry[] }>(\r\n CliMsg.GET_PROPERTIES,\r\n { path: params.path, compact },\r\n );\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_descendants_properties',\r\n description: 'Easily get all descendants of a UI instance (or any instance) and all of their properties. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties to keep responses small.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\", \"StarterGui.ScreenGui\")',\r\n },\r\n compact: {\r\n type: 'boolean',\r\n description: 'When true (default), strips read-only, nil, deprecated, and default-valued properties to massively reduce response size. Set to false for full property dump.',\r\n },\r\n outputFile: {\r\n type: 'string',\r\n description: 'Optional file path to write the JSON result to, useful for very large trees where context limits apply.',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const compact = params.compact !== false; // default true\r\n\r\n const response = await ctx.sendToStudio<{ success: boolean; descendants?: unknown }>(\r\n CliMsg.GET_DESCENDANTS_PROPERTIES,\r\n { path: params.path, compact },\r\n 1000 * 60 * 5, // 5 minute timeout since getting ALL descendants can take a very long time\r\n );\r\n\r\n if (params.outputFile && typeof params.outputFile === 'string') {\r\n const fs = await import('fs/promises');\r\n const path = await import('path');\r\n const outputPath = path.resolve(process.cwd(), params.outputFile);\r\n await fs.writeFile(outputPath, JSON.stringify(response.payload, null, 2), 'utf-8');\r\n return { success: true, data: `Successfully saved descendants to ${outputPath}` };\r\n }\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'set_properties',\r\n description: 'Set properties on an instance in Roblox Studio.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path (e.g., \"Workspace.Part\")',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Key-value pairs of properties to set (e.g., {\"Name\": \"MyPart\", \"BrickColor\": \"Bright red\"})',\r\n },\r\n },\r\n required: ['path', 'properties'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.SET_PROPERTIES, {\r\n path: params.path,\r\n properties: params.properties,\r\n });\r\n\r\n const payload = response.payload as { success: boolean; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to set properties' };\r\n }\r\n\r\n return { success: true, data: { path: params.path, updated: Object.keys(params.properties as object) } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'insert_instance',\r\n description: 'Insert a new instance into the Roblox Studio DataModel.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n className: {\r\n type: 'string',\r\n description: 'Class name of the instance to create (e.g., \"Part\", \"Script\", \"ModuleScript\")',\r\n },\r\n parentPath: {\r\n type: 'string',\r\n description: 'Full path of the parent instance (e.g., \"Workspace\", \"ServerScriptService\")',\r\n },\r\n name: {\r\n type: 'string',\r\n description: 'Name for the new instance',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Optional properties to set on the new instance',\r\n },\r\n },\r\n required: ['className', 'parentPath', 'name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.INSERT_INSTANCE, {\r\n className: params.className,\r\n parentPath: params.parentPath,\r\n name: params.name,\r\n properties: params.properties ?? {},\r\n });\r\n\r\n const payload = response.payload as { success: boolean; path?: string; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to insert instance' };\r\n }\r\n\r\n return { success: true, data: { path: payload.path } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'delete_instance',\r\n description: 'Delete an instance from the Roblox Studio DataModel by path.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full instance path to delete (e.g., \"Workspace.OldPart\")',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio(CliMsg.DELETE_INSTANCE, { path: params.path });\r\n const payload = response.payload as { success: boolean; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to delete instance' };\r\n }\r\n\r\n return { success: true, data: { deleted: params.path } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { OutputPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_output',\r\n description: 'Get recent output log entries from Roblox Studio (prints, warnings, errors).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n limit: {\r\n type: 'number',\r\n description: 'Maximum number of log entries to return (default: 50)',\r\n default: 50,\r\n },\r\n level: {\r\n type: 'string',\r\n description: 'Filter by log level',\r\n enum: ['info', 'warn', 'error'],\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ entries: OutputPayload[] }>(CliMsg.GET_OUTPUT, {\r\n limit: params.limit ?? 50,\r\n level: params.level ?? null,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { SelectionPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_selection',\r\n description: 'Get the currently selected instances in Roblox Studio.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { SearchResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'search_scripts',\r\n description:\r\n 'Search across all scripts in Roblox Studio for a text pattern. Returns matching lines with context.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n query: {\r\n type: 'string',\r\n description: 'Text or pattern to search for in script sources',\r\n },\r\n maxResults: {\r\n type: 'number',\r\n description: 'Maximum number of script results (default: 20)',\r\n default: 20,\r\n },\r\n },\r\n required: ['query'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<SearchResultPayload>(CliMsg.SEARCH_SCRIPTS, {\r\n query: params.query,\r\n maxResults: params.maxResults ?? 20,\r\n });\r\n\r\n return { success: true, data: response.payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { TestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'run_tests',\r\n description:\r\n 'Run tests in Roblox Studio using StudioTestService. Can run all tests or a specific test by name.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n testName: {\r\n type: 'string',\r\n description: 'Specific test name to run. Omit to run all tests.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{ results: TestResultPayload[] }>(CliMsg.RUN_TESTS, {\r\n testName: params.testName ?? null,\r\n });\r\n\r\n const results = response.payload.results ?? [];\r\n const passed = results.filter((r) => r.passed).length;\r\n const failed = results.filter((r) => !r.passed).length;\r\n\r\n return {\r\n success: failed === 0,\r\n data: { total: results.length, passed, failed, results },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'get_class_info',\r\n description:\r\n 'Look up the full schema of a Roblox class using ReflectionService. ' +\r\n 'Returns all properties (with their types), methods (with parameters), and events. ' +\r\n 'ALWAYS call this before creating or modifying GUI/UI elements (Frame, TextLabel, ImageLabel, etc.) ' +\r\n 'to know the correct property names and expected types (e.g., Size is UDim2 for GUI, Vector3 for Parts).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n className: {\r\n type: 'string',\r\n description: 'Roblox class name, e.g. \"Frame\", \"TextLabel\", \"Part\", \"MeshPart\", \"Camera\"',\r\n },\r\n },\r\n required: ['className'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n className: string;\r\n properties: { name: string; type: string; category?: string; owner?: string }[];\r\n methods: { name: string; parameters: { name: string; type: string }[]; owner?: string }[];\r\n events: { name: string; parameters: { name: string; type: string }[]; owner?: string }[];\r\n superclass?: string;\r\n creatable?: boolean;\r\n error?: string;\r\n }>(CliMsg.GET_REFLECTION, { className: params.className });\r\n\r\n const payload = response.payload;\r\n if (payload.error) {\r\n return { success: false, error: payload.error };\r\n }\r\n\r\n return { success: true, data: payload };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'create_ui',\r\n description:\r\n 'Create an entire UI tree in Roblox Studio in a SINGLE call. ' +\r\n 'Pass a declarative JSON tree with ClassName, Name, properties, and Children. ' +\r\n 'All types are auto-coerced natively in Luau — UDim2, Color3, Font, enums all work. ' +\r\n 'This is 10x faster than run_code for UI because it handles everything in one round-trip ' +\r\n 'with no Luau syntax issues. Replaces any existing instance with the same name.\\n\\n' +\r\n 'Example: create a pastel hello world screen:\\n' +\r\n '{\\n' +\r\n ' \"parent\": \"StarterGui\",\\n' +\r\n ' \"tree\": {\\n' +\r\n ' \"ClassName\": \"ScreenGui\",\\n' +\r\n ' \"Name\": \"HelloWorld\",\\n' +\r\n ' \"ResetOnSpawn\": false,\\n' +\r\n ' \"Children\": [{\\n' +\r\n ' \"ClassName\": \"Frame\",\\n' +\r\n ' \"Name\": \"Background\",\\n' +\r\n ' \"Size\": [1, 0, 1, 0],\\n' +\r\n ' \"BackgroundColor3\": \"#F0E6FF\",\\n' +\r\n ' \"Children\": [\\n' +\r\n ' { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 12] },\\n' +\r\n ' { \"ClassName\": \"TextLabel\", \"Name\": \"Title\", \"Text\": \"Hello World!\",\\n' +\r\n ' \"Size\": [0.5, 0, 0.1, 0], \"Position\": [0.25, 0, 0.45, 0],\\n' +\r\n ' \"BackgroundTransparency\": 1, \"TextColor3\": \"#6C5CE7\",\\n' +\r\n ' \"TextScaled\": true, \"Font\": \"GothamBold\" }\\n' +\r\n ' ]\\n' +\r\n ' }]\\n' +\r\n ' }\\n' +\r\n '}',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n parent: {\r\n type: 'string',\r\n description: 'Parent path: \"StarterGui\", \"PlayerGui\", or any instance path. Default: StarterGui',\r\n },\r\n tree: {\r\n type: 'object',\r\n description:\r\n 'The root UI node. Each node has: ClassName (string), Name (string), ' +\r\n 'Children (array of child nodes), and properties. Properties may be ' +\r\n 'specified either flattened at the top level of the node, OR nested ' +\r\n 'under a \"properties\" / \"Properties\" / \"props\" key — both work. ' +\r\n 'Property values are auto-coerced:\\n' +\r\n ' UDim2: [xScale, xOffset, yScale, yOffset] or {XScale, XOffset, YScale, YOffset}\\n' +\r\n ' Color3: \"#hex\", \"rgb(r,g,b)\", [r,g,b], or BrickColor name\\n' +\r\n ' UDim: [scale, offset] or number\\n' +\r\n ' Vector2: [x, y] or {x, y} (auto-disambiguated from UDim by property name)\\n' +\r\n ' NumberRange: [min, max] or number\\n' +\r\n ' Rect: [minX, minY, maxX, maxY] or {MinX, MinY, MaxX, MaxY}\\n' +\r\n ' Font: \"GothamBold\", \"SourceSans\", etc. (Enum.Font names)\\n' +\r\n ' Enums: string name like \"Center\", \"Left\", \"Fit\"\\n' +\r\n ' FontFace: {Family, Weight, Style}\\n' +\r\n ' 2-element arrays are auto-disambiguated: AnchorPoint→Vector2, CornerRadius/Padding→UDim, etc.',\r\n },\r\n animate: {\r\n type: 'boolean',\r\n description: 'If true, task.wait() will be injected between creation of nodes so that the UI writes out dynamically.',\r\n },\r\n },\r\n required: ['tree'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n path?: string;\r\n instanceCount?: number;\r\n error?: string;\r\n }>(CliMsg.BUILD_UI, {\r\n parent: params.parent ?? 'StarterGui',\r\n animate: params.animate,\r\n tree: params.tree,\r\n });\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'UI build failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { path: payload.path, instanceCount: payload.instanceCount },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { StudioTestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'execute_run_test',\r\n description:\r\n 'Start a Run mode test session in Roblox Studio using StudioTestService:ExecuteRunModeAsync(). ' +\r\n 'Passes args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until the session ends (via EndTest or manual stop). ' +\r\n 'Returns the value passed to EndTest(). ' +\r\n 'Use this for headless automated tests — no player character, just server scripts running.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n args: {\r\n description:\r\n 'Arguments to pass to the test session. Server scripts retrieve this with StudioTestService:GetTestArgs(). ' +\r\n 'Can be a string (e.g. test suite name), table, or any serializable value.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<StudioTestResultPayload>(\r\n CliMsg.EXECUTE_RUN_TEST,\r\n { args: params.args ?? null },\r\n 120_000,\r\n );\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Run mode test failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n result: payload.result,\r\n duration: payload.duration,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\nimport type { StudioTestResultPayload } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'execute_play_test',\r\n description:\r\n 'Start a solo Play mode test session in Roblox Studio using StudioTestService:ExecutePlayModeAsync(). ' +\r\n 'Passes args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until the session ends (via EndTest or manual stop). ' +\r\n 'Returns the value passed to EndTest(). ' +\r\n 'Use this for tests that need a player character and full client-server simulation.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n args: {\r\n description:\r\n 'Arguments to pass to the test session. Server scripts retrieve this with StudioTestService:GetTestArgs(). ' +\r\n 'Can be a string (e.g. test suite name), table, or any serializable value.',\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<StudioTestResultPayload>(\r\n CliMsg.EXECUTE_PLAY_TEST,\r\n { args: params.args ?? null },\r\n 120_000,\r\n );\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Play mode test failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n result: payload.result,\r\n duration: payload.duration,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'create_part',\r\n description:\r\n 'Create a Part in Roblox Studio with position, size, color, material and more — all in one call. Much faster than insert_instance + set_properties separately.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Name for the part' },\r\n parent: {\r\n type: 'string',\r\n description: 'Parent path (default: \"Workspace\")',\r\n },\r\n shape: {\r\n type: 'string',\r\n enum: ['Block', 'Ball', 'Cylinder', 'Wedge', 'CornerWedge'],\r\n description: 'Part shape (default: Block)',\r\n },\r\n position: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'World position {x, y, z}',\r\n },\r\n size: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'Size in studs {x, y, z} (default: {4, 1, 2})',\r\n },\r\n color: {\r\n type: 'string',\r\n description: 'Color as hex \"#FF0000\", BrickColor name \"Bright red\", or RGB \"rgb(255,0,0)\"',\r\n },\r\n material: {\r\n type: 'string',\r\n description: 'Material name: Plastic, Wood, Grass, Ice, Metal, Concrete, Sand, Neon, Glass, etc.',\r\n },\r\n transparency: { type: 'number', description: '0 (opaque) to 1 (invisible)' },\r\n anchored: { type: 'boolean', description: 'Whether the part is anchored (default: true)' },\r\n canCollide: { type: 'boolean', description: 'Whether the part has collision' },\r\n },\r\n required: ['name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const parent = (params.parent as string) || 'Workspace';\r\n const name = params.name as string;\r\n const pos = params.position as { x?: number; y?: number; z?: number } | undefined;\r\n const size = params.size as { x?: number; y?: number; z?: number } | undefined;\r\n\r\n const properties: Record<string, unknown> = {};\r\n\r\n if (pos) properties.Position = { X: pos.x ?? 0, Y: pos.y ?? 0, Z: pos.z ?? 0 };\r\n if (size) properties.Size = { X: size.x ?? 4, Y: size.y ?? 1, Z: size.z ?? 2 };\r\n if (params.color) {\r\n const c = params.color as string;\r\n if (c.startsWith('#')) {\r\n properties.Color = c;\r\n } else if (c.startsWith('rgb')) {\r\n const m = c.match(/(\\d+)/g);\r\n if (m && m.length >= 3) {\r\n properties.Color = { red: parseInt(m[0]), green: parseInt(m[1]), blue: parseInt(m[2]) };\r\n }\r\n } else {\r\n properties.BrickColor = c;\r\n }\r\n }\r\n if (params.material) properties.Material = params.material;\r\n if (params.transparency !== undefined) properties.Transparency = params.transparency;\r\n if (params.anchored !== undefined) properties.Anchored = params.anchored;\r\n else properties.Anchored = true;\r\n if (params.canCollide !== undefined) properties.CanCollide = params.canCollide;\r\n if (params.shape && params.shape !== 'Block') properties.Shape = params.shape;\r\n\r\n const className = (params.shape === 'Wedge') ? 'WedgePart'\r\n : (params.shape === 'CornerWedge') ? 'CornerWedgePart'\r\n : 'Part';\r\n\r\n const res = await ctx.sendToStudio(CliMsg.INSERT_INSTANCE, {\r\n className,\r\n parentPath: parent,\r\n name,\r\n properties,\r\n });\r\n\r\n const payload = res.payload as { success: boolean; path?: string; error?: string };\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to create part' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: { path: payload.path, properties: Object.keys(properties) },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'clone_instance',\r\n description:\r\n 'Clone an existing instance in Roblox Studio and optionally reposition/rename it. Great for duplicating parts, models, or entire trees.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: { type: 'string', description: 'Path of instance to clone' },\r\n newName: { type: 'string', description: 'Name for the clone (optional)' },\r\n newParent: { type: 'string', description: 'Parent path for the clone (optional, defaults to same parent)' },\r\n offset: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n description: 'Position offset from original {x, y, z}',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const code = buildCloneCode(params);\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to clone' };\r\n }\r\n\r\n return { success: true, data: { output: payload.output } };\r\n },\r\n};\r\n\r\nfunction buildCloneCode(params: Record<string, unknown>): string {\r\n const path = params.path as string;\r\n const parts = path.split('.');\r\n let resolve = 'game';\r\n for (const p of parts) {\r\n resolve += `[\"${p}\"]`;\r\n }\r\n\r\n const lines = [\r\n `local orig = ${resolve}`,\r\n `local clone = orig:Clone()`,\r\n ];\r\n\r\n if (params.newName) {\r\n lines.push(`clone.Name = \"${params.newName}\"`);\r\n }\r\n\r\n if (params.newParent) {\r\n const parentParts = (params.newParent as string).split('.');\r\n let parentResolve = 'game';\r\n for (const p of parentParts) {\r\n parentResolve += `[\"${p}\"]`;\r\n }\r\n lines.push(`clone.Parent = ${parentResolve}`);\r\n } else {\r\n lines.push(`clone.Parent = orig.Parent`);\r\n }\r\n\r\n const offset = params.offset as { x?: number; y?: number; z?: number } | undefined;\r\n if (offset) {\r\n lines.push(`if clone:IsA(\"BasePart\") then`);\r\n lines.push(` clone.Position = clone.Position + Vector3.new(${offset.x ?? 0}, ${offset.y ?? 0}, ${offset.z ?? 0})`);\r\n lines.push(`end`);\r\n }\r\n\r\n lines.push(`print(\"Cloned: \" .. clone:GetFullName())`);\r\n return lines.join('\\n');\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'group_instances',\r\n description:\r\n 'Group multiple instances under a new Model or Folder. Useful for organizing parts into objects (e.g., grouping trunk + leaves into a \"Tree\" model).',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n paths: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'Array of instance paths to group together',\r\n },\r\n groupName: { type: 'string', description: 'Name for the new group' },\r\n groupClass: {\r\n type: 'string',\r\n enum: ['Model', 'Folder'],\r\n description: 'Class for the group container (default: Model)',\r\n },\r\n parent: { type: 'string', description: 'Parent path (default: Workspace)' },\r\n },\r\n required: ['paths', 'groupName'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const paths = params.paths as string[];\r\n const groupName = params.groupName as string;\r\n const groupClass = (params.groupClass as string) || 'Model';\r\n const parent = (params.parent as string) || 'Workspace';\r\n\r\n const resolves = paths.map((p) => {\r\n const parts = p.split('.');\r\n let r = 'game';\r\n for (const part of parts) r += `[\"${part}\"]`;\r\n return r;\r\n });\r\n\r\n const parentParts = parent.split('.');\r\n let parentResolve = 'game';\r\n for (const p of parentParts) parentResolve += `[\"${p}\"]`;\r\n\r\n const code = [\r\n `local group = Instance.new(\"${groupClass}\")`,\r\n `group.Name = \"${groupName}\"`,\r\n `group.Parent = ${parentResolve}`,\r\n ...resolves.map((r) => `${r}.Parent = group`),\r\n groupClass === 'Model' ? `if group:IsA(\"Model\") then group:MoveTo(group:GetBoundingBox().Position) end` : '',\r\n `print(\"Grouped ${paths.length} instances into: \" .. group:GetFullName())`,\r\n ].filter(Boolean).join('\\n');\r\n\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Failed to group' };\r\n }\r\n\r\n return { success: true, data: { groupPath: `${parent}.${groupName}`, count: paths.length } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\ninterface PartSpec {\r\n name: string;\r\n className?: string;\r\n parent?: string;\r\n position?: { x: number; y: number; z: number };\r\n size?: { x: number; y: number; z: number };\r\n color?: string;\r\n material?: string;\r\n transparency?: number;\r\n anchored?: boolean;\r\n shape?: string;\r\n}\r\n\r\nexport const tool: Tool = {\r\n name: 'build_multiple',\r\n description:\r\n 'Create multiple parts/instances in one batch call. Send an array of specs and they all get created in a single Studio round-trip. Ideal for building trees, houses, vehicles, terrain — anything composed of multiple parts.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n parts: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Part name' },\r\n className: { type: 'string', description: 'ClassName (default: Part)' },\r\n parent: { type: 'string', description: 'Parent path (default: Workspace)' },\r\n position: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n },\r\n size: {\r\n type: 'object',\r\n properties: { x: { type: 'number' }, y: { type: 'number' }, z: { type: 'number' } },\r\n },\r\n color: { type: 'string', description: 'Hex \"#RRGGBB\" or BrickColor name' },\r\n material: { type: 'string' },\r\n transparency: { type: 'number' },\r\n anchored: { type: 'boolean' },\r\n shape: { type: 'string', enum: ['Block', 'Ball', 'Cylinder', 'Wedge'] },\r\n },\r\n required: ['name'],\r\n },\r\n description: 'Array of part specifications',\r\n },\r\n groupName: {\r\n type: 'string',\r\n description: 'Optional: group all parts under a Model with this name',\r\n },\r\n groupParent: {\r\n type: 'string',\r\n description: 'Parent for the group Model (default: Workspace)',\r\n },\r\n },\r\n required: ['parts'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const parts = params.parts as PartSpec[];\r\n const groupName = params.groupName as string | undefined;\r\n const groupParent = (params.groupParent as string) || 'Workspace';\r\n\r\n const code = generateBatchCode(parts, groupName, groupParent);\r\n const res = await ctx.sendToStudio(CliMsg.RUN_CODE, { code });\r\n const payload = res.payload as { success: boolean; output?: string; error?: string };\r\n\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Batch build failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n count: parts.length,\r\n group: groupName ?? null,\r\n output: payload.output,\r\n },\r\n };\r\n },\r\n};\r\n\r\nfunction generateBatchCode(parts: PartSpec[], groupName?: string, groupParent?: string): string {\r\n const lines: string[] = [];\r\n\r\n function resolveParent(path: string): string {\r\n const segs = path.split('.');\r\n let r = 'game';\r\n for (const s of segs) r += `[\"${s}\"]`;\r\n return r;\r\n }\r\n\r\n if (groupName) {\r\n const gp = resolveParent(groupParent || 'Workspace');\r\n lines.push(`local _group = Instance.new(\"Model\")`);\r\n lines.push(`_group.Name = \"${groupName}\"`);\r\n lines.push(`_group.Parent = ${gp}`);\r\n }\r\n\r\n for (let i = 0; i < parts.length; i++) {\r\n const p = parts[i];\r\n const varName = `_p${i}`;\r\n const cn = p.className || (p.shape === 'Wedge' ? 'WedgePart' : 'Part');\r\n\r\n lines.push(`local ${varName} = Instance.new(\"${cn}\")`);\r\n lines.push(`${varName}.Name = \"${p.name}\"`);\r\n\r\n if (p.position) {\r\n lines.push(`${varName}.Position = Vector3.new(${p.position.x ?? 0}, ${p.position.y ?? 0}, ${p.position.z ?? 0})`);\r\n }\r\n if (p.size) {\r\n lines.push(`${varName}.Size = Vector3.new(${p.size.x ?? 4}, ${p.size.y ?? 1}, ${p.size.z ?? 2})`);\r\n }\r\n if (p.color) {\r\n if (p.color.startsWith('#')) {\r\n lines.push(`${varName}.Color = Color3.fromHex(\"${p.color}\")`);\r\n } else {\r\n lines.push(`${varName}.BrickColor = BrickColor.new(\"${p.color}\")`);\r\n }\r\n }\r\n if (p.material) {\r\n lines.push(`${varName}.Material = Enum.Material.${p.material}`);\r\n }\r\n if (p.transparency !== undefined) {\r\n lines.push(`${varName}.Transparency = ${p.transparency}`);\r\n }\r\n if (p.anchored !== undefined) {\r\n lines.push(`${varName}.Anchored = ${p.anchored}`);\r\n } else {\r\n lines.push(`${varName}.Anchored = true`);\r\n }\r\n if (p.shape && p.shape !== 'Block' && cn === 'Part') {\r\n lines.push(`${varName}.Shape = Enum.PartType.${p.shape}`);\r\n }\r\n\r\n if (groupName) {\r\n lines.push(`${varName}.Parent = _group`);\r\n } else {\r\n const parent = p.parent || 'Workspace';\r\n lines.push(`${varName}.Parent = ${resolveParent(parent)}`);\r\n }\r\n }\r\n\r\n lines.push(`print(\"Built ${parts.length} parts${groupName ? ` in ${groupName}` : ''}\")`);\r\n return lines.join('\\n');\r\n}\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'serialize_ui',\r\n description:\r\n 'Serialize an existing UI tree from Roblox Studio into create_ui-compatible JSON. ' +\r\n 'This is the reverse of create_ui — read any instance and get back a declarative JSON tree ' +\r\n 'you can modify and pass back to create_ui. Perfect for cloning, templating, or refactoring UIs.\\n\\n' +\r\n 'The output includes ClassName, Name, all non-default properties (with values converted to ' +\r\n 'JSON-friendly formats like [r,g,b] for Color3, [xS,xO,yS,yO] for UDim2, etc.), and Children.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Instance path to serialize (e.g. \"StarterGui.MyScreenGui\")',\r\n },\r\n maxDepth: {\r\n type: 'number',\r\n description: 'Maximum depth to serialize (default: 50)',\r\n },\r\n },\r\n required: ['path'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n tree?: unknown;\r\n error?: string;\r\n }>(CliMsg.SERIALIZE_UI, {\r\n path: params.path,\r\n maxDepth: params.maxDepth ?? 50,\r\n }, 1000 * 60 * 2);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Serialization failed' };\r\n }\r\n\r\n return { success: true, data: payload.tree };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'move_instance',\r\n description:\r\n 'Move (reparent) an instance to a new parent in Roblox Studio. ' +\r\n 'This preserves the instance and all its descendants — much better than delete + recreate. ' +\r\n 'Sets a ChangeHistoryService waypoint so the move can be undone.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n path: {\r\n type: 'string',\r\n description: 'Full path of the instance to move (e.g. \"Workspace.OldFolder.MyPart\")',\r\n },\r\n newParent: {\r\n type: 'string',\r\n description: 'Full path of the new parent (e.g. \"Workspace.NewFolder\")',\r\n },\r\n },\r\n required: ['path', 'newParent'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n newPath?: string;\r\n error?: string;\r\n }>(CliMsg.MOVE_INSTANCE, {\r\n path: params.path,\r\n newParent: params.newParent,\r\n });\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Move failed' };\r\n }\r\n\r\n return { success: true, data: { newPath: payload.newPath } };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'bulk_set_properties',\r\n description:\r\n 'Set properties on multiple instances at once in a single call. ' +\r\n 'Much faster than calling set_properties repeatedly. Supports two modes:\\n' +\r\n '1. Explicit paths: provide an array of {path, properties} objects\\n' +\r\n '2. By class filter: provide a root path, className filter, and properties to apply to all matches\\n\\n' +\r\n 'Filter mode also supports addChildren: insert child instances (e.g. UIStroke, UICorner) on every match. ' +\r\n 'Idempotent — skips if a child of that class already exists.\\n\\n' +\r\n 'Example (explicit): targets=[{\"path\": \"StarterGui.HUD.Title\", \"properties\": {\"TextColor3\": \"#fff\"}}]\\n' +\r\n 'Example (filter): root=\"StarterGui.HUD\", className=\"TextLabel\", properties={\"Font\": \"RobotoBold\"}\\n' +\r\n 'Example (addChildren): root=\"StarterGui.HUD\", className=\"TextLabel\", addChildren=[{\"ClassName\": \"UIStroke\", \"Color\": \"#000000\", \"Thickness\": 1.5}]',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n targets: {\r\n type: 'array',\r\n description: 'Array of {path, properties} objects for explicit mode.',\r\n items: {\r\n type: 'object',\r\n description: 'A target with path and properties to set.',\r\n },\r\n },\r\n root: {\r\n type: 'string',\r\n description: 'Root instance path to search under (filter mode)',\r\n },\r\n className: {\r\n type: 'string',\r\n description: 'Only apply to instances of this ClassName (filter mode)',\r\n },\r\n properties: {\r\n type: 'object',\r\n description: 'Properties to set on all matched instances (filter mode)',\r\n },\r\n addChildren: {\r\n type: 'array',\r\n description: 'Child instances to insert on every match (filter mode). Each item: {ClassName, Name?, ...props}. Idempotent — skips if child of that class already exists.',\r\n items: {\r\n type: 'object',\r\n description: 'Child instance spec with ClassName and properties',\r\n },\r\n },\r\n },\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n modified?: number;\r\n errors?: string[];\r\n error?: string;\r\n }>(CliMsg.BULK_SET_PROPERTIES, {\r\n targets: params.targets,\r\n root: params.root,\r\n className: params.className,\r\n properties: params.properties,\r\n addChildren: params.addChildren,\r\n }, 1000 * 60);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Bulk set failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n modified: payload.modified,\r\n errors: payload.errors?.length ? payload.errors : undefined,\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'find_replace_scripts',\r\n description:\r\n 'Find and replace text across all scripts in the game (or under a root path). ' +\r\n 'Supports plain text and Lua pattern matching. Returns a list of modified scripts with match counts.\\n\\n' +\r\n 'Use dryRun=true to preview changes without applying them.\\n' +\r\n 'Example: find=\"workspace\" replace=\"Workspace\" root=\"ServerScriptService\"',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n find: {\r\n type: 'string',\r\n description: 'Text or Lua pattern to search for',\r\n },\r\n replace: {\r\n type: 'string',\r\n description: 'Replacement text (supports Lua pattern captures like %1, %2)',\r\n },\r\n root: {\r\n type: 'string',\r\n description: 'Root path to limit search scope (optional, searches entire game if omitted)',\r\n },\r\n usePattern: {\r\n type: 'boolean',\r\n description: 'If true, treat find/replace as Lua patterns. Default: false (plain text)',\r\n },\r\n dryRun: {\r\n type: 'boolean',\r\n description: 'If true, report matches but do not modify scripts. Default: false',\r\n },\r\n },\r\n required: ['find', 'replace'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n modified?: { path: string; matches: number }[];\r\n totalMatches?: number;\r\n totalFiles?: number;\r\n error?: string;\r\n }>(CliMsg.FIND_REPLACE_SCRIPTS, {\r\n find: params.find,\r\n replace: params.replace,\r\n root: params.root,\r\n usePattern: params.usePattern ?? false,\r\n dryRun: params.dryRun ?? false,\r\n }, 1000 * 60 * 5);\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Find/replace failed' };\r\n }\r\n\r\n return {\r\n success: true,\r\n data: {\r\n totalFiles: payload.totalFiles,\r\n totalMatches: payload.totalMatches,\r\n modified: payload.modified,\r\n dryRun: params.dryRun ?? false,\r\n },\r\n };\r\n },\r\n};\r\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport type RobloxApiKind = 'class' | 'datatype' | 'enum' | 'global' | 'library';\n\nexport interface RobloxApiMember {\n name: string;\n memberType: string;\n definedOn?: string;\n type?: string;\n summary?: string;\n description?: string;\n parameters?: { name?: string; type?: string; summary?: string; default?: string }[];\n returns?: { type?: string; summary?: string }[];\n tags?: string[];\n security?: { read?: string; write?: string };\n threadSafety?: string;\n category?: string;\n deprecationMessage?: string;\n value?: number;\n}\n\nexport interface RobloxApiReference {\n name: string;\n kind: RobloxApiKind;\n summary: string;\n description: string;\n inherits: string[];\n tags: string[];\n deprecationMessage: string;\n sourceUrl: string;\n members: Record<string, RobloxApiMember[]>;\n inheritedClasses?: string[];\n inheritedMembers?: Record<string, RobloxApiMember[]>;\n}\n\nexport interface RobloxApiSearchResult {\n name: string;\n kind: RobloxApiKind;\n score: number;\n sourceUrl: string;\n}\n\ninterface DocsOptions {\n docsRoot?: string;\n includeInherited?: boolean;\n}\n\nconst GITHUB_RAW_BASE =\n 'https://raw.githubusercontent.com/Roblox/creator-docs/main/content/en-us/reference/engine';\nconst GITHUB_TREE_URL =\n 'https://api.github.com/repos/Roblox/creator-docs/git/trees/main?recursive=1';\n\nconst KIND_FOLDERS: Record<RobloxApiKind, string> = {\n class: 'classes',\n datatype: 'datatypes',\n enum: 'enums',\n global: 'globals',\n library: 'libraries',\n};\n\nconst MEMBER_SECTIONS = [\n 'properties',\n 'methods',\n 'events',\n 'callbacks',\n 'constructors',\n 'functions',\n 'items',\n 'constants',\n 'math_operations',\n];\n\nlet remoteTreeCache: { path: string; type: string }[] | null = null;\n\nexport async function getRobloxApiReference(\n name: string,\n opts: DocsOptions & { kind?: RobloxApiKind | 'any' } = {},\n): Promise<RobloxApiReference> {\n const normalizedName = normalizeLookupName(name);\n const kinds = opts.kind && opts.kind !== 'any'\n ? [opts.kind]\n : (Object.keys(KIND_FOLDERS) as RobloxApiKind[]);\n\n for (const kind of kinds) {\n const doc = await readReferenceYaml(normalizedName, kind, opts);\n if (!doc) continue;\n\n const reference = parseReferenceYaml(doc.content, {\n kind,\n sourceUrl: doc.sourceUrl,\n });\n markDefinedOn(reference, reference.name);\n\n if (opts.includeInherited && reference.kind === 'class') {\n const inherited = await collectInheritedMembers(reference, opts, new Set([reference.name]));\n reference.inheritedClasses = inherited.classes;\n reference.inheritedMembers = inherited.members;\n }\n\n return reference;\n }\n\n throw new Error(`Roblox API reference not found for \"${name}\"`);\n}\n\nasync function collectInheritedMembers(\n reference: RobloxApiReference,\n opts: DocsOptions,\n visited: Set<string>,\n): Promise<{ classes: string[]; members: Record<string, RobloxApiMember[]> }> {\n const classes: string[] = [];\n const members: Record<string, RobloxApiMember[]> = {};\n\n for (const parent of reference.inherits) {\n if (!parent || visited.has(parent)) continue;\n visited.add(parent);\n\n const doc = await readReferenceYaml(parent, 'class', opts);\n if (!doc) continue;\n\n const parentReference = parseReferenceYaml(doc.content, {\n kind: 'class',\n sourceUrl: doc.sourceUrl,\n });\n markDefinedOn(parentReference, parentReference.name);\n\n classes.push(parentReference.name);\n mergeMembers(members, parentReference.members);\n\n const inherited = await collectInheritedMembers(parentReference, opts, visited);\n classes.push(...inherited.classes);\n mergeMembers(members, inherited.members);\n }\n\n return { classes, members };\n}\n\nfunction markDefinedOn(reference: RobloxApiReference, className: string): void {\n for (const section of Object.values(reference.members)) {\n for (const member of section) {\n member.definedOn = className;\n }\n }\n}\n\nfunction mergeMembers(\n target: Record<string, RobloxApiMember[]>,\n source: Record<string, RobloxApiMember[]>,\n): void {\n for (const [section, members] of Object.entries(source)) {\n target[section] ??= [];\n target[section].push(...members);\n }\n}\n\nexport async function searchRobloxApi(\n query: string,\n opts: DocsOptions & { kind?: RobloxApiKind | 'any'; limit?: number } = {},\n): Promise<RobloxApiSearchResult[]> {\n const limit = Math.max(1, Math.min(opts.limit ?? 10, 50));\n const normalizedQuery = normalizeSearchText(query);\n const kinds = opts.kind && opts.kind !== 'any'\n ? [opts.kind]\n : (Object.keys(KIND_FOLDERS) as RobloxApiKind[]);\n\n const entries = await listReferenceEntries(opts);\n return entries\n .filter((entry) => kinds.includes(entry.kind))\n .map((entry) => ({\n ...entry,\n score: scoreSearchResult(normalizedQuery, entry.name, entry.kind),\n }))\n .filter((entry) => entry.score > 0)\n .sort((a, b) => b.score - a.score || a.name.localeCompare(b.name))\n .slice(0, limit);\n}\n\nexport function parseReferenceYaml(\n raw: string,\n opts: { kind?: RobloxApiKind; sourceUrl?: string } = {},\n): RobloxApiReference {\n const kind = opts.kind ?? normalizeKind(readTopScalar(raw, 'type')) ?? 'class';\n const members: Record<string, RobloxApiMember[]> = {};\n\n for (const section of MEMBER_SECTIONS) {\n const parsed = parseMemberSection(raw, section);\n if (parsed.length > 0) {\n members[section] = parsed;\n }\n }\n\n return {\n name: readTopScalar(raw, 'name') || 'Unknown',\n kind,\n summary: cleanDocText(readTopScalar(raw, 'summary')),\n description: cleanDocText(readTopScalar(raw, 'description')),\n inherits: readTopList(raw, 'inherits'),\n tags: readTopList(raw, 'tags'),\n deprecationMessage: cleanDocText(readTopScalar(raw, 'deprecation_message')),\n sourceUrl: opts.sourceUrl ?? '',\n members,\n };\n}\n\nfunction normalizeKind(value: string): RobloxApiKind | undefined {\n if (value === 'class' || value === 'datatype' || value === 'enum' || value === 'global' || value === 'library') {\n return value;\n }\n return undefined;\n}\n\nasync function readReferenceYaml(\n name: string,\n kind: RobloxApiKind,\n opts: DocsOptions,\n): Promise<{ content: string; sourceUrl: string } | null> {\n const localRoot = resolveDocsRoot(opts.docsRoot);\n const folder = KIND_FOLDERS[kind];\n const fileName = `${name}.yaml`;\n\n if (localRoot) {\n const localPath = path.join(localRoot, folder, fileName);\n if (fs.existsSync(localPath)) {\n return {\n content: fs.readFileSync(localPath, 'utf-8'),\n sourceUrl: toCreatorDocsUrl(kind, name),\n };\n }\n }\n\n const sourceUrl = `${GITHUB_RAW_BASE}/${folder}/${encodeURIComponent(fileName)}`;\n try {\n return {\n content: await fetchText(sourceUrl),\n sourceUrl: toCreatorDocsUrl(kind, name),\n };\n } catch {\n return null;\n }\n}\n\nasync function listReferenceEntries(opts: DocsOptions): Promise<RobloxApiSearchResult[]> {\n const localRoot = resolveDocsRoot(opts.docsRoot);\n if (localRoot) {\n const entries: RobloxApiSearchResult[] = [];\n for (const [kind, folder] of Object.entries(KIND_FOLDERS) as [RobloxApiKind, string][]) {\n const dir = path.join(localRoot, folder);\n if (!fs.existsSync(dir)) continue;\n\n for (const file of fs.readdirSync(dir)) {\n if (!file.endsWith('.yaml')) continue;\n const name = path.basename(file, '.yaml');\n entries.push({ name, kind, score: 0, sourceUrl: toCreatorDocsUrl(kind, name) });\n }\n }\n return entries;\n }\n\n const tree = await getRemoteTree();\n const prefix = 'content/en-us/reference/engine/';\n return tree\n .filter((entry) => entry.type === 'blob')\n .map((entry) => entry.path)\n .filter((entryPath) => entryPath.startsWith(prefix) && entryPath.endsWith('.yaml'))\n .flatMap((entryPath) => {\n const rest = entryPath.slice(prefix.length);\n const [folder, file] = rest.split('/');\n const kind = folderToKind(folder);\n if (!kind || !file) return [];\n\n const name = path.basename(file, '.yaml');\n return [{ name, kind, score: 0, sourceUrl: toCreatorDocsUrl(kind, name) }];\n });\n}\n\nasync function getRemoteTree(): Promise<{ path: string; type: string }[]> {\n if (remoteTreeCache) return remoteTreeCache;\n\n const payload = JSON.parse(await fetchText(GITHUB_TREE_URL)) as {\n tree?: { path: string; type: string }[];\n };\n remoteTreeCache = payload.tree ?? [];\n return remoteTreeCache;\n}\n\nfunction folderToKind(folder: string): RobloxApiKind | undefined {\n for (const [kind, value] of Object.entries(KIND_FOLDERS) as [RobloxApiKind, string][]) {\n if (value === folder) return kind;\n }\n return undefined;\n}\n\nfunction resolveDocsRoot(explicitRoot?: string): string | null {\n const candidates = [\n explicitRoot,\n process.env.ROBLOX_CREATOR_DOCS_PATH,\n path.join(process.cwd(), '.tmp', 'creator-docs'),\n ].filter(Boolean) as string[];\n\n for (const candidate of candidates) {\n const normalized = normalizeDocsRoot(candidate);\n if (normalized && fs.existsSync(normalized)) return normalized;\n }\n\n return null;\n}\n\nfunction normalizeDocsRoot(root: string): string | null {\n const engineRoot = path.join(root, 'content', 'en-us', 'reference', 'engine');\n if (fs.existsSync(engineRoot)) return engineRoot;\n\n const directClasses = path.join(root, 'classes');\n if (fs.existsSync(directClasses)) return root;\n\n return null;\n}\n\nfunction normalizeLookupName(name: string): string {\n const trimmed = name.trim();\n const ownerName = trimmed.split(':')[0];\n const lastToken = ownerName.split('.').pop() ?? ownerName;\n return lastToken.replace(/[^A-Za-z0-9_]/g, '');\n}\n\nfunction normalizeSearchText(value: string): string {\n return value.trim().toLowerCase().replace(/[^a-z0-9_]+/g, '');\n}\n\nfunction scoreSearchResult(query: string, name: string, kind: RobloxApiKind): number {\n if (!query) return 1;\n\n const normalizedName = normalizeSearchText(name);\n if (normalizedName === query) return 100;\n if (normalizedName.startsWith(query)) return 75;\n if (normalizedName.includes(query)) return 50;\n\n const kindScore = kind.includes(query) ? 10 : 0;\n return kindScore;\n}\n\nfunction toCreatorDocsUrl(kind: RobloxApiKind, name: string): string {\n return `https://create.roblox.com/docs/reference/engine/${KIND_FOLDERS[kind]}/${name}`;\n}\n\nasync function fetchText(url: string): Promise<string> {\n const response = await fetch(url, {\n headers: { 'User-Agent': 'Dominus Roblox API docs lookup' },\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`);\n }\n return response.text();\n}\n\nfunction readTopScalar(raw: string, key: string): string {\n const lines = raw.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(new RegExp(`^${escapeRegExp(key)}:\\\\s*(.*)$`));\n if (!match) continue;\n return readYamlValue(lines, i, 0, match[1]);\n }\n return '';\n}\n\nfunction readTopList(raw: string, key: string): string[] {\n const lines = raw.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(new RegExp(`^${escapeRegExp(key)}:\\\\s*(.*)$`));\n if (!match) continue;\n\n const inline = match[1].trim();\n if (inline === '[]' || inline === '') {\n if (inline === '[]') return [];\n return readIndentedList(lines, i + 1, 2);\n }\n return [unquote(inline)];\n }\n return [];\n}\n\nfunction parseMemberSection(raw: string, section: string): RobloxApiMember[] {\n const sectionLines = extractTopSection(raw, section);\n if (sectionLines.length === 0) return [];\n\n const items = splitMemberItems(sectionLines);\n return items\n .map((item) => parseMemberItem(item, section))\n .filter((item): item is RobloxApiMember => Boolean(item));\n}\n\nfunction extractTopSection(raw: string, section: string): string[] {\n const lines = raw.split(/\\r?\\n/);\n const start = lines.findIndex((line) => line === `${section}:`);\n if (start === -1) return [];\n\n const result: string[] = [];\n for (let i = start + 1; i < lines.length; i++) {\n if (/^[A-Za-z_][A-Za-z0-9_]*:/.test(lines[i])) break;\n result.push(lines[i]);\n }\n return result;\n}\n\nfunction splitMemberItems(lines: string[]): string[][] {\n const items: string[][] = [];\n let current: string[] = [];\n\n for (const line of lines) {\n if (/^ - /.test(line)) {\n if (current.length > 0) items.push(current);\n current = [line];\n continue;\n }\n if (current.length > 0) current.push(line);\n }\n\n if (current.length > 0) items.push(current);\n return items;\n}\n\nfunction parseMemberItem(lines: string[], section: string): RobloxApiMember | null {\n const name = readMemberScalar(lines, 'name');\n if (!name) return null;\n\n const member: RobloxApiMember = {\n name,\n memberType: section,\n type: readMemberScalar(lines, 'type') || readMemberScalar(lines, 'return_type'),\n summary: cleanDocText(readMemberScalar(lines, 'summary')),\n description: cleanDocText(readMemberScalar(lines, 'description')),\n parameters: readNestedObjects(lines, 'parameters'),\n returns: readNestedObjects(lines, 'returns'),\n tags: readMemberList(lines, 'tags'),\n security: readSecurity(lines),\n threadSafety: readMemberScalar(lines, 'thread_safety'),\n category: readMemberScalar(lines, 'category'),\n deprecationMessage: cleanDocText(readMemberScalar(lines, 'deprecation_message')),\n };\n\n const value = Number(readMemberScalar(lines, 'value'));\n if (Number.isFinite(value)) member.value = value;\n\n return member;\n}\n\nfunction readMemberScalar(lines: string[], key: string): string {\n for (let i = 0; i < lines.length; i++) {\n const firstLinePattern = new RegExp(`^ - ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const fieldPattern = new RegExp(`^ ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const firstLineMatch = lines[i].match(firstLinePattern);\n const fieldMatch = lines[i].match(fieldPattern);\n const match = firstLineMatch ?? fieldMatch;\n if (!match) continue;\n return readYamlValue(lines, i, firstLineMatch ? 2 : 4, match[1]);\n }\n return '';\n}\n\nfunction readMemberList(lines: string[], key: string): string[] {\n for (let i = 0; i < lines.length; i++) {\n const match = lines[i].match(new RegExp(`^ ${escapeRegExp(key)}:\\\\s*(.*)$`));\n if (!match) continue;\n const inline = match[1].trim();\n if (inline === '[]') return [];\n if (inline) return [unquote(inline)];\n return readIndentedList(lines, i + 1, 6);\n }\n return [];\n}\n\nfunction readNestedObjects(lines: string[], key: string): { name?: string; type?: string; summary?: string; default?: string }[] {\n const start = lines.findIndex((line) => line === ` ${key}:`);\n if (start === -1) return [];\n\n const nested: string[] = [];\n for (let i = start + 1; i < lines.length; i++) {\n if (/^ [A-Za-z_][A-Za-z0-9_]*:/.test(lines[i])) break;\n nested.push(lines[i]);\n }\n\n const items: string[][] = [];\n let current: string[] = [];\n for (const line of nested) {\n if (/^ - /.test(line)) {\n if (current.length > 0) items.push(current);\n current = [line];\n continue;\n }\n if (current.length > 0) current.push(line);\n }\n if (current.length > 0) items.push(current);\n\n return items.map((item) => ({\n name: readNestedScalar(item, 'name'),\n type: readNestedScalar(item, 'type'),\n summary: cleanDocText(readNestedScalar(item, 'summary')),\n default: readNestedScalar(item, 'default'),\n }));\n}\n\nfunction readNestedScalar(lines: string[], key: string): string {\n for (let i = 0; i < lines.length; i++) {\n const firstLinePattern = new RegExp(`^ - ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const fieldPattern = new RegExp(`^ ${escapeRegExp(key)}:\\\\s*(.*)$`);\n const firstLineMatch = lines[i].match(firstLinePattern);\n const fieldMatch = lines[i].match(fieldPattern);\n const match = firstLineMatch ?? fieldMatch;\n if (!match) continue;\n return readYamlValue(lines, i, firstLineMatch ? 6 : 8, match[1]);\n }\n return '';\n}\n\nfunction readSecurity(lines: string[]): { read?: string; write?: string } | undefined {\n const start = lines.findIndex((line) => line === ' security:');\n if (start === -1) return undefined;\n\n return {\n read: readIndentedScalar(lines, start + 1, 'read', 6),\n write: readIndentedScalar(lines, start + 1, 'write', 6),\n };\n}\n\nfunction readIndentedScalar(lines: string[], start: number, key: string, indent: number): string {\n const pattern = new RegExp(`^\\\\s{${indent}}${escapeRegExp(key)}:\\\\s*(.*)$`);\n for (let i = start; i < lines.length; i++) {\n if (indentOf(lines[i]) < indent) break;\n const match = lines[i].match(pattern);\n if (match) return unquote(match[1].trim());\n }\n return '';\n}\n\nfunction readYamlValue(lines: string[], index: number, indent: number, rawValue: string): string {\n const value = rawValue.trim();\n if (value === '|-' || value === '|') {\n return readBlock(lines, index + 1, indent + 2);\n }\n if (value === \"''\" || value === '\"\"') return '';\n return unquote(value);\n}\n\nfunction readBlock(lines: string[], start: number, minIndent: number): string {\n const block: string[] = [];\n for (let i = start; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim() && indentOf(line) < minIndent) break;\n block.push(line.slice(Math.min(minIndent, line.length)));\n }\n return block.join('\\n').trim();\n}\n\nfunction readIndentedList(lines: string[], start: number, indent: number): string[] {\n const pattern = new RegExp(`^\\\\s{${indent}}-\\\\s*(.*)$`);\n const values: string[] = [];\n for (let i = start; i < lines.length; i++) {\n if (lines[i].trim() && indentOf(lines[i]) < indent) break;\n const match = lines[i].match(pattern);\n if (match) values.push(unquote(match[1].trim()));\n }\n return values;\n}\n\nfunction cleanDocText(value: string): string {\n return value\n .replace(/\\r/g, '')\n .replace(/[ \\t]+\\n/g, '\\n')\n .trim();\n}\n\nfunction indentOf(line: string): number {\n return line.match(/^ */)?.[0].length ?? 0;\n}\n\nfunction unquote(value: string): string {\n if (\n (value.startsWith(\"'\") && value.endsWith(\"'\")) ||\n (value.startsWith('\"') && value.endsWith('\"'))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import type { Tool, ToolResult } from '../types.js';\nimport { searchRobloxApi } from '../../docs/roblox-api.js';\n\nexport const tool: Tool = {\n name: 'search_roblox_api',\n description:\n 'Search Roblox Creator Docs engine API reference names. Use this when you are unsure of an exact class, enum, datatype, global, or library name.',\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Name fragment to search, e.g. \"Text\", \"Run\", \"UDim\", \"FrameStyle\"',\n },\n kind: {\n type: 'string',\n description: 'Optional reference kind filter.',\n enum: ['any', 'class', 'datatype', 'enum', 'global', 'library'],\n default: 'any',\n },\n limit: {\n type: 'number',\n description: 'Maximum results to return (default: 10, max: 50)',\n default: 10,\n },\n },\n required: ['query'],\n },\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n try {\n const results = await searchRobloxApi(String(params.query ?? ''), {\n kind: (params.kind as 'any') ?? 'any',\n limit: (params.limit as number) ?? 10,\n });\n return { success: true, data: { results } };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n","import type { Tool, ToolResult } from '../types.js';\nimport { getRobloxApiReference } from '../../docs/roblox-api.js';\n\nexport const tool: Tool = {\n name: 'get_roblox_api_reference',\n description:\n 'Look up Roblox Creator Docs engine API reference for a class, datatype, enum, global, or library. ' +\n 'Works without Studio connected and includes summaries, descriptions, tags, members, parameters, returns, security, and thread safety.',\n parameters: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'API reference name, e.g. \"Frame\", \"RunService\", \"UDim2\", \"FrameStyle\", \"task\"',\n },\n kind: {\n type: 'string',\n description: 'Optional reference kind. Use \"any\" to search all reference kinds.',\n enum: ['any', 'class', 'datatype', 'enum', 'global', 'library'],\n default: 'any',\n },\n includeInherited: {\n type: 'boolean',\n description: 'For classes, include members from inherited base classes (default: true).',\n default: true,\n },\n },\n required: ['name'],\n },\n\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\n try {\n const reference = await getRobloxApiReference(String(params.name ?? ''), {\n kind: (params.kind as 'any') ?? 'any',\n includeInherited: params.includeInherited !== false,\n });\n return { success: true, data: reference };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n","import type { Tool, ToolResult } from '../types.js';\r\nimport { recallFacts, getProjectSummaries } from '../../memory/store.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'recall_memory',\r\n description:\r\n 'Search your memory for previously learned facts about the current project. Use this to recall architecture decisions, patterns, known bugs, or user preferences.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n query: {\r\n type: 'string',\r\n description: 'What to search for in memory (e.g., \"player data storage\", \"combat system architecture\")',\r\n },\r\n limit: {\r\n type: 'number',\r\n description: 'Max number of facts to return (default: 10)',\r\n default: 10,\r\n },\r\n },\r\n required: ['query'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\r\n const query = params.query as string;\r\n const limit = (params.limit as number) ?? 10;\r\n const projectId = 'current';\r\n\r\n const facts = recallFacts(projectId, query, limit);\r\n const summaries = getProjectSummaries(projectId, 5);\r\n\r\n return {\r\n success: true,\r\n data: {\r\n facts: facts.map((f) => ({ content: f.content, category: f.category })),\r\n recentSessions: summaries.map((s) => s.summary),\r\n },\r\n };\r\n },\r\n};\r\n","import type { Tool, ToolResult } from '../types.js';\r\nimport { storeFact } from '../../memory/store.js';\r\nimport type { FactCategory } from '../../memory/types.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'remember',\r\n description:\r\n 'Store a fact about the current project in persistent memory. Use this to remember architecture decisions, patterns, bugs found, or user preferences so you can recall them in future sessions.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n fact: {\r\n type: 'string',\r\n description: 'The fact to remember (e.g., \"PlayerData DataStore uses key format Player_{UserId}\")',\r\n },\r\n category: {\r\n type: 'string',\r\n description: 'Category of the fact',\r\n enum: ['architecture', 'pattern', 'preference', 'bug', 'api', 'general'],\r\n },\r\n },\r\n required: ['fact', 'category'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>): Promise<ToolResult> {\r\n const fact = params.fact as string;\r\n const category = (params.category as FactCategory) ?? 'general';\r\n const now = Date.now();\r\n\r\n storeFact({\r\n projectId: 'current',\r\n content: fact,\r\n category,\r\n source: 'agent',\r\n relevance: 1.0,\r\n createdAt: now,\r\n accessedAt: now,\r\n });\r\n\r\n return { success: true, data: { stored: fact, category } };\r\n },\r\n};\r\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport type { Tool, ToolContext, ToolResult } from '../types.js';\r\n\r\nexport const tool: Tool = {\r\n name: 'upload_asset',\r\n description:\r\n 'Upload a local file (image, model, audio) to Roblox via the Open Cloud API. Requires an Open Cloud API key configured in dominus.',\r\n parameters: {\r\n type: 'object',\r\n properties: {\r\n filePath: {\r\n type: 'string',\r\n description: 'Local file path of the asset to upload',\r\n },\r\n assetType: {\r\n type: 'string',\r\n description: 'Type of asset',\r\n enum: ['Image', 'Audio', 'Model'],\r\n },\r\n name: {\r\n type: 'string',\r\n description: 'Display name for the asset on Roblox',\r\n },\r\n description: {\r\n type: 'string',\r\n description: 'Description of the asset',\r\n },\r\n },\r\n required: ['filePath', 'assetType', 'name'],\r\n },\r\n\r\n async execute(params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n const apiKey = ctx.config.get<string>('openCloudApiKey');\r\n if (!apiKey) {\r\n return {\r\n success: false,\r\n error: 'Open Cloud API key not configured. Run: dominus config set openCloudApiKey <key>',\r\n };\r\n }\r\n\r\n const filePath = params.filePath as string;\r\n const assetType = params.assetType as string;\r\n const name = params.name as string;\r\n const description = (params.description as string) ?? '';\r\n\r\n if (!fs.existsSync(filePath)) {\r\n return { success: false, error: `File not found: ${filePath}` };\r\n }\r\n\r\n const fileBuffer = fs.readFileSync(filePath);\r\n const fileName = path.basename(filePath);\r\n\r\n const typeMapping: Record<string, string> = {\r\n Image: 'Decal',\r\n Audio: 'Audio',\r\n Model: 'Model',\r\n };\r\n\r\n try {\r\n const formData = new FormData();\r\n const blob = new Blob([fileBuffer]);\r\n formData.append('fileContent', blob, fileName);\r\n formData.append(\r\n 'request',\r\n JSON.stringify({\r\n assetType: typeMapping[assetType] ?? assetType,\r\n displayName: name,\r\n description,\r\n creationContext: { creator: { userId: 'me' } },\r\n }),\r\n );\r\n\r\n const response = await fetch(\r\n 'https://apis.roblox.com/assets/v1/assets',\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'x-api-key': apiKey,\r\n },\r\n body: formData,\r\n },\r\n );\r\n\r\n if (!response.ok) {\r\n const text = await response.text();\r\n return { success: false, error: `Upload failed (${response.status}): ${text}` };\r\n }\r\n\r\n const data = await response.json();\r\n return {\r\n success: true,\r\n data: {\r\n assetId: data.assetId ?? data.id,\r\n operationId: data.operationId ?? data.path,\r\n name,\r\n type: assetType,\r\n },\r\n };\r\n } catch (err) {\r\n return {\r\n success: false,\r\n error: `Upload error: ${err instanceof Error ? err.message : String(err)}`,\r\n };\r\n }\r\n },\r\n};\r\n","import type { Tool, ToolContext, ToolResult } from '../types.js';\r\nimport { CliMsg } from '../../transport/protocol.js';\r\n\r\nexport const undoTool: Tool = {\r\n name: 'undo',\r\n description:\r\n 'Undo the last action in Roblox Studio using ChangeHistoryService. ' +\r\n 'Works just like Ctrl+Z. Use this to roll back mistakes.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n error?: string;\r\n }>(CliMsg.UNDO, {});\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Undo failed' };\r\n }\r\n\r\n return { success: true, data: 'Undo performed' };\r\n },\r\n};\r\n\r\nexport const redoTool: Tool = {\r\n name: 'redo',\r\n description:\r\n 'Redo the last undone action in Roblox Studio using ChangeHistoryService. ' +\r\n 'Works just like Ctrl+Y.',\r\n parameters: {\r\n type: 'object',\r\n properties: {},\r\n },\r\n\r\n async execute(_params: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\r\n if (!ctx.isStudioConnected()) {\r\n return { success: false, error: 'Studio is not connected' };\r\n }\r\n\r\n const response = await ctx.sendToStudio<{\r\n success: boolean;\r\n error?: string;\r\n }>(CliMsg.REDO, {});\r\n\r\n const payload = response.payload;\r\n if (!payload.success) {\r\n return { success: false, error: payload.error ?? 'Redo failed' };\r\n }\r\n\r\n return { success: true, data: 'Redo performed' };\r\n },\r\n};\r\n","import type { Tool, ToolCall, ToolResult, ToolContext } from './types.js';\r\n\r\nexport class ToolRegistry {\n private tools = new Map<string, Tool>();\n private readyTasks: Promise<unknown>[] = [];\n\r\n register(tool: Tool): void {\r\n if (this.tools.has(tool.name)) {\r\n throw new Error(`Tool already registered: ${tool.name}`);\r\n }\r\n this.tools.set(tool.name, tool);\r\n }\r\n\r\n get(name: string): Tool | undefined {\r\n return this.tools.get(name);\r\n }\r\n\r\n getAll(): Tool[] {\r\n return Array.from(this.tools.values());\r\n }\r\n\r\n getSchemas(): Tool[] {\r\n return this.getAll();\r\n }\r\n\r\n async execute(call: ToolCall, ctx: ToolContext): Promise<ToolResult> {\r\n const tool = this.tools.get(call.name);\r\n if (!tool) {\r\n return { success: false, error: `Unknown tool: ${call.name}` };\r\n }\r\n\r\n try {\r\n return await tool.execute(call.arguments, ctx);\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : String(err);\r\n return { success: false, error: message };\r\n }\r\n }\r\n\r\n listNames(): string[] {\n return Array.from(this.tools.keys());\n }\n\n addReadyTask(task: Promise<unknown>): void {\n this.readyTasks.push(task);\n }\n\n async ready(): Promise<void> {\n await Promise.all(this.readyTasks);\n }\n}\n\r\nexport function createDefaultRegistry(): ToolRegistry {\r\n const registry = new ToolRegistry();\r\n\r\n // Dynamic imports to avoid circular deps\r\n const toolModules = [\r\n import('./studio/read-script.js'),\r\n import('./studio/edit-script.js'),\r\n import('./studio/run-code.js'),\r\n import('./studio/get-explorer.js'),\r\n import('./studio/get-properties.js'),\r\n import('./studio/get-descendants-properties.js'),\r\n import('./studio/set-properties.js'),\r\n import('./studio/insert-instance.js'),\r\n import('./studio/delete-instance.js'),\r\n import('./studio/get-output.js'),\r\n import('./studio/get-selection.js'),\r\n import('./studio/search-scripts.js'),\r\n import('./studio/run-tests.js'),\r\n import('./studio/get-class-info.js'),\r\n import('./studio/create-ui.js'),\r\n import('./studio/execute-run-test.js'),\r\n import('./studio/execute-play-test.js'),\r\n import('./studio/create-part.js'),\r\n import('./studio/clone-instance.js'),\r\n import('./studio/group-instances.js'),\r\n import('./studio/build-multiple.js'),\r\n import('./studio/serialize-ui.js'),\r\n import('./studio/move-instance.js'),\r\n import('./studio/bulk-set-properties.js'),\r\n import('./studio/find-replace-scripts.js'),\n import('./docs/search-roblox-api.js'),\n import('./docs/get-roblox-api-reference.js'),\n import('./memory/recall.js'),\n import('./memory/remember.js'),\r\n import('./cloud/upload-asset.js'),\r\n ];\r\n\r\n // Register all tools asynchronously, return immediately\r\n // Tools will be available by the time the agent loop starts\r\n registry.addReadyTask(Promise.all(\n toolModules.map(async (mod) => {\n const m = await mod;\n if (m.tool) registry.register(m.tool);\n }),\n ));\n\n // Register undo/redo (dual-export module)\n registry.addReadyTask(import('./studio/undo-redo.js').then((m) => {\n registry.register(m.undoTool);\n registry.register(m.redoTool);\n }));\n\n return registry;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { z } from 'zod';\r\nimport { DominusServer, type StudioBridge } from '../transport/ws-server.js';\r\nimport { DominusClient, isPortInUse } from '../transport/ws-client.js';\r\nimport { CliMsg, type ExplorerNode, type ScriptContentPayload, type RunCodeResponsePayload, type SearchResultPayload, type OutputPayload, type SelectionPayload, type PropertyEntry, type TestResultPayload, type StudioTestResultPayload } from '../transport/protocol.js';\nimport { initMemoryStore, recallFacts, storeFact, getScriptIndex } from '../memory/store.js';\nimport { createConfigAccess, loadConfig } from '../config/config.js';\nimport { INTERNAL_MEMORY } from '../agent/internal-memory.js';\nimport { getRobloxApiReference, searchRobloxApi } from '../docs/roblox-api.js';\nimport { AIProvider } from '../ai/provider.js';\nimport { MultiAgentCoordinator } from '../agent/multi-agent/coordinator.js';\nimport { createDefaultRegistry } from '../tools/registry.js';\nimport type { ToolContext } from '../tools/types.js';\n\r\nlet bridge: StudioBridge;\r\n\r\nexport async function startMcpServer(): Promise<void> {\r\n const config = loadConfig();\r\n await initMemoryStore();\r\n\r\n const portTaken = await isPortInUse(config.port);\r\n if (portTaken) {\r\n const client = new DominusClient(config.port);\r\n await client.connect();\r\n bridge = client;\r\n } else {\r\n const server = new DominusServer(config.port);\r\n await server.start();\r\n bridge = server;\r\n }\r\n\r\n const mcp = new McpServer({\r\n name: 'dominus',\r\n version: '2.0.0',\n }, {\r\n instructions: INTERNAL_MEMORY,\r\n });\r\n\r\n // --- Helpers: safe Lua string generation ---\r\n /** Escape a string for safe embedding in Lua code */\r\n function luaStr(s: string): string {\r\n return `\"${s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r')}\"`;\r\n }\r\n /** Convert a dot-path like \"Workspace.Folder.Part\" to game[\"Workspace\"][\"Folder\"][\"Part\"] */\r\n function resolvePath(dotPath: string): string {\r\n const parts = dotPath.split('.');\r\n let r = 'game';\r\n for (const p of parts) r += `[${luaStr(p)}]`;\r\n return r;\r\n }\r\n\r\n // --- Code Generation Helpers ---\r\n\r\n /** Round a number to 3 decimal places, drop trailing zeros. Integers stay as-is. */\r\n function cleanNum(n: number): string {\r\n if (Number.isInteger(n)) return String(n);\r\n // Round to 3 decimals, strip trailing zeros\r\n const rounded = Math.round(n * 1000) / 1000;\r\n return String(rounded);\r\n }\r\n\r\n /** Convert a serialized UI tree node into a Roact/React createElement call */\r\n function generateComponentCode(\r\n tree: Record<string, unknown>,\r\n componentName: string,\r\n framework: string,\r\n ): string {\r\n const isReact = framework === 'react';\r\n const lib = isReact ? 'React' : 'Roact';\r\n\r\n const lines: string[] = [];\r\n lines.push(`local ${lib} = require(game.ReplicatedStorage.Packages.${isReact ? 'React' : 'Roact'})`);\r\n if (isReact) {\r\n lines.push(`local e = React.createElement`);\r\n } else {\r\n lines.push(`local e = Roact.createElement`);\r\n }\r\n lines.push('');\r\n\r\n // Collect all ClassName types used so we can note them\r\n lines.push(`local function ${componentName}()`);\r\n lines.push(`\\treturn ${renderNode(tree, 1)}`);\r\n lines.push('end');\r\n lines.push('');\r\n lines.push(`return ${componentName}`);\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n function renderNode(node: Record<string, unknown>, depth: number): string {\r\n const indent = '\\t'.repeat(depth);\r\n const indent2 = '\\t'.repeat(depth + 1);\r\n const className = (node.ClassName as string) || 'Frame';\r\n const children = (node.Children as Record<string, unknown>[]) || [];\r\n const name = node.Name as string | undefined;\r\n\r\n // Build props table\r\n const props: string[] = [];\r\n const skipKeys = new Set(['ClassName', 'Name', 'Children', 'className', 'name', 'children']);\r\n for (const [key, val] of Object.entries(node)) {\r\n if (skipKeys.has(key)) continue;\r\n props.push(`${indent2}${key} = ${luaValue(val, depth + 1)},`);\r\n }\r\n\r\n // Build children table\r\n const childEntries: string[] = [];\r\n for (const child of children) {\r\n const childName = (child.Name as string) || (child.ClassName as string) || 'Child';\r\n childEntries.push(`${indent2}${childName} = ${renderNode(child, depth + 1)},`);\r\n }\r\n\r\n // Combine\r\n const hasProps = props.length > 0;\r\n const hasChildren = childEntries.length > 0;\r\n\r\n if (!hasProps && !hasChildren) {\r\n return `e(\"${className}\", {})`;\r\n }\r\n\r\n const parts: string[] = [];\r\n parts.push(`e(\"${className}\", {`);\r\n if (hasProps) {\r\n parts.push(...props);\r\n }\r\n if (hasChildren) {\r\n parts.push(`${indent2}}, {`);\r\n parts.push(...childEntries);\r\n parts.push(`${indent}})`);\r\n } else {\r\n parts.push(`${indent}})`);\r\n }\r\n\r\n return parts.join('\\n');\r\n }\r\n\r\n function luaValue(val: unknown, _depth: number): string {\r\n if (val === null || val === undefined) return 'nil';\r\n if (typeof val === 'boolean') return String(val);\r\n if (typeof val === 'number') return cleanNum(val);\r\n if (typeof val === 'string') {\r\n // Detect special Roblox types from serialize_ui output\r\n if (val.startsWith('#') && val.length === 7) {\r\n return `Color3.fromHex(\"${val}\")`;\r\n }\r\n // Enum-like strings (single word, PascalCase)\r\n if (/^[A-Z][a-zA-Z]+$/.test(val)) {\r\n return `\"${val}\"`; // keep as string, Roact handles enum coercion\r\n }\r\n return `\"${val.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')}\"`;\r\n }\r\n if (Array.isArray(val)) {\r\n // UDim2: [xS, xO, yS, yO]\r\n if (val.length === 4 && val.every(v => typeof v === 'number')) {\r\n return `UDim2.new(${val.map(cleanNum).join(', ')})`;\r\n }\r\n // Vector2 / UDim: [x, y]\r\n if (val.length === 2 && val.every(v => typeof v === 'number')) {\r\n return `Vector2.new(${val.map(cleanNum).join(', ')})`;\r\n }\r\n // Color3: [r, g, b]\r\n if (val.length === 3 && val.every(v => typeof v === 'number')) {\r\n const allSmall = val.every(v => (v as number) <= 1);\r\n if (allSmall) return `Color3.new(${val.map(cleanNum).join(', ')})`;\r\n return `Color3.fromRGB(${val.map(v => String(Math.round(v as number))).join(', ')})`;\r\n }\r\n return `{${val.map(v => luaValue(v, _depth)).join(', ')}}`;\r\n }\r\n if (typeof val === 'object') {\r\n const entries = Object.entries(val as Record<string, unknown>);\r\n if (entries.length === 0) return '{}';\r\n return `{\\n${entries.map(([k, v]) => `${'\\t'.repeat(_depth + 1)}${k} = ${luaValue(v, _depth + 1)}`).join(',\\n')}\\n${'\\t'.repeat(_depth)}}`;\r\n }\r\n return String(val);\r\n }\r\n\r\n // --- Studio Tools ---\r\n\r\n mcp.tool(\r\n 'read_script',\r\n 'Read the source code of a script in Roblox Studio',\r\n { path: z.string().describe('Full instance path, e.g. \"ServerScriptService.GameManager\"') },\r\n async ({ path }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<ScriptContentPayload>(CliMsg.GET_SCRIPT, { path });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'edit_script',\r\n 'Replace the entire source code of a script in Roblox Studio',\r\n {\r\n path: z.string().describe('Full instance path'),\r\n source: z.string().describe('New complete source code'),\r\n },\r\n async ({ path, source }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.SET_SCRIPT, { path, source });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'run_code',\r\n 'Execute arbitrary Luau code in Roblox Studio. LAST RESORT — only use when no dedicated tool exists. ' +\r\n 'Do NOT use for: reading properties (use get_properties/inspect_selection/serialize_ui), creating instances (use create_part/create_ui/insert_instance/build_multiple), ' +\r\n 'modifying properties (use set_properties/bulk_set_properties), or inspecting the tree (use get_explorer). ' +\r\n 'Valid uses: complex procedural generation, terrain algorithms, raycasting, physics queries, custom logic with no tool equivalent.',\r\n { code: z.string().describe('Luau code to execute') },\r\n async ({ code }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_explorer',\r\n 'Get the DataModel explorer tree from Roblox Studio',\r\n {\r\n rootPath: z.string().optional().describe('Root path to start from. Omit for entire tree.'),\r\n maxDepth: z.number().optional().default(3).describe('Maximum tree depth'),\r\n },\r\n async ({ rootPath, maxDepth }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ tree: ExplorerNode[] }>(CliMsg.GET_EXPLORER, {\r\n rootPath: rootPath ?? null,\r\n maxDepth,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_properties',\r\n 'Get all properties of a single instance in Roblox Studio. Returns property name, value, type, and category. For inspecting UI trees, prefer serialize_ui (structured tree) or get_descendants_properties (flat list with compact filtering).',\r\n {\r\n path: z.string().describe('Full instance path (e.g. \"Workspace.Part\", \"StarterGui.MyUI.Frame\")'),\r\n compact: z.boolean().optional().default(true).describe('Strip read-only, nil, deprecated, and default-valued properties (default true). Set false for full dump.'),\r\n },\r\n async ({ path, compact }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ properties: PropertyEntry[] }>(CliMsg.GET_PROPERTIES, { path, compact });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_descendants_properties',\r\n 'Easily get all descendants of a UI instance (or any instance) and all of their properties. By default uses compact mode which strips read-only, nil, deprecated, and default-valued properties to keep responses small.',\r\n { \r\n path: z.string().describe('Full instance path (e.g., \"Workspace.Part\", \"StarterGui.ScreenGui\")'),\r\n compact: z.boolean().optional().default(true).describe('Strip noisy/default properties (default true). Set false for full dump.'),\r\n outputFile: z.string().optional().describe('Optional file path to write to prevent limit errors/timeouts'),\r\n },\r\n async ({ path, compact, outputFile }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<unknown>(CliMsg.GET_DESCENDANTS_PROPERTIES, { path, compact, outputFile }, 1000 * 60 * 5);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'set_properties',\r\n 'Set properties on an instance in Roblox Studio',\r\n {\r\n path: z.string().describe('Full instance path'),\r\n properties: z.record(z.unknown()).describe('Key-value pairs of properties to set'),\r\n },\r\n async ({ path, properties }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.SET_PROPERTIES, { path, properties });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'insert_instance',\r\n 'Create a new instance in the Roblox Studio DataModel',\r\n {\r\n className: z.string().describe('Class name (e.g. \"Part\", \"Script\")'),\r\n parentPath: z.string().describe('Parent instance path'),\r\n name: z.string().describe('Name for the new instance'),\r\n properties: z.record(z.unknown()).optional().describe('Optional properties to set'),\r\n },\r\n async ({ className, parentPath, name, properties }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.INSERT_INSTANCE, {\r\n className, parentPath, name, properties: properties ?? {},\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'delete_instance',\r\n 'Delete an instance from the Roblox Studio DataModel',\r\n { path: z.string().describe('Full instance path to delete') },\r\n async ({ path }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest(CliMsg.DELETE_INSTANCE, { path });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_selection',\r\n 'Get the currently selected instances in Roblox Studio. Returns paths and class names of all selected objects. ' +\r\n 'Use this FIRST when the user says \"my selection\" or \"what I have selected\". ' +\r\n 'Then use get_properties or serialize_ui on the returned paths to inspect details.',\r\n {},\r\n async () => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'search_scripts',\r\n 'Search all scripts in Roblox Studio for a text pattern',\r\n {\r\n query: z.string().describe('Text to search for'),\r\n maxResults: z.number().optional().default(20).describe('Max results'),\r\n },\r\n async ({ query, maxResults }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<SearchResultPayload>(CliMsg.SEARCH_SCRIPTS, { query, maxResults });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'get_output',\r\n 'Get recent output log from Roblox Studio',\r\n {\r\n limit: z.number().optional().default(50).describe('Max entries'),\r\n level: z.enum(['info', 'warn', 'error']).optional().describe('Filter by level'),\r\n },\r\n async ({ limit, level }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ entries: OutputPayload[] }>(CliMsg.GET_OUTPUT, {\r\n limit, level: level ?? null,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\n 'get_class_info',\n 'Look up the schema of any Roblox class using ReflectionService. Returns all properties (with types), methods (with parameters), and events. ' +\n 'ALWAYS use this before creating or modifying GUI elements to know correct property names and types.',\n { className: z.string().describe('Roblox class name, e.g. \"Frame\", \"TextLabel\", \"Part\", \"MeshPart\"') },\r\n async ({ className }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<unknown>(CliMsg.GET_REFLECTION, { className });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\n );\n\n mcp.tool(\n 'search_roblox_api',\n 'Search Roblox Creator Docs engine API reference names. Use when you are unsure of the exact class, enum, datatype, global, or library name. Works without Studio connected.',\n {\n query: z.string().describe('Name fragment to search, e.g. \"Text\", \"Run\", \"UDim\", \"FrameStyle\"'),\n kind: z.enum(['any', 'class', 'datatype', 'enum', 'global', 'library']).optional().default('any'),\n limit: z.number().optional().default(10).describe('Maximum results to return'),\n },\n async ({ query, kind, limit }) => {\n const results = await searchRobloxApi(query, { kind, limit });\n return { content: [{ type: 'text' as const, text: JSON.stringify({ results }, null, 2) }] };\n },\n );\n\n mcp.tool(\n 'get_roblox_api_reference',\n 'Look up Roblox Creator Docs engine API reference for a class, datatype, enum, global, or library. Includes summaries, descriptions, members, parameters, returns, security, and thread safety. Works without Studio connected.',\n {\n name: z.string().describe('API reference name, e.g. \"Frame\", \"RunService\", \"UDim2\", \"FrameStyle\", \"task\"'),\n kind: z.enum(['any', 'class', 'datatype', 'enum', 'global', 'library']).optional().default('any'),\n includeInherited: z.boolean().optional().default(true).describe('For classes, include members from inherited base classes'),\n },\n async ({ name, kind, includeInherited }) => {\n const reference = await getRobloxApiReference(name, { kind, includeInherited });\n return { content: [{ type: 'text' as const, text: JSON.stringify(reference, null, 2) }] };\n },\n );\n\n mcp.tool(\n 'run_parallel_task',\n 'Split a broad task into coordinated read-only worker agents. Workers inspect and propose scoped changes; the coordinator validates proposals and applies safe serial writes.',\n {\n goal: z.string().describe('The task to coordinate across sub-agents'),\n rootPath: z.string().optional().describe('Optional root instance path to partition work under, e.g. StarterGui.HUD'),\n maxWorkers: z.number().optional().default(3).describe('Number of workers to use, max 5'),\n constraints: z.string().optional().describe('Extra constraints workers and coordinator must follow'),\n taskType: z.string().optional().describe('Optional task type hint such as ui, script, build, refactor, or general'),\n },\n async ({ goal, rootPath, maxWorkers, constraints, taskType }) => {\n const registry = createDefaultRegistry();\n await registry.ready();\n const ai = new AIProvider(loadConfig());\n const coordinator = new MultiAgentCoordinator(ai, registry.getAll());\n const events: unknown[] = [];\n const result = await coordinator.execute(\n { goal, rootPath, maxWorkers, constraints, taskType },\n createMcpToolContext(),\n (event) => events.push(event),\n );\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({ ...result, events }, null, 2),\n }],\n };\n },\n );\n\n mcp.tool(\n 'create_ui',\r\n 'Create an entire UI tree in one call. Pass a declarative JSON tree — ClassName, Name, properties, Children. ' +\r\n 'All types auto-coerced in Luau (UDim2, Color3, Font, enums). 10x faster than run_code. ' +\r\n 'UDim2: [xScale, xOffset, yScale, yOffset]. Color3: \"#hex\" or \"rgb(r,g,b)\". Font: \"GothamBold\". Enums: string names.',\r\n {\r\n parent: z.string().optional().describe('Parent: \"StarterGui\", \"PlayerGui\", or path. Default: StarterGui'),\r\n tree: z.record(z.unknown()).describe(\r\n 'Root UI node: {ClassName, Name, properties..., Children: [{...}, ...]}. ' +\r\n 'UDim2 as [xScale, xOffset, yScale, yOffset], Color3 as \"#hex\", Font as \"GothamBold\"',\r\n ),\r\n animate: z.boolean().optional().describe('If true, task.wait() will be injected between creation of nodes so that the UI writes out dynamically.'),\r\n },\r\n async ({ parent, tree, animate }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ success: boolean; path?: string; instanceCount?: number; error?: string }>(\r\n CliMsg.BUILD_UI, { parent: parent ?? 'StarterGui', tree, animate },\r\n );\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'run_tests',\r\n 'Run tests by requiring ModuleScripts matching test naming conventions (*.test, *.spec, *Test, *Spec). Lightweight — does not enter Run/Play mode.',\r\n { testName: z.string().optional().describe('Specific test name, or omit to run all') },\r\n async ({ testName }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ results: TestResultPayload[] }>(CliMsg.RUN_TESTS, {\r\n testName: testName ?? null,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'execute_run_test',\r\n 'Start a Run mode test session using StudioTestService:ExecuteRunModeAsync(). ' +\r\n 'This actually enters Run mode in Studio. Pass args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until EndTest() is called or the session stops. Returns the value from EndTest(). ' +\r\n 'Use for headless automated tests — no player, just server scripts.',\r\n { args: z.unknown().optional().describe('Arguments passed to the test session. Server scripts get this via StudioTestService:GetTestArgs()') },\r\n async ({ args }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<StudioTestResultPayload>(CliMsg.EXECUTE_RUN_TEST, { args: args ?? null }, 120_000);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'execute_play_test',\r\n 'Start a solo Play mode test session using StudioTestService:ExecutePlayModeAsync(). ' +\r\n 'This enters Play mode with a player character. Pass args that server scripts can retrieve via GetTestArgs(). ' +\r\n 'Yields until EndTest() is called or the session stops. Returns the value from EndTest(). ' +\r\n 'Use for tests needing a player character and full client-server simulation.',\r\n { args: z.unknown().optional().describe('Arguments passed to the test session. Server scripts get this via StudioTestService:GetTestArgs()') },\r\n async ({ args }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<StudioTestResultPayload>(CliMsg.EXECUTE_PLAY_TEST, { args: args ?? null }, 120_000);\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- Builder Tools ---\r\n\r\n mcp.tool(\r\n 'create_part',\r\n 'Create a Part with position, size, color, material — all in one call. Faster than insert_instance + set_properties.',\r\n {\r\n name: z.string().describe('Name for the part'),\r\n parent: z.string().optional().describe('Parent path (default: Workspace)'),\r\n shape: z.enum(['Block', 'Ball', 'Cylinder', 'Wedge', 'CornerWedge']).optional().describe('Part shape'),\r\n position: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('World position'),\r\n size: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('Size in studs'),\r\n color: z.string().optional().describe('Hex \"#00FF00\", BrickColor name, or \"rgb(0,255,0)\"'),\r\n material: z.string().optional().describe('Plastic, Wood, Grass, Neon, Metal, etc.'),\r\n transparency: z.number().optional().describe('0=opaque, 1=invisible'),\r\n anchored: z.boolean().optional().describe('Anchored (default: true)'),\r\n canCollide: z.boolean().optional().describe('Has collision'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const properties: Record<string, unknown> = {};\r\n if (params.position) properties.Position = { X: params.position.x, Y: params.position.y, Z: params.position.z };\r\n if (params.size) properties.Size = { X: params.size.x, Y: params.size.y, Z: params.size.z };\r\n if (params.color) {\r\n const c = params.color;\r\n if (c.startsWith('#')) properties.Color = c;\r\n else if (c.startsWith('rgb')) {\r\n const m = c.match(/(\\d+)/g);\r\n if (m && m.length >= 3) properties.Color = { red: parseInt(m[0]), green: parseInt(m[1]), blue: parseInt(m[2]) };\r\n } else properties.BrickColor = c;\r\n }\r\n if (params.material) properties.Material = params.material;\r\n if (params.transparency !== undefined) properties.Transparency = params.transparency;\r\n if (params.anchored !== undefined) properties.Anchored = params.anchored;\r\n else properties.Anchored = true;\r\n if (params.canCollide !== undefined) properties.CanCollide = params.canCollide;\r\n if (params.shape && params.shape !== 'Block') properties.Shape = params.shape;\r\n\r\n const className = params.shape === 'Wedge' ? 'WedgePart' : params.shape === 'CornerWedge' ? 'CornerWedgePart' : 'Part';\r\n\r\n const res = await bridge.sendRequest<{ success: boolean; path?: string; error?: string }>(CliMsg.INSERT_INSTANCE, {\r\n className,\r\n parentPath: params.parent ?? 'Workspace',\r\n name: params.name,\r\n properties,\r\n });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'clone_instance',\r\n 'Clone an existing instance, optionally rename it, move it, or offset its position',\r\n {\r\n path: z.string().describe('Path of instance to clone'),\r\n newName: z.string().optional().describe('Name for the clone'),\r\n newParent: z.string().optional().describe('Parent path for the clone'),\r\n offset: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional().describe('Position offset from original'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const lines = [`local orig = ${resolvePath(params.path)}`, `local clone = orig:Clone()`];\r\n if (params.newName) lines.push(`clone.Name = ${luaStr(params.newName)}`);\r\n if (params.newParent) {\r\n lines.push(`clone.Parent = ${resolvePath(params.newParent)}`);\r\n } else {\r\n lines.push(`clone.Parent = orig.Parent`);\r\n }\r\n if (params.offset) {\r\n lines.push(`if clone:IsA(\"BasePart\") then`);\r\n lines.push(` clone.Position = clone.Position + Vector3.new(${params.offset.x}, ${params.offset.y}, ${params.offset.z})`);\r\n lines.push(`end`);\r\n }\r\n lines.push(`print(\"Cloned: \" .. clone:GetFullName())`);\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code: lines.join('\\n') });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'group_instances',\r\n 'Group multiple instances into a Model or Folder. All listed instances become children of the new group.',\r\n {\r\n paths: z.array(z.string()).describe('Array of instance paths to group'),\r\n groupName: z.string().describe('Name for the group'),\r\n groupClass: z.enum(['Model', 'Folder']).optional().describe('Container class (default: Model)'),\r\n parent: z.string().optional().describe('Parent path (default: Workspace)'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const gc = params.groupClass ?? 'Model';\r\n const parent = params.parent ?? 'Workspace';\r\n\r\n const code = [\r\n `local group = Instance.new(${luaStr(gc)})`,\r\n `group.Name = ${luaStr(params.groupName)}`,\r\n `group.Parent = ${resolvePath(parent)}`,\r\n ...params.paths.map((p) => `${resolvePath(p)}.Parent = group`),\r\n `print(\"Grouped ${params.paths.length} instances into: \" .. group:GetFullName())`,\r\n ].join('\\n');\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'build_multiple',\r\n 'Create many parts/instances in one batch. Send an array of specs — all created in a single round-trip. Ideal for building trees, houses, vehicles. Supports hex colors, rgb() colors, and BrickColor names.',\r\n {\r\n parts: z.array(z.object({\r\n name: z.string(),\r\n className: z.string().optional(),\r\n parent: z.string().optional(),\r\n position: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional(),\r\n size: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional(),\r\n color: z.string().optional().describe('Hex \"#RRGGBB\", \"rgb(r,g,b)\", or BrickColor name'),\r\n material: z.string().optional().describe('Enum.Material name: Plastic, Wood, Neon, Glass, etc.'),\r\n transparency: z.number().optional(),\r\n anchored: z.boolean().optional(),\r\n canCollide: z.boolean().optional(),\r\n shape: z.enum(['Block', 'Ball', 'Cylinder', 'Wedge']).optional(),\r\n })).describe('Array of part specifications'),\r\n groupName: z.string().optional().describe('Group all parts into a Model with this name'),\r\n groupParent: z.string().optional().describe('Parent for the group (default: Workspace)'),\r\n },\r\n async (params) => {\r\n assertConnected();\r\n const parts = params.parts;\r\n const groupName = params.groupName;\r\n const groupParent = params.groupParent ?? 'Workspace';\r\n\r\n const lines: string[] = [];\r\n if (groupName) {\r\n lines.push(`local _group = Instance.new(\"Model\")`);\r\n lines.push(`_group.Name = ${luaStr(groupName)}`);\r\n lines.push(`_group.Parent = ${resolvePath(groupParent)}`);\r\n }\r\n for (let i = 0; i < parts.length; i++) {\r\n const p = parts[i];\r\n const v = `_p${i}`;\r\n const cn = p.className ?? (p.shape === 'Wedge' ? 'WedgePart' : 'Part');\r\n lines.push(`local ${v} = Instance.new(${luaStr(cn)})`);\r\n lines.push(`${v}.Name = ${luaStr(p.name)}`);\r\n if (p.position) lines.push(`${v}.Position = Vector3.new(${p.position.x}, ${p.position.y}, ${p.position.z})`);\r\n if (p.size) lines.push(`${v}.Size = Vector3.new(${p.size.x}, ${p.size.y}, ${p.size.z})`);\r\n if (p.color) {\r\n if (p.color.startsWith('#')) {\r\n lines.push(`${v}.Color = Color3.fromHex(${luaStr(p.color)})`);\r\n } else if (p.color.startsWith('rgb(')) {\r\n const m = p.color.match(/rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/);\r\n if (m) lines.push(`${v}.Color = Color3.fromRGB(${m[1]}, ${m[2]}, ${m[3]})`);\r\n } else {\r\n lines.push(`${v}.BrickColor = BrickColor.new(${luaStr(p.color)})`);\r\n }\r\n }\r\n if (p.material) lines.push(`${v}.Material = Enum.Material.${p.material}`);\r\n if (p.transparency !== undefined) lines.push(`${v}.Transparency = ${p.transparency}`);\r\n lines.push(`${v}.Anchored = ${p.anchored ?? true}`);\r\n if (p.canCollide !== undefined) lines.push(`${v}.CanCollide = ${p.canCollide}`);\r\n if (p.shape && p.shape !== 'Block' && cn === 'Part') lines.push(`${v}.Shape = Enum.PartType.${p.shape}`);\r\n lines.push(`${v}.Parent = ${groupName ? '_group' : resolvePath(p.parent ?? 'Workspace')}`);\r\n }\r\n lines.push(`print(\"Built ${parts.length} parts${groupName ? ` in ${groupName}` : ''}\")`);\r\n\r\n const res = await bridge.sendRequest<RunCodeResponsePayload>(CliMsg.RUN_CODE, { code: lines.join('\\n') });\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- UI Serialization ---\r\n\r\n mcp.tool(\r\n 'serialize_ui',\r\n 'Serialize an existing Roblox UI tree into a compact, create_ui-compatible JSON tree. ' +\r\n 'This is the reverse of create_ui — reads any GUI instance and returns a declarative JSON tree ' +\r\n 'with ClassName, Name, non-default properties (Color3 as hex, UDim2 as arrays, etc.), and Children. ' +\r\n 'Perfect for: converting existing UI to Roact/React components, cloning/templating, understanding UI structure, ' +\r\n 'or refactoring. Use this INSTEAD of get_descendants_properties when you need to recreate or convert UI.',\r\n {\r\n path: z.string().describe('Instance path to serialize (e.g. \"StarterGui.MyScreenGui\")'),\r\n maxDepth: z.number().optional().default(50).describe('Maximum tree depth (default 50)'),\r\n },\r\n async ({ path, maxDepth }) => {\r\n assertConnected();\r\n const res = await bridge.sendRequest<{ success: boolean; tree?: unknown; error?: string }>(\r\n CliMsg.SERIALIZE_UI, { path, maxDepth }, 1000 * 60 * 2,\r\n );\r\n if (!res.payload.success) {\r\n return { content: [{ type: 'text' as const, text: `Error: ${res.payload.error ?? 'Serialization failed'}` }] };\r\n }\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(res.payload.tree, null, 2) }] };\r\n },\r\n );\r\n\r\n // --- Composite Skill Tools ---\r\n // Higher-level tools that combine multiple operations into a single call.\r\n // These prevent LLMs from falling back to run_code for common workflows.\r\n\r\n mcp.tool(\r\n 'inspect_selection',\r\n 'Inspect the user\\'s current selection in Roblox Studio. Returns the selected instance paths AND their properties (compact) in a single call. ' +\r\n 'Use this FIRST when the user says \"my selection\", \"what I selected\", or \"the selected thing\". ' +\r\n 'Much better than calling get_selection + get_properties separately.',\r\n {},\r\n async () => {\r\n assertConnected();\r\n // Step 1: get selection\r\n const selRes = await bridge.sendRequest<SelectionPayload>(CliMsg.GET_SELECTION, {});\r\n const paths: string[] = selRes.payload?.paths ?? [];\r\n if (paths.length === 0) {\r\n return { content: [{ type: 'text' as const, text: 'No instances selected in Studio.' }] };\r\n }\r\n\r\n // Step 2: get compact properties for each selected instance\r\n const results: Record<string, unknown> = {};\r\n for (const p of paths.slice(0, 10)) { // cap at 10 to avoid huge payloads\r\n try {\r\n const propRes = await bridge.sendRequest<{ properties?: PropertyEntry[]; error?: string }>(\r\n CliMsg.GET_PROPERTIES, { path: p, compact: true },\r\n );\r\n results[p] = propRes.payload.properties ?? propRes.payload;\r\n } catch {\r\n results[p] = { error: 'Failed to read properties' };\r\n }\r\n }\r\n if (paths.length > 10) {\r\n results['_truncated'] = `${paths.length - 10} more instances not shown`;\r\n }\r\n\r\n return { content: [{ type: 'text' as const, text: JSON.stringify(results, null, 2) }] };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'inspect_instance',\r\n 'Inspect a single instance: returns its compact properties AND its children tree in one call. ' +\r\n 'Combines get_properties + get_explorer into a single round-trip. ' +\r\n 'Use when you need to understand an instance and its subtree.',\r\n {\r\n path: z.string().describe('Full instance path (e.g. \"Workspace.MyModel\")'),\r\n childDepth: z.number().optional().default(2).describe('How deep to show the children tree (default 2)'),\r\n },\r\n async ({ path, childDepth }) => {\r\n assertConnected();\r\n // Parallel: get properties + get children tree\r\n const [propRes, treeRes] = await Promise.all([\r\n bridge.sendRequest<{ properties?: PropertyEntry[]; error?: string }>(\r\n CliMsg.GET_PROPERTIES, { path, compact: true },\r\n ),\r\n bridge.sendRequest<{ tree?: ExplorerNode; error?: string }>(\r\n CliMsg.GET_EXPLORER, { rootPath: path, maxDepth: childDepth ?? 2 },\r\n ),\r\n ]);\r\n\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({\r\n properties: propRes.payload.properties ?? propRes.payload,\r\n children: treeRes.payload.tree ?? treeRes.payload,\r\n }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'convert_ui_to_code',\r\n 'Convert an existing Roblox UI tree into Roact/React-lua component code. ' +\r\n 'Serializes the UI at the given path, then generates a ready-to-use Luau component. ' +\r\n 'Use when the user asks to \"turn this into a component\", \"convert to React\", or \"make a Roact version\".',\r\n {\r\n path: z.string().describe('Path to the UI instance to convert (e.g. \"StarterGui.MyScreenGui.MainFrame\")'),\r\n framework: z.enum(['roact', 'react']).optional().default('react').describe('Target framework: \"roact\" (legacy) or \"react\" (react-lua, default)'),\r\n componentName: z.string().optional().describe('Name for the generated component (defaults to instance Name)'),\r\n },\r\n async ({ path, framework, componentName }) => {\r\n assertConnected();\r\n // Step 1: serialize the UI tree\r\n const res = await bridge.sendRequest<{ success: boolean; tree?: Record<string, unknown>; error?: string }>(\r\n CliMsg.SERIALIZE_UI, { path, maxDepth: 50 }, 1000 * 60 * 2,\r\n );\r\n if (!res.payload.success || !res.payload.tree) {\r\n return { content: [{ type: 'text' as const, text: `Error serializing UI: ${res.payload.error ?? 'Unknown error'}` }] };\r\n }\r\n\r\n const tree = res.payload.tree;\r\n const name = componentName || (tree.Name as string) || 'GeneratedComponent';\r\n const fw = framework || 'react';\r\n\r\n // Step 2: generate code from the serialized tree\r\n const code = generateComponentCode(tree, name, fw);\r\n return { content: [{ type: 'text' as const, text: code }] };\r\n },\r\n );\r\n\r\n // --- Connection Management Tools ---\r\n\r\n mcp.tool(\r\n 'list_connections',\r\n 'List all Roblox Studio instances currently connected to Dominus. Shows placeId, placeName, and connection time for each. Use this when working with multiple Studio windows.',\r\n {},\r\n async () => {\r\n const connections = bridge.listConnections();\r\n const activePlaceId = bridge.getActivePlaceId();\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({\r\n activePlaceId: activePlaceId || 'auto',\r\n connections: connections.map(c => ({\r\n ...c,\r\n active: activePlaceId === 0 && connections.length === 1 ? true\r\n : c.placeId === activePlaceId,\r\n })),\r\n }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'set_active_place',\r\n 'Set which Roblox Studio instance to target when multiple are connected. Pass placeId=0 to reset to auto mode (works when only one is connected). ' +\r\n 'Call list_connections first to see available placeIds.',\r\n {\r\n placeId: z.number().describe('The placeId to target. Use 0 to reset to auto-select.'),\r\n },\r\n async ({ placeId }) => {\r\n const connections = bridge.listConnections();\r\n if (placeId !== 0 && !connections.some(c => c.placeId === placeId)) {\r\n const available = connections.map(c => `${c.placeName ?? 'Unknown'} (${c.placeId})`).join(', ');\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: `Place ${placeId} is not connected. Available: ${available || 'none'}`,\r\n }],\r\n };\r\n }\r\n try {\n bridge.setActivePlaceId(placeId);\n } catch (err) {\n return {\n content: [{\n type: 'text' as const,\n text: err instanceof Error ? err.message : String(err),\n }],\n };\n }\n if (placeId === 0) {\r\n return { content: [{ type: 'text' as const, text: 'Active place reset to auto-select.' }] };\r\n }\r\n const target = connections.find(c => c.placeId === placeId);\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: `Active place set to ${target?.placeName ?? 'Unknown'} (${placeId})`,\r\n }],\r\n };\r\n },\r\n );\r\n\r\n // --- Memory Tools ---\r\n\r\n mcp.tool(\r\n 'recall_memory',\r\n 'Search persistent memory for facts about the current Roblox project',\r\n { query: z.string().describe('What to search for') },\r\n async ({ query }) => {\r\n const facts = recallFacts('current', query, 15);\r\n const scripts = getScriptIndex('current');\r\n return {\r\n content: [{\r\n type: 'text' as const,\r\n text: JSON.stringify({ facts: facts.map(f => f.content), scriptIndex: scripts }, null, 2),\r\n }],\r\n };\r\n },\r\n );\r\n\r\n mcp.tool(\r\n 'remember',\r\n 'Store a fact about the project in persistent memory for future sessions',\r\n {\r\n fact: z.string().describe('The fact to remember'),\r\n category: z.enum(['architecture', 'pattern', 'preference', 'bug', 'api', 'general']).describe('Category'),\r\n },\r\n async ({ fact, category }) => {\r\n const now = Date.now();\r\n storeFact({ projectId: 'current', content: fact, category, source: 'mcp', relevance: 1.0, createdAt: now, accessedAt: now });\r\n return { content: [{ type: 'text' as const, text: `Remembered: ${fact}` }] };\r\n },\r\n );\r\n\r\n // --- Resources ---\r\n\r\n mcp.resource(\r\n 'studio://status',\r\n 'studio://status',\r\n async () => {\r\n const info = bridge.getConnectionInfo();\r\n return {\r\n contents: [{\r\n uri: 'studio://status',\r\n text: JSON.stringify({\r\n connected: bridge.isConnected(),\r\n placeName: info?.placeName,\r\n placeId: info?.placeId,\r\n studioVersion: info?.studioVersion,\r\n port: bridge.getPort(),\r\n }, null, 2),\r\n mimeType: 'application/json',\r\n }],\r\n };\r\n },\r\n );\r\n\r\n // Start the MCP server on stdio\r\n const transport = new StdioServerTransport();\r\n await mcp.connect(transport);\r\n}\r\n\r\nfunction assertConnected(): void {\n if (!bridge.isConnected()) {\n const connections = bridge.listConnections();\n const activePlaceId = bridge.getActivePlaceId();\n if (connections.length > 1 && activePlaceId === 0) {\n const available = connections.map(c => `${c.placeName ?? 'Unknown'} (${c.placeId})`).join(', ');\n throw new Error(`Multiple Roblox Studio instances are connected: ${available}. Use list_connections and set_active_place before running Studio tools.`);\n }\n if (connections.length > 0 && activePlaceId !== 0) {\n throw new Error(`Active Roblox Studio place ${activePlaceId} is not connected. Use list_connections and set_active_place to choose a connected Studio instance.`);\n }\n throw new Error(\n 'Roblox Studio is not connected. Open Studio and click the Dominus plugin Connect button.',\n );\n }\r\n}\n\nfunction createMcpToolContext(): ToolContext {\n return {\n sendToStudio: <T = unknown>(type: string, payload: unknown, timeoutMs?: number) => {\n return bridge.sendRequest<T>(type, payload, timeoutMs);\n },\n isStudioConnected: () => bridge.isConnected(),\n memory: {\n recall: (query: string, projectId: string, limit?: number) => {\n const facts = recallFacts(projectId || 'current', query, limit);\n return facts.map((fact) => fact.content);\n },\n learn: (projectId: string, facts: { content: string; category: string }[]) => {\n const now = Date.now();\n for (const fact of facts) {\n storeFact({\n projectId: projectId || 'current',\n content: fact.content,\n category: fact.category as any,\n source: 'mcp',\n relevance: 1.0,\n createdAt: now,\n accessedAt: now,\n });\n }\n },\n getScriptIndex: (projectId: string) => getScriptIndex(projectId || 'current'),\n },\n config: createConfigAccess(),\n };\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\n\nconst CROWN_ART = ` ◆ ◆ ◆\n ╔█╗ ╔█╗ ╔█╗\n ║█║ ║█║ ║█║\n ╚█╚═════╝█╚═════╝█╝\n ╚═══════════════╝`;\n\nfunction getGreeting(name: string): string {\n const hour = new Date().getHours();\n if (hour >= 5 && hour < 12) return `Good morning ${name}!`;\n if (hour >= 12 && hour < 17) return `Good afternoon ${name}!`;\n if (hour >= 17 && hour < 21) return `Good evening ${name}!`;\n return `Burning the midnight oil, ${name}!`;\n}\n\ninterface WelcomeProps {\n userName: string;\n version: string;\n model: string;\n provider: string;\n port: number;\n hasApiKey: boolean;\n connected: boolean;\n cwd: string;\n}\n\nexport const Welcome: React.FC<WelcomeProps> = React.memo(({\n userName,\n version,\n model,\n provider,\n port,\n hasApiKey,\n connected,\n cwd,\n}) => {\n const greeting = getGreeting(userName);\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {/* Header */}\n <Box\n borderStyle=\"round\"\n borderColor=\"magenta\"\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text bold color=\"magenta\">\n Dominus v{version}\n </Text>\n <Text dimColor>AI-Powered Roblox Studio Agent</Text>\n </Box>\n\n {/* Main content: two columns */}\n <Box>\n {/* Left column: greeting + mascot */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n width=\"50%\"\n >\n <Text bold color=\"cyan\">\n {greeting}\n </Text>\n <Text> </Text>\n\n {CROWN_ART.split('\\n').map((line, i) => (\n <Text key={i} color=\"yellow\">\n {line}\n </Text>\n ))}\n\n <Text> </Text>\n <Text dimColor>\n {provider} · {model || 'no model set'}\n </Text>\n <Text dimColor>{cwd}</Text>\n </Box>\n\n {/* Right column: tips or setup */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={2}\n paddingY={1}\n width=\"50%\"\n >\n {hasApiKey ? (\n <>\n <Text bold color=\"yellow\">\n Tips for getting started\n </Text>\n <Text>\n Just type a message to chat with the AI agent\n </Text>\n <Text>\n Use <Text color=\"cyan\">/help</Text> to see all commands\n </Text>\n <Text>\n Use <Text color=\"cyan\">/run {'<code>'}</Text> to execute Luau in Studio\n </Text>\n <Text> </Text>\n <Text bold color=\"yellow\">\n Studio connection\n </Text>\n {connected ? (\n <Text color=\"green\">● Connected to Roblox Studio</Text>\n ) : (\n <>\n <Text color=\"red\">○ Waiting for Studio plugin...</Text>\n <Text dimColor>WebSocket server on port {port}</Text>\n <Text dimColor>\n Run <Text color=\"cyan\">dominus install-plugin</Text> if needed\n </Text>\n </>\n )}\n </>\n ) : (\n <>\n <Text bold color=\"yellow\">\n Setup — pick any provider\n </Text>\n <Text> </Text>\n <Text>\n <Text color=\"green\" bold>OpenAI </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">OPENAI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Anthropic </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">ANTHROPIC_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Gemini </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">GEMINI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>Grok (xAI) </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">XAI_API_KEY</Text>\n </Text>\n <Text>\n <Text color=\"green\" bold>OpenRouter </Text>\n <Text dimColor>set </Text>\n <Text color=\"cyan\">OPENROUTER_API_KEY</Text>\n </Text>\n <Text> </Text>\n <Text dimColor>Or configure manually:</Text>\n <Text>\n <Text color=\"cyan\">dominus config set provider openai</Text>\n </Text>\n <Text>\n <Text color=\"cyan\">dominus config set apiKey sk-...</Text>\n </Text>\n </>\n )}\n </Box>\n </Box>\n </Box>\n );\n});\n","import React, { useState } from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport TextInput from 'ink-text-input';\r\nimport { PROVIDERS, type AIProviderType } from '../../config/config.js';\r\n\r\ninterface SetupProps {\r\n onComplete: (provider: AIProviderType, apiKey: string) => void;\r\n}\r\n\r\nconst PROVIDER_OPTIONS: { key: AIProviderType; label: string; hint: string }[] = [\r\n { key: 'openai', label: 'OpenAI', hint: 'GPT-5.3, GPT-5.2, o3-mini' },\r\n { key: 'anthropic', label: 'Anthropic', hint: 'Claude Opus 4-6, Sonnet 4-6' },\r\n { key: 'gemini', label: 'Google Gemini', hint: 'Gemini 3.1 Pro, 2.0 Flash' },\r\n { key: 'xai', label: 'xAI (Grok)', hint: 'Grok 4.2, Grok 3' },\r\n { key: 'openrouter', label: 'OpenRouter', hint: '300+ models, one key' },\r\n];\r\n\r\nexport const Setup: React.FC<SetupProps> = ({ onComplete }) => {\r\n const [step, setStep] = useState<'provider' | 'key'>('provider');\r\n const [selectedIdx, setSelectedIdx] = useState(0);\r\n const [selectedProvider, setSelectedProvider] = useState<AIProviderType>('openai');\r\n const [apiKey, setApiKey] = useState('');\r\n\r\n useInput((input, key) => {\r\n if (step !== 'provider') return;\r\n\r\n if (key.upArrow) {\r\n setSelectedIdx((prev) => Math.max(0, prev - 1));\r\n } else if (key.downArrow) {\r\n setSelectedIdx((prev) => Math.min(PROVIDER_OPTIONS.length - 1, prev + 1));\r\n } else if (key.return) {\r\n setSelectedProvider(PROVIDER_OPTIONS[selectedIdx].key);\r\n setStep('key');\r\n }\r\n });\r\n\r\n const handleKeySubmit = (value: string) => {\r\n const trimmed = value.trim();\r\n if (trimmed) {\r\n onComplete(selectedProvider, trimmed);\r\n }\r\n };\r\n\r\n const providerInfo = PROVIDERS[selectedProvider];\r\n\r\n return (\r\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\r\n <Text bold color=\"magenta\">\r\n ◆ Dominus — First Time Setup\r\n </Text>\r\n <Text> </Text>\r\n\r\n {step === 'provider' && (\r\n <>\r\n <Text bold>Select your AI provider:</Text>\r\n <Text> </Text>\r\n {PROVIDER_OPTIONS.map((opt, i) => (\r\n <Box key={opt.key}>\r\n <Text color={i === selectedIdx ? 'cyan' : undefined} bold={i === selectedIdx}>\r\n {i === selectedIdx ? ' ❯ ' : ' '}\r\n {opt.label}\r\n </Text>\r\n <Text dimColor> {opt.hint}</Text>\r\n </Box>\r\n ))}\r\n <Text> </Text>\r\n <Text dimColor>↑/↓ to select, Enter to confirm</Text>\r\n </>\r\n )}\r\n\r\n {step === 'key' && (\r\n <>\r\n <Text>\r\n Provider: <Text color=\"cyan\" bold>{PROVIDERS[selectedProvider].name}</Text>\r\n </Text>\r\n <Text>\r\n Default model: <Text color=\"green\">{providerInfo.defaultModel}</Text>\r\n </Text>\r\n <Text> </Text>\r\n <Text bold>Enter your API key:</Text>\r\n <Text dimColor>\r\n Get one from your provider's dashboard\r\n </Text>\r\n <Text> </Text>\r\n <Box>\r\n <Text color=\"cyan\">❯ </Text>\r\n <TextInput\r\n value={apiKey}\r\n onChange={setApiKey}\r\n onSubmit={handleKeySubmit}\r\n mask=\"*\"\r\n placeholder=\"sk-...\"\r\n />\r\n </Box>\r\n </>\r\n )}\r\n </Box>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\ninterface StatusBarProps {\r\n connected: boolean;\r\n placeName?: string;\r\n connectionCount?: number;\r\n model: string;\r\n sessionTokens?: number;\r\n}\r\n\r\nexport const StatusBar: React.FC<StatusBarProps> = React.memo(({\r\n connected,\r\n placeName,\r\n connectionCount,\r\n model,\r\n sessionTokens,\r\n}) => {\r\n const statusColor = connected ? 'green' : 'red';\r\n const count = connectionCount ?? (connected ? 1 : 0);\r\n let statusText: string;\r\n if (!connected) {\r\n statusText = '○ Disconnected';\r\n } else if (count > 1) {\r\n statusText = `● ${count} Studios${placeName ? ` — active: ${placeName}` : ''}`;\r\n } else {\r\n statusText = `● Connected${placeName ? ` — ${placeName}` : ''}`;\r\n }\r\n const shortModel = model.split('/').pop() ?? model;\r\n\r\n return (\r\n <Box\r\n borderStyle=\"single\"\r\n borderColor=\"gray\"\r\n paddingX={1}\r\n justifyContent=\"space-between\"\r\n width=\"100%\"\r\n >\r\n <Box gap={2}>\r\n <Text bold color=\"magenta\">\r\n DOMINUS\r\n </Text>\r\n <Text color={statusColor}>{statusText}</Text>\r\n </Box>\r\n <Box gap={2}>\r\n {sessionTokens !== undefined && (\r\n <Text dimColor>~{Math.round(sessionTokens / 1000)}k tokens</Text>\r\n )}\r\n <Text color=\"cyan\">{shortModel}</Text>\r\n <Text dimColor>Ctrl+C to quit</Text>\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface OutputEntry {\r\n message: string;\r\n level: 'info' | 'warn' | 'error';\r\n timestamp: number;\r\n source?: string;\r\n}\r\n\r\ninterface OutputPaneProps {\r\n entries: OutputEntry[];\r\n maxLines?: number;\r\n}\r\n\r\nfunction formatTime(ts: number): string {\r\n const d = new Date(ts);\r\n return d.toLocaleTimeString('en-US', { hour12: false });\r\n}\r\n\r\nconst LEVEL_COLORS: Record<string, string> = {\r\n info: 'white',\r\n warn: 'yellow',\r\n error: 'red',\r\n};\r\n\r\nconst LEVEL_ICONS: Record<string, string> = {\r\n info: '│',\r\n warn: '⚠',\r\n error: '✖',\r\n};\r\n\r\nexport const OutputPane: React.FC<OutputPaneProps> = React.memo(({ entries, maxLines = 10 }) => {\r\n const visible = entries.slice(-maxLines);\r\n\r\n return (\r\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\r\n <Text bold dimColor>\r\n Output\r\n </Text>\r\n {visible.length === 0 ? (\r\n <Text dimColor italic>\r\n Waiting for Studio output...\r\n </Text>\r\n ) : (\r\n visible.map((entry, i) => (\r\n <Text key={i} color={LEVEL_COLORS[entry.level] ?? 'white'}>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>{' '}\r\n <Text>{LEVEL_ICONS[entry.level] ?? '│'}</Text> {entry.message}\r\n </Text>\r\n ))\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\n\r\nexport interface ChatEntry {\r\n role: 'user' | 'assistant' | 'tool' | 'error' | 'system';\r\n content: string;\r\n toolName?: string;\r\n timestamp: number;\r\n}\r\n\r\ninterface ChatPaneProps {\r\n entries: ChatEntry[];\r\n streaming?: string;\r\n maxLines?: number;\r\n}\r\n\r\nfunction formatTime(ts: number): string {\r\n const d = new Date(ts);\r\n return d.toLocaleTimeString('en-US', { hour12: false });\r\n}\r\n\r\nexport const ChatPane: React.FC<ChatPaneProps> = React.memo(({ entries, streaming, maxLines = 20 }) => {\r\n const visible = entries.slice(-maxLines);\r\n\r\n return (\r\n <Box flexDirection=\"column\" flexGrow={1} paddingX={1}>\r\n {visible.map((entry, i) => (\r\n <Box key={i} flexDirection=\"column\" marginBottom={entry.role === 'user' ? 1 : 0}>\r\n {entry.role === 'user' && (\r\n <Box>\r\n <Text color=\"cyan\" bold>\r\n You{' '}\r\n </Text>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>\r\n </Box>\r\n )}\r\n {entry.role === 'assistant' && (\r\n <Box>\r\n <Text color=\"magenta\" bold>\r\n Dominus{' '}\r\n </Text>\r\n <Text dimColor>[{formatTime(entry.timestamp)}]</Text>\r\n </Box>\r\n )}\r\n {entry.role === 'tool' && (\r\n <Text color=\"yellow\">\r\n ⚡ {entry.toolName ?? 'tool'}: {entry.content}\r\n </Text>\r\n )}\r\n {entry.role === 'system' && (\r\n <Text color=\"yellow\" bold>Dominus </Text>\r\n )}\r\n {entry.role === 'error' && (\r\n <Text color=\"red\">✖ Error: {entry.content}</Text>\r\n )}\r\n {(entry.role === 'user' || entry.role === 'assistant' || entry.role === 'system') && (\r\n <Text wrap=\"wrap\">{entry.content}</Text>\r\n )}\r\n </Box>\r\n ))}\r\n\r\n {streaming && (\r\n <Box flexDirection=\"column\">\r\n <Box>\r\n <Text color=\"magenta\" bold>\r\n Dominus{' '}\r\n </Text>\r\n <Text dimColor>(typing...)</Text>\r\n </Box>\r\n <Text wrap=\"wrap\">{streaming}</Text>\r\n </Box>\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import { execSync } from 'node:child_process';\r\nimport { tmpdir } from 'node:os';\r\nimport { join } from 'node:path';\r\nimport { readFileSync, unlinkSync, existsSync } from 'node:fs';\r\nimport { randomBytes } from 'node:crypto';\r\n\r\nexport interface ClipboardImage {\r\n base64: string;\r\n mimeType: 'image/png';\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nconst PS_SCRIPT = `\r\nAdd-Type -AssemblyName System.Windows.Forms\r\n$img = [System.Windows.Forms.Clipboard]::GetImage()\r\nif ($img -eq $null) { exit 1 }\r\n$path = $args[0]\r\n$img.Save($path, [System.Drawing.Imaging.ImageFormat]::Png)\r\n$img.Dispose()\r\nWrite-Host \"$($img.Width)x$($img.Height)\"\r\n`;\r\n\r\nexport function getClipboardImage(): ClipboardImage | null {\r\n if (process.platform !== 'win32') {\r\n return getClipboardImageUnix();\r\n }\r\n\r\n const tmpPath = join(tmpdir(), `dominus-clip-${randomBytes(4).toString('hex')}.png`);\r\n\r\n try {\r\n execSync(\r\n `powershell -NoProfile -Command \"Add-Type -AssemblyName System.Windows.Forms; $img = [System.Windows.Forms.Clipboard]::GetImage(); if ($img -eq $null) { exit 1 }; $img.Save('${tmpPath.replace(/'/g, \"''\")}', [System.Drawing.Imaging.ImageFormat]::Png); $img.Dispose()\"`,\r\n { stdio: 'pipe', timeout: 5000 },\r\n );\r\n\r\n if (!existsSync(tmpPath)) return null;\r\n\r\n const buffer = readFileSync(tmpPath);\r\n unlinkSync(tmpPath);\r\n\r\n if (buffer.length < 100) return null;\r\n\r\n return {\r\n base64: buffer.toString('base64'),\r\n mimeType: 'image/png',\r\n };\r\n } catch {\r\n try { if (existsSync(tmpPath)) unlinkSync(tmpPath); } catch { /* ignore */ }\r\n return null;\r\n }\r\n}\r\n\r\nfunction getClipboardImageUnix(): ClipboardImage | null {\r\n const tmpPath = join(tmpdir(), `dominus-clip-${randomBytes(4).toString('hex')}.png`);\r\n\r\n try {\r\n if (process.platform === 'darwin') {\r\n execSync(`osascript -e 'set png to (the clipboard as «class PNGf»)' -e 'set f to open for access POSIX file \"${tmpPath}\" with write permission' -e 'write png to f' -e 'close access f'`, { stdio: 'pipe', timeout: 5000 });\r\n } else {\r\n execSync(`xclip -selection clipboard -t image/png -o > \"${tmpPath}\"`, { stdio: 'pipe', timeout: 5000 });\r\n }\r\n\r\n if (!existsSync(tmpPath)) return null;\r\n\r\n const buffer = readFileSync(tmpPath);\r\n unlinkSync(tmpPath);\r\n\r\n if (buffer.length < 100) return null;\r\n\r\n return {\r\n base64: buffer.toString('base64'),\r\n mimeType: 'image/png',\r\n };\r\n } catch {\r\n try { if (existsSync(tmpPath)) unlinkSync(tmpPath); } catch { /* ignore */ }\r\n return null;\r\n }\r\n}\r\n","import React, { useState, useMemo, useRef, useCallback, useEffect } from 'react';\r\nimport { Box, Text, useInput } from 'ink';\r\nimport TextInput from 'ink-text-input';\r\nimport { getClipboardImage } from '../../utils/clipboard.js';\r\n\r\ninterface CommandSuggestion {\r\n command: string;\r\n description: string;\r\n}\r\n\r\nconst COMMANDS: CommandSuggestion[] = [\r\n { command: '/help', description: 'Show help and available commands' },\r\n { command: '/model', description: 'Switch the AI model' },\r\n { command: '/models', description: 'List all available models from your provider' },\r\n { command: '/status', description: 'Show connection and config status' },\r\n { command: '/clear', description: 'Clear chat history' },\r\n { command: '/paste', description: 'Paste image from clipboard (or Alt+V)' },\r\n];\r\n\r\nexport interface ImageAttachment {\r\n base64: string;\r\n mimeType: 'image/png';\r\n}\r\n\r\ninterface InputBarProps {\r\n onSubmit: (text: string, image?: ImageAttachment) => void;\r\n onImagePaste?: (image: ImageAttachment) => void;\r\n isProcessing: boolean;\r\n placeholder?: string;\r\n imageAttached?: boolean;\r\n onClearImage?: () => void;\r\n}\r\n\r\nconst SuggestionBox: React.FC<{ suggestions: CommandSuggestion[]; selectedIdx: number }> = React.memo(\r\n ({ suggestions, selectedIdx }) => (\r\n <Box flexDirection=\"column\" paddingX={1} borderStyle=\"single\" borderColor=\"gray\">\r\n {suggestions.map((s, i) => (\r\n <Box key={s.command}>\r\n <Text color={i === selectedIdx ? 'cyan' : undefined} bold={i === selectedIdx}>\r\n {i === selectedIdx ? '❯ ' : ' '}\r\n </Text>\r\n <Text color={i === selectedIdx ? 'cyan' : 'white'} bold={i === selectedIdx}>\r\n {s.command.padEnd(16)}\r\n </Text>\r\n <Text dimColor>{s.description}</Text>\r\n </Box>\r\n ))}\r\n <Text dimColor> ↑↓ navigate · Tab complete · Enter select</Text>\r\n </Box>\r\n ),\r\n);\r\n\r\nexport const InputBar: React.FC<InputBarProps> = React.memo(({\r\n onSubmit,\r\n onImagePaste,\r\n isProcessing,\r\n placeholder = 'Ask Dominus anything, or /help for commands...',\r\n imageAttached,\r\n onClearImage,\r\n}) => {\r\n const [value, setValue] = useState('');\r\n const [selectedIdx, setSelectedIdx] = useState(0);\r\n const [pasteStatus, setPasteStatus] = useState<'none' | 'checking' | 'no_image'>('none');\r\n const valueRef = useRef(value);\r\n valueRef.current = value;\r\n\r\n const suggestions = useMemo(() => {\r\n if (!value.startsWith('/') || value.includes(' ')) return [];\r\n const query = value.toLowerCase();\r\n return COMMANDS.filter((c) => c.command.startsWith(query));\r\n }, [value]);\r\n\r\n const showSuggestions = suggestions.length > 0 && value.length > 0;\r\n\r\n const tryPasteImage = useCallback(() => {\r\n if (!onImagePaste) return false;\r\n setPasteStatus('checking');\r\n try {\r\n const img = getClipboardImage();\r\n if (img) {\r\n onImagePaste(img);\r\n setPasteStatus('none');\r\n return true;\r\n }\r\n } catch { /* ignore */ }\r\n setPasteStatus('no_image');\r\n setTimeout(() => setPasteStatus('none'), 2000);\r\n return false;\r\n }, [onImagePaste]);\r\n\r\n // Listen for raw stdin to catch Alt+V and Ctrl+V\r\n useEffect(() => {\r\n const handler = (data: Buffer) => {\r\n if (isProcessing) return;\r\n const str = data.toString();\r\n // Alt+V: ESC + v (0x1B 0x76)\r\n if (str === '\\x1bv' || str === '\\x1bV') {\r\n tryPasteImage();\r\n return;\r\n }\r\n // Ctrl+V: 0x16 (works if terminal doesn't intercept it)\r\n if (str === '\\x16') {\r\n tryPasteImage();\r\n return;\r\n }\r\n };\r\n process.stdin.on('data', handler);\r\n return () => { process.stdin.off('data', handler); };\r\n }, [isProcessing, tryPasteImage]);\r\n\r\n useInput((_input, key) => {\r\n if (isProcessing) return;\r\n\r\n if (!showSuggestions) return;\r\n\r\n if (key.upArrow) {\r\n setSelectedIdx((prev) => Math.max(0, prev - 1));\r\n } else if (key.downArrow) {\r\n setSelectedIdx((prev) => Math.min(suggestions.length - 1, prev + 1));\r\n } else if (key.tab) {\r\n const selected = suggestions[selectedIdx];\r\n if (selected) {\r\n setValue(selected.command + ' ');\r\n setSelectedIdx(0);\r\n }\r\n }\r\n });\r\n\r\n const handleChange = useCallback((v: string) => {\r\n setValue(v);\r\n setSelectedIdx(0);\r\n }, []);\r\n\r\n const handleSubmit = useCallback((text: string) => {\r\n if (isProcessing) return;\r\n\r\n // /paste command\r\n if (text.trim().toLowerCase() === '/paste') {\r\n tryPasteImage();\r\n setValue('');\r\n return;\r\n }\r\n\r\n const currentValue = valueRef.current;\r\n const currentSuggestions = COMMANDS.filter(\r\n (c) => currentValue.startsWith('/') && !currentValue.includes(' ') && c.command.startsWith(currentValue.toLowerCase()),\r\n );\r\n const hasSuggestions = currentSuggestions.length > 0 && currentValue.length > 0;\r\n\r\n if (hasSuggestions) {\r\n const cmd = currentSuggestions[0]?.command;\r\n if (cmd && currentValue !== cmd && !currentValue.includes(' ')) {\r\n const noArgCmds = ['/clear', '/help', '/status', '/models', '/paste'];\r\n setValue(cmd + (noArgCmds.includes(cmd) ? '' : ' '));\r\n setSelectedIdx(0);\r\n return;\r\n }\r\n }\r\n\r\n if (text.trim()) {\r\n onSubmit(text.trim());\r\n setValue('');\r\n setSelectedIdx(0);\r\n }\r\n }, [isProcessing, onSubmit, tryPasteImage]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n {showSuggestions && (\r\n <SuggestionBox suggestions={suggestions} selectedIdx={selectedIdx} />\r\n )}\r\n\r\n {imageAttached && (\r\n <Box paddingX={1} gap={1}>\r\n <Text color=\"green\" bold>[image 1]</Text>\r\n <Text dimColor>pasted — send a message to use it</Text>\r\n </Box>\r\n )}\r\n\r\n {pasteStatus === 'checking' && (\r\n <Box paddingX={1}>\r\n <Text color=\"yellow\">Checking clipboard...</Text>\r\n </Box>\r\n )}\r\n\r\n {pasteStatus === 'no_image' && (\r\n <Box paddingX={1}>\r\n <Text color=\"red\">No image found in clipboard. Copy an image first (screenshot, snipping tool, etc.)</Text>\r\n </Box>\r\n )}\r\n\r\n <Box borderStyle=\"single\" borderColor={isProcessing ? 'yellow' : imageAttached ? 'green' : 'cyan'} paddingX={1}>\r\n <Text color={isProcessing ? 'yellow' : 'cyan'} bold>\r\n {isProcessing ? '⟳ ' : imageAttached ? '📎 ' : '❯ '}\r\n </Text>\r\n {isProcessing ? (\r\n <Text dimColor>Processing...</Text>\r\n ) : (\r\n <TextInput\r\n value={value}\r\n onChange={handleChange}\r\n onSubmit={handleSubmit}\r\n placeholder={imageAttached ? 'Describe what you want (image attached)...' : placeholder}\r\n />\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\nconst CLASS_ICONS: Record<string, string> = {\r\n Workspace: '🌍',\r\n ServerScriptService: '⚙️',\r\n ReplicatedStorage: '📦',\r\n ReplicatedFirst: '🚀',\r\n StarterGui: '🖥️',\r\n StarterPack: '🎒',\r\n StarterPlayer: '🧑',\r\n Players: '👥',\r\n Lighting: '💡',\r\n SoundService: '🔊',\r\n Script: '📜',\r\n LocalScript: '📱',\r\n ModuleScript: '📘',\r\n Part: '🧱',\r\n Model: '📐',\r\n Folder: '📁',\r\n RemoteEvent: '📡',\r\n RemoteFunction: '📡',\r\n BindableEvent: '🔗',\r\n};\r\n\r\nfunction getIcon(className: string): string {\r\n return CLASS_ICONS[className] ?? '◇';\r\n}\r\n\r\ninterface ExplorerPaneProps {\r\n tree: ExplorerNode[];\r\n selectedPath?: string;\r\n maxDepth?: number;\r\n}\r\n\r\nconst TreeNode: React.FC<{\r\n node: ExplorerNode;\r\n depth: number;\r\n maxDepth: number;\r\n selectedPath?: string;\r\n}> = ({ node, depth, maxDepth, selectedPath }) => {\r\n const indent = ' '.repeat(depth);\r\n const isSelected = node.path === selectedPath;\r\n const hasChildren = node.children && node.children.length > 0;\r\n const icon = getIcon(node.className);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Text>\r\n <Text dimColor>{indent}</Text>\r\n <Text>{hasChildren ? '▾ ' : ' '}</Text>\r\n <Text>{icon} </Text>\r\n <Text bold={isSelected} color={isSelected ? 'cyan' : undefined}>\r\n {node.name}\r\n </Text>\r\n <Text dimColor> ({node.className})</Text>\r\n </Text>\r\n {hasChildren &&\r\n depth < maxDepth &&\r\n node.children!.map((child, i) => (\r\n <TreeNode\r\n key={`${child.path}-${i}`}\r\n node={child}\r\n depth={depth + 1}\r\n maxDepth={maxDepth}\r\n selectedPath={selectedPath}\r\n />\r\n ))}\r\n </Box>\r\n );\r\n};\r\n\r\nexport const ExplorerPane: React.FC<ExplorerPaneProps> = React.memo(({\r\n tree,\r\n selectedPath,\r\n maxDepth = 4,\r\n}) => {\r\n return (\r\n <Box\r\n flexDirection=\"column\"\r\n borderStyle=\"single\"\r\n borderColor=\"gray\"\r\n paddingX={1}\r\n width={36}\r\n minWidth={30}\r\n >\r\n <Text bold dimColor>\r\n Explorer\r\n </Text>\r\n {tree.length === 0 ? (\r\n <Text dimColor italic>\r\n Connect Studio plugin...\r\n </Text>\r\n ) : (\r\n tree.map((node, i) => (\r\n <TreeNode\r\n key={`${node.path}-${i}`}\r\n node={node}\r\n depth={0}\r\n maxDepth={maxDepth}\r\n selectedPath={selectedPath}\r\n />\r\n ))\r\n )}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport Spinner from 'ink-spinner';\r\nimport type { ToolResult } from '../../tools/types.js';\r\n\r\nexport interface ToolCallEntry {\r\n name: string;\r\n args: Record<string, unknown>;\r\n result?: ToolResult;\r\n status: 'running' | 'done' | 'error';\r\n}\r\n\r\ninterface ToolCallViewProps {\r\n calls: ToolCallEntry[];\r\n}\r\n\r\nfunction summarizeArgs(args: Record<string, unknown>): string {\r\n const parts: string[] = [];\r\n for (const [key, value] of Object.entries(args)) {\r\n const str = typeof value === 'string' ? value : JSON.stringify(value);\r\n parts.push(`${key}=${str.length > 40 ? str.slice(0, 40) + '...' : str}`);\r\n }\r\n return parts.join(', ');\r\n}\r\n\r\nexport const ToolCallView: React.FC<ToolCallViewProps> = React.memo(({ calls }) => {\r\n if (calls.length === 0) return null;\r\n\r\n return (\r\n <Box flexDirection=\"column\" paddingX={1}>\r\n {calls.map((call, i) => (\r\n <Box key={i} gap={1}>\r\n {call.status === 'running' && (\r\n <Text color=\"yellow\">\r\n <Spinner type=\"dots\" />\r\n </Text>\r\n )}\r\n {call.status === 'done' && <Text color=\"green\">✔</Text>}\r\n {call.status === 'error' && <Text color=\"red\">✖</Text>}\r\n <Text color=\"yellow\" bold>\r\n {call.name}\r\n </Text>\r\n <Text dimColor>({summarizeArgs(call.args)})</Text>\r\n {call.result && !call.result.success && (\r\n <Text color=\"red\"> — {call.result.error}</Text>\r\n )}\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n});\r\n","import React from 'react';\r\nimport { Box } from 'ink';\r\nimport { StatusBar } from './StatusBar.js';\r\nimport { OutputPane, type OutputEntry } from './OutputPane.js';\r\nimport { ChatPane, type ChatEntry } from './ChatPane.js';\r\nimport { InputBar, type ImageAttachment } from './InputBar.js';\r\nimport { ExplorerPane } from './Explorer.js';\r\nimport { ToolCallView, type ToolCallEntry } from './ToolCallView.js';\r\nimport type { ExplorerNode } from '../../transport/protocol.js';\r\n\r\ninterface LayoutProps {\r\n connected: boolean;\r\n placeName?: string;\r\n connectionCount?: number;\r\n model: string;\r\n chatEntries: ChatEntry[];\r\n outputEntries: OutputEntry[];\r\n explorerTree: ExplorerNode[];\r\n toolCalls: ToolCallEntry[];\r\n streaming?: string;\r\n isProcessing: boolean;\r\n onSubmit: (text: string, image?: ImageAttachment) => void;\r\n onImagePaste?: (image: ImageAttachment) => void;\r\n imageAttached?: boolean;\r\n onClearImage?: () => void;\r\n}\r\n\r\nexport const Layout: React.FC<LayoutProps> = React.memo(({\r\n connected,\r\n placeName,\r\n connectionCount,\r\n model,\r\n chatEntries,\r\n outputEntries,\r\n explorerTree,\r\n toolCalls,\r\n streaming,\r\n isProcessing,\r\n onSubmit,\r\n onImagePaste,\r\n imageAttached,\r\n onClearImage,\r\n}) => {\r\n return (\r\n <Box flexDirection=\"column\" width=\"100%\">\r\n <StatusBar connected={connected} placeName={placeName} connectionCount={connectionCount} model={model} />\r\n\r\n <Box flexGrow={1}>\r\n <ExplorerPane tree={explorerTree} />\r\n\r\n <Box flexDirection=\"column\" flexGrow={1}>\r\n <ChatPane entries={chatEntries} streaming={streaming} />\r\n {toolCalls.length > 0 && <ToolCallView calls={toolCalls} />}\r\n </Box>\r\n </Box>\r\n\r\n <OutputPane entries={outputEntries} maxLines={6} />\r\n <InputBar\r\n onSubmit={onSubmit}\r\n onImagePaste={onImagePaste}\r\n isProcessing={isProcessing}\r\n imageAttached={imageAttached}\r\n onClearImage={onClearImage}\r\n />\r\n </Box>\r\n );\r\n});\r\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport type { StudioBridge } from '../../transport/ws-server.js';\nimport type { ExplorerNode, OutputPayload, StudioConnectedPayload } from '../../transport/protocol.js';\nimport { StudioMsg } from '../../transport/protocol.js';\nimport type { OutputEntry } from '../components/OutputPane.js';\n\ninterface StudioState {\n connected: boolean;\n placeName?: string;\n placeId?: number;\n connectionCount: number;\n explorerTree: ExplorerNode[];\n outputLog: OutputEntry[];\n}\n\nexport function useStudio(server: StudioBridge) {\n const connInfo = server.getConnectionInfo();\n const connections = server.listConnections();\n const [state, setState] = useState<StudioState>({\n connected: server.isConnected(),\n placeName: connInfo?.placeName,\n placeId: connInfo?.placeId,\n connectionCount: connections.length,\n explorerTree: [],\n outputLog: [],\n });\n\n const stateRef = useRef(state);\n stateRef.current = state;\n\n useEffect(() => {\n // Sync initial state in case connection happened before mount\n if (server.isConnected() && !stateRef.current.connected) {\n const info = server.getConnectionInfo();\n const conns = server.listConnections();\n setState((prev) => ({\n ...prev,\n connected: true,\n placeName: info?.placeName,\n placeId: info?.placeId,\n connectionCount: conns.length,\n }));\n }\n\n const onConnected = (payload: StudioConnectedPayload) => {\n const conns = server.listConnections();\n const info = server.getConnectionInfo();\n setState((prev) => ({\n ...prev,\n connected: true,\n placeName: info?.placeName ?? payload.placeName ?? prev.placeName,\n placeId: info?.placeId ?? payload.placeId ?? prev.placeId,\n connectionCount: conns.length,\n }));\n };\n\n const onDisconnected = () => {\n const conns = server.listConnections();\n const info = server.getConnectionInfo();\n const stillConnected = conns.length > 0;\n setState((prev) => ({\n ...prev,\n connected: stillConnected,\n placeName: stillConnected ? info?.placeName : undefined,\n placeId: stillConnected ? info?.placeId : undefined,\n connectionCount: conns.length,\n }));\n };\n\n const onExplorer = (payload: { tree: ExplorerNode[] }) => {\n setState((prev) => ({ ...prev, explorerTree: payload.tree ?? [] }));\n };\n\n const onOutput = (payload: OutputPayload) => {\n setState((prev) => ({\n ...prev,\n outputLog: [\n ...prev.outputLog.slice(-200),\n {\n message: payload.message,\n level: payload.level,\n timestamp: payload.timestamp ?? Date.now(),\n source: payload.source,\n },\n ],\n }));\n };\n\n const onError = (payload: OutputPayload) => {\n setState((prev) => ({\n ...prev,\n outputLog: [\n ...prev.outputLog.slice(-200),\n {\n message: payload.message,\n level: 'error',\n timestamp: payload.timestamp ?? Date.now(),\n source: payload.source,\n },\n ],\n }));\n };\n\n server.on('studio:connected', onConnected);\n server.on('studio:disconnected', onDisconnected);\n server.on(StudioMsg.EXPLORER, onExplorer);\n server.on(StudioMsg.OUTPUT, onOutput);\n server.on(StudioMsg.ERROR, onError);\n\n return () => {\n server.off('studio:connected', onConnected);\n server.off('studio:disconnected', onDisconnected);\n server.off(StudioMsg.EXPLORER, onExplorer);\n server.off(StudioMsg.OUTPUT, onOutput);\n server.off(StudioMsg.ERROR, onError);\n };\n }, [server]);\n\n const clearOutput = useCallback(() => {\n setState((prev) => ({ ...prev, outputLog: [] }));\n }, []);\n\n return { ...state, clearOutput };\n}\n","import React, { useState, useCallback, useRef } from 'react';\nimport { Box } from 'ink';\nimport { Welcome } from './ui/components/Welcome.js';\nimport { Setup } from './ui/components/Setup.js';\nimport { Layout } from './ui/components/Layout.js';\nimport { InputBar, type ImageAttachment } from './ui/components/InputBar.js';\nimport { useStudio } from './ui/hooks/useStudio.js';\nimport type { StudioBridge } from './transport/ws-server.js';\nimport type { AgentLoop } from './agent/loop.js';\nimport type { ChatEntry } from './ui/components/ChatPane.js';\nimport type { ToolCallEntry } from './ui/components/ToolCallView.js';\nimport { loadConfig, setConfigValue, PROVIDERS, resolveProviderSettings, type AIProviderType } from './config/config.js';\n\ninterface AppProps {\n server: StudioBridge;\n agent: AgentLoop | null;\n version: string;\n}\n\nexport const App: React.FC<AppProps> = ({ server, agent: initialAgent, version }) => {\n const [showWelcome, setShowWelcome] = useState(true);\n const [chatEntries, setChatEntries] = useState<ChatEntry[]>([]);\n const [toolCalls, setToolCalls] = useState<ToolCallEntry[]>([]);\n const [streaming, setStreaming] = useState('');\n const [isProcessing, setIsProcessing] = useState(false);\n const [agent, setAgent] = useState(initialAgent);\n\n const studio = useStudio(server);\n const config = loadConfig();\n const hasApiKey = !!config.apiKey;\n const [needsSetup, setNeedsSetup] = useState(!hasApiKey);\n const [pendingImage, setPendingImage] = useState<ImageAttachment | null>(null);\n const pendingImageRef = useRef<ImageAttachment | null>(null);\n\n const handleImagePaste = useCallback((image: ImageAttachment) => {\n setPendingImage(image);\n pendingImageRef.current = image;\n }, []);\n\n const handleClearImage = useCallback(() => {\n setPendingImage(null);\n pendingImageRef.current = null;\n }, []);\n\n const handleSetupComplete = useCallback((provider: AIProviderType, apiKey: string) => {\n setConfigValue('provider', provider);\n setConfigValue('apiKey', apiKey);\n const providerInfo = PROVIDERS[provider];\n setConfigValue('apiBaseUrl', providerInfo.baseUrl);\n setConfigValue('model', providerInfo.defaultModel);\n setNeedsSetup(false);\n }, []);\n\n const addSystemMessage = useCallback((content: string) => {\n setChatEntries((prev) => [\n ...prev,\n { role: 'system' as const, content, timestamp: Date.now() },\n ]);\n }, []);\n\n const handleCommand = useCallback(\n (text: string): boolean => {\n const input = text.startsWith('/') ? text.slice(1) : text;\n const [cmd, ...args] = input.split(' ');\n const arg = args.join(' ');\n const lowerCmd = cmd.toLowerCase();\n\n const currentModel = agent?.getModel() ?? resolveProviderSettings(config).model;\n const providerName = PROVIDERS[config.provider]?.name ?? config.provider;\n const keyStatus = config.apiKey\n ? `${config.apiKey.slice(0, 6)}...${config.apiKey.slice(-4)}`\n : 'NOT SET';\n\n switch (lowerCmd) {\n case 'help':\n case 'h':\n case '?':\n addSystemMessage([\n '── Your Config ─────────────────────────────',\n ` Provider: ${providerName}`,\n ` Model: ${currentModel}`,\n ` API Key: ${keyStatus}`,\n ` Studio: ${studio.connected ? '● Connected' + (studio.placeName ? ` (${studio.placeName})` : '') : '○ Disconnected'}`,\n '',\n '── Commands ────────────────────────────────',\n ' /help Show this help',\n ' /model <name> Switch AI model',\n ' /models List available models',\n ' /status Connection status',\n ' /clear Clear chat history',\n '',\n '── Setup (run in your terminal) ────────────',\n ' dominus config set provider <name>',\n ' Providers: openai, anthropic, gemini, xai, openrouter',\n ' dominus config set apiKey <key>',\n ' dominus config list',\n ' dominus install-plugin',\n ' dominus mcp-install',\n '',\n 'Or just type a message to chat with Dominus!',\n ].join('\\n'));\n return true;\n\n case 'clear':\n agent?.clearHistory();\n setChatEntries([]);\n setToolCalls([]);\n return true;\n\n case 'model':\n if (arg && agent) {\n agent.setModel(arg);\n addSystemMessage(`Model switched to: ${arg}`);\n } else {\n addSystemMessage('Usage: /model <model-name>');\n }\n return true;\n\n case 'models': {\n if (!agent) {\n addSystemMessage('No API key configured — cannot fetch models.');\n return true;\n }\n addSystemMessage(`Fetching models from ${providerName}...`);\n agent.listModels().then((models) => {\n if (models.length === 0) {\n addSystemMessage('Could not fetch models. Check your API key.');\n return;\n }\n const lines = models.slice(0, 40).map((m) => ` ${m.id}`);\n addSystemMessage([\n `── ${providerName} Models (${models.length} total) ──`,\n ...lines,\n models.length > 40 ? ` ... and ${models.length - 40} more` : '',\n '',\n ` Current: ${currentModel}`,\n ' Switch with: /model <name>',\n ].join('\\n'));\n });\n return true;\n }\n\n case 'status':\n addSystemMessage([\n '── Status ──────────────────────────────────',\n ` Provider: ${providerName}`,\n ` Model: ${currentModel}`,\n ` API Key: ${keyStatus}`,\n ` Port: ${server.getPort()}`,\n ` Studio: ${studio.connected ? '● Connected' + (studio.placeName ? ` (${studio.placeName})` : '') : '○ Disconnected'}`,\n ].join('\\n'));\n return true;\n\n default:\n return false;\n }\n },\n [agent, studio, server, config, addSystemMessage],\n );\n\n const handleSubmit = useCallback(\n async (text: string) => {\n if (isProcessing) return;\n\n // Check for commands first (with or without /)\n // /paste is handled directly by InputBar, skip it here\n if (text.trim().toLowerCase() === '/paste' || text.trim().toLowerCase() === 'paste') return;\n\n const isCommand = text.startsWith('/') || ['help', 'h', '?', 'clear', 'model', 'models', 'status'].includes(text.split(' ')[0].toLowerCase());\n if (isCommand) {\n setShowWelcome(false);\n handleCommand(text);\n return;\n }\n\n // Dismiss welcome for regular messages\n setShowWelcome(false);\n\n if (!agent) {\n setChatEntries((prev) => [\n ...prev,\n { role: 'user', content: text, timestamp: Date.now() },\n {\n role: 'error',\n content: 'No API key configured. Set OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, or XAI_API_KEY — or run: dominus config set apiKey <key>',\n timestamp: Date.now(),\n },\n ]);\n return;\n }\n\n // Grab and clear any pending image\n const image = pendingImageRef.current;\n setPendingImage(null);\n pendingImageRef.current = null;\n\n setIsProcessing(true);\n setToolCalls([]);\n\n const displayText = image ? `${text}\\n[image 1]` : text;\n setChatEntries((prev) => [\n ...prev,\n { role: 'user', content: displayText, timestamp: Date.now() },\n ]);\n\n let fullText = '';\n\n try {\n for await (const event of agent.run(text, image ? { base64: image.base64, mimeType: image.mimeType } : undefined)) {\n switch (event.type) {\n case 'text':\n fullText += event.content;\n setStreaming(fullText);\n break;\n\n case 'tool_call':\n setToolCalls((prev) => [\n ...prev,\n { name: event.tool, args: event.args, status: 'running' },\n ]);\n break;\n\n case 'tool_result':\n setToolCalls((prev) =>\n prev.map((tc) =>\n tc.name === event.tool && tc.status === 'running'\n ? { ...tc, status: event.result.success ? 'done' : 'error', result: event.result }\n : tc,\n ),\n );\n break;\n\n case 'error':\n setChatEntries((prev) => [\n ...prev,\n { role: 'error', content: event.message, timestamp: Date.now() },\n ]);\n break;\n }\n }\n\n if (fullText) {\n setChatEntries((prev) => [\n ...prev,\n { role: 'assistant', content: fullText, timestamp: Date.now() },\n ]);\n }\n } catch (err) {\n setChatEntries((prev) => [\n ...prev,\n {\n role: 'error',\n content: err instanceof Error ? err.message : String(err),\n timestamp: Date.now(),\n },\n ]);\n } finally {\n setIsProcessing(false);\n setStreaming('');\n setToolCalls([]);\n }\n },\n [agent, isProcessing, handleCommand],\n );\n\n if (needsSetup) {\n return <Setup onComplete={handleSetupComplete} />;\n }\n\n if (showWelcome) {\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <Welcome\n userName={config.userName}\n version={version}\n model={resolveProviderSettings(config).model}\n provider={PROVIDERS[config.provider]?.name ?? config.provider}\n port={server.getPort()}\n hasApiKey={hasApiKey}\n connected={studio.connected}\n cwd={process.cwd()}\n />\n <InputBar\n onSubmit={handleSubmit}\n onImagePaste={handleImagePaste}\n isProcessing={false}\n imageAttached={!!pendingImage}\n onClearImage={handleClearImage}\n placeholder={\n hasApiKey\n ? 'Type a message to begin, or Ctrl+V to paste an image...'\n : 'Set up your API key to get started, or type /help...'\n }\n />\n </Box>\n );\n }\n\n return (\n <Layout\n connected={studio.connected}\n placeName={studio.placeName}\n connectionCount={studio.connectionCount}\n model={agent?.getModel() ?? resolveProviderSettings(config).model}\n chatEntries={chatEntries}\n outputEntries={studio.outputLog}\n explorerTree={studio.explorerTree}\n toolCalls={toolCalls}\n streaming={streaming || undefined}\n isProcessing={isProcessing}\n onSubmit={handleSubmit}\n onImagePaste={handleImagePaste}\n imageAttached={!!pendingImage}\n onClearImage={handleClearImage}\n />\n );\n};\n","import React from 'react';\nimport { render } from 'ink';\nimport { Command } from 'commander';\nimport { App } from './app.js';\nimport { DominusServer, type StudioBridge } from './transport/ws-server.js';\nimport { DominusClient, isPortInUse } from './transport/ws-client.js';\nimport { AgentLoop } from './agent/loop.js';\nimport { ToolRegistry, createDefaultRegistry } from './tools/registry.js';\nimport { initMemoryStore, closeMemoryStore } from './memory/store.js';\nimport {\n loadConfig,\n setConfigValue,\n getConfigValue,\n loadRules,\n saveRules,\n getDominusDir,\n detectProviderFromEnv,\n PROVIDERS,\n type DominusConfig,\n type AIProviderType,\n} from './config/config.js';\nimport { checkForUpdate, formatUpdateMessage, autoUpdate } from './utils/update-checker.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst VERSION = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf-8')).version;\n\nconst program = new Command();\n\nprogram\n .name('dominus')\n .description('AI-powered autonomous agent for Roblox Studio development')\n .version(VERSION);\n\n// Main start command (default)\nprogram\n .command('start', { isDefault: true })\n .description('Launch the Dominus TUI agent')\n .option('-p, --port <port>', 'WebSocket server port', '18088')\n .action(async (opts) => {\n const config = loadConfig();\n const port = parseInt(opts.port) || config.port;\n\n // Auto-detect API key from environment variables\n if (!config.apiKey) {\n const detected = detectProviderFromEnv();\n if (detected) {\n setConfigValue('provider', detected.provider);\n setConfigValue('apiKey', detected.apiKey);\n }\n }\n\n // Auto-detect user name\n if (config.userName === 'Developer') {\n const envUser = process.env.USER || process.env.USERNAME || 'Developer';\n const firstName = envUser.split(' ')[0];\n if (firstName && firstName !== 'Developer') {\n setConfigValue('userName', firstName);\n }\n }\n\n checkForUpdate(VERSION).then((info) => {\n if (info) process.stderr.write(formatUpdateMessage(info));\n }).catch(() => {});\n\n await launchApp(port);\n });\n\n// Config commands\nconst configCmd = program.command('config').description('Manage Dominus configuration');\n\nconfigCmd\n .command('set <key> <value>')\n .description('Set a config value')\n .action((key: string, value: string) => {\n const numericKeys = ['port', 'maxToolIterations', 'maxVerifyRetries', 'tokenBudget'];\n const booleanKeys = ['autoIndex', 'autoLearn'];\n const validProviders = ['openai', 'anthropic', 'gemini', 'xai', 'openrouter', 'custom'];\n\n let parsed: unknown = value;\n if (numericKeys.includes(key)) {\n parsed = parseInt(value);\n } else if (booleanKeys.includes(key)) {\n parsed = value === 'true';\n } else if (key === 'provider') {\n if (!validProviders.includes(value)) {\n console.log(` ✖ Invalid provider: ${value}`);\n console.log(` Valid providers: ${validProviders.join(', ')}`);\n return;\n }\n // When changing provider, also update model and base URL defaults\n const providerInfo = PROVIDERS[value as AIProviderType];\n setConfigValue('apiBaseUrl', providerInfo.baseUrl);\n setConfigValue('model', providerInfo.defaultModel);\n }\n\n setConfigValue(key as keyof DominusConfig, parsed as DominusConfig[keyof DominusConfig]);\n console.log(` ✔ Set ${key} = ${value}`);\n if (key === 'provider') {\n const p = PROVIDERS[value as AIProviderType];\n console.log(` → Base URL: ${p.baseUrl}`);\n console.log(` → Default model: ${p.defaultModel}`);\n }\n console.log(` Config stored at: ${getDominusDir()}/config.json`);\n });\n\nconfigCmd\n .command('get <key>')\n .description('Get a config value')\n .action((key: string) => {\n const value = getConfigValue(key as keyof DominusConfig);\n if (key.toLowerCase().includes('key') && typeof value === 'string') {\n console.log(` ${key} = ${value.slice(0, 8)}...${value.slice(-4)}`);\n } else {\n console.log(` ${key} = ${JSON.stringify(value)}`);\n }\n });\n\nconfigCmd\n .command('list')\n .description('List all config values')\n .action(() => {\n const config = loadConfig();\n console.log('');\n console.log(' Dominus Configuration:');\n console.log(' ─────────────────────');\n for (const [key, value] of Object.entries(config)) {\n const display =\n key.toLowerCase().includes('key') && typeof value === 'string' && value.length > 12\n ? `${value.slice(0, 8)}...${value.slice(-4)}`\n : JSON.stringify(value);\n console.log(` ${key}: ${display}`);\n }\n console.log('');\n console.log(` Config file: ${getDominusDir()}/config.json`);\n console.log('');\n });\n\n// Rules commands\nconst rulesCmd = program.command('rules').description('Manage agent rules (do/don\\'t)');\n\nrulesCmd\n .command('add-do <rule>')\n .description('Add a rule for things Dominus should do')\n .action((rule: string) => {\n const rules = loadRules();\n rules.do.push(rule);\n saveRules(rules);\n console.log(` ✔ Added DO rule: ${rule}`);\n });\n\nrulesCmd\n .command('add-dont <rule>')\n .description('Add a rule for things Dominus should NOT do')\n .action((rule: string) => {\n const rules = loadRules();\n rules.dont.push(rule);\n saveRules(rules);\n console.log(` ✔ Added DON'T rule: ${rule}`);\n });\n\nrulesCmd\n .command('list')\n .description('List all rules')\n .action(() => {\n const rules = loadRules();\n console.log('');\n console.log(' Dominus Rules:');\n if (rules.do.length) {\n console.log(' DO:');\n rules.do.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (rules.dont.length) {\n console.log(\" DON'T:\");\n rules.dont.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (rules.conventions.length) {\n console.log(' CONVENTIONS:');\n rules.conventions.forEach((r, i) => console.log(` ${i + 1}. ${r}`));\n }\n if (!rules.do.length && !rules.dont.length && !rules.conventions.length) {\n console.log(' No rules configured yet.');\n console.log(' Use: dominus rules add-do \"Always use strict typing\"');\n console.log(' Use: dominus rules add-dont \"Never use deprecated APIs\"');\n }\n console.log('');\n });\n\n// Plugin install command\nprogram\n .command('update')\n .description('Auto-update Dominus to the latest version')\n .action(async () => {\n console.log(` Current version: ${VERSION}`);\n console.log(' Checking for updates...');\n\n const result = await autoUpdate(VERSION);\n if (result.from === result.to && result.success) {\n console.log(' Already on the latest version.');\n return;\n }\n if (result.success) {\n console.log(` ✔ Updated: ${result.from} → ${result.to}`);\n console.log(' Restart dominus to use the new version.');\n } else {\n console.error(` ✘ Update failed: ${result.error}`);\n }\n });\n\nprogram\n .command('install-plugin')\n .description('Build & install the Dominus plugin into Roblox Studio')\n .action(async () => {\n const { execSync } = await import('node:child_process');\n\n const packageRoot = path.resolve(import.meta.dirname ?? __dirname, '..');\n const pluginDir = path.join(packageRoot, 'plugin');\n const pluginProject = path.join(pluginDir, 'default.project.json');\n const studioPlugins = path.join(\n os.homedir(),\n 'AppData',\n 'Local',\n 'Roblox',\n 'Plugins',\n );\n const destFile = path.join(studioPlugins, 'Dominus.rbxm');\n\n if (!fs.existsSync(pluginProject)) {\n console.log(' ✖ Plugin source not found.');\n console.log(` Expected at: ${pluginDir}`);\n return;\n }\n\n if (!fs.existsSync(studioPlugins)) {\n fs.mkdirSync(studioPlugins, { recursive: true });\n }\n\n // Try building with Rojo\n let rojoAvailable = false;\n try {\n execSync('rojo --version', { stdio: 'pipe' });\n rojoAvailable = true;\n } catch {\n // Rojo not installed\n }\n\n if (rojoAvailable) {\n try {\n console.log(' Building plugin with Rojo...');\n execSync(`rojo build \"${pluginDir}\" -o \"${destFile}\"`, { stdio: 'pipe' });\n console.log(` ✔ Plugin built and installed to: ${destFile}`);\n console.log(' Restart Roblox Studio to load the plugin.');\n } catch (err) {\n console.log(` ✖ Rojo build failed: ${err instanceof Error ? err.message : err}`);\n }\n } else {\n // Fallback: build a simple .rbxmx (XML model) that Studio can load\n console.log(' Rojo not found — building plugin manually...');\n buildPluginXml(pluginDir, destFile.replace('.rbxm', '.rbxmx'));\n }\n });\n\n// MCP server command\nprogram\n .command('mcp')\n .description('Start the Dominus MCP server (for Cursor, Claude Desktop, etc.)')\n .option('-p, --port <port>', 'WebSocket server port for Studio connection', '18088')\n .action(async () => {\n const { startMcpServer } = await import('./mcp/server.js');\n await startMcpServer();\n });\n\n// MCP install — auto-write config into supported editors\ninterface McpTarget {\n name: string;\n configPath: string;\n keyPath: string[];\n}\n\nfunction getMcpTargets(): McpTarget[] {\n const home = os.homedir();\n const appData = process.env.APPDATA || path.join(home, 'AppData', 'Roaming');\n const localAppData = process.env.LOCALAPPDATA || path.join(home, 'AppData', 'Local');\n const cwd = process.cwd();\n\n return [\n {\n name: 'Cursor (project)',\n configPath: path.join(cwd, '.cursor', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Cursor (global)',\n configPath: path.join(home, '.cursor', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Claude Desktop',\n configPath: path.join(appData, 'Claude', 'claude_desktop_config.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Claude Code',\n configPath: path.join(home, '.claude.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Windsurf (project)',\n configPath: path.join(cwd, '.windsurf', 'mcp.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'Windsurf (global)',\n configPath: path.join(home, '.codeium', 'windsurf', 'mcp_config.json'),\n keyPath: ['mcpServers'],\n },\n {\n name: 'VS Code (project)',\n configPath: path.join(cwd, '.vscode', 'mcp.json'),\n keyPath: ['servers'],\n },\n {\n name: 'VS Code (global)',\n configPath: path.join(localAppData, 'Code', 'User', 'settings.json'),\n keyPath: ['mcp', 'servers'],\n },\n ];\n}\n\nconst dominusEntry = {\n command: 'dominus',\n args: ['mcp'],\n type: 'stdio',\n};\n\nfunction injectMcpConfig(target: McpTarget): { status: 'installed' | 'already' | 'created' } {\n let config: Record<string, unknown> = {};\n if (fs.existsSync(target.configPath)) {\n try {\n config = JSON.parse(fs.readFileSync(target.configPath, 'utf-8'));\n } catch {\n config = {};\n }\n }\n\n // Navigate to the nested key, creating objects along the way\n let obj = config as Record<string, unknown>;\n for (const key of target.keyPath) {\n if (!obj[key] || typeof obj[key] !== 'object') {\n obj[key] = {};\n }\n obj = obj[key] as Record<string, unknown>;\n }\n\n if (obj['dominus']) {\n return { status: 'already' };\n }\n\n obj['dominus'] = { ...dominusEntry };\n\n const dir = path.dirname(target.configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(target.configPath, JSON.stringify(config, null, 2), 'utf-8');\n\n return { status: fs.existsSync(target.configPath) ? 'installed' : 'created' };\n}\n\nprogram\n .command('mcp-install')\n .description('Auto-install Dominus MCP into Cursor, VS Code, Claude Desktop, Windsurf, etc.')\n .option('-a, --all', 'Install to all detected editors')\n .action(async (opts) => {\n const targets = getMcpTargets();\n\n console.log('');\n console.log(' Dominus MCP Auto-Installer');\n console.log(' ═════════════════════════');\n console.log('');\n\n if (opts.all) {\n for (const target of targets) {\n const result = injectMcpConfig(target);\n const icon = result.status === 'already' ? '●' : '✔';\n const msg = result.status === 'already' ? 'already configured' : 'installed';\n console.log(` ${icon} ${target.name}: ${msg}`);\n }\n console.log('');\n console.log(' Restart your editors to load the Dominus MCP server.');\n console.log('');\n return;\n }\n\n // Interactive: show which editors are detected\n const detected: { target: McpTarget; exists: boolean }[] = targets.map((t) => ({\n target: t,\n exists: fs.existsSync(path.dirname(t.configPath)),\n }));\n\n const toInstall = detected.filter((d) => d.exists);\n\n if (toInstall.length === 0) {\n console.log(' No supported editors detected.');\n console.log(' Run with --all to install configs anyway,');\n console.log(' or manually add to your editor\\'s MCP config:');\n console.log('');\n console.log(' {');\n console.log(' \"dominus\": {');\n console.log(' \"command\": \"dominus\",');\n console.log(' \"args\": [\"mcp\"]');\n console.log(' }');\n console.log(' }');\n console.log('');\n return;\n }\n\n console.log(' Detected editors:');\n console.log('');\n\n for (const { target } of toInstall) {\n const result = injectMcpConfig(target);\n const icon = result.status === 'already' ? '●' : '✔';\n const msg = result.status === 'already' ? 'already configured' : 'installed';\n console.log(` ${icon} ${target.name}: ${msg}`);\n console.log(` ${target.configPath}`);\n }\n\n const skipped = detected.filter((d) => !d.exists);\n if (skipped.length > 0) {\n console.log('');\n console.log(' Skipped (not detected):');\n for (const { target } of skipped) {\n console.log(` ○ ${target.name}`);\n }\n }\n\n console.log('');\n console.log(' Provides 14 Roblox Studio tools to your AI editor.');\n console.log(' Restart your editors to load the Dominus MCP server.');\n console.log('');\n });\n\n// MCP setup helper (print-only)\nprogram\n .command('mcp-setup')\n .description('Print MCP configuration for manual setup')\n .action(() => {\n console.log('');\n console.log(' Dominus MCP — Manual Setup');\n console.log(' ═════════════════════════');\n console.log('');\n console.log(' Tip: Run `dominus mcp-install` to auto-install instead!');\n console.log('');\n console.log(' Add this to your editor\\'s MCP config:');\n console.log('');\n console.log(' {');\n console.log(' \"dominus\": {');\n console.log(' \"command\": \"dominus\",');\n console.log(' \"args\": [\"mcp\"]');\n console.log(' }');\n console.log(' }');\n console.log('');\n console.log(' Config file locations:');\n console.log('');\n console.log(' Cursor (project) .cursor/mcp.json');\n console.log(' Cursor (global) ~/.cursor/mcp.json');\n console.log(' Claude Desktop %APPDATA%/Claude/claude_desktop_config.json');\n console.log(' Claude Code ~/.claude.json');\n console.log(' Windsurf (project) .windsurf/mcp.json');\n console.log(' Windsurf (global) ~/.codeium/windsurf/mcp_config.json');\n console.log(' VS Code (project) .vscode/mcp.json');\n console.log(' VS Code (global) %LOCALAPPDATA%/Code/User/settings.json');\n console.log('');\n console.log(' 14 tools: read_script, edit_script, run_code, get_explorer,');\n console.log(' get_properties, set_properties, insert_instance, delete_instance,');\n console.log(' get_selection, search_scripts, get_output, run_tests,');\n console.log(' recall_memory, remember');\n console.log('');\n });\n\nfunction buildPluginXml(pluginDir: string, destFile: string): void {\n const srcDir = path.join(pluginDir, 'src');\n if (!fs.existsSync(srcDir)) {\n console.log(` ✖ Plugin source directory not found: ${srcDir}`);\n return;\n }\n\n const files = fs.readdirSync(srcDir).filter((f) => f.endsWith('.lua'));\n const mainFile = files.find((f) => f === 'init.server.lua');\n const moduleFiles = files.filter((f) => f !== 'init.server.lua');\n\n if (!mainFile) {\n console.log(' ✖ init.server.lua not found in plugin source');\n return;\n }\n\n const escapeXml = (s: string) =>\n s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n\n const mainSource = fs.readFileSync(path.join(srcDir, mainFile), 'utf-8');\n\n let moduleItems = '';\n for (const mf of moduleFiles) {\n const modName = mf.replace('.lua', '');\n const modSource = fs.readFileSync(path.join(srcDir, mf), 'utf-8');\n moduleItems += `\n <Item class=\"ModuleScript\" referent=\"${modName}\">\n <Properties>\n <string name=\"Name\">${modName}</string>\n <ProtectedString name=\"Source\"><![CDATA[${modSource}]]></ProtectedString>\n </Properties>\n </Item>`;\n }\n\n const rbxmx = `<roblox version=\"4\">\n <Item class=\"Script\" referent=\"Dominus\">\n <Properties>\n <string name=\"Name\">Dominus</string>\n <ProtectedString name=\"Source\"><![CDATA[${mainSource}]]></ProtectedString>\n <token name=\"RunContext\">1</token>\n </Properties>${moduleItems}\n </Item>\n</roblox>`;\n\n fs.writeFileSync(destFile, rbxmx, 'utf-8');\n console.log(` ✔ Plugin installed to: ${destFile}`);\n console.log(' Restart Roblox Studio to load the plugin.');\n}\n\nasync function launchApp(port: number): Promise<void> {\n await initMemoryStore();\n\n let server: StudioBridge;\n\n const portTaken = await isPortInUse(port);\n if (portTaken) {\n // Another Dominus instance (MCP) already owns the port — connect as relay\n const client = new DominusClient(port);\n await client.connect();\n server = client;\n } else {\n const srv = new DominusServer(port);\n await srv.start();\n server = srv;\n }\n\n const config = loadConfig();\n let agent: AgentLoop | null = null;\n\n if (config.apiKey) {\n const tools = createDefaultRegistry();\n await new Promise((r) => setTimeout(r, 100));\n agent = new AgentLoop(server, tools);\n }\n\n const { waitUntilExit } = render(\n <App server={server} agent={agent} version={VERSION} />,\n );\n\n const cleanup = async () => {\n closeMemoryStore();\n await server.stop();\n };\n\n process.on('SIGINT', async () => {\n await cleanup();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n await cleanup();\n process.exit(0);\n });\n\n await waitUntilExit();\n await cleanup();\n}\n\nprogram.parse();\n","import type OpenAI from 'openai';\nimport { nanoid } from 'nanoid';\nimport { AIProvider } from '../ai/provider.js';\nimport { buildContext } from './context-builder.js';\nimport { loadConfig } from '../config/config.js';\nimport { createConfigAccess } from '../config/config.js';\nimport { storeMessage } from '../memory/store.js';\nimport type { StudioBridge } from '../transport/ws-server.js';\nimport { ToolRegistry } from '../tools/registry.js';\nimport type { AgentEvent, ToolContext, ToolCall, ToolResult } from '../tools/types.js';\nimport type { WsMessage } from '../transport/protocol.js';\nimport {\n createExecutionPlan,\n formatExecutionPlan,\n getNextPendingStep,\n isPlanComplete,\n updateStepStatus,\n type ExecutionPlan,\n} from './planner.js';\nimport { buildTaskProfile } from './task-profile.js';\nimport { critiqueStep } from './critic.js';\nimport { inferVerifyChecks, verifyAction } from './verifier.js';\nimport { MultiAgentCoordinator } from './multi-agent/coordinator.js';\nimport type { MultiAgentResult, ParallelTaskArgs } from './multi-agent/types.js';\n\nexport class AgentLoop {\n private ai: AIProvider;\n private server: StudioBridge;\n private tools: ToolRegistry;\n private conversationHistory: OpenAI.ChatCompletionMessageParam[] = [];\n private projectId = 'current';\n private sessionId: string;\n private maxIterations: number;\n private maxRetries: number;\n\n constructor(server: StudioBridge, tools: ToolRegistry) {\n const config = loadConfig();\n this.ai = new AIProvider(config);\n this.server = server;\n this.tools = tools;\n this.sessionId = nanoid();\n this.maxIterations = config.maxToolIterations;\n this.maxRetries = config.maxVerifyRetries;\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n setModel(model: string): void {\n this.ai.setModel(model);\n }\n\n getModel(): string {\n return this.ai.getModel();\n }\n\n async listModels(): Promise<{ id: string; owned_by?: string }[]> {\n return this.ai.listModels();\n }\n\n setProjectId(projectId: string): void {\n this.projectId = projectId;\n }\n\n async *run(\n userMessage: string,\n imageAttachment?: { base64: string; mimeType: string },\n ): AsyncGenerator<AgentEvent> {\n const storedUserMessage = userMessage + (imageAttachment ? ' [image attached]' : '');\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'user',\n content: storedUserMessage,\n createdAt: Date.now(),\n });\n\n const { messages } = buildContext({\n userMessage,\n conversationHistory: this.conversationHistory,\n server: this.server,\n projectId: this.projectId,\n sessionId: this.sessionId,\n });\n\n this.conversationHistory.push({ role: 'user', content: storedUserMessage });\n\n if (imageAttachment) {\n const lastMsg = messages[messages.length - 1];\n if (lastMsg && lastMsg.role === 'user') {\n (lastMsg as OpenAI.ChatCompletionUserMessageParam).content = [\n { type: 'text', text: typeof lastMsg.content === 'string' ? lastMsg.content : userMessage },\n {\n type: 'image_url',\n image_url: {\n url: `data:${imageAttachment.mimeType};base64,${imageAttachment.base64}`,\n detail: 'high',\n },\n },\n ];\n }\n }\n\n const toolCtx = this.createToolContext();\n await this.tools.ready();\n const baseTools = this.tools.getAll();\n const coordinator = new MultiAgentCoordinator(this.ai, baseTools);\n const allTools = [...baseTools, coordinator.getMetaTool()];\n const taskProfile = buildTaskProfile(userMessage);\n\n if (coordinator.shouldAutoTrigger(userMessage)) {\n const events: AgentEvent[] = [];\n const result = await coordinator.execute(\n {\n goal: userMessage,\n rootPath: inferRootPath(userMessage),\n taskType: taskProfile.kind.includes('ui') ? 'ui' : taskProfile.kind,\n },\n toolCtx,\n (event) => events.push(event),\n );\n\n for (const event of events) yield event;\n const summary = formatMultiAgentResult(result);\n yield { type: 'text', content: summary };\n storeMessage({\n sessionId: this.sessionId,\n role: 'assistant',\n content: summary,\n createdAt: Date.now(),\n });\n this.conversationHistory.push({ role: 'assistant', content: summary });\n yield { type: 'done' };\n return;\n }\n\n let plan = await createExecutionPlan({\n ai: this.ai,\n goal: userMessage,\n taskProfile,\n });\n\n yield { type: 'plan', steps: plan.steps };\n yield { type: 'text', content: formatExecutionPlan(plan) };\n\n let currentMessages = [\n ...messages,\n {\n role: 'system' as const,\n content: buildExecutionContext(plan),\n },\n ];\n\n let iteration = 0;\n\n while (iteration < this.maxIterations && !isPlanComplete(plan)) {\n const nextStep = getNextPendingStep(plan);\n if (!nextStep) break;\n\n plan = updateStepStatus(plan, nextStep.index, 'running');\n yield { type: 'plan_progress', stepIndex: nextStep.index, status: 'running' };\n\n let stepDone = false;\n let stepAttempts = 0;\n\n while (!stepDone && stepAttempts <= this.maxRetries && iteration < this.maxIterations) {\n stepAttempts++;\n iteration++;\n\n currentMessages.push({\n role: 'system',\n content: buildCurrentStepPrompt(plan, nextStep.index),\n });\n\n try {\n const response = await this.ai.chat(currentMessages, allTools);\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n content: response.content ?? null,\n ...(response.toolCalls.length > 0\n ? {\n tool_calls: response.toolCalls.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: { name: tc.name, arguments: JSON.stringify(tc.arguments) },\n })),\n }\n : {}),\n };\n\n currentMessages.push(assistantMsg);\n this.conversationHistory.push(assistantMsg);\n\n if (response.content) {\n yield { type: 'text', content: response.content };\n storeMessage({\n sessionId: this.sessionId,\n role: 'assistant',\n content: response.content,\n createdAt: Date.now(),\n });\n }\n\n const toolResults: { call: ToolCall; result: ToolResult }[] = [];\n\n for (const call of response.toolCalls) {\n yield { type: 'tool_call', tool: call.name, args: call.arguments };\n\n const result =\n call.name === 'run_parallel_task'\n ? await this.executeParallelTaskMetaCall(call.arguments, coordinator, toolCtx)\n : await this.tools.execute(call, toolCtx);\n toolResults.push({ call, result });\n\n if (call.name === 'run_parallel_task') {\n const events = extractMultiAgentEvents(result);\n for (const event of events) yield event;\n }\n\n yield { type: 'tool_result', tool: call.name, result };\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'tool_call',\n content: JSON.stringify({ name: call.name, args: call.arguments }),\n toolName: call.name,\n createdAt: Date.now(),\n });\n\n storeMessage({\n sessionId: this.sessionId,\n role: 'tool_result',\n content: JSON.stringify(result),\n toolName: call.name,\n createdAt: Date.now(),\n });\n\n currentMessages.push({\n role: 'tool',\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n this.conversationHistory.push({\n role: 'tool' as const,\n content: JSON.stringify(result),\n tool_call_id: call.id,\n });\n }\n\n const verificationFailures = await this.runVerificationChecks(toolResults, toolCtx);\n\n if (verificationFailures.length > 0) {\n const failureMessage = formatVerificationFailures(verificationFailures);\n currentMessages.push({ role: 'system', content: failureMessage });\n yield { type: 'text', content: failureMessage };\n\n if (stepAttempts > this.maxRetries) {\n plan = updateStepStatus(plan, nextStep.index, 'failed', failureMessage);\n yield { type: 'plan_progress', stepIndex: nextStep.index, status: 'failed' };\n stepDone = true;\n }\n\n continue;\n }\n\n const review = await critiqueStep({\n ai: this.ai,\n plan,\n stepIndex: nextStep.index,\n assistantText: response.content ?? '',\n toolResults,\n });\n\n if (review.verdict === 'done') {\n plan = updateStepStatus(plan, nextStep.index, 'done', review.summary);\n currentMessages.push({\n role: 'system',\n content: `Step complete: ${review.summary}`,\n });\n yield { type: 'plan_progress', stepIndex: nextStep.index, status: 'done' };\n stepDone = true;\n continue;\n }\n\n const feedback = formatCriticFeedback(review);\n currentMessages.push({ role: 'system', content: feedback });\n yield { type: 'text', content: feedback };\n\n if (review.verdict === 'blocked' || stepAttempts > this.maxRetries) {\n plan = updateStepStatus(plan, nextStep.index, 'failed', review.summary);\n yield { type: 'plan_progress', stepIndex: nextStep.index, status: 'failed' };\n stepDone = true;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n yield { type: 'error', message };\n plan = updateStepStatus(plan, nextStep.index, 'failed', message);\n yield { type: 'plan_progress', stepIndex: nextStep.index, status: 'failed' };\n stepDone = true;\n }\n }\n }\n\n yield { type: 'done' };\n }\n\n async *streamRun(\n userMessage: string,\n imageAttachment?: { base64: string; mimeType: string },\n ): AsyncGenerator<AgentEvent> {\n for await (const event of this.run(userMessage, imageAttachment)) {\n yield event;\n }\n }\n\n private createToolContext(): ToolContext {\n return {\n sendToStudio: <T = unknown>(type: string, payload: unknown, timeoutMs?: number): Promise<WsMessage<T>> => {\n return this.server.sendRequest<T>(type, payload, timeoutMs);\n },\n isStudioConnected: () => this.server.isConnected(),\n memory: {\n recall: (query: string, projectId: string, limit?: number) => {\n const { recallFacts } = require('../memory/store.js');\n const facts = recallFacts(projectId || this.projectId, query, limit);\n return facts.map((f: { content: string }) => f.content);\n },\n learn: (projectId: string, facts: { content: string; category: string }[]) => {\n const { storeFact } = require('../memory/store.js');\n const now = Date.now();\n for (const f of facts) {\n storeFact({\n projectId: projectId || this.projectId,\n content: f.content,\n category: f.category as any,\n source: 'agent',\n relevance: 1.0,\n createdAt: now,\n accessedAt: now,\n });\n }\n },\n getScriptIndex: (projectId: string) => {\n const { getScriptIndex } = require('../memory/store.js');\n return getScriptIndex(projectId || this.projectId);\n },\n },\n config: createConfigAccess(),\n };\n }\n\n private async runVerificationChecks(\n toolResults: { call: ToolCall; result: ToolResult }[],\n toolCtx: ToolContext,\n ): Promise<ToolResult[]> {\n const checks = toolResults.flatMap(({ call, result }) => inferVerifyChecks(call, result));\n const failures: ToolResult[] = [];\n\n for (const check of checks) {\n const verification = await verifyAction(check, toolCtx);\n if (!verification.success) {\n failures.push(verification);\n }\n }\n\n return failures;\n }\n\n private async executeParallelTaskMetaCall(\n args: Record<string, unknown>,\n coordinator: MultiAgentCoordinator,\n toolCtx: ToolContext,\n ): Promise<ToolResult> {\n const events: AgentEvent[] = [];\n const result = await coordinator.execute(normalizeParallelTaskArgs(args), toolCtx, (event) => {\n events.push(event);\n });\n\n return {\n success: result.verificationFailures.length === 0 && result.applied.every((item) => item.result.success),\n data: {\n ...result,\n events,\n summary: formatMultiAgentResult(result),\n },\n };\n }\n\n clearHistory(): void {\n this.conversationHistory = [];\n this.sessionId = nanoid();\n }\n}\n\nfunction normalizeParallelTaskArgs(args: Record<string, unknown>): ParallelTaskArgs {\n return {\n goal: String(args.goal ?? ''),\n rootPath: typeof args.rootPath === 'string' ? args.rootPath : undefined,\n maxWorkers: typeof args.maxWorkers === 'number' ? args.maxWorkers : undefined,\n constraints: typeof args.constraints === 'string' ? args.constraints : undefined,\n taskType: typeof args.taskType === 'string' ? args.taskType : undefined,\n };\n}\n\nfunction inferRootPath(userMessage: string): string | undefined {\n const match = userMessage.match(/\\b(?:StarterGui|PlayerGui|Workspace|ReplicatedStorage|ServerScriptService|StarterPlayer)(?:\\.[A-Za-z0-9_]+)*/);\n return match?.[0];\n}\n\nfunction formatMultiAgentResult(result: MultiAgentResult): string {\n const lines = [\n `Multi-agent task complete: ${result.goal}`,\n `Workers: ${result.assignments.length}`,\n `Accepted proposals: ${result.decision.accepted.length}`,\n `Rejected proposals: ${result.decision.rejected.length}`,\n `Applied tool calls: ${result.applied.length}`,\n `Verification failures: ${result.verificationFailures.length}`,\n ];\n\n for (const accepted of result.decision.accepted) {\n lines.push(`- ${accepted.workerId}: ${accepted.proposal.summary}`);\n }\n\n for (const rejected of result.decision.rejected) {\n lines.push(`- Rejected ${rejected.workerId}: ${rejected.reason}`);\n }\n\n return lines.join('\\n');\n}\n\nfunction extractMultiAgentEvents(result: ToolResult): AgentEvent[] {\n const data = result.data;\n if (!data || typeof data !== 'object') return [];\n\n const events = (data as { events?: unknown }).events;\n if (!Array.isArray(events)) return [];\n\n return events.filter((event): event is AgentEvent => {\n return event && typeof event === 'object' && 'type' in event;\n });\n}\n\nfunction buildExecutionContext(plan: ExecutionPlan): string {\n const lines = [\n 'You are operating in structured execution mode.',\n 'Follow the plan, stay aligned to the goal, and verify before moving on.',\n `Goal: ${plan.goal}`,\n `Task kind: ${plan.taskProfile.kind}`,\n `Fidelity: ${plan.taskProfile.fidelity}`,\n 'Acceptance criteria:',\n ...plan.acceptanceCriteria.map((item) => `- ${item}`),\n ];\n\n if (plan.notes.length > 0) {\n lines.push('Execution notes:');\n lines.push(...plan.notes.map((note) => `- ${note}`));\n }\n\n return lines.join('\\n');\n}\n\nfunction buildCurrentStepPrompt(plan: ExecutionPlan, stepIndex: number): string {\n const step = plan.steps[stepIndex];\n return [\n `Current step ${stepIndex + 1}/${plan.steps.length}: ${step.description}`,\n 'Focus on this step only.',\n 'Use Studio tools to gather evidence and make changes.',\n 'Prefer dedicated tools over run_code.',\n 'Before considering the step complete, produce evidence that it satisfies the relevant acceptance criteria.',\n plan.taskProfile.needsVisualAccuracy\n ? 'For UI fidelity work, do not approximate. Check exact layout, font, stroke, spacing, and hierarchy details.'\n : 'Keep the work tightly aligned to the requested outcome.',\n ].join('\\n');\n}\n\nfunction formatVerificationFailures(failures: ToolResult[]): string {\n const lines = ['Verification failed after the recent tool actions:'];\n for (const failure of failures) {\n lines.push(`- ${failure.error ?? 'Unknown verification failure'}`);\n }\n lines.push('Correct the mismatch before moving to the next plan step.');\n return lines.join('\\n');\n}\n\nfunction formatCriticFeedback(review: {\n summary: string;\n missingCriteria: string[];\n nextAction?: string;\n}): string {\n const lines = [`Critic review: ${review.summary}`];\n\n for (const item of review.missingCriteria) {\n lines.push(`- Missing: ${item}`);\n }\n\n if (review.nextAction) {\n lines.push(`Next action: ${review.nextAction}`);\n }\n\n return lines.join('\\n');\n}\n","import type { DominusRules } from '../config/config.js';\r\nimport type { Fact } from '../memory/types.js';\r\nimport { INTERNAL_MEMORY } from './internal-memory.js';\r\n\r\nexport function buildSystemPrompt(opts: {\r\n userName: string;\r\n connected: boolean;\r\n placeName?: string;\r\n placeId?: number;\r\n scriptIndex?: { path: string; summary?: string; className: string }[];\r\n facts?: Fact[];\r\n rules?: DominusRules;\r\n}): string {\r\n const parts: string[] = [];\r\n\r\n parts.push(`You are Dominus, an expert AI agent for Roblox Studio development.\r\nYou assist ${opts.userName} with building, debugging, and refactoring Roblox experiences.\r\n\r\nYou are deeply knowledgeable about:\r\n- Luau (Roblox's programming language): syntax, idioms, metatables, type annotations, coroutines\r\n- Roblox Engine API: all services (Players, Workspace, DataStoreService, ReplicatedStorage, etc.)\r\n- Roblox architecture patterns: client-server model, remotes, replication, DataStores\r\n- Common frameworks: Knit, ProfileService, Rodux, Roact, Fusion\r\n- Studio workflows: plugins, packages, team collaboration, testing\r\n- Performance: memory management, heartbeat optimization, streaming, LOD\r\n\r\nYou have direct access to Roblox Studio through tools. You can read/edit scripts, run code, browse the explorer tree, manage instances, and run tests -- all in real-time via WebSocket.\r\n\r\n## CRITICAL: NEVER use run_code for tasks that have a dedicated tool\r\nrun_code is a LAST RESORT. You have 30+ specialized tools — use them.\r\n- Reading properties → get_properties, get_descendants_properties\r\n- Inspecting selection → inspect_selection (ONE call returns paths + properties)\r\n- Inspecting an instance → inspect_instance (ONE call returns properties + children)\r\n- Converting UI to code → convert_ui_to_code (ONE call serializes + generates component)\r\n- Creating parts → create_part, build_multiple\r\n- Creating UI → create_ui\r\n- Modifying properties → set_properties, bulk_set_properties\r\n- Browsing the tree → get_explorer\r\n- Reading/editing scripts → read_script, edit_script\r\n- Serializing UI → serialize_ui\r\nOnly use run_code for: procedural generation, terrain algorithms, raycasting, physics queries, or other logic that no tool covers.\r\n\r\nWhen the user asks you to do something, you should:\r\n1. Use your tools to gather context (read scripts, check explorer, recall memory)\r\n2. Plan your approach for complex tasks\r\n3. Execute changes using the appropriate dedicated tools (NOT run_code unless truly necessary)\r\n4. Verify your changes worked (read back, check output for errors)\r\n5. Remember important facts for future sessions`);\r\n\r\n // Connection status\r\n if (opts.connected) {\r\n parts.push(`\\n## Current Session\r\n- Studio: CONNECTED${opts.placeName ? ` (${opts.placeName})` : ''}${opts.placeId ? ` [PlaceID: ${opts.placeId}]` : ''}\r\n- You can use all Studio tools.`);\r\n } else {\r\n parts.push(`\\n## Current Session\r\n- Studio: NOT CONNECTED\r\n- You cannot use Studio tools until the plugin connects.\r\n- You can still use memory tools and answer Roblox questions.`);\r\n }\r\n\r\n // Project index\r\n if (opts.scriptIndex?.length) {\r\n parts.push('\\n## Project Scripts');\r\n const lines = opts.scriptIndex.map(\r\n (s) => `- ${s.path} (${s.className})${s.summary ? `: ${s.summary}` : ''}`,\r\n );\r\n if (lines.length > 40) {\r\n parts.push(lines.slice(0, 40).join('\\n'));\r\n parts.push(`... and ${lines.length - 40} more scripts`);\r\n } else {\r\n parts.push(lines.join('\\n'));\r\n }\r\n }\r\n\r\n // Recalled facts\r\n if (opts.facts?.length) {\r\n parts.push('\\n## Remembered Context');\r\n for (const fact of opts.facts.slice(0, 20)) {\r\n parts.push(`- [${fact.category}] ${fact.content}`);\r\n }\r\n }\r\n\r\n // User rules\r\n if (opts.rules) {\r\n if (opts.rules.do.length > 0) {\r\n parts.push('\\n## Rules: DO');\r\n for (const rule of opts.rules.do) {\r\n parts.push(`- ${rule}`);\r\n }\r\n }\r\n if (opts.rules.dont.length > 0) {\r\n parts.push('\\n## Rules: DO NOT');\r\n for (const rule of opts.rules.dont) {\r\n parts.push(`- ${rule}`);\r\n }\r\n }\r\n if (opts.rules.conventions.length > 0) {\r\n parts.push('\\n## Coding Conventions');\r\n for (const conv of opts.rules.conventions) {\r\n parts.push(`- ${conv}`);\r\n }\r\n }\r\n if (opts.rules.context) {\r\n parts.push(`\\n## Project Context\\n${opts.rules.context}`);\r\n }\r\n }\r\n\r\n parts.push(`\\n## Tool Usage Guidelines\r\n- Always verify your work: after editing a script, read it back to confirm.\r\n- After running code, check the output for errors.\r\n- Use remember to store important facts you discover about the project.\r\n- Use recall_memory before complex tasks to check if you already know relevant context.\r\n- When searching scripts, be specific with your query terms.\r\n- For multi-step changes, explain your plan before executing.\r\n\r\n## Building & Construction\r\nWhen the user asks you to build or create objects (parts, trees, houses, terrain, etc.):\r\n\r\n**PREFER these builder tools over raw run_code:**\r\n- \\`create_part\\` — create a single part with position, size, color, material, shape in one call\r\n- \\`build_multiple\\` — create many parts in a single batch round-trip (FASTEST for complex builds)\r\n- \\`clone_instance\\` — duplicate an existing object, optionally offset/rename it\r\n- \\`group_instances\\` — organize parts into a Model or Folder\r\n- \\`set_properties\\` — adjust properties on existing instances (supports Vector3, Color3, enums, hex colors)\r\n\r\n**Why use builder tools instead of run_code?**\r\n- Tool calls are structured — the AI sends typed parameters, no string interpolation bugs\r\n- Properties are auto-coerced (hex → Color3, tables → Vector3, strings → Enum values)\r\n- \\`build_multiple\\` sends one batch of Luau to Studio, creating many parts in a single round-trip\r\n- Easier for the agent to plan, verify, and iterate\r\n\r\n**Building strategy:**\r\n1. For a single part: use \\`create_part\\`\r\n2. For multi-part objects (trees, buildings, vehicles): use \\`build_multiple\\` with \\`groupName\\`\r\n3. For repeating/duplicating: use \\`clone_instance\\` with offset\r\n4. For organizing: use \\`group_instances\\`\r\n5. Only fall back to \\`run_code\\` for complex logic (loops, raycasts, terrain generation algorithms)\r\n\r\n## GUI / UI Elements — CRITICAL\r\n**ALWAYS use \\`create_ui\\` for building UI.** It creates the entire UI tree in ONE call — no run_code, no get_class_info needed.\r\nDo NOT use run_code for UI creation. Do NOT call get_class_info before create_ui — it already handles all types natively.\r\n\r\n### UI Pre-Flight — ASK BEFORE BUILDING\r\nBefore creating any non-trivial UI (more than a single element), **ask the user these questions** to avoid rework:\r\n\r\n**A) Device scaling** — \"Should this UI scale for mobile/tablet, or is it PC-only?\"\r\n - If mobile-compatible: use Scale-based sizing (e.g. \\`[0.3, 0, 0.05, 0]\\`), add \\`UIAspectRatioConstraint\\` where needed, use \\`TextScaled = true\\` or sensible \\`AutomaticSize\\`, avoid fixed pixel sizes for main containers.\r\n - If PC-only: pixel offsets are fine.\r\n\r\n**B) ScreenGui structure** — \"Should all panels live in one ScreenGui, or separate ScreenGuis per panel?\"\r\n - One ScreenGui: simpler hierarchy, easier to show/hide everything at once.\r\n - Separate ScreenGuis: independent ZIndex control, can toggle individual panels, better for modular systems.\r\n\r\n**C) Font & style** — \"Any preferred font, color scheme, or style reference?\"\r\n - Default to \\`Roboto\\` if no preference stated. Use FontFace with Weight=\\`Bold\\` for bold variants.\r\n - If user provides a screenshot or reference, match its style closely (transparency, stroke, colors, spacing).\r\n\r\nSkip these questions only if the user has already specified preferences, or the task is trivially small (e.g. \"add a TextLabel\").\r\n\r\n\\`create_ui\\` takes a declarative JSON tree and builds everything in a single Studio round-trip:\r\n\\`\\`\\`json\r\n{\r\n \"parent\": \"StarterGui\",\r\n \"tree\": {\r\n \"ClassName\": \"ScreenGui\", \"Name\": \"MyUI\", \"ResetOnSpawn\": false,\r\n \"Children\": [\r\n { \"ClassName\": \"Frame\", \"Size\": [1, 0, 1, 0], \"BackgroundColor3\": \"#F0E6FF\",\r\n \"Children\": [\r\n { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 12] },\r\n { \"ClassName\": \"TextLabel\", \"Text\": \"Hello!\", \"Size\": [0.5, 0, 0.1, 0],\r\n \"Position\": [0.25, 0, 0.45, 0], \"BackgroundTransparency\": 1,\r\n \"TextColor3\": \"#6C5CE7\", \"TextScaled\": true, \"Font\": \"GothamBold\" }\r\n ]\r\n }\r\n ]\r\n }\r\n}\r\n\\`\\`\\`\r\n\r\nGUI classes use DIFFERENT property types than 3D parts:\r\n\r\n**Key type differences:**\r\n- GUI Size/Position = \\`UDim2\\` (NOT Vector3). Format: \\`{XScale: 0.5, XOffset: 0, YScale: 0.5, YOffset: 0}\\` or \\`[xScale, xOffset, yScale, yOffset]\\`\r\n- GUI AnchorPoint = \\`Vector2\\` = \\`{x: 0.5, y: 0.5}\\`\r\n- BackgroundColor3 = \\`Color3\\` = \\`\"#FF0000\"\\` or \\`{R: 1, G: 0, B: 0}\\` or \\`\"rgb(255,0,0)\"\\`\r\n- Font = \\`Font\\` = \\`{Family: \"rbxasset://fonts/families/SourceSansPro.json\", Weight: \"Bold\"}\\`\r\n- BorderSizePixel = \\`number\\`\r\n- TextSize = \\`number\\`\r\n- Enum properties (e.g., TextXAlignment) = string name like \\`\"Center\"\\`, \\`\"Left\"\\`\r\n\r\n**Property coercion handles automatically:**\r\n- UDim2: tables, arrays, \"0.5, 0, 0.3, 0\" strings\r\n- UDim: {Scale, Offset} or number\r\n- Vector3, Vector2, Color3, BrickColor, CFrame, Rect, NumberRange\r\n- NumberSequence, ColorSequence (for gradients)\r\n- All enum properties from string names\r\n- Color3 from hex \"#RRGGBB\", \"rgb(r,g,b)\", or BrickColor name strings\r\n\r\n## Serializing & Converting Existing UI\r\nWhen the user asks to convert, export, recreate, or turn an existing UI into a React/Roact component:\r\n\r\n**Use \\`serialize_ui\\` — NOT \\`get_descendants_properties\\`.**\r\n\\`serialize_ui\\` returns a clean, minimal JSON tree with only non-default properties, values already in JSON-friendly formats (hex colors, UDim2 arrays, enum names), and a proper parent-child hierarchy. It's purpose-built for this exact workflow.\r\n\r\n\\`get_descendants_properties\\` returns a flat list with ALL properties (including read-only, defaults, deprecated) — it's much larger and harder to convert.\r\n\r\n### Roblox UI → Roact/React Conversion Workflow\r\n1. Call \\`serialize_ui\\` with the path (e.g. \\`StarterGui.MyScreenGui.MyFrame\\`)\r\n2. The result is a tree like:\r\n\\`\\`\\`json\r\n{\r\n \"ClassName\": \"Frame\", \"Name\": \"MyFrame\",\r\n \"Size\": [0.5, 0, 0.3, 0], \"BackgroundColor3\": \"#1a1a2e\",\r\n \"Children\": [\r\n { \"ClassName\": \"UICorner\", \"CornerRadius\": [0, 8] },\r\n { \"ClassName\": \"TextLabel\", \"Name\": \"Title\", \"Text\": \"Hello\",\r\n \"Size\": [1, 0, 0.2, 0], \"TextColor3\": \"#ffffff\", \"BackgroundTransparency\": 1 }\r\n ]\r\n}\r\n\\`\\`\\`\r\n3. Convert to Roact/React-lua using these mappings:\r\n - Each JSON node → \\`Roact.createElement(ClassName, props, children)\\` or \\`React.createElement\\`\r\n - \\`UDim2\\` arrays \\`[xS, xO, yS, yO]\\` → \\`UDim2.new(xS, xO, yS, yO)\\`\r\n - \\`Color3\\` hex \\`\"#RRGGBB\"\\` → \\`Color3.fromHex(\"#RRGGBB\")\\`\r\n - \\`Vector2\\` arrays \\`[x, y]\\` → \\`Vector2.new(x, y)\\`\r\n - \\`UDim\\` arrays \\`[s, o]\\` → \\`UDim.new(s, o)\\`\r\n - Enum strings \\`\"Center\"\\` → \\`Enum.TextXAlignment.Center\\` (resolve the full enum path)\r\n - \\`Children\\` array → child elements table\r\n - UI modifiers (UICorner, UIStroke, UIGradient, UIListLayout, UIPadding, UIScale) → children of the parent element\r\n\r\n### Example Roact output:\r\n\\`\\`\\`lua\r\nlocal function MyFrame()\r\n return Roact.createElement(\"Frame\", {\r\n Size = UDim2.new(0.5, 0, 0.3, 0),\r\n BackgroundColor3 = Color3.fromHex(\"#1a1a2e\"),\r\n }, {\r\n Corner = Roact.createElement(\"UICorner\", {\r\n CornerRadius = UDim.new(0, 8),\r\n }),\r\n Title = Roact.createElement(\"TextLabel\", {\r\n Size = UDim2.new(1, 0, 0.2, 0),\r\n Text = \"Hello\",\r\n TextColor3 = Color3.fromHex(\"#ffffff\"),\r\n BackgroundTransparency = 1,\r\n }),\r\n })\r\nend\r\n\\`\\`\\`\r\n\r\n### Key rules for conversion:\r\n- Use the instance \\`Name\\` as the dictionary key in the children table\r\n- UI modifiers (UICorner, UIStroke, etc.) are CHILDREN, not props\r\n- Keep the exact property values from serialize_ui — don't guess or approximate\r\n- For Fusion: \\`New \"Frame\" { Size = UDim2.new(...), [Children] = { ... } }\\`\r\n- Preserve ZIndex ordering when relevant\r\n- FontFace objects → \\`Font.new(\"rbxasset://fonts/families/...\", Enum.FontWeight.Bold)\\`\r\n\r\n## ReflectionService\nThe \\`get_class_info\\` tool queries Roblox's ReflectionService to return the complete API surface for any class:\n- All properties with their exact ValueType\n- All methods with parameter names and types\n- All events with parameter types\n- Superclass, creatability, serialization info\n\nUse it whenever you're unsure about property names or types. It's fast and cached.\n\n## Roblox Creator Docs API Reference\nUse \\`search_roblox_api\\` and \\`get_roblox_api_reference\\` when you need documented Roblox engine API information:\n- Works even when Studio is not connected.\n- Covers classes, datatypes, enums, globals, and libraries from Roblox/creator-docs.\n- Includes summaries, descriptions, tags, deprecation notes, security, thread safety, parameters, and returns.\n- Prefer it before guessing unfamiliar APIs, enum values, datatype constructors, service methods, or deprecated members.\n- When Studio is connected and you need the live engine schema for a class, use \\`get_class_info\\`; when you need documentation and usage guidance, use \\`get_roblox_api_reference\\`.\n\n## Multi-Agent Coordination\nUse \\`run_parallel_task\\` for broad tasks that benefit from parallel inspection, such as organizing an entire UI, auditing a large system, or comparing several independent branches.\n- Worker agents are proposal-only: they inspect with read tools and propose scoped changes.\n- The coordinator owns all writes, checks path ownership, rejects conflicts, applies safe tool calls serially, and verifies results.\n- Prefer normal single-agent execution for small, direct edits.\n\n${INTERNAL_MEMORY}`);\n\r\n return parts.join('\\n');\r\n}\r\n","import type OpenAI from 'openai';\nimport { buildSystemPrompt } from './system-prompt.js';\nimport { recallFacts, getScriptIndex, getProjectSummaries } from '../memory/store.js';\nimport { loadConfig, loadRules } from '../config/config.js';\nimport { getContextWindow } from '../ai/models.js';\nimport type { StudioBridge } from '../transport/ws-server.js';\nimport type { ChatMessage } from '../memory/types.js';\n\nconst CHARS_PER_TOKEN = 4; // rough estimate\n\ninterface ContextBuildResult {\n messages: OpenAI.ChatCompletionMessageParam[];\n tokenEstimate: number;\n}\n\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\nexport function buildContext(opts: {\n userMessage: string;\n conversationHistory: OpenAI.ChatCompletionMessageParam[];\n server: StudioBridge;\n projectId: string;\n sessionId: string;\n}): ContextBuildResult {\n const config = loadConfig();\n const rules = loadRules();\n const contextWindow = getContextWindow(config.model);\n\n // Token budget allocation\n const systemBudget = Math.floor(contextWindow * 0.15);\n const memoryBudget = Math.floor(contextWindow * 0.15);\n const conversationBudget = Math.floor(contextWindow * 0.45);\n // 25% reserved for response + tool calls\n\n // Build system prompt\n const connInfo = opts.server.getConnectionInfo();\n const facts = recallFacts(opts.projectId, opts.userMessage, 15);\n const scriptIndex = getScriptIndex(opts.projectId);\n const summaries = getProjectSummaries(opts.projectId, 5);\n\n let systemPrompt = buildSystemPrompt({\n userName: config.userName,\n connected: opts.server.isConnected(),\n placeName: connInfo?.placeName,\n placeId: connInfo?.placeId,\n scriptIndex,\n facts,\n rules,\n });\n\n // Trim system prompt if over budget\n if (estimateTokens(systemPrompt) > systemBudget) {\n systemPrompt = systemPrompt.slice(0, systemBudget * CHARS_PER_TOKEN);\n }\n\n // Build conversation messages, trimming old ones if over budget\n const messages: OpenAI.ChatCompletionMessageParam[] = [\n { role: 'system', content: systemPrompt },\n ];\n\n // Add session summaries as context\n if (summaries.length > 0) {\n const summaryText = summaries\n .map((s) => s.summary)\n .join('\\n');\n if (estimateTokens(summaryText) <= memoryBudget) {\n messages.push({\n role: 'system',\n content: `Previous session summaries:\\n${summaryText}`,\n });\n }\n }\n\n // Add conversation history, newest first, respecting budget\n let historyTokens = 0;\n const historyMessages: OpenAI.ChatCompletionMessageParam[] = [];\n\n // Always include the current user message\n const currentMsg: OpenAI.ChatCompletionMessageParam = {\n role: 'user',\n content: opts.userMessage,\n };\n\n // Add historical messages from newest to oldest\n for (let i = opts.conversationHistory.length - 1; i >= 0; i--) {\n const msg = opts.conversationHistory[i];\n const content =\n typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n const tokens = estimateTokens(content);\n\n if (historyTokens + tokens > conversationBudget) break;\n historyTokens += tokens;\n historyMessages.unshift(msg);\n }\n\n messages.push(...historyMessages, currentMsg);\n\n const totalTokens = estimateTokens(\n messages.map((m) => (typeof m.content === 'string' ? m.content : '')).join(''),\n );\n\n return { messages, tokenEstimate: totalTokens };\n}\n\nexport function chatMessageToOpenAI(\n msg: ChatMessage,\n): OpenAI.ChatCompletionMessageParam | null {\n switch (msg.role) {\n case 'user':\n return { role: 'user', content: msg.content };\n case 'assistant':\n return { role: 'assistant', content: msg.content };\n case 'system':\n return { role: 'system', content: msg.content };\n case 'tool_result':\n return {\n role: 'tool' as const,\n content: msg.content,\n tool_call_id: msg.toolName ?? 'unknown',\n };\n default:\n return null;\n }\n}\n","import type { AIProviderType } from '../config/config.js';\n\nexport interface ModelInfo {\n id: string;\n name: string;\n contextWindow: number;\n supportsTools: boolean;\n provider: AIProviderType;\n}\n\nexport const POPULAR_MODELS: ModelInfo[] = [\n // --- OpenAI ---\n { id: 'gpt-5.3-codex', name: 'GPT-5.3 Codex', contextWindow: 256000, supportsTools: true, provider: 'openai' },\n { id: 'gpt-5.2', name: 'GPT-5.2', contextWindow: 256000, supportsTools: true, provider: 'openai' },\n { id: 'gpt-4o', name: 'GPT-4o', contextWindow: 128000, supportsTools: true, provider: 'openai' },\n { id: 'o3-mini', name: 'o3-mini', contextWindow: 200000, supportsTools: true, provider: 'openai' },\n\n // --- Anthropic ---\n { id: 'claude-opus-4-6', name: 'Claude Opus 4.6', contextWindow: 200000, supportsTools: true, provider: 'anthropic' },\n { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6', contextWindow: 200000, supportsTools: true, provider: 'anthropic' },\n\n // --- Google Gemini ---\n { id: 'gemini-3.1-pro', name: 'Gemini 3.1 Pro', contextWindow: 2097152, supportsTools: true, provider: 'gemini' },\n { id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', contextWindow: 1048576, supportsTools: true, provider: 'gemini' },\n\n // --- xAI / Grok ---\n { id: 'grok-4.2', name: 'Grok 4.2', contextWindow: 256000, supportsTools: true, provider: 'xai' },\n { id: 'grok-3', name: 'Grok 3', contextWindow: 131072, supportsTools: true, provider: 'xai' },\n\n // --- OpenRouter (routes to any model) ---\n { id: 'anthropic/claude-opus-4-6', name: 'Claude Opus 4.6', contextWindow: 200000, supportsTools: true, provider: 'openrouter' },\n { id: 'anthropic/claude-sonnet-4-6', name: 'Claude Sonnet 4.6', contextWindow: 200000, supportsTools: true, provider: 'openrouter' },\n { id: 'openai/gpt-5.3-codex', name: 'GPT-5.3 Codex', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'openai/gpt-5.2', name: 'GPT-5.2', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'google/gemini-3.1-pro', name: 'Gemini 3.1 Pro', contextWindow: 2097152, supportsTools: true, provider: 'openrouter' },\n { id: 'x-ai/grok-4.2', name: 'Grok 4.2', contextWindow: 256000, supportsTools: true, provider: 'openrouter' },\n { id: 'deepseek/deepseek-v3.2', name: 'DeepSeek V3.2', contextWindow: 1000000, supportsTools: true, provider: 'openrouter' },\n];\n\nexport function getModelInfo(modelId: string): ModelInfo | undefined {\n return POPULAR_MODELS.find((m) => m.id === modelId);\n}\n\nexport function getModelsForProvider(provider: AIProviderType): ModelInfo[] {\n return POPULAR_MODELS.filter((m) => m.provider === provider);\n}\n\nexport function getContextWindow(modelId: string): number {\n return getModelInfo(modelId)?.contextWindow ?? 128000;\n}\n","import type { AIProvider } from '../ai/provider.js';\nimport type { PlanStep } from '../tools/types.js';\nimport { parseJsonResponse } from './json-response.js';\nimport type { TaskProfile } from './task-profile.js';\n\nexport interface Plan {\n goal: string;\n steps: PlanStep[];\n createdAt: number;\n}\n\nexport interface ExecutionPlan extends Plan {\n acceptanceCriteria: string[];\n notes: string[];\n taskProfile: TaskProfile;\n}\n\r\nexport function createPlan(goal: string, stepDescriptions: string[]): Plan {\r\n return {\r\n goal,\r\n steps: stepDescriptions.map((desc) => ({\r\n description: desc,\r\n status: 'pending',\r\n })),\r\n createdAt: Date.now(),\r\n };\r\n}\r\n\r\nexport function updateStepStatus<T extends Plan>(\n plan: T,\n index: number,\n status: PlanStep['status'],\n result?: string,\n): T {\n if (index < 0 || index >= plan.steps.length) return plan;\n\n const steps = [...plan.steps];\n steps[index] = { ...steps[index], status, result };\n\n return { ...plan, steps };\n}\n\r\nexport function getNextPendingStep(plan: Plan): { index: number; step: PlanStep } | null {\r\n for (let i = 0; i < plan.steps.length; i++) {\r\n if (plan.steps[i].status === 'pending') {\r\n return { index: i, step: plan.steps[i] };\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nexport function isPlanComplete(plan: Plan): boolean {\r\n return plan.steps.every((s) => s.status === 'done' || s.status === 'failed');\r\n}\r\n\r\nexport function getPlanSummary(plan: Plan): string {\n const done = plan.steps.filter((s) => s.status === 'done').length;\n const failed = plan.steps.filter((s) => s.status === 'failed').length;\n const total = plan.steps.length;\n return `Plan: ${plan.goal} [${done}/${total} done${failed > 0 ? `, ${failed} failed` : ''}]`;\n}\n\nexport async function createExecutionPlan(opts: {\n ai: AIProvider;\n goal: string;\n taskProfile: TaskProfile;\n}): Promise<ExecutionPlan> {\n const prompt = [\n 'You are the Dominus planning module.',\n 'Turn the goal into a short execution plan with verifiable steps.',\n 'Return JSON only in this shape:',\n '{\"goal\":\"...\",\"steps\":[\"...\"],\"acceptanceCriteria\":[\"...\"],\"notes\":[\"...\"]}',\n '',\n `Goal: ${opts.goal}`,\n `Task kind: ${opts.taskProfile.kind}`,\n `Fidelity: ${opts.taskProfile.fidelity}`,\n `Needs visual accuracy: ${opts.taskProfile.needsVisualAccuracy ? 'yes' : 'no'}`,\n 'Existing acceptance criteria:',\n ...opts.taskProfile.acceptanceCriteria.map((item) => `- ${item}`),\n '',\n 'Planning rules:',\n '- Produce 3 to 6 steps.',\n '- Each step should be actionable and specific to Roblox Studio tool work.',\n '- Include at least one explicit verification-oriented step.',\n '- For UI fidelity tasks, include evidence gathering and read-back comparison.',\n '- Keep notes short and practical.',\n ].join('\\n');\n\n try {\n const response = await opts.ai.chat([{ role: 'system', content: prompt }]);\n const parsed = parseJsonResponse<{\n goal?: string;\n steps?: unknown[];\n acceptanceCriteria?: unknown[];\n notes?: unknown[];\n }>(response.content);\n\n if (!parsed) {\n return createFallbackExecutionPlan(opts.goal, opts.taskProfile);\n }\n\n return normalizeExecutionPlan(parsed, opts.goal, opts.taskProfile);\n } catch {\n return createFallbackExecutionPlan(opts.goal, opts.taskProfile);\n }\n}\n\nexport function createFallbackExecutionPlan(\n goal: string,\n taskProfile: TaskProfile,\n): ExecutionPlan {\n const steps =\n taskProfile.kind === 'ui_port'\n ? [\n 'Inspect the target UI requirements and identify the exact hierarchy and visual constraints.',\n 'Build or convert the Roblox UI using the dedicated UI tools.',\n 'Read back the resulting UI tree and key properties to compare against the target.',\n 'Fix any mismatches in layout, typography, stroke, spacing, or layering.',\n ]\n : taskProfile.kind === 'ui_build'\n ? [\n 'Inspect the relevant parent and any existing UI context.',\n 'Create the requested UI with the dedicated UI tools.',\n 'Verify the created hierarchy and important properties.',\n ]\n : taskProfile.kind === 'script_edit'\n ? [\n 'Read the relevant scripts and gather context before changing code.',\n 'Apply the requested code changes with dedicated tools.',\n 'Read the script back and run checks for errors or regressions.',\n ]\n : [\n 'Inspect the current Roblox context relevant to the request.',\n 'Execute the requested change with dedicated tools.',\n 'Verify the result before marking the task complete.',\n ];\n\n return {\n ...createPlan(goal, steps),\n acceptanceCriteria: [...taskProfile.acceptanceCriteria],\n notes: buildFallbackNotes(taskProfile),\n taskProfile,\n };\n}\n\nexport function formatExecutionPlan(plan: ExecutionPlan): string {\n const lines = [`Plan for: ${plan.goal}`];\n\n for (let i = 0; i < plan.steps.length; i++) {\n lines.push(`${i + 1}. ${plan.steps[i].description}`);\n }\n\n if (plan.acceptanceCriteria.length > 0) {\n lines.push('Acceptance criteria:');\n for (const criterion of plan.acceptanceCriteria) {\n lines.push(`- ${criterion}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction normalizeExecutionPlan(\n parsed: {\n goal?: string;\n steps?: unknown[];\n acceptanceCriteria?: unknown[];\n notes?: unknown[];\n },\n fallbackGoal: string,\n taskProfile: TaskProfile,\n): ExecutionPlan {\n const goal =\n typeof parsed.goal === 'string' && parsed.goal.trim() ? parsed.goal.trim() : fallbackGoal;\n\n const stepDescriptions = Array.isArray(parsed.steps)\n ? parsed.steps\n .map((step) => sanitizeLine(step))\n .filter(Boolean)\n .slice(0, 6)\n : [];\n\n const acceptanceCriteria = Array.isArray(parsed.acceptanceCriteria)\n ? parsed.acceptanceCriteria\n .map((item) => sanitizeLine(item))\n .filter(Boolean)\n .slice(0, 8)\n : [];\n\n const notes = Array.isArray(parsed.notes)\n ? parsed.notes\n .map((item) => sanitizeLine(item))\n .filter(Boolean)\n .slice(0, 6)\n : [];\n\n const fallback = createFallbackExecutionPlan(fallbackGoal, taskProfile);\n\n return {\n ...createPlan(\n goal,\n stepDescriptions.length >= 2\n ? stepDescriptions\n : fallback.steps.map((step) => step.description),\n ),\n acceptanceCriteria:\n acceptanceCriteria.length > 0 ? acceptanceCriteria : fallback.acceptanceCriteria,\n notes: notes.length > 0 ? notes : fallback.notes,\n taskProfile,\n };\n}\n\nfunction buildFallbackNotes(taskProfile: TaskProfile): string[] {\n if (taskProfile.kind === 'ui_port') {\n return [\n 'Do not treat visual approximation as success.',\n 'Use read-back evidence for UI properties before finishing.',\n ];\n }\n\n if (taskProfile.kind === 'script_edit') {\n return [\n 'Prefer reading existing code before rewriting it.',\n 'Verify script edits by reading them back.',\n ];\n }\n\n return ['Keep the agent aligned to the explicit user goal and verify important effects.'];\n}\n\nfunction sanitizeLine(value: unknown): string {\n return String(value ?? '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n","export type TaskKind = 'ui_port' | 'ui_build' | 'script_edit' | 'general';\n\nexport interface TaskProfile {\n kind: TaskKind;\n fidelity: 'normal' | 'strict';\n needsVisualAccuracy: boolean;\n cues: string[];\n acceptanceCriteria: string[];\n}\n\nconst UI_CUES = [\n 'ui',\n 'gui',\n 'screen',\n 'frame',\n 'textlabel',\n 'textbutton',\n 'imagebutton',\n 'imagelabel',\n 'html',\n 'css',\n 'react roblox',\n 'roact',\n 'fusion',\n];\n\nconst PORT_CUES = ['port', 'convert', 'copy', 'recreate', 'translate', 'match'];\nconst STRICT_CUES = [\n '1:1',\n 'exact',\n 'exactly',\n 'pixel perfect',\n 'pixel-perfect',\n 'identical',\n 'same sizing',\n 'same font',\n 'same stroke',\n 'same spacing',\n];\n\nexport function buildTaskProfile(userMessage: string): TaskProfile {\n const lower = userMessage.toLowerCase();\n const cues = new Set<string>();\n\n for (const cue of [...UI_CUES, ...PORT_CUES, ...STRICT_CUES]) {\n if (lower.includes(cue)) cues.add(cue);\n }\n\n const isUiTask = containsAny(lower, UI_CUES);\n const isPortTask = containsAny(lower, PORT_CUES);\n const strictFidelity = containsAny(lower, STRICT_CUES);\n\n if (isUiTask && (isPortTask || strictFidelity)) {\n return {\n kind: 'ui_port',\n fidelity: strictFidelity ? 'strict' : 'normal',\n needsVisualAccuracy: true,\n cues: Array.from(cues),\n acceptanceCriteria: [\n 'Recreate the same UI hierarchy and element structure.',\n 'Match sizing, position, anchors, spacing, and layout behavior.',\n 'Match fonts, weights, text sizing, alignment, and transparency.',\n 'Match strokes, borders, corner radii, gradients, and layering.',\n 'Read back or serialize the result instead of assuming it is correct.',\n ],\n };\n }\n\n if (isUiTask) {\n return {\n kind: 'ui_build',\n fidelity: strictFidelity ? 'strict' : 'normal',\n needsVisualAccuracy: strictFidelity,\n cues: Array.from(cues),\n acceptanceCriteria: [\n 'Create the requested UI structure in the correct parent.',\n 'Use appropriate scaling and layout properties for the requested target.',\n 'Verify the created UI tree and important properties after building.',\n ],\n };\n }\n\n if (containsAny(lower, ['script', 'module', 'refactor', 'fix bug', 'luau', 'code'])) {\n return {\n kind: 'script_edit',\n fidelity: 'normal',\n needsVisualAccuracy: false,\n cues: Array.from(cues),\n acceptanceCriteria: [\n 'Make the requested code change without drifting from the user goal.',\n 'Read back edited scripts after writing them.',\n 'Check for runtime or test errors when execution is involved.',\n ],\n };\n }\n\n return {\n kind: 'general',\n fidelity: strictFidelity ? 'strict' : 'normal',\n needsVisualAccuracy: false,\n cues: Array.from(cues),\n acceptanceCriteria: [\n 'Complete the user goal directly.',\n 'Prefer dedicated tools over generic execution.',\n 'Verify the effects of important changes before finishing.',\n ],\n };\n}\n\nfunction containsAny(text: string, cues: string[]): boolean {\n return cues.some((cue) => text.includes(cue));\n}\n","import type { AIProvider } from '../ai/provider.js';\nimport type { ToolCall, ToolResult } from '../tools/types.js';\nimport type { ExecutionPlan } from './planner.js';\nimport { parseJsonResponse } from './json-response.js';\n\nexport interface StepReview {\n verdict: 'done' | 'retry' | 'blocked';\n summary: string;\n missingCriteria: string[];\n nextAction?: string;\n}\n\nexport async function critiqueStep(opts: {\n ai: AIProvider;\n plan: ExecutionPlan;\n stepIndex: number;\n assistantText: string;\n toolResults: { call: ToolCall; result: ToolResult }[];\n}): Promise<StepReview> {\n const step = opts.plan.steps[opts.stepIndex];\n if (!step) {\n return {\n verdict: 'blocked',\n summary: 'No active step was available for critique.',\n missingCriteria: [],\n };\n }\n\n const prompt = [\n 'You are the Dominus alignment critic.',\n 'Decide whether the current plan step is actually complete, needs another attempt, or is blocked.',\n 'Be strict about missing evidence.',\n 'Return JSON only in this shape:',\n '{\"verdict\":\"done|retry|blocked\",\"summary\":\"...\",\"missingCriteria\":[\"...\"],\"nextAction\":\"...\"}',\n '',\n `Goal: ${opts.plan.goal}`,\n `Current step: ${step.description}`,\n `Task kind: ${opts.plan.taskProfile.kind}`,\n `Fidelity: ${opts.plan.taskProfile.fidelity}`,\n 'Acceptance criteria:',\n ...opts.plan.acceptanceCriteria.map((item) => `- ${item}`),\n '',\n 'Assistant summary:',\n opts.assistantText || '(no assistant summary)',\n '',\n 'Recent tool evidence:',\n JSON.stringify(summarizeToolResults(opts.toolResults), null, 2),\n '',\n 'Rules:',\n '- For UI fidelity tasks, missing evidence about sizing, fonts, strokes, spacing, or hierarchy should usually mean retry.',\n '- If there was a failed tool result or failed verification, prefer retry unless the task is clearly blocked.',\n '- Use blocked only when the step cannot continue without outside input or a missing dependency.',\n ].join('\\n');\n\n try {\n const response = await opts.ai.chat([{ role: 'system', content: prompt }]);\n const parsed = parseJsonResponse<Partial<StepReview>>(response.content);\n if (!parsed?.verdict || !parsed.summary) {\n return fallbackStepReview(opts);\n }\n\n return {\n verdict: normalizeVerdict(parsed.verdict),\n summary: parsed.summary.trim(),\n missingCriteria: Array.isArray(parsed.missingCriteria)\n ? parsed.missingCriteria.map((item) => String(item).trim()).filter(Boolean)\n : [],\n nextAction: typeof parsed.nextAction === 'string' ? parsed.nextAction.trim() : undefined,\n };\n } catch {\n return fallbackStepReview(opts);\n }\n}\n\nexport function fallbackStepReview(opts: {\n plan: ExecutionPlan;\n assistantText: string;\n toolResults: { call: ToolCall; result: ToolResult }[];\n}): StepReview {\n const failedResult = opts.toolResults.find(({ result }) => !result.success);\n if (failedResult) {\n return {\n verdict: 'retry',\n summary: `The ${failedResult.call.name} result failed, so the step should be retried after correction.`,\n missingCriteria: ['Resolve the failing tool or verification result.'],\n nextAction: `Inspect and fix the failure from ${failedResult.call.name}.`,\n };\n }\n\n if (opts.plan.taskProfile.needsVisualAccuracy && opts.toolResults.length === 0) {\n return {\n verdict: 'retry',\n summary: 'A visual fidelity step needs concrete evidence from Studio tools before it can be considered done.',\n missingCriteria: ['Collect read-back evidence for the relevant UI properties or tree.'],\n nextAction: 'Inspect or serialize the UI and compare it against the requested target.',\n };\n }\n\n if (!opts.assistantText.trim() && opts.toolResults.length === 0) {\n return {\n verdict: 'blocked',\n summary: 'The step produced neither explanation nor tool evidence.',\n missingCriteria: ['Produce a concrete action or explain the blocker.'],\n };\n }\n\n return {\n verdict: 'done',\n summary: 'The step produced enough evidence to continue.',\n missingCriteria: [],\n };\n}\n\nfunction summarizeToolResults(toolResults: { call: ToolCall; result: ToolResult }[]) {\n return toolResults.map(({ call, result }) => ({\n tool: call.name,\n args: trimJson(call.arguments),\n success: result.success,\n error: result.error,\n data: trimJson(result.data),\n }));\n}\n\nfunction trimJson(value: unknown): unknown {\n if (value == null) return value;\n\n const raw = JSON.stringify(value);\n if (raw.length <= 1200) return value;\n\n return `${raw.slice(0, 1200)}...`;\n}\n\nfunction normalizeVerdict(value: string): StepReview['verdict'] {\n if (value === 'done' || value === 'retry' || value === 'blocked') return value;\n return 'retry';\n}\n","import fs from 'node:fs';\r\nimport path from 'node:path';\r\nimport os from 'node:os';\r\nimport https from 'node:https';\r\nimport { execSync } from 'node:child_process';\r\n\r\nconst CACHE_DIR = path.join(os.homedir(), '.dominus');\r\nconst CACHE_FILE = path.join(CACHE_DIR, 'update-check.json');\r\nconst CHECK_INTERVAL_MS = 4 * 60 * 60 * 1000; // 4 hours\r\nconst NPM_PACKAGE = 'dominus-cli';\r\n\r\ninterface UpdateCache {\r\n lastCheck: number;\r\n latestVersion: string | null;\r\n}\r\n\r\nfunction readCache(): UpdateCache {\r\n try {\r\n if (fs.existsSync(CACHE_FILE)) {\r\n return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8'));\r\n }\r\n } catch {}\r\n return { lastCheck: 0, latestVersion: null };\r\n}\r\n\r\nfunction writeCache(cache: UpdateCache): void {\r\n try {\r\n if (!fs.existsSync(CACHE_DIR)) fs.mkdirSync(CACHE_DIR, { recursive: true });\r\n fs.writeFileSync(CACHE_FILE, JSON.stringify(cache), 'utf-8');\r\n } catch {}\r\n}\r\n\r\nfunction fetchLatestVersion(): Promise<string | null> {\r\n return new Promise((resolve) => {\r\n const req = https.get(\r\n `https://registry.npmjs.org/${NPM_PACKAGE}/latest`,\r\n { headers: { Accept: 'application/json' }, timeout: 5000 },\r\n (res) => {\r\n if (res.statusCode !== 200) { resolve(null); res.resume(); return; }\r\n let body = '';\r\n res.on('data', (c) => (body += c));\r\n res.on('end', () => {\r\n try { resolve(JSON.parse(body).version ?? null); }\r\n catch { resolve(null); }\r\n });\r\n },\r\n );\r\n req.on('error', () => resolve(null));\r\n req.on('timeout', () => { req.destroy(); resolve(null); });\r\n });\r\n}\r\n\r\nfunction compareVersions(current: string, latest: string): number {\r\n const a = current.split('.').map(Number);\r\n const b = latest.split('.').map(Number);\r\n for (let i = 0; i < 3; i++) {\r\n if ((b[i] ?? 0) > (a[i] ?? 0)) return 1;\r\n if ((b[i] ?? 0) < (a[i] ?? 0)) return -1;\r\n }\r\n return 0;\r\n}\r\n\r\nexport interface UpdateInfo {\r\n updateAvailable: boolean;\r\n currentVersion: string;\r\n latestVersion: string;\r\n}\r\n\r\n/**\r\n * Non-blocking update check. Fires off a network request in the background\r\n * and returns immediately if the cache is fresh. Never throws.\r\n */\r\nexport async function checkForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\r\n try {\r\n const cache = readCache();\r\n const now = Date.now();\r\n\r\n if (now - cache.lastCheck < CHECK_INTERVAL_MS && cache.latestVersion) {\r\n if (compareVersions(currentVersion, cache.latestVersion) > 0) {\r\n return { updateAvailable: true, currentVersion, latestVersion: cache.latestVersion };\r\n }\r\n return null;\r\n }\r\n\r\n const latest = await fetchLatestVersion();\r\n writeCache({ lastCheck: now, latestVersion: latest });\r\n\r\n if (latest && compareVersions(currentVersion, latest) > 0) {\r\n return { updateAvailable: true, currentVersion, latestVersion: latest };\r\n }\r\n } catch {}\r\n return null;\r\n}\r\n\r\nexport function formatUpdateMessage(info: UpdateInfo): string {\r\n const line1 = `Update available: ${info.currentVersion} → ${info.latestVersion}`;\r\n const line2 = `Run: npm i -g ${NPM_PACKAGE}`;\r\n const width = Math.max(line1.length, line2.length) + 4;\r\n const pad = (s: string) => ` │ ${s}${' '.repeat(width - s.length - 4)} │`;\r\n return [\r\n '',\r\n ` ╭${'─'.repeat(width)}╮`,\r\n pad(line1),\r\n pad(line2),\r\n ` ╰${'─'.repeat(width)}╯`,\r\n '',\r\n ].join('\\n');\r\n}\r\n\r\n/**\r\n * Auto-update: detects the package manager used to install dominus-cli\r\n * and runs the appropriate update command. Returns true if the update succeeded.\r\n */\r\nexport async function autoUpdate(currentVersion: string): Promise<{ success: boolean; from: string; to: string; error?: string }> {\r\n const info = await checkForUpdate(currentVersion);\r\n if (!info?.updateAvailable) {\r\n return { success: true, from: currentVersion, to: currentVersion };\r\n }\r\n\r\n // Detect which package manager installed us\r\n const managers = [\r\n { name: 'pnpm', check: 'pnpm list -g dominus-cli', cmd: 'pnpm add -g dominus-cli@latest' },\r\n { name: 'npm', check: 'npm list -g dominus-cli', cmd: 'npm install -g dominus-cli@latest' },\r\n { name: 'yarn', check: 'yarn global list --pattern dominus-cli', cmd: 'yarn global add dominus-cli@latest' },\r\n ];\r\n\r\n let installCmd: string | null = null;\r\n for (const mgr of managers) {\r\n try {\r\n const out = execSync(mgr.check, { stdio: 'pipe', timeout: 10000 }).toString();\r\n if (out.includes('dominus-cli')) {\r\n installCmd = mgr.cmd;\r\n break;\r\n }\r\n } catch {}\r\n }\r\n\r\n // Check if we're a linked install (dev workflow)\r\n if (!installCmd) {\r\n try {\r\n const out = execSync('pnpm list -g dominus-cli', { stdio: 'pipe', timeout: 10000 }).toString();\r\n if (out.includes('link:')) {\r\n // Linked install — pull + rebuild\r\n const pkgPath = path.resolve(__dirname, '..');\r\n if (fs.existsSync(path.join(pkgPath, '.git'))) {\r\n try {\r\n execSync('git pull', { cwd: pkgPath, stdio: 'pipe', timeout: 30000 });\r\n execSync('pnpm install', { cwd: pkgPath, stdio: 'pipe', timeout: 60000 });\r\n execSync('pnpm build', { cwd: pkgPath, stdio: 'pipe', timeout: 60000 });\r\n execSync('pnpm build:plugin', { cwd: pkgPath, stdio: 'pipe', timeout: 30000 });\r\n return { success: true, from: currentVersion, to: info.latestVersion };\r\n } catch (err) {\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: `Git pull/rebuild failed: ${err}` };\r\n }\r\n }\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: 'Linked install without git — run \"pnpm build\" manually in the repo' };\r\n }\r\n } catch {}\r\n }\r\n\r\n if (!installCmd) {\r\n installCmd = `npm install -g ${NPM_PACKAGE}@latest`;\r\n }\r\n\r\n try {\r\n execSync(installCmd, { stdio: 'pipe', timeout: 120000 });\r\n // Clear the update cache so next run shows the new version\r\n writeCache({ lastCheck: 0, latestVersion: null });\r\n return { success: true, from: currentVersion, to: info.latestVersion };\r\n } catch (err) {\r\n return { success: false, from: currentVersion, to: info.latestVersion, error: `Update command failed: ${err}` };\r\n }\r\n}\r\n\r\n// Needed for linked install detection\r\nconst __dirname = path.dirname(new URL(import.meta.url).pathname.replace(/^\\/([A-Z]:)/, '$1'));\r\n"]}
|