@agent-native/core 0.14.3 → 0.14.5

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.
Files changed (35) hide show
  1. package/dist/agent/production-agent.d.ts.map +1 -1
  2. package/dist/agent/production-agent.js +23 -1
  3. package/dist/agent/production-agent.js.map +1 -1
  4. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  5. package/dist/agent/thread-data-builder.js +13 -2
  6. package/dist/agent/thread-data-builder.js.map +1 -1
  7. package/dist/client/sharing/ShareButton.d.ts +18 -5
  8. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  9. package/dist/client/sharing/ShareButton.js +8 -45
  10. package/dist/client/sharing/ShareButton.js.map +1 -1
  11. package/dist/client/sharing/ShareButton.spec.js +13 -31
  12. package/dist/client/sharing/ShareButton.spec.js.map +1 -1
  13. package/dist/client/sse-event-processor.d.ts.map +1 -1
  14. package/dist/client/sse-event-processor.js +19 -4
  15. package/dist/client/sse-event-processor.js.map +1 -1
  16. package/dist/server/auth.d.ts.map +1 -1
  17. package/dist/server/auth.js +25 -2
  18. package/dist/server/auth.js.map +1 -1
  19. package/dist/server/google-auth-plugin.d.ts.map +1 -1
  20. package/dist/server/google-auth-plugin.js +17 -1
  21. package/dist/server/google-auth-plugin.js.map +1 -1
  22. package/dist/server/google-oauth.d.ts.map +1 -1
  23. package/dist/server/google-oauth.js +4 -0
  24. package/dist/server/google-oauth.js.map +1 -1
  25. package/dist/server/oauth-return-url.d.ts +1 -0
  26. package/dist/server/oauth-return-url.d.ts.map +1 -1
  27. package/dist/server/oauth-return-url.js +36 -2
  28. package/dist/server/oauth-return-url.js.map +1 -1
  29. package/dist/server/onboarding-html.d.ts.map +1 -1
  30. package/dist/server/onboarding-html.js +17 -1
  31. package/dist/server/onboarding-html.js.map +1 -1
  32. package/dist/server/ssr-handler.d.ts.map +1 -1
  33. package/dist/server/ssr-handler.js +35 -2
  34. package/dist/server/ssr-handler.js.map +1 -1
  35. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ShareButton.js","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAEL,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GAET,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,EACf,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAiDjD,2EAA2E;AAC3E,uEAAuE;AACvE,MAAM,WAAW,GACf,0VAA0V,CAAC;AAC7V,MAAM,iBAAiB,GAAG,EAAE,CAC1B,WAAW,EACX,wQAAwQ,CACzQ,CAAC;AACF,MAAM,iBAAiB,GAAG,EAAE,CAC1B,WAAW,EACX,iEAAiE,CAClE,CAAC;AACF,MAAM,iBAAiB,GAAG,EAAE,CAC1B,WAAW,EACX,gFAAgF,CACjF,CAAC;AACF,MAAM,qBAAqB,GACzB,sGAAsG,CAAC;AAEzG,MAAM,QAAQ,GAGV;IACF,OAAO,EAAE;QACP,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,kCAAkC;QAC/C,IAAI,EAAE,QAAQ;KACf;IACD,GAAG,EAAE;QACH,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,sCAAsC;QACnD,IAAI,EAAE,YAAY;KACnB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,+BAA+B;QAC5C,IAAI,EAAE,SAAS;KAChB;CACF,CAAC;AAEF,SAAS,cAAc,CACrB,UAAsB,EACtB,IAAyC;IAEzC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC;IACpC,OAAO;QACL,GAAG,IAAI;QACP,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK;QACpC,WAAW,EAAE,QAAQ,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW;KACvD,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAChB;IACE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;IAC7D,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;IAC7D;QACE,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,4BAA4B;KAC1C;CACF,CAAC;AAEJ;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CACxD,IAAI,CACL,CAAC;IACF,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,gBAAgB,GAAG,OAAO,CAC9B,GAAG,EAAE,CAAC,CAAC;QACL,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,EACF,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,CACvC,CAAC;IACF,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,sBAAsB,EAAE,gBAAgB,CAAU,EACnE,CAAC,gBAAgB,CAAC,CACnB,CAAC;IACF,MAAM,aAAa,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,cAAc,CAChC,sBAAsB,EACtB,gBAAgB,CACjB,CAAC;IACF,MAAM,gBAAgB,GAAG,CAAC,CAAU,EAAE,EAAE;QACtC,OAAO,CAAC,CAAC,CAAC,CAAC;QACX,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,iBAAiB,KAAK,IAAI;YAAE,WAAW,CAAC,OAAO,EAAE,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,sBAAsB,GAAG,CAAC,UAAsB,EAAE,EAAE;QACxD,WAAW,CAAC,YAAY,CAAiB,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAC/D,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CACtC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,sBAAsB,GAAG,CAAC,IAAgB,EAAiB,EAAE;QACjE,MAAM,SAAS,GAAG,EAAE,mBAAmB,CAAC,OAAO,CAAC;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAiB,aAAa,CAAC,CAAC;QACzE,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC3B,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,aAAa,CAAC,MAAM,CAClB;gBACE,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,IAAI;aACV,EACR;gBACE,SAAS,EAAE,CAAC,MAAW,EAAE,EAAE;oBACzB,IAAI,SAAS,KAAK,mBAAmB,CAAC,OAAO,EAAE,CAAC;wBAC9C,sBAAsB,CACnB,MAAM,EAAE,UAAqC,IAAI,IAAI,CACvD,CAAC;oBACJ,CAAC;oBACD,WAAW;yBACR,OAAO,EAAE;yBACT,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;yBACrB,KAAK,CAAC,MAAM,CAAC;yBACb,OAAO,CAAC,GAAG,EAAE;wBACZ,IAAI,SAAS,KAAK,mBAAmB,CAAC,OAAO,EAAE,CAAC;4BAC9C,oBAAoB,CAAC,IAAI,CAAC,CAAC;wBAC7B,CAAC;oBACH,CAAC,CAAC,CAAC;gBACP,CAAC;gBACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,IAAI,SAAS,KAAK,mBAAmB,CAAC,OAAO,EAAE,CAAC;wBAC9C,oBAAoB,CAAC,IAAI,CAAC,CAAC;wBAC3B,IAAI,QAAQ,EAAE,CAAC;4BACb,WAAW,CAAC,YAAY,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;wBACpD,CAAC;6BAAM,CAAC;4BACN,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;wBAC7D,CAAC;oBACH,CAAC;oBACD,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;aACF,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,qEAAqE;IACrE,sEAAsE;IACtE,mEAAmE;IACnE,sEAAsE;IACtE,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,KAAK,SAAS,CAAC;IAC9C,MAAM,gBAAgB,GACnB,WAAW,CAAC,IAAI,EAAE,UAAgC,IAAI,SAAS,CAAC;IACnE,MAAM,iBAAiB,GAAG,iBAAiB,IAAI,gBAAgB,CAAC;IAChE,MAAM,WAAW,GACf,iBAAiB,KAAK,QAAQ;QAC5B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,iBAAiB,KAAK,KAAK;YAC3B,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,QAAQ,CAAC;IAEjB,OAAO,CACL,MAAC,OAAO,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,gBAAgB,aACjD,KAAC,cAAc,IAAC,OAAO,kBACrB,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,iBAAiB,aAC/C,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,WAAW,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,GAAI,CAC7C,CAAC,CAAC,CAAC,CACF,oCAEE,SAAS,EAAC,wDAAwD,GAClE,CACH,EACD,mCAAkB,IACX,GACM,EACjB,KAAC,cAAc,IACb,KAAK,EAAC,KAAK,EACX,UAAU,EAAE,CAAC,EACb,SAAS,EAAE,EAAE,CACX,uDAAuD,EACvD,qBAAqB,CACtB,EACD,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,YAE1C,KAAC,UAAU,OACL,KAAK,EACT,WAAW,EAAE,WAAW,EACxB,kBAAkB,EAAE,iBAAiB,EACrC,kBAAkB,EAAE,sBAAsB,EAC1C,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,GACtC,GACa,IACT,CACX,CAAC;AACJ,CAAC;AAOD,SAAS,aAAa;IACpB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAc,EAAE,CAAC,CAAC;IACxD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,CAAC,eAAe,CAAC,4BAA4B,CAAC,CAAC;aACjD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACrC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,SAAS,IAAI,CAAC,IAAI;gBAAE,OAAO;YAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,UAAU,CACR,IAAI;iBACD,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBAChB,KAAK,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBAClD,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;aAClD,CAAC,CAAC;iBACF,MAAM,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CACrC,CAAC;QACJ,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnB,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CACjB,KAKC;IAED,MAAM,EACJ,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,OAAO,GACR,GAAG,KAAK,CAAC;IAEV,MAAM,KAAK,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IAEtD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAO,QAAQ,CAAC,CAAC;IACjD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,sBAAsB,YAAY,IAAI,UAAU,EAAE,CAAC;IAEtE,8CAA8C;IAC9C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAU,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAuB,EAAE,CAAC,CAAC;IAC7E,sEAAsE;IACtE,oEAAoE;IACpE,wEAAwE;IACxE,wEAAwE;IACxE,yDAAyD;IACzD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAChC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE,CAClC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEL,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,OAAO,EAAE,CAAC;QACtB,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC;IACrC,MAAM,UAAU,GACd,kBAAkB,IAAK,IAAI,EAAE,UAAgC,IAAI,SAAS,CAAC;IAC7E,MAAM,SAAS,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,IAAI,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IACnE,MAAM,IAAI,GAAG,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAE9D,MAAM,YAAY,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;IACxC,MAAM,MAAM,GAAY;QACtB,GAAG,YAAY;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,GAAG,WAAW;KACf,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,IAAgB,EAAE,EAAE;QAC5C,IAAI,IAAI,KAAK,UAAU;YAAE,OAAO;QAChC,KAAK,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,UAAU,GAAU;YACxB,EAAE,EAAE,WAAW,OAAO,EAAE;YACxB,aAAa,EAAE,MAAM;YACrB,WAAW,EAAE,OAAO;YACpB,IAAI;SACL,CAAC;QACF,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5B,6EAA6E;QAC7E,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO;QAC5B,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;QAC1C,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,WAAW,CAAC,CAAC,CAAC,CAAC;QACf,KAAK,CAAC,MAAM,CACV;YACE,YAAY;YACZ,UAAU;YACV,aAAa,EAAE,MAAM;YACrB,WAAW,EAAE,OAAO;YACpB,IAAI;YACJ,MAAM,EAAE,YAAY;YACpB,WAAW,EAAE,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC;SACzC,EACR;YACE,SAAS,EAAE,GAAG,EAAE;gBACd,WAAW,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBAC9B,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC/D,aAAa,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,GAAG,EAAE;gBACZ,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/D,aAAa,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;SACF,CACF,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,CAAQ,EAAE,IAAU,EAAE,EAAE;QAChD,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,mEAAmE;QACnE,sEAAsE;QACtE,sEAAsE;QACtE,oCAAoC;QACpC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO;QAC5B,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrD,WAAW,CAAC,CAAC,CAAC,CAAC;QACf,mEAAmE;QACnE,yEAAyE;QACzE,KAAK,CAAC,MAAM,CACV;YACE,YAAY;YACZ,UAAU;YACV,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,KAAK;SACP,EACR;YACE,SAAS,EAAE,GAAG,EAAE;gBACd,WAAW,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBAC9B,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;wBACxB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;wBACjC,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC,CAAC;oBACH,aAAa,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,GAAG,EAAE;gBACZ,gBAAgB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACxB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;oBACjC,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC;gBACH,aAAa,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;SACF,CACF,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,CAAQ,EAAE,EAAE;QAChC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,uEAAuE;QACvE,wEAAwE;QACxE,iEAAiE;QACjE,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO;QAC5B,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,WAAW,CAAC,CAAC,CAAC,CAAC;QACf,OAAO,CAAC,MAAM,CACZ;YACE,YAAY;YACZ,UAAU;YACV,aAAa,EAAE,CAAC,CAAC,aAAa;YAC9B,WAAW,EAAE,CAAC,CAAC,WAAW;SACpB,EACR;YACE,SAAS,EAAE,GAAG,EAAE;gBACd,WAAW,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBAC9B,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE;wBACzB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;wBAC3B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wBACf,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC,CAAC;oBACH,aAAa,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,GAAG,EAAE;gBACZ,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE;oBACzB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC3B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACf,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC,CAAC;gBACH,aAAa,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;SACF,CACF,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,SAAS,IAAI,cAAc;YAAE,SAAS,EAAE,CAAC;QAC7C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,aAAa;QAC7B,CAAC,CAAC,UAAU,aAAa,GAAG;QAC5B,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC;IAE5B,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,0BACE,cACE,SAAS,EAAC,uCAAuC,EACjD,KAAK,EAAE,SAAS,YAEf,SAAS,GACN,EACN,cAAK,SAAS,EAAC,4CAA4C,GAAG,EAC9D,cAAK,SAAS,EAAC,4BAA4B,mCAAyB,EACpE,cAAK,SAAS,EAAC,4CAA4C,GAAG,EAC9D,cAAK,SAAS,EAAC,4BAA4B,+BAAqB,EAChE,cAAK,SAAS,EAAC,4CAA4C,GAAG,EAC9D,cAAK,SAAS,EAAC,uBAAuB,YACpC,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,qBAE3D,GACL,IACF,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,0BACE,cAAK,SAAS,EAAC,uCAAuC,EAAC,KAAK,EAAE,SAAS,YACpE,SAAS,GACN,EAEL,SAAS,CAAC,CAAC,CAAC,CACX,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,0BAA0B,aACvC,gBACE,IAAI,EAAC,OAAO,EACZ,WAAW,EAAC,qBAAqB,EACjC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oCACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;wCAAE,SAAS,EAAE,CAAC;gCACrC,CAAC,EACD,IAAI,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EACpD,YAAY,EAAC,KAAK,EAClB,SAAS,EAAC,iOAAiO,GAC3O,EACD,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACvB,mBAAU,EAAE,EAAE,UAAU,YACrB,UAAU;qCACR,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,IAAI,EAAE,UAAU;oCACxC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CACpC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,aAAa,KAAK,MAAM;wCAC1B,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,KAAK,CAC5B,CACJ;qCACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACV,iBAEE,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,KAAK,EAAE,CAAC,CAAC,IAAI,IAAI,SAAS,IAFrB,CAAC,CAAC,KAAK,CAGZ,CACH,CAAC,GACK,CACZ,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,UAAU,IAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,GAAI,IAC1C,EACL,cAAc,CAAC,CAAC,CAAC,CAChB,iBAAO,SAAS,EAAC,8DAA8D,aAC7E,gBACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAClD,SAAS,EAAC,6CAA6C,GACvD,qBAEI,CACT,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC,CAAC,CAAC,IAAI,EAER,cAAK,SAAS,EAAC,4BAA4B,mCAAyB,EACpE,cAAI,SAAS,EAAC,4CAA4C,aACvD,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAClB,cAAI,SAAS,EAAC,6CAA6C,aACzD,KAAC,MAAM,IAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAI,EAC3D,eAAM,SAAS,EAAC,yBAAyB,YACtC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GACpC,EACP,eAAM,SAAS,EAAC,+BAA+B,sBAAa,IACzD,CACN,CAAC,CAAC,CAAC,IAAI,EACP,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACjB,cAEE,SAAS,EAAE,EAAE,CACX,6CAA6C,EAC7C,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CACvC,aAED,KAAC,MAAM,IACL,KAAK,EACH,CAAC,CAAC,aAAa,KAAK,KAAK;oCACvB,CAAC,CAAC,CAAC,CAAC,WAAW;oCACf,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,EAE5C,GAAG,EAAE,CAAC,CAAC,aAAa,KAAK,KAAK,GAC9B,EACF,eAAM,SAAS,EAAC,yBAAyB,YACtC,CAAC,CAAC,aAAa,KAAK,KAAK;oCACxB,CAAC,CAAC,CAAC,CAAC,WAAW;oCACf,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,GACrC,EACN,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,UAAU,IACT,KAAK,EAAE,CAAC,CAAC,IAAI,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EACvC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAChC,KAAK,SACL,CACH,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,+BAA+B,YAC5C,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GACP,CACR,EACA,SAAS,CAAC,CAAC,CAAC,CACX,iBACE,IAAI,EAAC,QAAQ,gBACF,QAAQ,EACnB,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAC9B,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAChC,SAAS,EAAE,iBAAiB,YAE5B,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,GAChB,CACV,CAAC,CAAC,CAAC,IAAI,KAzCH,KAAK,CAAC,CAAC,CAAC,CA0CV,CACN,CAAC,EACD,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CACrC,aAAI,SAAS,EAAC,2CAA2C,uCAEpD,CACN,CAAC,CAAC,CAAC,IAAI,IACL,EAEL,cAAK,SAAS,EAAC,4BAA4B,+BAAqB,EAChE,eAAK,SAAS,EAAC,8BAA8B,aAC3C,oCAEE,SAAS,EAAC,sGAAsG,YAEhH,KAAC,IAAI,CAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,GAAI,GACrC,EACP,eAAK,SAAS,EAAC,gBAAgB,aAC7B,KAAC,gBAAgB,IACf,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,CAAC,SAAS,EACpB,cAAc,EAAE,KAAK,CAAC,cAAc,GACpC,EACF,cAAK,SAAS,EAAC,sCAAsC,YAClD,IAAI,CAAC,WAAW,GACb,IACF,IACF,EAEL,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAClB,cAAK,SAAS,EAAC,oFAAoF,YAChG,KAAK,CAAC,UAAU,GACb,CACP,CAAC,CAAC,CAAC,IAAI,EAEP,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAChB,KAAC,aAAa,IACZ,KAAK,EAAE,KAAK,CAAC,QAAQ,EACrB,KAAK,EAAE,KAAK,CAAC,aAAa,EAC1B,WAAW,EAAE,KAAK,CAAC,mBAAmB,EACtC,WAAW,EAAE,KAAK,CAAC,sBAAsB,IAAI,UAAU,KAAK,QAAQ,EACpE,sBAAsB,EACpB,KAAK,CAAC,8BAA8B;oBACpC,CAAC,SAAS;wBACR,CAAC,CAAC,sDAAsD;wBACxD,CAAC,CAAC,mEAAmE,CAAC,EAE1E,sBAAsB,EACpB,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,YAAY,EAEnD,0BAA0B,EAAC,kBAAkB,EAC7C,mBAAmB,EACjB,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,GAE5D,CACH,CAAC,CAAC,CAAC,IAAI,EAER,cAAK,SAAS,EAAC,uBAAuB,YACpC,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,iBAAiB,qBAGrB,GACL,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,KAAK,EACL,KAAK,GAAG,YAAY,EACpB,WAAW,EACX,WAAW,GAAG,KAAK,EACnB,sBAAsB,EACtB,sBAAsB,GAAG,aAAa,EACtC,0BAA0B,GAAG,YAAY,EACzC,mBAAmB,GAUpB;IACC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAgC,SAAS,CAAC,CAAC;IAElE,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,QAAQ,CAAC,OAAO;gBAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,IAAI,QAAQ,CAAC,OAAO;YAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrD,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QAC3B,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3C,UAAU,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,SAAS,EAAE,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,uBAAuB,GAAG,KAAK,IAAI,EAAE;QACzC,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,IAAI,CAAC;YACH,MAAM,mBAAmB,EAAE,CAAC;YAC5B,MAAM,SAAS,EAAE,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW;QAC5B,CAAC,CAAC,+CAA+C;QACjD,CAAC,CAAC,KAAK,CAAC;IAEV,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,cAAK,SAAS,EAAC,4BAA4B,YAAE,KAAK,GAAO,EACxD,WAAW,CAAC,CAAC,CAAC,CACb,cAAK,SAAS,EAAC,oCAAoC,YAAE,WAAW,GAAO,CACxE,CAAC,CAAC,CAAC,IAAI,EACP,WAAW,IAAI,sBAAsB,CAAC,CAAC,CAAC,CACvC,cAAK,SAAS,EAAC,0FAA0F,YACtG,sBAAsB,GACnB,CACP,CAAC,CAAC,CAAC,IAAI,EACR,eAAK,SAAS,EAAC,iCAAiC,aAC9C,gBACE,QAAQ,QACR,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,UAAU,mBACF,WAAW,EAC1B,SAAS,EAAE,EAAE,CACX,mGAAmG,EACnG,WAAW,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,eAAe,CACjE,EACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;4BACjB,IAAI,CAAC,WAAW;gCAAE,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;wBACjD,CAAC,GACD,EACF,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,UAAU,EAC3D,QAAQ,EAAE,WAAW,IAAI,CAAC,mBAAmB,EAC7C,SAAS,EAAC,mJAAmJ,aAE5J,MAAM,CAAC,CAAC,CAAC,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,EACzD,IAAI;gCACH,CAAC,CAAC,0BAA0B;gCAC5B,CAAC,CAAC,WAAW;oCACX,CAAC,CAAC,sBAAsB;oCACxB,CAAC,CAAC,MAAM;wCACN,CAAC,CAAC,QAAQ;wCACV,CAAC,CAAC,MAAM,IACP,IACL,IACF,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,gFAAgF;AAChF,8EAA8E;AAE9E,MAAM,kBAAkB,GACtB,iPAAiP,CAAC;AACpP,MAAM,eAAe,GACnB,8NAA8N,CAAC;AAQjO,SAAS,WAAW,CAAC,EAAE,KAAK,EAAoC;IAC9D,OAAO,CACL,4BACG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CACjB,MAAC,MAAM,CAAC,IAAI,IAEV,KAAK,EAAE,EAAE,CAAC,KAAK,EACf,SAAS,EAAE,eAAe,aAE1B,eAAM,SAAS,EAAC,gEAAgE,YAC9E,KAAC,MAAM,CAAC,aAAa,cACnB,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,GACF,GAClB,EACP,gBAAM,SAAS,EAAC,eAAe,aAC7B,KAAC,MAAM,CAAC,QAAQ,cAAE,EAAE,CAAC,KAAK,GAAmB,EAC5C,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAChB,eAAM,SAAS,EAAC,+BAA+B,YAC5C,EAAE,CAAC,WAAW,GACV,CACR,CAAC,CAAC,CAAC,IAAI,IACH,KAhBF,EAAE,CAAC,KAAK,CAiBD,CACf,CAAC,GACD,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAOnB;IACC,MAAM,OAAO,GACX,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IACvE,OAAO,CACL,MAAC,MAAM,CAAC,IAAI,IACV,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAS,CAAC,EAC/C,QAAQ,EAAE,KAAK,CAAC,QAAQ,aAExB,MAAC,MAAM,CAAC,OAAO,IACb,SAAS,EACP,KAAK,CAAC,KAAK;oBACT,CAAC,CAAC,EAAE,CACA,WAAW,EACX,4FAA4F,CAC7F;oBACH,CAAC,CAAC,EAAE,CACA,WAAW,EACX,yFAAyF,CAC1F,gBAEI,MAAM,aAEjB,KAAC,MAAM,CAAC,KAAK,cAAE,OAAO,CAAC,KAAK,GAAgB,EAC5C,KAAC,MAAM,CAAC,IAAI,cACV,KAAC,eAAe,IAAC,IAAI,EAAE,EAAE,GAAI,GACjB,IACC,EACjB,KAAC,MAAM,CAAC,MAAM,cACZ,KAAC,MAAM,CAAC,OAAO,IACb,SAAS,EAAE,kBAAkB,EAC7B,QAAQ,EAAC,QAAQ,EACjB,UAAU,EAAE,CAAC,YAEb,KAAC,MAAM,CAAC,QAAQ,cACd,KAAC,WAAW,IAAC,KAAK,EAAE,YAAY,GAAI,GACpB,GACH,GACH,IACJ,CACf,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAKzB;IACC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAClE,OAAO,CACL,MAAC,MAAM,CAAC,IAAI,IACV,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAe,CAAC,EACrD,QAAQ,EAAE,KAAK,CAAC,QAAQ,aAExB,MAAC,MAAM,CAAC,OAAO,IACb,SAAS,EAAE,EAAE,CACX,WAAW,EACX,4FAA4F,CAC7F,gBACU,gBAAgB,aAE3B,KAAC,MAAM,CAAC,KAAK,cAAE,OAAO,CAAC,KAAK,GAAgB,EAC5C,KAAC,MAAM,CAAC,IAAI,cACV,KAAC,eAAe,IAAC,IAAI,EAAE,EAAE,GAAI,GACjB,IACC,EACjB,KAAC,MAAM,CAAC,MAAM,cACZ,KAAC,MAAM,CAAC,OAAO,IACb,SAAS,EAAE,kBAAkB,EAC7B,QAAQ,EAAC,QAAQ,EACjB,UAAU,EAAE,CAAC,YAEb,KAAC,MAAM,CAAC,QAAQ,cACd,KAAC,WAAW,IACV,KAAK,EAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gCACzD,KAAK,EAAE,CAAC;gCACR,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,KAAK;gCACpD,WAAW,EAAE,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC;qCACjD,WAAW;6BACf,CAAC,CAAC,GACH,GACc,GACH,GACH,IACJ,CACf,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAoC;IAC9D,OAAO,CACL,oCAEE,SAAS,EAAC,gIAAgI,YAEzI,GAAG,CAAC,CAAC,CAAC,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,GAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GACjE,CACR,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,CAAQ;IACrB,OAAO,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAC/C,CAAC;AACD,SAAS,kBAAkB,CAAC,QAAiB;IAC3C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACpD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC9B,CAAC;AACD,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AACD,SAAS,QAAQ,CAAC,CAAS;IACzB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,OAAoB;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACrD,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACxD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n IconLock,\n IconBuilding,\n IconWorld,\n IconTrash,\n IconCheck,\n IconChevronDown,\n IconCopy,\n} from \"@tabler/icons-react\";\nimport * as Select from \"@radix-ui/react-select\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { useActionQuery, useActionMutation } from \"../use-action.js\";\nimport { cn } from \"../utils.js\";\nimport { agentNativePath } from \"../api-path.js\";\n\nexport interface ShareButtonProps {\n resourceType: string;\n resourceId: string;\n resourceTitle?: string;\n /** @deprecated No longer affects rendering — trigger always says\n * \"Share\". Kept for callsite compatibility. */\n variant?: \"compact\" | \"label\";\n /** Notified when the share popover opens or closes. Hosts that render the\n * button next to an iframe use this to disable the iframe's pointer events\n * while the popover is open, so popover hover/clicks aren't swallowed. */\n onOpenChange?: (open: boolean) => void;\n /** Optional public/share URL shown as a copyable link in the popover. */\n shareUrl?: string;\n /** Optional label for the copyable link section. */\n shareUrlLabel?: string;\n /** Optional helper text for the copyable link section. */\n shareUrlDescription?: ReactNode;\n /** When true, the share URL is only copyable after visibility is public. */\n shareUrlRequiresPublic?: boolean;\n /** Optional helper text shown when the share URL requires public visibility. */\n shareUrlUnavailableDescription?: ReactNode;\n /** Optional template-specific copy for the visibility picker. */\n visibilityCopy?: Partial<\n Record<Visibility, { label?: string; description?: string }>\n >;\n /** Optional note rendered between general access and the copyable link. */\n accessNote?: ReactNode;\n}\n\ntype Visibility = \"private\" | \"org\" | \"public\";\ntype Role = \"viewer\" | \"editor\" | \"admin\";\n\ninterface Share {\n id: string;\n principalType: \"user\" | \"org\";\n principalId: string;\n role: Role;\n}\n\ninterface SharesResponse {\n ownerEmail: string | null;\n orgId: string | null;\n visibility: Visibility | null;\n role?: \"owner\" | Role;\n shares: Share[];\n}\n\n// Mirror shadcn's <Button size=\"sm\" variant=\"outline\"> class string so the\n// trigger sits flush next to other sm outline buttons in the template.\nconst BUTTON_BASE =\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\";\nconst BUTTON_OUTLINE_SM = cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-[hsl(var(--sidebar-border,var(--input)))] bg-[hsl(var(--sidebar-background,var(--background)))] text-foreground hover:bg-[hsl(var(--sidebar-accent,var(--accent)))] hover:text-[hsl(var(--sidebar-accent-foreground,var(--accent-foreground)))]\",\n);\nconst BUTTON_PRIMARY_SM = cn(\n BUTTON_BASE,\n \"h-9 px-4 bg-primary text-primary-foreground hover:bg-primary/90\",\n);\nconst BUTTON_GHOST_ICON = cn(\n BUTTON_BASE,\n \"h-7 w-7 p-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n);\nconst SHARE_POPOVER_SURFACE =\n \"border-[hsl(var(--sidebar-border,var(--border)))] bg-[hsl(var(--sidebar-background,var(--popover)))]\";\n\nconst VIS_META: Record<\n Visibility,\n { label: string; description: string; Icon: typeof IconLock }\n> = {\n private: {\n label: \"Private\",\n description: \"Only people with access can view\",\n Icon: IconLock,\n },\n org: {\n label: \"Organization\",\n description: \"Anyone in your organization can view\",\n Icon: IconBuilding,\n },\n public: {\n label: \"Public\",\n description: \"Anyone with the link can view\",\n Icon: IconWorld,\n },\n};\n\nfunction visibilityMeta(\n visibility: Visibility,\n copy?: ShareButtonProps[\"visibilityCopy\"],\n): (typeof VIS_META)[Visibility] {\n const base = VIS_META[visibility];\n const override = copy?.[visibility];\n return {\n ...base,\n label: override?.label ?? base.label,\n description: override?.description ?? base.description,\n };\n}\n\nconst ROLE_OPTIONS: Array<{ value: Role; label: string; description: string }> =\n [\n { value: \"viewer\", label: \"Viewer\", description: \"Can view\" },\n { value: \"editor\", label: \"Editor\", description: \"Can edit\" },\n {\n value: \"admin\",\n label: \"Admin\",\n description: \"Can edit and manage access\",\n },\n ];\n\n/**\n * Framework share control. Renders a shadcn-outline-styled trigger that\n * opens a Google-Docs-style popover anchored beneath it. Uses Tailwind\n * + CSS variables so the same component renders natively in light and\n * dark mode in any shadcn template.\n */\nexport function ShareButton(props: ShareButtonProps) {\n const [open, setOpen] = useState(false);\n const [pendingVisibility, setPendingVisibility] = useState<Visibility | null>(\n null,\n );\n const visibilityRequestId = useRef(0);\n const queryClient = useQueryClient();\n const shareQueryParams = useMemo(\n () => ({\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n }),\n [props.resourceType, props.resourceId],\n );\n const shareQueryKey = useMemo(\n () => [\"action\", \"list-resource-shares\", shareQueryParams] as const,\n [shareQueryParams],\n );\n const setVisibility = useActionMutation(\"set-resource-visibility\");\n const sharesQuery = useActionQuery<SharesResponse>(\n \"list-resource-shares\",\n shareQueryParams,\n );\n const handleOpenChange = (v: boolean) => {\n setOpen(v);\n props.onOpenChange?.(v);\n if (v && pendingVisibility === null) sharesQuery.refetch();\n };\n\n const updateCachedVisibility = (visibility: Visibility) => {\n queryClient.setQueryData<SharesResponse>(shareQueryKey, (prev) =>\n prev ? { ...prev, visibility } : prev,\n );\n };\n\n const handleVisibilityChange = (next: Visibility): Promise<void> => {\n const requestId = ++visibilityRequestId.current;\n const previous = queryClient.getQueryData<SharesResponse>(shareQueryKey);\n setPendingVisibility(next);\n updateCachedVisibility(next);\n return new Promise((resolve, reject) => {\n setVisibility.mutate(\n {\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n visibility: next,\n } as any,\n {\n onSuccess: (result: any) => {\n if (requestId === visibilityRequestId.current) {\n updateCachedVisibility(\n (result?.visibility as Visibility | undefined) ?? next,\n );\n }\n sharesQuery\n .refetch()\n .then(() => resolve())\n .catch(reject)\n .finally(() => {\n if (requestId === visibilityRequestId.current) {\n setPendingVisibility(null);\n }\n });\n },\n onError: (error) => {\n if (requestId === visibilityRequestId.current) {\n setPendingVisibility(null);\n if (previous) {\n queryClient.setQueryData(shareQueryKey, previous);\n } else {\n queryClient.invalidateQueries({ queryKey: shareQueryKey });\n }\n }\n reject(error);\n },\n },\n );\n });\n };\n\n // The trigger always says \"Share\" — the icon reflects the resource's\n // current visibility (lock / building / globe), matching Google Docs.\n // While the query is loading and we don't know the visibility yet,\n // render a skeleton placeholder in the icon slot instead of guessing.\n const loaded = sharesQuery.data !== undefined;\n const serverVisibility =\n (sharesQuery.data?.visibility as Visibility | null) ?? \"private\";\n const currentVisibility = pendingVisibility ?? serverVisibility;\n const TriggerIcon =\n currentVisibility === \"public\"\n ? IconWorld\n : currentVisibility === \"org\"\n ? IconBuilding\n : IconLock;\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button type=\"button\" className={BUTTON_OUTLINE_SM}>\n {loaded ? (\n <TriggerIcon size={16} strokeWidth={1.75} />\n ) : (\n <span\n aria-hidden\n className=\"inline-block h-4 w-4 rounded-sm bg-muted animate-pulse\"\n />\n )}\n <span>Share</span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className={cn(\n \"z-[2000] w-[min(460px,92vw)] rounded-lg p-4 shadow-lg\",\n SHARE_POPOVER_SURFACE,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <SharePanel\n {...props}\n sharesQuery={sharesQuery}\n visibilityOverride={pendingVisibility}\n onVisibilityChange={handleVisibilityChange}\n onClose={() => handleOpenChange(false)}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface OrgMember {\n email: string;\n name?: string | null;\n}\n\nfunction useOrgMembers(): OrgMember[] {\n const [members, setMembers] = useState<OrgMember[]>([]);\n useEffect(() => {\n let cancelled = false;\n fetch(agentNativePath(\"/_agent-native/org/members\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (cancelled || !data) return;\n const list = Array.isArray(data?.members) ? data.members : [];\n setMembers(\n list\n .map((m: any) => ({\n email: typeof m?.email === \"string\" ? m.email : \"\",\n name: typeof m?.name === \"string\" ? m.name : null,\n }))\n .filter((m: OrgMember) => m.email),\n );\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n return members;\n}\n\nfunction SharePanel(\n props: ShareButtonProps & {\n sharesQuery: ReturnType<typeof useActionQuery<SharesResponse>>;\n visibilityOverride: Visibility | null;\n onVisibilityChange: (visibility: Visibility) => Promise<void>;\n onClose: () => void;\n },\n) {\n const {\n resourceType,\n resourceId,\n resourceTitle,\n sharesQuery,\n visibilityOverride,\n onVisibilityChange,\n onClose,\n } = props;\n\n const share = useActionMutation(\"share-resource\");\n const unshare = useActionMutation(\"unshare-resource\");\n\n const [email, setEmail] = useState(\"\");\n const [role, setRole] = useState<Role>(\"viewer\");\n const [notifyPeople, setNotifyPeople] = useState(true);\n const hasInviteEmail = email.trim().length > 0;\n const orgMembers = useOrgMembers();\n const datalistId = `share-autocomplete-${resourceType}-${resourceId}`;\n\n // Optimistic overlays so clicks feel instant.\n const [pendingAdds, setPendingAdds] = useState<Share[]>([]);\n const [pendingRemoves, setPendingRemoves] = useState<Set<string>>(new Set());\n const [roleOverrides, setRoleOverrides] = useState<Record<string, Role>>({});\n // Principals with an in-flight share/unshare mutation. We disable the\n // role dropdown and the trash button for any share in this set so a\n // user can't race a role-change against a remove (which would otherwise\n // let the upsert silently re-grant access after the delete landed), and\n // can't rapid-fire two creates for the same pending add.\n const [inFlight, setInFlight] = useState<Set<string>>(new Set());\n const addInFlight = (k: string) =>\n setInFlight((prev) => new Set(prev).add(k));\n const clearInFlight = (k: string) =>\n setInFlight((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n\n useEffect(() => {\n sharesQuery.refetch();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const data = sharesQuery.data;\n const isLoading = data === undefined;\n const visibility: Visibility =\n visibilityOverride ?? (data?.visibility as Visibility | null) ?? \"private\";\n const canManage = data?.role === \"owner\" || data?.role === \"admin\";\n const meta = visibilityMeta(visibility, props.visibilityCopy);\n\n const serverShares = data?.shares ?? [];\n const shares: Share[] = [\n ...serverShares\n .filter((s) => !pendingRemoves.has(keyOf(s)))\n .map((s) => ({ ...s, role: roleOverrides[keyOf(s)] ?? s.role })),\n ...pendingAdds,\n ];\n\n const handleVisibility = (next: Visibility) => {\n if (next === visibility) return;\n void onVisibilityChange(next).catch(() => {});\n };\n\n const handleAdd = () => {\n const trimmed = email.trim();\n if (!trimmed) return;\n const optimistic: Share = {\n id: `pending-${trimmed}`,\n principalType: \"user\",\n principalId: trimmed,\n role,\n };\n const k = keyOf(optimistic);\n // Ignore duplicate submits while an add for the same principal is in flight.\n if (inFlight.has(k)) return;\n setPendingAdds((p) => [...p, optimistic]);\n setEmail(\"\");\n addInFlight(k);\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: \"user\",\n principalId: trimmed,\n role,\n notify: notifyPeople,\n resourceUrl: getNotificationUrl(props.shareUrl),\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n });\n },\n onError: () => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleChangeRole = (s: Share, next: Role) => {\n if (s.role === next) return;\n const k = keyOf(s);\n // Don't stack a role change on top of an in-flight add/remove/role\n // change for the same principal — it can race with unshare and end up\n // re-granting access after a delete. UI already disables the control,\n // but belt-and-suspenders here too.\n if (inFlight.has(k)) return;\n setRoleOverrides((prev) => ({ ...prev, [k]: next }));\n addInFlight(k);\n // share-resource is upsert: calling with same principal + new role\n // updates the existing share row. See sharing/actions/share-resource.ts.\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n role: next,\n notify: false,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleRemove = (s: Share) => {\n const k = keyOf(s);\n // If any other mutation is in flight for this principal, don't start a\n // remove — it can interleave with an upsert and leave the row in place.\n // The UI already disables the trash button when inFlight.has(k).\n if (inFlight.has(k)) return;\n setPendingRemoves((prev) => new Set(prev).add(k));\n addInFlight(k);\n unshare.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleDone = () => {\n if (canManage && hasInviteEmail) handleAdd();\n onClose();\n };\n\n const titleText = resourceTitle\n ? `Share \"${resourceTitle}\"`\n : `Share ${resourceType}`;\n\n if (isLoading) {\n return (\n <div>\n <div\n className=\"mb-3 truncate text-base font-semibold\"\n title={titleText}\n >\n {titleText}\n </div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <div className=\"mb-4 h-7 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mt-2 flex justify-end\">\n <button type=\"button\" onClick={onClose} className={BUTTON_PRIMARY_SM}>\n Done\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <div className=\"mb-3 truncate text-base font-semibold\" title={titleText}>\n {titleText}\n </div>\n\n {canManage ? (\n <div className=\"mb-4 space-y-2\">\n <div className=\"flex items-stretch gap-2\">\n <input\n type=\"email\"\n placeholder=\"Add people by email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAdd();\n }}\n list={orgMembers.length > 0 ? datalistId : undefined}\n autoComplete=\"off\"\n className=\"flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n {orgMembers.length > 0 ? (\n <datalist id={datalistId}>\n {orgMembers\n .filter(\n (m) =>\n m.email !== sharesQuery.data?.ownerEmail &&\n !(sharesQuery.data?.shares ?? []).some(\n (s) =>\n s.principalType === \"user\" &&\n s.principalId === m.email,\n ),\n )\n .map((m) => (\n <option\n key={m.email}\n value={m.email}\n label={m.name ?? undefined}\n />\n ))}\n </datalist>\n ) : null}\n <RoleSelect value={role} onChange={setRole} />\n </div>\n {hasInviteEmail ? (\n <label className=\"inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={notifyPeople}\n onChange={(e) => setNotifyPeople(e.target.checked)}\n className=\"h-4 w-4 rounded border-input accent-primary\"\n />\n Notify people\n </label>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <ul className=\"mb-4 flex flex-col gap-1 list-none p-0 m-0\">\n {data?.ownerEmail ? (\n <li className=\"flex items-center gap-3 px-1 py-1.5 text-sm\">\n <Avatar label={displayName(data.ownerEmail, orgMembers)} />\n <span className=\"flex-1 min-w-0 truncate\">\n {displayName(data.ownerEmail, orgMembers)}\n </span>\n <span className=\"text-xs text-muted-foreground\">Owner</span>\n </li>\n ) : null}\n {shares.map((s) => (\n <li\n key={keyOf(s)}\n className={cn(\n \"flex items-center gap-3 px-1 py-1.5 text-sm\",\n inFlight.has(keyOf(s)) && \"opacity-60\",\n )}\n >\n <Avatar\n label={\n s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)\n }\n org={s.principalType === \"org\"}\n />\n <span className=\"flex-1 min-w-0 truncate\">\n {s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)}\n </span>\n {canManage ? (\n <RoleSelect\n value={s.role}\n onChange={(r) => handleChangeRole(s, r)}\n disabled={inFlight.has(keyOf(s))}\n plain\n />\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {cap(s.role)}\n </span>\n )}\n {canManage ? (\n <button\n type=\"button\"\n aria-label=\"Remove\"\n onClick={() => handleRemove(s)}\n disabled={inFlight.has(keyOf(s))}\n className={BUTTON_GHOST_ICON}\n >\n <IconTrash size={14} />\n </button>\n ) : null}\n </li>\n ))}\n {!shares.length && !data?.ownerEmail ? (\n <li className=\"px-1 py-1.5 text-sm text-muted-foreground\">\n No one has access yet.\n </li>\n ) : null}\n </ul>\n\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 flex items-center gap-3\">\n <span\n aria-hidden\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\"\n >\n <meta.Icon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <VisibilitySelect\n value={visibility}\n onChange={handleVisibility}\n disabled={!canManage}\n visibilityCopy={props.visibilityCopy}\n />\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {meta.description}\n </div>\n </div>\n </div>\n\n {props.accessNote ? (\n <div className=\"mb-4 rounded-md border border-border bg-muted/35 p-3 text-xs text-muted-foreground\">\n {props.accessNote}\n </div>\n ) : null}\n\n {props.shareUrl ? (\n <CopyLinkField\n value={props.shareUrl}\n label={props.shareUrlLabel}\n description={props.shareUrlDescription}\n unavailable={props.shareUrlRequiresPublic && visibility !== \"public\"}\n unavailableDescription={\n props.shareUrlUnavailableDescription ??\n (canManage\n ? \"Make general access public before copying this link.\"\n : \"This link is not public. Ask an owner or admin to make it public.\")\n }\n unavailableActionLabel={\n canManage ? \"Make public and copy\" : \"Not public\"\n }\n unavailableActionBusyLabel=\"Making public...\"\n onUnavailableAction={\n canManage ? () => onVisibilityChange(\"public\") : undefined\n }\n />\n ) : null}\n\n <div className=\"mt-2 flex justify-end\">\n <button\n type=\"button\"\n onClick={handleDone}\n className={BUTTON_PRIMARY_SM}\n >\n Done\n </button>\n </div>\n </div>\n );\n}\n\nfunction CopyLinkField({\n value,\n label = \"Share link\",\n description,\n unavailable = false,\n unavailableDescription,\n unavailableActionLabel = \"Unavailable\",\n unavailableActionBusyLabel = \"Working...\",\n onUnavailableAction,\n}: {\n value: string;\n label?: string;\n description?: ReactNode;\n unavailable?: boolean;\n unavailableDescription?: ReactNode;\n unavailableActionLabel?: string;\n unavailableActionBusyLabel?: string;\n onUnavailableAction?: () => Promise<void> | void;\n}) {\n const [copied, setCopied] = useState(false);\n const [busy, setBusy] = useState(false);\n const resetRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n return () => {\n if (resetRef.current) clearTimeout(resetRef.current);\n };\n }, []);\n\n const markCopied = () => {\n setCopied(true);\n if (resetRef.current) clearTimeout(resetRef.current);\n resetRef.current = setTimeout(() => setCopied(false), 1400);\n };\n\n const copyValue = async () => {\n await navigator.clipboard.writeText(value);\n markCopied();\n };\n\n const handleCopy = async () => {\n try {\n await copyValue();\n } catch {\n setCopied(false);\n }\n };\n\n const handleUnavailableAction = async () => {\n if (!onUnavailableAction) return;\n setBusy(true);\n try {\n await onUnavailableAction();\n await copyValue();\n } catch {\n setCopied(false);\n } finally {\n setBusy(false);\n }\n };\n\n const inputValue = unavailable\n ? \"Link available after general access is Public\"\n : value;\n\n return (\n <div className=\"mb-4\">\n <div className=\"mb-2 text-sm font-semibold\">{label}</div>\n {description ? (\n <div className=\"mb-2 text-xs text-muted-foreground\">{description}</div>\n ) : null}\n {unavailable && unavailableDescription ? (\n <div className=\"mb-2 rounded-md border border-border bg-muted/35 px-3 py-2 text-xs text-muted-foreground\">\n {unavailableDescription}\n </div>\n ) : null}\n <div className=\"flex min-w-0 items-center gap-2\">\n <input\n readOnly\n disabled={unavailable}\n value={inputValue}\n aria-disabled={unavailable}\n className={cn(\n \"h-9 min-w-0 flex-1 rounded-md border border-input px-3 text-sm text-muted-foreground outline-none\",\n unavailable ? \"cursor-not-allowed bg-muted/40\" : \"bg-background\",\n )}\n onFocus={(event) => {\n if (!unavailable) event.currentTarget.select();\n }}\n />\n <button\n type=\"button\"\n onClick={unavailable ? handleUnavailableAction : handleCopy}\n disabled={unavailable && !onUnavailableAction}\n className=\"inline-flex h-9 shrink-0 items-center gap-2 rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground hover:bg-accent\"\n >\n {copied ? <IconCheck size={15} /> : <IconCopy size={15} />}\n {busy\n ? unavailableActionBusyLabel\n : unavailable\n ? unavailableActionLabel\n : copied\n ? \"Copied\"\n : \"Copy\"}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Radix Select wrappers styled like shadcn Select (no native <select> anywhere)\n// ---------------------------------------------------------------------------\n\nconst selectContentClass =\n \"z-[2100] min-w-[12rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\";\nconst selectItemClass =\n \"relative flex w-full cursor-pointer select-none items-start gap-2 rounded-sm py-2 pl-8 pr-3 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\ninterface ShadSelectItemProps {\n value: string;\n label: string;\n description?: string;\n}\n\nfunction SelectItems({ items }: { items: ShadSelectItemProps[] }) {\n return (\n <>\n {items.map((it) => (\n <Select.Item\n key={it.value}\n value={it.value}\n className={selectItemClass}\n >\n <span className=\"absolute left-2 top-2 flex h-4 w-4 items-center justify-center\">\n <Select.ItemIndicator>\n <IconCheck size={14} />\n </Select.ItemIndicator>\n </span>\n <span className=\"flex flex-col\">\n <Select.ItemText>{it.label}</Select.ItemText>\n {it.description ? (\n <span className=\"text-xs text-muted-foreground\">\n {it.description}\n </span>\n ) : null}\n </span>\n </Select.Item>\n ))}\n </>\n );\n}\n\nfunction RoleSelect(props: {\n value: Role;\n onChange: (v: Role) => void;\n disabled?: boolean;\n /** When true, render as inline text + chevron (no border / bg) — matches\n * the per-person role picker in Google Docs. */\n plain?: boolean;\n}) {\n const current =\n ROLE_OPTIONS.find((o) => o.value === props.value) ?? ROLE_OPTIONS[0];\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Role)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={\n props.plain\n ? cn(\n BUTTON_BASE,\n \"h-7 px-2 bg-transparent text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n )\n : cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n )\n }\n aria-label=\"Role\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems items={ROLE_OPTIONS} />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction VisibilitySelect(props: {\n value: Visibility;\n onChange: (v: Visibility) => void;\n disabled?: boolean;\n visibilityCopy?: ShareButtonProps[\"visibilityCopy\"];\n}) {\n const current = visibilityMeta(props.value, props.visibilityCopy);\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Visibility)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={cn(\n BUTTON_BASE,\n \"h-7 px-1 -ml-1 bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground\",\n )}\n aria-label=\"General access\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems\n items={(Object.keys(VIS_META) as Visibility[]).map((k) => ({\n value: k,\n label: visibilityMeta(k, props.visibilityCopy).label,\n description: visibilityMeta(k, props.visibilityCopy)\n .description,\n }))}\n />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction Avatar({ label, org }: { label: string; org?: boolean }) {\n return (\n <span\n aria-hidden\n className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground\"\n >\n {org ? <IconBuilding size={14} strokeWidth={1.75} /> : initials(label)}\n </span>\n );\n}\n\nfunction keyOf(s: Share): string {\n return `${s.principalType}:${s.principalId}`;\n}\nfunction getNotificationUrl(explicit?: string): string | undefined {\n if (explicit) return explicit;\n if (typeof window === \"undefined\") return undefined;\n return window.location.href;\n}\nfunction cap(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\nfunction initials(s: string): string {\n const name = s.split(\"@\")[0] ?? s;\n return (name[0] ?? \"?\").toUpperCase();\n}\n\nfunction displayName(email: string, members: OrgMember[]): string {\n const match = members.find((m) => m.email === email);\n if (match?.name && match.name.trim()) return match.name;\n return email;\n}\n"]}
