@arcgis/portal-components 5.2.0-next.6 → 5.2.0-next.60

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 (481) hide show
  1. package/README.md +2 -2
  2. package/dist/cdn/23EOLRF6.js +2 -0
  3. package/dist/cdn/25BWGJFT.js +2 -0
  4. package/dist/cdn/2GBRZSEC.js +2 -0
  5. package/dist/cdn/2YEGKG66.js +2 -0
  6. package/dist/cdn/3527GI5O.js +2 -0
  7. package/dist/cdn/3LBJM7GA.js +2 -0
  8. package/dist/cdn/{GQFWFZXP.js → 3OBIA66A.js} +1 -1
  9. package/dist/cdn/3Y33UPZ6.js +2 -0
  10. package/dist/cdn/44XITKIX.js +2 -0
  11. package/dist/cdn/456GBBRQ.js +2 -0
  12. package/dist/cdn/4QA4AYHJ.js +3 -0
  13. package/dist/cdn/{QNUYUNEY.js → 52B4FWCM.js} +1 -1
  14. package/dist/cdn/55FL7WQV.js +2 -0
  15. package/dist/cdn/5DE3XVTY.js +2 -0
  16. package/dist/cdn/5KDFY5KE.js +2 -0
  17. package/dist/cdn/5VMPZXL3.js +2 -0
  18. package/dist/cdn/{7WZHZP6U.js → 63THOLAY.js} +9 -3
  19. package/dist/cdn/6LMJGR6F.js +2 -0
  20. package/dist/cdn/744FUP4K.js +2 -0
  21. package/dist/cdn/7NVVHX75.js +2 -0
  22. package/dist/cdn/{LQ3DMZ3K.js → 7ZXEX3LI.js} +1 -1
  23. package/dist/cdn/AEZFDUSX.js +2 -0
  24. package/dist/cdn/AT2DLVEF.js +2 -0
  25. package/dist/cdn/{DKBTJJMW.js → C7ZFXRPS.js} +1 -1
  26. package/dist/cdn/CFBSBZSS.js +2 -0
  27. package/dist/cdn/CG6FLLXZ.js +2 -0
  28. package/dist/cdn/DALGPO36.js +2 -0
  29. package/dist/cdn/DUKSWZKG.js +2 -0
  30. package/dist/cdn/E6MGDW3D.js +2 -0
  31. package/dist/cdn/EB4XGKGD.js +2 -0
  32. package/dist/cdn/EE7XFMJG.js +2 -0
  33. package/dist/cdn/F3PB42AG.js +2 -0
  34. package/dist/cdn/FF24VDOG.js +65 -0
  35. package/dist/cdn/FGJNEKPQ.js +2 -0
  36. package/dist/cdn/G2NXASJO.js +2 -0
  37. package/dist/cdn/GBW3NV7Y.js +2 -0
  38. package/dist/cdn/HEA66RTI.js +2 -0
  39. package/dist/cdn/IJ3CLFAU.js +22 -0
  40. package/dist/cdn/IQFYKVRG.js +2 -0
  41. package/dist/cdn/IXATTQKO.js +2 -0
  42. package/dist/cdn/IZOGASBD.js +451 -0
  43. package/dist/cdn/JPHGWARN.js +2 -0
  44. package/dist/cdn/JUNNQTQU.js +2 -0
  45. package/dist/cdn/{3PAHY5KA.js → KNRJ3WXR.js} +1 -1
  46. package/dist/cdn/KTTTBLZ6.js +2 -0
  47. package/dist/cdn/{F6V7MLPY.js → L6KBBJEC.js} +1 -1
  48. package/dist/cdn/M7T6DKL2.js +2 -0
  49. package/dist/cdn/MNU537SB.js +2 -0
  50. package/dist/cdn/NITKS6KJ.js +2 -0
  51. package/dist/cdn/NMAP3FYP.js +2 -0
  52. package/dist/cdn/NYFFDBSL.js +2 -0
  53. package/dist/cdn/OBBYT2AV.js +2 -0
  54. package/dist/cdn/{WOZDQW3S.js → OECTWB22.js} +1 -1
  55. package/dist/cdn/{53MSUMA3.js → OT4PZJNB.js} +17 -1
  56. package/dist/cdn/PMCTFA5D.js +2 -0
  57. package/dist/cdn/PP7GTURX.js +2 -0
  58. package/dist/cdn/Q7SDLUZ6.js +2 -0
  59. package/dist/cdn/QE4CNVDQ.js +34 -0
  60. package/dist/cdn/{AQWTJKUH.js → QKCV7CY2.js} +10 -8
  61. package/dist/cdn/QQ432AB6.js +2 -0
  62. package/dist/cdn/QS3GXAIH.js +2 -0
  63. package/dist/cdn/R2CAXYXG.js +619 -0
  64. package/dist/cdn/SKUPHVNO.js +2 -0
  65. package/dist/cdn/SLTFLCVR.js +99 -0
  66. package/dist/cdn/{ZTHTFEYA.js → SVRIKNKJ.js} +1 -1
  67. package/dist/cdn/{LAFNDBTQ.js → SWAVECPM.js} +1 -1
  68. package/dist/cdn/TAB5C3RK.js +2 -0
  69. package/dist/cdn/THRK2DGY.js +2 -0
  70. package/dist/cdn/{DXCPWJU4.js → TKCE4WYE.js} +1 -1
  71. package/dist/cdn/TNLGQ7HL.js +2 -0
  72. package/dist/cdn/{DHHSKOUY.js → TSTTPCWU.js} +1 -1
  73. package/dist/cdn/U5B2LAPJ.js +2 -0
  74. package/dist/cdn/UDTQ7U6L.js +2 -0
  75. package/dist/cdn/UL2NWFFH.js +2 -0
  76. package/dist/cdn/UZCHLKLO.js +2 -0
  77. package/dist/cdn/UZLQALHY.js +2 -0
  78. package/dist/cdn/{RR4BIAPA.js → V4EYW3O6.js} +1 -1
  79. package/dist/cdn/V4IAC7WR.js +2 -0
  80. package/dist/cdn/VD6VGWCQ.js +2 -0
  81. package/dist/cdn/VLHHC25R.js +2 -0
  82. package/dist/cdn/VMQIDO4Z.js +2 -0
  83. package/dist/cdn/VRCB4BN4.js +2 -0
  84. package/dist/cdn/{74XFARCV.js → VW7DSKPH.js} +1 -1
  85. package/dist/cdn/W2SYL7IJ.js +71 -0
  86. package/dist/cdn/{W6PSG4GX.js → W4FGRGLV.js} +10 -5
  87. package/dist/cdn/{SYJSVUUR.js → W4SAWMXS.js} +1 -1
  88. package/dist/cdn/WBZLQZYR.js +134 -0
  89. package/dist/cdn/WWMB4NWC.js +2 -0
  90. package/dist/cdn/XCJPHHX2.js +2 -0
  91. package/dist/cdn/XEK22IDA.js +2 -0
  92. package/dist/cdn/XHFAXT2P.js +2 -0
  93. package/dist/cdn/XMUR4HRH.js +2 -0
  94. package/dist/cdn/XX4U6IRN.js +2 -0
  95. package/dist/cdn/Y3RUZTB3.js +2 -0
  96. package/dist/cdn/Y7FCEDRU.js +2 -0
  97. package/dist/cdn/YIU7GBUN.js +2 -0
  98. package/dist/cdn/YVKSTDL6.js +2 -0
  99. package/dist/cdn/ZOEF7HBV.js +2 -0
  100. package/dist/cdn/{GT26WGJS.js → ZV4GLQQG.js} +1 -1
  101. package/dist/cdn/assets/portal-account-switcher/t9n/messages.en.json +1 -0
  102. package/dist/cdn/assets/portal-ai-assistant/t9n/messages.en.json +1 -1
  103. package/dist/cdn/assets/portal-browser/t9n/messages.en.json +1 -0
  104. package/dist/cdn/assets/portal-group-badges/t9n/messages.en.json +1 -0
  105. package/dist/cdn/assets/portal-group-browser/t9n/messages.en.json +1 -0
  106. package/dist/cdn/assets/portal-group-card/t9n/messages.en.json +1 -0
  107. package/dist/cdn/assets/portal-item-type/icons/parquetfeaturelayer16.svg +1 -0
  108. package/dist/cdn/assets/portal-item-type/icons/parquetfeaturelayer32.svg +1 -0
  109. package/dist/cdn/assets/portal-item-type/icons/storymapframe16.svg +1 -0
  110. package/dist/cdn/assets/portal-item-type/icons/storymapframe32.svg +1 -0
  111. package/dist/cdn/assets/portal-item-type/t9n/messages.en.json +1 -1
  112. package/dist/cdn/assets/portal-navigation/apps/api-for-python.avif +0 -0
  113. package/dist/cdn/assets/portal-navigation/apps/appstudio.avif +0 -0
  114. package/dist/cdn/assets/portal-navigation/apps/arcade.avif +0 -0
  115. package/dist/cdn/assets/portal-navigation/apps/arcgis-360-vr.avif +0 -0
  116. package/dist/cdn/assets/portal-navigation/apps/arcgis-earth.avif +0 -0
  117. package/dist/cdn/assets/portal-navigation/apps/arcgis-enterprise.avif +0 -0
  118. package/dist/cdn/assets/portal-navigation/apps/arcgis-experience-builder.avif +0 -0
  119. package/dist/cdn/assets/portal-navigation/apps/arcgis-geoanalytics.avif +0 -0
  120. package/dist/cdn/assets/portal-navigation/apps/arcgis-hub.avif +0 -0
  121. package/dist/cdn/assets/portal-navigation/apps/arcgis-online.avif +0 -0
  122. package/dist/cdn/assets/portal-navigation/apps/arcgis-pro.avif +0 -0
  123. package/dist/cdn/assets/portal-navigation/apps/arcgis-reality-studio.avif +0 -0
  124. package/dist/cdn/assets/portal-navigation/apps/arcgis-urban.avif +0 -0
  125. package/dist/cdn/assets/portal-navigation/apps/blank.avif +0 -0
  126. package/dist/cdn/assets/portal-navigation/apps/business-analyst.avif +0 -0
  127. package/dist/cdn/assets/portal-navigation/apps/city-engine.avif +0 -0
  128. package/dist/cdn/assets/portal-navigation/apps/collector.avif +0 -0
  129. package/dist/cdn/assets/portal-navigation/apps/community-analyst.avif +0 -0
  130. package/dist/cdn/assets/portal-navigation/apps/configurable-apps.avif +0 -0
  131. package/dist/cdn/assets/portal-navigation/apps/dashboards-beta.avif +0 -0
  132. package/dist/cdn/assets/portal-navigation/apps/dashboards-classic.avif +0 -0
  133. package/dist/cdn/assets/portal-navigation/apps/data-pipelines.avif +0 -0
  134. package/dist/cdn/assets/portal-navigation/apps/deeplearningstudio.avif +0 -0
  135. package/dist/cdn/assets/portal-navigation/apps/demographics.avif +0 -0
  136. package/dist/cdn/assets/portal-navigation/apps/drone2map.avif +0 -0
  137. package/dist/cdn/assets/portal-navigation/apps/esri-events.avif +0 -0
  138. package/dist/cdn/assets/portal-navigation/apps/essential-apps.avif +0 -0
  139. package/dist/cdn/assets/portal-navigation/apps/excalibur.avif +0 -0
  140. package/dist/cdn/assets/portal-navigation/apps/explorer.avif +0 -0
  141. package/dist/cdn/assets/portal-navigation/apps/field-apps.avif +0 -0
  142. package/dist/cdn/assets/portal-navigation/apps/fieldmaps-beta.avif +0 -0
  143. package/dist/cdn/assets/portal-navigation/apps/fieldmaps-ea.avif +0 -0
  144. package/dist/cdn/assets/portal-navigation/apps/fieldmaps.avif +0 -0
  145. package/dist/cdn/assets/portal-navigation/apps/generic-app.avif +0 -0
  146. package/dist/cdn/assets/portal-navigation/apps/geobim.avif +0 -0
  147. package/dist/cdn/assets/portal-navigation/apps/geoplanner.avif +0 -0
  148. package/dist/cdn/assets/portal-navigation/apps/grid-view-9.avif +0 -0
  149. package/dist/cdn/assets/portal-navigation/apps/indoor.avif +0 -0
  150. package/dist/cdn/assets/portal-navigation/apps/indoors.avif +0 -0
  151. package/dist/cdn/assets/portal-navigation/apps/insights.avif +0 -0
  152. package/dist/cdn/assets/portal-navigation/apps/instant-apps.avif +0 -0
  153. package/dist/cdn/assets/portal-navigation/apps/ips.avif +0 -0
  154. package/dist/cdn/assets/portal-navigation/apps/knowledge-studio.avif +0 -0
  155. package/dist/cdn/assets/portal-navigation/apps/living-atlas.avif +0 -0
  156. package/dist/cdn/assets/portal-navigation/apps/location-platform.avif +0 -0
  157. package/dist/cdn/assets/portal-navigation/apps/map-maker.avif +0 -0
  158. package/dist/cdn/assets/portal-navigation/apps/map-viewer-beta.avif +0 -0
  159. package/dist/cdn/assets/portal-navigation/apps/map-viewer-classic.avif +0 -0
  160. package/dist/cdn/assets/portal-navigation/apps/map-viewer.avif +0 -0
  161. package/dist/cdn/assets/portal-navigation/apps/maps-adobe-cloud.avif +0 -0
  162. package/dist/cdn/assets/portal-navigation/apps/maps-for-office.avif +0 -0
  163. package/dist/cdn/assets/portal-navigation/apps/maps-for-power-bi.avif +0 -0
  164. package/dist/cdn/assets/portal-navigation/apps/maps-for-sharepoint.avif +0 -0
  165. package/dist/cdn/assets/portal-navigation/apps/marketplace.avif +0 -0
  166. package/dist/cdn/assets/portal-navigation/apps/mission.avif +0 -0
  167. package/dist/cdn/assets/portal-navigation/apps/monitor.avif +0 -0
  168. package/dist/cdn/assets/portal-navigation/apps/navigator.avif +0 -0
  169. package/dist/cdn/assets/portal-navigation/apps/notebook.avif +0 -0
  170. package/dist/cdn/assets/portal-navigation/apps/office-apps.avif +0 -0
  171. package/dist/cdn/assets/portal-navigation/apps/open-data.avif +0 -0
  172. package/dist/cdn/assets/portal-navigation/apps/operations-dashboard.avif +0 -0
  173. package/dist/cdn/assets/portal-navigation/apps/ortho-maker.avif +0 -0
  174. package/dist/cdn/assets/portal-navigation/apps/pro-extension.avif +0 -0
  175. package/dist/cdn/assets/portal-navigation/apps/quick-capture.avif +0 -0
  176. package/dist/cdn/assets/portal-navigation/apps/redistricting.avif +0 -0
  177. package/dist/cdn/assets/portal-navigation/apps/runtime.avif +0 -0
  178. package/dist/cdn/assets/portal-navigation/apps/scene-viewer.avif +0 -0
  179. package/dist/cdn/assets/portal-navigation/apps/sites.avif +0 -0
  180. package/dist/cdn/assets/portal-navigation/apps/solutions.avif +0 -0
  181. package/dist/cdn/assets/portal-navigation/apps/story-maps.avif +0 -0
  182. package/dist/cdn/assets/portal-navigation/apps/streetmap-premium.avif +0 -0
  183. package/dist/cdn/assets/portal-navigation/apps/survey123.avif +0 -0
  184. package/dist/cdn/assets/portal-navigation/apps/svg-app-circle.svg +1 -0
  185. package/dist/cdn/assets/portal-navigation/apps/svg-app-icon.svg +1 -0
  186. package/dist/cdn/assets/portal-navigation/apps/track-viewer.avif +0 -0
  187. package/dist/cdn/assets/portal-navigation/apps/user-type-extension-online.avif +0 -0
  188. package/dist/cdn/assets/portal-navigation/apps/user-type-extension.avif +0 -0
  189. package/dist/cdn/assets/portal-navigation/apps/vector-tile-style-editor.avif +0 -0
  190. package/dist/cdn/assets/portal-navigation/apps/velocity.avif +0 -0
  191. package/dist/cdn/assets/portal-navigation/apps/web-app-builder.avif +0 -0
  192. package/dist/cdn/assets/portal-navigation/apps/web-editor.avif +0 -0
  193. package/dist/cdn/assets/portal-navigation/apps/web-mapping.avif +0 -0
  194. package/dist/cdn/assets/portal-navigation/apps/workflow-manager-beta.avif +0 -0
  195. package/dist/cdn/assets/portal-navigation/apps/workflow-manager.avif +0 -0
  196. package/dist/cdn/assets/portal-navigation/apps/workforce.avif +0 -0
  197. package/dist/cdn/assets/portal-navigation/product-logos/advanced-editing-user-type-extension-glyph-32.svg +1 -0
  198. package/dist/cdn/assets/portal-navigation/product-logos/arc-hydro-glyph-32.svg +1 -0
  199. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-360-vr-glyph-32.svg +1 -0
  200. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-api-for-python-glyph-32.svg +1 -0
  201. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-appstudio-glyph-32.svg +1 -0
  202. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-arcade-expression-language-glyph-32.svg +1 -0
  203. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-business-analyst-glyph-32.svg +1 -0
  204. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-cityengine-glyph-32.svg +1 -0
  205. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-collector-glyph-32.svg +1 -0
  206. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-community-analyst-glyph-32.svg +1 -0
  207. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-connectors-for-power-automate-glyph-32.svg +1 -0
  208. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-dashboards-glyph-32.svg +1 -0
  209. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-data-interoperability-glyph-32.svg +1 -0
  210. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-data-pipelines-glyph-32.svg +1 -0
  211. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-data-reviewer-glyph-32.svg +1 -0
  212. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-deep-learning-studio-glyph-32.svg +1 -0
  213. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-drone2map-glyph-32.svg +1 -0
  214. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-earth-glyph-32.svg +1 -0
  215. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-enterprise-glyph-32.svg +1 -0
  216. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-excalibur-glyph-32.svg +1 -0
  217. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-excalibur-gray-glyph-32.svg +1 -0
  218. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-experience-builder-glyph-32.svg +1 -0
  219. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-explorer-glyph-32.svg +1 -0
  220. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-field-maps-designer-ea-glyph-32.svg +1 -0
  221. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-field-maps-glyph-32.svg +1 -0
  222. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-flight-glyph-32.svg +1 -0
  223. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-for-autocad-glyph-32.svg +1 -0
  224. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-for-autodesk-forma-glyph-32.svg +1 -0
  225. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-for-developers-glyph-32.svg +1 -0
  226. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-for-excel-glyph-32.svg +1 -0
  227. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-for-microsoft-365-glyph-32.svg +1 -0
  228. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-for-power-apps-glyph-32.svg +1 -0
  229. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-for-teams-glyph-32.svg +1 -0
  230. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-geoanalytics-engine-glyph-32.svg +1 -0
  231. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-geobim-glyph-32.svg +1 -0
  232. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-geoplanner-glyph-32.svg +1 -0
  233. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-hub-glyph-32.svg +1 -0
  234. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-image-glyph-32.svg +1 -0
  235. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-indoors-glyph-32.svg +1 -0
  236. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-insights-glyph-32.svg +1 -0
  237. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-instant-apps-glyph-32.svg +1 -0
  238. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-knowledge-glyph-32.svg +1 -0
  239. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-living-atlas-of-the-world-glyph-32.svg +1 -0
  240. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-location-platform-glyph-32.svg +1 -0
  241. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-logo-glyph-32.svg +76 -0
  242. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-maps-for-adobe-creative-cloud-glyph-32.svg +1 -0
  243. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-maps-for-power-bi-glyph-32.svg +1 -0
  244. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-maps-for-sharepoint-glyph-32.svg +1 -0
  245. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-maps-sdk-for-javascript-glyph-32.svg +1 -0
  246. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-maps-sdks-for-game-engines-glyph-32.svg +1 -0
  247. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-maps-sdks-for-native-apps-glyph-32.svg +1 -0
  248. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-maritime-glyph-32.svg +1 -0
  249. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-marketplace-glyph-32.svg +1 -0
  250. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-mission-glyph-32.svg +1 -0
  251. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-monitor-glyph-32.svg +1 -0
  252. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-monitor-white-glyph-32.svg +1 -0
  253. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-navigator-glyph-32.svg +1 -0
  254. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-notebooks-glyph-32.svg +1 -0
  255. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-online-glyph-32.svg +1 -0
  256. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-open-data-glyph-32.svg +1 -0
  257. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-open-source-apps-glyph-32.svg +1 -0
  258. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-ortho-maker-glyph-32.svg +1 -0
  259. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-parcel-fabric-glyph-32.svg +1 -0
  260. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-pipeline-referencing-glyph-32.svg +1 -0
  261. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-pro-for-intelligence-glyph-32.svg +1 -0
  262. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-pro-glyph-32.svg +1 -0
  263. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-quickcapture-glyph-32.svg +1 -0
  264. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-reality-studio-glyph-32.svg +1 -0
  265. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-roads-and-highways-glyph-32.svg +1 -0
  266. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-sites-glyph-32.svg +1 -0
  267. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-solutions-glyph-32.svg +1 -0
  268. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-storymaps-glyph-32.svg +1 -0
  269. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-streetmap-premium-glyph-32.svg +1 -0
  270. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-survey123-connect-glyph-32.svg +1 -0
  271. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-survey123-glyph-32.svg +1 -0
  272. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-tracker-glyph-32.svg +1 -0
  273. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-urban-glyph-32.svg +1 -0
  274. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-utility-network-management-glyph-32.svg +1 -0
  275. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-velocity-glyph-32.svg +6 -0
  276. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-web-appbuilder-glyph-32.svg +1 -0
  277. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-web-editor-glyph-32.svg +1 -0
  278. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-workflow-manager-glyph-32.svg +1 -0
  279. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-workforce-glyph-32.svg +1 -0
  280. package/dist/cdn/assets/portal-navigation/product-logos/arcgis-world-geocoder-glyph-32.svg +1 -0
  281. package/dist/cdn/assets/portal-navigation/product-logos/calcite-design-system-glyph-32.svg +1 -0
  282. package/dist/cdn/assets/portal-navigation/product-logos/esri-community-glyph-32.svg +1 -0
  283. package/dist/cdn/assets/portal-navigation/product-logos/esri-demographics-glyph-32.svg +1 -0
  284. package/dist/cdn/assets/portal-navigation/product-logos/esri-events-glyph-32.svg +1 -0
  285. package/dist/cdn/assets/portal-navigation/product-logos/esri-offline-documentation-center--glyph-32.svg +1 -0
  286. package/dist/cdn/assets/portal-navigation/product-logos/esri-redistricting-glyph-32.svg +1 -0
  287. package/dist/cdn/assets/portal-navigation/product-logos/esri-reports-glyph-32.svg +1 -0
  288. package/dist/cdn/assets/portal-navigation/product-logos/esri-support-glyph-32.svg +1 -0
  289. package/dist/cdn/assets/portal-navigation/product-logos/map-viewer-glyph-32.svg +1 -0
  290. package/dist/cdn/assets/portal-navigation/product-logos/sceneviewer-glyph-32.svg +1 -0
  291. package/dist/cdn/assets/portal-navigation/product-logos/site-scan-for-arcgis-glyph-32.svg +1 -0
  292. package/dist/cdn/assets/portal-navigation/product-logos/site-scan-for-arcgis-le-glyph-32.svg +1 -0
  293. package/dist/cdn/assets/portal-navigation/product-logos/vector-tile-style-editor-glyph-32.svg +1 -0
  294. package/dist/cdn/assets/portal-navigation/product-logos/xr-viewer-glyph-32.svg +1 -0
  295. package/dist/cdn/assets/portal-navigation/t9n/messages.en.json +1 -0
  296. package/dist/cdn/index.js +1 -1
  297. package/dist/cdn/main.css +1 -1
  298. package/dist/chunks/dom.js +41 -0
  299. package/dist/chunks/fieldAddDelete.js +1 -1
  300. package/dist/chunks/functionalities.js +6 -4
  301. package/dist/chunks/groups.js +13 -35
  302. package/dist/chunks/groups2.js +11 -0
  303. package/dist/chunks/icons.js +11 -0
  304. package/dist/chunks/item.js +15 -15
  305. package/dist/chunks/item2.js +34 -0
  306. package/dist/chunks/loadClassificationData.js +19 -19
  307. package/dist/chunks/portal-account-switcher.js +6 -0
  308. package/dist/chunks/portal-browser.js +223 -0
  309. package/dist/chunks/portal.js +91 -8
  310. package/dist/chunks/portal2.js +59 -0
  311. package/dist/chunks/query.js +159 -0
  312. package/dist/chunks/request.js +87 -0
  313. package/dist/chunks/requests.js +92 -44
  314. package/dist/chunks/store.js +14 -0
  315. package/dist/chunks/string.js +36 -0
  316. package/dist/chunks/thumbnail.js +189 -0
  317. package/dist/chunks/ui.js +9 -0
  318. package/dist/chunks/url.js +17 -0
  319. package/dist/chunks/user.js +99 -4
  320. package/dist/chunks/user2.js +13 -107
  321. package/dist/chunks/utils.js +649 -0
  322. package/dist/components/arcgis-portal-account-switcher/customElement.d.ts +98 -0
  323. package/dist/components/arcgis-portal-account-switcher/customElement.js +364 -0
  324. package/dist/components/arcgis-portal-account-switcher/index.d.ts +1 -0
  325. package/dist/components/arcgis-portal-account-switcher/index.js +11 -0
  326. package/dist/components/arcgis-portal-account-switcher-accounts/customElement.d.ts +100 -0
  327. package/dist/components/arcgis-portal-account-switcher-accounts/customElement.js +31 -0
  328. package/dist/components/arcgis-portal-account-switcher-accounts/index.d.ts +1 -0
  329. package/dist/components/arcgis-portal-account-switcher-accounts/index.js +5 -0
  330. package/dist/components/arcgis-portal-account-switcher-list/customElement.d.ts +104 -0
  331. package/dist/components/arcgis-portal-account-switcher-list/customElement.js +51 -0
  332. package/dist/components/arcgis-portal-account-switcher-list/index.d.ts +1 -0
  333. package/dist/components/arcgis-portal-account-switcher-list/index.js +7 -0
  334. package/dist/components/arcgis-portal-ai-assistant/agents/types.d.ts +24 -3
  335. package/dist/components/arcgis-portal-ai-assistant/customElement.d.ts +28 -2
  336. package/dist/components/arcgis-portal-ai-assistant/customElement.js +1002 -523
  337. package/dist/components/arcgis-portal-browser/customElement.d.ts +243 -0
  338. package/dist/components/arcgis-portal-browser/customElement.js +19 -0
  339. package/dist/components/arcgis-portal-browser/index.d.ts +1 -0
  340. package/dist/components/arcgis-portal-browser/index.js +6 -0
  341. package/dist/components/arcgis-portal-browser/utils/store.d.ts +31 -0
  342. package/dist/components/arcgis-portal-browser/utils/types.d.ts +24 -0
  343. package/dist/components/arcgis-portal-browser-actions/customElement.d.ts +185 -0
  344. package/dist/components/arcgis-portal-browser-actions/customElement.js +73 -0
  345. package/dist/components/arcgis-portal-browser-actions/index.d.ts +1 -0
  346. package/dist/components/arcgis-portal-browser-actions/index.js +6 -0
  347. package/dist/components/arcgis-portal-browser-actions/types.d.ts +9 -0
  348. package/dist/components/arcgis-portal-browser-filter/customElement.d.ts +226 -0
  349. package/dist/components/arcgis-portal-browser-filter/customElement.js +32 -0
  350. package/dist/components/arcgis-portal-browser-filter/index.d.ts +1 -0
  351. package/dist/components/arcgis-portal-browser-filter/index.js +4 -0
  352. package/dist/components/arcgis-portal-browser-filter-date/customElement.d.ts +233 -0
  353. package/dist/components/arcgis-portal-browser-filter-date/customElement.js +118 -0
  354. package/dist/components/arcgis-portal-browser-filter-date/index.d.ts +1 -0
  355. package/dist/components/arcgis-portal-browser-filter-date/index.js +5 -0
  356. package/dist/components/arcgis-portal-browser-filter-status/customElement.d.ts +193 -0
  357. package/dist/components/arcgis-portal-browser-filter-status/customElement.js +56 -0
  358. package/dist/components/arcgis-portal-browser-filter-status/index.d.ts +1 -0
  359. package/dist/components/arcgis-portal-browser-filter-status/index.js +5 -0
  360. package/dist/components/arcgis-portal-browser-filters/customElement.d.ts +7 -0
  361. package/dist/components/arcgis-portal-browser-filters/customElement.js +29 -0
  362. package/dist/components/arcgis-portal-browser-filters/index.d.ts +1 -0
  363. package/dist/components/arcgis-portal-browser-filters/index.js +2 -0
  364. package/dist/components/arcgis-portal-browser-pagination/customElement.d.ts +194 -0
  365. package/dist/components/arcgis-portal-browser-pagination/customElement.js +49 -0
  366. package/dist/components/arcgis-portal-browser-pagination/index.d.ts +1 -0
  367. package/dist/components/arcgis-portal-browser-pagination/index.js +2 -0
  368. package/dist/components/arcgis-portal-browser-search/customElement.d.ts +195 -0
  369. package/dist/components/arcgis-portal-browser-search/customElement.js +62 -0
  370. package/dist/components/arcgis-portal-browser-search/index.d.ts +1 -0
  371. package/dist/components/arcgis-portal-browser-search/index.js +3 -0
  372. package/dist/components/arcgis-portal-browser-sort/customElement.d.ts +196 -0
  373. package/dist/components/arcgis-portal-browser-sort/customElement.js +93 -0
  374. package/dist/components/arcgis-portal-browser-sort/index.d.ts +1 -0
  375. package/dist/components/arcgis-portal-browser-sort/index.js +9 -0
  376. package/dist/components/arcgis-portal-browser-sort/utils.d.ts +3 -0
  377. package/dist/components/arcgis-portal-browser-top-bar/customElement.d.ts +190 -0
  378. package/dist/components/arcgis-portal-browser-top-bar/customElement.js +50 -0
  379. package/dist/components/arcgis-portal-browser-top-bar/index.d.ts +1 -0
  380. package/dist/components/arcgis-portal-browser-top-bar/index.js +3 -0
  381. package/dist/components/arcgis-portal-browser-view/customElement.d.ts +21 -0
  382. package/dist/components/arcgis-portal-browser-view/customElement.js +30 -0
  383. package/dist/components/arcgis-portal-browser-view/index.d.ts +1 -0
  384. package/dist/components/arcgis-portal-browser-view/index.js +5 -0
  385. package/dist/components/arcgis-portal-classification-config/customElement.js +1 -1
  386. package/dist/components/arcgis-portal-classification-favorite/customElement.js +1 -1
  387. package/dist/components/arcgis-portal-group-badges/customElement.d.ts +101 -0
  388. package/dist/components/arcgis-portal-group-badges/customElement.js +51 -0
  389. package/dist/components/arcgis-portal-group-badges/index.d.ts +1 -0
  390. package/dist/components/arcgis-portal-group-badges/index.js +3 -0
  391. package/dist/components/arcgis-portal-group-badges/types.d.ts +3 -0
  392. package/dist/components/arcgis-portal-group-browser/customElement.d.ts +301 -0
  393. package/dist/components/arcgis-portal-group-browser/customElement.js +494 -0
  394. package/dist/components/arcgis-portal-group-browser/index.d.ts +1 -0
  395. package/dist/components/arcgis-portal-group-browser/index.js +6 -0
  396. package/dist/components/arcgis-portal-group-browser/types.d.ts +193 -0
  397. package/dist/components/arcgis-portal-group-browser-preview/customElement.d.ts +225 -0
  398. package/dist/components/arcgis-portal-group-browser-preview/customElement.js +150 -0
  399. package/dist/components/arcgis-portal-group-browser-preview/index.d.ts +1 -0
  400. package/dist/components/arcgis-portal-group-browser-preview/index.js +12 -0
  401. package/dist/components/arcgis-portal-group-browser-preview-card/customElement.d.ts +82 -0
  402. package/dist/components/arcgis-portal-group-browser-preview-card/customElement.js +92 -0
  403. package/dist/components/arcgis-portal-group-browser-preview-card/index.d.ts +1 -0
  404. package/dist/components/arcgis-portal-group-browser-preview-card/index.js +6 -0
  405. package/dist/components/arcgis-portal-group-card/customElement.d.ts +169 -0
  406. package/dist/components/arcgis-portal-group-card/customElement.js +163 -0
  407. package/dist/components/arcgis-portal-group-card/index.d.ts +1 -0
  408. package/dist/components/arcgis-portal-group-card/index.js +8 -0
  409. package/dist/components/arcgis-portal-group-thumbnail/customElement.d.ts +32 -0
  410. package/dist/components/arcgis-portal-group-thumbnail/customElement.js +153 -0
  411. package/dist/components/arcgis-portal-group-thumbnail/index.d.ts +1 -0
  412. package/dist/components/arcgis-portal-group-thumbnail/index.js +3 -0
  413. package/dist/components/arcgis-portal-info-banner/customElement.d.ts +14 -0
  414. package/dist/components/arcgis-portal-info-banner/customElement.js +31 -0
  415. package/dist/components/arcgis-portal-info-banner/index.d.ts +1 -0
  416. package/dist/components/arcgis-portal-info-banner/index.js +1 -0
  417. package/dist/components/arcgis-portal-item-type/customElement.d.ts +3 -1
  418. package/dist/components/arcgis-portal-item-type/customElement.js +22 -651
  419. package/dist/components/arcgis-portal-mentionable-text-area/customElement.js +40 -38
  420. package/dist/components/arcgis-portal-navigation/customElement.d.ts +521 -0
  421. package/dist/components/arcgis-portal-navigation/customElement.js +1847 -0
  422. package/dist/components/arcgis-portal-navigation/index.d.ts +1 -0
  423. package/dist/components/arcgis-portal-navigation/index.js +32 -0
  424. package/dist/components/arcgis-portal-navigation/types.d.ts +44 -0
  425. package/dist/components/arcgis-portal-replacement-item-redirect/customElement.js +70 -255
  426. package/dist/components/arcgis-portal-user-avatar/customElement.js +2 -2
  427. package/dist/components/arcgis-portal-user-popup/customElement.d.ts +5 -2
  428. package/dist/components/arcgis-portal-user-popup/customElement.js +81 -106
  429. package/dist/components/arcgis-portal-voice-input/customElement.d.ts +1 -1
  430. package/dist/components/portal-group-browser-filters/customElement.js +104 -0
  431. package/dist/components/portal-group-browser-filters/index.js +8 -0
  432. package/dist/components/portal-group-browser-pagination/customElement.js +13 -0
  433. package/dist/components/portal-group-browser-pagination/index.js +2 -0
  434. package/dist/components/portal-group-browser-sort/customElement.js +16 -0
  435. package/dist/components/portal-group-browser-sort/index.js +2 -0
  436. package/dist/docs/api.json +1 -1
  437. package/dist/docs/docs.json +1 -1
  438. package/dist/docs/vscode.html-custom-data.json +1 -1
  439. package/dist/docs/web-types.json +1 -1
  440. package/dist/index.d.ts +192 -2
  441. package/dist/loader.js +26 -4
  442. package/dist/types/app-switcher.d.ts +71 -0
  443. package/dist/types/group.d.ts +14 -16
  444. package/dist/types/item.d.ts +76 -1
  445. package/dist/types/lumina.d.ts +152 -1
  446. package/dist/types/portal.d.ts +6 -0
  447. package/dist/types/preact.d.ts +174 -1
  448. package/dist/types/react.d.ts +196 -1
  449. package/dist/types/search.d.ts +30 -0
  450. package/dist/types/stencil.d.ts +152 -1
  451. package/dist/types/user.d.ts +16 -3
  452. package/package.json +10 -11
  453. package/dist/cdn/35SKVD6F.js +0 -2
  454. package/dist/cdn/5VSDGPHH.js +0 -2
  455. package/dist/cdn/72N3KAXN.js +0 -2
  456. package/dist/cdn/ANPXRYLV.js +0 -5
  457. package/dist/cdn/B7633S2A.js +0 -422
  458. package/dist/cdn/BEHLBKKM.js +0 -2
  459. package/dist/cdn/EVDOPN3G.js +0 -54
  460. package/dist/cdn/G47ZZQYL.js +0 -2
  461. package/dist/cdn/G6QT6MYP.js +0 -65
  462. package/dist/cdn/GAHILDQF.js +0 -45
  463. package/dist/cdn/GHQ3ZW4U.js +0 -2
  464. package/dist/cdn/JNRN6DTV.js +0 -2
  465. package/dist/cdn/K3HS2LQ7.js +0 -2
  466. package/dist/cdn/KEKBRUUC.js +0 -2
  467. package/dist/cdn/L3BQK62N.js +0 -2
  468. package/dist/cdn/MX3F5ZCL.js +0 -2
  469. package/dist/cdn/O3KBWLGU.js +0 -2
  470. package/dist/cdn/OQDPULPD.js +0 -2
  471. package/dist/cdn/RNLVNDGG.js +0 -2
  472. package/dist/cdn/T25WZ6OL.js +0 -516
  473. package/dist/cdn/TMYTUOSS.js +0 -2
  474. package/dist/cdn/UPEVTVNZ.js +0 -2
  475. package/dist/cdn/V2EOXGK2.js +0 -2
  476. package/dist/cdn/X5NBQPTM.js +0 -2
  477. package/dist/cdn/YG5YYL6X.js +0 -2
  478. package/dist/cdn/YIMNOUTF.js +0 -2
  479. package/dist/cdn/YL7PGYWC.js +0 -5
  480. package/dist/cdn/YMPTDKT6.js +0 -2
  481. package/dist/cdn/YVJRXWM3.js +0 -3
