@agent-native/dispatch 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/actions/provider-api-register.d.ts +11 -11
  2. package/dist/components/create-app-popover.d.ts +7 -2
  3. package/dist/components/create-app-popover.d.ts.map +1 -1
  4. package/dist/components/create-app-popover.js +4 -3
  5. package/dist/components/create-app-popover.js.map +1 -1
  6. package/dist/components/index.d.ts +1 -0
  7. package/dist/components/index.d.ts.map +1 -1
  8. package/dist/components/index.js +1 -0
  9. package/dist/components/index.js.map +1 -1
  10. package/dist/components/layout/Layout.d.ts.map +1 -1
  11. package/dist/components/layout/Layout.js +42 -2
  12. package/dist/components/layout/Layout.js.map +1 -1
  13. package/dist/components/simple-agents-panel.d.ts +4 -1
  14. package/dist/components/simple-agents-panel.d.ts.map +1 -1
  15. package/dist/components/simple-agents-panel.js +46 -13
  16. package/dist/components/simple-agents-panel.js.map +1 -1
  17. package/dist/components/workspace-app-host.d.ts +3 -1
  18. package/dist/components/workspace-app-host.d.ts.map +1 -1
  19. package/dist/components/workspace-app-host.js +11 -2
  20. package/dist/components/workspace-app-host.js.map +1 -1
  21. package/package.json +3 -3
  22. package/src/components/create-app-popover.spec.tsx +9 -1
  23. package/src/components/create-app-popover.tsx +9 -1
  24. package/src/components/index.ts +1 -0
  25. package/src/components/layout/Layout.app-chat.spec.ts +22 -0
  26. package/src/components/layout/Layout.tsx +72 -3
  27. package/src/components/simple-agents-panel.spec.tsx +81 -1
  28. package/src/components/simple-agents-panel.tsx +156 -71
  29. package/src/components/workspace-app-host.tsx +30 -1