1
+ {"version":3,"file":"ShareButton.js","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n IconLock,\n IconBuilding,\n IconWorld,\n IconTrash,\n IconCheck,\n IconChevronDown,\n IconCopy,\n} from \"@tabler/icons-react\";\nimport * as Select from \"@radix-ui/react-select\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport { useActionQuery, useActionMutation } from \"../use-action.js\";\nimport { cn } from \"../utils.js\";\nimport { agentNativePath } from \"../api-path.js\";\n\nexport interface ShareButtonProps {\n resourceType: string;\n resourceId: string;\n resourceTitle?: string;\n /** @deprecated No longer affects rendering — trigger always says\n * \"Share\". Kept for callsite compatibility. */\n variant?: \"compact\" | \"label\";\n /** Notified when the share popover opens or closes. Hosts that render the\n * button next to an iframe use this to disable the iframe's pointer events\n * while the popover is open, so popover hover/clicks aren't swallowed. */\n onOpenChange?: (open: boolean) => void;\n /** Optional public/share URL shown as a copyable link in the popover.\n * This is treated as the primary \"Copy link\" target — same convention\n * as Google Docs' Share dialog, which copies the editor URL. */\n shareUrl?: string;\n /** Optional label for the primary copyable link section. */\n shareUrlLabel?: string;\n /** Optional helper text for the primary copyable link section. */\n shareUrlDescription?: ReactNode;\n /** Optional secondary copyable link (e.g. a presentation / read-only\n * surface for the same resource). Anyone with at least viewer access\n * can open it — access is enforced on the resource itself, not the\n * URL shape, so we never gate this behind visibility. */\n secondaryShareUrl?: string;\n /** Optional label for the secondary copyable link. */\n secondaryShareUrlLabel?: string;\n /** Optional helper text for the secondary copyable link. */\n secondaryShareUrlDescription?: ReactNode;\n /** @deprecated No longer enforced — access is checked on the resource,\n * not the URL shape, mirroring Google Slides. Kept for callsite\n * compatibility; the prop is now a no-op. */\n shareUrlRequiresPublic?: boolean;\n /** @deprecated See `shareUrlRequiresPublic`. No longer rendered. */\n shareUrlUnavailableDescription?: ReactNode;\n /** Optional template-specific copy for the visibility picker. */\n visibilityCopy?: Partial<\n Record<Visibility, { label?: string; description?: string }>\n >;\n /** Optional note rendered between general access and the copyable link. */\n accessNote?: ReactNode;\n}\n\ntype Visibility = \"private\" | \"org\" | \"public\";\ntype Role = \"viewer\" | \"editor\" | \"admin\";\n\ninterface Share {\n id: string;\n principalType: \"user\" | \"org\";\n principalId: string;\n role: Role;\n}\n\ninterface SharesResponse {\n ownerEmail: string | null;\n orgId: string | null;\n visibility: Visibility | null;\n role?: \"owner\" | Role;\n shares: Share[];\n}\n\n// Mirror shadcn's <Button size=\"sm\" variant=\"outline\"> class string so the\n// trigger sits flush next to other sm outline buttons in the template.\nconst BUTTON_BASE =\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\";\nconst BUTTON_OUTLINE_SM = cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-[hsl(var(--sidebar-border,var(--input)))] bg-[hsl(var(--sidebar-background,var(--background)))] text-foreground hover:bg-[hsl(var(--sidebar-accent,var(--accent)))] hover:text-[hsl(var(--sidebar-accent-foreground,var(--accent-foreground)))]\",\n);\nconst BUTTON_PRIMARY_SM = cn(\n BUTTON_BASE,\n \"h-9 px-4 bg-primary text-primary-foreground hover:bg-primary/90\",\n);\nconst BUTTON_GHOST_ICON = cn(\n BUTTON_BASE,\n \"h-7 w-7 p-0 text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n);\nconst SHARE_POPOVER_SURFACE =\n \"border-[hsl(var(--sidebar-border,var(--border)))] bg-[hsl(var(--sidebar-background,var(--popover)))]\";\n\nconst VIS_META: Record<\n Visibility,\n { label: string; description: string; Icon: typeof IconLock }\n> = {\n private: {\n label: \"Private\",\n description: \"Only people with access can view\",\n Icon: IconLock,\n },\n org: {\n label: \"Organization\",\n description: \"Anyone in your organization can view\",\n Icon: IconBuilding,\n },\n public: {\n label: \"Public\",\n description: \"Anyone with the link can view\",\n Icon: IconWorld,\n },\n};\n\nfunction visibilityMeta(\n visibility: Visibility,\n copy?: ShareButtonProps[\"visibilityCopy\"],\n): (typeof VIS_META)[Visibility] {\n const base = VIS_META[visibility];\n const override = copy?.[visibility];\n return {\n ...base,\n label: override?.label ?? base.label,\n description: override?.description ?? base.description,\n };\n}\n\nconst ROLE_OPTIONS: Array<{ value: Role; label: string; description: string }> =\n [\n { value: \"viewer\", label: \"Viewer\", description: \"Can view\" },\n { value: \"editor\", label: \"Editor\", description: \"Can edit\" },\n {\n value: \"admin\",\n label: \"Admin\",\n description: \"Can edit and manage access\",\n },\n ];\n\n/**\n * Framework share control. Renders a shadcn-outline-styled trigger that\n * opens a Google-Docs-style popover anchored beneath it. Uses Tailwind\n * + CSS variables so the same component renders natively in light and\n * dark mode in any shadcn template.\n */\nexport function ShareButton(props: ShareButtonProps) {\n const [open, setOpen] = useState(false);\n const [pendingVisibility, setPendingVisibility] = useState<Visibility | null>(\n null,\n );\n const visibilityRequestId = useRef(0);\n const queryClient = useQueryClient();\n const shareQueryParams = useMemo(\n () => ({\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n }),\n [props.resourceType, props.resourceId],\n );\n const shareQueryKey = useMemo(\n () => [\"action\", \"list-resource-shares\", shareQueryParams] as const,\n [shareQueryParams],\n );\n const setVisibility = useActionMutation(\"set-resource-visibility\");\n const sharesQuery = useActionQuery<SharesResponse>(\n \"list-resource-shares\",\n shareQueryParams,\n );\n const handleOpenChange = (v: boolean) => {\n setOpen(v);\n props.onOpenChange?.(v);\n if (v && pendingVisibility === null) sharesQuery.refetch();\n };\n\n const updateCachedVisibility = (visibility: Visibility) => {\n queryClient.setQueryData<SharesResponse>(shareQueryKey, (prev) =>\n prev ? { ...prev, visibility } : prev,\n );\n };\n\n const handleVisibilityChange = (next: Visibility): Promise<void> => {\n const requestId = ++visibilityRequestId.current;\n const previous = queryClient.getQueryData<SharesResponse>(shareQueryKey);\n setPendingVisibility(next);\n updateCachedVisibility(next);\n return new Promise((resolve, reject) => {\n setVisibility.mutate(\n {\n resourceType: props.resourceType,\n resourceId: props.resourceId,\n visibility: next,\n } as any,\n {\n onSuccess: (result: any) => {\n if (requestId === visibilityRequestId.current) {\n updateCachedVisibility(\n (result?.visibility as Visibility | undefined) ?? next,\n );\n }\n sharesQuery\n .refetch()\n .then(() => resolve())\n .catch(reject)\n .finally(() => {\n if (requestId === visibilityRequestId.current) {\n setPendingVisibility(null);\n }\n });\n },\n onError: (error) => {\n if (requestId === visibilityRequestId.current) {\n setPendingVisibility(null);\n if (previous) {\n queryClient.setQueryData(shareQueryKey, previous);\n } else {\n queryClient.invalidateQueries({ queryKey: shareQueryKey });\n }\n }\n reject(error);\n },\n },\n );\n });\n };\n\n // The trigger always says \"Share\" — the icon reflects the resource's\n // current visibility (lock / building / globe), matching Google Docs.\n // While the query is loading and we don't know the visibility yet,\n // render a skeleton placeholder in the icon slot instead of guessing.\n const loaded = sharesQuery.data !== undefined;\n const serverVisibility =\n (sharesQuery.data?.visibility as Visibility | null) ?? \"private\";\n const currentVisibility = pendingVisibility ?? serverVisibility;\n const TriggerIcon =\n currentVisibility === \"public\"\n ? IconWorld\n : currentVisibility === \"org\"\n ? IconBuilding\n : IconLock;\n\n return (\n <Popover open={open} onOpenChange={handleOpenChange}>\n <PopoverTrigger asChild>\n <button type=\"button\" className={BUTTON_OUTLINE_SM}>\n {loaded ? (\n <TriggerIcon size={16} strokeWidth={1.75} />\n ) : (\n <span\n aria-hidden\n className=\"inline-block h-4 w-4 rounded-sm bg-muted animate-pulse\"\n />\n )}\n <span>Share</span>\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={6}\n className={cn(\n \"z-[2000] w-[min(460px,92vw)] rounded-lg p-4 shadow-lg\",\n SHARE_POPOVER_SURFACE,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <SharePanel\n {...props}\n sharesQuery={sharesQuery}\n visibilityOverride={pendingVisibility}\n onVisibilityChange={handleVisibilityChange}\n onClose={() => handleOpenChange(false)}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface OrgMember {\n email: string;\n name?: string | null;\n}\n\nfunction useOrgMembers(): OrgMember[] {\n const [members, setMembers] = useState<OrgMember[]>([]);\n useEffect(() => {\n let cancelled = false;\n fetch(agentNativePath(\"/_agent-native/org/members\"))\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (cancelled || !data) return;\n const list = Array.isArray(data?.members) ? data.members : [];\n setMembers(\n list\n .map((m: any) => ({\n email: typeof m?.email === \"string\" ? m.email : \"\",\n name: typeof m?.name === \"string\" ? m.name : null,\n }))\n .filter((m: OrgMember) => m.email),\n );\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n return members;\n}\n\nfunction SharePanel(\n props: ShareButtonProps & {\n sharesQuery: ReturnType<typeof useActionQuery<SharesResponse>>;\n visibilityOverride: Visibility | null;\n onVisibilityChange: (visibility: Visibility) => Promise<void>;\n onClose: () => void;\n },\n) {\n const {\n resourceType,\n resourceId,\n resourceTitle,\n sharesQuery,\n visibilityOverride,\n onVisibilityChange,\n onClose,\n } = props;\n\n const share = useActionMutation(\"share-resource\");\n const unshare = useActionMutation(\"unshare-resource\");\n\n const [email, setEmail] = useState(\"\");\n const [role, setRole] = useState<Role>(\"viewer\");\n const [notifyPeople, setNotifyPeople] = useState(true);\n const hasInviteEmail = email.trim().length > 0;\n const orgMembers = useOrgMembers();\n const datalistId = `share-autocomplete-${resourceType}-${resourceId}`;\n\n // Optimistic overlays so clicks feel instant.\n const [pendingAdds, setPendingAdds] = useState<Share[]>([]);\n const [pendingRemoves, setPendingRemoves] = useState<Set<string>>(new Set());\n const [roleOverrides, setRoleOverrides] = useState<Record<string, Role>>({});\n // Principals with an in-flight share/unshare mutation. We disable the\n // role dropdown and the trash button for any share in this set so a\n // user can't race a role-change against a remove (which would otherwise\n // let the upsert silently re-grant access after the delete landed), and\n // can't rapid-fire two creates for the same pending add.\n const [inFlight, setInFlight] = useState<Set<string>>(new Set());\n const addInFlight = (k: string) =>\n setInFlight((prev) => new Set(prev).add(k));\n const clearInFlight = (k: string) =>\n setInFlight((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n\n useEffect(() => {\n sharesQuery.refetch();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const data = sharesQuery.data;\n const isLoading = data === undefined;\n const visibility: Visibility =\n visibilityOverride ?? (data?.visibility as Visibility | null) ?? \"private\";\n const canManage = data?.role === \"owner\" || data?.role === \"admin\";\n const meta = visibilityMeta(visibility, props.visibilityCopy);\n\n const serverShares = data?.shares ?? [];\n const shares: Share[] = [\n ...serverShares\n .filter((s) => !pendingRemoves.has(keyOf(s)))\n .map((s) => ({ ...s, role: roleOverrides[keyOf(s)] ?? s.role })),\n ...pendingAdds,\n ];\n\n const handleVisibility = (next: Visibility) => {\n if (next === visibility) return;\n void onVisibilityChange(next).catch(() => {});\n };\n\n const handleAdd = () => {\n const trimmed = email.trim();\n if (!trimmed) return;\n const optimistic: Share = {\n id: `pending-${trimmed}`,\n principalType: \"user\",\n principalId: trimmed,\n role,\n };\n const k = keyOf(optimistic);\n // Ignore duplicate submits while an add for the same principal is in flight.\n if (inFlight.has(k)) return;\n setPendingAdds((p) => [...p, optimistic]);\n setEmail(\"\");\n addInFlight(k);\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: \"user\",\n principalId: trimmed,\n role,\n notify: notifyPeople,\n resourceUrl: getNotificationUrl(props.shareUrl),\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n });\n },\n onError: () => {\n setPendingAdds((p) => p.filter((s) => s.id !== optimistic.id));\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleChangeRole = (s: Share, next: Role) => {\n if (s.role === next) return;\n const k = keyOf(s);\n // Don't stack a role change on top of an in-flight add/remove/role\n // change for the same principal — it can race with unshare and end up\n // re-granting access after a delete. UI already disables the control,\n // but belt-and-suspenders here too.\n if (inFlight.has(k)) return;\n setRoleOverrides((prev) => ({ ...prev, [k]: next }));\n addInFlight(k);\n // share-resource is upsert: calling with same principal + new role\n // updates the existing share row. See sharing/actions/share-resource.ts.\n share.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n role: next,\n notify: false,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setRoleOverrides((prev) => {\n const { [k]: _, ...rest } = prev;\n return rest;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleRemove = (s: Share) => {\n const k = keyOf(s);\n // If any other mutation is in flight for this principal, don't start a\n // remove — it can interleave with an upsert and leave the row in place.\n // The UI already disables the trash button when inFlight.has(k).\n if (inFlight.has(k)) return;\n setPendingRemoves((prev) => new Set(prev).add(k));\n addInFlight(k);\n unshare.mutate(\n {\n resourceType,\n resourceId,\n principalType: s.principalType,\n principalId: s.principalId,\n } as any,\n {\n onSuccess: () => {\n sharesQuery.refetch().then(() => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n });\n },\n onError: () => {\n setPendingRemoves((prev) => {\n const next = new Set(prev);\n next.delete(k);\n return next;\n });\n clearInFlight(k);\n },\n },\n );\n };\n\n const handleDone = () => {\n if (canManage && hasInviteEmail) handleAdd();\n onClose();\n };\n\n const titleText = resourceTitle\n ? `Share \"${resourceTitle}\"`\n : `Share ${resourceType}`;\n\n if (isLoading) {\n return (\n <div>\n <div\n className=\"mb-3 truncate text-base font-semibold\"\n title={titleText}\n >\n {titleText}\n </div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <div className=\"mb-4 h-7 rounded-md bg-muted animate-pulse\" />\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 h-9 rounded-md bg-muted animate-pulse\" />\n <div className=\"mt-2 flex justify-end\">\n <button type=\"button\" onClick={onClose} className={BUTTON_PRIMARY_SM}>\n Done\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <div className=\"mb-3 truncate text-base font-semibold\" title={titleText}>\n {titleText}\n </div>\n\n {canManage ? (\n <div className=\"mb-4 space-y-2\">\n <div className=\"flex items-stretch gap-2\">\n <input\n type=\"email\"\n placeholder=\"Add people by email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAdd();\n }}\n list={orgMembers.length > 0 ? datalistId : undefined}\n autoComplete=\"off\"\n className=\"flex-1 min-w-0 h-9 rounded-md border border-input bg-background px-3 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-background\"\n />\n {orgMembers.length > 0 ? (\n <datalist id={datalistId}>\n {orgMembers\n .filter(\n (m) =>\n m.email !== sharesQuery.data?.ownerEmail &&\n !(sharesQuery.data?.shares ?? []).some(\n (s) =>\n s.principalType === \"user\" &&\n s.principalId === m.email,\n ),\n )\n .map((m) => (\n <option\n key={m.email}\n value={m.email}\n label={m.name ?? undefined}\n />\n ))}\n </datalist>\n ) : null}\n <RoleSelect value={role} onChange={setRole} />\n </div>\n {hasInviteEmail ? (\n <label className=\"inline-flex items-center gap-2 text-xs text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={notifyPeople}\n onChange={(e) => setNotifyPeople(e.target.checked)}\n className=\"h-4 w-4 rounded border-input accent-primary\"\n />\n Notify people\n </label>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"mb-2 text-sm font-semibold\">People with access</div>\n <ul className=\"mb-4 flex flex-col gap-1 list-none p-0 m-0\">\n {data?.ownerEmail ? (\n <li className=\"flex items-center gap-3 px-1 py-1.5 text-sm\">\n <Avatar label={displayName(data.ownerEmail, orgMembers)} />\n <span className=\"flex-1 min-w-0 truncate\">\n {displayName(data.ownerEmail, orgMembers)}\n </span>\n <span className=\"text-xs text-muted-foreground\">Owner</span>\n </li>\n ) : null}\n {shares.map((s) => (\n <li\n key={keyOf(s)}\n className={cn(\n \"flex items-center gap-3 px-1 py-1.5 text-sm\",\n inFlight.has(keyOf(s)) && \"opacity-60\",\n )}\n >\n <Avatar\n label={\n s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)\n }\n org={s.principalType === \"org\"}\n />\n <span className=\"flex-1 min-w-0 truncate\">\n {s.principalType === \"org\"\n ? s.principalId\n : displayName(s.principalId, orgMembers)}\n </span>\n {canManage ? (\n <RoleSelect\n value={s.role}\n onChange={(r) => handleChangeRole(s, r)}\n disabled={inFlight.has(keyOf(s))}\n plain\n />\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {cap(s.role)}\n </span>\n )}\n {canManage ? (\n <button\n type=\"button\"\n aria-label=\"Remove\"\n onClick={() => handleRemove(s)}\n disabled={inFlight.has(keyOf(s))}\n className={BUTTON_GHOST_ICON}\n >\n <IconTrash size={14} />\n </button>\n ) : null}\n </li>\n ))}\n {!shares.length && !data?.ownerEmail ? (\n <li className=\"px-1 py-1.5 text-sm text-muted-foreground\">\n No one has access yet.\n </li>\n ) : null}\n </ul>\n\n <div className=\"mb-2 text-sm font-semibold\">General access</div>\n <div className=\"mb-4 flex items-center gap-3\">\n <span\n aria-hidden\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-muted text-muted-foreground\"\n >\n <meta.Icon size={16} strokeWidth={1.75} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <VisibilitySelect\n value={visibility}\n onChange={handleVisibility}\n disabled={!canManage}\n visibilityCopy={props.visibilityCopy}\n />\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {meta.description}\n </div>\n </div>\n </div>\n\n {props.accessNote ? (\n <div className=\"mb-4 rounded-md border border-border bg-muted/35 p-3 text-xs text-muted-foreground\">\n {props.accessNote}\n </div>\n ) : null}\n\n {props.shareUrl ? (\n <CopyLinkField\n value={props.shareUrl}\n label={props.shareUrlLabel}\n description={props.shareUrlDescription}\n />\n ) : null}\n\n {props.secondaryShareUrl ? (\n <CopyLinkField\n value={props.secondaryShareUrl}\n label={props.secondaryShareUrlLabel}\n description={props.secondaryShareUrlDescription}\n />\n ) : null}\n\n <div className=\"mt-2 flex justify-end\">\n <button\n type=\"button\"\n onClick={handleDone}\n className={BUTTON_PRIMARY_SM}\n >\n Done\n </button>\n </div>\n </div>\n );\n}\n\nfunction CopyLinkField({\n value,\n label = \"Share link\",\n description,\n}: {\n value: string;\n label?: string;\n description?: ReactNode;\n}) {\n const [copied, setCopied] = useState(false);\n const resetRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n return () => {\n if (resetRef.current) clearTimeout(resetRef.current);\n };\n }, []);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n if (resetRef.current) clearTimeout(resetRef.current);\n resetRef.current = setTimeout(() => setCopied(false), 1400);\n } catch {\n setCopied(false);\n }\n };\n\n return (\n <div className=\"mb-4\">\n <div className=\"mb-2 text-sm font-semibold\">{label}</div>\n {description ? (\n <div className=\"mb-2 text-xs text-muted-foreground\">{description}</div>\n ) : null}\n <div className=\"flex min-w-0 items-center gap-2\">\n <input\n readOnly\n value={value}\n className=\"h-9 min-w-0 flex-1 rounded-md border border-input bg-background px-3 text-sm text-muted-foreground outline-none\"\n onFocus={(event) => event.currentTarget.select()}\n />\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"inline-flex h-9 shrink-0 items-center gap-2 rounded-md border border-input bg-background px-3 text-sm font-medium text-foreground hover:bg-accent\"\n >\n {copied ? <IconCheck size={15} /> : <IconCopy size={15} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Radix Select wrappers styled like shadcn Select (no native <select> anywhere)\n// ---------------------------------------------------------------------------\n\nconst selectContentClass =\n \"z-[2100] min-w-[12rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\";\nconst selectItemClass =\n \"relative flex w-full cursor-pointer select-none items-start gap-2 rounded-sm py-2 pl-8 pr-3 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\";\n\ninterface ShadSelectItemProps {\n value: string;\n label: string;\n description?: string;\n}\n\nfunction SelectItems({ items }: { items: ShadSelectItemProps[] }) {\n return (\n <>\n {items.map((it) => (\n <Select.Item\n key={it.value}\n value={it.value}\n className={selectItemClass}\n >\n <span className=\"absolute left-2 top-2 flex h-4 w-4 items-center justify-center\">\n <Select.ItemIndicator>\n <IconCheck size={14} />\n </Select.ItemIndicator>\n </span>\n <span className=\"flex flex-col\">\n <Select.ItemText>{it.label}</Select.ItemText>\n {it.description ? (\n <span className=\"text-xs text-muted-foreground\">\n {it.description}\n </span>\n ) : null}\n </span>\n </Select.Item>\n ))}\n </>\n );\n}\n\nfunction RoleSelect(props: {\n value: Role;\n onChange: (v: Role) => void;\n disabled?: boolean;\n /** When true, render as inline text + chevron (no border / bg) — matches\n * the per-person role picker in Google Docs. */\n plain?: boolean;\n}) {\n const current =\n ROLE_OPTIONS.find((o) => o.value === props.value) ?? ROLE_OPTIONS[0];\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Role)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={\n props.plain\n ? cn(\n BUTTON_BASE,\n \"h-7 px-2 bg-transparent text-muted-foreground hover:bg-accent hover:text-accent-foreground\",\n )\n : cn(\n BUTTON_BASE,\n \"h-9 px-3 border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n )\n }\n aria-label=\"Role\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems items={ROLE_OPTIONS} />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction VisibilitySelect(props: {\n value: Visibility;\n onChange: (v: Visibility) => void;\n disabled?: boolean;\n visibilityCopy?: ShareButtonProps[\"visibilityCopy\"];\n}) {\n const current = visibilityMeta(props.value, props.visibilityCopy);\n return (\n <Select.Root\n value={props.value}\n onValueChange={(v) => props.onChange(v as Visibility)}\n disabled={props.disabled}\n >\n <Select.Trigger\n className={cn(\n BUTTON_BASE,\n \"h-7 px-1 -ml-1 bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground\",\n )}\n aria-label=\"General access\"\n >\n <Select.Value>{current.label}</Select.Value>\n <Select.Icon>\n <IconChevronDown size={14} />\n </Select.Icon>\n </Select.Trigger>\n <Select.Portal>\n <Select.Content\n className={selectContentClass}\n position=\"popper\"\n sideOffset={4}\n >\n <Select.Viewport>\n <SelectItems\n items={(Object.keys(VIS_META) as Visibility[]).map((k) => ({\n value: k,\n label: visibilityMeta(k, props.visibilityCopy).label,\n description: visibilityMeta(k, props.visibilityCopy)\n .description,\n }))}\n />\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n );\n}\n\nfunction Avatar({ label, org }: { label: string; org?: boolean }) {\n return (\n <span\n aria-hidden\n className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold text-muted-foreground\"\n >\n {org ? <IconBuilding size={14} strokeWidth={1.75} /> : initials(label)}\n </span>\n );\n}\n\nfunction keyOf(s: Share): string {\n return `${s.principalType}:${s.principalId}`;\n}\nfunction getNotificationUrl(explicit?: string): string | undefined {\n if (explicit) return explicit;\n if (typeof window === \"undefined\") return undefined;\n return window.location.href;\n}\nfunction cap(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\nfunction initials(s: string): string {\n const name = s.split(\"@\")[0] ?? s;\n return (name[0] ?? \"?\").toUpperCase();\n}\n\nfunction displayName(email: string, members: OrgMember[]): string {\n const match = members.find((m) => m.email === email);\n if (match?.name && match.name.trim()) return match.name;\n return email;\n}\n"]}
@@ -96,42 +96,24 @@ describe("ShareButton", () => {
96
96
  resourceUrl: "https://content.agent-native.com/page/doc-1",
97
97
  }), expect.any(Object));