@@ -1,264 +1,82 @@
1
1
  /* COPYRIGHT Esri - https://js.arcgis.com/5.2/LICENSE.txt */
2
- import { c as Z } from "../../chunks/runtime.js";
3
- import { LitElement as tt, createEvent as et } from "@arcgis/lumina";
4
- import { css as st, render as at, html as w } from "lit";
5
- import { createRef as M, ref as T } from "lit/directives/ref.js";
6
- import { u as rt } from "../../chunks/useT9n.js";
7
- import { a as P, t as ot } from "../../chunks/functionalities.js";
8
- import { Annotation as h, StateGraph as $, START as G, END as y, NodeInterrupt as V } from "@langchain/langgraph/web";
9
- import { sendTraceMessage as g, invokeStructuredPrompt as b, createChatModel as F, sendUXSuggestion as B, createAgentRuntimeStateWithSharedState as E } from "@arcgis/ai-components/utils/index.js";
2
+ import { c as pt } from "../../chunks/runtime.js";
3
+ import { LitElement as dt, createEvent as mt } from "@arcgis/lumina";
4
+ import { css as gt, render as ht, html as M } from "lit";
5
+ import { createRef as T, ref as A } from "lit/directives/ref.js";
6
+ import { u as ft } from "../../chunks/useT9n.js";
7
+ import { a as C, t as yt, b as wt } from "../../chunks/functionalities.js";
8
+ import { NodeInterrupt as _, Annotation as y, StateGraph as N, START as P, END as w } from "@langchain/langgraph/web";
9
+ import { sendTraceMessage as g, invokeStructuredPrompt as v, sendUXSuggestion as E, createAgentRuntimeStateWithSharedState as k, createChatModel as D } from "@arcgis/ai-components/utils/index.js";
10
10
  import n from "zod";