@@ -1 +1 @@
1
- {"version":3,"file":"simple-agents-panel.js","sourceRoot":"","sources":["../../src/components/simple-agents-panel.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,mCAAmC,EACnC,eAAe,GAChB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,cAAc,GACf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EACL,yBAAyB,EACzB,eAAe,EACf,QAAQ,EACR,cAAc,EACd,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,UAAU,EACV,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,SAAS,EACT,MAAM,EACN,QAAQ,GAGT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,OAAO,EACL,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,MAAM,EACN,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EACL,MAAM,EACN,aAAa,EACb,UAAU,EACV,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AA2BzC,MAAM,UAAU,kCAAkC,CAAC,MAAe;IAChE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,QAAQ,GAAG,MAAoD,CAAC;IACtE,OAAO,CACL,QAAQ,CAAC,MAAM,KAAK,SAAS;QAC7B,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ;QACvC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,qBAAqB,CAAC,CACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,MAAe,EACf,OAKC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,IAAI,kCAAkC,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,OAAO,CAAC,SAAS,EAAE,CAAC;AACtB,CAAC;AAQD,SAAS,aAAa,CAAC,QAAiC;IACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,IAAI,EAAE,EAAE;YACR,WAAW,EAAE,EAAE;YACf,YAAY,EAAE,kDAAkD;YAChE,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,KAAc;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,uBAAuB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzE,OAAO;QACL,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC,IAAI;QACpC,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,QAAQ,CAAC,WAAW,IAAI,EAAE;QAC/D,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,QAAQ,CAAC,OAAO;QACvD,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,SAAS;QAClC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,SAAS;QAClC,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAoB;IACzE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAqB,KAAK,CAAC,CAAC;IAC9D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACnC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACrC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,eAAe,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC5E,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErB,MAAM,MAAM,GAAG,iBAAiB,CAAC,2BAA2B,EAAE;QAC5D,SAAS,EAAE,GAAG,EAAE;YACd,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,2BAA2B,EAAE;QAC5D,SAAS,EAAE,GAAG,EAAE;YACd,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAExE,SAAS,IAAI;QACX,MAAM,OAAO,GAAG,uBAAuB,CAAC;YACtC,IAAI;YACJ,WAAW;YACX,KAAK;YACL,KAAK;YACL,YAAY;SACb,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,MAAM,CAAC;gBACZ,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;gBACjB,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE;gBAC/B,OAAO;gBACP,KAAK;aACN,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACjB,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,SAAS;YAC5C,IAAI,EAAE,UAAU,gBAAgB,CAAC,IAAI,CAAC,KAAK;YAC3C,OAAO;YACP,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,MAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,aACvC,KAAC,aAAa,IAAC,OAAO,kBACnB,OAAO,IAAI,CACV,MAAC,MAAM,eACL,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,oBAEf,CACV,GACa,EAChB,MAAC,aAAa,IAAC,SAAS,EAAC,WAAW,aAClC,MAAC,YAAY,eACX,KAAC,WAAW,cACT,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,GAChC,EACd,KAAC,iBAAiB,IAAC,SAAS,EAAC,SAAS,YACnC,SAAS;oCACR,CAAC,CAAC,qCAAqC;oCACvC,CAAC,CAAC,kCAAkC,GACpB,IACP,EACf,eAAK,SAAS,EAAC,0BAA0B,aACvC,eAAK,SAAS,EAAC,2BAA2B,aACxC,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,mBAAmB,qBAAa,EAC/C,KAAC,KAAK,IACJ,EAAE,EAAC,mBAAmB,EACtB,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAChD,WAAW,EAAC,eAAe,GAC3B,IACE,EACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,oBAAoB,6BAAqB,EACxD,MAAC,MAAM,IACL,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,CAAC,KAAyB,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,aAE7D,KAAC,aAAa,IAAC,EAAE,EAAC,oBAAoB,YACpC,KAAC,WAAW,KAAG,GACD,EAChB,MAAC,aAAa,eACZ,KAAC,UAAU,IAAC,KAAK,EAAC,KAAK,yBAAsB,EAC7C,KAAC,UAAU,IAAC,KAAK,EAAC,UAAU,8BAA2B,IACzC,IACT,IACL,IACF,EACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,0BAA0B,4BAAoB,EAC7D,KAAC,KAAK,IACJ,EAAE,EAAC,0BAA0B,EAC7B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACvD,WAAW,EAAC,+CAA+C,GAC3D,IACE,EACN,MAAC,WAAW,IAAC,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,aAC5D,KAAC,kBAAkB,IAAC,OAAO,kBACzB,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,2CAA2C,aAErD,KAAC,yBAAyB,IAAC,IAAI,EAAE,EAAE,GAAI,cAEvC,KAAC,eAAe,IACd,SAAS,EAAC,yDAAyD,EACnE,IAAI,EAAE,EAAE,GACR,IACK,GACU,EACrB,KAAC,kBAAkB,IAAC,SAAS,EAAC,MAAM,YAClC,eAAK,SAAS,EAAC,2BAA2B,aACxC,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,oBAAoB,sBAAc,EACjD,KAAC,KAAK,IACJ,EAAE,EAAC,oBAAoB,EACvB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACjD,WAAW,EAAC,SAAS,GACrB,IACE,EACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,oBAAoB,sBAAc,EACjD,KAAC,KAAK,IACJ,EAAE,EAAC,oBAAoB,EACvB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACjD,WAAW,EAAC,SAAS,GACrB,IACE,IACF,GACa,IACT,EACd,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,2BAA2B,6BAAqB,EAC/D,KAAC,QAAQ,IACP,EAAE,EAAC,2BAA2B,EAC9B,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACxD,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,mBAAmB,EAC7B,WAAW,EAAC,kDAAgD,GAC5D,IACE,IACF,EACN,KAAC,YAAY,cACX,KAAC,MAAM,IAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,OAAO,YACtC,OAAO;gCACN,CAAC,CAAC,WAAW;gCACb,CAAC,CAAC,SAAS;oCACT,CAAC,CAAC,cAAc;oCAChB,CAAC,CAAC,cAAc,GACb,GACI,IACD,IACT,CACV,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,EACvB,QAAQ,EACR,SAAS,EACT,OAAO,GAKR;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAyB,YAAY,CAAC,CAAC;IAC7E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,cAAc,CAC1B,iBAAiB,EACjB,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,EACxB,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;IACF,MAAM,MAAM,GAAG,iBAAiB,CAAC,2BAA2B,EAAE;QAC5D,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YACpB,8BAA8B,CAAC,MAAM,EAAE;gBACrC,cAAc,EAAE,mBAAmB;gBACnC,eAAe,EAAE,sCAAsC;gBACvD,SAAS,EAAE,GAAG,EAAE;oBACd,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;oBACrB,SAAS,EAAE,EAAE,CAAC;gBAChB,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,2BAA2B,EAAE;QAC5D,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YACpB,8BAA8B,CAAC,MAAM,EAAE;gBACrC,cAAc,EAAE,iBAAiB;gBACjC,eAAe,EAAE,wCAAwC;gBACzD,SAAS,EAAE,GAAG,EAAE;oBACd,UAAU,CAAC,KAAK,CAAC,CAAC;oBAClB,UAAU,CAAC,EAAE,CAAC,CAAC;oBACf,aAAa,CAAC,EAAE,CAAC,CAAC;oBAClB,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;oBACrB,SAAS,EAAE,EAAE,CAAC;gBAChB,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,2BAA2B,EAAE;QAC5D,SAAS,EAAE,GAAG,EAAE;YACd,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YACnC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;YACrB,SAAS,EAAE,EAAE,CAAC;QAChB,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI;QACtB,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1E,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAE1E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAExB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3B,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtC,SAAS,OAAO;QACd,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1D,IACE,CAAC,YAAY;YACb,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;YAC5B,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC3B,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,EAC7D,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GACZ,OAAO,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC;YACxD,CAAC,CAAC,UAAU,YAAY,EAAE;YAC1B,CAAC,CAAC,YAAY,CAAC;QACnB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI;YACJ,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,UAAU,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,QAAQ,EAAE;YACtF,OAAO,EAAE,UAAU;YACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,MAAC,MAAM,IACL,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE;YACzB,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClB,IAAI,CAAC,QAAQ;gBAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC,aAED,KAAC,aAAa,IAAC,OAAO,kBACnB,OAAO,IAAI,CACV,MAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,aAC/B,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,YAEjB,CACV,GACa,EAChB,MAAC,aAAa,IAAC,SAAS,EAAC,WAAW,aAClC,MAAC,YAAY,eACX,KAAC,WAAW,6BAAyB,EACrC,KAAC,iBAAiB,IAAC,SAAS,EAAC,SAAS,kGAGlB,IACP,EACf,eAAK,SAAS,EAAC,uDAAuD,aACpE,eAAK,SAAS,EAAC,6BAA6B,aAC1C,eAAK,SAAS,EAAC,yCAAyC,aACtD,eAAM,SAAS,EAAC,2CAA2C,sBAEpD,EACP,MAAC,MAAM,IAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,aAC7C,KAAC,aAAa,IAAC,OAAO,kBACpB,MAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,aACjC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,WAEf,GACK,EAChB,MAAC,aAAa,eACZ,MAAC,YAAY,eACX,KAAC,WAAW,gCAA4B,EACxC,KAAC,iBAAiB,IAAC,SAAS,EAAC,SAAS,wEAElB,IACP,EACf,eAAK,SAAS,EAAC,0BAA0B,aACvC,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,sBAAsB,qBAAa,EAClD,KAAC,KAAK,IACJ,EAAE,EAAC,sBAAsB,EACzB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACnD,WAAW,EAAC,kBAAkB,GAC9B,IACE,EACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,sBAAsB,qBAAa,EAClD,MAAC,MAAM,IACL,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,CAAC,KAA6B,EAAE,EAAE,CAC/C,UAAU,CAAC,KAAK,CAAC,aAGnB,KAAC,aAAa,IAAC,EAAE,EAAC,sBAAsB,YACtC,KAAC,WAAW,KAAG,GACD,EAChB,MAAC,aAAa,eACZ,KAAC,UAAU,IAAC,KAAK,EAAC,YAAY,+BAEjB,EACb,KAAC,UAAU,IAAC,KAAK,EAAC,OAAO,sBAAmB,IAC9B,IACT,IACL,EACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,yBAAyB,wBAAgB,EACxD,KAAC,QAAQ,IACP,EAAE,EAAC,yBAAyB,EAC5B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,IAAI,EAAE,CAAC,EACP,SAAS,EAAC,mBAAmB,GAC7B,IACE,IACF,EACN,KAAC,YAAY,cACX,KAAC,MAAM,IACL,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,SAAS,YAE5C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,GACrC,GACI,IACD,IACT,IACL,EACL,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CACjB,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,CACrC,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,qBAAqB,YACjC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,MAAM,IAEL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EACzD,SAAS,EAAC,iDAAiD,EAC3D,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,YAErC,eAAM,SAAS,EAAC,0BAA0B,YACvC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAC/C,IARF,IAAI,CAAC,EAAE,CASL,CACV,CAAC,GACE,CACP,IACG,EACN,eAAK,SAAS,EAAC,6BAA6B,aAC1C,eAAK,SAAS,EAAC,mDAAmD,aAChE,eAAK,SAAS,EAAC,SAAS,aACtB,cAAK,SAAS,EAAC,8BAA8B,YAC1C,QAAQ,EAAE,IAAI,IAAI,eAAe,GAC9B,EACL,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CACvC,KAAC,KAAK,IAAC,OAAO,EAAC,SAAS,YACrB,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,GAC5C,CACT,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,eAAK,SAAS,EAAC,yBAAyB,aACrC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CACvC,MAAC,WAAW,eACV,KAAC,kBAAkB,IAAC,OAAO,kBACzB,MAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,aAC/B,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,cAEhB,GACU,EACrB,MAAC,kBAAkB,eACjB,MAAC,iBAAiB,eAChB,KAAC,gBAAgB,yCAEE,EACnB,KAAC,sBAAsB,sEAEE,IACP,EACpB,MAAC,iBAAiB,eAChB,KAAC,iBAAiB,yBAA2B,EAC7C,KAAC,iBAAiB,IAChB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EACjD,QAAQ,EAAE,MAAM,CAAC,SAAS,uBAGR,IACF,IACD,IACT,CACf,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CACZ,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAEzD,QAAQ,EACN,CAAC,QAAQ;4DACT,MAAM,CAAC,SAAS;4DAChB,OAAO,KAAK,QAAQ,CAAC,OAAO,YAG7B,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,GACtC,IACL,IACF,EACN,KAAC,QAAQ,IACP,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACnD,QAAQ,EAAE,CAAC,QAAQ,EACnB,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,iCAAiC,GAC3C,IACE,IACF,IACQ,IACT,CACV,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAE,UAAU,EAA+B;IACpE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAiC,MAAM,CAAC,CAAC;IACzE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAqB,KAAK,CAAC,CAAC;IAC9D,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAuB,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAEjD,MAAM,WAAW,GAAG,iBAAiB,CAAC,cAAc,EAAE;QACpD,SAAS,EAAE,CAAC,MAA+C,EAAE,EAAE;YAC7D,KAAK,CAAC,OAAO,CACX,MAAM,CAAC,MAAM,KAAK,WAAW;gBAC3B,CAAC,CAAC,wBAAwB;gBAC1B,CAAC,CAAC,gBAAgB,CACrB,CAAC;YACF,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,UAAU,EAAE,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,iBAAiB,CAAC,wBAAwB,EAAE;QAC1D,SAAS,EAAE,GAAG,EAAE;YACd,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,UAAU,EAAE,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,iBAAiB,CAAC,mBAAmB,EAAE;QACxD,SAAS,EAAE,CAAC,MAA+C,EAAE,EAAE;YAC7D,KAAK,CAAC,OAAO,CACX,MAAM,CAAC,MAAM,KAAK,kBAAkB;gBAClC,CAAC,CAAC,wBAAwB;gBAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW;oBAC7B,CAAC,CAAC,6BAA6B;oBAC/B,CAAC,CAAC,qBAAqB,CAC5B,CAAC;YACF,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,UAAU,EAAE,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAO;QAC/B,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACtD,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAEjB,SAAS,KAAK;QACZ,OAAO,CAAC,MAAM,CAAC,CAAC;QAChB,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,CAAC;QACX,eAAe,CAAC,EAAE,CAAC,CAAC;QACpB,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAC3B,YAAY,CAAC,EAAE,CAAC,CAAC;QACjB,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,eAAe,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,KAAoC;QAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,UAAU,YAAY,CAAC,KAAoC;QAC9D,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACvC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,cAAc,GAClB,2EAA2E,CAAC;QAC9E,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC/B,MAAM,IAAI,GACP,IAA+C,CAAC,kBAAkB;gBACnE,IAAI,CAAC,IAAI,CAAC;YACZ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,QAAQ,CAAC,IAAI,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;gBAChD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,CAAC,CAAC,CACH,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAA8B,EAAE,CAC7D,OAAO,CAAC,IAAI,CAAC,CACd,CAAC;QACF,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC;QAC/D,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,CACL,MAAC,MAAM,IACL,IAAI,EAAE,IAAI,EACV,YAAY,EAAE,CAAC,QAAQ,EAAE,EAAE;YACzB,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClB,IAAI,CAAC,QAAQ;gBAAE,KAAK,EAAE,CAAC;QACzB,CAAC,aAED,KAAC,aAAa,IAAC,OAAO,kBACpB,MAAC,MAAM,IAAC,OAAO,EAAC,SAAS,aACvB,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,GAAI,yBAErB,GACK,EAChB,MAAC,aAAa,IAAC,SAAS,EAAC,WAAW,aAClC,MAAC,YAAY,eACX,KAAC,WAAW,kCAA8B,EAC1C,KAAC,iBAAiB,IAAC,SAAS,EAAC,SAAS,iGAGlB,IACP,EACf,MAAC,IAAI,IACH,KAAK,EAAE,IAAI,EACX,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CACvB,OAAO,CAAC,KAAuC,CAAC,aAGlD,MAAC,QAAQ,IAAC,SAAS,EAAC,sBAAsB,aACxC,KAAC,WAAW,IAAC,KAAK,EAAC,MAAM,2BAAyB,EAClD,KAAC,WAAW,IAAC,KAAK,EAAC,QAAQ,6BAA2B,EACtD,KAAC,WAAW,IAAC,KAAK,EAAC,UAAU,iCAA+B,IACnD,EACX,MAAC,WAAW,IAAC,KAAK,EAAC,MAAM,EAAC,SAAS,EAAC,0BAA0B,aAC5D,eAAK,SAAS,EAAC,mCAAmC,aAChD,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,aAEvC,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,mBAEjB,EACT,gBACE,GAAG,EAAE,OAAO,EACZ,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,0BAA0B,EACjC,SAAS,EAAC,QAAQ,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,GAC3C,EACF,eAAM,SAAS,EAAC,+BAA+B,YAC5C,QAAQ,IAAI,qCAAqC,GAC7C,IACH,EACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,qBAAqB,2BAAmB,EACvD,KAAC,QAAQ,IACP,EAAE,EAAC,qBAAqB,EACxB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAClD,IAAI,EAAE,EAAE,EACR,SAAS,EAAC,mBAAmB,EAC7B,WAAW,EAAC,sDAAsD,GAClE,IACE,EACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,oBAAoB,6BAAqB,EACxD,MAAC,MAAM,IACL,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,CAAC,KAAyB,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,aAE7D,KAAC,aAAa,IAAC,EAAE,EAAC,oBAAoB,YACpC,KAAC,WAAW,KAAG,GACD,EAChB,MAAC,aAAa,eACZ,KAAC,UAAU,IAAC,KAAK,EAAC,KAAK,yBAAsB,EAC7C,KAAC,UAAU,IAAC,KAAK,EAAC,UAAU,8BAA2B,IACzC,IACT,IACL,EACN,KAAC,YAAY,cACX,KAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE,CACZ,WAAW,CAAC,MAAM,CAAC;gDACjB,MAAM;gDACN,QAAQ,EAAE,QAAQ,IAAI,SAAS;gDAC/B,KAAK;6CACN,CAAC,EAEJ,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,WAAW,CAAC,SAAS,YAEhD,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,GACjD,GACI,IACH,EACd,MAAC,WAAW,IAAC,KAAK,EAAC,QAAQ,EAAC,SAAS,EAAC,0BAA0B,aAC9D,eAAK,SAAS,EAAC,mCAAmC,aAChD,MAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,aAEzC,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,qBAEjB,EACT,gBACE,GAAG,EAAE,SAAS,EACd,IAAI,EAAC,MAAM,EACX,QAAQ,QACR,SAAS,EAAC,QAAQ,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,YAAY,CAAC,KAAK,CAAC,GAC7C,EACF,eAAM,SAAS,EAAC,+BAA+B,YAC5C,QAAQ;oDACP,CAAC,CAAC,GAAG,QAAQ,MAAM,SAAS,CAAC,MAAM,QAAQ;oDAC3C,CAAC,CAAC,uCAAuC,GACtC,IACH,EACL,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACzB,cAAK,SAAS,EAAC,2GAA2G,YACvH,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GACnB,CACP,CAAC,CAAC,CAAC,IAAI,EACR,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,yBAAyB,6BAAqB,EAC7D,MAAC,MAAM,IACL,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,CAAC,KAAyB,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,aAE7D,KAAC,aAAa,IAAC,EAAE,EAAC,yBAAyB,YACzC,KAAC,WAAW,KAAG,GACD,EAChB,MAAC,aAAa,eACZ,KAAC,UAAU,IAAC,KAAK,EAAC,KAAK,yBAAsB,EAC7C,KAAC,UAAU,IAAC,KAAK,EAAC,UAAU,8BAA2B,IACzC,IACT,IACL,EACN,KAAC,YAAY,cACX,KAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAC7D,QAAQ,EAAE,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,SAAS,YAEvD,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,mBAAmB,GACrD,GACI,IACH,EACd,MAAC,WAAW,IAAC,KAAK,EAAC,UAAU,EAAC,SAAS,EAAC,0BAA0B,aAChE,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,oBAAoB,6BAAqB,EACxD,KAAC,KAAK,IACJ,EAAE,EAAC,oBAAoB,EACvB,KAAK,EAAE,GAAG,EACV,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/C,WAAW,EAAC,2BAA2B,GACvC,IACE,EACN,eAAK,SAAS,EAAC,2BAA2B,aACxC,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,qBAAqB,qBAAa,EACjD,KAAC,KAAK,IACJ,EAAE,EAAC,qBAAqB,EACxB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EACxD,WAAW,EAAC,kBAAkB,GAC9B,IACE,EACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,+BAAqB,EAC3B,cAAK,SAAS,EAAC,wBAAwB,YACrC,KAAC,KAAK,IAAC,OAAO,EAAC,WAAW,0BAAkB,GACxC,IACF,IACF,EACN,eAAK,SAAS,EAAC,qBAAqB,aAClC,KAAC,KAAK,IAAC,OAAO,EAAC,4BAA4B,4BAAoB,EAC/D,KAAC,KAAK,IACJ,EAAE,EAAC,4BAA4B,EAC/B,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/D,WAAW,EAAC,UAAU,GACtB,IACE,EACN,YAAG,SAAS,EAAC,+BAA+B,4FAGxC,EACJ,KAAC,YAAY,cACX,MAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE,CACZ,OAAO,CAAC,MAAM,CAAC;gDACb,GAAG;gDACH,IAAI,EAAE,YAAY,IAAI,SAAS;gDAC/B,WAAW,EAAE,mBAAmB,IAAI,SAAS;gDAC7C,KAAK,EAAE,QAAQ;6CAChB,CAAC,EAEJ,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,SAAS,aAE1C,KAAC,iBAAiB,IAAC,IAAI,EAAE,EAAE,GAAI,EAC9B,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,IAC/C,GACI,IACH,IACT,IACO,IACT,CACV,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,EACzB,QAAQ,EACR,SAAS,GAIV;IACC,MAAM,MAAM,GAAG,iBAAiB,CAAC,2BAA2B,EAAE;QAC5D,SAAS,EAAE,GAAG,EAAE;YACd,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC/B,SAAS,EAAE,EAAE,CAAC;QAChB,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,WAAW,eACV,KAAC,kBAAkB,IAAC,OAAO,kBACzB,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,gBACC,UAAU,QAAQ,CAAC,IAAI,EAAE,YAErC,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,GAChB,GACU,EACrB,MAAC,kBAAkB,eACjB,MAAC,iBAAiB,eAChB,MAAC,gBAAgB,0BAAS,QAAQ,CAAC,IAAI,SAAqB,EAC5D,KAAC,sBAAsB,6EAEE,IACP,EACpB,MAAC,iBAAiB,eAChB,KAAC,iBAAiB,yBAA2B,EAC7C,KAAC,iBAAiB,IAChB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EACjD,QAAQ,EAAE,MAAM,CAAC,SAAS,uBAGR,IACF,IACD,IACT,CACf,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,EAChB,QAAQ,EACR,SAAS,EACT,OAAO,GAKR;IACC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,cAAc,CAC9B,iBAAiB,EACjB,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,EACxB,EAAE,OAAO,EAAE,KAAK,EAAE,CACnB,CAAC;IACF,MAAM,OAAO,GAAG,iBAAiB,CAG/B,8BAA8B,EAAE;QAChC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YACpB,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAClC,eAAe,CAAC;oBACd,OAAO,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO;oBACxC,MAAM,EAAE,IAAI;oBACZ,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,IAAI;oBACZ,aAAa,EAAE,IAAI;iBACpB,CAAC,CAAC;gBACH,KAAK,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;gBACzC,OAAO;YACT,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE;oBACjC,WAAW,EAAE,MAAM,CAAC,OAAO;oBAC3B,MAAM,EAAE,MAAM,CAAC,GAAG;wBAChB,CAAC,CAAC;4BACE,KAAK,EAAE,iBAAiB;4BACxB,OAAO,EAAE,GAAG,EAAE,CACZ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,qBAAqB,CAAC;yBAC3D;wBACH,CAAC,CAAC,SAAS;iBACd,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IAEH,SAAS,IAAI;QACX,mCAAmC,CACjC,QAAQ,EACR,eAAe,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CACnD,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,QAAQ;QACrB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,+BAA+B,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,OAAO,CAAC,MAAM,CAAC;YACb,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC;YACtC,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,SAAS;YAC9C,MAAM,EAAE,aAAa,QAAQ,CAAC,IAAI,2KAA2K;YAC7M,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,4DAA4D,aACzE,cAAK,SAAS,EAAC,wFAAwF,YACrG,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,GAClB,EACN,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,mCAAmC,aAChD,eAAM,SAAS,EAAC,qCAAqC,YAClD,QAAQ,CAAC,IAAI,GACT,EACP,KAAC,KAAK,IAAC,OAAO,EAAC,SAAS,YACrB,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,GAClD,IACJ,EACL,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CACtB,cAAK,SAAS,EAAC,oCAAoC,YAChD,QAAQ,CAAC,WAAW,GACjB,CACP,CAAC,CAAC,CAAC,IAAI,EACR,cAAK,SAAS,EAAC,qDAAqD,YACjE,QAAQ,CAAC,IAAI,GACV,IACF,EACN,eAAK,SAAS,EAAC,wDAAwD,aACrE,MAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,IAAI,gBACD,aAAa,QAAQ,CAAC,IAAI,EAAE,aAExC,KAAC,iBAAiB,IAAC,IAAI,EAAE,EAAE,GAAI,YAExB,EACT,MAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,EAC9B,QAAQ,EAAE,OAAO,CAAC,SAAS,gBACf,oBAAoB,QAAQ,CAAC,IAAI,EAAE,aAE/C,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,GAAI,EAC3B,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,IACzC,EACT,KAAC,eAAe,IACd,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,OAAO,EAClB,OAAO,EACL,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,gBACC,oBAAoB,QAAQ,CAAC,IAAI,EAAE,YAE/C,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,GACjB,GAEX,EACF,KAAC,iBAAiB,IAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,EACL,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,gBACC,QAAQ,QAAQ,CAAC,IAAI,EAAE,YAEnC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,GACf,GAEX,EACF,KAAC,iBAAiB,IAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAI,IAC3D,IACF,CACP,CAAC;AACJ,CAAC;AAgBD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,KAAK,GAAG,cAAc,CAC1B,0BAA0B,EAC1B,EAAE,IAAI,EAAE,OAAO,EAAE,CAClB,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAEhC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CACL,KAAC,gBAAgB,IACf,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,GACnC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,mBAAS,SAAS,EAAC,qBAAqB,aACtC,eAAK,SAAS,EAAC,+CAA+C,aAC5D,KAAC,iBAAiB,IAAC,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,GAAI,EAC7D,KAAC,iBAAiB,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,GAAI,IACtD,EACL,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACxC,cAAK,SAAS,EAAC,qBAAqB,YACjC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACvB,eAAgB,SAAS,EAAC,qCAAqC,aAC7D,KAAC,QAAQ,IAAC,SAAS,EAAC,WAAW,GAAG,EAClC,KAAC,QAAQ,IAAC,SAAS,EAAC,gBAAgB,GAAG,KAF/B,IAAI,CAGR,CACP,CAAC,GACE,CACP,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACtB,cAAK,SAAS,EAAC,qBAAqB,YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,KAAC,QAAQ,IAEP,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,EACrC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,IAH9B,KAAK,CAAC,EAAE,CAIb,CACH,CAAC,GACE,CACP,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,wDAAwD,aACrE,cAAK,SAAS,EAAC,qCAAqC,8BAE9C,EACN,eAAK,SAAS,EAAC,0CAA0C,aACvD,KAAC,iBAAiB,IAChB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,EACnC,OAAO,EACL,MAAC,MAAM,eACL,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,uBAEf,GAEX,EACF,KAAC,iBAAiB,IAAC,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,GAAI,IACzD,IACF,CACP,IACO,CACX,CAAC;AACJ,CAAC","sourcesContent":["import {\n navigateWithAgentChatViewTransition,\n sendToAgentChat,\n} from \"@agent-native/core/client/agent-chat\";\nimport {\n useActionMutation,\n useActionQuery,\n} from \"@agent-native/core/client/hooks\";\nimport { parseCustomAgentProfile } from \"@agent-native/core/resources/metadata\";\nimport {\n IconAdjustmentsHorizontal,\n IconChevronDown,\n IconEdit,\n IconFileImport,\n IconFolder,\n IconLayoutGrid,\n IconMessageCircle,\n IconPlugConnected,\n IconPlus,\n IconTrash,\n IconUpload,\n IconUser,\n} from \"@tabler/icons-react\";\nimport {\n useEffect,\n useRef,\n useState,\n type ChangeEvent,\n type ReactNode,\n} from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { toast } from \"sonner\";\n\nimport {\n buildSimpleAgentContent,\n slugifyAgentName,\n} from \"../lib/simple-agent-profile.js\";\nimport { ActionQueryError } from \"./action-query-error\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"./ui/alert-dialog\";\nimport { Badge } from \"./ui/badge\";\nimport { Button } from \"./ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"./ui/collapsible\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"./ui/dialog\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"./ui/tabs\";\nimport { Textarea } from \"./ui/textarea\";\n\ninterface WorkspaceAgentResource {\n id: string;\n name: string;\n description: string | null;\n path: string;\n content: string;\n scope: \"all\" | \"selected\";\n updatedAt: number;\n}\n\ninterface AgentPackFileResource extends WorkspaceAgentResource {\n kind: \"agent-file\" | \"skill\";\n}\n\ninterface AgentPackResponse {\n profile: WorkspaceAgentResource;\n root: string;\n files: AgentPackFileResource[];\n}\n\ninterface AgentPackFileInput {\n path: string;\n content: string;\n}\n\nexport function isPendingWorkspaceResourceApproval(result: unknown) {\n if (!result || typeof result !== \"object\") return false;\n const mutation = result as { status?: unknown; changeType?: unknown };\n return (\n mutation.status === \"pending\" &&\n typeof mutation.changeType === \"string\" &&\n mutation.changeType.startsWith(\"workspace-resource.\")\n );\n}\n\nexport function handleAgentPackMutationSuccess(\n result: unknown,\n options: {\n appliedMessage: string;\n approvalMessage: string;\n onApplied: () => void;\n notify?: (message: string) => void;\n },\n) {\n const notify = options.notify || ((message) => toast.success(message));\n if (isPendingWorkspaceResourceApproval(result)) {\n notify(options.approvalMessage);\n return;\n }\n notify(options.appliedMessage);\n options.onApplied();\n}\n\ninterface AgentEditorProps {\n resource?: WorkspaceAgentResource;\n trigger?: ReactNode;\n onSaved?: () => void;\n}\n\nfunction profileFields(resource?: WorkspaceAgentResource) {\n if (!resource) {\n return {\n name: \"\",\n description: \"\",\n instructions: \"# Role\\n\\nDescribe how this agent should work.\\n\",\n model: \"inherit\",\n tools: \"inherit\",\n scope: \"all\" as const,\n };\n }\n\n const profile = parseCustomAgentProfile(resource.content, resource.path);\n return {\n name: profile?.name || resource.name,\n description: profile?.description || resource.description || \"\",\n instructions: profile?.instructions || resource.content,\n model: profile?.model || \"inherit\",\n tools: profile?.tools || \"inherit\",\n scope: resource.scope,\n };\n}\n\nfunction AgentEditorDialog({ resource, trigger, onSaved }: AgentEditorProps) {\n const isEditing = Boolean(resource);\n const [open, setOpen] = useState(false);\n const [name, setName] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [instructions, setInstructions] = useState(\"\");\n const [model, setModel] = useState(\"inherit\");\n const [tools, setTools] = useState(\"inherit\");\n const [scope, setScope] = useState<\"all\" | \"selected\">(\"all\");\n const [advancedOpen, setAdvancedOpen] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n const fields = profileFields(resource);\n setName(fields.name);\n setDescription(fields.description);\n setInstructions(fields.instructions);\n setModel(fields.model);\n setTools(fields.tools);\n setScope(fields.scope);\n setAdvancedOpen(fields.model !== \"inherit\" || fields.tools !== \"inherit\");\n }, [open, resource]);\n\n const create = useActionMutation(\"create-workspace-resource\", {\n onSuccess: () => {\n toast.success(\"Agent created\");\n setOpen(false);\n onSaved?.();\n },\n onError: (error) => toast.error(error.message),\n });\n const update = useActionMutation(\"update-workspace-resource\", {\n onSuccess: () => {\n toast.success(\"Agent updated\");\n setOpen(false);\n onSaved?.();\n },\n onError: (error) => toast.error(error.message),\n });\n\n const pending = create.isPending || update.isPending;\n const canSave = Boolean(name.trim() && instructions.trim() && !pending);\n\n function save() {\n const content = buildSimpleAgentContent({\n name,\n description,\n model,\n tools,\n instructions,\n });\n if (resource) {\n update.mutate({\n id: resource.id,\n name: name.trim(),\n description: description.trim(),\n content,\n scope,\n });\n return;\n }\n create.mutate({\n kind: \"agent\",\n name: name.trim(),\n description: description.trim() || undefined,\n path: `agents/${slugifyAgentName(name)}.md`,\n content,\n scope,\n });\n }\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n <DialogTrigger asChild>\n {trigger || (\n <Button>\n <IconPlus size={16} />\n Create agent\n </Button>\n )}\n </DialogTrigger>\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>\n {isEditing ? \"Manage agent\" : \"Create agent\"}\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n {isEditing\n ? \"Update this reusable agent profile.\"\n : \"Create a reusable agent profile.\"}\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-4 py-2\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-name\">Name</Label>\n <Input\n id=\"simple-agent-name\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder=\"User Research\"\n />\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-scope\">Availability</Label>\n <Select\n value={scope}\n onValueChange={(value: \"all\" | \"selected\") => setScope(value)}\n >\n <SelectTrigger id=\"simple-agent-scope\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All apps</SelectItem>\n <SelectItem value=\"selected\">Selected apps</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-description\">Description</Label>\n <Input\n id=\"simple-agent-description\"\n value={description}\n onChange={(event) => setDescription(event.target.value)}\n placeholder=\"Synthesizes user research into clear insights\"\n />\n </div>\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"group -ml-2 gap-1.5 text-muted-foreground\"\n >\n <IconAdjustmentsHorizontal size={15} />\n Advanced\n <IconChevronDown\n className=\"transition-transform group-data-[state=open]:rotate-180\"\n size={15}\n />\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pt-3\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-model\">Model</Label>\n <Input\n id=\"simple-agent-model\"\n value={model}\n onChange={(event) => setModel(event.target.value)}\n placeholder=\"inherit\"\n />\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-tools\">Tools</Label>\n <Input\n id=\"simple-agent-tools\"\n value={tools}\n onChange={(event) => setTools(event.target.value)}\n placeholder=\"inherit\"\n />\n </div>\n </div>\n </CollapsibleContent>\n </Collapsible>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-instructions\">Instructions</Label>\n <Textarea\n id=\"simple-agent-instructions\"\n value={instructions}\n onChange={(event) => setInstructions(event.target.value)}\n rows={12}\n className=\"font-mono text-sm\"\n placeholder=\"# Role\\n\\nDescribe how this agent should work.\"\n />\n </div>\n </div>\n <DialogFooter>\n <Button onClick={save} disabled={!canSave}>\n {pending\n ? \"Saving...\"\n : isEditing\n ? \"Save changes\"\n : \"Create agent\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction AgentPackDialog({\n resource,\n onChanged,\n trigger,\n}: {\n resource: WorkspaceAgentResource;\n onChanged?: () => void;\n trigger?: ReactNode;\n}) {\n const [open, setOpen] = useState(false);\n const [selectedId, setSelectedId] = useState(resource.id);\n const [content, setContent] = useState(resource.content);\n const [addOpen, setAddOpen] = useState(false);\n const [newPath, setNewPath] = useState(\"\");\n const [newKind, setNewKind] = useState<\"agent-file\" | \"skill\">(\"agent-file\");\n const [newContent, setNewContent] = useState(\"\");\n const query = useActionQuery<AgentPackResponse>(\n \"list-agent-pack\",\n { agentId: resource.id },\n { enabled: open },\n );\n const update = useActionMutation(\"update-workspace-resource\", {\n onSuccess: (result) => {\n handleAgentPackMutationSuccess(result, {\n appliedMessage: \"Pack file updated\",\n approvalMessage: \"Pack file update queued for approval\",\n onApplied: () => {\n void query.refetch();\n onChanged?.();\n },\n });\n },\n onError: (error) => toast.error(error.message),\n });\n const create = useActionMutation(\"create-workspace-resource\", {\n onSuccess: (result) => {\n handleAgentPackMutationSuccess(result, {\n appliedMessage: \"Pack file added\",\n approvalMessage: \"Pack file addition queued for approval\",\n onApplied: () => {\n setAddOpen(false);\n setNewPath(\"\");\n setNewContent(\"\");\n void query.refetch();\n onChanged?.();\n },\n });\n },\n onError: (error) => toast.error(error.message),\n });\n const remove = useActionMutation(\"delete-workspace-resource\", {\n onSuccess: () => {\n toast.success(\"Pack file removed\");\n setSelectedId(resource.id);\n void query.refetch();\n onChanged?.();\n },\n onError: (error) => toast.error(error.message),\n });\n\n const files = query.data\n ? [{ ...query.data.profile, kind: \"agent\" as const }, ...query.data.files]\n : [];\n const selected = files.find((file) => file.id === selectedId) ?? files[0];\n\n useEffect(() => {\n if (!open) return;\n setSelectedId(resource.id);\n }, [open, resource.id]);\n\n useEffect(() => {\n if (!selected) return;\n setSelectedId(selected.id);\n setContent(selected.content);\n }, [selected?.id, selected?.content]);\n\n function addFile() {\n const relativePath = newPath.trim().replaceAll(\"\\\\\", \"/\");\n if (\n !relativePath ||\n relativePath.startsWith(\"/\") ||\n relativePath.includes(\"..\") ||\n relativePath.split(\"/\").some((part) => !part || part === \".\")\n ) {\n toast.error(\"Use a relative pack path without ..\");\n return;\n }\n const packPath =\n newKind === \"skill\" && !relativePath.startsWith(\"skills/\")\n ? `skills/${relativePath}`\n : relativePath;\n const name = packPath.split(\"/\").pop() || packPath;\n create.mutate({\n kind: newKind,\n name,\n path: `${query.data?.root || `agents/${slugifyAgentName(resource.name)}`}/${packPath}`,\n content: newContent,\n scope: resource.scope,\n });\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n if (!nextOpen) setAddOpen(false);\n }}\n >\n <DialogTrigger asChild>\n {trigger || (\n <Button variant=\"ghost\" size=\"sm\">\n <IconFolder size={15} />\n Pack\n </Button>\n )}\n </DialogTrigger>\n <DialogContent className=\"max-w-4xl\">\n <DialogHeader>\n <DialogTitle>Agent pack</DialogTitle>\n <DialogDescription className=\"sr-only\">\n Edit the profile, reference files, context, and skills that belong\n to this agent.\n </DialogDescription>\n </DialogHeader>\n <div className=\"grid min-h-0 gap-4 md:grid-cols-[220px_minmax(0,1fr)]\">\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Files\n </span>\n <Dialog open={addOpen} onOpenChange={setAddOpen}>\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <IconPlus size={14} />\n Add\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add pack file</DialogTitle>\n <DialogDescription className=\"sr-only\">\n Add a text reference or agent-owned skill to this pack.\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-4 py-2\">\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"agent-pack-file-path\">Path</Label>\n <Input\n id=\"agent-pack-file-path\"\n value={newPath}\n onChange={(event) => setNewPath(event.target.value)}\n placeholder=\"context/brief.md\"\n />\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"agent-pack-file-kind\">Type</Label>\n <Select\n value={newKind}\n onValueChange={(value: \"agent-file\" | \"skill\") =>\n setNewKind(value)\n }\n >\n <SelectTrigger id=\"agent-pack-file-kind\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"agent-file\">\n Reference file\n </SelectItem>\n <SelectItem value=\"skill\">Skill</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"agent-pack-file-content\">Content</Label>\n <Textarea\n id=\"agent-pack-file-content\"\n value={newContent}\n onChange={(event) => setNewContent(event.target.value)}\n rows={8}\n className=\"font-mono text-sm\"\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n onClick={addFile}\n disabled={!newPath.trim() || create.isPending}\n >\n {create.isPending ? \"Adding...\" : \"Add file\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n {query.isLoading ? (\n <Skeleton className=\"h-24 w-full\" />\n ) : (\n <div className=\"flex flex-col gap-1\">\n {files.map((file) => (\n <Button\n key={file.id}\n type=\"button\"\n variant={selected?.id === file.id ? \"secondary\" : \"ghost\"}\n className=\"h-auto w-full justify-start px-2 py-2 text-left\"\n onClick={() => setSelectedId(file.id)}\n >\n <span className=\"min-w-0 truncate text-xs\">\n {file.path.replace(`${query.data?.root || \"\"}/`, \"\")}\n </span>\n </Button>\n ))}\n </div>\n )}\n </div>\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">\n {selected?.path || \"Select a file\"}\n </div>\n {selected && selected.kind !== \"agent\" ? (\n <Badge variant=\"outline\">\n {selected.kind === \"skill\" ? \"Skill\" : \"Reference\"}\n </Badge>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1\">\n {selected && selected.kind !== \"agent\" ? (\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\">\n <IconTrash size={15} />\n Remove\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n Remove this pack file?\n </AlertDialogTitle>\n <AlertDialogDescription>\n The file will no longer be available to this agent.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => remove.mutate({ id: selected.id })}\n disabled={remove.isPending}\n >\n Remove\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n ) : null}\n <Button\n size=\"sm\"\n onClick={() =>\n selected && update.mutate({ id: selected.id, content })\n }\n disabled={\n !selected ||\n update.isPending ||\n content === selected.content\n }\n >\n {update.isPending ? \"Saving...\" : \"Save file\"}\n </Button>\n </div>\n </div>\n <Textarea\n value={content}\n onChange={(event) => setContent(event.target.value)}\n disabled={!selected}\n rows={18}\n className=\"min-h-[360px] font-mono text-sm\"\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ImportAgentDialog({ onImported }: { onImported?: () => void }) {\n const [open, setOpen] = useState(false);\n const [mode, setMode] = useState<\"file\" | \"folder\" | \"endpoint\">(\"file\");\n const [source, setSource] = useState(\"\");\n const [fileName, setFileName] = useState(\"\");\n const [scope, setScope] = useState<\"all\" | \"selected\">(\"all\");\n const [url, setUrl] = useState(\"\");\n const [endpointName, setEndpointName] = useState(\"\");\n const [endpointDescription, setEndpointDescription] = useState(\"\");\n const [packFiles, setPackFiles] = useState<AgentPackFileInput[]>([]);\n const [packName, setPackName] = useState(\"\");\n const [packWarnings, setPackWarnings] = useState<string[]>([]);\n const fileRef = useRef<HTMLInputElement>(null);\n const folderRef = useRef<HTMLInputElement>(null);\n\n const importAgent = useActionMutation(\"import-agent\", {\n onSuccess: (result: { status: string; warnings?: string[] }) => {\n toast.success(\n result.status === \"unchanged\"\n ? \"Agent already imported\"\n : \"Agent imported\",\n );\n if (result.warnings?.length) {\n toast.info(result.warnings.join(\" \"));\n }\n setOpen(false);\n onImported?.();\n },\n onError: (error) => toast.error(error.message),\n });\n const connect = useActionMutation(\"connect-external-agent\", {\n onSuccess: () => {\n toast.success(\"Agent connected\");\n setOpen(false);\n onImported?.();\n },\n onError: (error) => toast.error(error.message),\n });\n const importPack = useActionMutation(\"import-agent-pack\", {\n onSuccess: (result: { status: string; warnings?: string[] }) => {\n toast.success(\n result.status === \"pending-approval\"\n ? \"Pack sent for approval\"\n : result.status === \"unchanged\"\n ? \"Agent pack already imported\"\n : \"Agent pack imported\",\n );\n if (result.warnings?.length) toast.info(result.warnings.join(\" \"));\n setOpen(false);\n onImported?.();\n },\n onError: (error) => toast.error(error.message),\n });\n\n useEffect(() => {\n if (!folderRef.current) return;\n folderRef.current.setAttribute(\"webkitdirectory\", \"\");\n folderRef.current.setAttribute(\"directory\", \"\");\n }, [mode, open]);\n\n function reset() {\n setMode(\"file\");\n setSource(\"\");\n setFileName(\"\");\n setScope(\"all\");\n setUrl(\"\");\n setEndpointName(\"\");\n setEndpointDescription(\"\");\n setPackFiles([]);\n setPackName(\"\");\n setPackWarnings([]);\n }\n\n async function handleFile(event: ChangeEvent<HTMLInputElement>) {\n const file = event.target.files?.[0];\n if (!file) return;\n setFileName(file.name);\n setSource(await file.text());\n }\n\n async function handleFolder(event: ChangeEvent<HTMLInputElement>) {\n const selectedFiles = Array.from(event.target.files ?? []);\n if (selectedFiles.length === 0) return;\n const warnings: string[] = [];\n const textExtensions =\n /\\.(md|markdown|txt|json|yaml|yml|csv|html|xml|toml|ts|tsx|js|mjs|py|sh)$/i;\n const pack = await Promise.all(\n selectedFiles.map(async (file) => {\n const path =\n (file as File & { webkitRelativePath?: string }).webkitRelativePath ||\n file.name;\n if (!textExtensions.test(path)) {\n warnings.push(`Skipped non-text file: ${path}`);\n return null;\n }\n return { path, content: await file.text() };\n }),\n );\n const files = pack.filter((file): file is AgentPackFileInput =>\n Boolean(file),\n );\n setPackFiles(files);\n setPackName(files[0]?.path.split(\"/\")[0] || \"Selected folder\");\n setPackWarnings(warnings);\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n if (!nextOpen) reset();\n }}\n >\n <DialogTrigger asChild>\n <Button variant=\"outline\">\n <IconFileImport size={16} />\n Import or connect\n </Button>\n </DialogTrigger>\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>Import an agent</DialogTitle>\n <DialogDescription className=\"sr-only\">\n Import a Claude or JSON agent definition, or connect an external\n agent endpoint.\n </DialogDescription>\n </DialogHeader>\n <Tabs\n value={mode}\n onValueChange={(value) =>\n setMode(value as \"file\" | \"folder\" | \"endpoint\")\n }\n >\n <TabsList className=\"w-full justify-start\">\n <TabsTrigger value=\"file\">Agent file</TabsTrigger>\n <TabsTrigger value=\"folder\">Agent folder</TabsTrigger>\n <TabsTrigger value=\"endpoint\">Connect endpoint</TabsTrigger>\n </TabsList>\n <TabsContent value=\"file\" className=\"flex flex-col gap-4 py-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => fileRef.current?.click()}\n >\n <IconUpload size={16} />\n Choose file\n </Button>\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".md,.markdown,.json,.txt\"\n className=\"hidden\"\n onChange={(event) => void handleFile(event)}\n />\n <span className=\"text-xs text-muted-foreground\">\n {fileName || \"Claude .md or JSON agent definition\"}\n </span>\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"import-agent-source\">Definition</Label>\n <Textarea\n id=\"import-agent-source\"\n value={source}\n onChange={(event) => setSource(event.target.value)}\n rows={12}\n className=\"font-mono text-sm\"\n placeholder=\"Paste a Claude-style agent file or a JSON definition\"\n />\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"import-agent-scope\">Availability</Label>\n <Select\n value={scope}\n onValueChange={(value: \"all\" | \"selected\") => setScope(value)}\n >\n <SelectTrigger id=\"import-agent-scope\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All apps</SelectItem>\n <SelectItem value=\"selected\">Selected apps</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <DialogFooter>\n <Button\n onClick={() =>\n importAgent.mutate({\n source,\n fileName: fileName || undefined,\n scope,\n })\n }\n disabled={!source.trim() || importAgent.isPending}\n >\n {importAgent.isPending ? \"Importing...\" : \"Import agent\"}\n </Button>\n </DialogFooter>\n </TabsContent>\n <TabsContent value=\"folder\" className=\"flex flex-col gap-4 py-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => folderRef.current?.click()}\n >\n <IconFolder size={16} />\n Choose folder\n </Button>\n <input\n ref={folderRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(event) => void handleFolder(event)}\n />\n <span className=\"text-xs text-muted-foreground\">\n {packName\n ? `${packName} · ${packFiles.length} files`\n : \"Claude Project or Cowork-style folder\"}\n </span>\n </div>\n {packWarnings.length > 0 ? (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-xs text-amber-800 dark:text-amber-200\">\n {packWarnings.join(\" \")}\n </div>\n ) : null}\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"import-agent-pack-scope\">Availability</Label>\n <Select\n value={scope}\n onValueChange={(value: \"all\" | \"selected\") => setScope(value)}\n >\n <SelectTrigger id=\"import-agent-pack-scope\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All apps</SelectItem>\n <SelectItem value=\"selected\">Selected apps</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <DialogFooter>\n <Button\n onClick={() => importPack.mutate({ files: packFiles, scope })}\n disabled={packFiles.length === 0 || importPack.isPending}\n >\n {importPack.isPending ? \"Importing...\" : \"Import agent pack\"}\n </Button>\n </DialogFooter>\n </TabsContent>\n <TabsContent value=\"endpoint\" className=\"flex flex-col gap-4 py-4\">\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"external-agent-url\">Endpoint URL</Label>\n <Input\n id=\"external-agent-url\"\n value={url}\n onChange={(event) => setUrl(event.target.value)}\n placeholder=\"https://agent.example.com\"\n />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"external-agent-name\">Name</Label>\n <Input\n id=\"external-agent-name\"\n value={endpointName}\n onChange={(event) => setEndpointName(event.target.value)}\n placeholder=\"Research partner\"\n />\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label>Availability</Label>\n <div className=\"flex h-10 items-center\">\n <Badge variant=\"secondary\">Workspace</Badge>\n </div>\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"external-agent-description\">Description</Label>\n <Input\n id=\"external-agent-description\"\n value={endpointDescription}\n onChange={(event) => setEndpointDescription(event.target.value)}\n placeholder=\"Optional\"\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">\n Dispatch stores the public endpoint only. Authenticate it after\n connecting.\n </p>\n <DialogFooter>\n <Button\n onClick={() =>\n connect.mutate({\n url,\n name: endpointName || undefined,\n description: endpointDescription || undefined,\n scope: \"shared\",\n })\n }\n disabled={!url.trim() || connect.isPending}\n >\n <IconPlugConnected size={16} />\n {connect.isPending ? \"Connecting...\" : \"Connect agent\"}\n </Button>\n </DialogFooter>\n </TabsContent>\n </Tabs>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction DeleteAgentButton({\n resource,\n onDeleted,\n}: {\n resource: WorkspaceAgentResource;\n onDeleted?: () => void;\n}) {\n const remove = useActionMutation(\"delete-workspace-resource\", {\n onSuccess: () => {\n toast.success(\"Agent removed\");\n onDeleted?.();\n },\n onError: (error) => toast.error(error.message),\n });\n\n return (\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`Remove ${resource.name}`}\n >\n <IconTrash size={16} />\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remove {resource.name}?</AlertDialogTitle>\n <AlertDialogDescription>\n This removes the reusable profile from the workspace apps.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => remove.mutate({ id: resource.id })}\n disabled={remove.isPending}\n >\n Remove\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n\nfunction AgentRow({\n resource,\n onDeleted,\n onSaved,\n}: {\n resource: WorkspaceAgentResource;\n onDeleted?: () => void;\n onSaved?: () => void;\n}) {\n const navigate = useNavigate();\n const packQuery = useActionQuery<AgentPackResponse>(\n \"list-agent-pack\",\n { agentId: resource.id },\n { enabled: false },\n );\n const promote = useActionMutation<\n AgentAppCreationResult,\n AgentAppCreationInput\n >(\"start-workspace-app-creation\", {\n onSuccess: (result) => {\n if (result.mode === \"local-agent\") {\n sendToAgentChat({\n message: result.prompt ?? result.message,\n submit: true,\n type: \"code\",\n newTab: true,\n reuseEmptyTab: true,\n });\n toast.success(\"Sent to the local agent\");\n return;\n }\n if (result.mode === \"builder\") {\n toast.success(\"App build started\", {\n description: result.message,\n action: result.url\n ? {\n label: \"Open in Builder\",\n onClick: () =>\n window.open(result.url, \"_blank\", \"noopener,noreferrer\"),\n }\n : undefined,\n });\n return;\n }\n toast.error(result.message);\n },\n onError: (error) => toast.error(error.message),\n });\n\n function chat() {\n navigateWithAgentChatViewTransition(\n navigate,\n `/chat?agent=${encodeURIComponent(resource.path)}`,\n );\n }\n\n async function buildApp() {\n const pack = await packQuery.refetch();\n if (pack.error || !pack.data) {\n toast.error(pack.error?.message || \"Could not load the agent pack\");\n return;\n }\n promote.mutate({\n appId: slugifyAgentName(resource.name),\n description: resource.description || undefined,\n prompt: `Turn the \"${resource.name}\" workspace agent into a focused workspace app. Preserve its role and instructions, make the app its usable face, and keep the original reusable agent profile available.`,\n resourceIds: [resource.id, ...pack.data.files.map((file) => file.id)],\n });\n }\n\n return (\n <div className=\"flex items-start gap-3 rounded-xl border bg-card px-4 py-3\">\n <div className=\"flex size-9 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <IconUser size={18} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">\n {resource.name}\n </span>\n <Badge variant=\"outline\">\n {resource.scope === \"all\" ? \"All apps\" : \"Selected apps\"}\n </Badge>\n </div>\n {resource.description ? (\n <div className=\"mt-1 text-sm text-muted-foreground\">\n {resource.description}\n </div>\n ) : null}\n <div className=\"mt-1 font-mono text-[11px] text-muted-foreground/70\">\n {resource.path}\n </div>\n </div>\n <div className=\"flex shrink-0 flex-wrap items-center justify-end gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={chat}\n aria-label={`Chat with ${resource.name}`}\n >\n <IconMessageCircle size={15} />\n Chat\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => void buildApp()}\n disabled={promote.isPending}\n aria-label={`Build an app for ${resource.name}`}\n >\n <IconLayoutGrid size={15} />\n {promote.isPending ? \"Starting...\" : \"Build app\"}\n </Button>\n <AgentPackDialog\n resource={resource}\n onChanged={onSaved}\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`Manage files for ${resource.name}`}\n >\n <IconFolder size={16} />\n </Button>\n }\n />\n <AgentEditorDialog\n resource={resource}\n onSaved={onSaved}\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`Edit ${resource.name}`}\n >\n <IconEdit size={16} />\n </Button>\n }\n />\n <DeleteAgentButton resource={resource} onDeleted={onDeleted} />\n </div>\n </div>\n );\n}\n\ninterface AgentAppCreationInput {\n appId: string;\n description?: string;\n prompt: string;\n resourceIds: string[];\n}\n\ninterface AgentAppCreationResult {\n mode: \"builder\" | \"local-agent\" | \"builder-unavailable\" | \"coming-soon\";\n message: string;\n prompt?: string;\n url?: string;\n}\n\nexport function SimpleAgentsPanel() {\n const query = useActionQuery<WorkspaceAgentResource[]>(\n \"list-workspace-resources\",\n { kind: \"agent\" },\n );\n const agents = query.data ?? [];\n\n if (query.isError) {\n return (\n <ActionQueryError\n error={query.error}\n onRetry={() => void query.refetch()}\n />\n );\n }\n\n return (\n <section className=\"flex flex-col gap-4\">\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <ImportAgentDialog onImported={() => void query.refetch()} />\n <AgentEditorDialog onSaved={() => void query.refetch()} />\n </div>\n {query.isLoading && agents.length === 0 ? (\n <div className=\"flex flex-col gap-3\">\n {[0, 1, 2].map((item) => (\n <div key={item} className=\"rounded-xl border bg-card px-4 py-3\">\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton className=\"mt-2 h-3 w-2/3\" />\n </div>\n ))}\n </div>\n ) : agents.length > 0 ? (\n <div className=\"flex flex-col gap-2\">\n {agents.map((agent) => (\n <AgentRow\n key={agent.id}\n resource={agent}\n onDeleted={() => void query.refetch()}\n onSaved={() => void query.refetch()}\n />\n ))}\n </div>\n ) : (\n <div className=\"rounded-xl border border-dashed px-6 py-14 text-center\">\n <div className=\"text-sm font-medium text-foreground\">\n No agents yet\n </div>\n <div className=\"mt-4 flex flex-wrap justify-center gap-2\">\n <AgentEditorDialog\n onSaved={() => void query.refetch()}\n trigger={\n <Button>\n <IconPlus size={16} />\n Create an agent\n </Button>\n }\n />\n <ImportAgentDialog onImported={() => void query.refetch()} />\n </div>\n </div>\n )}\n </section>\n );\n}\n"]}
1
+ {"version":3,"file":"simple-agents-panel.js","sourceRoot":"","sources":["../../src/components/simple-agents-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n navigateWithAgentChatViewTransition,\n sendToAgentChat,\n} from \"@agent-native/core/client/agent-chat\";\nimport {\n useActionMutation,\n useActionQuery,\n} from \"@agent-native/core/client/hooks\";\nimport { parseCustomAgentProfile } from \"@agent-native/core/resources/metadata\";\nimport {\n IconAdjustmentsHorizontal,\n IconChevronDown,\n IconDotsVertical,\n IconEdit,\n IconFileImport,\n IconFolder,\n IconLayoutGrid,\n IconMessageCircle,\n IconPlugConnected,\n IconPlus,\n IconTrash,\n IconUpload,\n} from \"@tabler/icons-react\";\nimport {\n useEffect,\n useRef,\n useState,\n type ChangeEvent,\n type ReactNode,\n} from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { toast } from \"sonner\";\n\nimport {\n buildSimpleAgentContent,\n slugifyAgentName,\n} from \"../lib/simple-agent-profile.js\";\nimport { ActionQueryError } from \"./action-query-error\";\nimport { AppIcon } from \"./app-icon\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"./ui/alert-dialog\";\nimport { Badge } from \"./ui/badge\";\nimport { Button } from \"./ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"./ui/collapsible\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"./ui/dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./ui/dropdown-menu\";\nimport { Input } from \"./ui/input\";\nimport { Label } from \"./ui/label\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"./ui/tabs\";\nimport { Textarea } from \"./ui/textarea\";\n\ninterface WorkspaceAgentResource {\n id: string;\n name: string;\n description: string | null;\n path: string;\n content: string;\n scope: \"all\" | \"selected\";\n updatedAt: number;\n}\n\ninterface AgentPackFileResource extends WorkspaceAgentResource {\n kind: \"agent-file\" | \"skill\";\n}\n\ninterface AgentPackResponse {\n profile: WorkspaceAgentResource;\n root: string;\n files: AgentPackFileResource[];\n}\n\ninterface AgentPackFileInput {\n path: string;\n content: string;\n}\n\nconst AGENT_ICON_KEYS = [\n \"brain\",\n \"users\",\n \"filetext\",\n \"chartbar\",\n \"route\",\n \"listcheck\",\n \"code\",\n \"messagecircle\",\n] as const;\n\nfunction agentIconKey(resource: Pick<WorkspaceAgentResource, \"id\" | \"name\">) {\n let hash = 0;\n for (const character of `${resource.id}:${resource.name}`) {\n hash = (hash * 31 + character.charCodeAt(0)) | 0;\n }\n return AGENT_ICON_KEYS[Math.abs(hash) % AGENT_ICON_KEYS.length];\n}\n\nexport function isPendingWorkspaceResourceApproval(result: unknown) {\n if (!result || typeof result !== \"object\") return false;\n const mutation = result as { status?: unknown; changeType?: unknown };\n return (\n mutation.status === \"pending\" &&\n typeof mutation.changeType === \"string\" &&\n mutation.changeType.startsWith(\"workspace-resource.\")\n );\n}\n\nexport function handleAgentPackMutationSuccess(\n result: unknown,\n options: {\n appliedMessage: string;\n approvalMessage: string;\n onApplied: () => void;\n notify?: (message: string) => void;\n },\n) {\n const notify = options.notify || ((message) => toast.success(message));\n if (isPendingWorkspaceResourceApproval(result)) {\n notify(options.approvalMessage);\n return;\n }\n notify(options.appliedMessage);\n options.onApplied();\n}\n\ninterface AgentEditorProps {\n resource?: WorkspaceAgentResource;\n trigger?: ReactNode;\n onSaved?: () => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nfunction profileFields(resource?: WorkspaceAgentResource) {\n if (!resource) {\n return {\n name: \"\",\n description: \"\",\n instructions: \"# Role\\n\\nDescribe how this agent should work.\\n\",\n model: \"inherit\",\n tools: \"inherit\",\n scope: \"all\" as const,\n };\n }\n\n const profile = parseCustomAgentProfile(resource.content, resource.path);\n return {\n name: profile?.name || resource.name,\n description: profile?.description || resource.description || \"\",\n instructions: profile?.instructions || resource.content,\n model: profile?.model || \"inherit\",\n tools: profile?.tools || \"inherit\",\n scope: resource.scope,\n };\n}\n\nfunction AgentEditorDialog({\n resource,\n trigger,\n onSaved,\n open: controlledOpen,\n onOpenChange: controlledOnOpenChange,\n}: AgentEditorProps) {\n const isEditing = Boolean(resource);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = controlledOnOpenChange ?? setUncontrolledOpen;\n const [name, setName] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [instructions, setInstructions] = useState(\"\");\n const [model, setModel] = useState(\"inherit\");\n const [tools, setTools] = useState(\"inherit\");\n const [scope, setScope] = useState<\"all\" | \"selected\">(\"all\");\n const [advancedOpen, setAdvancedOpen] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n const fields = profileFields(resource);\n setName(fields.name);\n setDescription(fields.description);\n setInstructions(fields.instructions);\n setModel(fields.model);\n setTools(fields.tools);\n setScope(fields.scope);\n setAdvancedOpen(fields.model !== \"inherit\" || fields.tools !== \"inherit\");\n }, [open, resource]);\n\n const create = useActionMutation(\"create-workspace-resource\", {\n onSuccess: () => {\n toast.success(\"Agent created\");\n setOpen(false);\n onSaved?.();\n },\n onError: (error) => toast.error(error.message),\n });\n const update = useActionMutation(\"update-workspace-resource\", {\n onSuccess: () => {\n toast.success(\"Agent updated\");\n setOpen(false);\n onSaved?.();\n },\n onError: (error) => toast.error(error.message),\n });\n\n const pending = create.isPending || update.isPending;\n const canSave = Boolean(name.trim() && instructions.trim() && !pending);\n\n function save() {\n const content = buildSimpleAgentContent({\n name,\n description,\n model,\n tools,\n instructions,\n });\n if (resource) {\n update.mutate({\n id: resource.id,\n name: name.trim(),\n description: description.trim(),\n content,\n scope,\n });\n return;\n }\n create.mutate({\n kind: \"agent\",\n name: name.trim(),\n description: description.trim() || undefined,\n path: `agents/${slugifyAgentName(name)}.md`,\n content,\n scope,\n });\n }\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n {trigger ? (\n <DialogTrigger asChild>{trigger}</DialogTrigger>\n ) : controlledOpen === undefined ? (\n <DialogTrigger asChild>\n <Button size=\"sm\">\n <IconPlus size={16} />\n Create agent\n </Button>\n </DialogTrigger>\n ) : null}\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>\n {isEditing ? \"Manage agent\" : \"Create agent\"}\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n {isEditing\n ? \"Update this reusable agent profile.\"\n : \"Create a reusable agent profile.\"}\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-4 py-2\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-name\">Name</Label>\n <Input\n id=\"simple-agent-name\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n placeholder=\"User Research\"\n />\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-scope\">Availability</Label>\n <Select\n value={scope}\n onValueChange={(value: \"all\" | \"selected\") => setScope(value)}\n >\n <SelectTrigger id=\"simple-agent-scope\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All apps</SelectItem>\n <SelectItem value=\"selected\">Selected apps</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-description\">Description</Label>\n <Input\n id=\"simple-agent-description\"\n value={description}\n onChange={(event) => setDescription(event.target.value)}\n placeholder=\"Synthesizes user research into clear insights\"\n />\n </div>\n <Collapsible open={advancedOpen} onOpenChange={setAdvancedOpen}>\n <CollapsibleTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"group -ml-2 gap-1.5 text-muted-foreground\"\n >\n <IconAdjustmentsHorizontal size={15} />\n Advanced\n <IconChevronDown\n className=\"transition-transform group-data-[state=open]:rotate-180\"\n size={15}\n />\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pt-3\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-model\">Model</Label>\n <Input\n id=\"simple-agent-model\"\n value={model}\n onChange={(event) => setModel(event.target.value)}\n placeholder=\"inherit\"\n />\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-tools\">Tools</Label>\n <Input\n id=\"simple-agent-tools\"\n value={tools}\n onChange={(event) => setTools(event.target.value)}\n placeholder=\"inherit\"\n />\n </div>\n </div>\n </CollapsibleContent>\n </Collapsible>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"simple-agent-instructions\">Instructions</Label>\n <Textarea\n id=\"simple-agent-instructions\"\n value={instructions}\n onChange={(event) => setInstructions(event.target.value)}\n rows={12}\n className=\"font-mono text-sm\"\n placeholder=\"# Role\\n\\nDescribe how this agent should work.\"\n />\n </div>\n </div>\n <DialogFooter>\n <Button onClick={save} disabled={!canSave}>\n {pending\n ? \"Saving...\"\n : isEditing\n ? \"Save changes\"\n : \"Create agent\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction AgentPackDialog({\n resource,\n onChanged,\n trigger,\n open: controlledOpen,\n onOpenChange: controlledOnOpenChange,\n}: {\n resource: WorkspaceAgentResource;\n onChanged?: () => void;\n trigger?: ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = controlledOnOpenChange ?? setUncontrolledOpen;\n const [selectedId, setSelectedId] = useState(resource.id);\n const [content, setContent] = useState(resource.content);\n const [addOpen, setAddOpen] = useState(false);\n const [newPath, setNewPath] = useState(\"\");\n const [newKind, setNewKind] = useState<\"agent-file\" | \"skill\">(\"agent-file\");\n const [newContent, setNewContent] = useState(\"\");\n const query = useActionQuery<AgentPackResponse>(\n \"list-agent-pack\",\n { agentId: resource.id },\n { enabled: open },\n );\n const update = useActionMutation(\"update-workspace-resource\", {\n onSuccess: (result) => {\n handleAgentPackMutationSuccess(result, {\n appliedMessage: \"Pack file updated\",\n approvalMessage: \"Pack file update queued for approval\",\n onApplied: () => {\n void query.refetch();\n onChanged?.();\n },\n });\n },\n onError: (error) => toast.error(error.message),\n });\n const create = useActionMutation(\"create-workspace-resource\", {\n onSuccess: (result) => {\n handleAgentPackMutationSuccess(result, {\n appliedMessage: \"Pack file added\",\n approvalMessage: \"Pack file addition queued for approval\",\n onApplied: () => {\n setAddOpen(false);\n setNewPath(\"\");\n setNewContent(\"\");\n void query.refetch();\n onChanged?.();\n },\n });\n },\n onError: (error) => toast.error(error.message),\n });\n const remove = useActionMutation(\"delete-workspace-resource\", {\n onSuccess: () => {\n toast.success(\"Pack file removed\");\n setSelectedId(resource.id);\n void query.refetch();\n onChanged?.();\n },\n onError: (error) => toast.error(error.message),\n });\n\n const files = query.data\n ? [{ ...query.data.profile, kind: \"agent\" as const }, ...query.data.files]\n : [];\n const selected = files.find((file) => file.id === selectedId) ?? files[0];\n\n useEffect(() => {\n if (!open) return;\n setSelectedId(resource.id);\n }, [open, resource.id]);\n\n useEffect(() => {\n if (!selected) return;\n setSelectedId(selected.id);\n setContent(selected.content);\n }, [selected?.id, selected?.content]);\n\n function addFile() {\n const relativePath = newPath.trim().replaceAll(\"\\\\\", \"/\");\n if (\n !relativePath ||\n relativePath.startsWith(\"/\") ||\n relativePath.includes(\"..\") ||\n relativePath.split(\"/\").some((part) => !part || part === \".\")\n ) {\n toast.error(\"Use a relative pack path without ..\");\n return;\n }\n const packPath =\n newKind === \"skill\" && !relativePath.startsWith(\"skills/\")\n ? `skills/${relativePath}`\n : relativePath;\n const name = packPath.split(\"/\").pop() || packPath;\n create.mutate({\n kind: newKind,\n name,\n path: `${query.data?.root || `agents/${slugifyAgentName(resource.name)}`}/${packPath}`,\n content: newContent,\n scope: resource.scope,\n });\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n if (!nextOpen) setAddOpen(false);\n }}\n >\n {trigger ? (\n <DialogTrigger asChild>{trigger}</DialogTrigger>\n ) : controlledOpen === undefined ? (\n <DialogTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\">\n <IconFolder size={15} />\n Pack\n </Button>\n </DialogTrigger>\n ) : null}\n <DialogContent className=\"max-w-4xl\">\n <DialogHeader>\n <DialogTitle>Agent pack</DialogTitle>\n <DialogDescription className=\"sr-only\">\n Edit the profile, reference files, context, and skills that belong\n to this agent.\n </DialogDescription>\n </DialogHeader>\n <div className=\"grid min-h-0 gap-4 md:grid-cols-[220px_minmax(0,1fr)]\">\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Files\n </span>\n <Dialog open={addOpen} onOpenChange={setAddOpen}>\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <IconPlus size={14} />\n Add\n </Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Add pack file</DialogTitle>\n <DialogDescription className=\"sr-only\">\n Add a text reference or agent-owned skill to this pack.\n </DialogDescription>\n </DialogHeader>\n <div className=\"flex flex-col gap-4 py-2\">\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"agent-pack-file-path\">Path</Label>\n <Input\n id=\"agent-pack-file-path\"\n value={newPath}\n onChange={(event) => setNewPath(event.target.value)}\n placeholder=\"context/brief.md\"\n />\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"agent-pack-file-kind\">Type</Label>\n <Select\n value={newKind}\n onValueChange={(value: \"agent-file\" | \"skill\") =>\n setNewKind(value)\n }\n >\n <SelectTrigger id=\"agent-pack-file-kind\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"agent-file\">\n Reference file\n </SelectItem>\n <SelectItem value=\"skill\">Skill</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"agent-pack-file-content\">Content</Label>\n <Textarea\n id=\"agent-pack-file-content\"\n value={newContent}\n onChange={(event) => setNewContent(event.target.value)}\n rows={8}\n className=\"font-mono text-sm\"\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n onClick={addFile}\n disabled={!newPath.trim() || create.isPending}\n >\n {create.isPending ? \"Adding...\" : \"Add file\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </div>\n {query.isLoading ? (\n <Skeleton className=\"h-24 w-full\" />\n ) : (\n <div className=\"flex flex-col gap-1\">\n {files.map((file) => (\n <Button\n key={file.id}\n type=\"button\"\n variant={selected?.id === file.id ? \"secondary\" : \"ghost\"}\n className=\"h-auto w-full justify-start px-2 py-2 text-left\"\n onClick={() => setSelectedId(file.id)}\n >\n <span className=\"min-w-0 truncate text-xs\">\n {file.path.replace(`${query.data?.root || \"\"}/`, \"\")}\n </span>\n </Button>\n ))}\n </div>\n )}\n </div>\n <div className=\"flex min-w-0 flex-col gap-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">\n {selected?.path || \"Select a file\"}\n </div>\n {selected && selected.kind !== \"agent\" ? (\n <Badge variant=\"outline\">\n {selected.kind === \"skill\" ? \"Skill\" : \"Reference\"}\n </Badge>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1\">\n {selected && selected.kind !== \"agent\" ? (\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\">\n <IconTrash size={15} />\n Remove\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n Remove this pack file?\n </AlertDialogTitle>\n <AlertDialogDescription>\n The file will no longer be available to this agent.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => remove.mutate({ id: selected.id })}\n disabled={remove.isPending}\n >\n Remove\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n ) : null}\n <Button\n size=\"sm\"\n onClick={() =>\n selected && update.mutate({ id: selected.id, content })\n }\n disabled={\n !selected ||\n update.isPending ||\n content === selected.content\n }\n >\n {update.isPending ? \"Saving...\" : \"Save file\"}\n </Button>\n </div>\n </div>\n <Textarea\n value={content}\n onChange={(event) => setContent(event.target.value)}\n disabled={!selected}\n rows={18}\n className=\"min-h-[360px] font-mono text-sm\"\n />\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction ImportAgentDialog({ onImported }: { onImported?: () => void }) {\n const [open, setOpen] = useState(false);\n const [mode, setMode] = useState<\"file\" | \"folder\" | \"endpoint\">(\"file\");\n const [source, setSource] = useState(\"\");\n const [fileName, setFileName] = useState(\"\");\n const [scope, setScope] = useState<\"all\" | \"selected\">(\"all\");\n const [url, setUrl] = useState(\"\");\n const [endpointName, setEndpointName] = useState(\"\");\n const [endpointDescription, setEndpointDescription] = useState(\"\");\n const [packFiles, setPackFiles] = useState<AgentPackFileInput[]>([]);\n const [packName, setPackName] = useState(\"\");\n const [packWarnings, setPackWarnings] = useState<string[]>([]);\n const fileRef = useRef<HTMLInputElement>(null);\n const folderRef = useRef<HTMLInputElement>(null);\n\n const importAgent = useActionMutation(\"import-agent\", {\n onSuccess: (result: { status: string; warnings?: string[] }) => {\n toast.success(\n result.status === \"unchanged\"\n ? \"Agent already imported\"\n : \"Agent imported\",\n );\n if (result.warnings?.length) {\n toast.info(result.warnings.join(\" \"));\n }\n setOpen(false);\n onImported?.();\n },\n onError: (error) => toast.error(error.message),\n });\n const connect = useActionMutation(\"connect-external-agent\", {\n onSuccess: () => {\n toast.success(\"Agent connected\");\n setOpen(false);\n onImported?.();\n },\n onError: (error) => toast.error(error.message),\n });\n const importPack = useActionMutation(\"import-agent-pack\", {\n onSuccess: (result: { status: string; warnings?: string[] }) => {\n toast.success(\n result.status === \"pending-approval\"\n ? \"Pack sent for approval\"\n : result.status === \"unchanged\"\n ? \"Agent pack already imported\"\n : \"Agent pack imported\",\n );\n if (result.warnings?.length) toast.info(result.warnings.join(\" \"));\n setOpen(false);\n onImported?.();\n },\n onError: (error) => toast.error(error.message),\n });\n\n useEffect(() => {\n if (!folderRef.current) return;\n folderRef.current.setAttribute(\"webkitdirectory\", \"\");\n folderRef.current.setAttribute(\"directory\", \"\");\n }, [mode, open]);\n\n function reset() {\n setMode(\"file\");\n setSource(\"\");\n setFileName(\"\");\n setScope(\"all\");\n setUrl(\"\");\n setEndpointName(\"\");\n setEndpointDescription(\"\");\n setPackFiles([]);\n setPackName(\"\");\n setPackWarnings([]);\n }\n\n async function handleFile(event: ChangeEvent<HTMLInputElement>) {\n const file = event.target.files?.[0];\n if (!file) return;\n setFileName(file.name);\n setSource(await file.text());\n }\n\n async function handleFolder(event: ChangeEvent<HTMLInputElement>) {\n const selectedFiles = Array.from(event.target.files ?? []);\n if (selectedFiles.length === 0) return;\n const warnings: string[] = [];\n const textExtensions =\n /\\.(md|markdown|txt|json|yaml|yml|csv|html|xml|toml|ts|tsx|js|mjs|py|sh)$/i;\n const pack = await Promise.all(\n selectedFiles.map(async (file) => {\n const path =\n (file as File & { webkitRelativePath?: string }).webkitRelativePath ||\n file.name;\n if (!textExtensions.test(path)) {\n warnings.push(`Skipped non-text file: ${path}`);\n return null;\n }\n return { path, content: await file.text() };\n }),\n );\n const files = pack.filter((file): file is AgentPackFileInput =>\n Boolean(file),\n );\n setPackFiles(files);\n setPackName(files[0]?.path.split(\"/\")[0] || \"Selected folder\");\n setPackWarnings(warnings);\n }\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n if (!nextOpen) reset();\n }}\n >\n <DialogTrigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <IconFileImport size={16} />\n Import or connect\n </Button>\n </DialogTrigger>\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle>Import an agent</DialogTitle>\n <DialogDescription className=\"sr-only\">\n Import a Claude or JSON agent definition, or connect an external\n agent endpoint.\n </DialogDescription>\n </DialogHeader>\n <Tabs\n value={mode}\n onValueChange={(value) =>\n setMode(value as \"file\" | \"folder\" | \"endpoint\")\n }\n >\n <TabsList className=\"w-full justify-start\">\n <TabsTrigger value=\"file\">Agent file</TabsTrigger>\n <TabsTrigger value=\"folder\">Agent folder</TabsTrigger>\n <TabsTrigger value=\"endpoint\">Connect endpoint</TabsTrigger>\n </TabsList>\n <TabsContent value=\"file\" className=\"flex flex-col gap-4 py-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => fileRef.current?.click()}\n >\n <IconUpload size={16} />\n Choose file\n </Button>\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".md,.markdown,.json,.txt\"\n className=\"hidden\"\n onChange={(event) => void handleFile(event)}\n />\n <span className=\"text-xs text-muted-foreground\">\n {fileName || \"Claude .md or JSON agent definition\"}\n </span>\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"import-agent-source\">Definition</Label>\n <Textarea\n id=\"import-agent-source\"\n value={source}\n onChange={(event) => setSource(event.target.value)}\n rows={12}\n className=\"font-mono text-sm\"\n placeholder=\"Paste a Claude-style agent file or a JSON definition\"\n />\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"import-agent-scope\">Availability</Label>\n <Select\n value={scope}\n onValueChange={(value: \"all\" | \"selected\") => setScope(value)}\n >\n <SelectTrigger id=\"import-agent-scope\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All apps</SelectItem>\n <SelectItem value=\"selected\">Selected apps</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <DialogFooter>\n <Button\n onClick={() =>\n importAgent.mutate({\n source,\n fileName: fileName || undefined,\n scope,\n })\n }\n disabled={!source.trim() || importAgent.isPending}\n >\n {importAgent.isPending ? \"Importing...\" : \"Import agent\"}\n </Button>\n </DialogFooter>\n </TabsContent>\n <TabsContent value=\"folder\" className=\"flex flex-col gap-4 py-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => folderRef.current?.click()}\n >\n <IconFolder size={16} />\n Choose folder\n </Button>\n <input\n ref={folderRef}\n type=\"file\"\n multiple\n className=\"hidden\"\n onChange={(event) => void handleFolder(event)}\n />\n <span className=\"text-xs text-muted-foreground\">\n {packName\n ? `${packName} · ${packFiles.length} files`\n : \"Claude Project or Cowork-style folder\"}\n </span>\n </div>\n {packWarnings.length > 0 ? (\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-xs text-amber-800 dark:text-amber-200\">\n {packWarnings.join(\" \")}\n </div>\n ) : null}\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"import-agent-pack-scope\">Availability</Label>\n <Select\n value={scope}\n onValueChange={(value: \"all\" | \"selected\") => setScope(value)}\n >\n <SelectTrigger id=\"import-agent-pack-scope\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All apps</SelectItem>\n <SelectItem value=\"selected\">Selected apps</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <DialogFooter>\n <Button\n onClick={() => importPack.mutate({ files: packFiles, scope })}\n disabled={packFiles.length === 0 || importPack.isPending}\n >\n {importPack.isPending ? \"Importing...\" : \"Import agent pack\"}\n </Button>\n </DialogFooter>\n </TabsContent>\n <TabsContent value=\"endpoint\" className=\"flex flex-col gap-4 py-4\">\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"external-agent-url\">Endpoint URL</Label>\n <Input\n id=\"external-agent-url\"\n value={url}\n onChange={(event) => setUrl(event.target.value)}\n placeholder=\"https://agent.example.com\"\n />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"external-agent-name\">Name</Label>\n <Input\n id=\"external-agent-name\"\n value={endpointName}\n onChange={(event) => setEndpointName(event.target.value)}\n placeholder=\"Research partner\"\n />\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label>Availability</Label>\n <div className=\"flex h-10 items-center\">\n <Badge variant=\"secondary\">Workspace</Badge>\n </div>\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"external-agent-description\">Description</Label>\n <Input\n id=\"external-agent-description\"\n value={endpointDescription}\n onChange={(event) => setEndpointDescription(event.target.value)}\n placeholder=\"Optional\"\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">\n Dispatch stores the public endpoint only. Authenticate it after\n connecting.\n </p>\n <DialogFooter>\n <Button\n onClick={() =>\n connect.mutate({\n url,\n name: endpointName || undefined,\n description: endpointDescription || undefined,\n scope: \"shared\",\n })\n }\n disabled={!url.trim() || connect.isPending}\n >\n <IconPlugConnected size={16} />\n {connect.isPending ? \"Connecting...\" : \"Connect agent\"}\n </Button>\n </DialogFooter>\n </TabsContent>\n </Tabs>\n </DialogContent>\n </Dialog>\n );\n}\n\nfunction DeleteAgentButton({\n resource,\n onDeleted,\n open: controlledOpen,\n onOpenChange: controlledOnOpenChange,\n}: {\n resource: WorkspaceAgentResource;\n onDeleted?: () => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = controlledOnOpenChange ?? setUncontrolledOpen;\n const remove = useActionMutation(\"delete-workspace-resource\", {\n onSuccess: () => {\n toast.success(\"Agent removed\");\n onDeleted?.();\n },\n onError: (error) => toast.error(error.message),\n });\n\n return (\n <AlertDialog open={open} onOpenChange={setOpen}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remove {resource.name}?</AlertDialogTitle>\n <AlertDialogDescription>\n This removes the reusable profile from the workspace apps.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => remove.mutate({ id: resource.id })}\n disabled={remove.isPending}\n >\n Remove\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n\nfunction AgentRow({\n resource,\n onDeleted,\n onSaved,\n}: {\n resource: WorkspaceAgentResource;\n onDeleted?: () => void;\n onSaved?: () => void;\n}) {\n const navigate = useNavigate();\n const [packOpen, setPackOpen] = useState(false);\n const [editorOpen, setEditorOpen] = useState(false);\n const [deleteOpen, setDeleteOpen] = useState(false);\n const packQuery = useActionQuery<AgentPackResponse>(\n \"list-agent-pack\",\n { agentId: resource.id },\n { enabled: false },\n );\n const promote = useActionMutation<\n AgentAppCreationResult,\n AgentAppCreationInput\n >(\"start-workspace-app-creation\", {\n onSuccess: (result) => {\n if (result.mode === \"local-agent\") {\n sendToAgentChat({\n message: result.prompt ?? result.message,\n submit: true,\n type: \"code\",\n newTab: true,\n reuseEmptyTab: true,\n });\n toast.success(\"Sent to the local agent\");\n return;\n }\n if (result.mode === \"builder\") {\n toast.success(\"App build started\", {\n description: result.message,\n action: result.url\n ? {\n label: \"Open in Builder\",\n onClick: () =>\n window.open(result.url, \"_blank\", \"noopener,noreferrer\"),\n }\n : undefined,\n });\n return;\n }\n toast.error(result.message);\n },\n onError: (error) => toast.error(error.message),\n });\n\n function chat() {\n navigateWithAgentChatViewTransition(\n navigate,\n `/chat?agent=${encodeURIComponent(resource.path)}`,\n );\n }\n\n async function buildApp() {\n const pack = await packQuery.refetch();\n if (pack.error || !pack.data) {\n toast.error(pack.error?.message || \"Could not load the agent pack\");\n return;\n }\n promote.mutate({\n appId: slugifyAgentName(resource.name),\n description: resource.description || undefined,\n prompt: `Turn the \"${resource.name}\" workspace agent into a focused workspace app. Preserve its role and instructions, make the app its usable face, and keep the original reusable agent profile available.`,\n resourceIds: [resource.id, ...pack.data.files.map((file) => file.id)],\n });\n }\n\n return (\n <div className=\"flex min-w-0 items-start gap-3 rounded-2xl border bg-card px-4 py-4\">\n <AppIcon\n id={resource.id}\n name={resource.name}\n icon={agentIconKey(resource)}\n size=\"sm\"\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-sm font-medium text-foreground\">\n {resource.name}\n </span>\n <Badge variant=\"outline\">\n {resource.scope === \"all\" ? \"All apps\" : \"Selected apps\"}\n </Badge>\n </div>\n {resource.description ? (\n <div className=\"mt-1 text-sm text-muted-foreground\">\n {resource.description}\n </div>\n ) : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={chat}\n aria-label={`Chat with ${resource.name}`}\n >\n <IconMessageCircle size={15} />\n Chat\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`More actions for ${resource.name}`}\n title=\"More actions\"\n >\n <IconDotsVertical size={16} />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuItem\n onSelect={() => {\n void buildApp();\n }}\n disabled={promote.isPending}\n >\n <IconLayoutGrid className=\"me-2 size-4\" />\n {promote.isPending ? \"Starting...\" : \"Build app\"}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => setPackOpen(true)}>\n <IconFolder className=\"me-2 size-4\" />\n Manage files\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => setEditorOpen(true)}>\n <IconEdit className=\"me-2 size-4\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"text-destructive focus:text-destructive\"\n onSelect={() => setDeleteOpen(true)}\n >\n <IconTrash className=\"me-2 size-4\" />\n Remove\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <AgentPackDialog\n resource={resource}\n onChanged={onSaved}\n open={packOpen}\n onOpenChange={setPackOpen}\n />\n <AgentEditorDialog\n resource={resource}\n onSaved={onSaved}\n open={editorOpen}\n onOpenChange={setEditorOpen}\n />\n <DeleteAgentButton\n resource={resource}\n onDeleted={onDeleted}\n open={deleteOpen}\n onOpenChange={setDeleteOpen}\n />\n </div>\n </div>\n );\n}\n\ninterface AgentAppCreationInput {\n appId: string;\n description?: string;\n prompt: string;\n resourceIds: string[];\n}\n\ninterface AgentAppCreationResult {\n mode: \"builder\" | \"local-agent\" | \"builder-unavailable\" | \"coming-soon\";\n message: string;\n prompt?: string;\n url?: string;\n}\n\nexport function SimpleAgentsPanel({\n title,\n}: {\n title?: ReactNode;\n} = {}) {\n const query = useActionQuery<WorkspaceAgentResource[]>(\n \"list-workspace-resources\",\n { kind: \"agent\" },\n );\n const agents = query.data ?? [];\n const refreshAgents = () => void query.refetch();\n const importAction = <ImportAgentDialog onImported={refreshAgents} />;\n\n if (query.isError) {\n return (\n <ActionQueryError\n error={query.error}\n onRetry={() => void query.refetch()}\n />\n );\n }\n\n return (\n <section className=\"flex flex-col gap-4\">\n {title || agents.length > 0 ? (\n <div\n className={`flex flex-wrap items-center gap-3 ${title ? \"justify-between\" : \"justify-end\"}`}\n >\n {title ? (\n <h2 className=\"text-base font-medium text-foreground\">{title}</h2>\n ) : null}\n {agents.length > 0 ? (\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n {importAction}\n <AgentEditorDialog onSaved={refreshAgents} />\n </div>\n ) : null}\n </div>\n ) : null}\n {query.isLoading && agents.length === 0 ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n {[0, 1, 2].map((item) => (\n <div key={item} className=\"rounded-2xl border bg-card px-4 py-4\">\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton className=\"mt-2 h-3 w-2/3\" />\n </div>\n ))}\n </div>\n ) : agents.length > 0 ? (\n <div className=\"grid gap-3 md:grid-cols-2\">\n {agents.map((agent) => (\n <AgentRow\n key={agent.id}\n resource={agent}\n onDeleted={() => void query.refetch()}\n onSaved={() => void query.refetch()}\n />\n ))}\n </div>\n ) : (\n <div className=\"rounded-2xl border border-dashed bg-card px-4 py-12 text-center\">\n <div className=\"text-sm font-medium text-foreground\">\n No agents yet\n </div>\n <div className=\"mt-4 flex flex-wrap justify-center gap-2\">\n <AgentEditorDialog\n onSaved={refreshAgents}\n trigger={\n <Button size=\"sm\">\n <IconPlus size={16} />\n Create an agent\n </Button>\n }\n />\n {importAction}\n </div>\n </div>\n )}\n </section>\n );\n}\n"]}
@@ -16,9 +16,11 @@ interface WorkspaceAppFrameProps {
16
16
  app: WorkspaceAppFrameApp;
17
17
  /** Chat-first app tabs use their own route while standalone hosts use app metadata. */
18
18
  embedPath?: string;
19
+ /** Chat-first app surfaces own the parent chat rail around the iframe. */
20
+ chatSidebar?: boolean;
19
21
  copy?: ChatFirstCopy;
20
22
  }
21
- export declare function WorkspaceAppFrame({ app, embedPath, copy, }: WorkspaceAppFrameProps): import("node_modules/@types/react").JSX.Element;
23
+ export declare function WorkspaceAppFrame({ app, embedPath, chatSidebar, copy, }: WorkspaceAppFrameProps): import("node_modules/@types/react").JSX.Element;
22
24
  export declare function WorkspaceAppHost({ appId }: {
23
25
  appId?: string;
24
26
  }): import("node_modules/@types/react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-app-host.d.ts","sourceRoot":"","sources":["../../src/components/workspace-app-host.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,sCAAsC,CAAC;AA6B9C,UAAU,iBAAiB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,iBAAiB,CAEnB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,UAAU,sBAAsB;IAC9B,GAAG,EAAE,oBAAoB,CAAC;IAC1B,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,SAAS,EACT,IAA2B,GAC5B,EAAE,sBAAsB,mDA2HxB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,mDAwH7D;AAID,wBAAgB,qBAAqB,CAAC,EACpC,WAAW,GACZ,EAAE;IACD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,mDAwCA"}
1
+ {"version":3,"file":"workspace-app-host.d.ts","sourceRoot":"","sources":["../../src/components/workspace-app-host.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,sCAAsC,CAAC;AA6B9C,UAAU,iBAAiB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,iBAAiB,CAEnB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,UAAU,sBAAsB;IAC9B,GAAG,EAAE,oBAAoB,CAAC;IAC1B,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,SAAS,EACT,WAAmB,EACnB,IAA2B,GAC5B,EAAE,sBAAsB,mDAoJxB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,mDAwH7D;AAID,wBAAgB,qBAAqB,CAAC,EACpC,WAAW,GACZ,EAAE;IACD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,mDAwCA"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AgentSidebar } from "@agent-native/core/client/agent-chat";
2
3
  import { ChatFirstAppPane, defaultChatFirstCopy, } from "@agent-native/core/client/chat-first";
3
4
  import { useFeatureFlag } from "@agent-native/core/client/feature-flags";
4
5
  import { useActionMutation, useActionQuery, } from "@agent-native/core/client/hooks";
@@ -17,7 +18,7 @@ import { Skeleton } from "./ui/skeleton.js";
17
18
  export function buildChatFirstEmbedSessionInput(appId, path) {
18
19
  return { app: appId, path, chrome: "minimal" };
19
20
  }
20
- export function WorkspaceAppFrame({ app, embedPath, copy = defaultChatFirstCopy, }) {
21
+ export function WorkspaceAppFrame({ app, embedPath, chatSidebar = false, copy = defaultChatFirstCopy, }) {
21
22
  const [embedUrl, setEmbedUrl] = useState(null);
22
23
  const [embedError, setEmbedError] = useState(null);
23
24
  const [embedAttempt, setEmbedAttempt] = useState(0);
@@ -92,13 +93,21 @@ export function WorkspaceAppFrame({ app, embedPath, copy = defaultChatFirstCopy,
92
93
  window.addEventListener("message", handleEmbedSessionExpired);
93
94
  return () => window.removeEventListener("message", handleEmbedSessionExpired);
94
95
  }, [embedUrl]);
95
- return (_jsx(ChatFirstAppPane, { app: app, status: embedUrl
96
+ const appPane = (_jsx(ChatFirstAppPane, { app: app, status: embedUrl
96
97
  ? "ready"
97
98
  : embedError
98
99
  ? "error"
99
100
  : embedInput
100
101
  ? "loading"
101
102
  : "unresolved", embedUrl: embedUrl, errorMessage: embedError?.message, onRetry: embedInput ? () => setEmbedAttempt((attempt) => attempt + 1) : undefined, renderEmbed: ({ url, title }) => (_jsx("iframe", { "data-dispatch-workspace-app-frame": true, src: url, title: title ?? app.name, ref: embedFrameRef, referrerPolicy: "no-referrer", allow: "clipboard-read; clipboard-write", className: "h-full w-full border-0 bg-background" }, url + ":" + embedAttempt)), copy: copy }));
103
+ if (!chatSidebar)
104
+ return appPane;
105
+ return (_jsx(AgentSidebar, { position: "left", defaultOpen: true, openStorageKey: "dispatch-app-chat", storageKey: `dispatch-app-chat:${app.id}`, scope: {
106
+ type: "workspace-app",
107
+ id: app.id,
108
+ label: app.name,
109
+ contextKey: `workspace-app:${app.id}`,
110
+ }, agentChatSurface: "app", showTabBar: true, suppressInlineOpenApp: true, dynamicSuggestions: false, suggestions: [], emptyStateText: `Ask about ${app.name}`, children: appPane }));
102
111
  }
103
112
  export function WorkspaceAppHost({ appId }) {
104
113
  const t = useT();
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-app-host.js","sourceRoot":"","sources":["../../src/components/workspace-app-host.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n ChatFirstAppPane,\n defaultChatFirstCopy,\n type ChatFirstCopy,\n} from \"@agent-native/core/client/chat-first\";\nimport { useFeatureFlag } from \"@agent-native/core/client/feature-flags\";\nimport {\n useActionMutation,\n useActionQuery,\n} from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport { withBuilderUtmTrackingParams } from \"@agent-native/core/shared/builder-link-tracking\";\nimport { IconArrowLeft, IconClockHour4 } from \"@tabler/icons-react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Link } from \"react-router\";\n\nimport { isEmbedSessionExpiredMessage } from \"../lib/embed-session-recovery\";\nimport {\n workspaceAppDirectHref,\n workspaceAppEmbedTarget,\n workspaceAppHref,\n type WorkspaceAppSummary,\n} from \"../lib/workspace-apps\";\nimport { DISPATCH_WORKSPACE_SSO_FLAG } from \"../shared/feature-flags\";\nimport { ActionQueryError } from \"./action-query-error\";\nimport { Badge } from \"./ui/badge\";\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\n\ninterface EmbedSessionResult {\n startUrl: string;\n}\n\ninterface EmbedSessionInput {\n app?: string;\n path?: string;\n url?: string;\n chrome: \"minimal\";\n}\n\nexport function buildChatFirstEmbedSessionInput(\n appId: string,\n path: string,\n): EmbedSessionInput {\n return { app: appId, path, chrome: \"minimal\" };\n}\n\nexport interface WorkspaceAppFrameApp {\n id: string;\n name: string;\n path?: string | null;\n url?: string | null;\n}\n\ninterface WorkspaceAppFrameProps {\n app: WorkspaceAppFrameApp;\n /** Chat-first app tabs use their own route while standalone hosts use app metadata. */\n embedPath?: string;\n copy?: ChatFirstCopy;\n}\n\nexport function WorkspaceAppFrame({\n app,\n embedPath,\n copy = defaultChatFirstCopy,\n}: WorkspaceAppFrameProps) {\n const [embedUrl, setEmbedUrl] = useState<string | null>(null);\n const [embedError, setEmbedError] = useState<Error | null>(null);\n const [embedAttempt, setEmbedAttempt] = useState(0);\n const embedFrameRef = useRef<HTMLIFrameElement>(null);\n const workspaceSsoEnabled = useFeatureFlag(DISPATCH_WORKSPACE_SSO_FLAG.key);\n const createEmbedSession = useActionMutation<\n EmbedSessionResult,\n EmbedSessionInput\n >(\"create_embed_session\", {\n skipActionQueryInvalidation: true,\n });\n const createWorkspaceSsoEmbedSession = useActionMutation<\n EmbedSessionResult,\n EmbedSessionInput\n >(\"create-workspace-app-embed-session\", {\n skipActionQueryInvalidation: true,\n });\n const appHref = workspaceAppHref({\n id: app.id,\n name: app.name,\n path: app.path ?? \"\",\n url: app.url,\n });\n const embedInput = useMemo<EmbedSessionInput | null>(() => {\n if (embedPath !== undefined) {\n return buildChatFirstEmbedSessionInput(app.id, embedPath);\n }\n if (!appHref) return null;\n return {\n app: app.id,\n ...workspaceAppEmbedTarget({ path: app.path ?? \"\", url: app.url }),\n chrome: \"minimal\",\n };\n }, [app.id, app.path, app.url, appHref, embedPath]);\n\n useEffect(() => {\n if (!embedInput) return;\n let cancelled = false;\n setEmbedUrl(null);\n setEmbedError(null);\n const createSession = workspaceSsoEnabled\n ? createWorkspaceSsoEmbedSession\n : createEmbedSession;\n void createSession\n .mutateAsync(embedInput)\n .then((result) => {\n if (!cancelled) setEmbedUrl(result.startUrl);\n })\n .catch((cause: unknown) => {\n if (cancelled) return;\n setEmbedUrl(\n workspaceAppDirectHref(\n { path: app.path ?? \"\", url: app.url },\n embedPath ?? \"/\",\n ),\n );\n setEmbedError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n });\n return () => {\n cancelled = true;\n };\n }, [\n app.id,\n app.path,\n app.url,\n createEmbedSession.mutateAsync,\n createWorkspaceSsoEmbedSession.mutateAsync,\n embedInput,\n embedPath,\n embedAttempt,\n workspaceSsoEnabled,\n ]);\n\n useEffect(() => {\n const handleEmbedSessionExpired = (event: MessageEvent) => {\n if (\n !isEmbedSessionExpiredMessage(event, embedFrameRef.current, embedUrl)\n ) {\n return;\n }\n setEmbedAttempt((attempt) => attempt + 1);\n };\n\n window.addEventListener(\"message\", handleEmbedSessionExpired);\n return () =>\n window.removeEventListener(\"message\", handleEmbedSessionExpired);\n }, [embedUrl]);\n\n return (\n <ChatFirstAppPane\n app={app}\n status={\n embedUrl\n ? \"ready\"\n : embedError\n ? \"error\"\n : embedInput\n ? \"loading\"\n : \"unresolved\"\n }\n embedUrl={embedUrl}\n errorMessage={embedError?.message}\n onRetry={\n embedInput ? () => setEmbedAttempt((attempt) => attempt + 1) : undefined\n }\n renderEmbed={({ url, title }) => (\n <iframe\n key={url + \":\" + embedAttempt}\n data-dispatch-workspace-app-frame\n src={url}\n title={title ?? app.name}\n ref={embedFrameRef}\n referrerPolicy=\"no-referrer\"\n allow=\"clipboard-read; clipboard-write\"\n className=\"h-full w-full border-0 bg-background\"\n />\n )}\n copy={copy}\n />\n );\n}\n\nexport function WorkspaceAppHost({ appId }: { appId?: string }) {\n const t = useT();\n const appsQuery = useActionQuery(\"list-workspace-apps\", {\n includeAgentCards: false,\n });\n const { data: apps = [], isLoading } = appsQuery;\n const app = useMemo(\n () =>\n (apps as WorkspaceAppSummary[]).find((item) => item.id === appId) ?? null,\n [appId, apps],\n );\n\n if (appsQuery.isError) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center p-6\">\n <div className=\"w-full max-w-2xl\">\n <ActionQueryError\n error={appsQuery.error}\n onRetry={() => void appsQuery.refetch()}\n />\n </div>\n </div>\n );\n }\n\n if (isLoading && !app) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center p-6\">\n <div className=\"w-full max-w-2xl space-y-3 rounded-xl border bg-card p-6\">\n <Skeleton className=\"h-5 w-48\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-2/3\" />\n </div>\n </div>\n );\n }\n\n if (!app) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center p-6\">\n <div className=\"w-full max-w-2xl rounded-xl border bg-card p-6\">\n <Button asChild size=\"sm\" variant=\"ghost\" className=\"-ml-2 mb-4\">\n <Link to=\"/apps\">\n <IconArrowLeft size={15} className=\"mr-1.5\" />\n {t(\"dispatch.nav.apps\")}\n </Link>\n </Button>\n <div className=\"space-y-3\">\n <h2 className=\"text-base font-semibold text-foreground\">\n {t(\"dispatch.pages.appNotFound\")}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {t(\"dispatch.pages.pageNotFoundDescription\")}\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n if (app.status === \"pending\") {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center p-6\">\n <div className=\"w-full max-w-2xl rounded-xl border bg-card p-6\">\n <Button asChild size=\"sm\" variant=\"ghost\" className=\"-ml-2 mb-4\">\n <Link to=\"/apps\">\n <IconArrowLeft size={15} className=\"mr-1.5\" />\n {t(\"dispatch.nav.apps\")}\n </Link>\n </Button>\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"text-base font-semibold text-foreground\">\n {app.name}\n </h2>\n <Badge\n variant=\"outline\"\n className=\"gap-1 border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300\"\n >\n <IconClockHour4 size={12} />\n {t(\"dispatch.pages.building\")}\n </Badge>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n {t(\"dispatch.pages.appBuildingPrefix\")}{\" \"}\n <span className=\"font-mono text-foreground\">{app.path}</span>{\" \"}\n {t(\"dispatch.pages.appBuildingSuffix\")}\n </p>\n {app.builderUrl ? (\n <Button asChild>\n <a\n href={withBuilderUtmTrackingParams(app.builderUrl, {\n campaign: \"product\",\n content: \"dispatch_branch\",\n })}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {t(\"dispatch.pages.openBuilderBranch\", {\n defaultValue: \"Open in Builder\",\n })}\n </a>\n </Button>\n ) : null}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n data-dispatch-workspace-app-host\n className=\"flex h-full min-h-0 flex-col bg-background\"\n >\n <div className=\"min-h-0 flex-1 bg-muted/20\">\n <WorkspaceAppFrame app={app} />\n </div>\n </div>\n );\n}\n\nconst MAX_KEEP_ALIVE_APPS = 3;\n\nexport function WorkspaceAppKeepAlive({\n activeAppId,\n}: {\n activeAppId: string | null;\n}) {\n const [visitedAppIds, setVisitedAppIds] = useState<string[]>(() =>\n activeAppId ? [activeAppId] : [],\n );\n\n useEffect(() => {\n if (!activeAppId) return;\n setVisitedAppIds((current) =>\n [activeAppId, ...current.filter((appId) => appId !== activeAppId)].slice(\n 0,\n MAX_KEEP_ALIVE_APPS,\n ),\n );\n }, [activeAppId]);\n\n const renderedAppIds =\n activeAppId && !visitedAppIds.includes(activeAppId)\n ? [activeAppId, ...visitedAppIds]\n : visitedAppIds;\n\n return (\n <div\n data-dispatch-workspace-app-cache\n className={activeAppId ? \"absolute inset-0 overflow-hidden\" : \"hidden\"}\n >\n {renderedAppIds.map((appId) => {\n const active = appId === activeAppId;\n return (\n <div\n key={appId}\n data-dispatch-workspace-app-cache-entry={appId}\n aria-hidden={!active}\n className={active ? \"h-full min-h-0\" : \"hidden\"}\n >\n <WorkspaceAppHost appId={appId} />\n </div>\n );\n })}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"workspace-app-host.js","sourceRoot":"","sources":["../../src/components/workspace-app-host.tsx"],"names":[],"mappings":"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","sourcesContent":["import { AgentSidebar } from \"@agent-native/core/client/agent-chat\";\nimport {\n ChatFirstAppPane,\n defaultChatFirstCopy,\n type ChatFirstCopy,\n} from \"@agent-native/core/client/chat-first\";\nimport { useFeatureFlag } from \"@agent-native/core/client/feature-flags\";\nimport {\n useActionMutation,\n useActionQuery,\n} from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport { withBuilderUtmTrackingParams } from \"@agent-native/core/shared/builder-link-tracking\";\nimport { IconArrowLeft, IconClockHour4 } from \"@tabler/icons-react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Link } from \"react-router\";\n\nimport { isEmbedSessionExpiredMessage } from \"../lib/embed-session-recovery\";\nimport {\n workspaceAppDirectHref,\n workspaceAppEmbedTarget,\n workspaceAppHref,\n type WorkspaceAppSummary,\n} from \"../lib/workspace-apps\";\nimport { DISPATCH_WORKSPACE_SSO_FLAG } from \"../shared/feature-flags\";\nimport { ActionQueryError } from \"./action-query-error\";\nimport { Badge } from \"./ui/badge\";\nimport { Button } from \"./ui/button\";\nimport { Skeleton } from \"./ui/skeleton\";\n\ninterface EmbedSessionResult {\n startUrl: string;\n}\n\ninterface EmbedSessionInput {\n app?: string;\n path?: string;\n url?: string;\n chrome: \"minimal\";\n}\n\nexport function buildChatFirstEmbedSessionInput(\n appId: string,\n path: string,\n): EmbedSessionInput {\n return { app: appId, path, chrome: \"minimal\" };\n}\n\nexport interface WorkspaceAppFrameApp {\n id: string;\n name: string;\n path?: string | null;\n url?: string | null;\n}\n\ninterface WorkspaceAppFrameProps {\n app: WorkspaceAppFrameApp;\n /** Chat-first app tabs use their own route while standalone hosts use app metadata. */\n embedPath?: string;\n /** Chat-first app surfaces own the parent chat rail around the iframe. */\n chatSidebar?: boolean;\n copy?: ChatFirstCopy;\n}\n\nexport function WorkspaceAppFrame({\n app,\n embedPath,\n chatSidebar = false,\n copy = defaultChatFirstCopy,\n}: WorkspaceAppFrameProps) {\n const [embedUrl, setEmbedUrl] = useState<string | null>(null);\n const [embedError, setEmbedError] = useState<Error | null>(null);\n const [embedAttempt, setEmbedAttempt] = useState(0);\n const embedFrameRef = useRef<HTMLIFrameElement>(null);\n const workspaceSsoEnabled = useFeatureFlag(DISPATCH_WORKSPACE_SSO_FLAG.key);\n const createEmbedSession = useActionMutation<\n EmbedSessionResult,\n EmbedSessionInput\n >(\"create_embed_session\", {\n skipActionQueryInvalidation: true,\n });\n const createWorkspaceSsoEmbedSession = useActionMutation<\n EmbedSessionResult,\n EmbedSessionInput\n >(\"create-workspace-app-embed-session\", {\n skipActionQueryInvalidation: true,\n });\n const appHref = workspaceAppHref({\n id: app.id,\n name: app.name,\n path: app.path ?? \"\",\n url: app.url,\n });\n const embedInput = useMemo<EmbedSessionInput | null>(() => {\n if (embedPath !== undefined) {\n return buildChatFirstEmbedSessionInput(app.id, embedPath);\n }\n if (!appHref) return null;\n return {\n app: app.id,\n ...workspaceAppEmbedTarget({ path: app.path ?? \"\", url: app.url }),\n chrome: \"minimal\",\n };\n }, [app.id, app.path, app.url, appHref, embedPath]);\n\n useEffect(() => {\n if (!embedInput) return;\n let cancelled = false;\n setEmbedUrl(null);\n setEmbedError(null);\n const createSession = workspaceSsoEnabled\n ? createWorkspaceSsoEmbedSession\n : createEmbedSession;\n void createSession\n .mutateAsync(embedInput)\n .then((result) => {\n if (!cancelled) setEmbedUrl(result.startUrl);\n })\n .catch((cause: unknown) => {\n if (cancelled) return;\n setEmbedUrl(\n workspaceAppDirectHref(\n { path: app.path ?? \"\", url: app.url },\n embedPath ?? \"/\",\n ),\n );\n setEmbedError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n });\n return () => {\n cancelled = true;\n };\n }, [\n app.id,\n app.path,\n app.url,\n createEmbedSession.mutateAsync,\n createWorkspaceSsoEmbedSession.mutateAsync,\n embedInput,\n embedPath,\n embedAttempt,\n workspaceSsoEnabled,\n ]);\n\n useEffect(() => {\n const handleEmbedSessionExpired = (event: MessageEvent) => {\n if (\n !isEmbedSessionExpiredMessage(event, embedFrameRef.current, embedUrl)\n ) {\n return;\n }\n setEmbedAttempt((attempt) => attempt + 1);\n };\n\n window.addEventListener(\"message\", handleEmbedSessionExpired);\n return () =>\n window.removeEventListener(\"message\", handleEmbedSessionExpired);\n }, [embedUrl]);\n\n const appPane = (\n <ChatFirstAppPane\n app={app}\n status={\n embedUrl\n ? \"ready\"\n : embedError\n ? \"error\"\n : embedInput\n ? \"loading\"\n : \"unresolved\"\n }\n embedUrl={embedUrl}\n errorMessage={embedError?.message}\n onRetry={\n embedInput ? () => setEmbedAttempt((attempt) => attempt + 1) : undefined\n }\n renderEmbed={({ url, title }) => (\n <iframe\n key={url + \":\" + embedAttempt}\n data-dispatch-workspace-app-frame\n src={url}\n title={title ?? app.name}\n ref={embedFrameRef}\n referrerPolicy=\"no-referrer\"\n allow=\"clipboard-read; clipboard-write\"\n className=\"h-full w-full border-0 bg-background\"\n />\n )}\n copy={copy}\n />\n );\n\n if (!chatSidebar) return appPane;\n\n return (\n <AgentSidebar\n position=\"left\"\n defaultOpen\n openStorageKey=\"dispatch-app-chat\"\n storageKey={`dispatch-app-chat:${app.id}`}\n scope={{\n type: \"workspace-app\",\n id: app.id,\n label: app.name,\n contextKey: `workspace-app:${app.id}`,\n }}\n agentChatSurface=\"app\"\n showTabBar\n suppressInlineOpenApp\n dynamicSuggestions={false}\n suggestions={[]}\n emptyStateText={`Ask about ${app.name}`}\n >\n {appPane}\n </AgentSidebar>\n );\n}\n\nexport function WorkspaceAppHost({ appId }: { appId?: string }) {\n const t = useT();\n const appsQuery = useActionQuery(\"list-workspace-apps\", {\n includeAgentCards: false,\n });\n const { data: apps = [], isLoading } = appsQuery;\n const app = useMemo(\n () =>\n (apps as WorkspaceAppSummary[]).find((item) => item.id === appId) ?? null,\n [appId, apps],\n );\n\n if (appsQuery.isError) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center p-6\">\n <div className=\"w-full max-w-2xl\">\n <ActionQueryError\n error={appsQuery.error}\n onRetry={() => void appsQuery.refetch()}\n />\n </div>\n </div>\n );\n }\n\n if (isLoading && !app) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center p-6\">\n <div className=\"w-full max-w-2xl space-y-3 rounded-xl border bg-card p-6\">\n <Skeleton className=\"h-5 w-48\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-2/3\" />\n </div>\n </div>\n );\n }\n\n if (!app) {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center p-6\">\n <div className=\"w-full max-w-2xl rounded-xl border bg-card p-6\">\n <Button asChild size=\"sm\" variant=\"ghost\" className=\"-ml-2 mb-4\">\n <Link to=\"/apps\">\n <IconArrowLeft size={15} className=\"mr-1.5\" />\n {t(\"dispatch.nav.apps\")}\n </Link>\n </Button>\n <div className=\"space-y-3\">\n <h2 className=\"text-base font-semibold text-foreground\">\n {t(\"dispatch.pages.appNotFound\")}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {t(\"dispatch.pages.pageNotFoundDescription\")}\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n if (app.status === \"pending\") {\n return (\n <div className=\"flex h-full min-h-0 items-center justify-center p-6\">\n <div className=\"w-full max-w-2xl rounded-xl border bg-card p-6\">\n <Button asChild size=\"sm\" variant=\"ghost\" className=\"-ml-2 mb-4\">\n <Link to=\"/apps\">\n <IconArrowLeft size={15} className=\"mr-1.5\" />\n {t(\"dispatch.nav.apps\")}\n </Link>\n </Button>\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"text-base font-semibold text-foreground\">\n {app.name}\n </h2>\n <Badge\n variant=\"outline\"\n className=\"gap-1 border-amber-500/30 bg-amber-500/10 text-amber-700 dark:text-amber-300\"\n >\n <IconClockHour4 size={12} />\n {t(\"dispatch.pages.building\")}\n </Badge>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n {t(\"dispatch.pages.appBuildingPrefix\")}{\" \"}\n <span className=\"font-mono text-foreground\">{app.path}</span>{\" \"}\n {t(\"dispatch.pages.appBuildingSuffix\")}\n </p>\n {app.builderUrl ? (\n <Button asChild>\n <a\n href={withBuilderUtmTrackingParams(app.builderUrl, {\n campaign: \"product\",\n content: \"dispatch_branch\",\n })}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {t(\"dispatch.pages.openBuilderBranch\", {\n defaultValue: \"Open in Builder\",\n })}\n </a>\n </Button>\n ) : null}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n data-dispatch-workspace-app-host\n className=\"flex h-full min-h-0 flex-col bg-background\"\n >\n <div className=\"min-h-0 flex-1 bg-muted/20\">\n <WorkspaceAppFrame app={app} />\n </div>\n </div>\n );\n}\n\nconst MAX_KEEP_ALIVE_APPS = 3;\n\nexport function WorkspaceAppKeepAlive({\n activeAppId,\n}: {\n activeAppId: string | null;\n}) {\n const [visitedAppIds, setVisitedAppIds] = useState<string[]>(() =>\n activeAppId ? [activeAppId] : [],\n );\n\n useEffect(() => {\n if (!activeAppId) return;\n setVisitedAppIds((current) =>\n [activeAppId, ...current.filter((appId) => appId !== activeAppId)].slice(\n 0,\n MAX_KEEP_ALIVE_APPS,\n ),\n );\n }, [activeAppId]);\n\n const renderedAppIds =\n activeAppId && !visitedAppIds.includes(activeAppId)\n ? [activeAppId, ...visitedAppIds]\n : visitedAppIds;\n\n return (\n <div\n data-dispatch-workspace-app-cache\n className={activeAppId ? \"absolute inset-0 overflow-hidden\" : \"hidden\"}\n >\n {renderedAppIds.map((appId) => {\n const active = appId === activeAppId;\n return (\n <div\n key={appId}\n data-dispatch-workspace-app-cache-entry={appId}\n aria-hidden={!active}\n className={active ? \"h-full min-h-0\" : \"hidden\"}\n >\n <WorkspaceAppHost appId={appId} />\n </div>\n );\n })}\n </div>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/dispatch",
3
- "version": "0.25.0",
3
+ "version": "0.26.0",
4
4
  "description": "Dispatch — workspace control plane for agent-native apps. Vault, integrations, destinations, scheduled jobs, and cross-app delegation, shipped as a single drop-in package.",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -87,7 +87,7 @@
87
87
  "tailwind-merge": "^3.5.0",
88
88
  "vaul": "^1.1.2",
89
89
  "zod": "^4.3.6",
90
- "@agent-native/toolkit": "0.14.3"
90
+ "@agent-native/toolkit": "0.15.1"
91
91
  },
92
92
  "devDependencies": {
93
93
  "@react-router/dev": "^8.1.0",
@@ -101,7 +101,7 @@
101
101
  "typescript-7": "npm:typescript@^7.0.2",
102
102
  "vite": "8.1.0",
103
103
  "vitest": "^4.1.5",
104
- "@agent-native/core": "0.155.0"
104
+ "@agent-native/core": "0.157.1"
105
105
  },
106
106
  "peerDependencies": {
107
107
  "@agent-native/core": ">=0.8.0",
@@ -154,7 +154,7 @@ describe("CreateAppFlow", () => {
154
154
 
155
155
  async function renderAndSubmit(
156
156
  prompt: string,
157
- props: { onClose?: () => void } = {},
157
+ props: { onClose?: () => void; onCreated?: () => void } = {},
158
158
  ) {
159
159
  await act(async () => {
160
160
  root.render(React.createElement(CreateAppFlow, props));
@@ -237,6 +237,14 @@ describe("CreateAppFlow", () => {
237
237
  expect(onClose).toHaveBeenCalledTimes(1);
238
238
  });
239
239
 
240
+ it("notifies the parent after Builder accepts app creation", async () => {
241
+ const onCreated = vi.fn();
242
+
243
+ await renderAndSubmit("Build a quality dashboard", { onCreated });
244
+
245
+ expect(onCreated).toHaveBeenCalledTimes(1);
246
+ });
247
+
240
248
  it("renders the error affordance and a Try again control for builder-error, without a Connect Builder control", async () => {
241
249
  startWorkspaceAppCreationResponse.result = {
242
250
  mode: "builder-unavailable",