98
98
  });
99
- it("requires public visibility before copying a public-only link", async () => {
100
- const writeText = vi.fn(async () => undefined);
101
- Object.defineProperty(navigator, "clipboard", {
102
- value: { writeText },
103
- configurable: true,
104
- });
105
- await act(async () => {
106
- root.render(_jsx(QueryClientProvider, { client: queryClient, children: _jsx(ShareButton, { resourceType: "deck", resourceId: "deck-1", resourceTitle: "Launch deck", shareUrl: "https://slides.agent-native.com/p/deck-1", shareUrlRequiresPublic: true }) }));
107
- });
108
- const makePublicAndCopy = Array.from(container.querySelectorAll("button")).find((button) => button.textContent === "Make public and copy");
109
- if (!makePublicAndCopy)
110
- throw new Error("Make public button not found");
111
- const linkInput = container.querySelector('input[value="Link available after general access is Public"]');
112
- expect(linkInput).toBeTruthy();
99
+ it("shows the copy action for share URLs regardless of visibility", async () => {
100
+ // Mirrors Google Slides: the copy button is always live. Access is
101
+ // enforced when the recipient opens the URL, not by hiding the link in
102
+ // the share dialog.
113
103
  await act(async () => {
114
- makePublicAndCopy.click();
104
+ root.render(_jsx(QueryClientProvider, { client: queryClient, children: _jsx(ShareButton, { resourceType: "deck", resourceId: "deck-1", shareUrl: "https://slides.agent-native.com/deck/deck-1" }) }));
115
105
  });
116
- expect(otherMutate).toHaveBeenCalledWith(expect.objectContaining({
117
- resourceType: "deck",
118
- resourceId: "deck-1",
119
- visibility: "public",
120
- }), expect.any(Object));
121
- expect(writeText).not.toHaveBeenCalled();
106
+ expect(Array.from(container.querySelectorAll("button")).some((button) => button.textContent === "Copy")).toBe(true);
122
107
  });
123
- it("shows the copy action for public public-only links", async () => {
124
- sharesData.current = {
125
- ownerEmail: "owner@example.com",
126
- orgId: null,
127
- visibility: "public",
128
- role: "owner",
129
- shares: [],
130
- };
108
+ it("renders both primary and secondary share URLs", async () => {
131
109
  await act(async () => {
132
- root.render(_jsx(QueryClientProvider, { client: queryClient, children: _jsx(ShareButton, { resourceType: "deck", resourceId: "deck-1", shareUrl: "https://slides.agent-native.com/p/deck-1", shareUrlRequiresPublic: true }) }));
110
+ root.render(_jsx(QueryClientProvider, { client: queryClient, children: _jsx(ShareButton, { resourceType: "deck", resourceId: "deck-1", shareUrl: "https://slides.agent-native.com/deck/deck-1", shareUrlLabel: "Editor link", secondaryShareUrl: "https://slides.agent-native.com/p/deck-1", secondaryShareUrlLabel: "Presentation link" }) }));
133
111
  });
134
- expect(Array.from(container.querySelectorAll("button")).some((button) => button.textContent === "Copy")).toBe(true);
112
+ const inputs = Array.from(container.querySelectorAll("input"));
113
+ const editorInput = inputs.find((i) => i.value === "https://slides.agent-native.com/deck/deck-1");
114
+ const presentationInput = inputs.find((i) => i.value === "https://slides.agent-native.com/p/deck-1");
115
+ expect(editorInput).toBeTruthy();
116
+ expect(presentationInput).toBeTruthy();
135
117
  });
136
118
  });
137
119
  //# sourceMappingURL=ShareButton.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ShareButton.spec.js","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["// @vitest-environment happy-dom\nimport React, { act } from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { ShareButton } from \"./ShareButton.js\";\n\nconst shareMutate = vi.hoisted(() => vi.fn());\nconst otherMutate = vi.hoisted(() => vi.fn());\nconst refetchShares = vi.hoisted(() => vi.fn(async () => undefined));\nconst sharesData = vi.hoisted(() => ({\n current: {\n ownerEmail: \"owner@example.com\",\n orgId: null,\n visibility: \"private\",\n role: \"owner\",\n shares: [],\n },\n}));\n\nvi.mock(\"../use-action.js\", () => ({\n useActionQuery: () => ({\n data: sharesData.current,\n refetch: refetchShares,\n }),\n useActionMutation: (name: string) => ({\n mutate: name === \"share-resource\" ? shareMutate : otherMutate,\n }),\n}));\n\nvi.mock(\"../components/ui/popover.js\", () => ({\n Popover: ({ children }: { children: React.ReactNode }) => (\n <div>{children}</div>\n ),\n PopoverTrigger: ({ children }: { children: React.ReactNode }) => (\n <>{children}</>\n ),\n PopoverContent: ({ children }: { children: React.ReactNode }) => (\n <div>{children}</div>\n ),\n}));\n\nfunction setInputValue(input: HTMLInputElement, value: string) {\n const setter = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(input),\n \"value\",\n )?.set;\n act(() => {\n setter?.call(input, value);\n input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n}\n\ndescribe(\"ShareButton\", () => {\n let container: HTMLDivElement;\n let root: Root;\n let queryClient: QueryClient;\n\n beforeEach(() => {\n vi.stubGlobal(\"IS_REACT_ACT_ENVIRONMENT\", true);\n vi.stubGlobal(\n \"fetch\",\n vi.fn(async () =>\n Response.json({\n members: [],\n }),\n ),\n );\n shareMutate.mockReset();\n otherMutate.mockReset();\n refetchShares.mockClear();\n sharesData.current = {\n ownerEmail: \"owner@example.com\",\n orgId: null,\n visibility: \"private\",\n role: \"owner\",\n shares: [],\n };\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n container = document.createElement(\"div\");\n document.body.appendChild(container);\n root = createRoot(container);\n });\n\n afterEach(() => {\n act(() => root.unmount());\n queryClient.clear();\n container.remove();\n vi.unstubAllGlobals();\n });\n\n it(\"submits a typed email invite when Done is clicked\", async () => {\n await act(async () => {\n root.render(\n <QueryClientProvider client={queryClient}>\n <ShareButton\n resourceType=\"document\"\n resourceId=\"doc-1\"\n resourceTitle=\"Launch notes\"\n shareUrl=\"https://content.agent-native.com/page/doc-1\"\n />\n </QueryClientProvider>,\n );\n });\n\n const input = container.querySelector(\n 'input[placeholder=\"Add people by email\"]',\n ) as HTMLInputElement;\n setInputValue(input, \"teammate@example.com\");\n\n const done = Array.from(container.querySelectorAll(\"button\")).find(\n (button) => button.textContent === \"Done\",\n );\n if (!done) throw new Error(\"Done button not found\");\n\n act(() => {\n done.click();\n });\n\n expect(shareMutate).toHaveBeenCalledWith(\n expect.objectContaining({\n resourceType: \"document\",\n resourceId: \"doc-1\",\n principalType: \"user\",\n principalId: \"teammate@example.com\",\n role: \"viewer\",\n notify: true,\n resourceUrl: \"https://content.agent-native.com/page/doc-1\",\n }),\n expect.any(Object),\n );\n });\n\n it(\"requires public visibility before copying a public-only link\", async () => {\n const writeText = vi.fn(async () => undefined);\n Object.defineProperty(navigator, \"clipboard\", {\n value: { writeText },\n configurable: true,\n });\n\n await act(async () => {\n root.render(\n <QueryClientProvider client={queryClient}>\n <ShareButton\n resourceType=\"deck\"\n resourceId=\"deck-1\"\n resourceTitle=\"Launch deck\"\n shareUrl=\"https://slides.agent-native.com/p/deck-1\"\n shareUrlRequiresPublic\n />\n </QueryClientProvider>,\n );\n });\n\n const makePublicAndCopy = Array.from(\n container.querySelectorAll(\"button\"),\n ).find((button) => button.textContent === \"Make public and copy\");\n if (!makePublicAndCopy) throw new Error(\"Make public button not found\");\n\n const linkInput = container.querySelector(\n 'input[value=\"Link available after general access is Public\"]',\n );\n expect(linkInput).toBeTruthy();\n\n await act(async () => {\n makePublicAndCopy.click();\n });\n\n expect(otherMutate).toHaveBeenCalledWith(\n expect.objectContaining({\n resourceType: \"deck\",\n resourceId: \"deck-1\",\n visibility: \"public\",\n }),\n expect.any(Object),\n );\n expect(writeText).not.toHaveBeenCalled();\n });\n\n it(\"shows the copy action for public public-only links\", async () => {\n sharesData.current = {\n ownerEmail: \"owner@example.com\",\n orgId: null,\n visibility: \"public\",\n role: \"owner\",\n shares: [],\n };\n\n await act(async () => {\n root.render(\n <QueryClientProvider client={queryClient}>\n <ShareButton\n resourceType=\"deck\"\n resourceId=\"deck-1\"\n shareUrl=\"https://slides.agent-native.com/p/deck-1\"\n shareUrlRequiresPublic\n />\n </QueryClientProvider>,\n );\n });\n\n expect(\n Array.from(container.querySelectorAll(\"button\")).some(\n (button) => button.textContent === \"Copy\",\n ),\n ).toBe(true);\n });\n});\n"]}
1
+ {"version":3,"file":"ShareButton.spec.js","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.spec.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAc,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAa,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9C,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9C,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AACrE,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACnC,OAAO,EAAE;QACP,UAAU,EAAE,mBAAmB;QAC/B,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,EAAE;KACX;CACF,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;QACrB,IAAI,EAAE,UAAU,CAAC,OAAO;QACxB,OAAO,EAAE,aAAa;KACvB,CAAC;IACF,iBAAiB,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC;QACpC,MAAM,EAAE,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;KAC9D,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5C,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CACxD,wBAAM,QAAQ,GAAO,CACtB;IACD,cAAc,EAAE,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC/D,4BAAG,QAAQ,GAAI,CAChB;IACD,cAAc,EAAE,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE,CAAC,CAC/D,wBAAM,QAAQ,GAAO,CACtB;CACF,CAAC,CAAC,CAAC;AAEJ,SAAS,aAAa,CAAC,KAAuB,EAAE,KAAa;IAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,wBAAwB,CAC5C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,EAC5B,OAAO,CACR,EAAE,GAAG,CAAC;IACP,GAAG,CAAC,GAAG,EAAE;QACP,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3B,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3D,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,SAAyB,CAAC;IAC9B,IAAI,IAAU,CAAC;IACf,IAAI,WAAwB,CAAC;IAE7B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,UAAU,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;QAChD,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CACf,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,EAAE;SACZ,CAAC,CACH,CACF,CAAC;QACF,WAAW,CAAC,SAAS,EAAE,CAAC;QACxB,WAAW,CAAC,SAAS,EAAE,CAAC;QACxB,aAAa,CAAC,SAAS,EAAE,CAAC;QAC1B,UAAU,CAAC,OAAO,GAAG;YACnB,UAAU,EAAE,mBAAmB;YAC/B,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,SAAS;YACrB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,EAAE;SACX,CAAC;QACF,WAAW,GAAG,IAAI,WAAW,CAAC;YAC5B,cAAc,EAAE;gBACd,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;gBACzB,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;aAC5B;SACF,CAAC,CAAC;QACH,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1B,WAAW,CAAC,KAAK,EAAE,CAAC;QACpB,SAAS,CAAC,MAAM,EAAE,CAAC;QACnB,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,IAAI,CAAC,MAAM,CACT,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YACtC,KAAC,WAAW,IACV,YAAY,EAAC,UAAU,EACvB,UAAU,EAAC,OAAO,EAClB,aAAa,EAAC,cAAc,EAC5B,QAAQ,EAAC,6CAA6C,GACtD,GACkB,CACvB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CACnC,0CAA0C,CACvB,CAAC;QACtB,aAAa,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAChE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,KAAK,MAAM,CAC1C,CAAC;QACF,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAEpD,GAAG,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CACtC,MAAM,CAAC,gBAAgB,CAAC;YACtB,YAAY,EAAE,UAAU;YACxB,UAAU,EAAE,OAAO;YACnB,aAAa,EAAE,MAAM;YACrB,WAAW,EAAE,sBAAsB;YACnC,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,6CAA6C;SAC3D,CAAC,EACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,mEAAmE;QACnE,uEAAuE;QACvE,oBAAoB;QACpB,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,IAAI,CAAC,MAAM,CACT,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YACtC,KAAC,WAAW,IACV,YAAY,EAAC,MAAM,EACnB,UAAU,EAAC,QAAQ,EACnB,QAAQ,EAAC,6CAA6C,GACtD,GACkB,CACvB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,CACJ,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CACnD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,KAAK,MAAM,CAC1C,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACnB,IAAI,CAAC,MAAM,CACT,KAAC,mBAAmB,IAAC,MAAM,EAAE,WAAW,YACtC,KAAC,WAAW,IACV,YAAY,EAAC,MAAM,EACnB,UAAU,EAAC,QAAQ,EACnB,QAAQ,EAAC,6CAA6C,EACtD,aAAa,EAAC,aAAa,EAC3B,iBAAiB,EAAC,0CAA0C,EAC5D,sBAAsB,EAAC,mBAAmB,GAC1C,GACkB,CACvB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,6CAA6C,CACjE,CAAC;QACF,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,0CAA0C,CAC9D,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,CAAC,iBAAiB,CAAC,CAAC,UAAU,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// @vitest-environment happy-dom\nimport React, { act } from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { ShareButton } from \"./ShareButton.js\";\n\nconst shareMutate = vi.hoisted(() => vi.fn());\nconst otherMutate = vi.hoisted(() => vi.fn());\nconst refetchShares = vi.hoisted(() => vi.fn(async () => undefined));\nconst sharesData = vi.hoisted(() => ({\n current: {\n ownerEmail: \"owner@example.com\",\n orgId: null,\n visibility: \"private\",\n role: \"owner\",\n shares: [],\n },\n}));\n\nvi.mock(\"../use-action.js\", () => ({\n useActionQuery: () => ({\n data: sharesData.current,\n refetch: refetchShares,\n }),\n useActionMutation: (name: string) => ({\n mutate: name === \"share-resource\" ? shareMutate : otherMutate,\n }),\n}));\n\nvi.mock(\"../components/ui/popover.js\", () => ({\n Popover: ({ children }: { children: React.ReactNode }) => (\n <div>{children}</div>\n ),\n PopoverTrigger: ({ children }: { children: React.ReactNode }) => (\n <>{children}</>\n ),\n PopoverContent: ({ children }: { children: React.ReactNode }) => (\n <div>{children}</div>\n ),\n}));\n\nfunction setInputValue(input: HTMLInputElement, value: string) {\n const setter = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(input),\n \"value\",\n )?.set;\n act(() => {\n setter?.call(input, value);\n input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n}\n\ndescribe(\"ShareButton\", () => {\n let container: HTMLDivElement;\n let root: Root;\n let queryClient: QueryClient;\n\n beforeEach(() => {\n vi.stubGlobal(\"IS_REACT_ACT_ENVIRONMENT\", true);\n vi.stubGlobal(\n \"fetch\",\n vi.fn(async () =>\n Response.json({\n members: [],\n }),\n ),\n );\n shareMutate.mockReset();\n otherMutate.mockReset();\n refetchShares.mockClear();\n sharesData.current = {\n ownerEmail: \"owner@example.com\",\n orgId: null,\n visibility: \"private\",\n role: \"owner\",\n shares: [],\n };\n queryClient = new QueryClient({\n defaultOptions: {\n queries: { retry: false },\n mutations: { retry: false },\n },\n });\n container = document.createElement(\"div\");\n document.body.appendChild(container);\n root = createRoot(container);\n });\n\n afterEach(() => {\n act(() => root.unmount());\n queryClient.clear();\n container.remove();\n vi.unstubAllGlobals();\n });\n\n it(\"submits a typed email invite when Done is clicked\", async () => {\n await act(async () => {\n root.render(\n <QueryClientProvider client={queryClient}>\n <ShareButton\n resourceType=\"document\"\n resourceId=\"doc-1\"\n resourceTitle=\"Launch notes\"\n shareUrl=\"https://content.agent-native.com/page/doc-1\"\n />\n </QueryClientProvider>,\n );\n });\n\n const input = container.querySelector(\n 'input[placeholder=\"Add people by email\"]',\n ) as HTMLInputElement;\n setInputValue(input, \"teammate@example.com\");\n\n const done = Array.from(container.querySelectorAll(\"button\")).find(\n (button) => button.textContent === \"Done\",\n );\n if (!done) throw new Error(\"Done button not found\");\n\n act(() => {\n done.click();\n });\n\n expect(shareMutate).toHaveBeenCalledWith(\n expect.objectContaining({\n resourceType: \"document\",\n resourceId: \"doc-1\",\n principalType: \"user\",\n principalId: \"teammate@example.com\",\n role: \"viewer\",\n notify: true,\n resourceUrl: \"https://content.agent-native.com/page/doc-1\",\n }),\n expect.any(Object),\n );\n });\n\n it(\"shows the copy action for share URLs regardless of visibility\", async () => {\n // Mirrors Google Slides: the copy button is always live. Access is\n // enforced when the recipient opens the URL, not by hiding the link in\n // the share dialog.\n await act(async () => {\n root.render(\n <QueryClientProvider client={queryClient}>\n <ShareButton\n resourceType=\"deck\"\n resourceId=\"deck-1\"\n shareUrl=\"https://slides.agent-native.com/deck/deck-1\"\n />\n </QueryClientProvider>,\n );\n });\n\n expect(\n Array.from(container.querySelectorAll(\"button\")).some(\n (button) => button.textContent === \"Copy\",\n ),\n ).toBe(true);\n });\n\n it(\"renders both primary and secondary share URLs\", async () => {\n await act(async () => {\n root.render(\n <QueryClientProvider client={queryClient}>\n <ShareButton\n resourceType=\"deck\"\n resourceId=\"deck-1\"\n shareUrl=\"https://slides.agent-native.com/deck/deck-1\"\n shareUrlLabel=\"Editor link\"\n secondaryShareUrl=\"https://slides.agent-native.com/p/deck-1\"\n secondaryShareUrlLabel=\"Presentation link\"\n />\n </QueryClientProvider>,\n );\n });\n\n const inputs = Array.from(container.querySelectorAll(\"input\"));\n const editorInput = inputs.find(\n (i) => i.value === \"https://slides.agent-native.com/deck/deck-1\",\n );\n const presentationInput = inputs.find(\n (i) => i.value === \"https://slides.agent-native.com/p/deck-1\",\n );\n expect(editorInput).toBeTruthy();\n expect(presentationInput).toBeTruthy();\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sse-event-processor.d.ts","sourceRoot":"","sources":["../../src/client/sse-event-processor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sse-event-processor.d.ts","sourceRoot":"","sources":["../../src/client/sse-event-processor.ts"],"names":[],"mappings":"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"}
@@ -62,11 +62,21 @@ function isAutoRecoverableError(ev, errMsg) {
62
62
  code === "invalid_request_error" ||
63
63
  code === "request_too_large" ||
64
64
  code === "not_found_error" ||
65
- code === "model_not_found") {
65
+ code === "model_not_found" ||
66
+ // `builder_gateway_error` is the no-detail fallback the Builder engine
67
+ // emits when the gateway returns `{type:"stop",reason:"error"}` with no
68
+ // explanation — almost always the upstream provider giving up (model
69
+ // quota hit, account misconfiguration, opaque downstream failure). The
70
+ // production-agent already retries this synchronously up to MAX_RETRIES
71
+ // before the error escapes to the SSE stream, so by the time the client
72
+ // sees it, retrying again with another POST /agent-chat will hit the
73
+ // same wall. This used to send the chat into a 32-continuation runaway
74
+ // (each turn cleared+regenerated visible content) for users hitting a
75
+ // misbehaving Builder route. Surface the error instead.
76
+ code === "builder_gateway_error") {
66
77
  return false;
67
78
  }
68
- if (code === "builder_gateway_error" ||
69
- code === "builder_gateway_network_error" ||
79
+ if (code === "builder_gateway_network_error" ||
70
80
  code === "builder_gateway_timeout" ||
71
81
  code === "stale_run" ||
72
82
  code === "timeout" ||
@@ -84,11 +94,16 @@ function isAutoRecoverableError(ev, errMsg) {
84
94
  }
85
95
  if (ev.recoverable === true)
86
96
  return true;
97
+ // "gateway error" intentionally absent — that's the no-detail Builder
98
+ // gateway fallback and the production-agent already retries it
99
+ // synchronously up to MAX_RETRIES before the error escapes here. Treating
100
+ // it as auto-recoverable on top of that produced a 32-continuation
101
+ // runaway in production for users hitting a misbehaving Builder route.
102
+ // (See `code === "builder_gateway_error"` in the not-recoverable list.)
87
103
  return (msg.includes("overloaded") ||
88
104
  msg.includes("rate_limit") ||
89
105
  msg.includes("too many requests") ||
90
106
  msg.includes("timeout") ||
91
- msg.includes("gateway error") ||
92
107
  msg.includes("gateway timeout") ||
93
108
  msg.includes("inactivity timeout") ||
94
109
  msg.includes("socket hang up") ||