11
- import { ChatPromptTemplate as L } from "@langchain/core/prompts";
12
- import { createAgent as Q } from "langchain";
13
- import { tool as K } from "@langchain/core/tools";
14
- import { s as nt, g as it, a as lt, c as ct, q as ut } from "../../chunks/groups.js";
15
- import mt from "@arcgis/core/identity/IdentityManager.js";
16
- import k from "@arcgis/core/request.js";
17
- import { Annotation as dt } from "@langchain/langgraph";
18
- const x = (s) => {
19
- for (let t = s.length - 1; t >= 0; t -= 1) {
20
- const e = s[t];
21
- if (e.type !== "human")
22
- continue;
23
- const a = e.content;
24
- if (typeof a == "string")
25
- return a;
26
- if (Array.isArray(a))
27
- return a.map(
28
- (r) => typeof r == "string" ? r : "text" in r && typeof r.text == "string" ? r.text : ""
29
- ).join(" ").trim();
30
- }
31
- return "";
32
- }, pt = () => ({ latestItemId: null, memory: {} }), N = (s) => {
33
- const t = s?.agentExecutionContext.sharedState.portalItemAnalyticsSummaryMemory?.value;
34
- return t ? { latestItemId: t.latestItemId, memory: t.memory } : pt();
35
- }, gt = n.object({
36
- intent: n.enum(["summarize", "followUp", "clarify"]),
37
- itemId: n.string().default(""),
38
- question: n.string().default("")
39
- }), ht = n.object({ summary: n.string(), followUpQuestions: n.array(n.string()).default([]) }), ft = n.object({ answer: n.string(), isRelevant: n.boolean() }), yt = async (s, t) => {
40
- await g({ text: "Answering follow-up...", agentName: "analytics" }, t);
41
- const e = N(s), a = s.analyticsItemId ?? e.latestItemId, r = a ? e.memory[a] : void 0, l = s.analyticsQuestion || x(s.agentExecutionContext.messages);
42
- return r ? {
43
- status: "success",
44
- outputMessage: (await b({
45
- promptText: bt,
46
- schema: ft,
47
- modelTier: "default",
48
- inputVariables: {
49
- summary: r.summary,
50
- question: l,
51
- fullContext: JSON.stringify(r.fullContext)
52
- }
53
- })).answer
54
- } : {
55
- status: "success",
56
- outputMessage: "I don't have enough information yet. Please ask me to summarize the item first using summarize item <item id>."
57
- };
58
- }, bt = `
59
- You answer follow-up questions about an ArcGIS item.
60
-
61
- Ground your answer in the provided item context.
62
- If the answer is not available from the provided context, state that clearly and suggest what to check next.
63
-
64
- Response rules:
65
- - Reply in concise markdown.
66
- - Keep the answer focused on the follow-up question.
67
- - Do not include internal identifiers.
68
- - Mark isRelevant=false when the question is not about this item or cannot be grounded in this item context.
69
-
70
- Item summary:
71
- {summary}
72
-
73
- Item full context
74
- {fullContext}
75
-
76
- Question:
77
- {question}
78
- `;
79
- function I(s) {
80
- const { portal: t, user: e } = s ?? {};
81
- if (!s || !t || !e)
11
+ import { a as bt, c as vt, q as It } from "../../chunks/groups.js";
12
+ import xt from "@arcgis/core/identity/IdentityManager.js";
13
+ import F from "@arcgis/core/request.js";
14
+ import { ChatPromptTemplate as U } from "@langchain/core/prompts";
15
+ import { tool as Y } from "@langchain/core/tools";
16
+ import { s as St, a as Mt } from "../../chunks/item2.js";
17
+ import { g as Gt, e as Tt, i as At, c as Ct, a as Nt } from "../../chunks/groups2.js";
18
+ const H = (a) => {
19
+ const { portal: t, user: e } = a ?? {};
20
+ return !!a && !!t && !!e;
21
+ };
22
+ function I(a) {
23
+ if (!H(a))
82
24
  throw new Error("Invalid context: PortalAssistantContext with portal and user is required.");
83
25
  }
84
- const W = K(
85
- async ({ itemTitle: s }, t) => {
86
- const e = s.trim();
87
- if (!e)
88
- return null;
89
- const a = t?.configurable?.context;
90
- I(a);
91
- const { result: r, error: l } = await nt(a.portal, e, { num: 1 });
92
- return l && console.error("Error searching for portal item by title:", l), r?.results[0]?.id || null;
93
- },
94
- {
95
- name: "resolvePortalItemIdByTitle",
96
- description: 'Resolves an ArcGIS Portal item title to the best-match item id. Use this when a user references an item by title (including hash mentions like #title or #"title with spaces") instead of an explicit item id.',
97
- schema: n.object({
98
- itemTitle: n.string().describe("The portal item title to resolve to an item id.")
99
- })
100
- }
101
- ), It = async (s, t) => {
102
- await g({ text: "Analyzing intent...", agentName: "analytics" }, t);
103
- const e = x(s.agentExecutionContext.messages), a = !!N(s).latestItemId, r = await L.fromTemplate(wt).format({
104
- userMessage: e,
105
- hasSummaryContext: String(a)
106
- }), c = await Q({
107
- model: await F({ modelTier: "fast" }),
108
- tools: [W],
109
- systemPrompt: r,
110
- responseFormat: gt,
111
- checkpointer: !0
112
- }).invoke({ messages: s.agentExecutionContext.messages }, t), { intent: i, itemId: o, question: u } = c.structuredResponse, m = i === "clarify" || i === "summarize" && !o || i === "followUp" && !u;
113
- return {
114
- agentExecutionContext: { ...s.agentExecutionContext },
115
- analyticsIntent: m ? "clarify" : i,
116
- analyticsItemId: o || null,
117
- analyticsQuestion: u || "",
118
- status: "success",
119
- outputMessage: m ? 'Please clarify with summarize item <item id>, summarize item #<title>, or summarize item #"<title with spaces>".' : ""
120
- };
121
- }, wt = `
122
- Classify the user analytics request.
26
+ const Pt = `
27
+ Write a concise, friendly success message for adding members to a group.
123
28
 
124
29
  Rules:
125
- - intent="summarize" only when the user explicitly asks to summarize/overview/recap an item.
126
- - intent="followUp" for analytical questions about item details, including schema/fields/attributes/layers.
127
- - intent="clarify" when neither summarize nor follow-up intent is clear.
128
- - itemId must be the final resolved item id.
129
- - If request has explicit item id, set itemId directly.
130
- - If request references item title (for example #title, #"title with spaces", or plain quoted title), call resolvePortalItemIdByTitle and set itemId to the returned value.
131
- - Never return item titles in output fields.
132
- - If intent is "followUp", set question to the user's full question/request text.
133
- - If intent is "summarize", set question="".
134
- - When user asks to show/list/explain fields, schema, attributes, columns, or layer details, classify as "followUp" unless they explicitly request a summary.
135
- - If hasSummaryContext is true, prefer "followUp" for detail-oriented requests that do not explicitly ask to summarize.
136
-
137
- Examples:
138
- - "Summarize item 0123456789abcdef0123456789abcdef" => summarize, itemId="0123456789abcdef0123456789abcdef"
139
- - "Summarize item #california" => summarize, call resolvePortalItemIdByTitle("california") and set itemId to tool result
140
- - "Summarize item #"california farmland"" => summarize, call resolvePortalItemIdByTitle("california farmland") and set itemId to tool result
141
- - "Show the layer's available fields" => followUp
142
- - "List attributes and explain what status means" => followUp
143
- - "What fields are available?" with hasSummaryContext=true => followUp
144
- - "Give me an overview of item 0123456789abcdef0123456789abcdef" => summarize
30
+ - Keep it to 1-2 short sentences.
31
+ - Use plain text only.
32
+ - If there is no notAddedMembers, confirm that all requested members were added successfully.
33
+ - If there are notAddedMembers, acknowledge that some members could not be added and list the added and not added members separately then mention why based on the context
34
+ - Make sure to bold the usernames
145
35
 
146
- hasSummaryContext:
147
- {hasSummaryContext}
36
+ Added members:
37
+ {addedMembers}
148
38
 
149
- User message:
150
- {userMessage}
151
- `, xt = async (s, t) => {
152
- const e = s.analyticsItemId;
153
- if (!e)
154
- return {
155
- status: "success",
156
- outputMessage: 'Please clarify with summarize item <item id>, summarize item #<title>, or summarize item #"<title with spaces>".'
157
- };
158
- await g({ text: `Summarizing item ${e}...`, agentName: "analytics" }, t);
159
- const a = t?.configurable?.context;
160
- I(a);
161
- const { portal: r, user: l } = a, { result: c, error: i } = await it(l, r, e);
162
- if (i || !c)
163
- return await g({ text: "Failed to get item context for summarization", agentName: "analytics" }, t), {
164
- status: "success",
165
- outputMessage: "Unable to retrieve item context for summarization."
166
- };
167
- const { context: o } = c, u = await b({
168
- promptText: vt,
169
- schema: ht,
170
- modelTier: "default",
171
- inputVariables: { context: JSON.stringify(o) }
172
- }), { followUpQuestions: d, summary: p } = u, m = N(s), f = {
173
- latestItemId: e,
174
- memory: {
175
- ...m.memory,
176
- [e]: { summary: p, followUpQuestions: d, fullContext: o }
177
- }
178
- };
179
- return d.length && await B({ type: "suggested-prompts", data: { prompts: d } }, t), {
180
- status: "success",
181
- outputMessage: p,
182
- sharedStatePatch: { portalItemAnalyticsSummaryMemory: { value: f } }
183
- };
184
- }, vt = `
185
- You are a item summary tool for ArcGIS. Your job is to summarize an item's info based on the provided context.
186
- Summary rules:
187
- - The summary should be concise markdown, make sure to format the output nicely so it's easy to read.
188
- - Target length: 80-150 words.
189
- - Provide one short descriptive paragraph.
190
- - Also propose 3 concise follow-up questions grounded in the item summary.
191
- - Keep follow-up questions specific and actionable.
192
- Follow-up questions rules:
193
- - These questions should be in the format of a prompt that the user can click on.
194
- - Make sure the questions are relevant to the item summary and that you can answer based solely on the provided context.
195
- Do not include internal identifiers.
196
- If the user asks for a detailed summary, you may expand the response up to 300 words.
197
- Item context:
198
- {context}
199
- `, C = (s, t) => t ?? s, O = h.Root({
200
- ...E(),
201
- // States shared only across nodes in the graph, not between invocations
202
- analyticsIntent: h({
203
- reducer: C,
204
- default: () => "clarify"
205
- }),
206
- analyticsItemId: h({
207
- reducer: C,
208
- default: () => null
209
- }),
210
- analyticsQuestion: h({
211
- reducer: C,
212
- default: () => ""
213
- })
214
- }), St = () => new $(O).addNode("detectAnalyticsIntent", It).addNode("summarizePortalItem", xt).addNode("answerAnalyticsFollowUp", yt).addEdge(G, "detectAnalyticsIntent").addConditionalEdges("detectAnalyticsIntent", (t) => t.analyticsIntent === "summarize" ? "summarizePortalItem" : t.analyticsIntent === "followUp" ? "answerAnalyticsFollowUp" : y).addEdge("summarizePortalItem", y).addEdge("answerAnalyticsFollowUp", y), Mt = String.raw`- **portal-item-analytics** - Portal item analytics assistant:
215
- - summarizes ArcGIS portal items from item context
216
- - suggests follow-up prompts grounded in the item
217
- `, Tt = {
218
- id: "portal-item-analytics",
219
- name: "Portal Item Analytics",
220
- description: Mt,
221
- createGraph: St,
222
- workspace: O
223
- }, Pt = (s) => s.map((t) => `"${t}"`).join(", "), At = n.object({
39
+ Not added members:
40
+ {notAddedMembers}
41
+ `, kt = (a) => a.map((t) => `"${t}"`).join(", "), qt = n.object({
224
42
  successMessage: n.string().default("")
225
- }), q = "portal-group-creation", D = "approveAddMembers", Ct = async (s, t) => {
226
- if (s.intentParams.intent !== "addMembers")
43
+ }), V = "portal-group-creation", j = "approveAddMembers", zt = async (a, t) => {
44
+ if (a.intentParams.intent !== "addMembers")
227
45
  return {
228
46
  status: "success",
229
47
  outputMessage: "Use @mention usernames for the members you want to add."
230
48
  };
231
- const e = s.agentExecutionContext.sharedState.createdGroupId?.value;
49
+ const e = a.agentExecutionContext.sharedState.createdGroupId?.value;
232
50
  if (!e)
233
51
  return {
234
52
  status: "success",
235
53
  outputMessage: "Create a group first, then add members using @mention usernames."
236
54
  };
237
- const a = s.intentParams.memberInfo.memberIdentifiers.map((m) => m.trim()).filter(Boolean);
238
- if (!a.length)
55
+ const s = a.intentParams.memberInfo.memberIdentifiers.map((d) => d.trim()).filter(Boolean);
56
+ if (!s.length)
239
57
  return {
240
58
  status: "success",
241
59
  outputMessage: "Use @mention usernames for the members you want to add."
242
60
  };
243
61
  const l = `The following member(s) will be added to the newly created group:
244
62
 
245
- ${a.map((m) => `- **@${m}**`).join(`
63
+ ${s.map((d) => `- **@${d}**`).join(`
246
64
  `)}
247
65
 
248
66
  Do you want to continue?`, { hitlResponse: c } = t?.configurable ?? {};
249
- if (c?.agentId !== q || c.id !== D) {
250
- const m = {
251
- agentId: q,
252
- id: D,
67
+ if (c?.agentId !== V || c.id !== j) {
68
+ const d = {
69
+ agentId: V,
70
+ id: j,
253
71
  kind: "booleanChoice",
254
72
  message: l,
255
73
  metadata: {
256
74
  action: "addMembers",
257
75
  groupId: e,
258
- members: [...a]
76
+ members: [...s]
259
77
  }
260
78
  };
261
- throw new V(m);
79
+ throw new _(d);
262
80
  }
263
81
  if (c.payload !== !0)
264
82
  return {
@@ -266,83 +84,94 @@ Do you want to continue?`, { hitlResponse: c } = t?.configurable ?? {};
266
84
  outputMessage: "Okay, I cancelled adding members to the group."
267
85
  };
268
86
  await g(
269
- { text: `Adding members ${Pt(a)}...`, agentName: "group-creation" },
87
+ { text: `Adding members ${kt(s)}...`, agentName: "group-creation" },
270
88
  t
271
89
  );
272
90
  const i = t?.configurable?.context;
273
91
  I(i);
274
- const { result: o, error: u } = await lt(i.portal, e, a);
275
- if (u || !o)
92
+ const { result: u, error: r } = await bt(i.portal, e, s);
93
+ if (r || !u)
276
94
  return {
277
95
  status: "success",
278
96
  outputMessage: "I could not add members to that group. Please confirm group access and user accounts, then try again."
279
97
  };
280
- const { addedUsernames: d, notAddedUsers: p } = o;
98
+ const { addedUsernames: p, notAddedUsers: m } = u;
281
99
  try {
282
- const f = (await b({
283
- promptText: $t,
284
- schema: At,
100
+ const h = (await v({
101
+ promptText: Pt,
102
+ schema: qt,
285
103
  modelTier: "fast",
286
104
  inputVariables: {
287
- addedMembers: d.join(", "),
105
+ addedMembers: p.join(", "),
288
106
  notAddedMembers: JSON.stringify(
289
- p.map((v) => ({ username: v.username, reason: v.error.message }))
107
+ m.map((f) => ({ username: f.username, reason: f.error.message }))
290
108
  )
291
109
  }
292
110
  })).successMessage;
293
- if (f)
294
- return { status: "success", outputMessage: f };
295
- } catch (m) {
296
- console.error("Error generating add-members success message:", m);
111
+ if (h)
112
+ return { status: "success", outputMessage: h };
113
+ } catch (d) {
114
+ console.error("Error generating add-members success message:", d);
297
115
  }
298
116
  return {};
299
117
  }, $t = `
300
- Write a concise, friendly success message for adding members to a group.
118
+ Write a concise, friendly success message after creating a portal group.
119
+
120
+ Rules:
121
+ - Mention that the group was created successfully.
122
+ - Mention that the user can add members by using @mention usernames.
123
+ - Keep it to 1-2 short sentences.
124
+ - Make sure to bold the group title in the message.
125
+
126
+ Group title:
127
+ {groupTitle}
128
+ `, Et = `
129
+ Write a concise, friendly failure message after an attempt to create a portal group.
301
130
 
302
131
  Rules:
303
132
  - Keep it to 1-2 short sentences.
304
133
  - Use plain text only.
305
- - If there is no notAddedMembers, confirm that all requested members were added successfully.
306
- - If there are notAddedMembers, acknowledge that some members could not be added and list the added and not added members separately then mention why based on the context
307
- - Make sure to bold the usernames
134
+ - Mention that group creation failed.
135
+ - Include the failure reason in user-friendly language.
136
+ - End with a clear next step the user can try.
308
137
 
309
- Added members:
310
- {addedMembers}
138
+ Group title:
139
+ {groupTitle}
311
140
 
312
- Not added members:
313
- {notAddedMembers}
314
- `, R = "portal-group-creation", U = "approveCreateGroup", Gt = n.object({
141
+ Failure reason:
142
+ {failureReason}
143
+ `, L = "portal-group-creation", B = "approveCreateGroup", Dt = n.object({
315
144
  successMessage: n.string().default("")
316
- }), Et = n.object({
145
+ }), Ut = n.object({
317
146
  failureMessage: n.string().default("")
318
- }), Nt = async (s, t) => {
319
- if (s.intentParams.intent !== "create")
147
+ }), Rt = async (a, t) => {
148
+ if (a.intentParams.intent !== "create")
320
149
  return {
321
150
  status: "success",
322
151
  outputMessage: "Tell me the group title you want to use."
323
152
  };
324
- const e = s.intentParams.title.trim();
153
+ const e = a.intentParams.title.trim();
325
154
  if (!e)
326
155
  return {
327
156
  status: "success",
328
157
  outputMessage: "What title would you like for the new group?"
329
158
  };
330
- const a = `A group with the title **${e}** will be created. Do you want to continue?`, { hitlResponse: r } = t?.configurable;
331
- if (r?.agentId !== R || r.id !== U) {
332
- const u = {
333
- agentId: R,
334
- id: U,
159
+ const s = `A group with the title **${e}** will be created. Do you want to continue?`, { hitlResponse: o } = t?.configurable;
160
+ if (o?.agentId !== L || o.id !== B) {
161
+ const r = {
162
+ agentId: L,
163
+ id: B,
335
164
  kind: "booleanChoice",
336
- message: a,
165
+ message: s,
337
166
  metadata: {
338
167
  action: "createGroup",
339
168
  title: e,
340
169
  access: "private"
341
170
  }
342
171
  };
343
- throw new V(u);
172
+ throw new _(r);
344
173
  }
345
- if (r.payload !== !0)
174
+ if (o.payload !== !0)
346
175
  return {
347
176
  status: "success",
348
177
  outputMessage: `Okay, I cancelled creating **${e}**.`
@@ -350,101 +179,71 @@ Not added members:
350
179
  await g({ text: `Creating group "${e}"...`, agentName: "group-creation" }, t);
351
180
  const l = t?.configurable?.context;
352
181
  I(l);
353
- const { result: c, error: i } = await ct(l.portal, {
182
+ const { result: c, error: i } = await vt(l.portal, {
354
183
  title: e,
355
184
  access: "private"
356
185
  });
357
186
  if (i || !c) {
358
- const u = i?.message?.trim() || "No additional details were provided.";
187
+ const r = i?.message?.trim() || "No additional details were provided.";
359
188
  try {
360
- const p = (await b({
361
- promptText: qt,
362
- schema: Et,
189
+ const m = (await v({
190
+ promptText: Et,
191
+ schema: Ut,
363
192
  modelTier: "fast",
364
193
  inputVariables: {
365
194
  groupTitle: e,
366
- failureReason: u
195
+ failureReason: r
367
196
  }
368
197
  })).failureMessage.trim();
369
- if (p)
198
+ if (m)
370
199
  return {
371
200
  status: "success",
372
- outputMessage: p
201
+ outputMessage: m
373
202
  };
374
- } catch (d) {
375
- console.error("Error generating create-group failure message:", d);
203
+ } catch (p) {
204
+ console.error("Error generating create-group failure message:", p);
376
205
  }
377
206
  return {
378
207
  status: "success",
379
208
  outputMessage: "I could not create that group. Please confirm your permissions and try again with the group title."
380
209
  };
381
210
  }
382
- const o = c.id;
211
+ const u = c.id;
383
212
  try {
384
- const d = (await b({
385
- promptText: kt,
386
- schema: Gt,
213
+ const p = (await v({
214
+ promptText: $t,
215
+ schema: Dt,
387
216
  modelTier: "fast",
388
217
  inputVariables: {
389
218
  groupTitle: e
390
219
  }
391
220
  })).successMessage.trim();
392
- if (d)
221
+ if (p)
393
222
  return {
394
223
  status: "success",
395
- outputMessage: d,
396
- sharedStatePatch: { createdGroupId: { value: o } },
397
- createdGroupId: o
224
+ outputMessage: p,
225
+ sharedStatePatch: { createdGroupId: { value: u } },
226
+ createdGroupId: u
398
227
  };
399
- } catch (u) {
400
- console.error("Error generating create-group success message:", u);
228
+ } catch (r) {
229
+ console.error("Error generating create-group success message:", r);
401
230
  }
402
231
  return {};
403
- }, kt = `
404
- Write a concise, friendly success message after creating a portal group.
405
-
406
- Rules:
407
- - Mention that the group was created successfully.
408
- - Mention that the user can add members by using @mention usernames.
409
- - Keep it to 1-2 short sentences.
410
- - Make sure to bold the group title in the message.
411
-
412
- Group title:
413
- {groupTitle}
414
- `, qt = `
415
- Write a concise, friendly failure message after an attempt to create a portal group.
416
-
417
- Rules:
418
- - Keep it to 1-2 short sentences.
419
- - Use plain text only.
420
- - Mention that group creation failed.
421
- - Include the failure reason in user-friendly language.
422
- - End with a clear next step the user can try.
423
-
424
- Group title:
425
- {groupTitle}
426
-
427
- Failure reason:
428
- {failureReason}
429
- `, Dt = n.object({
430
- intent: n.enum(["clarify", "create", "addMembers"]).default("clarify"),
431
- title: n.string().default(""),
432
- memberIdentifiers: n.array(n.string()).default([]),
433
- clarifyMessage: n.string().default("")
434
- }), Rt = async (s, t) => {
435
- await g({ text: "Thinking about groups...", agentName: "group-creation" }, t);
436
- const e = x(s.agentExecutionContext.messages).trim(), a = await b({
437
- promptText: Ut,
438
- schema: Dt,
439
- modelTier: "default",
440
- inputVariables: { userMessage: e }
441
- }), r = a.title.trim(), l = a.memberIdentifiers.filter(Boolean), c = a.clarifyMessage.trim(), i = a.intent === "create" && !!r, o = a.intent === "addMembers" && l.length > 0;
442
- return {
443
- intentParams: i ? { intent: "create", title: r } : o ? { intent: "addMembers", memberInfo: { memberIdentifiers: l } } : { intent: "clarify" },
444
- status: "success",
445
- outputMessage: !i && !o ? c : ""
446
- };
447
- }, Ut = `
232
+ }, x = (a) => {
233
+ for (let t = a.length - 1; t >= 0; t -= 1) {
234
+ const e = a[t];
235
+ if (e.type !== "human")
236
+ continue;
237
+ const s = e.content;
238
+ if (typeof s == "string")
239
+ return s;
240
+ if (Array.isArray(s))
241
+ return s.map(
242
+ (o) => typeof o == "string" ? o : "text" in o && typeof o.text == "string" ? o.text : ""
243
+ ).join(" ").trim();
244
+ }
245
+ return "";
246
+ }, Ot = `
448
247
  You classify whether a user is asking to create a new ArcGIS Portal group or add members to an existing group.
449
248
 
450
249
  Rules:
@@ -470,13 +269,43 @@ Examples:
470
269
 
471
270
  User message:
472
271
  {userMessage}
473
- `, zt = n.discriminatedUnion("destinationType", [
474
- n.object({
475
- destinationType: n.literal("portal-content")
476
- }),
477
- n.object({
478
- destinationType: n.literal("portal-groups")
479
- }),
272
+ `, Ft = n.object({
273
+ intent: n.enum(["clarify", "create", "addMembers"]).default("clarify"),
274
+ title: n.string().default(""),
275
+ memberIdentifiers: n.array(n.string()).default([]),
276
+ clarifyMessage: n.string().default("")
277
+ }), Vt = async (a, t) => {
278
+ await g({ text: "Thinking about groups...", agentName: "group-creation" }, t);
279
+ const e = x(a.agentExecutionContext.messages).trim(), s = await v({
280
+ promptText: Ot,
281
+ schema: Ft,
282
+ modelTier: "default",
283
+ inputVariables: { userMessage: e }
284
+ }), o = s.title.trim(), l = s.memberIdentifiers.filter(Boolean), c = s.clarifyMessage.trim(), i = s.intent === "create" && !!o, u = s.intent === "addMembers" && l.length > 0;
285
+ return {
286
+ intentParams: i ? { intent: "create", title: o } : u ? { intent: "addMembers", memberInfo: { memberIdentifiers: l } } : { intent: "clarify" },
287
+ status: "success",
288
+ outputMessage: !i && !u ? c : ""
289
+ };
290
+ }, jt = n.enum([
291
+ "portal-content",
292
+ "portal-content-favorites",
293
+ "portal-content-group",
294
+ "portal-content-living-atlas",
295
+ "portal-content-organization",
296
+ "portal-gallery",
297
+ "portal-groups",
298
+ "portal-groups-featured",
299
+ "portal-groups-my",
300
+ "portal-groups-organization",
301
+ "portal-map-viewer",
302
+ "portal-notebooks",
303
+ "portal-scene-viewer",
304
+ "portal-settings-security"
305
+ ]), Lt = n.object({
306
+ destinationType: jt
307
+ }), Bt = n.union([
308
+ Lt,
480
309
  n.object({
481
310
  destinationType: n.literal("portal-item"),
482
311
  itemId: n.string().trim().min(1)
@@ -485,173 +314,179 @@ User message:
485
314
  destinationType: n.literal("portal-group"),
486
315
  groupId: n.string().trim().min(1)
487
316
  })
488
- ]);
489
- function jt(s) {
490
- const t = zt.safeParse(s);
491
- return t.success ? t.data : void 0;
492
- }
493
- const _ = "portal-navigation", J = async (s, t) => {
494
- await B({ type: _, data: { ...s } }, t);
495
- }, Vt = async (s, t) => {
496
- const e = s.createdGroupId ?? s.agentExecutionContext.sharedState.createdGroupId?.value;
497
- return e ? (await g({ text: "Preparing navigation...", agentName: "group-creation" }, t), await J({ destinationType: "portal-group", groupId: e }, t), {}) : {};
498
- }, z = (s, t) => t ?? s, Y = h.Root({
499
- ...E(),
317
+ ]), X = "portal-navigation", R = async (a, t) => {
318
+ const e = t?.configurable?.context;
319
+ !H(e) || !e.navigationTargetMap?.[a.destinationType] || await E({ type: X, data: { ...a } }, t);
320
+ }, Qt = async (a, t) => {
321
+ const e = a.createdGroupId ?? a.agentExecutionContext.sharedState.createdGroupId?.value;
322
+ return e ? (await g({ text: "Preparing navigation...", agentName: "group-creation" }, t), await R({ destinationType: "portal-group", groupId: e }, t), {}) : {};
323
+ }, Q = (a, t) => t ?? a, Z = y.Root({
324
+ ...k(),
500
325
  // * Shared state between nodes (but not persisted to the agent execution context)
501
326
  /** Parameters related to the user's intent for group creation actions */
502
- intentParams: h({ reducer: z, default: () => ({ intent: "clarify" }) }),
327
+ intentParams: y({ reducer: Q, default: () => ({ intent: "clarify" }) }),
503
328
  /** The ID of the group that was created
504
329
  * even though we already have this in the shared state
505
330
  * we still need it here to also share between nodes
506
331
  */
507
- createdGroupId: h({ reducer: z, default: () => "" })
508
- }), Ft = () => new $(Y).addNode("detectGroupCreationIntent", Rt).addNode("createPortalGroup", Nt).addNode("addMembersToPortalGroup", Ct).addNode("suggestCreatedGroupNavigation", Vt).addEdge(G, "detectGroupCreationIntent").addConditionalEdges("detectGroupCreationIntent", (t) => {
332
+ createdGroupId: y({ reducer: Q, default: () => "" })
333
+ }), Kt = () => new N(Z).addNode("detectGroupCreationIntent", Vt).addNode("createPortalGroup", Rt).addNode("addMembersToPortalGroup", zt).addNode("suggestCreatedGroupNavigation", Qt).addEdge(P, "detectGroupCreationIntent").addConditionalEdges("detectGroupCreationIntent", (t) => {
509
334
  switch (t.intentParams.intent) {
510
335
  case "create":
511
336
  return "createPortalGroup";
512
337
  case "addMembers":
513
338
  return "addMembersToPortalGroup";
514
339
  default:
515
- return y;
340
+ return w;
516
341
  }
517
- }).addEdge("createPortalGroup", "suggestCreatedGroupNavigation").addEdge("addMembersToPortalGroup", "suggestCreatedGroupNavigation").addEdge("suggestCreatedGroupNavigation", y), Bt = String.raw`- **portal-group-creation** - Portal group creation assistant:
342
+ }).addEdge("createPortalGroup", "suggestCreatedGroupNavigation").addEdge("addMembersToPortalGroup", "suggestCreatedGroupNavigation").addEdge("suggestCreatedGroupNavigation", w), Jt = String.raw`- **portal-group-creation** - Portal group creation assistant:
518
343
  - creates a new ArcGIS Portal group for the signed-in user
519
344
  - adds users to the newly created group using @mention usernames
520
- `, Lt = {
345
+ `, Wt = {
521
346
  id: "portal-group-creation",
522
347
  name: "Portal Group Creation",
523
- description: Bt,
524
- createGraph: Ft,
525
- workspace: Y
526
- }, H = "portalDocAssistantMemory", Qt = () => ({ conversationId: "" }), Kt = (s) => {
527
- const t = s?.[H]?.value;
348
+ description: Jt,
349
+ createGraph: Kt,
350
+ workspace: Z
351
+ }, tt = "portalDocAssistantMemory", _t = () => ({ conversationId: "" }), Yt = (a) => {
352
+ const t = a?.[tt]?.value;
528
353
  if (!t || typeof t != "object")
529
- return Qt();
354
+ return _t();
530
355
  const e = t;
531
356
  return {
532
357
  conversationId: typeof e.conversationId == "string" ? e.conversationId : ""
533
358
  };
534
- }, Wt = (s) => ({
535
- [H]: { value: s }
536
- });
537
- async function Ot({
538
- portal: s,
359
+ }, Ht = (a) => ({
360
+ [tt]: { value: a }
361
+ }), Xt = {
362
+ pipeline: {
363
+ follow_up: { allow: !1 }
364
+ }
365
+ };
366
+ function Zt(a) {
367
+ return {
368
+ kind: "DocAIAssistantRequest",
369
+ filters: {
370
+ ...Xt,
371
+ persona: { persona: a }
372
+ }
373
+ };
374
+ }
375
+ async function te({
376
+ portal: a,
539
377
  question: t,
540
378
  persona: e,
541
- previousConversationId: a,
542
- signal: r,
379
+ previousConversationId: s,
380
+ signal: o,
543
381
  skillId: l
544
382
  }) {
545
383
  l ??= "doc_ai_assistant";
546
- const i = await _t({
547
- portal: s,
384
+ const c = Zt(e), i = await ee({
385
+ portal: a,
548
386
  skillId: l,
549
387
  message: t,
550
- options: { context: {
551
- kind: "DocAIAssistantRequest",
552
- filters: { persona: { persona: e } }
553
- }, previousConversationId: a, signal: r }
388
+ options: { context: c, previousConversationId: s, signal: o }
554
389
  });
555
390
  return {
556
- reply: Jt(i, l),
391
+ reply: ae(i, l),
557
392
  conversationId: i[0]?.conversationId ?? ""
558
393
  };
559
394
  }
560
- async function _t({
561
- portal: s,
395
+ async function ee({
396
+ portal: a,
562
397
  skillId: t,
563
398
  message: e,
564
- options: a
399
+ options: s
565
400
  }) {
566
- const l = `${s.helperServices.aiAssistantServices.url}/skills/${t}/chat`, c = {
401
+ const l = `${a.helperServices.aiAssistantServices.url}/skills/${t}/chat`, c = {
567
402
  "Content-Type": "application/json",
568
- token: mt.findCredential(s.url)?.token ?? ""
569
- }, i = await k(l, {
403
+ token: xt.findCredential(a.url)?.token ?? ""
404
+ }, i = await F(l, {
570
405
  method: "post",
571
406
  body: JSON.stringify({
572
407
  message: e,
573
- context: a.context,
574
- conversationId: a.previousConversationId
408
+ context: s.context,
409
+ conversationId: s.previousConversationId
575
410
  }),
576
411
  headers: c,
577
- signal: a.signal
412
+ signal: s.signal
578
413
  });
579
414
  if (i.httpStatus !== 200)
580
415
  throw new Error(`Doc assistant chat failed (${i.httpStatus})`, {
581
416
  cause: i.data
582
417
  });
583
- const o = i.data, u = [o], { conversationId: d, inquiryId: p } = o, m = async (f, v) => {
584
- if (!v)
418
+ const u = i.data, r = [u], { conversationId: p, inquiryId: m } = u, d = async (h, f) => {
419
+ if (!f)
585
420
  return;
586
- await ot(1e3);
587
- const S = await k(l, {
421
+ await yt(500);
422
+ const b = await F(l, {
588
423
  method: "post",
589
- body: JSON.stringify({ conversationId: d, inquiryId: p, ackSequenceNumber: f }),
424
+ body: JSON.stringify({ conversationId: p, inquiryId: m, ackSequenceNumber: h }),
590
425
  headers: c,
591
- signal: a.signal
426
+ signal: s.signal
592
427
  });
593
- if (S.httpStatus !== 200)
594
- throw new Error(`Doc assistant poll failed (${S.httpStatus})`, {
595
- cause: S.data
428
+ if (b.httpStatus !== 200)
429
+ throw new Error(`Doc assistant poll failed (${b.httpStatus})`, {
430
+ cause: b.data
596
431
  });
597
- const A = S.data;
598
- u.push(A), await m(A.sequenceNumber, A.hasMore);
432
+ const S = b.data;
433
+ r.push(S), await d(S.sequenceNumber, S.hasMore);
599
434
  };
600
- return o.hasMore && await m(o.sequenceNumber, o.hasMore), u;
435
+ return u.hasMore && await d(u.sequenceNumber, u.hasMore), r;
601
436
  }
602
- function Jt(s, t) {
437
+ function ae(a, t) {
603
438
  switch (t) {
604
439
  case "doc_chat":
605
- return s.find((e) => e.message != null)?.message ?? "";
440
+ return a.find((e) => e.message != null)?.message ?? "";
606
441
  case "doc_ai_assistant":
607
- for (let e = s.length - 1; e >= 0; e -= 1) {
608
- const a = s[e];
609
- if (a.context?.kind === "DocAIAssistantContext") {
610
- const r = a.context.results?.[0]?.reply;
611
- if (r)
612
- return r;
442
+ for (let e = a.length - 1; e >= 0; e -= 1) {
443
+ const s = a[e];
444
+ if (s.context?.kind === "DocAIAssistantContext") {
445
+ const o = s.context.results?.[0]?.reply;
446
+ if (o)
447
+ return o;
613
448
  }
614
449
  }
615
450
  return "";
616
451
  default:
617
- return P(t);
452
+ return C(t);
618
453
  }
619
454
  }
620
- const Yt = async (s, t) => {
455
+ const se = async (a, t) => {
621
456
  await g({ text: "Asking documentation assistant...", agentName: "doc-assistant" }, t);
622
- const e = x(s.agentExecutionContext.messages).trim();
457
+ const e = x(a.agentExecutionContext.messages).trim();
623
458
  if (!e)
624
459
  return {
625
460
  status: "success",
626
461
  outputMessage: "Please share your question and I can help with ArcGIS and Portal documentation."
627
462
  };
628
- const a = t?.configurable?.context;
629
- I(a);
630
- const r = Kt(s.agentExecutionContext.sharedState), { reply: l, conversationId: c } = await Ot({
631
- portal: a.portal,
463
+ const s = t?.configurable?.context;
464
+ I(s);
465
+ const o = Yt(a.agentExecutionContext.sharedState), { reply: l, conversationId: c } = await te({
466
+ portal: s.portal,
632
467
  question: e,
633
- previousConversationId: r.conversationId || void 0,
468
+ previousConversationId: o.conversationId || void 0,
634
469
  skillId: "doc_ai_assistant",
635
- persona: "developers"
470
+ persona: "doc-online"
636
471
  });
637
472
  return {
638
473
  status: "success",
639
474
  outputMessage: l.trim() || "I could not retrieve a response from the documentation assistant.",
640
- sharedStatePatch: Wt({
641
- conversationId: c || r.conversationId
475
+ sharedStatePatch: Ht({
476
+ conversationId: c || o.conversationId
642
477
  })
643
478
  };
644
- }, Ht = K(
645
- async ({ groupTitle: s }, t) => {
646
- const e = s.trim();
479
+ }, et = Y(
480
+ async ({ groupTitle: a }, t) => {
481
+ const e = a.trim();
647
482
  if (!e)
648
483
  return null;
649
- const a = t?.configurable?.context;
650
- I(a);
484
+ const s = t?.configurable?.context;
485
+ I(s);
651
486
  try {
652
- return (await ut(a.portal, { query: `title:${e}`, num: 1 }))?.results[0]?.id || null;
653
- } catch (r) {
654
- return console.error("Error searching for portal group by title:", r), null;
487
+ return (await It(s.portal, { query: `title:${e}`, num: 1 }))?.results[0]?.id || null;
488
+ } catch (o) {
489
+ return console.error("Error searching for portal group by title:", o), null;
655
490
  }
656
491
  },
657
492
  {
@@ -661,41 +496,193 @@ const Yt = async (s, t) => {
661
496
  groupTitle: n.string().describe("The portal group title to resolve to a group id.")
662
497
  })
663
498
  }
664
- ), j = n.object({
499
+ ), at = Y(
500
+ async ({ itemTitle: a }, t) => {
501
+ const e = a.trim();
502
+ if (!e)
503
+ return null;
504
+ const s = t?.configurable?.context;
505
+ I(s);
506
+ const { result: o, error: l } = await St(s.portal, e, { num: 1 });
507
+ return l && console.error("Error searching for portal item by title:", l), o?.results[0]?.id || null;
508
+ },
509
+ {
510
+ name: "resolvePortalItemIdByTitle",
511
+ description: 'Resolves an ArcGIS Portal item title to the best-match item id. Use this when a user references an item by title (including hash mentions like #title or #"title with spaces") instead of an explicit item id.',
512
+ schema: n.object({
513
+ itemTitle: n.string().describe("The portal item title to resolve to an item id.")
514
+ })
515
+ }
516
+ );
517
+ function G(a, t = "#") {
518
+ const e = a.match(new RegExp(`\\${t}"([^"]+)"`, "u"));
519
+ if (e?.[1])
520
+ return e[1].trim();
521
+ const s = a.match(new RegExp(`\\${t}([^\\s"']+)`, "u"));
522
+ return s?.[1] ? s[1].trim() : null;
523
+ }
524
+ const st = {
525
+ "portal-content": {
526
+ description: "The main content page of the portal.",
527
+ hints: ["My content", "Content"],
528
+ scope: "root"
529
+ },
530
+ "portal-content-favorites": {
531
+ description: "The My favorites view under Content in the portal.",
532
+ hints: ["My favorites", "Favorites", "Content favorites"],
533
+ scope: "collection"
534
+ },
535
+ "portal-content-group": {
536
+ description: "The My groups view under Content in the portal.",
537
+ hints: ["Content my groups", "My groups content", "Group content"],
538
+ scope: "collection"
539
+ },
540
+ "portal-content-living-atlas": {
541
+ description: "The Living Atlas view under Content in the portal.",
542
+ hints: ["Living Atlas", "Content Living Atlas"],
543
+ scope: "collection"
544
+ },
545
+ "portal-content-organization": {
546
+ description: "The My organization view under Content in the portal.",
547
+ hints: ["My organization content", "Organization content", "Content organization"],
548
+ scope: "collection"
549
+ },
550
+ "portal-gallery": {
551
+ description: "The gallery page of the portal.",
552
+ hints: ["Gallery", "Featured content", "Maps and apps"],
553
+ scope: "collection"
554
+ },
555
+ "portal-group": {
556
+ description: "A specific group page in the portal.",
557
+ hints: ["Group", "group page"],
558
+ scope: "entity"
559
+ },
560
+ "portal-groups": {
561
+ description: "The groups listing page of the portal.",
562
+ hints: ["My groups", "Groups"],
563
+ scope: "collection"
564
+ },
565
+ "portal-groups-featured": {
566
+ description: "The Featured groups view under Groups in the portal.",
567
+ hints: ["Featured groups", "Groups featured"],
568
+ scope: "collection"
569
+ },
570
+ "portal-groups-my": {
571
+ description: "The My groups view under Groups in the portal.",
572
+ hints: ["My groups", "Groups my"],
573
+ scope: "collection"
574
+ },
575
+ "portal-groups-organization": {
576
+ description: "The My organization's groups view under Groups in the portal.",
577
+ hints: ["Organization's groups", "My organization's groups", "Groups organization"],
578
+ scope: "collection"
579
+ },
580
+ "portal-item": {
581
+ description: "A specific item page in the portal.",
582
+ hints: ["Item", "item page"],
583
+ scope: "entity"
584
+ },
585
+ "portal-map-viewer": {
586
+ description: "The Map Viewer app of the portal.",
587
+ hints: ["Map Viewer", "Map", "Open map"],
588
+ scope: "entity"
589
+ },
590
+ "portal-notebooks": {
591
+ description: "The Notebooks home page of the portal.",
592
+ hints: ["Notebooks", "Notebook home", "My notebooks"],
593
+ scope: "collection"
594
+ },
595
+ "portal-scene-viewer": {
596
+ description: "The Scene Viewer app of the portal.",
597
+ hints: ["Scene Viewer", "Scene", "3D scene"],
598
+ scope: "entity"
599
+ },
600
+ "portal-settings-security": {
601
+ description: "The Organization > Settings > Security page of the portal.",
602
+ hints: ["Organization settings", "Security", "Organization > Settings > Security"],
603
+ scope: "entity"
604
+ }
605
+ }, oe = wt(st), re = Object.entries(st).map(
606
+ ([a, { description: t, hints: e, scope: s }]) => ` - ${a}: ${t} (scope: ${s}; hints: ${e.join(", ")})`
607
+ ).join(`
608
+ `), ne = `
609
+ You decide whether the assistant response should include a navigation action to ArcGIS Portal.
610
+
611
+ Given the user question and assistant response:
612
+ - Decide if a navigation action would help the user complete the task.
613
+ - If yes, choose one destination type:
614
+ ${re}
615
+
616
+ Rules:
617
+ - Only suggest navigation when you are highly confident the destination will help complete the user's task.
618
+ - If confidence is below 0.85, set shouldSuggestNavigation=false and destinationType=none.
619
+ - If there is no clear destination from the allowed types, set shouldSuggestNavigation=false and destinationType=none.
620
+ - If no navigation is useful, set shouldSuggestNavigation=false and destinationType=none.
621
+ - Prefer the most specific destination that is clearly supported by the question and response.
622
+ - Use entity-level destinations over collection/root destinations when both could apply and the entity target is explicit.
623
+ - Use collection/root destinations only for generic browsing intent with no specific entity target.
624
+ - If a chosen destination requires parameters, include all required parameters.
625
+ - If required parameters are missing or uncertain, set shouldSuggestNavigation=false and destinationType=none.
626
+ - Do not invent required parameters.
627
+ - Always include a confidence score from 0 to 1 in the output.
628
+ - Confidence means confidence that a navigation suggestion should be shown to the user.
629
+ - If shouldSuggestNavigation=false or destinationType=none, confidence must be <= 0.5.
630
+ - Use confidence >= 0.85 only when shouldSuggestNavigation=true and destinationType is not none.
631
+
632
+ User question:
633
+ {question}
634
+
635
+ Assistant response:
636
+ {response}
637
+ `, K = n.object({
665
638
  shouldSuggestNavigation: n.boolean().default(!1),
666
- destinationType: n.enum(["none", "portal-content", "portal-item", "portal-groups", "portal-group"]).default("none"),
639
+ destinationType: n.enum(["none", ...oe]).default("none"),
667
640
  itemId: n.string().default(""),
668
- groupId: n.string().default("")
669
- }), Xt = async (s, t) => {
641
+ groupId: n.string().default(""),
642
+ confidence: n.number().min(0).max(1).default(0)
643
+ }), ie = async (a, t) => {
670
644
  await g({ text: "Extracting navigation intent...", agentName: "doc-assistant" }, t);
671
- const e = s.outputMessage.trim();
645
+ const e = a.outputMessage.trim();
672
646
  if (!e)
673
647
  return {};
674
- const a = x(s.agentExecutionContext.messages).trim(), r = await L.fromTemplate(te).format({
675
- question: a,
648
+ const s = x(a.agentExecutionContext.messages).trim(), o = await U.fromTemplate(ne).format({
649
+ question: s,
676
650
  response: e
677
- }), c = await Q({
678
- model: await F({ modelTier: "default" }),
679
- tools: [W, Ht],
680
- systemPrompt: r,
681
- responseFormat: j,
682
- checkpointer: !0
683
- }).invoke({ messages: s.agentExecutionContext.messages }, t), i = j.parse(c.structuredResponse ?? {});
651
+ }), c = (await D({ modelTier: "fast" })).withStructuredOutput(K), i = K.parse(await c.invoke(o));
684
652
  if (!i.shouldSuggestNavigation || i.destinationType === "none")
685
653
  return {};
686
- const o = Zt(i);
687
- return o ? (await J(o, t), {}) : {};
654
+ if (i.destinationType === "portal-item" && !i.itemId) {
655
+ const r = G(s, "#");
656
+ r && (i.itemId = await at.invoke({ itemTitle: r }, t) ?? "");
657
+ }
658
+ if (i.destinationType === "portal-group" && !i.groupId) {
659
+ const r = G(s, "$") ?? G(s, "#");
660
+ r && (i.groupId = await et.invoke({ groupTitle: r }, t) ?? "");
661
+ }
662
+ const u = le(i);
663
+ return u ? (await R(u, t), {}) : {};
688
664
  };
689
- function Zt({
690
- destinationType: s,
665
+ function le({
666
+ destinationType: a,
691
667
  itemId: t,
692
668
  groupId: e
693
669
  }) {
694
- switch (s) {
670
+ switch (a) {
695
671
  case "portal-content":
696
- return { destinationType: "portal-content" };
672
+ case "portal-content-favorites":
673
+ case "portal-content-group":
674
+ case "portal-content-living-atlas":
675
+ case "portal-content-organization":
676
+ case "portal-gallery":
697
677
  case "portal-groups":
698
- return { destinationType: "portal-groups" };
678
+ case "portal-groups-featured":
679
+ case "portal-groups-my":
680
+ case "portal-groups-organization":
681
+ case "portal-map-viewer":
682
+ case "portal-notebooks":
683
+ case "portal-scene-viewer":
684
+ case "portal-settings-security":
685
+ return { destinationType: a };
699
686
  case "portal-item":
700
687
  return t ? { destinationType: "portal-item", itemId: t } : null;
701
688
  case "portal-group":
@@ -703,152 +690,644 @@ function Zt({
703
690
  case "none":
704
691
  return null;
705
692
  default:
706
- return P(s);
693
+ return C(a);
707
694
  }
708
695
  }
709
- const te = `
710
- You decide whether the assistant response should include a navigation action to ArcGIS Portal.
696
+ const ot = y.Root({
697
+ ...k()
698
+ }), ue = () => new N(ot).addNode("answerDocQuestion", se).addNode("extractNavigationIntent", ie).addEdge(P, "answerDocQuestion").addEdge("answerDocQuestion", "extractNavigationIntent").addEdge("extractNavigationIntent", w), ce = String.raw`- **portal-doc-assistant** - General ArcGIS documentation and Portal help assistant:
699
+ - answers general ArcGIS, Portal, Enterprise, and JavaScript SDK questions
700
+ - acts as a fallback when specialized agents are not applicable
701
+ `, pe = {
702
+ id: "portal-doc-assistant",
703
+ name: "Portal Doc Assistant",
704
+ description: ce,
705
+ createGraph: ue,
706
+ workspace: ot
707
+ }, de = () => ({ latestGroupId: null, memory: {} }), q = (a) => {
708
+ const t = a?.agentExecutionContext.sharedState.portalGroupSummaryMemory?.value;
709
+ return t ? { latestGroupId: t.latestGroupId, memory: t.memory } : de();
710
+ }, rt = `
711
+ Shared markdown formatting rules:
712
+ - Use clear markdown headings (##) to separate sections.
713
+ - Use concise bullet points for lists of facts, counts, or signals.
714
+ - Emphasize key metrics with bold labels (for example: **Recent items:** 4).
715
+ - Keep wording direct and analytical; avoid filler language but make sure the language is friendly.
716
+ - Do not include raw internal IDs unless explicitly requested.
717
+ `, me = `
718
+ You answer follow-up questions about ArcGIS group analytics.
711
719
 
712
- Given the user question and assistant response:
713
- - Decide if a navigation action would help the user complete the task.
714
- - If yes, choose one destination type:
715
- - portal-content: portal content page
716
- - portal-groups: groups listing page
717
- - portal-item: specific item page (requires itemId)
718
- - portal-group: specific group page (requires groupId)
720
+ ${rt}
721
+
722
+ Ground your answer in the provided group analytics summary and context.
723
+ If the answer is not available from the provided context, state that clearly and suggest what to check next.
724
+
725
+ Response rules:
726
+ - Reply in concise markdown with this section structure:
727
+ 1) ## Answer
728
+ 2) ## Evidence
729
+ 3) ## Gaps (only when data is missing)
730
+ - Keep the answer focused on the follow-up question.
731
+ - Do not include internal identifiers.
732
+ - Mark isRelevant=false when the question is not about this group or cannot be grounded in this group context.
733
+
734
+ Group analytics summary:
735
+ {summary}
736
+
737
+ Group full context:
738
+ {fullContext}
739
+
740
+ Question:
741
+ {question}
742
+ `, ge = async (a, t) => {
743
+ await g({ text: "Answering group follow-up...", agentName: "group-analytics" }, t);
744
+ const e = q(a), s = a.groupSummaryGroupId ?? e.latestGroupId, o = s ? e.memory[s] : void 0, l = a.groupSummaryQuestion || x(a.agentExecutionContext.messages);
745
+ return o ? {
746
+ status: "success",
747
+ outputMessage: (await v({
748
+ promptText: me,
749
+ schema: he,
750
+ modelTier: "default",
751
+ inputVariables: {
752
+ summary: o.summary,
753
+ question: l,
754
+ fullContext: JSON.stringify(o.fullContext)
755
+ }
756
+ })).answer
757
+ } : {
758
+ status: "success",
759
+ outputMessage: "I do not have group analytics context yet. Ask me to analyze a group first with analyze group <group id>."
760
+ };
761
+ }, he = n.object({
762
+ answer: n.string(),
763
+ isRelevant: n.boolean()
764
+ }), fe = `
765
+ Classify the user's request for ArcGIS Portal group analytics.
719
766
 
720
767
  Rules:
721
- - If no navigation is useful, set shouldSuggestNavigation=false and destinationType=none.
722
- - If destinationType is portal-item and user references an item by title (for example #title, #"title with spaces", or plain quoted title), call resolvePortalItemIdByTitle and set itemId from the tool result.
723
- - If destinationType is portal-group and user references a group by title (for example $title, $"title with spaces", or plain quoted group title), call resolvePortalGroupIdByTitle and set groupId from the tool result.
724
- - Do not invent itemId.
725
- - Do not invent groupId.
726
- - Prefer destinationType=portal-content for generic "go to content" guidance.
768
+ - intent="summarize" only when the user explicitly asks to summarize, analyze, overview, or recap a group.
769
+ - intent="followUp" for follow-up questions about a previously analyzed group.
770
+ - intent="navigation" when the user asks to open, go to, navigate to, or view the group page.
771
+ - intent="clarify" when intent or required group target is missing.
772
+ - groupId must be the final resolved group id.
773
+ - If request has explicit group id, set groupId directly.
774
+ - If request references group title (for example $title, $"title with spaces", or plain quoted group title), call resolvePortalGroupIdByTitle and set groupId to the tool result.
775
+ - Never return group titles in output fields.
776
+ - If intent is "followUp", set question to the user's full question/request text.
777
+ - If intent is "navigation", set question="".
778
+ - If intent is "summarize", set question="".
779
+ - If intent is "navigation" and no group is specified, leave groupId empty so the system can navigate to the groups listing page.
780
+ - If hasAnalyticsContext is true and the user asks about the same group context without an explicit summarize/analyze command, prefer "followUp".
727
781
 
728
- User question:
782
+ Examples:
783
+ - "Analyze group 0123456789abcdef0123456789abcdef" => summarize, groupId="0123456789abcdef0123456789abcdef"
784
+ - "Analyze group $living atlas" => summarize, call resolvePortalGroupIdByTitle("living atlas") and set groupId to tool result
785
+ - "Analyze group $"living atlas basemaps"" => summarize, call resolvePortalGroupIdByTitle("living atlas basemaps") and set groupId to tool result
786
+ - "Is this group active?" with hasAnalyticsContext=true => followUp
787
+
788
+ hasAnalyticsContext:
789
+ {hasAnalyticsContext}
790
+
791
+ User message:
792
+ {userMessage}
793
+ `, ye = async (a, t) => {
794
+ await g({ text: "Analyzing group-analytics intent...", agentName: "group-analytics" }, t);
795
+ const e = x(a.agentExecutionContext.messages), s = !!q(a).latestGroupId, o = await U.fromTemplate(fe).format({
796
+ userMessage: e,
797
+ hasAnalyticsContext: String(s)
798
+ }), c = (await D({ modelTier: "fast" })).withStructuredOutput(J), i = J.parse(await c.invoke(o));
799
+ let u = i.groupId;
800
+ if ((i.intent === "summarize" || i.intent === "navigation") && !u) {
801
+ const f = G(e, "$");
802
+ f && (u = await et.invoke({ groupTitle: f }, t) ?? "");
803
+ }
804
+ const { intent: r, question: p } = i, m = r === "summarize" && !u, d = r === "followUp" && !(p ?? "").trim(), h = r === "clarify" || m || d;
805
+ return {
806
+ groupSummaryIntent: h ? "clarify" : r,
807
+ groupSummaryGroupId: u || null,
808
+ groupSummaryQuestion: p || "",
809
+ status: "success",
810
+ outputMessage: h ? "Please clarify with a group id or title" : ""
811
+ };
812
+ }, J = n.object({
813
+ intent: n.enum(["summarize", "followUp", "navigation", "clarify"]),
814
+ groupId: n.string().default(""),
815
+ question: n.string().default("")
816
+ }), we = async (a, t) => {
817
+ const e = q(a), s = a.groupSummaryGroupId ?? e.latestGroupId;
818
+ return await g({ text: "Preparing navigation...", agentName: "group-analytics" }, t), await R(
819
+ s ? { destinationType: "portal-group", groupId: s } : { destinationType: "portal-groups" },
820
+ t
821
+ ), { status: "success" };
822
+ };
823
+ function nt({ timestamp: a, now: t, windowMs: e }) {
824
+ return a ? t - a <= e : !1;
825
+ }
826
+ const be = 720 * 60 * 60 * 1e3;
827
+ function ve(a) {
828
+ const t = Gt(a);
829
+ return {
830
+ id: a.id ?? "",
831
+ title: a.title ?? "",
832
+ description: a.description ?? "",
833
+ snippet: a.snippet ?? "",
834
+ access: a.access ?? null,
835
+ owner: a.owner ?? "",
836
+ tags: a.tags ?? [],
837
+ created: a.created?.getTime(),
838
+ modified: a.modified?.getTime(),
839
+ isInvitationOnly: a.isInvitationOnly,
840
+ sourceSignals: {
841
+ capabilities: Nt(a),
842
+ membershipAccess: Ct(a),
843
+ isOpenData: At(a),
844
+ isDistributedCollaborationGroup: Tt(a),
845
+ orgId: t.orgId,
846
+ hiddenMembers: t.hiddenMembers,
847
+ isViewOnly: t.isViewOnly,
848
+ isReadOnly: t.isReadOnly,
849
+ leavingDisallowed: t.leavingDisallowed
850
+ }
851
+ };
852
+ }
853
+ async function Ie(a) {
854
+ const t = { owner: a.owner ?? "", admins: [], users: [] };
855
+ try {
856
+ return await a.fetchMembers();
857
+ } catch (e) {
858
+ return console.warn("Unable to fetch group members for analytics context", e), t;
859
+ }
860
+ }
861
+ function xe(a) {
862
+ return a.map((t) => ({
863
+ id: t.id ?? "",
864
+ title: t.title ?? "Untitled",
865
+ type: t.type ?? "Unknown",
866
+ owner: t.owner ?? "",
867
+ created: t.created?.getTime(),
868
+ modified: t.modified?.getTime()
869
+ }));
870
+ }
871
+ function Se(a, t) {
872
+ return a.filter(
873
+ (e) => e.modified ? nt({ timestamp: e.modified, now: t, windowMs: be }) : !1
874
+ );
875
+ }
876
+ function Me(a) {
877
+ const t = /* @__PURE__ */ new Map();
878
+ for (const e of a)
879
+ t.set(e.type, (t.get(e.type) ?? 0) + 1);
880
+ return [...t.entries()].sort((e, s) => s[1] - e[1] || e[0].localeCompare(s[0])).slice(0, 6).map(([e, s]) => ({ type: e, count: s }));
881
+ }
882
+ async function Ge(a) {
883
+ const t = await a.queryItems({ num: 20, sortField: "modified", sortOrder: "desc" }), e = xe(t.results), s = Date.now();
884
+ return {
885
+ total: t.total,
886
+ topItems: e,
887
+ recentlyModifiedItems: Se(e, s),
888
+ topItemTypes: Me(e)
889
+ };
890
+ }
891
+ async function Te(a, t) {
892
+ if (!t)
893
+ return { error: { code: "missingGroupId", message: "Group id is required." } };
894
+ try {
895
+ const s = (await a.queryGroups({ query: `id:${t}`, num: 1 })).results[0];
896
+ if (!s)
897
+ return { error: { code: "groupNotFound", message: `No group found for id: ${t}` } };
898
+ const o = ve(s), l = await Ie(s), c = await Ge(s);
899
+ return { result: { group: o, members: l, items: c } };
900
+ } catch (e) {
901
+ return console.error("Error fetching portal group analytics context:", e), { error: { code: "unhandledError" } };
902
+ }
903
+ }
904
+ const Ae = `
905
+ You summarize ArcGIS Portal groups based on structured context and deterministic activity signals.
906
+
907
+ ${rt}
908
+
909
+ Output format requirements:
910
+ - Return concise markdown with clear sections in this order:
911
+ 1) Overview
912
+ 2) Activity
913
+ 3) Members
914
+ 4) Content Theme
915
+ 5) Contribution Model
916
+ 6) Unknowns / Data Gaps
917
+ - Keep total response about 180-280 words unless the user asked for extra detail.
918
+ - Avoid internal-only implementation details and do not expose raw IDs unless user explicitly asks.
919
+
920
+ Reasoning rules:
921
+ - Use deterministicSignals as the source of truth for active/recent status.
922
+ - If group description/snippet are empty, infer purpose from tags, item title patterns, and item type distribution.
923
+ - For members, report owner/admin/user counts when available; if unavailable due to permission scope, explicitly say so.
924
+ - For contribution model, use membershipAccess, capabilities, and sourceJSON flags to characterize collaboration vs distribution behavior.
925
+ - Be explicit when signals are heuristic or unavailable.
926
+
927
+ Follow-up prompt rules:
928
+ - Generate exactly 3 follow-up prompts.
929
+ - Write them as direct first-person user chat prompts that can be clicked and sent as-is.
930
+ - Do not write meta-questions such as "Would you like..." or "Do you want me to...".
931
+ - Keep each prompt short, specific, and actionable.
932
+ - Every prompt must be answerable using only the provided group context and deterministic signals.
933
+ - Do not require external data, navigation, or additional fetches.
934
+ - Tailor each prompt to this specific group's available signals (content mix, activity, members, and contribution model).
935
+ - Avoid repeating phrasing from prior prompts or using generic template wording.
936
+ - If a signal is unavailable (for example members), do not ask follow-ups that depend on that missing signal.
937
+
938
+ Group context:
939
+ {context}
940
+
941
+ Deterministic signals:
942
+ {deterministicSignals}
943
+ `, Ce = 2160 * 60 * 60 * 1e3, Ne = async (a, t) => {
944
+ const e = a.groupSummaryGroupId;
945
+ if (!e)
946
+ return {
947
+ status: "success",
948
+ outputMessage: 'Please clarify with analyze group <group id>, analyze group $<title>, or analyze group $"<title with spaces>".'
949
+ };
950
+ await g({ text: `Analyzing group ${e}...`, agentName: "group-analytics" }, t);
951
+ const s = t?.configurable?.context;
952
+ I(s);
953
+ const { result: o, error: l } = await Te(s.portal, e);
954
+ if (l || !o)
955
+ return await g({ text: "Failed to fetch group context", agentName: "group-analytics" }, t), {
956
+ status: "success",
957
+ outputMessage: "Unable to retrieve group context for analytics."
958
+ };
959
+ const { group: c, items: i } = o, u = Date.now(), r = c.modified, p = r ? nt({ timestamp: r, now: u, windowMs: Ce }) : !1, m = i.recentlyModifiedItems.length, d = m > 0, h = p || d, f = await v({
960
+ promptText: Ae,
961
+ schema: Pe,
962
+ modelTier: "default",
963
+ inputVariables: {
964
+ context: JSON.stringify(o),
965
+ deterministicSignals: JSON.stringify({
966
+ isGroupActive: h,
967
+ isGroupRecentlyModified: p,
968
+ hasRecentlyAddedOrUpdatedContent: d,
969
+ recentItemCount: m
970
+ })
971
+ }
972
+ }), { followUpQuestions: b, summary: S } = f, ut = q(a), ct = {
973
+ latestGroupId: e,
974
+ memory: {
975
+ ...ut.memory,
976
+ [e]: { summary: S, followUpQuestions: b, fullContext: o }
977
+ }
978
+ };
979
+ return b.length && await E({ type: "suggested-prompts", data: { prompts: b } }, t), {
980
+ status: "success",
981
+ outputMessage: S,
982
+ sharedStatePatch: { portalGroupSummaryMemory: { value: ct } }
983
+ };
984
+ }, Pe = n.object({
985
+ summary: n.string(),
986
+ followUpQuestions: n.array(n.string()).default([])
987
+ }), z = (a, t) => t ?? a, it = y.Root({
988
+ ...k(),
989
+ groupSummaryIntent: y({
990
+ reducer: z,
991
+ default: () => "clarify"
992
+ }),
993
+ groupSummaryGroupId: y({
994
+ reducer: z,
995
+ default: () => null
996
+ }),
997
+ groupSummaryQuestion: y({
998
+ reducer: z,
999
+ default: () => ""
1000
+ })
1001
+ }), ke = () => new N(it).addNode("detectGroupSummaryIntent", ye).addNode("summarizePortalGroup", Ne).addNode("answerGroupSummaryFollowUp", ge).addNode("suggestGroupSummaryNavigation", we).addEdge(P, "detectGroupSummaryIntent").addConditionalEdges("detectGroupSummaryIntent", (t) => t.groupSummaryIntent === "summarize" ? "summarizePortalGroup" : t.groupSummaryIntent === "followUp" ? "answerGroupSummaryFollowUp" : t.groupSummaryIntent === "navigation" ? "suggestGroupSummaryNavigation" : w).addEdge("summarizePortalGroup", w).addEdge("answerGroupSummaryFollowUp", w).addEdge("suggestGroupSummaryNavigation", w), qe = String.raw`- **portal-group-analytics** - Portal group analytics assistant:
1002
+ - summarizes ArcGIS portal groups from group context and sourceJSON details
1003
+ - answers follow-up questions grounded in the summarized group
1004
+ - suggests navigation to groups when relevant
1005
+ `, ze = {
1006
+ id: "portal-group-analytics",
1007
+ name: "Portal Group Analytics",
1008
+ description: qe,
1009
+ createGraph: ke,
1010
+ workspace: it
1011
+ }, $e = () => ({ latestItemId: null, memory: {} }), O = (a) => {
1012
+ const t = a?.agentExecutionContext.sharedState.portalItemAnalyticsSummaryMemory?.value;
1013
+ return t ? { latestItemId: t.latestItemId, memory: t.memory } : $e();
1014
+ }, W = n.object({
1015
+ intent: n.enum(["summarize", "followUp", "clarify"]),
1016
+ itemId: n.string().default(""),
1017
+ question: n.string().default("")
1018
+ }), Ee = n.object({ summary: n.string(), followUpQuestions: n.array(n.string()).default([]) }), De = n.object({ answer: n.string(), isRelevant: n.boolean() }), Ue = `
1019
+ You answer follow-up questions about an ArcGIS item.
1020
+
1021
+ Ground your answer in the provided item context.
1022
+ If the answer is not available from the provided context, state that clearly and suggest what to check next.
1023
+
1024
+ Response rules:
1025
+ - Reply in concise markdown.
1026
+ - Keep the answer focused on the follow-up question.
1027
+ - Do not include internal identifiers.
1028
+ - Mark isRelevant=false when the question is not about this item or cannot be grounded in this item context.
1029
+
1030
+ Item summary:
1031
+ {summary}
1032
+
1033
+ Item full context
1034
+ {fullContext}
1035
+
1036
+ Question:
729
1037
  {question}
