{"version":3,"sources":["../src/use-chat-session.ts","../src/entity-chat.tsx","../src/entity-copilot.tsx","../src/entity-stream.tsx","../src/use-entity-diff.ts","../src/entity-diff.tsx","../src/entity-approval.tsx","../src/entity-tool-provider.tsx"],"names":["useState","useRef","jsx","useEffect","jsxs","applyAgUiSnapshot","applyAgUiDelta","Fragment","useCallback","React"],"mappings":";;;;;;AA8BA,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,GAAG,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC7E;AAEA,SAAS,MAAA,GAAiB;AACxB,EAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAChC;AA0BO,SAAS,eAAe,IAAA,EAAmD;AAChF,EAAA,MAAM,EAAE,WAAW,aAAA,EAAe,QAAA,GAAW,EAAC,EAAG,YAAA,EAAc,SAAA,EAAW,OAAA,EAAQ,GAAI,IAAA;AAEtF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,IAAa,UAAA,EAAY,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,OAA+B,IAAI,CAAA;AAEpD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAAwB,EAAE,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,qBAAA,GAAwB,WAAA,CAAY,CAAC,GAAA,KAAqB;AAC9D,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,IAAI,EAAE,CAAA;AACjD,MAAA,IAAI,QAAQ,EAAA,EAAI,OAAO,CAAC,GAAG,MAAM,GAAG,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AACZ,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,OAAO,MAAA,KAAuC;AAC5C,MAAA,MAAM,aAAsC,EAAC;AAG7C,MAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAiD;AAE9E,MAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,QAAA,QAAQ,MAAM,IAAA;AAAM,UAClB,KAAK,eAAA,EAAiB;AACpB,YAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACtB,YAAA,qBAAA,CAAsB;AAAA,cACpB,IAAI,KAAA,CAAM,SAAA;AAAA,cACV,IAAA,EAAM,WAAA;AAAA,cACN,OAAA,EAAS,EAAA;AAAA,cACT,WAAW,MAAA,EAAO;AAAA,cAClB,SAAA,EAAW;AAAA,aACZ,CAAA;AACD,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,eAAA,EAAiB;AACpB,YAAA,IAAI,CAAC,KAAA,CAAM,SAAA,IAAa,CAAC,MAAM,KAAA,EAAO;AACtC,YAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,cAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAM,SAAS,CAAA;AAC1D,cAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,IAAA;AACvB,cAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AACrB,cAAA,IAAA,CAAK,GAAG,CAAA,GAAI,EAAE,GAAG,IAAA,CAAK,GAAG,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,GAAG,CAAA,CAAE,OAAA,GAAU,MAAM,KAAA,EAAM;AACrE,cAAA,OAAO,IAAA;AAAA,YACT,CAAC,CAAA;AACD,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,aAAA,EAAe;AAClB,YAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACtB,YAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,cAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAM,SAAS,CAAA;AAC1D,cAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,IAAA;AACvB,cAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AACrB,cAAA,MAAM,YAAY,EAAE,GAAG,KAAK,GAAG,CAAA,EAAG,WAAW,KAAA,EAAM;AACnD,cAAA,IAAA,CAAK,GAAG,CAAA,GAAI,SAAA;AACZ,cAAA,SAAA,GAAY,SAAS,CAAA;AACrB,cAAA,OAAO,IAAA;AAAA,YACT,CAAC,CAAA;AACD,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,iBAAA,EAAmB;AACtB,YAAA,IAAI,CAAC,MAAM,UAAA,EAAY;AAEvB,YAAA,gBAAA,CAAiB,GAAA,CAAI,MAAM,UAAA,EAAY;AAAA,cACrC,IAAA,EAAM,MAAM,QAAA,IAAY,EAAA;AAAA,cACxB,SAAA,EAAW;AAAA,aACZ,CAAA;AACD,YAAA,IAAI,MAAM,SAAA,EAAW;AACnB,cAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,gBAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAM,SAAS,CAAA;AAC1D,gBAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,IAAA;AACvB,gBAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AACrB,gBAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAG,CAAA,CAAE,aAAa,EAAC;AACzC,gBAAA,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,kBACV,GAAG,KAAK,GAAG,CAAA;AAAA,kBACX,SAAA,EAAW;AAAA,oBACT,GAAG,QAAA;AAAA,oBACH;AAAA,sBACE,IAAI,KAAA,CAAM,UAAA;AAAA,sBACV,IAAA,EAAM,UAAA;AAAA,sBACN,UAAU,EAAE,IAAA,EAAM,MAAM,QAAA,IAAY,EAAA,EAAI,WAAW,EAAA;AAAG;AACxD;AACF,iBACF;AACA,gBAAA,OAAO,IAAA;AAAA,cACT,CAAC,CAAA;AAAA,YACH;AACA,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,iBAAA,EAAmB;AACtB,YAAA,IAAI,CAAC,KAAA,CAAM,UAAA,IAAc,CAAC,MAAM,aAAA,EAAe;AAE/C,YAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AAChD,YAAA,IAAI,EAAA,EAAI;AACN,cAAA,EAAA,CAAG,aAAa,KAAA,CAAM,aAAA;AAAA,YACxB;AACA,YAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,cAAA,MAAM,SAAS,IAAA,CAAK,SAAA;AAAA,gBAAU,CAAC,CAAA,KAC7B,CAAA,CAAE,SAAA,EAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAA,CAAM,UAAU;AAAA,eACpD;AACA,cAAA,IAAI,MAAA,KAAW,IAAI,OAAO,IAAA;AAC1B,cAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AACrB,cAAA,MAAM,GAAA,GAAM,KAAK,MAAM,CAAA;AACvB,cAAA,IAAA,CAAK,MAAM,CAAA,GAAI;AAAA,gBACb,GAAG,GAAA;AAAA,gBACH,SAAA,EAAA,CAAY,GAAA,CAAI,SAAA,IAAa,EAAC,EAAG,GAAA;AAAA,kBAAI,CAAC,CAAA,KACpC,CAAA,CAAE,EAAA,KAAO,MAAM,UAAA,GACX;AAAA,oBACE,GAAG,CAAA;AAAA,oBACH,QAAA,EAAU;AAAA,sBACR,GAAG,CAAA,CAAE,QAAA;AAAA,sBACL,SAAA,EAAW,CAAA,CAAE,QAAA,CAAS,SAAA,IAAa,MAAM,aAAA,IAAiB,EAAA;AAAA;AAC5D,mBACF,GACA;AAAA;AACN,eACF;AACA,cAAA,OAAO,IAAA;AAAA,YACT,CAAC,CAAA;AACD,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,eAAA,EAAiB;AACpB,YAAA,IAAI,CAAC,KAAA,CAAM,UAAA,IAAc,CAAC,YAAA,EAAc;AACxC,YAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AACtD,YAAA,IAAI,CAAC,QAAA,EAAU;AACf,YAAA,gBAAA,CAAiB,MAAA,CAAO,MAAM,UAAU,CAAA;AAExC,YAAA,IAAI;AACF,cAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,aAAa,IAAI,CAAA;AAClD,cAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,WAAA,CAAY;AAAA,gBAC5C,YAAY,KAAA,CAAM,UAAA;AAAA,gBAClB,MAAM,QAAA,CAAS,IAAA;AAAA,gBACf,SAAA,EAAW;AAAA,eACZ,CAAA;AACD,cAAA,MAAM,OAAA,GAAuB;AAAA,gBAC3B,IAAI,UAAA,EAAW;AAAA,gBACf,IAAA,EAAM,MAAA;AAAA,gBACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAAA,gBACrC,WAAW,MAAA,EAAO;AAAA,gBAClB,YAAY,KAAA,CAAM;AAAA,eACpB;AACA,cAAA,qBAAA,CAAsB,OAAO,CAAA;AAAA,YAC/B,SAAS,GAAA,EAAK;AACZ,cAAA,MAAM,UAAA,GAA0B;AAAA,gBAC9B,IAAI,UAAA,EAAW;AAAA,gBACf,IAAA,EAAM,MAAA;AAAA,gBACN,OAAA,EAAS,KAAK,SAAA,CAAU,EAAE,OAAO,MAAA,CAAO,GAAG,GAAG,CAAA;AAAA,gBAC9C,WAAW,MAAA,EAAO;AAAA,gBAClB,YAAY,KAAA,CAAM;AAAA,eACpB;AACA,cAAA,qBAAA,CAAsB,UAAU,CAAA;AAAA,YAClC;AACA,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,gBAAA,EAAkB;AACrB,YAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACrB,YAAA,iBAAA;AAAA,cACE,EAAE,IAAA,EAAM,gBAAA,EAAkB,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,cACnD,EAAE,QAAA;AAAS,aACb;AACA,YAAA,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,KAAA,CAAM,QAAQ,CAAA;AACxC,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,aAAA,EAAe;AAClB,YAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAClB,YAAA,cAAA;AAAA,cACE;AAAA,gBACE,IAAA,EAAM,aAAA;AAAA,gBACN,OAAO,KAAA,CAAM;AAAA,eACf;AAAA,cACA,EAAE,QAAA,EAAS;AAAA,cACX,OAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa;AAAA,aACpD;AACA,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,OAAA,EAAS;AACZ,YAAA,MAAM,GAAA,GAAM,MAAM,KAAA,IAAS,cAAA;AAC3B,YAAA,QAAA,CAAS,GAAG,CAAA;AACZ,YAAA,OAAA,GAAU,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AACxB,YAAA;AAAA,UACF;AAME;AACJ,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,qBAAA,EAAuB,QAAA,EAAU,YAAA,EAAc,WAAW,OAAO;AAAA,GACpE;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,OAAO,OAAA,KAAoB;AACzB,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AACxB,MAAA,QAAA,CAAS,OAAA,GAAU,IAAI,eAAA,EAAgB;AAEvC,MAAA,MAAM,OAAA,GAAuB;AAAA,QAC3B,IAAI,UAAA,EAAW;AAAA,QACf,IAAA,EAAM,MAAA;AAAA,QACN,OAAA;AAAA,QACA,WAAW,MAAA;AAAO,OACpB;AAGA,MAAA,IAAI,kBAAiC,EAAC;AACtC,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,QAAA,eAAA,GAAkB,CAAC,GAAG,IAAA,EAAM,OAAO,CAAA;AACnC,QAAA,OAAO,eAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AAEF,QAAA,MAAM,QAAQ,OAAA,EAAQ;AACtB,QAAA,MAAM,GAAA,GAAM,cAAc,eAAe,CAAA;AACzC,QAAA,MAAM,QAAA,GACJ,GAAA,YAAe,cAAA,GACV,GAAA,GACD,GAAA;AAEN,QAAA,MAAM,cAAc,QAAQ,CAAA;AAAA,MAC9B,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,OAAA,GAAU,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,MACvD,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,aAAA,EAAe,OAAO;AAAA,GACxC;AAEA,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AACxB,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAuB;AAAA,IAC3B,IAAI,KAAA,CAAM,OAAA;AAAA,IACV,QAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,aAAA,EAAc;AAC/C;AChRA,SAAS,sBAAA,GAA6C;AACpD,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,YAAA,EAAW,qBAAA,EAAsB,MAAK,QAAA,EAC1C,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EAAW,CAAA;AAAA,oBAC3B,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,oBAC3B,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW;AAAA,GAAA,EAC7B,CAAA;AAEJ;AAEA,SAAS,aAAA,CAAc;AAAA,EACrB,OAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd;AACF,CAAA,EAIuB;AACrB,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,aAAA,CAAc,OAAO,CAAA,EAAE,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,IAAA,EAAM,WAAW,WAAA,IAAe,gBAAA;AAAA,IAChC,SAAA,EAAW,WAAW,gBAAA,IAAoB,qBAAA;AAAA,IAC1C,IAAA,EAAM,WAAW,WAAA,IAAe,gBAAA;AAAA,IAChC,MAAA,EAAQ,WAAW,aAAA,IAAiB;AAAA,GACtC,CAAE,OAAA,CAAQ,IAAI,CAAA,IAAK,EAAA;AAEnB,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,UAAA,CAAW,OAAA,IAAW,UAAA,EAAY,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACjF,aAAW,OAAA,CAAQ,IAAA;AAAA,MACnB,mBAAiB,OAAA,CAAQ,EAAA;AAAA,MAEzB,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,UAAA,CAAW,kBAAkB,mBAAA,EAC3C,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,OAAA;AAAA,QACR,OAAA,CAAQ,6BACP,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kBAAA,EAAmB,aAAA,EAAY,QAAO,QAAA,EAAA,QAAA,EAAC;AAAA,OAAA,EAE3D;AAAA;AAAA,GACF;AAEJ;AAcO,SAAS,UAAA,CAAW;AAAA,EACzB,aAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,qBAAA;AAAA,EACA,WAAA,GAAc,sBAAA;AAAA,EACd,aAAa,EAAC;AAAA,EACd;AACF,CAAA,EAAwC;AACtC,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,cAAA,CAAe;AAAA,IAC9C,aAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,OAAA,GAAUC,OAAyB,IAAI,CAAA;AAG7C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AACnB,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,EAAA,CAAG,YAAY,EAAA,CAAG,YAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAErB,EAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAkB;AAC5C,IAAA,CAAA,EAAG,cAAA,EAAe;AAClB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,EAAK;AACxB,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAA,CAAQ,SAAA,EAAW;AAChC,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,MAAM,YAAY,IAAI,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA0C;AAC/D,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,KAAK,YAAA,EAAa;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,UAAA,CAAW,IAAA,IAAQ,WAAA,EAAa,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAC/E,YAAA,EAAW,aAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,OAAA;AAAA,YACL,SAAA,EAAW,WAAW,WAAA,IAAe,qBAAA;AAAA,YACrC,WAAA,EAAU,QAAA;AAAA,YACV,eAAA,EAAc,WAAA;AAAA,YAEb,QAAA,EAAA;AAAA,cAAA,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,qBACrB,GAAA;AAAA,gBAAC,aAAA;AAAA,gBAAA;AAAA,kBAEC,OAAA,EAAS,GAAA;AAAA,kBACT,UAAA;AAAA,kBACA;AAAA,iBAAA;AAAA,gBAHK,GAAA,CAAI;AAAA,eAKZ,CAAA;AAAA,cACA,OAAA,CAAQ,aAAa,CAAC,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,wBAC5D,IAAA,EAAA,EAAG,WAAA,EAAU,UAAS,SAAA,EAAU,2BAAA,EAC9B,kCAAwB,qBAAA,EAAsB,mBAAI,GAAA,CAAC,sBAAA,EAAA,EAAuB,CAAA,EAC7E;AAAA;AAAA;AAAA,SAEJ;AAAA,QAEC,QAAQ,KAAA,oBACP,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,WAAW,SAAA,IAAa,oDAAA;AAAA,YACnC,IAAA,EAAK,OAAA;AAAA,YAEJ,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,SACX;AAAA,wBAGF,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,WAAW,QAAA,IAAY,sBAAA;AAAA,YAClC,QAAA,EAAU,CAAC,CAAA,KAAM,KAAK,aAAa,CAAC,CAAA;AAAA,YACpC,YAAA,EAAW,gBAAA;AAAA,YAEX,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,WAAW,KAAA,IAAS,kBAAA;AAAA,kBAC/B,KAAA,EAAO,KAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBACxC,SAAA,EAAW,aAAA;AAAA,kBACX,WAAA;AAAA,kBACA,UAAU,OAAA,CAAQ,SAAA;AAAA,kBAClB,IAAA,EAAM,CAAA;AAAA,kBACN,YAAA,EAAW;AAAA;AAAA,eACb;AAAA,8BACA,GAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAW,WAAW,UAAA,IAAc,iBAAA;AAAA,kBACpC,QAAA,EAAU,CAAC,KAAA,CAAM,IAAA,MAAU,OAAA,CAAQ,SAAA;AAAA,kBACnC,YAAA,EAAW,cAAA;AAAA,kBACZ,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AC5LA,SAAS,cAAA,CAAe;AAAA,EACtB,KAAA;AAAA,EACA;AACF,CAAA,EAGuB;AACrB,EAAA,uBACEC,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,oBAAA;AAAA,MACV,OAAA;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAkBO,SAAS,aAAA,CAAc;AAAA,EAC5B,aAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA,GAAQ,YAAA;AAAA,EACR,WAAA,GAAc,oBAAA;AAAA,EACd,IAAA,GAAO,IAAA;AAAA,EACP,OAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAc;AAChB,CAAA,EAAkD;AAChD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACEA,GAAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,aAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAGA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,aAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAc;AAChB,CAAA,EAAuH;AACrH,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,cAAA,CAAe;AAAA,IAC9C,aAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIF,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,SAAA,GAAYC,OAAuB,IAAI,CAAA;AAE7C,EAAAE,UAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,EAAS,cAAA,CAAe,EAAE,QAAA,EAAU,UAAU,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAGrB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAa;AAC9B,MAAA,IAAK,CAAA,CAAiC,GAAA,KAAQ,QAAA,EAAU,OAAA,IAAU;AAAA,IACpE,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,YAAA,GAAe,OAAO,IAAA,KAAiB;AAC3C,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,SAAA,EAAW;AACnC,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,MAAM,YAAY,OAAO,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAAiB;AACzC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,KAAK,aAAa,KAAK,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA0C;AAC/D,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,KAAK,aAAa,KAAK,CAAA;AAAA,IACzB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,MAAA,KAAW,CAAA;AAE5C,EAAA,uBACEC,IAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,cAAA,EAAgB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAC/D,IAAA,EAAK,eAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,sBAAA,EAChB,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAC5C,2BACCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,qBAAA;AAAA,cACV,OAAA,EAAS,OAAA;AAAA,cACT,YAAA,EAAW,eAAA;AAAA,cACZ,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EAEJ,CAAA;AAAA,wBAEAE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAA,IAAW,WAAA,CAAY,MAAA,GAAS,CAAA,oBAC/BF,GAAAA,CAAC,SAAI,SAAA,EAAU,2BAAA,EAA4B,IAAA,EAAK,MAAA,EAAO,YAAA,EAAW,mBAAA,EAC/D,sBAAY,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACnBA,GAAAA,CAAC,SAAI,IAAA,EAAK,UAAA,EACP,QAAA,EAAA,gBAAA,GACC,gBAAA,CAAiB,EAAE,EAAA,EAAI,OAAO,CAAC,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,CAAA,EAAG,WAAW,EAAA,EAAG,EAAG,CAAC,CAAA,mBAE9EA,GAAAA,CAAC,kBAAe,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,MAAM,KAAK,YAAA,CAAa,CAAC,CAAA,EAAG,CAAA,EAAA,EAJzC,CAM1B,CACD,CAAA,EACH,CAAA;AAAA,0BAGFE,KAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0BAAyB,WAAA,EAAU,QAAA,EAAS,iBAAc,WAAA,EACrE,QAAA,EAAA;AAAA,YAAA,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,qBACrBA,IAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAW,CAAA,qCAAA,EAAwC,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,gBAC3D,aAAW,GAAA,CAAI,IAAA;AAAA,gBAEd,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAI,OAAA;AAAA,kBACJ,GAAA,CAAI,6BACHF,GAAAA,CAAC,UAAK,SAAA,EAAU,sBAAA,EAAuB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,QAAA,EAAC;AAAA;AAAA,eAAA;AAAA,cANxD,GAAA,CAAI;AAAA,aASZ,CAAA;AAAA,YACA,QAAQ,SAAA,IAAa,CAAC,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,qBAC7DE,IAAAA,CAAC,QAAG,SAAA,EAAU,6CAAA,EAA8C,aAAU,QAAA,EACpE,QAAA,EAAA;AAAA,8BAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,8BAC3BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,8BAC3BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAW;AAAA,aAAA,EAC7B;AAAA,WAAA,EAEJ,CAAA;AAAA,0BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAA,EAAW,eAAY,MAAA,EAAO;AAAA,SAAA,EAC1C,CAAA;AAAA,QAEC,OAAA,CAAQ,KAAA,oBACPA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EAAsB,IAAA,EAAK,OAAA,EACvC,QAAA,EAAA,OAAA,CAAQ,KAAA,EACX,CAAA;AAAA,wBAGFE,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA0B,UAAU,gBAAA,EAClD,QAAA,EAAA;AAAA,0BAAAF,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,qBAAA;AAAA,cACV,KAAA,EAAO,KAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACxC,SAAA,EAAW,aAAA;AAAA,cACX,WAAA;AAAA,cACA,UAAU,OAAA,CAAQ,SAAA;AAAA,cAClB,IAAA,EAAM,CAAA;AAAA,cACN,YAAA,EAAW;AAAA;AAAA,WACb;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,oBAAA;AAAA,cACV,QAAA,EAAU,CAAC,KAAA,CAAM,IAAA,MAAU,OAAA,CAAQ,SAAA;AAAA,cACnC,YAAA,EAAW,MAAA;AAAA,cACZ,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;ACrMO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,WAAW,EAAC;AAAA,EACZ,OAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA0C;AACxC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIF,SAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,UAAA,GAAaC,OAAO,EAAE,CAAA;AAC5B,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,aAAA,GAAgBA,OAAO,UAAU,CAAA;AACvC,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,EAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,UAAA,CAAW,OAAA,GAAU,EAAA;AACrB,IAAA,UAAA,CAAW,EAAE,CAAA;AACb,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,IAAA,MAAM,aAAsC,EAAC;AAE7C,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AACF,QAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,UAAA,IAAI,SAAA,EAAW;AAEf,UAAA,QAAQ,MAAM,IAAA;AAAM,YAClB,KAAK,eAAA;AAAA,YACL,KAAK,iBAAA,EAAmB;AACtB,cAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,aAAA,IAAiB,EAAA;AACpD,cAAA,IAAI,KAAA,EAAO;AACT,gBAAA,UAAA,CAAW,OAAA,IAAW,KAAA;AACtB,gBAAA,UAAA,CAAW,WAAW,OAAO,CAAA;AAC7B,gBAAA,UAAA,CAAW,UAAU,KAAK,CAAA;AAAA,cAC5B;AACA,cAAA;AAAA,YACF;AAAA,YAEA,KAAK,gBAAA,EAAkB;AACrB,cAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACrB,cAAAE,iBAAAA;AAAA,gBACE,EAAE,IAAA,EAAM,gBAAA,EAAkB,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,gBACnD,EAAE,QAAA;AAAS,eACb;AACA,cAAA,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,KAAA,CAAM,QAAQ,CAAA;AACxC,cAAA;AAAA,YACF;AAAA,YAEA,KAAK,aAAA,EAAe;AAClB,cAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAClB,cAAAC,cAAAA;AAAA,gBACE;AAAA,kBACE,IAAA,EAAM,aAAA;AAAA,kBACN,OAAO,KAAA,CAAM;AAAA,iBACf;AAAA,gBACA,EAAE,QAAA,EAAS;AAAA,gBACX,OAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,KAAA;AAAA,eACpD;AACA,cAAA;AAAA,YACF;AAAA,YAEA,KAAK,OAAA,EAAS;AACZ,cAAA,MAAM,GAAA,GAAM,MAAM,KAAA,IAAS,cAAA;AAC3B,cAAA,QAAA,CAAS,GAAG,CAAA;AACZ,cAAA,UAAA,CAAW,OAAA,GAAU,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AACnC,cAAA;AAAA,YACF;AAAA,YAEA,KAAK,MAAA;AAAA,YACL,KAAK,aAAA;AACH,cAAA;AAAA,YAEF;AACE,cAAA;AAAA;AACJ,QACF;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,UAAA,QAAA,CAAS,GAAG,CAAA;AACZ,UAAA,UAAA,CAAW,UAAU,GAAA,YAAe,KAAA,GAAQ,MAAM,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,QAClE;AAAA,MACF,CAAA,SAAE;AACA,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,aAAA,CAAc,OAAA,GAAU,WAAW,OAAO,CAAA;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,CAAA,GAAG;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EAIF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEJ,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAC,kCAAkC,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,EAAE,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,EAAK,SAC3F,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,OAAA,IAAW,CAAC,SAAA;AAE7B,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,aAAA,EAAe,SAAA,GAAY,wBAAA,GAA2B,EAAA,EAAI,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MACzG,WAAA,EAAU,QAAA;AAAA,MACV,aAAA,EAAY,OAAA;AAAA,MAEX,QAAA,EAAA,OAAA,IAAW,WAAA,GACV,WAAA,GACE,aAAA,GACF,aAAA,CAAc,OAAA,EAAS,SAAS,CAAA,mBAEhCE,IAAAA,CAAAG,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QACA,SAAA,oBAAaL,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,qBAAA,EAAsB,aAAA,EAAY,QAAO,QAAA,EAAA,QAAA,EAAC;AAAA,OAAA,EAC1E;AAAA;AAAA,GAEJ;AAEJ;ACrKA,SAAS,SAAA,CAAU,GAAY,CAAA,EAAqB;AAClD,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,IAAI,OAAO,CAAA,KAAM,OAAO,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM,OAAO,KAAA;AACrC,EAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC9B,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAC1C,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,KAAM,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,iBAAA,CACP,QACA,KAAA,EACa;AACb,EAAA,MAAM,OAAA,mBAAU,IAAI,GAAA,CAAI,CAAC,GAAG,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG,GAAG,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AACvE,EAAA,MAAM,QAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AAExB,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,EAAE,SAAS,MAAA,CAAA,EAAS;AACtB,MAAA,EAAA,GAAK,KAAA;AAAA,IACP,CAAA,MAAA,IAAW,EAAE,KAAA,IAAS,KAAA,CAAA,EAAQ;AAC5B,MAAA,EAAA,GAAK,QAAA;AAAA,IACP,CAAA,MAAA,IAAW,CAAC,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA,EAAG;AACjC,MAAA,EAAA,GAAK,SAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,EAAA,GAAK,WAAA;AAAA,IACP;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,EAAA,EAAI,QAAQ,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EACrD;AAGA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACnB,IAAA,MAAM,KAAA,GAAQ,EAAE,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAC5D,IAAA,OAAO,MAAM,CAAA,CAAE,EAAE,CAAA,GAAI,KAAA,CAAM,EAAE,EAAE,CAAA;AAAA,EACjC,CAAC,CAAA;AAED,EAAA,OAAO,KAAA;AACT;AAyCO,SAAS,aAAA,CAAc;AAAA,EAC5B,UAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA,GAAmB;AACrB,CAAA,EAA8C;AAC5C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIF,SAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,SAAkC,IAAI,CAAA;AAE9D,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,oBAAoB,UAAU,CAAA;AACjD,IAAA,OAAO,MAAM,WAAW,MAAA,EAAO;AAAA,EACjC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBK,YAAY,MAAc;AAChD,IAAA,MAAM,MAAM,mBAAA,CAAoB,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AACpE,IAAA,cAAA,CAAe,GAAG,CAAA;AAElB,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEzB,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,IAAI,gBAAgB,IAAA,EAAM;AAE1B,IAAA,MAAM,UAAU,kBAAA,EAAmB;AACnC,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,CAAU,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,WAAW,CAAA;AACxE,IAAA,IAAI,YAAY,EAAA,EAAI;AAQpB,IAAA,MAAM,SAAA,GAAY,cAAc,QAAA,EAAS;AACzC,IAAA,MAAM,aACH,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,GAAI,QAAQ,KAA6C,EAAC;AAG1F,IAAA,MAAM,eAAe,mBAAA,CAAoB,CAAA,KAAA,EAAQ,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,SAAA,CAAW,CAAA;AAClF,IAAA,MAAM,OAAA,GAAU,kBAAA,EAAmB,CAAE,SAAA,CAAU,MAAA,GAAS,CAAA;AAGxD,IAAA,oBAAA,CAAqB,OAAO,CAAA;AAC5B,IAAA,MAAM,aAAA,GAAgB,cAAc,QAAA,EAAS;AAC7C,IAAA,MAAM,iBACH,aAAA,CAAc,QAAA,CAAS,UAAU,CAAA,GAAI,QAAQ,KAA6C,EAAC;AAG9F,IAAA,MAAM,WAAA,GAAc,kBAAA,EAAmB,CAAE,SAAA,CAAU,SAAA;AAAA,MACjD,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,KAAQ;AAAA,KACnB;AACA,IAAA,oBAAA,CAAqB,WAAA,KAAgB,EAAA,GAAK,WAAA,GAAc,OAAO,CAAA;AAE/D,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,cAAA,EAAgB,UAAU,CAAA,CAAE,MAAA;AAAA,MAC3D,CAAC,CAAA,KAAM,gBAAA,IAAoB,CAAA,CAAE,EAAA,KAAO;AAAA,KACtC;AAEA,IAAA,OAAA,CAAQ;AAAA,MACN,UAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH,GAAG,CAAC,WAAA,EAAa,UAAA,EAAY,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAExD,EAAA,MAAM,eAAA,GAAkBA,YAAY,MAAe;AACjD,IAAA,IAAI,WAAA,KAAgB,MAAM,OAAO,KAAA;AACjC,IAAA,MAAM,UAAU,kBAAA,EAAmB;AACnC,IAAA,MAAM,OAAA,GAAU,QAAQ,SAAA,CAAU,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,WAAW,CAAA;AACxE,IAAA,IAAI,OAAA,KAAY,IAAI,OAAO,KAAA;AAC3B,IAAA,OAAO,qBAAqB,OAAO,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,OAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,WAAA,EAAa,iBAAiB,SAAA,EAAU;AAC1E;ACxIA,SAAS,mBAAmB,CAAA,EAAoB;AAC9C,EAAA,IAAI,CAAA,KAAM,QAAW,OAAO,QAAA;AAC5B,EAAA,IAAI,CAAA,KAAM,MAAM,OAAO,MAAA;AACvB,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,EAAA,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AACzB;AAEA,SAAS,QAAQ,EAAA,EAA6B;AAC5C,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,KAAA;AAAO,MAAA,OAAO,GAAA;AAAA,IACnB,KAAK,QAAA;AAAU,MAAA,OAAO,QAAA;AAAA,IACtB,KAAK,SAAA;AAAW,MAAA,OAAO,GAAA;AAAA,IACvB,KAAK,WAAA;AAAa,MAAA,OAAO,GAAA;AAAA;AAE7B;AAEA,SAAS,aAAA,CAAc,IAAqB,UAAA,EAA0C;AACpF,EAAA,MAAM,IAAA,GAAO,WAAW,GAAA,IAAO,gBAAA;AAC/B,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAA,EAAK,WAAW,MAAA,IAAU,qBAAA;AAAA,IAC1B,MAAA,EAAQ,WAAW,SAAA,IAAa,wBAAA;AAAA,IAChC,OAAA,EAAS,WAAW,UAAA,IAAc,yBAAA;AAAA,IAClC,SAAA,EAAW,WAAW,YAAA,IAAgB;AAAA,IACtC,EAAE,CAAA;AACJ,EAAA,OAAO,CAAC,IAAA,EAAM,QAAQ,CAAA,CAAE,KAAK,GAAG,CAAA;AAClC;AAKO,SAAS,UAAA,CAAW;AAAA,EACzB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA,GAAe,IAAA;AAAA,EACf,SAAA;AAAA,EACA,WAAA,GAAc,kBAAA;AAAA,EACd,aAAa,EAAC;AAAA,EACd;AACF,CAAA,EAAwC;AAEtC,EAAA,MAAM,WAAW,aAAA,CAAc,EAAE,UAAA,EAAY,QAAA,EAAU,kBAAkB,CAAA;AACzE,EAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,eAAA,EAAiB,WAAU,GAAI,QAAA;AAG9D,EAAA,MAAM,UAAA,GAAa,YAAA,KAAiB,MAAA,GAAY,YAAA,GAAe,IAAA;AAE/D,EAAA,uBACEJ,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,UAAA,CAAW,IAAA,IAAQ,WAAA,EAAa,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAC/E,YAAA,EAAY,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,MAEnD,QAAA,EAAA;AAAA,QAAA,YAAA,oBACCA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,CAAW,YAAY,qBAAA,EACrC,QAAA,EAAA;AAAA,0BAAAF,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAW,WAAW,aAAA,IAAiB,wCAAA;AAAA,cACvC,OAAA,EAAS,MAAM,eAAA,EAAgB;AAAA,cAChC,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAW,WAAW,eAAA,IAAmB,0CAAA;AAAA,cACzC,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,cAC1B,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAW,WAAW,aAAA,IAAiB,wCAAA;AAAA,cACvC,OAAA,EAAS,MAAM,eAAA,EAAgB;AAAA,cAChC,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA;AAAA,QAGD,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,CAAO,MAAA,KAAW,oBAC3CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,CAAW,UAAA,IAAc,oBACtC,QAAA,EAAA,UAAA,GAAa,0BAAA,GAA6B,kCAAA,EAC7C,CAAA,mBAEAE,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,UAAA,CAAW,KAAA,IAAS,kBAAA,EAAoB,IAAA,EAAK,OAAA,EAC7D,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAAC,WACC,QAAA,kBAAAE,IAAAA,CAAC,QAAG,SAAA,EAAW,UAAA,CAAW,aAAa,mBAAA,EACrC,QAAA,EAAA;AAAA,4BAAAF,GAAAA,CAAC,QAAG,SAAA,EAAW,UAAA,CAAW,cAAc,eAAA,EAAiB,KAAA,EAAM,OAAM,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,4BACvEA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,WAAW,UAAA,IAAc,eAAA,EAAiB,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BAC1EA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,WAAW,UAAA,IAAc,eAAA,EAAiB,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,4BAC3EA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,WAAW,UAAA,IAAc,eAAA,EAAiB,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,OAAA,EAAK;AAAA,WAAA,EAC5E,CAAA,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,OAAA,EAAA,EACE,QAAA,EAAA,UAAA,CAAW,MAAA,CAAO,GAAA;AAAA,YAAI,CAAC,KAAA,EAAO,GAAA,KAC7B,SAAA,mBACEA,IAACO,MAAAA,CAAM,QAAA,EAAN,EAAkC,QAAA,EAAA,SAAA,CAAU,OAAO,GAAG,CAAA,EAAA,EAAlC,KAAA,CAAM,KAA8B,oBAEzDL,IAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAW,aAAA,CAAc,KAAA,CAAM,EAAA,EAAI,UAAU,CAAA;AAAA,gBAC7C,WAAS,KAAA,CAAM,EAAA;AAAA,gBAEf,QAAA,EAAA;AAAA,kCAAAF,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,UAAA,CAAW,MAAA,IAAU,mCAClC,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,YAAA,EAAY,MAAM,EAAA,EAAK,QAAA,EAAA,OAAA,CAAQ,KAAA,CAAM,EAAE,GAAE,CAAA,EACjD,CAAA;AAAA,kCACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,UAAA,CAAW,SAAA,IAAa,oCAAA,EACrC,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM,CAAA,EACrB,CAAA;AAAA,kCACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAW,UAAA,CAAW,UAAA,IAAc,uCACtC,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,OAAO,KAAA,GAAQ,WAAA,CAAY,MAAM,MAAM,CAAA,GAAI,IAAG,CAAA,EAC7D,CAAA;AAAA,kCACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAW,UAAA,CAAW,SAAA,IAAa,sCACrC,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,OAAO,QAAA,GAAW,WAAA,CAAY,MAAM,KAAK,CAAA,GAAI,IAAG,CAAA,EAC/D;AAAA;AAAA,eAAA;AAAA,cAfK,KAAA,CAAM;AAAA;AAgBb,WAEJ,EACF;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ;AChHO,SAAS,cAAA,CAAe;AAAA,EAC7B,UAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,IAAA;AAAA,EACd,gBAAA,GAAmB,KAAA;AAAA,EACnB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA,GAAe,SAAA;AAAA,EACf,WAAA,GAAc,kBAAA;AAAA,EACd,KAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA4C;AAC1C,EAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,SAAA,EAAW,eAAA,KAAoB,aAAA,CAAc;AAAA,IAC1E,UAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,eAAA,EAAgB;AAAA,IAClB;AAAA,EAGF,CAAA,EAAG,CAAC,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEzB,EAAA,MAAM,aAAa,OAAA,CAAQ,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAEzD,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,IAAA,cAAkB,IAAI,CAAA;AAAA,EAC5B,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,MAAM,cAAc,eAAA,EAAgB;AACpC,IAAA,IAAI,WAAA,IAAe,IAAA,EAAM,QAAA,GAAW,IAAI,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,KAAA,IAAS,CAAA,sBAAA,EAAoB,UAAU,IAAI,QAAQ,CAAA,CAAA;AAExE,EAAA,uBACEC,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAC,eAAA,EAAiB,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,MAChE,YAAA,EAAY,YAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,uBAAA,EAChB,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,0BACnDA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,kDAAA;AAAA,cACV,OAAA,EAAS,MAAM,SAAA,EAAU;AAAA,cACzB,YAAA,EAAW,cAAA;AAAA,cACZ,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA;AAAA,wBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACZ,QAAA,EAAA,UAAA,GACC,WAAW,IAAI,CAAA;AAAA;AAAA,0BAGfA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,UAAA;AAAA,cACA,QAAA;AAAA,cACA,gBAAA;AAAA,cACA,YAAA,EAAc,KAAA;AAAA,cACd,YAAA,EAAc;AAAA;AAAA;AAChB,SAAA,EAEJ,CAAA;AAAA,wBAEAA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,uBAAA,EACf,0BACC,aAAA,CAAc;AAAA,UACZ,SAAA,EAAW,aAAA;AAAA,UACX,QAAA,EAAU,YAAA;AAAA,UACV;AAAA,SACD,CAAA,mBAEDE,IAAAA,CAAAG,UAAA,EACE,QAAA,EAAA;AAAA,0BAAAL,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,gDAAA;AAAA,cACV,OAAA,EAAS,aAAA;AAAA,cACT,UAAU,CAAC,UAAA;AAAA,cACX,YAAA,EAAY,YAAA;AAAA,cAEX,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,0BACAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,+CAAA;AAAA,cACV,OAAA,EAAS,YAAA;AAAA,cACT,UAAU,CAAC,UAAA;AAAA,cACX,YAAA,EAAY,WAAA;AAAA,cAEX,QAAA,EAAA;AAAA;AAAA;AACH,SAAA,EACF,CAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;AC3JA,IAAM,qBAAA,GAAwB,cAAyC,IAAI,CAAA;AAkBpE,SAAS,yBAAA,CAA0B;AAAA,EACxC,QAAA;AAAA,EACA;AACF,CAAA,EAAgD;AAC9C,EAAA,uBACEA,GAAAA,CAAC,qBAAA,CAAsB,UAAtB,EAA+B,KAAA,EAAO,UACpC,QAAA,EACH,CAAA;AAEJ;AAMO,SAAS,qBAAA,GAAmD;AACjE,EAAA,OAAO,WAAW,qBAAqB,CAAA;AACzC","file":"ag-ui.mjs","sourcesContent":["/**\n * use-chat-session.ts — Core React hook that manages a chat session.\n *\n * Responsibilities:\n * - Maintains local message list (React state, not the entity graph)\n * - Processes incoming StreamEvents: appends / updates messages in place\n * - Ingests STATE_SNAPSHOT / STATE_DELTA events into entity-graph-core via\n *   applyAgUiSnapshot / applyAgUiDelta\n * - Invokes the optional EntityToolProvider when the agent emits tool calls\n *\n * This hook is the shared foundation for EntityChat and EntityCopilot.\n *\n * Hook→Store layering: this hook calls applyAgUiSnapshot / applyAgUiDelta\n * (store writes). It never calls useGraphStore directly — that boundary is\n * maintained in the agent/ module of entity-graph-core.\n */\n\nimport { useCallback, useRef, useState } from \"react\";\nimport {\n  applyAgUiSnapshot,\n  applyAgUiDelta,\n} from \"@prometheus-ags/entity-graph-core\";\nimport type {\n  ChatMessage,\n  ChatSession,\n  EntityToolProvider,\n  StreamEvent,\n  AgUiStateMapping,\n} from \"./types.js\";\n\nfunction generateId(): string {\n  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction nowIso(): string {\n  return new Date().toISOString();\n}\n\nexport interface UseChatSessionOptions {\n  /** Unique session id; defaults to a generated id. */\n  sessionId?: string;\n  /**\n   * Factory that returns an async-iterable (or ReadableStream) of StreamEvents\n   * given the current messages. The library calls this on every sendMessage().\n   */\n  streamFactory: (messages: ChatMessage[]) => AsyncIterable<StreamEvent> | ReadableStream<StreamEvent>;\n  /** AG-UI state mappings: project agent state onto entity-graph entities. */\n  mappings?: AgUiStateMapping[];\n  /** Optional tool provider for function-calling / MCP. */\n  toolProvider?: EntityToolProvider;\n  /** Called when a full assistant message has been received. */\n  onMessage?: (message: ChatMessage) => void;\n  /** Called on stream error. */\n  onError?: (error: Error) => void;\n}\n\nexport interface UseChatSessionReturn {\n  session: ChatSession;\n  sendMessage: (content: string) => Promise<void>;\n  clearMessages: () => void;\n}\n\nexport function useChatSession(opts: UseChatSessionOptions): UseChatSessionReturn {\n  const { sessionId, streamFactory, mappings = [], toolProvider, onMessage, onError } = opts;\n\n  const idRef = useRef(sessionId ?? generateId());\n  const abortRef = useRef<AbortController | null>(null);\n\n  const [messages, setMessages] = useState<ChatMessage[]>([]);\n  const [isLoading, setIsLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const appendOrUpdateMessage = useCallback((msg: ChatMessage) => {\n    setMessages((prev) => {\n      const idx = prev.findIndex((m) => m.id === msg.id);\n      if (idx === -1) return [...prev, msg];\n      const next = [...prev];\n      next[idx] = msg;\n      return next;\n    });\n  }, []);\n\n  const processStream = useCallback(\n    async (stream: AsyncIterable<StreamEvent>) => {\n      const agentState: Record<string, unknown> = {};\n      // Track accumulated tool calls by toolCallId during streaming so we don't\n      // need to read from potentially-stale React state at TOOL_CALL_END.\n      const pendingToolCalls = new Map<string, { name: string; arguments: string }>();\n\n      for await (const event of stream) {\n        switch (event.type) {\n          case \"MESSAGE_START\": {\n            if (!event.messageId) break;\n            appendOrUpdateMessage({\n              id: event.messageId,\n              role: \"assistant\",\n              content: \"\",\n              createdAt: nowIso(),\n              streaming: true,\n            });\n            break;\n          }\n\n          case \"MESSAGE_DELTA\": {\n            if (!event.messageId || !event.delta) break;\n            setMessages((prev) => {\n              const idx = prev.findIndex((m) => m.id === event.messageId);\n              if (idx === -1) return prev;\n              const next = [...prev];\n              next[idx] = { ...next[idx], content: next[idx].content + event.delta };\n              return next;\n            });\n            break;\n          }\n\n          case \"MESSAGE_END\": {\n            if (!event.messageId) break;\n            setMessages((prev) => {\n              const idx = prev.findIndex((m) => m.id === event.messageId);\n              if (idx === -1) return prev;\n              const next = [...prev];\n              const completed = { ...next[idx], streaming: false };\n              next[idx] = completed;\n              onMessage?.(completed);\n              return next;\n            });\n            break;\n          }\n\n          case \"TOOL_CALL_START\": {\n            if (!event.toolCallId) break;\n            // Register in our local map for quick lookup at TOOL_CALL_END\n            pendingToolCalls.set(event.toolCallId, {\n              name: event.toolName ?? \"\",\n              arguments: \"\",\n            });\n            if (event.messageId) {\n              setMessages((prev) => {\n                const idx = prev.findIndex((m) => m.id === event.messageId);\n                if (idx === -1) return prev;\n                const next = [...prev];\n                const existing = next[idx].toolCalls ?? [];\n                next[idx] = {\n                  ...next[idx],\n                  toolCalls: [\n                    ...existing,\n                    {\n                      id: event.toolCallId!,\n                      type: \"function\" as const,\n                      function: { name: event.toolName ?? \"\", arguments: \"\" },\n                    },\n                  ],\n                };\n                return next;\n              });\n            }\n            break;\n          }\n\n          case \"TOOL_CALL_DELTA\": {\n            if (!event.toolCallId || !event.toolArgsDelta) break;\n            // Accumulate in our local map\n            const tc = pendingToolCalls.get(event.toolCallId);\n            if (tc) {\n              tc.arguments += event.toolArgsDelta;\n            }\n            setMessages((prev) => {\n              const msgIdx = prev.findIndex((m) =>\n                m.toolCalls?.some((c) => c.id === event.toolCallId)\n              );\n              if (msgIdx === -1) return prev;\n              const next = [...prev];\n              const msg = next[msgIdx];\n              next[msgIdx] = {\n                ...msg,\n                toolCalls: (msg.toolCalls ?? []).map((c) =>\n                  c.id === event.toolCallId\n                    ? {\n                        ...c,\n                        function: {\n                          ...c.function,\n                          arguments: c.function.arguments + (event.toolArgsDelta ?? \"\"),\n                        },\n                      }\n                    : c\n                ),\n              };\n              return next;\n            });\n            break;\n          }\n\n          case \"TOOL_CALL_END\": {\n            if (!event.toolCallId || !toolProvider) break;\n            const callInfo = pendingToolCalls.get(event.toolCallId);\n            if (!callInfo) break;\n            pendingToolCalls.delete(event.toolCallId);\n\n            try {\n              const args = JSON.parse(callInfo.arguments || \"{}\") as Record<string, unknown>;\n              const result = await toolProvider.executeTool({\n                toolCallId: event.toolCallId,\n                name: callInfo.name,\n                arguments: args,\n              });\n              const toolMsg: ChatMessage = {\n                id: generateId(),\n                role: \"tool\",\n                content: JSON.stringify(result.result),\n                createdAt: nowIso(),\n                toolCallId: event.toolCallId,\n              };\n              appendOrUpdateMessage(toolMsg);\n            } catch (err) {\n              const toolErrMsg: ChatMessage = {\n                id: generateId(),\n                role: \"tool\",\n                content: JSON.stringify({ error: String(err) }),\n                createdAt: nowIso(),\n                toolCallId: event.toolCallId,\n              };\n              appendOrUpdateMessage(toolErrMsg);\n            }\n            break;\n          }\n\n          case \"STATE_SNAPSHOT\": {\n            if (!event.snapshot) break;\n            applyAgUiSnapshot(\n              { type: \"STATE_SNAPSHOT\", snapshot: event.snapshot },\n              { mappings }\n            );\n            Object.assign(agentState, event.snapshot);\n            break;\n          }\n\n          case \"STATE_DELTA\": {\n            if (!event.patch) break;\n            applyAgUiDelta(\n              {\n                type: \"STATE_DELTA\",\n                delta: event.patch as Parameters<typeof applyAgUiDelta>[0][\"delta\"],\n              },\n              { mappings },\n              Object.keys(agentState).length > 0 ? agentState : undefined\n            );\n            break;\n          }\n\n          case \"ERROR\": {\n            const msg = event.error ?? \"Stream error\";\n            setError(msg);\n            onError?.(new Error(msg));\n            break;\n          }\n\n          case \"DONE\":\n            break;\n\n          default:\n            break;\n        }\n      }\n    },\n    [appendOrUpdateMessage, mappings, toolProvider, onMessage, onError]\n  );\n\n  const sendMessage = useCallback(\n    async (content: string) => {\n      abortRef.current?.abort();\n      abortRef.current = new AbortController();\n\n      const userMsg: ChatMessage = {\n        id: generateId(),\n        role: \"user\",\n        content,\n        createdAt: nowIso(),\n      };\n\n      // Capture the current message list before the state update\n      let currentMessages: ChatMessage[] = [];\n      setMessages((prev) => {\n        currentMessages = [...prev, userMsg];\n        return currentMessages;\n      });\n\n      setIsLoading(true);\n      setError(null);\n\n      try {\n        // Use a small delay to let React batch the state update before reading\n        await Promise.resolve();\n        const raw = streamFactory(currentMessages);\n        const iterable: AsyncIterable<StreamEvent> =\n          raw instanceof ReadableStream\n            ? (raw as unknown as AsyncIterable<StreamEvent>)\n            : raw;\n\n        await processStream(iterable);\n      } catch (err) {\n        const msg = err instanceof Error ? err.message : String(err);\n        setError(msg);\n        onError?.(err instanceof Error ? err : new Error(msg));\n      } finally {\n        setIsLoading(false);\n      }\n    },\n    [streamFactory, processStream, onError]\n  );\n\n  const clearMessages = useCallback(() => {\n    abortRef.current?.abort();\n    setMessages([]);\n    setError(null);\n    setIsLoading(false);\n  }, []);\n\n  const session: ChatSession = {\n    id: idRef.current,\n    messages,\n    isLoading,\n    error,\n    mappings,\n  };\n\n  return { session, sendMessage, clearMessages };\n}\n","/**\n * entity-chat.tsx — EntityChat: a headless + minimal-shell chat component.\n *\n * Architecture:\n * - Delegates all session management to useChatSession (which calls\n *   applyAgUiSnapshot / applyAgUiDelta — store writes — never directly).\n * - Renders a minimal but intentional chat UI: message list + input form.\n * - All styling is done via className overrides so consumers can bring Tailwind,\n *   CSS modules, or any other styling layer.\n *\n * Layering: Component → useChatSession hook → applyAgUiSnapshot/Delta (store).\n * No direct store access from this file.\n */\n\nimport React, {\n  useRef,\n  useEffect,\n  KeyboardEvent,\n  useState,\n  FormEvent,\n} from \"react\";\nimport { useChatSession, type UseChatSessionOptions } from \"./use-chat-session.js\";\nimport type { ChatMessage } from \"./types.js\";\n\nexport interface EntityChatClassNames {\n  root?: string;\n  messageList?: string;\n  message?: string;\n  messageUser?: string;\n  messageAssistant?: string;\n  messageTool?: string;\n  messageSystem?: string;\n  messageContent?: string;\n  inputRow?: string;\n  input?: string;\n  sendButton?: string;\n  statusBar?: string;\n}\n\nexport interface EntityChatProps extends Omit<UseChatSessionOptions, \"streamFactory\"> {\n  /** Required: factory producing a stream of StreamEvents for the given messages. */\n  streamFactory: UseChatSessionOptions[\"streamFactory\"];\n  /** Optional render override for a single message. */\n  renderMessage?: (message: ChatMessage) => React.ReactNode;\n  /** Optional render override for the typing indicator. */\n  renderTypingIndicator?: () => React.ReactNode;\n  /** Optional placeholder for the textarea. */\n  placeholder?: string;\n  /** Class name overrides for each structural slot. */\n  classNames?: EntityChatClassNames;\n  /** Additional CSS class on the root container. */\n  className?: string;\n}\n\nfunction DefaultTypingIndicator(): React.ReactElement {\n  return (\n    <span aria-label=\"Assistant is typing\" role=\"status\">\n      <span className=\"a2ui-dot\" />\n      <span className=\"a2ui-dot\" />\n      <span className=\"a2ui-dot\" />\n    </span>\n  );\n}\n\nfunction MessageBubble({\n  message,\n  classNames = {},\n  renderMessage,\n}: {\n  message: ChatMessage;\n  classNames?: EntityChatClassNames;\n  renderMessage?: (m: ChatMessage) => React.ReactNode;\n}): React.ReactElement {\n  if (renderMessage) {\n    return <>{renderMessage(message)}</>;\n  }\n\n  const roleClass = {\n    user: classNames.messageUser ?? \"a2ui-msg--user\",\n    assistant: classNames.messageAssistant ?? \"a2ui-msg--assistant\",\n    tool: classNames.messageTool ?? \"a2ui-msg--tool\",\n    system: classNames.messageSystem ?? \"a2ui-msg--system\",\n  }[message.role] ?? \"\";\n\n  return (\n    <li\n      className={[classNames.message ?? \"a2ui-msg\", roleClass].filter(Boolean).join(\" \")}\n      data-role={message.role}\n      data-message-id={message.id}\n    >\n      <span className={classNames.messageContent ?? \"a2ui-msg__content\"}>\n        {message.content}\n        {message.streaming && (\n          <span className=\"a2ui-msg__cursor\" aria-hidden=\"true\">▍</span>\n        )}\n      </span>\n    </li>\n  );\n}\n\n/**\n * EntityChat — a full-page or embedded chat UI backed by entity-graph.\n *\n * @example\n * ```tsx\n * <EntityChat\n *   streamFactory={(messages) => myAgentStream(messages)}\n *   mappings={[{ entityType: \"Order\", pointer: \"/order\", kind: \"single\" }]}\n *   toolProvider={myMcpProvider}\n * />\n * ```\n */\nexport function EntityChat({\n  streamFactory,\n  mappings,\n  toolProvider,\n  sessionId,\n  onMessage,\n  onError,\n  renderMessage,\n  renderTypingIndicator,\n  placeholder = \"Type a message…\",\n  classNames = {},\n  className,\n}: EntityChatProps): React.ReactElement {\n  const { session, sendMessage } = useChatSession({\n    streamFactory,\n    mappings,\n    toolProvider,\n    sessionId,\n    onMessage,\n    onError,\n  });\n\n  const [draft, setDraft] = useState(\"\");\n  const listRef = useRef<HTMLOListElement>(null);\n\n  // Auto-scroll to bottom when messages change\n  useEffect(() => {\n    const el = listRef.current;\n    if (el) {\n      el.scrollTop = el.scrollHeight;\n    }\n  }, [session.messages]);\n\n  const handleSubmit = async (e?: FormEvent) => {\n    e?.preventDefault();\n    const text = draft.trim();\n    if (!text || session.isLoading) return;\n    setDraft(\"\");\n    await sendMessage(text);\n  };\n\n  const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n    if (e.key === \"Enter\" && !e.shiftKey) {\n      e.preventDefault();\n      void handleSubmit();\n    }\n  };\n\n  return (\n    <section\n      className={[classNames.root ?? \"a2ui-chat\", className].filter(Boolean).join(\" \")}\n      aria-label=\"Entity chat\"\n    >\n      <ol\n        ref={listRef}\n        className={classNames.messageList ?? \"a2ui-chat__messages\"}\n        aria-live=\"polite\"\n        aria-relevant=\"additions\"\n      >\n        {session.messages.map((msg) => (\n          <MessageBubble\n            key={msg.id}\n            message={msg}\n            classNames={classNames}\n            renderMessage={renderMessage}\n          />\n        ))}\n        {session.isLoading && !session.messages.some((m) => m.streaming) && (\n          <li aria-live=\"polite\" className=\"a2ui-msg a2ui-msg--typing\">\n            {renderTypingIndicator ? renderTypingIndicator() : <DefaultTypingIndicator />}\n          </li>\n        )}\n      </ol>\n\n      {session.error && (\n        <div\n          className={classNames.statusBar ?? \"a2ui-chat__status-bar a2ui-chat__status-bar--error\"}\n          role=\"alert\"\n        >\n          {session.error}\n        </div>\n      )}\n\n      <form\n        className={classNames.inputRow ?? \"a2ui-chat__input-row\"}\n        onSubmit={(e) => void handleSubmit(e)}\n        aria-label=\"Send a message\"\n      >\n        <textarea\n          className={classNames.input ?? \"a2ui-chat__input\"}\n          value={draft}\n          onChange={(e) => setDraft(e.target.value)}\n          onKeyDown={handleKeyDown}\n          placeholder={placeholder}\n          disabled={session.isLoading}\n          rows={1}\n          aria-label=\"Message input\"\n        />\n        <button\n          type=\"submit\"\n          className={classNames.sendButton ?? \"a2ui-chat__send\"}\n          disabled={!draft.trim() || session.isLoading}\n          aria-label=\"Send message\"\n        >\n          Send\n        </button>\n      </form>\n    </section>\n  );\n}\n","/**\n * entity-copilot.tsx — EntityCopilot: a compact \"sidebar copilot\" variant.\n *\n * Unlike EntityChat (which renders a full chat surface), EntityCopilot is\n * designed to be embedded inline — a floating panel, a slide-over, or an\n * editor drawer. It reuses useChatSession for the same entity-graph projection\n * while providing a narrower component API and a more compact default UI.\n *\n * Layering: Component → useChatSession hook → applyAgUiSnapshot/Delta (store).\n */\n\nimport React, { useState, useRef, useEffect, FormEvent, KeyboardEvent } from \"react\";\nimport { useChatSession, type UseChatSessionOptions } from \"./use-chat-session.js\";\nimport type { ChatMessage } from \"./types.js\";\n\nexport interface EntityCopilotProps extends Omit<UseChatSessionOptions, \"streamFactory\"> {\n  streamFactory: UseChatSessionOptions[\"streamFactory\"];\n  /** Title shown at the top of the copilot panel. */\n  title?: string;\n  /** Placeholder text for the input. */\n  placeholder?: string;\n  /** Whether the copilot panel is open. Controls visibility via CSS (display). */\n  open?: boolean;\n  /** Called when the user requests closing (e.g. presses Escape or an X button). */\n  onClose?: () => void;\n  /** Additional root CSS class. */\n  className?: string;\n  /** Render override for a single suggestion bubble. */\n  renderSuggestion?: (message: ChatMessage, index: number) => React.ReactNode;\n  /** Quick-reply prompts shown when the message list is empty. */\n  suggestions?: string[];\n}\n\nfunction SuggestionChip({\n  label,\n  onClick,\n}: {\n  label: string;\n  onClick: () => void;\n}): React.ReactElement {\n  return (\n    <button\n      type=\"button\"\n      className=\"a2ui-copilot__chip\"\n      onClick={onClick}\n    >\n      {label}\n    </button>\n  );\n}\n\n/**\n * EntityCopilot — embedded AI copilot panel that streams agent responses and\n * projects them onto the entity graph.\n *\n * @example\n * ```tsx\n * <EntityCopilot\n *   open={showCopilot}\n *   onClose={() => setShowCopilot(false)}\n *   title=\"Order Copilot\"\n *   streamFactory={(msgs) => agentStream(msgs)}\n *   mappings={[{ entityType: \"Order\", pointer: \"/order\", kind: \"single\" }]}\n *   suggestions={[\"Summarise this order\", \"What's the status?\"]}\n * />\n * ```\n */\nexport function EntityCopilot({\n  streamFactory,\n  mappings,\n  toolProvider,\n  sessionId,\n  onMessage,\n  onError,\n  title = \"AI Copilot\",\n  placeholder = \"Ask anything…\",\n  open = true,\n  onClose,\n  className,\n  renderSuggestion,\n  suggestions = [],\n}: EntityCopilotProps): React.ReactElement | null {\n  if (!open) return null;\n\n  return (\n    <EntityCopilotInner\n      streamFactory={streamFactory}\n      mappings={mappings}\n      toolProvider={toolProvider}\n      sessionId={sessionId}\n      onMessage={onMessage}\n      onError={onError}\n      title={title}\n      placeholder={placeholder}\n      onClose={onClose}\n      className={className}\n      renderSuggestion={renderSuggestion}\n      suggestions={suggestions}\n    />\n  );\n}\n\n// Inner component owns the hook so it only mounts when `open` is true.\nfunction EntityCopilotInner({\n  streamFactory,\n  mappings,\n  toolProvider,\n  sessionId,\n  onMessage,\n  onError,\n  title,\n  placeholder,\n  onClose,\n  className,\n  renderSuggestion,\n  suggestions = [],\n}: Omit<EntityCopilotProps, \"open\"> & Required<Pick<EntityCopilotProps, \"title\" | \"placeholder\">>): React.ReactElement {\n  const { session, sendMessage } = useChatSession({\n    streamFactory,\n    mappings,\n    toolProvider,\n    sessionId,\n    onMessage,\n    onError,\n  });\n\n  const [draft, setDraft] = useState(\"\");\n  const bottomRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    bottomRef.current?.scrollIntoView({ behavior: \"smooth\" });\n  }, [session.messages]);\n\n  // Close on Escape\n  useEffect(() => {\n    const handleKey = (e: Event) => {\n      if ((e as unknown as { key: string }).key === \"Escape\") onClose?.();\n    };\n    document.addEventListener(\"keydown\", handleKey);\n    return () => document.removeEventListener(\"keydown\", handleKey);\n  }, [onClose]);\n\n  const handleSubmit = async (text: string) => {\n    const trimmed = text.trim();\n    if (!trimmed || session.isLoading) return;\n    setDraft(\"\");\n    await sendMessage(trimmed);\n  };\n\n  const handleFormSubmit = (e: FormEvent) => {\n    e.preventDefault();\n    void handleSubmit(draft);\n  };\n\n  const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n    if (e.key === \"Enter\" && !e.shiftKey) {\n      e.preventDefault();\n      void handleSubmit(draft);\n    }\n  };\n\n  const isEmpty = session.messages.length === 0;\n\n  return (\n    <aside\n      className={[\"a2ui-copilot\", className].filter(Boolean).join(\" \")}\n      role=\"complementary\"\n      aria-label={title}\n    >\n      <header className=\"a2ui-copilot__header\">\n        <span className=\"a2ui-copilot__title\">{title}</span>\n        {onClose && (\n          <button\n            type=\"button\"\n            className=\"a2ui-copilot__close\"\n            onClick={onClose}\n            aria-label=\"Close copilot\"\n          >\n            ×\n          </button>\n        )}\n      </header>\n\n      <div className=\"a2ui-copilot__body\">\n        {isEmpty && suggestions.length > 0 && (\n          <div className=\"a2ui-copilot__suggestions\" role=\"list\" aria-label=\"Suggested prompts\">\n            {suggestions.map((s, i) => (\n              <div role=\"listitem\" key={i}>\n                {renderSuggestion ? (\n                  renderSuggestion({ id: String(i), role: \"user\", content: s, createdAt: \"\" }, i)\n                ) : (\n                  <SuggestionChip label={s} onClick={() => void handleSubmit(s)} />\n                )}\n              </div>\n            ))}\n          </div>\n        )}\n\n        <ul className=\"a2ui-copilot__messages\" aria-live=\"polite\" aria-relevant=\"additions\">\n          {session.messages.map((msg) => (\n            <li\n              key={msg.id}\n              className={`a2ui-copilot__msg a2ui-copilot__msg--${msg.role}`}\n              data-role={msg.role}\n            >\n              {msg.content}\n              {msg.streaming && (\n                <span className=\"a2ui-copilot__cursor\" aria-hidden=\"true\">▍</span>\n              )}\n            </li>\n          ))}\n          {session.isLoading && !session.messages.some((m) => m.streaming) && (\n            <li className=\"a2ui-copilot__msg a2ui-copilot__msg--typing\" aria-live=\"polite\">\n              <span className=\"a2ui-dot\" />\n              <span className=\"a2ui-dot\" />\n              <span className=\"a2ui-dot\" />\n            </li>\n          )}\n        </ul>\n\n        <div ref={bottomRef} aria-hidden=\"true\" />\n      </div>\n\n      {session.error && (\n        <div className=\"a2ui-copilot__error\" role=\"alert\">\n          {session.error}\n        </div>\n      )}\n\n      <form className=\"a2ui-copilot__input-row\" onSubmit={handleFormSubmit}>\n        <textarea\n          className=\"a2ui-copilot__input\"\n          value={draft}\n          onChange={(e) => setDraft(e.target.value)}\n          onKeyDown={handleKeyDown}\n          placeholder={placeholder}\n          disabled={session.isLoading}\n          rows={1}\n          aria-label=\"Ask the copilot\"\n        />\n        <button\n          type=\"submit\"\n          className=\"a2ui-copilot__send\"\n          disabled={!draft.trim() || session.isLoading}\n          aria-label=\"Send\"\n        >\n          ↵\n        </button>\n      </form>\n    </aside>\n  );\n}\n","/**\n * entity-stream.tsx — EntityStream: renders a live stream of agent events.\n *\n * EntityStream is the lowest-level primitive: it accepts an AsyncIterable of\n * StreamEvents and renders the raw token stream as it arrives. It is useful for\n * non-chat contexts — inline LLM completions, \"generating...\" surfaces, etc.\n *\n * STATE_SNAPSHOT / STATE_DELTA events are still projected into the entity graph\n * just as in EntityChat/EntityCopilot.\n *\n * Layering: Component → stores via applyAgUiSnapshot/Delta directly (no\n * intermediate hook because the component IS the hook surface here — it owns\n * stream consumption). Entity graph writes go through the core module.\n */\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport {\n  applyAgUiSnapshot,\n  applyAgUiDelta,\n} from \"@prometheus-ags/entity-graph-core\";\nimport type { StreamEvent, AgUiStateMapping } from \"./types.js\";\n\nexport interface EntityStreamProps {\n  /** The live event stream to consume. Changing this prop replaces the stream. */\n  stream: AsyncIterable<StreamEvent> | null | undefined;\n  /** AG-UI mappings so STATE_* events project onto the entity graph. */\n  mappings?: AgUiStateMapping[];\n  /** Called with each token delta as it arrives. */\n  onDelta?: (token: string) => void;\n  /** Called with the fully accumulated text when the stream ends. */\n  onComplete?: (text: string) => void;\n  /** Called on stream error. */\n  onError?: (error: Error) => void;\n  /** CSS class on the root element. */\n  className?: string;\n  /** Render override for the accumulated content. */\n  renderContent?: (text: string, streaming: boolean) => React.ReactNode;\n  /** Placeholder shown before the first token arrives. */\n  placeholder?: React.ReactNode;\n}\n\n/**\n * EntityStream — consumes a live async-iterable of StreamEvents and renders\n * the accumulating text in real time.\n *\n * @example\n * ```tsx\n * <EntityStream\n *   stream={myAgentStream}\n *   mappings={[{ entityType: \"Draft\", pointer: \"/draft\", kind: \"single\" }]}\n *   onComplete={(text) => setGeneratedText(text)}\n * />\n * ```\n */\nexport function EntityStream({\n  stream,\n  mappings = [],\n  onDelta,\n  onComplete,\n  onError,\n  className,\n  renderContent,\n  placeholder,\n}: EntityStreamProps): React.ReactElement {\n  const [content, setContent] = useState(\"\");\n  const [streaming, setStreaming] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const contentRef = useRef(\"\");\n  const onDeltaRef = useRef(onDelta);\n  const onCompleteRef = useRef(onComplete);\n  const onErrorRef = useRef(onError);\n  onDeltaRef.current = onDelta;\n  onCompleteRef.current = onComplete;\n  onErrorRef.current = onError;\n\n  useEffect(() => {\n    if (!stream) return;\n\n    let cancelled = false;\n    contentRef.current = \"\";\n    setContent(\"\");\n    setError(null);\n    setStreaming(true);\n\n    const agentState: Record<string, unknown> = {};\n\n    void (async () => {\n      try {\n        for await (const event of stream) {\n          if (cancelled) break;\n\n          switch (event.type) {\n            case \"MESSAGE_DELTA\":\n            case \"TOOL_CALL_DELTA\": {\n              const token = event.delta ?? event.toolArgsDelta ?? \"\";\n              if (token) {\n                contentRef.current += token;\n                setContent(contentRef.current);\n                onDeltaRef.current?.(token);\n              }\n              break;\n            }\n\n            case \"STATE_SNAPSHOT\": {\n              if (!event.snapshot) break;\n              applyAgUiSnapshot(\n                { type: \"STATE_SNAPSHOT\", snapshot: event.snapshot },\n                { mappings }\n              );\n              Object.assign(agentState, event.snapshot);\n              break;\n            }\n\n            case \"STATE_DELTA\": {\n              if (!event.patch) break;\n              applyAgUiDelta(\n                {\n                  type: \"STATE_DELTA\",\n                  delta: event.patch as Parameters<typeof applyAgUiDelta>[0][\"delta\"],\n                },\n                { mappings },\n                Object.keys(agentState).length > 0 ? agentState : undefined\n              );\n              break;\n            }\n\n            case \"ERROR\": {\n              const msg = event.error ?? \"Stream error\";\n              setError(msg);\n              onErrorRef.current?.(new Error(msg));\n              break;\n            }\n\n            case \"DONE\":\n            case \"MESSAGE_END\":\n              break;\n\n            default:\n              break;\n          }\n        }\n      } catch (err) {\n        if (!cancelled) {\n          const msg = err instanceof Error ? err.message : String(err);\n          setError(msg);\n          onErrorRef.current?.(err instanceof Error ? err : new Error(msg));\n        }\n      } finally {\n        if (!cancelled) {\n          setStreaming(false);\n          onCompleteRef.current?.(contentRef.current);\n        }\n      }\n    })();\n\n    return () => {\n      cancelled = true;\n      setStreaming(false);\n    };\n    // mappings is intentionally excluded from deps — it's configuration that\n    // shouldn't restart the stream when it changes mid-flight.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [stream]);\n\n  if (error) {\n    return (\n      <div className={[\"a2ui-stream a2ui-stream--error\", className].filter(Boolean).join(\" \")} role=\"alert\">\n        {error}\n      </div>\n    );\n  }\n\n  const isEmpty = !content && !streaming;\n\n  return (\n    <div\n      className={[\"a2ui-stream\", streaming ? \"a2ui-stream--streaming\" : \"\", className].filter(Boolean).join(\" \")}\n      aria-live=\"polite\"\n      aria-atomic=\"false\"\n    >\n      {isEmpty && placeholder ? (\n        placeholder\n      ) : renderContent ? (\n        renderContent(content, streaming)\n      ) : (\n        <>\n          {content}\n          {streaming && <span className=\"a2ui-stream__cursor\" aria-hidden=\"true\">▍</span>}\n        </>\n      )}\n    </div>\n  );\n}\n","/**\n * use-entity-diff.ts — Compute field-level diffs between entity graph states.\n *\n * Reuses core time-travel primitives:\n * - recordGraphSnapshot / restoreGraphSnapshot from devtools-time-travel\n * - useGraphStore for current live entity data\n *\n * This hook does NOT write to the store during diff computation. It reads two\n * states (a \"before\" snapshot and the current live graph) and computes a\n * declarative FieldDiff[] — the rendering is left to EntityDiff / EntityApproval.\n *\n * Hook→Store: reads via useGraphStore.getState() (not via React subscribe) so\n * diff snapshots are point-in-time and do not cause continuous re-renders.\n */\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport {\n  graphStore,\n  useGraphStore,\n  recordGraphSnapshot,\n  restoreGraphSnapshot,\n  getTimeTravelState,\n} from \"@prometheus-ags/entity-graph-core\";\nimport { attachGraphDevtools } from \"@prometheus-ags/entity-graph-core/devtools\";\nimport type { FieldDiff, EntityDiffResult, DiffOperation } from \"./types.js\";\n\n// ── Primitive diff helpers ────────────────────────────────────────────────────\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n  if (a === b) return true;\n  if (typeof a !== typeof b) return false;\n  if (a === null || b === null) return false;\n  if (typeof a === \"object\") {\n    const aObj = a as Record<string, unknown>;\n    const bObj = b as Record<string, unknown>;\n    const aKeys = Object.keys(aObj);\n    const bKeys = Object.keys(bObj);\n    if (aKeys.length !== bKeys.length) return false;\n    return aKeys.every((k) => deepEqual(aObj[k], bObj[k]));\n  }\n  return false;\n}\n\nfunction computeFieldDiffs(\n  before: Record<string, unknown>,\n  after: Record<string, unknown>\n): FieldDiff[] {\n  const allKeys = new Set([...Object.keys(before), ...Object.keys(after)]);\n  const diffs: FieldDiff[] = [];\n\n  for (const field of allKeys) {\n    const bVal = before[field];\n    const aVal = after[field];\n\n    let op: DiffOperation;\n    if (!(field in before)) {\n      op = \"add\";\n    } else if (!(field in after)) {\n      op = \"remove\";\n    } else if (!deepEqual(bVal, aVal)) {\n      op = \"replace\";\n    } else {\n      op = \"unchanged\";\n    }\n\n    diffs.push({ field, op, before: bVal, after: aVal });\n  }\n\n  // Sort: changed fields first, then unchanged\n  diffs.sort((a, b) => {\n    const order = { add: 0, remove: 1, replace: 2, unchanged: 3 };\n    return order[a.op] - order[b.op];\n  });\n\n  return diffs;\n}\n\n// ── Hook ──────────────────────────────────────────────────────────────────────\n\nexport interface UseEntityDiffOptions {\n  entityType: string;\n  entityId: string;\n  /** If true, include unchanged fields in the result (default: false). */\n  includeUnchanged?: boolean;\n}\n\nexport interface UseEntityDiffReturn {\n  /** The computed diff for the entity. Null until a snapshot has been captured. */\n  diff: EntityDiffResult | null;\n  /** Capture the current graph state as the \"before\" baseline. */\n  captureBaseline: () => number;\n  /** The seq of the current baseline snapshot, or null. */\n  baselineSeq: number | null;\n  /** Restore the graph to the baseline (time-travel rewind). */\n  restoreBaseline: () => boolean;\n  /** Recompute the diff against the current live graph. */\n  recompute: () => void;\n}\n\n/**\n * useEntityDiff — compare the current live entity state against a captured baseline.\n *\n * @example\n * ```ts\n * const { diff, captureBaseline, restoreBaseline } = useEntityDiff({\n *   entityType: \"Order\",\n *   entityId: \"ord_123\",\n * });\n *\n * // Before the agent edits, capture the baseline:\n * captureBaseline();\n *\n * // After the agent has made changes, diff is populated:\n * diff?.fields.filter(f => f.op !== \"unchanged\")\n * ```\n */\nexport function useEntityDiff({\n  entityType,\n  entityId,\n  includeUnchanged = false,\n}: UseEntityDiffOptions): UseEntityDiffReturn {\n  const [baselineSeq, setBaselineSeq] = useState<number | null>(null);\n  const [diff, setDiff] = useState<EntityDiffResult | null>(null);\n\n  useEffect(() => {\n    const attachment = attachGraphDevtools(graphStore);\n    return () => attachment.detach();\n  }, []);\n\n  const captureBaseline = useCallback((): number => {\n    const seq = recordGraphSnapshot(`baseline:${entityType}:${entityId}`);\n    setBaselineSeq(seq);\n    // Reset diff since we have a new baseline\n    setDiff(null);\n    return seq;\n  }, [entityType, entityId]);\n\n  const recompute = useCallback(() => {\n    if (baselineSeq === null) return;\n\n    const ttState = getTimeTravelState();\n    const snapIdx = ttState.snapshots.findIndex((s) => s.seq === baselineSeq);\n    if (snapIdx === -1) return;\n\n    // Read baseline entity data — temporarily restore, read, then restore live\n    // We do NOT use restoreGraphSnapshot for reads here because we want to avoid\n    // a full store write for just reading. Instead we access the ring directly\n    // via the devtools API: restore → read → restore to head.\n    // Note: this is intentionally destructive to the live store. Callers should\n    // only call recompute() in controlled contexts (e.g. review panels).\n    const liveStore = useGraphStore.getState();\n    const liveEntity =\n      (liveStore.entities[entityType]?.[entityId] as Record<string, unknown> | undefined) ?? {};\n\n    // Save live state index\n    const liveSnapshot = recordGraphSnapshot(`live:${entityType}:${entityId}:pre-diff`);\n    const liveIdx = getTimeTravelState().snapshots.length - 1;\n\n    // Restore baseline to read it\n    restoreGraphSnapshot(snapIdx);\n    const baselineStore = useGraphStore.getState();\n    const baselineEntity =\n      (baselineStore.entities[entityType]?.[entityId] as Record<string, unknown> | undefined) ?? {};\n\n    // Restore live state\n    const liveRingIdx = getTimeTravelState().snapshots.findIndex(\n      (s) => s.seq === liveSnapshot\n    );\n    restoreGraphSnapshot(liveRingIdx !== -1 ? liveRingIdx : liveIdx);\n\n    const fields = computeFieldDiffs(baselineEntity, liveEntity).filter(\n      (f) => includeUnchanged || f.op !== \"unchanged\"\n    );\n\n    setDiff({\n      entityType,\n      entityId,\n      fields,\n      snapshotSeq: baselineSeq,\n    });\n  }, [baselineSeq, entityType, entityId, includeUnchanged]);\n\n  const restoreBaseline = useCallback((): boolean => {\n    if (baselineSeq === null) return false;\n    const ttState = getTimeTravelState();\n    const snapIdx = ttState.snapshots.findIndex((s) => s.seq === baselineSeq);\n    if (snapIdx === -1) return false;\n    return restoreGraphSnapshot(snapIdx);\n  }, [baselineSeq]);\n\n  return { diff, captureBaseline, baselineSeq, restoreBaseline, recompute };\n}\n","/**\n * entity-diff.tsx — EntityDiff: renders a field-level diff of an entity.\n *\n * Supports two modes:\n * - Uncontrolled: manages its own useEntityDiff state (showControls=true default)\n * - Controlled: accepts an external diff result via the `diff` prop (used by\n *   EntityApproval to share a single hook instance)\n *\n * Reuses core time-travel (recordGraphSnapshot / restoreGraphSnapshot) through\n * the useEntityDiff hook layer.\n */\n\nimport React from \"react\";\nimport { useEntityDiff, type UseEntityDiffOptions } from \"./use-entity-diff.js\";\nimport type { FieldDiff, EntityDiffResult } from \"./types.js\";\n\nexport interface EntityDiffClassNames {\n  root?: string;\n  table?: string;\n  headerRow?: string;\n  headerCell?: string;\n  row?: string;\n  rowAdd?: string;\n  rowRemove?: string;\n  rowReplace?: string;\n  rowUnchanged?: string;\n  cellField?: string;\n  cellBefore?: string;\n  cellAfter?: string;\n  cellOp?: string;\n  emptyState?: string;\n  controls?: string;\n  captureButton?: string;\n  recomputeButton?: string;\n  restoreButton?: string;\n}\n\nexport interface EntityDiffProps extends UseEntityDiffOptions {\n  /**\n   * Controlled mode: pass an external diff result (e.g. from a parent\n   * EntityApproval that owns the hook). When provided, the component's internal\n   * useEntityDiff hook is still created (hooks rules require unconditional calls)\n   * but rendering uses the controlled diff.\n   */\n  externalDiff?: EntityDiffResult | null;\n  /** Whether to show control buttons (capture/recompute/restore). Default: true */\n  showControls?: boolean;\n  /** Custom renderer for a single field diff row. */\n  renderRow?: (diff: FieldDiff, index: number) => React.ReactNode;\n  /** Custom value formatter; defaults to JSON.stringify. */\n  formatValue?: (value: unknown) => string;\n  classNames?: EntityDiffClassNames;\n  className?: string;\n}\n\nfunction defaultFormatValue(v: unknown): string {\n  if (v === undefined) return \"(none)\";\n  if (v === null) return \"null\";\n  if (typeof v === \"string\") return v;\n  return JSON.stringify(v);\n}\n\nfunction opLabel(op: FieldDiff[\"op\"]): string {\n  switch (op) {\n    case \"add\": return \"+\";\n    case \"remove\": return \"−\";\n    case \"replace\": return \"~\";\n    case \"unchanged\": return \"=\";\n  }\n}\n\nfunction rowClassForOp(op: FieldDiff[\"op\"], classNames: EntityDiffClassNames): string {\n  const base = classNames.row ?? \"a2ui-diff__row\";\n  const modifier = {\n    add: classNames.rowAdd ?? \"a2ui-diff__row--add\",\n    remove: classNames.rowRemove ?? \"a2ui-diff__row--remove\",\n    replace: classNames.rowReplace ?? \"a2ui-diff__row--replace\",\n    unchanged: classNames.rowUnchanged ?? \"a2ui-diff__row--unchanged\",\n  }[op];\n  return [base, modifier].join(\" \");\n}\n\n/**\n * EntityDiff — renders a before/after field-level diff for a single entity.\n */\nexport function EntityDiff({\n  entityType,\n  entityId,\n  includeUnchanged,\n  externalDiff,\n  showControls = true,\n  renderRow,\n  formatValue = defaultFormatValue,\n  classNames = {},\n  className,\n}: EntityDiffProps): React.ReactElement {\n  // Always call the hook (rules of hooks), but use externalDiff if provided.\n  const internal = useEntityDiff({ entityType, entityId, includeUnchanged });\n  const { diff, captureBaseline, restoreBaseline, recompute } = internal;\n\n  // Use controlled diff if provided, else the internal one.\n  const activeDiff = externalDiff !== undefined ? externalDiff : diff;\n\n  return (\n    <div\n      className={[classNames.root ?? \"a2ui-diff\", className].filter(Boolean).join(\" \")}\n      aria-label={`Field diff for ${entityType} ${entityId}`}\n    >\n      {showControls && (\n        <div className={classNames.controls ?? \"a2ui-diff__controls\"}>\n          <button\n            type=\"button\"\n            className={classNames.captureButton ?? \"a2ui-diff__btn a2ui-diff__btn--capture\"}\n            onClick={() => captureBaseline()}\n          >\n            Capture baseline\n          </button>\n          <button\n            type=\"button\"\n            className={classNames.recomputeButton ?? \"a2ui-diff__btn a2ui-diff__btn--recompute\"}\n            onClick={() => recompute()}\n          >\n            Recompute diff\n          </button>\n          <button\n            type=\"button\"\n            className={classNames.restoreButton ?? \"a2ui-diff__btn a2ui-diff__btn--restore\"}\n            onClick={() => restoreBaseline()}\n          >\n            Restore baseline\n          </button>\n        </div>\n      )}\n\n      {!activeDiff || activeDiff.fields.length === 0 ? (\n        <div className={classNames.emptyState ?? \"a2ui-diff__empty\"}>\n          {activeDiff ? \"No differences detected.\" : \"Capture a baseline to see diffs.\"}\n        </div>\n      ) : (\n        <table className={classNames.table ?? \"a2ui-diff__table\"} role=\"table\">\n          <thead>\n            <tr className={classNames.headerRow ?? \"a2ui-diff__header\"}>\n              <th className={classNames.headerCell ?? \"a2ui-diff__th\"} scope=\"col\">Op</th>\n              <th className={classNames.headerCell ?? \"a2ui-diff__th\"} scope=\"col\">Field</th>\n              <th className={classNames.headerCell ?? \"a2ui-diff__th\"} scope=\"col\">Before</th>\n              <th className={classNames.headerCell ?? \"a2ui-diff__th\"} scope=\"col\">After</th>\n            </tr>\n          </thead>\n          <tbody>\n            {activeDiff.fields.map((field, idx) =>\n              renderRow ? (\n                <React.Fragment key={field.field}>{renderRow(field, idx)}</React.Fragment>\n              ) : (\n                <tr\n                  key={field.field}\n                  className={rowClassForOp(field.op, classNames)}\n                  data-op={field.op}\n                >\n                  <td className={classNames.cellOp ?? \"a2ui-diff__td a2ui-diff__td--op\"}>\n                    <span aria-label={field.op}>{opLabel(field.op)}</span>\n                  </td>\n                  <td className={classNames.cellField ?? \"a2ui-diff__td a2ui-diff__td--field\"}>\n                    <code>{field.field}</code>\n                  </td>\n                  <td className={classNames.cellBefore ?? \"a2ui-diff__td a2ui-diff__td--before\"}>\n                    <code>{field.op !== \"add\" ? formatValue(field.before) : \"\"}</code>\n                  </td>\n                  <td className={classNames.cellAfter ?? \"a2ui-diff__td a2ui-diff__td--after\"}>\n                    <code>{field.op !== \"remove\" ? formatValue(field.after) : \"\"}</code>\n                  </td>\n                </tr>\n              )\n            )}\n          </tbody>\n        </table>\n      )}\n    </div>\n  );\n}\n","/**\n * entity-approval.tsx — EntityApproval: human-in-the-loop review of agent changes.\n *\n * Built on top of:\n * - useEntityDiff (which reuses recordGraphSnapshot / restoreGraphSnapshot)\n * - EntityDiff for the visual before/after diff table (controlled via externalDiff)\n *\n * Flow:\n * 1. Before the agent stream starts, `autoCapture` (default true) captures a\n *    baseline on mount.\n * 2. After the stream completes, click \"Refresh diff\" to recompute.\n * 3. User approves → `onApprove(diff)` is called; graph keeps new state.\n * 4. User rejects → `onReject(diff)` is called; graph is restored to baseline.\n *\n * Layering: Component → useEntityDiff hook → recordGraphSnapshot /\n * restoreGraphSnapshot (store writes). No direct store access here.\n */\n\nimport React, { useEffect } from \"react\";\nimport { EntityDiff } from \"./entity-diff.js\";\nimport { useEntityDiff } from \"./use-entity-diff.js\";\nimport type { EntityDiffResult } from \"./types.js\";\n\nexport interface EntityApprovalProps {\n  entityType: string;\n  entityId: string;\n  /** Automatically capture a baseline snapshot on mount. Default: true */\n  autoCapture?: boolean;\n  /** Include unchanged fields in the diff view. Default: false */\n  includeUnchanged?: boolean;\n  /** Called when the user approves; the entity graph keeps the new state. */\n  onApprove?: (diff: EntityDiffResult) => void;\n  /** Called when the user rejects; the graph is rewound to the baseline. */\n  onReject?: (diff: EntityDiffResult) => void;\n  /** Label for the approve button. Default: \"Approve\" */\n  approveLabel?: string;\n  /** Label for the reject/restore button. Default: \"Reject & Restore\" */\n  rejectLabel?: string;\n  /** Title heading. */\n  title?: string;\n  /** Additional CSS class on the root element. */\n  className?: string;\n  /** Render override for the diff section. */\n  renderDiff?: (diff: EntityDiffResult | null) => React.ReactNode;\n  /** Render override for the action buttons. */\n  renderActions?: (opts: {\n    onApprove: () => void;\n    onReject: () => void;\n    hasChanges: boolean;\n  }) => React.ReactNode;\n}\n\n/**\n * EntityApproval — human-in-the-loop gate for agent-proposed entity changes.\n *\n * @example\n * ```tsx\n * <EntityApproval\n *   entityType=\"Invoice\"\n *   entityId=\"inv_456\"\n *   autoCapture\n *   onApprove={(diff) => console.log(\"Approved\", diff)}\n *   onReject={(diff) => console.log(\"Rejected, graph restored\", diff)}\n * />\n * ```\n */\nexport function EntityApproval({\n  entityType,\n  entityId,\n  autoCapture = true,\n  includeUnchanged = false,\n  onApprove,\n  onReject,\n  approveLabel = \"Approve\",\n  rejectLabel = \"Reject & Restore\",\n  title,\n  className,\n  renderDiff,\n  renderActions,\n}: EntityApprovalProps): React.ReactElement {\n  const { diff, captureBaseline, recompute, restoreBaseline } = useEntityDiff({\n    entityType,\n    entityId,\n    includeUnchanged,\n  });\n\n  useEffect(() => {\n    if (autoCapture) {\n      captureBaseline();\n    }\n    // Only run on mount / entity identity changes\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [entityType, entityId]);\n\n  const hasChanges = Boolean(diff && diff.fields.length > 0);\n\n  const handleApprove = () => {\n    if (diff) onApprove?.(diff);\n  };\n\n  const handleReject = () => {\n    const wasRestored = restoreBaseline();\n    if (wasRestored && diff) onReject?.(diff);\n  };\n\n  const displayTitle = title ?? `Review changes — ${entityType} ${entityId}`;\n\n  return (\n    <section\n      className={[\"a2ui-approval\", className].filter(Boolean).join(\" \")}\n      aria-label={displayTitle}\n    >\n      <header className=\"a2ui-approval__header\">\n        <h2 className=\"a2ui-approval__title\">{displayTitle}</h2>\n        <button\n          type=\"button\"\n          className=\"a2ui-approval__btn a2ui-approval__btn--recompute\"\n          onClick={() => recompute()}\n          aria-label=\"Refresh diff\"\n        >\n          Refresh diff\n        </button>\n      </header>\n\n      <div className=\"a2ui-approval__body\">\n        {renderDiff ? (\n          renderDiff(diff)\n        ) : (\n          // Pass diff as externalDiff so EntityDiff uses our hook's state\n          <EntityDiff\n            entityType={entityType}\n            entityId={entityId}\n            includeUnchanged={includeUnchanged}\n            showControls={false}\n            externalDiff={diff}\n          />\n        )}\n      </div>\n\n      <footer className=\"a2ui-approval__footer\">\n        {renderActions ? (\n          renderActions({\n            onApprove: handleApprove,\n            onReject: handleReject,\n            hasChanges,\n          })\n        ) : (\n          <>\n            <button\n              type=\"button\"\n              className=\"a2ui-approval__btn a2ui-approval__btn--approve\"\n              onClick={handleApprove}\n              disabled={!hasChanges}\n              aria-label={approveLabel}\n            >\n              {approveLabel}\n            </button>\n            <button\n              type=\"button\"\n              className=\"a2ui-approval__btn a2ui-approval__btn--reject\"\n              onClick={handleReject}\n              disabled={!hasChanges}\n              aria-label={rejectLabel}\n            >\n              {rejectLabel}\n            </button>\n          </>\n        )}\n      </footer>\n    </section>\n  );\n}\n","/**\n * entity-tool-provider.tsx — React context for EntityToolProvider injection.\n *\n * MCP / function-calling is a PROGRESSIVE ENHANCEMENT. Wrap your app (or a\n * subtree) with <EntityToolProviderContext.Provider> to enable tool execution.\n * When no provider is present, EntityChat / EntityCopilot still render but\n * tool calls appear as unexecuted in the message list.\n *\n * This module also exports useEntityToolProvider() which EntityChat and\n * EntityCopilot use to read the nearest provider. Passing a `toolProvider`\n * prop to those components overrides the context.\n */\n\nimport React, { createContext, useContext, type ReactNode } from \"react\";\nimport type { EntityToolProvider } from \"./types.js\";\n\nconst EntityToolProviderCtx = createContext<EntityToolProvider | null>(null);\n\nexport interface EntityToolProviderProps {\n  provider: EntityToolProvider;\n  children: ReactNode;\n}\n\n/**\n * EntityToolProviderContext — wrap a subtree to make a tool provider available\n * to all EntityChat and EntityCopilot components underneath.\n *\n * @example\n * ```tsx\n * <EntityToolProviderContext provider={myMcpProvider}>\n *   <App />\n * </EntityToolProviderContext>\n * ```\n */\nexport function EntityToolProviderContext({\n  provider,\n  children,\n}: EntityToolProviderProps): React.ReactElement {\n  return (\n    <EntityToolProviderCtx.Provider value={provider}>\n      {children}\n    </EntityToolProviderCtx.Provider>\n  );\n}\n\n/**\n * useEntityToolProvider — read the nearest injected EntityToolProvider.\n * Returns null when no provider has been injected (MCP is not available).\n */\nexport function useEntityToolProvider(): EntityToolProvider | null {\n  return useContext(EntityToolProviderCtx);\n}\n"]}