1038
+ `, Re = async (a, t) => {
1039
+ await g({ text: "Answering follow-up...", agentName: "analytics" }, t);
1040
+ const e = O(a), s = a.analyticsItemId ?? e.latestItemId, o = s ? e.memory[s] : void 0, l = a.analyticsQuestion || x(a.agentExecutionContext.messages);
1041
+ return o ? {
1042
+ status: "success",
1043
+ outputMessage: (await v({
1044
+ promptText: Ue,
1045
+ schema: De,
1046
+ modelTier: "default",
1047
+ inputVariables: {
1048
+ summary: o.summary,
1049
+ question: l,
1050
+ fullContext: JSON.stringify(o.fullContext)
1051
+ }
1052
+ })).answer
1053
+ } : {
1054
+ status: "success",
1055
+ outputMessage: "I don't have enough information yet. Please ask me to summarize the item first using summarize item <item id>."
1056
+ };
1057
+ }, Oe = `
1058
+ Classify the user analytics request.
730
1059
 
731
- Assistant response:
732
- {response}
733
- `, X = dt.Root({
734
- ...E()
735
- }), ee = () => new $(X).addNode("answerDocQuestion", Yt).addNode("extractNavigationIntent", Xt).addEdge(G, "answerDocQuestion").addEdge("answerDocQuestion", "extractNavigationIntent").addEdge("extractNavigationIntent", y), se = String.raw`- **portal-doc-assistant** - General ArcGIS documentation and Portal help assistant:
736
- - answers general ArcGIS, Portal, Enterprise, and JavaScript SDK questions
737
- - acts as a fallback when specialized agents are not applicable
738
- `, ae = {
739
- id: "portal-doc-assistant",
740
- name: "Portal Doc Assistant",
741
- description: se,
742
- createGraph: ee,
743
- workspace: X
744
- }, re = st`:host{height:100%;border-width:1px;border-style:solid;border-color:var(--calcite-color-border-3);display:block;width:100%;--tw-shadow: 0 1px 6px -1px rgba(0, 0, 0, .16), 0 1px 2px -1px rgba(0, 0, 0, .08);--tw-shadow-colored: 0 1px 6px -1px var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.chat-entry{display:flex;flex-direction:column;gap:.75rem;width:100%}.chat-actions{display:flex;justify-content:flex-end;gap:.5rem}.header-actions{display:flex;gap:.5rem;padding-inline-start:.75rem}.navigation-block{display:flex;flex-direction:column;align-items:stretch;gap:.35rem;margin-top:.5rem}.navigation-button{width:100%;margin-block:.25rem}.navigation-block-description{font-size:.75rem;color:var(--calcite-color-text-3)}`, oe = (s, t) => {
745
- const { destinationType: e } = s, a = `${t.url}/home`;
1060
+ Rules:
1061
+ - intent="summarize" only when the user explicitly asks to summarize/overview/recap an item.
1062
+ - intent="followUp" for analytical questions about item details, including schema/fields/attributes/layers.
1063
+ - intent="clarify" when neither summarize nor follow-up intent is clear.
1064
+ - itemId must be the final resolved item id.
1065
+ - If request has explicit item id, set itemId directly.
1066
+ - If request references item title (for example #title, #"title with spaces", or plain quoted title), call resolvePortalItemIdByTitle and set itemId to the returned value.
1067
+ - Never return item titles in output fields.
1068
+ - If intent is "followUp", set question to the user's full question/request text.
1069
+ - If intent is "summarize", set question="".
1070
+ - When user asks to show/list/explain fields, schema, attributes, columns, or layer details, classify as "followUp" unless they explicitly request a summary.
1071
+ - If hasSummaryContext is true, prefer "followUp" for detail-oriented requests that do not explicitly ask to summarize.
1072
+
1073
+ Examples:
1074
+ - "Summarize item 0123456789abcdef0123456789abcdef" => summarize, itemId="0123456789abcdef0123456789abcdef"
1075
+ - "Summarize item #california" => summarize, call resolvePortalItemIdByTitle("california") and set itemId to tool result
1076
+ - "Summarize item #"california farmland"" => summarize, call resolvePortalItemIdByTitle("california farmland") and set itemId to tool result
1077
+ - "Show the layer's available fields" => followUp
1078
+ - "List attributes and explain what status means" => followUp
1079
+ - "What fields are available?" with hasSummaryContext=true => followUp
1080
+ - "Give me an overview of item 0123456789abcdef0123456789abcdef" => summarize
1081
+
1082
+ hasSummaryContext:
1083
+ {hasSummaryContext}
1084
+
1085
+ User message:
1086
+ {userMessage}
1087
+ `, Fe = async (a, t) => {
1088
+ await g({ text: "Analyzing intent...", agentName: "analytics" }, t);
1089
+ const e = x(a.agentExecutionContext.messages), s = !!O(a).latestItemId, o = await U.fromTemplate(Oe).format({
1090
+ userMessage: e,
1091
+ hasSummaryContext: String(s)
1092
+ }), c = (await D({ modelTier: "fast" })).withStructuredOutput(W), i = W.parse(await c.invoke(o));
1093
+ let u = i.itemId;
1094
+ if (i.intent === "summarize" && !u) {
1095
+ const f = G(e, "#");
1096
+ f && (u = await at.invoke({ itemTitle: f }, t) ?? "");
1097
+ }
1098
+ const { intent: r, question: p } = i, h = r === "clarify" || r === "summarize" && !u || r === "followUp" && !p;
1099
+ return {
1100
+ agentExecutionContext: { ...a.agentExecutionContext },
1101
+ analyticsIntent: h ? "clarify" : r,
1102
+ analyticsItemId: u || null,
1103
+ analyticsQuestion: p || "",
1104
+ status: "success",
1105
+ outputMessage: h ? 'Please clarify with summarize item <item id>, summarize item #<title>, or summarize item #"<title with spaces>".' : ""
1106
+ };
1107
+ }, Ve = `
1108
+ You are a item summary tool for ArcGIS. Your job is to summarize an item's info based on the provided context.
1109
+ Summary rules:
1110
+ - The summary should be concise markdown, make sure to format the output nicely so it's easy to read.
1111
+ - Target length: 80-150 words.
1112
+ - Provide one short descriptive paragraph.
1113
+ - Also propose 3 concise follow-up questions grounded in the item summary.
1114
+ - Keep follow-up questions specific and actionable.
1115
+ Follow-up questions rules:
1116
+ - These questions should be in the format of a prompt that the user can click on.
1117
+ - Make sure the questions are relevant to the item summary and that you can answer based solely on the provided context.
1118
+ Do not include internal identifiers.
1119
+ If the user asks for a detailed summary, you may expand the response up to 300 words.
1120
+ Item context:
1121
+ {context}
1122
+ `, je = async (a, t) => {
1123
+ const e = a.analyticsItemId;
1124
+ if (!e)
1125
+ return {
1126
+ status: "success",
1127
+ outputMessage: 'Please clarify with summarize item <item id>, summarize item #<title>, or summarize item #"<title with spaces>".'
1128
+ };
1129
+ await g({ text: `Summarizing item ${e}...`, agentName: "analytics" }, t);
1130
+ const s = t?.configurable?.context;
1131
+ I(s);
1132
+ const { portal: o, user: l } = s, { result: c, error: i } = await Mt(l, o, e);
1133
+ if (i || !c)
1134
+ return await g({ text: "Failed to get item context for summarization", agentName: "analytics" }, t), {
1135
+ status: "success",
1136
+ outputMessage: "Unable to retrieve item context for summarization."
1137
+ };
1138
+ const { context: u } = c, r = await v({
1139
+ promptText: Ve,
1140
+ schema: Ee,
1141
+ modelTier: "default",
1142
+ inputVariables: { context: JSON.stringify(u) }
1143
+ }), { followUpQuestions: p, summary: m } = r, d = O(a), h = {
1144
+ latestItemId: e,
1145
+ memory: {
1146
+ ...d.memory,
1147
+ [e]: { summary: m, followUpQuestions: p, fullContext: u }
1148
+ }
1149
+ };
1150
+ return p.length && await E({ type: "suggested-prompts", data: { prompts: p } }, t), {
1151
+ status: "success",
1152
+ outputMessage: m,
1153
+ sharedStatePatch: { portalItemAnalyticsSummaryMemory: { value: h } }
1154
+ };
1155
+ }, $ = (a, t) => t ?? a, lt = y.Root({
1156
+ ...k(),
1157
+ // States shared only across nodes in the graph, not between invocations
1158
+ analyticsIntent: y({
1159
+ reducer: $,
1160
+ default: () => "clarify"
1161
+ }),
1162
+ analyticsItemId: y({
1163
+ reducer: $,
1164
+ default: () => null
1165
+ }),
1166
+ analyticsQuestion: y({
1167
+ reducer: $,
1168
+ default: () => ""
1169
+ })
1170
+ }), Le = () => new N(lt).addNode("detectAnalyticsIntent", Fe).addNode("summarizePortalItem", je).addNode("answerAnalyticsFollowUp", Re).addEdge(P, "detectAnalyticsIntent").addConditionalEdges("detectAnalyticsIntent", (t) => t.analyticsIntent === "summarize" ? "summarizePortalItem" : t.analyticsIntent === "followUp" ? "answerAnalyticsFollowUp" : w).addEdge("summarizePortalItem", w).addEdge("answerAnalyticsFollowUp", w), Be = String.raw`- **portal-item-analytics** - Portal item analytics assistant:
1171
+ - answers questions about one specific ArcGIS portal item when item context is present
1172
+ - summarizes item details, metadata, and context grounded in that item
1173
+ - suggests follow-up prompts grounded in the same item
1174
+ - use for item-specific requests, not for gallery browsing, featured content, or opening Map Viewer
1175
+ `, Qe = {
1176
+ id: "portal-item-analytics",
1177
+ name: "Portal Item Analytics",
1178
+ description: Be,
1179
+ createGraph: Le,
1180
+ workspace: lt
1181
+ }, Ke = gt`:host{height:100%;border-width:1px;border-style:solid;border-color:var(--calcite-color-border-3);display:block;width:100%;--tw-shadow: 0 1px 6px -1px rgba(0, 0, 0, .16), 0 1px 2px -1px rgba(0, 0, 0, .08);--tw-shadow-colored: 0 1px 6px -1px var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.chat-entry{display:flex;flex-direction:column;gap:.75rem;width:100%}.chat-actions{display:flex;justify-content:flex-end;gap:.5rem}.header-actions{display:flex;gap:.5rem;padding-inline-start:.75rem}.navigation-block{display:flex;flex-direction:column;align-items:stretch;gap:.35rem;margin-top:.5rem}.navigation-button{width:100%;margin-block:.25rem}.navigation-block-description{font-size:.75rem;color:var(--calcite-color-text-3)}`;
1182
+ function Je(a, t) {
1183
+ if (!t)
1184
+ return;
1185
+ const { destinationType: e } = a;
746
1186
  switch (e) {
747
1187
  case "portal-content":
748
- return `${a}/content.html`;
1188
+ case "portal-content-favorites":
1189
+ case "portal-content-group":
1190
+ case "portal-content-living-atlas":
1191
+ case "portal-content-organization":
1192
+ case "portal-gallery":
749
1193
  case "portal-groups":
750
- return `${a}/groups.html`;
1194
+ case "portal-groups-featured":
1195
+ case "portal-groups-my":
1196
+ case "portal-groups-organization":
1197
+ case "portal-map-viewer":
1198
+ case "portal-notebooks":
1199
+ case "portal-scene-viewer":
1200
+ case "portal-settings-security":
1201
+ return t[e];
751
1202
  case "portal-item":
752
- return `${a}/item.html?id=${s.itemId}`;
1203
+ return t[e]?.(a.itemId);
753
1204
  case "portal-group":
754
- return `${a}/group.html?id=${s.groupId}`;
1205
+ return t[e]?.(a.groupId);
755
1206
  default:
756
- return P(e);
1207
+ return C(e);
757
1208
  }
758
- };
759
- class ne extends tt {
1209
+ }
1210
+ function We(a) {
1211
+ const t = Bt.safeParse(a);
1212
+ return t.success ? t.data : void 0;
1213
+ }
1214
+ class _e extends dt {
760
1215
  constructor() {
761
- super(...arguments), this.t9n = rt({ blocking: !0 }), this.assistantEl = M(), this.formEl = M(), this.voiceInputEl = M(), this.inputEl = M(), this.navigationSlotElements = /* @__PURE__ */ new Map(), this.handleSlottableRequest = (t) => {
762
- const e = t.detail, a = e.data?.block;
763
- if (!a)
1216
+ super(...arguments), this.t9n = ft({ blocking: !0 }), this.assistantEl = T(), this.formEl = T(), this.voiceInputEl = T(), this.inputEl = T(), this.navigationSlotElements = /* @__PURE__ */ new Map(), this.handleSlottableRequest = (t) => {
1217
+ const e = t.detail, s = e.data?.block;
1218
+ if (!s)
764
1219
  return;
765
- const r = this.getNavigationAction(a);
766
- r && this.upsertNavigationSlotElement(e.slotName, r);
767
- }, this.inputText = "", this.showVoiceInput = !0, this.isListening = !1, this.isVoiceInputDisabled = !1, this.interrupt = null, this.autoDestroyDisabled = !1, this.defaultClosed = !1, this.arcgisPortalNavigationRequest = et();
1220
+ const o = this.getNavigationAction(s);
1221
+ o && this.upsertNavigationSlotElement(e.slotName, o);
1222
+ }, this.inputText = "", this.showVoiceInput = !0, this.isListening = !1, this.isVoiceInputDisabled = !1, this.interrupt = null, this.autoDestroyDisabled = !1, this.defaultClosed = !1, this.arcgisPortalNavigationRequest = mt();
768
1223
  }
769
1224
  static {
770
- this.properties = { inputText: 16, showVoiceInput: 16, isListening: 16, isVoiceInputDisabled: 16, interrupt: 16, autoDestroyDisabled: 5, portal: 0, user: 0, config: 0, defaultClosed: 5 };
1225
+ this.properties = { inputText: 16, showVoiceInput: 16, isListening: 16, isVoiceInputDisabled: 16, interrupt: 16, autoDestroyDisabled: 5, portal: 0, user: 0, config: 0, navigationTargetMap: 0, defaultClosed: 5 };
771
1226
  }
772
1227
  static {
773
- this.styles = re;
1228
+ this.styles = Ke;
774
1229
  }
775
1230
  getNavigationAction(t) {
776
- if (t?.type !== _)
1231
+ if (t?.type !== X)
777
1232
  return;
778
- const e = jt(t.data);
1233
+ const e = We(t.data);
779
1234
  if (!e)
780
1235
  return;
781
- const a = oe(e, this.portal);
782
- if (a)
783
- return { href: a, targetDetail: e, label: this.getNavigationText(e.destinationType) };
1236
+ const s = Je(e, this.navigationTargetMap);
1237
+ if (s)
1238
+ return { href: s, targetDetail: e, label: this.getNavigationText(e.destinationType) };
784
1239
  }
785
1240
  upsertNavigationSlotElement(t, e) {
786
- const a = this.assistantEl.value;
787
- if (!a)
1241
+ const s = this.assistantEl.value;
1242
+ if (!s)
788
1243
  return;
789
- let r = this.navigationSlotElements.get(t);
790
- r || (r = document.createElement("div"), r.slot = t, this.navigationSlotElements.set(t, r), a.append(r)), at(w`<div><calcite-button class="navigation-button" appearance=outline width=full .href=${e.href} icon-end=launch @click=${(l) => {
1244
+ let o = this.navigationSlotElements.get(t);
1245
+ o || (o = document.createElement("div"), o.slot = t, this.navigationSlotElements.set(t, o), s.append(o)), ht(M`<div><calcite-button class="navigation-button" appearance=outline width=full .href=${e.href} icon-end=launch @click=${(l) => {
791
1246
  l.preventDefault(), this.arcgisPortalNavigationRequest.emit({
792
1247
  href: e.href,
793
1248
  targetDetail: e.targetDetail
794
1249
  });
795
- }}>${e.label}</calcite-button>${e.description ? w`<div class="navigation-block-description">${e.description}</div>` : null}</div>`, r);
1250
+ }}>${e.label}</calcite-button>${e.description ? M`<div class="navigation-block-description">${e.description}</div>` : null}</div>`, o);
796
1251
  }
797
1252
  getNavigationText(t) {
798
1253
  const e = this.t9n.navigation;
799
1254
  switch (t) {
800
1255
  case "portal-content":
801
1256
  return e.openContent;
1257
+ case "portal-content-favorites":
1258
+ return e.openContentFavorites;
1259
+ case "portal-content-group":
1260
+ return e.openContentGroup;
1261
+ case "portal-content-living-atlas":
1262
+ return e.openContentLivingAtlas;
1263
+ case "portal-content-organization":
1264
+ return e.openContentOrganization;
1265
+ case "portal-gallery":
1266
+ return e.openGallery;
802
1267
  case "portal-groups":
803
1268
  return e.openGroups;
1269
+ case "portal-groups-featured":
1270
+ return e.openGroupsFeatured;
1271
+ case "portal-groups-my":
1272
+ return e.openGroupsMy;
1273
+ case "portal-groups-organization":
1274
+ return e.openGroupsOrganization;
1275
+ case "portal-map-viewer":
1276
+ return e.openMapViewer;
1277
+ case "portal-notebooks":
1278
+ return e.openNotebooks;
1279
+ case "portal-scene-viewer":
1280
+ return e.openSceneViewer;
1281
+ case "portal-settings-security":
1282
+ return e.openOrganizationSettingsSecurity;
804
1283
  case "portal-item":
805
1284
  return e.openItem;
806
1285
  case "portal-group":
807
1286
  return e.openGroup;
808
1287
  default:
809
- return P(t);
1288
+ return C(t);
810
1289
  }
811
1290
  }
812
1291
  render() {
813
- const { t9n: t, inputText: e, portal: a, user: r, showVoiceInput: l, isListening: c, isVoiceInputDisabled: i } = this;
814
- return w`<arcgis-assistant log-enabled keep-suggested-prompts .heading=${t.heading} .entryMessage=${t.entryMessage} @arcgisSlottableRequest=${this.handleSlottableRequest} @arcgisInterrupt=${({ detail: o }) => {
815
- this.interrupt = o;
1292
+ const { t9n: t, inputText: e, portal: s, user: o, navigationTargetMap: l, showVoiceInput: c, isListening: i, isVoiceInputDisabled: u } = this;
1293
+ return M`<arcgis-assistant log-enabled keep-suggested-prompts .heading=${t.heading} .entryMessage=${t.entryMessage} @arcgisSlottableRequest=${this.handleSlottableRequest} @arcgisInterrupt=${({ detail: r }) => {
1294
+ this.interrupt = r;
816
1295
  }} @arcgisInterruptCancel=${() => {
817
1296
  this.interrupt = null;
818
1297
  }} @arcgisInterruptSubmit=${() => {
819
1298
  this.interrupt = null;
820
- }} @arcgisPromptSelect=${({ detail: o }) => {
821
- this.inputText = o.prompt, requestAnimationFrame(() => {
1299
+ }} @arcgisPromptSelect=${({ detail: r }) => {
1300
+ this.inputText = r.prompt, requestAnimationFrame(() => {
822
1301
  this.inputEl.value?.focusTextArea();
823
1302
  });
824
- }} ${T(this.assistantEl)}><div slot=header-actions-start class="header-actions"><calcite-icon icon=effects></calcite-icon></div><form slot=chat-entry class="chat-entry" @submit=${(o) => {
825
- o.preventDefault();
826
- const u = e.trim();
827
- u && (this.assistantEl.value?.submitMessage(u), this.inputText = "");
828
- }} ${T(this.formEl)}><arcgis-portal-mentionable-text-area .portal=${a} .user=${r} rows=3 .popoverListLabel=${t.mentionEntities} .placeholder=${t.placeholder} .value=${e} @arcgisUserMentionableTextAreaKeyDown=${({ detail: o }) => {
829
- o.key === "Enter" && !o.shiftKey && (o.preventDefault(), this.formEl.value?.requestSubmit());
830
- }} @arcgisUserMentionableTextAreaChange=${({ detail: o }) => {
831
- this.inputText = o ?? "";
832
- }} ${T(this.inputEl)}></arcgis-portal-mentionable-text-area><div class="chat-actions"><arcgis-portal-voice-input @arcgisVoiceInputStart=${() => {
1303
+ }} ${A(this.assistantEl)}><div slot=header-actions-start class="header-actions"><calcite-icon icon=effects></calcite-icon></div><form slot=chat-entry class="chat-entry" @submit=${(r) => {
1304
+ r.preventDefault();
1305
+ const p = e.trim();
1306
+ p && (this.assistantEl.value?.submitMessage(p), this.inputText = "");
1307
+ }} ${A(this.formEl)}><arcgis-portal-mentionable-text-area .portal=${s} .user=${o} rows=3 .popoverListLabel=${t.mentionEntities} .placeholder=${t.placeholder} .value=${e} @arcgisUserMentionableTextAreaKeyDown=${({ detail: r }) => {
1308
+ r.key === "Enter" && !r.shiftKey && (r.preventDefault(), this.formEl.value?.requestSubmit());
1309
+ }} @arcgisUserMentionableTextAreaChange=${({ detail: r }) => {
1310
+ this.inputText = r ?? "";
1311
+ }} ${A(this.inputEl)}></arcgis-portal-mentionable-text-area><div class="chat-actions"><arcgis-portal-voice-input @arcgisVoiceInputStart=${() => {
833
1312
  this.isListening = !0, this.isVoiceInputDisabled = !1;
834
1313
  }} @arcgisVoiceInputStop=${() => {
835
1314
  this.isListening = !1, this.isVoiceInputDisabled = !1;
836
- }} @arcgisVoiceInputError=${(o) => {
837
- o.detail.errorCode === "not-supported" && (this.showVoiceInput = !1);
838
- }} @arcgisVoiceInputInterimTranscription=${(o) => {
839
- this.inputText = o.detail.text;
840
- }} ${T(this.voiceInputEl)}></arcgis-portal-voice-input>${l && w`<calcite-button icon-start=microphone .label=${t.voiceInput} round .disabled=${i} .appearance=${c ? "solid" : "outline-fill"} @click=${async () => {
1315
+ }} @arcgisVoiceInputError=${(r) => {
1316
+ r.detail.errorCode === "not-supported" && (this.showVoiceInput = !1);
1317
+ }} @arcgisVoiceInputInterimTranscription=${(r) => {
1318
+ this.inputText = r.detail.text;
1319
+ }} ${A(this.voiceInputEl)}></arcgis-portal-voice-input>${c && M`<calcite-button icon-start=microphone .label=${t.voiceInput} round .disabled=${u} .appearance=${i ? "solid" : "outline-fill"} @click=${async () => {
841
1320
  this.isVoiceInputDisabled = !0;
842
- const o = this.voiceInputEl.value;
843
- c ? await o?.stopListening() : await o?.startListening();
844
- }}></calcite-button>` || ""}<calcite-button type=submit icon-start=send round .disabled=${!e.trim()} .label=${t.send}>${t.send}</calcite-button></div></form><arcgis-assistant-agent .agent=${Tt} .context=${{ portal: a, user: r }}></arcgis-assistant-agent><arcgis-assistant-agent .agent=${Lt} .context=${{ portal: a, user: r }}></arcgis-assistant-agent><arcgis-assistant-agent .agent=${ae} .context=${{ portal: a, user: r }}></arcgis-assistant-agent>${this.interrupt && w`<arcgis-portal-ai-assistant-interrupt slot=interrupt .type=${this.interrupt.type} .message=${this.interrupt.message} .options=${this.interrupt.options} @arcgisSubmit=${({ detail: o }) => {
845
- this.assistantEl.value?.submitInterrupt(o);
1321
+ const r = this.voiceInputEl.value;
1322
+ i ? await r?.stopListening() : await r?.startListening();
1323
+ }}></calcite-button>` || ""}<calcite-button type=submit icon-start=send round .disabled=${!e.trim()} .label=${t.send}>${t.send}</calcite-button></div></form><arcgis-assistant-agent .agent=${Qe} .context=${{ portal: s, user: o, navigationTargetMap: l }}></arcgis-assistant-agent><arcgis-assistant-agent .agent=${Wt} .context=${{ portal: s, user: o, navigationTargetMap: l }}></arcgis-assistant-agent><arcgis-assistant-agent .agent=${pe} .context=${{ portal: s, user: o, navigationTargetMap: l }}></arcgis-assistant-agent><arcgis-assistant-agent .agent=${ze} .context=${{ portal: s, user: o, navigationTargetMap: l }}></arcgis-assistant-agent>${this.interrupt && M`<arcgis-portal-ai-assistant-interrupt slot=interrupt .type=${this.interrupt.type} .message=${this.interrupt.message} .options=${this.interrupt.options} @arcgisSubmit=${({ detail: r }) => {
1324
+ this.assistantEl.value?.submitInterrupt(r);
846
1325
  }} @arcgisCancel=${() => {
847
1326
  this.assistantEl.value?.cancelInterrupt();
848
1327
  }}></arcgis-portal-ai-assistant-interrupt>` || ""}</arcgis-assistant>`;
849
1328
  }
850
1329
  }
851
- Z("arcgis-portal-ai-assistant", ne);
1330
+ pt("arcgis-portal-ai-assistant", _e);
852
1331
  export {
853
- ne as ArcgisPortalAiAssistant
1332
+ _e as ArcgisPortalAiAssistant
854
1333
  };